【题解】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)\)

  1. //@winlere
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<cmath>
  7. using namespace std; typedef long long ll;
  8. inline int qr(){
  9. register int ret=0,f=0;
  10. register char c=getchar();
  11. while(c<48||c>57)f|=c==45,c=getchar();
  12. while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
  13. return f?-ret:ret;
  14. }
  15. const int maxn=2e5+5;
  16. int be[maxn];
  17. int data[maxn];
  18. int s[maxn];
  19. int n,N,ans,m;
  20. struct Q{
  21. int l,r,id;
  22. Q(){l=r=id=0;}
  23. Q(const int&a,const int&b,const int&c){l=a;r=b;id=c;}
  24. 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);}
  25. }q[maxn];
  26. inline void add(const int&pos,const int&tag){
  27. if(data[pos]>maxn) return;
  28. s[data[pos]]+=tag;
  29. const int k=s[data[pos]];
  30. if(k==0&&ans> data[pos]) ans=data[pos];
  31. if(k==1&&ans==data[pos])
  32. while(++ans) if(!s[ans]) return;
  33. }
  34. int main(){
  35. n=qr(),m=qr();
  36. N=sqrt(n)+1;
  37. for(register int t=1;t<=n;++t) be[t]=(t-1)/N+1;
  38. for(register int t=1;t<=n;++t) data[t]=qr();
  39. for(register int t=1,t1,t2;t<=m;++t) t1=qr(),t2=qr(),q[t]=Q(t1,t2,t);
  40. sort(q+1,q+m+1);
  41. register int L=1,R=0;
  42. for(register int t=1;t<=m;++t){
  43. while(L<q[t].l) add(L++,-1);
  44. while(L>q[t].l) add(--L, 1);
  45. while(R<q[t].r) add(++R, 1);
  46. while(R>q[t].r) add(R--,-1);
  47. be[q[t].id]=ans;
  48. }
  49. for(register int t=1;t<=m;++t) printf("%d\n",be[t]);
  50. return 0;
  51. }

【题解】P4137 Rmq Problem(莫队)的更多相关文章

  1. BZOJ 3339: Rmq Problem 莫队算法

    3339: Rmq Problem 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3339 Description n个数,m次询问l,r ...

  2. 【bzoj3585/bzoj3339】mex/Rmq Problem 莫队算法+分块

    原文地址:http://www.cnblogs.com/GXZlegend/p/6805283.html 题目描述 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没 ...

  3. P4137 Rmq Problem / mex (莫队)

    题目 P4137 Rmq Problem / mex 解析 莫队算法维护mex, 往里添加数的时候,若添加的数等于\(mex\),\(mex\)就不能等于这个值了,就从这个数开始枚举找\(mex\): ...

  4. 洛谷 P4137 Rmq Problem /mex 解题报告

    P4137 Rmq Problem /mex 题意 给一个长为\(n(\le 10^5)\)的数列\(\{a\}\),有\(m(\le 10^5)\)个询问,每次询问区间的\(mex\) 可以莫队然后 ...

  5. 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex

    题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...

  6. 洛谷P4137 Rmq Problem / mex(莫队)

    题目描述 有一个长度为n的数组{a1,a2,…,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. 输入输出格式 输入格式: 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问l, ...

  7. 洛谷 P4137 Rmq Problem/mex 题解

    题面 首先,由于本人太菜,不会莫队,所以先采用主席树的做法: 离散化是必须环节,否则动态开点线段数都救不了你: 我们对于每个元素i,插入到1~(i-1)的主席树中,第i颗线段树(权值线段树)对于一个区 ...

  8. hdu_5085_Counting problem(莫队分块思想)

    题目连接:hdu_5085_Counting problem 题意:给你一个计算公式,然后给你一个区间,问这个区间内满足条件的数有多少个 题解:由于这个公式比较特殊,具有可加性,我们考虑讲一个数分为两 ...

  9. P4137 Rmq Problem / mex

    目录 链接 思路 线段树 莫队 链接 https://www.luogu.org/problemnew/show/P4137 思路 做了好几次,每次都得想一会,再记录一下 可持久化权值线段树 区间出现 ...

随机推荐

  1. HZOJ Blue

    Blue: 贪心. 我们不妨给蛤定一个先后顺序,则贪心策略即从右至左每只蛤依次往最远的石子跳. 证明: 如果最右的蛤不往最远的石子跳,而是选择了一个较近的石子,那么必然会存在一个该蛤左边的蛤越过了它跳 ...

  2. python 操作asdl

    #!/usr/bin/env python# -*- coding:utf-8 -*- import win32ras import time,os def Connect(dialname, acc ...

  3. 05Redis入门指南笔记(持久化)

    Redis的强劲性能很大程度上是由于将所有数据都存储在了内存中,然而当Redis重启后,所有存储在内存中的数据就会丢失.在一些情况下,希望Redis能将数据从内存中以某种形式同步到硬盘中,使得重启后可 ...

  4. OpenStack☞HTTP协议

    前言 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准 HTTP是一个基于TCP/IP通信协议 ...

  5. H3C 命令行编辑功能

  6. Object类型的创建和访问

    创建Object实例的方式有两种: 1.使用new操作符后跟object构造函数 var person=new Object(); person.name='Nicholas'; person.age ...

  7. dotnet core 2.1 使用阶梯编译

    在 dotnet core 2.1 可以使用阶梯编译的方法,从 dotnet framework 开始,在代码的所有方法在第一次进入的时候就需要使用 JIT 进行编译为本机的代码.可以看到代码是在第一 ...

  8. php框架thinkphp3.2.3 配置文件bug

    bug:有前后台的项目部署阶段(DEBUG模式为false)中,修改应用配置文件后,无效,修改自定义配置文件,正常;(开发模式正常) //项目只有后台没有前台的(单独模块),直接写在模块配置中即可,不 ...

  9. 【js】 vue 2.5.1 源码学习(十二)模板编译

    大体思路(十) 本节内容: 1. baseoptions 参数分析 2. options 参数分析 3. parse 编译器 4. parseHTNL 函数解析 // parse 解析 parser- ...

  10. element-ui—dialog使用过程中的坑

    场景一:我们将dialog写成一个可复用的公共组件用于显示不同内容(如表格操作中的修改或添加的弹窗),之后发现dialog的遮罩将弹出层(点击修改或添加后理应由一个弹窗显示出来)都盖住了,而我想要的效 ...