基本思路和蒲公英一样

还是预处理出每两个块间的答案

询问时暴力跑两边的贡献

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<vector>
#include<ctime>
#include<algorithm>
#define N 100005
using namespace std;
int n,m,c,nn,tot,a[N],be[N],f[4000][4000],tim[N];
bool bo[N],flag[N];
vector <int> q[N];
void init(){
int ans;
for(int i=1;i<=tot;i++){
memset(bo,0,sizeof bo); ans=0;
memset(flag,0,sizeof flag);
for(int j=(i-1)*nn+1;j<=n;j++){
if(!flag[a[j]]){
flag[a[j]]=1; bo[a[j]]=1;
}
else{
if(!bo[a[j]]){bo[a[j]]=1;ans--;}
else{bo[a[j]]=0;ans++;}
}
if(!(j%nn)||j==n) f[i][be[j]]=ans;
}
}
}
int getnum(int l,int r,int x){
return upper_bound(q[x].begin(),q[x].end(),r)-lower_bound(q[x].begin(),q[x].end(),l);
}
int query(int l,int r,int ii){
int ans=0,t,tt;
if(be[l]==be[r]){
for(int i=l;i<=r;i++){
if(tim[a[i]]!=ii){
tim[a[i]]=ii;
t=getnum(l,r,a[i]);
if(t>0&&(!(t&1))) ans++;
}
}
return ans;
}
ans=f[be[l]+1][be[r]-1];
for(int i=l;i<=be[l]*nn;i++){
if(tim[a[i]]!=ii){
tim[a[i]]=ii;
t=getnum(l,r,a[i]);
tt=getnum(be[l]*nn+1,(be[r]-1)*nn,a[i]);
if(t!=0){
if((tt==0)&&(!(t&1))) ans++;
else if(tt!=0&&(1&t)!=(1&tt)){
if((t&1)) ans--;
else ans++;
}
}
}
}
for(int i=(be[r]-1)*nn+1;i<=r;i++){
if(tim[a[i]]!=ii){
tim[a[i]]=ii;
t=getnum(l,r,a[i]);
tt=getnum(be[l]*nn+1,(be[r]-1)*nn,a[i]);
if(t!=0){
if((tt==0)&&(!(t&1))) ans++;
else if(tt!=0&&(1&t)!=(1&tt)){
if((t&1)) ans--;
else ans++;
}
}
}
}
return ans;
}
int main()
{
scanf("%d%d%d",&n,&c,&m);
nn=(int)(n/(sqrt(8*m*log2(n))));
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
be[i]=(i-1)/nn+1;
q[a[i]].push_back(i);
}
tot=be[n]; init();
//printf("%0.2lf\n",(double)clock()/CLOCKS_PER_SEC);
int ans=0,l,r;
for(int i=1;i<=m;i++){
scanf("%d%d",&l,&r);
l=(l+ans)%n+1;
r=(r+ans)%n+1;
if(l>r) swap(l,r);
ans=query(l,r,i);
printf("%d\n",ans);
}
return 0;
}

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

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

  5. 2821: 作诗(Poetize)

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

  6. 洛谷P4135 作诗 (分块)

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

  7. P4135 作诗——分块

    题目:https://www.luogu.org/problemnew/show/P4135 分块大法: 块之间记录答案,每一块记录次数前缀和: 注意每次把桶中需要用到位置赋值就好了: 为什么加了特判 ...

  8. [BZOJ2821]作诗(分块)

    题意 N个数,M组询问,每次问[l,r]中有多少个数出现正偶数次对于100%的数据,1≤n,c,m≤105 题解 (传说lyd省选的时候看错题   把题看成这个了   从此又多了一道分块神题)把N个数 ...

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

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

随机推荐

  1. mongodb3.6 副本集(三)mongodb 如何做数据备灾

    前言 个人理解,副本集一个主要作用就是当Master库出现故障,其中的一个salve从库会被选举出来成为新的Master.框架图如下: 其中,选举者是不参与数据存储的,它的作用只是为了选举出新的Mas ...

  2. JavaScript继承详解

    面向对象与基于对象 在传统面向对象的语言中,有两个非常重要的概念 - 类和实例. 类定义了一类事物公共的行为和方法:而实例则是类的一个具体实现. 我们还知道,面向对象编程有三个重要的概念 - 封装.继 ...

  3. 用python开发调试器——起始篇

    首先,你得准备一套python开发环境,正常情况下,一般是在windows下开发的,因为win系统应用广泛,再则就是要有个IDE,这里我选择我熟悉的Eclipse.环境搭建,网上都有,比如:http: ...

  4. Linux下使用Kickstart自动化安装平台架构

    PXE工作于Client/Server的网络模式.在启动过程中,终端要求服务器分配IP地址,再用TFTP协议下载一个自动启动软件包到内存中执行. 要使用kickstart安装平台,包括完整的架构为:K ...

  5. 完整的WebRTC调用序列图

    说在前面的话:此图出自Rea-Time Communication with WebRTC: https://book.douban.com/subject/25849712/ 的第五章.

  6. BigDecimal常用的加减乘除算法、比较大小、保存两位小数点

    项目中涉及到了BigDecimal的加.减.乘.比较大小.精确度的问题.所以在此总结一下,方便以后复习. //加法 BigDecimal coins = new BigDecimal("0& ...

  7. Pascal Triangle

    Description: Given numRows, generate the first numRows of Pascal's triangle. For example, given numR ...

  8. kmeans算法思想及其python实现

    第十章 利用k-均值聚类算法对未标注的数据进行分组 一.导语 聚类算法可以看做是一种无监督的分类方法,之所以这么说的原因是它和分类方法的结果相同,区别它的类别没有预先的定义.簇识别是聚类算法中经常使用 ...

  9. Java(四、类和对象)

    Java 对象和类 Java作为一种面向对象语言.支持以下基本概念: 多态.继承.封装.抽象.类.对象.实例.方法.重载 对象 对象是类的一个实例(对象不是找个女朋友),有状态和行为.例如,一条狗是一 ...

  10. display的属性值测试

    由于在学习CSS的display的属性值只针对block.inline.inline-block和flex进行过了解,并且自己观察得知列表中li的display属性是list-item,而想要触发BF ...