http://www.lydsy.com/JudgeOnline/problem.php?id=2821

分块

我们把数列分成$\sqrt{N}$块

记$f[i][j]$表示第i块到第j块的答案,这个可以在$O(N\sqrt{N})$内得到。

记$g[i][j]$第1到第i块中数字j出现了多少次,这个我们可以先求出第i块中数字j出现了多少次,然后求前缀和即可,这个可以在$O(C\sqrt{N})$内得到。

对于询问区间[l,r]我们可以从f数组中快速求出中间连续的完整的块答案。

对于剩余部分,我们可以一个一个调整答案,反正剩余部分的长度是$\sqrt{N}$级别的。

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<iostream>
  4. #include<fstream>
  5. #include<algorithm>
  6. #include<cstring>
  7. #include<string>
  8. #include<cmath>
  9. #include<queue>
  10. #include<stack>
  11. #include<map>
  12. #include<utility>
  13. #include<set>
  14. #include<bitset>
  15. #include<vector>
  16. #include<functional>
  17. #include<deque>
  18. #include<cctype>
  19. #include<climits>
  20. #include<complex>
  21. //#include<bits/stdc++.h>适用于CF,UOJ,但不适用于poj
  22.  
  23. using namespace std;
  24.  
  25. typedef long long LL;
  26. typedef double DB;
  27. typedef pair<int,int> PII;
  28. typedef complex<DB> CP;
  29.  
  30. #define mmst(a,v) memset(a,v,sizeof(a))
  31. #define mmcy(a,b) memcpy(a,b,sizeof(a))
  32. #define fill(a,l,r,v) fill(a+l,a+r+1,v)
  33. #define re(i,a,b) for(i=(a);i<=(b);i++)
  34. #define red(i,a,b) for(i=(a);i>=(b);i--)
  35. #define ire(i,x) for(typedef(x.begin()) i=x.begin();i!=x.end();i++)
  36. #define fi first
  37. #define se second
  38. #define m_p(a,b) make_pair(a,b)
  39. #define p_b(a) push_back(a)
  40. #define SF scanf
  41. #define PF printf
  42. #define two(k) (1<<(k))
  43.  
  44. template<class T>inline T sqr(T x){return x*x;}
  45. template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
  46. template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;}
  47.  
  48. const DB EPS=1e-;
  49. inline int sgn(DB x){if(abs(x)<EPS)return ;return(x>)?:-;}
  50. const DB Pi=acos(-1.0);
  51.  
  52. inline int gint()
  53. {
  54. int res=;bool neg=;char z;
  55. for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
  56. if(z==EOF)return ;
  57. if(z=='-'){neg=;z=getchar();}
  58. for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
  59. return (neg)?-res:res;
  60. }
  61. inline LL gll()
  62. {
  63. LL res=;bool neg=;char z;
  64. for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
  65. if(z==EOF)return ;
  66. if(z=='-'){neg=;z=getchar();}
  67. for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
  68. return (neg)?-res:res;
  69. }
  70.  
  71. const int maxN=;
  72. const int maxC=;
  73. const int maxcnt=;
  74.  
  75. int N,C,Q;
  76. int a[maxN+];
  77. int cnt,len,l[maxcnt+],r[maxcnt+];
  78. int id[maxN+];
  79. int f[maxcnt+][maxcnt+];
  80. int g[maxcnt+][maxC+];
  81. int t[maxC+];
  82. int ans;
  83.  
  84. int main()
  85. {
  86. freopen("bzoj2821.in","r",stdin);
  87. freopen("bzoj2821.out","w",stdout);
  88. int i,j,k;
  89. N=gint();C=gint();Q=gint();
  90. re(i,,N)a[i]=gint();
  91. len=int(sqrt(DB(N)));
  92. re(i,,N)
  93. {
  94. if((i-)%len==)r[cnt]=i-,l[++cnt]=i;
  95. id[i]=cnt;
  96. }
  97. r[cnt]=N;
  98. re(i,,cnt)
  99. {
  100. int res=;
  101. re(j,i,cnt)
  102. {
  103. re(k,l[j],r[j])
  104. {
  105. t[a[k]]++;
  106. if(t[a[k]]>= && !(t[a[k]]&))res++;
  107. if(t[a[k]]>= && (t[a[k]]&))res--;
  108. }
  109. f[i][j]=res;
  110. }
  111. re(k,l[i],N)t[a[k]]--;
  112. }
  113. re(i,,cnt)re(j,l[i],r[i])g[i][a[j]]++;
  114. re(i,,cnt)re(j,,C)g[i][j]+=g[i-][j];
  115. ans=;
  116. while(Q--)
  117. {
  118. int L=(gint()+ans)%N+,R=(gint()+ans)%N+,res=;
  119. if(L>R)swap(L,R);
  120. if(id[L]==id[R] || id[L]+==id[R])
  121. {
  122. re(i,L,R)
  123. {
  124. t[a[i]]++;
  125. if(t[a[i]]>= && !(t[a[i]]&))res++;
  126. if(t[a[i]]>= && (t[a[i]]&))res--;
  127. }
  128. re(i,L,R)t[a[i]]--;
  129. ans=res;
  130. }
  131. else
  132. {
  133. int p=(L==l[id[L]])?id[L]:id[L]+,q=(R==r[id[R]])?id[R]:id[R]-;
  134. res=f[p][q];
  135. red(i,l[p]-,L)
  136. {
  137. t[a[i]]++;
  138. t[a[i]]+=g[q][a[i]]-g[p-][a[i]];
  139. if(t[a[i]]>= && !(t[a[i]]&))res++;
  140. if(t[a[i]]>= && (t[a[i]]&))res--;
  141. t[a[i]]-=g[q][a[i]]-g[p-][a[i]];
  142. }
  143. re(i,r[q]+,R)
  144. {
  145. t[a[i]]++;
  146. t[a[i]]+=g[q][a[i]]-g[p-][a[i]];
  147. if(t[a[i]]>= && !(t[a[i]]&))res++;
  148. if(t[a[i]]>= && (t[a[i]]&))res--;
  149. t[a[i]]-=g[q][a[i]]-g[p-][a[i]];
  150. }
  151. red(i,l[p]-,L)t[a[i]]--;
  152. re(i,r[q]+,R)t[a[i]]--;
  153. ans=res;
  154. }
  155. PF("%d\n",ans);
  156. }
  157. return ;
  158. }

