传送门

拿到这道题就知道是典型的博弈论,但是却不知道怎么设计它的SG函数。看了解析一类组合游戏这篇论文之后才知道这道题应该怎么做。

这道题需要奇特的模型转换。即把每一个石子当做一堆石子,且原来在第i堆的石子(从0开始标号)的石子个数为n-i-1,这样题目就转化成了每次取一堆石子,并放回两个比这一堆的石子个数少的石堆。这样,我们就可以有序的递推sg函数值了。

即:

sg(i)=mex({sg[j]  xor  sg[k]})

其中j≤i且k≤i

#include <cstdio>
#define MAXN 25
int sg[MAXN], n, a[MAXN];
bool used[MAXN];
void init() {
for(int i = 1; i < MAXN; ++ i) {
for(int j = 0; j < MAXN; ++ j)used[j] = 0;
for(int j = 0; j < i; ++ j)
for(int k = 0; k <= j; ++ k)
used[sg[j]^sg[k]] = 1;
for(int j = 0; j < MAXN; ++ j) if(!used[j]) {
sg[i] = j; break;
}
}
}
int main() {
init(); int T; scanf("%d", &T);
while(T --) {
scanf("%d", &n);
int ans = 0, cnt = 0;
for(int i = 0; i < n; ++ i) {
scanf("%d", &a[i]);
if(a[i] & 1) ans ^= sg[n-i-1];
}
for(int i = 0; i < n; ++ i) {
if(!a[i]) continue;
for(int j = i+1; j < n; ++ j) {
if(!a[j]) continue;
for(int k = j; k < n; ++ k) {
if(!a[k]) continue;
if((ans ^ sg[n-i-1] ^ sg[n-j-1] ^ sg[n-k-1]) == 0) {
if(!cnt) printf("%d %d %d\n", i, j, k);
++ cnt;
}
}
}
}
if(!cnt) puts("-1 -1 -1");
printf("%d\n", cnt);
}
return 0;
}

BZOJ1188 [HNOI2007]分裂游戏(SG函数)的更多相关文章

  1. bzoj 1188 [HNOI2007]分裂游戏 SG函数 SG定理

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

  2. BZOJ 1188 / Luogu P3185 [HNOI2007]分裂游戏 (SG函数)

    题意 有n个格子,标号为0 ~ n-1,每个格子上有若干石子,每次操作可以选一个0 ~ n-2的格子上的一颗石子,分裂为两颗,然后任意放在后面的两个格子内,这两个格子可以相同.求使先手必胜的第一步的方 ...

  3. bzoj 1188 : [HNOI2007]分裂游戏 sg函数

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

  4. bzoj1188 [HNOI2007]分裂游戏 博弈论 sg函数的应用

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

  5. [bzoj1188][HNOI2007]分裂游戏_博弈论

    分裂游戏 bzoj-1188 HNOI-2007 题目大意:题目链接. 注释:略. 想法: 我们发现如果一个瓶子内的小球个数是奇数才是有效的. 所以我们就可以将问题变成了一个瓶子里最多只有一个球球. ...

  6. 【博弈论】【SG函数】【枚举】bzoj1188 [HNOI2007]分裂游戏

    因为第i个瓶子里的所有豆子都是等价的,设sg(i)表示第i个瓶子的sg值,可以转移到sg(j)^sg(k)(i<j<n,j<=k<n)的状态. 只需要考虑豆子数是奇数的瓶子啦, ...

  7. bzoj1188: [HNOI2007]分裂游戏

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

  8. BZOJ1188:[HNOI2007]分裂游戏(博弈论)

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

  9. [BZOJ1188][HNOI2007]分裂游戏(博弈论)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1188 分析: 设SG[i]表示一个石子在位置i上的SG值 这个很容易暴力求,因为i的后 ...

随机推荐

  1. scala学习之: Flatten a nested list structure

    题目要求: (**) Flatten a nested list structure. Example: scala> flatten(List(List(1, 1), 2, List(3, L ...

  2. MySQL出现Access denied for user 'root'@'%' to database 'netai_test'问题

    访问数据库时报错信息 Access denied for user 'root'@'%' to database 'netai_test' 原因:这是由于创建数据库后没有对用户授权,使用户可以访问数据 ...

  3. C++STL学习笔记_(1)vector知识

    #include<iostream> using namespace std; #include "vector" //数组元素的 添加和删除 void main31( ...

  4. 根目录97 <input file>标签,把图片上传到服务器(跟增删改查一起实现)

    首先来个简单的html页面: enctype="multipart/form-data" encoding="multipart/form-data" acti ...

  5. 第七章 consul docker集群

    --net=host:运行consul的docker镜像必须带有的参数,因为consul的consensus和gossip协议对于网络的延迟和丢包很敏感,所以引入额外的其他网络类型的层是不可取并且不必 ...

  6. 一份不错的vue.js基础笔记!!!!

    第一章 Vue.js是什么? Vue(法语)同view(英语) Vue.js是一套构建用户界面(view)的MVVM框架.Vue.js的核心库只关注视图层,并且非常容易学习,非常容易与其他库或已有的项 ...

  7. C#获得客户端IP

    代码: /// <summary> /// 获得当前页面客户端的IP /// </summary> /// <returns>当前页面客户端的IP</retu ...

  8. spark 运行问题记录

    在CDH5.5.2上运行spark1.5的程序,运行起来就直接shutdown,并报出如下的异常:  INFO YarnClientSchedulerBackend: SchedulerBackend ...

  9. CentOS 6.5 RPM包方式安装 Mysql 5.6

    1. 下载MySQL 5.6 下载页面:http://dev.mysql.com/downloads/mysql/此处选择“Red Hat Enterprise Linux 6 / Oracle Li ...

  10. intel显卡笔记本恢复屏幕亮度调整功能

    更新Intel显卡驱动后不能修改屏幕亮度,可以在注册表里面搜索featuretestcontrol,将f000修改为ffff,重启后就可以通过Fn+F4/F5调整屏幕亮度了. 注:此方法适用于带有in ...