博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ.3759.Hungergame(博弈论 线性基)
阅读量:5010 次
发布时间:2019-06-12

本文共 1046 字,大约阅读时间需要 3 分钟。

(已不支持提交)

\(Description\)

有n堆锁定的石子,每次操作可以解锁某些堆石子,或是从一堆已解锁的石子堆中拿任意多个(>0),最后无法操作者输。问先手是否必胜。

\(Solution\)

如果不考虑未解锁的,现在有一些已解锁的石子,先手想要必胜 可以在他操作完后使(已解锁的)石子堆异或和为0。但是如果未解锁的石子堆中存在异或和为0的,后手解锁它们可以使先手面临必败态。

所以如果有异或和为0的某些石子堆,先手会在最初把它们都解锁掉,不给后手翻盘机会,那他必胜。
而如果不存在异或和为0的某些石子堆,即先手要解锁一些石子堆开始,那把上面过程的先手、后手交换下,状态为无未解锁的异或和为0的石子堆,可知先手必败。
所以直接用线性基判断有无异或和为0的某些石子堆即可。

#include 
#include
#include
#define gc() getchar()#define Bit 29int base[33];inline int read(){ int now=0;register char c=gc(); for(;!isdigit(c);c=gc()); for(;isdigit(c);now=now*10+c-'0',c=gc()); return now;}inline bool Insert(int x,bool f){ if(f) return 1; for(int i=Bit; ~i; --i) if(x>>i&1) if(base[i]) x^=base[i]; else {base[i]=x; break;} return x==0;}int main(){ int T=read(); while(T--) { memset(base,0,sizeof base); int n=read(); bool f=0; while(n--) f|=Insert(read(),f); puts(f?"Yes":"No"); } return 0;}

转载于:https://www.cnblogs.com/SovietPower/p/9335900.html

你可能感兴趣的文章
Practial Vim 学习笔记一
查看>>
.NET中使用js实现百度搜索下拉提示效果[不是局部刷新,呜呜。。]
查看>>
ITCAST视频-Spring学习笔记(使用Spring的注解方式实现AOP入门)
查看>>
关于二维码“QR”的6大注意事项
查看>>
MySQL - 常用命令及常用查询SQL
查看>>
C# .NET MVC 接收 JSON ,POST,WCF 无缝隙切换
查看>>
android获取USB设备的名称
查看>>
JavaPersistenceWithHibernate第二版笔记-第七章-005排序的集合(@org.hibernate.annotations.SortComparator)...
查看>>
ue4同c#通信时的中文乱码问题
查看>>
黄老师架构师课程笔记(二)
查看>>
mvc性能优化
查看>>
log
查看>>
663 如何做“低端”产品?(如何把低端做得高端 - 认同感)
查看>>
JDBC 第九课 —— 初次接触 JUnit
查看>>
Windows核心编程:第10章 同步设备IO与异步设备IO
查看>>
浏览器加载、解析、渲染的过程
查看>>
开放api接口签名验证
查看>>
sed 常用操作纪实
查看>>
C++复习:对C的拓展
查看>>
校外实习报告(九)
查看>>