Cod sursa(job #1979804)

Utilizator raulmuresanRaul Muresan raulmuresan Data 11 mai 2017 14:01:31
Problema Stalpi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <iostream>
#include <fstream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define INF 0x3f3f3f3f
#define N_max 100001
int N, S[N_max], best[N_max];
int Arb[4*N_max+66], Val, Pos, start, finish, minim;
struct Stalpi
{
    int x, c, st, dr;
} P[N_max];

int cmp(Stalpi a, Stalpi b)
{
    if(a.dr!=b.dr) return a.dr<b.dr;
}

void Update(int nod, int left, int right)
{
     if(left==right)
     {
          Arb[nod]=Val;
          return;
     }

     int mij=(left+right)/2;
     if(Pos<=mij) Update(2*nod, left, mij);
     else Update(2*nod+1, mij+1, right);

     Arb[nod]=min(Arb[2*nod], Arb[2*nod+1]);
}

void Query(int nod, int left, int right)
{
     if(start<=left && right<=finish)
     {
          minim=min(minim, Arb[nod]);
          return;
     }

     int mij=(left+right)/2;
     if(start<=mij) Query(2*nod, left, mij);
     if(mij<finish) Query(2*nod+1, mij+1, right);
}

int main()
{
    FILE *f1=fopen("stalpi.in", "r"), *f2=fopen("stalpi.out", "w");
    int i, j, p, q, c, L, R;
    fscanf(f1, "%d\n", &N);
    for(i=1; i<=N; i++)
    {
         fscanf(f1, "%d %d %d %d\n", &P[i].x, &P[i].c, &P[i].st, &P[i].dr);
         S[i]=P[i].x;
         P[i].st=P[i].x-P[i].st;
         P[i].dr=P[i].x+P[i].dr;
    }
    S[0]=-INF;
    sort(S, S+N+1);
    sort(P+1, P+N+1, cmp);
    memset(best, INF, sizeof(best));
    memset(Arb, INF, sizeof(Arb));
    Val=0; Pos=0; Update(1, 0, N);
    best[0]=0;
    for(i=1; i<=N; i++)
    {
         L=lower_bound(S, S+N+1, P[i].st)-S-1;
         R=lower_bound(S, S+N+1, P[i].dr+1)-S-1;
         start=L; finish=N; minim=INF;
         Query(1, 0, N);
         best[R]=min(best[R], minim + P[i].c);
         Val=best[R]; Pos=R;
         Update(1, 0, N);
    }
    fprintf(f2, "%d\n", best[N]);
    fclose(f1); fclose(f2);
    return 0;
}