*题目描述:
神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗。由于时间紧迫,SHY作完诗
之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次,每次只阅读其中连续的一段[l,r],从这一段中选出一
些汉字构成诗。因为SHY喜欢对偶,所以SHY规定最后选出的每个汉字都必须在[l,r]里出现了正偶数次。而且SHY认
为选出的汉字的种类数(两个一样的汉字称为同一种)越多越好(为了拿到更多的素材!)。于是SHY请LYD安排选
法。LYD这种傻×当然不会了,于是向你请教……问题简述:N个数,M组询问,每次问[l,r]中有多少个数出现正偶
数次。
*输入:
输入第一行三个整数n、c以及m。表示文章字数、汉字的种类数、要选择M次。第二行有n个整数,每个数Ai在[1, c
]间,代表一个编码为Ai的汉字。接下来m行每行两个整数l和r,设上一个询问的答案为ans(第一个询问时ans=0),
令L=(l+ans)mod n+1, R=(r+ans)mod n+1,若L>R,交换L和R,则本次询问为[L,R]。
*输出:
输出共m行,每行一个整数,第i个数表示SHY第i次能选出的汉字的最多种类数。
*样例输入:
5 3 5
1 2 2 3 1
0 4
1 2
2 2
2 3
3 5
*样例输出:
2
0
0
0
1
*提示:
对于100%的数据,1<=n,c,m<=10^5
*题解:
和区间众数一样地做。统计答案的时候就是看区间内出现了多少次,如果是奇数且大于1,那么答案-1,如果是偶数答案+1. (这题貌似有点卡内存,我sqrt的块被卡MLE了,变3倍就ac了,然而跑得巨慢)
*代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <cmath>
  5. #ifdef WIN32
  6. #define LL "%I64d"
  7. #else
  8. #define LL "%lld"
  9. #endif
  10. #ifdef CT
  11. #define debug(...) printf(__VA_ARGS__)
  12. #define setfile()
  13. #else
  14. #define debug(...)
  15. #define filename ""
  16. #define setfile() freopen(filename".in", "r", stdin); freopen(filename".out", "w", stdout);
  17. #endif
  18. #define R register
  19. #define getc() (S == T && (T = (S = B) + fread(B, 1, 1 << 15, stdin), S == T) ? EOF : *S++)
  20. #define dmax(_a, _b) ((_a) > (_b) ? (_a) : (_b))
  21. #define dmin(_a, _b) ((_a) < (_b) ? (_a) : (_b))
  22. #define cmax(_a, _b) (_a < (_b) ? _a = (_b) : 0)
  23. #define cmin(_a, _b) (_a > (_b) ? _a = (_b) : 0)
  24. char B[1 << 15], *S = B, *T = B;
  25. inline int FastIn()
  26. {
  27. R char ch; R int cnt = 0; R bool minus = 0;
  28. while (ch = getc(), (ch < '0' || ch > '9') && ch != '-') ;
  29. ch == '-' ? minus = 1 : cnt = ch - '0';
  30. while (ch = getc(), ch >= '0' && ch <= '9') cnt = cnt * 10 + ch - '0';
  31. return minus ? -cnt : cnt;
  32. }
  33. #define maxn 100010
  34. #define maxc 300
  35. int Ans[maxc][maxc], Cnt[maxc][maxn], a[maxn], id[maxn], block, num, ans;
  36. int cnt[maxn];
  37. int main()
  38. {
  39. // setfile();
  40. R int n = FastIn(), c = FastIn(), m = FastIn();
  41. block = sqrt(n) * 3; num = (n - 1) / block;
  42. for (R int i = 0; i < n; ++i)
  43. {
  44. a[i] = FastIn();
  45. id[i] = i / block;
  46. }
  47. for (R int i = 0; i <= num; ++i)
  48. for (R int j = 0; j < (i + 1) * block; ++j)
  49. ++Cnt[i][a[j]];
  50. for (R int i = 0; i <= num; ++i)
  51. {
  52. ans = 0;
  53. for (R int j = i; j <= num; ++j)
  54. {
  55. for (R int k = j * block; k < (j + 1) * block; ++k)
  56. (++cnt[a[k]] & 1) && cnt[a[k]] > 1
  57. ? --ans
  58. : ~cnt[a[k]] & 1
  59. ? ++ans
  60. : 0;
  61. Ans[i][j] = ans;
  62. }
  63. memset(cnt, 0, sizeof(cnt));
  64. }
  65. ans = 0;
  66. for (; m; --m)
  67. {
  68. R int ql = (FastIn() + ans) % n, qr = (FastIn() + ans) % n;
  69. if (ql > qr) std::swap(ql, qr);
  70. if (id[ql] == id[qr])
  71. {
  72. ans = 0;
  73. for (R int i = ql; i <= qr; ++i)
  74. (++cnt[a[i]] & 1) && cnt[a[i]] > 1
  75. ? --ans
  76. : ~cnt[a[i]] & 1
  77. ? ++ans
  78. : 0;
  79. for (R int i = ql; i <= qr; ++i) cnt[a[i]] = 0;
  80. }
  81. else
  82. {
  83. R int l = id[ql] + 1, r = id[qr] - 1;
  84. ans = Ans[l][r];
  85. for (R int i = ql; i < l * block; ++i)
  86. {
  87. R int tmp = ++cnt[a[i]] + Cnt[r][a[i]] - Cnt[l - 1][a[i]];
  88. (tmp & 1) && tmp > 1
  89. ? --ans
  90. : ~tmp & 1
  91. ? ++ans
  92. : 0;
  93. }
  94. for (R int i = id[qr] * block; i <= qr; ++i)
  95. {
  96. R int tmp = ++cnt[a[i]] + Cnt[r][a[i]] - Cnt[l - 1][a[i]];
  97. (tmp & 1) && tmp > 1
  98. ? --ans
  99. : ~tmp & 1
  100. ? ++ans
  101. : 0;
  102. }
  103. for (R int i = ql; i < l * block; ++i) cnt[a[i]] = 0;
  104. for (R int i = id[qr] * block; i <= qr; ++i) cnt[a[i]] = 0;
  105. }
  106. printf("%d\n", ans );
  107. }
  108. return 0;
  109. }

