#include "shortcut.h"
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC taget("avx2,popcnt,sse4")
#define pll pair<ll,ll>
#define fs first
#define sc second
#define pii pair<int,int>
#define ll long long
#define DEBUG(T) cerr<<#T<<":"<<T<<endl;
const ll inf = 1e18;
const int mxn = 3030;
ll pref[mxn];
ll arr[mxn];
int C,N;
int trans[mxn];
ll dp[mxn][mxn];
ll P[mxn],S[mxn];
ll pans[mxn],sans[mxn];
ll brr[mxn];
ll chain(ll R,int s,int e){
return pref[e]-pref[s]+brr[e]+brr[s];
}
ll cycle(ll R,int s,int e){
return R+C-(pref[e]-pref[s])+brr[s]+brr[e];
}
ll calc(int a,int b){
if(dp[a][b] != -1)return dp[a][b];
if(a == b)return pans[N-1];
for(int i = a;i<=b;i++)brr[i] = arr[i];
brr[a] = P[a],brr[b] = S[b];
ll ans = *max_element(brr+a,brr+b+1);
ans = max({ans,pans[a],sans[b]});
ll cyc = -inf;
ll R = pref[b]-pref[a];
ll re = 0;
int ptr = a;
multiset<ll> st;
st.insert(-inf);
for(int i = a;i<=b;i++){
while(ptr<i&&cycle(R,ptr,i)<chain(R,ptr,i)){
st.erase(st.find(brr[ptr]-pref[ptr]));
cyc = max(cyc,brr[ptr]+pref[ptr]);
ptr++;
}
ll chn = *st.rbegin();
ans = max({ans,pref[i]+brr[i]+chn,cyc+brr[i]-pref[i]+R+C});
st.insert(brr[i]-pref[i]);
}
return dp[a][b] = ans;
}
void init(){
ll pp = -inf;
for(int i = 0;i<N;i++){
pans[i] = arr[i];
if(i)pans[i] = max(pans[i],pans[i-1]);
pans[i] = max(pans[i],arr[i]+pref[i]+pp);
pp = max(pp,-pref[i]+arr[i]);
}
pp = -inf;
for(int i = N-1;i>=0;i--){
sans[i] = arr[i];
if(i != N-1)sans[i] = max(sans[i],sans[i+1]);
sans[i] = max(sans[i],arr[i]-pref[i]+pp);
pp = max(pp,pref[i]+arr[i]);
}
P[0] = arr[0];S[N-1] = arr[N-1];
for(int i = 1;i<N;i++)P[i] = max(P[i-1]+pref[i]-pref[i-1],arr[i]);
for(int i = N-2;i>=0;i--)S[i] = max(S[i+1]+pref[i+1]-pref[i],arr[i]);
}
ll dc(int tl,int tr,int l,int r){
int mid = (l+r)>>1;
assert(tl<=mid);
int good = tl;
for(int i = tl;i<=min(mid,tr);i++){
if(calc(good,mid)>=calc(i,mid))good = max(good,i);
}
ll re = calc(good,mid);
if(l != mid)re = min(re,dc(tl,good,l,mid-1));
if(mid != r)re = min(re,dc(good,tr,mid+1,r));
return re;
}
long long find_shortcut(int n, std::vector<int> l, std::vector<int> d, int c){
memset(dp,-1,sizeof(dp));
N = n,C = c;
for(int i = 0;i<N;i++)arr[i] = d[i];
for(int i = 0;i+1<N;i++){
pref[i+1] = pref[i]+l[i];
}
init();
return dc(0,N-1,0,N-1);
}
Compilation message
shortcut.cpp:6: warning: ignoring '#pragma GCC taget' [-Wunknown-pragmas]
6 | #pragma GCC taget("avx2,popcnt,sse4")
|
shortcut.cpp: In function 'long long int calc(int, int)':
shortcut.cpp:44:5: warning: unused variable 're' [-Wunused-variable]
44 | ll re = 0;
| ^~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
32 ms |
72272 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
32 ms |
72164 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
32 ms |
72296 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
32 ms |
72292 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
32 ms |
72288 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
36 ms |
72272 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
37 ms |
72276 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
32 ms |
72224 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
31 ms |
72284 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
32 ms |
72284 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
34 ms |
72272 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
33 ms |
72280 KB |
n = 3, 3000000000 is a correct answer |
13 |
Incorrect |
33 ms |
72284 KB |
n = 3, incorrect answer: jury 3000000000 vs contestant 4000000000 |
14 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
32 ms |
72272 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
32 ms |
72164 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
32 ms |
72296 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
32 ms |
72292 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
32 ms |
72288 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
36 ms |
72272 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
37 ms |
72276 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
32 ms |
72224 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
31 ms |
72284 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
32 ms |
72284 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
34 ms |
72272 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
33 ms |
72280 KB |
n = 3, 3000000000 is a correct answer |
13 |
Incorrect |
33 ms |
72284 KB |
n = 3, incorrect answer: jury 3000000000 vs contestant 4000000000 |
14 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
32 ms |
72272 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
32 ms |
72164 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
32 ms |
72296 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
32 ms |
72292 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
32 ms |
72288 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
36 ms |
72272 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
37 ms |
72276 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
32 ms |
72224 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
31 ms |
72284 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
32 ms |
72284 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
34 ms |
72272 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
33 ms |
72280 KB |
n = 3, 3000000000 is a correct answer |
13 |
Incorrect |
33 ms |
72284 KB |
n = 3, incorrect answer: jury 3000000000 vs contestant 4000000000 |
14 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
32 ms |
72272 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
32 ms |
72164 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
32 ms |
72296 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
32 ms |
72292 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
32 ms |
72288 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
36 ms |
72272 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
37 ms |
72276 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
32 ms |
72224 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
31 ms |
72284 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
32 ms |
72284 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
34 ms |
72272 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
33 ms |
72280 KB |
n = 3, 3000000000 is a correct answer |
13 |
Incorrect |
33 ms |
72284 KB |
n = 3, incorrect answer: jury 3000000000 vs contestant 4000000000 |
14 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
32 ms |
72272 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
32 ms |
72164 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
32 ms |
72296 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
32 ms |
72292 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
32 ms |
72288 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
36 ms |
72272 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
37 ms |
72276 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
32 ms |
72224 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
31 ms |
72284 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
32 ms |
72284 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
34 ms |
72272 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
33 ms |
72280 KB |
n = 3, 3000000000 is a correct answer |
13 |
Incorrect |
33 ms |
72284 KB |
n = 3, incorrect answer: jury 3000000000 vs contestant 4000000000 |
14 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
32 ms |
72272 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
32 ms |
72164 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
32 ms |
72296 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
32 ms |
72292 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
32 ms |
72288 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
36 ms |
72272 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
37 ms |
72276 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
32 ms |
72224 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
31 ms |
72284 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
32 ms |
72284 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
34 ms |
72272 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
33 ms |
72280 KB |
n = 3, 3000000000 is a correct answer |
13 |
Incorrect |
33 ms |
72284 KB |
n = 3, incorrect answer: jury 3000000000 vs contestant 4000000000 |
14 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
32 ms |
72272 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
32 ms |
72164 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
32 ms |
72296 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
32 ms |
72292 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
32 ms |
72288 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
36 ms |
72272 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
37 ms |
72276 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
32 ms |
72224 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
31 ms |
72284 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
32 ms |
72284 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
34 ms |
72272 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
33 ms |
72280 KB |
n = 3, 3000000000 is a correct answer |
13 |
Incorrect |
33 ms |
72284 KB |
n = 3, incorrect answer: jury 3000000000 vs contestant 4000000000 |
14 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
32 ms |
72272 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
32 ms |
72164 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
32 ms |
72296 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
32 ms |
72292 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
32 ms |
72288 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
36 ms |
72272 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
37 ms |
72276 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
32 ms |
72224 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
31 ms |
72284 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
32 ms |
72284 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
34 ms |
72272 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
33 ms |
72280 KB |
n = 3, 3000000000 is a correct answer |
13 |
Incorrect |
33 ms |
72284 KB |
n = 3, incorrect answer: jury 3000000000 vs contestant 4000000000 |
14 |
Halted |
0 ms |
0 KB |
- |