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,那么 ...
随机推荐
- openwrt上wifi探针的实现----mt7620a+rt2860v2
openwrt上wifi探针的实现----mt7620a+rt2860v2 [摘要:甚么是wifi探针 看到探针,感到很矮小上的模样,实在便是经过wifi汇集经由那个AP局限的脚机的mac地点,出有甚 ...
- CP防火墙排错装逼三件套
1.tcpdump 通常用来抓包处理经过网卡的交互包 [Expert@BJ-OFFICE-GW:0]# tcpdump -nni any host 10.158.1.100 -w /var/log/t ...
- IAP升级
一.IAP原理 1.在正常情况下,程序运行路流程: 和STM32类似,STM8内部闪存(FLASH)地址起始于 0x8000(STM32是0x08000000),一般情况下,程序文件就从此地 址开始写 ...
- Kali之msf简单的漏洞利用
1.信息收集 靶机的IP地址为:192.168.173.136 利用nmap工具扫描其开放端口.系统等 整理一下目标系统的相关信息 系统版本:Windows server 2003 开放的端口及服务: ...
- Angular 利用 marked.js 添加 Markdown + HTML 同时渲染的 Pipe
背景 最近在公司开发的一个项目需要在 Angular 上展示图文,并且需要同时支持 Markdown 和 HTML 对于同时支持 Markdown 和 HTML ,应该要分为编辑和渲染两部分考虑. 对 ...
- 如何从0到1设计一个MQ消息队列
消息队列作为系统解耦,流量控制的利器,成为分布式系统核心组件之一. 如果你对消息队列背后的实现原理关注不多,其实了解消息队列背后的实现非常重要. 不仅知其然还要知其所以然,这才是一个优秀的工程师需要具 ...
- Linux三剑客之sed的基本用法介绍
[介绍] sed是一款强大的非交互式的文本编辑器,可以对文件文本进行增删改查的相关操作,本文主要是讲解以下sed的基本用法. [常用选项] -e 下一个参数为一个sed指令,一般只会用于同一行有多个s ...
- Python+appium+unittest UI自动化测试
什么是UI自动化 自动化分层 单元自动化测试,指对软件中最小可测试单元进行检查和验证,一般需要借助单元测试框架,如java的JUnit,python的unittest等 接口自动化测试,主要检查验证模 ...
- 用本地自定义域名访问远程服务器,并支持websocket和cookie
场景 在公司会有很多测试的机器,或者一些OA服务,Confluence,Jenkins,各种中间件的后台等等,都使用HTTP访问,且由于是内网机器没有域名,输入IP又要输入不同端口,访问起来比较麻烦. ...
- 洛谷P4141 消失之物 题解 背包问题扩展
题目链接:https://www.luogu.com.cn/problem/P4141 题目大意: 有 \(n\) 件物品,求第 \(i\) 件物品不能选的时候(\(i\) 从 \(1\) 到 \(n ...