O(n)-O(1) RMQ 的普及组实现

今天划水看到的:https://zhuanlan.zhihu.com/p/79423299

四毛子算法前半部分的核心思想是,对序列每 \(O(\log n)\)​​​ 分一块,这样整块之间预处理 ST 表的复杂度为 \(O(n)\),再预处理每个点到块头和块尾的最值,此时对于不在同一块的 \(l,r\) 均可以 \(O(1)\) 查询了。

仅考虑 \(l,r\) 在同一块的情况。但是四毛子散块的处理略麻烦。

考虑对每个点预处理块头到它的单调栈信息,记为一个 01 串,那么取出 \(r\) 对应的串之后,只需要 lower_bound 第一个 \(\ge l\)\(1\) 位置即可。

如果单个整形可表示的二进制位数 \(w>\log n\),我们可以去掉 \(l-1\) 及前面的数后直接使用 __builtin_clz 计算。

疑似普及了?那我很封闭了。

拓展阅读:https://www.luogu.com.cn/article/85u08did

posted @ 2026-01-13 11:59  Jordan_Pan  阅读(21)  评论(4)    收藏  举报