Cod sursa(job #1013453)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 20 octombrie 2013 22:47:31
Problema Stalpi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream f("stalpi.in");
ofstream g("stalpi.out");
int n,v[100005],dx[100005],dy[100005],c[100005];
bool set[300005];
long long a[300005],inf=(1LL<<38),b[100005],solq=0;
vector <int> lft[100005],val[100005];
//---------------------------------
int Update(int nod,int st,int dr,int key,long long val)
{ int mid;
  if (st==dr) {a[nod]=1LL*val; set[nod]=1;}
   else
    { mid=(st+dr)/2;
       if (key<=mid) Update(2*nod,st,mid,key,val);
        else Update(2*nod+1,mid+1,dr,key,val);
      if (set[2*nod]) {a[nod]=a[2*nod]; set[nod]=1;}
       else if (set[2*nod+1]) {a[nod]=a[2*nod+1]; set[nod]=1;}
      if (set[2*nod] && set[2*nod+1])
        if (1LL*(a[2*nod+1])<a[nod]) a[nod]=1LL*(a[2*nod+1]);

    }
}
//---------------------------------
int Query(int nod,int st,int dr,int x1,int y1)
{ int mid;
   if (x1<=st && dr<=y1) { if (set[nod] && 1LL*a[nod]<1LL*solq)  solq=1LL*a[nod];}
   else
    { mid=(st+dr)/2;
       if (x1<=mid) Query(2*nod,st,mid,x1,y1);
       if (y1>mid) Query(2*nod+1,mid+1,dr,x1,y1);
    }
}
//-----------------------------
void Read()
{ int i,x,cost,s,d;
   f>>n;
  for(i=1;i<=n;i++)
  { f>>x>>cost>>s>>d;
     v[i]=x;
     dx[i]=max(0,x-s);
     dy[i]=x+d;
     c[i]=cost;
  }
  sort(v+1,v+n+1);
}
//-----------------------------
int Bs1(int x)
{ int i,l=1,r=n,m;
   while(l<r)
   { m=(l+r)/2;
      if (v[m]==x) return m;
     if (v[m]>=x) r=m-1; else l=m+1;
   }
   if (v[l+1]>=x && v[l]<x) l++;
return l;
}
//------------------------------
int Bs2(int x)
{ int i,l=1,r=n,m;
   while(l<r)
   { m=(l+r)/2;
       if (v[m]==x) return m;
     if (v[m]<=x) l=m+1; else r=m-1;
   }

 if (v[l]>x && v[l-1]<=x) l--;
return l;
}

//------------------------------
void FindInt()
{ int i;
   for(i=1;i<=n;i++)
    {dx[i]=Bs1(dx[i]);
     dy[i]=Bs2(dy[i]);
      lft[dy[i]].push_back(dx[i]);
      val[dy[i]].push_back(c[i]);
    }
}
//-------------------------------
void Dinamic()
{ int i,j;
   b[0]=0;
    Update(1,0,n,0,0);
   for(i=1;i<=n;i++)
   { b[i]=1LL*inf;
       for(j=0;j<lft[i].size();j++)
         {    solq=1LL*inf;
             Query(1,0,n,lft[i][j]-1,i-1);
            if (solq!=inf)
              if (1LL*(val[i][j]+solq)<1LL*b[i]) b[i]=1LL*(val[i][j]+solq);
         }
     if (b[i]!=inf)
       Update(1,0,n,i,b[i]);
   }

  g<<1LL*b[n];
}
//------------------------------
int main()
{ Read();
  FindInt();
   Dinamic();

    return 0;
}