BZOJ 2821 分块+二分
题意:
N个数,M组询问,每次问[l,r]中有多少个数出现正偶数次。
思路:
把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进行奇偶性讨论更新答案
(from lyd的题解…)
我们就可以vector +lower_bound()
搞定~
(也可以用可持久化线段树之类的东西…)
最后 祝他们幸福……
//By SiriusRen
#include <cmath>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=100005;
int n,c,m,a[N],Block,block[N],f[1111][1111],vis[N],ans,l,r,stk[N],top;
vector<int>vec[N];
int main(){
scanf("%d%d%d",&n,&c,&m),Block=sqrt(n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),block[i]=(i-1)/Block+1,vec[a[i]].push_back(i);
for(int i=1;i<=block[n];i++){
memset(vis,0,sizeof(vis));int temp=0;
for(int j=lower_bound(block,block+1+n,i)-block;j<=n;j++){
vis[a[j]]++;
if(vis[a[j]]%2==0)temp++;
else if(vis[a[j]]!=1)temp--;
if(block[j]!=block[j+1])f[i][block[j]]=temp;
}
}
memset(vis,0,sizeof(vis));
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=0;
int L=block[l]+1,R=block[r];
if(L<R){
int ll=lower_bound(block+1,block+1+n,L)-block-1;
int rr=lower_bound(block+1,block+1+n,R)-block;
R--;top=0;
for(int i=l;i<=ll;i++)vis[a[i]]++,stk[++top]=a[i];
for(int i=rr;i<=r;i++)vis[a[i]]++,stk[++top]=a[i];
ans=f[L][R];
for(int i=1;i<=top;i++)if(vis[stk[i]]){
int t=lower_bound(vec[stk[i]].begin(),vec[stk[i]].end(),rr)-
lower_bound(vec[stk[i]].begin(),vec[stk[i]].end(),ll+1);
if(!t){if(vis[stk[i]]%2==0)ans++;}
else if(t%2==0){if(vis[stk[i]]%2==1)ans--;}
else if(t%2==1&&vis[stk[i]]%2==1)ans++;
vis[stk[i]]=0;
}
}
else{
top=0;
for(int i=l;i<=r;i++)vis[a[i]]++;
for(int i=l;i<=r;i++)if(vis[a[i]]){
if(vis[a[i]]%2==0)ans++;
vis[a[i]]=0;
}
}
printf("%d\n",ans);
}
}
BZOJ 2821 分块+二分的更多相关文章
- bzoj 2821 分块处理
大题思路就是分块,将n个数分成sqrt(n)个块,然后 处理出一个w数组,w[i,j]代表第i个块到第j个块的答案 那么对于每组询问l,r如果l,r在同一个块中,直接暴力做就行了 如果不在同一个块中, ...
- bzoj 2821 分块
分块: 先预处理,将原序列分成长度为len的许多块,计算从第i块到第j块的答案,(可以做到O(n*n/len)). 每次询问时,将询问的区间分成三部分,:左边,中间,右边,中间是尽量大的一个块区间,其 ...
- [BZOJ 2821] 作诗(Poetize) 【分块】
题目链接:BZOJ - 2821 题目分析 因为强制在线了,所以无法用莫队..可以使用分块来做. 做法是,将 n 个数分成 n/x 个块,每个块大小为 x .先预处理出 f[i][j] ,表示从第 i ...
- BZOJ 3343: 教主的魔法(分块+二分查找)
BZOJ 3343: 教主的魔法(分块+二分查找) 3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1172 Solved: ...
- Bzoj 3343: 教主的魔法(分块+二分答案)
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MB Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息 ...
- [BZOJ 2821] 作诗
Link: BZOJ 2821 传送门 Solution: 一道类似区间众数的经典分块 由于个数为偶数这样的条件不能支持快速合并 因此要先$O(n*sqrt(n))$预处理出$pre[i][j]$表示 ...
- BZOJ_3343_教主的魔法_分块+二分查找
BZOJ_3343_教主的魔法_分块+二分查找 题意:教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列被编号为 ...
- 【bzoj2957】楼房重建 分块+二分查找
题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子.为了简化问题,我们考虑这些事件发生在一个二 ...
- 【bzoj2453】维护队列/【bzoj2120】数颜色 分块+二分
题目描述 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会依据个人喜好, ...
随机推荐
- 使用eclipse,对spring boot 进行springloader或者devtool热部署失败处理方法
确定配置进行依赖和配置没有错误后. 调整spring boot 的版本,因为新版本对老版本的spring boot 不能使用. 改为: <groupId>org.springframewo ...
- 时间&物质&效率
由于我的家庭是地道的农民家庭,在上学的时候,父母很辛苦的供我读初中,高中,大学. 现在我想说的是,用时间来换取效率是我求学时最大的遗憾. 举一个例子吧:每次回家坐火车,火车很费时间,假如我不缺钱,完全 ...
- 【Oracle】闪回技术
1.闪回技术描述 2.数据库的准备: --undo表空间要设置成AUTO,设置合适的保存时间.undo表空间: SYS@ENMOEDU> show parameter undo NAME TYP ...
- 【Oracle】创建用户
任务: 1)创建用户siebel,密码oracle 2)授予sse_role,tblo_role角色 3)siebel用户没有对system,sysaux的使用权限 4)默认表空间ts_users,无 ...
- DDoS攻击与防范策略
DDoS(Distributed Denial of Service,分布式拒绝服务)攻击的主要目的是让指定目标无法提供正常服务,甚至从互联网上消失,是目前最强大.最难防御的攻击之一. 按照发起的方式 ...
- Python代码块缓存、小数据池
引子 前几天遇到了这样一道Python题目:a='123',b='123',下列哪个是正确的? A. a != b B. a is b C. a==123 D. a + b =246 正确答案是B 是 ...
- JsonPluginsUtil
package utils; import java.lang.reflect.Field;import java.text.SimpleDateFormat;import java.util.Arr ...
- 写shell工具类,一个常用实例
简述: 当我们常用到某些指令时,我们就需要将这个命令进行封装.封装的设计和扩展,因人而异.但为了每个人都能够了解到这个命令,常需要写出这个类的help. 关键字: 函数.getopts 函数 通过自定 ...
- BZOJ 1725: [Usaco2006 Nov]Corn Fields牧场的安排 状压动归
Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧 ...
- 路飞学城Python-Day182
Evernote Export 集群介绍 1.集群介绍 集群:将多个物理机器组成一个逻辑计算机,实现负载和容错 计算机集群简称集群,是一种计算机系统,它通过一组松散集成的计算机软件或硬件连接起来高度紧 ...