Submission #1253497

#TimeUsernameProblemLanguageResultExecution timeMemory
1253497antonnShortcut (IOI16_shortcut)C++20
38 / 100
2072 ms1100 KiB
#include "shortcut.h" #include<bits/stdc++.h> using namespace std; typedef long long ll; template<typename T> bool assign_min(T& a, T b) { if (a > b) { a = b; return true; } return false; } template<typename T> bool assign_max(T& a, T b) { if (a < b) { a = b; return true; } return false; } /* 6 4 18 1 19 8 12 3 3 17 13 9 7 3 4 7 1 5 14 3 */ vector<ll> sum; ll get_sum(int l, int r) { return sum[r] - (l == 0 ? 0 : sum[l - 1]); } ll solve(vector<ll> cycle, vector<ll> cost, bool print = 0) { ll sum = 0; for (auto x : cycle) { sum += x; } /* ll ans = 0; for (int i = 0; i < cost.size(); i++) { ll c = 0; for (int j = i + 1; j < cost.size(); j++) { c += cycle[j - 1]; ans = max(ans, cost[i] + cost[j] + min(c, sum - c)); } } return ans; */ vector<ll> pref(cycle.size()); pref[0] = cycle[0]; for (int i = 1; i < cycle.size(); i++) { pref[i] = pref[i - 1] + cycle[i]; } vector<ll> suff(cycle.size() + 1, -1e18); for (int i = cycle.size() - 1; i >= 1; i--) { suff[i] = max(suff[i + 1], cost[i] - pref[i - 1]); } int j = 1; deque<pair<int, ll>> dq; ll ans = 0; /* if (print) { cout << sum << " VS " << pref[0] << "\n"; } */ for (int i = 0; i < cost.size(); i++) { while (!dq.empty() && dq.front().first <= i) { dq.pop_front(); } j = max(j, i + 1); while (j < cost.size() && (pref[j - 1] - (i == 0 ? 0 : pref[i - 1])) * 2 <= sum) { ll val = pref[j - 1] + cost[j]; /* if (print) { cout << "BAG IN DEQUE " << j << ": " << val << "\n"; } */ while (!dq.empty() && val >= dq.back().second) { dq.pop_back(); } dq.push_back({j, val}); j++; } if (!dq.empty()) { /* if (print) { cout << i << ": " << j << "\n"; cout << i << ": " << dq.front().second + cost[i] - (i == 0 ? 0 : pref[i - 1]) << "\n"; } */ ans = max(ans, dq.front().second + cost[i] - (i == 0 ? 0 : pref[i - 1])); } if (j < cost.size()) { ans = max(ans, sum + suff[j] + (i == 0 ? 0 : pref[i - 1]) + cost[i]); } } return ans; } ll find_shortcut(int n, vector<int> l, vector<int> d, int c) { sum.resize(n + 1); for (int i = 0; i < n - 1; i++) { sum[i] = (i == 0 ? 0 : sum[i - 1]) + l[i]; } vector<ll> far_left(n + 2); vector<ll> far_right(n + 2); far_left[1] = d[0]; for (int i = 2; i <= n; i++) { far_left[i] = max(far_left[i - 1] + l[i - 2], (ll) d[i - 1]); } far_right[n] = d[n - 1]; for (int i = n - 1; i >= 1; i--) { far_right[i] = max(far_right[i + 1] + l[i - 1], (ll) d[i - 1]); } vector<ll> pref(n + 2), suff(n + 2); pref[1] = d[0]; ll far = d[0]; for (int i = 2; i <= n; i++) { pref[i] = max(pref[i - 1], l[i - 2] + far + d[i - 1]); far = max(far, far + l[i - 2]); far = max(far, (ll) d[i - 1]); } suff[n] = d[n - 1]; far = d[n - 1]; for (int i = n - 1; i >= 1; i--) { suff[i] = max(suff[i + 1], l[i - 1] + far + d[i - 1]); far = max(far, far + l[i - 1]); far = max(far, (ll) d[i - 1]); } ll ans = pref[n]; for (int i = 1; i <= n; i++) { ll sum = 0; for (int j = i + 1; j <= n; j++) { vector<ll> cycle, cost; for (int k = i + 1; k <= j; k++) { cycle.push_back(l[k - 2]); } for (int k = i; k <= j; k++) { cost.push_back(d[k - 1]); } cycle.push_back(c); /* if (i == 1 && j == 2) { cout << "AICI\n"; for (auto x : cycle) { cout << x << " "; } cout << "\n"; for (auto x : cost) { cout << x << " "; } cout << "\n"; cout << " => " << solve(cycle, cost, 1) << "\n"; } */ ll inside = solve(cycle, cost); ll diam = 0; diam = max(pref[i], suff[j]); diam = max(diam, inside); diam = max(diam, far_left[i] + c + far_right[j]); for (int k = i + 1; k <= j - 1; k++) { diam = max(diam, far_right[j] + d[k - 1] + min(get_sum(k - 1, j - 2), get_sum(i - 1, k - 2) + c)); diam = max(diam, far_left[i] + d[k - 1] + min(get_sum(k - 1, j - 2) + c, get_sum(i - 1, k - 2))); } ans = min(ans, diam); } } return ans; }

Compilation message (stderr)

shortcut.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
shortcut_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#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...