BZOJ_3585_mex && BZOJ_3339_Rmq Problem_莫队+分块

Description

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

Input

  第一行n,m。
  第二行为n个数。
  从第三行开始,每行一个询问l,r。

Output

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

Sample Input

5 5
2 1 0 2 1
3 3
2 3
2 4
1 2
3 5

Sample Output

1
2
3
0
3

HINT

数据规模和约定
  对于100%的数据:
  1<=n,m<=200000
  0<=ai<=109
  1<=l<=r<=n

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


我的做法比较$sb$ 也比较裸,只能处理离线不修改的。

询问莫队,把权值分块,找到第一个不满的块,暴力查即可。

好像主席树也能做。

主席树链接http://www.cnblogs.com/suika/p/9062412.html

代码(3585&&3339):

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <algorithm>
  4. #include <math.h>
  5. using namespace std;
  6. char nc() {
  7. static char buf[100000],*p1,*p2;
  8. return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
  9. }
  10. inline int rd() {
  11. register int x=0;
  12. register char s=nc();
  13. while(s<'0'||s>'9')s=nc();
  14. while(s>='0'&&s<='9')x=(x<<3)+(x<<1)+s-'0',s=nc();
  15. return x;
  16. }
  17. #define N 200050
  18. int pos[N],L[N],R[N],size,block,n,c[N],ans[N],h[N],ansblo[N],m;
  19. struct A {
  20. int l,r,id;
  21. }q[N];
  22. bool cmp(const A &x,const A &y) {
  23. if(pos[x.l]!=pos[y.l]) return pos[x.l]<pos[y.l];
  24. return x.r<y.r;
  25. }
  26. void del(int x) {
  27. h[x]--;
  28. if(h[x]==0) ansblo[pos[x]]--;
  29. }
  30. void add(int x) {
  31. h[x]++;
  32. if(h[x]==1) ansblo[pos[x]]++;
  33. }
  34. int query() {
  35. int i,j;
  36. for(i=1;i<=block;i++) {
  37. if(ansblo[i]<R[i]-L[i]+1) {
  38. for(j=L[i];j<=R[i];j++) {
  39. if(!h[j]) return j;
  40. }
  41. }
  42. }
  43. return n;
  44. }
  45. void solve() {
  46. int i,l=1,r=0;
  47. for(i=1;i<=m;i++) {
  48. while(l<q[i].l) del(c[l]),l++;
  49. while(r>q[i].r) del(c[r]),r--;
  50. while(l>q[i].l) l--,add(c[l]);
  51. while(r<q[i].r) r++,add(c[r]);
  52. ans[q[i].id]=query();
  53. }
  54. }
  55. int main() {
  56. n=rd(); m=rd();
  57. int i,j;
  58. size=sqrt(n); block=n/size;
  59. for(i=1;i<=block;i++) {
  60. L[i]=R[i-1]+1; R[i]=size*i;
  61. for(j=L[i];j<=R[i];j++) {
  62. c[j]=rd(); c[j]=min(c[j],n); pos[j]=i;
  63. }
  64. }
  65. if(R[block]!=n) {
  66. block++; L[block]=R[block-1]+1; R[block]=n;
  67. for(i=L[block];i<=n;i++) {
  68. c[i]=rd(); c[i]=min(c[i],n); pos[i]=block;
  69. }
  70. }
  71. for(i=1;i<=m;i++) {
  72. q[i].l=rd(); q[i].r=rd(); q[i].id=i;
  73. }
  74. L[1]=0; pos[0]=1;
  75. sort(q+1,q+m+1,cmp);
  76. solve();
  77. for(i=1;i<=m;i++) printf("%d\n",ans[i]);
  78. }

