#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include "shortcut.h"
#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e3 + 20;
const long long inf = 1e18L;
long long len[maxn];
bool bad1[maxn];
bool bad2[maxn];
long long max3[maxn][maxn];
long long max4[maxn][maxn];
long long max5[maxn][maxn];
long long max6[maxn][maxn];
int depth[maxn];
int n, c;
long long calc(long long lim) {
for (int j = 1; j <= n; j++) {
bad1[j] = (j > 1 ? bad1[j - 1] : false);
for (int i = 1; i < j; i++) {
if (len[j] - len[i] + depth[i] + depth[j] > lim) {
bad1[j] = true;
break;
}
}
}
for (int i = n; i >= 1; i--) {
bad2[i] = (i < n ? bad2[i + 1] : false);
for (int j = i + 1; j <= n; j++) {
if (len[j] - len[i] + depth[i] + depth[j] > lim) {
bad2[i] = true;
break;
}
}
}
for (int j = 1; j <= n; j++) {
for (int i = 1; i < j; i++) {
max3[i][j] = (i > 1 ? max3[i - 1][j] : -inf);
long long d1 = - len[i] - len[j] + c + depth[i] + depth[j];
long long d2 = len[j] - len[i] + depth[i] + depth[j];
if (d2 > lim) {
max3[i][j] = max(max3[i][j], d1);
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = i + 2; j <= n; j++) {
max3[i][j] = max(max3[i][j], max3[i][j - 1]);
}
}
for (int i = 1; i <= n; i++) {
for (int j = n; j > i; j--) {
max4[i][j] = (j < n ? max4[i][j + 1] : -inf);
long long d1 = len[i] + len[j] + c + depth[i] + depth[j];
long long d2 = len[j] - len[i] + depth[i] + depth[j];
if (d2 > lim) {
max4[i][j] = max(max4[i][j], d1);
}
}
}
for (int j = 1; j <= n; j++) {
for (int i = j - 2; i >= 1; i--) {
max4[i][j] = max(max4[i][j], max4[i + 1][j]);
}
}
for (int j = 1; j <= n; j++) {
for (int i = j - 1; i >= 1; i--) {
max5[i][j] = (i + 1 < j ? max(max5[i + 1][j], max5[i][j - 1]) : -inf);
long long d1 = len[i] - len[j] + c + depth[i] + depth[j];
long long d2 = len[j] - len[i] + depth[i] + depth[j];
if (d2 > lim) {
max5[i][j] = max(max5[i][j], d1);
}
}
}
for (int j = n; j >= 1; j--) {
for (int i = 1; i <= n; i++) {
max6[i][j] = max((i > 1 ? max6[i - 1][j] : -inf), (j < n ? max6[i][j + 1] : -inf));
long long d1 = len[j] - len[i] + c + depth[i] + depth[j];
long long d2 = len[j] - len[i] + depth[i] + depth[j];
if (d2 > lim) {
max6[i][j] = max(max6[i][j], d1);
}
}
}
long long res = inf;
for (int x = 1; x <= n; x++) {
if (bad1[x]) {
break;
}
for (int y = x + 1; y <= n; y++) {
if (bad2[y]) {
break;
}
long long mx = 0;
mx = max(mx, max3[x][y] + (len[x] + len[y]));
mx = max(mx, max4[x][y] - (len[x] + len[y]));
mx = max(mx, max5[x][y] + (len[y] - len[x]));
mx = max(mx, max6[x][y] - (len[y] - len[x]));
res = min(res, mx);
}
}
return res;
}
long long dist[maxn * maxn];
long long find_shortcut(int _n, vector<int> _len, vector<int> _depth, int _c) {
n = _n;
c = _c;
len[1] = 0;
for (int i = 2; i <= n; i++) {
len[i] = len[i - 1] + _len[i - 2];
}
for (int i = 1; i <= n; i++) {
depth[i] = _depth[i - 1];
}
int mx1 = 0;
int mx2 = 0;
for (int i = 1; i <= n; i++) {
if (depth[i] > depth[mx1]) {
mx2 = mx1;
mx1 = i;
}
else if (depth[i] > depth[mx2]) {
mx2 = i;
}
}
int cnt = 0;
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
dist[cnt++] = len[j] - len[i] + depth[i] + depth[j];
}
}
sort(dist, dist + cnt, greater<>());
while (dist[cnt - 1] <= depth[mx1] + depth[mx2]) {
cnt--;
}
long long res = dist[0];
int lt = 0;
int rt = cnt - 1;
while (lt <= rt) {
int mt = (lt + rt) / 2;
long long mx = calc(dist[mt] - 1);
if (mx < dist[mt]) {
res = max(mx, dist[mt + 1]);
lt = mt + 1;
}
else {
rt = mt - 1;
}
}
return res;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
340 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
468 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
0 ms |
340 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
0 ms |
296 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
340 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
0 ms |
340 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
1 ms |
340 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
1 ms |
340 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
340 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
0 ms |
340 KB |
n = 3, 3000000000 is a correct answer |
14 |
Incorrect |
0 ms |
340 KB |
n = 4, incorrect answer: jury 3000000001 vs contestant 4000000000 |
15 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
340 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
468 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
0 ms |
340 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
0 ms |
296 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
340 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
0 ms |
340 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
1 ms |
340 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
1 ms |
340 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
340 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
0 ms |
340 KB |
n = 3, 3000000000 is a correct answer |
14 |
Incorrect |
0 ms |
340 KB |
n = 4, incorrect answer: jury 3000000001 vs contestant 4000000000 |
15 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
340 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
468 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
0 ms |
340 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
0 ms |
296 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
340 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
0 ms |
340 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
1 ms |
340 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
1 ms |
340 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
340 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
0 ms |
340 KB |
n = 3, 3000000000 is a correct answer |
14 |
Incorrect |
0 ms |
340 KB |
n = 4, incorrect answer: jury 3000000001 vs contestant 4000000000 |
15 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
340 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
468 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
0 ms |
340 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
0 ms |
296 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
340 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
0 ms |
340 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
1 ms |
340 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
1 ms |
340 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
340 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
0 ms |
340 KB |
n = 3, 3000000000 is a correct answer |
14 |
Incorrect |
0 ms |
340 KB |
n = 4, incorrect answer: jury 3000000001 vs contestant 4000000000 |
15 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
340 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
468 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
0 ms |
340 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
0 ms |
296 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
340 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
0 ms |
340 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
1 ms |
340 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
1 ms |
340 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
340 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
0 ms |
340 KB |
n = 3, 3000000000 is a correct answer |
14 |
Incorrect |
0 ms |
340 KB |
n = 4, incorrect answer: jury 3000000001 vs contestant 4000000000 |
15 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
340 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
468 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
0 ms |
340 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
0 ms |
296 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
340 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
0 ms |
340 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
1 ms |
340 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
1 ms |
340 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
340 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
0 ms |
340 KB |
n = 3, 3000000000 is a correct answer |
14 |
Incorrect |
0 ms |
340 KB |
n = 4, incorrect answer: jury 3000000001 vs contestant 4000000000 |
15 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
340 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
468 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
0 ms |
340 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
0 ms |
296 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
340 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
0 ms |
340 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
1 ms |
340 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
1 ms |
340 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
340 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
0 ms |
340 KB |
n = 3, 3000000000 is a correct answer |
14 |
Incorrect |
0 ms |
340 KB |
n = 4, incorrect answer: jury 3000000001 vs contestant 4000000000 |
15 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
340 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
468 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
0 ms |
340 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
0 ms |
296 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
340 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
0 ms |
340 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
340 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
1 ms |
340 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
1 ms |
340 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
340 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
0 ms |
340 KB |
n = 3, 3000000000 is a correct answer |
14 |
Incorrect |
0 ms |
340 KB |
n = 4, incorrect answer: jury 3000000001 vs contestant 4000000000 |
15 |
Halted |
0 ms |
0 KB |
- |