参照大佬博客:https://www.cnblogs.com/yoke/p/6949838.html

RMQ(Range Minimum/Maximum Query),  是一种问题,即 查询给定区间的最大值或最小值。

ST算法可在线处理RMQ问题,主要分为两步, 初始化 和 查询。

ST算法的思想是将一个区间平均分成两个子区间,分别查询两个子区间的最值,再求这两个最值的最值。因此是DP的思想。

F[i,j] 代表以con[i]为区间左值,长度为 2^j 的区间的最大(小)值。

初始化:

  DP初始状态为

  for(int i = ; i < n; i++)

    F[i,] = con[i];  // 此时的最值是他本身 

 

  状态转移方程为

    

void RMQ(int num) //预处理->O(nlogn)
{
for(int j = 1; j < 20; ++j) // 这里j的范围根据具体题目数据定义
for(int i = 1; i <= num; ++i) // num为数组内整数的个数
if(i + (1 << j) - 1 <= num)
{
maxsum[i][j] = max(maxsum[i][j - 1], maxsum[i + (1 << (j - 1))][j - 1]);
minsum[i][j] = min(minsum[i][j - 1], minsum[i + (1 << (j - 1))][j - 1]);
}
}

  注意只有长度为2^(j - 1)的区间最值查询出来后,才可以查询长度为 2^j 的区间,因此代码中两个for循环的位置不可交换。

查询为

  RMQ(A, i, j)=max{F[i , k], F[ j - 2 ^ k + 1, k]}。

  为什么第二个子区间是从j减,因为允许分成的两个子区间有重叠的部分(解决了有的区间不能分成两个互不重叠的 长度为 2^j 的区间的问题 )。

RMQ入门解析的更多相关文章

  1. Git原理入门解析

    前言: 之前听过公司大佬分享过 Git 原理之后就想来自己总结一下,最近一忙起来就拖得久了,本来想塞更多的干货,但是不喜欢拖太久,所以先出一版足够入门的: 一.Git 简介 Git 是当前流行的分布式 ...

  2. RMQ入门

    注:为方便描述算法 便于记忆 所以ST的代码用Pascal书写 见谅 RMQ,即Range Minimum/Maximum Query问题,给定一个区间,询问不同子区间的最值问题. 当询问次数较少时, ...

  3. NodeJs初学者经典入门解析

    Node.js 是一个基于谷歌浏览器JavaScript执行环境建立的一个平台,让JavaScript可以脱离客户端浏览器运行,让 JavaScript具有服务器语言的能力.我们可以使用NodeJs方 ...

  4. HttpComponents入门解析

    1 简介 超文本传输协议(http)是目前互联网上极其普遍的传输协议,它为构建功能丰富,绚丽多彩的网页提供了强大的支持.构建一个网站,通常无需直接操作http协议,目前流行的WEB框架已经透明的将这些 ...

  5. MongoDB入门解析【学习记录】

    刚开始学习mongodb,对笔记做了一个整理.是基于nodejs来学习的. 1.mongodb介绍 mongodb 是C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添 ...

  6. Dagger2 入门解析

    前言 在为dropwizard选择DI框架的时候考虑了很久.Guice比较成熟,Dagger2主要用于Android.虽然都是google维护的,但Dagger2远比guice更新的频率高.再一个是, ...

  7. Splay入门解析【保证让你看不懂(滑稽)】

    BST真是神奇的东西... 而且种类好多呀... 我这个蒟蒻只学会了splay orzCJ老爷,各种树都会 好好好,不说了,直接说splay. 不知道splay是啥,,你也要知道平衡树是啥... 平衡 ...

  8. MongoDB入门解析

    刚开始学习mongodb,对笔记做了一个整理.是基于nodejs来学习的. 1.mongodb介绍 mongodb 是C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添 ...

  9. [ARM-LInux开发]linux设备驱动makefile入门解析

    以下内容仅作参考,能力有限,如有错误还请纠正.对于一个普通的linux设备驱动模块,以下是一个经典的makefile代码,使用下面这个makefile可以完成大部分驱动的编译,使用时只需要修改一下要编 ...

随机推荐

  1. open_basedir的配置

    .user.ini的使用 1.限制目录访问 解锁: chattr -i .user.ini 加锁: chattr +i .user.ini .user.ini配置 open_basedir=/项目路径 ...

  2. java注释英语自动机翻

    一.简介 每次面试都被怼spring源码你看过吗?你用spring开发源码你都不看的吗?这样怎么开发?那我就下点决心,趁着现在疫情在家宅,我要看spring源代码.但是发现注释都是英文,勉勉强强能看懂 ...

  3. 洛谷P 1427 小鱼的数字游戏

    题目描述 小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字(长度不一定,以0结束,最多不超过100个,数字不超过2^32-1),记住了然后反着念出来(表示结束的数字0就不要念出来了).这对小鱼的 ...

  4. 如何在Windows上开启Ping或者禁止PING

    方法1:命令行模式 进入服务器后 点击 开始——运行 输入命令: netsh firewall set icmpsetting 8 这样就可以在外部ping到服务器了 非常简单实用! 同样道理,如果想 ...

  5. 修复ThinkPHP导出excel数字过大时显示为科学记数法

    修复ThinkPHP导出excel数字过大时显示为科学记数法,这种显示对于查看的用户来说是及其不友好的.所以,我们要使其转化为正常的数字串! 我在google 的过程中,查了一些资料.其中 1).// ...

  6. video.js 后端网页播放器

    参考链接: https://www.cnblogs.com/afrog/p/6689179.html VideoJS的CSS样式,这里我提供一下BootCdn的链接 cdn.bootcss.com/v ...

  7. Linux 基本命令简单学习

    平常工作中需要使用到的一些Linux基本命令,简单记录: 通过订单号查看日志:   cat /---/---/xxxx20190908.log | grep C52918588112261 -C 5 ...

  8. 用html5自带表单验证 并且用ajax提交的解决方法(附例子)

    用submit来提交表单,然后在js中监听submit方法,用ajax提交表单最后阻止submit的自动提交. 在标准浏览器中,阻止浏览器默认行为使用event.preventDefault(),而在 ...

  9. IntelliJ IDEA 2017.3尚硅谷-----代码水平垂直

    选择项目——右键

  10. UNICODE下CString转string

    真搞不懂,为毛C++这么多类型转换.. CString m_str(_T("fuck conversion")); char *chr=new char[m_str.GetLeng ...