P4462 [CQOI2018]异或序列
题目描述
已知一个长度为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行,对应每个查询的计算结果。
输入输出样例
4 5 1
1 2 3 1
1 4
1 3
2 3
2 4
4 4
4
2
1
2
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$出现的个数,于是本题就成了一道莫队模板题——查询区间中某个数的个数。
代码:
#include<bits/stdc++.h>
#define il inline
#define ll long long
using namespace std;
const int N=;
int n,m,k,a[N],pos[N],ans[N],num[N*],tot;
struct data{
int l,r,id;
}t[N];
il int gi(){
int a=;char x=getchar();bool f=;
while((x<''||x>'')&&x!='-')x=getchar();
if(x=='-')x=getchar(),f=;
while(x>=''&&x<='')a=a*+x-,x=getchar();
return f?-a:a;
}
il bool cmp(data a,data b){return pos[a.l]==pos[b.l]?a.r<b.r:a.l<b.l;}
il void add(int p){tot+=num[k^a[p]],++num[a[p]];}
il void del(int p){--num[a[p]],tot-=num[k^a[p]];}
int main()
{
n=gi(),m=gi(),k=gi();
int s=int(sqrt(n));
for(int i=;i<=n;i++)pos[i]=(i-)/s+,a[i]=a[i-]^gi();
for(int i=;i<=m;i++)t[i].l=gi()-,t[i].r=gi(),t[i].id=i;
sort(t+,t+m+,cmp);
for(int i=,l=,r=;i<=m;i++){
while(t[i].l>l)del(l++);
while(t[i].l<l)add(--l);
while(t[i].r<r)del(r--);
while(t[i].r>r)add(++r);
ans[t[i].id]=tot;
}
for(int i=;i<=m;i++)printf("%d\n",ans[i]);
return ;
}
P4462 [CQOI2018]异或序列的更多相关文章
- 【luogu P4462 [CQOI2018]异或序列】 题解
题目链接:https://www.luogu.org/problemnew/show/P4462 ax+ax-1+...+ay = cntx+cnty 这样把一段序列变成两段相加跑莫队. #inclu ...
- 并不对劲的复健训练-bzoj5301:loj2534:p4462 [CQOI2018]异或序列
题目大意 给出一个序列\(a_1,...,a_n\)(\(a,n\leq 10^5\)),一个数\(k\)(\(k\leq 10^5\)),\(m\)(\(m\leq10^5\))次询问,每次询问给\ ...
- 洛谷P4462 [CQOI2018]异或序列(莫队)
题意 题目链接 Sol 一开始以为K每次都是给出的想了半天不会做. 然而发现读错题了维护个前缀异或和然后直接莫队搞就行,. #include<bits/stdc++.h> #define ...
- Luogu P4462 [CQOI2018]异或序列
一道稍微要点脑子的莫队题,原来省选也会搬CF原题 首先利用\(xor\)的性质,我们可以搞一个异或前缀和的东西 每一次插入一个数,考虑它和之前已经加入的数能产生多少贡献 记一下之前的异或总值,然后还是 ...
- 洛谷P4462 [CQOI2018]异或序列(莫队)
打广告->[这里](https://www.cnblogs.com/bztMinamoto/p/9538115.html) 我蠢了…… 如果$a_{l} xor ...a_{r}=k$,那么只要 ...
- luogu P4462 [CQOI2018]异或序列 |莫队
题目描述 已知一个长度为n的整数数列a1,a2,...,an,给定查询参数l.r,问在al,al+1,...,ar区间内,有多少子序列满足异或和等于k.也就是说,对于所有的x,y (I ≤ x ≤ ...
- P4462 [CQOI2018]异或序列 莫队
题意:给定数列 \(a\) 和 \(k\) ,询问区间 \([l,r]\) 中有多少子区间满足异或和为 \(k\). 莫队.我们可以记录前缀异或值 \(a_i\),修改时,贡献为 \(c[a_i\bi ...
- bzoj 5301: [Cqoi2018]异或序列 (莫队算法)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=5301 题面; 5301: [Cqoi2018]异或序列 Time Limit: 10 Sec ...
- 「luogu4462」[CQOI2018] 异或序列
「luogu4462」[CQOI2018]异或序列 一句话题意 输入 \(n\) 个数,给定\(k\),共 \(m\) 组询问,输出第 \(i\) 组询问 \(l_i\) \(r_i\) 中有多少个连 ...
随机推荐
- jQuery最重要的知识点
1.各种常见的选择器.2.对于属性的操作.[重点] 2.1)获取或设置属性的值: prop(); 2.2 ) 添加.删除.切换样式: addClass/removeClass/toggleClass ...
- STM32(4)——系统时钟和SysTick
1.STM32的时钟系统 在STM32中,一共有5个时钟源,分别是HSI.HSE.LSI.LSE.PLL HSI是高速内部时钟,RC振荡器,频率为8MHz: HSE是高速外部时钟,可接石英/陶瓷谐振器 ...
- ssh安装和使用
1.基础知识 ssh用于远程登陆,linux默认安装了client,如果需要被登陆则需要安装 server 2.安装 apt-get install openssh-server 检查是否安装成功 a ...
- 分支push不上去的问题
还原一下现场,我在自己的项目里面,从master里面checkout的一个分支,当我在我这个分支里面进行 push代码的操作,我突然发现我的代码不能执行push的操作,如图 这个原因是由于远端的仓库没 ...
- 三种urllib实现网页下载,含cookie模拟登陆
coding=UTF-8 import re import urllib.request, http.cookiejar, urllib.parse # # print('-------------- ...
- PHP.41-TP框架商城应用实例-后台16-商品属性2-AJAX添加、删除
添加商品属性 思路:根据[后台15]类型表{id,type_name}与属性表{id,attr_name,attr_type,attr_option_values,type_id} 1.建表商品属性 ...
- xss挑战赛小记 0x01(xsstest)
0x00 今天在先知社区看到了一个xss挑战赛 结果发现比赛已经结束 服务器也关了 百度找了个xss挑战赛来玩一下 正好印证下xss的学习--- 地址 http://test.xss.tv/ ...
- C#的委托Delegate
一.委托基础 1.什么是委托 委托(Delegate) 是存有对某个方法的引用的一种引用类型变量,用关键字delegate申明,实现相同返回值和参数的函数的动态调用,提供了对方法的抽象. 委托(Del ...
- vue2.0 watch
类型:string | Function | Object vue官网解释: 一个对象,键是需要观察的表达式,值是对应回调函数.值也可以是方法名,或者包含选项的对象.Vue 实例将会在实例化时调用 $ ...
- Python 3基础教程21-列表和元组
本文介绍列表也元组,先来看看他们的定义. # 元组和列表 # 元组的定义 x = 5,6,2,6 # 或者这样写 x = (5,6,2,6) # 列表定义 y = [5,6,2,6] # 元组的使用, ...