数组的结点序号转化为二进制
1=(001) C[1]=A[1];
2=(010) C[2]=A[1]+A[2];
3=(011) C[3]=A[3];
4=(100) C[4]=A[1]+A[2]+A[3]+A[4];
5=(101) C[5]=A[5];
6=(110) C[6]=A[5]+A[6];
7=(111) C[7]=A[7];
8=(1000) 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]; (k为i的二进制中从最低位到高位连续零的长度)例如i=8时,k=3;
代码
int lowbit( int t)
{
return t&(-t);
}
//t=6(0110)
//-t=-6(1001+1)=
// t&(-t)=(0010)=2=2^1
//c[i]=c[i-lowbit(i)+1]+c[i-lowbit(i)+2]+....A[i];
int getsum(int x)
{
int ans=0;
for(int i=x;i>0;i-=lowbit(i))
ans+=C[i];
return ans;
}
int getsum(int x)
{
int ans=0;
for(int i=x;i>0;i-=lowbnit(i))
{
ans+=c[i];
}
return ans;
}
void add(int x,int y)
{
for(int i=x;i<=n;i+=lowbit(i))
tree[i]+=y;
}