洛谷 P3865 ST表
ST表 ST表的功能很简单 它是解决RMQ问题(区间最值问题)的一种强有力的工具 它可以做到 O(nlogn) 预处理, O(1) 查询最值 是一种处理静态区间可重复计算问题的数据结构,一般也就求求最大最小值辣。 ST表的思想是先求出每个[i, i + 2^k)的最值。 注意到这样区间的总数是O(N log N)的. 预处理 不妨令f i,j 为[i, i + 2^j)的最小值。 那么首先fi,0的值都是它本身。 而f i,j = min(f i,j−1 , f i+2^j−1,j−1 ) 这样在O(N log N)的时间内就处理好了整个ST表 询问 比如我们要询问[l, r]这个区间的最小值. 找到最大的k满足2^k ≤ r − l + 1. 取[l, l + 2^k), [r − 2^k + 1, r + 1)这两个区间。 注意到这两个区间完全覆盖了[l, r],所以这两个区间最小值 较小的一个就是[l, r]的最小值。 注意到每次询问只要找区间就行了,所以复杂度是O(1). 解释一下数组含义: ST[j][i]为从j开始的长度为2^i的区间的最大值 Log[x]为比x小的最大的2^y 的y值(或者说是log x 下去整 ) 代码: #include<cstdio> #include<iostream> #include<cstdlib> #include<iomanip>