Processing math: 100%

线段树小记

好像网上部分对于那些历史版本(历史版本和,历史最大值)的操作的讲解都不够直观。

核心思想就是在线段树中维护两个数组 ABA 是普通线段树维护的东西,B 是历史版本的信息,然后有两种操作,一种操作是对于 A 的修改,另一种就是将 A 中的一个线段的信息通过一种方式敲到 B 上,将这一过程记为 AB

首先有两种 tag,一种是一个对于 A 的操作,设为 S,一种是对于 ABtag ,记为 T

然后问题就出来了,因为最后 tag 会堆积成这个样子:

SS T SS T SS 

然后就要处理这种东西,其实就是考虑旧的 S 对于新来的 T 造成的影响。

这里以区间加,历史版本和为例。

Av 表示线段树节点所对应区间 A 数组的和,Bv 表示所对应 B 数组的和。

区间加大家都会,对于每个节点维护一个加法 tag Si 记录将要对于所有子节点的 A 将要加上的值。

考虑对于线段树节点 v 儿子 sBs 的贡献。

首先单纯没有 S 的记录非常简单,就是 T 的次数乘上原来儿子上存的值,这里存一个 tag Tv 表示这个系数。

然后就是上方所说旧的 S 对于每个 T 的影响,对于每个 T 最后的贡献就是 lens×S ,其中这个 lenv 表示区间长度,S 表示在当前 T 操作时加法标记的总和,再开一个 tag tv 表示所有 S 的总和。

最后 pushdown 的操作就成了。

先下放 Tvtv ,再下放 Sv 就可以了。

然后这个思想的局限性也出来了,首先是线段树对于 A 操作的局限性,然后就是要求快速计算所谓「旧的 S 对于新来的 T 造成的影响」。

posted @   AxDea  阅读(169)  评论(0编辑  收藏  举报
阅读排行:
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
· 程序员转型AI:行业分析
历史上的今天:
2021-01-24 题解:AtCoder Beginner Contest 189
点击右上角即可分享
微信分享提示