问题:

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

dp思想:

  dp[i][j]中存储的是从第i个数开始的2j个数最大的数。(如下图)

  dp[2][2]表示的是2到2+22-1中最大的数。即下表2-5中最大的数。

  如果要求2-7中最大的数,可以先将区间拆成两个2x长度的字串,分别求字串的最大值。2-7可以拆分成2-5和4-7这两个序列长度都为4.所以直接比较dp[2][2]和dp[4][2]即可。

dp代码:

const int maxn=1e5+;
int dp[maxn][];
int vis[maxn]; //处理dp数组
void rmq(int n,int a[]){
vis[]=-;
for(int i=;i<n;i++){
vis[i]=((i&(i-))==)?vis[i-]+:vis[i-];//标记0.0
dp[i][]=a[i];
}
for(int j=;j<=vis[n];j++){
for(int i=;i+(<<j)-<=n;i++){
dp[i][j]=max(dp[i][j-],dp[i+(<<(j-))][j-]);
}
}
}
//查询最大值
int rmpp(int x,int y){
int k=vis[y-x+];
return max(dp[x][k],dp[y-(<<k)+][k]);
}

补充:

  上述代码有一个标记,代表此行代码和如下代码功能相同。

int ans=;
vis[]=-;
for(int i=;i<n;i++){
if(i==ans){
ans*=;
vis[i]=vis[i-]+;
}
else vis[i]=vis[i];
}

n&(n-1)可以判断一个数是不是2的整数次幂

RMQ(区间最值问题)的更多相关文章

  1. RMQ区间最值查询

    RMQ区间最值查询 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A, 回答若干询问RMQ(A,i,j)(i,j<= ...

  2. rmq区间最值

    时间复杂度O(NlogN)+O(Q) int a[N]; int dpmax[N][20],dpmin[N][20]; void first(int n) { mm(dpmax,0); mm(dpmi ...

  3. RMQ(模板 ST 区间最值,频繁的间隔时间)

    PS: 介绍:http://blog.csdn.net/liang5630/article/details/7917702 RMQ算法.是一个高速求区间最值的离线算法,预处理时间复杂度O(n*log( ...

  4. 【RMQ】 区间最值查询详解

    1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A ...

  5. hdu3183 rmq求区间最值的下标

    两个月前做的题,以后可以看看,是rmq关于求区间最值的下标 /* hdu3183 终点 给一个整数,可以删除m位,留下的数字形成一个新的整数 rmq 取n-m个数,使形成的数最小 */ #includ ...

  6. 基于稀疏表(Sparse Table)的RMQ(区间最值问题)

    在RMQ的其他实现方法中,有一种叫做ST的算法比较常见. [构建] dp[i][j]表示的是从i起连续的2j个数xi,xi+1,xi+2,...xi+2j-1( 区间为[i,i+2j-1] )的最值. ...

  7. POJ - 3264 Balanced Lineup (RMQ问题求区间最值)

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

  8. RMQ(求区间最值问题)

    学习博客:https://blog.csdn.net/qq_31759205/article/details/75008659 RMQ(Range Minimum/Maximum Query),即区间 ...

  9. RMQ(区间求最值)

    1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A.回答若干询问RMQ(A,i,j)(i,j<=n).返回数列A ...

随机推荐

  1. 安装ubuntu到移动硬盘(UEFI+GPT),实现在别的电脑也可以使用(详细教程)

    前置说明:博主小白,第一次安装ubuntu,参考了网上很多人的教程,发博记录一下自己的安装过程.由于有些地方博主理解较浅或者因为机器硬件等各方面原因,本教程适用有限,仅供参考. 1.准备工作 win系 ...

  2. Transformation HDU - 4578 完全平方公式和立方公式展开,有点麻烦

    #include <stdio.h> #include <algorithm> #include <iostream> #include <string.h& ...

  3. 深入浅出Mybatis系列十-SQL执行流程分析(源码篇)

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前 ...

  4. 连接数据库的工具JdbcUtil

    public class JdbcUtil { private static String driver=null;//驱动 private static String url=null;//连接地址 ...

  5. with open()函数中,如何在文件名设置中引用变量(python)

    name = "wangyang" age = " with open("C:/Users/mike1/Desktop/name_age.txt", ...

  6. Oracle 中关于 Group By 子句与多行函数嵌套搭配使用的注意事项

    目录 你需要知道的 啥叫单行函数 啥叫多行函数 如何理解这个概念 Group by 子句使用规则 看一道 071 考题 你需要知道的 提到 Group by 子句,你需要先理解一个东西:函数的分类.提 ...

  7. 小白月赛22 A : 操作序列

    A:操作序列 析题得说: 考察点 : 模拟,STL库容器的使用 坑点 : 区间不要搞丢东西 难点 : 这个题比较变态的是我们不知道每次输入每行是一个数还是两个数,就需要进行判断, 怎么判断呢?用 sc ...

  8. Flutter简易顶部导航

    因为在AppBar的bottom参数中返回TabBar在平板模式的对齐模式是居中的且不可调整,所有将TabBar在title中返回 import 'package:flutter/material.d ...

  9. ssh配置公钥私钥登录服务器

    原理 密码的方式的即时认证的方式 .而公私钥 是在服务器保存一份已经通过认证的加密串,登录时通过这个加密串去认证. 公钥是可以传播的,私钥只能在自己的本地 公私钥的工作原理, 可以参考这篇文章: SS ...

  10. python笔记06

    python笔记06 数据类型 上个笔记内容补充 补充 列表 reverse,反转. v1 = [1,2,3111,32,13] print(v1) v1.reverse() print(v1) v1 ...