求助,线段树模板
查看原帖
求助,线段树模板
128451
x_miracle楼主2020/7/6 23:39
#include <bits/stdc++.h>
#define MAXN 300000
struct node
{
	int left,right,lazy,val;
	node(){ val=0; lazy=0; }
}	tree[MAXN];
void build(int i,int l,int r)
{
	tree[i].left=l;	tree[i].right=r;
	if(tree[i].left == tree[i].right)	{std::scanf("%d",&tree[i].val);	return ;}
	if(r>l)
	{
		int mid=(l+r)/2;
		build(i<<1,l,mid);
		build(i<<1|1,mid+1,r);
	}
	tree[i].val=tree[i<<1].val+tree[i<<1|1].val;
	return ;
}
void Insert(int i,int l,int r,int k)
{
	if(l<=r)
	{
		if(tree[i].left==l && tree[i].right==r)	tree[i].lazy+=k;
		else
		{
			int mid=(tree[i].left+tree[i].right)/2;
			if(r<=mid) Insert(i<<1,l,r,k);
			else if(l>mid) Insert(i<<1|1,l,r,k);
			else
			{
				Insert(i<<1,l,mid,k);
				Insert((i<<1)|1,mid+1,r,k);
			}
		}
	}
	return ;
}
int get_sum(int i,int l,int r)
{
	int ans=0,mid=(tree[i].left+tree[i].right)/2;

	if(tree[i].left==l && tree[i].right==r)	
		return tree[i].val+tree[i].lazy*(tree[i].right-tree[i].left+1);
	//下传 
	tree[i<<1].lazy+=tree[i].lazy;
	tree[i<<1|1].lazy+=tree[i].lazy;
	tree[i].val+=tree[i].lazy*(tree[i].right-tree[i].left+1);
	tree[i].lazy=0;
	
	if(r<=mid) 	ans=get_sum(i<<1,l,r);
	else if(l>mid) 	ans=get_sum(i<<1|1,l,r);
	else	ans=get_sum(i<<1,l,mid)+get_sum(i<<1|1,mid+1,r);
	return ans;
}
int main()
{
	std::freopen("in.txt","r",stdin);
	
	int n,m,ans;
	std::scanf("%d%d",&n,&m);
	build(1,1,n);
	for(int i=1;i<=m;++i)
	{
		int flag;
		std::scanf("%d",&flag);
		if(flag==1)
		{
			int x,y,k;
			std::scanf("%d%d%d",&x,&y,&k);
			Insert(1,x,y,k);
		}
		else
		{
			int x,y;
			std::scanf("%d%d",&x,&y);
			ans=get_sum(1,x,y);
			printf("%d\n",ans);
		}
	}
	return 0;
}

求助,样例过不去,应该是懒标记 || 下传 || 求和写错了。

我的输出一直是11 8 16

第三个 16 与 样例中的 20 不符。

先在这里谢谢了

2020/7/6 23:39
加载中...