UVA 11235 Frequent values

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5
 6 const int maxn=100005;
 7
 8 int count[maxn];
 9 int num[maxn],ll[maxn],rr[maxn];
10 int tot;
11 int d[maxn][50];
12
13 int rmq (int l,int r){
14     int k=0;
15     while ( (1<<(k+1)) <= r-l+1 ) k++;
16     return max(d[l][k],d[r-(1<<k)+1][k]);
17 }
18
19 int main (){
20     int n,q;
21     while (cin>>n&&n){
22         cin>>q;
23         tot=0;
24         memset (count,0,sizeof count);
25         int temp=99999999;
26         ll[tot]=0;
27         for (int i=1;i<=n;i++){
28             int x;
29             cin>>x;
30             if (x!=temp){
31                 temp=x;
32                 rr[tot]=i-1;
33                 tot++;
34                 ll[tot]=i;
35             }
36             count[tot]++;
37             num[i]=tot;
38         }
39         rr[tot]=n;
40         for (int i=1;i<=tot;i++) d[i][0]=count[i];//cout<<count[i]<<" ";cout<<endl;
41         for (int j=1;(1<<j)<=tot;j++){
42             for (int i=1;i+(1<<(j-1))<=tot;i++){
43                 d[i][j]=max (d[i][j-1],d[i+(1<<(j-1))][j-1]);
44             }
45         }
46         while (q--){
47             int l,r;
48             cin>>l>>r;
49             int ans=0;
50             if (num[l]==num[r]){
51                 cout<<r-l+1<<endl;
52                 continue ;
53             }
54             //if (rr[num[l]]<=r)
55                 ans=max (ans,rr[num[l]]-l+1);
56             //if (ll[num[r]]>=l)
57                 ans=max (ans,r-ll[num[r]]+1);//cout<<num[l]+1<<" "<<num[r]-1<<"err"<<endl;
58             if (num[l]+1<=num[r]-1)
59                 ans=max (ans,rmq (num[l]+1,num[r]-1));//cout<<rmq (num[l]+1,num[r]-1)<<"aaa"<<endl;
60             cout<<ans<<endl;
61         }
62     }
63     return 0;
64 }

UVA 11235 Frequent values,布布扣,bubuko.com

时间: 2024-12-29 06:49:26

UVA 11235 Frequent values的相关文章

uva 11235 - Frequent values(RMQ)

题目链接:uva 11235 - Frequent values 题目大意:给定一个非降序的整数数组,要求计算对于一些询问(i,j),回答ai,ai+1,-,aj中出现最多的数出现的次数. 解题思路:因为序列为非降序的,所以相同的数字肯定是靠在一起的,所以用o(n)的方法处理处每段相同数字的区间.然后对于每次询问: num[i]=num[j]:j?i+1 numi≠numj:max(RMQ(righti+1,reftj?1),max(righti?i+1,j?leftj+1)) #include

UVA 11235 Frequent values(RMQ)

Frequent values TimeLimit:3000Ms 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 f

UVA 11235 Frequent values 线段树/RMQ

vjudge 上题目链接:UVA 11235 *******************************************************大白书上解释************************************************************ 题目大意:给出一个非降序排列的整数数组 a1,a2,a3,...,an,你的任务是对于一系列询问 (i, j),回答 ai,ai+1,...,aj 中出现次数最多的值所出现的次数. 输入格式:包含多组数据.每组

(线段树区间合并)UVA 11235 - Frequent values

题意: 一个数列,多次查询L到R最多连续相同数字的数量. 分析: 显然区间合并.不过还就没写了,都有点忘了. 不过回忆一下,push_down还是写对了. 不过WA了,后来仔细想一想,光查询光用已经维护的答案还不够,还需要在query的时候再合并一下,才能更新出正确的答案. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #

UVA - 11235 —— Frequent values 【RMQ】

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23846 题解: 1. 游程编码(将序列转化为(value, num)的一段一段的键值对形式)后,将问题转化为几乎是一个RMQ问题,仅有一些细节要单独考虑 2. 如果查询的两个下标l, r属于同一段键值对,那么答案就是(r - l + 1):否则,答案是三个(或两个)值的最大值,详情见代码: #include <iostream> #include <cstdio&g

UVa 11235 Frequent values (RMQ &amp;&amp; 区间出现最多次的数的次数)

题意 : 给出一个长度为 n 的不降序序列,并且给出 q 个形如(L, R)的问询,问你这个区间出现的最多次的数的次数. 分析 : 很自然的想到将区间"缩小",例如1 1 2 3 3 3就可以变成2 1 3,构造出"数量数组",这个数组实际上就是已经将原来区间分了块,但是问询的区间不可能就是这些"数量数组"构成的"块",不过先来想想问询的区间可不可能包含这里面的某些"块"?很显然是有可能的,那么从这些&qu

uva 11235 Frequent values(游程编码+区间最小值查询)

游程编码的基本原理是:用一个符号值或串长代替具有相同值的连续符号(连续符号构成了一段连续的"行程".游程编码因此而得名),使符号长度少于原始数据的长度.只在各行或者各列数据的代码发生变化时,一次记录该代码及相同代码重复的个数,从而实现数据的压缩. 游程编码(Run Length Encoding , RLE) 例如:5555557777733322221111111 游程编码为:(5,6)(7,5)(3,3)(2,4)(1,7) 解题思路很好: 用value[i] count[i] 分

【暑假】[实用数据结构]UVa11235 Frequent values

UVa 11235 Frequent values Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11241   Accepted: 4110 Description You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In addition to that, you are given several qu

POJ 3368:Frequent values RMQ

Frequent values 题目链接: http://poj.org/problem?id=3368 题意: 给出一个非递减序列,求区间内最多的数字的数量 题解: 水题,dp[i][j]记录从 i 开始2^j个数中的出现最多的数,合并dp[i][j]和dp[i+(1<<j)][j]得到dp[i][1<<(j+1)]的时候,由于序列是连续的,只要多考虑一个i+(1<<j)-1(即dp[i][j]所能到达的最右端)上得数字在区间内出现的次数就好了. 代码 #includ