codechef Chef And Easy Xor Queries
做法:我们考虑前缀异或和,修改操作就变成了区间[i,n]都异或x
查询操作就变成了:区间[1,x]中有几个k
显然的分块,每个块打一个tag标记表示这个块中所有的元素都异或了tag[x]
然后处理出这个块中每种数的个数
注意查询的时候零散的块要下放标记
代码:
#include<bits/stdc++.h>
#define N 100005
#define M 334
using namespace std;
int cnt[M][N*14],sum[N],tag[M],ll[M],rr[M],a[N];
int n,Q,opt,x,y,block,num;
inline int gt(int x){return (x-1)/block+1;}
inline void pushdown(int x){
if (!tag[x]) return;
for (int i=ll[x];i<=rr[x];i++){
cnt[x][sum[i]]--;
sum[i]^=tag[x];
cnt[x][sum[i]]++;
}
tag[x]=0;
}
inline void query(int x,int y,int k){
//printf("%d %d\n",gt(x),gt(y));
int ans=0;
pushdown(gt(x));pushdown(gt(y));
if (gt(x)+1>=gt(y)){
for (int i=x;i<=y;i++) if (sum[i]==k) ans++;
}
else {
for (int i=x;i<=rr[gt(x)];i++) if (sum[i]==k) ans++;
for (int i=ll[gt(y)];i<=y;i++) if (sum[i]==k) ans++;
for (int j=gt(x)+1;j<gt(y);j++) ans+=cnt[j][k^tag[j]];
}
printf("%d\n",ans);
}
inline void change(int x,int y,int z){
int tmp=z;z=z^a[x];a[x]=tmp;
if (gt(x)+1>=gt(y)){
for (int i=x;i<=y;i++){
cnt[gt(i)][sum[i]]--;
sum[i]^=z;
cnt[gt(i)][sum[i]]++;
}
}
else {
for (int i=x;i<=rr[gt(x)];i++){
cnt[gt(i)][sum[i]]--;
sum[i]^=z;
cnt[gt(i)][sum[i]]++;
}
for (int i=ll[gt(y)];i<=y;i++){
cnt[gt(i)][sum[i]]--;
sum[i]^=z;
cnt[gt(i)][sum[i]]++;
}
for (int j=gt(x)+1;j<gt(y);j++) tag[j]^=z;
}
//for (int i=1;i<=n;i++) printf("%d %d\n",sum[i],tag[i]);
}
int main(){
scanf("%d%d",&n,&Q);
for (int i=1;i<=n;i++) scanf("%d",&a[i]),sum[i]=sum[i-1]^a[i];
block=(int)sqrt(n);num=n/block;if (n%block) num++;
for (int i=1;i<=num;i++) ll[i]=(i-1)*block+1,rr[i]=i*block;rr[num]=n;
//for (int i=1;i<=num;i++) printf("%d %d\n",ll[i],rr[i]);
for (int i=1;i<=num;i++)
for (int j=ll[i];j<=rr[i];j++) cnt[i][sum[j]]++;
while (Q--){
scanf("%d%d%d",&opt,&x,&y);
if (opt==2) query(1,x,y);
else change(x,n,y);
}
return 0;
}
- #include<bits/stdc++.h>
- #define N 100005
- #define M 334
- using namespace std;
- int cnt[M][N*14],sum[N],tag[M],ll[M],rr[M],a[N];
- int n,Q,opt,x,y,block,num;
- inline int gt(int x){return (x-1)/block+1;}
- inline void pushdown(int x){
- if (!tag[x]) return;
- for (int i=ll[x];i<=rr[x];i++){
- cnt[x][sum[i]]--;
- sum[i]^=tag[x];
- cnt[x][sum[i]]++;
- }
- tag[x]=0;
- }
- inline void query(int x,int y,int k){
- //printf("%d %d\n",gt(x),gt(y));
- int ans=0;
- pushdown(gt(x));pushdown(gt(y));
- if (gt(x)+1>=gt(y)){
- for (int i=x;i<=y;i++) if (sum[i]==k) ans++;
- }
- else {
- for (int i=x;i<=rr[gt(x)];i++) if (sum[i]==k) ans++;
- for (int i=ll[gt(y)];i<=y;i++) if (sum[i]==k) ans++;
- for (int j=gt(x)+1;j<gt(y);j++) ans+=cnt[j][k^tag[j]];
- }
- printf("%d\n",ans);
- }
- inline void change(int x,int y,int z){//[x,y]����^z
- int tmp=z;z=z^a[x];a[x]=tmp;
- if (gt(x)+1>=gt(y)){
- for (int i=x;i<=y;i++){
- cnt[gt(i)][sum[i]]--;
- sum[i]^=z;
- cnt[gt(i)][sum[i]]++;
- }
- }
- else {
- for (int i=x;i<=rr[gt(x)];i++){
- cnt[gt(i)][sum[i]]--;
- sum[i]^=z;
- cnt[gt(i)][sum[i]]++;
- }
- for (int i=ll[gt(y)];i<=y;i++){
- cnt[gt(i)][sum[i]]--;
- sum[i]^=z;
- cnt[gt(i)][sum[i]]++;
- }
- for (int j=gt(x)+1;j<gt(y);j++) tag[j]^=z;
- }
- //for (int i=1;i<=n;i++) printf("%d %d\n",sum[i],tag[i]);
- }
- int main(){
- scanf("%d%d",&n,&Q);
- for (int i=1;i<=n;i++) scanf("%d",&a[i]),sum[i]=sum[i-1]^a[i];
- block=(int)sqrt(n);num=n/block;if (n%block) num++;
- for (int i=1;i<=num;i++) ll[i]=(i-1)*block+1,rr[i]=i*block;rr[num]=n;
- //for (int i=1;i<=num;i++) printf("%d %d\n",ll[i],rr[i]);
- for (int i=1;i<=num;i++)
- for (int j=ll[i];j<=rr[i];j++) cnt[i][sum[j]]++;
- while (Q--){
- scanf("%d%d%d",&opt,&x,&y);
- if (opt==2) query(1,x,y);
- else change(x,n,y);
- }
- return 0;
- }
codechef Chef And Easy Xor Queries的更多相关文章
- CF&&CC百套计划2 CodeChef December Challenge 2017 Chef And Easy Xor Queries
https://www.codechef.com/DEC17/problems/CHEFEXQ 题意: 位置i的数改为k 询问区间[1,i]内有多少个前缀的异或和为k 分块 sum[i][j] 表示第 ...
- [CC-XXOR]Chef and Easy Problem
[CC-XXOR]Chef and Easy Problem 题目大意: 给你一个长度为\(n(n\le10^5)\)的序列\(A(A_i<2^{31})\).\(m(m\le10^5)\)次询 ...
- Codeforces Round #440 (Div. 2, based on Technocup 2018 Elimination Round 2) D. Something with XOR Queries
地址:http://codeforces.com/contest/872/problem/D 题目: D. Something with XOR Queries time limit per test ...
- XOR Queries(莫队+trie)
题目链接: XOR Queries 给出一个长度为nn的数组CC,回答mm个形式为(L, R, A, B)(L,R,A,B)的询问,含义为存在多少个不同的数组下标k \in [L, R]k∈[L,R] ...
- XOR Queries
XOR Queries 时间限制: 1000ms 内存限制: 256M 描述 给出一个长度为n的数组C,回答m个形式为(L,R,A,B)的询问,含义为存在多少个不同的数组下标k∈[L,R]满足C[ ...
- CodeChef:Chef and Problems(分块)
CodeChef:Chef and Problems 题目大意 有一个长度为n的序列$a_1,a_2,……,a_n$,每次给出一个区间[l,r],求在区间内两个相等的数的最远距离($max(j-i,满 ...
- CODECHEF Chef and Churus 解题报告
[CODECHEF]Chef and Churus Description 有一个长度为\(n\)的数组\(A\),有\(n\)个函数,第\(i\)个函数的值为\(\sum_{j=l_i}^{r_i} ...
- codechef Chef and The Right Triangles 题解
Chef and The Right Triangles The Chef is given a list of N triangles. Each triangle is identfied by ...
- 【CodeChef PREFIXOR】Prefix XOR
https://odzkskevi.qnssl.com/f0fbdb108ec813b1294f8f714805963b?v=1502083692 网上搜到的题解: http://blog.csdn. ...
随机推荐
- (六十九)使用block进行消息传递
在两个类之间进行消息传递,一般通过代理或者block进行,代理写起来较为麻烦,block较为简单,但是block需要特别注意内存泄漏问题,注意self和block之间要为弱引用,下面介绍使用block ...
- 【FPGA学习】Verilog之加法器
在fpga工程应用设计中,随处可见加法器,乘法器等等.现在将一些常用模块和心得体会先记录下来,以便日后使用. 一位半加器: module halfadder(cout,sum,a,b); output ...
- 海量数据挖掘MMDS week3:流算法Stream Algorithms
http://blog.csdn.net/pipisorry/article/details/49183379 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...
- Shell入门之概念
1.一切皆是文件: 在bash Shell 中一切皆是文件,不管是我们认为的文本文件,还是那些文件夹的东西,在这里都是文件,Linux只管比特和字节流,而不关心他们最终组成了什么格式,这些工作交给在L ...
- Linux环境编程导引
计算机系统硬件组成 总线 贯穿整个系统的一组电子管道称为总线, 分为: 片内总线 系统总线 数据总线DB 地址总线AB 控制总线CB 外部总线 I/O设备 I/O设备是系统与外界联系的通道 键盘鼠标是 ...
- 【Unity Shaders】Diffuse Shading——在Surface Shader中使用properties
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- mysql进阶(四)mysql中select
mysql中select * for update 注: FOR UPDATE 仅适用于InnoDB,且必须在事务区块(BEGIN/COMMIT)中才能生效. 作用 锁定该语句所选择到的对象.防止在 ...
- InfoQ访谈:Webkit和HTML5的现状和趋势
原网址: http://www.infoq.com/cn/interviews/status-and-trends-of-webkit-and-html5 个人一些不成熟的见解,望讨论和指正. 节选 ...
- Cocos2D中的Framerate状态
对于额外绘制调试物理引擎的支持,Cocos2D同样可以绘制概述计数器,尤其是帧速率(framerate)显示. 为了启用这些概述计数器标签,你只需添加如下一行代码,比如说在AppDelegate.m里 ...
- 《java入门第一季》之面向对象
之前的代码描述都是基于面向过程的,今天开始正式进入面向对象的世界.什么是对象?首先要区分类和对象的概念-- 现实世界中是如何描述一个事物的? 举例:学生 姓名,年龄,性别... 学习,吃饭,睡觉 属性 ...