#include "shortcut.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define all(x) (x).begin(), (x).end()
const int mxn = 510;
vector<int> l, d;
ll n, c, prf[mxn], prfR[mxn], suf[mxn];
ll get(int l, int r, bool side) {
l = max(l, 0);
r--;
if (l > r) return 0;
if (side) return prf[r] - (l == 0 ? 0 : prf[l - 1]);
return prfR[r] - (l == 0 ? 0 : prfR[l - 1]);
}
ll minCost(int x, int y, bool side) {
ll res = 0, mx[n];
memset(mx, 0, sizeof(mx));
mx[0] = d[0];
for (int i = 1; i <= x; i++) {
ll dist = mx[i - 1] + l[i - 1];
mx[i] = max(dist, (ll) d[i]);
res = max(res, dist + d[i]);
}
int split = x;
for (int i = x; i <= y; i++) {
ll goF = get(x, i, side);
ll goA = c + get(i, y, side);
if (goF <= goA) split = i;
else break;
}
for (int i = x + 1; i <= split; i++) {
ll dist = mx[i - 1] + l[i - 1];
mx[i] = max(dist, (ll) d[i]);
res = max(res, dist + d[i]);
}
mx[y] = mx[x] + c;
res = max(res, mx[y] + d[y]);
for (int i = y - 1; i > split; i--) {
ll dist = mx[i + 1] + l[i];
mx[i] = max(dist, (ll) d[i]);
res = max(res, dist + d[i]);
}
for (int i = y + 1; i < n; i++) {
ll dist = mx[i - 1] + l[i - 1];
mx[i] = max(dist, (ll) d[i]);
res = max(res, dist + d[i]);
}
return res;
}
ll ansL[mxn][mxn], ansR[mxn][mxn];
ll only(int x, int y) {
int r = x;
ll ans = 0;
for (int i = x; i < y; i++) {
r = max(r, i);
while (r < y && get(i, r + 1, 1) <= get(x, i, 1) + c + get(r + 1, y, 1)) r++;
ans = max({ans, (r - i >= 1) * d[i] + ansL[i + 1][r] + l[i], (r != y ? d[i] + get(x, i, 1) + c + ansR[r + 1][y] : 0)});
}
return ans;
}
ll find_shortcut(int _n, vector<int> _l, vector<int> _d, int _c) {
n = _n, l = _l, d = _d, c = _c;
prf[0] = l[0];
for (int i = 1; i < n - 1; i++) prf[i] = prf[i - 1] + l[i];
for (int i = 0; i < n; i++) {
ansL[i][i] = d[i];
ll sum = (i < l.size() ? l[i] : 0);
for (int j = i + 1; j < n; j++) {
ansL[i][j] = max(ansL[i][j - 1], sum + d[j]);
sum += (j < l.size() ? l[j] : 0);
}
}
reverse(all(l));
prfR[0] = l[0];
for (int i = 1; i < n - 1; i++) prfR[i] = prfR[i - 1] + l[i];
reverse(all(l));
for (int i = n - 1; i >= 0; i--) {
ansR[i][i] = d[i];
ll sum = 0;
for (int j = i - 1; j >= 0; j--) {
sum += l[j];
ansR[j][i] = max(ansR[j + 1][i], sum + d[j]);
}
}
for (int i = n - 2; i >= 0; i--) suf[i] = suf[i + 1] + l[i];
ll minAns = 0;
ll sum = d[0];
for (int i = 1; i < n; i++) {
minAns = max(minAns, sum + l[i - 1] + d[i]);
sum = max(sum + l[i - 1], (ll) d[i]);
}
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
ll dist = get(i, j, 1);
if (c < dist) {
ll mx = max(minCost(i, j, 1), only(i, j));
reverse(all(l));
reverse(all(d));
mx = max(mx, minCost(n - j - 1, n - i - 1, 0));
minAns = min(minAns, mx);
reverse(all(l));
reverse(all(d));
}
}
}
return minAns;
}
컴파일 시 표준 에러 (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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |