基本概念
与二进制数末尾的0相关,k为i的二进制中从低位到高位连续0的长度,i开始往前加i的k次方的数字
如:当i=8(1000)时,末尾0的个数为3,也就是k=3,2的3次方为8,从8往前加8个
c[8]=a[1]+a[2]+a[3]+a[4]a[5]+a[6]+a[7]+a[8]
c[i]=a[i-2的K次方+1]+a[i-2的k次方+2]+……+a[i]
末尾有多少个0,也就是从低位开始的第1个1在哪
int lowbit(int t){return t&(-t);}
c[i]=a[i-lowbit(i)+1]+a[i-lowbit(i)+2]+……+a[i]
代码实现
单点修改
如:3(0011)+lowbit=4(0100)
4(0100)+lowbit(4)=8(1000)
void dandianxiugai (int x,int y){
for(int i=x;i<=n;i+=lowbit(i)){
c[i]+=y;
}
}
区间查询
利用c数组,求a数组前i项之和sun[i]
如:i=7
sum[7]=a[1]+a[2]+......+a[7]
=(a[1]+......+a[6])+a[7]
=c[4]+c[6]+c[7]
int qujianchaxun(int n){
int sum=0;
for(int i=n;i!=0;i-=lowbit(i)){
sum+=c[i];
}
return sum;
}