【模板】RMQ问题的ST表实现】的更多相关文章

$RMQ$问题:给定一个长度为$N$的区间,$M$个询问,每次询问$[L_i,R_i]$这段区间元素的最大值/最小值. $RMQ$的高级写法一般有两种,即为线段树和$ST$表. 本文主要讲解一下$ST$表的写法.(以区间最大值为例) $ST$表:一种利用$dp$思想求解区间最值的倍增算法. 定义:$f(i,j)$表示$[i,i+2^{j}-1]$这段长度为$2^{j}$的区间中的最大值. 预处理:$f(i,0)=a_i$.即$[i,i]$区间的最大值就是$a_i$. 状态转移:将$[i,j]$平…
解题关键:rmq模板题,可以用st表,亦可用线段树等数据结构 log10和log2都可,这里用到了对数的换底公式 类似于区间dp,用到了倍增的思想 $F[i][j] = \min (F[i][j - 1],F[i + 1 <  < (j - 1)][j - 1])$ #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<cmath&…
RMQ(Range Minimum/Maximum Query)问题指的是一类对于给定序列,要求支持查询某区间内的最大.最小值的问题.很显然,如果暴力预处理的话复杂度为 \(O(n^2)\),而此类问题数据又往往很大,不仅会爆时间,数组也存不下.我们需要一种能够 \(O(n\log n)\) 甚至 \(O(n)\) 预处理的数据结构,这便是ST表. ST表(Sparse Table,应译为S表)是一种可以以 \(O(n\log n)\) 的优秀复杂度预处理出静态区间上的最大.最小值的算法,其核心…
题目链接 \(Description\) 给定一棵树.每次询问给定\(a\sim b,c\sim d\)两个下标区间,从这两个区间中各取一个点,使得这两个点距离最远.输出最远距离. \(n,q\leq10^5\). \(Solution\) 一个集合直径的两端点,在被划分为两个集合后一定是两个集合直径的四个端点中的两个. 即假设将\(S\)分为两个集合后,另外两个集合的直径的两端点分别为a,b和c,d,那么\(S\)集合的直径的两端点一定是a,b,c,d中的两个. 证明类似树的直径. 所以信息可…
\(0.\) RMQ问题 P1816 人话翻译 给定一个长度为\(n\)的数列\(a\),然后有\(m\)组询问,每次询问一个区间\([l,r]\)的最小值. 其中\(m,n\leq10^5\) \(1.\) 暴力做法 很显然,暴力做法就是便历 \(\max\limits_{l\leq i\leq r}a_i\) .这个做法最坏时间复杂度将会高达\(O(n^2)\).很显然,这对于\(1e5\)的数据范围要炸 \(2.\) 正解 线段树 如果不知道什么是线段树,请点击这里 线段树 对于这种区间信…
RMQ RMQ (Range Minimum Query),指求区间最小值.普通的求区间最小值的方法是暴力. 对于一个数列: \[ A_1,~ A_2,~ A_3,~ \cdots,~ A_n \] 对于一个给定的区间\([l, ~r], ~1≤ l ≤r ≤ n\),\(\min \{A_l, A_{l + 1}, \cdots,A_r\}\)的计算就是RMQ问题. 此解法为\(\text{Sparse-Table}\)解法,简称\(ST\)表. 预处理:预处理为对数据进行\(n\log n\…
RMQ是英文Range Minimum/Maximum Query的缩写,是询问某个区间内的最值,这里讲一种解法:ST算法 ST算法通常用在要多次(10^6级别)询问区间最值的问题中,相比于线段树,它实现更简单,效率更高,但不支持修改,且一般只能维护最值. ST算法实际上是动规,原理如下: 预处理: 一组数a[1]..a[n],设f[i][j]表示从a[i]到a[i+2^j-1]这个范围中的最值,元素个数为2^j个. 可以分成2部分,即从a[i]至a[i+2^(j-1)-1]与a[i+2^(j-…
存板子.O(nlogn)预处理,O(1)查询.空间O(nlogn). int d[1000006][25]; int mn[1000006]; void rmq_init() { 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]);…
题意:给你一组数,询问\(q\)次,问所给区间内的最大值和最小值的差. 题解:经典RMQ问题,用st表维护两个数组分别记录最大值和最小值然后直接查询输出就好了 代码: int n,q; int a[N]; int dp1[N][30],dp2[N][30]; int lg[N]; void lg_Init(){ for(int i=1;i<=n;++i){ int k=0; while(1<<(k+1)<=i) k++; lg[i]=k; } } void RMQ_Init1(){…
Glad You Came Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 1489    Accepted Submission(s): 629 Problem Description Steve has an integer array a of length n (1-based). He assigned all the e…