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 ...
随机推荐
- dojo之dojox/data/CsvStore初始化
dojo之dojox/data/CsvStore初始化 1.var csvStore = new dojox.data.CsvStore({url:"student.csv"}); ...
- hdu5863 cjj's string game
矩阵快速幂 #include<bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; const int MOD = ...
- Visual Studio2010重新安装后,冲突问题
http://www.docin.com/p-685665064.html VS2010重装后出错解决办法 一般在卸载VS2010之后,也重新安装了一遍,有的时候可能会出现如下问题: 1. 未能正确加 ...
- Aspose.Words for .NET
Aspose.Words for .NET Aspose.Words for .NET是 .NET 下先进的 Word 文档处理 API.它支持 DOC, OOXML, RTF, HTML, Open ...
- java 的八大排序
import java.util.Arrays;import java.util.*; public class Sort { /** * 插入排序 */ public static void ins ...
- 十年Java开发程序员回答,自学Java,培训Java的利和弊
最近有一个朋友在群里面问我:是应该去培训Java还是应该自学Java,我想的说的是我并不是想给他一个去培训或者不去培训,我用自己多年对于行业的了解去分析这个问题,然后让他自己去思考,哪种更加适合他.他 ...
- 一次断电后docker问题的排解
这篇文章是一次真实的排查经历,可能对大多数人没什么作用,慎看. 断电后来电,服务器启动,手工启动各个docker,大部分正常,小部分还是出错,错误信息: <html> <head&g ...
- beautifulsoup库使用
介绍与安装 Beautiful Soup 是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据.BeautifulSoup 用来解析 HTML 比较简单, API非常人 ...
- 【BZOJ3262】陌上花开(CDQ分治)
[BZOJ3262]陌上花开(CDQ分治) 题解 原来放过这道题目,题面在这里 树套树的做法也请点上面 这回用CDQ分治做的 其实也很简单, 对于第一维排序之后 显然只有前面的对后面的才会产生贡献 那 ...
- angular中label包含input点击事件的问题
问题:当点击input时,input不能勾选,单label内的其他区域点击均可控制input勾选. 分析:点击input时,$event.target.tagName //INPUT, 点击img ...