码迷,mamicode.com
首页 > 其他好文 > 详细

RMQ模板

时间:2017-08-22 23:09:45      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:space   class   algorithm   详细   rmq   i++   ring   style   code   

附上一个详细的大佬的讲解  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模板

标签:space   class   algorithm   详细   rmq   i++   ring   style   code   

原文地址:http://www.cnblogs.com/a249189046/p/7413717.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!