以后我也要用传送门!


题意:一些数,选择一个权值最大的异或和不为0的集合


终于有点明白线性基是什么了...等会再整理

求一个权值最大的线性无关子集

线性无关子集满足拟阵的性质,贪心选择权值最大的,用高斯消元判断是否和已选择的线性相关

每一位记录pivot[i]为i用到的行

枚举要加入的数字的每一个二进制为1的位,如果有pivot[i]那么就异或一下(消元),否则pivot[i]=这个数并退出

如果最后异或成0了就说明线性相关...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <bitset>
using namespace std;
typedef long long ll;
const int N=,INF=1e9;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,a[N],bin[];
ll ans,sum;
void ini(){
bin[]=;
for(int i=;i<=;i++) bin[i]=bin[i-]<<;
}
int pivot[N];
void Gauss(){
for(int i=;i<=n;i++){
int _=a[i];
for(int j=;j>=;j--) if(a[i]&bin[j]){
if(pivot[j]) a[i]^=a[pivot[j]];
else {pivot[j]=i;break;}
}
if(a[i]) ans+=_;
}
}
int main(){
freopen("in","r",stdin);
ini();
n=read();
for(int i=;i<=n;i++) a[i]=read(),sum+=a[i];
sort(a+,a++n,greater<int>());
Gauss();
if(!ans) puts("-1");
else printf("%lld",sum-ans);
}

bzoj2460 一样的

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <bitset>
using namespace std;
typedef long long ll;
const int N=;
inline ll read(){
char c=getchar();ll x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,pivot[N];
ll ans,bin[N];
struct data{
ll a,w;
bool operator <(const data &r)const{return w>r.w;}
}a[N];
void ini(){
bin[]=;
for(int i=;i<=;i++) bin[i]=bin[i-]<<;
}
void Gauss(){
for(int i=;i<=n;i++){
for(int j=;j>=;j--) if(a[i].a&bin[j]){
if(pivot[j]) a[i].a^=a[pivot[j]].a;
else {pivot[j]=i;break;}
}
if(a[i].a) ans+=a[i].w;
}
}
int main(){
freopen("in","r",stdin);
ini();
n=read();
for(int i=;i<=n;i++) a[i].a=read(),a[i].w=read();
sort(a+,a++n);
Gauss();
printf("%lld",ans);
}

BZOJ 3105: [cqoi2013]新Nim游戏 [高斯消元XOR 线性基]的更多相关文章

  1. 【bzoj3105】[cqoi2013]新Nim游戏 高斯消元求线性基

    题目描述 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴,但不能同时从 ...

  2. bzoj 3105: [cqoi2013]新Nim游戏 异或高消 && 拟阵

    3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 535  Solved: 317[Submit][Stat ...

  3. BZOJ 2844: albus就是要第一个出场 [高斯消元XOR 线性基]

    2844: albus就是要第一个出场 题意:给定一个n个数的集合S和一个数x,求x在S的$2^n$个子集从小到大的异或和序列中最早出现的位置 一开始看错题了...人家要求的是x第一次出现位置不是第x ...

  4. HDU 3949 XOR [高斯消元XOR 线性基]

    3949冰上走 题意: 给你 N个数,从中取出若干个进行异或运算 , 求最后所有可以得到的异或结果中的第k小值 N个数高斯消元求出线性基后,设秩为$r$,那么总共可以组成$2^r$中数字(本题不能不选 ...

  5. BZOJ 3105 [CQOI2013]新Nim游戏 ——线性基

    [题目分析] 神奇的题目,两人都可以第一次取走足够多堆的石子. nim游戏的规则是,如果异或和为0,那么就先手必输,否则先手有必胜策略. 所以只需要剩下一群异或和为0就可以了. 先排序,线性基扫一遍即 ...

  6. bzoj 3105: [cqoi2013]新Nim游戏【线性基+贪心】

    nim游戏的先手必胜条件是所有堆的火柴个数异或和为0,也就是找一个剩下火柴堆数没有异或和为0的子集的方案,且这个方案保证剩下的火柴个数总和最大 然后我就不会了,其实我到现在也不知道拟阵是个什么玩意-- ...

  7. BZOJ 3105: [cqoi2013]新Nim游戏(线性基)

    解题思路 \(nim\)游戏先手必胜的条件是异或和不为\(0\),也就是说第一个人拿走了若干堆后不管第二个人怎么拿都不能将剩余堆的异或和变成\(0\).考虑线性基,其实就是每个数对线性基都有贡献,任何 ...

  8. BZOJ 3105: [cqoi2013]新Nim游戏

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3105 题意是要取一些数使得剩余的数xor和的子集不为0 拟阵.求解极大线性无关组.贪心从大到小 ...

  9. BZOJ.3105.[CQOI2013]新Nim游戏(线性基 贪心 博弈论)

    题目链接 如果后手想要胜利,那么在后手第一次取完石子后 可以使石子数异或和为0.那所有数异或和为0的线性基长啥样呢,不知道.. 往前想,后手可以取走某些石子使得剩下石子异或和为0,那不就是存在异或和为 ...

随机推荐

  1. 解决JSONObject.fromObject数字为null时被转换为0

    在使用JSONObject.fromObject的时候会遇到一种情况就是当对象的某一个Double型或Integer型的属性为空的时候,转JSON的时候会变成0.当一个布尔型的属性为空的时候,转JSO ...

  2. centos7 hue安装

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  3. Function方法和属性图

  4. ubuntu 下 apt /apt-get command not found 命令找不到

    简介:apt 命令在ubuntu下找不到.(针对云平台,等可联网的ubuntu  如果是虚拟机,请确认能否联网 (如是虚拟机且不能联网请参考其他文章,大致方向是先挂载系统镜像再安装)) (ps:一般的 ...

  5. 我在vs文本编辑中常用的快捷键----常更新

    1. Ctrl+向上键----文本向上滚动  Ctrl+向下键----文本向下滚动  Ctrl+Enter-----向下增加一行  Ctrl+Shift+Enter-------向上增加一行 2. 避 ...

  6. linux利用sendmail发送邮件的方法

    Linux利用sendmail发送邮件, 方法1 安装sendmail即可使用, mail -s "test" user@sohu.com bin/mail会默认使用本地sendm ...

  7. ip 淘宝ip库 精简版

    <?php header('Content-type: text/html; charset=utf-8'); //根据ip获取城市.网络运营商等信息 function findCityByIp ...

  8. Java 中判断类和实例之间的关系

    判断类与实例的关系有以下三种方式 1.instanceof关键字,用来判断对象是否是类的实例 (对象 => 类 )   2.isAssignableFrom,用来判断类型间是否存在派生关系 (类 ...

  9. 用jquery怎么删除<table>的一行

    摘录网址:用jquery怎么删除<table>的一行 思路:获取<table>的一行,然后使用 remove() 方法删除之.实例演示如下: 1.HTML结构 <tabl ...

  10. mybatis_SQL映射(4)鉴别器

    摘录自:http://blog.csdn.net/y172158950/article/details/17505739 鉴别器:有时一个单独的数据库查询也许返回很多不同(但是希望有些关联)数据类型的 ...