bzoj2821作诗的更多相关文章

  1. BZOJ2821 作诗(Poetize) 【分块】

    BZOJ2821 作诗(Poetize) Description 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好是作诗. 由于时间紧迫,SHY作完诗之后还要虐OI ...

  2. 【分块】BZOJ2821 作诗(Poetize)

    2821: 作诗(Poetize) Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 3265  Solved: 951[Submit][Status][ ...

  3. BZOJ2821 作诗(Poetize) 主席树 bitset

    原文链接https://www.lydsy.com/JudgeOnline/problem.php?id=2821 题目传送门 - BZOJ2821 题意 $n$ 个数,$m$ 组询问,每次问 $[l ...

  4. BZOJ2821 作诗(分块)

    和区间众数几乎一模一样的套路. // luogu-judger-enable-o2 #include<iostream> #include<cstdio> #include&l ...

  5. bzoj2821: 作诗(Poetize)

    分块 分sqrt(n)块 F[i][j]表示块i到块j的答案 s[i][j]表示数字i在前j块内出现了几次 #include <iostream> #include <cstdio& ...

  6. BZOJ2821 作诗(Poetize) 分块

    题意 算法 经验总结 代码 题意 不带修改,查询数列[1,n]中[l,r]内的出现正偶数次的数的个数, 数列中的数 <= 1e5, n <= 1e5, 强制在线 算法 ​ 查询的内容: 区 ...

  7. 2018.09.30 bzoj2821: 作诗(Poetize)(分块)

    传送门 分块经典题目. 先将数列分块. 然后预处理出每两个块之间有多少个数出现了正偶数次. 这样查询的时候对于中间的完整块直接用预处理出的数组搞定. 剩下的暴力枚举求解. 代码: #include&l ...

  8. [BZOJ2821]作诗

    description 在线询问区间内出现次数为正偶数的数的种数. data range \[n,m\le 10^5\] solution 分块大法好 首先离散化权值 这种对于权值做询问并且询问放在一 ...

  9. [BZOJ2821]作诗(分块)

    题意 N个数,M组询问,每次问[l,r]中有多少个数出现正偶数次对于100%的数据,1≤n,c,m≤105 题解 (传说lyd省选的时候看错题   把题看成这个了   从此又多了一道分块神题)把N个数 ...

随机推荐

  1. win8.1 Dism 应用实例

    使用win8.1安装镜像制作wimboot启动 制作wim启动映像文件 Dism /Export-Image /WIMBoot/SourceImageFile:z:\sources\install.w ...

  2. Com原理及應用——Com對象和接口

    1.COM对象的理解 COM对象类似于C++语言中类的概念,类的每个实例代表一个COM对象,它也包括属性(即状态)和方法(即操作),状态反映对象的存在,方法就是接口. 2.COM对象的标识-CLSID ...

  3. Java 编程的动态性,第3部分: 应用反射--转载

    在 上个月的文章中,我介绍了Java Reflection API,并简要地讲述了它的一些基本功能.我还仔细研究了反射的性能,并且在文章的最后给出了一些指导方针,告诉读者在一个应用程序中何时应该使用反 ...

  4. Linux驱动开发cdev驱动分层设计

    #ifndef MYDEV_H #define MYDEV_H #define DYNAMIC_MINOR 256 struct mydev{ const char *name; const stru ...

  5. 【酷Q插件制作】教大家做一个简单的签到插件

    酷Q插件已经有很多了,社区分享一大堆,不过还是自己写才有乐趣,哈哈.不得不吐槽一下,酷Q竟然不更新了,出了个酷Q pro,还收费!!诶.不过这也影响不了咱写插件的心情,今天教大家写一个酷Q签到插件,虽 ...

  6. Android项目中如何用好构建神器Gradle?(转)

    最近在忙团队并行开发的事情,主要是将各个团队的代码分库,一方面可以降低耦合,为后面模块插件化做铺垫,另一方面采用二进制编译,可以加快编译速度.分库遇到了一些问题,很多都要通过Gradle脚本解决,所以 ...

  7. 应用框架 ViewPager Tab Fragment SlidingMenu

    介绍 常见的应用框架 框架一:多个tab+Fragment,点击不同的tab加载不同的Fragment,不能滑动切换只能点击切换: 框架二:多个tab+ViewPager+FragmentPagerA ...

  8. (转)Web Service入门简介(一个简单的WebService示例)

    Web Service入门简介 一.Web Service简介 1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从I ...

  9. Session深度探索

    什么是Session? web是无状态,这意味着每次页面被回传到服务器时,都重新生成一个web页面类的一个新的实例.众所周知http时无状态的协议.它不能获得客户端的信息.如果用户录入了一些信息,当跳 ...

  10. [php基础]PHP.INI配置:文件上传功能配置教程

    昨天分享了在PHP网站开发中如何在php.ini中配置实现session功能的PHP教程,今天继续分享在利用PHP实现文件上传功能时几点关键php.ini的配置. 说到在php.ini中的文件上传的配 ...