#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)
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(int n, vi l, vi d, int 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 = infinity;
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({dpl[i], dpr[j], farl[i] + farr[j] + c});
for (int k = i; k <= j; k++) {
ll x = min(Dist(i, k), Dist(k, j) + c) + d[k];
chkmax(curr, x + farl[i]);
x = min(Dist(k, j), Dist(i, k) + c) + d[k];
chkmax(curr, x + farr[j]);
}
circle += l[j - 1];
priority_queue<pii> p1, p2;
p2.push({-prefix[i] + d[i], i});
for (int k = i + 1, h = i; k <= j; k++) {
while (h < k && prefix[k] - prefix[h] > circle / 2) {
p1.push({prefix[h] + d[h], h});
h++;
}
while (!p2.empty() && p2.top().y < h) p2.pop();
p2.push({-prefix[k] + d[k], k});
if (!p1.empty()) {
chkmax(curr, circle - prefix[k] + p1.top().x + d[k]);
}
if (!p2.empty()) {
chkmax(curr, prefix[k] + p2.top().x + d[k]);
}
}
while (!p1.empty()) p1.pop();
while (!p2.empty()) p2.pop();
p2.push({prefix[j] + d[j], j});
for (int k = j - 1, h = j; k >= i; k--) {
while (h > k && prefix[h] - prefix[k] > circle / 2) {
p1.push({circle - prefix[h] + d[h], h});
h--;
}
while (!p2.empty() && p2.top().y > h) p2.pop();
p2.push({prefix[k] + d[k], k});
if (!p1.empty()) {
chkmax(curr, prefix[k] + p1.top().x + d[k]);
}
if (!p2.empty()) {
chkmax(curr, -prefix[k] + p2.top().x + d[k]);
}
}
// 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;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
340 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
340 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
340 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
340 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
212 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
340 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
340 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
340 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
340 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
212 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
340 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
340 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
340 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
340 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
212 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
340 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
340 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
340 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
340 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
212 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
340 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
340 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
340 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
340 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
212 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
340 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
340 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
340 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
340 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
212 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
340 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
340 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
340 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
340 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
212 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
340 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
340 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
340 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
340 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
212 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |