视频资源 https://www.bilibili.com/video/av18735440?from=search&seid=6455057566294194342
https://blog.csdn.net/qq_41021816/article/details/81167388
一、树状数组的作用
树状数组主要用于解决点修改和区间查询问题, 树状数组能解决的问题线段树都能解决。
但是线段主能解决的问题 树状数组不一定都能解决
对于区间修改树状数组需要加几个辅助数组。
二、树状数组的优点
代码比较短, 结点量比线段树少, 查询和修改挺快(logn)。
三、区间求和, 和单点查询版:
int n;
int a[1005],c[1005]; //对应原数组和树状数组
int lowbit(int x){
return x&(-x);
}
void updata(int i,int k){ //在i位置加上k
while(i <= n){
c[i] += k;
i += lowbit(i);//找父亲 , 修改父亲
}
}
int getsum(int i){ //求A[1 - i]的和
int res = 0;
while(i > 0){
res += c[i];
i -= lowbit(i);
}
return res;
}
https://www.cnblogs.com/xenny/p/9739600.html
/**********
0001 1 2 0 1
0010 2 2 1 2
0011 3 2 0 1
0100 4 2 2 4
0101 5 2 0 1
0110 6 2 1 2
0111 7 2 0 1
1000 8 2 3 8
************/
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e+5;
int n, m;
int a[maxn];
int c[maxn];
int lowbit(int x)
{
return x&(-x);// 返回 该节点 存 多少个数的值
}
void update(int i, int k)// 在第i个数上加k
{
while(i <= n)
{
c[i]+=k;
i+=lowbit(i);//
}
}
int getsum(int i) // 求 [1 i]的 和
{
int res = 0;
while(i > 0)//一个区间一个区间的加
{
res+=c[i]; // 加上该节点的值
i-=lowbit(i); // 减去该节点区间的大小
}
return res;
}
int sum(int l, r)// 获得从l[l, r] 的和
{
return getsum(r) - getsum(l-1);
}
int main()
{
return 0;
}