1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <queue>
  6. #include <vector>
  7. #include <cmath>
  8. #define pa pair<int,int>
  9. #define mp make_pair
  10. #define fi first
  11. #define se second
  12. #define pb push_back
  13. using namespace std;
  14. inline void Get_Int(int &x)
  15. {
  16. x=; char ch=getchar(); int f=;
  17. while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
  18. while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();} x*=f;
  19. }
  20. inline void Put_Int(int x)
  21. {
  22. char ch[]; int top=;
  23. if (x==) ch[++top]='';
  24. while (x) ch[++top]=x%+'',x/=;
  25. while (top) putchar(ch[top--]); putchar('\n');
  26. }
  27. //===================================================
  28. const int Maxn=;
  29. const int Maxm=;
  30. struct Node{int l,r,u,v,id;}q[Maxm];
  31.  
  32. int n,m,s[Maxn],Block,Ans[Maxm],b[Maxn],B[Maxn];//Ans开Maxm
  33. inline int Get(int x) {return (x-)/Block+;}
  34. inline int Query(int x,int y)
  35. {
  36. int l=Get(x),r=Get(y),ret=;
  37. if (l==r)
  38. {
  39. for (int i=x;i<=y;i++) if (b[i]) ret++;
  40. return ret;
  41. }
  42. for (int i=l+;i<r;i++) ret+=B[i];
  43. for (int i=x;Get(i)==l;i++) if (b[i]) ret++;
  44. for (int i=y;Get(i)==r;i--) if (b[i]) ret++;
  45. return ret;
  46. }
  47. inline bool cmp(Node A,Node B)
  48. {
  49. if (Get(A.l)==Get(B.l)) return A.r<B.r;
  50. return Get(A.l)<Get(B.l);
  51. }
  52. inline void Del(int x)
  53. {if (b[s[x]]==) B[Get(s[x])]--; b[s[x]]--;}
  54. inline void Add(int x)
  55. {if (b[s[x]]==) B[Get(s[x])]++; b[s[x]]++;}
  56.  
  57. int main()
  58. {
  59. Get_Int(n),Get_Int(m); Block=(int)sqrt(n);
  60. for (int i=;i<=n;i++) Get_Int(s[i]);
  61. for (int i=;i<=m;i++)
  62. Get_Int(q[i].l),Get_Int(q[i].r),Get_Int(q[i].u),Get_Int(q[i].v),q[i].id=i;
  63. memset(b,,sizeof(b));
  64. memset(B,,sizeof(B));
  65. sort(q+,q+m+,cmp);
  66. int L=,R=;
  67.  
  68. for (int i=;i<=m;i++)
  69. {
  70. while (R<q[i].r) R++,Add(R);
  71. while (L>q[i].l) L--,Add(L);
  72. while (L<q[i].l) Del(L),L++;
  73. while (R>q[i].r) Del(R),R--;
  74. Ans[q[i].id]=Query(q[i].u,q[i].v);
  75. }
  76. for (int i=;i<=m;i++) Put_Int(Ans[i]);
  77. return ;
  78. }

分块 40s

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <queue>
  6. #include <vector>
  7. #include <cmath>
  8. #define pa pair<int,int>
  9. #define mp make_pair
  10. #define fi first
  11. #define se second
  12. #define pb push_back
  13. using namespace std;
  14. inline void Get_Int(int &x)
  15. {
  16. x=; char ch=getchar(); int f=;
  17. while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
  18. while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();} x*=f;
  19. }
  20. inline void Put_Int(int x)
  21. {
  22. char ch[]; int top=;
  23. if (x==) ch[++top]='';
  24. while (x) ch[++top]=x%+'',x/=;
  25. while (top) putchar(ch[top--]); putchar('\n');
  26. }
  27. //===================================================
  28. const int Maxn=;
  29. const int Maxm=;
  30. struct Node{int l,r,u,v,id;}q[Maxm];
  31.  
  32. int c[Maxn],n,m,s[Maxn],Block,Ans[Maxm],b[Maxn];//Ans开Maxm
  33. inline int lowbit(int x) {return x&(-x);}
  34. inline int Query(int x)
  35. {int ret=; for (int i=x;i;i-=lowbit(i)) ret+=c[i];return ret;}
  36. inline void Modify(int x,int v)
  37. {for (int i=x;i<=n;i+=lowbit(i)) c[i]+=v;}
  38. inline int Get(int x) {return (x-)/Block+;}
  39. inline bool cmp(Node A,Node B)
  40. {
  41. if (Get(A.l)==Get(B.l)) return A.r<B.r;
  42. return Get(A.l)<Get(B.l);
  43. }
  44. inline void Del(int x)
  45. {if (b[s[x]]==) Modify(s[x],-);b[s[x]]--;}
  46. inline void Add(int x)
  47. {if (b[s[x]]==) Modify(s[x],); b[s[x]]++;}
  48.  
  49. int main()
  50. {
  51. Get_Int(n),Get_Int(m); Block=(int)sqrt(n/);
  52. for (int i=;i<=n;i++) Get_Int(s[i]);
  53. for (int i=;i<=m;i++)
  54. Get_Int(q[i].l),Get_Int(q[i].r),Get_Int(q[i].u),Get_Int(q[i].v),q[i].id=i;
  55. memset(b,,sizeof(b));
  56. memset(c,,sizeof(c));
  57. sort(q+,q+m+,cmp);
  58. int L=,R=;
  59. for (int i=;i<=m;i++)
  60. {
  61. while (R<q[i].r) R++,Add(R);
  62. while (L>q[i].l) L--,Add(L);
  63. while (L<q[i].l) Del(L),L++;
  64. while (R>q[i].r) Del(R),R--;
  65. Ans[q[i].id]=Query(q[i].v)-Query(q[i].u-);
  66. }
  67. for (int i=;i<=m;i++) Put_Int(Ans[i]);
  68. return ;
  69. }

