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

    先贴一个模板代码:

    int lowbit(int i)
    {
        return i & -i;
    }
    //这里的查询以区间和为例
    void query(int i)
    {
        int ans = 0;
        while(i > 0)
        {
            ans += c[i];
            i -= lowbit(i);
        }
        return ans;
    }
    //这里的单点更新以加法为例
    void update(int i, int val)
    {
        while(i <= n)
        {
            c[i] += val;
            i += lowbit(i);
        }
    }

    个人理解:

      几个关键点,首先是 lowbit(i) :指 i 的二进制表示中最低位1及其后续的0组成的数字大小。例如,lowbit(6)中6的二进制表示为110,其最低位1及其后续0组成的二进制数字为10,即十进制的2,所以lowbit(6) = 2。接着是查询和更新操作中,各个区间之间的联系。对于查询操作,要查询的原区间比如是 c[i] ,发现c[i] = c[p] + c[q] + c[r] ,这几个子区间和原区间之间是有联系的,它们的关联就是 i - lowbit(i) == p , p - lowbit(p) == q , q - lowbit(q) == r ,所以查询操作中 i -= lowbit(i)。而更新操作是自底向上更新,和查询的自顶向下查询刚好相反,所以更新操作中 i += lowbit(i)。

      树状数组能够解决的问题,线段树几乎都能做,但是树状数组的写法简单,代码简洁

    具体理解细节可以参考这篇博客:https://www.cnblogs.com/acgoto/p/8583952.html

  • 相关阅读:
    多线程GCD
    根据UITouch 自定义手势
    KVC在数据解析中的应用
    oc 文件读写操作
    oc 字典应用实例-城市查询省份
    oc 字典应用实例-成绩科目排序
    oc 数组应用实例-验证码
    协议 protocol
    概念杂记
    OC 类的继承 方法重载重写
  • 原文地址:https://www.cnblogs.com/friend-A/p/10303452.html
Copyright © 2011-2022 走看看