Pagini recente » Cod sursa (job #1285822) | Cod sursa (job #1953865) | Cod sursa (job #2295361) | Cod sursa (job #795689) | Cod sursa (job #316101)
Cod sursa(job #316101)
#include <stdio.h>
#include <algorithm>
using namespace std;
#define MAX_N 100005
#define FIN "stalpi.in"
#define FOUT "stalpi.out"
#define LSB(x) (((x)&((x)-1))^(x))
#define INF 0x3f3f3f3f
#define f first
#define s second
#define mp make_pair
int N, X[MAX_N], cnt[MAX_N], cost[MAX_N], T[MAX_N], Res = INF;
pair<pair<int, int>, int> A[MAX_N];
int query(int x)
{
int t = INF;
if (x < 0) return 0;
for (x = N-x; x > 0; x -= LSB(x))
t = min(t, T[x]);
return t;
}
void update(int x, int y)
{
for (x = N-x; x <= N; x += LSB(x))
T[x] = min(T[x], y);
}
int main(void)
{
int i, x, c, l, r;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d", &N);
for (i = 0; i < N; ++i)
{
scanf("%d %d %d %d", &x, &c, &l, &r);
A[i] = mp(mp(x+r, x-l), c);
X[i] = x;
}
sort(X, X+N);
sort(A, A+N);
memset(T, 0x3f, sizeof(T));
for (i = 0; i < N; ++i)
{
r = A[i].f.f, l = A[i].f.s, c = A[i].s;
l = lower_bound(X, X+N, l)-X;
r = upper_bound(X, X+N, r)-X-1;
cnt[i] = r;
cost[i] = query(l-1)+c;
update(r, cost[i]);
if (cnt[i] == N-1) Res = min(Res, cost[i]);
}
printf("%d\n", Res);
return 0;
}