1. 程式人生 > >SPOJ RPLN (模板題)(ST演算法)【RMQ】

SPOJ RPLN (模板題)(ST演算法)【RMQ】

<題目連結>

題目大意:
給你一段序列,進行q次區間查詢,每次都輸出詢問區間內的最小值。

解題分析:

RMQ模板題,下面用線上演算法——ST演算法求解。不懂ST演算法的可以看這篇部落格  >>>

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <cmath>
 5 using namespace std;
 6 const int MAXN =2e5+10;
 7 int maxsum[MAXN][20
],minsum[MAXN][20]; //表示從第i個數起連續2^j個數中的最大值/最小值 8 void RMQ(int num){ //預處理maxsum、minsum陣列 9 for(int j=1;j<20;j++){ 10 for(int i=1;i<=num;i++){ 11 if(i+(1<<j)-1<=num){ 12 maxsum[i][j]=max(maxsum[i][j-1],maxsum[i+(1<<(j-1))][j-1]); 13 minsum[i][j]=min(minsum[i][j-1
],minsum[i+(1<<(j-1))][j-1]); 14 } 15 } 16 } 17 } 18 int main(){ 19 int T,ncase=0,num,q; 20 scanf("%d",&T); 21 while(T--){ 22 scanf("%d%d",&num,&q); 23 for(int i=1;i<=num;i++){ 24 scanf("%d",&maxsum[i][0]); 25 minsum[i][0
]=maxsum[i][0]; //初始化 26 } 27 RMQ(num); 28 printf("Scenario #%d:\n",++ncase); 29 while(q--){ 30 int st,en,maxl,minl; 31 scanf("%d%d",&st,&en); 32 int k=(int)((log(en-st+1))/log(2.0)); 33 maxl=max(maxsum[st][k],maxsum[en-(1<<k)+1][k]); 34 minl=min(minsum[st][k],minsum[en-(1<<k)+1][k]); 35 printf("%d\n",minl); 36 } 37 } 38 return 0; 39 }

 

 

2018-10-19