POJ 3368 Frequent values(rmq)
2013-04-19 18:55
309 查看
题目链接
离散化后rmq,新白书上对这个题有讲解。
离散化后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; }
相关文章推荐
- poj 3368 && hdu 1806 Frequent values(数据结构:RMQ)
- POJ 3368 Frequent values(RMQ 求区间出现最多次数的数字的次数)
- poj 3368(RMQ)Frequent values
- HDU 1806 && POJ 3368 Frequent values (RMQ)
- POJ 3368 Frequent values【RMQ变形】
- RMQ算法简单实现poj 3368 Frequent values
- POJ3368 Frequent values (RMQ)
- POJ 3368 Frequent values (RMQ)
- POJ 3368 Frequent values (RMQ的变型,RMQ应用)
- POJ 3368 Frequent values(RMQ 求区间出现最多次数的数字的次数)
- poj 3368 Frequent values(离散化+RMQ)
- 【POJ 3368】 Frequent values(RMQ)
- POJ 3368—— Frequent values(频繁出现的数值UVA11235) RMQ
- POJ 3368 Frequent values (RMQ)
- 【RMQ|ST】POJ-3368 Frequent values
- POJ 3368 Frequent values 线段树 || RMQ
- POJ 3368 Frequent values (UVA 11235)(RMQ)
- POJ 3368 Frequent values (RMQ)
- POJ 3368.Frequent values(RMQ和线段树)
- POJ 3368 Frequent values (基础RMQ)