Submission #765820

#TimeUsernameProblemLanguageResultExecution timeMemory
765820SanguineChameleonShortcut (IOI16_shortcut)C++17
38 / 100
2092 ms245564 KiB
#pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #include "shortcut.h" #include <bits/stdc++.h> using namespace std; const int maxn = 3e3 + 20; const long long inf = 1e18L; long long len[maxn]; bool bad1[maxn]; bool bad2[maxn]; long long max3[maxn][maxn]; long long max4[maxn][maxn]; long long max5[maxn][maxn]; long long max6[maxn][maxn]; int depth[maxn]; int n, c; long long calc(long long lim) { for (int j = 1; j <= n; j++) { bad1[j] = (j > 1 ? bad1[j - 1] : false); for (int i = 1; i < j; i++) { if (len[j] - len[i] + depth[i] + depth[j] > lim) { bad1[j] = true; break; } } } for (int i = n; i >= 1; i--) { bad2[i] = (i < n ? bad2[i + 1] : false); for (int j = i + 1; j <= n; j++) { if (len[j] - len[i] + depth[i] + depth[j] > lim) { bad2[i] = true; break; } } } for (int j = 1; j <= n; j++) { for (int i = 1; i < j; i++) { max3[i][j] = (i > 1 ? max3[i - 1][j] : -inf); long long d1 = - len[i] - len[j] + c + depth[i] + depth[j]; long long d2 = len[j] - len[i] + depth[i] + depth[j]; if (d2 > lim) { max3[i][j] = max(max3[i][j], d1); } } } for (int i = 1; i <= n; i++) { for (int j = i + 2; j <= n; j++) { max3[i][j] = max(max3[i][j], max3[i][j - 1]); } } for (int i = 1; i <= n; i++) { for (int j = n; j > i; j--) { max4[i][j] = (j < n ? max4[i][j + 1] : -inf); long long d1 = len[i] + len[j] + c + depth[i] + depth[j]; long long d2 = len[j] - len[i] + depth[i] + depth[j]; if (d2 > lim) { max4[i][j] = max(max4[i][j], d1); } } } for (int j = 1; j <= n; j++) { for (int i = j - 2; i >= 1; i--) { max4[i][j] = max(max4[i][j], max4[i + 1][j]); } } for (int j = 1; j <= n; j++) { for (int i = j - 1; i >= 1; i--) { max5[i][j] = (i + 1 < j ? max(max5[i + 1][j], max5[i][j - 1]) : -inf); long long d1 = len[i] - len[j] + c + depth[i] + depth[j]; long long d2 = len[j] - len[i] + depth[i] + depth[j]; if (d2 > lim) { max5[i][j] = max(max5[i][j], d1); } } } for (int j = n; j >= 1; j--) { for (int i = 1; i <= n; i++) { max6[i][j] = max((i > 1 ? max6[i - 1][j] : -inf), (j < n ? max6[i][j + 1] : -inf)); long long d1 = len[j] - len[i] + c + depth[i] + depth[j]; long long d2 = len[j] - len[i] + depth[i] + depth[j]; if (d2 > lim) { max6[i][j] = max(max6[i][j], d1); } } } long long res = inf; for (int x = 1; x <= n; x++) { if (bad1[x]) { continue; } for (int y = x + 1; y <= n; y++) { if (bad2[y]) { continue; } long long mx = 0; mx = max(mx, max3[x][y] + (len[x] + len[y])); mx = max(mx, max4[x][y] - (len[x] + len[y])); mx = max(mx, max5[x][y] + (len[y] - len[x])); mx = max(mx, max6[x][y] - (len[y] - len[x])); res = min(res, mx); } } return res; } long long dist[maxn * maxn]; long long find_shortcut(int _n, vector<int> _len, vector<int> _depth, int _c) { n = _n; c = _c; len[1] = 0; for (int i = 2; i <= n; i++) { len[i] = len[i - 1] + _len[i - 2]; } for (int i = 1; i <= n; i++) { depth[i] = _depth[i - 1]; } int mx1 = 0; int mx2 = 0; for (int i = 1; i <= n; i++) { if (depth[i] > depth[mx1]) { mx2 = mx1; mx1 = i; } else if (depth[i] > depth[mx2]) { mx2 = i; } } int cnt = 0; for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { dist[cnt++] = len[j] - len[i] + depth[i] + depth[j]; } } sort(dist, dist + cnt, greater<>()); while (dist[cnt - 1] <= depth[mx1] + depth[mx2]) { cnt--; } long long res = dist[0]; int lt = 0; int rt = cnt - 1; while (lt <= rt) { int mt = (lt + rt) / 2; long long mx = calc(dist[mt] - 1); if (mx < dist[mt]) { res = max(mx, dist[mt + 1]); lt = mt + 1; } else { rt = mt - 1; } } return res; }
#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...