#include <cassert> #include <iostream> #include <vector> #include <algorithm> using namespace std; typedef long long ll; struct Query{ int l,r,id; ll result; }; void just_brute_force(int n, int k, const vector<ll>&Seq, vector<Query>&Q) { for (Query &q : Q) { if (q.r < q.l) { q.result = 0; continue; } vector<ll>dp(q.r-q.l+1); auto get_dp = [&](int i) { i -= q.l; return i>=0 ? dp[i] : 0; }; for (int i=q.l; i<=q.r; i++) dp[i-q.l] = max(get_dp(i-1), Seq[i]+get_dp(i-k)); q.result = get_dp(q.r); } } void n_squared(int n, int k, const vector<ll>&Seq, vector<Query>&Q) { sort(Q.begin(), Q.end(), [&](const Query &q1, const Query &q2){ if (q1.l != q2.l) return q1.l < q2.l; return q1.r < q2.r; }); int qit = 0; vector<ll>dp(n); for (int a=0; a<n; a++) { if (qit == Q.size() || Q[qit].l > a) continue; while (qit < Q.size() && Q[qit].r < Q[qit].l) Q[qit++].result = 0; if (qit == Q.size() || Q[qit].l > a) continue; auto get_dp = [&](int i) {return i>=a ? dp[i] : 0;}; for (int b=0; ; ) { dp[b] = max(get_dp(b-1), Seq[b]+get_dp(b-k)); if (Q[qit].r == b) { Q[qit++].result = dp[b]; if (qit == Q.size() || Q[qit].l > a) break; } else b++; } } sort(Q.begin(), Q.end(), [&](const Query &q1, const Query &q2){return q1.id<q2.id;}); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n,k,q; cin >> n >> k >> q; vector<ll>ISeq(n); for (ll &x : ISeq) cin >> x; vector<ll>Seq; ll sum = 0; for (int i=0;i<k-1;i++) sum += ISeq[i]; for(int i=k-1;i<n;i++) { sum += ISeq[i]; Seq.push_back(sum); sum -= ISeq[i-k+1]; } vector<Query>Q(q); for(int i=0;i<q;i++) { Query &qq = Q[i]; cin >> qq.l >> qq.r; qq.l--; qq.r--; qq.r -= k-1; qq.id = i; } // if (ll(n)*ll(n) < 2000000000ll) n_squared(Seq.size(), k, Seq, Q); // else // just_brute_force(Seq.size(), k, Seq, Q); for (Query &qq : Q) cout << qq.result << "\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 | #include <cassert> #include <iostream> #include <vector> #include <algorithm> using namespace std; typedef long long ll; struct Query{ int l,r,id; ll result; }; void just_brute_force(int n, int k, const vector<ll>&Seq, vector<Query>&Q) { for (Query &q : Q) { if (q.r < q.l) { q.result = 0; continue; } vector<ll>dp(q.r-q.l+1); auto get_dp = [&](int i) { i -= q.l; return i>=0 ? dp[i] : 0; }; for (int i=q.l; i<=q.r; i++) dp[i-q.l] = max(get_dp(i-1), Seq[i]+get_dp(i-k)); q.result = get_dp(q.r); } } void n_squared(int n, int k, const vector<ll>&Seq, vector<Query>&Q) { sort(Q.begin(), Q.end(), [&](const Query &q1, const Query &q2){ if (q1.l != q2.l) return q1.l < q2.l; return q1.r < q2.r; }); int qit = 0; vector<ll>dp(n); for (int a=0; a<n; a++) { if (qit == Q.size() || Q[qit].l > a) continue; while (qit < Q.size() && Q[qit].r < Q[qit].l) Q[qit++].result = 0; if (qit == Q.size() || Q[qit].l > a) continue; auto get_dp = [&](int i) {return i>=a ? dp[i] : 0;}; for (int b=0; ; ) { dp[b] = max(get_dp(b-1), Seq[b]+get_dp(b-k)); if (Q[qit].r == b) { Q[qit++].result = dp[b]; if (qit == Q.size() || Q[qit].l > a) break; } else b++; } } sort(Q.begin(), Q.end(), [&](const Query &q1, const Query &q2){return q1.id<q2.id;}); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n,k,q; cin >> n >> k >> q; vector<ll>ISeq(n); for (ll &x : ISeq) cin >> x; vector<ll>Seq; ll sum = 0; for (int i=0;i<k-1;i++) sum += ISeq[i]; for(int i=k-1;i<n;i++) { sum += ISeq[i]; Seq.push_back(sum); sum -= ISeq[i-k+1]; } vector<Query>Q(q); for(int i=0;i<q;i++) { Query &qq = Q[i]; cin >> qq.l >> qq.r; qq.l--; qq.r--; qq.r -= k-1; qq.id = i; } // if (ll(n)*ll(n) < 2000000000ll) n_squared(Seq.size(), k, Seq, Q); // else // just_brute_force(Seq.size(), k, Seq, Q); for (Query &qq : Q) cout << qq.result << "\n"; return 0; } |