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); } } }
相关文章推荐
- poj 3368 Frequent values(RMQ)
- POJ 3368 Frequent values (RMQ)
- RMQ算法简单实现poj 3368 Frequent values
- POJ 3368 Frequent values 线段树 || RMQ
- POJ 3368 Frequent values (RMQ的变型,RMQ应用)
- POJ3368 Frequent values (RMQ)
- POJ 3368 Frequent values (RMQ)
- POJ 题目3368 ||HDOJ 题目1806 Frequent values(RMQ)
- POJ 3368 Frequent values(RMQ 求区间出现最多次数的数字的次数)
- [POJ 3368]Frequent values(RMQ)
- poj3368 Frequent values(rmq)
- POJ 3368 Frequent values(RMQ)
- 【RMQ问题】poj 3368 Frequent values
- (简单) POJ 3368 Frequent values,RMQ。
- POJ 3368 Frequent Values(RMQ)
- POJ 3368 Frequent values (RMQ)
- POJ - 3368 - Frequent values(RMQ)
- 【POJ】3368-Frequent values(RMQ或线段树)
- poj 3368 Frequent values(RMQ)
- poj 3368 Frequent values (RMQ或线段树)