zoukankan      html  css  js  c++  java
  • 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) ] 

  • 相关阅读:
    hdu In Action
    hdu Bus Pass
    acm steps chapter6总结
    原创:扫雷游戏
    排列组合算法
    原创:泛型方法例子
    原创:QQ群发言统计
    菜鸟也做有道难题①
    查询时带Ntext或nvarchar(Max)到底有多影响速度
    使用正则要注意的几点
  • 原文地址:https://www.cnblogs.com/GoodVv/p/12490381.html
Copyright © 2011-2022 走看看