Pagini recente » Cod sursa (job #2155907) | Borderou de evaluare (job #1570384) | Cod sursa (job #250733) | Cod sursa (job #2656264) | Cod sursa (job #2538900)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
long long n,k,i,j,x,y,st,dr,mij,rst,rdr,r[100005];
struct vec{int x,c,s,d;}q[100005];
struct vec2{long long x,c;}h[100005];
bool comp(vec A, vec B)
{
return A.x<B.x;
}
vector <int> v[100005],c[100005];
void up()
{
int poz=k;
while(poz>1&&h[poz].c<h[poz/2].c)
{
swap(h[poz],h[poz/2]);
poz/=2;
}
}
void down()
{
int poz=1;
while(2*poz<=k)
{
poz*=2;
if(poz<k&&h[poz+1].c<h[poz].c) poz++;
if(h[poz].c<h[poz/2].c)
{
swap(h[poz],h[poz/2]);
}
else return ;
}
}
int main()
{
freopen("stalpi.in","r",stdin);
freopen("stalpi.out","w",stdout);
scanf("%lld",&n);
v[0].push_back(0);
c[0].push_back(0);
for(i=1; i<=n; i++)
{
scanf("%d%d%d%d",&q[i].x,&q[i].c,&q[i].s,&q[i].d);
v[i].push_back(1);
v[i].push_back(i-1);
c[i].push_back(0);
c[i].push_back(0);
}
sort(q+1, q+n+1, comp);
for(i=1; i<=n; i++)
{
x=q[i].x-q[i].s;
if(x<=q[1].x) rst=0;
else
{
st=1;
dr=n;
while(st+1<dr)
{
mij=(st+dr)/2;
if(q[mij].x<x) st=mij;
else dr=mij;
}
if(q[dr].x<=x) rst=dr;
else rst=st;
}
x=q[i].x+q[i].d;
if(x>=q[n].x)
{
rdr=n;
}
else
{
st=1;
dr=n;
while(st+1<dr)
{
mij=(st+dr)/2;
if(q[mij].x<=x) st=mij;
else dr=mij;
}
if(q[dr].x<=x) rdr=dr;
else rdr=st;
}
v[rst][0]++;
v[rst].push_back(rdr);
c[rst].push_back(q[i].c);
}
for(i=0; i<=n; i++) r[i]=1000000000000;
h[1].x=0;
h[1].c=0;
k=1;
while(k)
{
x=h[1].x;
y=h[1].c;
h[1]=h[k];
h[k].x=0;
h[k].c=0;
k--;
down();
while(r[x]>y)
{
r[x]=y;
for(i=1; i<=v[x][0]; i++)
{
k++;
h[k].x=v[x][i];
h[k].c=y+c[x][i];
up();
}
x--;
}
}
printf("%lld",r[n]);
return 0;
}