模板【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(与其相关的有趣题目)

 

posted @ 2021-07-15 15:01  bear_xin  阅读(29)  评论(0编辑  收藏  举报