【题目链接】

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. Solr快速入门(一)

    概述 本文档介绍了如何获取和运行Solr,将各种数据源收集到多个集合中,以及了解Solr管理和搜索界面. 首先解压缩Solr版本并将工作目录更改为安装Solr的子目录.请注意,基本目录名称可能随Sol ...

  2. SqlServer显示“正在还原...”

    还原数据库时,提示还原成功,但是数据库一直显示“正在还原...”的状态. 可以通过执行以下命令即可 RESTORE DATABASE DB_NAME WITH RECOVERY 原因: 关于recov ...

  3. 用 Swift 开发一个 TODO 应用

    背景 相信不少 iOS 程序员对于 Swift 依旧持以观望的态度,一来是这小家伙刚出来没几天,本身还处于完善的阶段:二来是学习的成本较高,看完官方文档怎么也要个几天的时间:三来是反正最近几年很难在工 ...

  4. 利用a链接发送电子邮件

    实例代码: <a href="mailto:name1@rapidtables.com?cc=name2@rapidtables.com&subject=你好%20我是&quo ...

  5. 第五周课后作业——适用于人工智能的visual studio 的创新分析

    个人觉得作业布置的(2)(3)(4)(5)的顺序并不合理,我将以(5)(2)(3)(4)的顺序开展我的分析. 创新的定义是做出一些改变或创造出新的东西,既是过程,也是结果.这是一个很泛的概念,所以去问 ...

  6. Module, Package in Python

    1.To put it simple, Module是写好的一系列函数或变量,文件以.py为后缀,可以在其他Module中整体或部分引用. PS: 在Module中[结尾或开头]加入if __name ...

  7. python 编码问题解决方案

    1.UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128) ...

  8. root密码忘记怎么办?

    忘记root密码:按 e进入内核在按e,后面加1 .按b启动 进入命令行输入passwd,设置新的密码后exit退出即可

  9. Windows平台上使用ANT编译Hadoop Eclipse Plugin

    一.准备工作:   1.安装JDK 下载页面:http://www.oracle.com/technetwork/java/javase/downloads/index.html JDK6,JDK7都 ...

  10. RxSwift學習教程之基礎篇

    前言 我們在 iOS 開發過程中,幾乎無時無刻都要面對異步事件的處理.例如,按鍵點擊.數據保存..音頻後臺播放.交互動畫展示.這些事件並不具備特定時序性,甚至它們可能同時發生. 雖然 Apple 提供 ...