# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
787642 |
2023-07-19T10:38:27 Z |
ymm |
Shortcut (IOI16_shortcut) |
C++17 |
|
1 ms |
212 KB |
#include "shortcut.h"
#include <bits/stdc++.h>
#define Loop(x,l,r) for (ll x = (l); x < (r); ++x)
#define LoopR(x,l,r) for (ll x = (r)-1; x >= (l); --x)
typedef long long ll;
typedef std::pair<ll,ll> pll;
using namespace std;
const int N = 1000010;
ll ps[N], a[N], C;
int n;
ll calcin(int l, int r)
{
#if 0
ll ans = 0;
Loop (i,l,r+1) Loop (j,i+1,r+1) {
ll x = ps[j] - ps[i];
ll y = ps[r] - ps[j] + ps[i] - ps[l] + C;
ans = max(ans, min(x, y) + a[i] + a[j]);
}
return ans;
#endif
int p = l;
vector<int> vec;
int vecp = 0;
auto cw = [&](int i, int j) {
assert(l <= i && i <= r && l <= j && j <= r);
if (i == j)
return 0;
int x = min(i, j);
int y = max(i, j);
ll v1 = ps[y] - ps[x];
ll v2 = C + ps[r] - ps[y] + ps[x] - ps[l];
if (v1 == v2)
return 1;
return (v1 < v2) ^ (i > j);
};
auto dis = [&](int i, int j) {
assert(l <= i && i <= r && l <= j && j <= r);
if (i < j)
return ps[j] - ps[i] + a[j] + a[i];
else
return C + ps[r] - ps[i] + ps[j] - ps[l] + a[i] + a[j];
};
auto mod = [&](int x) {
return (x-l)%(r-l+1)+l;
};
ll ans = 0;
Loop (i,l,r+1) {
p = max<int>(p, i+1);
while (vecp < vec.size() && vec[vecp] <= i)
++vecp;
while (cw(i, mod(p))) {
while (vecp < vec.size() && dis(i, mod(vec.back())) <= dis(i, mod(p)))
vec.pop_back();
vec.push_back(p);
++p;
}
if (vecp < vec.size()) {
ans = max(ans, dis(i, mod(vec[vecp])));
//cerr << i << ' ' << mod(vec[vecp]) << ' ' << dis(i, mod(vec[vecp])) << '\n';
}
}
return ans;
}
#if 0
ll calc0(ll ansl, ll lx, int lp, int l, int r)
{
ll ans = calcin(l, r);
ans = max(ans, ansl);
ll mx = lx;
Loop (i,lp,l) {
ans = max(ans, ps[i] + a[i] + mx);
mx = max(mx, a[i] - ps[i]);
}
Loop (i,l,r+1) {
ll x = min(ps[i], ps[r] - ps[i] + ps[l] + C);
ans = max(ans, a[i] + x + mx);
}
return ans;
}
ll calcn(ll ansr, ll rx, ll rrx, int lp, int rp, int l, int r)
{
ll ans = ansr;
ll mx = rx;
LoopR (i,r+1,rp) {
ans = max(ans, a[i] - ps[i] + mx);
mx = max(mx, a[i] + ps[i]);
}
LoopR (i,l,r+1) {
ll x = min(-ps[i], -ps[r] + ps[i] - ps[l] + C);
ans = max(ans, a[i] + x + mx);
}
ll x = min(0ll, C - (ps[r] - ps[l]));
LoopR (i,lp,l)
ans = max(ans, a[i] - ps[i] + mx + x);
ans = max(ans, rrx + mx + x);
return ans;
}
#endif
ll calc0(int l, int r)
{
ll ans = calcin(l, r);
ll mx = -1e18;
Loop (i,0,l) {
ans = max(ans, ps[i] + a[i] + mx);
mx = max(mx, a[i] - ps[i]);
}
Loop (i,l,r+1) {
ll x = min(ps[i], ps[r] - ps[i] + ps[l] + C);
ans = max(ans, a[i] + x + mx);
}
return ans;
}
ll calcn(int l, int r)
{
ll ans = 0;
ll mx = -1e18;
LoopR (i,r+1,n) {
ans = max(ans, a[i] - ps[i] + mx);
mx = max(mx, a[i] + ps[i]);
}
LoopR (i,l,r+1) {
ll x = min(-ps[i], -ps[r] + ps[i] - ps[l] + C);
ans = max(ans, a[i] + x + mx);
}
LoopR (i,0,l) {
ll x = min(0ll, C - (ps[r] - ps[l]));
ans = max(ans, a[i] - ps[i] + mx + x);
}
return ans;
}
ll solve(int l1, int r1, int l2, int r2)//, ll xl, ll xr, ll ansl, ll ansr)
{
if (r1-l1 <= 0)
return 1e18;
int m = (l1+r1)/2;
pll mn = {2e18, -1};
r2 = min(r2, n);
Loop (i,max(m+1,l2),r2) {
ll x = calc0(m, i);//calc0(ansl, xl, l2, m, i);
ll y = calcn(m, i);//calcn(ansr, xr, xl, l2, r2, m, i);
mn = min(mn, pll{max(x, y), i});
}
ll ans = mn.first;
//cerr << m << ": " << ans << " (" << l2 << ' ' << r2 << ")\n";
int p = mn.second;
ans = min(ans, solve(l1, m, l2, p+2));
ans = min(ans, solve(m+1, r1, p-2, r2));
return ans;
//{
// int r22 = p+2;
// LoopR (i,r22,r2) {
// ansr = max(ansr, a[i] - ps[i] + xr);
// xr = max(xr, a[i] + ps[i]);
// }
// ans = min(ans, solve(l1, m, l2, r22, xl, xr, ansl, ansr));
//}
//{
// int l22 = p-2;
// Loop (i,l2,l22) {
// ansl = max(ansl, ps[i] + a[i] + xl);
// xl = max(xl, a[i] - ps[i]);
// }
// ans = min(ans, solve(m+1, r1, l22, r2, xl, xr, ansl, ansr));
//}
//return ans;
}
long long find_shortcut(int _n, std::vector<int> l, std::vector<int> d, int c)
{
n = _n;
Loop (i,1,n)
ps[i] = ps[i-1] + l[i-1];
Loop (i,0,n)
a[i] = d[i];
C = c;
ll ans = solve(0, n-1, 0, n);//, 0, 0, 0, 0);
return ans;
//ll ans = 1e18;
//int p0 = 0, p1 = 1;
//while (p0 < n-1) {
// ll a = calc0(p0, p1);
// ll b = calcn(p0, p1);
// ans = min(ans, max(a, b));
// if (a <= b) {
// ++p1;
// }
// if (a > b || p1 == n) {
// ++p0;
// p1 -= 4;
// }
// while (p0 >= p1)
// ++p1;
//}
//Loop (i,0,n-1) {
// int l = i+1, r = n-1;
// while (l < r) {
// int j = (l+r+1)/2;
// if (a <= b)
// l = j;
// else
// r = j-1;
// }
// ans = min(ans, max(calc0(i, l), calcn(i, l)));
// if (l < n-1)
// ans = min(ans, max(calc0(i, l+1), calcn(i, l+1)));
//}
return ans;
}
Compilation message
shortcut.cpp: In function 'll calcin(int, int)':
shortcut.cpp:52:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
52 | while (vecp < vec.size() && vec[vecp] <= i)
| ~~~~~^~~~~~~~~~~~
shortcut.cpp:55:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
55 | while (vecp < vec.size() && dis(i, mod(vec.back())) <= dis(i, mod(p)))
| ~~~~~^~~~~~~~~~~~
shortcut.cpp:60:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
60 | if (vecp < vec.size()) {
| ~~~~~^~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
212 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
212 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
0 ms |
212 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
212 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
212 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
0 ms |
212 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
0 ms |
212 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
0 ms |
212 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
212 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
0 ms |
212 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
0 ms |
212 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
0 ms |
212 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
0 ms |
212 KB |
n = 5, 4000000000 is a correct answer |
17 |
Correct |
0 ms |
212 KB |
n = 10, 1000000343 is a correct answer |
18 |
Incorrect |
0 ms |
212 KB |
n = 10, incorrect answer: jury 3189 vs contestant 3392 |
19 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
212 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
212 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
0 ms |
212 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
212 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
212 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
0 ms |
212 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
0 ms |
212 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
0 ms |
212 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
212 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
0 ms |
212 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
0 ms |
212 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
0 ms |
212 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
0 ms |
212 KB |
n = 5, 4000000000 is a correct answer |
17 |
Correct |
0 ms |
212 KB |
n = 10, 1000000343 is a correct answer |
18 |
Incorrect |
0 ms |
212 KB |
n = 10, incorrect answer: jury 3189 vs contestant 3392 |
19 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
212 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
212 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
0 ms |
212 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
212 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
212 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
0 ms |
212 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
0 ms |
212 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
0 ms |
212 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
212 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
0 ms |
212 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
0 ms |
212 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
0 ms |
212 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
0 ms |
212 KB |
n = 5, 4000000000 is a correct answer |
17 |
Correct |
0 ms |
212 KB |
n = 10, 1000000343 is a correct answer |
18 |
Incorrect |
0 ms |
212 KB |
n = 10, incorrect answer: jury 3189 vs contestant 3392 |
19 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
212 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
212 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
0 ms |
212 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
212 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
212 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
0 ms |
212 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
0 ms |
212 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
0 ms |
212 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
212 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
0 ms |
212 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
0 ms |
212 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
0 ms |
212 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
0 ms |
212 KB |
n = 5, 4000000000 is a correct answer |
17 |
Correct |
0 ms |
212 KB |
n = 10, 1000000343 is a correct answer |
18 |
Incorrect |
0 ms |
212 KB |
n = 10, incorrect answer: jury 3189 vs contestant 3392 |
19 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
212 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
212 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
0 ms |
212 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
212 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
212 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
0 ms |
212 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
0 ms |
212 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
0 ms |
212 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
212 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
0 ms |
212 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
0 ms |
212 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
0 ms |
212 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
0 ms |
212 KB |
n = 5, 4000000000 is a correct answer |
17 |
Correct |
0 ms |
212 KB |
n = 10, 1000000343 is a correct answer |
18 |
Incorrect |
0 ms |
212 KB |
n = 10, incorrect answer: jury 3189 vs contestant 3392 |
19 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
212 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
212 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
0 ms |
212 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
212 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
212 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
0 ms |
212 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
0 ms |
212 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
0 ms |
212 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
212 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
0 ms |
212 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
0 ms |
212 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
0 ms |
212 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
0 ms |
212 KB |
n = 5, 4000000000 is a correct answer |
17 |
Correct |
0 ms |
212 KB |
n = 10, 1000000343 is a correct answer |
18 |
Incorrect |
0 ms |
212 KB |
n = 10, incorrect answer: jury 3189 vs contestant 3392 |
19 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
212 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
212 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
0 ms |
212 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
212 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
212 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
0 ms |
212 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
0 ms |
212 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
0 ms |
212 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
212 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
0 ms |
212 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
0 ms |
212 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
0 ms |
212 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
0 ms |
212 KB |
n = 5, 4000000000 is a correct answer |
17 |
Correct |
0 ms |
212 KB |
n = 10, 1000000343 is a correct answer |
18 |
Incorrect |
0 ms |
212 KB |
n = 10, incorrect answer: jury 3189 vs contestant 3392 |
19 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
212 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
212 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
0 ms |
212 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
212 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
0 ms |
212 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
0 ms |
212 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
0 ms |
212 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
0 ms |
212 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
0 ms |
212 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
0 ms |
212 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
0 ms |
212 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
0 ms |
212 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
0 ms |
212 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
0 ms |
212 KB |
n = 5, 4000000000 is a correct answer |
17 |
Correct |
0 ms |
212 KB |
n = 10, 1000000343 is a correct answer |
18 |
Incorrect |
0 ms |
212 KB |
n = 10, incorrect answer: jury 3189 vs contestant 3392 |
19 |
Halted |
0 ms |
0 KB |
- |