线状数组是一个查询和复杂度都是log(n)的数据结构,主要用来查询任意两位之间的所有元素之和,但每次只能修改一个元素的值,
数组a[]— 用来存放原始数据,c[]–就是树状数组,c[t] – 表示t管辖区间元素之和。
c[t] --管辖里2k个区间,k是t在二进制下末尾0的个数例如:8=(1000),那么管辖23=8个数。例如5 = (101)那么管辖20=1个数;
下面这个图非常直观;
如何计算t管辖的区间打下:(求t对应的2k);
下面两种皆可:
int lowbit(int x)
{
return x&(x^(t-1));
}
int lowbit(int x)
{
return x&(-x);
}
n-lowbit(n) 将n二进制中最后一个(末尾)的1减去
点修改,区间查询
#include <bits/stdc++.h>
using namespace std;
int n,m;
int a[50005],c[50005]; //对应原数组和树状数组
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