Pagini recente » Cod sursa (job #126654) | Cod sursa (job #587476) | Cod sursa (job #2143586) | Cod sursa (job #2038144) | Cod sursa (job #138461)
Cod sursa(job #138461)
#include <stdio.h>
#include <algorithm>
const int nm = 100001;
const long long inf = (long long) 1 << 56;
using namespace std;
struct pula
{
int x, c, s, d;
};
struct jeg
{
int st, dr, cost;
};
pula a[nm];
jeg v[nm];
int n;
long long c[nm];
bool cmp1(pula one, pula two)
{
return one.x < two.x;
}
bool cmp2(jeg one, jeg two)
{
return one.dr < two.dr;
}
int bs1(int);
int bs2(int);
int main()
{
freopen("stalpi.in", "r", stdin);
freopen("stalpi.out", "w", stdout);
int i, j;
long long temp;
scanf("%d", &n);
for(i = 1; i <= n; ++i)
{
scanf("%d %d %d %d", &a[i].x, &a[i].c, &a[i].s, &a[i].d);
}
sort(a + 1, a + n + 1, cmp1);
for(i = 1; i <= n; ++i)
{
v[i].st = bs1(a[i].x - a[i].s);
v[i].dr = bs2(a[i].x + a[i].d);
v[i].cost = a[i].c;
// printf("%d %d %d\n", v[i].st, v[i].dr, v[i].cost);
c[i] = inf;
}
sort(v + 1, v + n + 1, cmp2);
for(i = 1; i <= n; ++i)
{
temp = inf;
for(j = v[i].st - 1; j < v[i].dr; ++j)
{
if(temp > c[j])
{
temp = c[j];
}
}
if(c[v[i].dr] > temp + v[i].cost)
{
c[v[i].dr] = temp + v[i].cost;
}
}
printf("%lld\n", c[n]);
return 0;
}
int bs1(int val)
{
int min = 1, mid, max = n, rez;
while(min <= max)
{
mid = (min + max) / 2;
if(a[mid].x >= val)
{
rez = mid;
max = mid - 1;
}
else
{
min = mid + 1;
}
}
return rez;
}
int bs2(int val)
{
int min = 1, mid, max = n, rez;
while(min <= max)
{
mid = (min + max) / 2;
if(a[mid].x <= val)
{
rez = mid;
min = mid + 1;
}
else
{
max = mid - 1;
}
}
return rez;
}