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 ...
随机推荐
- Java中关于注释、标识符、变量、常量、数据类型、类型转换、转移字符以及数值型的表现形式的详解
Java文件的注意事项 在同一个Java文件中,可以定义多个类,但是被public修饰的类只能够有一个,并且此类名要与文件名一致. 在同一个类中,可以定义多个方法,但是名字叫做main的方法只能有一个 ...
- 面试系列16 redis的持久化
1.RDB和AOF两种持久化机制的介绍 RDB持久化机制,对redis中的数据执行周期性的持久化 AOF机制对每条写入命令作为日志,以append-only的模式写入一个日志文件中,在redis重启的 ...
- CSS三大特性之继承性
1.并不是所有的属性都可以继承,只有以color/font/text/line开头的属性 才可以继承. 2.在CSS的继承中,不仅仅是儿子可以继承,只要是后代都可以继承. 3.继承中的特殊性 3.1 ...
- 输出内容 document.write() 可用于直接向 HTML 输出流写内容。简单的说就是直接在网页中输出内容
输出内容(document.write) document.write() 可用于直接向 HTML 输出流写内容.简单的说就是直接在网页中输出内容. 第一种:输出内容用""括起,直 ...
- Ubuntu GitHub操作——使用仓库
若你想更新github代码 在正式更新github仓库时,可以先 git status 查看一下分支master的状态 1.因为是更新代码,所以不用前面那么多步骤,直接添加所更新的文件到 分支mast ...
- springboot指定项目访问路径前缀
springboot默认的运行方式是没有项目前缀的 如果这时候我们要加上调试或者发布,可以使用下面的方法加上 方法:
- nc 文件的nan识别
表现形式:print()结果为 -- 打印type为numpy.ma.core.MaskedConstant 使用 if type(x) == np.ma.core.MaskedConsta ...
- vue基础知识总结
vue不支持安卓6.0以下版本,切记!!! 1.创建vue实例 var vm = new Vue({ el: '#app', //所指向的dom的id data:{ }, //与dom元素绑定的数据 ...
- 杂项-公司:AT&T
ylbtech-杂项-公司:AT&T AT&T公司(英语:AT&T Inc.,原为American Telephone & Telegraph的缩写,也是中文译名美国电 ...
- 安装elasticsearch-head插件
安装node ###下载 wget https://nodejs.org/dist/v10.15.3/node-v10.15.3-linux-x64.tar.xz ### 解压 tar xvf nod ...