【题目链接】

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

【算法】

如果不强制在线,显然莫队是可以解决此题的,那么,强制在线怎么办呢? 分块

将这个序列分成sqrt(n)段(sqrt表示开方),预处理每段每个数出现的次数与该段“多少数出现了正偶数次”,就可以在线回答询问了

【代码】

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = ;
  4. const int MAXB = ;
  5.  
  6. int i,n,m,c,l,r,x,y,len,block,lastans;
  7. int a[MAXN],belong[MAXN],cnt[MAXN],L[MAXB],R[MAXB];
  8. int sum[MAXB][MAXN],ans[MAXB][MAXB];
  9.  
  10. inline void init()
  11. {
  12. int i,j,k;
  13. len = (int)sqrt(n);
  14. block = n / len;
  15. for (i = ; i <= block; i++)
  16. {
  17. L[i] = (i - ) * len + ;
  18. R[i] = i * len;
  19. }
  20. if (R[block] < n)
  21. {
  22. block++;
  23. L[block] = R[block-] + ;
  24. R[block] = n;
  25. }
  26. for (i = ; i <= n; i++) belong[i] = (i - ) / len + ;
  27. for (i = ; i <= n; i++) sum[belong[i]][a[i]]++;
  28. for (i = ; i <= block; i++)
  29. {
  30. for (j = ; j <= c; j++)
  31. {
  32. sum[i][j] += sum[i-][j];
  33. }
  34. }
  35. for (i = ; i <= block; i++)
  36. {
  37. for (j = i; j <= block; j++)
  38. {
  39. ans[i][j] = ans[i][j-];
  40. for (k = L[j]; k <= R[j]; k++)
  41. {
  42. cnt[a[k]]++;
  43. if (cnt[a[k]] % == ) ans[i][j]++;
  44. else if (cnt[a[k]] > ) ans[i][j]--;
  45. }
  46. }
  47. for (j = L[i]; j <= n; j++) cnt[a[j]]--;
  48. }
  49. }
  50. inline int query(int l,int r)
  51. {
  52. int i,ret = ,t;
  53. int p = belong[l],
  54. q = belong[r];
  55. if (p == q)
  56. {
  57. for (i = l; i <= r; i++)
  58. {
  59. cnt[a[i]]++;
  60. if (cnt[a[i]] % == ) ret++;
  61. else if (cnt[a[i]] > ) ret--;
  62. }
  63. for (i = l; i <= r; i++) cnt[a[i]]--;
  64. return ret;
  65. } else
  66. {
  67. ret = ans[p+][q-];
  68. for (i = l; i <= R[p]; i++)
  69. {
  70. cnt[a[i]]++;
  71. t = sum[q-][a[i]] - sum[p][a[i]] + cnt[a[i]];
  72. if (t % == ) ret++;
  73. else if (t > ) ret--;
  74. }
  75. for (i = L[q]; i <= r; i++)
  76. {
  77. cnt[a[i]]++;
  78. t = sum[q-][a[i]] - sum[p][a[i]] + cnt[a[i]];
  79. if (t % == ) ret++;
  80. else if (t > ) ret--;
  81. }
  82. for (i = l; i <= R[p]; i++) cnt[a[i]]--;
  83. for (i = L[q]; i <= r; i++) cnt[a[i]]--;
  84. return ret;
  85. }
  86. }
  87.  
  88. int main()
  89. {
  90.  
  91. scanf("%d%d%d",&n,&c,&m);
  92. for (i = ; i <= n; i++) scanf("%d",&a[i]);
  93. init();
  94. lastans = ;
  95. for (i = ; i <= m; i++)
  96. {
  97. scanf("%d%d",&x,&y);
  98. l = (x + lastans) % n + ;
  99. r = (y + lastans) % n + ;
  100. if (l > r) swap(l,r);
  101. printf("%d\n",lastans = query(l,r));
  102. }
  103.  
  104. return ;
  105. }

