您的位置:首页 > 产品设计 > UI/UE

poj 3368 Frequent values(RMQ)

2016-02-08 23:37 471 查看
也算是一道模版题吧。

初始化为连续相同的数的个数,最后查询之前先从和区间第一个数不同的数开始查询,然后和区间内和第一个数相同的数的个数进行比较,输出最大值就好了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<math.h>
#include<algorithm>
using namespace std;

const int INF=0x3f3f3f3f;
const int maxn=100005;
int n,m;
int a[maxn];
int maxNum[maxn][32];

void RMQ(){
for(int j=1;j<=20;j++){
for(int i=1;i<=n;i++){
if(i+(1<<j)-1<=n){
maxNum[i][j]=max(maxNum[i][j-1],maxNum[i+(1<<(j-1))][j-1]);
}
}
}
}

int main() {
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
#endif
while(~scanf("%d",&n)&&n){
scanf("%d",&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
maxNum[1][0]=1,a[0]=-INF;
for(int i=2;i<=n;i++){
if(a[i]==a[i-1])
maxNum[i][0]=maxNum[i-1][0]+1;
else
maxNum[i][0]=1;
}
RMQ();
int p,q;
while(m--){
scanf("%d%d",&p,&q);
int tmp=p;
while(tmp<=q&&(a[tmp]==a[tmp-1]))
tmp++;
int intervalMax;
if(tmp>q)
intervalMax=0;
else{
int k=(int)log2(q-tmp+1);
intervalMax=max(maxNum[tmp][k],maxNum[q-(1<<k)+1][k]);
}
printf("%d\n",max(intervalMax,tmp-p));
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: