数据结构——RMQ
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的更多相关文章
- [数据结构]RMQ问题小结
RMQ问题小结 by Wine93 2014.1.14 1.算法简介 RMQ问题可分成以下2种 (1)静态RMQ:ST算法 一旦给定序列确定后就不在更新,只查询区间最大(小)值!这类问题可以用倍增 ...
- 数据结构(RMQ):POJ 3624 Balanced Lineup
Balanced Lineup Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always li ...
- 数据结构RMQ
RMQ算法介绍 RMQ算法全称为(Range Minimum/Maximum Query)意思是给你一个长度为n的数组A,求出给定区间的最值的下标.当然我们可以采用枚举,但是我们也可以使用线段树来优化 ...
- 数据结构(RMQ):UVAoj 11235 Frequent values
Frequent values You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. I ...
- uva 11235
数据结构 RMQ算法 左右左右 写得有点晕了 ..... /****************************************************************** ...
- RMQ 数据结构
RMQ 常用的数据结构之一 直接上代码 马克好来 是个好板子 #include <stdio.h> #define min(a,b) a<b ? a : b ],d[][]; voi ...
- 【暑假】[实用数据结构]范围最小值问题(RMQ)
范围最小值问题: 提供操作: Query(L,R):计算min{AL ~ AR } Sparse-Table算法: 定义d[i][j]为从i开始长度为2j的一段元素的最小值.所以可以用递推的方法表示. ...
- 数据结构 《18》----RMQ 与 LCA 的等价性 (一)
前言 RMQ: 数组 a0, a1, a2,..., an-1, 中求随意区间 a[i+1], a[i+2], ..., a[i+k] 的最小值 LCA: 求二叉树中两个节点的最低公共 ...
- 『数据结构』RMQ问题
RMQ(Range Minimum/Maximum Query),即区间最值问题. 对于长度为 n 的数列 A ,回答若干查询 RMQ(A,i,j)(i,j<=n) ,返回数列 A 中下标在 i ...
随机推荐
- POJ - 1661 - Help Jimmy - 简单dp
http://poj.org/problem?id=1661 一般化处理,把一开始的落地和大地都视作平台,设计平台类的属性.dp的时候显然是从上往下dp的,而且要小心Jimmy不能够穿过平台,也就是从 ...
- 洛谷 - P1309 - 瑞士轮 - 归并排序
https://www.luogu.org/problemnew/show/P1309 一开始写的直接快排没想到真的TLE了. 想到每次比赛每个人前移的量不会很多,但是不知从哪里开始优化. 搜索一下原 ...
- HDU5589:Tree(莫队+01字典树)
传送门 题意 略 分析 f[u]表示u到根的边的异或 树上两点之间的异或值为f[u]^f[v], 然后将查询用莫队算法分块,每个点插入到字典树中,利用字典树维护两点异或值大于等于M复杂度O(N^(3/ ...
- hdoj5842【水题】
比赛的时候还特别撒比地写了二分的那个写法,然后wa了一发,因为这个集合的翻译成自然数集.还是转换了一下,还是去写了一个二分. 后面就是出现几种就是多长... 比赛的真的非常非常挫的code-. #in ...
- bzoj 1814: Ural 1519 Formula 1【插头dp】
设f[i][j][s]为轮廓线推到格子(i,j),状态为s的方案数 括号表示一段线的左端和右端,表示成左括号和右括号,状压的时候用1和2表示,0表示已经闭合 下面的蓝线是黄色格子的轮廓线,dp转移要把 ...
- NOIp2016 蚯蚓 【二叉堆/答案单调性】By cellur925
题目传送门 $Sol$ $50pts$:我们考虑$q==0$的情况,每次在所有的蚯蚓中找到一只长度最大的,这非常二叉堆.所以我们可以用一个优先队列,随便水一下就有50分.($NOIp$的分真这么好拿? ...
- scikit-learning教程(三)使用文本数据
使用文本数据 本指南的目标是探讨scikit-learn 一个实际任务中的一些主要工具:分析二十个不同主题的文本文档(新闻组帖子)集合. 在本节中,我们将看到如何: 加载文件内容和类别 提取适用于机器 ...
- 1-20StringBuffer简介
StringBuffer是一个字符串缓冲区,如果需要频繁的对字符串进行拼接时,建议使用StringBuffer. 工作原理 StringBuffer的底层是char数组,如果没有明确设定,则系统会默认 ...
- 复习Java和前端、后端框架等。
以下便是我开始复习时做的笔记.
- 浅析 Spark Shuffle 内存使用
在使用 Spark 进行计算时,我们经常会碰到作业 (Job) Out Of Memory(OOM) 的情况,而且很大一部分情况是发生在 Shuffle 阶段.那么在 Spark Shuffle 中具 ...