// ~ Be Name Khoda ~ //
#include "shortcut.h"
//#pragma GCC optimize ("O3")
//#pragma GCC target("avx2")
#pragma GCC optimize("unroll-loops,Ofast")
#include <bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
typedef long long ll;
#define pb push_back
#define mp make_pair
#define all(x) x.begin(), x.end()
#define fi first
#define se second
const int maxn = 1e6 + 10;
const int maxn5 = 3e5 + 10;
const int maxnt = 1.2e6 + 10;
const int maxn3 = 1e3 + 10;
const ll mod = 1e9 + 7;
const int lg = 20;
const ll inf = 1e18;
int n;
ll c;
vector <ll> d;
ll ps[maxn5];
vector <pair<ll, pair<ll, ll>>> av;
// c + d[i] + ps[i] - ps[a] + cons - ps[b] <= lim
// d[i] + ps[i] + cons <= lim - c + ps[b] + ps[a]
struct RMQ{
ll mx[lg][maxn5];
void build(int n){
for(int i = 1; i < lg; i++) for(int j = 0; j < n; j++)
mx[i][j] = max(mx[i - 1][j], j + (1 << (i - 1)) < n ? mx[i - 1][j + (1 << (i - 1))] : -inf);
}
ll get_max(int l, int r){
int k = 31 - __builtin_clz(r - l + 1);
return max(mx[k][l], mx[k][r - (1 << k) + 1]);
}
} rmq[2][2];
bool check2(int a, int b, int ty, ll lim){
//cout << "for " << a << ' ' << b << ' ' << ty << ' ' << lim << endl;
//cout << rmq[0][ty].get_max(a, n - 1) << ' ' << lim - c + (ty ? -1 : 1) * ps[b] - ps[a] << endl;
if(rmq[0][ty].get_max(a, n - 1) > lim - c + (ty ? -1 : 1) * ps[b] + ps[a])
return false;
if(rmq[1][ty].get_max(0, a) > lim - c + (ty ? -1 : 1) * ps[b] - ps[a])
return false;
//cout << "result in true " << endl;
return true;
}
bool check(ll lim){
//cout << "************** in lim " << lim << endl;
for(int i = 0; i < n; i++){
int pt = upper_bound(all(av), mp(lim - (d[i] - ps[i]), mp(inf, inf))) - av.begin();
if(pt == av.size()){
for(int x = 0; x < 2; x++) for(int y = 0; y < 2; y++)
rmq[x][y].mx[0][i] = -inf;
continue;
}
//cout << "in " << i << ' ' << pt << ' ' << av.size() << endl;
ll cons[2];
cons[0] = av[pt].se.fi;
cons[1] = av[pt].se.se;
//cout << i << ' ' << cons[0] << ' ' << cons[1] << endl;
for(int x = 0; x < 2; x++) for(int y = 0; y < 2; y++)
rmq[x][y].mx[0][i] = d[i] + cons[y] + ps[i] * (x ? -1 : 1);
}
rmq[0][0].build(n);
rmq[0][1].build(n);
rmq[1][0].build(n);
rmq[1][1].build(n);
for(int i = 0; i < n; i++){
int lo = i, hi = n;
while(hi - lo > 1){
int mid = (lo + hi) >> 1;
if(check2(i, mid, 0, lim))
hi = mid;
else
lo = mid;
}
int l = max(i + 1, hi);
lo = i; hi = n;
while(hi - lo > 1){
int mid = (lo + hi) >> 1;
if(check2(i, mid, 1, lim))
lo = mid;
else
hi = mid;
}
int r = min(n, lo);
//cout << "ok " << i << ' ' << l << ' ' << r << endl;
if(l <= r)
return true;
}
return false;
/*
for(int i = 0; i < n; i++) if(pt[i] < av[i].size()){
int b = 0;
for(auto [w, a] : srt[i]){
while(b + 1 < n && c + d[i] + w + av[i][pt[i]].se.fi - ps[b] > lim)
b++;
l[a] = max(l[a], b);
}
b = n - 1;
for(auto [w, a] : srt[i]){
while(b && c + d[i] + w + av[i][pt[i]].se.se + ps[b] > lim)
b--;
r[a] = min(r[a], b);
}
/*
int lo = i, hi = n;
while(hi - lo > 1){
int mid = (lo + hi) >> 1;
if(check(i, mid, 0, lim))
hi = mid;
else
lo = mid;
}
l = max(i + 1, hi);
lo = i; hi = n;
while(hi - lo > 1){
int mid = (lo + hi) >> 1;
if(check(i, mid, 1, lim))
lo = mid;
else
hi = mid;
}
r = min(n, lo);
//////cout << "ok " << lim << ' ' << i << ' ' << l << ' ' << r << endl;
if(l <= r)
return true;
/*
bool re = true;
for(int j = 0; j < n && re; j++) for(int k = j + 1; k < n && re; k++) if(dis(j, k) + d[j] + d[k] > lim){
ll dis1 = dis(i, j);
ll need = lim - c - d[j] - d[k] - dis1;
if(need < 0)
re = false;
int ptl = k - (upper_bound(all(av[k][0]), need) - av[k][0].begin() - 1);
int ptr = k + (upper_bound(all(av[k][1]), need) - av[k][1].begin() - 1);
l = max(l, ptl);
r = min(r, ptr);
//////cout << lim << ' ' << i << ' ' << j << ' ' << k << ' ' << l << ' ' << r << endl;
if(l > r)
re = false;
}
if(re)
return true;
}
*/
}
long long find_shortcut(int N, std::vector<int> l, std::vector<int> D, int C)
{
n = N;
c = C;
for(auto u : D)
d.pb(u);
ps[0] = 0;
for(int i = 0; i < n; i++){
if(i)
ps[i] = ps[i - 1] + l[i - 1];
av.pb({d[i] + ps[i], {d[i] + ps[i], d[i] - ps[i]}});
}
sort(all(av));
for(int i = n - 2; i >= 0; i--){
av[i].se.fi = max(av[i].se.fi, av[i + 1].se.fi);
av[i].se.se = max(av[i].se.se, av[i + 1].se.se);
}
/*
for(int i = 0; i < n; i++){
for(int j = i + 1; j < n; j++)
av[i].pb({dis(i, j) + d[i] + d[j], {d[j] + ps[j], d[j] - ps[j]}});
//if(i == 1)
// ////cout << av[i][1].back().se << ' ' << av[i][1].back().fi << endl;
sort(all(av[i]));
for(int j = int(av[i].size()) - 2; j >= 0; j--){
//if(i == 1)
// ////cout << j << endl;
av[i][j].se.fi = max(av[i][j].se.fi, av[i][j + 1].se.fi);
av[i][j].se.se = max(av[i][j].se.se, av[i][j + 1].se.se);
}
//if(i == 1)
// ////cout << av[i][1].back().se << ' ' << av[i][1].back().fi << endl;
}
*/
ll lo = -1, hi = mod * (n + 3);
while(hi - lo > 1){
ll mid = (lo + hi) >> 1;
if(check(mid))
hi = mid;
else
lo = mid;
}
return hi;
}
Compilation message
shortcut.cpp:133:9: warning: "/*" within comment [-Wcomment]
133 | /*
|
shortcut.cpp:159:9: warning: "/*" within comment [-Wcomment]
159 | /*
|
shortcut.cpp: In function 'bool check(ll)':
shortcut.cpp:71:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, std::pair<long long int, long long int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
71 | if(pt == av.size()){
| ~~~^~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
852 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
852 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
852 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
852 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
852 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
852 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
852 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
852 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
852 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
852 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
852 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
852 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
852 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
852 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
852 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
852 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
852 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
852 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
852 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
852 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
852 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
852 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
852 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
852 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
852 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
852 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
852 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
852 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
852 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
852 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
852 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
852 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
852 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
852 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
852 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
852 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
1 ms |
852 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
852 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
852 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
852 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |