Codeforces1101G (Zero XOR Subset)-less 【线性基】【贪心】
题目分析:
考虑到这是一个区间的异或问题,不妨求出前缀和,令$sum[i] = Xor_{j=1}^{i}a[j]$。
对于区间$[l,r]$的异或结果,等于$sum[r] \oplus sum[l-1]$。那么原问题等价于选尽量多的点$p_x$,使得这些点构成的$sum[p_x] \oplus sum[p_{x-1}]$的子集的异或非$0$。我们不断往前异或,可以把问题转化为选尽量多的$p_x$,使得$sum[p_x]$的子集的异或非$0$。这是因为这两者的线性基等价。
这样子这题就变成BZOJ2460的弱化版了。关于BZOJ2460的证明,我还没想到。但是这道题是它的弱化版,也就是$magic=1$的情况,我可以试着给出一个证明。
使用反证法,假设以不同的顺序插入线性基得到的答案是不同的,那么存在一种插入方式使得答案线性基为${a_i}$,另一种插入方式线性基为${b_i}$,$|{a_i}| > |{b_i}|$。现在只需说明$|{a_i}| = |{b_i}|$即可。
实际上这里有一个想法,就是任意一种插入方式构成的线性基能表示出的数是相同的,就能说明$|{a_i}| = |{b_i}|$。为什么?
想象一个二维空间和一个三维空间,坐标$(1,2,3)$不能在一个二维空间被表示不是吗?同理两个表示域相同的线性基的维度肯定相同,否则其中维度多的那个线性基的某一维肯定可以被其它维表示,这不符合线性基的定义。
假设现在存在一个数$x$,$a$线性基可以表示,$b$线性基表示不了。如果这个数属于原序列,那么它一定早就被插入了$b$线性基中,而不会被忽视。否则它一定能被原序列中的几个数所表示出来。但我们又发现$b$线性基可以表示出原序列中的任何数,那么利用这些表示方法同样可以表示出$x$,所以这样的数不存在。所以$|{a_i}| = |{b_i}|$。
代码:
#include<bits/stdc++.h>
using namespace std; const int maxn = ; int n,a[maxn]; int p[]; void read(){
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]),a[i] ^= a[i-];
} void work(){
if(a[n] == ){puts("-1");return;}
for(int i=;i>=;i--)if(a[n] & (<<i)) {p[i] = a[n];break;}
int ans = ;
for(int i=;i<n;i++){
for(int j=;j>=;j--){
if(a[i] & (<<j)){
if(p[j]) a[i] ^= p[j];
else{p[j] = a[i];ans++;break;}
}
}
}
printf("%d\n",ans);
} int main(){
read();
work();
return ;
}
Codeforces1101G (Zero XOR Subset)-less 【线性基】【贪心】的更多相关文章
- CodeForces - 1101G :(Zero XOR Subset)-less(线性基)
You are given an array a1,a2,…,an of integer numbers. Your task is to divide the array into the maxi ...
- CF1101G (Zero XOR Subset)-less 线性基
传送门 既然每一次选择出来的都是一个子段,不难想到前缀和计算(然而我没有想到--) 设异或前缀和为\(x_i\),假设我们选出来的子段为\([1,i_1],(i_1,i_2],...,(i_{k-1} ...
- BZOJ 2460 & 洛谷 P4570 [BJWC2011]元素 (线性基 贪心)
题目链接: 洛谷 BZOJ 题意 给定 \(n\) 个矿石,每个矿石有编号和魔力值两种属性,选择一些矿石,使得魔力值最大且编号的异或和不为 0. 思路 线性基 贪心 根据矿石的魔力值从大到小排序. 线 ...
- bzoj 2115 Xor - 线性基 - 贪心
题目传送门 这是个通往vjudge的虫洞 这是个通往bzoj的虫洞 题目大意 问点$1$到点$n$的最大异或路径. 因为重复走一条边后,它的贡献会被消去.所以这条路径中有贡献的边可以看成是一条$1$到 ...
- BZOJ 4269: 再见Xor 线性基+贪心
Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. Input 第一行一个正整数N. 接下来一行N个非负整数. ...
- 【BZOJ-2460&3105】元素&新Nim游戏 动态维护线性基 + 贪心
3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 839 Solved: 490[Submit][Stat ...
- (Zero XOR Subset)-less-线性基
(Zero XOR Subset)-less 题意 :把n个数分成多个集合,要求 不能有集合为空,最终不能有非空子集合异或值为0,尽可能划分的多一些. 思路 :非法情况就只有 n个数异或 为0,其他的 ...
- BZOJ.2460.[BeiJing2011]元素(线性基 贪心)
题目链接 线性基:https://blog.csdn.net/qq_36056315/article/details/79819714. \(Description\) 求一组矿石,满足其下标异或和不 ...
- Codeforces 1100F(线性基+贪心)
题目链接 题意 给定序列,$q(1\leq q \leq 100000) $次询问,每次查询给定区间内的最大异或子集. 思路 涉及到最大异或子集肯定从线性基角度入手.将询问按右端点排序后离线处理询问, ...
随机推荐
- Windows下如何更新 CodeBlocks 中的 MinGW 使其支持新版本 C++
转自:http://blog.csdn.net/wtfmonking/article/details/17487705 虽然 CodeBlocks16.01 已经是最新版了,但其中的 MinGW 仍然 ...
- 1171: lfx捧杯稳啦!
escription Lfx在复习离散的时候突然想到了一个算法题,毕竟是lfx, 算法题如下: 他想知道这样的问题,先定义1~n中即是3的倍数,又是11的倍数的那些数的和sum, 他想知道sum有多少 ...
- 关于php,python,javascript文件或者模块导入引入的区别和联系
前言: 我们经常看到编程语言之间,文件或者模块的引来引去的,但是他们在各个编程语言之间有什么区别和联系呢? 1.javascript (1).全局引入方式: <script src='xxxxx ...
- elasticSearch聚合sum查询
有时需要统计一段时间内,订单的总金额.类似于sql的sum,针对某一字段求和.这就涉及到es的聚合查询,来看看用spring-data-elasticSearch怎么写: QueryBuilder ...
- 软工网络15团队作业8——Beta阶段敏捷冲刺
Deadline: 2018-5-31 22:00PM,以博客提交至班级博客时间为准 根据以下要求: (1)在敏捷冲刺前发布一篇博客,作为beta版敏捷冲刺的开始, (2)同时,团队在日期区间[5.2 ...
- Azure系列2.1.11 —— CloudBlobContainer
(小弟自学Azure,文中有不正确之处,请路过各位大神指正.) 网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习 ...
- [转帖]ulimit、limits.conf、sysctl和proc文件系统
ulimit.limits.conf.sysctl和proc文件系统 来源:https://blog.csdn.net/weixin_33918114/article/details/86882372 ...
- Setting property 'source' to 'org.eclipse.jst.jee.server:hczm' did not find a matching property
- 剑指offer(13)
题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 思路: 判断当前两个根结点是否相等,如果相等,判断左右子树是否相等,如果不依次判断左右子树是否满足上 ...
- Python基础知识1-基础语法
pyenv--版本管理工具(后续再补)可参见https://www.jianshu.com/p/8aaf2525fa80 冯诺依曼体系架构 编程基础 语言分类 低级语言到高级语言 高级语言 程序Pr ...