RMQ问题
Posted sun123zxy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RMQ问题相关的知识,希望对你有一定的参考价值。
现给你n(<=1000000)个整数(都小于longint),有k(0< k<= 1000000)个询问,对于每个询问(L,R),回答(L,R)内的最大值为多少?
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; const int MAXARR=1000005; const int MAXLOG=(int)log2(MAXARR)+5; int n,askn; int dp[MAXARR][MAXLOG]; int a[MAXARR]; int maxlogn; void init(){ for(int i=1;i<=n;i++){ dp[i][0]=a[i]; } for(int j=1;j<=maxlogn;j++){ for(int i=1;i+int(1<<j)-1<=n;i++){ dp[i][j]=max(dp[i][j-1],dp[i+int(1<<(j-1))][j-1]); } } } int ask(int l,int r){ int len=r-l+1; int p=log2(len/2)+1; return max(dp[l][p],dp[r-int(1<<p)+1][p]); } int main(){ cin>>n>>askn; maxlogn=log2(n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } init(); for(int i=1;i<=askn;i++){ int t1,t2; scanf("%d%d",&t1,&t2); printf("%d ",ask(t1,t2)); } return 0; }
以上是关于RMQ问题的主要内容,如果未能解决你的问题,请参考以下文章