Submission #1206855

#TimeUsernameProblemLanguageResultExecution timeMemory
1206855NewtonabcPinball (JOI14_pinball)C++20
100 / 100
184 ms20412 KiB
#include<bits/stdc++.h>
#define pii pair<int,int>
#define pil pair<int,long long>
using namespace std;
const int N=1<<20;
const int M=1e5+10;
vector<int> con;
int fd(int x){
    int ind=lower_bound(con.begin(),con.end(),x)-con.begin()+1;
    return ind;
}
struct stree{
    vector<long long> s;
    void init(){
        s.resize(N+10,LLONG_MAX);
    }
    void update(int l,int r,int idx,int a,long long b){
        if(a<l || a>r) return;
        if(l==r){
            s[idx]=min(s[idx],b);
            return;
        }
        int m=(l+r)/2;
        update(l,m,idx*2,a,b);
        update(m+1,r,idx*2+1,a,b);
        s[idx]=min(s[idx*2],s[idx*2+1]);
    }
    long long query(int l,int r,int idx,int a,int b){
        if(b<l || a>r) return LLONG_MAX;
        if(a<=l && b>=r) return s[idx];
        int m=(l+r)/2;
        return min(query(l,m,idx*2,a,b),query(m+1,r,idx*2+1,a,b));
    }
};
pair<pii,pil> arr[M];
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n,m;
    cin>>n >>m;
    for(int i=1;i<=n;i++){
        int a,b,c;
        long long d;
        cin>>a >>b >>c >>d;
        arr[i]={{a,b},{c,d}};
        con.push_back(a),con.push_back(b),con.push_back(c);
    }
    con.push_back(1),con.push_back(m);
    sort(con.begin(),con.end());
    con.erase(unique(con.begin(),con.end()),con.end());
    //convert to 1 to con.size()
    m=con.size();
    for(int i=1;i<=n;i++){
        auto [pa,pb]=arr[i];
        auto [a,b]=pa;
        auto [c,d]=pb;
        arr[i]={{fd(a),fd(b)},{fd(c),d}};
    }
    stree sl,sr;
    sl.init(),sr.init();
    sl.update(1,m,1,1,0),sr.update(1,m,1,m,0);
    long long ans=LLONG_MAX;
    for(int i=1;i<=n;i++){
        auto [pa,pb]=arr[i];
        auto [a,b]=pa;
        auto [c,d]=pb;
        long long cl=sl.query(1,m,1,a,b),cr=sr.query(1,m,1,a,b);
        if(cl!=LLONG_MAX && cr!=LLONG_MAX){
            ans=min(ans,cl+cr+d);
        }
        if(cl!=LLONG_MAX) sl.update(1,m,1,c,cl+d);
        if(cr!=LLONG_MAX) sr.update(1,m,1,c,cr+d);
    }
    if(ans==LLONG_MAX) cout<<-1;
    else cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...