제출 #1319506

#제출 시각아이디문제언어결과실행 시간메모리
1319506wangzhiyi33Pinball (JOI14_pinball)C++20
100 / 100
264 ms24692 KiB
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3,unroll-loops")
#define int long long
#define ii pair<int,int>
#define fir first
#define sec second
#define pb push_back
const int maxn=5e5;

struct seg{
    int l,r,val;
    seg *lf,*rg;
 
    void build(int x,int y){
        l=x,r=y;
        if(l==r){
            val=1e18;
            return;
        }
        int mid=(l+r)/2;
        lf=new seg();
        rg=new seg();
        lf->build(l,mid); rg->build(mid+1,r);
        val=min(lf->val,rg->val);
    }
 
    void update(int idx,int v){
        if(l==r){
            val=min(val,v);
            return;
        }
        int mid=(l+r)/2;
        if(idx<=lf->r)lf->update(idx,v);
        else rg->update(idx,v);
        val=min(lf->val,rg->val);
    }
 
    int query(int posl,int posr){
        if(l>posr || r<posl)return 1e18;
        if(l>=posl && r<=posr)return val;
        //int mid=(l+r)/2;
        int satu=lf->query(posl,posr);
        int dua=rg->query(posl,posr);
        return min(satu,dua);
    }
};

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);

    int n,m;
    cin>>n>>m;
    int a[n+1],b[n+1],c[n+1],d[n+1];
    for(int q=1;q<=n;q++){
        cin>>a[q]>>b[q]>>c[q]>>d[q];
    }

    vector<int>comp;
    for(int q=1;q<=n;q++){
        comp.pb(c[q]);
    }
    comp.push_back(1),comp.push_back(m);
    sort(comp.begin(),comp.end());
    comp.erase(unique(comp.begin(),comp.end()),comp.end());

    seg isi;
    isi.build(1,comp.size());
    isi.update(1,0);
    int lf[n+1],rg[n+1];
    
    int ans=1e18;
    for(int q=1;q<=n;q++){
        lf[q]=1e18;
        int idr=upper_bound(comp.begin(),comp.end(),b[q])-comp.begin()-1;
        int idl=lower_bound(comp.begin(),comp.end(),a[q])-comp.begin();
        idr++,idl++;
        int brp=isi.query(idl,idr);
        lf[q]=brp+d[q];

        int id=lower_bound(comp.begin(),comp.end(),c[q])-comp.begin();
        id++;
        isi.update(id,lf[q]);
    }

    isi.build(1,comp.size());
    isi.update(comp.size(),0);
    for(int q=1;q<=n;q++){
        rg[q]=1e18;
        int idr=upper_bound(comp.begin(),comp.end(),b[q])-comp.begin()-1;
        int idl=lower_bound(comp.begin(),comp.end(),a[q])-comp.begin();
        idr++,idl++;
        int brp=isi.query(idl,idr);
        rg[q]=brp+d[q];

        int id=lower_bound(comp.begin(),comp.end(),c[q])-comp.begin();
        id++;
        isi.update(id,rg[q]);
       // cout<<rg[q]<<"K"<<q<<endl;
        ans=min(ans,lf[q]+rg[q]-d[q]);
    }
    if(ans==1e18)ans=-1;
    cout<<ans<<endl;
    
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...