BZOJ2821 作诗(Poetize)


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


分块嘛

然后思路很显然

根那个BZOJ2724 蒲公英 【分块】其实差不多,然后我也不知道为什么常数老是卡不过去,最后想尽各种办法卡了过去

首先我们可以处理出一个区间内每一种的个数和区间内的众数,可以O(nsqrt(n))" role="presentation">O(nsqrt(n))O(nsqrt(n))时间内预处理出来

然后对于询问暴力枚举两边的不完整块就行了


#include<bits/stdc++.h>
using namespace std;
int read(){
int ans=0,w=1;char c=getchar();
while(!isdigit(c)&&c!='-')c=getchar();
if(c=='-')c=getchar(),w=-1;
while(isdigit(c))ans=(ans<<1)+(ans<<3)+c-'0',c=getchar();
return ans*w;
}
#define N 100001
#define M 321
int n,c,m,siz,block_sum,lastans=0;
int a[N],block[N],t[N],L[M],R[M];
int cnt[N][M],ans[M][M];
void init(){
siz=sqrt(n);
block_sum=(n-1)/siz+1;
for(int i=1;i<=n;i++)block[i]=(i-1)/siz+1;
for(int i=1;i<=block_sum;++i){
L[i]=R[i-1]+1;
R[i]=i*siz;
}R[block_sum]=n;
for(int i=1;i<=n;++i)++cnt[a[i]][block[i]];
for(int i=1;i<=c;++i)
for(int j=1;j<=block_sum;++j)
cnt[i][j]+=cnt[i][j-1];
for(int i=1;i<=block_sum;++i){
int res=0;
for(int j=i;j<=block_sum;++j){
for(int k=L[j];k<=R[j];++k)
if(++t[a[k]]>=2)res+=(t[a[k]]&1)?-1:1;
ans[i][j]=res;
}
for(int j=L[i];j<=n;++j)t[a[j]]--;
}
}
inline int solve(int l,int r){
if(block[r]-block[l]<2){
int res=0;
for(int i=l;i<=r;++i)
if(++t[a[i]]>=2)res+=(t[a[i]]&1)?-1:1;
for(int i=l;i<=r;++i)t[a[i]]--;
return res;
}
//排除边界情况
int pl=block[l]+(l!=L[block[l]]),ll=L[pl]-1;
int pr=block[r]-(r!=R[block[r]]),rr=R[pr]+1;
int res=ans[pl][pr];
for(int i=l;i<=ll;++i){
int tmp=cnt[a[i]][pr]-cnt[a[i]][pl-1];
t[a[i]]+=tmp;
if(++t[a[i]]>=2)res+=(t[a[i]]&1)?-1:1;
t[a[i]]-=tmp;
}
for(int i=rr;i<=r;++i){
int tmp=cnt[a[i]][pr]-cnt[a[i]][pl-1];
t[a[i]]+=tmp;
if(++t[a[i]]>=2)res+=(t[a[i]]&1)?-1:1;
t[a[i]]-=tmp;
}
for(int i=l;i<=ll;++i)t[a[i]]--;
for(int i=rr;i<=r;++i)t[a[i]]--;
return res;
}
int main(){
n=read();c=read();m=read();
for(int i=1;i<=n;++i)a[i]=read();
init();
for(int i=1;i<=m;++i){
int l=read(),r=read();
l=(l+lastans)%n+1;
r=(r+lastans)%n+1;
if(l>r)swap(l,r);
printf("%d\n",lastans=solve(l,r));
}
return 0;
}

BZOJ2821 作诗(Poetize) 【分块】的更多相关文章

  1. BZOJ2821 作诗(Poetize) 分块

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

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

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

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

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

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

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

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

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

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

  7. bzoj2821: 作诗(Poetize)

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

  8. BZOJ2821 作诗(分块)

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

  9. BZOJ 2821作诗(Poetize) 分块

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

随机推荐

  1. ABP 源码分析汇总之 IOC

    IOC的优点: 1. 依赖接口,而非实现,如下代码, 这样的好处就是,客户端根本不知道PersonService的存在,如果我们换一下IPersonService的实现,客户端不用任何修改, 说的简单 ...

  2. DLL注入之SHELLCODE数据转换

    #include "stdafx.h" #include <stdio.h> #include <string.h> #include <conio. ...

  3. vc 导出函数/调用

    loader(exe): #include "stdafx.h" #include <Windows.h> #include <stdio.h> #defi ...

  4. Dive into Spring framework -- 了解基本原理(二)--设计模式-part1

    比较巧,自己在接触设计模式的时候,也刚开始学习spring,但可惜的是,真的仅仅在学习“用”spring,每天都沉浸在会痛快的完成spring各种配置的快乐之中,但对成长无用.其实当初就清楚,spri ...

  5. 修改sublime侧边栏的颜色

    Ctrl+Shift+P -> install -> 搜索安装包SyncedSidebarBg,自动同步侧边栏底色为编辑窗口底色.

  6. PowerDesigner中NAME和COMMENT的互相转换

    原文: http://www.cnblogs.com/yelaiju/archive/2013/04/26/3044828.html 由于PDM 的表中 Name 会默认=Code 所以很不方便, 所 ...

  7. IIS优化整理

    IIS 之 在IIS7.IIS7.5中应用程序池最优配置方案 找到Web站点对应的应用程序池,“应用程序池” → 找到对应的“应用程序池” → 右键“高级设置...” 一.一般优化方案 1.基本设置 ...

  8. 【原创】Centos 7利用软件Raid搭建ISCSI过程

    测试机器安装了4块2T硬盘,一块320G硬盘,利用320G硬盘安装CentOS 7系统,在CentOS 7系统上利用4块2T硬盘组建Raid 0,再配置iSCSI存储.注意,本文中的RAID指的是软R ...

  9. 设计模式--适配器模式C++实现

    适配器模式C++实现 1定义Adapter 将一个类的接口变成客户端所需要的另外一种借口,从而使远不因为接口不匹配而无法合作的两个雷能够一起工作 又叫变压器模式,包装模式Wrapper 2类图 角色分 ...

  10. iOS 和Android客户端测试区别整理ing

    区别很多,慢慢发现整理,注重细节,避免遗漏 消息推送区别: 1.推送渠道: 1.1 iOS走iOS自带的渠道进行系统内推送,应用内和应用外推送无明显差别,均可以收到push信息. 1.2 安卓由于谷歌 ...