求问
  • 板块学术版
  • 楼主letianJOE
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/3/11 19:57
  • 上次更新2024/3/11 21:37:39
查看原帖
求问
658497
letianJOE楼主2024/3/11 19:57

想要用树状数组实现区间求和以及区间修改

#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
int n,m;
int a[N+5];
int bin[N+5];
int bin2[N+5];
int lowbit(int x)
{
	return x&(-x);
}
void add_bin(int x,int k)
{
	for(int i=x;i<=n;i+=lowbit(i))
		bin[i]+=k;
	return ;
}
int ask_bin(int x)
{
	int cnt=0;
	for(int i=x;i>=1;i-=lowbit(i))
		cnt+=bin[i];
	return cnt;
}
void add_bin2(int x,int k)
{
	for(int i=x;i<=n;i+=lowbit(i))
		bin2[i]+=k;
	return ;
}
int ask_bin2(int x)
{
	int cnt=0;
	for(int i=x;i>=1;i-=lowbit(i))
		cnt+=bin2[i];
	return cnt;
}
int sum(int x)
{
	return ((n+1)*ask_bin(x))-ask_bin2(x);
}
main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=n;i++)
	{
		add_bin(i,a[i]-a[i-1]);
		add_bin2(i,(a[i]-a[i-1])*i);
	}
	while(m--)
	{
		int op;
		cin>>op;
		if(op==1)
		{
			int l,r,k;
			cin>>l>>r>>k;
			add_bin(l,k),add_bin2(l,l*k);
//			if(r<n)
				add_bin(r+1,-k),add_bin2(r+1,-(r+1)*k);
		}
		else
		{
			int l,r;
			cin>>l>>r;
			cout<<sum(r)-sum(l-1)<<"\n";
		}
	}
	return 0;
}

有参考一篇博文,戳这里

2024/3/11 19:57
加载中...