https://www.lydsy.com/JudgeOnline/problem.php?id=5301

https://www.luogu.org/problemnew/show/P4462

已知一个长度为 n 的整数数列 a[1],a[2],…,a[n] ,给定查询参数 l、r ,问在 [l,r] 区间内,有多少连续子序列满足异或和等于 k 。
也就是说,对于所有的 x,y (l≤x≤y≤r),能够满足a[x]^a[x+1]^…^a[y]=k的x,y有多少组。

开始时还在想怕不是一棵主席树(滑稽)。

想多了,莫队足以解决。

为了方便求区间异或和,把a处理为前缀异或和。

剩下的看代码吧,不太好说,就是注意左端点的移动是要把它之前的点增/删,因为l~r的异或=a[r]^a[l-1]。

#include<cstdio>
#include<queue>
#include<cctype>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+5;
inline int read(){int X=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
struct qu{int pos,l,r;
}q[N];
int a[N],ans[N],cnt[N],sum,n,m,k,s;
inline int bel(int x){return (x-1)/s+1;}
bool cmp(qu b,qu c){return bel(b.l)==bel(c.l)?b.r<c.r:b.l<c.l;
}
inline void add(int x){sum+=cnt[x^k];cnt[x]++;
}
inline void del(int x){cnt[x]--;sum-=cnt[x^k];
}
int main(){n=read(),m=read(),k=read();s=sqrt(n);for(int i=1;i<=n;i++)a[i]=a[i-1]^read();for(int i=1;i<=m;i++){q[i].pos=i;q[i].l=read();q[i].r=read();}sort(q+1,q+m+1,cmp);int ql=1,qr=0;cnt[0]++;for(int i=1;i<=m;i++){while(qr<q[i].r)add(a[++qr]);while(qr>q[i].r)del(a[qr--]);while(ql<q[i].l)del(a[ql-1]),ql++;while(ql>q[i].l)ql--,add(a[ql-1]);ans[q[i].pos]=sum;}for(int i=1;i<=m;i++)printf("%d\n",ans[i]);return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/ +

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/9008330.html

BZOJ5301:[CQOI2018]异或序列——题解相关推荐

  1. [CQOI2018]异或序列

    [CQOI2018]异或序列 题意: 给定1个整数K,离线询问[l,r]中有多少子区间xor和=K. 题解: 异或有个重要的性质:它的逆运算就是自身 我们维护该数列的前缀异或和a[x],表示1到x的区 ...

  2. [CQOI2018] 异或序列

    题目链接:戳我 哈哈哈我竟然秒切了省选题 莫队+异或. 考虑异或的性质,一个数同时异或两次等于没有进行操作.那么我们设a[i]为前i个数的异或和,显然对于一个区间\([l,now]\),\(a[l-1 ...

  3. 6759: 异或序列

    6759: 异或序列 时间限制: 1 Sec  内存限制: 128 MB 题目描述 已知一个长度为n的整数数列a1,a2,-,an,给定查询参数l.r,问在al,al+1,-,ar区间内,有多少子序列 ...

  4. Loj 2534 异或序列

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

  5. 【DP】序列 题解

    [DP]序列 题解 序列 题目 一个长度为kkk的整数序列bbb 1,bbb 2,-,bkbkbk(1≤bbb 1≤bbb 2≤-≤bkbkbk≤NNN)称为"好序列"当且仅当后一 ...

  6. 【LOJ】#2534. 「CQOI2018」异或序列

    题解 每个数都处理成前缀和,就相当于问\([l - 1,r]\)有几个数对\(x,y\),\(sum[x] ^ sum[y] = k\) 直接莫队即可 代码 #include <bits/std ...

  7. luogu4462 异或序列

    题目大意 给出n,m,k,有n个数的序列,m次询问一段区间,问异或和等于K的子区间的个数. 题解 本题一看就是莫队.但要解决该题需要以下性质: 定理: $$a\oplus b=c\Leftrighta ...

  8. Codeforces Round #647 (Div. 2) - Thanks, Algo Muse!B. Johnny and His Hobbies(异或)---题解

    来源:http://codeforces.com/contest/1362/problem/B Among Johnny's numerous hobbies, there are two seemi ...

  9. 洛谷P6599 「EZEC-2」异或【题解】

    题目大意 有TTT组数据,每组数据给定两个l,n∈N∗l,n\in\mathbb{N*}l,n∈N∗,构造一个长为lll,每个元素不超过nnn的数组 令他为aaa,要使 ∑i=1l∑j=1i−1ai⊕ ...

最新文章

  1. 中兴ZXR10交换机配置手册
  2. hdu-3625 Examining the Rooms(斯特灵数第一类)
  3. java 防止拷贝_[改善Java代码]避免对象的浅拷贝
  4. java对象内存占用情况分析
  5. Amazon、Linux基金会开发边缘网络交换器操作系统
  6. DVWA Cross Site Request Forgery (CSRF) -------WP
  7. 为 Nginx 添加模块
  8. asp.net(c#)网页跳转七种方法小结
  9. 【JAVA SE】第三章 运算符、条件语句、switch结构、while循环、do…while循环、for循环、break关键字以及break和continue关键字
  10. C++常见编译问题问题(慢慢积累)
  11. win10 mysql登录密码忘了_64位 windows10,MYSQL8.0.13重置密码(忘记密码或者无法登录)...
  12. 杭电4786--Fibonacci Tree(生成树)
  13. 【Linux】10个帮助你调试的命令
  14. 一路风景之川藏线徒步笔记
  15. 总结:Homography和图像拼接
  16. 使用RTMP协议实现视频桌面共享功能
  17. GBD+XGBOOST算法原理深入解析
  18. word中 数字或者字母间距 突然变大
  19. uva 10158 War
  20. 免费英文文献查询网站(生物医学) (转载)

热门文章

  1. C++中STL各个迭代器详解
  2. linux mysql php 配置_Linux+Apache+Mysql+PHP典型配置
  3. Ubuntu 21.04 国内镜像源
  4. 云服务器跑虚拟机吗,云服务器运行虚拟机吗
  5. StreamSets基本使用
  6. 计算机学业水平测试修选4,计算机学业测试试题复习卷4.docx
  7. 误删除备忘录怎么恢复
  8. HikariDataSource
  9. java类型转换异常_解决java.lang.ClassCastException的java类型转换异常的问题
  10. 为什么牛逼互联网公司都在开曼群岛注册?