P4137 Rmq Problem / mex

题目描述

有一个长度为n的数组{a1,a2,…,an}。m次询问,每次询问一个区间内最小没有出现过的自然数。

输入输出格式

输入格式:

第一行n,m。

第二行为n个数。

从第三行开始,每行一个询问l,r。

输出格式:

一行一个数,表示每个询问的答案。

输入输出样例

输入样例#1:

5 5

2 1 0 2 1

3 3

2 3

2 4

1 2

3 5

输出样例#1:

1

2

3

0

3

说明

对于30%的数据:1<=n,m<=1000

对于100%的数据:1<=n,m<=200000,0<=ai<=10^9,1<=l<=r<=n

简单莫队

不过这个转换不一定是O(n)的

注意细节

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <cstdio>
  6. #define R register
  7. #define maxn 301000
  8. using namespace std;
  9. int n,m,now;
  10. int a[maxn];
  11. int belong[maxn];
  12. int vis[maxn];
  13. int ma;
  14. struct node {
  15. int l,r,id;
  16. } q[maxn];
  17. int ans[maxn];
  18. inline int read()
  19. {
  20. int x=0,f=1;char s=getchar();
  21. while('0'>s||s>'9') {
  22. if(s=='-') f=-1;
  23. s=getchar();
  24. }
  25. while('0'<=s&&s<='9') {
  26. x=x*10+s-'0';
  27. s=getchar();
  28. }
  29. return x*f;
  30. }
  31. inline bool cmp(node a,node b) {
  32. return belong[a.l]==belong[b.l] ? a.r<b.r : belong[a.l]<belong[b.l];
  33. }
  34. inline void add(int x) {
  35. ++vis[x];
  36. if(now < x) return;
  37. if(now==x&&vis[x]==1) { //细节在这里
  38. for(R int i=now+1; i<n; ++i) {
  39. if(!vis[i]) {
  40. now=i;
  41. return;
  42. }
  43. }
  44. }
  45. }
  46. inline void delet(int x) {
  47. --vis[x];
  48. if(now < x) return;
  49. if(now > x) {
  50. if(!vis[x]) {
  51. now=x;
  52. }
  53. }
  54. }
  55. int main() {
  56. n=read();
  57. m=read();
  58. int k=sqrt(n);
  59. //别看a[]很大,ans范围小于n
  60. for(R int i=1; i<=n; ++i) {
  61. a[i]=read();
  62. if(a[i] > n)
  63. a[i]=n+1;
  64. }
  65. if(n<=1000&&m<=1000) { //baoli
  66. while(m--) {
  67. int l,r;
  68. memset(vis,0,sizeof(vis));
  69. l=read();
  70. r=read();
  71. for(R int i=l; i<=r; ++i)
  72. vis[a[i]]=1;
  73. R int i=0;
  74. while(vis[i]) i++;
  75. printf("%d\n",i);
  76. }
  77. return 0;
  78. }
  79. for(R int i=1; i<=n; ++i)
  80. belong[i]=(i-1)/k+1;
  81. for(R int i=1; i<=m; ++i)
  82. {
  83. q[i].l=read();
  84. q[i].r=read();
  85. q[i].id=i;
  86. }
  87. sort(q+1,q+1+m,cmp);
  88. int l=1,r=0;
  89. for(R int i=1; i<=m; ++i) {
  90. while(l > q[i].l) add(a[--l]);
  91. while(l < q[i].l) delet(a[l++]);
  92. while(r < q[i].r) add(a[++r]);
  93. while(r > q[i].r) delet(a[r--]);
  94. ans[q[i].id]=now;
  95. }
  96. for(R int i=1; i<=m; ++i)
  97. printf("%d\n",ans[i]);
  98. return 0;
  99. }

