牛客网训练赛26D(xor)
题目链接:https://www.nowcoder.com/acm/contest/180/D
线性基的学习:https://www.cnblogs.com/vb4896/p/6149022.html
链接:https://www.nowcoder.com/acm/contest/180/D
来源:牛客网
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
输入描述:
第一行为一个整数n,表示元素个数
第二行一行包含n个整数,分别代表序列中的元素
第三行为一个整数Q,表示询问次数
接下来Q行,每行两个数x,y,含义如题所示
输出描述:
输出Q行,若x可以变换为y,输出“YES”,否则输出“NO”
输入例子:
5
1 2 3 4 5
3
6 7
2 1
3 8
输出例子:
YES
YES
NO
-->
备注:
对于100%的数据,n,Q<=10
5
保证所有运算均在int范围内 思路:看了题解,是线性基的最基础的题,第一次听到线性基,根本不知道是什么,然后百度学了一下,学习博客:https://www.cnblogs.com/vb4896/p/6149022.html
线性代数中 有极大线性无关组和空间的基的概念。线性基的性质于此类似
如果把一个数转化为二进制,对应成一个由0和1构成的向量,所有的这些向量就构成了一个向量空间。 原问题就转化为求这个向量空间的极大线性无关组,把这样一个极大线性无关组称为线性基,线性基的求法代码中有
基本思想:从左往右扫描每个向量,对于第i个向量的第j位,如果前面已经有第j位为1的向量,那么把第i个向量异或那个向量,如果没有的话,直接存储下来,这样最后得到的向量组,不考虑0向量,最高位的1的位置是互不相同的,显然
这些向量线性无关,于是就构造出了极大线性无关组,也就是线性基。
那么说一下这一题的思路,先求出线性基,要寻找能否转化为x,则从x的最高位往低位判断,假设当前x的这一位是1,如果线性基中存在某个向量最高位的1在这一位,那么这个向量肯定要取,把x异或这个向量,否则没法组合出来
看代码:
#include<iostream>
#include<string.h>
#include<map>
#include<cstdio>
#include<cstring>
#include<stdio.h>
#include<cmath>
#include<ctype.h>
#include<math.h>
#include<algorithm>
#include<set>
#include<queue>
typedef long long ll;
using namespace std;
const ll mod=1e9+;
const int maxn=1e5+;
const int maxk=5e3+;
const int maxx=1e4+;
const ll maxe=+;
#define INF 0x3f3f3f3f3f3f
#define Lson l,mid,rt<<1
#define Rson mid+1,r,rt<<1|1
int a[maxn],p[maxn];//p是用来
int n,q;
void guass()//求线性基的函数,其实就是最大线性无关组
{
memset(p,,sizeof(p));//每一个数转化成二进制情况下看做一个线性组,每一位看做线性组的每一个元素
for(int i=;i<n;i++)
{
for(int j=;j>=;j--)
{
if((a[i]>>j)&)
{
if(!p[j])
{
p[j]=a[i];
break;//这里为什么直接break呢? 因为a[i]已经直接赋值了,肯定不能再用了,不然就会有两个向量异或起来等于0 了
}
else
{
a[i]^=p[j];//为什么要把a[i]给变掉呢?因为要最终得到的线性基是最高位的1的位置是互不相同的
}
}
}
}
//for(int i=0;i<=62;i++) if(p[i]) r++;
}
int query(int x)
{
for(int i=;i>=;i--)
{
if((x>>i)&)
{
if(!p[i]) return ;
x^=p[i];
}
}
if(x==) return ;
else return ;
}
int main()
{
cin>>n;
for(int i=;i<n;i++) cin>>a[i];
guass();
cin>>q;
while(q--)
{
int x,y;
cin>>x>>y;
if(query(x^y)) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return ;
}
牛客网训练赛26D(xor)的更多相关文章
- 牛客网 小白赛4 A三角形【贪心】
[前驱]:在指定长度的棍子中找到能组成最大周长三角形的三根棍子 链接:https://www.nowcoder.com/acm/contest/134/A 来源:牛客网 题目描述 铁子从森林里收集了n ...
- 牛客网训练1--------矩阵 (二份+二维矩阵hash)
不懂hash的话:https://www.cnblogs.com/ALINGMAOMAO/p/10345850.html 思路:对于一个大矩阵的每一个子矩阵都对应着一个hash值k, 当k出现2次以上 ...
- 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...
- 2018牛客网暑假ACM多校训练赛(第三场)G Coloring Tree 计数,bfs
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-G.html 题目传送门 - 2018牛客多校赛第三场 G ...
- 2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-D.html 题目传送门 - 2018牛客多校赛第三场 D ...
- 2018牛客网暑假ACM多校训练赛(第二场)E tree 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round2-E.html 题目传送门 - 2018牛客多校赛第二场 E ...
- 牛客网多校赛第九场A-circulant matrix【数论】
链接:https://www.nowcoder.com/acm/contest/147/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...
- 牛客网多校赛第9场 E-Music Game【概率期望】【逆元】
链接:https://www.nowcoder.com/acm/contest/147/E 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...
- 牛客网多校赛第七场--C Bit Compression【位运算】【暴力】
链接:https://www.nowcoder.com/acm/contest/145/C 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524 ...
随机推荐
- 巧用函数实现js插入css样式
我用的是webstorm,当写css 样式时候,会没有提示,可以按Ctrl+Alt+Space.
- Java父类构造器的讲解
众所周知,对于Java中的所有类而言,它们有一个根父类,即java.lang.Object类. 对于Java中构造器执行的顺序而言,程序执行的顺序为,先执行父类的非静态代码块,然后执行父类的相应的构造 ...
- TS学习之枚举
使用枚举可以定义一些有名字的数字常量 enum Test{ one = 1, two, three, four } console.log(Test); /*{ '1': 'one', '2': 't ...
- 【jQuery】praseFloat()方法的用法及注意事项
[jQuery]praseFloat()方法的用法及注意事项 praseFloat(): 用于解析一个字符串,并返回一个浮点数 语法: praseFloat(strin ...
- python的WeakKeyDictionary类和weakref模块的其他函数
python的WeakKeyDictionary类和weakref模块的其他函数 # -*- coding: utf-8 -*- # @Author : ydf # @Time : 2019/6/13 ...
- centos6 启动流程
具体过程:1)加载BIOS的硬件信息,执行BIOS内置程序.2)读取MBR(Master Boot Record)中Boot Loader中的引导信息.3)加载内核Kernel boot到内存中.4) ...
- Android源码中添加APP
参考罗升阳<Android系统源代码情景分析> 在Android源码中,我们通常把实验性质的Android APP放在packages/experimental目录下.对于一个简单的应用程 ...
- Pig FOREACH 嵌套循环
Example: Nested Block Suppose we have relations A and B. Note that relation B contains an inner bag. ...
- 6.7 安装vim
- Python中使用json.loads解码字符串时出错:ValueError: Expecting property name: line 1 column 1 (char 1)
解决办法,json数据只能用双引号,而不能用单引号