题目链接:http://poj.org/problem?id=3264
题目大意:
在给定一堆牛的数量以及其高度的时候,每次给定一段区间,求这个区间内最高的牛和最矮的牛的高度之差为多少。
可以直接利用RMQ求出区间最大最小相减即可,一道模板题- -。
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 #include <iostream> 6 using namespace std; 7 #define N 50010 8 9 int maxn[N][18] , minn[N][18] , n , q , val[N]; 10 11 void RMQ() 12 { 13 memset(maxn , 0 , sizeof(maxn)); 14 memset(minn , 0x3f , sizeof(minn)); 15 for(int i=1 ; i<=n ; i++) maxn[i][0] = minn[i][0] = val[i]; 16 for(int i=1 , j=2 ; j<=n ; i++ , j<<=1){ 17 for(int k=1 ; k+j-1<=n ; k++){ 18 int la = k+(j>>1); 19 maxn[k][i] = max(maxn[k][i-1] , maxn[la][i-1]); 20 minn[k][i] = min(minn[k][i-1] , minn[la][i-1]); 21 } 22 } 23 } 24 25 int query(int s , int t) 26 { 27 int del = t-s+1; 28 int j = (int)(log10(del)/log10(2))+1; 29 int la = t-(1<<(j-1))+1; 30 return max(maxn[s][j-1] , maxn[la][j-1])-min(minn[s][j-1] , minn[la][j-1]); 31 } 32 33 int main() 34 { 35 // freopen("in.txt" , "r" , stdin); 36 while(~scanf("%d%d" , &n , &q)) 37 { 38 for(int i=1 ; i<=n ; i++) scanf("%d" , &val[i]); 39 RMQ(); 40 while(q--){ 41 int s , t; 42 scanf("%d%d" , &s , &t); 43 printf("%d\n" , query(s , t)); 44 } 45 } 46 return 0; 47 }