ST表
话说以前都不会 S T \tt ST ST表,现在来学习一波。
S T \tt ST ST表是一种支持离线 R M Q \tt RMQ RMQ的数据结构。预处理为 O ( n l o g ) O(nlog) O(nlog)。与线段树和树状数组相比更优的是,它的查询时间复杂度为 O ( 1 ) O(1) O(1) 而非 O ( l o g ) O(log) O(log)。下面来讲讲它的实现。
S T \tt ST ST表的主体是一个二维数组 S t [ i ] [ j ] St[i][j] St[i][j], S t [ i ] [ j ] St[i][j] St[i][j] 表示 [ i , i + 2 j − 1 ] [i,i+2^j-1] [i,i+2j−1] 的最值。
转移和倍增似乎差不多: S t [ i ] [ j ] = min / max ( S t [ i ] [ j − 1 ] , S t [ i + 2 j − 1 ] [ j − 1 ] ) St[i][j]=\min / \max(St[i][j-1],St[i+2^{j-1}][j-1]) St[i][j]=min/max(St[i][j−1],St[i+2j−1][j−1])
考虑查询: [ l , r ] [l,r] [l,r] 的最值。似乎就是不断看 S t [ l ] [ j ] St[l][j] St[l][j], j j j 能取到使 l + 2 j − 1 < = r l+2^j-1<=r l+2j−1<=r 的最大值,然后 l l l 再跳到 l + 2 j l+2^j l+2j,分成两个部分搞就行。