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

    树状数组是实现单点修改,前缀查询的数据结构。

    图中的c数组就是树状数组,可以看出一个c数组对应了不同数量的原始数组(a数组)的值。

    为了实现这种存储结构,有必要引出lowbit这个概念。

    首先,lowbit(x) = x & -x。

    是什么原理,我觉得我将不太明白,各位百度一下吧,网上有很多不错的解释。

    用法,举个栗子。lowbit(6) = 2,lowbit(6 - 2) = lowbit(4) = 4,lowbit(4 - 4) = lowbit(0) = 0。

    这代表了什么含义呢?就是如果一个数x一直减去它的lowbit的话,就能遍历x之前树状数组存的所有值。

    这样查询前缀和的代码就可以写出来了

     1 int sum(int pos)
     2 {
     3     int ret = 0;
     4     while(pos > 0)
     5     {
     6         ret += c[pos];
     7         pos -= lowbit(pos);
     8     }
     9     return ret;
    10 }

    那单点修改呢?其实只要一直加上lowbit就行。

    1 void add(int pos, int w)
    2 {
    3     while(pos <= n)
    4     {
    5         c[pos] += w;
    6         pos += lowbit(pos);
    7     }
    8 }

    这就是树状数组的板子了。

    啊,补一个lowbit

    1 int lowbit(int x)
    2 {
    3     return x & -x;
    4 }
  • 相关阅读:
    盲山有感
    一个用Regex的完成sql语句中字段替换的demo
    月夜奔跑
    乱弹
    《勇敢抉择》摘录一
    梦想高歌
    从今天起
    php性能优化
    unity3d shader中RenderType的所有类型
    Unity打包ipa图文教程
  • 原文地址:https://www.cnblogs.com/mrclr/p/8592966.html
Copyright © 2011-2022 走看看