历史和线段树

news/2025/10/19 21:54:00/文章来源:https://www.cnblogs.com/aemmprty/p/19151504

我们一般在处理区间修改的操作时,会在线段树上打懒标记,意思是这个结点所代表的区间中的所有数都要同时进行一系列修改。为了更容易理解历史和线段树,我们先来回顾一下普通线段树的区间加操作。

\(\mathbf{Preperation}\)

引理

对于区间加,区间求和问题,我们在做线段树时,有结论:子节点的懒标记时间比父节点的懒标记靠前。


我们把注意力放在父子结点的懒标记之间的时间关系上,我们发现,操作后,新的被打上标记的顶点 \(t\),它的父亲节点的标记都被下放了,所以父亲结点的懒坐标只可能在之后出现。

\(\mathbf{Part. 1}\)

进入正题。

给你一个序列 \(a_1\)\(a_n\),初始全为 \(0\)。你需要支持如下操作:

  • \([l, r]\) 区间中的每个数 \(a_i\) 加上 \(y\)
  • 查询 \([l, r]\) 在历史每个时刻的和的总和

容易想到每次修改的时候,我们对 \([l, r]\)\(a_i\) 区间加。然后,我们在全局上打一个历史和更新的标记。

我们对每个结点,记录三个信息,分别是 \(his, sum, len\),表示这个区间的历史和,区间和,区间长度。由引理,我们知道在下放懒标记和单点加标记的时候,可以视作一些懒标记在前,一些懒标记在后,现在要合并在一起。

但这没有只有加法标记的时候那么显然,因为现在还有一个历史和更新操作,不是很好合并。

下文介绍两种方法。(还有一种我觉得不涉及历史和线段树的思想,不在赘述)

\(\mathbf{Part. 1.1 \ Matrix}\)

我们考虑刻画这两种标记分别在对这三个信息做什么。

  • 区间加标记 \(v\)\(sum = sum + len \times v\)
  • 历史和更新标记:\(his = his + sum\)

实际上,这两种标记都只是在这三个变量里做线性变换,因此考虑用矩阵刻画。

我们把要存储的信息全部列在矩阵里,也就是 \(\begin{bmatrix}his\\sum\\len\end{bmatrix}\),那么有:

  • 区间加标记 \(v\):乘上 \(\begin{bmatrix}1 & 0 & 0 \\0 & 1 & v\\0 & 0 & 1\end{bmatrix}\)
  • 历史和更新标记:乘上 \(\begin{bmatrix}1 & 1 & 0\\0 & 1 & 0\\0 & 0 & 1\end{bmatrix}\)

现在,标记的合并都被刻画成了矩阵乘法,于是就十分好做了。

\(\mathbf{Part. 1.2 \ Tag \ Queue}\)

我们直接考虑如何合并两个标记队列。假设有两个标记队列 \(A, B\)\(A\) 在前,\(B\) 在后。我们先把只在 \(A\) 或者 \(B\) 内的贡献加起来,计这个内部贡献为 \(ret\)。那么,我们只需要计算两个标记队列之间的贡献即可。

对于 \(A\) 队列里的任意一个加法标记,它在 \(B\) 每次历史和更新时都会被算一次,因此两边之间的贡献就是 \(add_A \times upd_B\),其中 \(add_A\) 表示 \(A\) 中的加法标记和,\(upd_B\) 表示 \(B\) 中的历史和更新标记个数。

