【LibreOJ10121】与众不同(RMQ,二分)
题意:
思路:
C++
- #include<map>
- #include<set>
- #include<cmath>
- #include<cstdio>
- #include<vector>
- #include<cstring>
- #include<cstdlib>
- #include<iostream>
- #include<algorithm>
- #define M 1000000
- #define MAXN 210000
- using namespace std;
- int g[MAXN][];
- int last[M*];
- int a[MAXN],st[MAXN],f[MAXN];
- int ask(int x,int y)
- {
- if(x>y) return ;
- int len=y-x+; int l=log(len)/log();
- return max(g[x][l],g[y-(<<l)+][l]);
- }
- int main()
- {
- freopen("data.in","r",stdin);
- freopen("1.out","w",stdout);
- int n,m,x,y;
- scanf("%d%d",&n,&m);
- for(int i=;i<=n;i++)
- {
- scanf("%d",&a[i]);
- a[i]+=M;
- st[i]=max(st[i-],last[a[i]]+);
- last[a[i]]=i;
- g[i][]=f[i]=i-st[i]+;
- }
- int l=log(n)/log();
- for(int i=;i<=l;i++)
- for(int j=;j+(<<(i-))<=n;j++)
- g[j][i]=max(g[j][i-],g[j+(<<(i-))][i-]);
- for(int i=;i<=m;i++)
- {
- scanf("%d%d",&x,&y);
- x++; y++;
- int l=x; int r=y;
- int tmp=x;
- while(l<=r)
- {
- int mid=(l+r)/;
- if(st[mid]<x) {tmp=mid;l=mid+;}
- else r=mid-;
- }
- int ans=max(tmp-x+,ask(tmp+,y));
- printf("%d\n",ans);
- }
- return ;
- }
pascal
- const maxn=;
- max=;
- var n,m,i,x,y,t,j,ans,keypoint,l,r:longint;
- a,opt,pre:array[..maxn]of longint;
- rmq:array[..maxn,..]of longint;
- f:array[-max..max]of longint;
- ch:char;
- function find(x,y:longint):longint;
- var left,right,mid:longint;
- begin
- left:=x;right:=y;
- while left<=right do begin
- mid:=(left+right)shr ;
- if pre[mid]<=y then left:=mid+
- else right:=mid-;
- end;
- find:=left;
- end;
- function findmax(x,y:longint):longint;
- var i,j:longint;
- begin
- i:=;j:=;
- while *j<=y-x+ do begin
- inc(i);
- j:=j*;
- end;
- if rmq[x,i]>rmq[y+-j,i] then findmax:=rmq[x,i]
- else findmax:=rmq[y+-j,i];
- end;
- begin
- assign(input,'data.in'); reset(input);
- assign(output,'right.out'); rewrite(output);
- readln(n,m);
- for i:= to n do read(a[i]);
- fillchar(f,sizeof(f),);
- opt[n]:=;
- pre[n]:=n;
- f[a[n]]:=n;
- for i:=n- downto do begin
- opt[i]:=opt[i+]+;
- pre[i]:=pre[i+];
- if (f[a[i]]>)and(f[a[i]]-i<opt[i]) then begin
- opt[i]:=f[a[i]]-i;
- pre[i]:=f[a[i]]-;
- end;
- f[a[i]]:=i;
- end;
- fillchar(rmq,sizeof(rmq),);
- for i:= to n do rmq[i,]:=opt[i];
- i:=;t:=;
- while t<=n do begin
- for j:= to n-t+ do begin
- if rmq[j,i-]>rmq[j+( shl (i-)),i-] then rmq[j,i]:=rmq[j,i-]
- else rmq[j,i]:=rmq[j+( shl (i-)),i-]
- end;
- inc(i);
- t:=t*;
- end;
- for i:= to m do begin
- readln(l,r);
- inc(l);inc(r);
- if l>r then begin
- j:=l;l:=r;r:=j;
- end;
- keypoint:=find(l,r);
- ans:=;
- if keypoint>l then ans:=findmax(l,keypoint-);
- if (keypoint<=r)and(r-keypoint+>ans) then begin
- ans:=r-keypoint+;
- end;
- writeln(ans);
- end;
- close(input);
- close(output);
- end.
【LibreOJ10121】与众不同(RMQ,二分)的更多相关文章
- LOJ #10121 与众不同 (RMQ+二分)
题目大意 :给你一个整数序列,定义一个合法子串为子串内所有数互不相同,会有很多询问,求区间$[L,R]$内最长连续合法子串长度 一道思维不错的$RMQ$题,NOIP要是考这种题可能会考挂一片 预处理出 ...
- *HDU3486 RMQ+二分
Interviewe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- hdu 5289 Assignment(2015多校第一场第2题)RMQ+二分(或者multiset模拟过程)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5289 题意:给你n个数和k,求有多少的区间使得区间内部任意两个数的差值小于k,输出符合要求的区间个数 ...
- hdu 3486 Interviewe (RMQ+二分)
Interviewe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- 【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分
原文地址:http://www.cnblogs.com/GXZlegend/p/6825389.html 题目描述 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一 ...
- HDU 5089 Assignment(rmq+二分 或 单调队列)
Assignment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- 玲珑杯 Round 19 B Buildings (RMQ + 二分)
DESCRIPTION There are nn buildings lined up, and the height of the ii-th house is hihi. An inteval [ ...
- codeforces 487B B. Strip(RMQ+二分+dp)
题目链接: B. Strip time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- CodeForces 689D Friends and Subsequences (RMQ+二分)
Friends and Subsequences 题目链接: http://acm.hust.edu.cn/vjudge/contest/121333#problem/H Description Mi ...
- HDU 5726 GCD (RMQ + 二分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5726 给你n个数,q个询问,每个询问问你有多少对l r的gcd(a[l] , ... , a[r]) ...
随机推荐
- AJPFX的内存管理小结
管理范围:任何继承于 NSObject的对象原理:每一个对象都有引用计数器当使用alloc new 和 copy创建对象时引用计数器被设置为1给对象发送一条retain消息 ,引用计数器加1 ...
- 014、BOM与DOM对象的应用
Screen屏幕对象 Width:屏幕的宽度 Height:屏幕的高度 availWidth:屏幕的有效宽度(不含任务栏) availHeight:屏幕的有效高度(不含任务栏) colorDepth: ...
- 多路复用IO和异步IO
多路复用I/O 它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程. 流程图如下: 当用户进程调用了sel ...
- 必看的dockerfile禁忌与建议!
直接上对照组(看第三个run) test1 FROM centos MAINTAINER ** RUN yum -y update RUN yum -y install wget RUN wg ...
- Python调用Java代码部署及初步使用
Python调用Java代码部署: jpype下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype 下载的时候需要使用Chrome浏览器进行下载 ...
- nodejs,python,sublime和Eclipse的包管理器
Python的包管理器叫pip. 首先安装Python运行环境Python 3.7.0:https://www.python.org/downloads/release/python-370/ Pyt ...
- 闲着蛋疼没事干,写个Mac端的Kcptun Client管理器
原理: 执行一行脚本 输入服务器地址,端口,密码等做了图形化编辑 可以控制Kcptun是否正在运行 App已上传github https://github.com/nicky2k8/KcptunCli ...
- Python3简明教程(五)—— 流程控制之循环
有些时候我们需要多次执行相同的任务,我们使用一个计数器来检查代码需要执行的次数.这个技术被称为循环. while循环 while语句的语法如下: while condition: statement1 ...
- chart 图片组件 生成后不能动态更新,需要销毁dom,从新载入 用 v-if 和 this.$nextTick(() => {
<chart-box v-if="cbData1Bool" cb-text="基本概况" chartBoxSele="饼状图" :cb ...
- 关于sigleton模式
单例模式的要点有三个:一是某个类只能有一个实例:二是它必须自行创建这个实例:三是它必须自行向整个系统提供这个实例. 从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中 ...