线段树萌新求助,全部输出零

P4513 小白逛公园

银杉水杉秃杉 @ 2020-12-04 12:32:11

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,m;
int a[N];
struct node
{
    int sum,maxx,lmax,rmax;
}tree[N<<2];
void pushup(node rt,const node &ls,const node &rs)
{
    rt.sum=ls.sum+rs.sum;
    rt.maxx=max(max(ls.maxx,rs.maxx),ls.rmax+rs.lmax);
    rt.lmax=max(ls.lmax,ls.sum+rs.lmax);
    rt.rmax=max(rs.rmax,rs.sum+ls.rmax);
}
void build(int k,int l,int r)
{
    if (l==r)
    {
        tree[k].sum=tree[k].lmax=tree[k].rmax=tree[k].maxx=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(k<<1,l,mid);
    build(k<<1|1,mid+1,r);
    pushup(tree[k],tree[k<<1],tree[k<<1|1]);
}
void change(int k,int l,int r,int x,int z)
{
    if (l==r)
    {
        tree[k].sum=tree[k].maxx=tree[k].lmax=tree[k].rmax=z;
        return;
    }
    int mid=(l+r)>>1;
    if (x<=mid)
        change(k<<1,l,mid,x,z);
    if (x>mid)
        change(k<<1|1,mid+1,r,x,z);
    pushup(tree[k],tree[k<<1],tree[k<<1|1]);
}
node ask(int k,int l,int r,int x,int y)
{
    if (x<=l&&y>=r)
        return tree[k];
    int mid=(l+r)>>1;
    if (x<=mid&&y>mid)
    {
        node res,ls=ask(k<<1,l,mid,x,y),rs=ask(k<<1|1,mid+1,r,x,y);
        pushup(res,ls,rs);
        return res;
    }
    if (x<=mid)
        return ask(k<<1,l,mid,x,y);
    if (y>mid)
        return ask(k<<1|1,mid+1,r,x,y);
}
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    build(1,1,n);
    int w,x,y;
    while (m--)
    {
        scanf("%d%d%d",&w,&x,&y);
        if (w==1)
        {
            if (x>y)
                swap(x,y);
            printf("%d\n",ask(1,1,n,x,y).maxx);
        }
        else
            change(1,1,n,x,y);
    }
    return 0;
}

自己研究了一下应该是pushup函数出了问题,但不知道问题是什么。搞了一天了,求救!


by ixRic @ 2020-12-04 12:35:58

pushup 里面的 rt 要引用


by Ryo_Yamada @ 2020-12-04 12:46:15

@银杉水杉秃杉 rt 要引用,ls 和 rs 不用


by momentous @ 2020-12-04 12:53:19

void pushup(node rt,const node &ls,const node &rs)

改成

void pushup(node &rt,const node &ls,const node &rs)

by 银杉水杉秃杉 @ 2020-12-04 14:25:08

@BreezeEnder 谢谢


by 银杉水杉秃杉 @ 2020-12-04 14:25:33

@ixRic 谢谢


by 银杉水杉秃杉 @ 2020-12-04 14:25:50

@lyslys 谢谢


|