BZOJ 3339 && luogu4137 Rmq Problem / mex(莫队)的更多相关文章

  1. P4137 Rmq Problem / mex (莫队)

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

  2. 【luogu4137】 Rmq Problem / mex - 莫队

    题目描述 有一个长度为n的数组{a1,a2,…,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. 思路 莫队水过去了 233 #include <bits/stdc++.h> ...

  3. 分块+莫队||BZOJ3339||BZOJ3585||Luogu4137||Rmq Problem / mex

    题面:P4137 Rmq Problem / mex 题解:先莫队排序一波,然后对权值进行分块,找出第一个没有填满的块,直接for一遍找答案. 除了bzoj3339以外,另外两道题Ai范围都是1e9. ...

  4. Luogu4137 Rmq problem/mex 主席树

    传送门 用主席树水莫队题…… 我们对于前缀和建立主席树,对于主席树中的每一个叶子节点表示它对应的数字最后出现的位置的编号,非叶子节点求左右节点的最小值,那么对于每一次询问$l,r$就是在第$r$棵主席 ...

  5. 【Luogu4137】Rmq Problem/mex (莫队)

    [Luogu4137]Rmq Problem/mex (莫队) 题面 洛谷 题解 裸的莫队 暴力跳\(ans\)就能\(AC\) 考虑复杂度有保证的做法 每次计算的时候把数字按照大小也分块 每次就枚举 ...

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

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

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

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

  8. [bzoj3585] Rmq Problem / mex

    [bzoj3585] Rmq Problem / mex bzoj luogu 看上一篇博客吧,看完了这个也顺理成章会了( (没错这篇博客就是这么水) #include<cstdio> # ...

  9. BZOJ3339&&3585 Rmq Problem&&mex

    BZOJ3339&&3585:Rmq Problem&&mex Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最 ...

随机推荐

  1. 运行Chromium浏览器无法登录谷歌账号因为缺少google api密钥

    管理员身份运行CMD,然后依次输入以下三行内容(因为比较长,最好拷贝,因为某原因粘贴第一行后,我输入了下,结果第一次没成功,可能是输入错误了.): setx GOOGLE_API_KEY " ...

  2. git push 文件过大时出错,fatal: The remote end hung up unexpectedly

    可以修改配置文件: 1 使用命令:git config http.postBuffer = 524288000 2修改git文件夹中的config文件,加入如下一段: [http] postBuffe ...

  3. 2.搭建cassandra时遇到没有公网网卡的问题

    阿里云服务器有两种网络,一种是经典网络,一种是专用网络,经典网络是公网网卡的,但是专用网络是没有公网网卡的. 如图: 经典网络,公网ip是139.129.31.108: 专用网络,公网ip是 问题: ...

  4. [LeetCode] 190. Reverse Bits_Easy tag: Bit Manipulation

    Reverse bits of a given 32 bits unsigned integer. Example: Input: 43261596 Output: 964176192 Explana ...

  5. hadoop streaming怎么设置key

    充分利用hadoop的map输出自动排序功能,能够有效提高计算效率.Hadoop streaming框架默认情况下会以'/t’作为分隔符,将每行第一个'/t’之前的部分作为key,其余内容作为valu ...

  6. SV中的随机化

    SV搭建testbench的关键概念:CRT(constraint random test),测试集的随机化. 由于对象class由数据和操作组成,所以对数据的随机化一般放在一个class内.(对环境 ...

  7. Loadrunder场景设计篇——添加windows Resource计数器和指标说明

    目的 监控要测试的windows服务器的资源使用情况 A.添加计数器步骤 1.添加视图,方法双击.拖动左侧的Windows Rescources到右边图形区,或右键右侧已有视图,Open a New ...

  8. VS2012提示突然没有了

    重置Visual Studio可以解决此问题, 方法是从开始->Microsoft Visual Studio 2012->Visual Studio  Tools->Visual ...

  9. CQRS/ES框架调研

    1.Enode一个C#写的CQRS/ES框架,由汤雪华设计及实现,github上有相关源码,其个人博客上有详细的孵化.设计思路.版本迭代及最新的完善: 2.axon framwork,java编写,网 ...

  10. python 换行符的识别问题,Unix 和Windows 中是不一样的

    关于换行符的识别问题,在Unix 和Windows 中是不一样的(分别是n 和rn).默认情况下,Python 会以统一模式处理换行符.这种模式下,在读取文本的时候,Python 可以识别所有的普通换 ...