Cod sursa(job #137663)

Utilizator blasterzMircea Dima blasterz Data 17 februarie 2008 12:53:30
Problema Stalpi Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasele 11-12 Marime 1.9 kb
using namespace std;
#include <cstdio>
#include <vector>
#include <algorithm>
#define maxn 100001

struct nod { int x, c,s, d, ps, pd; };

struct cmp{
    bool operator()(const nod &a,const nod &b)const
    {
	if(a.x<b.x)return 1;
	return 0;
    }
};

nod a[maxn];
int n;

int H[3*maxn], H2[3*maxn];

int dp[maxn][2];


void dynamic()
{
    int i,j,v;

    dp[1][0]=0;
    dp[1][1]=a[1].c;



    for(i=2;i<=n;++i)
    {

	dp[i][0]=dp[i][1]=0x3f3f3f3f;
	v=a[i].ps;
	for(j=1;j<i;++j)
	{
	    if(a[i].x-a[i].s>=a[j].x)
	    {
		dp[i][1]=min(dp[i][1], dp[j-1][0]+a[i].c);
		dp[i][1]=min(dp[i][1], dp[j-1][1]+a[i].c);

	    }
	else if(a[j].x+a[j].d>=a[i].x-a[i].s)	
	{
	    dp[i][1]=min(dp[i][1],dp[j-1][1]+a[i].c);
	
	}
	else if(a[j].x+a[j].d>=a[i].x)
	{
	    dp[i][0]=min(dp[i][0], dp[j-1][1]);
	}	    

    } 
    }


    for(i=1;i<=n;++i)
    {
	printf("%d %d\n",dp[i][0],dp[i][1]);
    }
    printf("%d\n", min(dp[n][0], dp[n][1]));


}


void greedy()
{

    int i,j;
    long long S=0;
    a[0].pd=1;
    for(i=0;i<=n;)
    {
	int cmin=0x3f3f3f3f,p=-1;
		
	for(j=i+1;j<=n;++j)
	   if(a[j].x-a[j].s<=a[i].x) 
	       //if(a[i].x+a[i].d<a[j].x-a[j].s) 
		   if(a[j].c<cmin) cmin=a[j].c,p=j;

	if(p==-1)break;
//	printf("%d %d \n",p,cmin);
	i=p+1;
	S+=cmin;
    }
	
    freopen("stalpi.out","w",stdout);
    printf("%lld\n",S);


}

void solve()
{
    int i, j, k, cnt,v;

    for(i=1;i<=n;++i)
    {
	v=a[i].x+a[i].d;
	for(j=i, cnt=(1<<20); cnt; cnt>>=1)
	    if(j+cnt<=n)
		if(a[j+cnt].x<=v) j+=cnt;

	a[i].pd=j;
	v=a[i].x-a[i].s;
	for(j=i, cnt=(1<<20); cnt; cnt>>=1)
	    if(j-cnt>=1)
		if(a[j-cnt].x>=v) j-=cnt;

	a[i].ps=j;
    }

    //for(i=1;i<=n;++i)printf("%d %d\n", a[i].ps, a[i].pd);
  //  dynamic();
greedy();
}

int main()
{
    freopen("stalpi.in","r",stdin);
    scanf("%d\n",&n);
    for(int i=1;i<=n;++i) scanf("%d %d %d %d\n", &a[i].x, &a[i].c, &a[i].s, &a[i].d);
    sort(a+1,a+n+1,cmp());
    solve();
    return 0;
}