#include <bits/stdc++.h> #define rep(i, a, b) for (int i = a; i <= b; i++) #define per(i, a, b) for (int i = b; a <= i; i--) #define cat(x) cerr << #x << " = " << x << '\n'; using ll = long long; using namespace std; const int N = 300300; const int M = 10000; struct query { int l, r, id; }; int n, k, q; ll s[N], Ls[N], Rs[N], res[N], dpL[N], dpR[N], dp[M + 1][M + 1]; vector<query> vq; void solve(int l, int r, vector<query> v) { if (v.empty()) return; int m = (l + r) / 2; vector<query> L, M, R; for (auto q : v) { if (q.r < m) L.push_back(q); else if (q.l > m) R.push_back(q); else M.push_back(q); } solve(l, m, L); solve(m + 1, r, R); if (M.empty()) return; auto fooL = [&](int x) { dpL[x + 1] = 0; for (int i = x; i >= l; i--) { dpL[i] = dpL[i + 1]; if (i + k <= x + 1) dpL[i] = max(dpL[i], dpL[i + k] + Ls[i]); } }; auto fooR = [&](int x) { dpR[x - 1] = 0; for (int i = x; i <= r; i++) { dpR[i] = dpR[i - 1]; if (x - 1 <= i - k) dpR[i] = max(dpR[i], dpR[i - k] + Rs[i]); } }; fooL(m); fooR(m + 1); for (auto q : M) res[q.id] = dpL[q.l] + dpR[q.r]; for (int i = l; i <= m; i++) { int j = i + k - 1; if (m < j && j <= r) { fooL(i - 1); fooR(j + 1); for (auto q : M) if (q.l <= i && j <= q.r) res[q.id] = max(res[q.id], Ls[i] + dpL[q.l] + dpR[q.r]); } } } int main() { cin.tie(0)->sync_with_stdio(0); cin >> n >> k >> q; rep(i, 1, n) { cin >> s[i]; s[i] += s[i - 1]; } rep(i, 1, n - k + 1) Ls[i] = s[i + k - 1] - s[i - 1]; rep(i, k, n) Rs[i] = s[i] - s[i - k]; rep(i, 1, q) { int l, r; cin >> l >> r; vq.push_back({l, r, i}); } if (n > M) { solve(1, n, vq); } else { rep(i, 1, n) rep(j, i + k - 1, n) dp[i][j] = max(dp[i][j - 1], dp[i][j - k] + Rs[j]); for (auto q : vq) res[q.id] = dp[q.l][q.r]; } rep(i, 1, q) cout << res[i] << '\n'; 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 | #include <bits/stdc++.h> #define rep(i, a, b) for (int i = a; i <= b; i++) #define per(i, a, b) for (int i = b; a <= i; i--) #define cat(x) cerr << #x << " = " << x << '\n'; using ll = long long; using namespace std; const int N = 300300; const int M = 10000; struct query { int l, r, id; }; int n, k, q; ll s[N], Ls[N], Rs[N], res[N], dpL[N], dpR[N], dp[M + 1][M + 1]; vector<query> vq; void solve(int l, int r, vector<query> v) { if (v.empty()) return; int m = (l + r) / 2; vector<query> L, M, R; for (auto q : v) { if (q.r < m) L.push_back(q); else if (q.l > m) R.push_back(q); else M.push_back(q); } solve(l, m, L); solve(m + 1, r, R); if (M.empty()) return; auto fooL = [&](int x) { dpL[x + 1] = 0; for (int i = x; i >= l; i--) { dpL[i] = dpL[i + 1]; if (i + k <= x + 1) dpL[i] = max(dpL[i], dpL[i + k] + Ls[i]); } }; auto fooR = [&](int x) { dpR[x - 1] = 0; for (int i = x; i <= r; i++) { dpR[i] = dpR[i - 1]; if (x - 1 <= i - k) dpR[i] = max(dpR[i], dpR[i - k] + Rs[i]); } }; fooL(m); fooR(m + 1); for (auto q : M) res[q.id] = dpL[q.l] + dpR[q.r]; for (int i = l; i <= m; i++) { int j = i + k - 1; if (m < j && j <= r) { fooL(i - 1); fooR(j + 1); for (auto q : M) if (q.l <= i && j <= q.r) res[q.id] = max(res[q.id], Ls[i] + dpL[q.l] + dpR[q.r]); } } } int main() { cin.tie(0)->sync_with_stdio(0); cin >> n >> k >> q; rep(i, 1, n) { cin >> s[i]; s[i] += s[i - 1]; } rep(i, 1, n - k + 1) Ls[i] = s[i + k - 1] - s[i - 1]; rep(i, k, n) Rs[i] = s[i] - s[i - k]; rep(i, 1, q) { int l, r; cin >> l >> r; vq.push_back({l, r, i}); } if (n > M) { solve(1, n, vq); } else { rep(i, 1, n) rep(j, i + k - 1, n) dp[i][j] = max(dp[i][j - 1], dp[i][j - k] + Rs[j]); for (auto q : vq) res[q.id] = dp[q.l][q.r]; } rep(i, 1, q) cout << res[i] << '\n'; return 0; } |