RMQ模板

Posted hinata_hajime

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RMQ模板相关的知识,希望对你有一定的参考价值。

附上一个详细的大佬的讲解  http://blog.csdn.net/niushuai666/article/details/6624672

 

RMQ模板(NYOJ 119)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN=1e5+10;
int a[MAXN];
int maxsum[MAXN][20];
int minsum[MAXN][20];
int maxx;
int minn;
void RMQ_In(int num) //预处理->O(nlogn)
{
    for(int j = 1; j < 20; ++j)
        for(int i = 1; i <= num; ++i)
            if(i + (1 << j) - 1 <= num)
            {
                maxsum[i][j] = max(maxsum[i][j - 1], maxsum[i + (1 << (j - 1))][j - 1]);
                minsum[i][j] = min(minsum[i][j - 1], minsum[i + (1 << (j - 1))][j - 1]);
            }
}
void RMQ_Query(int src,int des)
{
        int k=(int)(log(des-src+1.0)/log(2.0));
        maxx=max(maxsum[src][k],maxsum[des-(1<<k)+1][k]);
        minn=min(minsum[src][k],minsum[des-(1<<k)+1][k]);
}
int main()
{
   int n,q,a,b;
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++){
        scanf("%d",&minsum[i][0]);
        maxsum[i][0]=minsum[i][0];
    }
    RMQ_In(n);
    while(q--)
    {
        scanf("%d%d",&a,&b);
        RMQ_Query(a,b);
        printf("%d\n",maxx-minn);
    }
    return 0;
}

 

以上是关于RMQ模板的主要内容,如果未能解决你的问题,请参考以下文章

RMQ模板

RMQ模板

RMQ问题模板

LCA上的RMQ模板算法

RMQ 模板 2012-09-13

静态RMQ模板题 contest 静态RMQ T2