BZOJ_3585_mex && BZOJ_3339_Rmq Problem_莫队+分块的更多相关文章

  1. BZOJ_3585_mex && BZOJ_3339_Rmq Problem_主席树

    BZOJ_3585_mex && BZOJ_3339_Rmq Problem_主席树 Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区 ...

  2. Bzoj 3236: [Ahoi2013]作业 莫队,分块

    3236: [Ahoi2013]作业 Time Limit: 100 Sec  Memory Limit: 512 MBSubmit: 1113  Solved: 428[Submit][Status ...

  3. [BZOJ 3585] mex 【莫队+分块】

    题目链接:BZOJ - 3585 题目分析 区间mex,即区间中没有出现的最小自然数. 那么我们使用一种莫队+分块的做法,使用莫队维护当前区间的每个数字的出现次数. 然后求mex用分块,将权值分块(显 ...

  4. BZOJ_3809_Gty的二逼妹子序列 && BZOJ_3236_[Ahoi2013]作业 _莫队+分块

    BZOJ_3809_Gty的二逼妹子序列 && BZOJ_3236_[Ahoi2013]作业 _莫队+分块 Description Autumn和Bakser又在研究Gty的妹子序列了 ...

  5. BZOJ3236[Ahoi2013]作业——莫队+树状数组/莫队+分块

    题目描述 输入 输出 样例输入 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 样例输出 2 2 1 1 3 2 2 1 提示 N=100000,M=1000000 ...

  6. CFGym101138D Strange Queries 莫队/分块

    正解:莫队/分块 解题报告: 传送门 ummm这题耗了我一天差不多然后我到现在还没做完:D 而同机房的大佬用了一个小时没有就切了?大概这就是大佬和弱鸡的差距趴QAQ 然后只是大概写下思想好了因为代码我 ...

  7. [BZOJ3585]mex(莫队+分块)

    显然可以离线主席树,这里用莫队+分块做.分块的一个重要思想是实现修改与查询时间复杂度的均衡,这里莫队和分块互相弥补. 考虑暴力的分块做法,首先显然大于n的数直接忽略,于是将值域分成sqrt(n)份,每 ...

  8. 小Z的袜子(莫队分块)题解

    小Z的袜子(hose) 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜 ...

  9. 【CodeForces】700 D. Huffman Coding on Segment 哈夫曼树+莫队+分块

    [题目]D. Huffman Coding on Segment [题意]给定n个数字,m次询问区间[l,r]的数字的哈夫曼编码总长.1<=n,m,ai<=10^5. [算法]哈夫曼树+莫 ...

随机推荐

  1. JAVA_Lock

    今天是毕业入职的第一个周末,一直对多线程并发方面的知识比较感兴趣,因为目前我手里的项目并没有涉及到并发方面的知识,所以怕以后遗忘,也便于以后复习和使用,所以总结了一下Lock里面的一些类的方法.具体的 ...

  2. Python高阶函数之 - 装饰器

    高阶函数:  1. 函数名可以作为参数传入     2. 函数名可以作为返回值. python装饰器是用于拓展原来函数功能的一种函数 , 这个函数的特殊之处在于它的返回值也是一个函数 , 使用pyth ...

  3. Play Framework, Server Sent Events and Internet Explorer

    http://www.tuicool.com/articles/7jmE7r Next week I will be presenting at Scala Days . In my talk I w ...

  4. pyspider的一个诡异问题

    其Start_url两次抓取处理失败以后,其之后的所有抓取行为就不正常,似乎根本没有HTTP访问,我把该爬虫的taskdb清空,该爬虫爬取行为恢复正常.这个问题已提交pyspider官方,静待回答.

  5. Qt中的ui指针和this指针

    初学qt,对其ui指针和this指针产生疑问,画了个把小时终于搞懂了. 首先看ui指针的定义: 在mainwindow.h中 private: Ui::MainWindow *ui; Ui又是什么? ...

  6. (五)SpringBoot2.0基础篇- Mybatis与插件生成代码

    SpringBoot与Mybatis合并 一.创建SpringBoot项目,引入相关依赖包: <?xml version="1.0" encoding="UTF-8 ...

  7. Eeffective C++ 读书笔记( 32-38)

    条款三十二:确定你的public继承塑模出is-a关系 1.所谓最佳设计,取决于系统希望做什么事,包括现在和未来. 2.好的接口可以防止无效的代码通过编译,因此你应该宁可采取“在编译期拒绝企鹅飞行”的 ...

  8. 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) + 准备项目

    上一部分预备知识在这 http://www.cnblogs.com/cgzl/p/9010978.html 如果您对ASP.NET Core很了解的话,可以不看本文, 本文基本都是官方文档的内容. A ...

  9. Spring Aop技术原理分析

    本篇文章从Aop xml元素的解析开始,分析了Aop在Spring中所使用到的技术.包括Aop各元素在容器中的表示方式.Aop自动代理的技术.代理对象的生成及Aop拦截链的调用等等.将这些技术串联起来 ...

  10. 如何识别企业内的“千里马”?

    很多企业主都在感叹无法找到合适的优秀管理人才,却忽视了一条获得管理人才的捷径:内部培养.在员工中挑选具有领导潜质的人才,加以培养,必成企业栋梁,而且这样选拔的人才与企业的契合度.忠诚度方面都相对较高. ...