ST算法解决RMQ问题
关于ST算法,实际上它本身并不难,它的思想是动态规划。主要用来求RMQ问题,时间复杂度为O(NlgN+M)
关于RMQ问题描述:
输入N个数和M次询问,每次询问一个区间[L,R],求第L个数到R个数之间的最大值,或者是求最小值。
它的原理阐述如下:
对于一个数组A[0...N-1],我们用f[i][j]表示A[i]到A[i+2^j-1],这个范围内的最大值。
由于此区间的元素个数很明显为2^j个,所以我们又可以从中间平分为两部分,这样每部分又有2^(j-1)个元素,这样我们就知道区间[i,i+2^j-1]可以分为[i,i+2^(j-1)-1]和[i+2^(j-1),i+2^j-1]两部分,我们只需要求出后面两个区间最大值的较大值,就可以知道前面区间的最大值了。
所以到了这里,很明显可以写出状态转移方程:
f[i][j]=max(f[i][j-1],f[i+2^(j-1)][j-1])
当然很明显知道初始化f[i][0]=A[i]
当然上面i,j的范围是多少呢?
现在我们来分析一下:我们已经说了如果用上述原理一个区间的元素是2^j个,而可以知道2^j<=N的,所以这样就得到j<=log(N)/log(2); 当然j还大于等于1
对于i,就直接有i+2^j-1<N就行了。
到了这里,我们就可以把f[i][j]求出来了。
接下来就是query()了。
这个怎么办呢,其实很容易,我们先求出满足条件2^x=R-L+1的最大x
这样我们我们就可以把区间[L,R]求最值问题转化为了求区间[L,L+2^x-1]和区间[R-2^x+1,R]最大值的较大值了,为什么可以这样做,因为这两个区间中间有重叠。
但是这两个区间的并一定等于区间[L,R],所以到了这里ST算法的原理基本常阐述完毕了。
剩下的就是代码实现了。
#include <stdio.h>
#include <math.h>
#define N 1005
int m,n;
int a[N];
int f[N][N];
int max(int a,int b)
{
return a>b? a:b;
}
void ST()
{
int i,j;
for(i=0;i<n;i++)
f[i][0]=a[i];
for(j=1;j<=(int)((log((double)n)/log(2.0)));j++)
{
for(i=0;i+(1<<j)-1<n;i++)
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
}
int query(int L,int R)
{
int x=(int)(log((double)(R-L+1))/log(2.0));
return max(f[L][x],f[R-(1<<x)+1][x]);
}
int main()
{
int i,L,R;
while(~scanf("%d%d",&n,&m))
{
for(i=0;i<n;i++)
scanf("%d",&a[i]);
ST();
while(m--)
{
scanf("%d%d",&L,&R);
printf("%d\n",query(L-1,R-1));
}
}
return 0;
}
ST算法解决RMQ问题相关推荐
- 【专题】用ST表解决RMQ刷题总结
[专题]用ST表解决RMQ刷题总结 看了一下上次写博客居然是好久以前的事了(我真是老懒狗了 ) 开门见山,直接放专题链接和代码 kuangbin rmq专题 这个contest里面一共十道题但是实际上 ...
- ST算法 - RMQ(区间最值问题)—— 倍增
文章目录 引入倍增: 例题1:区间和 例题2:Genius ACM 应用: ST算法 求解 RMQ(区间最值问题) 模板Code: 练习题: ST算法 维护区间最大公约数 例题:Pair of Num ...
- RMQ的ST算法(区间最值)
ST算法求解RMQ问题(区间最值) 效率:O(n log n)预处理,O(1)询问 思想: 用 f [ i ][ j ] 表示 以i 开头的区间,包括2^j 个元素的一段区间的最值 那么有初始化的初始 ...
- RMQ问题(线段树算法,ST算法优化)
RMQ (Range Minimum/Maximum Query)问题是指: 对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在[i,j]里的最小(大)值 ...
- RMQ ST算法简介
RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就 ...
- RMQ问题,加深对ST算法的理解(Sparse Table)
Sparse Table(稀疏表):简称ST 简介 ST 算法本质是动态规划. 时间复杂度为: 预处理:O(nlogn) 查询:O(1) 它 适宜用于 数据不再作出变化(也称离线) 的 区间最值 查询 ...
- 1470: 区间求最值(RMQ问题,ST算法模板)
1470: 区间求最值 Time Limit: 1 Sec Memory Limit: 128 MB [Submit][Status][Web Board] Description 给定一个长度为N ...
- 【原创】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算法 ...
- 动态规划-RMQ问题(ST算法)
文章目录 RMQ问题 ST算法 模板 例题 P2251 质量检测 P1816 忠诚 P2216 [HAOI2007]理想的正方形 RMQ问题 RMQ(Range Minimum/Maximum Que ...
最新文章
- 重磅 | 李飞飞最新演讲:ImageNet后,我专注于这五件事——视觉理解、场景图,段落整合、视频分割及CLEVR数据集
- Android中文输入的新选择——搜狗拼音输入法
- Windows上编译github源码方式运行Node-RED,以及离线迁移安装Node-RED
- CF1178H Stock Exchange
- php-frm进程管理,PHP内核探索-进程管理
- BATJ一线大公司需要什么样的前端
- 工厂模式(简单工厂模式)快速理解
- Linux修改主机名称
- 容智RPA可以在医疗哪些业务上降本增效
- 我的大学之路---《大学之路》读后感
- java培训之XML学习笔记(1)
- RSSHub 的衍生项目 RSSHub Rader 安装构建 问题 Error: Cannot find module 'node-sass'
- IT服务外包的必要性
- 如何使用微PE工具箱制作U盘PE
- cordova 图标设置
- html垂直线性渐变,CSS线性渐变 垂直和水平渐变linear-gradient
- springmvc出现404错误!
- 计算机联到同一个局域网,两台电脑连接同一个wifi算是局域网么
- 贾跃亭微博发新车V9图片 计划明年量产预售
- Java聊天室的设计与实现