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

poj 3368 Frequent values(RMQ)

2016-08-03 18:31 423 查看
/************************************************************
题目:    Frequent values(poj 3368)
链接:    http://poj.org/problem?id=3368 题意:    给出n个数和Q个询问(l,r),对于每个询问求出(l,r)之
间连续出现次数最多的次数
算法:    RMQ
思路:    借助数组f[i]。表示第i位前面有f[i]个相同的数。对于
每个区间(l,r)。暴力求前面几个相同的数。然后在用RMQ
求后面区间的值。
*************************************************************/
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;

const int mx=100005;
int dp[mx][30];
int a[mx],f[mx];
int n,q;

void makermq()
{
for (int i=1;i<=n;i++) dp[i][0]=f[i];
for (int j=1;(1<<j)<=n;j++)
{
for (int i=1;i+(1<<j)-1<=n;i++)
{
dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
}
}

int rmq(int u,int v)
{
if (u>v) return 0;
int k=(int)(log(v-u+1)/log(2.0));
return max(dp[u][k],dp[v-(1<<k)+1][k]);
}

int main()
{
while (~scanf("%d",&n)&&n)
{
scanf("%d",&q);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
f[1]=1;
for (int i=2;i<=n;i++)
{
if (a[i]==a[i-1]) f[i]=f[i-1]+1;
else f[i]=1;
}
makermq();

while (q--)
{
int l,r;
scanf("%d%d",&l,&r);
int ans=1;
for (l=l+1;l<=r;l++)
{
if (a[l]!=a[l-1]) break;
ans++;
}
ans=max(ans,rmq(l,r));
printf("%d\n",ans);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: