树状数组是利用二进制的特点进行检索的树状结构。
就像前缀和,一个数组里包含多个数之和,树状数组也就有这样的性质
对于每个数组的元素他的值到底等于哪些元素的和。是利用了二进制数的性质
将数字转化成二进制数,最末尾的一之后哪些数转化成十进制就是代表他由几个数组成。从他这个数本身开始往前。也就是说c[i]必定包括a[i]。
那我们是通过一个lowbit函数来找到这个末尾最后一个1的
int lowbit(int x){
return x&-x;
}
树状数组求前n项的和
int sum(int i){//前i项的和
int ret=0;
while(i>0){
ret+=c[i];
i-=lowbit(i);//更新i
}
return ret;
}
单点更新:
void update(int i,int val){
while(i<=n){
c[i]+=val;
i+=lowbit(i);
}
}
单点更新,插入
void update(int i,int val){//单点更新,插入
while(i<=n){
c[i]+=val;
i+=lowbit(i);
}
}