题目描述

已知一个长度为n的整数数列 a1,a2,...,ana_1,a_2,...,a_na1​,a2​,...,an​ ,给定查询参数l、r,问在 al,al+1,...,ara_l,a_{l+1},...,a_ral​,al+1​,...,ar​ 区间内,有多少子序列满足异或和等于k。也就是说,对于所有的x,y (I ≤ x ≤ y ≤ r),能够满足 ax⨁ax+1⨁...⨁ay=ka_x \bigoplus a_{x+1} \bigoplus ... \bigoplus a_y = kax​⨁ax+1​⨁...⨁ay​=k 的x,y有多少组。

输入输出格式

输入格式:

输入文件第一行,为3个整数n,m,k。

第二行为空格分开的n个整数,即 a1,a2,..ana_1,a_2,..a_na1​,a2​,..an​ 。

接下来m行,每行两个整数 lj,rjl_j,r_jlj​,rj​ ,表示一次查询。

输出格式:

输出文件共m行,对应每个查询的计算结果。

输入输出样例

输入样例#1:

  1. 4 5 1
  2. 1 2 3 1
  3. 1 4
  4. 1 3
  5. 2 3
  6. 2 4
  7. 4 4
输出样例#1:

  1. 4
  2. 2
  3. 1
  4. 2
  5. 1

说明

对于30%的数据, 1≤n,m≤10001 ≤ n, m ≤ 10001≤n,m≤1000

对于100%的数据, 1≤n,m≤105,0≤k,ai≤105,1≤lj≤rj≤n

Solution:

  这题面有毒,我不改了,题意就是$10^5$个数,$10^5$次查询,每次询问区间$[l,r]$中的子序列异或和为$k$的值的个数。

  首先,很容易想到异或的性质$a\;xor\;b\;xor\;b=a$,所以用前缀异或和$a[i]$表示前$i$个数的异或和,那么子序列$p_x\;xor\;p_{x+1}…\;xor\;p_{y-1}\;xor\;p_{y}=a_y\;xor\;a_{x-1}$。

  若$a_{x-1}\;xor\;a_y=k$,则$a_{x-1}=a_y\;xor\;k$,于是本题预处理出前缀异或和,将每个区间的下界$l-1$(因为$[l,r]$的异或和为$a[r]\;xor\;a[l-1]$),加减一个数等同于修改并统计当前区间$a_p\;xor\;k$出现的个数,于是本题就成了一道莫队模板题——查询区间中某个数的个数。

代码:

  1. #include<bits/stdc++.h>
  2. #define il inline
  3. #define ll long long
  4. using namespace std;
  5. const int N=;
  6. int n,m,k,a[N],pos[N],ans[N],num[N*],tot;
  7. struct data{
  8. int l,r,id;
  9. }t[N];
  10. il int gi(){
  11. int a=;char x=getchar();bool f=;
  12. while((x<''||x>'')&&x!='-')x=getchar();
  13. if(x=='-')x=getchar(),f=;
  14. while(x>=''&&x<='')a=a*+x-,x=getchar();
  15. return f?-a:a;
  16. }
  17. il bool cmp(data a,data b){return pos[a.l]==pos[b.l]?a.r<b.r:a.l<b.l;}
  18. il void add(int p){tot+=num[k^a[p]],++num[a[p]];}
  19. il void del(int p){--num[a[p]],tot-=num[k^a[p]];}
  20. int main()
  21. {
  22. n=gi(),m=gi(),k=gi();
  23. int s=int(sqrt(n));
  24. for(int i=;i<=n;i++)pos[i]=(i-)/s+,a[i]=a[i-]^gi();
  25. for(int i=;i<=m;i++)t[i].l=gi()-,t[i].r=gi(),t[i].id=i;
  26. sort(t+,t+m+,cmp);
  27. for(int i=,l=,r=;i<=m;i++){
  28. while(t[i].l>l)del(l++);
  29. while(t[i].l<l)add(--l);
  30. while(t[i].r<r)del(r--);
  31. while(t[i].r>r)add(++r);
  32. ans[t[i].id]=tot;
  33. }
  34. for(int i=;i<=m;i++)printf("%d\n",ans[i]);
  35. return ;
  36. }

