RMQ,Range Maximum/Minimum Query,顾名思义,就是询问某个区间内的最大值或最小值,今天我主要记录的是其求解方法——ST算法

相对于线段树,它的运行速度会快很多,可以做到O(log n)的预处理和O(1)的查询,不足就是无法进行区间修改,这个一会就会提及

我将从四个方面进行记录:

1、ST的算法流程

其实与DP有很大的相似性,用 a[1,2,....,n] 来记录整组数据,设 f[i,j] 代表从 a[i] 到 a[i+-1] 之间所有元素的最大值。

不难发现,其实这个区间就有个元素。现在我们将这些元素平均分为两部分,那么每部分就是个元素,而这两个集合就可以写成:

那么整个区间的最大值就转换成了两个区间最大值的较大值,根据动态规划的最优化原理,就可以轻松的写出状态转移方程:

边界条件就是:

2、询问

要想要找出区间 [x,y] 的最大值,与刚才讲的方法类似,找出最大的 a 满足:

至于为啥不能是直接取等于,是因为取等于时不一定是整数。

所以不一定是正好是整个区间的一半,会出现以下这种情况:

不过That's OK,因为就算区间有重叠也不会影响最大值的确定,但是如果进行区间的操作的话可能就不适用了,因为重叠的部分会被操作两次,这明显不公平!这也是我最开始的时候对ST进行批判的原因,也是ST算法只适用于求区间最值的原因。

3、代码实现

刚才其实都讲的差不多了,不做过多解释:

 1 #include<cstdio>
2 #include<cmath>
3 #include<iostream>
4 #include<algorithm>
5 using namespace std;
6 const int NN=1e6+5;
7 int f[NN][21];//21位就差不多了,2的21次方超过了1e6
8
9 inline int read()//快读
10 {
11 char ha=getchar();
12 int x=0,sign=1;
13 while(ha<'0'||ha>'9')
14 {
15 if(ha=='-')
16 {
17 sign=-1;
18 }
19 ha=getchar();
20 }
21 while(ha>='0'&&ha<='9')
22 {
23 x=x*10+ha-'0';
24 ha=getchar();
25 }
26 return x*sign;
27 }
28
29 int Query(int l,int r)
30 {
31 int logg=log2(r-l+1);
32 int haha=max(f[l][logg],f[r-(1<<logg)+1][logg]);
33 return haha;
34 }
35 int main()
36 {
37 int N=read(),M=read();
38 for(int i=1;i<=N;i++)//初始化,只有一个数的区间最大值就是它本身
39 {
40 f[i][0]=read();
41 }
42 for(int j=1;j<=21;j++)//开始DP找最大值
43 {
44 for(int i=1;i+(1<<j)-1<=N;i++)
45 {
46 f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
47 }
48 }
49 for(int i=1;i<=M;i++)
50 {
51 int l=read(),r=read();
52 int ans=Query(l,r);
53 printf("%d\n",ans);
54 }
55 return 0;
56 }

四、例题精讲

敬请期待!

To Be Continued...

关于基础RMQ——ST算法的更多相关文章

  1. 求解区间最值 - RMQ - ST 算法介绍

    解析 ST 算法是 RMQ(Range Minimum/Maximum Query)中一个很经典的算法,它天生用来求得一个区间的最值,但却不能维护最值,也就是说,过程中不能改变区间中的某个元素的值.O ...

  2. [POJ3264]Balanced Lineup(RMQ, ST算法)

    题目链接:http://poj.org/problem?id=3264 典型RMQ,这道题被我鞭尸了三遍也是醉了…这回用新学的st算法. st算法本身是一个区间dp,利用的性质就是相邻两个区间的最值的 ...

  3. 【原创】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算法作 ...

  4. HDU 3183 - A Magic Lamp - [RMQ][ST算法]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 Problem DescriptionKiki likes traveling. One day ...

  5. POJ 3264 Balanced Lineup RMQ ST算法

    题意:有n头牛,编号从1到n,每头牛的身高已知.现有q次询问,每次询问给出a,b两个数.要求给出编号在a与b之间牛身高的最大值与最小值之差. 思路:标准的RMQ问题. RMQ问题是求给定区间内的最值问 ...

  6. POJ 3368 Frequent values RMQ ST算法/线段树

                                                         Frequent values Time Limit: 2000MS   Memory Lim ...

  7. RMQ st算法 区间最值模板

    #include<bits/stdc++.h> ; ; int f[N][Logn],a[N],lg[N],n,m; int main(){ cin>>n>>m; ...

  8. RMQ问题(线段树+ST算法)

    转载自:http://kmplayer.iteye.com/blog/575725 RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ ...

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

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

随机推荐

  1. 微信小程序自定义tab,多层tab嵌套实现

    小程序最近是越来越火了-- 做小程序有一段时间了,总结一下项目中遇到的问题及解决办法吧. 项目中有个多 tab 嵌套的需求,进入程序主界面下面有两个 tab,进入A模块后,A模块最底下又有多个tab, ...

  2. 论文阅读总结-Patient clustering improves efficiency of federated machine learning to predict mortality and hospital stay time using distributed electronic medical records

    一.论文提出的方法: 使用进入ICU前48h的用药特征作为预测因子预测重症监护患者的死亡率和ICU住院时间. 用到了联邦学习,自编码器,k-means聚类算法,社区检测. 数据集:从50家患者人数超过 ...

  3. SQLite实现数据库的储存2+SQLite数据库可视化工具SQLite Stadio

    今日所学 SQLite实现数据库的储存 查看数据库的两种方法 Android 中 SQLite 数据库的查看 - woider - 博客园 SQLite Studio安装教程 [SQLite]可视化工 ...

  4. 微信小程序和公众号和H5之间相互跳转

    参考链接:https://www.imooc.com/article/22900 一.小程序和公众号 答案是:可以相互关联. 在微信公众号里可以添加小程序. 可关联已有的小程序或快速创建小程序.已关联 ...

  5. 小程序中webview内嵌h5页面

    小程序内嵌h5页面跳转小程序指定页面,  需要引用  JSSDK:   <script src="https://res.wx.qq.com/open/js/jweixin-1.3.2 ...

  6. Taro时间选择器+地址选择器

    时间地址选择器 https://www.manzj.net/topic/5c3c2123cd01b8af5bce4373

  7. MySQL的安装详细教程

    一.下载MySQL数据库并创建初始化文件 1.下载MySql数据压缩包-----下载网址:https://dev.mysql.com/downloads/mysql/ 2.选择兆数最少的那个下载 3. ...

  8. SpringMVC-获得Restful风格的参数

    使用@PathVariable注解:接收请求路径中占位符的值 @RequestMapping("/report18/{username}") @ResponseBody publi ...

  9. Linux系统安装后IP能通端口不通的问题处理方法

    网上大部分都是针对防火墙的问题,这里首先排除防火防火墙导致端口不通的问题! 1.排除防火墙问题(防火墙的排查方式网上一搜全是,这里不再赘述) 2.查看检查端口有没有监听,发现端口未监听(比如8080端 ...

  10. Spring 源码(3)Spring BeanFactory 是怎么创建的?

    Spring创建 BeanFactory 的方式 按照Bean的配置方式手动创建可以分为两种: 使用XMl配置的Bean 这种方式使用xml配置文件配置Bean的信息并且设置扫描的路径,扫描到的包可以 ...