Cod sursa(job #2538900)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 5 februarie 2020 12:25:43
Problema Stalpi Scor 60
Compilator cpp-64 Status done
Runda simulare_miri Marime 2.44 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
long long n,k,i,j,x,y,st,dr,mij,rst,rdr,r[100005];
struct vec{int x,c,s,d;}q[100005];
struct vec2{long long x,c;}h[100005];
bool comp(vec A, vec B)
{
    return A.x<B.x;
}
vector <int> v[100005],c[100005];
void up()
{
    int poz=k;
    while(poz>1&&h[poz].c<h[poz/2].c)
    {
        swap(h[poz],h[poz/2]);
        poz/=2;
    }
}
void down()
{
    int poz=1;
    while(2*poz<=k)
    {
        poz*=2;
        if(poz<k&&h[poz+1].c<h[poz].c) poz++;
        if(h[poz].c<h[poz/2].c)
        {
            swap(h[poz],h[poz/2]);
        }
        else return ;
    }
}
int main()
{
    freopen("stalpi.in","r",stdin);
    freopen("stalpi.out","w",stdout);
    scanf("%lld",&n);
    v[0].push_back(0);
    c[0].push_back(0);
    for(i=1; i<=n; i++)
    {
        scanf("%d%d%d%d",&q[i].x,&q[i].c,&q[i].s,&q[i].d);
        v[i].push_back(1);
        v[i].push_back(i-1);
        c[i].push_back(0);
        c[i].push_back(0);
    }
    sort(q+1, q+n+1, comp);
    for(i=1; i<=n; i++)
    {
        x=q[i].x-q[i].s;
        if(x<=q[1].x) rst=0;
        else
        {
            st=1;
            dr=n;
            while(st+1<dr)
            {
                mij=(st+dr)/2;
                if(q[mij].x<x) st=mij;
                else dr=mij;
            }
            if(q[dr].x<=x) rst=dr;
            else rst=st;
        }
        x=q[i].x+q[i].d;
        if(x>=q[n].x)
        {
            rdr=n;
        }
        else
        {
            st=1;
            dr=n;
            while(st+1<dr)
            {
                mij=(st+dr)/2;
                if(q[mij].x<=x) st=mij;
                else dr=mij;
            }
            if(q[dr].x<=x) rdr=dr;
            else rdr=st;
        }
        v[rst][0]++;
        v[rst].push_back(rdr);
        c[rst].push_back(q[i].c);
    }
    for(i=0; i<=n; i++) r[i]=1000000000000;
    h[1].x=0;
    h[1].c=0;
    k=1;
    while(k)
    {
        x=h[1].x;
        y=h[1].c;
        h[1]=h[k];
        h[k].x=0;
        h[k].c=0;
        k--;
        down();
        while(r[x]>y)
        {
            r[x]=y;
            for(i=1; i<=v[x][0]; i++)
            {
                k++;
                h[k].x=v[x][i];
                h[k].c=y+c[x][i];
                up();
            }
            x--;
        }
    }
    printf("%lld",r[n]);
    return 0;
}