Frequent Value
Frequent Value poj-3368
题目大意:给你n个数的数列,保证它是单调递增的。给你m个询问,每个询问是询问两个节点之间最长的连续的相等的数的长度。
注释:n,m<=100000。
想法:这道题是我做的第一道有点儿意思的RMQ(RMQ?猛戳)的题。刚学RMQ,就把这道题更出来了。我们仍然采用ST算法。我们思考,f[i][j]表示从a[i]开始的$2^j$数中,最长的相等的长度,那么我们思考,这东西如何更新。首先,我们想到,可以有它的中点分成的两个区间分别更新,这样的更新答案显然是对的,但是一定是最大的吗?一定不是的,我们很自然的想起一道题——小白逛公园,一道挺好玩儿的题。这道题同理,我们有这样的更新答案的方式,就是那个最长的区间包括了中间的两个端点,这样的话,我们就可以更新答案。在记录时,我们需要用到两个数组。分别是l[i]和r[i],分别表示从a[i]开始的向左的最后一个和a[i]相等的数,r[]同理。那么,我们就可以通过这两个数组更新答案。这时,我们需要注意两个事情。
1.一方面,我们发现,如果l数组小于i这是不合理的,我们需要对它取一个max。右边的r[]同理。
2.另一方面,我们有一个必要条件:中间的两个数必须相等,必须相等,必须相等!!!虽然poj的数据并没有针对性的卡掉这个点,但是这是不对的!!
最后,我们说一下查询,查询时我们依然需要注意中间点的覆盖,和预处理时同理,在此不细谈了。
最后,附上丑陋的代码......
#include <iostream>
#include <cstdio>
#include <cstring>
#define N 100010
using namespace std;
int l[N],r[N],a[N],log[N],f[N][];
int main()
{
int ll,rr,lmax,rmin;
int n,m;
int ans;
int x,y;
int len;
for(int i=;i<=N;i++) log[i]=log[i>>]+;//这东西可以在外面预处理
while()
{
scanf("%d",&n);
if(n==) return ;
scanf("%d",&m);
memset(f,,sizeof(f));
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
// for(int i=2;i<=n;i++) log[i]=log[i>>1]+1;
l[]=;//这是开始处理l和r数组
for(int i=;i<=n;i++)
{
if(a[i]==a[i-]) l[i]=l[i-];
else l[i]=i;
}
r[n]=n;
for(int i=n-;i>=;i--)
{
if(a[i]==a[i+]) r[i]=r[i+];
else r[i]=i;
}
for(int i=;i<=n;i++) f[i][]=;
for(int i=;(<<i)<=n;i++)
{
for(int j=;j+(<<i)-<=n;j++)
{
f[j][i]=max(f[j][i-],f[j+(<<(i-))][i-]);
if(a[j+(<<(i-))]!=a[j+(<<(i-))-]) continue;//很重要很重要很重要
lmax=max(j,l[j+(<<(i-))-]);
rmin=min(j+(<<i)-,r[j+(<<(i-))]);
f[j][i]=max(f[j][i],rmin-lmax+);
}
}
/*for(int i=1;i<=n;i++)
{
for(int j=1;j<=4;j++)
{
cout<<"f["<<i<<"]["<<(1<<j)<<"]="<<f[i][j]<<endl;
}
}*/
for(int i=;i<=m;i++)
{
ans=;
scanf("%d%d",&x,&y);
len=log[y-x+];
ans=max(f[x][len],f[y-(<<len)+][len]);
// cout<<" "<<a[x+(1<<len)-1]<<" "<<a[y-(1<<len)+1]<<endl;
if(a[x+(<<len)-]==a[y-(<<len)+])//同样的重要
{
rr=min(r[y-(<<len)+],y);
ll=max(l[x+(<<len)-],x);
ans=max(ans,rr-ll+);
}
printf("%d\n",ans);
}
}
}
小结:RMQ中的ST算法是一个很好的思想,也是我第一次接触到倍增的问题,说一下容易错误的点。
错误:1.在预处理时,那个 i 和 j 比较容易搞混,别问我是怎么知道的......
2.对于端点的处理一定要细心,这个和平常的ST不太一样,对于端点的拿捏也是比较的注重的。
3.在最后加上多组数据后,return 0一定要写到外面
4.这道题的退出条件很有意思,我们发现,n和m一定要分开读,不然是没有办法退出的。因为那个特判是下一条语句,对于一个没有完成的读入是没有意义的。
Frequent Value的更多相关文章
- [LeetCode] Top K Frequent Elements 前K个高频元素
Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...
- UVA - 11235 Frequent values
2007/2008 ACM International Collegiate Programming Contest University of Ulm Local Contest Problem F ...
- LeetCode 【347. Top K Frequent Elements】
Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...
- (Collection)347. Top K Frequent Elements
Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...
- Leetcode 347. Top K Frequent Elements
Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...
- poj 3368 Frequent values(RMQ)
/************************************************************ 题目: Frequent values(poj 3368) 链接: http ...
- Top K Frequent Elements
Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...
- zoj2132-The Most Frequent Number
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2132 The Most Frequent Number Time Limi ...
- 347. Top K Frequent Elements
Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...
- H - Frequent values
Problem F: Frequent values You are given a sequence of n integers a1 , a2 , ... , an in non-decreasi ...
随机推荐
- tar、scp、sftp、rsync简单使用
tar -c 创建一个归档文件 -z 指定压缩格式为gzip -v 显示详细信息 -f 制定文件明 -j 指定压缩格式为bz2 -J 指定压缩格式为 xz -C 压缩.解压至某个目录 -x 自动识别压 ...
- 关于json.parse和json.stringify的区别
json.parse是将字符串解析成json格式 而json.stringify是将json解析成字符串格式
- vue cli创建的项目 当你后期使用了ES6语法,如何解决浏览器兼容问题
最近开发了一个项目,开发过程中,由于需要使用了async await ,于是发现,只有少数的浏览器支持,极大多数的浏览器是不支持这玩意的,在网上各种找解决方案,基本都是失败,最后总结了两个方案之后,尝 ...
- 吐血整理:人工智能PDF中文教材资源包2.73G基本包含全部学习资料-人工智能学习书单
吐血整理:人工智能PDF中文教材资源包2.73G基本包含全部学习资料 人工智能学习书单(关注微信公众号:aibbtcom获取更多资源) 文末附百度网盘下载地址 人工神经网络与盲信号处理 人工神经网络与 ...
- 简述Spring事务有几种管理方法,写出一种配置方式
Spring事务有两种方式: 1.编程式事务:(代码中嵌入) 2.声明式事务:(注解,XML) 注解方式配置事务的方式如下: 首先,需要在applicationContext.xml中添加启动配置,代 ...
- [HEOI2016]游戏
二分图匹配(网络流实现) # include <bits/stdc++.h> # define IL inline # define RG register # define Fill(a ...
- [BZOJ1430] 小猴打架 (prufer编码)
Description 一开始森林里面有N只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友.每次打完架后,打架的双方以及它们的好朋友就会互相认识,成为好朋友.经过N-1次打架之后,整个森 ...
- Mac下redis的安装 以及配置支持PHP使用redis
1 下载最新redis https://redis.io/download 2 安装redis. 这部分在上面下载链接中 官网提供的有相关操作 如下: $ wget http://download ...
- 将PPT文件内容转换为图片放在Email邮件正文中发送
通过Email推送统计报告.一般除了要求将PPT报告文件作为附件发给用户,同时希望将报告内容在邮件中直观展示. 一份统计报告中经常包含柱状图.饼图.好看的图表,这些信息要直接在Email中展示比较复杂 ...
- Dapper一个和petapoco差不多的轻量级ORM框架
我们都知道ORM全称叫做Object Relationship Mapper,也就是可以用object来map我们的db,而且市面上的orm框架有很多,其中有一个框架 叫做dapper,而且被称为th ...