推荐博客 :https://blog.csdn.net/wconvey/article/details/7827188
在第二遍看了树状数组后, 感觉有了更深的认识,既然是树状数组,从名字来看,就是像树的一个数组,没错,就是一个普通的数组,我们把他假定成为一棵树。
用 C1 表示 A1 的和
用 C2 表示 A1 A2 的和
用C3 表示 A3 的和
用C4表示 A1 A2 A3 A4 的和
...
在这里面 镶嵌着一个很神奇的二进制 关系
在举个小例子 : 4 是等于 1 +3的和,其中1是3的最低位的二进制所在的位置。
那么现在要怎么去提取3的最低位的一个1呢 ?
3 的二进制码是 011
-3 的二进制码是 101 (取反加 1 )
3 & (- 3 ) = 1
int lowbit(int x){ return x&(-x); }
对于单点更新,区间更新
void add(int x){ for(int i = x; i <= n; i += lowbit(i)){ c[i] += x; } } int getsum(int a, int b){ int sum = 0; for(int i = b; i > 0; i -= lowbit(i)){ sum += c[i]; } return sum; }