Submission #53772

#TimeUsernameProblemLanguageResultExecution timeMemory
53772aomeShortcut (IOI16_shortcut)C++17
0 / 100
2 ms616 KiB
#include "shortcut.h" #include <bits/stdc++.h> using namespace std; const int N = 505; const long long INF = 1e18; int n, c, a[N]; long long f1[N][N]; long long f2[N][N]; long long f3[N][N]; long long res; long long dis[N]; void solve(int l, int r) { long long maxDis = 0; // two points outside [l, r] for (int i = r + 1; i < n; ++i) { if (l - 1 >= 0) { maxDis = max(maxDis, dis[i] + a[i] + f2[0][l - 1]); } if (r + 1 <= i - 1) { maxDis = max(maxDis, dis[i] + a[i] + f2[r + 1][i - 1]); } } for (int i = 1; i < l; ++i) { maxDis = max(maxDis, dis[i] + a[i] + f2[0][i - 1]); } // one point inside [l, r] and one point outside [l, r] for (int i = l; i <= r; ++i) { // from i to one point inside [0, l - 1] if (l - 1 >= 0) { maxDis = max(maxDis, min(dis[i], dis[r] - dis[i] + c + dis[l]) + a[i] + f2[0][l - 1]); } // from i to to one point inside [r + 1, n - 1] if (r + 1 < n) { maxDis = max(maxDis, f3[r + 1][n - 1] + a[i] + min(-dis[i], dis[i] - dis[l] + c - dis[r])); } } // // two points inside [l, r] int ptr = l; for (int i = l; i <= r; ++i) { while (ptr < i && (dis[r] - dis[l]) - (dis[i] - dis[ptr]) + c < dis[i] - dis[ptr]) ptr++; if (ptr != l) maxDis = max(maxDis, a[i] + (dis[r] - dis[l]) - (dis[i] + f1[l][ptr - 1]) + c); maxDis = max(maxDis, a[i] + dis[i] + f2[ptr][i]); } res = min(res, maxDis); } long long find_shortcut(int _n, vector<int> l, vector<int> d, int _c) { n = _n, c = _c; for (int i = 0; i < n; ++i) a[i] = d[i]; for (int i = 1; i < n; ++i) dis[i] = dis[i - 1] + l[i - 1]; for (int i = 0; i < n; ++i) { f1[i][i] = -dis[i] - a[i]; f2[i][i] = -dis[i] + a[i]; f3[i][i] = dis[i] + a[i]; for (int j = i + 1; j < n; ++j) { f1[i][j] = max(f1[i][j - 1], -dis[j] - a[j]); f2[i][j] = max(f2[i][j - 1], -dis[j] + a[j]); f3[i][j] = max(f3[i][j - 1], dis[j] + a[j]); } } res = INF; for (int i = 0; i < n; ++i) { for (int j = 0; j < i; ++j) { solve(j, i); } } 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...