\(\\\)

Description


给出一个长为 \(n\) 的数列 \(A\) 和 \(k\),多次询问:

对于一个区间 \([L_i,R_i]\),问区间内有多少个不为空的子段异或和为 \(k\) 。

  • \(n,m,k,A_i\le 10^5\)

\(\\\)

Solution


注意到一件有趣的事,就是每次询问的 \(k\) 相同。

因为 \(a\oplus a=0\),所以子段异或问题可以看作前缀异或和的异或,即

\[a[i]\oplus a[i+1]\oplus...\oplus a[j]=sum[i-1]\oplus sum[j]
\]

其中 \(sum[i]=a[1]\oplus a[2]\oplus...\oplus a[i]\) 。

那么问题转化为,存在对少对 \(i,j\in[L_i-1,R_i],i!=j\) ,满足

\[sum[i]\oplus sum[j]=k
\]

注意区间问题,因为区间做差的原理是减掉 \(l-1\) 。

然后可以注意到,一个值 \(x\) 若想要构成 \(k\) ,其对应的另一个值是固定的。

也就是说,我们的组合方案是确定的。

当新加入一个可选值 \(x\) ,我们的方案数就会 \(+cnt[x^k]\) ,其中 \(cnt[i]\) 表示当前含有可选值 \(i\) 的个数。

可以证明,这种计数方式不会算重,因为每个数字加入时只会计算当前已经有对应的值。

当去掉一个值的时候,方案数 \(-cnt[x^k]\) 即可。

\(\\\)

还有一个问题,就是关于 \(k=0\) 的情况。

此时每个值显然不能计算上自己和自己异或的贡献。

删除时当然也要注意不能多减掉自己异或自己的情况。

只需在 adddel 的时候交换一下操作顺序即可,具体看代码。

\(\\\)

Code


突然失智......Debug 2h 竟只是因为 \(l\) 没有减 \(1\) ......

还要注意,刚开始 \(0\) 号位置也有一个贡献。

#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 100010
#define R register
#define gc getchar
using namespace std;
typedef long long ll; inline ll rd(){
ll x=0; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return f?-x:x;
} ll n,m,k,ans,bl[N],cnt[1<<18],s[N],res[N]; struct Q{ll l,r,id;}q[N]; inline bool cmp1(Q x,Q y){
return bl[x.l]==bl[y.l]?x.r<y.r:bl[x.l]<bl[y.l];
} inline bool cmp2(Q x,Q y){return x.id<y.id;} inline void del(int p){
--cnt[s[p]];
ans-=cnt[k^s[p]];
} inline void add(int p){
ans+=cnt[k^s[p]];
++cnt[s[p]];
} int main(){
n=rd(); m=rd(); k=rd();
ll t=sqrt(n);
for(R ll i=1;i<=n;++i){
s[i]=s[i-1]^rd();
bl[i]=i/t+1;
}
for(R ll i=1;i<=m;++i){
q[i].l=rd()-1; q[i].r=rd(); q[i].id=i;
}
sort(q+1,q+1+m,cmp1);
ll nowl=0,nowr=0;
cnt[0]=1;
for(R ll i=1;i<=m;++i){
while(nowl>q[i].l){--nowl;add(nowl);}
while(nowl<q[i].l){del(nowl);++nowl;}
while(nowr<q[i].r){++nowr;add(nowr);}
while(nowr>q[i].r){del(nowr);--nowr;}
res[q[i].id]=ans;
}
for(R ll i=1;i<=m;++i) printf("%lld\n",res[i]);
return 0;
}

