Cod sursa(job #492237)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 13 octombrie 2010 21:03:39
Problema Stalpi Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define nmax 100010

struct stalp
{
	int x, c, s, d;
} v[nmax];

int cmp(stalp a, stalp b)
{
	return a.x<b.x;
}

int n;
long long a[nmax];

int search(int a, int b, int x)
{
	int m, r=0;
	while (a<=b)
	{
		m=(a+b)/2;
		if (v[m].x<x)
		{
			r=m;
			a=m+1;
		} else b=m-1;
	}
	return r;
}

void update(int p, long long val)
{
	while (p)
	{
		a[p]=min(a[p], val);
		p -=(p^(p-1))&p;
	}
}

long long query(int p)
{
	long long r;
	r=(long long) 1<<60;
	while (p<=n)
	{
		r=min(r, a[p]);
		p +=(p^(p-1))&p;
	}
	return r;
}

int main()
{
	freopen("stalpi.in","r",stdin);
	freopen("stalpi.out","w",stdout);
	scanf("%d",&n);
	int i, p;
	long long c;
	for (i=1; i<=n; i++) scanf("%d %d %d %d",&v[i].x, &v[i].c, &v[i].s, &v[i].d);
	for (i=1; i<=n; i++) a[i]=(long long) 1<<60;
	sort(v+1, v+n+1, cmp);
	for (i=1; i<=n; i++)
	{
		p=search(1,i-1,v[i].x-v[i].s);
		if (!p) c=0; else c=query(p);
		c+=v[i].c;
		p=search(i,n,v[i].x+v[i].d);
		if (v[p+1].x<=v[i].x+v[i].d && p<n) p++;
		update(p,c);
	}
	printf("%lld\n",query(n));
}