初学 二维树状数组

二维树状数组可以高效解决二维动态矩形计数问题。

我先带你回顾一下一维树状数组是怎样的:

cn=i=nlowbit(n)+1nai

{d(n)}

{d1=ndi=di1lowbit(di1)i>1di>0iN+

{f(n)}

{f1=nfi=fi1+lowbit(fi1)i>1fiViN+

其中 V 为下标的最大值。

则前缀和为

i=1nai=jd(n)cj

而改变了 an 后,xf(n)cx 都要改变。

让我们升一维,二维:

由于本蒟蒻不会做 3D 演示图片,2D 凑合看吧 qwq。

当查询

i=17j=17ai,j

时,会用到这些 c(相同颜色为其管辖范围,感谢四色定理):

i=1nj=1mai,j=xd(n)yd(m)cx,y

而改变了 an,m 后,xf(n),yf(m)cx,y 都要改变。

单点修改和矩形(二维前缀的容斥)查询单次均为 O(log(nm))

其实扩展到多维也是类似的……

posted @   ShaoJia  阅读(72)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示