Submission #63462

#TimeUsernameProblemLanguageResultExecution timeMemory
63462ksun48Homecoming (BOI18_homecoming)C++14
100 / 100
816 ms163640 KiB
#include <bits/stdc++.h> using namespace std; typedef long long LL; const LL reallybad = -10000000000000000LL; LL test(int n, int k, vector<LL> a, vector<LL> b, int x){ LL ans = reallybad; vector<LL> newa; vector<LL> newb; vector<LL> bpsums(1,0); for(int i = 0; i < n; i++){ newa.push_back(a[(i+x) % n]); newb.push_back(b[(i+x) % n]); } for(int i = 0; i < n; i++){ bpsums.push_back(bpsums[i] + newb[i]); } for(int y = 0; y < 2; y++){ vector<LL> dp0(n+1, reallybad); vector<LL> dp1(n+1, reallybad); if(y == 0) dp0[0] = 0; if(y == 1) dp1[0] = 0; for(int i = 0; i <= n; i++){ dp1[i] = max(dp1[i], dp0[i]); if(i + 1 <= n){ dp0[i+1] = max(dp0[i+1], dp0[i]); dp1[i+1] = max(dp1[i+1], dp1[i] + newa[i] - newb[i]); } if(i + k <= n){ dp0[i+k] = max(dp0[i+k], dp1[i] - bpsums[i+k] + bpsums[i]); } } if(y == 0) ans = max(ans, dp0[n]); if(y == 1) ans = max(ans, dp1[n]); } return ans; } long long solve(int N, int K, int *A, int *B){ int n = N; int k = K; k--; vector<LL> a, b; for(int i = 0; i < n; i++){ a.push_back(A[i]); b.push_back(B[i]); } LL ans = 0; if(k == 0){ for(int i = 0; i < n; i++){ if(a[i] >= b[i]){ ans += a[i] - b[i]; } } return ans; } LL best = 0; LL bestidx = 0; LL sum = 0; for(int i = 0; i < k; i++){ sum += a[i] - b[i]; if(sum > best){ best = sum; bestidx = i; } } ans = max(ans, test(n, k, a, b, 0)); ans = max(ans, test(n, k, a, b, k)); ans = max(ans, test(n, k, a, b, bestidx)); 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...