学习博客:https://blog.csdn.net/qq_31759205/article/details/75008659

RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干次询问RMQ(i,j),返回数列A中下标在区间[i,j]中的最小/大值。

本文介绍一种比较高效的ST算法解决这个问题。ST(Sparse Table)算法可以在O(nlogn)时间内进行预处理,然后在O(1)时间内回答每个查询。

第一步:预处理

设A[i]是要求区间最值的数列,F[i, j]表示从第i个数起连续2^j个数中的最大值。(DP的状态)

例如:

A数列为:3 2 4 5 6 8 1 2 9 7

F[1,0]表示第1个数起,长度为2^0=1的最大值,其实就是3这个数。同理 F[1,1] = max(3,2) = 3, F[1,2]=max(3,2,4,5) = 5,F[1,3] = max(3,2,4,5,6,8,1,2) = 8;

并且我们可以容易的看出F[i,0]就等于A[i]。(DP的初始值)

我们把F[i,j]分为两段,第一段为 i~i+2^(j-1)-1   第二段为 i+2^(j-1)~i+2^j-1  (长度都为2^(j-1)  ) 于是我们得到了状态转移方程:f[i,j]=max(f[i,j-1],f[i+2^(j-1),j-1] )。

2)查询

假如我们需要查询的区间为(i,j),那么我们需要找到覆盖这个闭区间(左边界取i,右边界取j)的最小幂(可以重复,比如查询1,2,3,4,5,我们可以查询1234和2345)。

因为这个区间的长度为j - i + 1,所以我们可以取k=log2( j - i + 1),则有:RMQ(i, j)=max{F[i , k], F[ j - 2 ^ k + 1, k]}。

举例说明,要求区间[1,5]的最大值,k = log2(5 - 1 + 1)= 2,即求max(F[1, 2],F[5 - 2 ^ 2 + 1, 2])=max(F[1, 2],F[2, 2]);

看代码:

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=1e5+50;
int a[maxn];
int dp[maxn][30];
void ST(int n)
{for(int i=1;i<=n;i++) dp[i][0]=a[i];//初始化for(int j=1;(1<<j)<=n;j++)//2^j
    {for(int i=1;i+(1<<j)-1<=n;i++)//
        {dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);}}return ;
}
int RMQ(int l,int r)
{int k=log(r-l+1);return max(dp[l][k],dp[r-(1<<k)+1][k]);
}
int main()
{memset(dp,0,sizeof(dp));int n;//长度为n的区间cin>>n;for(int i=1;i<=n;i++) cin>>a[i];ST(n);int l,r;//查询的区间cin>>l>>r;cout<<RMQ(l,r)<<endl;return 0;
}

转载于:https://www.cnblogs.com/caijiaming/p/10713575.html

RMQ(求区间最值问题)相关推荐

  1. RMQ求区间最值 nlog(n)

    转载于:http://blog.csdn.net/xuzengqiang/article/details/7350465 RMQ算法全称为(Range Minimum/Maximum Query)意思 ...

  2. ST算法 - RMQ(区间最值问题)—— 倍增

    文章目录 引入倍增: 例题1:区间和 例题2:Genius ACM 应用: ST算法 求解 RMQ(区间最值问题) 模板Code: 练习题: ST算法 维护区间最大公约数 例题:Pair of Num ...

  3. RMQ算法,求区间最值

    poj 3264 Balanced Lineup@ 2016-07-27 11:15 49人阅读 评论(0) 收藏 举报  分类: RMQ(Range MinimumMaximum Quer)(4)  ...

  4. 用树状数组解决求区间最值的问题:hdu1754

    以前都学过树状数组,但是已经差不多忘记了!不过看一看后,马上就都回忆起来了!而且感觉经过这么久的学习,对树状数组有了更深一层的领悟!个人觉得树状数组在本质上与线段树是没有区别的!都是管理区间,只不过树 ...

  5. 【BZOJ】1012: [JSOI2008]最大数maxnumber 树状数组求区间最值

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1012 题意:维护一个数列,开始时没有数值,之后会有两种操作, Q L :查询数列末 ...

  6. st算法 求区间最值问题

    算法的一个实现方法如下. 其中使用位运算替代2的幂次的计算,加快运算速度. 使用时需要先调用initRMQ()进行初始化,然后再调用RMQ(u,v)进行查询. 1 const int mx = 100 ...

  7. 找区间连续值(HDU5247)

    找连续数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  8. RMQ问题-ST表倍增处理静态区间最值

    简介 ST表是利用倍增思想处理RMQ问题(区间最值问题)的一种工具. 它能够做到O(nlogn)预处理,O(1)查询的时间复杂度,效率相当不错. 算法 1.预处理 ST表利用倍增的思想.以洛谷的P38 ...

  9. RMQ的ST算法(区间最值)

    ST算法求解RMQ问题(区间最值) 效率:O(n log n)预处理,O(1)询问 思想: 用 f [ i ][ j ] 表示 以i 开头的区间,包括2^j 个元素的一段区间的最值 那么有初始化的初始 ...

最新文章

  1. 你所不知道的库存超限做法
  2. 此为太阳历的技术支持博客
  3. 继续上次WDS部署安装未在真机上面实现问题解答
  4. Xamarin Android提示内存溢出错误
  5. python输出数据到excel-Python从数据库导出数据到Excel
  6. java 之 面试题-银行业务调度
  7. CODE FESTIVAL 2017 qual B
  8. opencv图像处理常用完整示例代码总结
  9. Python导出Excel图表
  10. Day11多态部分-1 【1.1 多态的体现】
  11. bat命令运行java程序
  12. ios即时通讯客户端开发之-mac上搭建openfire服务器
  13. echarts图表使用v-show控制图表显示不全的问题
  14. 不属于ipo模型的 python_python ipo模型是指什么?_后端开发
  15. Android:什么是签名、为什么要给应用程序签名、如何给应用程序签名
  16. 如何ajax上传图片,ajax上传图片文件
  17. 虚拟服务器钟楼古城微博,最无聊中外钟楼微博走红
  18. [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解 TI协议栈下载
  19. arduino上传项目总是出错,串口通信或TX/RX显示上传项目出错
  20. Mysql桌面工具--SQLyog使用方法,告别黑白命令行

热门文章

  1. iOS 5 Storyboard 学习之 Tabbar Controller,Navigation Controller
  2. STM32 Cortex-M3 NMI异常
  3. VS2015解决方案资源管理器空白,不显示内容
  4. 【推荐实践】强化学习在美团“猜你喜欢”的实践
  5. TypeError: Object of type ‘TrackedArray‘ is not JSON serializable
  6. kaggle房价预测最热解析
  7. 为何控件删除不了_NBA开出800万合同,易建联为何却主动解约了?湖人太没诚意了...
  8. 翻译pdf中的英文 python_浅谈python实现Google翻译PDF,解决换行的问题
  9. Leetcode每日一题:54.spiral-matrix(螺旋矩阵)
  10. 花书+吴恩达深度学习(十三)卷积神经网络 CNN 之运算过程(前向传播、反向传播)