树状数组基本概念

    树状数组也是进行区间操作的常用数据结构。树状数组适用于单个元素经常修改,而且还反复求部分的区间和的情况.

 
则数组C为数组a的树状数组。

数组数组的结构

 
C[4] = a[1] +a[2] + a[3] + a[4]

树状数组的操作

一、求连续区间的和

 
其中 Nm = k, Ni-1 = Ni - lowbit(Ni), N1 >=1

//查询
int Query(int p, int n){
	int sum = 0;
	while (p >= 1){
		sum += gC[p];
		p -= gLowBit[p];
	}
	return sum;
}

 

 
证明略

二、单点更新

 
其中,N1 = i, Nk+1 = Nk + lowbit(Nk),且Nm <= N

//更新
void Update(int p, int n, bool add){
	while (p <= n){
		if (add){
			gC[p] ++;
		}
		else{
			gC[p] --;
		}
		p += gLowBit[p];
	}
}

 


树状数组和线段树

 
    树状数组和线段树的时间复杂度均为O(nlogn),但是树状数组的常数小,效率略高;且树状数组的编程复杂度低。

相关文章: