线段树,求助
查看原帖
线段树,求助
509923
SongShouqian楼主2022/3/8 20:39

这个线段树程序只 AC 了一个点,各位大佬,能不能帮我看看它出了什么问题啊?

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
struct st{
	ll ls,rs,value,sign;
}tree[500001];
void build(ll x,ll l,ll r)
{
	tree[x].ls=l;
	tree[x].rs=r;
	if(l==r)
	{
		cin>>tree[x].value;
		return;
	}
	build(x<<1,l,l+r>>1);
	build(x<<1|1,(l+r>>1)+1,r);
	tree[x].value=tree[x<<1].value+tree[x<<1|1].value;
}
void add(ll x,ll l,ll r,ll k)
{
	if(tree[x].ls==l&&tree[x].rs==r)
	{
		tree[x].value+=(r-l+1)*k;
		tree[x].sign+=k;
		return;
	}
	if(r<=tree[x].ls+tree[x].rs>>1)
	{
		add(x<<1,l,r,k);
	}
	else if(l>tree[x].ls+tree[x].rs>>1)
	{
		add(x<<1|1,l,r,k);
	}
	else
	{
		add(x<<1,l,tree[x].ls+tree[x].rs>>1,k);
		add(x<<1|1,(tree[x].ls+tree[x].rs>>1)+1,r,k);
	}
	tree[x].value=tree[x<<1].value+tree[x<<1|1].value;
}
int sum(ll x,ll l,ll r)
{
	if(tree[x].ls==l&&tree[x].rs==r)
	{
		return tree[x].value;
	}
	if(tree[x].sign)
	{
		tree[x<<1].value+=(tree[x<<1].rs-tree[x<<1].ls+1)*tree[x].sign;
		tree[x<<1|1].value+=(tree[x<<1|1].rs-tree[x<<1|1].ls+1)*tree[x].sign;
		tree[x<<1].sign+=tree[x].sign;
		tree[x<<1|1].sign+=tree[x].sign;
		tree[x].sign=0;
	}
	if(r<=tree[x].ls+tree[x].rs>>1)
	{
		return sum(x<<1,l,r);
	}
	else if(l>tree[x].ls+tree[x].rs>>1)
	{
		return sum(x<<1|1,l,r);
	}
	else
	{
		return sum(x<<1,l,tree[x].ls+tree[x].rs>>1)+sum(x<<1|1,(tree[x].ls+tree[x].rs>>1)+1,r);
	}
}
int main()
{
	cin>>n>>m;
	build(1,1,n);
	int opt,x,y,k;
	for(int i=1;i<=m;i++)
	{
		cin>>opt;
		if(opt==1)
		{
			cin>>x>>y>>k;
			add(1,x,y,k);
		}
		else
		{
			cin>>x>>y;
			cout<<sum(1,x,y)<<endl;
		}
	}
	return 0;
}

这是测试点信息。

2022/3/8 20:39
加载中...