基本用途:维护序列的前缀和。
对于给定的序列a,建立一个数组c,其中c[x]保存序列a的区间[x-lowbit(x)+1,x]中所有数的和,其中lowbit(x)指:x的二进制下最小的2的次幂,如: lowbit(7)=1,lowbit(6)=2,lowbit(5)=1,lowbit(4)=4
该结构满足一下性质:
初始化 建立一个全为0的数组c,对位置x初始化为a[x],执行add(x,a[x])
时间复杂度O(NlogN)
void add(int x,int y){
for(;x<=n;x+=x&-x) c[x]+=y;
}
单点增加 对位置x增加a[x],执行add(x,a[x])
void add(int x,int y){
for(;x<=n;x+=x&-x) c[x]+=y;
}
查询前缀和(1~x)时间复杂度O(logN)
int ask(int x){
int res=0;
for(;x;x-=x&-x) res+=c[x];
return res;
}
若查询序列a的区间[l,r]中所有数的和,只需计算ask(r)-ask(l-1)
模板题:https://www.luogu.com.cn/problem/P3374
原文:https://www.cnblogs.com/gcw0618/p/12234534.html