BZOJ1188:[HNOI2007]分裂游戏(博弈论)
Description
Input
Output
Sample Input
4
1 0 1 5000
3
0 0 1
Sample Output
1
-1 -1 -1
0
Solution
首先可以发现,若一个位置豆子是偶数,且先手取了这个位置,显然后手可以通过进行和先手相同的操作来抵消这一步。
所以就可以把每个位置的豆子数$mod~2$,并将他们看成一个单独的游戏,同时记搜一下这个游戏的$SG$值。
虽然把每个豆子看成单独的游戏,但显然他们的$SG$值是可以共用的。
记忆化搜索每个豆子的$SG$值,当前是第$i$个位置的话显然有多种后继状态,每一种的$SG$值是$SG[j]~xor~SG[k]$。因为当前第$i$个位置的后继状态可以看做是$j$和$k$两个子局面的$SG$值异或得到总局面$SG$值。
输出方案就枚举三个位置$i,j,k$,如果全局异或值$ ~xor~ SG[i] ~xor~ SG[j] ~xor~ SG[k]=0$,那么说明先手取完这三个位置之后后手就必输了。
Code
#include<iostream>
#include<cstring>
#include<cstdio>
#define N (30009)
using namespace std; int T,n,ans,tot,a[N],SG[N],vis[N]; int DFS(int x)
{
if (SG[x]!=-) return SG[x];
for (int i=x+; i<=n; ++i)
for (int j=i; j<=n; ++j)
vis[DFS(i)^DFS(j)]=x;
int p=;
while (vis[p]==x) p++;
return SG[x]=p;
} int main()
{
scanf("%d",&T);
while (T--)
{
memset(SG,-,sizeof(SG));
memset(vis,,sizeof(vis));
ans=; tot=;
scanf("%d",&n);
for (int i=; i<=n; ++i)
scanf("%d",&a[i]);
for (int i=; i<=n; ++i) DFS(i);
for (int i=; i<=n; ++i)
if (a[i]&) ans^=SG[i];
for (int i=; i<=n; ++i)
for (int j=i+; j<=n; ++j)
for (int k=j; k<=n; ++k)
if ((ans^SG[i]^SG[j]^SG[k])==)
{
if (!tot) printf("%d %d %d\n",i-,j-,k-);
++tot;
}
if (!tot) puts("-1 -1 -1");
printf("%d\n",tot);
}
}
BZOJ1188:[HNOI2007]分裂游戏(博弈论)的更多相关文章
- bzoj1188 [HNOI2007]分裂游戏 博弈论 sg函数的应用
1188: [HNOI2007]分裂游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 973 Solved: 599[Submit][Status ...
- [bzoj1188][HNOI2007]分裂游戏_博弈论
分裂游戏 bzoj-1188 HNOI-2007 题目大意:题目链接. 注释:略. 想法: 我们发现如果一个瓶子内的小球个数是奇数才是有效的. 所以我们就可以将问题变成了一个瓶子里最多只有一个球球. ...
- [BZOJ1188][HNOI2007]分裂游戏(博弈论)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1188 分析: 设SG[i]表示一个石子在位置i上的SG值 这个很容易暴力求,因为i的后 ...
- 【博弈论】【SG函数】【枚举】bzoj1188 [HNOI2007]分裂游戏
因为第i个瓶子里的所有豆子都是等价的,设sg(i)表示第i个瓶子的sg值,可以转移到sg(j)^sg(k)(i<j<n,j<=k<n)的状态. 只需要考虑豆子数是奇数的瓶子啦, ...
- BZOJ1188 [HNOI2007]分裂游戏(SG函数)
传送门 拿到这道题就知道是典型的博弈论,但是却不知道怎么设计它的SG函数.看了解析一类组合游戏这篇论文之后才知道这道题应该怎么做. 这道题需要奇特的模型转换.即把每一个石子当做一堆石子,且原来在第i堆 ...
- bzoj1188: [HNOI2007]分裂游戏
Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子 ...
- [HNOI2007]分裂游戏 博弈论
题面 题面 题解 这题的思路比较特别,观察到我们的每次操作实质上是对于一颗豆子的操作,而不是对一瓶豆子的操作,因此我们要把每颗豆子当做一个独立的游戏,而它所在的瓶子代表了它的SG值. 瓶子数量很少,因 ...
- 【BZOJ1188】分裂游戏(博弈论)
[BZOJ1188]分裂游戏(博弈论) 题面 BZOJ 洛谷 题解 这道题目比较神仙. 首先观察结束状态,即\(P\)状态,此时必定是所有的豆子都在最后一个瓶子中. 发现每次的转移一定是拿出一棵豆子, ...
- bzoj 1188 [HNOI2007]分裂游戏(SG函数,博弈)
1188: [HNOI2007]分裂游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 733 Solved: 451[Submit][Status ...
随机推荐
- [javaSE] 数组(排序-选择排序)
两层嵌套循环,外层循环控制次数,内层循环进行比较 for(int x=0;x<arr.length;x++){ for(int y=0;y<arr.length;y++){ if(arr[ ...
- 《码出高效 Java开发手册》第六章 数据结构与集合
码云: https://gitee.com/forxiaoming/JavaBaseCode/blob/master/EasyCoding/src/collection/index.md 6.1 数据 ...
- IDEA 项目相关基础设置
导入或者新建项目, 选择文件或者目录, 这里提示了可以选择哪种类型的 相关Tomcat 的配置 下载地址: http://tomcat.apache.org/download-70.cgi#7 ...
- JSP学习笔记(3)-JSP内置对象
有些对象不用声明就可以在JSP页面的Java程序片和表达式部分使用,这些对象就是JSP的内置对象. JSP常用的内置对象有request,response,session,application,o ...
- js程序中美元符号$是什么(转)
$符号在php中是表示变量的特征字符, 在js中它也有很多作用, 一般我们用来命名一个函数名称,获取id的1.首先可以用来表示变量, 比如变量 var s='asdsd'或var $s='asdasd ...
- UVA11624(KB1-J)
Fire! Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of ...
- Docker for Windows(三)Docker镜像与容器的区别&常用命令
Docker镜像(Image)是一堆只读文件(read-only layer),容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是 ...
- 阿里react整合库dva demo分析 [转]
同,也是工作中需要,用到 dva , 也找了些文章参考知识点. 更多:http://www.cnblogs.com/heyuqing/p/6844098.html 以下内容为摘出 mark 接着踩 ...
- Android获取SD卡路径及SDCard内存的方法
这篇文章主要介绍了Android获取SD卡路径及SDCard内存的方法,较为详细的分析了Android针对SD卡操作所涉及的类及其具体函数功能,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了A ...
- Android 仿美团网,探索使用ViewPager+GridView实现左右滑动查看更多分类的功能
看下效果图,自己考虑下自己会如何实现,然后再继续看看作者的实现~ 不记得什么时候,我留意到到美团网首页有使用ViewPager+GridView实现左右滑动查看更多分类的一个功能,感觉它很有趣,于是想 ...