社区讨论
线段树,但是语法问题求助
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 条回复,欢迎继续交流。
正在加载回复...