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 计算。

浙公网安备 33010602011771号