Pagini recente » Profil mihnearipanu | Cod sursa (job #2937545) | Statistici Madalina Mut (mutmadalina) | Cod sursa (job #1512006) | Cod sursa (job #137784)
Cod sursa(job #137784)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define MAXN 100005
#define stalp pair< pair<int, int>, pair<int, int> >
#define X first.first
#define Cst first.second
#define L second.first
#define R second.second
#define make_stalp( a, b, c, d ) make_pair( make_pair( (a), (b) ), make_pair( (c), (d) ) )
int N;
vector< stalp > v;
vector<int> coord;
long long bst[MAXN]; //bst[i] = costul minim pentru a acoperii primii i stalpi (sortati dupa X)
long long aib[MAXN];
inline void aibUpdate( int poz, long long val )
{
poz = N - poz;
for (; poz < MAXN; poz += poz ^ (poz - 1) & poz)
if (val < aib[poz])
aib[poz] = val;
}
inline long long aibQuery( int poz )
{
//N - 1 -> 1
//N - 2 -> 2
//...
//0 -> N
long long rez = 0x3f3f3f3f3f3f3f3fLL;
poz = N - poz;
for (; poz; poz &= (poz - 1))
if (aib[poz] < rez)
rez = aib[poz];
return rez;
}
//returneaza minim( bst[k], k >= poz )
inline long long query( int poz )
{
return aibQuery( poz );
/*
int Min = 0x3f3f3f3f;
for (int i = poz; i < N; i++)
if (bst[i] < Min)
Min = bst[i];
return Min;*/
}
int cmp( const stalp &a, const stalp &b )
{
return a.X + a.R < b.X + b.R;
}
int main()
{
freopen("stalpi.in", "rt", stdin);
freopen("stalpi.out", "wt", stdout);
scanf("%d", &N);
for (int i = 0; i < N; i++)
{
int x, cst, l, r;
scanf("%d %d %d %d", &x, &cst, &l, &r);
v.push_back( make_stalp( x, cst, l, r ) );
}
memset( aib, 0x3f, sizeof(aib) );
memset( bst, 0x3f, sizeof(bst) );
sort( v.begin(), v.end(), cmp );
for (int i = 0; i < N; i++)
coord.push_back( v[i].X );
sort( coord.begin(), coord.end() );
for (int i = 0; i < N; i++)
{
if (i && v[i].X == v[i - 1].X)
printf("%d\n", v[i].X);
long long cst = v[i].Cst;
int left = v[i].X - v[i].L;
if (left > coord[0])
{
int pleft = lower_bound( coord.begin(), coord.end(), left ) - coord.begin();
if (coord[pleft] < left) //nush exact cum merge lower_bound cand nu gaseste elementu :P
pleft++;
cst += query( pleft - 1 );
}
int right = v[i].X + v[i].R;
if (right > coord[N - 1])
if (cst < bst[N - 1])
{
bst[N - 1] = cst;
aibUpdate( N - 1, cst );
}
else;
else
{
int pright = lower_bound( coord.begin(), coord.end(), right ) - coord.begin();
if (coord[pright] > right)
pright--;
if (cst < bst[pright])
{
bst[pright] = cst;
aibUpdate( pright, cst );
}
}
}
printf("%lld\n", bst[N - 1]);
return 0;
}