Cod sursa(job #1013424)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 20 octombrie 2013 21:38:14
Problema Stalpi Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream f("stalpi.in");
ofstream g("stalpi.out");
int n,v[100005],dx[100005],dy[100005],c[100005],b[100005],inf=2147000000;
vector <int> lft[100005],val[100005];

//-----------------------------
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(1,x-s);
     dy[i]=x+d;
     c[i]=cost;
  }
  sort(v+1,v+n+1);
}
//-----------------------------
int Bs1(int x)
{ int l=1,r=n,m;
   while(l<r)
   { m=(l+r)/2;
      if (v[m]==x) return m;
     if (v[m]>=x) r=m; else l=m+1;
   }
return l;
}
//------------------------------
int Bs2(int x)
{ int 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;
   }
  m=(l+r)/2;
 if (v[m]>x && v[m-1]<=x) {m--;l=m;}
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]);
     //cout<<dx[i]<<" "<<dy[i]<<" "<<c[i]<<"\n";
    }
}
//-------------------------------
int Vmin(int l,int r)
{ int i,mn=inf;
   for(i=l;i<=r;i++)
    mn=min(mn,b[i]);
return mn;
}
//-------------------------------
void Dinamic()
{ int i,j,rest;
   b[0]=0;
   for(i=1;i<=n;i++)
   { b[i]=inf;
       for(j=0;j<lft[i].size();j++)
         { rest=Vmin(lft[i][j]-1,i-1);
            if (rest!=inf)
              b[i]=min(b[i],val[i][j]+rest);
         }
   }

  g<<b[n];
}
//------------------------------
int main()
{ Read();
  FindInt();
  Dinamic();
    return 0;
}