BZOJ5301:[CQOI2018]异或序列——题解
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]异或序列——题解相关推荐
- [CQOI2018]异或序列
[CQOI2018]异或序列 题意: 给定1个整数K,离线询问[l,r]中有多少子区间xor和=K. 题解: 异或有个重要的性质:它的逆运算就是自身 我们维护该数列的前缀异或和a[x],表示1到x的区 ...
- [CQOI2018] 异或序列
题目链接:戳我 哈哈哈我竟然秒切了省选题 莫队+异或. 考虑异或的性质,一个数同时异或两次等于没有进行操作.那么我们设a[i]为前i个数的异或和,显然对于一个区间\([l,now]\),\(a[l-1 ...
- 6759: 异或序列
6759: 异或序列 时间限制: 1 Sec 内存限制: 128 MB 题目描述 已知一个长度为n的整数数列a1,a2,-,an,给定查询参数l.r,问在al,al+1,-,ar区间内,有多少子序列 ...
- Loj 2534 异或序列
Loj 2534 异或序列 考虑莫队离线处理.每加一个数,直接询问 \(a[x]\oplus k\) 的前/后缀数目即可,减同理. 利用异或的优秀性质,可以维护异或前缀和,容易做到每次 \(O(1)\ ...
- 【DP】序列 题解
[DP]序列 题解 序列 题目 一个长度为kkk的整数序列bbb 1,bbb 2,-,bkbkbk(1≤bbb 1≤bbb 2≤-≤bkbkbk≤NNN)称为"好序列"当且仅当后一 ...
- 【LOJ】#2534. 「CQOI2018」异或序列
题解 每个数都处理成前缀和,就相当于问\([l - 1,r]\)有几个数对\(x,y\),\(sum[x] ^ sum[y] = k\) 直接莫队即可 代码 #include <bits/std ...
- luogu4462 异或序列
题目大意 给出n,m,k,有n个数的序列,m次询问一段区间,问异或和等于K的子区间的个数. 题解 本题一看就是莫队.但要解决该题需要以下性质: 定理: $$a\oplus b=c\Leftrighta ...
- 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 ...
- 洛谷P6599 「EZEC-2」异或【题解】
题目大意 有TTT组数据,每组数据给定两个l,n∈N∗l,n\in\mathbb{N*}l,n∈N∗,构造一个长为lll,每个元素不超过nnn的数组 令他为aaa,要使 ∑i=1l∑j=1i−1ai⊕ ...
最新文章
- 中兴ZXR10交换机配置手册
- hdu-3625 Examining the Rooms(斯特灵数第一类)
- java 防止拷贝_[改善Java代码]避免对象的浅拷贝
- java对象内存占用情况分析
- Amazon、Linux基金会开发边缘网络交换器操作系统
- DVWA Cross Site Request Forgery (CSRF) -------WP
- 为 Nginx 添加模块
- asp.net(c#)网页跳转七种方法小结
- 【JAVA SE】第三章 运算符、条件语句、switch结构、while循环、do…while循环、for循环、break关键字以及break和continue关键字
- C++常见编译问题问题(慢慢积累)
- win10 mysql登录密码忘了_64位 windows10,MYSQL8.0.13重置密码(忘记密码或者无法登录)...
- 杭电4786--Fibonacci Tree(生成树)
- 【Linux】10个帮助你调试的命令
- 一路风景之川藏线徒步笔记
- 总结:Homography和图像拼接
- 使用RTMP协议实现视频桌面共享功能
- GBD+XGBOOST算法原理深入解析
- word中 数字或者字母间距 突然变大
- uva 10158	War
- 免费英文文献查询网站(生物医学) (转载)
热门文章
- C++中STL各个迭代器详解
- linux mysql php 配置_Linux+Apache+Mysql+PHP典型配置
- Ubuntu 21.04 国内镜像源
- 云服务器跑虚拟机吗,云服务器运行虚拟机吗
- StreamSets基本使用
- 计算机学业水平测试修选4,计算机学业测试试题复习卷4.docx
- 误删除备忘录怎么恢复
- HikariDataSource
- java类型转换异常_解决java.lang.ClassCastException的java类型转换异常的问题
- 为什么牛逼互联网公司都在开曼群岛注册?