Pagini recente » Monitorul de evaluare | Profil We_love_alexniuclae | Cod sursa (job #200971) | Istoria paginii runda/ada27/clasament | Cod sursa (job #492246)
Cod sursa(job #492246)
#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=(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++;
if (!p) p=i;
update(p,c);
}
printf("%lld\n",a[n]);
}