Submission #1225095

#TimeUsernameProblemLanguageResultExecution timeMemory
1225095emptypringlescanSparklers (JOI17_sparklers)C++17
100 / 100
69 ms7672 KiB
#include <bits/stdc++.h> using namespace std; int32_t main(){ ios::sync_with_stdio(0); cin.tie(0); int n,k; long long t; cin >> n >> k >> t; long long arr[n]; for(int i=0; i<n; i++) cin >> arr[i]; k--; long long lo=0,hi=1e9+5,mid; while(lo<hi){ mid=(lo+hi)/2; vector<long long> lft,rgt; for(int i=0; i<k; i++) lft.push_back(2ll*(arr[i+1]-arr[i])); for(int i=n-1; i>k; i--) rgt.push_back(2ll*(arr[i]-arr[i-1])); vector<pair<long long,long long> > yr,yl; for(int i=0; i<(int)lft.size(); i++){ pair<long long,long long> x={lft[i]/2ll,max(lft[i]/2ll-t*mid,(long long)-1e10)}; while(x.second>0&&!yl.empty()&&yl.back().second<=0){ x.first=max(x.first,x.second+yl.back().first); x.second+=yl.back().second; yl.pop_back(); } yl.push_back(x); } for(int i=0; i<(int)rgt.size(); i++){ pair<long long,long long> x={rgt[i]/2ll,max(rgt[i]/2ll-t*mid,(long long)-1e10)}; while(x.second>0&&!yr.empty()&&yr.back().second<=0){ x.first=max(x.first,x.second+yr.back().first); x.second+=yr.back().second; yr.pop_back(); } yr.push_back(x); } long long buff=t*mid; bool can=true; while((!yl.empty()&&yl.back().second<=0)||(!yr.empty()&&yr.back().second<=0)){ if(!yl.empty()&&yl.back().second<=0&&buff>=yl.back().first){ buff-=yl.back().second; buff=min(buff,(long long)1e10); yl.pop_back(); } else if(!yr.empty()&&yr.back().second<=0&&buff>=yr.back().first){ buff-=yr.back().second; buff=min(buff,(long long)1e10); yr.pop_back(); } else{ can=false; break; } } for(int i=yl.size()-2; i>=0; i--){ yl[i].first+=yl[i+1].second; yl[i].second+=yl[i+1].second; } for(int i=yr.size()-2; i>=0; i--){ yr[i].first+=yr[i+1].second; yr[i].second+=yr[i+1].second; } int degl[n],degr[n],tol[n],tor[n]; memset(degl,0,sizeof(degl)); memset(degr,0,sizeof(degr)); for(int i=0; i<yl.size(); i++){ long long rm=buff-yl[i].first; if(rm<0) can=false; int loo=0,hii=yr.size()-1,midd; while(loo<hii){ midd=(loo+hii+1)/2; if(yr[midd].second>rm) loo=midd; else hii=midd-1; } if(yr.empty()||yr[loo].second<=rm) tol[i]=-1; else{ tol[i]=loo; degr[loo]++; } } for(int i=0; i<yr.size(); i++){ long long rm=buff-yr[i].first; if(rm<0) can=false; int loo=0,hii=yl.size()-1,midd; while(loo<hii){ midd=(loo+hii+1)/2; if(yl[midd].second>rm) loo=midd; else hii=midd-1; } if(yl.empty()||yl[loo].second<=rm) tor[i]=-1; else{ tor[i]=loo; degl[loo]++; } } while(!yl.empty()||!yr.empty()){ if(!yr.empty()&&degr[(int)yr.size()-1]==0){ int x=yr.size()-1; if(tor[x]!=-1) degl[tor[x]]--; yr.pop_back(); } else if(!yl.empty()&&degl[(int)yl.size()-1]==0){ int x=yl.size()-1; if(tol[x]!=-1) degr[tol[x]]--; yl.pop_back(); } else{ can=false; break; } } if(can) hi=mid; else lo=mid+1; } cout << (lo+1ll)/2ll; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...