Cod sursa(job #325302)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 19 iunie 2009 22:41:55
Problema Stalpi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 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
{
	int x,cost,st,dr;
}
v[Nmax];

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


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


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


bool cmp(stalp a, stalp b)
{
    return (a.dr<b.dr);
}


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

int querry(int nod, int st, int dr, int l, int r)
{
	if (l<=st && dr<=r)
	{
		return ai[nod];
	}
	
	int mij=(st+dr)>>1;
	int sol;
	
	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()
{
	int i,l,r;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d", &n);
	for (i=1;i<=n;++i)
	{
		scanf("%d %d %d %d", &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].dr+v[i].x;
	}
	
	sort(s+1,s+n+1);
	sort(v+1,v+n+1,cmp);
	
	for (i=1;i<=n;++i)
	{
		best[i]=Inf;
		ai[i]=Inf;
	}
	
	update(1,0,n,0,0);
	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\n", best[n]);
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}