Submission #558803

#TimeUsernameProblemLanguageResultExecution timeMemory
558803elazarkorenShortcut (IOI16_shortcut)C++17
38 / 100
2072 ms572 KiB
#include "shortcut.h" #include <bits/stdc++.h> #define x first #define y second #define all(v) v.begin(), v.end() #define chkmin(a, b) a = min(a, b) #define chkmax(a, b) a = max(a, b) #define int ll using namespace std; typedef long long ll; typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int, int> pii; typedef vector<pii> vii; const int MAX_N = 1e6 + 5; const ll infinity = 1e18; ll prefix[MAX_N]; inline ll Dist(int l, int r) { if (l > r) swap(l, r); return prefix[r] - prefix[l]; } ll farl[MAX_N], farr[MAX_N]; ll dpl[MAX_N], dpr[MAX_N]; ll find_shortcut(int32_t n, vector<int32_t> l, vector<int32_t> d, int32_t c2) { for (int i = 1; i < n; i++) prefix[i] = prefix[i - 1] + l[i - 1]; farl[0] = dpl[0] = d[0]; for (int i = 1; i < n; i++) { farl[i] = max<ll>(farl[i - 1] + l[i - 1], d[i]); dpl[i] = max<ll>(dpl[i - 1], farl[i - 1] + l[i - 1] + d[i]); } dpr[n - 1] = farr[n - 1] = d[n - 1]; for (int i = n - 2; i >= 0; i--) { farr[i] = max<ll>(farr[i + 1] + l[i], d[i]); dpr[i] = max<ll>(dpr[i + 1], farr[i + 1] + l[i] + d[i]); } ll ans = 0; for (int a = 0; a < n; a++) { for (int b = a + 1; b < n; b++) { chkmax(ans, Dist(a, b) + d[a] + d[b]); } } for (int i = 0; i < n; i++) { ll circle = c2; for (int j = i + 1; j < n; j++) { ll c = min<ll>(c2, Dist(i, j)); ll curr = max({(i ? dpl[i - 1] : 0), dpr[j + 1], (i && j + 1 < n ? farl[i - 1] + l[i - 1] + farr[j + 1] + l[j] + c : 0)}); for (int k = i; k <= j; k++) { if (i) { ll x = min(Dist(i, k), Dist(k, j) + c) + d[k]; chkmax(curr, x + farl[i - 1] + l[i - 1]); } if (j + 1 < n) { ll x = min(Dist(k, j), Dist(i, k) + c) + d[k]; chkmax(curr, x + farr[j + 1] + l[j]); } } circle += l[j - 1]; ll v1 = -infinity; priority_queue<pii> pq; pq.push({-prefix[i] + d[i], i}); for (int k = i + 1, h = i; k <= j; k++) { while (h < k && Dist(h, k) > Dist(k, j) + c + Dist(i, h)) { chkmax(v1, prefix[h] - prefix[i] + d[h]); h++; } while (!pq.empty() && pq.top().y < h) pq.pop(); chkmax(curr, circle - (prefix[k] - prefix[i]) + v1 + d[k]); if (!pq.empty()) { chkmax(curr, prefix[k] + pq.top().x + d[k]); } pq.push({-prefix[k] + d[k], k}); } // ll curr2 = 0; // for (int a = 0; a < n; a++) { // for (int b = a + 1; b < n; b++) { // ll x = min({Dist(a, b), min(Dist(a, i), Dist(a, j)) + min(Dist(b, i), Dist(b, j)) + c}); // chkmax(curr2, x + d[a] + d[b]); // } // } chkmin(ans, curr); } } return ans; } ll find_shortcut2(int n, vi l, vi d, int c) { for (int i = 1; i < n; i++) prefix[i] = prefix[i - 1] + l[i - 1]; ll ans = infinity; for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { ll curr = 0; for (int a = 0; a < n; a++) { for (int b = a + 1; b < n; b++) { ll x = min({Dist(a, b), min(Dist(a, i), Dist(a, j)) + min(Dist(b, i), Dist(b, j)) + c}); chkmax(curr, x + d[a] + d[b]); } } chkmin(ans, curr); } } return ans; } //3 10 //41 17 //34 0 19 //4 10 //4 2 13 //12 2 1 16
#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...