Pagini recente » Cod sursa (job #3185468) | Cod sursa (job #589883) | Cod sursa (job #2223606) | Cod sursa (job #2424832) | Cod sursa (job #137311)
Cod sursa(job #137311)
#include <queue>
#include <cstdio>
#include <vector>
#include <algorithm>
#define dim 100001
#define inf 0x3f3f3f3f
using namespace std;
int N;
int X[dim];
int C[dim];
int S[dim];
int D[dim];
long long unsigned Cm[dim];
struct stlp
{
int x;
int c;
int s;
int d;
};
struct comp
{
bool operator()(stlp i, stlp j)
{
return i.x > j.x;
}
};
priority_queue <stlp, vector <stlp>, comp> Pq;
int Binary(int val)
{
if(val <= 0) return 0;
int i, step;
for(step=1; step<=N; step<<=1);
for(i=0; step; step>>=1)
if(i + step <= N && X[i+step] <= val) i += step;
return i;
}
int main()
{
freopen("stalpi.in", "rt", stdin);
freopen("stalpi.out", "wt", stdout);
stlp e;
int i, j, k, max = 0;
for(scanf("%d", &N), i=1; i<=N; ++i)
{
scanf("%d %d %d %d", &e.x, &e.c, &e.s, &e.d);
Pq.push(e);
}
i = 0;
while(Pq.empty() == false)
{
e = Pq.top();
Pq.pop();
++ i;
X[i] = e.x;
C[i] = e.c;
S[i] = e.s;
D[i] = e.d;
}
memset(Cm, inf, sizeof(Cm));
Cm[0] = 0;
Cm[1] = C[1];
for(i=2; i<=N && X[i]<=X[1]+D[1]; ++i)
Cm[i] = C[1];
for(i=2; i<=N; ++i)
{
for(j=1; j<i; ++j)
{
k = Binary(X[j]-S[j]);
if(X[i] <= X[j] + D[j] && Cm[k] + C[j] < Cm[i])
Cm[i] = Cm[k] + C[j];
}
k = Binary(X[i]-S[i]);
int cst = C[i] + Cm[k];
for(j=k+1; j<=i; ++j)
if(Cm[j] > cst) Cm[j] = cst;
for(j=i+1; j<=N && X[j]<=X[i]+D[i]; ++j)
if(Cm[j] > cst) Cm[j] = cst;
}
printf("%llu", Cm[N]);
fclose(stdin);
fclose(stdout);
return 0;
}