RMQ—ST表
RMQ(Range Minimum/Maximum Query),RMQ是一个求给定范围内最大最小值的问题。我们一般使用st算法来解决这类问题(Sparse Table)。这个算法原理不难,主要是各种边界条件容易错
比如一个数组num[1000],我们想求num[x]~num[y]之间所有数的最大或最小值,如果只有一对x,y显然这个问题很好解决,但如果多对x,y或者任意一段长度内的最大最小值就不是那么好求了。
st算法是一个动态规划又有点类似二分的算法,通过维护一个二维数组st[i][j],st[i][j]代表的是num[i]~num[i+2^j-1]这段子数组之间的所有数的最大或最小,为什么是i+2^j-1?这是为了保证这个子数组一共有2^j个数,自己简单推一下就知道了。
我们发现st[i][0]就是num[i]~num[i+2^0-1]间的最大最小值,显然就只能是num[i],这样我们就能初始化st[i][0],而剩下的我们通过状态转移方程:
st[i][j] = min/max( st[i][j-1], st[i+(1<<(j-1))][j-1] )得到 ,<<是位运算,相当于得到2^(j-1)这个数,这个状态转移方程基本上就是二分,num[i]~num[i+2^j-1] 可以分成两个子数组num[i]~num[i+2^(j-1)-1] 和 num[i+2^(j-1)]~num[i+2^j-1](这也是为什么st要定义成2的次方形式,就是为了方便二分),两个子数组都有2^(j-1)个数
根据st的定义,稍微推算一下就可以得出状态转移方程,由于我们第一步推了st[i][0]的所有值,而状态方程都有[j-1]这个形式,所以构建整个st数组可以通过两重循环,j在外i在内,从j=1开始(j-1=0)。
这些都好理解,蛋疼的是边界的确定,一定要理解你写的边界究竟是数组形式(0~n-1)还是从1~n的形式
void RMQinit( int lhs, int rhs )
{
for( int i = lhs; i < rhs; i++ )
st[i][] = num[i]; for( int j = ; lhs + (<<j) - < rhs; j++ )
for( int i = lhs; i + (<<j) - < rhs; i++ )
st[i][j] = min( st[i][j-], st[i + (<<(j-))][j-] );
}
光求了st数组还不够,比如我们要找num[600]~num[999]之间的最大最小,而st都是以2的 次方形式给出,999-600+1= 400,400又是2的几次方呢?
所以我们寻找与400最接近但又不大于400的2的次方数,即256(这样能保证600~999这段区间一定会被覆盖完全),这样分别寻找600~600+256,和999-256+1~999间最大最小,再在这两个值中取最大最小。
int find( int lhs, int rhs )
{
int k = (int)(log10((rhs-lhs+))/log10(2.0));
return min( st[lhs][k], st[rhs-(<<k)+][k] );
}
比如这段代码,如果输入find(600,999)k就是400取以2为底的对数,取整后就应该是8,2^8就是256,这样st[lhs][k]就是600~600+2^8,st[rhs-(1<<k)+1][k]就是999-2^8+1-999
RMQ—ST表的更多相关文章
- RMQ——ST表
ST表 ST表是一种解决RMQ问题的强有力工具, 可以做到O(nlogn)预处理,O(1)查询. st[i][j] 表示区间 [i, i + 2 ^ j - 1] 的最大值. 初值 st[i][0] ...
- hdu6356 Glad You Came 杭电多校第五场 RMQ ST表(模板)
Glad You Came Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) ...
- 51Nod.1766.树上最远点对(树的直径 RMQ 线段树/ST表)
题目链接 \(Description\) 给定一棵树.每次询问给定\(a\sim b,c\sim d\)两个下标区间,从这两个区间中各取一个点,使得这两个点距离最远.输出最远距离. \(n,q\leq ...
- RMQ问题 - ST表的简单应用
2017-08-26 22:25:57 writer:pprp 题意很简单,给你一串数字,问你给定区间中最大值减去给定区间中的最小值是多少? 用ST表即可实现 一开始无脑套模板,找了最大值,找了最小值 ...
- 算法学习 - ST表 - 稀疏表 - 解决RMQ问题
2017-08-26 21:44:45 writer:pprp RMQ问题就是区间最大最小值查询问题: 这个SparseTable算法构造一个表,F[i][j] 表示 区间[i, i + 2 ^ j ...
- POJ 3264 Balanced Lineup 【ST表 静态RMQ】
传送门:http://poj.org/problem?id=3264 Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total S ...
- [poj3264]rmq算法学习(ST表)
解题关键:rmq模板题,可以用st表,亦可用线段树等数据结构 log10和log2都可,这里用到了对数的换底公式 类似于区间dp,用到了倍增的思想 $F[i][j] = \min (F[i][j - ...
- 【模板】RMQ问题的ST表实现
$RMQ$问题:给定一个长度为$N$的区间,$M$个询问,每次询问$[L_i,R_i]$这段区间元素的最大值/最小值. $RMQ$的高级写法一般有两种,即为线段树和$ST$表. 本文主要讲解一下$ST ...
- Codeforces 803G Periodic RMQ Problem ST表+动态开节点线段树
思路: (我也不知道这是不是正解) ST表预处理出来原数列的两点之间的min 再搞一个动态开节点线段树 节点记录ans 和标记 lazy=-1 当前节点的ans可用 lazy=0 没被覆盖过 els ...
随机推荐
- pywebview gui='cef' 生成app报错—— 中断点 已到达中断点
pywebview是一个轻量级跨平台包装器,允许在其自己的本机GUI窗口中显示HTML内容.它提供了桌面应用程序中Web技术的强大功能,隐藏了GUI基于浏览器的事实.这个玩意儿好啊,可以直接让我们做的 ...
- 机器学习-线性回归算法(单变量)Linear Regression with One Variable
1 线性回归算法 http://www.cnblogs.com/wangxin37/p/8297988.html 回归一词指的是,我们根据之前的数据预测出一个准确的输出值,对于这个例子就是价格,回归= ...
- 2019-8-30-PowerShell-通过-WMI-获取系统安装的驱动
title author date CreateTime categories PowerShell 通过 WMI 获取系统安装的驱动 lindexi 2019-08-30 08:58:39 +080 ...
- JS数组 谁是团里成员(数组赋值)var myarray = new Array(66,80,90,77,59);//创建数组同时赋值
谁是团里成员(数组赋值) 数组创建好,接下来我们为数组赋值.我们把数组看似旅游团的大巴车,大巴车里有很多位置,每个位置都有一个号码,顾客要坐在哪个位置呢? 第一步:组个大巴车 第二步:按票对号入座 大 ...
- GridView编辑删除
A前台代码 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test.asp ...
- Python全栈开发:基本数据类型
1.数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位系统上,整数的位数为64位,取值范围为-2 ...
- Func-Chain.js 另一种思路的javascript异步编程解决方案
本文转载自:https://www.ctolib.com/panruiplay-func-chain.html Func-Chain.js 另一种思路的javascript异步编程,用于解决老式的回调 ...
- 180608发现的一个有趣的Douyin-Bot项目
今日发现的github 项目 Douyin-Bot 抖音机器人发现漂亮小姐姐 :sweat_smile: 在开发者模式下,找到指针位置,开启之后,当点击屏幕时,可以获取点击屏幕处的xy坐标了 我使用的 ...
- 关于JAVA项目中CLASSPATH路径详解
写的不错:http://blog.csdn.net/cheney521/article/details/8672066 以下内容源于复制,把自己觉得不错的东西收集起来: 在dos下编译java程序,就 ...
- Windows相关命令
1.查看端口8080被哪个进程占用 netstat -ano | findstr "8080" 2.查看进程号为5768对应的进程 tasklist | findstr " ...