제출 #60918

#제출 시각아이디문제언어결과실행 시간메모리
60918spencercomptonHomecoming (BOI18_homecoming)C++14
62 / 100
1068 ms78836 KiB
#include <bits/stdc++.h> #include "homecoming.h" using namespace std; typedef long long ll; ll pre[4000001]; long long int solve(int N, int K, int *A, int *B){ ll ans = 0LL; for(int z = 0; z<=K; z++){ ll here = 0LL; for(int i = 0; i<z; i++){ here -= B[i]; } pre[0] = 0LL; for(int i = 1; i<=N; i++){ if(i<=z){ pre[i] = 0LL; pre[i+N] = 0LL; } else{ pre[i] = B[i-1]; pre[i+N] = B[i-1]; } } for(int i = 1; i<=2*N; i++){ pre[i] += pre[i-1]; } ll f[N]; //choosing to buy whole thing ll g[N]; //choosing to add last one //[i,i+K-1] for(int i = N-1; i>=0; i--){ f[i] = 0; g[i] = 0; //F ll takeF = pre[i+K] - pre[i]; takeF = -takeF; takeF += A[i]; if(i<N-1){ takeF += g[i+1]; } f[i] = max(f[i],takeF); if(i<N-1){ f[i] = max(f[i],f[i+1]); } //G int aft = i+K-1; int ind = aft; if(ind>=N){ ind -= N; } //take it ll takeG = A[i]; if(ind>=z){ takeG -= B[ind]; } if(i<N-1){ takeG += g[i+1]; } g[i] = max(takeG,g[i]); if(aft+1<N){ g[i] = max(g[i],f[aft+1]); } } here += f[0]; ans = max(ans,here); } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...