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的更多相关文章

  1. [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 ...

  2. UVA - 11235 Frequent values

    2007/2008 ACM International Collegiate Programming Contest University of Ulm Local Contest Problem F ...

  3. 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 ...

  4. (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 ...

  5. 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 ...

  6. poj 3368 Frequent values(RMQ)

    /************************************************************ 题目: Frequent values(poj 3368) 链接: http ...

  7. Top K Frequent Elements

    Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...

  8. zoj2132-The Most Frequent Number

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2132 The Most Frequent Number Time Limi ...

  9. 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 ...

  10. H - Frequent values

    Problem F: Frequent values You are given a sequence of n integers a1 , a2 , ... , an in non-decreasi ...

随机推荐

  1. FusionCharts 3D环饼图

    1.设计静态页面 Doughnut.html: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"& ...

  2. 【html5】html5学习笔记2--表单

    html5 新增输入类型 html5新增了 email.number.Date pickers (date, month, week, time, datetime, datetime-local) ...

  3. 三级级联查询省份名称和编码(保证名称不重复)的SQL语句

    三级级联查询省份名称和编码(保证名称不重复)的SQL语句 1.省份.地市和县级数据库表 2.SQL语句 SELECT DISTINCT t.`province_name`,t.`province_co ...

  4. Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContextAware

    1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...

  5. 版本控制工具--svn和git的使用(三) -----git的使用(1)

    安装 git官网就有git各个系统的安装包,可以根据自己系统安装相应的安装包.window的git安装包 依据国内网速原因,将安装放到网盘里,链接: https://pan.baidu.com/s/1 ...

  6. xml的SAX解析规则

    一,为什么要用它 1.1,讲解 DOM解析原理:一次性把xml文档加载进内存,然后在内存中构建Document树. 对内存要求比较要. 缺点: 不适合读取大容量的xml文件,容易导致内存溢出. SAX ...

  7. JAVA简便解析json文件

    JAVA简便解析json文件 首先放上我要解析的json文件: { "resultcode":"200", "reason":"S ...

  8. 【BZOJ2160】拉拉队排练(回文树)

    [BZOJ2160]拉拉队排练(回文树) 题面 BZOJ 题解 看着题目, 直接构建回文树 求出每个回文串的出现次数 直接按照长度\(sort\)一下就行了 然后快速幂算一下答案就出来了 这题貌似可以 ...

  9. 【Luogu1876】开灯(数论)

    [Luogu1876]开灯(数论) 题面 题目描述 首先所有的灯都是关的(注意是关!),编号为1的人走过来,把是一的倍数的灯全部打开,编号为二的的把是二的倍数的灯全部关上,编号为3的人又把是三的倍数的 ...

  10. NOIWC2018游记

    NOIWC2018游记 接着PKUWC就是NOIWC了.感觉时间很紧呀,但越是紧张呢,就越让人心里觉得充实. 能够去NOIWC,应该是一次非常充实的体验吧. 这一篇游记是接着上一篇写的,时间点上完全都 ...