RMQ 问题 — The Method of Four Russians
RMQ 问题有不少查询复杂度 O(log n) 的做法,但是通过一系列神奇的转化 + O(n) 的预处理,可以让查询变成 O(1) 的
(因为 CSP-S 2021 考到了,所以来写一下
前置知识
笛卡尔树 — 序列和树之间的转化
这里推荐一个博客:https://www.cnblogs.com/reverymoon/p/9525764.html
笛卡尔树在 The Method of Four Russians 里的功能就是把 RMQ 问题转化成了 LCA 问题
RMQ , LCA , 分块
算法核心思想
通过笛卡尔树把 RMQ 转换成 LCA ,求出笛卡尔树的 DFS 序列,则求原序列的 RMQ 就相当于求 DFS 序上点的深度的 RMQ
观察到这个新的 RMQ 有个神奇的性质:|Ai-Ai+1|=1 ,即相邻两数差为 1
考虑分块,设每一块的长度为 len ,块的个数为 b=n/len
通过相邻元素的大小关系可以确定最大(小)值所在的位置,对于 2 的 len-1 次方种大小关系分别预处理最大(小)值的位置
块与块之间的 RMQ 通过 ST 表维护
预处理复杂度 O(len 2^len + b log b) ,在 len 取 1/2log n 时是 O(n) 的,而查询可以做到 O(1) 的
总结
The Method of Four Russians 实际上是用笛卡尔树把 RMQ 转化成了另一个约束 RMQ ,再用分块解决
(现在一看好像 LCA 的 O(1)

浙公网安备 33010602011771号