给一个长度为n的数列a,q个询问,每次询问一段区间的mex。(没有出现过的最小非负整数)

1<=n,q<=200000,0<=ai<=200000。

题解1 莫队

我们将权值分成根号块,记录每个权值的出现次数和每块内有多少权值出现过。

修改和询问就直接暴力做就行。

修改O(1),询问O(sqrt(n)),加在一起还是O((n+q)sqrt(n+q))。

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. #include <algorithm>
  6. using namespace std;
  7. #define SZ 666666
  8. int n,q,a[SZ],ts[SZ],tc[SZ],gg,bk,anss[SZ];
  9. void edt(int p,int x)
  10. {
  11. tc[p/gg]-=(bool)ts[p];
  12. ts[p]=x;
  13. tc[p/gg]+=(bool)ts[p];
  14. }
  15. struct query {int l,r,id;} qs[SZ];
  16. bool operator < (query a,query b)
  17. {
  18. int ap=a.l/bk, bp=b.l/bk;
  19. if(ap==bp) return a.r<b.r;
  20. return ap<bp;
  21. }
  22. void add(int p) {edt(p,ts[p]+1);}
  23. void del(int p) {edt(p,ts[p]-1);}
  24. #define gc getchar()
  25. int g_i()
  26. {
  27. int tmp=0; bool fu=0; char s;
  28. while(s=gc,s!='-'&&(s<'0'||s>'9')) ;
  29. if(s=='-') fu=1; else tmp=s-'0';
  30. while(s=gc,s>='0'&&s<='9') tmp=tmp*10+s-'0';
  31. if(fu) return -tmp; else return tmp;
  32. }
  33. #define gi g_i()
  34. #define pob
  35. #define pc(x) putchar(x)
  36. namespace ib {char b[100];}
  37. inline void pint(int x)
  38. {
  39. if(x==0) {pc(48); return;}
  40. if(x<0) {pc('-'); x=-x;}
  41. char *s=ib::b;
  42. while(x) *(++s)=x%10, x/=10;
  43. while(s!=ib::b) pc((*(s--))+48);
  44. }
  45. int main()
  46. {
  47. n=gi, q=gi;
  48. for(int i=1;i<=n;i++) a[i]=gi;
  49. gg=sqrt(200000);
  50. bk=min(int(sqrt(n)+1),n);
  51. for(int i=1;i<=q;i++) qs[i].id=i, qs[i].l=gi, qs[i].r=gi;
  52. sort(qs+1,qs+1+q);
  53. int cl=1,cr=0;
  54. for(int i=1;i<=q;i++)
  55. {
  56. int l=qs[i].l,r=qs[i].r;
  57. while(cr<r) add(a[++cr]);
  58. while(cr>r) del(a[cr--]);
  59. while(cl>l) add(a[--cl]);
  60. while(cl<l) del(a[cl++]);
  61. int nof=0;
  62. for(int j=0;;j++)
  63. {
  64. if(tc[j]!=gg) {nof=j; break;}
  65. }
  66. for(int j=nof*gg;;j++)
  67. {
  68. if(!ts[j]) {anss[qs[i].id]=j; break;}
  69. }
  70. }
  71. for(int i=1;i<=q;i++) {pint(anss[i]); pc(10);}
  72. }

题解2 线段树

我们这么考虑,从小到大加入所有权值。如果有一个权值正好没有经过,这个权值就可以作为答案,就可以退出了。

现在我们考虑对于一个权值,所有不包括它的区间都可以以它作为答案,那么我们就把同样是这个权值的搞出来,那么这个序列就会被搞成几段,那么每一段内的询问都可以更新答案。

那么我们就二维线段树即可。我tm才不想写

