线段树9pts求助

P4513 小白逛公园

liwenxi114514 @ 2024-11-12 21:31:01

#include<bits/stdc++.h>
#define int long long
#define ls k<<1
#define rs k<<1|1
#define qmi int mid=(tree[k].l+tree[k].r)>>1
using namespace std;
int n,m,a[500005];
struct node{
    int l,r,w,ms=LONG_LONG_MIN,ml=LONG_LONG_MIN,mr=LONG_LONG_MIN;
}tree[2000005];
void build(int l,int r,int k){
    tree[k].l=l;
    tree[k].r=r;
    if(l==r){
        tree[k].w=tree[k].ms=tree[k].ml=tree[k].mr=a[l];
        return ;
    }
    qmi;
    build(l,mid,ls);
    build(mid+1,r,rs);
    if(tree[ls].mr<0&&tree[rs].ml<0){
        tree[k].ms=max(tree[ls].mr,tree[rs].ml);
    }else{
        tree[k].ms=tree[ls].mr*(tree[ls].mr>0)+tree[rs].ml*(tree[rs].ml>0);
    }
    tree[k].w=tree[ls].w+tree[rs].w;
    tree[k].ml=max(tree[ls].ml,tree[ls].w+tree[rs].ml);
    tree[k].mr=max(tree[rs].mr,tree[rs].w+tree[ls].mr);
    tree[k].ms=max(tree[k].ms,max(tree[ls].ms,tree[rs].ms));
}
void update(int p,int x,int k){
    if(tree[k].l==tree[k].r){
        tree[k].w=tree[k].ml=tree[k].mr=tree[k].ms=x;
        return ;
    }
    qmi;
    if(p<=mid){
        update(p,x,ls);
    }else{
        update(p,x,rs);
    }
    if(tree[ls].mr<0&&tree[rs].ml<0){
        tree[k].ms=max(tree[ls].mr,tree[rs].ml);
    }else{
        tree[k].ms=tree[ls].mr*(tree[ls].mr>0)+tree[rs].ml*(tree[rs].ml>0);
    }
    tree[k].w=tree[ls].w+tree[rs].w;
    tree[k].ml=max(tree[ls].ml,tree[ls].w+tree[rs].ml);
    tree[k].mr=max(tree[rs].mr,tree[rs].w+tree[ls].mr);
    tree[k].ms=max(tree[k].ms,max(tree[ls].ms,tree[rs].ms));
}
int query(int l,int r,int k){
    if(tree[k].l>=l&&tree[k].r<=r){
        return tree[k].ms;
    }
    qmi;
    int ans=LONG_LONG_MIN;
    if(l<=mid){
        ans=max(ans,query(l,r,ls));
    }
    if(r>mid){
        ans=max(ans,query(l,r,rs));
    }
    return ans;
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    build(1,n,1);
    while(m--){
        int k,l,r;
        cin>>k>>l>>r;
        if(k==1){
            if(l>r){
                swap(l,r);
            }
            cout<<query(l,r,1)<<"\n";
        }else{
            update(l,r,1);
        }
    }
    return 0;
}

by liwenxi114514 @ 2024-11-12 21:31:52

@tzhengqing

@tanzhengqing


by _cbw @ 2024-11-12 21:42:09

query 函数不正确。这题是非空最大子段和问题。


by imzfx_Square @ 2024-11-12 21:43:29

@liwenxi114514 这题的 query 不是这么写的罢。


by imzfx_Square @ 2024-11-12 21:44:45

可能会有横跨线段树上几个节点的


by tanzhengqing @ 2024-11-13 08:40:01

同意query出锅。

可以试试将 query 的返回值改成node.


|