zoukankan      html  css  js  c++  java
  • 模板【Binary Indexed Tree树状数组】

    PART1(算法思想简介)

    1.实现

     线段树的区间是按照中间点划分的,而树状数组是根据 lowbit 来划分的。

    对于结点i,其表示的区间是[i-lowbit(i)+1,i]。

    计算过程显而易见。

    2.时间复杂度

    3.特别优势

    4.适用情况

    5.需要注意的点

    6.函数、变量名的解释+英文

    7.dalao分析

    a.如何知道这个结点是那一层的lowbit(从而可以知道他包含了多少个结点)?他等于x(不含2为因数)*2^y,就表明他包含了2^y个结点

    b.如何找到最大的lowbit?

    for(int m=1, l=0; m < n; m<<=1, ++l);//m表示当前包括了多少的数,l表示2^l次个数,最终答案是会比n大的

     c.lowbit的意义:那么定义一个函数lowbit,这个函数的值是i的二进制表达式中最低位的1所对应的值。

    PART2(算法各种类型(并附上代码))

    #include <iostream>
    using namespace std;
    const int maxN_ = 110;
    int n;
    class Binary_Index_Tree_ {
      public:
      int c[maxN_];
      int Lowbit(int x) { return x & (-x); }
      int GetSum(int x) {
        int res = 0;
        for (int i = x; i > 0; i -= Lowbit(i)) {
          res += c[i];
        }
        return res;
      }
      void UpDate(int x, int val) {
        for (int i = x; i <= n; i += Lowbit(i)) {
          c[i] += val;
        }
      }
    }bit;
    int main() {
      cin >> n;
      for (int i = 1; i <= n; ++i) {
        int val;
        cin >> val;
        bit.UpDate(i, val);
      }
      int q;
      cin >> q;
      while (q--) {
        int l, r;
        cin >> l >> r;
        cout << bit.GetSum(r) - bit.GetSum(l - 1) << endl;
      }
      return 0;
    }
    /*
    5
    1 2 3 4 5
    3
    1 5
    2 3
    4 4
    */

    PART3(算法的延伸应用)

    PART4(对算法深度的理解)

    PART5(与其相关的有趣题目)

     

  • 相关阅读:
    MySQL 简单查询(实验回顾)
    PicGo + Gitee 创建图床,Typora竟还有这种功能
    SQL 条件判断
    django ORM中的复选MultiSelectField的使用
    with的用法
    django update-or-create的用法
    获取异常文件
    支付宝支付
    单例模式创建
    数据类模型
  • 原文地址:https://www.cnblogs.com/bear-xin/p/15015622.html
Copyright © 2011-2022 走看看