RMQ算法使用ST表实现
RMQ
RMQ (Range Minimum Query),指求区间最小值。普通的求区间最小值的方法是暴力。
对于一个数列:
\]
对于一个给定的区间\([l, ~r], ~1≤ l ≤r ≤ n\),\(\min \{A_l, A_{l + 1}, \cdots,A_r\}\)的计算就是RMQ问题。
此解法为\(\text{Sparse-Table}\)解法,简称\(ST\)表。
预处理:预处理为对数据进行\(n\log n\)的时间复杂度的处理
令\(d(i, j )\)为\(A_i, A_{i + 1}, \cdots, A_{i + 2^j - 1}\)的最小值,即\(d(i, j)\)的区间长度为\(2^j\),这里用到的是倍增的思想。
则\(d(i, j - 1)\)为\(A_i, A_{1 + 1}, \cdots, A_{i + 2^{j - 1}-1}\)的最小值,区间长度为\(2^{j-1}\)
同样地\(d(i + 2^{j - 1}, j - 1)\)表示的是\(A_{i + 2^{j-1}}, A_{i + 2^{j - 1} + 1}, \cdots, A_{i + 2^{j-1} + 2 ^{j - 1} - 1 = i + 2^j - 1}\)。
所以显而易见:\(d(i, j)\)可以表示为:
\[d(i,j) = \min \{d(i, j - 1), ~d(i + 2^{j - 1}, j - 1)\}
\]查询:
令\(k\)为满足\(2 ^ k ≤ R - L+ 1\)的最大整数,即\(k = \max\{t~|~2^t ≤ R - L + 1, t \in \mathbb Z^+\}\)。
同样地:\(k =[ \log_2 (R-L + 1)]\),所以:\(\operatorname{Query}(L,R) = \min \{d(L,k),~d(R - 2^k + 1, k\}\)
查询的时间复杂度为\(O(1)\)。
注意:由于每次\(pow(2,x)\)非常浪费时间,在计算机内部二进制可以表示为:\(1 << x\)。
代码:
namespace RMQ {
void init(int n) {
for (int i = 1; i <= n; i ++) d[i][0] = a[i];
for (int j = 1; (1 << j) <= n; j ++) {
for (int i = 1; i + (1 << j) - 1 <= n; i ++) {
d[i][j] = min(d[i][j - 1], d[i + (1 << (j - 1))][j - 1]);
}
int query(int l, int r) {
int k = log2(r - l + 1);
return min(d[l][k], d[r - (1 << k) + 1][k]);
}
}
注意:init中的循环顺序不能颠倒,显而易见,\(j\)的值,即区间的长度,必须由小到大。
RMQ算法使用ST表实现的更多相关文章
- [poj3264]rmq算法学习(ST表)
解题关键:rmq模板题,可以用st表,亦可用线段树等数据结构 log10和log2都可,这里用到了对数的换底公式 类似于区间dp,用到了倍增的思想 $F[i][j] = \min (F[i][j - ...
- [算法模板]ST表
[算法模板]ST表 ST表和线段树一样,都能解决RMQ问题(范围最值查询-Range Minimum Query). 我们开一个数组数组\(f[maxn][maxn\log_2]\)来储存数据. 定义 ...
- 算法学习 - ST表 - 稀疏表 - 解决RMQ问题
2017-08-26 21:44:45 writer:pprp RMQ问题就是区间最大最小值查询问题: 这个SparseTable算法构造一个表,F[i][j] 表示 区间[i, i + 2 ^ j ...
- 【算法学习笔记】RMQ问题与ST表
\(0.\) RMQ问题 P1816 人话翻译 给定一个长度为\(n\)的数列\(a\),然后有\(m\)组询问,每次询问一个区间\([l,r]\)的最小值. 其中\(m,n\leq10^5\) \( ...
- 【模板】RMQ问题的ST表实现
$RMQ$问题:给定一个长度为$N$的区间,$M$个询问,每次询问$[L_i,R_i]$这段区间元素的最大值/最小值. $RMQ$的高级写法一般有两种,即为线段树和$ST$表. 本文主要讲解一下$ST ...
- RMQ问题及ST表
RMQ(Range Minimum/Maximum Query)问题指的是一类对于给定序列,要求支持查询某区间内的最大.最小值的问题.很显然,如果暴力预处理的话复杂度为 \(O(n^2)\),而此类问 ...
- RMQ算法 (ST算法)
概述: RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中 ...
- 51Nod.1766.树上最远点对(树的直径 RMQ 线段树/ST表)
题目链接 \(Description\) 给定一棵树.每次询问给定\(a\sim b,c\sim d\)两个下标区间,从这两个区间中各取一个点,使得这两个点距离最远.输出最远距离. \(n,q\leq ...
- 【JZOJ5064】【GDOI2017第二轮模拟day2】友好城市 Kosarajo算法+bitset+ST表+分块
题面 在Byteland 一共有n 座城市,编号依次为1 到n,这些城市之间通过m 条单向公路连接. 对于两座不同的城市a 和b,如果a 能通过这些单向道路直接或间接到达b,且b 也能如此到达a,那么 ...
随机推荐
- 深度解读 - Windows 7核心图形架构细致分析(来自微软)
编辑:马志文 时间: 2009-12-29 如现在大家所想的那样, Windows7 其实是 Windows Vista 的改进版. Windows 7 在 Windows Vista 的基础上进行了 ...
- JDK、JRE、JVM、Android SDK、Android Studio
===================================================== 参考链接: JDK\JRE\JVM:https://www.cnblogs.com/bola ...
- win7+oracle11,vmbox中winxp连接
重启TNSLSNR 打开CMD,输入以下命令. lsnrctl stop lsnrctl start lsnrctl stat /////////////////////////////////// ...
- golang实现依赖注入
golang实现依赖注入 依赖注入是软件工程中经常使用到的一种技术,它提供了一种控制反转的机制,把控制权利交给了调用方.调用方来决定使用哪些参数,哪些对象来进行具体的业务逻辑. 它有几个好处: 1 它 ...
- TCP/IP||UDP广播和多播
1.概述 广播和多播应用于UDP,TCP是一个面向连接协议,意味着分别运行与两个主机内的两进程间存在一个连接,在考虑多个主机内的共享通信网络,每个以太网帧包含源主机和目的主机以太网地址(48bit), ...
- 通过9个Linux-0.11实验学习操作系统
简介 2019年秋,我自学了一下哈工大的操作系统课程,感觉其设计的教程和实验作为操作系统入门是个不错的选择(虽然是基于较老的Linux-0.11写的).实验大致覆盖了操作系统中的核心概念,例如启动.中 ...
- 从零开始のcocos2dx生活(四)ActionManager
文章目录 初始化构造函数 析构函数 删除哈希元素 分配存放动作对象的空间 通过索引移除动作 暂停动作 恢复动作 暂停所有的动作 恢复所有的动作 添加动作 移除所有的动作 移除target中的所有动作 ...
- 【C++】递归 课后习题3-13、3-14
// // main.cpp // 3-13递归Fibonacci级数 // // Created by T.P on 2018/3/21. // Copyright © 2018年 T.P. All ...
- 【原创】够强!一行代码就修复了我提的Dubbo的Bug。
这是 why 技术的第 28 篇原创文章 之前在<Dubbo 一致性哈希负载均衡的源码和 Bug,了解一下?>中写到了我发现了一个 Dubbo 一致性哈希负载均衡算法的 Bug. 对于解决 ...
- 「Poj1845」Sumdiv 解题报告
题面戳这里 啥都别看,只是求 \(a^b\)所有的因数的和 思路: 真没想到! 其实我们可以先将\(a^b\)分解成质因数的 因为\(a^b\)的因数肯定是\(a^b\)的质因数在一定的条件下相乘而成 ...