线段树小记
好像网上部分对于那些历史版本(历史版本和,历史最大值)的操作的讲解都不够直观。
核心思想就是在线段树中维护两个数组 A 和 B ,A 是普通线段树维护的东西,B 是历史版本的信息,然后有两种操作,一种操作是对于 A 的修改,另一种就是将 A 中的一个线段的信息通过一种方式敲到 B 上,将这一过程记为 A→B 。
首先有两种 tag
,一种是一个对于 A 的操作,设为 S
,一种是对于 A→B 的 tag
,记为 T
。
然后问题就出来了,因为最后 tag
会堆积成这个样子:
S⋯S T S⋯S T S⋯S
然后就要处理这种东西,其实就是考虑旧的 S 对于新来的 T 造成的影响。
这里以区间加,历史版本和为例。
设 Av 表示线段树节点所对应区间 A 数组的和,Bv 表示所对应 B 数组的和。
区间加大家都会,对于每个节点维护一个加法 tag
Si 记录将要对于所有子节点的 A 将要加上的值。
考虑对于线段树节点 v 儿子 s 的 Bs 的贡献。
首先单纯没有 S 的记录非常简单,就是 T 的次数乘上原来儿子上存的值,这里存一个 tag
Tv 表示这个系数。
然后就是上方所说旧的 S 对于每个 T 的影响,对于每个 T 最后的贡献就是 lens×∑S ,其中这个 lenv 表示区间长度,∑S 表示在当前 T 操作时加法标记的总和,再开一个 tag
tv 表示所有 ∑S 的总和。
最后 pushdown
的操作就成了。
先下放 Tv 和 tv ,再下放 Sv 就可以了。
然后这个思想的局限性也出来了,首先是线段树对于 A 操作的局限性,然后就是要求快速计算所谓「旧的 S 对于新来的 T 造成的影响」。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
· 程序员转型AI:行业分析
2021-01-24 题解:AtCoder Beginner Contest 189