BIT 77s

对权值分块复杂度更优.

BZOJ 3809 莫队+(分块|BIT)的更多相关文章

  1. bzoj 3809 莫队

    收获: 1.分块时顺便记录每个位置所属的块,然后一次排序就OK了. 2.要权衡在“区间移动”与“查询结果”之间的时间,莫队算法一般区间移动频率远大于查询结果,所以我们选择的辅助数据结构时就要注意了,我 ...

  2. 莫队+分块 BZOJ 3809

    3809: Gty的二逼妹子序列 Time Limit: 80 Sec  Memory Limit: 28 MBSubmit: 1634  Solved: 482[Submit][Status][Di ...

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

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

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

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

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

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

  6. BZOJ_3585_mex && BZOJ_3339_Rmq Problem_莫队+分块

    BZOJ_3585_mex && BZOJ_3339_Rmq Problem_莫队+分块 Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一 ...

  7. 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 ...

  8. CFGym101138D Strange Queries 莫队/分块

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

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

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

随机推荐

  1. java 中继承,组合,重载,重写的实现原理 (转)

    我们知道,继承,组合,重载,重写是java语言的面向对象实现的基本特征. 那么在java内部,究竟是如何实现这些面对对象的基本特征的呢? 继承和组合是面向对象中代码复用的主要实现方式,他们可以达到类似 ...

  2. python(二)数据类型

    一.整数 创建方法 i = 10 i = int(10) i = int("10",base=2)  #“”中是几进制的表示,base是选择要表示的进制,如base=2,用2进制的 ...

  3. easyui combobox 带 checkbox

    $('#cc').combobox({ url:'combobox_data1.json', method:'get', valueField:'id', textField:'text', pane ...

  4. Flowplayer-Embedding

    SOURCE URL:https://flowplayer.org/docs/embedding.html Embedding Video embedding is an act where the ...

  5. 解决打开CHM文件后,右侧空白

    在网上下了一个chm的文件,打开后只有目录,右侧不显示内容. 不知道是文件有问题,还是系统有问题. <ignore_js_op> 右键点击文件–属性 看到 最下面有一个提示 说是这个文件是 ...

  6. spinner下拉框组件

    方法一代码如下: <string-array name="city_name"> <item>浙江</item> <item>上海& ...

  7. HDU-4522 湫湫系列故事——过年回家 最短路

    题意:很乱 分析:把数据处理下,dijkstra下就行了,floyd超时了,我还想着优化一下输入,因为使用了vector和string等等,但是计算数据规模后,处理输入的时间复杂度比floyd要低一个 ...

  8. Linux 监控文件被什么进程修改

    安装: apt-get install auditd. auditd 是后台守护进程,负责监控记录 auditctl 配置规则的工具 auditsearch 搜索查看 aureport 根据监控记录生 ...

  9. Cube Mapping

    Cube map技术说到底就是用一个虚拟的立方体(cube)包围住物体,眼睛到物体某处的向量eyevec经过反射(以该处的法线为对称轴),反射向量reflectvec射到立方体上,就在该立方体上获得一 ...

  10. CBUUID UUIDString unrecognized selector sent to instance 错误

    CBUUID UUIDString unrecognized selector sent to instance 错误 ios7.0,4s 蓝牙出现上述错误! 查看api可知,错误原因,由于CBUUI ...