当前位置: 首页 > news >正文

关于历史和线段树

这是一篇测试文章。


这个线段树是用来解决形如以下的问题的(模板题 loj193):

  • 区间加。
  • 区间查询历史所有版本的和。
做法一

考虑维护 $c_i = \texttt{hsum}_i - t \times a_i$,其中 $t$ 为时间戳。

那么每次更新 l r x 时就将 $c_i ← c_i - t \times x$,查询时的答案就是 $\texttt{sum}_i \times t + c_i$,只需要维护一个普通的区间加线段树即可。类似于计算每个时刻的 $a_i$ 对历史和贡献了多少,反正显然是正确的。代码。

(可能)适用性不高。

做法二

大多人看到这个问题的第一反应应该是维护值 $\texttt{sum}$,$\texttt{hsum}$ 和懒标记 $\texttt{add}$。对于每次加 $x$,我们都需要将 $\texttt{sum}_i ← \texttt{sum}_i + x \times (r - l + 1)$,$\texttt{add}_i ← \texttt{add}_i + x$。但是,可以发现这样直接维护无法正确的将 $x$ 的贡献加到 $\texttt{hsum}$ 上。

定义另一种懒标记(或者应该叫一次操作)upd 为对历史和贡献一次,即为 $\texttt{hsum}_i ← \texttt{hsum}_i + \texttt{sum}_i$。考虑一次 pushdown 是怎么样的。

对于一个位置 $x$ 和他的某个儿子 $s$,设这两个节点上积压了两坨没有下传的懒标记集合为 $A$ 和 $B$。一次 pushdown,就是计算 $A$ 对 $B$ 产生的影响。

设 $A$ 里面有 $cnt$ 次 upd,则相当于 $\texttt{sum}_s$ 对 $\texttt{hsum}_s$ 产生了 $\texttt{cnt}_x$ 次贡献,而剩下的加懒标记则一并对 $\texttt{hsum}_s$ 产生了一次贡献(系数为 $r - l + 1$),即

$$\texttt{hsum}_s ← \texttt{hsum}_s + \texttt{cnt}_x \times \texttt{sum}_s + \texttt{hadd}_x \times (r - l + 1)$$.

其中 $\texttt{hadd}$ 表示历史懒标记和。

(为什么这样是对的?因为儿子节点的懒标记时间比父节点的懒标记总是靠前,所以可以这样做。)

结合上面的内容,我们发现我们只需要维护值 $\texttt{sum}$,$\texttt{hsum}$ 和懒标记 $\texttt{add}$,$\texttt{cnt}$ 和 $\texttt{hadd}$ 即可。而上文所说的集合具体是什么顺序,我们不需要去关心,可以只用上述的东西刻画出来。

做法三

矩阵乘法。咕咕咕。

例题
  • P8868 [NOIP2022] 比赛

首先离线扫描线,单调栈维护一下,将任务转化为:维护一个数据结构,使得他支持:

  • 对数组 $X$ 区间加。
  • 对数组 $Y$ 区间加。
  • 求 $\sum\limits_{i = l}^r X_i \times Y_i$ 的历史和。

(其中,我们利用单调栈独特的性质可以把区间赋值转化为若干个区间加以更好做,此时区间个数是 $\mathcal{O}(n)$ 量级的。)

如果我们不需要维护历史和而是单纯的区间查询,则我们显然需要维护值 $\texttt{sum}$,$\texttt{sumx}$,$\texttt{sumy}$ 和懒标记 $\texttt{addx}$ 和 $\texttt{addy}$。剩下四个转移是简单的,$\texttt{sum}$ 的转移可以简单推出是

$$\texttt{sum} ← \sum\limits_{i = l}^r (X_i + \texttt{addx})(Y_i + \texttt{addy}) = \sum\limits_{i = l}^r X_i \times Y_i + X_i \times \texttt{addy} + Y_i \times \texttt{addx} + \texttt{addx} \times \texttt{addy} = \texttt{sum} + \texttt{sumx} \times \texttt{addy} + \texttt{sumy} \times \texttt{addx} + \texttt{addx} \times \texttt{addy} \times (r - l + 1)$$.

(注意区分下标)

考虑引入历史版本和。类似的,我们增加值 $\texttt{hsum}$ 和懒标记 $\texttt{cnt}$,$\texttt{haddx}$,$\texttt{haddy}$ 和 $\texttt{haddxy}$(其中 $\texttt{haddxy} = \texttt{haddx} \times \texttt{haddy}$),则转移易知为

$$\texttt{hsum}_s ← \texttt{hsum}_s + \texttt{sum}_s \times \texttt{cnt}_x + \texttt{sumx}_s \times \texttt{haddy}_x + \texttt{sumy}_s \times \texttt{haddx}_x + \texttt{haddxy}_x \times (r - l + 1)$$

$$\texttt{haddxy}_s ← \texttt{haddxy}_s + \texttt{addx}_s \times \texttt{addy}_s \times \texttt{cnt}_x + \texttt{addx}_s \times \texttt{haddy}_x + \texttt{addy}_s \times \texttt{haddx}_x + \texttt{haddxy}_x$$.

复杂度 $\mathcal{O}(n \log n)$。

代码。

习题
  • CF997E Good Subsegments
  • P9990 [Ynoi Easy Round 2023] TEST_90
  • CF1824D LuoTianyi and the Function
http://www.zskr.cn/news/51107.html

相关文章:

  • ANGR(符号执行)学习笔记
  • 2025年比较好的花边纸布优质厂家推荐榜单
  • 2025年靠谱的精密冲床厂家推荐及选择参考
  • 2025年口碑好的食品铁罐用户好评厂家排行
  • 2025年口碑好的巡检机器人厂家推荐及选择指南
  • idea:打开黑屏
  • 110.计组--五章
  • 2025年比较好的大型工业油压机品牌厂家排行榜
  • 2025年比较好的钢结构岗亭厂家最新权威推荐排行榜
  • CSP-J/S 2025 赛题重做与反思
  • MATLAB实现机械臂GUI仿真系统
  • 2025年热门的密封箱式多用炉用户好评厂家排行
  • 2025年质量好的家用香氛五金厂家最新实力排行
  • 2025 年 11 月滚珠花键厂家推荐排行榜:圆筒形滚珠花键,法兰型滚珠花键,新型滚珠花键公司精选
  • 实用指南:LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
  • 2025年口碑好的大连装修设计专业测评推荐排行
  • 2025年靠谱的装修品质保障榜
  • 2025年质量好的自动点胶阀厂家最新推荐权威榜
  • 今年国内可靠的安全检测检验企业
  • 2025年热门的心理咨询室产品高配置系统集成榜
  • 2025年热门的电动液压缸厂家最新权威实力榜
  • 2025年口碑好的自动一次成型挂面机行业内口碑厂家排行榜
  • 2025年耐用的防泼水单层网布热门厂家推荐榜单
  • 《重生之我成为世界顶级黑客》第二章:重走前路?不,这是新的开始
  • 2025年知名的止水螺杆实力厂家TOP推荐榜
  • CPython(Python 官方解释器)对 字符串`str` 的底层存储实现,到底是UTF-8,还是UTF-16/UTF-32?
  • 9.Redis 集群(重在理解) - 详解
  • 2025年比较好的静电涂装生产线厂家最新TOP排行榜
  • 安徽合肥异味治理机构哪家强
  • 2025年11月国内优秀的甲醛检测服务推荐指南:专业机构全方位解析