Pagini recente » Cod sursa (job #449978) | Cod sursa (job #2454808) | Cod sursa (job #2259756) | Cod sursa (job #2818597) | Cod sursa (job #2971024)
#include <fstream>
#include <algorithm>
#define int long long
using namespace std;
ifstream cin ("stalpi.in");
ofstream cout ("stalpi.out");
const int nmax = 1e5, inf = 1e18;
int n, dp[nmax + 1];
struct cell
{
int x, c, s, d;
};
bool cmpx (cell a, cell b)
{
return a.x < b.x;
}
cell v[nmax + 1];
int search_firsti (int x)
{
int st = 0, dr = n, mij, sol = n;
st = 0, dr = n;
while (st <= dr)
{
mij = (st + dr) / 2;
if (v[mij].x < x)
sol = mij, st = mij + 1;
else
dr = mij - 1;
}
return sol;
}
int search_lasti (int x)
{
int st = 0, dr = n, mij, sol = n;
while (st <= dr)
{
mij = (st + dr) / 2;
if (v[mij].x <= x)
sol = mij, st = mij + 1;
else
dr = mij - 1;
}
return sol;
}
signed main()
{
int i, j, lasti, firsti, minn;
cin >> n;
for (i = 1; i <= n; i++)
cin >> v[i].x >> v[i].c >> v[i].s >> v[i].d, dp[i] = inf;
sort (v + 1, v + n + 1, cmpx);
dp[0] = 0;
v[0].x = -inf;
for (i = 1; i <= n; i++)
{
minn = inf;
firsti = search_firsti (v[i].x - v[i].s);
for (j = firsti; j <= i; j++)
minn = min (minn, dp[j]);
lasti = search_lasti (v[i].x + v[i].d);
for (j = i; j <= lasti; j++)
dp[j] = min (dp[j], minn + v[i].c);
}
cout << dp[n];
return 0;
}