关于对树状数组的理解与总结(持续更新中)
作者:
Snow_raw
,
2021-08-22 22:14:18
,
所有人可见
,
阅读 350
问题:
给出一个长度为n的数组,完成以下两种操作:
1. 将第i个数加上k
2. 输出区间[i,j]内每个数的和
朴素做法
1.单点修改:O(1)
2.区间查询:O(n)
使用树状数组
1.单点修改:O(logn)
2.区间查询:O(logn)
3.优势:将最好情况和最差情况取中降低爆复杂度的风险
核心操作:
1:lowbit()函数,return x&-x;得到的是当前x的最低含有1的二进制位且默认后面数为0的数,例如6=0110;lowbit(6)
=10<==>2
树状数组的专属两大核心操作add和ask:
2:add()函数,修改函数,将一个数修改同时改变其作用的数的值:
void add(int a,int x){
for(int i=a;i<=n;i+=lowbit(i))tr[i]+=x;//O(logn)
}
3:ask()函数,查询区间和:
int ask(int x){
int sum=0;
for(int i=x;i;i-=lowbit(i))sum+=tr[i];//O(logn)
return sum;
}
大佬问一下,这是用lowbit+前缀和做吗
这是暂时的理解加我认为的树状数组模板lowbit应该是树状数组绑定操作