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

时间:2021-01-20 19:38:18

<题目链接>

题目大意:
给你一段序列,进行q次区间查询,每次都输出询问区间内的最小值。

解题分析:

RMQ模板题,下面用在线算法——ST算法求解。不懂ST算法的可以看这篇博客  >>>

 #include <cstdio>
#include<cstring>
#include <cmath>
#include <algorithm>
using namespace std; const int M =1e5+;
int n,q;
int arr[M],mn[M][]; //表示从第i个数起连续2^j个数中的最小值
void RMQ_init(){ //利用倍增原理预处理st表
int num=log((double)n)/log(2.0);
for(int j=;j<=num;j++){
for(int i=;i+(<<j)-<=n;i++){
mn[i][j]=min(mn[i][j-],mn[i+(<<(j-))][j-]);
}
}
}
int RMQ(int l,int r){
int k=log((double)(r-l+))/log(2.0);
int ans=min(mn[l][k],mn[r-(<<k)+][k]); //比较[l,l+(1<<k)-1],[r-(1<<k)+1,r]这两个区间的最值
printf("%d\n",ans);
}
int main(){
int T,ncase=;scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&q);
for(int i=;i<=n;i++){
scanf("%d",&arr[i]);
mn[i][]=arr[i];
}
RMQ_init();
printf("Scenario #%d:\n",++ncase);
while(q--){
int l,r;
scanf("%d%d",&l,&r);
RMQ(l,r);
}
}
return ;
}

2018-10-19