[BZOJ 1188] [HNOI2007] 分裂游戏 【博弈论|SG函数】

时间:2022-01-02 09:11:25

题目链接:BZOJ - 1188

题目分析

我们把每一颗石子看做一个单个的游戏,它的 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 <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath> 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;
}

  

[BZOJ 1188] [HNOI2007] 分裂游戏 【博弈论|SG函数】的更多相关文章

  1. bzoj 1188 &lbrack;HNOI2007&rsqb;分裂游戏(SG函数,博弈)

    1188: [HNOI2007]分裂游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 733  Solved: 451[Submit][Status ...

  2. bzoj1188 &lbrack;HNOI2007&rsqb;分裂游戏 博弈论 sg函数的应用

    1188: [HNOI2007]分裂游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 973  Solved: 599[Submit][Status ...

  3. bzoj 1188 &lbrack;HNOI2007&rsqb;分裂游戏 SG函数 SG定理

    [HNOI2007]分裂游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1394  Solved: 847[Submit][Status][Dis ...

  4. BZOJ 1188&colon; &lbrack;HNOI2007&rsqb;分裂游戏&lpar;multi-nim&rpar;

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1386  Solved: 840[Submit][Status][Discuss] Descripti ...

  5. BZOJ 1188 &lbrack;HNOI2007&rsqb;分裂游戏

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1188 学习SG函数的过程中,我先看了一篇叫做 <2008-贾志豪-组合数学略述... ...

  6. bzoj 1188 &colon; &lbrack;HNOI2007&rsqb;分裂游戏 sg函数

    题目链接 给n个位置, 每个位置有一个小球. 现在两个人进行操作, 每次操作可以选择一个位置i, 拿走一个小球.然后在位置j, k(i<j<=k)处放置一个小球. 问你先进行什么操作会先手 ...

  7. BZOJ1188&colon;&lbrack;HNOI2007&rsqb;分裂游戏&lpar;博弈论&rpar;

    Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏.该游戏的规则试:共有n个瓶子,标号为0,1,2.....n-1,第i个瓶子中装有p[i]颗巧克力豆,两个人轮流取豆子,每一轮每人选择3个 ...

  8. &lbrack;2016北京集训试题6&rsqb;魔法游戏-&lbrack;博弈论-sg函数&rsqb;

    Description Solution 首先,每个节点上的权值可以等价于该节点上有(它的权的二进制位数+1)个石子,每次可以拿若干个石子但不能不拿. 然后就发现这和NIM游戏很像,就计算sg函数em ...

  9. BZOJ P1188 HNOI2007 分裂游戏——solution

    题目描述: (<--这个) 组合游戏,——把每个石头看做一个游戏, Multi_game——消去i上的石子后,,k上的游戏又多了一个: 于是就套用multi_game的模型即可 求解SG函数时, ...

随机推荐

  1. sk&lowbar;buff封装和解封装网络数据包的过程详解(转载)

    http://dog250.blog.51cto.com/2466061/1612791 可以说sk_buff结构体是Linux网络协议栈的核心中的核心,几乎所有的操作都是围绕sk_buff这个结构体 ...

  2. GHOST -ntexact 正常还原

    我常常用PE启动电脑,用PE下的GHOST软件恢复备份的系统,但最近恢复WIN10备份时出了问题,出现25002错误,恢复其他备份正常,原因不明 解决办法是在PE中运行CMD,启动DOS,然后进入GH ...

  3. ubuntu修改主机名和出现问题

    修改主机名方法,修改/etc/hostname即可,但是修改完成后,每次sudo都出现警告,警告解决方法如下: Linux 环境, 假设这台机器名字叫dev(机器的hostname), 每次执行sud ...

  4. Linux编程之epoll

    现在有这么一个场景:我是一个很忙的大老板,我有100个手机,手机来信息了,我的秘书就会告诉我"老板,你的手机来信息了."我很生气,我的秘书就是这样子,每次手机来信息就只告诉我来信息 ...

  5. 如何用&period;reg文件操作注册表

    Windows Registry Editor Version 5.00 ;删除值 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpi ...

  6. js&colon; var定义域问题

  7. Action Form的过程

    1.读取配置(初始化ModuleConfig对象) Struts框架总控制器(ActionServlet)是一个Servlet, 在web.xml中配置成自动启动的Servlet. 读取配置文件(st ...

  8. Android开发 ---基本UI组件3:单选按钮、多选按钮、下拉列表、提交按钮、重置按钮、取消按钮

    Android开发 ---基本UI组件2 1.activity_main.xml 描述: 定义一个用户注册按钮 <?xml version="1.0" encoding=&q ...

  9. html播放音乐

    如何在网站网页中添加音乐代码 告诉你多种格式文件的详细使用代码.    width_num——指定一个作为宽度的数字:    height_num——指定一个作为高度的数字:     1.mp3    ...

  10. JSP 基础&lpar;一&rpar;

    JavaServletPage(JSP) 一 JSP简介       Servlet的缺陷       –Servlet的编码.部署和调试任务繁琐       –生成动态网页繁琐,不利于项目分工   ...