zoukankan      html  css  js  c++  java
  • 树状数组

     推荐博客 : https://www.cnblogs.com/RabbitHu/p/BIT.html

          https://www.cnblogs.com/lcf-2000/p/5866170.html

    树状数组的作用 :

      修改某点的值 , 查询某段区间的和 , 这是树状数组的强项 。其区间查询的和 为 lg n 。

    之所以叫树状数组 , 大概就是因为他对数据的操作看起来像一颗树吧 。

    树状数组有核心的一步 : (追溯其父节点或下辖第一个没有关系的点

    int lowbit(int k){
        return k & (-k);
    }
    

    补充一点 : 如何求一个负数的二进制码 ?

      一个数加一个负号,就是把这个数的二进制码取反加一

     例如: -10的二进制就是-1010=0101+1=0110

     然后就会发现一个规律 : 奇数如果执行此操作 最后会返回 1 , 但如果是偶数执行此操作 , 得到的数是 偶数从最后一位 开始向前截取 直到有一位为 1 。

    树状数组的更新 // 最终得到的数组是 c 数组

    void modify(int k, int add){
        while(k <= Maxn){
            c[k] += add;
            k += lowbit(k);
        }
    }
    

    树状数组的区间求和

      

    int get_sum(int x){
        int ans = 0;
        while (x != 0){
            ans += c[x];
            x -= lowbit(x);
        }
        return ans;
    }
    
    东北日出西边雨 道是无情却有情
  • 相关阅读:
    数据解压
    子区域数据合并
    数据压缩复制
    将Win10变回Win7/WinXP界面
    通过GP加载卫星云图-雷达图-降雨预报图
    Maven版本与JDK版本
    由输入法随想
    selinux开关
    android studio 配置
    NodeJS 笔记
  • 原文地址:https://www.cnblogs.com/ccut-ry/p/7634921.html
Copyright © 2011-2022 走看看