Pagini recente » Cod sursa (job #1177688) | Cod sursa (job #417906) | Cod sursa (job #783318) | Cod sursa (job #1776241) | Cod sursa (job #315770)
Cod sursa(job #315770)
#include<stdio.h>
#include<utility>
#include<algorithm>
#define ll long long
#define dr first
#define st second.first
#define co second.second
#define dv 100010
#define INF 2000000000000LL
using namespace std;
typedef pair<int,pair<int,ll> > bec;
bec b[dv];
int n,i,x[dv],cate[dv],top,ac,it,stg,cauta(int nr);
ll bst[dv],best;
void readd(),solve(),getsd();
int main()
{
readd();
solve();
return 0;
}
void readd()
{
int xx,ss,dd;ll cc;
freopen("stalpi.in","r",stdin);
freopen("stalpi.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%lld%d%d",&xx,&cc,&ss,&dd);
b[i].dr=xx+dd;b[i].st=xx-ss;b[i].co=cc;
x[i]=xx;
}
}
void solve()
{
sort(x+1,x+n+1);
for(i=1;i<=n;i++)getsd();
sort(b+1,b+n+1);
for(i=1;i<=n;i++)b[i].st=b[i].dr-b[i].st+1;
top=1;bst[1]=0;cate[1]=0;
it=1;
for(ac=1;ac<=n;ac++)
{
if(b[it].dr>ac)continue;
if(b[it].st+cate[top]<ac)
{ while(b[it].dr==ac)it++;continue;}
best=INF;stg=1;
while(b[it].dr==ac&&b[it].st+cate[top]>=ac)
{ if(stg<top)stg=cauta(b[it].st);
if(bst[stg]+b[it].co<best)best=bst[stg]+b[it].co;
it++;
}
if(best>bst[top]){bst[++top]=best;cate[top]=ac;}
else cate[top]=ac;
while(b[it].dr==ac)it++;
}
printf("%lld\n",bst[top]);
}
void getsd()
{
int pr,ul,mi;
pr=0;ul=n;
while(ul-pr-1)
{
mi=(ul+pr)>>1;
if(b[i].st<=x[mi])ul=mi;
else pr=mi;
}
b[i].st=ul;
pr=0;ul=n+1;
while(ul-pr-1)
{
mi=(ul+pr)>>1;
if(b[i].dr>=x[mi])pr=mi;
else ul=mi;
}
b[i].dr=pr;
}
int cauta(int nr)
{
int lo=0,up=top,mi;
while(up-lo-1)
{
mi=(up+lo)/2;
if(cate[mi]+nr<ac)lo=mi;
else up=mi;
}
return up;
}