$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]$平均分成两段,一段为$[i,i+2^{j-1}-1]$,另一段为$[i+2^{j-1},i+2^{j}-1]$。

两段的长度均为$2^{j-1}$。$f(i,j)$的最大值即这两段的最大值中的最大值。

得到$f(i,j)=max\{f(i,j-1),f(i+2^{j-1},j-1)\}$。

  1. void RMQ(int N){
  2. /*注意外部循环从j开始,
  3. 因为初始状态为f[i][0],
  4. 以i为外层会有一些状态遍历不到。*/
  5. for(int j=;j<=;j++)
  6. for(int i=;i<=N;i++)
  7. if(i+(<<j)-<=N)
  8. f[i][j]=max(f[i][j-],f[i+(<<(j-))][j-]);
  9. }

查询:若需要查询的区间为$[i,j]$,则需要找到两个覆盖这个闭区间的最小幂区间。

这两个区间可以重复,因为两个区间是否相交对区间最值没有影响。(如下图)

当然求区间和就肯定不行了。这也就是$RMQ$的限制性。

因为区间的长度为$j-i+1$,所以可以取$k=log_2(j-i+1)$。

则$RMQ(A,i,j)=max\{f(i,k),f(j-2^{k}+1,k)\}$。

代码:

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<cmath>
  6. using namespace std;
  7. int a[],f[][];
  8. inline int read(){
  9. int x=,f=;
  10. char c=getchar();
  11. for(;!isdigit(c);c=getchar())
  12. if(c=='-')
  13. f=-;
  14. for(;isdigit(c);c=getchar())
  15. x=x*+c-'';
  16. return x*f;
  17. }
  18. void RMQ(int N){
  19. for(int j=;j<=;j++)
  20. for(int i=;i<=N;i++)
  21. if(i+(<<j)-<=N)
  22. f[i][j]=max(f[i][j-],f[i+(<<(j-))][j-]);
  23. }
  24. int main(){
  25. int N=read(),M=read();
  26. for(int i=;i<=N;i++) a[i]=read();
  27. for(int i=;i<=N;i++) f[i][]=a[i];
  28. RMQ(N);
  29. while(M--){
  30. int i=read(),j=read();
  31. int k=(int)(log((double)(j-i+))/log(2.0));
  32. printf("%d\n",max(f[i][k],f[j-(<<k)+][k]));
  33. }
  34. return ;
  35. }

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

  1. [poj3264]rmq算法学习(ST表)

    解题关键:rmq模板题,可以用st表,亦可用线段树等数据结构 log10和log2都可,这里用到了对数的换底公式 类似于区间dp,用到了倍增的思想 $F[i][j] = \min (F[i][j - ...

  2. RMQ问题及ST表

    RMQ(Range Minimum/Maximum Query)问题指的是一类对于给定序列,要求支持查询某区间内的最大.最小值的问题.很显然,如果暴力预处理的话复杂度为 \(O(n^2)\),而此类问 ...

  3. 51Nod.1766.树上最远点对(树的直径 RMQ 线段树/ST表)

    题目链接 \(Description\) 给定一棵树.每次询问给定\(a\sim b,c\sim d\)两个下标区间,从这两个区间中各取一个点,使得这两个点距离最远.输出最远距离. \(n,q\leq ...

  4. 【算法学习笔记】RMQ问题与ST表

    \(0.\) RMQ问题 P1816 人话翻译 给定一个长度为\(n\)的数列\(a\),然后有\(m\)组询问,每次询问一个区间\([l,r]\)的最小值. 其中\(m,n\leq10^5\) \( ...

  5. RMQ算法使用ST表实现

    RMQ RMQ (Range Minimum Query),指求区间最小值.普通的求区间最小值的方法是暴力. 对于一个数列: \[ A_1,~ A_2,~ A_3,~ \cdots,~ A_n \] ...

  6. 提高篇(1):RMQ问题与ST表

    RMQ是英文Range Minimum/Maximum Query的缩写,是询问某个区间内的最值,这里讲一种解法:ST算法 ST算法通常用在要多次(10^6级别)询问区间最值的问题中,相比于线段树,它 ...

  7. rmq问题:ST表

    存板子.O(nlogn)预处理,O(1)查询.空间O(nlogn). int d[1000006][25]; int mn[1000006]; void rmq_init() { for(int i= ...

  8. 洛谷 P2880 [USACO07JAN]Balanced Lineup G (ST表模板)

    题意:给你一组数,询问\(q\)次,问所给区间内的最大值和最小值的差. 题解:经典RMQ问题,用st表维护两个数组分别记录最大值和最小值然后直接查询输出就好了 代码: int n,q; int a[N ...

  9. hdu6356 Glad You Came 杭电多校第五场 RMQ ST表(模板)

    Glad You Came Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) ...

随机推荐

  1. WebService:JAX-WS实现WebService

    WebService和Java核心技术中的RMI一样用于实现异构平台上的应用程序之间数据的交互,唯一不同的是这样的技术屏蔽了语言之间的差异.这也是其大行其道的原因. 实现WebService的技术多种 ...

  2. Qt5官方demo解析集13——Qt Quick Particles Examples - Image Particles

    本系列全部文章能够在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文 Qt5官方demo解析集12--Qt Quic ...

  3. Snail—iOS网络学习之得到网络上的数据

    在开发项目project中,尤其是手机APP,一般都是先把界面给搭建出来.然后再从网上down数据 来填充 那么网上的数据是怎么得来的呢,网络上的数据无非就经常使用的两种JSON和XML 如今 大部分 ...

  4. BZOJ 2115: [Wc2011] Xor DFS + 线性基

    2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MB Description Input 第一行包含两个整数N和 M, 表示该无向图中 ...

  5. apache benchmark

    1 ab是什么 是一个web高并发测试工具,可以发送get.put.post请求. 2 ab -n和-c共存 -c是concurrency的缩写,即同一时间发送多个请求. -n是指本次总共发送多少个请 ...

  6. apt仓库以及apt-get分析

    1 debian repository 参考:https://wiki.debian.org/DebianRepository 1.1 版本代号 sid,still in development,该版 ...

  7. C/C++实现删除字符串的首尾空格

    StdStringTrimTest.cpp #include <iostream> int main() { std::string str(" 字符串 String " ...

  8. tomcat 部署项目的多种方式

    项目放在tomcat webapps也不会加载两次 下面可以指定项目名称及path   加载war   部署war包  后面不用加war的后缀 <Host appBase="D:/pr ...

  9. HashSe、LinkedHashSet、TreeSet(java基础知识十七)

    1.HashSet存储字符串并遍历 * 特点:无序.无索引.无重复 HashSet存储字符串并遍历 HashSet<String> hs = new HashSet<>(); ...

  10. 【转载】Java中StringTokenizer类的作用

    StringTokenizer是一个用来分隔String的应用类,相当于VB的split函数.1.构造函数public StringTokenizer(String str)public String ...