RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题。

ST算法:先是预处理部分(构造RMQ数组),DP处理。假设b是所求区间最值的数列,dp[i][j] 表示从i到i+2^j -1中最值(从i开始持续2^j个数)。即dp[i][j]=min{dp[i][j-1],dp[i+2^(j-1)][j-1]},或者dp[i][j]=max{dp[i][j-1],dp[i+2^(j-1)][j-1]},这个过程的复杂度为:O(n(longn))

接着就是查询最值了,可以通过在O(1)完成查询。就是将查询区间[s,v],分成两个2^k的区间。

以求最小值为例

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
#define M 100000
#define MAXN 1000
#define MAXM 1000
int dp[M][20];
void makermq(int n,int b[])//构造最值RMQ数组
{int i,j;for(i=0;i<n;i++)dp[i][0]=b[i];for(j=1;(1<<j)<=n;j++)for(i=0;i+(1<<j)-1<n;i++)//求最大值//   dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);//求最小值dp[i][j]=min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
int rmq(int s,int v)
{int k=(int)(log((v-s+1)*1.0)/log(2.0));//求最大值// return max(dp[s][k],dp[v-(1<<k)+1][k]);//求最小值return min(dp[s][k],dp[v-(1<<k)+1][k]);
}void makeRmqIndex(int n,int b[])//构造最值下标RMQ数组
{int i,j;for(i=0;i<n;i++)dp[i][0]=i;for(j=1;(1<<j)<=n;j++)for(i=0;i+(1<<j)-1<n;i++)//求最大值//    dp[i][j]=b[dp[i][j-1]]>=b[dp[i+(1<<(j-1))][j-1]]? dp[i][j-1]:dp[i+(1<<(j-1))][j-1];//求最小值dp[i][j]=b[dp[i][j-1]]<b[dp[i+(1<<(j-1))][j-1]]? dp[i][j-1]:dp[i+(1<<(j-1))][j-1];
}
int rmqIndex(int s,int v,int b[])//返回最值对应的下标
{int k=(int)(log((v-s+1)*1.0)/log(2.0));//求最大值// return b[dp[s][k]]>=b[dp[v-(1<<k)+1][k]]? dp[s][k]:dp[v-(1<<k)+1][k];//求最小值return b[dp[s][k]]<b[dp[v-(1<<k)+1][k]]?dp[s][k]:dp[v-(1<<k)+1][k];
}

代码没有给出主函数,主函数应根据具体题目要求来写。

以下是 poj3264:http://poj.org/problem?id=3264代码:

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
#define M 50001
int h[M];
int dpmax[M][20],dpmin[M][20];
void makermqmax(int n,int b[])//构造最值RMQ数组
{int i,j;for(i=0;i<n;i++)dpmax[i][0]=b[i];for(j=1;(1<<j)<=n;j++)for(i=0;i+(1<<j)-1<n;i++)dpmax[i][j]=max(dpmax[i][j-1],dpmax[i+(1<<(j-1))][j-1]);
}
void makermqmin(int n,int b[])
{int i,j;for(i=0;i<n;i++)dpmin[i][0]=b[i];for(j=1;(1<<j)<=n;j++)for(i=0;i+(1<<j)-1<n;i++)dpmin[i][j]=min(dpmin[i][j-1],dpmin[i+(1<<(j-1))][j-1]);
}
int rmqmax(int s,int v)
{int k=(int)(log((v-s+1)*1.0)/log(2.0));return max(dpmax[s][k],dpmax[v-(1<<k)+1][k]);
}
int rmqmin(int s,int v)
{int k=(int)(log((v-s+1)*1.0)/log(2.0));return min(dpmin[s][k],dpmin[v-(1<<k)+1][k]);
}
int main()
{//freopen("test.txt","r",stdin);int n,q;while(scanf("%d%d",&n,&q)!=EOF){for(int i=0;i<n;i++)scanf("%d",&h[i]);makermqmax(n,h);makermqmin(n,h);for(int i=0;i<q;i++){int a,b;scanf("%d%d",&a,&b);a--;b--;printf("%d\n",rmqmax(a,b)-rmqmin(a,b));}}return 0;
}

转载于:https://www.cnblogs.com/xiuyangleiasp/archive/2012/10/03/2711080.html

RMQ ST算法简介相关推荐

  1. 【原创】RMQ - ST算法详解

    ST算法: ID数组下标: 1   2   3   4   5   6   7   8   9     ID数组元素: 5   7   3   1   4   8   2   9   8 1.ST算法 ...

  2. RMQ问题(线段树算法,ST算法优化)

    RMQ (Range Minimum/Maximum Query)问题是指: 对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在[i,j]里的最小(大)值 ...

  3. RMQ问题,加深对ST算法的理解(Sparse Table)

    Sparse Table(稀疏表):简称ST 简介 ST 算法本质是动态规划. 时间复杂度为: 预处理:O(nlogn) 查询:O(1) 它 适宜用于 数据不再作出变化(也称离线) 的 区间最值 查询 ...

  4. ST算法解决RMQ问题

    关于ST算法,实际上它本身并不难,它的思想是动态规划.主要用来求RMQ问题,时间复杂度为O(NlgN+M)  关于RMQ问题描述: 输入N个数和M次询问,每次询问一个区间[L,R],求第L个数到R个数 ...

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

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

  6. 动态规划-RMQ问题(ST算法)

    文章目录 RMQ问题 ST算法 模板 例题 P2251 质量检测 P1816 忠诚 P2216 [HAOI2007]理想的正方形 RMQ问题 RMQ(Range Minimum/Maximum Que ...

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

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

  8. 1470: 区间求最值(RMQ问题,ST算法模板)

    1470: 区间求最值 Time Limit: 1 Sec Memory Limit: 128 MB [Submit][Status][Web Board] Description 给定一个长度为N ...

  9. CodeForces 359D (数论+二分+ST算法)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=47319 题目大意:给定一个序列,要求确定一个子序列,①使得该子序 ...

最新文章

  1. 【django】模型
  2. chkdsk 检查卷位图时发现损坏_如何修复Windows 10引导记录损坏故障
  3. 【WebRTC---入门篇】(二十)WebRTC核心之SDP详解
  4. GBDT与XGBOOST
  5. Repeater 双向排序
  6. 大数据平台由哪些分析功能
  7. Android 属性动画简单分析(一)
  8. 概率图模型(PGM)学习笔记(四)-贝叶斯网络-伯努利贝叶斯-多项式贝叶斯
  9. 汽车UDS诊断之控制诊断故障码设置服务(0x85)深度剖析
  10. 清华大学计算机2021研究生录取分数线,清华大学2021年研究生录取分数线多少分...
  11. 会议纪要模板----邮件
  12. 2018年腾讯实习生招聘模拟笔试:硬币组合-个人思路及代码
  13. js获取传统节假日_js判断节假日实例代码
  14. 客户关系管理:CRM战略
  15. 以游戏玩家的视角开启设计模式
  16. C语言数据结构-程序设计与算法基础II-电大同步进度
  17. 使用ONVIF Device Test Tool获取网络摄像头的音/视频
  18. No module named ‘quantopian‘
  19. 阿里云HaaS100物联网开发板学习笔记(四)轻应用初步--用javascript连接阿里云物联网平台
  20. CF1553I Stairs题解--zhengjun

热门文章

  1. phpstudy集成环境安装redis扩展
  2. Linux 下 的 cc 和 gcc
  3. 创建包含CRUD操作的Web API接口-第一部
  4. CentOS-6.4-i386硬盘安装
  5. vimrepress
  6. 上线随想之2011-03-25
  7. The XML page cannot be displayed |无法显示 XML 页
  8. 从数据库中存取二进制数据并显示
  9. 用iframe设置代理解决ajax跨域请求问题
  10. C#自定义异常 统一异常处理