bzoj3339 rmq problem (range mex query)的更多相关文章

  1. BZOJ3339 Rmq Problem

    [bzoj3339]Rmq Problem Description Input Output Sample Input 7 5 0 2 1 0 1 3 2 1 3 2 3 1 4 3 6 2 7 Sa ...

  2. [bzoj3339]Rmq Problem||[bzoj3585]mex_线段树

    Rmq Problem bzoj-3339||mex bzoj-3585 题目大意:给定一个长度为n的数列a,多次讯问区间l,r中最小的不属于集合{$A_l,A_{l+1}...A_r$}的非负整数. ...

  3. [BZOJ3339]Rmq Problem / mex

    Description: 有一个长度为n的数组{a1,a2,-,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Hint: \(n \le 2*10^5\) Solution: 主席树好 ...

  4. 【BZOJ】3339: Rmq Problem & 3585: mex(线段树+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3585 好神的题. 但是!!!!!!!!!!!!!!我线段树现在要开8倍空间才能过!!!!!!!!!! ...

  5. 【莫队算法】【权值分块】bzoj3339 Rmq Problem

    如题. #include<cstdio> #include<algorithm> #include<cmath> using namespace std; #def ...

  6. [BZOJ3339] Rmq Problem(线段树)

    传送门 这个题的方法好像很多啊 1.莫队暴力 2.线段树 + 离线处理 先预处理出sg[i]表示前i个数的sg值,next[i]表示i的下一位置在哪里,如果后面再没有i,那么next[i] = n + ...

  7. RMQ(Range Minimum Query)问题(转)

    问题描述 RMQ问题是求给定区间中的最值问题.对于长度为n的数列A,回答若干查询RMQ(A, i, j).返回数组A中下标在[i,j]里的最小值的下标. 比如数列 5,8,1,3,6,4,9,5,7 ...

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

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

  9. BZOJ3339&&3585 Rmq Problem&&mex

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

随机推荐

  1. gif动图快速制作方法(附工具)

    现在写博客或是wiki的过程中,会经常引用到图片,特别是客户端经常与页面相关所以截图不可避.但是越来越多的效果仅仅一张图片是无法清楚的描述.并且博客或是wiki也是支持gif图的.gif图的制作方法有 ...

  2. tomcat内存溢出处理

    tomcat内存溢出设置JAVA_OPTS  答案1设置Tomcat启动的初始内存 其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4.可以利用JVM提供的-Xmn ...

  3. 你真的了解UIWindow吗?

    一:首先查看一下关于UIWindow的定义 NS_CLASS_AVAILABLE_IOS(2_0) @interface UIWindow : UIView //window的屏幕,默认是 [UISc ...

  4. iOS多线程解析

    在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项.当然也会给出几种多线程的案例,在实际使用中感受它们的区别.还有一点需要说明的是,这篇文章将会使用 Swift 和 ...

  5. 联通烽火hg220桥接tplink路由器

    转载请注明:from http://www.cnblogs.com/juandx/p/5544517.html 1.普通账户:user(7fnmmnml,默认是bdettbr0),猫背后可见 2.工程 ...

  6. 用Phaser实现Flappy Bird 游戏

    How to Make a Flappy Bird in HTML5 With Phaser - Part 1 Flappy Bird is a nice little game with easy ...

  7. C# 表复制和数据行的复制说明(Clone、ImportRow 、Copy )

    /// <summary> /// 构建测试数据表 /// </summary> /// <returns></returns> private Dat ...

  8. Tomcat源码解读:ClassLoader的设计

    Tomcat是一个经典的web server,学习tomcat的源码对于我们是有很大的帮助的.前一段时间了解了tomcat的工作的大致流程,对我的新工作有了很大的帮助.刚学习了ClassLoader( ...

  9. fopen()、 file_get_contents() 通过url获取链接内容

    功能:获得网页内容 区别如下: fopen()打开URL 下面是一个使用fopen()打开URL的例子: <?php $fh = fopen('http://www.baidu.com/', ' ...

  10. 0010《SQL必知必会》笔记06-表的修改与删除

    1.表的修改: 1.1 删除列:ALTER TABLE 表名 DROP COLUMN 列名 1.2 添加列:ALTER TABLE 表名 ADD(列名 数据类型) 1.3 修改列名:ALTER TAB ...