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分布式版本控制工具

    一.安装Git  1.下载Windows版的Git:msysgit:官方下载地址:http://msysgit.github.io,安装选定要安装的目录(路径杜绝中文),剩下的按照默认安装即可,参考: ...

  2. C++经典面试题全集 50~100道 都附带有参考答案

    51.  引用与指针有什么区别? 答 .1) 引用必须被初始化,指针不必. 2) 引用初始化以后不能被改变,指针可以改变所指的对象. 3) 不存在指向空值的引用,但是存在指向空值的指针. 52.  描 ...

  3. 浅谈Floyd的三种用法 By cellur925

    Floyd大家可能第一时间想到的是他求多源最短路的n³算法.其实它还有另外两种算法的嘛qwq.写一发总结好了qwq. 一.多源最短路 放段代码跑,注意枚举顺序,用邻接矩阵存图.本质是一种动规. 复杂度 ...

  4. 序列/树上差分小结 By cellur925

    首先我们需要注意一下的是,差分比较适用于修改比较多而查询比较少的情况. 一.序列上差分 借教室  这是一道二分答案,在check函数中用到差分技巧的一道题,譬如说我们要把一个序列中[l,r]区间都加上 ...

  5. python之url编码

    import urllib.parsempp='besttest 自动化测试'print(urllib.parse.quote_plus(mpp)) #url编码print(urllib.parse. ...

  6. Android 暗码表

    转自: http://blog.csdn.net/jiangshide/article/details/8192834 不同手机厂商可能会隐藏或修改暗码,部份暗码要谨慎使用,因为可能令手机失去原有的功 ...

  7. python programming

    1. super 2. *args, **kwargs 3. class object 4. type 5. isinstance 6. list[:] = another_list

  8. 01_C++学习笔记_入门

    1.float类型只能表示数字里面的前6位或者前7位.也就是说c++只能保证float类型的数字的前6位是正确的.如果要求的精度更高的话,请使用double和long double. float精度是 ...

  9. [转]EntityFramework之领域驱动设计实践

    本文转自:http://www.cnblogs.com/daxnet/archive/2010/11/02/1867392.html Entity Framework之领域驱动设计实践 EntityF ...

  10. AJPFX总结方法的特点

    它可以实现独立的功能; 必须定义在类里面; 它只有被调用才会执行; 它可以被重复使用; 方法结束后方法里的对象失去引用;   如何定义一个功能,并通过方法体现出来: ① 明确该功能运算后的结果.明确返 ...