树状数组的两个操作的证明
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树状数组的两个操作的证明相关的知识,希望对你有一定的参考价值。
树状数组的两个操作的证明
首先关于lowbit的证明
然后是我画的一张图
查询操作
当我们要快速求 [ 1 , x ] [1,x] [1,x]的前缀和。
可使用lowbit将其划分为多个子区间。
比如当前 x x x 代表的区间为 [ x − l o w b i t ( x ) + 1 , x ] [x-lowbit(x)+1,x] [x−lowbit(x)+1,x] 即长度为 l o w b i t ( x ) lowbit(x) lowbit(x)的区间。
然后 x ′ = x − l o w b i t ( x ) x'=x-lowbit(x) x′=x−lowbit(x)。
下一段区间就是: [ x ′ − l o w b i t ( x ′ ) + 1 , x ′ ] [x'-lowbit(x')+1,x'] [x′−lowbit(x′)+1,x′]。依此类推最后 x = 0 x=0 x=0 结束。
int que(int x)
int ans=0;
while(x>0)
ans+=s[x];
x-=lowbit(x);
return ans;
更新操作
我们只需证明 x + l o w b i t ( x ) x+lowbit(x) x+lowbit(x) 所代表的区间一定包含 x x x。
这样我们更新就可以保证。
图示
可以发现所有奇数代表的区间长度都是 1 1 1 即本身。
更新类似 树形从子结点到根。方向从下到上,从左到右。
查询类似 树形从子结点到根再到子结点,方向下上下,从右到左。
以上是关于树状数组的两个操作的证明的主要内容,如果未能解决你的问题,请参考以下文章