洛谷$P$4301 $[CQOI2013]$新$Nim$游戏 线性基+博弈论
正解:线性基
解题报告:
这题其实就是个博弈论+线性基,,,而且博弈论还是最最基础的那个结论,然后线性基也是最最基础的那个板子$QwQ$
首先做这题的话需要一点点儿博弈论的小技能,,,这题的话就是,博弈论的入门经典题,有个结论是当开局的时候所有数异或起来不等于0的时候先手必胜
这儿瞎证下趴,,,因为是入门$so$还是比较$easy$证的来着$QwQ$
就考虑把所有数换算成二进制的
如果石子数异或和不为0,那么考虑如果先手能通过取石子数使石子数异或和为0的话,那么接下来要不就还存在石子数,要不就没有了
在没有的情况下就先手获胜了嘛,不说
如果还有,后手就一定会取,就一定会在取了之后异或起来不等于0
然后就又轮到先手,就又变成了异或和不为0的情况,就只要通过取石子使得石子数异或起来又=0就欧克了,这个显然就很$easy$了鸭,就是把所有不为0的位$i$的$2^{i}$加起来取走就可以了,显然这个值是小于等于最大堆的石子数的,太显然不证了$QAQ$
综上,就证完了$NIM$游戏的必胜战略:当开局所有数异或起来不等于0的时候先手必胜
然后这题有了这个结论其实就比较简单了鸭$QwQ$
就考虑能不能通过取石子使得开局异或起来一定不等于0
现在考虑把先手第一轮取走了石子之后剩余石子的状态搞一个线性基,然后显然的是如果有一个石子数是可以被异或出来的,先手就$GG$了,就后手可以通过直接取走那堆石子使得异或起来=0,这时候先手就死了
然后现在如果能证出当任意一个一个石子堆不可以被其他石子堆表示出来时,后手一定不能通过第二轮把初始状态变为所有数异或起来等于0,这题就变成一个线性基板子题了$QwQ$
下面瞎证下趴,,,$QwQ$
不想证了感觉是显然,,,就因为不存在$a_{1}$^$a_{2}$^$... = a_{n} $
所以不可能有拿走了$ a_{n} $之后异或和=0的情况
然后证完之后,就直接贪心从大到小能加就加,不说了挺$easy$的还是$QwQ$,不能$get$的打开那个板子题的题解趴
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define int long long
#define gc getchar()
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int N=1e5+;
int n,ston[N],tot;
struct xxj
{
int a[];
il bool insrt(ri x)
{
my(i,,)
if(x&(<<i))
{
if(a[i])x^=a[i];
else return a[i]=x,;
}
return ;
}
}gdgs; il int read()
{
ri x=;rb y=;rc ch=gc;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il bool cmp(ri gd,ri gs){return gd>gs;} main()
{
n=read();rp(i,,n)ston[i]=read();sort(ston+,ston+n+,cmp);rp(i,,n)if(!gdgs.insrt(ston[i]))tot+=ston[i];printf("%lld\n",tot);
return ;
}
最新文章
- knockoutJS学习笔记06:ko数组与模板绑定
- 总结ThinkPHP使用技巧经验分享(二)
- 深入.net(多态一)
- WPF 组合快捷键
- Android 广播大全 Intent Action 事件
- PHP 下载文件时自动添加bom头的方法
- UDP HelloWord
- TCP调试助手
- Kaggle Bike Sharing Demand Prediction – How I got in top 5 percentile of participants?
- pojo的序列化和反序列化
- spring util命名空间
- 采用 audio 和 embed 实现浏览器的兼容性页音频播放
- linux下登陆mysql失败
- I3D Next-Gen Game Development with Unity3D Vol I学习笔记(上)
- js中的数字格式变成货币类型的格式
- Locust性能测试框架,从入门到精通
- 从驱动层分析android的Binder机制-android学习之旅(83)
- ubuntu下搭建gtk+编程环境
- 学python走过的坑 二 element与elements的却别
- SQL语句中 INNER JOIN的用法!