树状数组的两个操作的证明

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] [xlowbit(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=xlowbit(x)

下一段区间就是: [ x ′ − l o w b i t ( x ′ ) + 1 , x ′ ] [x'-lowbit(x')+1,x'] [xlowbit(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 即本身。

更新类似 树形从子结点到根。方向从下到上,从左到右。

查询类似 树形从子结点到根再到子结点,方向下上下,从右到左。

以上是关于树状数组的两个操作的证明的主要内容,如果未能解决你的问题,请参考以下文章

树状数组

树状数组 全网最详细详解

关于树状数组的区间修改和单点查询

luoguP2184 贪婪大陆 题解(树状数组)

模板树状数组上的差分数组

P3374 模板树状数组 1