#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MAXN = 1005;
int rmq[MAXN][20];
int a[MAXN];
int mm[MAXN];//最大的小于等于i的2^mm[i]
void initRMQ(int n)
{
mm[0]=-1;
for(int i=1;i<=n;i++)
{
mm[i]=((i&(i-1))==0)?mm[i-1]+1:mm[i-1];
rmq[i][0]=a[i];
}
for(int j=1;j<=mm[n];j++)
for(int i=1;i+(1<<j)-1<=n;i++)
rmq[i][j]=max(rmq[i][j-1],rmq[i+(1<<(j-1))][j-1]);
}
int RMQ(int x,int y)
{
int k=mm[y-x+1];
return max(rmq[x][k],rmq[y-(1<<k)+1][k]);
}rmq模板
最新推荐文章于 2019-04-24 21:38:00 发布
本文介绍了一种区间最大值查询(RMQ)的预处理算法实现,该算法通过构建一个二维数组来存储数据,支持快速查询任意指定区间内的最大值。文章详细展示了初始化过程,包括如何预先计算出每个区间的最大值,以及如何通过这些预处理的数据来进行高效查询。
291

被折叠的 条评论
为什么被折叠?



