NYOJ 119士兵杀敌(三)(RMQ问题)(ST表)

RMQ问题,即范围最小值问题(Range Minimum Query)

ST表

【任务】

给定一个数组A[n],设计一个数据结构,支持查询操作Query(L,R):计算min{AL,AL+1,...AR}或者max{AL,AL+1,...AR}

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 #define MAX 180012
 5 int A[MAX][17],B[MAX][17];
 6 
 7 int RMQ(int L,int R)
 8 {
 9     int k = 0;
10     while((1<<(k+1)) <= R-L+1) k++;
11     return (max(A[L][k],A[R-(1<<k)+1][k])-min(B[L][k],B[R-(1<<k)+1][k]));
12 }
13 int main()
14 {
15     //freopen("in.txt","r",stdin);
16     int i,j,m,n,a,b;
17     scanf("%d%d",&n,&m);
18     for(i=1; i<=n; i++)
19     {
20         scanf("%d",&a);
21         A[i][0] = B[i][0] = a;
22     }
23     for(j = 1; (1<<j) <= n; j++)
24         for(i = 1; i+j-1 <= n; i++)
25         {
26             B[i][j] = min( B[i][j-1], B[i+(1<<(j-1))][j-1] );
27             A[i][j] = max( A[i][j-1], A[i+(1<<(j-1))][j-1] );
28         }
29     while(m--)
30     {
31         scanf("%d%d",&a,&b);
32         printf("%d
",RMQ(a,b));
33     }
34     return 0;
35 }
View Code



原文地址:https://www.cnblogs.com/qiu520/p/3198321.html