#include<bits/stdc++.h> #define fi first #define se second #define pb push_back using namespace std; long long oddz[300009], tab[300009], dp[300009], opt[300009], in_opt[300009]; long long n, k, q; vector<vector<long long> > ans; void cnt_opt() { for(int i=1; i<=n; i++) { if(i >= k) opt[i] = max(opt[i-1], opt[i-k] + oddz[i-k+1]); else dp[i] = opt[i-1]; } int a = n, b = opt[n], c = n; while(a >= 1) { if(opt[a] == opt[a-1]) a--; else { c = a - k + 1; in_opt[c] = 2; in_opt[a] = 3; b = opt[c-1]; opt[c] = b; c++; while(c < a) { opt[c] = b; in_opt[c] = 1; c++; } a = a - k; } } return; } void count_queries() { long long a = 0, b; for(int i=1; i<=n; i++) { cin>>b; tab[i] = b; a += b; if(i >= k) { oddz[i - k + 1] = a; a -= tab[i - k + 1]; } } cnt_opt(); for(int i=1; i<=q; i++) { cin>>a>>b; if(b - a + 1 < k) { cout<<0<<"\n"; continue; } if((in_opt[a] == 0 || in_opt[a] == 2) && (in_opt[b] == 0 || in_opt[b] == 3)) { cout<<opt[b] - opt[a-1]<<"\n"; continue; } dp[a-1] = 0; for(int j=a; j<=b; j++) { if(j >= a + k - 1) dp[j] = max(dp[j-1], dp[j-k] + oddz[j-k+1]); else dp[j] = dp[j-1]; } cout<<dp[b]<<"\n"; } return; } void square() { long long a, b; ans.resize(n+3); for(int i=0; i<=n; i++) ans[i].resize(n+3, 0); for(int i=1; i<=n; i++) cin>>tab[i]; for(int i=1; i<=n; i++) { a = 0; for(int j=i; j<=n; j++) { a += tab[j]; if(j >= i + k - 1) { ans[i][j] = max(ans[i][j-1], ans[i][j-k] + a); a -= tab[j - k + 1]; } else ans[i][j] = ans[i][j-1]; } } for(int i=1; i<=q; i++) { cin>>a>>b; cout<<ans[a][b]<<"\n"; } return; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>k>>q; if(q < n || n > 5000) count_queries(); else square(); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | #include<bits/stdc++.h> #define fi first #define se second #define pb push_back using namespace std; long long oddz[300009], tab[300009], dp[300009], opt[300009], in_opt[300009]; long long n, k, q; vector<vector<long long> > ans; void cnt_opt() { for(int i=1; i<=n; i++) { if(i >= k) opt[i] = max(opt[i-1], opt[i-k] + oddz[i-k+1]); else dp[i] = opt[i-1]; } int a = n, b = opt[n], c = n; while(a >= 1) { if(opt[a] == opt[a-1]) a--; else { c = a - k + 1; in_opt[c] = 2; in_opt[a] = 3; b = opt[c-1]; opt[c] = b; c++; while(c < a) { opt[c] = b; in_opt[c] = 1; c++; } a = a - k; } } return; } void count_queries() { long long a = 0, b; for(int i=1; i<=n; i++) { cin>>b; tab[i] = b; a += b; if(i >= k) { oddz[i - k + 1] = a; a -= tab[i - k + 1]; } } cnt_opt(); for(int i=1; i<=q; i++) { cin>>a>>b; if(b - a + 1 < k) { cout<<0<<"\n"; continue; } if((in_opt[a] == 0 || in_opt[a] == 2) && (in_opt[b] == 0 || in_opt[b] == 3)) { cout<<opt[b] - opt[a-1]<<"\n"; continue; } dp[a-1] = 0; for(int j=a; j<=b; j++) { if(j >= a + k - 1) dp[j] = max(dp[j-1], dp[j-k] + oddz[j-k+1]); else dp[j] = dp[j-1]; } cout<<dp[b]<<"\n"; } return; } void square() { long long a, b; ans.resize(n+3); for(int i=0; i<=n; i++) ans[i].resize(n+3, 0); for(int i=1; i<=n; i++) cin>>tab[i]; for(int i=1; i<=n; i++) { a = 0; for(int j=i; j<=n; j++) { a += tab[j]; if(j >= i + k - 1) { ans[i][j] = max(ans[i][j-1], ans[i][j-k] + a); a -= tab[j - k + 1]; } else ans[i][j] = ans[i][j-1]; } } for(int i=1; i<=q; i++) { cin>>a>>b; cout<<ans[a][b]<<"\n"; } return; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>k>>q; if(q < n || n > 5000) count_queries(); else square(); return 0; } |