Description

神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗。由于时间紧迫,SHY作完诗
之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次,每次只阅读其中连续的一段[l,r],从这一段中选出一
些汉字构成诗。因为SHY喜欢对偶,所以SHY规定最后选出的每个汉字都必须在[l,r]里出现了正偶数次。而且SHY认
为选出的汉字的种类数(两个一样的汉字称为同一种)越多越好(为了拿到更多的素材!)。于是SHY请LYD安排选
法。LYD这种傻×当然不会了,于是向你请教……问题简述:N个数,M组询问,每次问[l,r]中有多少个数出现正偶
数次。

Input

输入第一行三个整数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]。

Output

输出共m行,每行一个整数,第i个数表示SHY第i次能选出的汉字的最多种类数。

Sample Input

5 3 5
1 2 2 3 1
0 4
1 2
2 2
2 3
3 5

Sample Output

2
0
0
0
1

HINT

对于100%的数据,1<=n,c,m<=10^5

  1. /*
  2. 分块
  3. 对于每次询问,我们可以先得到所有的整块中偶数的数的个数(可以预处理),对于不完整的,扫一遍,
  4. 得到每个数的个数,然后通过二分查找他们在(x,y)中出现的次数就可以判定了。
  5. 但是分块方式特别不清真,每块大小sqrt(n/logn),因为每次询问都要二分,复杂度最多可达logn,所以
  6. 要这样分块。
  7. 这里说一下,我测的极端数据,按照sqrt(n)来分块要跑8s+,按照这道题的分块方法,只需3s+。
  8. */
  9. #include<cstdio>
  10. #include<iostream>
  11. #include<vector>
  12. #include<cmath>
  13. #include<cstring>
  14. #include<algorithm>
  15. #define N 100010
  16. #define M 3010
  17. using namespace std;
  18. int a[N],bl[N],f[M][M],n,c,m,cnt[N],q[N],len;
  19. vector<int> ve[N];
  20. void init(int s){
  21. memset(cnt,,sizeof(cnt));
  22. int tot=;
  23. for(int i=(s-)*len+;i<=n;i++){
  24. cnt[a[i]]++;
  25. if(cnt[a[i]]%==&&cnt[a[i]]!=) tot--;
  26. if(cnt[a[i]]%==) tot++;
  27. f[s][bl[i]]=tot;
  28. }
  29. }
  30. int querysum(int x,int y,int v){
  31. return upper_bound(ve[v].begin(),ve[v].end(),y)-lower_bound(ve[v].begin(),ve[v].end(),x);
  32. }
  33. int query(int x,int y){
  34. //memset(cnt,0,sizeof(cnt));
  35. int ans=f[bl[x]+][bl[y]-];
  36. int tot=;
  37. for(int i=x;i<=min(bl[x]*len,y);i++){
  38. if(!cnt[a[i]]) q[++tot]=a[i];
  39. cnt[a[i]]++;
  40. }
  41. if(bl[x]!=bl[y])
  42. for(int i=(bl[y]-)*len+;i<=y;i++){
  43. if(!cnt[a[i]]) q[++tot]=a[i];
  44. cnt[a[i]]++;
  45. }
  46. for(int i=;i<=tot;i++){
  47. int sum=querysum(x,y,q[i]),sum1=sum-cnt[q[i]],sum2=cnt[q[i]];
  48. if(sum1&){
  49. if(sum2&) ans++;
  50. }
  51. else if(sum1){
  52. if(sum2&) ans--;
  53. }
  54. else {
  55. if(!(sum2&)) ans++;
  56. }
  57. }
  58. for(int i=x;i<=min(bl[x]*len,y);i++) cnt[a[i]]=;
  59. for(int i=(bl[y]-)*len+;i<=y;i++) cnt[a[i]]=;
  60. return ans;
  61. }
  62. int main(){
  63. scanf("%d%d%d",&n,&c,&m);
  64. //len=sqrt(n);
  65. len=sqrt((double)n/log((double)n)*log());
  66. for(int i=;i<=n;i++){
  67. scanf("%d",&a[i]);
  68. bl[i]=(i-)/len+;
  69. ve[a[i]].push_back(i);
  70. }
  71. for(int i=;i<=bl[n];i++)
  72. init(i);
  73. int ans=;
  74. memset(cnt,,sizeof(cnt));
  75. for(int i=;i<=m;i++){
  76. int x,y;scanf("%d%d",&x,&y);
  77. x=(x+ans)%n+;y=(y+ans)%n+;
  78. if(x>y) swap(x,y);
  79. ans=query(x,y);
  80. printf("%d\n",ans);
  81. }
  82. return ;
  83. }

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

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

  5. BZOJ2821:作诗——题解

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

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

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

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

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

  8. 做10年Windows程序员与做10年Linux程序员的区别(附无数评论)(开源软件相当于熟读唐诗三百首,不会作诗也会吟)

    如果一个程序员从来没有在linux,unix下开发过程序,一直在windows下面开发程序, 同样是工作10年, 大部分情况下与在linux,unix下面开发10年的程序员水平会差别很大.我写这篇文章 ...

  9. [Luogu 4135] 作诗

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

随机推荐

  1. HTTPs与HTTP的性能

    (参考:https://blog.csdn.net/chinafire525/article/details/78911734 https://blog.csdn.net/hherima/articl ...

  2. fgetc, fgets, getc, getchar, gets, ungetc - 输入字符和字符串

    总览 (SYNOPSIS) #include <stdio.h> int fgetc(FILE *stream); char *fgets(char *s, int size, FILE ...

  3. Asp.Net Core 进阶(一) —— 读取appsettings.json

    我们以前在Asp.Net MVC中使用 System.Configuration.ConfigurationManager 来读取web.config文件.但是Asp.Net Core MVC已经没有 ...

  4. ssh的server安装和安装指定版本的软件的方法

    ssh程序分为有客户端程序openssh-client和服务端程序openssh-server.如果需要ssh登陆到别的电脑,需要安装openssh-client,该程序ubuntu是默认安装的.而如 ...

  5. Django-C002-深入模型,到底有多深

    此文章完成度[100%]留着以后忘记的回顾.多写多练多思考,我会努力写出有意思的demo,如果知识点有错误.误导,欢迎大家在评论处写下你的感想或者纠错. ORM介绍:对象关系映射(英语:(Object ...

  6. 初涉树形dp

    算是一个……复习以及进阶? 什么是树形dp 树形dp是一种奇妙的dp…… 它的一个重要拓展是和各种树形的数据结构结合,比如说在trie上.自动机上的dp. 而且有些时候还可以拓展到环加外向树.仙人掌上 ...

  7. Git学习——版本切换

    版本回退 回退到前面几个版本的命令如下: git reset --hard HEAD^ //回退到前一个版本 git reset --hard HEAD^^ //回退到前前一个版本 git reset ...

  8. 【php】 检测 ie ie11 edge浏览器

    来源 php.net 官网评论截取 -- Declan kelly Please note that Internet Explorer 11 no longer contains MSIE in i ...

  9. leepcode(斐波那契数列与float("inf")无穷大)解析

    12.加一 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示例 ...

  10. Beautiful Soup 4.2.0 doc_tag、Name、Attributes、多值属性

    找到了bs4的中文文档,对昨天爬虫程序里所涉及的bs4库进行学习.这篇代码涉及到tag.Name.Attributes以及多值属性. ''' 对象的种类 Beautiful Soup将复杂HTML文档 ...