Cod sursa(job #325314)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 19 iunie 2009 23:23:08
Problema Stalpi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

#define file_in "stalpi.in"
#define file_out "stalpi.out"

#define Nmax 100100
#define Mmax 601000
#define Inf  0x3f3f3f3f   

struct stalp
{
	long x,cost,st,dr;
}
v[Nmax];

long n;
long ai[Mmax];
long s[Nmax];
long best[Nmax];


long binary_search1(long x)
{
	long ls,ld,mij,sol;
	ls=0;
	ld=n;
	mij=(ls+ld)>>1;
	
	while(ls<=ld)
	{
		if(s[mij]<x && s[mij+1]>=x)   
        {   
            return mij;   
        }   
		if (s[mij]<x)
		{
			ls=mij+1;
			sol=mij;
			mij=(ls+ld)>>1;
		}
		else
		{
			ld=mij-1;
			mij=(ls+ld)>>1;
		}
	}
	
	return sol;
}


long binary_search2(long x)
{
	long ls,ld,mij,sol;
	ls=0;
	ld=n;
	mij=(ls+ld)>>1;
	
	while(ls<=ld)
	{
		if(s[mij]<=x && s[mij+1]>x)   
        {   
            return mij;   
        }   
		if (s[mij]<=x)
		{
			ls=mij+1;
			sol=mij;
			mij=(ls+ld)>>1;
		}
		else
		{
			ld=mij-1;
			mij=(ls+ld)>>1;
		}
	}
	
	return sol;
}


inline bool cmp(stalp a, stalp b)   
{   
    if (a.dr<b.dr) return 1;   
    return 0;   
}   
  

void update(long nod, long st, long dr, long poz, long x)   
{   
    long mij=(st+dr)>>1;   
    if(st==dr)   
    {   
        ai[nod]=x;   
        return;   
    }   
    if(poz<=mij) update(2*nod, st, mij, poz, x);   
    if(mij<poz) update(2*nod+1, mij+1, dr, poz, x);   
    ai[nod]=min(ai[nod*2], ai[nod*2+1]);   
}   
  


long querry(long nod, long st, long dr, long l, long r)   
{   
    long mij=(st+dr)>>1;   
    long sol;   
    if(l<=st && dr<=r)   
    {   
        return ai[nod];   
    }   
    sol=Inf;   
    if (l<=mij) 
		sol=min(sol, querry(2*nod,st, mij, l, r));   
    if(mij<r) 
		sol=min(sol, querry(2*nod+1, mij+1, dr, l, r));   
 
    return sol;   
}   


int main()
{
	long i,l,r;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%ld", &n);
	s[0]=-Inf;
	for (i=1;i<=n;++i)
	{
		scanf("%ld %ld %ld %ld", &v[i].x, &v[i].cost, &v[i].st, &v[i].dr);
		s[i]=v[i].x;
		v[i].st=v[i].x-v[i].st;
		v[i].dr=v[i].x+v[i].dr;
	}
	
	sort(s+1,s+n+1);
	sort(v+1,v+n+1,cmp);
	
		
		
	memset(ai, Inf, sizeof(ai));   
    memset(best, Inf, sizeof(best));   

	
	update(1,0,n,0,0);
	
	/*for (i=1;i<=n;++i)
		 printf("%d ", ai[i]);*/
	
	
	best[0]=0;
	for (i=1;i<=n;++i)
	{
		l=binary_search1(v[i].st);
		r=binary_search2(v[i].dr);
		
		best[r]=min(best[r],querry(1,0,n,l,n)+v[i].cost);
		update(1,0,n,r,best[r]);
		//printf("%d %d\n", l,r);
	}
	
	//for (i=1;i<=n;++i)
	printf("%ld ", best[n]);
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}