【BZOJ】1188 [HNOI2007]分裂游戏
【算法】博弈论
【题解】
我们的目的是把游戏拆分成互不影响的子游戏,考虑游戏内的转移。
如果把每堆视为子游戏,游戏之间会相互影响,不成立。
将每堆的一个石子视为子游戏,其产生的石子都在同一个子游戏中。
虽然每堆的每个石子都是不同的子游戏,但显然SG值是可以共用的。
SG[x]表示第x堆上一个石子的SG值,边界SG[n]=0。
考虑转移,对第i堆上一个石子操作可能会有多种向后放的方案,每一种方案的SG值是sg[j]^sg[k](因为这个局面包含两个子局面各自sg值,异或得到总局面sg值)
那么对于同一堆的多个石子都是一模一样的子游戏,偶数由于异或自反性可以抵消,奇数剩1。
最后考虑第一步操作,是要将异或值变为0,不讲它视为某个子游戏的第一步,只是单单看作增减子游戏。
拿掉一个i或增加一个j和k,都是多异或一个g[],所以找到字典序最小的ijk使ans^g[i]^g[j]^g[k]=0即可,注意a[i]>0。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int g[],a[],n,T;
bool h[];
int main()
{
g[]=;
for(int i=;i<=;i++)
{
memset(h,,sizeof(h));
for(int j=i-;j>=;j--)
for(int k=j;k>=;k--)
h[g[j]^g[k]]=;
for(int j=;j<=;j++)if(!h[j]){g[i]=j;break;}
}
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int ans=,ansnum=;//顺手开错变量类型
bool ok=;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]&)ans^=g[n-i];
}
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
for(int k=j;k<=n;k++)
if(a[i]>&&(ans^g[n-i]^g[n-j]^g[n-k])==)
{
if(!ok){printf("%d %d %d\n",i-,j-,k-);ok=;}
ansnum++;
}
if(!ansnum)printf("-1 -1 -1\n");
printf("%d\n",ansnum);
}
return ;
}
【BZOJ】1188 [HNOI2007]分裂游戏的更多相关文章
- bzoj 1188 [HNOI2007]分裂游戏(SG函数,博弈)
1188: [HNOI2007]分裂游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 733 Solved: 451[Submit][Status ...
- bzoj 1188 [HNOI2007]分裂游戏 SG函数 SG定理
[HNOI2007]分裂游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1394 Solved: 847[Submit][Status][Dis ...
- [BZOJ 1188] [HNOI2007] 分裂游戏 【博弈论|SG函数】
题目链接:BZOJ - 1188 题目分析 我们把每一颗石子看做一个单个的游戏,它的 SG 值取决于它的位置. 对于一颗在 i 位置的石子,根据游戏规则,它的后继状态就是枚举符合条件的 j, k.然后 ...
- BZOJ 1188: [HNOI2007]分裂游戏(multi-nim)
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1386 Solved: 840[Submit][Status][Discuss] Descripti ...
- BZOJ 1188 [HNOI2007]分裂游戏
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1188 学习SG函数的过程中,我先看了一篇叫做 <2008-贾志豪-组合数学略述... ...
- bzoj 1188 : [HNOI2007]分裂游戏 sg函数
题目链接 给n个位置, 每个位置有一个小球. 现在两个人进行操作, 每次操作可以选择一个位置i, 拿走一个小球.然后在位置j, k(i<j<=k)处放置一个小球. 问你先进行什么操作会先手 ...
- BZOJ P1188 HNOI2007 分裂游戏——solution
题目描述: (<--这个) 组合游戏,——把每个石头看做一个游戏, Multi_game——消去i上的石子后,,k上的游戏又多了一个: 于是就套用multi_game的模型即可 求解SG函数时, ...
- bzoj1188 [HNOI2007]分裂游戏 博弈论 sg函数的应用
1188: [HNOI2007]分裂游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 973 Solved: 599[Submit][Status ...
- [bzoj1188][HNOI2007]分裂游戏_博弈论
分裂游戏 bzoj-1188 HNOI-2007 题目大意:题目链接. 注释:略. 想法: 我们发现如果一个瓶子内的小球个数是奇数才是有效的. 所以我们就可以将问题变成了一个瓶子里最多只有一个球球. ...
随机推荐
- ajax的一些实用技巧
1.尽量优先采用ajax获取html文件,然后再操作dom把数据填充到里面 在实际项目中,如果前端开发人员没有把页面给切分开,那么有如下两种办法可供选择:其一是,在各种点击事件中,用js去拼接并在拼接 ...
- ACM 第十八天
数学基础(卷积,FFT,FWT,FMT,鸽巢原理,群论,哈里亚余数,哈里亚计数定理,组合数学,LVG定理,期望DP,期望点贡献问题) 练习题: A - Necklace of Beads Beads ...
- lintcode-161-旋转图像
161-旋转图像 给定一个N×N的二维矩阵表示图像,90度顺时针旋转图像. 样例 给出一个矩形[[1,2],[3,4]],90度顺时针旋转后,返回[[3,1],[4,2]] 挑战 能否在原地完成? 标 ...
- thinkphp5学习记录一
1 使用composer安装 composer create-project topthink/think=5.0.* tpblog --prefer-dist 2 配置环境vim /usr/loca ...
- Jenkins系列-Jenkins邮件通知
一.安装邮件插件 由于Jenkins自带的邮件功能比较鸡肋,因此这里推荐安装专门的邮件插件,不过下面也会顺带介绍如何配置Jenkins自带的邮件功能作用. 可以通过系统管理→管理插件→可选插件,选择E ...
- C# 4 中使用迭代器的等待任务
介绍 可能你已经阅读 C#5 关于 async 和 await 关键字以及它们如何帮助简化异步编程的,可惜的是在升级VS2010后短短两年时间,任然没有准备好升级到VS2012,在VS2010和C#4 ...
- C#里面Console.Write()和Console.WriteLine()有什么区别?
Console.Write()和Console.WriteLine()都是System.Console提供的方法,两着主要用来将输出流由指定的输出装置(默认为屏幕)显示出来.两着间的差异在Consol ...
- PHP给图片添加图片水印
涉及到的函数: 1.file_get_contents():用于将文件的内容读入到一个字符串中的首选方法.如果操作系统支持,还会使用内存映射技术来增强性能. 2.list():list() 函数用于在 ...
- [C/C++] char data[0](柔性数组)
转自:http://blog.csdn.net/yby4769250/article/details/7294696 在标准C和C++中0长数组如charArray[0]是不允许使用的,因为这从语义逻 ...
- MyBatis配置和日志
MyBatis最关键的组成部分是SqlSessionFactory,我们可以从中获取SqlSession,并执行映射的SQL语句.SqlSessionFactory对象可以通过基于XML的配置信息或者 ...