【题解】P4137 Rmq Problem(莫队)
【题解】P4137 Rmq Problem(莫队)
其实这道题根本就不用离散化!
因为显然有\(mex\)值是\(\le 2\times 10^5\)的,所以对于大于\(2\times 10^5\)的数我们可以忽略。
然后直接莫队算就是的,开一个\(2e5\)的桶
- 若一个比答案小的值的桶为\(0\)了:答案更新为它
- 若这个\(mex\)的桶突然有值了:暴力枚举答案变大,第一个桶里没值的就是答案,更新。
有小伙伴会问,这复杂度不上天了?其实不然。移动\(ans\)的总复杂度(好像)是\(O(n\sqrt n)\)的,因为:
当区间长度增大时,\(ans\)的移动是均摊\(O(\text{区间长度})\)的(最坏情况(好像)是加进来的数就变成了一个递增序列)。
当区间减小时,\(ans\)是直接更新的。所以\(ans\)指针的移动和\(L,R\)指针的移动次数是同级的。
由于莫队中,区间减小增大不是交替的(不存在\(L\)动一次交替然后\(R\)动一次)(都是一个动完再动另外一个),所以最终复杂度\(O(n\sqrt n)\),实际上(貌似)吊打\(O(n \log n)\)
//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(c<48||c>57)f|=c==45,c=getchar();
while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
}
const int maxn=2e5+5;
int be[maxn];
int data[maxn];
int s[maxn];
int n,N,ans,m;
struct Q{
int l,r,id;
Q(){l=r=id=0;}
Q(const int&a,const int&b,const int&c){l=a;r=b;id=c;}
inline bool operator <(const Q&a)const{return be[l]==be[a.l]?(be[l]&1?r<a.r:r>a.r):(l<a.l);}
}q[maxn];
inline void add(const int&pos,const int&tag){
if(data[pos]>maxn) return;
s[data[pos]]+=tag;
const int k=s[data[pos]];
if(k==0&&ans> data[pos]) ans=data[pos];
if(k==1&&ans==data[pos])
while(++ans) if(!s[ans]) return;
}
int main(){
n=qr(),m=qr();
N=sqrt(n)+1;
for(register int t=1;t<=n;++t) be[t]=(t-1)/N+1;
for(register int t=1;t<=n;++t) data[t]=qr();
for(register int t=1,t1,t2;t<=m;++t) t1=qr(),t2=qr(),q[t]=Q(t1,t2,t);
sort(q+1,q+m+1);
register int L=1,R=0;
for(register int t=1;t<=m;++t){
while(L<q[t].l) add(L++,-1);
while(L>q[t].l) add(--L, 1);
while(R<q[t].r) add(++R, 1);
while(R>q[t].r) add(R--,-1);
be[q[t].id]=ans;
}
for(register int t=1;t<=m;++t) printf("%d\n",be[t]);
return 0;
}
【题解】P4137 Rmq Problem(莫队)的更多相关文章
- BZOJ 3339: Rmq Problem 莫队算法
3339: Rmq Problem 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3339 Description n个数,m次询问l,r ...
- 【bzoj3585/bzoj3339】mex/Rmq Problem 莫队算法+分块
原文地址:http://www.cnblogs.com/GXZlegend/p/6805283.html 题目描述 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没 ...
- P4137 Rmq Problem / mex (莫队)
题目 P4137 Rmq Problem / mex 解析 莫队算法维护mex, 往里添加数的时候,若添加的数等于\(mex\),\(mex\)就不能等于这个值了,就从这个数开始枚举找\(mex\): ...
- 洛谷 P4137 Rmq Problem /mex 解题报告
P4137 Rmq Problem /mex 题意 给一个长为\(n(\le 10^5)\)的数列\(\{a\}\),有\(m(\le 10^5)\)个询问,每次询问区间的\(mex\) 可以莫队然后 ...
- 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex
题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...
- 洛谷P4137 Rmq Problem / mex(莫队)
题目描述 有一个长度为n的数组{a1,a2,…,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. 输入输出格式 输入格式: 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问l, ...
- 洛谷 P4137 Rmq Problem/mex 题解
题面 首先,由于本人太菜,不会莫队,所以先采用主席树的做法: 离散化是必须环节,否则动态开点线段数都救不了你: 我们对于每个元素i,插入到1~(i-1)的主席树中,第i颗线段树(权值线段树)对于一个区 ...
- hdu_5085_Counting problem(莫队分块思想)
题目连接:hdu_5085_Counting problem 题意:给你一个计算公式,然后给你一个区间,问这个区间内满足条件的数有多少个 题解:由于这个公式比较特殊,具有可加性,我们考虑讲一个数分为两 ...
- P4137 Rmq Problem / mex
目录 链接 思路 线段树 莫队 链接 https://www.luogu.org/problemnew/show/P4137 思路 做了好几次,每次都得想一会,再记录一下 可持久化权值线段树 区间出现 ...
随机推荐
- 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google
摘要: 作为此次Gartner报告中唯一上榜的中国科技公司,阿里云获得六个评判维度的最高分,排名第二 近日,知名调研机构Gartner发布了全球领先公共云厂商区块链服务能力报告,作为唯一上榜的中国科技 ...
- Git 进阶:10大技巧让你迅速提升
1.Git自动补全 假使你使用命令行工具运行Git命令,那么每次手动输入各种命令是一件很令人厌烦的事情. 命令: cd ~ curl https://raw.github.com/git/git/ma ...
- oracle函数 CHR(n1)
[功能]:将ASCII 码转换为字符. [参数]:n1,为0 ~ 255,整数 [返回]:字符型 [示例] SQL> select chr(54740) zhao,chr(65) chr65 f ...
- H3C 802.11协议的发展
- angularJS $q
1.$q $q是Angular的一种内置服务,它可以使你异步地执行函数,并且当函数执行完成时它允许你使用函数的返回值(或异常). 2.defer defer的字面意思是延迟, $q.defer() ...
- 安装win下的Anaconda ----针对python3.6.4版本
我的python版本是3.6.4, Anaconda下载地址: Anaconda官网:https://repo.anaconda.com/archive/ 清华大学镜像站:https://mirror ...
- CSS3 Box-shadow 阴影效果用法
一.基本用法: 二.内阴影用法: 三.阴影扩展长度值: box-shadow: 4rpx 4rpx 8rpx #aaa;
- Error: Cannot find module 'webpack/bin/config-yargs' 报错原因, webpack@4.X踩的坑~
1 .使用webpack@4.32.2时, 当我通过package.json的script去执行webpack-dev-server时, 报以下错误: Error: Cannot find modu ...
- Clipboard 自动复制功能,ios复制失败,换方案 user-select: text ;长按复制 (ios 兼容,长按复制)
Clipboard 自动复制功能,嵌套app内跳转的页面,ios 自动复制失败(该ios机子,微信,浏览器打开复制没有问题) 暂时换方案 user-select: text ;长按复制 (ios ...
- .net Framework 源代码 · ScrollViewer
本文是分析 .net Framework 源代码的系列,主要告诉大家微软做 ScrollViewer 的思路,分析很简单. 看完本文,可以学会如何写一个 ScrollViewer ,如何定义一个 IS ...