博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ 1188] [HNOI2007] 分裂游戏 【博弈论|SG函数】
阅读量:4582 次
发布时间:2019-06-09

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

题目链接:

 

题目分析

我们把每一颗石子看做一个单个的游戏,它的 SG 值取决于它的位置。

对于一颗在 i 位置的石子,根据游戏规则,它的后继状态就是枚举符合条件的 j, k。然后后继状态就是 j 与 k 这两个游戏的和。

游戏的和的 SG 值就是几个单一游戏的 SG 值的异或和。

那么还是根据 SG 函数的定义 , 即 SG(u) = mex(SG(v)) ,预处理求出每个位置的 SG 值。一个位置的 SG 值与它后面的位置有关,是取决于它是倒数第几个位置,那么我们预处理求出的 SG[i] 是指倒数第 i 个位置的 SG 值。

还有一个十分重要的性质,我们不需要考虑每个位置上石子的数量,只需要考虑数量的奇偶,因为如果有偶数个石子,那么这个位置的 SG 值会被异或到整个状态的 SG 中共偶数次,就会抵消,相当于没有。

奇数就是相当于偶数 + 1,因此只要异或一次即可。

组合游戏真是有许多神奇的性质Orz。

 

代码

#include 
#include
#include
#include
#include
#include
using namespace std;const int MaxN = 25, N = 21;int T, n, Mark_Index;int A[MaxN], SG[MaxN], Mark[MaxN * MaxN];void Prepare_SG() { Mark_Index = 0; memset(Mark, 0, sizeof(Mark)); for (int i = 1; i <= N; ++i) { ++Mark_Index; for (int j = i - 1; j >= 1; --j) for (int k = j; k >= 1; --k) Mark[SG[j] ^ SG[k]] = Mark_Index; for (int j = 0; j <= N * N; ++j) { if (Mark[j] != Mark_Index) { SG[i] = j; break; } } }}int main() { scanf("%d", &T); Prepare_SG(); for (int Case = 1; Case <= T; ++Case) { scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%d", &A[i]); int Temp = 0, Tot = 0; for (int i = 1; i <= n; ++i) if (A[i] & 1) Temp ^= SG[n - i + 1]; for (int i = 1; i <= n; ++i) { if (A[i] == 0) continue; for (int j = i + 1; j <= n; ++j) { for (int k = j; k <= n; ++k) { if ((Temp ^ SG[n - i + 1] ^ SG[n - j + 1] ^ SG[n - k + 1]) != 0) continue; ++Tot; if (Tot == 1) printf("%d %d %d\n", i - 1, j - 1, k - 1); } } } if (Tot == 0) printf("-1 -1 -1\n"); printf("%d\n", Tot); } return 0;}

  

转载于:https://www.cnblogs.com/JoeFan/p/4259055.html

你可能感兴趣的文章
C语言-->(二)进制
查看>>
洛谷$2015$二叉苹果树
查看>>
EL表达式 JSTL的标签库 EL的函数 自定义EL函数 自定义标签 JSP的开发模式 注册登陆案例...
查看>>
康托展开(有关全排列)
查看>>
Selenium基本用法以及元素定位
查看>>
2017-2018 ACM-ICPC Latin American Regional Programming Contest GYM101889
查看>>
常见开发语言擅长领域
查看>>
二叉树的非递归遍历
查看>>
AutoMapper使用中的问题
查看>>
遍历Map key-value的两种方法
查看>>
Js实现页面关键字高亮显示
查看>>
k8s--yml文件2
查看>>
uni-app引入阿里矢量图在移动端不显示的问题
查看>>
H3C 子网划分方法
查看>>
java 字节→字符转换流
查看>>
HTML5 -新元素
查看>>
Objective-C释解 Target-Action模式
查看>>
phpcms专题路径修改
查看>>
大话CNN经典模型:VGGNet
查看>>
Linux目录操作的常用系统函数说明
查看>>