제출 #71536

#제출 시각아이디문제언어결과실행 시간메모리
71536gnoorShortcut (IOI16_shortcut)C++17
0 / 100
2 ms432 KiB
#include "shortcut.h" #include <vector> #include <algorithm> using namespace std; struct ei { long long dis; pair<int,int> range; }; bool operator< (const ei &a, const ei &b) { return a.dis>b.dis; } pair<int,int> comb(const pair<int,int> &a, const pair<int,int> &b) { if (b.first>a.second) return {-1,-1}; return {max(a.first,b.first),min(a.second,b.second)}; } long long find_shortcut(int n, vector<int> l, vector<int> d, int c) { vector<long long> qs(n,0); for (int i=1;i<n;i++) { qs[i]=l[i]; qs[i]+=qs[i-1]; } vector<ei> tbl; tbl.reserve(n*(n-1)/2); long long ans=0; long long mx=0; for (int i=0;i<n;i++) { for (int j=i+1;j<n;j++) { tbl.push_back(ei{qs[j]-qs[i]+d[j]+d[i],{i,j}}); mx=max(mx,qs[j]-qs[i]+d[j]+d[i]); } } ans=mx; sort(tbl.begin(),tbl.end()); pair<int,int> cur={0,n-1}; long long curans; long long red; for (int i=0;i<(int)tbl.size();i++) { cur=comb(cur,tbl[i].range); if (cur.first==-1) break; red=qs[cur.second]-qs[cur.first]-c; if (red<=0) break; if (i==(int)tbl.size()-1||tbl[i+1].dis!=tbl[i].dis) { curans=mx-red; if (i!=(int)tbl.size()-1) { curans=max(curans,tbl[i+1].dis); } ans=min(ans,curans); } } return 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...