Codeforces 959 F. Mahmoud and Ehab and yet another xor task
\(>Codeforces\space959 F. Mahmoud\ and\ Ehab\ and\ yet\ another\ xor\ task<\)
题目大意 : 给出一个长度为 \(n\) 序列 \(A\),和 \(q\) 次询问,对于每一次询问给出两个数 \(l, x\) ,你需要计算在前缀和 \(A[1, l]\) 中选取若干个数,使得它们 \(xor\) 起来的结果等于 \(x\) 的方案数
$n , q \leq 10^5 \ 0 \leq A_i \leq 2^{20} $
解题思路 :
首先考虑离线,发现将询问按照 \(l\) 排序之后,询问每一个 \(l\) 时都可以构造出关于前缀$ A[1,l] $的线性基
考虑如果要在前缀 \(A[1,l]\) 中选取若干个数表示出 \(x\), 那么线性基中的元素必然能表示出 \(x\)
与此同时,如果线性基能表示出 \(x\)
那么对于每一个在前缀 \(A[1, l]\) 但不在线性基中元素 \(A_i\) 线性基都能表示出 \((x\ xor\ A_i)\)
所以线性基外的元素都可以选或者不选,那么方案数就是 \(2^{l -size}\) 其中 \(size\) 指的是线性基的大小
那么只需要对于询问离线,边向线性基内插入数边回答询问,判断是否能被线性基表示并算出线性基的大小即可
判断数是否能被线性基表示 : 对于数每一个有 \(1\) 的二进制位,\(xor\) 上线性基的对应位,判断是否变成了 \(0\)
求线性基的大小 : 加入元素的时候通过判断是否加入成功来维护
/*program by mangoyang*/
#include<bits/stdc++.h>
#define inf (0x7f7f7f7f)
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define P 1000000007
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
int f = 0, ch = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
if(f) x = -x;
}
int a[200005], ans[200005], Bit[25], n, m, tot;
struct Query{ int l, x, id; } q[200005];
inline bool cmp(Query A, Query B){ return A.l < B.l; }
inline ll Pow(ll a, ll b){
ll ans = 1;
for(; b; b >>= 1, a = a * a % P)
if(b & 1) ans = ans * a % P;
return ans;
}
inline void ins(int x){
for(int i = 19; ~i; i--) if((1 << i) & x){
if(!Bit[i]){ Bit[i] = x; return; }
x ^= Bit[i];
}
}
inline void Answer(Query now){
int x = now.x, lim = now.l, id = now.id, cnt = 0;
for(int i = 19; ~i; i--) if(Bit[i]){
cnt++;
if((1 << i) & x) x ^= Bit[i];
}
if(x) ans[id] = 0; else ans[id] = Pow(2, lim - cnt);
}
int main(){
read(n), read(m);
for(int i = 1; i <= n; i++) read(a[i]);
for(int i = 1; i <= m; i++){
int l, x;
read(l), read(x), q[i] = (Query){l, x, i};
}
int p = 1;
sort(q + 1, q + m + 1, cmp);
for(; !q[p].l && p <= m; p++)
if(!q[p].x) ans[q[p].id] = 1; else ans[q[p].id] = 0;
for(int i = 1; i <= n; i++){
ins(a[i]);
while(q[p].l == i && p <= m) Answer(q[p++]);
}
for(int i = 1; i <= m; i++) printf("%d\n", ans[i]);
return 0;
}
Codeforces 959 F. Mahmoud and Ehab and yet another xor task的更多相关文章
- Codeforces 959 D Mahmoud and Ehab and another array construction task
Discription Mahmoud has an array a consisting of n integers. He asked Ehab to find another arrayb of ...
- Codeforces 959F Mahmoud and Ehab and yet another xor task 线性基 (看题解)
Mahmoud and Ehab and yet another xor task 存在的元素的方案数都是一样的, 啊, 我好菜啊. 离线之后用线性基取check存不存在,然后计算答案. #inclu ...
- 959F - Mahmoud and Ehab and yet another xor task xor+dp(递推形)+离线
959F - Mahmoud and Ehab and yet another xor task xor+dp+离线 题意 给出 n个值和q个询问,询问l,x,表示前l个数字子序列的异或和为x的子序列 ...
- Codeforces 959 E Mahmoud and Ehab and the xor-MST
Discription Ehab is interested in the bitwise-xor operation and the special graphs. Mahmoud gave him ...
- [CF959F]Mahmoud and Ehab and yet another xor task题解
搞n个线性基,然后每次在上一次的基础上插入读入的数,前缀和线性基,或者说珂持久化线性基. 然后一个num数组记录当时线性基里有多少数 然后每次前缀操作一下就珂以了 代码 #include <cs ...
- Codeforces 959D. Mahmoud and Ehab and another array construction task(构造, 简单数论)
Codeforces 959D. Mahmoud and Ehab and another array construction task 题意 构造一个任意两个数都互质的序列,使其字典序大等于a序列 ...
- D. Mahmoud and Ehab and another array construction task 因子分界模板+贪心+数学
D. Mahmoud and Ehab and another array construction task 因子分解模板 题意 给出一个原序列a 找出一个字典序大于a的序列b,使得任意 \(i!= ...
- codeforces-473D Mahmoud and Ehab and another array construction task (素数筛法+贪心)
题目传送门 题目大意:先提供一个数组,让你造一个数组,这个数组的要求是 1 各元素之间都互质 2 字典序大于等于原数组 3 每一个元素都大于2 思路: 1.两个数互质的意思就是没有公因子.所以每 ...
- CF 959 E. Mahmoud and Ehab and the xor-MST
E. Mahmoud and Ehab and the xor-MST https://codeforces.com/contest/959/problem/E 分析: 每个点x应该和x ^ lowb ...
随机推荐
- [POJ2356]Find a multiple 题解(鸽巢原理)
[POJ2356]Find a multiple Description -The input contains N natural (i.e. positive integer) numbers ( ...
- 【转】E: Sub-process /usr/bin/dpkg returned an error code (1)
原链接: jaryWang:E: Sub-process /usr/bin/dpkg returned an error code (1)错误解决 1.$ sudo mv /var/lib/dpkg/ ...
- c语言学习笔记.内存管理.
内存: 每个程序的内存是分区的:堆区.栈区.静态区.代码区. 1.代码区:放置所有的可执行代码,包括main函数. 2.静态区:存放所有的全局变量和静态变量. 3.栈区:栈(stack),先进后出.存 ...
- Problem D. Berland Railroads Gym - 101967D (思维)
题目链接:https://cn.vjudge.net/contest/274029#problem/D 题目大意:给你0-9每个数的个数,然后让你找出最大的数,满足的条件是任意三位相连的都能被三整除. ...
- virtualenv搭建虚拟环境
最近因为项目需要,要在CentOS 7 上搭建一套开发环境,虽说Python的背后有着庞大的开源社区支持,但是有一个缺点就是每个包的质量都参差不齐,如果我们在工作服务器上去测试安装每个包,就会造成整个 ...
- win8扁平风格的物流公司网站后台管理模板——后台
链接:http://pan.baidu.com/s/1o79Zp2M 密码:tqrz
- 多个id或class属性相同的元素绑定事件
<td class="tools"><a href="javascript:void(0);" status="0" na ...
- Python抽象类和接口类
一.抽象类和接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名) ...
- DBCP object created 日期 by the following code was never closed:
1.分析 看到标题 DBCP 首先想到的肯定是 数据库连接池哪方面有问题,那么先别着急去解决,不要一股脑就钻进逻辑代码中,然后启用调试就开始一步一步 的分析.我们首先要做的就是想,想想数据库连接池,在 ...
- C语言再学习之 setjmp与longjmp
前不久在阅读Quake3源代码的时候,看到一个陌生的函数:setjmp,一番google和查询后,觉得有必要针对setjmp和longjmp这对函数写一篇blog,总结一下. setjmp和longj ...