RMQ问题

作者: Gitfan | 来源:发表于2017-03-15 21:41 被阅读0次

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

解决这类问题常用的是tarjan的Sparse_table算法,即稀疏表算法。
它的预处理时间是O( nlogn ),但是查询时间为O( 1 )
Balanced Lineup

#include <cstdio>
#include<algorithm>
#include <stdlib.h>
#include<string.h>
#define maxn 50005
using namespace std;
int dmin[maxn][16],dmax[maxn][16];
int rmq_min(int l,int r)
{
    int k=0;
    while((1<<(k+1))<=r-l+1) k++;//如果2^(k+1)<=r - l + 1,那么k还可以加1
    //可以保证2^k最大等于区间长度,那么范围查询不越界,且左右半边至少无空隙
    return min(dmin[l][k],dmin[r-(1<<k)+1][k]);
}
int rmq_max(int l,int r)
{
    int k=0;
    while((1<<(k+1))<=r-l+1) k++;
    return max(dmax[l][k],dmax[r-(1<<k)+1][k]);
}
int main()
{
    int n,m,a,b;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a);
        dmin[i][0]=a;
        dmax[i][0]=a;
    }
    for(int j=1;(1<<j)<=n;j++)
    {
        for(int i=0;i+(1<<j)-1<n;i++)
        {
            dmin[i][j]=min(dmin[i][j-1],dmin[i+(1<<(j-1))][j-1]);
            dmax[i][j]=max(dmax[i][j-1],dmax[i+(1<<(j-1))][j-1]);
        }
    }
    for(int i=0;i<m;i++)
    {
        scanf("%d%d",&a,&b);
        printf("%d\n",rmq_max(a-1,b-1)-rmq_min(a-1,b-1));
    }
}

相关文章

  • RMQ问题

    RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RM...

  • RMQ—ST

    原题链接[https://www.acwing.com/problem/content/1272/] 在RMQ问题...

  • RMQ问题(S-T算法)

    问题:范围最小值问题(Range Minimum Query,RMQ)即查询Query(L,R),计算min(AL...

  • RMQ

    优化可以存log2(N),pow(2,n)可以用<< 来实现

  • RMQ问题详解(线段树,树状数组,ST,RMQ转LCA,Spla

    由于当年的百度空间和网易博客上发布的内容都因为这两个博客的停止维护都不在啦,现在上了大学,就读的也是计算机专业,有...

  • 区间---RMQ区间最值查询

    RMQ区间最值查询,对于长度为n的数组A[]。RMQ(i,j),返回数组A区间[i , j]内的最大值或最小值。 ...

  • rocket mq通讯模型源码分析

    该章节主要深入分析rmq是如何构建自己的通讯模型的,主要从以下四点分析: 1、总概论述 2、rmq的通讯协议实现。...

  • Fenwick Tree/B.I.T树状数组算法

    树状数组适用范围:给定区间,求最值,求和,区间单点修改。与RMQ不同的是,RMQ一般只用作区间求最值。但在最值方面...

  • RMQ-ST表

    以前学RMQ的时候完全不懂,最近写到了类似的题,在看了几篇博客,加上以前整理的笔记,才加深了对RMQ算法的理解。R...

  • RabbitMQ学习(四)可靠性投递和confirm机制

    RMQ可靠性投递 一.什么是RMQ的可靠性投递 1.保障消息的成功发出2.保障MQ节点的成功接收3.发送端收到MQ...

网友评论

      本文标题:RMQ问题

      本文链接:https://www.haomeiwen.com/subject/peprnttx.html