st表

今天学了ST表,来瞎几把乱写点 自己写一份总结。

首先给你一个 value 数组,让你求 ,任意区间内的最大值 / 最小值(RMQ问题)

用st表的话是这样的:

预处理部分:

  有一个数组st[ i ][ j ] , 表示在 value 数组中 下标为 i ,长度为2j ,这个区间内的最值,也就是 [ i , i + 2j -1] 这个区间的最值。

  然后我们把这个长度为 2j 的区间掰成两半 , 每一块的区间长度就等于 2j / 2 = 2j - 1

  这两部分的区域用st来表示的话就是 : ① st[ i ][ j - 1] ②st[ i + 2j - 1][ j - 1]

  所以转移方程就是 : st[ i ][ j ] = max / min (st[ i ][j - 1] , st[i + 2j - 1][j - 1]) 

  初始状态是 st[ i ][ 0 ] = value[ i ]

查询部分:

  因为我们求的是任意长度的区间 , 但是st表存的是 长度为 2的区间的最值 , 所以查询的时候还要进行一个拆分 

  比如查询 区间[3 , 11] 的最大值 , 长度为9 , 那么我们就查[3 , 10] 和[4 , 11] 的最大值(因为这两个区间长度为8 = 23 , 且合并起来刚好覆盖了[3 , 11]整个区间)

  所以查询 区间[x , y] 的最值时 , ans = max / min (st[ x ][ log2(y - x + 1) ] , st[ y - 2 (int)log2(y - x + 1)  + 1][ log2(y - x + 1) ] 

posted @ 2020-03-14 04:48  GoodVv  阅读(160)  评论(1编辑  收藏  举报