RMQ问题:

RMQ(Range Minimum/Maximum Query),区间最值查询。对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值。

RMQ问题可以用线段树和ST表解决。

线段树:查询复杂度O(log n) 可以修改数列中的值

ST表: 查询复杂度 O(1) 无法修改数列中的值,是在线算法

其实ST表就是个动态规划

核心思想:倍增

对于dp[i][j] ,其含义为以i为起点,长度为2^j这个区间的最大值

转移方程就是把这个区间分成两个小区间的最大值。

https://www.luogu.com.cn/problem/P3865

https://www.cnblogs.com/zwfymqz/p/8581995.html

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 5; int n,m;
int dp[maxn][21]; int main() {
scanf("%d%d",&n,&m);
int num;
for(int i=1;i<=n;i++) //初始化,区间长度为1,最大值就是本身
{
scanf("%d",&num);
dp[i][0]=num;
}
for(int j=1;(1<<j)<=n;j++) //2^j 要大于等于区间长度
for(int i=1;i+(1<<j)-1<=n;i++) //处理i到i+(1<<j)-1这个区间
{
dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]); //将当前区间[i,i+2^j]拆分成[i,i+2^(j-1)] [i+2^(j-1),i+2^(j-1)+2^(j-1)].
} //其实就是再中间切割一下 后边区间可以简写成[i+2^(j-1),i+2^j]
int k;
int l,r;
while(m--)
{
scanf("%d%d",&l,&r);
k=log2(r-l+1);
printf("%d\n",max(dp[l][k],dp[r-(1<<k)+1][k]));
}
return 0;
}

ST表解决RMQ问题的更多相关文章

  1. 算法学习 - ST表 - 稀疏表 - 解决RMQ问题

    2017-08-26 21:44:45 writer:pprp RMQ问题就是区间最大最小值查询问题: 这个SparseTable算法构造一个表,F[i][j] 表示 区间[i, i + 2 ^ j ...

  2. ST表 求 RMQ(区间最值)

    RMQ即Range Minimum/Maximun Query,中文意思:查询一个区间的最小值/最大值 比如有这样一个数组:A{3 2 4 5 6 8 1 2 9 7},然后问你若干问题: 数组A下标 ...

  3. POJ 3264 Balanced Lineup 【ST表 静态RMQ】

    传送门:http://poj.org/problem?id=3264 Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total S ...

  4. ST表(离线RMQ)

    离线RAQ时,预处理为O(n*lgn),查询为O(1)的算法,比较有意思的一种算法 放个模板在这可以随时看 //ST表(离线) //预处理 O(n*lgn) , 查询 O(1) #include &l ...

  5. 基于ST表的RMQ

    RMQ算法,是一个快速求区间最值的离线算法,预处理时间复杂度O(n*log(n))查询O(1),所以是一个很快速的算法,当然这个问题用线段树同样能够解决. 问题:给出n个数ai,让你快速查询某个区间的 ...

  6. ST函数(ST表)RMQ O(1)查询 离线

    ST算法是基于倍增的动态规划算法. #include<iostream> #include<cstdio> #include<cstdlib> #include&l ...

  7. st表、RMQ和LCA

    int lca(int x,int y) { if(de[x]<de[y]) swap(x,y); int d=de[x]-de[y]; for(int i=log2(d);i>=0;i- ...

  8. 用ST解决RMQ问题

    用ST算法解决RMQ(区间最值问题) 在解决CF上的6E Exposition时,用到了RMQ+二分的方法.学习了用ST来快速解决RMQ问题,因此做一个小记 建表 用DP的方式来建ST. dp[i][ ...

  9. BZOJ3230 相似子串[后缀数组+二分+st表]

    BZOJ3230 相似子串 给一个串,查询排名i和j的子串longest common suffix和longest common prefix 思路其实还是蛮好想的,就是码起来有点恶心.可以发现后缀 ...

随机推荐

  1. java中“”==“” equals hashcode的关系

    ava中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比 ...

  2. 多线程集成设计模式--MasterWorker模式讲解(一)

    Master-Worker模式是常用的并行模式之一,它的核心思想是,系统有两个进程协作工作:Master进程,负责接收和分配任务:Worker进程,负责处理子任务.当Worker进程将子任务处理完成后 ...

  3. Python学习之准备工作

    Python学习之准备工作 编程语言历史 在计算机硬件基础中我们大概介绍了一下计算机的发展历史.了解到在曾经有一段时期里计算机是不存在操作系统这一概念的,所有需要计算机完成的操作都需要当时的程序员来与 ...

  4. 【总结-前台发送后台接收表单】MVC提交表单的四种方式

    https://www.cnblogs.com/chenwolong/p/Form.html#commentform 后台控制器接收前台表单参数三种方法: 一.普通参数 HTML标签name 和参数名 ...

  5. python 类中方法总结 --- 实例方法、类方法、静态方法

    在python的类语法中,可以出现三种方法,具体如下: (1)实例方法 1)第一个参数必须是实例本身,一般使用[self]表示. 2)在实例方法中,可以通过[self]来操作实例属性,[类名]来操作类 ...

  6. Spring系列.Bean简介

    Bean属性配置 Spring在读取配置文件中bean的metadata后会构造一个个BeanDefination对象.后面Spring会根据这些BeanDefinition创建对象.在配置一个bea ...

  7. debian10 安装 详解

    准备 下载debian 下载页面,有3个iso,选择第一个,其他两个软件包,我们不需要. 制作启动盘 debian官方提供了一个工具,可以轻松制作启动盘,也可以用opensuse官方提供的一个工具ru ...

  8. Linux 相关学习内容(不定期更新)

    Linux 主要目录 / 根目录,在 linux 下有且只有一个根目录,所有的东西都是从这里开始 /bin 可执行二进制文件的目录,如常用的命令,ls, tar, mv, cat.. /boot 放置 ...

  9. JQ滚动加载

    $(window).scroll(function () { if ($(document).scrollTop() + $(window).height() >= $(document).he ...

  10. 仿Neo4j里的知识图谱,利用d3+vue开发的一个网络拓扑图

    项目需要画一个类似知识图谱的节点关系图. 一开始用的是echart画的. 根据https://gallery.echartsjs.com/editor.html?c=xH1Rkt3hkb,成功画出简单 ...