线段树蜜汁RE求助

P4513 小白逛公园

Drind @ 2023-07-13 11:26:14

RT,只过了第一个点,其他的全部RE了

#include<bits/stdc++.h>
using namespace std;

struct segmenttree{
    long long sum,mx,mxl,mxr;
    int l,r;
}tree[5000001];
int a[5000001];

void pushup(int x){
    tree[x].mx=max(tree[x*2].mxr+tree[x*2+1].mxl,max(tree[x*2].mx,tree[x*2+1].mx));
    tree[x].mxl=max(tree[x*2].mxl,tree[x*2].sum+tree[x*2+1].mxl);
    tree[x].mxr=max(tree[x*2+1].mxr,tree[x*2+1].sum+tree[x*2].mxr);
    tree[x].sum=tree[x*2].sum+tree[x*2+1].sum;
}

void build(int x,int l,int r){
    tree[x].l=l;
    tree[x].r=r;
    if(l==r){
        tree[x].sum=tree[x].mxl=tree[x].mxr=tree[x].mx=a[l];
        return;
    }
    int mid=(l+r)/2;
    build(x*2,l,mid);
    build(x*2+1,mid+1,r);
    pushup(x);
}

void modify(int x,int pos,int v){
    if(tree[x].l==tree[x].r&&tree[x].l==pos){
        tree[x].sum=tree[x].mxl=tree[x].mxr=tree[x].mx=v;
        return;
    }
    int mid=(tree[x].l+tree[x].r)/2;
    if(mid>=pos) modify(x*2,pos,v);
    if(pos>mid) modify(x*2+1,pos,v);
    pushup(x);
}

segmenttree query(int x,int l,int r){
    if(tree[x].l>=l&&tree[x].r<=r){
        return tree[x];
    }
    int mid=(tree[x].l+tree[x].r)/2;
    segmenttree ans;
    if(mid>=r) return query(x*2,l,r);
    else if(l>mid) return query(x*2+1,l,r);
    else{
        segmenttree a=query(x*2,l,r),b=query(x*2+1,l,r);
        ans.mxl=max(a.mxl,a.sum+b.mxl);
        ans.mxr=max(b.mxr,b.sum+a.mxr);
        ans.mx=max(max(a.mx,b.mx),a.mxr+b.mxl);
    }
    return ans;
}

int main(){
    long long n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,1,n);
    for(int i=1;i<=m;i++){
        int opt;
        cin>>opt;
        if(opt==1){
            int l,r;
            cin>>l>>r;
            cout<<query(1,l,r).mx<<endl;
        }
        if(opt==2){
            int pos,val;
            cin>>pos>>val;
            modify(1,pos,val);
        }
    }
}

by fluoxetine_ @ 2023-07-13 11:33:22

测试数据可能会出现 a > b 的情况,需要进行交换。。

姐姐注意读题昂


|