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) $次询问,每次查询给定区间内的最大异或子集. 思路 涉及到最大异或子集肯定从线性基角度入手.将询问按右端点排序后离线处理询问, ...
随机推荐
- Angular刷新浏览器 404 问题
最近在用angular写一个后台的项目,遇到一个小问题. 进入某个路由页面之后,手动触发浏览器的刷新,然后就404了... 翻看Angular的文档,发现Google早已经给我们想到了这个问题的处理方 ...
- WPF仿网易云音乐系列(一、左侧菜单栏:Expander+RadioButton)
1.简介 上一篇咱们说到,网易云音乐的左侧菜单栏可以通过Expander+RadioButton来实现,具体如何实现,咱们下面开始干: 首先来一张网易云音乐PC版原图(个人觉得PC版比UWP版左侧菜单 ...
- 从 0 到 1 实现 react - 9.onChange 事件以及受控组件
该系列文章在实现 cpreact 的同时理顺 React 框架的核心内容 项目地址 从一个疑问点开始 接上一章 HOC 探索 抛出的问题 ---- react 中的 onChange 事件和原生 DO ...
- Windows下如何更新 CodeBlocks 中的 MinGW 使其支持新版本 C++
转自:http://blog.csdn.net/wtfmonking/article/details/17487705 虽然 CodeBlocks16.01 已经是最新版了,但其中的 MinGW 仍然 ...
- 软件工程(FZU2015) 学生博客列表(最终版)
FZU:福州大学软件工程 张老师的博客:http://www.cnblogs.com/easteast/ 经过前两周选课,最后正式选上课程的所有学生博客如下: 序号 学号后3位 博客 1 629 li ...
- pycharm导入自己写的.py文件时,模块下方出现红色波浪线解决
点击菜单栏的File,选择Setting, 然后,选择需要导入的.py文件“所在的目录",而非项目根目录,右键 之后再导入该.py文件就不会出现红色波浪线了.
- Consecutive Subsequence CodeForces - 977F (map优化DP)·
You are given an integer array of length nn. You have to choose some subsequence of this array of ma ...
- MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义
varchar与char的区别: 1).varchar与char的区别char是一种固定长度的类型,varchar则是一种可变长度的类型 尽可能的使用 varchar 代替 char ,因为首先变长 ...
- hana-banach定理
1. x1不是X除开G以外所有的空间 2.如果极大元不是全空间的话,根据前面的讨论,还可以延拓,这就和极大矛盾了
- 使用redis限制ip访问次数
策略1: 在redis中保存一个count值(int),key为user:$ip,value为该ip访问的次数,第一次设置key的时候,设置expires. count加1之前,判断是否key是否存在 ...