Gty的二逼妹子序列 bzoj-3809

题目大意:给定一个n个正整数的序列,m次询问。每次询问一个区间$l_i$到$r_i$中,权值在$a_i$到$b_i$之间的数有多少个。

注释:$1\le n\le 10^5$,$1\le m\le 10^6$。


想法:说实话没想到分块和莫队。

考虑莫队如何处理旁区间:我们将值域分块。

每个块就存一下当前区间在这个块内有多少个值。特殊的是这个不是随时维护答案,是在区间刚好等于询问区间的时候处理。

莫队的时间复杂度是$O(n\sqrt{m})$;另外每次询问的时间复杂度是$O(\sqrt{n})$。

最后,附上丑陋的代码... ...

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

小结:莫队真可爱... ...

[bzoj3809]Gty的二逼妹子序列_莫队_分块的更多相关文章

  1. 2019.01.08 bzoj3809: Gty的二逼妹子序列(莫队+权值分块)

    传送门 题意:多组询问,问区间[l,r]中权值在[a,b]间的数的种类数. 看了一眼大家应该都知道要莫队了吧. 然后很容易想到用树状数组优化修改和查询做到O(mnlogamax)O(m\sqrt nl ...

  2. 【BZOJ 3809】 3809: Gty的二逼妹子序列 (莫队+分块)

    3809: Gty的二逼妹子序列 Time Limit: 80 Sec  Memory Limit: 28 MBSubmit: 1728  Solved: 513 Description Autumn ...

  3. BZOJ 3809 Gty的二逼妹子序列(莫队+分块)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3809 [题目大意] 给定一个长度为n(1<=n<=100000)的正整数序 ...

  4. bzoj 3809 Gty的二逼妹子序列(莫队算法,块状链表)

    [题意] 回答若干个询问,(l,r,a,b):区间[l,r]内权值在[a,b]的数有多少[种]. [思路] 考虑使用块状链表实现莫队算法中的插入与删除. 因为权值处于1..n之间,所以我们可以建一个基 ...

  5. 洛谷P4867 Gty的二逼妹子序列(莫队+树状数组)

    传送门 本来打算用主席树 然后发现没办法维护颜色数 于是用了莫队加树状数组 然后竟然A了…… //minamoto #include<iostream> #include<cstdi ...

  6. [bzoj3809]Gty的二逼妹子序列/[bzoj3236][Ahoi2013]作业

    [bzoj3809]Gty的二逼妹子序列/[bzoj3236][Ahoi2013]作业 bzoj   bzoj 题目大意:一个序列,m个询问在$[l,r]$区间的$[x,y]$范围内的数的个数/种类. ...

  7. BZOJ3809: Gty的二逼妹子序列

    Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题.   对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数.   为了方 ...

  8. [BZOJ3809]Gty的二逼妹子序列[莫队+分块]

    题意 给出长度为 \(n\) 的序列,\(m\) 次询问,每次给出 \(l,r,a,b\) ,表示询问区间 \([l,r]\) 中,权值在 \([a,b]\) 范围的数的种类数. \(n\leq 10 ...

  9. bzoj3809 Gty的二逼妹子序列 & bzoj3236 [Ahoi2013]作业 莫队+分块

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3809 https://lydsy.com/JudgeOnline/problem.php?id ...

随机推荐

  1. codechef: ADAROKS2 ,Ada Rooks 2

    又是道原题... (HDU 6313 Hack It , 多校 ACM 里面的题) 题目说构造一个 n * n 矩阵,染色点不得构成矩形...然后染色点个数至少 8 * n 然后我们生成一个数 m , ...

  2. java 序列化和反序列化数据

    使用ObjectOutputStream 序列号原始数据和对象数据,使用ObjectInputStream 反序列化 使用字节存储数据,可以将序列化的数据存储到硬盘上,或输出到网络上 package ...

  3. python自动化测试学习笔记-9测试框架

    学习了这么久的python,我们已经可以自己搭建一个简单的测试和框架了,先从简单的开始,有时我们编写接口的测试用例会用excel进行编写,以下面的接口测试用例模板为例,进行编写:

  4. sql删除表中重复记录只保留一条记录

    最终代码 update T_Fee set gzl_dfg_op = 'delete' where MetReadRecordID in ( select MetReadRecordID from T ...

  5. arduino 字符解析

    Arduino String.h库函数详解   此库中包含1 charAT()2 compareTo()3 concat()4 endsWith()5 equals()6 equalslgnoreCa ...

  6. sql server truncate table 删除表数据限制条件

    truncate 注释 注释TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度快 ...

  7. oracle数据库跨库查询

    create public database link mylink connect to orclname identified by orclpasswd using 'ORCL'; drop p ...

  8. Lazarus 日志工具 MultiLog

    MultiLog是一种同时以灵活性和低开销为目标的日志系统.顾名思义,它可用于将日志实例到多个目标,如文本文件.可视控件或其他应用程序.添加新的日志目标使用两个方法就可以实现了,其中一个方法是可选的. ...

  9. Microsoft SQL Server 安全与权限

    Microsoft SQL Server 安全与权限 登陆角色 计算机操作系统用户 --创建Windows身份验证用户 USE [master] GO CREATE LOGIN [计算机名称\计算机用 ...

  10. Codeforces985E. Pencils and Boxes (单调队列)

    题意:n个数 把他们放进一些盒子里 每个盒子最少放k个数 且最小和最大的差不能大于d 题解:显然排个序 对于当前点 存一下前面有哪些节点可以当作结尾 那么就可以枚举这些点的下一个点作为起点能否和当前点 ...