C++ 树状数组

一.树状数组是什么?

C++ 树状数组_第1张图片

二.树状数组的特性?

可以解决大部分区间上面的修改以及查询的问题,例如1.单点修改,单点查询,2.区间修改,单点查询,3.区间查询,区间修改等问题;

三.树状数组讲解

lowbit的使用
如何计算一个非负整数n在二进制下的最低为1及其后面的0构成的数?
答案就是 lowbit(x)
那么lowbit运算时怎么实现的呢?
44的二进制=(101100),我们对44的二进制数取反+1,也即~44+1,得到-44。
-44的二进制=(010100),然后我们把44和-44的二进制进行按位与运算,也即按位&得到,二进制000100,也就是十进制的4
所以 lowbit(x) = x&(-x)

实现
c [ i ] = a [ i − 2 k + 1 ] + a [ i − 2 k + 2 ] + … … + a [ i ] c[i]=a[i-2^k+1]+a[i-2^k+2]+……+a[i] c[i]=a[i2k+1]+a[i2k+2]+……+a[i]

int lowbit(int x){
	return x&(-x);
}
void update(int x,int y){
	for(int i=1;i<=n;i+=lowbit(i)){
		c[i]+=y;
	}
}
long long getsum(int x){
	int ans=0;
	for(int i=x;i;i-=lowbit(i)){
		ans+=c[i];
	}
	return ans;
}

你可能感兴趣的:(c++,开发语言)