poj 3368 Frequent values(RMQ)
2016-11-30 15:38
453 查看
Frequent values
Description
You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In addition to that, you are given several queries consisting of indices i and j (1
≤ i ≤ j ≤ n). For each query, determine the most frequent value among the integers ai , ... , aj.
Input
The input consists of several test cases. Each test case starts with a line containing two integers n and q (1 ≤ n, q ≤ 100000). The next line contains n integers a1 , ... , an(-100000
≤ ai ≤ 100000, for each i ∈ {1, ..., n}) separated by spaces. You can assume that for each i ∈ {1, ..., n-1}: ai ≤ ai+1. The following q lines contain one query each, consisting of two
integers i and j (1 ≤ i ≤ j ≤ n), which indicate the boundary indices for the
query.
The last test case is followed by a line containing a single 0.
Output
For each query, print one line with one integer: The number of occurrences of the most frequent value within the given range.
Sample Input
Sample Output
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 17812 | Accepted: 6417 |
You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In addition to that, you are given several queries consisting of indices i and j (1
≤ i ≤ j ≤ n). For each query, determine the most frequent value among the integers ai , ... , aj.
Input
The input consists of several test cases. Each test case starts with a line containing two integers n and q (1 ≤ n, q ≤ 100000). The next line contains n integers a1 , ... , an(-100000
≤ ai ≤ 100000, for each i ∈ {1, ..., n}) separated by spaces. You can assume that for each i ∈ {1, ..., n-1}: ai ≤ ai+1. The following q lines contain one query each, consisting of two
integers i and j (1 ≤ i ≤ j ≤ n), which indicate the boundary indices for the
query.
The last test case is followed by a line containing a single 0.
Output
For each query, print one line with one integer: The number of occurrences of the most frequent value within the given range.
Sample Input
10 3 -1 -1 1 1 1 1 3 10 10 10 2 3 1 10 5 10 0
Sample Output
1 4 3
// 细节!!你说因为细节浪费了多少时间!!
题意就是给你一堆连续的数,给你区间,让你查询给定区间的数出现频率最大的频率
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #define maxn 100005 using namespace std; int d[maxn][50]; int left[maxn],right[maxn],val[maxn],cnt[maxn],num[maxn];/*left记录第i段的左端点,right记录第i段的又断点*/ int n,m,len;//val记录第i段的值,num记录第i个数是属于第几段 void RMQ() { int i,j; for( i = 1; i <= len; i++) { d[i][0]=cnt[i]; } for(int j = 1; j != 50; ++j) { for(int i = 1; i <= n; ++i) { if(i + (1 << j) - 1 <= n) { d[i][j] = max(d[i][j-1],d[i + (1<<(j-1)) ][j-1]); } } } } int get_RMQ(int a,int b) { int k = (int)(log(b - a + 1.0) / log(2.0)); //!!括号 int maxsum = max(d[a][k], d[b - (1 << k) + 1][k]); return maxsum; } int main() { int i,j; int a[maxn]; while(~scanf("%d",&n),n) { scanf("%d",&m); memset(cnt,0,sizeof(cnt)); len=1; scanf("%d",&a[1]); val[len]=a[1]; cnt[len]=1; left[1]=1; num[len]=1; for(i=2;i<=n;i++) { scanf("%d",&a[i]); if(a[i] == a[i-1]) { cnt[len]++; num[i]=len; } else { right[len] = i - 1; len++; left[len] = i; val[len] = a[i]; cnt[len]=1; num[i]=len; } } RMQ(); while(m--) { int l,r; int sum=0; scanf("%d%d",&l,&r); if(num[l] == num[r]) printf("%d\n",r-l+1); else { int sum = 0; if(num[r] - num[l] >= 2)//如果存在超过三段的话 就先找中间的 最大的频率 { sum = get_RMQ(num[l]+1,num[r]-1); } sum = max(sum,max( right[ num[l]] - l + 1, r - left[num[r]] + 1 ));//看中间最大的频率与两侧的谁大 printf("%d\n",sum); } } } return 0; }
相关文章推荐
- 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 && hdu 1806 Frequent values(数据结构:RMQ)
- 【POJ 3368】【RMQ 或者 线段树】Frequent values【求出区间内连续出现次数最多的数的次数。】
- POJ 3368 Frequent values(RMQ 求区间出现最多次数的数字的次数)
- 【RMQ|ST】POJ-3368 Frequent values
- POJ 3368 Frequent values (UVA 11235)(RMQ)
- POJ 3368 Frequent values (RMQ)
- poj 3368 Frequent values(一维RMQ)
- poj 3368(RMQ)Frequent values
- HDU 1806 && POJ 3368 Frequent values (RMQ)
- POJ 3368—— Frequent values(频繁出现的数值UVA11235) RMQ
- poj_3368 Frequent values(RMQ)
- POJ 3368 Frequent values(RMQ)
- BIT&&RMQ——Poj 3368 Frequent values
- POJ 3368 Frequent values(rmq)