题目链接: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 }
RMQ

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-10
  • 2022-02-09
  • 2022-01-03
  • 2021-11-12
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-07-06
  • 2021-10-16
  • 2022-12-23
  • 2022-12-23
  • 2022-03-08
相关资源
相似解决方案