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. stm32开发之串口的调试

    总的函数如下 void USART1Configuration(void){    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Peri ...

  2. Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field

    1 错误描述 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.s ...

  3. java.lang.NoClassDefFoundError: org/apache/jsp/jsp/Container_jsp

    1.错误描述 八月 20, 2014 7:10:18 下午 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.servi ...

  4. Openstack_O版(otaka)部署_Nova部署

    控制节点配置 1. 建库建用户 CREATE DATABASE nova_api; CREATE DATABASE nova; GRANT ALL PRIVILEGES ON nova_api.* T ...

  5. Codeforces Round #430 (Div. 2) D. Vitya and Strange Lesson

    因为抑或,一眼字典树 但是处理起来比较难 #include<iostream> #include<map> #include<iostream> #include& ...

  6. Linux下检测内存泄露的工具 valgrind

    参考:http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html 几乎是照抄参考过来的,只不过后面自己调试一下代码. 这里主要介绍Va ...

  7. 石子归并 51Nod - 1021

    N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价.计算将N堆石子合并成一堆的最小代价.   例如: 1 2 3 4,有 ...

  8. jquery初始化的三种方式

    第一种 $(document).ready(function(){ alert("第一种方法."); }); 第二种 $(function(){ alert("第二种方法 ...

  9. Python 学习笔记(二)开发环境的搭建

    安装Python windows 下安装: 下载地址:https://www.python.org/downloads Python的版本 3.x 是趋势 2.x 还在被大量使用 至于使用2.x 还是 ...

  10. 关于ThinkCMF自带插件上传不了图片的解决方法

    第一个原因:第一次安装的时候提示file_upload未打开,所以当上传的时候回上传失败 解决方法:在php.ini里打开file_uploads = On 第二个原因:一开始还可以上传,但是当删除了 ...