树状数组
【树状数组是什么】
树状数组(Binary Indexed Tree, BIT)
支持单个元素修改 和 前缀查询。
比较一下:
子段和 | 修改单个元素 | |
---|---|---|
数组 | ||
前缀和 | ||
树状数组 |
【树状数组的实现】
比如
现在我们定义树状数组
其中
形象一点:
先把所有是 16 的倍数的下标取出,它们的值是以下标结尾的 16 个元素的和。
在把 8 的倍数取出,同样,但是 16 的倍数就不管了。
循环往复,直到取完 1 的倍数。
如上图,就是 16 个元素的例子。
经过这样的处理,查询前缀和的复杂度是
相当于把
单个元素修改的复杂度也是
假设我们要修改
首先所有下标小于
然后
再之后,如果
证明:
而
所以
而
接着还有:除了上述元素,其他的元素都不用修改。
证明:
假设
我们只需要证明
而因为
范围不增加,终点还远了,当然管不到
综上,我们只需要按照每次增加
最后小问题:
【优缺点】
优点:
代码短、常数小。
缺点:
单点修改,可加不可减(比如求一个子段的最值,不能大减小),无法求任意子段,只能求前缀和。
【拓展】
- 树状数组优化 dp
一部分 dp 在转移的时候都是
以前我们要用一重循环枚举 j,但是现在我们可以用树状数组快速求
例子:最长上升子序列
先离散化。
当进行第
这样我们要求
基本想法:
注意:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!