社区讨论

线段树,但是语法问题求助

P4513小白逛公园参与者 4已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@lo2e8123
此快照首次捕获于
2023/10/23 12:24
2 年前
此快照最后确认于
2023/10/23 12:24
2 年前
查看原帖
如题,query 函数的第五行一直报错,显示 【非常量引用的初始化无效】,怎么会事呢。
CPP
#include<cstdio>
#include<iostream>
#define int long long
using namespace std;
const int N=5e5+10,mod=1e9+7;
int n,m,a[N];
struct dd{
	int maxl,maxr,maxv,sumv;
}t[N*4];
void pushup(dd &p,dd &L,dd &R)
{
	if (L.maxr<0&&R.maxl<0) p.maxv=max(L.maxr,R.maxl);
	else
	{
		p.maxv=0;
		if (L.maxr>0) p.maxv+=L.maxr;
		if (R.maxl>0) p.maxv+=R.maxl;
	}
	p.maxv=max(L.maxv,R.maxv);
	p.sumv=max(L.sumv,R.sumv);
	p.maxl=max(L.maxl,L.sumv+R.maxl);
	p.maxr=max(R.maxr,R.sumv+L.maxr);
	p.sumv=L.sumv+R.sumv;
}
void build(int p,int l,int r)
{
	if (l==r)
	{
		t[p].sumv=t[p].maxl=t[p].maxr=t[p].maxv=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	pushup(t[p],t[p*2],t[p*2+1]);
}
void updata(int p,int x,int v,int l,int r)
{
	if (l==r)
	{
		t[p].maxv=t[p].maxl=t[p].maxr=t[p].sumv=v;
		return;
	}
	int mid=(l+r)/2;
	if (x<=mid) updata(p*2,x,v,l,mid);
	else updata(p*2+1,x,v,mid+1,r);
	pushup(t[p],t[p*2],t[p*2+1]);
}
dd query(int p,int l,int r,int L,int R)
{
	if (L<=l&&r<=R) return t[p];
	int mid=(l+r)/2;
	if (L<=mid&&mid<R)
	{
		dd res;
		pushup(res,query(p*2,l,mid,L,R),query(p*2+1,mid+1,r,L,R));
		return res;
	}
	else if(L<=mid) return query(p*2,l,mid,L,R);
	else return query(p*2+1,mid+1,r,L,R); 
}
signed main()
{
	scanf("%lld%lld",&n,&m);
	for (int i=1;i<=n;i++) scanf("%lld",&n);
	while (m--)
	{
		int op,a,b;
		scanf("%lld%lld%lld",&op,&a,&b);
		if (op==1)
		{
			if (a>b) swap(a,b);
			printf("%lld\n",query(1,1,n,a,b).maxv);
		}
		else updata(1,a,b,1,n);
	}
}

回复

7 条回复,欢迎继续交流。

正在加载回复...