RMQ主要用于区间内最值的多组查询,暴力枚举会超时的情况下
(当然如果你会线段树当我没说)
主要思想就是倍增+dp
#include<bits/stdc++.h> using namespace std; const int N = 1e5+5; int dp[N][20]; int a[N]; void RMQ_build(int n){ for(int i=0; i<=n;i++) dp[i][0]=a[i]; for(int j = 1;(1<<j)<=n;j++) { for(int i = 1 ; i+(1<<j)-1 <= N;i++) dp[i][j]=min(dp[i][j-1],dp[i+(1<<j-1)][j-1]);//找 最 值 } } int RMQ_query(int l,int r) { int k=(int)(log((double)(r-l+1))/log(2.0)); printf("%d ",min(dp[l][k],dp[r-(1<<k)+1][k])); } int main(){ int m,n,l,r; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } RMQ_build(n); for(int i=0;i<m;i++){ scanf("%d%d",&l,&r); RMQ_query(l,r); } return 0; }