首先可以发现,当所有巧克力豆在最后一个瓶子中时,就无法再操作了,此时为必败状态。

注意到,对于每个瓶子里的巧克力豆,是可以在模\(2\)的意义下去考虑的,因为后手可以模仿先手的操作,所以就将巧克力豆个数转化为了\(0\)或\(1\)。

再考虑分裂的过程,位置为\(i\)的巧克力豆,要分裂到位置\(i\)往后的两个位置,最终会到达\(n\)这个位置,可以把向后转移看作\(Nim\)游戏中取石子的操作。

那么分裂就可以看成\(Nim\)游戏中的一堆石子分成了两堆更小的石子,那么通过这个性质,我们就可以\(O(n^3)\)求出\(SG\)值了。

求方案数和字典序最小方案就直接暴力枚举即可,当进行第一步操作后,留给后手的为必败状态,那么该操作合法。

具体实现就看代码吧。

\(code:\)

#include<bits/stdc++.h>
#define maxn 100
using namespace std;
template<typename T> inline void read(T &x)
{
x=0;char c=getchar();bool flag=false;
while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
if(flag)x=-x;
}
int T,n,ans,tot,flag;
int p[maxn],sg[maxn];
bool vis[maxn];
void SG()
{
for(int i=n-1;i;--i)
{
memset(vis,false,sizeof(vis));
for(int j=i+1;j<=n;++j)
for(int k=j;k<=n;++k)
vis[sg[j]^sg[k]]=true;
int t=0;
while(1)
{
if(!vis[t])
{
sg[i]=t;
break;
}
t++;
}
}
}
int main()
{
read(T);
while(T--)
{
read(n),sg[n]=ans=tot=flag=0;
for(int i=1;i<=n;++i) read(p[i]);
SG();
for(int i=1;i<=n;++i)
if(p[i]%2)
ans^=sg[i];
for(int i=1;i<=n;++i)
{
if(!p[i]) continue;
for(int j=i+1;j<=n;++j)
{
for(int k=j;k<=n;++k)
{
if((ans^sg[i]^sg[j]^sg[k])==0)
{
tot++;
if(!flag)
{
flag=true;
printf("%d %d %d\n",i-1,j-1,k-1);
}
}
}
}
}
if(!flag) puts("-1 -1 -1");
printf("%d\n",tot);
}
return 0;
}

题解 洛谷 P3185 【[HNOI2007]分裂游戏】的更多相关文章

  1. Solution -「HNOI 2007」「洛谷 P3185」分裂游戏

    \(\mathcal{Description}\)   Link.   给定 \(n\) 堆石子,数量为 \(\{a_n\}\),双人博弈,每轮操作选定 \(i<j\le k\),使 \(a_i ...

  2. P3185 [HNOI2007]分裂游戏

    $ \color{#0066ff}{ 题目描述 }$ 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i ...

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

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

  4. 题解 洛谷 P3825 【[NOI2017]游戏】

    从题面中四元组\((i,h_i,j,h_j)\)限制选择车子型号,不难想到这题要用\(2-SAT\)解决. 考虑转化为\(2-SAT\)模型,发现除地图\(x\)外,其他地图都只有两种车子型号可以参加 ...

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

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

  6. 洛谷P1274-魔术数字游戏

    Problem 洛谷P1274-魔术数字游戏 Accept: 118    Submit: 243Time Limit: 1000 mSec    Memory Limit : 128MB Probl ...

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

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

  8. 洛谷P1118 数字三角形游戏

    洛谷1118 数字三角形游戏 题目描述 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直 ...

  9. bzoj 1188 [HNOI2007]分裂游戏(SG函数,博弈)

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

随机推荐

  1. robot framework使用小结(三)

    robot framework采用行为驱动 新建测试案例baidu04,添加Library:Selenium2Library 右键项目名robotProject-->New Resource-- ...

  2. 入门大数据---Anaconda安装

    1. 什么是Anaconda? Anaconda是一个开源的Python发行版本,python是一个编译器,如果不使用Anaconda那么安装起来会比较痛苦,各个库之间的依赖性就很难连接的很好.Ana ...

  3. python实现从文件夹随机拷贝出指定数量文件到目标文件夹

    为了方便倒腾数据,功能如题,该脚本和操作目录在同一根目录 实际运行时要手动修改程序中:cpfile_rand('img', 'outfile', 10) # 操作目录,输出目录,输出数量 import ...

  4. igate(因特网网关)

    网关:Gateway 又称网间连接器.协议转换器.-----复杂的网络互连设备. 网关在网络层以上实现网络互连,是复杂的网络互连设备,仅用于两个高层协议不同的网络互连.网关既可以用于广域网互连,也可以 ...

  5. 一个C++版的网络数据包解析策略

    C++版的网络数据包解析策略(升级版) 一.数据包格式形如下图 二.代码 int ReceiveFromRemoteEndPoint() { int nPackageDataLength = ; ch ...

  6. 'printf' Function

    printf is not part of the C language; there is no input or output defined in C itself. printf is jus ...

  7. 记一次解密wireshark抓取的冰蝎通信流量

    一.关于冰蝎 1.1 简单介绍 冰蝎是一款基于Java开发的动态加密通信流量的新型Webshell客户端.老牌 Webshell 管理神器——中国菜刀的攻击流量特征明显,容易被各类安全设备检测,实际场 ...

  8. tomcat结合shiro无文件webshell的技术研究以及检测方法

    0x01简介 shiro结合tomcat回显,使用公开的方法,回显大多都会报错.因为生成的payload过大,而tomcat在默认情况下,接收的最大http头部大小为8192.如果超过这个大小,则to ...

  9. 每日一题 - 剑指 Offer 38. 字符串的排列

    题目信息 时间: 2019-06-29 题目链接:Leetcode tag:深度优先搜索 回溯法 难易程度:中等 题目描述: 输入一个字符串,打印出该字符串中字符的所有排列. 你可以以任意顺序返回这个 ...

  10. python 实现汉诺塔

    汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘. 大梵天命令婆罗门把圆盘从下面开始按大小顺 ...