\(\mathcal{Description}\)

  Link.

  给定 \(n\) 堆石子,数量为 \(\{a_n\}\),双人博弈,每轮操作选定 \(i<j\le k\),使 \(a_i \leftarrow a_i-1\),\(a_j \leftarrow a_j+1\),\(a_k \leftarrow a_k+1\),并保证操作后所有 \(a_i\ge0\)。求保证先手胜的第一步操作方案数和字典序最小的第一步操作。

  多测,\(n\le21\),\(0\le a_i\le10^4\),数据组数 \(\le10\)。

\(\mathcal{Solution}\)

  由于每次只能取走一个石子,所以一个有 \(x\) 个石子的位置实际上可以看做 \(x\) 堆互不相关的石子放在同一个位置。而由于“互不相关”,求出每个位置上有一颗石子的 SG 函数异或起来就是答案。令 \(\operatorname{sg} (i)\) 表示位置 \(i\) 有一颗石子的 SG 值,显然:

\[ \operatorname{sg} (i)=\operatorname{mex}_{i<j\le k}\{\operatorname{sg} (j)\oplus\operatorname{sg}(k)\}
\]

  扫出 \(\operatorname{sg}\),设所有石子 \(\operatorname{sg}\) 异或和为 \(X\),据此判断是否有解。若有解,暴力枚举第一次操作的 \(i,j,k\),若 \(X\oplus \operatorname{sg} (i)\oplus \operatorname{sg} (j)\oplus \operatorname{sg} (k)=0\),说明操作后先手必败,此次操作计入贡献,最终 \(\mathcal O(Tn^3)\) 就解决啦!

\(\mathcal{Code}\)

/* Clearink */

#include <cstdio>
#include <cstring> const int MAXN = 21;
int n, sg[MAXN + 5], a[MAXN + 5]; inline int calcSG ( const int i ) {
if ( ~sg[i] ) return sg[i];
bool vis[105] {};
for ( int j = i + 1; j <= n; ++ j ) {
for ( int k = j; k <= n; ++ k ) {
vis[calcSG ( j ) ^ calcSG ( k )] = true;
}
}
for ( int j = 0; ; ++ j ) if ( !vis[j] ) return sg[i] = j;
} int main () {
int T;
for ( scanf ( "%d", &T ); T --; ) {
scanf ( "%d", &n ), memset ( sg, 0xff, sizeof sg );
int ans = 0;
for ( int i = 1; i <= n; ++ i ) {
if ( scanf ( "%d", &a[i] ), a[i] & 1 ) {
ans ^= calcSG ( i );
}
}
if ( !ans ) { puts ( "-1 -1 -1\n0" ); continue; }
int ways = 0;
for ( int i = 1; i <= n; ++ i ) {
if ( !a[i] ) continue;
for ( int j = i + 1; j <= n; ++ j ) {
for ( int k = j; k <= n; ++ k ) {
if ( !( ans ^ calcSG ( i ) ^ calcSG ( j ) ^ calcSG ( k ) ) && !ways ++ ) {
printf ( "%d %d %d\n", i - 1, j - 1, k - 1 );
}
}
}
}
printf ( "%d\n", ways );
}
return 0;
}

Solution -「HNOI 2007」「洛谷 P3185」分裂游戏的更多相关文章

  1. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

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

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

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

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

  4. 洛谷P1288 取数游戏II(博弈)

    洛谷P1288 取数游戏II 先手必胜的条件需要满足如下中至少 \(1\) 条: 从初始位置向左走到第一个 \(0\) 的位置,经过边的数目为偶数(包含 \(0\) 这条边). 从初始位置向右走到第一 ...

  5. Solution -「JSOI 2019」「洛谷 P5334」节日庆典

    \(\mathscr{Description}\)   Link.   给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的).   \(|S|\le3\time ...

  6. Solution -「洛谷 P4372」Out of Sorts P

    \(\mathcal{Description}\)   OurOJ & 洛谷 P4372(几乎一致)   设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...

  7. Solution -「POI 2010」「洛谷 P3511」MOS-Bridges

    \(\mathcal{Description}\)   Link.(洛谷上这翻译真的一言难尽呐.   给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...

  8. Solution -「APIO 2016」「洛谷 P3643」划艇

    \(\mathcal{Description}\)   Link & 双倍经验.   给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...

  9. 「洛谷4197」「BZOJ3545」peak【线段树合并】

    题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...

随机推荐

  1. 简单谈谈 TCP/IP

    1.前言 IP 或 ICMP.TCP 或 UDP.TELNET 或 FTP.以及 HTTP 等都属于 TCP/IP 协议. 他们与 TCP 或 IP 的关系紧密,是互联网必不可少的组成部分.TCP/I ...

  2. react组件性能优化PureComponent

    首先我们使用react组件会配合connect来连接store获取state,那么只要store中的state发生改变组件就会重新渲染,所以性能不高,一般我们可以使用shouldComponentUp ...

  3. 图形验证插件,百度编辑器拓展功能,NodeJs消息机制以及聊天室

    图形验证插件 网上找了很多图形验证插件,比较推荐verify.js <link rel="stylesheet" type="text/css" href ...

  4. 网络协议学习笔记(八)DNS协议和HttpDNS协议

    概述 上一篇主要讲解了流媒体协议和p2p协议,现在我给大家讲解一下关于DNS和HttpDNS的相关知识. DNS协议:网络世界的地址簿 在网络世界,也是这样的.你肯定记得住网站的名称,但是很难记住网站 ...

  5. JMM模型基础知识笔记

    概述 内存模型可以理解为在特定的操作协议下,对特定的内存或者高速缓存进行读写访问的过程抽象,不同架构下的物理机拥有不一样的内存模型,Java虚拟机也有自己的内存模型,即Java内存模型(JavaMem ...

  6. 极简promise雏形

    function Promise(fn) { var value = null, callbacks = []; //callbacks为数组,因为可能同时有很多个回调 this.then = fun ...

  7. SQL查询中关键字的执行顺序

    SQL语句中的每个关键字都按照顺序往下执行,而每一步操作会生成一个临时表,最后的临时表就是最终结果: FROM <left_table>:from子句返回初始结果集 <join_ty ...

  8. 【解决了一个小问题】golang build中因为缓存文件损坏导致的编译错误

    编译的过程中出现了一个吓人的错误: GOROOT=C:\Go #gosetup GOPATH=C:\Users\ahfuzhang\go #gosetup C:\Go\bin\go.exe mod t ...

  9. 在linux下编译android下的opencv,使用cmake的方法

    #前一篇帖子实验了build_sdk.py来编译opencv,失败了.#本篇尝试使用cmake来编译#感谢这篇帖子提供的指导:https://www.cnblogs.com/jojodru/p/100 ...

  10. spark中job stage task关系

    1.1 例子,美国 1880 - 2014 年新生婴儿数据统计 目标:用美国 1880 - 2014 年新生婴儿的数据来做做简单的统计 数据源:https://catalog.data.gov 数据格 ...