社区讨论
【MnZn求助线段树】样例输出11 8 23
P3372【模板】线段树 1参与者 3已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @lo7pvrbi
- 此快照首次捕获于
- 2023/10/27 05:49 2 年前
- 此快照最后确认于
- 2023/10/27 05:49 2 年前
找不出哪里出问题了
cmd1是更新,cmd2是查询
在cmd2里面加输出,看到最后根的左右儿子莫名变成了19/1、10/0(区间和/懒标记)
CPP#include<cstdio>
int n,m,value[100001],plus,left,right;
struct node
{
int l,r,sum,add; //左边界 右边界 区间和 懒标记
}tree[400001];
void build(int,int,int);
void cmd1(int);
int cmd2(int);
void spread(int);
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&value[i]);
build(1,n,1);
for(int ct=1,q;ct<=m;ct++)
{
scanf("%d",&q);
if(q==1)
{
scanf("%d%d%d",&left,&right,&plus);
cmd1(1);
}
else if(q==2)
{
scanf("%d%d",&left,&right);
plus = cmd2(1);
printf("%d\n",plus);
}
}
return 0;
}
void build(int l,int r,int num)
{
int mid = (l+r)/2;
tree[num].l = l;
tree[num].r = r;
if(l == r)
{
tree[num].sum = value[l];
return;
}
build(l,mid,num*2);
build(mid+1,r,num*2+1);
tree[num].sum = tree[num*2].sum + tree[num*2+1].sum;
}
void cmd1(int num)
{
if(tree[num].l == tree[num].r)
{
tree[num].sum += plus;
return;
}
if(tree[num].l>=left && tree[num].r<=right)
{
tree[num].sum += plus*(tree[num].r-tree[num].l+1);
tree[num].add += plus;
return;
}
if(tree[num].add) spread(num);
int nl, nr;
for(int kk=0;kk<=1;kk++)
{
nl = tree[num*2+kk].l; nr = tree[num*2+kk].r;
if(nl<=right&&nr>=left)
cmd1(num*2+kk);
}
tree[num].add = 0;
tree[num].sum = tree[num*2].sum + tree[num*2+1].sum;
return;
}
int cmd2(int num)
{
if(tree[num].l>=left && tree[num].r<=right)
return tree[num].sum;
int sum = 0,nl,nr;
spread(num);
for(int kk=0;kk<=1;kk++)
{
nl = tree[num*2+kk].l; nr = tree[num*2+kk].r;
if(nl<=right&&nr>=left)
{
sum += cmd2(num*2+kk);
}
}
return sum;
}
void spread(int num)
{
if(tree[num*2].l != tree[num*2].r)
tree[num*2].add += tree[num].add;
tree[num*2].sum += tree[num].add*(tree[num].r-tree[num].l+1);
if(tree[num*2+1].l != tree[num*2+1].r)
tree[num*2+1].add += tree[num].add;
tree[num*2+1].sum += tree[num].add*(tree[num].r-tree[num].l+1);
tree[num].add = 0;
}
回复
共 7 条回复,欢迎继续交流。
正在加载回复...