poj 3264 Balanced Lineup

来源:互联网 发布:可视化编程软件 编辑:程序博客网 时间:2024/06/11 03:27

题目链接:Balanced Lineup

题目大意:给定区间,求区间最大值和最小值的差值

题目思路:因为是单纯的查询区间最值,直接RMQ就好了

#include <map>#include <set>#include <queue>#include <stack>#include <cmath>#include <vector>#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>#define pb push_backusing namespace std;typedef long long ll;const int maxn = 5e4+10;int N,Q,a[maxn];int dpmax[maxn][20],dpmin[maxn][20];void init_RMQ(){    int l = (int)(log(N)/log(2.0));    for(int i = 1;i <= N;i++)        dpmax[i][0] = dpmin[i][0] = a[i];    for(int j = 1;j <= l;j++){        for(int i = 1;i+(1<<j)-1 <= N;i++){            dpmax[i][j] = max(dpmax[i][j-1],dpmax[i+(1<<(j-1))][j-1]);            dpmin[i][j] = min(dpmin[i][j-1],dpmin[i+(1<<(j-1))][j-1]);        }    }}int RMQMax(int l,int r){    int k = (int)(log(r-l+1)/log(2.0));    return max(dpmax[l][k],dpmax[r-(1<<k)+1][k]);}int RMQMin(int l,int r){    int k = (int)((log(r-l+1))/(log(2.0)));    return min(dpmin[l][k],dpmin[r-(1<<k)+1][k]);}int main(){    while(~scanf("%d%d",&N,&Q)){        for(int i = 1;i <= N;i++) scanf("%d",&a[i]);        init_RMQ();        while(Q--){            int l,r;            scanf("%d%d",&l,&r);            printf("%d\n",RMQMax(l,r)-RMQMin(l,r));        }    }    return 0;}