【RMQ问题】 poj 3264 Balanced Lineup

来源:互联网 发布:广州网络推广 编辑:程序博客网 时间:2024/06/06 03:25

<a target=_blank href="http://poj.org/problem?id=3264" target="_blank">http://poj.org/problem?id=3264</a>

裸的RMQ


/*  poj 3264 RMQ问题  题意:     一群牛告诉你身高,查询某个区间身高差的最大值  思路:     比较水,用的ST算法*/#include<iostream>#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<vector>#include<set>#include<map>#include<algorithm>#include<sstream>#define eps 1e-9#define pi acos(-1)#define long long ll#define M 10#define N 1010using namespace std;const int _max = 5e4 + 10;int d1[_max][20],d2[_max][20],a[_max];int minx,maxx,n,Q;void RMQ_init(){  for(int i = 0; i < n; ++ i) d1[i][0] = d2[i][0] = a[i];  for(int j = 1;(1<<j)<=n;++ j)  for(int i = 0;i + (1<<j)-1 < n;++ i){     d1[i][j] = min(d1[i][j-1],d1[i+(1<<(j-1))][j-1]);     d2[i][j] = max(d2[i][j-1],d2[i+(1<<(j-1))][j-1]);  }}void RMQ(int L,int R){  if(L>R) return ;  int k = 0;  while((1<<(k+1))<= R-L+1)++k;  minx = min(d1[L][k],d1[R-(1<<k)+1][k]);  maxx = max(d2[L][k],d2[R-(1<<k)+1][k]);}int main(){   #ifndef ONLINE_JUDGE   freopen("input.txt","r",stdin);   #endif // ONLINE_JUDGE   while(scanf("%d%d",&n,&Q) ==2){    for(int i = 0; i < n; ++ i) scanf("%d",a+i);    RMQ_init();    int L,R;    while(Q--){        scanf("%d%d",&L,&R);        RMQ(L-1,R-1);        printf("%d\n",maxx-minx);    }   }   return 0;}


0 0
原创粉丝点击