• 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) ] 

  • 相关阅读:
    msyql 死锁
    yii2 操作数据库
    yii2 加载静态资源
    Yii2 之 UrlManager 实践 (一)
    Wordpress 之 Rewrite Rules
    yii2 使用gii生成代码文件
    权限设计的杂谈
    NodeJS —— 自定义流的实现
    浅析递归
    请将你的App签名文件放进保险箱
  • 原文地址:https://www.cnblogs.com/GoodVv/p/12490381.html
Copyright © 2020-2023  润新知