题意

N个数,M组询问,每次问[l,r]中有多少个数出现正偶数次
对于100%的数据,1≤n,c,m≤105

题解

(传说lyd省选的时候看错题   把题看成这个了   从此又多了一道分块神题)
把N个数分成sqrt(n)块,预处理d[i][j]表示第i块起点到第j块末尾的答案 枚举起点i,并维护一个数组记录每个数到目前为止出现的次数,从偶变奇、从奇变偶时相应增减答案。 把每个数在数列中出现的位置从小到大排序后放入到一个数组Arr中备用。 读入每个询问[l,r]。如果l和r在同一个块中暴力即可,否则设l所在块的末尾为l’,r所在块的起点为r’,[l’+1,r’-1]的答案已经预处理出。扫描l~l’, r’~r的所有数,统计每个数出现的次数cnt,第一次出现时把它加入队列。 对于队列中的每个数,在数组Arr中二分l’+1和r’-1,得到在[l’+1,r’-1]中出现的次数k。通过对k和当前队列中的数的cnt进行奇偶性讨论更新答案

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
const int N=;
vector<int> vec[N];
int n,c,m,a[N],block[N],Block,R[],L[],cnt[N],f[][],ans,stack[N],top;
inline int read(){
int f=;int x=;char ch=getchar();
while(ch<''||ch>''){
if(ch=='-')f=-;
ch=getchar();
}
while(ch>=''&&ch<=''){
x=(x<<)+(x<<)+ch-'';
ch=getchar();
}
return x*f;
}
int find1(int x,int y){
int l=;int r=vec[x].size()-;
int tmp=-;
while(l<=r){
int mid=(l+r)>>;
if(vec[x][mid]<=y){
tmp=mid;
l=mid+;
}
else r=mid-;
}
return tmp;
}
int find2(int x,int y){
int l=;int r=vec[x].size()-;
int tmp=;
while(l<=r){
int mid=(l+r)>>;
if(vec[x][mid]>=y){
tmp=mid;
r=mid-;
}
else l=mid+;
}
return tmp;
}
int main(){
n=read();c=read();m=read();
Block=sqrt(n);
for(int i=;i<=n;i++){
a[i]=read();
vec[a[i]].push_back(i);
block[i]=(i-)/Block+;
if(!L[block[i]])L[block[i]]=i;
R[block[i]]=i;
}
for(int i=;i<=block[n];i++){
int tot=;
for(int j=L[i];j<=n;j++){
if(!(cnt[a[j]]&)&&cnt[a[j]])tot--;
cnt[a[j]]++;
if(!(cnt[a[j]]&))tot++;
f[i][block[j]]=tot;
}
for(int j=L[i];j<=n;j++){
cnt[a[j]]=;
}
}
while(m--){
int l,r;
l=read();r=read();
l=(l+ans)%n+;r=(r+ans)%n+;
if(l>r)swap(l,r);
if(block[l]+>=block[r]){
ans=;
for(int i=l;i<=r;i++){
cnt[a[i]]++;
if(cnt[a[i]]==)continue;
if(cnt[a[i]]&)ans--;
else ans++;
}
for(int i=l;i<=r;i++)
cnt[a[i]]=;
}
else{
ans=f[block[l]+][block[r]-];
top=;
for(int i=l;i<=R[block[l]];i++){
cnt[a[i]]++;
if(cnt[a[i]]==)stack[++top]=a[i];
}
for(int i=L[block[r]];i<=r;i++){
cnt[a[i]]++;
if(cnt[a[i]]==)stack[++top]=a[i];
}
while(top){
int z=stack[top--];
int tmp=max(find1(z,L[block[r]]-)-find2(z,R[block[l]]+)+,);
if(tmp==){
if(cnt[z]%==)ans++;
}
else{
if(tmp&){if(cnt[z]&)ans++;}
else {if(cnt[z]&)ans--;}
}
cnt[z]=;
}
}
printf("%d\n",ans);
}
return ;
}

[BZOJ2821]作诗(分块)的更多相关文章

  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. 洛谷P4135 作诗 (分块)

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

  4. BZOJ2821 作诗(Poetize) 分块

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

  5. BZOJ2821 作诗(分块)

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

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

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

  7. bzoj2821作诗

    http://www.lydsy.com/JudgeOnline/problem.php?id=2821 分块 我们把数列分成$\sqrt{N}$块 记$f[i][j]$表示第i块到第j块的答案,这个 ...

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

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

  9. bzoj2821: 作诗(Poetize)

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

随机推荐

  1. 51nod 1557 两个集合 (严谨的逻辑题)

    题目: 1557 两个集合 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 小X有n个互不相同的整数: p1,p2,...,pn  ...

  2. springmvc_learn

    https://blog.csdn.net/qq598535550/article/details/51703190 https://github.com/wosyingjun/beauty_ssm

  3. passwd文件

    1.查看/etc/passwd [admin@localhost /]$ cat -n /etc/passwd 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1: ...

  4. NetworkX-画图

    参考:https://blog.csdn.net/qq951127336/article/details/54586869 1.创建图 networkx有四种图 Graph .DiGraph.Mult ...

  5. JavaScript 中表达式和语句的区别

    1.语句和表达式 JavaScript中的表达式和语句是有区别的.一个表达式会产生一个值,它可以放在任何需要一个值的地方,比如,作为一个函数调用的参数.下面的每行代码都是一个表达式: myvar3 + ...

  6. 设置fixed,横向滚动条失效

    window.onscroll = function(){ var sl = -Math.max(document.body.scrollLeft,document.documentElement.s ...

  7. ueditor 编辑器,自定义图片上传

    <div> <h1>完整demo</h1> <form method="post" name="form"> & ...

  8. iOS开发——GCD总结

    Grand Central Dispatch,简称GCD,在异步执行任务的技术之一. 一般将应用程序中记述的线程管理用的代码在系统级中实现,开发者只需要定义想执行的任务并追加到适当的Dispatch ...

  9. SpaceVim配置中遇到的问题

    这是一个不断更新的随笔,若遇到SpaceVim配置问题时,会添加项 字体乱码(linux企鹅乱码,tabline图标乱码等) git clone https://github.com/powerlin ...

  10. mycat详细

    MyCAT的优势基于阿里开源的Cobar产品而研发,Cobar的稳定性.可靠性.优秀的架构和性能以及众多成熟的使用案例使得MYCAT一开始就拥有一个很好的起点,站在巨人的肩膀上,我们能看到更远.业界优 ...