Submission #501910

#TimeUsernameProblemLanguageResultExecution timeMemory
501910RGBBPinball (JOI14_pinball)C++14
100 / 100
533 ms61832 KiB
#include <iostream> #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_pbds; typedef long long ll; const int MAXN=1e5; int n,t,s,inp[MAXN][4]; ll ldp[MAXN],rdp[MAXN],mdp[MAXN],lseg[1<<20],rseg[1<<20],mseg[1<<20]; set<int>sorted; gp_hash_table<int,int>cmp; ll bestLeft(int a,int b,int c,int be,int en){ if(a>en||b<be)return LLONG_MAX; if(a>=be&&b<=en)return lseg[c]; return min(bestLeft(a,(a+b)/2,2*c+1,be,en),bestLeft((a+b)/2+1,b,2*c+2,be,en)); } ll bestRight(int a,int b,int c,int be,int en){ if(a>en||b<be)return LLONG_MAX; if(a>=be&&b<=en)return rseg[c]; return min(bestRight(a,(a+b)/2,2*c+1,be,en),bestRight((a+b)/2+1,b,2*c+2,be,en)); } ll bestMid(int a,int b,int c,int be,int en){ if(a>en||b<be)return LLONG_MAX; if(a>=be&&b<=en)return mseg[c]; return min(bestMid(a,(a+b)/2,2*c+1,be,en),bestMid((a+b)/2+1,b,2*c+2,be,en)); } void leftInsert(int a,int b,int c,int p,ll v){ if(a>p||b<p)return; if(a==b){ lseg[c]=min(lseg[c],v); return; } leftInsert(a,(a+b)/2,2*c+1,p,v); leftInsert((a+b)/2+1,b,2*c+2,p,v); lseg[c]=min(lseg[2*c+1],lseg[2*c+2]); } void rightInsert(int a,int b,int c,int p,ll v){ if(a>p||b<p)return; if(a==b){ rseg[c]=min(rseg[c],v); return; } rightInsert(a,(a+b)/2,2*c+1,p,v); rightInsert((a+b)/2+1,b,2*c+2,p,v); rseg[c]=min(rseg[2*c+1],rseg[2*c+2]); } void midInsert(int a,int b,int c,int p,ll v){ if(a>p||b<p)return; if(a==b){ mseg[c]=min(mseg[c],v); return; } midInsert(a,(a+b)/2,2*c+1,p,v); midInsert((a+b)/2+1,b,2*c+2,p,v); mseg[c]=min(mseg[2*c+1],mseg[2*c+2]); } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin>>n>>t; for(int i=0;i<n;i++){ cin>>inp[i][0]>>inp[i][1]>>inp[i][2]>>inp[i][3]; sorted.insert(inp[i][0]); sorted.insert(inp[i][1]); sorted.insert(inp[i][2]); } s=0; for(auto&i:sorted)cmp[i]=s++; for(int i=0;i<(1<<20);i++){ lseg[i]=LLONG_MAX; rseg[i]=LLONG_MAX; mseg[i]=LLONG_MAX; } for(int i=0;i<n;i++){ ll l=bestLeft(0,s-1,0,cmp[inp[i][0]],cmp[inp[i][1]]); ll r=bestRight(0,s-1,0,cmp[inp[i][0]],cmp[inp[i][1]]); ll m=bestMid(0,s-1,0,cmp[inp[i][0]],cmp[inp[i][1]]); if(inp[i][0]==1)l=0; if(inp[i][1]==t)r=0; ldp[i]=(l!=LLONG_MAX?l+inp[i][3]:LLONG_MAX); rdp[i]=(r!=LLONG_MAX?r+inp[i][3]:LLONG_MAX); mdp[i]=(m!=LLONG_MAX?m+inp[i][3]:LLONG_MAX); if(l!=LLONG_MAX&&r!=LLONG_MAX)mdp[i]=min(mdp[i],l+r+inp[i][3]); leftInsert(0,s-1,0,cmp[inp[i][2]],ldp[i]); rightInsert(0,s-1,0,cmp[inp[i][2]],rdp[i]); midInsert(0,s-1,0,cmp[inp[i][2]],mdp[i]); } ll outp=LLONG_MAX; for(int i=0;i<n;i++)outp=min(outp,mdp[i]); cout<<(outp!=LLONG_MAX?outp:-1)<<"\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...