RMQ问题

原创 2016年05月31日 09:12:12

RMQ(Range Minimum/Maximum Query)问题是指对于长度为n的数列weight,回答若干询问RMQ(weight,l,r)(l,r<=n),返回数列A中下标在i,j里的最小(大)值。
假设询问m次,如果对于每个询问都扫描对应的区间,找到最值,那么最坏情况和平均情况下都是O(nm)的时间复杂度。所以需要事先进行一些预处理,使得一些重复计算的东西不再重复计算,才能够将复杂度降低下来。如果先预先计算一些区间的最值,然后把每个询问都拆成若干个计算了最值的区间并统计这些区间的最值的最值,就可以得出答案。根据二分法的思想,将统计的区间规定为所有长度为2的非负整数次幂的区间。用rmq[i][j]表示从第i个数开始后面2^j个数的最值,很显然rmq[i][0]等于weight[i],j的最大值为(int)((log(N))/(log(2.0)))。递推关系为rmq[i][j]=min(rmq[i][j-1],rmq[i+(1<<(j-1))][j-1])。可以看到,这是一个动态规划问题。对于每一次询问,j的最大值mi只能取(int)((log(r-l+1))/(log(2.0)))。为了防止超出边界,答案应该写成min(rmq[l][mi],rmq[r-(1<<mi)+1][mi])而不是min(rmq[l][mi],rmq[l+(1<<mi)][mi])。
以hihoCoder1068为例给出代码:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>  
#include<algorithm>  
using namespace std;    
const int maxn=1e6+5;  
const int max_pos=20;  
struct Quary
{
	int l,r; 
}quary[maxn];   
int N,Q;  
int weight[maxn];  
int rmq[maxn][max_pos];   

int main()
{  
	scanf("%d",&N);  
    for(int i=1;i<=N;i++) scanf("%d",&weight[i]);  
    scanf("%d",&Q);
    for(int i=1;i<=Q;i++) scanf("%d%d",&quary[i].l,&quary[i].r);    
	memset(rmq,0x5f,sizeof(rmq)); 
  	for(int i=1;i<=N;i++) rmq[i][0]=weight[i];   
    int l=(int)((log(N))/(log(2.0)));  
    for(int j=1;j<=l;j++)
	{  
        for(int i=1;i+(1<<j)-1<=N;i++)
		{  
            rmq[i][j]=min(rmq[i][j-1],rmq[i+(1<<(j-1))][j-1]);  
        }  
    } 
    for(int i=1;i<=Q;i++)
	{  
        int l=quary[i].l;  
        int r=quary[i].r;  
        int mi=(int)((log(r-l+1))/(log(2.0)));  
        printf("%d\n",min(rmq[l][mi],rmq[r-(1<<mi)+1][mi]));  
    }  
}


版权声明: 举报

相关文章推荐

HDU 3183

这道题的解法有多种,一种是ST

例题3.8 频繁出现的数值 UVa11235

1.题目描述:点击打开链接 2.解题思路:本题属于RMQ问题。注意到整个数组是非降序的,所有相等的元素都会聚在一起,这样就可以把整个数组进行游程编码(Run Lengh Encodeing RLE)...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

RMQ问题(士兵杀敌(三))

士兵杀敌(三) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最...

数据结构专题小结:RMQ问题

RMQ问题 范围最小值问题(Range Minimum Query)是指:给定一个n个元素的数组A[1],A[2]...A[n]。设计一个数据结构,支持查询操作Query(L,R):计算min{A[L...

RMQ问题

范围最小问题(Range Minimum Query RMQ)

RMQ问题

作者:dylantsou 出处:http://blog.csdn.net/dylantsou 引言:         在本人的上一篇关于后缀数组的博客中,在例2求...

RMQ问题

BMQ问题就是在一系列连续的数中,找出一个区间内最小的数,基本思路就是用d[i][j]表示从i开始,长度为2^j的一段元素中的最小值,直接先递推预处理,时间是O(nlogn),查找就O(1) 基本模...

NYOJ - 119 - 士兵杀敌(三) ( RMQ问题 )

描述 南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进行比较,计算出两个人的杀敌数差值,用这种方法一方面能鼓舞杀敌数高的人,另一方面也算是批评杀...

RMQ问题

RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j 主要方法及复杂度(处理复杂度和查询复杂度)如下: 1...

RMQ 问题

--   作者:Al --  发布时间:2005-7-3012:05:08 --  最近公共祖先与RMQ问题 一、最近公共祖先(Least Common Ancestors) ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)