【bzoj2821】作诗(Poetize)的更多相关文章

  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: 作诗(Poetize)

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

  5. BZOJ2821 作诗(Poetize) 分块

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

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

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

  7. 2821: 作诗(Poetize)

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

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

  9. BZOJ_2821_作诗(Poetize)_分块

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

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

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

随机推荐

  1. 【HBase】四、HBase的安装及命令行接口

      通过前面的介绍,对HBase数据模型,运行机制等理论基本了解,接下来从实践的角度介绍HBase的安装以及其各种接口的使用方法. 1.HBase的安装   HBase安装很简单,和所有的Hadoop ...

  2. Redis为什么不能使用一主一从哨兵

    哨兵机制 识别挂掉的主节点 quorum(法定人数) 是判定主节点不能访问所需要的最少哨兵数量 执行失效备援perform a failover 其中一个哨兵需要被选为救援的领导,并被授权执行救援,而 ...

  3. uwsgi + nginx 部署python项目(二)

    实现负载均衡 开启两个服务器,nginx负责分发请求到两个服务器,以减轻单个服务器负担. 配置uwsgi服务器 在a项目目录下生成uwsgi.ini文件,在b项目目录下生成uwsgi.ini文件,如何 ...

  4. Springboot2.x集成Redis集群模式

    Springboot2.x集成Redis集群模式 说明 Redis集群模式是Redis高可用方案的一种实现方式,通过集群模式可以实现Redis数据多处存储,以及自动的故障转移.如果想了解更多集群模式的 ...

  5. 路由器桥接时,为什么要关闭 DHCP 服务器?

    问:看网上的一些教程,路由器设置无线桥接的时候,副路由器中的 DHCP 服务器需要关闭,请问这是为什么? 答:两个路由器无线桥接时,之所以要关闭副路由器的 DHCP 服务器,是为了避免 IP 地址错误 ...

  6. ubutu16.04编译安装apache

    // 安装编译器 sudo apt-get install build-essential // 下载所需依赖及apache2源码包 wget --no-check-certificate https ...

  7. Windows 运行时加载动态库

    下面是一个运行时加载nvcuda.dll,并检测当前驱动版本最大支持的CUDA版本的例子. #include "cuda.h" #include <stdio.h> # ...

  8. POJ 3135 Polygons on the Grid(枚举+凸包)

    题目大意是让你用这n条边放在网格上构成凸包,并且边的两端点必须在网格上. 那么比较容易想到的就是枚举可能情况,因为这样的勾股数组成情况不多,因此可以直接枚举所有连出去的边反映在坐标轴上的所有情况,最后 ...

  9. 获取IP地址的几种方法

    根据ip获取地址的几种方法 1.调用新浪IP地址库 <script type="text/javascript" src="js/jquery.js"&g ...

  10. python3使用hashlib进行加密

    hashlib是个专门提供hash算法的库,里面包括md5, sha1, sha224, sha256, sha384, sha512,使用非常简单.方便. MD5 MD5的全称是Message-Di ...