Pagini recente » Cod sursa (job #1328851) | Cod sursa (job #2123922) | Cod sursa (job #598521) | Cod sursa (job #197578) | Cod sursa (job #994139)
Cod sursa(job #994139)
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
ifstream f("stalpi.in");
ofstream g("stalpi.out");
struct stalp
{
int X,C,S,D;
} ;
struct xy
{
int x,y,cost;
} ;
typedef struct ICompare
{
bool operator() (const stalp a,const stalp b)
{
return a.X < b.X;
}
} Compare;
typedef struct ICompare2
{
bool operator() (const xy a,const xy b)
{
if(a.y == b.y)
return a.x < b.x;
return a.y < b.y;
}
} Compare2;
#define MaxN 100100
#define INF (1000000007)
#define ll long long
int N;
stalp A[MaxN];
xy segm[MaxN];
ll Best[MaxN];
void citire(void)
{
f >> N;
for(int i=1;i<=N;i++)
f >> A[i].X >> A[i].C >> A[i].S >> A[i].D;
}
inline int cautBinStanga(int li,int ls,int a)
{
if(li > ls)
return li;
if(A[(li+ls)>>1].X == a)
return ((li+ls)>>1);
if(A[(li+ls)>>1].X > a)
return cautBinStanga(li,((li+ls)>>1)-1,a);
else
return cautBinStanga(((li+ls)>>1)+1,ls,a);
}
inline int cautBinDreapta(int li,int ls,int a)
{
if(li > ls)
return ls;
if(A[(li+ls)>>1].X == a)
return ((li+ls)>>1);
if(A[(li+ls)>>1].X > a)
return cautBinDreapta(li,((li+ls)>>1)-1,a);
else
return cautBinDreapta(((li+ls)>>1)+1,ls,a);
}
void normalizare(void)
{
A[0].X = 0; A[N+1].X = A[N].X+1;
for(int i=1;i<=N;i++)
{
segm[i].x = cautBinStanga(1,i,A[i].X-A[i].S);
segm[i].y = cautBinDreapta(i,N,A[i].X+A[i].D);
segm[i].cost = A[i].C;
}
}
void Rezolvare(void)
{
sort(A+1,A+N+1,ICompare());
normalizare();
sort(segm+1,segm+N+1,ICompare2());
for(int i=1;i<=N;i++)
Best[i] = INF;
for(int i=1;i<=N;i++)
{
for(int j=segm[i].x-1;j<=segm[i].y;j++)
Best[segm[i].y] = min(Best[segm[i].y],Best[j]+segm[i].cost);
// for(int i=1;i<=N;i++)
// cout << Best[i] << " ";
// cout << "\n";
}
// for(int i=1;i<=N;i++)
// cout << Best[i] << " ";
// cout << "\n";
// for(int i=1;i<=N;i++)
// cout << segm[i].x << " " << segm[i].y << "\n";
}
int main()
{
citire();
Rezolvare();
g << Best[N] << "\n";
}