博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HNOI2007]分裂游戏
阅读量:5090 次
发布时间:2019-06-13

本文共 1553 字,大约阅读时间需要 5 分钟。

题面

\(n\)堆石子,每次可取第\(i\)堆石子的一颗,然后再各在\(j,k\)堆石子中放一颗(\(i<j\leq k\))。无法操作者输。问先者是否有必胜策略,和在胜利前提下,第一步有多少种取法。

  • \(n\leq21,a_i\leq10000\)

解析

显然游戏结束的条件是只有最后一堆有石子。

若先者要赢,首先应把各堆石子全部变为偶数,这样只用模仿对手操作即可胜利。
于是记忆化搜索计算每堆石子的\(SG\)值(后继状态是第\(j\)堆和第k$堆石子)。

注意到目的,我们只统计\(a_i\&1==1\)\(SG\)值异或和,得到\(ans\)

然后可以枚举取的是哪堆石子,若取完后能使当前局面异或和清\(0\)(即\(ans\bigoplus SG[i]\bigoplus SG[j]\bigoplus SG[k]==0\)),就是合法方案的一种。

注意一下判\(vis\)的小技巧。

// luogu-judger-enable-o2#include
#include
#include
#include
#include
#include
#define ll long long#define re register#define il inline#define fp(i,a,b) for(re int i=a;i<=b;i++)#define fq(i,a,b) for(re int i=a;i>=b;i--)using namespace std;const int N=50;int n,a[N],SG[N],vis[N],ans,tot;il ll gi(){ re ll x=0,t=1; re char ch=getchar(); while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar(); if(ch=='-') t=-1,ch=getchar(); while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar(); return x*t;}il int dfs(re int x){ if(SG[x]!=-1) return SG[x]; fp(i,x+1,n) fp(j,i,n) vis[dfs(i)^dfs(j)]=x; re int p=0; while(vis[p]==x) ++p; return SG[x]=p;}int main(){ re int T=gi(); while(T--) { memset(SG,-1,sizeof(SG));memset(vis,0,sizeof(vis));ans=0;tot=0; n=gi(); fp(i,1,n) a[i]=gi(); fp(i,1,n) if(a[i]&1) dfs(i); fp(i,1,n) if(a[i]&1) ans^=dfs(i); fp(i,1,n) fp(j,i+1,n) fp(k,j,n) if((ans^dfs(i)^dfs(j)^dfs(k))==0) { if(!tot) printf("%d %d %d\n",i-1,j-1,k-1); ++tot; } if(!tot) puts("-1 -1 -1"); printf("%d\n",tot); } return 0;}

转载于:https://www.cnblogs.com/yanshannan/p/9466120.html

你可能感兴趣的文章
starling教程-事件模型(Event model )
查看>>
第二章 Js函数
查看>>
蓝桥杯 ALGO-2:最大最小公倍数
查看>>
51Nod:1086背包问题 V2
查看>>
NYOJ 6:喷水装置(一)(贪心)
查看>>
一些股票的基本概念
查看>>
MongoDB限制内存方法
查看>>
Using JQuery Mobile and JSON to Create Mobile Applications
查看>>
js 高级方法 getter/setter
查看>>
CSS魔法堂:那个被我们忽略的outline
查看>>
poj 1386 Play on Words (欧拉路判断)
查看>>
magento 侧边栏菜单的生成制作!!3层目录!!
查看>>
TensorFlow深度学习笔记 循环神经网络实践
查看>>
dedecms后台每页文章条数如何修改(“文档列表”每一页显示的文档条数)
查看>>
poj2594最小顶点覆盖+传递闭包
查看>>
UVA 714 Copying Books
查看>>
for循环遍历枚举过程中怎么删除集合中的项
查看>>
两道贪心的交换sequence
查看>>
复杂模拟 | 1095 模拟N个学生有K个志愿填M个学校
查看>>
springboot之启动原理解析及源码阅读
查看>>