# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1253480 | antonn | Shortcut (IOI16_shortcut) | C++20 | 0 ms | 0 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
*/
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) {
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> cycle2 = cycle;
vector<ll> cost2 = cost;
for (auto x : cycle) {
cycle2.push_back(x);
}
for (auto x : cost) {
cost2.push_back(x);
}
vector<ll> pref(cycle2.size());
pref[0] = cycle2[0];
for (int i = 1; i < cycle2.size(); i++) {
pref[i] = pref[i - 1] + cycle2[i];
}
ll sum = 0;
for (auto x : cycle) {
sum += x;
}
int j = 0;
for (int i = 0; i < cycle.size(); i++) {
while (j < cycle.size() && sum - ) {
;
}
}*/
}
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 == 2 && j == 5) {
cout << "AICI\n";
for (auto x : cycle) {
cout << x << " ";
}
cout << "\n";
for (auto x : cost) {
cout << x << " ";
}
cout << "\n";
cout << " => " << solve(cycle, cost) << "\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;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, c;
cin >> n >> c;
vector<int> l(n - 1);
vector<int> d(n);
for (int i = 0; i < n - 1; i++) {
cin >> l[i];
}
for (int i = 0; i < n; i++) {
cin >> d[i];
}
ll t = find_shortcut(n, l, d, c);
cout << t << "\n";
}