博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ5301:[CQOI2018]异或序列(莫队)
阅读量:6819 次
发布时间:2019-06-26

本文共 1277 字,大约阅读时间需要 4 分钟。

Description

已知一个长度为 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有多少组。

Input

输入文件第一行,为3个整数n,m,k。
第二行为空格分开的n个整数,即ai,a2,….an。
接下来m行,每行两个整数lj,rj,表示一次查询。
1≤n,m≤105,O≤k,ai≤105,1≤lj≤rj≤n

Output

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

Sample Input

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

Sample Output

4
2
1
2
1

Solution

不能再这么颓下去了

昨天打了一天板子感觉现在脑子锈了QAQ……
题意杀了好久……明明子序列应该是不连续的
一看题目这个形式基本莫队没跑了,
然而如果两端加入/减掉一个数,这个数对于区间的影响是靠近它的连续一段
这显然是没法维护的。所以可以维护一个异或前缀和sum
因为a[x] xor a[x+1]……xor a[y-1] xor a[y] 等价于 sum[y] xor sum[x-1]
那么我们就可以用莫队来维护前缀和了。
每次往莫队里加入/删除前缀和的时候只需要考虑有多少个数与当前数异或等于k,开个桶即可。
因为查询区间[x,y]的时候我们需要sum[x-1]~sum[y],所以读入的时候左端点要减一。

Code

1 #include
2 #include
3 #include
4 #include
5 #include
6 #define N (500000+100) 7 using namespace std; 8 9 struct node{
int x,y,num,id,ans;}ask[N];10 int Keg[N],sum[N],n,m,k,x,now;11 12 bool cmp1(node a,node b){
return a.id==b.id?a.y
ask[i].x) Ins(--l);37 while (r
ask[i].y) Del(r--);39 ask[i].ans=now;40 }41 42 sort(ask+1,ask+m+1,cmp2);43 for (int i=1; i<=m; ++i)44 printf("%d\n",ask[i].ans);45 }

转载于:https://www.cnblogs.com/refun/p/8931154.html

你可能感兴趣的文章
从源码浅析MVC的MvcRouteHandler、MvcHandler和MvcHttpHandler
查看>>
给WebAPI的REST接口添加测试页面(二)
查看>>
Asp.net中GridView使用详解(引)【转】
查看>>
Objective-C语法之扩展(Extension)的使用
查看>>
ZOJ 3819 Average Score(数学 牡丹江游戏网站)
查看>>
支持向量机的优缺点
查看>>
mongodump备份数据库
查看>>
用DMA直接驱动GPIO,实现GPIO最高输出速率(转)
查看>>
[Python] 学习笔记之MySQL数据库操作
查看>>
[LeetCode] Longest Common Prefix 最长共同前缀
查看>>
linux命令行常用快捷键
查看>>
基于FPGA的图像处理(一)--System Generator介绍
查看>>
ADT + JNI实例
查看>>
Python-文件修改器
查看>>
JavaScript把客户端时间转换为北京时间
查看>>
[C++] zlatlcv: ATL字符串转换辅助库。能很方便的将UTF-8字符串转为TCHAR等字符串
查看>>
你听过的最心酸的一句话是什么?
查看>>
ios 图片处理( 1.按比例缩放 2.指定宽度按比例缩放
查看>>
nginx 直接在配置文章中设置日志分割
查看>>
(算法)二叉树中两个结点的最近公共父结点
查看>>