草稿
我全忘了之后重新复习 哪些对我有点醒作用
树状数组c[i]的含义: c[i]覆盖的长度是lowbit(i),存储前lowbit(i)个整数之和。
lowbit(x)是取x的二进制的 最右边的1和它右边所有的0
例如 lowbit(8) = 8D = 1000B
树形图
区间和查询 循环 从大到小 [x, 0) >0 i-=lowbit(i) 减去最右边的1 从右至左(16--->1)不断定位x的二进制最右边的1的过程
单点修改(某个数加上x) <maxn 或 <=n
如果lowbit(a)<lowbit(x),lowbit(x+a)就会小于lowbit(x),(因为lowbit(x)是取x的二进制的最右边的1的位置,会受到小的数的影响!)
所以一定有lowbit(a)>=lowbit(x)
如果lowbit(x)=a,
最小的a就是lowbit(x)....
区间修改,单点查询
树状数组定义:c[i]覆盖的长度不变,仍是lowbit(i),这段区间每个数当前被加了多少
单点查询:
区间修改: