bzoj 2821 作诗 分块
基本思路和蒲公英一样
还是预处理出每两个块间的答案
询问时暴力跑两边的贡献
#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 作诗 分块的更多相关文章
- 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 ...
- [BZOJ 2821] 作诗(Poetize) 【分块】
题目链接:BZOJ - 2821 题目分析 因为强制在线了,所以无法用莫队..可以使用分块来做. 做法是,将 n 个数分成 n/x 个块,每个块大小为 x .先预处理出 f[i][j] ,表示从第 i ...
- [BZOJ 2821] 作诗
Link: BZOJ 2821 传送门 Solution: 一道类似区间众数的经典分块 由于个数为偶数这样的条件不能支持快速合并 因此要先$O(n*sqrt(n))$预处理出$pre[i][j]$表示 ...
- BZOJ 2821作诗(Poetize) 分块
Description 有一个长度为n的序列,序列每个元素的范围[1,c],有m个询问x y,表示区间[x,y]中出现正偶数次的数的种类数. Solution 大力分块解决问题. 把序列分块,f[i] ...
- 2821: 作诗(Poetize)
2821: 作诗(Poetize) Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 1078 Solved: 348[Submit][Status] ...
- 洛谷P4135 作诗 (分块)
洛谷P4135 作诗 题目描述 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好是作诗. 由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章 ...
- P4135 作诗——分块
题目:https://www.luogu.org/problemnew/show/P4135 分块大法: 块之间记录答案,每一块记录次数前缀和: 注意每次把桶中需要用到位置赋值就好了: 为什么加了特判 ...
- [BZOJ2821]作诗(分块)
题意 N个数,M组询问,每次问[l,r]中有多少个数出现正偶数次对于100%的数据,1≤n,c,m≤105 题解 (传说lyd省选的时候看错题 把题看成这个了 从此又多了一道分块神题)把N个数 ...
- 【分块】BZOJ2821 作诗(Poetize)
2821: 作诗(Poetize) Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 3265 Solved: 951[Submit][Status][ ...
随机推荐
- jvm比较详尽的内存结构
JVM内存结构 2012-09-17 15:27:59 分类: Java 本文转自:http://www.blogjava.net/nkjava/archive/2012/03/14/371831. ...
- 一篇迟到的gulp文章
前言 这篇文章本应该在去年17年写的,但因为种种原因没有写,其实主要是因为懒(捂脸).gulp出来的时间已经很早了,16年的时候还很流行,到17年就被webpack 碾压下去了,不过由于本人接触gul ...
- 微软云消息队列 Azure service bus queue
前言 第一次使用消息队列,遇到了一些问题:同一个消息有多次出列.是一个消息只入列一次,还是多次?还是因为出列问题,出列了多次? Microsoft Azure service bus queue Az ...
- 一款C++写的tcp性能测试(压力测试)工具
基线终于开发完了,自己写的服务器性能和压力承受能力到底怎么样,在网上没有找到合适的测试工具可以用.于是自己基于MFC写了一款测试工具. 启动界面如下: 设置参数后,运行如下: 运行完界面如下: 源码路 ...
- Django代码注意
1.模板标签里面 extend和include是冲突的,有了extend,include无法生效,原因:是底层渲染独立机制设计导致. 2.#coding:utf-8 这句只有放在代码文件第一行才能生效 ...
- 晒stlink以及stm8“开发板”
先上图:( ̄▽ ̄)" 单层板+几根飞线,之前做jlink-ob做过孔整怕了,画pcb的时候尽量朝单层画的 外壳用sw建模,并3d打印 引出了swim for stm8单总线调试接口 以及sw ...
- java之SpringMVC的controller配置总结
先在springmvc-servlet.xml文件作如下配置(注解开发controller) <?xml version="1.0" encoding="UTF-8 ...
- 程序员快递请查收,来自Python黑客大佬的一份DDOS攻击说明书!
DDoS攻击没有我们想象中的那么简单,并不是什么Python程序员都能够做到的. 若要知晓黑客利用DDOS攻击原理那么我们必须要知道是实行DDoS攻击比较难的原因是什么? 很简单的一句话概括:&quo ...
- 使用FluentScheduler和IIS预加载在asp.net中实现定时任务管理
FluentScheduler介绍 github地址:https://github.com/fluentscheduler/FluentScheduler FluentScheduler是一个简单的任 ...
- python3+requests:使用类封装接口测试脚本
前言:接口测试用例较多,我们不可能每个用例都写一次requests,get或者requests,post等,所以对共用方法要进行封装处理 第一次修改:将get请求和post请求单独定义出来,使用过程中 ...