Cod sursa(job #2979727)

Utilizator Theo14Ancuta Theodor Theo14 Data 15 februarie 2023 19:53:49
Problema Stalpi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.75 kb
#include<bits/stdc++.h>
#pragma GCC target ("avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
#define int long long
#define INF 1000000000000000000
using namespace std;
ifstream f("stalpi.in");
ofstream g("stalpi.out");

struct elem
{
    int x,c,s,d;
} v[100005];

int cmp(elem aa, elem bb)
{
    return aa.d<bb.d;
}

int n,k,pozx[100005],aint[4*100005],dp[100005],a[100005],lef[100005],righ[100005],lazy[4*100005];

void propagate(int nod, int st, int dr)
{
    if(lazy[nod]!=INF)
    {
        aint[nod]=lazy[nod];
        if(st!=dr)
        {
            lazy[2*nod]=lazy[nod];
            lazy[2*nod+1]=lazy[nod];
        }
        lazy[nod]=INF;
    }
}

void update(int nod, int st, int dr, int l, int r,int val)
{
    if(st==l && dr==r)
    {
        propagate(nod,st,dr);
        if(val<aint[nod])
            lazy[nod]=val;
        propagate(nod,st,dr);
    }
    else
    {
        int mij=(st+dr)/2;
        propagate(nod,st,dr);
        propagate(2*nod,st,mij);
        propagate(2*nod+1,mij+1,dr);
        if(r<=mij)
            update(2*nod,st,mij,l,r,val);
        else
        if(l>=mij+1)
            update(2*nod+1,mij+1,dr,l,r,val);
        else
        {
            update(2*nod,st,mij,l,mij,val);
            update(2*nod+1,mij+1,dr,mij+1,r,val);
        }
        aint[nod]=min(aint[2*nod],aint[2*nod+1]);
    }
}

int query(int nod, int st, int dr, int l, int r)
{
    propagate(nod,st,dr);
    if(st==l && dr==r)
        return aint[nod];
    else
    {
        int mij=(st+dr)/2;
        if(r<=mij)
            return query(2*nod,st,mij,l,r);
        else if(l>=mij+1)
            return query(2*nod+1,mij+1,dr,l,r);
        else
            return min(query(2*nod,st,mij,l,mij),query(2*nod+1,mij+1,dr,mij+1,r));
    }
}

int caut_bin(int x)
{
    int st=1,dr=k,retin=1;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(x<a[mij])
        {
            dr=mij-1;
        }
        else
            st=mij+1,retin=mij;
    }
    return retin;
}

signed main()
{
    int i,j;
    f>>n;
    for(i=1; i<=n; i++)
    {
        f>>v[i].x>>v[i].c>>v[i].s>>v[i].d;
        v[i].s=v[i].x-v[i].s;
        v[i].d=v[i].x+v[i].d;
        a[++k]=v[i].x;
    }
    sort(v+1,v+n+1,cmp);
    sort(a+1,a+k+1);
    for(i=1; i<=n; i++)
        dp[i]=INF;
    for(i=1; i<=4*n; i++)
        aint[i]=INF,lazy[i]=INF;
    for(i=1; i<=n; i++)
    {
        int ss=caut_bin(v[i].s);
        int dd=caut_bin(v[i].d);
        int nr=query(1,1,k,ss,dd);
        if(nr==INF)
            nr=0;
        if(v[i].c+nr<dp[dd])
        {
            dp[dd]=v[i].c+nr;
            update(1,1,k,1,dd,dp[dd]);
        }
    }
    g<<dp[n];
    return 0;
}