Cod sursa(job #994139)

Utilizator maritimCristian Lambru maritim Data 4 septembrie 2013 23:40:39
Problema Stalpi Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;

ifstream f("stalpi.in");
ofstream g("stalpi.out");

struct stalp
{
    int X,C,S,D;
} ;

struct xy
{
    int x,y,cost;
} ;

typedef struct ICompare
{
    bool operator() (const stalp a,const stalp b)
    {
        return a.X < b.X;
    }
} Compare;

typedef struct ICompare2
{
    bool operator() (const xy a,const xy b)
    {
        if(a.y == b.y)
            return a.x < b.x;
        return a.y < b.y;
    }
} Compare2;

#define MaxN 100100
#define INF (1000000007)
#define ll long long

int N;
stalp A[MaxN];
xy segm[MaxN];
ll Best[MaxN];

void citire(void)
{
    f >> N;
    for(int i=1;i<=N;i++)
        f >> A[i].X >> A[i].C >> A[i].S >> A[i].D;
}

inline int cautBinStanga(int li,int ls,int a)
{
    if(li > ls)
        return li;

    if(A[(li+ls)>>1].X == a)
        return ((li+ls)>>1);

    if(A[(li+ls)>>1].X > a)
        return cautBinStanga(li,((li+ls)>>1)-1,a);
    else
        return cautBinStanga(((li+ls)>>1)+1,ls,a);
}

inline int cautBinDreapta(int li,int ls,int a)
{
    if(li > ls)
        return ls;

    if(A[(li+ls)>>1].X == a)
        return ((li+ls)>>1);

    if(A[(li+ls)>>1].X > a)
        return cautBinDreapta(li,((li+ls)>>1)-1,a);
    else
        return cautBinDreapta(((li+ls)>>1)+1,ls,a);
}

void normalizare(void)
{
    A[0].X = 0; A[N+1].X = A[N].X+1;

    for(int i=1;i<=N;i++)
    {
        segm[i].x = cautBinStanga(1,i,A[i].X-A[i].S);
        segm[i].y = cautBinDreapta(i,N,A[i].X+A[i].D);
        segm[i].cost = A[i].C;
    }
}

void Rezolvare(void)
{
    sort(A+1,A+N+1,ICompare());
    normalizare();

    sort(segm+1,segm+N+1,ICompare2());

    for(int i=1;i<=N;i++)
        Best[i] = INF;

    for(int i=1;i<=N;i++)
    {
        for(int j=segm[i].x-1;j<=segm[i].y;j++)
            Best[segm[i].y] = min(Best[segm[i].y],Best[j]+segm[i].cost);

//        for(int i=1;i<=N;i++)
//            cout << Best[i] << " ";
//            cout << "\n";
    }

//    for(int i=1;i<=N;i++)
//        cout << Best[i] << " ";

//    cout << "\n";
//    for(int i=1;i<=N;i++)
//        cout << segm[i].x << " " << segm[i].y << "\n";
}

int main()
{
    citire();
    Rezolvare();

    g << Best[N] << "\n";
}