传送门

题意

给出n个数,任意个数任意数异或构成一个集合,询问第k大个数

分析

这题需要用到线性基,下面是一些资料

1.高斯消元&线性基&Matirx_Tree定理 笔记

2.关于线性基的一些理解

3.线性基

这题操作步骤如下:

1.高斯消元求n个数的线性基

2.对于每个询问,遍历a[],如果(1<<p)&k==1,那么ans^=a[cnt-p],注意这里a[]大的标号小

trick

1.如果cnt!=n,那么线性基中存在某些数异或和为0,导致k--,解释如下

原数集能否异或出0呢?我们无法通过线性基中的数判断,但可以根据线性基的大小判断。如果线性基的大小与原数集大小相同,那么无法异或出0,否则可以。这个可以通过线性基的插入证明,即如果异或出0则不插入,导致线性基的大小小于原数集的大小。

代码

#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
int t,n,q,cnt;
ll x,zero;
ll a[10010]; void gauss()
{
cnt=zero=0;
for(int p=62;p>=0;--p)
{
int j=cnt+1;
while(j<=n&&(!(a[j]&(1LL<<p)))) j++;
if(j==n+1) continue;
cnt++;
swap(a[cnt],a[j]);
for(int i=1;i<=n;++i) if((i!=cnt)&&(a[i]&(1LL<<p))) a[i]^=a[cnt];
}
if(cnt!=n) zero=1;
}
ll query(ll x)
{
x-=zero;
ll ans=0;
if(!x) return 0;
if(x>=(1LL<<cnt)) return -1;
for(int p=cnt;p>=0;--p)if(x&(1LL<<p)) ans^=a[cnt-p];
return ans;
} int main()
{
scanf("%d",&t);
for(int k=1;k<=t;++k)
{
printf("Case #%d:\n",k);
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%lld",a+i);
gauss();
//for(int i=1;i<=cnt;++i) printf("%lld\n",a[i]);
for(scanf("%d",&q);q--;)
{
scanf("%lld",&x);
printf("%lld\n",query(x));
}
}
}

HDU3949:XOR(高斯消元)(线性基)的更多相关文章

  1. 【BZOJ-4269】再见Xor 高斯消元 + 线性基

    4269: 再见Xor Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 131  Solved: 81[Submit][Status][Discuss] ...

  2. BZOJ 4269: 再见Xor [高斯消元 线性基]

    4269: 再见Xor Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. 我太愚蠢了连数组开小了以及$2^{ ...

  3. 高斯消元 & 线性基【学习笔记】

    高斯消元 & 线性基 本来说不写了,但还是写点吧 [update 2017-02-18]现在发现真的有好多需要思考的地方,网上很多代码感觉都是错误的,虽然题目通过了 [update 2017- ...

  4. HDU 3949:XOR(高斯消元+线性基)

    题目链接 题意 给出n个数,问这些数的某些数xor后第k小的是谁. 思路 高斯消元求线性基. 学习地址 把每个数都拆成二进制,然后进行高斯消元,如果这个数字这一位(列)有1,那么让其他数都去异或它,消 ...

  5. BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基

    [题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...

  6. 洛谷P3389 高斯消元 / 高斯消元+线性基学习笔记

    高斯消元 其实开始只是想搞下线性基,,,后来发现线性基和高斯消元的关系挺密切就一块儿在这儿写了好了QwQ 先港高斯消元趴? 这个算法并不难理解啊?就会矩阵运算就过去了鸭,,, 算了都专门为此写个题解还 ...

  7. BZOJ 4004 JLOI2015 装备购买 高斯消元+线性基

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4004 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装 ...

  8. BZOJ 2844 高斯消元 线性基

    思路: //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using ...

  9. HDU 3949 XOR(高斯消元搞基)

    HDU 3949 XOR pid=3949" target="_blank" style="">题目链接 题意:给定一些数字,问任取几个异或值第 ...

  10. ACM学习历程—HDU 3915 Game(Nim博弈 && xor高斯消元)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3915 题目大意是给了n个堆,然后去掉一些堆,使得先手变成必败局势. 首先这是个Nim博弈,必败局势是所 ...

随机推荐

  1. 352. Data Stream as Disjoint Interval

    Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen ...

  2. mySQL windows 服务

    https://www.jizhuba.com/kejiyouxi/20171001/6006.html

  3. python学习之-- mysql模块和sqlalchemy模块

    简单介绍python下操作mysql数据库模块有2个:pyhton-mysqldb  和 pymysql 说明:在python3中支持mysql 的模块已经使用pymysql替代了MysqlDB(这个 ...

  4. PAT (Advanced Level) 1039. Course List for Student (25)

    map会超时,二分吧... #include<iostream> #include<cstring> #include<cmath> #include<alg ...

  5. java . 请在小于99999的正整数中找符合下列条件的数,它既是完全平方数,又有两位数字相同,如:144,676。

    import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; //请在小于99999的正整数中找符合下列条件的 ...

  6. Eclipse Explorer插件快速打开项目文件在系统资源管理器

    官网:https://github.com/Jamling/eclipse-explorer 安装: 1.在线安装 [Help]->[Eclipse Marketplace]搜索:Eclipse ...

  7. @Aspect注解无效

    Pointcut的execution配置正确的话,检查下,是否加了以下jar包 <!-- http://mvnrepository.com/artifact/org.aspectj/aspect ...

  8. spring mvc 集成freemarker模板

    主要使用到的jar 文件:spring mvc +freemarker.jar 第一步:spring mvc 集成 freemarker <!-- 定义跳转的文件的前后缀 ,视图模式配置--&g ...

  9. CV_HAAR_FEATURE_DESC_MAX和CV_HAAR_FEATURE_MAX

    #define CV_HAAR_FEATURE_MAX 3 //提前定义的一个宏,在程序中表示一个haar特征由至多三个矩形组成 #define CV_HAAR_FEATURE_DESC_MAX 20 ...

  10. Linux学习笔记总结

    零.求人不如求已:        1. 在Linux中,文件,目录,驱动,命令,脚本都视为文件,也即一切皆file. 2.记住使用Linux 的关键就是六个字: 命令.选项.參数. 3.学会看帮助,不 ...