Balanced_Lineup (RMQ初步)

Balanced_Lineup (RMQ初步)

题目大意:

poj 3263
有N头牛,给定N头牛的高度,输出给定区间内最高牛的高度与最低牛的高度差
输入:第一行两个数N、Q分别代表N头牛,Q个操作区间
接下来输入N个数,代表N头牛的高度
接下来是Q个操作区间,每一个操作区间输出一个高度差

用刘汝佳白书上的RMQ模板就行,对最大最小值,分别判断就行

代码如下

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>

using namespace std;

const int maxn = 5e5+5;

int d_max[maxn][20],d_min[maxn][20],num[maxn];
int N,Q;

void RMQ_init();//初始化
int RMQ_max(int,int);//最大值
int RMQ_min(int,int);//最小值

int main()
{
    // freopen("./in.txt","r",stdin);
    // freopen("./out.txt","w",stdout);
    scanf("%d%d",&N,&Q);
    for(int i = 0;i < N;i++) scanf("%d",num+i);
    RMQ_init();
    for(int i = 0;i < Q ;i++)
    {
        int l,r; scanf("%d%d",&l,&r);
        l--,r--;
        printf("%d\n",RMQ_max(l,r)-RMQ_min(l,r));
    }
    return 0;
}

void RMQ_init()
{
    for(int i = 0;i < N;i++) d_max[i][0] = d_min[i][0] = num[i];
    for(int j = 1;(1<<j) <= N;j++)
    {
        for(int i = 0;i + (1<<j) - 1 < N;i++)
        {
            d_min[i][j] = min(d_min[i][j-1],d_min[i+(1<<(j-1))][j-1]);
            d_max[i][j] = max(d_max[i][j-1],d_max[i+(1<<(j-1))][j-1]);
        }
    }
}

int RMQ_max(int l,int r)
{
    int k = int(log(r-l+1.0)/log(2.0));
    return max(d_max[l][k],d_max[r-(1<<k)+1][k]);
}

int RMQ_min(int l,int r)
{
    int k = int(log(r-l+1.0)/log(2.0));
    return min(d_min[l][k],d_min[r-(1<<k)+1][k]);
}

猜你喜欢

转载自blog.csdn.net/qq_40953281/article/details/81214390