一.树状数组的适用问题
修改数组的值,求某个区间的和;
如果实时的对数组进行M次修改或求和,最坏的情况下复杂度是O(M*N)。
在这种场景中,如果使用树状数组,复杂度会降到O(M*lgN),这是很可观的。
二.参考代码
//修改tree数组的值,第k个元素的值增加num
void add(int k,int num){
while(k<=n){//n是数组元素个数
tree[k]+=num;
k+=k&(-k);
}
}
//求第k个位置前(包括第k个)各元素的和
int read(int k){
int sum = 0;
while(k){
sum+=tree[k];
k-=k&(-k);
}
return sum;
}