UVA 11235 频繁出现的数值 RMQ
题目链接:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2176
RMQ,就是范围最小值的缩写,这个算法是Tarjan 的 Sparse-Table 算法,复杂度为O(n*log(n)).
就是用数组d[i][j]表示范围[i,i+2^j-1]中的最小值。
然后有递推式
d[i][j] = min(d[i][j-1],d[i+2^(j-1)][j-1]).
有边界条件d[i][0] = A[i].
然后就能求出所有的d[i][j].查询时只需找出2^(k+1) <= R-L+1的最大的k值,取等号时,k要+1.
答案为min(d[L][k],d[R-(1<<k)+1][k]).这两个区间有重叠,木有关系的,不是吗?
本题用Sparse-Table算法,改成求最大值即可。具体解法采用游程编码。
如输入的数组为-1,-1,1,1,1,1,3,10,10,10.则能得到(-1,2),(1,4),(3,1),(10,3),(a,b)表示值为a的数有b个。
然后将数组分为4块,编号分别为1,2,3,4.用辅助数组num[i],left[i],right[i]记录位置i所在的块的编号,以及块的左端点和右端点位置。
数组 -1,-1,1,1,1,1,3,10,10,10.
num 1, 1,2,2,2,2,3,4, 4, 4.
left 1 , 1,3,3,3,3,7,8, 8, 8.
right 2, 2,6, 6,6,6,7,10,10,10
然后答案为max(right(L)-L+1 , R - left[R]+1, max (num[L]+ 1, num[R] - 1));
特判当L和R在同一段时答案是R-L+1.
当num[L]+1 > num[R]-1时,最大值为负无穷。
贴代码:
#include<cstdio>
#include<algorithm>
using namespace std;
const int N =;
int c;
//元素从1编到n
int d[N][],n,cnt[N],num[N],left[N],right[N];
void RMQ_init()
{
for(int i=; i<=c; ++i) d[i][] = cnt[i];
for(int j=; (<<j) <= c; ++j)
for(int i=; i+j-<=c; ++i)
d[i][j] = max(d[i][j-],d[i+(<<(j-))][j-]);
}
int RMQ(int L,int R)
{
if(L>R) return ;
int k=;
while((<<(k+)) <= R-L+) ++k;
return max(d[L][k],d[R-(<<k)+][k]);
}
int main()
{
// freopen("in.txt","r",stdin);
int n,Q,a;
while(scanf("%d",&n),n)
{
for(int i=; i<=n; ++i) cnt[i]=;
scanf("%d%d",&Q,&a);
int p = a;
c=,cnt[c] = ,num[] = c;
for(int i=; i<=n; ++i)
{
scanf("%d",&a);
if(a != p)
{
p = a;
++c;
}
++cnt[c];
num[i] = c;
}
int s =;
for(int i=; i<=c; ++i)
{
for(int j=; j<=cnt[i]; ++j)
left[s+j] = s+,right[s+j] = s+cnt[i];
s += cnt[i];
}
RMQ_init();
while(Q--)
{
int l,r;
scanf("%d%d",&l,&r);
if(num[l] == num[r])
{
printf("%d\n",r-l+);
continue;
}
int ans=right[l]-l+;
if(r-left[r]+ > ans) ans = r-left[r]+;
int d = RMQ(num[l]+,num[r]-);
if(d > ans) ans =d;
printf("%d\n",ans);
}
}
return ;
}
UVA 11235 频繁出现的数值 RMQ的更多相关文章
- UVa 11235 频繁出现的数值
https://vjudge.net/problem/UVA-11235 题意: 给出一个非降序排列的整数数组a1,a2,...,an,你的任务是对于一系列询问(i,j),回答ai,ai+1,...a ...
- UVA 11235 Frequent values 线段树/RMQ
vjudge 上题目链接:UVA 11235 *******************************************************大白书上解释**************** ...
- RMQ算法 以及UVA 11235 Frequent Values(RMQ)
RMQ算法 简单来说,RMQ算法是给定一组数据,求取区间[l,r]内的最大或最小值. 例如一组任意数据 5 6 8 1 3 11 45 78 59 66 4,求取区间(1,8) 内的最大值.数据量小 ...
- UVA 11235 (游程编码+ST算法)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23846 题目大意:给定一个升序序列,有q次询问,每次询问(L,R) ...
- UVA 11235 (RMQ) 频繁出现的数值
题目大意是给出一个非降序排列的数组,然后n个询问,每次询问一个区间内出现次数最多的数的次数. 首先要弄清楚题目的是一个非降序的数组,那么说明相等的数都会在一起,类似于11223334569这样的,那么 ...
- UVA 11235 Frequent values(RMQ)
Frequent values TimeLimit:3000Ms , ... , an in non-decreasing order. In addition to that, you are gi ...
- Uva 11235 RMQ问题
RMQ: 有一个不变的数组,不停的求一个区间的最小值. 使用倍增的思想优化到logN; d(i,j) 表示从 i 开始的,长度为2j的一段元素中的最小值. 那么状态转移方程: d(i,j) = min ...
- UVa 11235 RMQ
首先讲一下RMQ算法的意思. RMQ(Range Minimum Query,RMQ)范围最小值,给出一个n个元素的数组,计算min(A[L],A[L+1],...,A[R-1],A[R]): 这里运 ...
- UVA 11235 Frequent Values ---RMQ
大白书上的例题,具体讲解见大白书,最好用用一个Log数组直接求k,这样就是纯O(1)了 #include <iostream> #include <cstdio> #inclu ...
随机推荐
- Zookeeper第一课 安装和配置
简介: Zookeeper,是Google的Chubby一个开源的实现,是Hadoop的分布式协调服务,它包含一个简单的原语集,来实现同步.配置维护.分集群.命名的服务. zookeeper是一个由多 ...
- flex 4.6 移动开发 app.xml配置说明
<?xml version="1.0" encoding="utf-8" standalone="no"?> <appli ...
- iOS - CocoaPods 第三方开源框架管理
1.CocoaPods CocoaPods 是一个负责管理 iOS 项目中第三方开源库的工具.CocoaPods 的项目源码在 Github 上管理.该项目开始于 2011 年 8 月 12 日,在这 ...
- spring data实现自定义的repository实现类,实现跟jpa联通
如果你不想暴露那么多的方法,可以自己订制自己的Repository,还可以在自己的Repository里面添加自己使用的公共方法 当然更灵活的是自己写一个实现类,来实现自己需要的方法 1:写一个与接口 ...
- 位域 unsigned int a : 4;
位域 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数 ...
- ubuntu忘记密码怎么办
刚安装了,ubuntu14.04,就想着,如果忘记登录密码,这可不好办,所以测试下开机,刚过bios显示画面,不停的点击,,键盘左边的shift键.(因为刚开始是采用按着不放的办法,结果不灵.所以我不 ...
- Linux系统资源监控命令
转自http://www.51testing.com/html/16/271416-149128.html 衡量CPU性能的指标: 1,用户使用CPU的情况:CPU运行常规用户进程CPU运行niced ...
- zoj 1789 The Suspects
好高兴,又AC一道 ,不过是很类似的两道..还是好高兴呀思想跟2833是一样的,不过要重新设计输入和输出.老师上课又重新讲解了一下,因为嫌疑人已知是0,所以加入集中时应该默认让数值小的做树根,即最终让 ...
- 51nod 1264 线段相交(几何)
题目链接:51nod 1264 线段相交 如果两条线段相交,则需满足一条线段的一个端点在另一条线段上,或者 两条线段都分别跨越另一条线段延伸的直线上.(如果点p1位于直线p3p4的一边,而点p2位于该 ...
- ios基础篇(十二)——UINavgationController的使用(三)ToolBar
UIToolBar存在于UINavigationController导航栏控制器中,而且默认被隐藏:设置UINavigationController的toolbarHidden属性可显示UIToolB ...