Cod sursa(job #137284)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 17 februarie 2008 10:56:29
Problema Stalpi Scor 20
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasa a 10-a Marime 1.83 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

#define DBxG

#define fin  "stalpi.in"
#define fout "stalpi.out"

#define pb push_back
#define sz(c) (int)((c).size())
#define mp make_pair
#define f first
#define s second

const int Nmax = 100010;
const int Max  = 1000000000;

int N;
vector < pair < pair < int , int > , pair < int , int > > > v;
int dp[Nmax][2];

void readdata()
{
     int i,x,c,s,d;
     
     freopen(fin,"r",stdin);
     freopen(fout,"w",stdout);
     
     scanf("%d",&N);
     
     for ( i = 1; i <= N; ++i )
     {
         scanf("%d%d%d%d",&x,&c,&s,&d);
         v.pb( mp( mp(x,c) , mp(x-s,x+d) ) );
     }
#ifdef DBG
     printf("%d\n",(sizeof(int)*100000*4 + sizeof(dp))/1024);
#endif     
}

void solve()
{
     int i,j;
     
     sort(v.begin(),v.end());
     
#ifdef DBG
     for ( i = 0; i < N; ++i )
         printf("%d %d %d %d\n",v[i].f.f,v[i].f.s,v[i].s.f,v[i].s.s);
#endif

     for ( i = 1; i <= N; ++i )
     {
         dp[i][0] = Max;
         
         for ( j = 1; j < i; ++j )
             if ( v[j-1].s.s >= v[i-1].f.f && dp[i][0] > dp[j][1] )
                dp[i][0] = dp[j][1];
         
         dp[i][1] = Max;
         
         for ( j = i-1; j > 0 && v[i-1].s.f <= v[j-1].f.f; --j )
         {
             if ( dp[j][0] < dp[i][1] )
                dp[i][1] = dp[j][0];
             if ( dp[j][1] < dp[i][1] )
                dp[i][1] = dp[j][1];          
         }
         
         if ( dp[j][0] < dp[i][1] )
            dp[i][1] = dp[j][0];
         if ( dp[j][1] < dp[i][1] )
            dp[i][1] = dp[j][1];
            
         dp[i][1] = dp[i][1] + v[i-1].f.s;
     }
     
     printf("%d\n",min(dp[N][0],dp[N][1]));
}

int main()
{
    readdata();
    solve();
    return 0;   
}