RMQ 问题 — The Method of Four Russians

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) 查询也会了呢

posted @ 2021-09-20 15:58  Kevin090228  阅读(176)  评论(0)    收藏  举报