《区间最值操作与历史最值问题》(吉如一)阅读笔记
A. 基础区间最值操作
问题描述
给定一个序列
- 给定区间,将内部所有元素对
取最大值。 - 询问区间和。
解法
首先,传统的线段树区间操作时间复杂度为
认真观察一下这个问题,发现它其实是一个类似“区间条件赋值”的东西,根据类似珂朵莉树一些问题的经验,这种题目基于颜色种类数势能分析一下往往可以让复杂度对。所以考虑对某个节点的一次向下递归起码要让这个节点所对应的区间内颜色种类数减一。对于这样的要求,首先可以考虑如果区间最小值大于
现在证明这样做的复杂度是对的。显然地,向下进行一次递归消耗
B. 区间最值+区间加
问题描述
给定一个序列
- 给定区间,将内部所有元素对
取最大值。 - 给定区间,将内部所有元素增加
(可能为负)。 - 询问区间和。
解法
加入了区间加的操作,那么能不能按照原来的做法去做呢?考虑单次区间加对于势能函数的影响。注意到单次区间加可能让在区间内外都有分布的颜色分裂成两种,这对势能函数的影响是灾难性的,所以先前的势能分析不再有效。但是似乎也不能卡满?考虑其他证明思路。
考虑这样刻画区间严格次小值:对于一个线段树节点,取它区间内的最小值作为标记。如果标记和父亲的标记相同就删除这个标记。那么任何点的标记比祖先的标记更大,区间严格次小值就是子树内(不包括自身)的最小标记。考虑标记的总个数。一开始标记只有
现在分析取最大值操作时向下递归操作的时间开销。首先,向下递归说明子树内存在至少一个标记使得标记数值小于
C. 区间取最大+取最小
问题描述
给定一个序列
- 给定区间,将内部所有元素对
取最大值。 - 给定区间,将内部所有元素对
取最小值。 - 询问区间和。
解法
直接参考问题 A 即可,记录区间最大、次大、最小、次小。吉老师这里说是双
第一部分·小结
以上的思路,即将区间最值操作转化为对最值的区间加操作,正是 Segment Tree Beats 的基础。它的复杂度正确性依赖于对区间最值操作的势能分析。实际上,双
接下来,基于“划分区间最值与非最值转化问题”的基本思想,还可以利用这一算法解决一系列更为复杂的问题。
D. 区间最值+区间加+区间修改记录
这个问题比较简单,但是也很基础。
问题描述
给定一个序列
- 给定区间,将内部所有元素对
取最大值。 - 给定区间,将内部所有元素对
取最小值。 - 给定区间,将内部所有元素加上
(可能为负)。 - 询问区间和。(以上均针对
) - 询问
的区间和。
解法
通过维护的区间最大、次大、最小、次小数的信息,可以将
需要讨论区间内颜色数小于
双数组区间加+区间最值 维护和的最值
问题描述
给定两个序列
- 给定区间,将内部所有
的元素对 取最大值。 - 给定区间,将内部所有
的元素增加 (可能为负)。 - 给定区间,将内部所有
的元素对 取最大值。 - 给定区间,将内部所有
的元素增加 (可能为负)。 - 询问区间内
的最大/小值。
解法
参考上述的分类思想,可以将一个线段树节点区间内的数按照是不是
Bonus: 个序列
时间
区间最值+区间加+区间
问题描述
给定一个序列
- 给定区间,将内部所有元素对
取最大值。 - 给定区间,将内部所有元素增加
(可能为负)。 - 询问区间
。
解法
首先,区间加区间
接下来咕咕咕了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现