Cod sursa(job #325306)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 19 iunie 2009 23:06:45
Problema Stalpi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.34 kb
#include <cstdio>   
#include <cstring>   
#include <algorithm>   
  
using namespace std;   
  
#define file_in "stalpi.in"   
#define file_out "stalpi.out"   
  
#define Nmax 100100   
#define Mmax 601000   
#define Inf 0x3f3f3f3f   
  
struct stalp   
{   
    int x,cost,st,dr;   
}   
v[Nmax];   
  
int n;   
int ai[Mmax];   
int s[Nmax];   
int best[Nmax];   
  
  
int binary_search1(int x)   
{   
    int ls,ld,mij,sol;   
    ls=0;   
    ld=n;   
    mij=(ls+ld)>>1;   
       
    while(ls<=ld)   
    {   
        if(s[mij]<x && s[mij+1]>=x)      
        {      
            return mij;      
        }      
        if (s[mij]<x)   
        {   
            ls=mij+1;   
            sol=mij;   
            mij=(ls+ld)>>1;   
        }   
        else  
        {   
            ld=mij-1;   
            mij=(ls+ld)>>1;   
        }   
    }   
       
    return sol;   
}   
  
  
int binary_search2(int x)   
{   
    int ls,ld,mij,sol;   
    ls=0;   
    ld=n;   
    mij=(ls+ld)>>1;   
       
    while(ls<=ld)   
    {   
        if(s[mij]<=x && s[mij+1]>x)      
        {      
            return mij;      
        }      
        if (s[mij]<=x)   
        {   
            ls=mij+1;   
            sol=mij;   
            mij=(ls+ld)>>1;   
        }   
        else  
        {   
            ld=mij-1;   
            mij=(ls+ld)>>1;   
        }   
    }   
       
    return sol;   
}   
  
  
bool cmp(stalp a, stalp b)   
{   
    return (a.dr<b.dr);   
}   
  
  
void update(int nod, int st, int dr ,int poz, int x)   
{   
    if (st==dr)   
    {   
        ai[nod]=x;   
        return ;   
    }   
       
    int mij=(st+dr)>>1;   
       
    if (poz<=mij)   
        return update(2*nod,st,mij,poz,x);   
    else  
        return update(2*nod+1,mij+1,dr,poz,x);   
    ai[nod]=min(ai[2*nod],ai[2*nod+1]);   
}   
  
int querry(int nod, int st, int dr, int l, int r)   
{   
    if (l<=st && dr<=r)   
    {   
        return ai[nod];   
    }   
       
    int mij=(st+dr)>>1;   
    int sol;   
       
    sol=Inf;   
       
    if (l<=mij)   
        sol=min(sol,querry(2*nod,st,mij,l,r));   
    if (mij<r)   
        sol=min(sol,querry(2*nod+1,mij+1,dr,l,r));   
    return sol;   
}   
  
int main()   
{   
    int i,l,r;   
    freopen(file_in,"r",stdin);   
    freopen(file_out,"w",stdout);   
       
    scanf("%d", &n);   
    s[0]=-Inf;   
    for (i=1;i<=n;++i)   
    {   
        scanf("%d %d %d %d", &v[i].x, &v[i].cost, &v[i].st, &v[i].dr);   
        s[i]=v[i].x;   
        v[i].st=v[i].x-v[i].st;   
        v[i].dr=v[i].dr+v[i].x;   
    }   
       
    sort(s,s+n+1);   
    sort(v+1,v+n+1,cmp);   
       
    /*for (i=1;i<=n;++i)   
    {   
        best[i]=Inf;   
        ai[i]=Inf;   
    }   */
    memset(ai,Inf,sizeof(ai));   
    memset(best,Inf,sizeof(best));   
       
    update(1,0,n,0,0);   
    best[0]=0;   
    for (i=1;i<=n;++i)   
    {   
        l=binary_search1(v[i].st);   
        r=binary_search2(v[i].dr);   
           
        best[r]=min(best[r],querry(1,0,n,l,n)+v[i].cost);   
        update(1,0,n,r,best[r]);   
    }   
       
    printf("%d\n", best[n]);   
       
    fclose(stdin);   
    fclose(stdout);   
       
    return 0;   
}