Submission #289430

#TimeUsernameProblemLanguageResultExecution timeMemory
289430SaboonShortcut (IOI16_shortcut)C++17
0 / 100
1 ms384 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]; ll ans[maxn], opt[maxn], tmp[maxn], far[maxn]; vector<int> l, d; vector<ll> pos; int c, n; void init(){ pos.push_back(0); for (int i = 0; i < n-1; i++) pos.push_back(pos.back()+l[i]); } ll getDis(int a, int b, int L, int R){ ll Cycle = pos[R]-pos[L]+c; if (b < a) swap(a,b); ll ret = min(pos[b]-pos[a], Cycle-pos[b]+pos[a])+tmp[a]+tmp[b]; return ret; } 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]; opt[L] = -1, far[L] = 0; for (int j = L+1; j <= R; j++){ ll x = getDis(L, j, L, R); if (far[L] < x) far[L] = x, opt[L] = j; } for (int i = L+1; i <= R; i++){ opt[i] = opt[i-1], far[i] = getDis(i, opt[i], L, R); while (true){ int q = opt[i]+1; if (q == R+1) q = L; ll x = getDis(i, q, L, R); if (q != i and x >= far[i]) far[i] = x, opt[i] = q; else break; } } for (int i = L; i <= R; i++) ret = max(ret, far[i]); return ret; } ll find_shortcut(int n, vector<int> l, vector<int> d, int c){ ::n = n, ::l = l, ::d = d, ::c = c; init(); 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; i++){ ans[i] = inf; for (int j = i+1; j < n; j++){ ans[i] = min(ans[i], get(i,j)); } answer = min(answer, 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...