树状数组基础
参考博文:https://bestsort.cn/2019/04/26/195/
大赞!
树状数组是一个查询和修改复杂度都为logn的数据结构,主要用于数组的单点修改&&区间求和,另外一个具有类似功能的是线段树
具体区别和联系如下:
1、两者复杂度统计,但树状数组的常熟明显优于线段树,编程码量复杂度也小于线段树
2、树状数组的作用被线段树完全涵盖,凡是可以使用树状数组解决的问题,使用线段树一定可以解决,但反之未必
3、树状数组的突出特点是码量小,简洁,使用了lowbit函数迅速完成树状数组的核心操作,代码效率远高于线段树,lowbit(x)求最低位1的位置
lowbit函数
int lowbit(x){return x&(-x);}
单点更新
void update(int x,int y,int n){
for(int i=x;i<=n;i+=lowbit(i)) //x为更新的位置,y为更新后的数,n为数组最大值
c[i] += y;
}
区间查询
int getsum(int x){
int ans = 0;
for(int i=x;i;i-=lowbit(i))
ans += c[i];
return ans;
}