Submission #1031641

#TimeUsernameProblemLanguageResultExecution timeMemory
1031641pccShortcut (IOI16_shortcut)C++17
0 / 100
14 ms1372 KiB
#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(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 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]); } long long find_shortcut(int n, std::vector<int> l, std::vector<int> d, int c){ 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(); ll ans = inf; for(int i = 0;i<N;i++){ for(int j = 0;j<=i;j++){ dp[j][i] = calc(j,i); ans = min(ans,dp[j][i]); } } for(int i = 1;i<N;i++){ for(int j = 0;j<i;j++){ if(dp[trans[i]][i]<=dp[j][i])trans[i] = j; } } for(int i = 1;i<N;i++){ assert(trans[i] >= trans[i-1]); } return ans; }

Compilation message (stderr)

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:43:5: warning: unused variable 're' [-Wunused-variable]
   43 |  ll re = 0;
      |     ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...