RMQ之ST算法模板

时间:2021-06-19 05:11:18
 #include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
const int N=1e6+;
int Max[N][],Min[N][],a[N];
void ST(int *a,int n)//预处理,O(NlogN)
{
for(int i=;i<=n;i++)
Min[i][]=Max[i][]=a[i];
for(int j=;j<=;j++)
{
for(int i=;i<=n;i++)
{
if(i+(<<(j-))<=n)
{
Max[i][j]=max(Max[i][j-],Max[i+(<<(j-))][j-]);
Min[i][j]=min(Min[i][j-],Min[i+(<<(j-))][j-]);
}
}
}
}
int Log2(int len)
{
int k=-;
while(len)
{
len>>=;
k++;
}
return k;
}
int main()
{
int n;
while(scanf("%d",&n))
{
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
ST(a,n);
int l=,r=n;
int k=Log2(r-l+);
printf("%d %d\n",max(Max[l][k],Max[r-(<<k)+][k]),min(Min[l][k],Min[r-(<<k)+][k]));
}
return ;
}

概述

RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值。ST算法它可以在O(nlogn)时间内进行预处理,然后在O(1)时间内回答每个查询。

参考文章:http://blog.csdn.net/liang5630/article/details/7917702