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

POJ 3368 Frequent values(rmq)

2013-04-19 18:55 309 查看
题目链接

离散化后rmq,新白书上对这个题有讲解。

#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
using namespace std;
#define N  100000
int p
;
int dp[22][N+1];
int hash[3*N];
int que[N+1];
int L[N+1];
int R[N+1];
int o[N+1];
void init_rmq(int n)
{
int i,j;
for(i = 1;i <= n;i ++)
dp[0][i] = o[i];
for(i = 1;(1<<i) <= n;i ++)
{
for(j = 1;j + (1<<(i-1)) <= n;j ++)
{
dp[i][j] = max(dp[i-1][j],dp[i-1][j+(1<<(i-1))]);
}
}
}
int rmq(int x,int y)
{
if(x > y) return 0;
int k = log(y-x+1.0)/log(2.0);
return max(dp[k][x],dp[k][y-(1<<k)+1]);
}
int query(int x,int y)
{
int temp,nx,ny;
if(p[x] == p[y])
return y-x+1;
nx = hash[p[x]+N];
ny = hash[p[y]+N];
temp = max(R[nx]-x+1,y-L[ny]+1);
temp = max(temp,rmq(nx+1,ny-1));
return temp;
}
int main()
{
int n,m,i,temp,num,x,y;
while(scanf("%d",&n)!=EOF)
{
if(n == 0) break;
scanf("%d",&m);
for(i = 1;i <= n;i ++)
{
scanf("%d",&p[i]);
}
L[1] = 1;
num = 1;
temp = 1;
hash[p[1]+N] = 1;
for(i = 2;i <= n;i ++)
{
if(p[i] != p[i-1])
{
R[num] = i-1;
o[num] = temp;
hash[p[i-1]+N] = num;
temp = 1;
num ++;
L[num] = i;
}
else
{
temp ++;
}
}
R[num] = i-1;
o[num] = temp;
hash[p[i-1]+N] = num;
init_rmq(num);
while(m--)
{
scanf("%d%d",&x,&y);
printf("%d\n",query(x,y));
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: