POJ 3263 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]);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章