树状数组
关于树状数组,顾名思义,就是数形状的数组,主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值。
概述图如下(以数组C代指树状数组,以数组A代指原数组)
可看出:
C1=A1
C2=A1+A2
C3=A3
C4=A1+A2+A3+A4
C5=A5
C6=A5+A6
C7=A7
C8=A1+A2+A3+A4+A5+A6+A7+A8
……
一般规律:Cn=(An-2k+1)+…+An,其中,k取使得2k不大于An的最大值。
快速获取2k的方法如下:
lowBit(int x) {
return x&(-x);
}
树状数组的C++实现如下:
class treeArray {
private:
vector<int> c;//树状数组
vector<int> a;//原数组
public:
void initi(int length) {//初始化树状数组,全部置零
c.resize(length,0);
}
int lowBit(int x) {
return x&(-x);
//关于x&(-x)
//假如x为奇数,那么x&(-x)=1
//假如x为偶数,令x&(-x)=n,则x%n=0且n=2^m,m是可以取的最大值
}
void Update(int pos) {//更新树,pos位置数加1
while(pos<c.size()) {
c[pos]+=1;
pos+=lowBit(pos);
}
}
int query(int pos) {//求小于等于该位置的数的和
int res=0;
while(pos>0) {
res+=c[pos];
pos-=lowBit(pos);
}
return res;
}
}