RMQ

  今天临放学前终于是学会了RMQ,特此写一篇题解来缅怀

  RMQ是一种数据结构,用途是查询区间内最大值或最小值

或者你所要求的任意条件,主要思想是二进制的思想,其中还用到了dp的思想,

是一种非常不错的算法,在确定左右区间查询上时间复杂度优于线段树

但是NOIP并不常用,也算为后面的LCA打一个基础

  给一道题:

  n个数,m个询问,每次询问区间[L,R]内的最小值。

  思路:我们需要一个二维数组来存储信息,存储方式是dp[i][j]

其中i代表查询的左端点,j为 查询范围 是i+2^j范围内的最小值,数列本身定为a[i]

我们首先确定dp[i][0]一定就是a[i]本身,这是显然的,然后我们需要找出dp转移方程

那方程是什么呢?

  首先我们确定区间为给出的l,r,区间范围就是r-l+1,我们可以将区间

一分为二,然后分别找到左边和右边的最小值,取两值的min值便是区间所求

那我们可以得出结论:dp[i][j]=min(dp[i][j-1],dp[i+(1<<j-1)][j-1])

解释一下,dp[i][j]为从i开始2^j为范围中的最小值,即为我们所求dp[i][j-1]

从i开始2^(j-1)范围内的最小值,是所求范围的前一半

dp[i+(1<<j-1)][j-1] ,从i开始2^(j-1)范围内的最小值,是所求范围的后一半

  然后我们还需要注意一点,就是在预处理dp数组时我们需要将i放在里层

j放在外层,因为我们是以i为开始点进行dp的,在长度为2^j时我们需要把每一个

可出发的i都处理好,所以要将j放在外层

  最后就是区间查询了,我们需要一个值为log2(r-l+1),代表我们的j,这个式子

就是我们还原区间的方式,我们j代表的是2^j,那自然还原就是log2回去了

  代码:

 #include <bits/stdc++.h>
using namespace std;
int n,m,x,y,k;
long long a[];
long long dis[][];
inline void rmq(){
for(register int i=;i<=n;i++) dis[i][]=a[i];
for(register int j=;(<<j)<=n;j++)
for(register int i=;i+(<<j)-<=n;i++)//将i放在里层因为咱们要先更新每一个i的位置关系
dis[i][j]=min(dis[i][j-],dis[i+(<<j-)][j-]);
return;
}
inline void search(int l,int r){
k=log2(r-l+);
printf("%lld\n",min(dis[l][k],dis[r-(<<k)+][k]));
return;
}
int main(){
scanf("%d%d",&n,&m);
for(register int i=;i<=n;i++) scanf("%lld",&a[i]);
rmq();//预处理
for(register int i=;i<=m;i++){
scanf("%d%d",&x,&y);
search(x,y);
}
return ;
}

RMQ

  end;

数据结构——RMQ的更多相关文章

  1. [数据结构]RMQ问题小结

    RMQ问题小结 by Wine93 2014.1.14   1.算法简介 RMQ问题可分成以下2种 (1)静态RMQ:ST算法 一旦给定序列确定后就不在更新,只查询区间最大(小)值!这类问题可以用倍增 ...

  2. 数据结构(RMQ):POJ 3624 Balanced Lineup

    Balanced Lineup   Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always li ...

  3. 数据结构RMQ

    RMQ算法介绍 RMQ算法全称为(Range Minimum/Maximum Query)意思是给你一个长度为n的数组A,求出给定区间的最值的下标.当然我们可以采用枚举,但是我们也可以使用线段树来优化 ...

  4. 数据结构(RMQ):UVAoj 11235 Frequent values

    Frequent values You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. I ...

  5. uva 11235

    数据结构 RMQ算法   左右左右   写得有点晕了 ..... /****************************************************************** ...

  6. RMQ 数据结构

    RMQ 常用的数据结构之一 直接上代码 马克好来 是个好板子 #include <stdio.h> #define min(a,b) a<b ? a : b ],d[][]; voi ...

  7. 【暑假】[实用数据结构]范围最小值问题(RMQ)

    范围最小值问题: 提供操作: Query(L,R):计算min{AL ~ AR } Sparse-Table算法: 定义d[i][j]为从i开始长度为2j的一段元素的最小值.所以可以用递推的方法表示. ...

  8. 数据结构 《18》----RMQ 与 LCA 的等价性 (一)

    前言     RMQ: 数组 a0, a1, a2,..., an-1, 中求随意区间 a[i+1], a[i+2], ..., a[i+k] 的最小值     LCA: 求二叉树中两个节点的最低公共 ...

  9. 『数据结构』RMQ问题

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

随机推荐

  1. git apply failed (转载)

    转自:http://blog.csdn.net/aaronzzq/article/details/6955893 git version 1.6.0.4 几个新手刚刚开始接触 Git,为了维护核心仓库 ...

  2. h.264的POC计算(转载)

    转自:http://www.cnblogs.com/TaigaCon/p/3551001.html 本文参考自http://wenku.baidu.com/link?url=ZPF0iSKzwLQg_ ...

  3. (水题)洛谷 - P2089 - 烤鸡

    https://www.luogu.org/problemnew/show/P2089 非常暴力的dfs,不知道不剪枝会怎么样,但是其实最多也就 $3^{10}$ ,大不到哪里去.还有一个细节就是大于 ...

  4. 51nod 1268【dp】

    思路: 很水的dp吧...问的都是能否组成.. 哦对,这里sum最大才2e7,不会是2e9所以放心dp #include<cstdio> #include <map> #inc ...

  5. poj 3710 Christmas Game【博弈论+SG】

    也就是转换到树形删边游戏,详见 https://wenku.baidu.com/view/25540742a8956bec0975e3a8.html #include<iostream> ...

  6. hdu1085 Holding Bin-Laden Captive!【生成函数】

    列出生成函数的多项式之后暴力乘即可 #include<iostream> #include<cstdio> #include<cstring> using name ...

  7. (六)SpringBoot整合Swagger2框架

    一:什么是Swagger Swagger是一款通过我们添加的注解来对方法进行说明,来自动生成项目的在线api接口文档的web服务. 二:添加Swagger2依赖 <dependency> ...

  8. spring mvc No mapping found for HTTP request with URI [/web/test.do] in DispatcherServlet with name 'spring'

    原因: spring-servlet.xml 中 <context:component-scan base-package="com.test.controller" /&g ...

  9. Java | 基础归纳 | set

    用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复.

  10. 129 Sum Root to Leaf Numbers 求根叶数字总和

    给定一个只包含 0-9 数字的二叉树,每个根到叶的路径可以代表一个数字.例如,从根到叶路径 1->2->3则代表数字 123.查找所有根到叶数字的总和.例如,    1   / \  2  ...