【BZOJ 2821】作诗的更多相关文章

  1. BZOJ 2821: 作诗(Poetize)( 分块 )

    分块,分成N^0.5块.O(N^1.5)预处理出sm[i][j]表示前i块中j的出现次数, ans[i][j]表示第i~j块的答案. 然后就可以O(N^0.5)回答询问了.总复杂度O((N+Q)N^0 ...

  2. [BZOJ 2821] 作诗(Poetize) 【分块】

    题目链接:BZOJ - 2821 题目分析 因为强制在线了,所以无法用莫队..可以使用分块来做. 做法是,将 n 个数分成 n/x 个块,每个块大小为 x .先预处理出 f[i][j] ,表示从第 i ...

  3. [BZOJ 2821] 作诗

    Link: BZOJ 2821 传送门 Solution: 一道类似区间众数的经典分块 由于个数为偶数这样的条件不能支持快速合并 因此要先$O(n*sqrt(n))$预处理出$pre[i][j]$表示 ...

  4. bzoj 2821 作诗 分块

    基本思路和蒲公英一样 还是预处理出每两个块间的答案 询问时暴力跑两边的贡献 #include<cstdio> #include<cstring> #include<ios ...

  5. BZOJ 2821作诗(Poetize) 分块

    Description 有一个长度为n的序列,序列每个元素的范围[1,c],有m个询问x y,表示区间[x,y]中出现正偶数次的数的种类数. Solution 大力分块解决问题. 把序列分块,f[i] ...

  6. 2821: 作诗(Poetize)

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

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

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

  8. 作诗(bzoj 2821)

    Description 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗 之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次 ...

  9. BZOJ2821:作诗——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2821 问题描述 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好 ...

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

    Description 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次, ...

随机推荐

  1. SVO在ROS下的配置与运行

    最近在做实验的时候,需要配置SVO,下面讲讲其中的过程以及遇到的问题: 首先说明配置环境:Ubuntu 14.04 + ROS indigo,ROS的安装我参考了ROS的官网上给出的教程:http:/ ...

  2. linux install PyMsql

    # 安装pip curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py python get-pip.py # 安装PyMysql pip in ...

  3. 异步lambda表达式

  4. html+css布局整理笔记

    基本概念 布局模型 流动模型(Flow) 浮动模型(Float) 层模型(Layer) 流动模型 默认的网页布局模式,流动布局模型有两个比较典型的特征: 第一,块级元素都会在所处的包含元素内自上而下按 ...

  5. hdu3416 Marriage Match IV 最短路+ 最大流

    此题的大意:给定一幅有向图,求起点到终点(都是固定的)的不同的最短路有多少条.不同的最短路是说不能有相同的边,顶点可以重复.并且图含有平行边. 看了题以后,就想到暴力,但是暴力往往是不可取的.(暴力的 ...

  6. 经典C/S服务器模型之守护进程

    linux编程-守护进程编写 守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种很有用的进程. Linux的大多数服务 ...

  7. VTK+MFC 系列教程 非常强大

    虽然QT才是王道!MFC的懂一些也是好的. 原文链接:http://blog.csdn.net/www_doling_net/article/details/8939115 之前介绍了基于VTK的单文 ...

  8. facebook atc弱网环境搭建和踩坑总结

    facebook atc介绍 Augmented Traffic Control(又名atc)是一种模拟网络状况的工具.由facebook开源,是一个允许开发人员控制设备与互联网连接的项目.atc可以 ...

  9. Ad_hoc_polymorphism 备份

    https://en.wikipedia.org/wiki/Polymorphism_(computer_science) https://en.wikipedia.org/wiki/Ad_hoc_p ...

  10. ZBrush中如何将一个模型应用在不同的图层

    我们经常会使用ZBrush®中的插入笔刷来实现快速建模,或者使用Insert笔刷创建人物四肢,那么在使用这些笔刷时,它默认是和所接触模型同在一个Subtool,如果您需要不同的材质或者雕刻手法,那么就 ...