线段树萌新求助,全部输出零
查看原帖
线段树萌新求助,全部输出零
53022
银杉水杉秃杉楼主2020/12/4 12:32
#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函数出了问题,但不知道问题是什么。搞了一天了,求救!

2020/12/4 12:32
加载中...