# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
787566 |
2023-07-19T09:47:48 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 = 3030;
ll ps[N], a[N], C;
int n;
ll calcin(int l, int r)
{
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;
}
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,0,r+1) {
ll x = min(-ps[i], -ps[r] + ps[i] - ps[l] + C);
ans = max(ans, a[i] + x + mx);
}
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 = 1e18;
Loop (i,0,n-2) {
int l = i+1, r = n-1;
while (l < r) {
int j = (l+r+1)/2;
ll a = calc0(i, j);
ll b = calcn(i, j);
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:43:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
43 | while (vecp < vec.size() && vec[vecp] <= i)
| ~~~~~^~~~~~~~~~~~
shortcut.cpp:46:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
46 | while (vecp < vec.size() && dis(i, mod(vec.back())) <= dis(i, mod(p)))
| ~~~~~^~~~~~~~~~~~
shortcut.cpp:51:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
51 | if (vecp < vec.size()) {
| ~~~~~^~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
0 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 |
0 ms |
212 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
212 KB |
n = 2, incorrect answer: jury 62 vs contestant 1000000000000000000 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
0 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 |
0 ms |
212 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
212 KB |
n = 2, incorrect answer: jury 62 vs contestant 1000000000000000000 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
0 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 |
0 ms |
212 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
212 KB |
n = 2, incorrect answer: jury 62 vs contestant 1000000000000000000 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
0 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 |
0 ms |
212 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
212 KB |
n = 2, incorrect answer: jury 62 vs contestant 1000000000000000000 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
0 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 |
0 ms |
212 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
212 KB |
n = 2, incorrect answer: jury 62 vs contestant 1000000000000000000 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
0 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 |
0 ms |
212 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
212 KB |
n = 2, incorrect answer: jury 62 vs contestant 1000000000000000000 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
0 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 |
0 ms |
212 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
212 KB |
n = 2, incorrect answer: jury 62 vs contestant 1000000000000000000 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
0 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 |
0 ms |
212 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
212 KB |
n = 2, incorrect answer: jury 62 vs contestant 1000000000000000000 |
6 |
Halted |
0 ms |
0 KB |
- |