RMQ用于区间快速查找最值,适用于期间数值无更改的情况。其预处理的复杂度为O(nlogn),查询的时间复杂度为O(1),对比于线段树的预处理O(nlogn),查询O(logn)来说,在某些情况下有着其独到的优势。

RMQ原理就是在原来的数组上跑一个dp,我们以查询最大值为例,它的状态定义是这样的:

dp[ i ][ j ]:下标从i开始,长度为2^j的区间的最大值。显然dp[ i ][ 0 ]就是下标是i的那个数字本身。

下面给出其转移方程:

dp[ i ][ j ] = max( dp[ i ][ j - 1 ], dp[ i + 2 ^ j ][ j - 1 ] )

对于询问区间[ i ~ j ]的最大值Max:

设k = log( j - i + 1 ) / log( 2 )

Max = max( dp[ i ][ k ], dp[ j - 2 ^ k + 1 ][ k ] )

上述过程的具体代码如下:

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <queue>
#include <ctime>
#include <cmath>
#include <set>
#define eps 1e-10
#define MAXN 500010
#define INF 2*0x3f3f3f3f
using namespace std; int num[MAXN], dp[MAXN][30], n, l, r; int pow(int a, int p) { //求a^p这里用了快速幂,实际用应该用一个数组预处理一下
if (p == 0) return 1;
int ans = pow(a, p / 2);
ans *= ans;
if (p % 2) ans *= a;
return ans;
} int main() {
//freopen("in.in", "r", stdin);
//freopen("out.out", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &num[i]); for (int i = 1; i <= n; i++) //对dp[i][0]进行初始化
dp[i][0] = num[i]; for (int j = 1; pow(2, j) <= n; j++) //上文说的转移方程
for (int i = 1; i + pow(2, j) - 1 <= n; i++)
dp[i][j] = max(dp[i][j - 1], dp[i + pow(2, j - 1)][j - 1]); scanf("%d %d", &l, &r); //求区间[l~r]之间的最大值 int k = log(r - l + 1) / log(2);
int ans = max(dp[l][k], dp[r - pow(2, k) + 1][k]);
printf("ans is : %d\n", ans); return 0;
}

RMQ问题在处理LCA中有着巨大的用处,其一种在线方法就是使用dfs+RMQ来求两个子节点的最近公共祖先问题,其大致做法就是按照访问的顺序把每个点的时间戳放入一个数组中,这样u和v的公共祖先就是数组中u和v之间时间戳最小的点,这里可以之间用RMQ在O(1)的时间内得到答案了。

最新文章

  1. node中子进程同步输出
  2. Centos 上 Tengine安装
  3. python BeautifulSoup模块的简要介绍
  4. (进阶篇)PHP实现用户注册后邮箱验证,激活帐号
  5. iterm2配色
  6. Java关于流知识总结
  7. Android入门(十九)WebView
  8. 【转】Java 项目UML反向工程转化工具
  9. js实现图片的淡入淡出
  10. SQL 基础:Select语句,各种join,union用法
  11. JZs3c2440裸板程序GPIO操作总结
  12. 【ajax】xhr
  13. 温故知新——json
  14. nRF52系列——Get started
  15. css3弹性盒模型(Flexbox)
  16. cocos2dx 3.2 定义自己使用rapidjson阅读json数据
  17. How use Instruments and display the console in Command Lines applications
  18. css 3d 基础知识
  19. 深入理解 RPC
  20. Android动画-View动画

热门文章

  1. makefile 中的patsubst
  2. MySql插入数据成功但是报[Err] 1055
  3. CentOS 6.9 安装配置zeromq、jzmq
  4. JAVA 的StringBuffer类
  5. Elasticsearch搜索查询语法
  6. 如何查看red gate安装时的log
  7. php环境搭建以及优化
  8. HBase 入门之数据刷写(Memstore Flush)详细说明
  9. python学习笔记:使用freeze命令迁移模块
  10. 如何用QTP录制鼠标右键点击事件