Cod sursa(job #2402280)

Utilizator sichetpaulSichet Paul sichetpaul Data 10 aprilie 2019 15:52:30
Problema Stalpi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <bits/stdc++.h>
#define DIM 100005
#define ll long long
using namespace std;
ll dp[DIM],arb[2*DIM];
struct stalp{
   int l,r,x,c;
};
stalp v[DIM];
bool cmp1(stalp a,stalp b) {
  return a.x<b.x;
}
struct interval{
   int st,dr,c;
};
interval p[DIM];
bool cmp2(interval a,interval b) {
    if (a.st==b.st) return a.dr<b.dr;
    return a.st<b.st;
}
int n;

int GetLeft(int pos) {
    int le=1,ri=pos,sol=pos;
    while (le<=ri) {
        int mij=(le+ri)/2;
        if (v[mij].x>=v[pos].x-v[pos].l) sol=mij,ri=mij-1;
        else le=mij+1;
    }
    return sol;
}
int GetRight(int pos) {
    int le=pos,ri=n,sol=pos;
    while (le<=ri) {
        int mij=(le+ri)/2;
        if (v[mij].x<=v[pos].x+v[pos].r) sol=mij,le=mij+1;
        else ri=mij-1;
    }
       return sol;
}
ll sol;int x,y,pos;
void update(int nod,int st,int dr,ll value) {
   if (st==dr) arb[nod]=value;
   else {
        int mij=(st+dr)/2;
        if (pos<=mij) update(2*nod,st,mij,value);
        else update(2*nod+1,mij+1,dr,value);
        arb[nod]=min(arb[2*nod],arb[2*nod+1]);
   }
}
void query(int nod,int st,int dr) {
   if (x<=st && dr<=y)  sol=min(sol,arb[nod]);
   else {
       int mij=(st+dr)/2;
       if (x<=mij) query(2*nod,st,mij);
       if (mij<y) query(2*nod+1,mij+1,dr);
   }
}
int main()
{   int i,Max=0;ll ans=0,INF,val;
    ifstream f("stalpi.in");
    ofstream g("stalpi.out");
    f>>n;
    for (i=1;i<=n;++i)
        f>>v[i].x>>v[i].c>>v[i].l>>v[i].r,Max=max(Max,v[i].c);

    INF=1LL*Max*n+1;
    for (i=1;i<=2*n;++i)
        arb[i]=INF;

    sort(v+1,v+n+1,cmp1);

    for (i=1;i<=n;++i)
        p[i].st=GetLeft(i),p[i].dr=GetRight(i),p[i].c=v[i].c;

    sort(p+1,p+n+1,cmp2);

    pos=p[1].dr;
    update(1,1,n,p[1].c);


    for (i=2;i<=n;++i) {
        x=p[i].st-1,y=n,sol=INF;
        query(1,1,n);
        val=sol+p[i].c;

        pos=p[i].dr;
        update(1,1,n,val);

        if (p[i].dr==n) {
              if (ans==0) ans=val;
              else ans=min(ans,val);
        }
    }

       g<<ans<<'\n';

    return 0;
}