[ CQOI 2018 ] 异或序列的更多相关文章

  1. [CQOI 2018]异或序列&[Codeforces 617E]XOR and Favorite Number

    Description 题库链接1 题库链接2 已知一个长度为 \(n\) 的整数数列 \(a_1,a_2,\cdots,a_n\) ,给定查询参数 \(l,r\) ,问在 \([l,r]\) 区间内 ...

  2. bzoj 5301: [Cqoi2018]异或序列 (莫队算法)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=5301 题面; 5301: [Cqoi2018]异或序列 Time Limit: 10 Sec ...

  3. 「luogu4462」[CQOI2018] 异或序列

    「luogu4462」[CQOI2018]异或序列 一句话题意 输入 \(n\) 个数,给定\(k\),共 \(m\) 组询问,输出第 \(i\) 组询问 \(l_i\) \(r_i\) 中有多少个连 ...

  4. P3917 异或序列

    P3917 异或序列暴力前缀异或枚举每一个区间,再求和,60分.正解:按每一位来做对于区间[l,r],如果它对答案有贡献,区间中1的个数一定是奇数,可以按每一位取(1<<i)的前缀和,q[ ...

  5. bzoj 5301 [Cqoi2018]异或序列 莫队

    5301: [Cqoi2018]异或序列 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 204  Solved: 155[Submit][Status ...

  6. BZOJ5301: [Cqoi2018]异或序列(莫队)

    5301: [Cqoi2018]异或序列 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 400  Solved: 291[Submit][Status ...

  7. Loj 2534 异或序列

    Loj 2534 异或序列 考虑莫队离线处理.每加一个数,直接询问 \(a[x]\oplus k\) 的前/后缀数目即可,减同理. 利用异或的优秀性质,可以维护异或前缀和,容易做到每次 \(O(1)\ ...

  8. 【BZOJ5301】【CQOI2018】异或序列(莫队)

    [BZOJ5301][CQOI2018]异或序列(莫队) 题面 BZOJ 洛谷 Description 已知一个长度为 n 的整数数列 a[1],a[2],-,a[n] ,给定查询参数 l.r ,问在 ...

  9. [bzoj5301][Cqoi2018]异或序列_莫队

    异或序列 bzoj-5301 Cqoi-2018 题目大意:题目链接. 注释:略. 想法: 由于a^a=0这个性质,我们将所有的数变成异或前缀和. 所求就变成了求所有的$l_i\le x<y\l ...

随机推荐

  1. HDU4289 Control —— 最小割、最大流 、拆点

    题目链接:https://vjudge.net/problem/HDU-4289 Control Time Limit: 2000/1000 MS (Java/Others)    Memory Li ...

  2. 织梦栏目页分页title加"第N页"

    以上就是调用栏目管理的SEO标题代码:{dede:field.seotitle /}的方法,这样充分体现列表页标题显示的效果,有利于搜索引擎的收录. 第二个问题就是这样列表页的标题都成了一个样子的了, ...

  3. 织梦dedecms内页分类频道友情链接实现方法

    本文介绍了织梦dedecms中内页分类频道加友情链接的三种方法,有需要的朋友参考下. 织梦dedecms中内页分类频道加友情链接,方法有三种: 先讲方法,后讲原理: 方法:先找到首页模版index.h ...

  4. MYSQL进阶学习笔记三:MySQL流程控制语句!(视频序号:进阶_7-10)

    知识点四:MySQL流程控制语句(7-10) 选择语句: (IF ELSE ELSE IF CASE 分支)IFNULL函数 IF语法: 语法规则: IF search_condition THEN ...

  5. python split space

    发现自己写python的空格split还挺多坎的,尤其是最后一个是空格的情形: def split(s): i = 0 ans = [] while i < len(s): start = i ...

  6. Oracle 安装报错 [INS-06101] IP address of localhost could not be determined 解决方法输入日志标题

    安装Oracle 11gR2,报错:[INS-06101] IP address of localhost could not be determined 出现这种错误是因为主机名和/etc/host ...

  7. CMake学习记录--list(列表操作命令)

    CMake是一个跨平台的工程管理工具,能方便的把工程转换为vs各个版本.Borland Makefiles.MSSYS Makefiles.NMake Makefiles等工程,对于经常在不同IDE下 ...

  8. Bootstrap-CSS:按钮

    ylbtech-Bootstrap-CSS:按钮 1.返回顶部 1. Bootstrap 按钮 本章将通过实例讲解如何使用 Bootstrap 按钮.任何带有 class .btn 的元素都会继承圆角 ...

  9. web_html-day1

    概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏览器 ...

  10. bzoj3198

    容斥原理+哈希表 恰好k个,那么上容斥原理,我们先2^6枚举相同的位置,用哈希表判断有多少个对应位置相同的元素,然后用容斥原理计算,似乎这里的容斥没有那么简单,详见这里 http://www.cnbl ...