可持久化树套树 (细节) 笔记
假设已经会了树套树和可持久化权值线段树 (主席树)
昨天晚上在机房里面写,发现我有一些细节问题不是很懂,并且对这个玩意理解的也不太行
一些约定
有一个树套树,内外都是权值线段树。
对于一个外层树上的点 ,称左右儿子为 ,并且套着一个内层树 , 的根是 。
对于一个内层树上的点 ,称左右儿子为 ,并且维护了一些信息。
对于一个线段树,设位置 的影响路径为,从根一路找,找到单点 ,经过的路径(包括根 和 )
例如 时, 的影响路径为 对应的点。
正片
有这样一个二维数点问题:加入一个点,询问矩形里点的信息(个数/和/max)。很明显可以树套树做。
这样的问题,如果要支持历史版本的询问,如何做?
即,我们要询问:如果只插入了前 个点,矩形信息。
考虑可持久化。相当于每个版本都有一个树套树。那首先我们肯定要把外层可持久化。
设 表示第 个版本的外层树的根。考虑 版本到 版本的变化,很明显是多了一个点 。
根据树套树,我们需要在外层的树上找到 位置的影响路径。对于影响路径上的所有点,它们套的内层树 都要在 位置做插入。
现在我们要可持久化这个过程。类似主席树,用 path copy 的思想:在外层树上把 的影响路径给copy一份。对于路径上的每个点,要修改的那个儿子就递归做,不要修改的那个儿子直接继承原树。
考虑复制的时候怎么快速维护。设它影响路径上有个点 ,我们把它复制到 。那么 就是 加上一个 位置的插入。
只有这个内层树操作是不好做的,剩下的操作都比较simple。考虑一下,我们相当于要支持:
- 有若干颗树
- 每次给 ,令 这颗树为 这颗树插入一个 位置
- 要求维护每棵树的信息
注意到这玩意也可以用可持久化做,把 看成版本就行了。
那我们内层也要维护一个可持久化树,来支持这个操作。
例题: bzoj3489
转换一下问题,设 表示前一个/后一个和当前相同的位置。问题变为:
有若干点 ,每次给 ,求满足: 的点中,最大的 。
注意到 这一维是一个 ,把它看成是版本,维护一个可持久化树套树。树套树里面维护 两维
然后就搞一个可持久化的树套树求矩形max就行了。
时空复杂度均为 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】