Submission #134834

#TimeUsernameProblemLanguageResultExecution timeMemory
134834ckodserShortcut (IOI16_shortcut)C++14
38 / 100
229 ms8616 KiB
// ItnoE #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 505; int n, wlen, D[N]; ll L[N], LL[N], F1[N][N], F2[N][N]; ll suff[N], pref[N]; inline ll Dist(int i, int j) { return (abs(L[i] - L[j])); } ll GGG = -1; inline ll Solve(int a, int b) { /*ll tmpMx = 0; for (int i = 0; i < n; i ++) for (int j = i + 1; j < n; j ++) tmpMx = max(tmpMx, min({Dist(i, j), Dist(i, a) + Dist(b, j) + wlen, Dist(i, b) + Dist(a, j) + wlen}) + D[i] + D[j]);*/ if (L[b] - L[a] <= wlen) { if (GGG != -1) return (GGG); ll Mx = 0; for (int i = 0; i < n; i ++) for (int j = i + 1; j < n; j ++) Mx = max(Mx, L[j] - L[i] + D[i] + D[j]); GGG = Mx; return (Mx); } if (a > b) swap(a, b); ll Mx = max(pref[a], suff[b]); Mx = max(Mx, F2[a][0] + F1[b][n - 1] + wlen); { ll val = (L[a] + L[b] + wlen); int lb = upper_bound(LL + a, LL + b, val) - LL; if (lb > a) Mx = max(Mx, F2[a][0] + F1[a + 1][lb - 1] + L[a + 1] - L[a]); if (lb < b) Mx = max(Mx, F2[a][0] + F2[b - 1][lb] + wlen + L[b] - L[b - 1]); } { ll val = (L[a] + L[b] - wlen) >> 1; int lb = upper_bound(L + 1, L + n, val) - L; Mx = max(Mx, F1[b][n - 1] + F2[b - 1][lb] + L[b] - L[b - 1]); Mx = max(Mx, F1[b][n - 1] + F1[a][lb - 1] + wlen); } int r = a; for (int k = a; k < b; k ++) { while (r <= b && 2 * L[r] <= L[b] - L[a] + 2 * L[k] + wlen) r ++; if (k + 1 <= r - 1) Mx = max(Mx, D[k] + F1[k + 1][r - 1] + L[k + 1] - L[k]); if (r <= b) Mx = max(Mx, D[k] + L[k] - L[a] + wlen + F2[b][r]); } //assert(Mx <= tmpMx); return (Mx); } int64_t find_shortcut(int _n, vector < int > _L, vector < int > _D, int _c) { n = _n; wlen = _c; for (int i = 0; i < n - 1; i ++) L[i + 1] = L[i] + _L[i]; for (int i = 0; i < n; i ++) LL[i] = L[i] * 2LL; for (int i = 0; i < n; i ++) D[i] = _D[i]; memset(F1, -63, sizeof(F1)); memset(F2, -63, sizeof(F2)); for (int i = 0; i < n; i ++) { F1[i][i] = D[i]; for (int j = i + 1; j < n; j ++) F1[i][j] = max(F1[i][j - 1], D[j] + L[j] - L[i]); } for (int i = n - 1; i >= 0; i --) { F2[i][i] = D[i]; for (int j = i - 1; j >= 0; j --) F2[i][j] = max(F2[i][j + 1], D[j] + L[i] - L[j]); } pref[0] = D[0]; ll CMx = D[0]; for (int i = 1; i < n; i ++) { CMx += L[i] - L[i - 1]; pref[i] = max(pref[i - 1], CMx + D[i]); CMx = max(CMx, (ll)D[i]); } suff[n - 1] = D[n - 1]; CMx = D[n - 1]; for (int i = n - 2; i >= 0; i --) { CMx += L[i + 1] - L[i]; suff[i] = max(suff[i + 1], CMx + D[i]); CMx = max(CMx, (ll)D[i]); } ll Mn = Solve(0, 0); for (int i = 0; i < n; i ++) for (int j = i + 1; j < n; j ++) Mn = min(Mn, Solve(i, j)); return (Mn); } /*int main() { int nn = 5; int cc = 0; vector < int > LL = {20, 20, 40, 20}; vector < int > DD = {390, 5, 400, 400, 390}; ll Mn = find_shortcut(nn, LL, DD, cc); printf("%lld\n", Mn); }*/

Compilation message (stderr)

shortcut.cpp: In function 'int64_t find_shortcut(int, std::vector<int>, std::vector<int>, int)':
shortcut.cpp:50:39: warning: array subscript is below array bounds [-Warray-bounds]
   Mx = max(Mx, F1[b][n - 1] + F2[b - 1][lb] + L[b] - L[b - 1]);
                               ~~~~~~~~^
shortcut.cpp:50:61: warning: array subscript is below array bounds [-Warray-bounds]
   Mx = max(Mx, F1[b][n - 1] + F2[b - 1][lb] + L[b] - L[b - 1]);
                                                      ~~~~~~~^
#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...