关于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问题相关推荐

  1. 【专题】用ST表解决RMQ刷题总结

    [专题]用ST表解决RMQ刷题总结 看了一下上次写博客居然是好久以前的事了(我真是老懒狗了 ) 开门见山,直接放专题链接和代码 kuangbin rmq专题 这个contest里面一共十道题但是实际上 ...

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

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

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

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

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

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

  5. RMQ ST算法简介

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

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

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

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

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

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

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

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

最新文章

  1. 重磅 | 李飞飞最新演讲:ImageNet后,我专注于这五件事——视觉理解、场景图,段落整合、视频分割及CLEVR数据集
  2. Android中文输入的新选择——搜狗拼音输入法
  3. Windows上编译github源码方式运行Node-RED,以及离线迁移安装Node-RED
  4. CF1178H Stock Exchange
  5. php-frm进程管理,PHP内核探索-进程管理
  6. BATJ一线大公司需要什么样的前端
  7. 工厂模式(简单工厂模式)快速理解
  8. Linux修改主机名称
  9. 容智RPA可以在医疗哪些业务上降本增效
  10. 我的大学之路---《大学之路》读后感
  11. java培训之XML学习笔记(1)
  12. RSSHub 的衍生项目 RSSHub Rader 安装构建 问题 Error: Cannot find module 'node-sass'
  13. IT服务外包的必要性
  14. 如何使用微PE工具箱制作U盘PE
  15. cordova 图标设置
  16. html垂直线性渐变,CSS线性渐变 垂直和水平渐变linear-gradient
  17. springmvc出现404错误!
  18. 计算机联到同一个局域网,两台电脑连接同一个wifi算是局域网么
  19. 贾跃亭微博发新车V9图片 计划明年量产预售
  20. Java聊天室的设计与实现

热门文章

  1. Spring-Cloud中的统一配置中心
  2. 【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
  3. HDFS的API操作-获取文件列表信息
  4. 工厂模式解耦的升级版
  5. Spring Schedule配置及初始化
  6. oracle解除死锁
  7. mysql 字符大对象_第02期:MySQL 数据类型的艺术 - 大对象字段
  8. Spring AOP源码解析(三)—— AOP引入(续)
  9. 【面试】JAVA六种运算符详解及优先级
  10. 小牛带你nginx反向代理中神奇的斜线