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