#include "shortcut.h"
#include <bits/stdc++.h>
#define T pair <long long, long long>
using namespace std;
const long long INF=1LL<<51;
const int mxn=1000001;
long long s[mxn];
int d[mxn],id,idx[mxn],root[mxn],le[mxn*20],ri[mxn*20],order[mxn];
T st[mxn*20];
vector <long long> v;
T operator +(T a, T b){
return {max(a.first,b.first),min(a.second,b.second)};
}
int update(int node, int l, int r, int i){
id++;
if (l==r){
st[id]={s[l]+d[l],s[l]-d[l]};
return id;
}
int cur=id,mid=(l+r)>>1;
st[cur]=st[node];
le[cur]=le[node];
ri[cur]=ri[node];
if (mid<i)
ri[cur]=update(ri[node],mid+1,r,i);
else
le[cur]=update(le[node],l,mid,i);
st[cur]=st[le[cur]]+st[ri[cur]];
return cur;
}
T get(int node, int l, int r, int u, int v){
if (l>v||r<u||l>r||u>v||!node)
return {-INF,INF};
if (l>=u&&r<=v)
return st[node];
int mid=(l+r)>>1;
return get(le[node],l,mid,u,v)+get(ri[node],mid+1,r,u,v);
}
long long find_shortcut(int n, vector <int> l, vector <int> D, int c){
for (int i=0;i<n;i++)
d[i]=D[i];
for (int i=1;i<n;i++){
s[i]=s[i-1]+l[i-1];
v.push_back(s[i]);
}
s[n]=INF;
sort(v.begin(),v.end());
iota(idx,idx+n,0);
iota(order,order+n,0);
sort(idx,idx+n,[](int i, int j){return s[i]+d[i]>s[j]+d[j];});
sort(order,order+n,[](int i, int j){return s[i]-d[i]>s[j]-d[j];});
st[0]={-INF,INF};
for (int i=0;i<n;i++)
root[i]=update((i?root[i-1]:0),0,n-1,idx[i]);
long long lo=0,hi=INF,kq=-1;
while (lo<=hi){
long long mid=(lo+hi)>>1,ch=0,mnx=-INF,mxx=INF,mny=-INF,mxy=INF,x=-INF,y=INF;
int pos=0;
for (int j=0;j<n;j++){
int i=order[j];
while (pos<n&&s[idx[pos]]+d[idx[pos]]>s[i]-d[i]+mid){
x=max(x,s[idx[pos]]+d[idx[pos]]);
y=min(y,s[idx[pos]]-d[idx[pos]]);
pos++;
}
T t=get(root[pos],0,n-1,i+1,n-1);
mnx=max(mnx,s[i]+d[i]+c-mid+x);
mxx=min(mxx,s[i]-d[i]-c+mid+y);
mny=max(mny,s[i]+d[i]+c-mid-y);
mxy=min(mxy,s[i]-d[i]-c+mid-x);
}
int tmp=0,j=n;
for (int i=0;i<n;i++){
long long l=max(mnx-s[i],s[i]-mxy);
if (mnx-s[i]<s[i]-mxy&&!tmp){
j=0;
tmp=1;
}
if (tmp)
while (j<n&&s[j]<l)
j++;
else{
while (j>=0&&s[j]>=l)
j--;
j++;
}
if (j<n&&s[j]<=min(mxx-s[i],s[i]-mny)){
ch=1;
break;
}
}
if (ch){
kq=mid;
hi=mid-1;
}
else
lo=mid+1;
}
return kq;
}
Compilation message
shortcut.cpp: In function 'long long int find_shortcut(int, std::vector<int>, std::vector<int>, int)':
shortcut.cpp:66:15: warning: variable 't' set but not used [-Wunused-but-set-variable]
66 | T t=get(root[pos],0,n-1,i+1,n-1);
| ^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
8536 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
2 ms |
8540 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
8540 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
8640 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
8536 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
8536 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
2 ms |
8540 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
8540 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
8640 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
8536 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
8536 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
2 ms |
8540 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
8540 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
8640 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
8536 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
8536 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
2 ms |
8540 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
8540 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
8640 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
8536 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
8536 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
2 ms |
8540 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
8540 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
8640 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
8536 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
8536 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
2 ms |
8540 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
8540 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
8640 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
8536 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
8536 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
2 ms |
8540 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
8540 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
8640 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
8536 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
8536 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
2 ms |
8540 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
1 ms |
8540 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
1 ms |
8640 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
1 ms |
8536 KB |
n = 2, incorrect answer: jury 62 vs contestant 72 |
6 |
Halted |
0 ms |
0 KB |
- |