线段树9pts求助,只有#1AC
查看原帖
线段树9pts求助,只有#1AC
715233
Dino_chx楼主2023/4/9 17:17

除了#1AC了,其他都WA了,请哪位大佬指点一下。十分感谢。

#include<bits/stdc++.h>
using namespace std;
const int N=1e7+7;
struct ST
{
	int l,r,sum,mx,lmx,rmx;
}tree[N<<2];
int w[N];
void pushup(ST &rt,ST &ls,ST &rs)
{
	rt.sum=ls.sum+rs.sum;
	rt.lmx=max(ls.lmx,ls.sum+rs.lmx);
	rt.rmx=max(rs.rmx,rs.sum+ls.rmx);
	rt.mx=max({ls.mx,rs.mx,ls.rmx+rs.lmx});
	return;
}
void pushup(int x)
{
	pushup(tree[x],tree[x<<1],tree[x<<1|1]);
	return;
}
void build(int x,int l,int r)
{
	if(l==r)
	{
		tree[x]={l,r,w[l],w[l],w[l],w[l]};
		return;
	}
	else
		tree[x].l=l,tree[x].r=r;
	int mid=l+r>>1;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	pushup(x);
	return;
}
void update(int x,int index,int k)
{
	if(tree[x].l==index&&tree[x].r==index)
	{
		tree[x]={index,index,k,k,k,k};
		return;
	}
	int mid=tree[x].l+tree[x].r>>1;
	if(x<=mid)
		update(x<<1,index,k);
	else
		update(x<<1|1,index,k);
	pushup(x);
	return;
}
ST query(int x,int l,int r)
{
	if(l<=tree[x].l&&r>=tree[x].r)
	return tree[x];
	int mid=tree[x].l+tree[x].r>>1;
	if(r<=mid)
		return query(x<<1,l,r);
	else if(l>mid)
		return query(x<<1|1,l,r);
	else
	{
		ST left=query(x<<1,l,r),right=query(x<<1|1,l,r),res;
		pushup(res,left,right);
		return res;
	}
}
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&w[i]);
	build(1,1,n);
	while(m--)
	{
		int op,l,r;
		scanf("%d%d%d",&op,&l,&r);
		if(op==1)
		{
			if(l>r)
			swap(l,r);
			printf("%d\n",query(1,l,r).mx);
		}
		else
		update(1,l,r);
	}
	return 0;
}
2023/4/9 17:17
加载中...