牛客网训练赛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 ...
随机推荐
- CRT Library Features
CRT Library Features The new home for Visual Studio documentation is Visual Studio 2017 Documentatio ...
- TS学习之Symbol
symbol成为了一种新的原生类型,就像number和string一样(意思是可以像string一样,作为对象的属性等) Symbols是不可改变且唯一的 //symbol通过Symbol函数构造,但 ...
- linux命令-gzip压缩
把很大的目录/文件压缩成更小的文件,传输节省带宽,从服务端到客户端下载过程节省时间,减少带宽,节省使用率.使用cpu的资源. 压缩命令gzip [root@wangshaojun ~]# ls111. ...
- tomcat jsp 数字串传值异常问题
1.在下面的jsp内嵌java代码去除num之前,有某Controller已经有了操作: request.getSession().setAttribute("num", ...
- Flask01 初识flask、创建flask应用、flask启动配置
1 什么是flask Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . 百度百科:点击前往 中文文档: ...
- 28.【转载】挖洞技巧:APP手势密码绕过思路总结
说到APP手势密码绕过的问题,大家可能有些从来没接触过,或者接触过,但是思路也就停留在那几个点上,这里我总结了我这1年来白帽子生涯当中所挖掘的关于这方面的思路,有些是网上已经有的,有些是我自己不断摸索 ...
- java File基本操作,以及递归遍历文件夹
java 的文件操作,相对来说是比较重要的,无论是编写CS还是BS程序,都避免不了要与文件打交道,例如读写配置文件等.虽然现在很多框架都直接帮你做好了这一步! java.io.File 底层是调用与c ...
- 【关于java多线程和socket通信的一些记录】---高并发/高负载/高可用/重入锁
多线程:提高cpu的使用效率,多线程是指在同一程序中有多个顺序流在执行. 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程. 线程:同一类线 ...
- ProtoBuf练习(五)
表类型 protobuf语言的maps字段类型相当于C++语言的std::map类型 工程目录结构 $ ls proto/ sample_maps.proto proto文件 $ cat proto/ ...
- java工具类学习整理——集合
好久没有总结一些东西了,同时集合部分的知识点也学习的比较早了,但是从来没有抽时间去研究和学习,今天正好有时间就总结一下map常用的遍历方法: package runningwhile; import ...