Cod sursa(job #316101)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 18 mai 2009 13:05:15
Problema Stalpi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>  
#include <algorithm>  
  
using namespace std;  
   
#define MAX_N 100005  
#define FIN "stalpi.in"  
#define FOUT "stalpi.out"  
#define LSB(x) (((x)&((x)-1))^(x))  
#define INF 0x3f3f3f3f  
#define f first  
#define s second  
#define mp make_pair  
  
int N, X[MAX_N], cnt[MAX_N], cost[MAX_N], T[MAX_N], Res = INF;  
pair<pair<int, int>, int> A[MAX_N];  
   
int query(int x)  
{  
     int t = INF;  
  
     if (x < 0) return 0;  
     for (x = N-x; x > 0; x -= LSB(x))  
         t = min(t, T[x]);  
     return t;  
}  
   
void update(int x, int y)  
{  
     for (x = N-x; x <= N; x += LSB(x))  
          T[x] = min(T[x], y);  
}  
   
int main(void)  
{  
     int i, x, c, l, r;  
   
     freopen(FIN, "r", stdin);  
     freopen(FOUT, "w", stdout);  
   
     scanf("%d", &N);  
     for (i = 0; i < N; ++i)  
     {  
         scanf("%d %d %d %d", &x, &c, &l, &r);  
         A[i] = mp(mp(x+r, x-l), c);  
         X[i] = x;  
     }  
   
     sort(X, X+N);  
     sort(A, A+N);  
     memset(T, 0x3f, sizeof(T));  
     for (i = 0; i < N; ++i)  
     {  
         r = A[i].f.f, l = A[i].f.s, c = A[i].s;  
         l = lower_bound(X, X+N, l)-X;  
         r = upper_bound(X, X+N, r)-X-1;  
         cnt[i] = r;  
         cost[i] = query(l-1)+c;  
         update(r, cost[i]);  
         if (cnt[i] == N-1) Res = min(Res, cost[i]);  
     }  
     printf("%d\n", Res);  
   
     return 0;  
}