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. cas sso原理

    以下转载至https://blog.csdn.net/javaloveiphone/article/details/52439613 从结构上看,CAS包含两个部分:CAS Server 和CAS C ...

  2. Monkey and Banana---hdu1069(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069 题意就是给你n种长方体每种类型不限制个数,然后我们把它们一个个堆起来,并且要满足下面的要比上面的 ...

  3. Bone Collector--hdu2602(01背包)

    Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bone Collec ...

  4. python2.7+pyqt4实现记事本基本功能

    记事本程序: # coding:utf-8 import sys from PyQt4.QtGui import QMainWindow from PyQt4.QtGui import QApplic ...

  5. java解析json字符串

    import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List; ...

  6. HTTP权威指南读书笔记

    HTTP权威指南笔记 读书有两种境界,第一种境界是将书读薄,另一种是读厚.本篇文章就是HTTP权威指南的读书笔记,算是读书的第一重境界,将厚书读薄.文章对HTTP的一些关键概念做了比较详细的概述,通读 ...

  7. CloudFlare防护下的破绽:寻找真实IP的几条途径

    本文仅代表作者独立观点,本文提及的技术仅供安全研究和渗透测试用途 看Twitter发现CloudFlare总裁什么的最近很高调,北京.香港的跑着参加会议.发表演说什么的,CloudFlare似乎也没那 ...

  8. Pandas之Dropna滤除缺失数据

    import pandas as pd import numpy as np from numpy import nan as NaN 一.处理Series对象 通过dropna()滤除缺失数据 fr ...

  9. SoapUI 使用变量

    登录问题不好解决, 只能临时用cookie来执行 1.变量定义 2.引用变量 3.调用Header

  10. Azkaban-开源任务调度程序(安装篇)

    最近项目迁移到新集群,试试同事推荐的开源任务调度程序-azkaban(阿兹卡班),没看错,就是哈利波特里的阿兹卡班,azikaban主要用来解决hadoop依赖任务的执行,但是它本身支持linux和j ...