Submission #1354449

#TimeUsernameProblemLanguageResultExecution timeMemory
1354449kokokaiTreatment Project (JOI20_treatment)C++20
4 / 100
74 ms15520 KiB
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define fi first
#define se second
#define task "text"
#define int long long
const int N = 1e5+5;
int n,m;
struct que{
    int t,l,r,c;
}query[N];
struct segtree{
    //stmax
    pair<int,int> st[4*N];
    void build(int id,int l,int r){
        st[id]={-9e17,0};
        if(l==r) return;
        int mid=(l+r)>>1;
        build(id<<1,l,mid);
        build(id<<1|1,mid+1,r);
    }
    void update(int id,int l,int r,int p,pair<int,int> val){
        if(l==r){
            st[id]=val;
            return;
        }
        int mid=(l+r)>>1;
        if(mid<p) update(id<<1|1,mid+1,r,p,val);
        else update(id<<1,l,mid,p,val);
        st[id]=max(st[id<<1],st[id<<1|1]);
    }
    pair<int,int> get(int id,int l,int r,int u,int v){
        if(r<u || v<l) return make_pair(-9e17,0);
        if(u<=l && r<=v) return st[id];
        int mid=(l+r)>>1;
        return max(get(id<<1,l,mid,u,v),get(id<<1|1,mid+1,r,u,v));
    }
}stl,str;
int dist[N];
int arr[N];
signed main(){
    ios::sync_with_stdio(false);cin.tie(nullptr);
    if(fopen(task".inp","r")){
        freopen(task".inp","r",stdin);
    }
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>query[i].t>>query[i].l>>query[i].r>>query[i].c;
        arr[i]=query[i].t;
    }
    sort(query+1,query+1+m,[&](que a,que b){
        return a.t < b.t;
    });
    sort(arr+1,arr+1+m);
    for(int i=1;i<=m;i++) dist[i]=9e17;
    stl.build(1,1,m);
    str.build(1,1,m);
    for(int i=1;i<=m;i++){
        str.update(1,1,m,i,make_pair(-(query[i].l+query[i].t),i));
        stl.update(1,1,m,i,make_pair(-(query[i].l-query[i].t),i));
    }
    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
    for(int i=1;i<=m;i++){
        if(query[i].l == 1){
            dist[i]=query[i].c;
            pq.push({dist[i],i});
            //cerr<<i<<' '<<dist[i]<<'\n';
            stl.update(1,1,m,i,make_pair(-9e17,0));
            str.update(1,1,m,i,make_pair(-9e17,0));
        }
    }
    //cerr<<query[1].t<<'\n';
    while(!pq.empty()){
        int i=pq.top().se;
        int dis=pq.top().fi;
        pq.pop();
        if(dist[i] != dis) continue;
        int l=lower_bound(arr+1,arr+1+m,query[i].t)-arr;
        while(1){
            pair<int,int> x=stl.get(1,1,m,l,m);
            if(x.se == 0) break;
            int j=x.se;
            if(query[i].r+query[i].t+1 >= query[j].l+query[j].t){
                //cerr<<i<<' '<<j<<'\n';
                stl.update(1,1,m,j,make_pair(-9e17,0));
                str.update(1,1,m,j,make_pair(-9e17,0));
                dist[j]=dist[i]+query[j].c;
                pq.push({dist[j],j});
            }else break;
        }
        while(l-1>=1){
            pair<int,int> x=str.get(1,1,m,1,l-1);
            if(x.se == 0) break;
            int j=x.se;
            if(query[i].r-query[i].t+1 >= query[j].l-query[j].t){
                //cerr<<i<<' '<<j<<'\n';
                stl.update(1,1,m,j,make_pair(-9e17,0));
                str.update(1,1,m,j,make_pair(-9e17,0));
                dist[j]=dist[i]+query[j].c;
                pq.push({dist[j],j});
            }else break;
        }
    }
    int ans=9e17;
    for(int i=1;i<=m;i++){
        if(query[i].r == n){
            ans=min(ans,dist[i]);
        }
    }
    if(ans == 9e17) cout<<-1<<'\n';
    else cout<<ans<<'\n';
}


Compilation message (stderr)

treatment.cpp: In function 'int main()':
treatment.cpp:45:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   45 |         freopen(task".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...