Submission #1181342

#TimeUsernameProblemLanguageResultExecution timeMemory
1181342AlgorithmWarriorPinball (JOI14_pinball)C++20
100 / 100
360 ms35052 KiB
#include <bits/stdc++.h>

using namespace std;

int const MAX=100005;
long long const INF=1000000000000000000;
int m,n;
int st[MAX],dr[MAX],loc[MAX],pret[MAX];
long long ans;

struct node{
    long long pref,suf;
    node(){
        pref=INF;
        suf=INF;
    }
};

void minself(long long& x,long long val){
    if(x>val)
        x=val;
}

struct segment_tree{
    node v[12*MAX];
    node combine(node a,node b){
        node comb;
        comb.pref=min(a.pref,b.pref);
        comb.suf=min(a.suf,b.suf);
        return comb;
    }
    void update(int nod,int st,int dr,int poz,node upd){
        if(st==dr)
            v[nod]=combine(v[nod],upd);
        else{
            int mij=(st+dr)/2;
            if(poz<=mij)
                update(2*nod,st,mij,poz,upd);
            else
                update(2*nod+1,mij+1,dr,poz,upd);
            v[nod]=combine(v[2*nod],v[2*nod+1]);
        }
    }
    node query(int nod,int st,int dr,int a,int b){
        if(a<=st && dr<=b)
            return v[nod];
        int mij=(st+dr)/2;
        node rasp;
        if(a<=mij)
            rasp=combine(rasp,query(2*nod,st,mij,a,b));
        if(b>mij)
            rasp=combine(rasp,query(2*nod+1,mij+1,dr,a,b));
        return rasp;
    }
}aint;

void read(){
    cin>>m>>n;
    int i;
    for(i=1;i<=m;++i)
        cin>>st[i]>>dr[i]>>loc[i]>>pret[i];
}

void normalize(){
    map<int,int>mep;
    mep[1]=0;
    mep[n]=0;
    int i;
    for(i=1;i<=m;++i){
        mep[st[i]]=0;
        mep[dr[i]]=0;
        mep[loc[i]]=0;
    }
    int id=0;
    for(auto &[val,valnou] : mep)
        valnou=++id;
    n=mep[n];
    for(i=1;i<=m;++i){
        st[i]=mep[st[i]];
        dr[i]=mep[dr[i]];
        loc[i]=mep[loc[i]];
    }
}

void get_dp(){
    ans=INF;
    int i;
    for(i=1;i<=m;++i){
        auto [cpref,csuf]=aint.query(1,1,n,st[i],dr[i]);
        if(st[i]==1)
            cpref=0;
        if(dr[i]==n)
            csuf=0;
        cpref+=pret[i];
        csuf+=pret[i];
        minself(cpref,INF);
        minself(csuf,INF);
        minself(ans,cpref+csuf-pret[i]);
        node upd;
        upd.pref=cpref;
        upd.suf=csuf;
        aint.update(1,1,n,loc[i],upd);
    }
}

void write(){
    if(ans<INF)
        cout<<ans;
    else
        cout<<-1;
}

int main()
{
    read();
    normalize();
    get_dp();
    write();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...