题意:

思路:

C++

  1. #include<map>
  2. #include<set>
  3. #include<cmath>
  4. #include<cstdio>
  5. #include<vector>
  6. #include<cstring>
  7. #include<cstdlib>
  8. #include<iostream>
  9. #include<algorithm>
  10. #define M 1000000
  11. #define MAXN 210000
  12. using namespace std;
  13.  
  14. int g[MAXN][];
  15. int last[M*];
  16. int a[MAXN],st[MAXN],f[MAXN];
  17.  
  18. int ask(int x,int y)
  19. {
  20. if(x>y) return ;
  21. int len=y-x+; int l=log(len)/log();
  22. return max(g[x][l],g[y-(<<l)+][l]);
  23. }
  24.  
  25. int main()
  26. {
  27. freopen("data.in","r",stdin);
  28. freopen("1.out","w",stdout);
  29. int n,m,x,y;
  30. scanf("%d%d",&n,&m);
  31. for(int i=;i<=n;i++)
  32. {
  33. scanf("%d",&a[i]);
  34. a[i]+=M;
  35. st[i]=max(st[i-],last[a[i]]+);
  36. last[a[i]]=i;
  37. g[i][]=f[i]=i-st[i]+;
  38. }
  39. int l=log(n)/log();
  40. for(int i=;i<=l;i++)
  41. for(int j=;j+(<<(i-))<=n;j++)
  42. g[j][i]=max(g[j][i-],g[j+(<<(i-))][i-]);
  43. for(int i=;i<=m;i++)
  44. {
  45. scanf("%d%d",&x,&y);
  46. x++; y++;
  47. int l=x; int r=y;
  48. int tmp=x;
  49. while(l<=r)
  50. {
  51. int mid=(l+r)/;
  52. if(st[mid]<x) {tmp=mid;l=mid+;}
  53. else r=mid-;
  54. }
  55. int ans=max(tmp-x+,ask(tmp+,y));
  56. printf("%d\n",ans);
  57. }
  58. return ;
  59. }

pascal

  1. const maxn=;
  2. max=;
  3. var n,m,i,x,y,t,j,ans,keypoint,l,r:longint;
  4. a,opt,pre:array[..maxn]of longint;
  5. rmq:array[..maxn,..]of longint;
  6. f:array[-max..max]of longint;
  7. ch:char;
  8. function find(x,y:longint):longint;
  9. var left,right,mid:longint;
  10. begin
  11. left:=x;right:=y;
  12. while left<=right do begin
  13. mid:=(left+right)shr ;
  14. if pre[mid]<=y then left:=mid+
  15. else right:=mid-;
  16. end;
  17. find:=left;
  18. end;
  19. function findmax(x,y:longint):longint;
  20. var i,j:longint;
  21. begin
  22. i:=;j:=;
  23. while *j<=y-x+ do begin
  24. inc(i);
  25. j:=j*;
  26. end;
  27. if rmq[x,i]>rmq[y+-j,i] then findmax:=rmq[x,i]
  28. else findmax:=rmq[y+-j,i];
  29. end;
  30. begin
  31. assign(input,'data.in'); reset(input);
  32. assign(output,'right.out'); rewrite(output);
  33. readln(n,m);
  34. for i:= to n do read(a[i]);
  35. fillchar(f,sizeof(f),);
  36. opt[n]:=;
  37. pre[n]:=n;
  38. f[a[n]]:=n;
  39. for i:=n- downto do begin
  40. opt[i]:=opt[i+]+;
  41. pre[i]:=pre[i+];
  42. if (f[a[i]]>)and(f[a[i]]-i<opt[i]) then begin
  43. opt[i]:=f[a[i]]-i;
  44. pre[i]:=f[a[i]]-;
  45. end;
  46. f[a[i]]:=i;
  47. end;
  48. fillchar(rmq,sizeof(rmq),);
  49. for i:= to n do rmq[i,]:=opt[i];
  50. i:=;t:=;
  51. while t<=n do begin
  52. for j:= to n-t+ do begin
  53. if rmq[j,i-]>rmq[j+( shl (i-)),i-] then rmq[j,i]:=rmq[j,i-]
  54. else rmq[j,i]:=rmq[j+( shl (i-)),i-]
  55. end;
  56. inc(i);
  57. t:=t*;
  58. end;
  59. for i:= to m do begin
  60. readln(l,r);
  61. inc(l);inc(r);
  62. if l>r then begin
  63. j:=l;l:=r;r:=j;
  64. end;
  65. keypoint:=find(l,r);
  66. ans:=;
  67. if keypoint>l then ans:=findmax(l,keypoint-);
  68. if (keypoint<=r)and(r-keypoint+>ans) then begin
  69. ans:=r-keypoint+;
  70. end;
  71. writeln(ans);
  72. end;
  73. close(input);
  74. close(output);
  75. end.

