【BZOJ4600】硬币游戏,博弈
传送门
思路:
考场爆零系列
因为当时博弈pi都不会,连SG函数是啥都不知道
现在会了一点点博弈,来看一下
很快写出了10分(n<=16)做法……
orz Va爷的题解
感觉Va爷的博客思路讲的不是很清楚,昨天晚上想了很久,感觉有一个比较合适的解释
我们发现初始状态是可以分解成若干只有一个是反面朝上,即ai=1a_i=1的状态
举例来说,对于样例
10010000100010111 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1
这个状态的子状态就是11,00010001,000000001000000001,00000000000010000000000001,00000000000010000000000001,000000000000001000000000000001和00000000000000010000000000000001
类似分治子问题的思想
也就是说,如果我们当前从左向右扫到第i枚硬币为1(反面朝上),那么前面1~i-1的硬币都是0(正面朝上)
显然对[1,i]的硬币进行操作是对>i的硬币没有影响的
那我们把问题变成求”[1,i]区间中a[i]=1,其余为0”状态下的SG函数,状态表示为sg[i]sg[i]
做完这个子状态后再继续往后扫,扫到j
我们就可以看成前面那个i的子状态已经解决了,那么状态肯定是”[1,j]区间中a[j]=1,其余为0”
这和上面是同一个问题
初始状态的SG函数就是这些子状态的异或和
那怎么求这些子状态的SG函数?
按照题目给出的规则暴力枚举p,q就可以了
比如说我们正在处理状态xx
枚举某一后继状态x′ix'_i,其中x′ix'_i中要翻过来的硬币是x1,x2,x3,..xnx_1,x_2,x_3,..x_n
(显然这些硬币都是≤x≤x的)
我们可以把这个状态表示为x′ix'_i={x1,x2,x3,..xnx_1,x_2,x_3,..x_n}
那么这又是最上面我们所说的拆分子状态了
即x′ix'_i={x1x_1}∪{x2x_2}∪{x3x_3}∪..∪{xnx_n}
sg[x′i]sg[x'_i]=sg[x1]sg[x_1] xor sg[x2]sg[x_2] xor .. xor sg[xn]sg[x_n]
枚举出x的所有后继状态,求出mex(最小未出现自然数)就是sg[x]啦
这里给出一个结论(仅面向初学者)
一个状态的SG=它的所有后继状态的SG的mex=它的所有子状态的SG的异或和
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int T,n,maxn;
int sg[21][30005],a[30005];
bool b[55];
void dp(int y)
{if (sg[maxn][y]!=-1) return;memset(b,0,sizeof(b));int ta=0,tb=0,tc=y,tt,ty;for (;tc%2==0;tc/=2) ++ta;for (;tc%3==0;tc/=3) ++tb;for (int q=1;q<=maxn;++q)for (int p=1;p*q<=ta;++p){tt=y;ty=-1;for (int j=0;j<=q;++j){if (tt==y) ty=0;else ty=(ty==-1?sg[maxn][tt]:ty^sg[maxn][tt]);for (int k=1;k<=p;++k) tt/=2;}if (ty!=-1) b[ty]=1;}for (int q=1;q<=maxn;++q)for (int p=1;p*q<=tb;++p){tt=y;ty=-1;for (int j=0;j<=q;++j){if (tt==y) ty=0;else ty=(ty==-1?sg[maxn][tt]:ty^sg[maxn][tt]);for (int k=1;k<=p;++k) tt/=3;}if (ty!=-1) b[ty]=1;}for (int i=0;i<55;++i)if (!b[i]) return void(sg[maxn][y]=i);
}
main()
{memset(sg,-1,sizeof(sg));for (scanf("%d",&T);T;--T){ scanf("%d%d",&n,&maxn);int ans=0;for (int i=1;i<=n;++i) dp(i);for (int i=1;i<=n;++i){scanf("%d",a+i);if (!a[i]) ans^=sg[maxn][i];}if (ans) puts("win");else puts("lose");}
}
【BZOJ4600】硬币游戏,博弈相关推荐
- 浅谈 翻硬币游戏【Nim博弈】
ACM博客_kuangbin 博弈-翻硬币游戏 hihoCoder 1172 : 博弈游戏·Nim游戏·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Alice和B ...
- JZOJ 1322. 硬币游戏
Description FJ的奶牛喜欢玩硬币游戏,所以FJ发明了一个新的硬币游戏.一开始有N(5<=N<=2,000)个硬币堆成一叠,从上往下数第i个硬币有一个整数值C_i(1<=C ...
- JZOJ 1322 硬币游戏
题目大意: FJ的奶牛喜欢玩硬币游戏,所以FJ发明了一个新的硬币游戏.一开始有N(5<=N<=2,000)个硬币堆成一叠,从上往下数第i个硬币有一个整数值C_i(1<=C_i< ...
- JZOJ1322. 硬币游戏
Description FJ的奶牛喜欢玩硬币游戏,所以FJ发明了一个新的硬币游戏.一开始有N(5<=N<=2,000)个硬币堆成一叠,从上往下数第i个硬币有一个整数值C_i(1<=C ...
- 2017(秋)软工作业: (2)硬币游戏—— 代码分析与改进
作业目的 Python 程序阅读理解 学习Python 编码风格指南中译版(Google SOC), 改进Python程序 如何设计游戏规则,使得慈善事业可持续. 地铁口放置硬币箱(初始值500硬币) ...
- 51nod 1381 硬币游戏 概率
1381 硬币游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 有一个简单但是很有趣的游戏.在这个游戏中有一个硬币还有一张桌子,这张桌子上有很多平 ...
- [Sdoi2017]硬币游戏 [高斯消元 KMP]
[Sdoi2017]硬币游戏 题意:硬币序列,H T等概率出现,\(n \le 300\)个人猜了一个长为$ m \le 300$的字符串,出现即获胜游戏结束.求每个人获胜概率 考场用了[1444: ...
- 软工作业2:硬币游戏——代码的分析与改进
目的: Python 程序阅读理解 学习Python 编码风格指南中译版(Google SOC), 改进Python程序 如何设计游戏规则,使得慈善事业可持续. 地铁口放置硬币箱(初始值500硬币), ...
- 【BZOJ4820】[SDOI2017]硬币游戏(高斯消元)
[BZOJ4820][SDOI2017]硬币游戏(高斯消元) 题面 BZOJ 洛谷 题解 第一眼的感觉就是构\(AC\)自动机之后直接高斯消元算概率,这样子似乎就是\(BZOJ1444\)了.然而点数 ...
- BZOJ 1411Vijos 1544 : [ZJOI2009]硬币游戏【递推,快速幂】
1411: [ZJOI2009]硬币游戏 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 897 Solved: 394 [Submit][Stat ...
最新文章
- “小霸王学习机”再现?树莓派400正式发布,售价70美元
- Fedora安装Texlive2013时出现Can't locate Digest/MD5.pm的解决方法
- Swift--基本数据类型(二)
- C++:vector中的resize()函数 VS reserve()函数
- c语言指针怎样代替二维数组,c语言 指针和二维数组
- 头条终面:写个消息中间件
- win7 64位 VS2010调试提示“ORA-12154: TNS: 无法解析指定的连接标识符”的解决方法
- python中的递归函数是什么_Python中的递归函数是什么
- 变量、作用域和内存问题
- 【web前端】a只显示visited属性问题解决方法
- 切图具体需要切什么内容_什么是切图?网页制作中的切图是什么?
- android开发 自我优势_android开发简历自我评价怎么写
- Tensorflow教程之语音识别
- 报The requested URL / was not found on thisserver. 网站打开出现404
- 《青玉案·元夕》 辛弃疾
- origin3D作图surface和等高线图contor
- 快速学习编程语言,快速高效的入门
- revit卸载/完美解决安装失败/如何彻底卸载清除干净revit各种残留注册表和文件的方法
- ae打开模板显示不出来_打开AE模板提示缺少rsmb pro插件的解决办法
- 创新药、大协同,科天云助力信达生物全球创新研发
热门文章
- 野生前端的数据结构基础练习(6)——集合
- NVDLA软件架构和源码解析 第一章—内核驱动
- Redis事务和秒杀业务设计
- 2021-07-12 原来我用的是CPU,更改方法
- 如何查看pytorch中层的名字
- 广告拦截之easylist和easylistchina订阅地址
- 怎样在word中同时输入上下标
- day4 java中print,printf,println的区别
- java 资深_Java架构师之路:从Java码农到资深架构师
- datareader对象转化为int_【Angew. Chem. Int. Ed.】光催化丙二烯的去消旋反应