LOJ.114.K大异或和(线性基)
题目链接
如何求线性基中第K小的异或和?好像不太好做。
如果我们在线性基内部Xor一下,使得从高到低位枚举时,选base[i]一定比不选base[i]大(存在base[i])。
这可以重构一下线性基,从高到低位枚举i,如果base[i]在第j位(j<i)有值,那么Xor一下base[j]。(保证每一列只有一个1)
比如 1001(3)与0001(0),同时选0,3只比3要小;重构后是 1000(3)和0001(0),这样同时选0,3比只选0或3都要大。
这样将K二进制分解后就可以直接对应上线性基对应位的选择了。要存base[i]有值的i。
需要注意如果线性基中表示的向量不足n个,说明一定存在一组向量满足线性相关关系,即存在Xor和为0的情况。这样要使K减1。
判断是K>=(1<<size),线性基和的个数是2^{size}-1(不算0)。
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 100000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
#define Bit 51
typedef long long LL;
const int N=1e5+5;int n,size,cnt;
LL base[69],b2[69];
char IN[MAXIN],*SS=IN,*TT=IN;inline LL read()
{LL now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now;
}
inline void Insert(LL x)
{for(int i=Bit; ~i; --i)if(x>>i & 1)if(base[i]) x^=base[i];else {base[i]=x, ++size; break;}
}
inline LL Query(LL K)
{LL ans=0;for(int i=cnt; ~i; --i)if(K>>i & 1) ans^=b2[i];return ans;
}
void Rebuild()
{for(int i=Bit; ~i; --i)for(int j=i-1; ~j; --j)if(base[i]>>j & 1) base[i]^=base[j];for(int i=0; i<=Bit; ++i) if(base[i]) b2[cnt++]=base[i];
}int main()
{n=read();for(int i=1; i<=n; ++i) Insert(read());Rebuild();for(int Q=read(); Q--; ){LL K=read()-(size!=n);//别在for里开int啊mmp printf("%lld\n",(K>=(1ll<<size))?-1ll:Query(K));}return 0;
}
有一种不需要重构线性基的方法:询问时将K二进制拆分(按size位),若K在第j位有1,且当前答案在第i位没有1(还可以更大)或是 K在第j位没有1,且当前答案在第i位有1(偏小?),则ans^=base[i]。
不太理解。(随大流吧。。)
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 100000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
#define Bit 51
typedef long long LL;
const int N=1e5+5;int n,size;
LL base[69];
char IN[MAXIN],*SS=IN,*TT=IN;inline LL read()
{LL now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now;
}
inline void Insert(LL x)
{for(int i=Bit; ~i; --i)if(x>>i & 1)if(base[i]) x^=base[i];else {base[i]=x, ++size; break;}
}
inline LL Query(LL K)
{LL ans=0;for(int i=Bit,now=size; ~i; --i)if(base[i])if((K>>(--now) & 1)^(ans>>i & 1)) ans^=base[i];return ans;
}int main()
{n=read();for(int i=1; i<=n; ++i) Insert(read());for(int Q=read(); Q--; ){LL K=read()-(size!=n);printf("%lld\n",(K>=(1ll<<size))?-1ll:Query(K));}return 0;
}
转载于:https://www.cnblogs.com/SovietPower/p/9291547.html
LOJ.114.K大异或和(线性基)相关推荐
- HDU3949 XOR (线性基、查找第k小值)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 我们用高斯消元求出的a1,a2,-,ana_1,a_2, \dots,a_na1,a2,-,an ...
- 区间子集最大/最小异或和问题(线性基,树上差分)
闲话 有这样一个问题--一个长度为\(n\)的序列\(a_1-a_n\),\(q\)个询问,每次询问\(l,r\),选出\(\{a_l,a_{l+1}...a_{r}\}\)中一个子集使得子集内元素异 ...
- 2017年ICPC西安邀请赛A、XOR(线段树套线性基 + 思维)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目传送门 Problem 给你 nnn 和 nnn 个整数的数组 aaa,以及kkk和qqq,有 q ...
- 线性代数 —— 线性基与前缀线性基
[概述] 线性基,是线性代数中的概念,在信息学竞赛中,前缀线性基是线性基的扩展,他们主要用于处理有关异或和的极值问题. 一组线性无关的向量即可作为一组基底,张起一个线性的向量空间,这个基底即称为线性基 ...
- 线性基(bzoj 2460: [BeiJing2011]元素)
线性基: 包含最多h个数(a1, a2, a3, -, ah),其中ak如果存在,那么最高位一定是第k位 性质①:线性基中任意集合xor出来的数的值域 = 原数列任意集合xor出的数的值域 性质②:线 ...
- 2017 ICPC西安区域赛 A - XOR ,线段树合并线性基
题目链接:A - XOR 题意;给个数组,每次询问一个区间你可以挑任意个数的数字异或和 然后在或上k的最大值 题解:线性基不知道的先看这个,一个线性基可以log的求最大值把对应去区间的线性基求出来然后 ...
- 【CF1100F】 Ivan and Burgers (分治+线性基)
description 戳我看题目(づ ̄3 ̄)づ╭❤- solution 异或和最大 --关联线性基 线性基: 原序列的每一个数都能由线性基里若干个数异或得到 线性基里若干个数的异或结果不可能为0 如 ...
- 【BZOJ3811】【清华集训2015】玛里苟斯(线性基)
传送门 解析: 还是挺好想的,首先对于k=1的情况,如果某一个数在这一位上有1,那么最终结果中这一位为1的概率就是0.5. 有一个很显然的性质,所有异或结果出现概率(或者说方案数)相同. 其次,对于k ...
- Loj#114-k大异或和【线性基】
正题 题目链接:https://loj.ac/problem/114 题目大意 nnn个数,求所有非空子集的kkk小异或和. 解题思路 我们考虑处理一下线性基,我们知道对于did_idi是一定在第i ...
最新文章
- cmake找不到opencv解决
- RDS PostgreSQL一键大版本升级技术解密
- Python中global和nolocal作用域的理解
- android动画详解
- perl java_与Perl相比Java性能问题
- 一文精通CSS文本问题,你值得一看
- git安装后找不见版本_结果发现git版本为1.7.4,(git --version)而官方提示必须是1.7.10及以后版本...
- 宣化市大专计算机学校,2018张家口专科大学有哪些 最新大专院校名单
- phpcms 后台设置 posid 推荐位(支持多选) - 教程篇
- ppt中覆盖原有图片文字并且添加新文字的操作方法,有截图
- 网络编程---tcp/udp协议
- VB6中SendKeys的基本应用
- 两款常用的 MQTT 调试工具
- linux格式化ext4分区工具,硬盘格式化ext4软件 硬盘格式化ext4
- netty权威指南---编解码技术
- 数字万用表判断绝缘栅场效应管的好坏
- ibus mozc 日文输入法
- Unity的UGUI用TexturePacker全自动打图集,包括九宫格切图信息
- C++ 16进制日志输出 每行右侧ASII输出
- illustrator插件--常用功能开发--色标生成器--js脚本开发--AI插件