【LibreOJ10121】与众不同(RMQ,二分)的更多相关文章

  1. LOJ #10121 与众不同 (RMQ+二分)

    题目大意 :给你一个整数序列,定义一个合法子串为子串内所有数互不相同,会有很多询问,求区间$[L,R]$内最长连续合法子串长度 一道思维不错的$RMQ$题,NOIP要是考这种题可能会考挂一片 预处理出 ...

  2. *HDU3486 RMQ+二分

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

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

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

  4. hdu 3486 Interviewe (RMQ+二分)

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

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

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

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

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

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

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

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

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

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

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

  10. HDU 5726 GCD (RMQ + 二分)

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

随机推荐

  1. AJPFX的内存管理小结

    管理范围:任何继承于 NSObject的对象原理:每一个对象都有引用计数器当使用alloc new 和 copy创建对象时引用计数器被设置为1给对象发送一条retain消息 ,引用计数器加1     ...

  2. 014、BOM与DOM对象的应用

    Screen屏幕对象 Width:屏幕的宽度 Height:屏幕的高度 availWidth:屏幕的有效宽度(不含任务栏) availHeight:屏幕的有效高度(不含任务栏) colorDepth: ...

  3. 多路复用IO和异步IO

    多路复用I/O 它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程. 流程图如下: 当用户进程调用了sel ...

  4. 必看的dockerfile禁忌与建议!

    直接上对照组(看第三个run) test1 FROM centos MAINTAINER ** ​ RUN yum -y update RUN yum -y install wget ​ RUN wg ...

  5. Python调用Java代码部署及初步使用

    Python调用Java代码部署: jpype下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype 下载的时候需要使用Chrome浏览器进行下载 ...

  6. nodejs,python,sublime和Eclipse的包管理器

    Python的包管理器叫pip. 首先安装Python运行环境Python 3.7.0:https://www.python.org/downloads/release/python-370/ Pyt ...

  7. 闲着蛋疼没事干,写个Mac端的Kcptun Client管理器

    原理: 执行一行脚本 输入服务器地址,端口,密码等做了图形化编辑 可以控制Kcptun是否正在运行 App已上传github https://github.com/nicky2k8/KcptunCli ...

  8. Python3简明教程(五)—— 流程控制之循环

    有些时候我们需要多次执行相同的任务,我们使用一个计数器来检查代码需要执行的次数.这个技术被称为循环. while循环 while语句的语法如下: while condition: statement1 ...

  9. chart 图片组件 生成后不能动态更新,需要销毁dom,从新载入 用 v-if 和 this.$nextTick(() => {

    <chart-box v-if="cbData1Bool" cb-text="基本概况" chartBoxSele="饼状图" :cb ...

  10. 关于sigleton模式

    单例模式的要点有三个:一是某个类只能有一个实例:二是它必须自行创建这个实例:三是它必须自行向整个系统提供这个实例. 从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中 ...