Submission #289349

#TimeUsernameProblemLanguageResultExecution timeMemory
289349SaboonShortcut (IOI16_shortcut)C++17
31 / 100
2084 ms512 KiB
#include "shortcut.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e6 + 10; const ll inf = 1e18; ll dp[maxn], pd[maxn], ap[maxn], ad[maxn], optL[maxn], optR[maxn]; ll ans[maxn], opt[maxn], tmp[maxn]; vector<int> l, d; int c; ll get(int L, int R){ ll ret = max(ap[L],ad[R]); ll Cycle = c; for (int i = L; i < R; i++) Cycle += l[i]; for (int i = L; i <= R; i++) tmp[i] = d[i]; tmp[L] = dp[L], tmp[R] = pd[R]; for (int i = L; i <= R; i++){ ll now = 0; for (int j = i+1; j <= R; j++){ now += l[j-1]; ret = max(ret, min(now+tmp[i]+tmp[j],Cycle-now+tmp[i]+tmp[j])); } } return ret; } ll find_shortcut(int n, vector<int> l, vector<int> d, int c){ ::l = l, ::d = d, ::c = c; dp[0] = ap[0] = d[0]; for (int i = 1; i < n; i++){ ap[i] = max(ap[i-1], dp[i-1]+l[i-1]+d[i]); dp[i] = max(1LL*d[i], dp[i-1]+l[i-1]); } pd[n-1] = ad[n-1] = d[n-1]; for (int i = n-2; i >= 0; i--){ ad[i] = max(ad[i+1], pd[i+1]+l[i]+d[i]); pd[i] = max(1LL*d[i], pd[i+1]+l[i]); } ll answer = inf; for (int i = 0; i < n-1; i++){ opt[i] = -1, ans[i] = inf; for (int j = i+1; j < n; j++){ ll x = get(i,j); if (x < ans[i]) ans[i] = x, optL[i] = j; if (x == ans[i]) optR[i] = j; } answer = min(answer, ans[i]); for (int j = optL[i]; j <= optR[i]; j++) assert(get(i,j) == ans[i]); } return answer; }
#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...