基础 - 树状数组

推荐博客 :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;
}

 

posted @ 2018-01-18 10:31  楼主好菜啊  阅读(127)  评论(0编辑  收藏  举报