Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 14764 | Accepted: 5361 |
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
10 3 -1 -1 1 1 1 1 3 10 10 10 2 3 1 10 5 10 0
Sample Output
1 4 3
这题自己没有做出来,一直TLE,像当年做扩展欧几里德题目似的。看网上代码,才知道RMQ这种算法,总之是要记住了这种有动态规划思想的东西,还有这种询问这么多次的题目要离线处理啊啊啊啊,这都不懂你还搞毛啊光速小子。。。
我自己都不好意思舔这个大脸上这个代码,为了以后自己常常看看,记住它吧。
觉得这个代码写得真的好,很多细节做的真的不错(。。。。。。):
#include <iostream> #include <cmath> #include <algorithm> #pragma warning(disable:4996) using namespace std; int num[100005]; int fre[100005]; int n,q; int max_v[100005][20]; void RMQ() { int i,j; for(i=1;i<=n;i++) { max_v[i][0]=fre[i]; } int temp = log((double)n)/log(2.0)+1; for(j=1;j<=temp;j++) { for(i=1;i+(1<<j)-1<=n;i++) { max_v[i][j]=max(max_v[i][j-1],max_v[i+(1<<(j-1))][j-1]); } } } int cal(int h,int k) { if(h>k) return 0; int temp=k-h+1; int temp2=log((double)temp)/log(2.0); return max(max_v[h][temp2],max_v[k-(1<<temp2)+1][temp2]); } int main() { //freopen("input.txt","r",stdin); //freopen("out.txt","w",stdout); while(scanf("%d",&n)) { int i,h,k; if(n==0) break; scanf("%d",&q); memset(fre,0,sizeof(fre)); memset(max_v,0,sizeof(max_v)); for(i=1;i<=n;i++) { scanf("%d",&num[i]); if(i==1) { fre[1]=1; } else { if(num[i]==num[i-1]) fre[i]=fre[i-1]+1; else fre[i]=1; } } RMQ(); for(i=1;i<=q;i++) { scanf("%d%d",&h,&k); int temp; int t=0; while((h+t<=k)&&(num[h+t]==num[h])) { t++; } temp=h+t; int temp2=cal(temp,k); cout<<max(t,temp2)<<endl; } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。