Submission #1138440

#TimeUsernameProblemLanguageResultExecution timeMemory
1138440poatHomecoming (BOI18_homecoming)C++17
0 / 100
80 ms82500 KiB
#include <bits/stdc++.h> #include "homecoming.h" using namespace std; const int NN = 2e6 + 5; long long pref[NN]; int arr[NN], brr[NN]; int n, k; int sup(int i) { if(i + k - 1 < n) return (pref[i + k - 1] - (i == 0 ? 0 : pref[i - 1])); return pref[n - 1] - pref[i - 1] + pref[k - (n - i) - 1]; } long long f(int i, int x, int y) { if(x == 0) return 0ll; if(y == 0) return (arr[i] - sup(i)); return arr[i] - brr[i]; } long long f2(int i, int x, int y) { if(y == 0) return 0ll; if(x == 0) return (arr[i] - sup(i)); return arr[i] - brr[(i + k - 1) % n]; } long long solve(int N, int K, int *A, int *B) { n = N, k = K; if(K == 1) { long long sum = 0; for(int i = 0; i < N; i++) sum += ((int) max(0, A[i] - B[i])); return sum; } for(int i = 0; i < N; i++) { arr[i] = A[i]; brr[i] = B[i]; } pref[0] = brr[0]; for(int i = 1; i < N; i++) pref[i] = pref[i - 1] + brr[i]; long long dp1[N][3][3], dp2[N][3][3]; for(int i = 0; i < N; i++) { for(int k2 = 0; k2 < 2; k2++) dp1[i][k2][0] = dp1[i][k2][1] = dp2[i][k2][0] = dp2[i][k2][1] = -1e15; } dp1[N - 1][0][0] = 0ll; dp1[N - 1][1][1] = arr[N - 1] - sup(N - 1); for(int i = N - 2; i >= 0; i--) { for(int p = 0; p < 2; p++) { for(int z = 0; z < 2; z++) { for(int h = 0; h < 2; h++) dp1[i][p][z] = max(dp1[i][p][z], dp1[i + 1][h][z] + f(i, p, h)); } } } // for(int i = 0; i < N; i++) // { // for(int p = 0; p < 2; p++) // cout << dp1[i][p][0] << ' ' << dp1[i][p][1] << ' '; // cout << '\n'; // } // exit(0); dp2[0][0][0] = 0; dp2[0][1][1] = arr[0] - sup(0); for(int i = 1; i < N; i++) { for(int p = 0; p < 2; p++) { for(int z = 0; z < 2; z++) { for(int h = 0; h < 2; h++) dp2[i][p][z] = max(dp2[i][p][z], dp2[i - 1][p][h] + f2(i, h, z)); } } } long long mx = 0; for(int i = 0; i < N; i++) mx += (arr[i] - brr[i]); mx = max({mx, dp1[0][0][0], dp1[0][0][1]}); for(int i = 1; i < N; i++) { int j = i - 1; for(int h = 0; h < 2; h++) { for(int z = 0; z < 2; z++) { for(int p = 0; p < 2; p++) { long long res = dp1[i][0][h] + dp2[j][z][p]; if(h && z && K > 1) res = res + pref[K - 2]; mx = max(mx, res); } } } } return mx; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...