ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

线段树小记

2022-01-24 11:04:54  阅读:150  来源: 互联网

标签:对于 线段 cdots tag sum 节点 小记


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

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

首先有两种 tag,一种是一个对于 \(A\) 的操作,设为 S,一种是对于 \(A\rightarrow B\) 的 tag ,记为 T

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

\[S\cdots S\ T\ S\cdots S\ T\ S\cdots S\ \]

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

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

设 \(A_v\) 表示线段树节点所对应区间 \(A\) 数组的和,\(B_v\) 表示所对应 \(B\) 数组的和。

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

考虑对于线段树节点 \(v\) 儿子 \(s\) 的 \(B_s\) 的贡献。

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

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

最后 pushdown 的操作就成了。

先下放 \(T_v\) 和 \(t_v\) ,再下放 \(S_v\) 就可以了。

标签:对于,线段,cdots,tag,sum,节点,小记
来源: https://www.cnblogs.com/Ax-Dea/p/15838582.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有