树状数组基本概念
树状数组也是进行区间操作的常用数据结构。树状数组适用于单个元素经常修改,而且还反复求部分的区间和的情况.
则数组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),但是树状数组的常数小,效率略高;且树状数组的编程复杂度低。