【在线认义父】大家好,我是JS小糖人
查看原帖
【在线认义父】大家好,我是JS小糖人
1114241
vectorxyz楼主2025/7/12 17:23

qwq孩子破防了,求条,样例的第二行输出7。思路按照https://www.luogu.com.cn/article/h5e8lcdu 这篇题解写的,但是代码和他写的不一样,拼尽全力无法战胜,在线认义父。

#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 5;
int a[N];
struct SegmentTree
{
    struct node
    {
        int l, r, sum;
        int ans, pre, suf;
    }tr[N * 4];
    void pushup(int u){
        tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
        tr[u].ans = max(max(tr[u << 1].ans, tr[u].ans), max(tr[u << 1 | 1].ans, tr[u << 1].suf + tr[u << 1 | 1].pre));
        tr[u].pre = max(tr[u << 1].pre, tr[u << 1].sum + tr[u << 1 | 1].pre);
        tr[u].suf = max(tr[u << 1 | 1].suf, tr[u << 1 | 1].sum + tr[u << 1].suf);
    }
    void build(int u, int l, int r){
        tr[u].l = l, tr[u].r = r; tr[u].sum = tr[u].pre = tr[u].ans = tr[u].suf = 0;
        if(l == r){
            tr[u].sum = tr[u].ans = tr[u].pre = tr[u].suf = a[l];
            return;
        }
        int mid = (l + r) / 2;
        build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
        pushup(u);
    }
    void update(int u, int x, int k){
        if(tr[u].l == tr[u].r) {
            tr[u].sum = tr[u].ans = tr[u].pre = tr[u].suf = k;
            return ;
        }
        int mid = (tr[u].l + tr[u].r) / 2;
        if(x <= mid) update(u << 1, x, k);
        else update(u << 1 | 1, x, k);
        pushup(u);
    }
    node query(int u, int l, int r){
        if(l <= tr[u].l && tr[u].r <= r){
            return tr[u];
        }
        int mid = (tr[u].l + tr[u].r) / 2;
        if(l <= mid && r > mid){
            node lson = query(u << 1, l, r);
            node rson = query(u << 1 | 1, l, r), res;
            res.sum = lson.sum + rson.sum;
            res.ans = max(lson.ans, rson.ans);
            res.ans = max(res.ans, lson.suf + rson.pre);
            res.pre = max(lson.sum + rson.pre, lson.pre);
            res.suf = max(rson.sum + lson.suf, rson.suf);
            return res;
        }
        else {
            if(l <= mid) return query(u << 1, l, r);
            if(r >  mid) return query(u << 1 | 1, l, r);
        }
    }
}seg;
int main()
{
    int n; cin >> n; 
    for(int i = 1;i <= n;i ++ ) cin >> a[i];
    seg.build(1, 1, n);
    int q; cin >> q;
    while(q -- ){
        int k; cin >>k;
        int l, r ; cin >> l >> r;
        if(k == 0) seg.update(1, l, r);
        else cout << seg.query(1, l, r).ans << endl;
    }
    return 0;
}
2025/7/12 17:23
加载中...