求大佬看一下G,想死了已经
#include<bits/stdc++.h> #define endl '\n' using ll = long long; using namespace std; int n, p; struct book { ll val, lz; }; const int N = 5e5 + 10; vector<ll> a(N), tree_sum(4 * N), sums(N, 0); vector<book> tree_ans(4 * N); void built_sum(int l, int r, int q)//建前缀和树 { if (l == r){ tree_sum[q] = a[l]; return; } int mid = l + r >> 1; built_sum(l, mid, q * 2); built_sum(mid + 1, r, q * 2 + 1); tree_sum[q] = tree_sum[q * 2] + tree_sum[q * 2 + 1]; } ll query_sum(int x, int y, int l, int r, int q)//查询前缀和树 { if (x <= l && y >= r){ return tree_sum[q]; } int mid = l + r >> 1; ll res = 0; if (x <= mid) res += query_sum(x, y, l, mid, q * 2); if (y > mid) res += query_sum(x, y, mid + 1, r, q * 2 + 1); return res; } void built_ans(int l, int r, int q) { if (l == r){ tree_ans[q].val = sums[l] - 2 * a[l]; return; } int mid = l + r >> 1; built_ans(l, mid, q * 2); built_ans(mid + 1, r, q * 2 + 1); tree_ans[q].val = max(tree_ans[q * 2].val, tree_ans[q * 2 + 1].val); } ll query_ans(int x, int y, int l, int r, int q) { if (x <= l && y >= r){ return tree_ans[q].val; } tree_ans[q * 2].val += tree_ans[q].lz; tree_ans[q * 2 + 1].val += tree_ans[q].lz; tree_ans[q * 2].lz += tree_ans[q].lz; tree_ans[q * 2 + 1].lz += tree_ans[q].lz; tree_ans[q].lz = 0; int mid = l + r >> 1; ll res = -1000000000; if (x <= mid) res = max(res, query_ans(x, y, l, mid, q * 2)); if (y > mid) res = max(res, query_ans(x, y, mid + 1, r, q * 2 + 1)); return res; } void change_sum(int x, int y, int l, int r, int q) { if (l == r && l == x){ tree_sum[q] = y; return; } int mid = l + r >> 1; if (x <= mid) change_sum(x, y, l, mid, q * 2); else if(x > mid) change_sum(x, y, mid + 1, r, q * 2 + 1); tree_sum[q] = tree_sum[q * 2] + tree_sum[q * 2 + 1]; } void change(int x, int y, int l, int r, int d, int q)//修改x + 1到n的值 { if (x <= l && y >= r){ tree_ans[q].val += d; tree_ans[q].lz += d; return; } tree_ans[q * 2].val += tree_ans[q].lz; tree_ans[q * 2 + 1].val += tree_ans[q].lz; tree_ans[q * 2].lz += tree_ans[q].lz; tree_ans[q * 2 + 1].lz += tree_ans[q].lz; tree_ans[q].lz = 0; ll mid = l + r >> 1; ll res = 0; if (x <= mid) change(x, y, l, mid, d, 2 * q); if (y > mid) change(x, y, mid + 1, r, d, 2 * q + 1); tree_ans[q].val = max(tree_ans[2 * q].val, tree_ans[2 * q + 1].val); } void change_ans(int x, int y, int l, int r, int q)//单点修改剩下的第x个点 { if (l == r && l == x){ tree_ans[q].val = query_sum(1, x, 1, n, 1) - 2 * y; return; } tree_ans[q * 2].val += tree_ans[q].lz; tree_ans[q * 2 + 1].val += tree_ans[q].lz; tree_ans[q * 2].lz += tree_ans[q].lz; tree_ans[q * 2 + 1].lz += tree_ans[q].lz; tree_ans[q].lz = 0; int mid = l + r >> 1; if (x <= mid) change_ans(x, y, l, mid, q * 2); else if (x > mid) change_ans(x, y, mid + 1, r, q * 2 + 1); tree_ans[q].val = max(tree_ans[q * 2].val, tree_ans[q * 2 + 1].val); } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int T; cin >> T; while(T--) { cin >> n >> p; for (int i = 1; i <= n; i++){ cin >> a[i]; sums[i] += a[i] + sums[i - 1]; } built_sum(1, n, 1); built_ans(1, n, 1); while(p--) { ll f, x, y; cin >> f >> x >> y; if (f == 1){ change_sum(x, y, 1, n, 1); //change(x, x, 1, n, a[x] - y, 1); if (x + 1 <= n) change(x + 1, n, 1, n, y - a[x], 1); change_ans(x, y, 1, n, 1); a[x] = y; } else cout << query_ans(x + 1, y, 1, n, 1) - query_sum(1, x - 1, 1, n, 1) << endl; } for (int i = 1; i <= n; i++){ tree_ans[i] = {-1000000000, 0}; tree_sum[i] = 0; a[i] = 0; sums[i] = 0; } } }
求求了,爆内存了37.5%
全部评论
(1) 回帖