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
| #include <bits/stdc++.h> using namespace std;
const int N = 2e5 + 10;
int n, m; int w[N]; struct node { int l, r; long long tmax, lmax, rmax, sum; } tr[N * 4];
void pushup(node &u, node &l, node &r) { u.sum = l.sum + r.sum; u.lmax = max(l.lmax, l.sum + r.lmax); u.rmax = max(r.rmax, r.sum + l.rmax); u.tmax = max(l.rmax + r.lmax, max(l.tmax, r.tmax)); }
void pushup(int u) { pushup(tr[u], tr[u << 1], tr[u << 1 | 1]); }
void build(int u, int l, int r) { if (l == r) tr[u] = {l, r, w[r], w[r], w[r], w[r]}; else { tr[u] = {l, r}; int mid = (l + r) >> 1; build(u << 1, l, mid); build(u << 1 | 1, mid + 1, r); pushup(u); } }
void modify(int u, int x, int v) { if (tr[u].l == x && tr[u].r == x) tr[u] = {x, x, v, v, v, v}; else { int mid = (tr[u].l + tr[u].r) >> 1; if (x <= mid) modify(u << 1, x, v); else modify(u << 1 | 1, x, v); pushup(u); } }
node query(int u, int l, int r) { if (tr[u].l >= l && tr[u].r <= r) return tr[u];
int mid = (tr[u].l + tr[u].r) >> 1; if (r <= mid) return query(u << 1, l, r); else if (l > mid) return query(u << 1 | 1, l, r); else { auto left = query(u << 1, l, r); auto right = query(u << 1 | 1, l, r); node res; pushup(res, left, right); return res; } }
int main() { ios::sync_with_stdio(false); cin.tie(nullptr);
int t; cin >> t;
while (t--) { int k, x; cin >> n >> k >> x;
if (x < 0) { x = -x; k = n - k; }
for (int i = 1; i <= n; i++) { cin >> w[i]; w[i] -= x; } x *= 2;
build(1, 1, n);
if (k == 0) { cout << max(0LL, query(1, 1, n).tmax) << "\n"; continue; }
for (int i = 1; i <= k - 1; i++) { modify(1, i, w[i] + x); }
long long ans = 0; for (int i = k; i <= n; i++) { if (i - k >= 1) { modify(1, i - k, w[i - k]); } modify(1, i, w[i] + x); ans = max(ans, query(1, 1, n).tmax); } cout << ans << "\n"; }
return 0; }
|