#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#include "shortcut.h"
using namespace std;
using ll = long long;
#define pb emplace_back
#define AI(i) begin(i), end(i)
template<class T> bool chmin(T &a, T b) { return b < a && (a = b, true); }
template<class T> bool chmax(T &a, T b) { return a < b && (a = b, true); }
#ifdef KEV
#define DE(args...) kout("[ " + string(#args) + " ] = ", args)
void kout() { cerr << endl; }
template<class T, class ...U> void kout(T a, U ...b) { cerr << a << ' ', kout(b...); }
template<class T> void debug(T l, T r) { while (l != r) cerr << *l << " \n"[next(l)==r], ++l; }
#else
#define DE(...) 0
#define debug(...) 0
#endif
const int MAX_N = 3010;
// inf is big enough
const ll inf = 1ll << 59;
int n, C;
ll pf[MAX_N], suf[MAX_N], loc[MAX_N];
ll pfd[MAX_N], sufd[MAX_N];
ll dis(int i, int j) {
return abs(loc[i] - loc[j]);
}
vector<int> l, d;
void init() {
for (int i = 0;i+1 < n;++i) {
loc[i+1] = loc[i] + l[i];
}
{
pfd[0] = pf[0] = d[0];
for (int i = 1;i < n;++i) {
pf[i] = max(pf[i-1], d[i] - loc[i]);
pfd[i] = max(pfd[i-1], d[i] + loc[i] + pf[i-1]);
}
}
{
sufd[n-1] = suf[n-1] = d[n-1];
for (int i = n-2;i >= 0;--i) {
suf[i] = max(suf[i+1], d[i] - (loc[n-1] - loc[i]));
sufd[i] = max(sufd[i+1], d[i] + (loc[n-1] - loc[i]) + suf[i+1]);
}
}
}
ll get_dia(int a, int b) {
int m = b - a + 1;
ll all = dis(a, b) + C;
vector<ll> ml, md;
ml.pb(0);
for (int i = a;i <= b;++i) {
if (i < b) ml.pb(l[i]);
md.pb(d[i]);
}
ml.pb(C);
for (int i = a;i <= b;++i)
if (i < b) ml.pb(l[i]);
for (int i = 0;i < m;++i) {
md.pb(md[i]);
}
for (int i = 1;i < m+m;++i)
ml[i] += ml[i-1];
ll res = 0;
deque< pair<ll,ll> > dq;
for (int i = 0, j = 0;i < m;++i) {
auto push_in = [&](int id, ll v) {
while (dq.size()) {
auto [j, jv] = dq.back();
if (v <= jv) break;
dq.pop_back();
}
dq.pb(id, v);
};
while (j < m + m) {
if (2 * (ml[j] - ml[i]) > all) break;
push_in(j, ml[j] + md[j]), ++j;
}
while (dq.size() && dq[0].first == i) dq.pop_front();
if (dq.size()) {
chmax(res, md[i] + dq[0].second - ml[i]);
}
}
return res;
}
ll ans;
ll cal(int a, int b) {
//if (C >= dis(a, b)) return inf - b;
ll C = min((ll)::C, dis(a, b));
ll ld = dis(0, a) + pf[a], rd = dis(b, n-1) + suf[b];
ll res = max({pfd[a], sufd[b],
ld + rd + C});
//if (res >= ans) return res;
for (int i = a;i <= b;++i) {
// first to l, r
ll tol = min(dis(i, a), dis(i, b) + C),
tor = min(dis(i, b), dis(i, a) + C);
if (i > a) chmax(res, d[i] + tol + ld);
if (i < b) chmax(res, d[i] + tor + rd);
//if (res >= ans) return res;
}
return max(res, get_dia(a, b));
}
long long find_shortcut(int n, std::vector<int> l, std::vector<int> d, int c) {
::n = n;
::l = l;
::d = d;
C = c;
init();
ans = pfd[n-1];
// function<void(int,int,int,int)> dcop = [&](int l, int r, int sl, int sr) {
// if (l > r) return;
// int mid = l + r >> 1;
// int bst = -1;
// ll ans = inf;
// for (int i = sl;i <= sr && i < mid;++i) {
// if (chmin(ans, cal(i, mid)))
// bst = i;
// }
// chmin(res, ans);
//
// dcop(l, mid-1, sl, bst);
// dcop(mid+1, r, bst, sr);
//
// };
//dcop(0, n-1, 0, n-1);
for (int i = 0;i < n;++i) {
DE(i);
int l = i+1, r = n-1, mid;
while (l < r) {
mid = l + r >> 1;
if (dis(i, mid) <= C) {
l = mid+1;
continue;
}
ll qa = cal(i, mid), qb = cal(i, mid+1);
if (qa <= qb)
r = mid;
else
l = mid+1;
}
chmin(ans, cal(i, l));
// ll lst = inf;
// for (int j = i+1;j < n;++j) {
// ll now = cal(i, j);
// if (now > lst) break;
// chmin(ans, now);
// lst = now;
//// chmin(ans, cal(i, j));
//// DE(j, cal(i, j));
// }
}
return ans;
}
Compilation message
shortcut.cpp: In function 'long long int find_shortcut(int, std::vector<int>, std::vector<int>, int)':
shortcut.cpp:16:17: warning: statement has no effect [-Wunused-value]
16 | #define DE(...) 0
| ^
shortcut.cpp:164:3: note: in expansion of macro 'DE'
164 | DE(i);
| ^~
shortcut.cpp:168:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
168 | mid = l + r >> 1;
| ~~^~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
204 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
204 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
204 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
0 ms |
204 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
204 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
1 ms |
204 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
1 ms |
204 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
204 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
204 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
0 ms |
204 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
0 ms |
204 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
204 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
1 ms |
204 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
0 ms |
204 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
0 ms |
204 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
1 ms |
204 KB |
n = 5, 4000000000 is a correct answer |
17 |
Correct |
1 ms |
204 KB |
n = 10, 1000000343 is a correct answer |
18 |
Incorrect |
1 ms |
204 KB |
n = 10, incorrect answer: jury 3189 vs contestant 3392 |
19 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
204 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
204 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
204 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
0 ms |
204 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
204 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
1 ms |
204 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
1 ms |
204 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
204 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
204 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
0 ms |
204 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
0 ms |
204 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
204 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
1 ms |
204 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
0 ms |
204 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
0 ms |
204 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
1 ms |
204 KB |
n = 5, 4000000000 is a correct answer |
17 |
Correct |
1 ms |
204 KB |
n = 10, 1000000343 is a correct answer |
18 |
Incorrect |
1 ms |
204 KB |
n = 10, incorrect answer: jury 3189 vs contestant 3392 |
19 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
204 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
204 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
204 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
0 ms |
204 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
204 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
1 ms |
204 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
1 ms |
204 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
204 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
204 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
0 ms |
204 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
0 ms |
204 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
204 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
1 ms |
204 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
0 ms |
204 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
0 ms |
204 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
1 ms |
204 KB |
n = 5, 4000000000 is a correct answer |
17 |
Correct |
1 ms |
204 KB |
n = 10, 1000000343 is a correct answer |
18 |
Incorrect |
1 ms |
204 KB |
n = 10, incorrect answer: jury 3189 vs contestant 3392 |
19 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
204 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
204 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
204 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
0 ms |
204 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
204 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
1 ms |
204 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
1 ms |
204 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
204 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
204 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
0 ms |
204 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
0 ms |
204 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
204 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
1 ms |
204 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
0 ms |
204 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
0 ms |
204 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
1 ms |
204 KB |
n = 5, 4000000000 is a correct answer |
17 |
Correct |
1 ms |
204 KB |
n = 10, 1000000343 is a correct answer |
18 |
Incorrect |
1 ms |
204 KB |
n = 10, incorrect answer: jury 3189 vs contestant 3392 |
19 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
204 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
204 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
204 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
0 ms |
204 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
204 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
1 ms |
204 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
1 ms |
204 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
204 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
204 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
0 ms |
204 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
0 ms |
204 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
204 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
1 ms |
204 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
0 ms |
204 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
0 ms |
204 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
1 ms |
204 KB |
n = 5, 4000000000 is a correct answer |
17 |
Correct |
1 ms |
204 KB |
n = 10, 1000000343 is a correct answer |
18 |
Incorrect |
1 ms |
204 KB |
n = 10, incorrect answer: jury 3189 vs contestant 3392 |
19 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
204 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
204 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
204 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
0 ms |
204 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
204 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
1 ms |
204 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
1 ms |
204 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
204 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
204 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
0 ms |
204 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
0 ms |
204 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
204 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
1 ms |
204 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
0 ms |
204 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
0 ms |
204 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
1 ms |
204 KB |
n = 5, 4000000000 is a correct answer |
17 |
Correct |
1 ms |
204 KB |
n = 10, 1000000343 is a correct answer |
18 |
Incorrect |
1 ms |
204 KB |
n = 10, incorrect answer: jury 3189 vs contestant 3392 |
19 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
204 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
204 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
204 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
0 ms |
204 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
204 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
1 ms |
204 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
1 ms |
204 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
204 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
204 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
0 ms |
204 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
0 ms |
204 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
204 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
1 ms |
204 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
0 ms |
204 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
0 ms |
204 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
1 ms |
204 KB |
n = 5, 4000000000 is a correct answer |
17 |
Correct |
1 ms |
204 KB |
n = 10, 1000000343 is a correct answer |
18 |
Incorrect |
1 ms |
204 KB |
n = 10, incorrect answer: jury 3189 vs contestant 3392 |
19 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
204 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
204 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
204 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
0 ms |
204 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
204 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
1 ms |
204 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
1 ms |
204 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
204 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
204 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
0 ms |
204 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
0 ms |
204 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
204 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
1 ms |
204 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
0 ms |
204 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
0 ms |
204 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
1 ms |
204 KB |
n = 5, 4000000000 is a correct answer |
17 |
Correct |
1 ms |
204 KB |
n = 10, 1000000343 is a correct answer |
18 |
Incorrect |
1 ms |
204 KB |
n = 10, incorrect answer: jury 3189 vs contestant 3392 |
19 |
Halted |
0 ms |
0 KB |
- |