Cod sursa(job #137617)

Utilizator AlxCojocaru Alexandru Alx Data 17 februarie 2008 12:48:16
Problema Stalpi Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasa a 10-a Marime 1.21 kb
#include <cstdio>
#include <algorithm>
using namespace std;
long n,x[100000],c[100000],s[100000],d[100000],cs[2][100000];
void qsort(int ls,int lf)
{
 if (ls<lf)
 {
  long i1=0,j1=-1,i=ls,j=lf;
  while (i<j)
  {
   if (x[i]>x[j])
   {
    x[i]^=x[j]^=x[i]^=x[j];
    c[i]^=c[j]^=c[i]^=c[j];
    s[i]^=s[j]^=s[i]^=s[j];
    d[i]^=d[j]^=d[i]^=d[j];
    long aux=i1;
    i1=-j1;
    j1=-aux;
   }
   i+=i1;
   j+=j1;
  }
  qsort(ls,i);
  qsort(i+1,lf);
 }
}
int main()
{
 freopen("stalpi.in","r",stdin);
 freopen("stalpi.out","w",stdout);
 scanf("%ld\n",&n);
 long i,j;
 for (i=0;i<n;i++)
 {
  scanf("%ld %ld %ld %ld\n",&x[i],&c[i],&s[i],&d[i]);
  s[i]=x[i]-s[i];
  d[i]=x[i]+d[i];
  cs[0][i]=100001;
 }
 qsort(0,n-1);
 j=1;
 cs[1][0]=c[0];
 while (j<n&&d[0]>=x[j])
 {
  cs[0][j]=c[0];
  j++;
 }
 for (i=1;i<n;i++)
 {
  j=i-1;
  while (j>=0&&x[j]>=s[i])
   j--;
  long plus=0;
  if (j>=0)
   plus=min(cs[0][j],cs[1][j]);
  j++;
  while (j<i)
  {
   cs[0][j]=min(cs[0][j],c[i]+plus);
   j++;
  }
  j=i+1;
  while (j<n&&x[j]<=d[i])
  {
   cs[0][j]=min(cs[0][j],c[i]+plus);
   j++;
  }
  cs[1][i]=c[i]+plus;
 }
 printf("%ld\n",min(cs[0][n-1],cs[1][n-1]));
 return 0;
}