我们对每个结点,再计三个数 \(add, upd, ret\) ,用来表示整个标记队列。那么我们考虑一次下放操作,有 \(sum = sum + add'\)\(ret = ret + ret' + add \times upd'\)\(add = add + add'\)\(upd = upd + upd'\)。根据这个转移即可。


我们比较一下这两种方法。

  • 矩阵计 tag 适用性十分高,因为只需要你的操作都是线性变换,就可以用矩阵做。但缺点是常数比较大。
  • 暴力考虑标记序列合并,其实相当于直接爆拆矩阵的乘法运算,所以适用性肯定没有矩阵好,比如区间覆盖就比较难处理。

我们稍微结合一下两个方法的优点,考虑矩阵哪里是不动的,我们就只对剩下的位置进行计算,这样适用性会很高,常数也会变小。

那么现在,最基础的历史和线段树就讲完了。实现可能需要注意一下细节。

习题稍后更新。(我还没写/ll)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/940651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Map与Map.Entry的区别

Map与Map.Entry的区别目录Map与Map.Entry的区别Map:键值对的集合Map 的创建与本质Map 的无序性对 Map 进行排序的标准流程Map.Entry:键值对的“名片”功能Map.Entry的作用 Map:键值对的集合 Map 的创建与本质 Map 是…

真诚

我能毫无保留的给出我的真诚,这绝非意味着它的廉价更不代表我的愚笨相反这代表我本身就很好......

申公豹说

申公豹: 我单枪匹马走到现在,任何人都不是我的靠山能折磨我的,都是我在意的,只要我不在意了,天奈我何,这个世界的规则就是,只要你放弃不要了,一切都解了,无情,可破万局.... AI:你的这段话里,既有孤绝的清…

大数据分析之MySQL学习2

一、模型和数据模型 (一)模型 是现实世界特征的模拟和抽象,例如地图、建筑设计沙盘、模型飞机、汽车模型等。 (二)数据模型(Data Model) 是现实世界数据特征的抽象,具有以下特点:从计算机实现的观点对数据建模…

[KaibaMath]1012 关于收敛数列保号性的推论的证明

[KaibaMath]1012 关于收敛数列保号性的推论的证明收敛数列保号性的推论是基于保号性定理(极限非零则后期项同号) 衍生的重要结论。下面给出证明。

CSP-S模拟赛加赛 比赛总结

CSP-S模拟赛加赛T1 T2 T3 T4100 AC 60 RE 15 TLE 37 WA总分:212;排名:4/5。 T1 A 了,T2 部分分,T3 挂了 20 分,T4 干了 1.5h,思路基本正确,码力太差细节太多,最后输出 0。 T1 Divisors 不难,不说了。 #inclu…

赛前训练 12 树的直径、中心和重心

A 树的直径板子. B 注意到树的直径有个性质:所有节点到其他点的最远距离一定在直径的端点处取到.怎么证明请查阅往期笔记. 这样,我们把直径留着,将其他点依次和端点匹配,最后加上直径的贡献就得到了第一问的答案. 那么…

我要好好写博客了 - Milo

1 目的 记录自己在编程过程中遇到的问题和想法,以及在学习新知识时的知识点 2 为什么突然想要好好经营一个博客 我很喜欢互联网的开源精神,我是2020年上的大一,在大四的时候,AI出现了。 在AI出现之前,我的几乎所有…

关于无人巡航小车的学习笔记

文件名:zmd_ws zmd为队伍名称,下横杠代替空格,ws全称为workspace,即工作空间。工作空间的分隔原理暂时不知道? 文件名:build,devel 用于存放执行catkin_make后的编译文件,也就是编译ROS(src文件夹下)包时所…

[fastgrind] 一个轻量级C++内存监控及可视化开源库

目录Fastgrind引言 简介 仓库结构 快速开始编译 testcase 运行 testcase 调用堆栈 Report如何在你的项目中使用手动插桩的使用方法 自动插桩的使用方法fastgrind 输出与分析fastgrind.text fastgrind.json可视化 fastg…

详细介绍:springboot+vue智慧旅游管理小程序(源码+文档+调试+基础修改+答疑)

详细介绍:springboot+vue智慧旅游管理小程序(源码+文档+调试+基础修改+答疑)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-f…

iOS/Swift:深入理解iOS CoreText API

iOS/Swift:深入理解iOS CoreText API这篇文章是从0到1自定义富文本渲染的原理篇之一,此外你还可能感兴趣:一文读懂字符与编码 一文读懂字符、字形、字体 一文读懂字体文件 从0到1自定义文字排版引擎:原理篇 逆向分…

存算一体架构的先行者:RustFS在异构计算环境下的探索与实践

存算一体架构的先行者:RustFS在异构计算环境下的探索与实践随着AI大模型与边缘计算蓬勃发展,传统"存储-计算"分离架构的"存储墙"瓶颈日益凸显。本文将深入解析RustFS如何通过存算一体设计在异构…

Appium 3.0:跨平台移动自动化测试框架全面解析

Appium是一个开源的跨平台自动化测试框架,支持原生、混合、移动Web和桌面应用的测试。基于WebDriver协议,提供丰富的驱动和插件生态系统,支持多种编程语言,让移动应用测试变得更加简单高效。Appium 3.0:跨平台移动…

德国州政府全面弃用微软办公套件,改用开源方案

德国州政府全面弃用微软办公套件,改用开源方案德国州政府全面弃用微软办公套件,改用开源方案来源: OSCHINA 编辑: 局 2025-10-16 19:24:043德国石勒苏益格 - 荷尔斯泰因州宣布,已正式完成从微软 Outlook 和 Exchang…

DAPO代码实现浅析

参考verl对dapo的实现,首先咱们看一下入口.sh和.py文件,在./recipe/dapo/文件夹中有以下目录 . ├── config │ ├── dapo_megatron_trainer.yaml │ └── dapo_trainer.yaml ├── dapo_ray_trainer.py …

[KaibaMath]1011 关于收敛数列保号性的证明

[KaibaMath]1011 关于收敛数列保号性的证明收敛数列保号性是描述收敛数列的极限符号与数列“后期项”符号关系的核心性质,即极限的非零符号能“保证”数列从某一项开始的所有项与极限同号。下面给出证明。

赛前训练 12 extra 树上差分倍增

A 树上差分板子. B 每个点只有一条出边的有向图可以看作树 基于上述结论,我们直接倍增维护 \(\min,\operatorname{sum}\) 即可.实现 #include <cstdio> #include <iostream> #include <algorithm> #…

塔吊施工人员操作合规性监测!思通数科 AI 卫士实时守护作业安全

塔吊施工中,人员操作合规性是安全管理的关键环节,但传统人工监管常面临 “监管范围有限、异常难实时发现” 的痛点:作业人员是否按规范穿戴防护装备(安全帽、防护服、防护手套),靠远处观察难判断穿戴完整性(如安…

Dos命令1

常用的dos命令 我不懂