0
点赞
收藏
分享

微信扫一扫

POJ 3264 Balanced Lineup (RMQ)


​​POJ3264​​

题意是:求区间最大值和最小值的差

RMQ(Range Minimum/Maximum Query),即区间最值查询,这是一种在线算法,所谓在线算法,是指用户每次输入一个查询,便马上处理一个查询。RMQ算法一般用较长时间做预处理,时间复杂度为O(nlogn),然后可以在O(1)的时间内处理每次查询。

​​RMQ详解​​

RMQ模板:

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <vector>
#include <queue>
#include <cmath>
#define Max 50005
using namespace std;
int n,m,t;
const int MAXN = 50010;
int dpMAX[MAXN][20],dpMIN[MAXN][20];
int mm[MAXN];
int cow[MAXN];
//初始化RMQ, b(cow)数组下标从1开始,从0开始简单修改
void makemaxRMQ(int n,int b[])
{
for(int i=1;i<=n;i++)
dpMAX[i][0]=b[i];
for(int j=1;(1<<j)<=n;j++)
for(int i=1;i+(1<<j)-1<=n;i++)
dpMAX[i][j]=max(dpMAX[i][j-1],dpMAX[i+(1<<(j-1))][j-1]);
}
int rmqMAX(int s,int v)
{
int k=(int)(log(v-s+1.0)/log(2.0));
return max(dpMAX[s][k],dpMAX[v-(1<<k)+1][k]);
}
void makeminRMQ(int n,int b[])
{
for(int i=1;i<=n;i++)
dpMIN[i][0]=b[i];
for(int j=1;(1<<j)<=n;j++)
for(int i=1;i+(1<<j)-1<=n;i++)
dpMIN[i][j]=min(dpMIN[i][j-1],dpMIN[i+(1<<(j-1))][j-1]);
}
int rmqMIN(int s,int v)
{
int k=(int)(log(v-s+1.0)/log(2.0));
return min(dpMIN[s][k],dpMIN[v-(1<<k)+1][k]);
}
int main()
{
int q;
while(scanf("%d%d",&n,&q)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&cow[i]);
}
makemaxRMQ(n,cow);
makeminRMQ(n,cow);
for(int i=1;i<=q;i++)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",rmqMAX(a,b)-rmqMIN(a,b));
}
}
return 0;
}

 

举报

相关推荐

0 条评论