P4462 [CQOI2018]异或序列的更多相关文章

  1. 【luogu P4462 [CQOI2018]异或序列】 题解

    题目链接:https://www.luogu.org/problemnew/show/P4462 ax+ax-1+...+ay = cntx+cnty 这样把一段序列变成两段相加跑莫队. #inclu ...

  2. 并不对劲的复健训练-bzoj5301:loj2534:p4462 [CQOI2018]异或序列

    题目大意 给出一个序列\(a_1,...,a_n\)(\(a,n\leq 10^5\)),一个数\(k\)(\(k\leq 10^5\)),\(m\)(\(m\leq10^5\))次询问,每次询问给\ ...

  3. 洛谷P4462 [CQOI2018]异或序列(莫队)

    题意 题目链接 Sol 一开始以为K每次都是给出的想了半天不会做. 然而发现读错题了维护个前缀异或和然后直接莫队搞就行,. #include<bits/stdc++.h> #define ...

  4. Luogu P4462 [CQOI2018]异或序列

    一道稍微要点脑子的莫队题,原来省选也会搬CF原题 首先利用\(xor\)的性质,我们可以搞一个异或前缀和的东西 每一次插入一个数,考虑它和之前已经加入的数能产生多少贡献 记一下之前的异或总值,然后还是 ...

  5. 洛谷P4462 [CQOI2018]异或序列(莫队)

    打广告->[这里](https://www.cnblogs.com/bztMinamoto/p/9538115.html) 我蠢了…… 如果$a_{l} xor ...a_{r}=k$,那么只要 ...

  6. luogu P4462 [CQOI2018]异或序列 |莫队

    题目描述 已知一个长度为n的整数数列a1,a2,...,an,给定查询参数l.r,问在al,al+1,...,ar​区间内,有多少子序列满足异或和等于k.也就是说,对于所有的x,y (I ≤ x ≤ ...

  7. P4462 [CQOI2018]异或序列 莫队

    题意:给定数列 \(a\) 和 \(k\) ,询问区间 \([l,r]\) 中有多少子区间满足异或和为 \(k\). 莫队.我们可以记录前缀异或值 \(a_i\),修改时,贡献为 \(c[a_i\bi ...

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

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

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

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

随机推荐

  1. VMware虚拟机下载与安装(内附密钥)

    VMware下载与安装 一.虚拟机的下载 1.进入VMware官网,点击左侧导航栏中的下载,再点击图中标记的Workstation Pro,如下图所示. 2.根据操作系统选择合适的产品,在这里以Win ...

  2. Java中Redis缓存

    1:安装 安装可分为单机版redis 和集群版redis  安装比较简单,自行百度即可 2:集成 pom文件中加入jedis 依赖,spring创建redis的application-resid配置, ...

  3. css公共类

    /*iOS弹性滚动*/ .scrolling{ position: absolute; width: 100%; height:100%; overflow-x:hidden; overflow-y: ...

  4. Leecode刷题之旅-C语言/python-101对称二叉树

    /* * @lc app=leetcode.cn id=101 lang=c * * [101] 对称二叉树 * * https://leetcode-cn.com/problems/symmetri ...

  5. Python3 os模块&sys模块&hashlib模块

    ''' os模块 非常重要的模块 ''' import os # print(os.getcwd()) # 获取当前工作目录 # os.chdir(r'路径名') # 改变当前工作目录 # print ...

  6. Django的命令操作,python

    忘记时候,查看命令用:python manage.py 1 建立项目的命令: django-admin.py startproject project_name 2 在项目的目录下建立app: dja ...

  7. 20145202马超《网络对抗》Exp3免杀 进阶

    木马化正常软件,如通过改变机器指令.实现可免杀免防火墙提示的后门. 继上次实验3所做的代码在主函数里面加上一行调用就可以 改各种属性,这里我参考了郝浩同学的博客 最后我还是遇到了问题 后来发现虽然有那 ...

  8. delphi 数据库中Connection与Query连接数量问题思考

    今天闲着没事,测试了一下Connection连接MSSQL,可以承受多少连接.    1.看看ADOConnection的连接数:写了一个代码,动态创建,测试了10000个连接,花了大约5~10分钟创 ...

  9. 初步学习pg_control文件之八

    接前文  初步学习pg_control文件之七  继续 看:catalog_version_no 代码如下: static void WriteControlFile(void) { ... /* * ...

  10. Hibernate-ORM:04.Hibernate中的get()和load()

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客会讲如何用get()或load()查询单个对象和对缓存的简单操作,以及他俩的区别和相同(前面有的那些配 ...