#ifndef LOCAL
#include "shortcut.h"
#endif
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=3005;
const int LOG=11;
int X[maxn];
vector<int32_t> L, D;
int C;
int n;
const int oo = 1'000'000'000'000'000'000ll;
typedef pair<int,int>pi;
struct node{
int st[LOG][maxn];
int tree[4*maxn];
int msb(unsigned int x){
return 31-__builtin_clz(x);
}
node(vector<int>a){
for(int i=1;i<=n;i++)st[0][i]=a[i];
for(int i=1;i<LOG;i++){
for(int j=1;j+(1<<i)<=n;j++){
st[i][j]=max(st[i-1][j],st[i-1][j+(1<<(i-1))]);
}
}
}
int query(int node, int s, int e, int x, int y){
int b=msb(y-x+1);
return max(st[b][x],st[b][y-(1<<b)+1]);
}
};
int get(int L, int R){
int dl=0,dr=0;
for(int i=0;i<L;i++)dl=max(dl,-X[i]+D[i]);
for(int i=R+1;i<n;i++)dr=max(dr,X[i]+D[i]);
int ans=0;
ans=max(ans,dl+dr+min(X[R]-X[L],C)+X[L]-X[R]);
int m1=0;
for(int i=L;i<=R;i++){
m1=max(m1,D[i] + min(X[i]-X[L], X[R]-X[i]+C));
}
ans=max(ans,m1 + dl+X[L]);
int m2=0;
for(int i=L;i<=R;i++){
m2=max(m2,D[i] + min(X[R]-X[i], X[i]-X[L]+C));
}
ans=max(ans,m2+dr-X[R]);
int bet=0;
int idx=L;
vector<int>c1=vector<int>(n+1,0);
vector<int>c2=vector<int>(n+1,0);
for(int i=L;i<=R;i++){
c1[i]=-X[i]+D[i];
c2[i]=X[i]+D[i];
}
node seg1=node(c1);
node seg2=node(c2);
for(int i=L+1;i<=R;i++){
int lo = L-1, hi=i;
while(lo<hi-1){
int mi=(lo+hi)/2;
int c1= D[i] + D[mi] + X[i] - X[mi]; // walk
int c2 = D[i] + D[mi] + C + X[mi] - X[L] + X[R] - X[i]; // teleport
if(c2<=c1){
lo=mi;
} else{
hi=mi;
}
}
if(L<=lo){
int wst=seg2.query(1,0,n,L,lo);
bet=max(bet,D[i] - X[i] - X[L] + X[R] + wst);
}
if(lo+1<=i-1){
int wst=seg1.query(1,0,n,lo+1,i-1);
bet=max(bet,D[i] + X[i] + wst);
}
}
ans=max(ans,bet);
vector<pi> vm1,vm2;
for(int i=0;i<=L;i++){
vm1.push_back({X[i]+D[i],i});
vm2.push_back({-X[i]+D[i],i});
}
sort(vm1.begin(),vm1.end(),greater<pi>());
sort(vm2.begin(),vm2.end(),greater<pi>());
for(int i=0;i<=min(1ll,(int)vm1.size()-1);i++){
for(int j=0;j<=min(1ll,(int)vm2.size()-1);j++){
if(vm1[i].second != vm2[j].second){
ans=max(ans,vm1[i].first+vm2[j].first);
}
}
}
vm1.clear();
vm2.clear();
for(int i=R;i<n;i++){
vm1.push_back({X[i]+D[i],i});
vm2.push_back({-X[i]+D[i],i});
}
sort(vm1.begin(),vm1.end(),greater<pi>());
sort(vm2.begin(),vm2.end(),greater<pi>());
for(int i=0;i<=min(1ll,(int)vm1.size()-1);i++){
for(int j=0;j<=min(1ll,(int)vm2.size()-1);j++){
if(vm1[i].second != vm2[j].second){
ans=max(ans,vm1[i].first+vm2[j].first);
}
}
}
return ans;
}
long long find_shortcut(int32_t n, vector<int32_t> l, vector<int32_t> d, int32_t c)
{
L=l;D=d;C=c;
::n=n;
for(int i=1;i<n;i++){
X[i]=X[i-1]+l[i-1];
}
int ans=oo;
for(int i=0;i<n;i++){
vector<int> vec;
for(int j=i+1;j<n;j++){
int res=get(i,j);
vec.push_back(res);
ans=min(ans,res);
}
}
return ans;
}
#ifdef LOCAL
int32_t main()
{
int32_t n, c;
assert(2 == scanf("%d%d", &n, &c));
std::vector<int32_t> l(n - 1);
std::vector<int32_t> d(n);
for (int i = 0; i < n - 1; i++)
assert(1 == scanf("%d", &l[i]));
for (int i = 0; i < n; i++)
assert(1 == scanf("%d", &d[i]));
long long t = find_shortcut(n, l, d, c);
printf("%lld\n", t);
return 0;
}
#endif
Compilation message
shortcut.cpp: In function 'long long int get(long long int, long long int)':
shortcut.cpp:55:6: warning: unused variable 'idx' [-Wunused-variable]
55 | int idx=L;
| ^~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
1116 KB |
n = 4, incorrect answer: jury 80 vs contestant 60 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
1116 KB |
n = 4, incorrect answer: jury 80 vs contestant 60 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
1116 KB |
n = 4, incorrect answer: jury 80 vs contestant 60 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
1116 KB |
n = 4, incorrect answer: jury 80 vs contestant 60 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
1116 KB |
n = 4, incorrect answer: jury 80 vs contestant 60 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
1116 KB |
n = 4, incorrect answer: jury 80 vs contestant 60 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
1116 KB |
n = 4, incorrect answer: jury 80 vs contestant 60 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
1116 KB |
n = 4, incorrect answer: jury 80 vs contestant 60 |
2 |
Halted |
0 ms |
0 KB |
- |