zoukankan      html  css  js  c++  java
  • 基础

    推荐博客 :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;
    }
    
    东北日出西边雨 道是无情却有情
  • 相关阅读:
    poj 2955 Brackets
    HDU 3790 最短路径问题
    畅通工程续
    HDU 1896 六度分离
    HDU
    第九周作业
    第八周作业
    2019年春季学习第七周学习总结
    2019春季学习总结第六周作业
    第五周作业
  • 原文地址:https://www.cnblogs.com/ccut-ry/p/8308913.html
Copyright © 2011-2022 走看看