题目大意 :给你一个整数序列,定义一个合法子串为子串内所有数互不相同,会有很多询问,求区间$[L,R]$内最长连续合法子串长度

一道思维不错的$RMQ$题,NOIP要是考这种题可能会考挂一片

预处理出$f_{i}$数组表示以i结尾的最长子串的起始位置,需要一个辅助$last$数组,表示某个数上一次出现的位置

那么$f_{i}=max(f_{i-1},last[a_{i}]+1)$

再$RMQ$预处理出区间内任意一个点结尾的最长子串长度

对于一个询问$[L,R]$,并不能直接用$RMQ$求出答案,因为有一些在$[L,R]$结尾的最长子串的起始位置可能超出$L$

然后发现$f_{i}$数组是递增的,所以对于一个询问,二分出一个位置,这个位置结尾的最长子串的左端点,是最后一个左端点超出$L$的位置

显然,答案要么是二分出的位置$k$到$L$的距离,或者是在$k+1$到$R$之间结尾的最长子串长度

时间$O(nlogn+mlogn)$

  1. #include <vector>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #define N 200010
  6. #define M 2001000
  7. #define maxn 1000000
  8. #define inf 0x3f3f3f3f
  9. using namespace std;
  10.  
  11. int n,m;
  12. int gint()
  13. {
  14. int ret=,fh=;char c=getchar();
  15. while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
  16. while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
  17. return ret*fh;
  18. }
  19.  
  20. int a[N],ma[N][],la[M],f[N],lg[N];
  21. int query(int x,int y){
  22. if(x>y) return ;
  23. int len=y-x+;
  24. return max(ma[x][lg[len]],ma[y-(<<lg[len])+][lg[len]]);
  25. }
  26.  
  27. int main()
  28. {
  29. scanf("%d%d",&n,&m);
  30. for(int i=;i<=n;i++)
  31. scanf("%d",&a[i]);
  32. lg[]=;
  33. for(int i=;i<=n;i++)
  34. lg[i]=lg[i>>]+;
  35. for(int i=;i<=n;i++)
  36. if(!la[a[i]+maxn]){
  37. f[i]=max(f[i-],);
  38. la[a[i]+maxn]=i;
  39. }else{
  40. f[i]=max(f[i-],la[a[i]+maxn]+);
  41. la[a[i]+maxn]=i;
  42. }
  43. for(int i=;i<=n;i++) ma[i][]=i-f[i]+;
  44. for(int j=;j<=lg[n];j++)
  45. for(int i=;i+(<<j)-<=n;i++)
  46. ma[i][j]=max(ma[i][j-],ma[i+(<<(j-))][j-]);
  47. int x,y;
  48. for(int i=;i<=m;i++)
  49. {
  50. scanf("%d%d",&x,&y);
  51. x++,y++;
  52. int l=x,r=y,ans=x;
  53. while(l<=r){
  54. int mid=(l+r)>>;
  55. if(f[mid]<x) ans=mid,l=mid+;
  56. else r=mid-;
  57. }
  58. printf("%d\n",max(ans-x+,query(ans+,y)));
  59. }
  60. return ;
  61. }

LOJ #10121 与众不同 (RMQ+二分)的更多相关文章

  1. *HDU3486 RMQ+二分

    Interviewe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  2. hdu 5289 Assignment(2015多校第一场第2题)RMQ+二分(或者multiset模拟过程)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5289 题意:给你n个数和k,求有多少的区间使得区间内部任意两个数的差值小于k,输出符合要求的区间个数 ...

  3. hdu 3486 Interviewe (RMQ+二分)

    Interviewe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  4. 【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825389.html 题目描述 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一 ...

  5. HDU 5089 Assignment(rmq+二分 或 单调队列)

    Assignment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  6. 玲珑杯 Round 19 B Buildings (RMQ + 二分)

    DESCRIPTION There are nn buildings lined up, and the height of the ii-th house is hihi. An inteval [ ...

  7. codeforces 487B B. Strip(RMQ+二分+dp)

    题目链接: B. Strip time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  8. CodeForces 689D Friends and Subsequences (RMQ+二分)

    Friends and Subsequences 题目链接: http://acm.hust.edu.cn/vjudge/contest/121333#problem/H Description Mi ...

  9. HDU 5726 GCD (RMQ + 二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5726 给你n个数,q个询问,每个询问问你有多少对l r的gcd(a[l] , ... , a[r]) ...

随机推荐

  1. kernel zram feature

    what is zram? Zram wiki zram zram(也称为 zRAM,先前称为 compcache)是 Linux 内核的一项功能,可提供虚拟内存压缩.zram 通过在 RAM 内的压 ...

  2. git diff patch方法

    UNIX世界的软件开发大多都是协作式的,因此,Patch(补丁)是一个相当重要的东西,因为几乎所有的大型UNIX项目的普通贡献者,都是通过 Patch来提交代码的.作为最重要的开源项目之一,Linux ...

  3. [读书笔记] R语言实战 (十四) 主成分和因子分析

    主成分分析和探索性因子分析是用来探索和简化多变量复杂关系的常用方法,能解决信息过度复杂的多变量数据问题. 主成分分析PCA:一种数据降维技巧,将大量相关变量转化为一组很少的不相关变量,这些无关变量称为 ...

  4. python dns 服务器

    import socketserver import struct import threading # DNS Query class SinDNSQuery: def __init__(self, ...

  5. 变量命名规范及str类型

    变量命名规范: 1.单词之间用_分开 add_num() 2.全局变量,大写 PI,NUMBER() 3.实例变量,以_开头 _example() 4.私有实例变量 __private() 5.普通函 ...

  6. https的基本原理,看完你的程序员女朋友再也不和你提分手了

    [http风险] 首先,我们来讲一下平时上网的时候,存在的风险. 初步接触过网络的同学都知道,网络上是很不安全的,尤其是各种公共场合的免费WIFI,以及手机上各种免费上网的万能钥匙.这些不安全因素会导 ...

  7. ZJU 2605 Under Control

    Under Control Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on ZJU. Original ...

  8. WinServer-授权规则

    授权规则: 使用谓词可以限制网站只能使用某一种请求 来自为知笔记(Wiz)

  9. 洛谷—— P3225 [HNOI2012]矿场搭建

    https://www.luogu.org/problem/show?pid=3225 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有 ...

  10. oracle 11g sql developer安装后无法使用

    oracle11g安装后出现   再去官网单独下来个sql developer安装 sql developer须要jre支持