竞赛讨论区 > 求大佬看一下G
头像
Duanzishou134
发布于 02-15 20:57
+ 关注

求大佬看一下G

求大佬看一下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) 回帖
加载中...
话题 回帖