树状数组C

作用:用于单点修改,以及动态前缀和统计。

​进阶作用:差分树+状数组 -> 2个单点修改变区间修改,前缀和变单点访问。

瓶颈: 无法维护区间属性,只能使用线段树解决。

  1. 代码短,运行效率高,能用这个就不用线段树。

  2. O logn

    1. 给某个位置上的数加上一个数。 单点修改
      1. 可以转化为修改为任意值。Ologn
      2. 树状数组只能加上一个数,不能变成一个数(转化为加上他们的差值)。因为上层都要更新加上这个数。
    2. 快速求前缀和区间查询,区间修改(用差分)
      1. 普通前缀和不支持修改 ,若改 更新前缀和数组需要On。
      2. 树状数组可以单点修改+动态求前缀和。Ologn
      3. 前缀和:使用递归求.或者while x>0循环
  3. 核心操作(3个)

    1. 核心函数

         public int lowbit(int x){   //lowbit操作  返回最后一位1是多少。
             return x&(-x);
         }
         //--------------------------------------
         public void add(int x,int d){ // 在x位置上加上d的操作。也用于初始化。(单点修改)Ologn
             while(x<=n){  // x 下标必须小于N;
                 c[x] +=d;
                 x += lowbit(x); // 更新上一层。
             }
         }
         //---------------------------------------
         public int sum(int x){    //x位置前缀和。    (求前缀和)Ologn
             int res=0;
             while(x>0){
                 res+=c[x];
                 x -= lowbit(x);//更改区间
             }
             return res;   
         }//必背的三个操作。
      
  4. 扩展

    1. 加差分。可以实现 区间修改 单点访问
    2. 把原数组变为差分数组。2次add 就可以实现树状数组的区间修改
    3. 原来的sum操作,直接变成单点访问
    4. 差分+2个树状数组,实现区间修改区间+前缀和。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值