前言
本来并不打算补这个题, 但是发现想拿到更好的分数, 应该对这题有更多的分析
至于 \(\rm{T3}\) , 除了让我知道分拆数类型的状态压缩 \(\rm{dp}\) 还可以乱搞, 没有什么意义, 现在也不太可能拥有这个水平
思路
题意
给定一个序列
每次可以在序列两侧选择并拿出一个数, 把答案异或上它初始是零
最终拿完之后, 手上答案更大的赢
先手, 输出哪位必胜或平局
不难发现, 由于异或的结合律, 最终 \(\rm{A}\) 的答案\((\)以下记为 \(a\)\()\) 异或上 \(\rm{B}\) 的答\((\)以下记为 \(b\)\()\) 等于全串异或和 \(s\)
因此如果 全串异或和 \(s=0\) , 那么必定没有必胜策略
现在剩下的情况中, 必定没有平局情况
对答案进行二进制拆分, 不难发现对于 \(s\) 的最高位置, 一定有 \(\textrm{A or B}\) 中的一个拿到这个 \(1\) , 另外一个拿不到
所以我们可以只考虑最高位, 问题转化成 \(01\) 序列上的问题
暴力做法
你发现这种两端取数问题长得非常像区间 \(\rm{dp}\)
我们先不考虑 \(\rm{dp}\) 怎么做, 先把所有情况的游戏树列出来
不难发现, 如果 \(\rm{Alice}\) 必胜, 那么一定存在一个方法, 使得 \(\textrm{Alice}\) 每次选择都可以走到一个不管 \(\textrm{Bob}\) 怎么选都可以必胜的状态
如果 \(\rm{Alice}\) 必输, 那么就是无论怎样都传不上去
图片说明
图片中, 必胜, 必输
怎么形象的处理这个问题, 不难发现你不太可能直接把这个大小为 \(2^n\) 的树建出来, 所以我们可以考虑从 \(\rm{dp}\) 的角度思考
类似区间 \(\rm{dp}\) , 对这棵树标号
不难发现我们可以预处理出每一个叶子结点的取值\((\)\(\textrm{Alice win or Bob win}\)\()\) , 每次上提的过程就是 \(\rm{dp}\) 的过程, 发现同编号区间状态一定相同 \((\)不难理解, 因为异或的结合律\()\) , 所以直接转移即可做到 \(\mathcal{O} (n^2)\)
正解
他人题解, 仅供参考 (来源)
分为两种情况:长度为奇数和长度为偶数。
先来看第一种:长度为偶数。我们将 序列分为奇数位和偶数位,此时 a_i 的异或和不为 ,所以必然要么是奇数位上有奇数个 ,要么是偶数位上有奇数个 ,于是先手可以直接控制后手所选的 的奇偶性,故在此种情况下先手必胜。
再来看长度为奇数的情况:
假如两端都是 ,那么无论先手选哪个都会使当前后手变为长度为偶数的先手状态,于是此时先手必败;
假如一端为 ,那么先手必然要选作为 的一端,否则必败,不是最优策略;之后先手需要跟随后手的选择,保证两者的选择完全一致,否则必败我们来简单讨论一下原因:
假如在这一步之前,所有的先手的每一步都跟随着后手选,所以此时先后手选的 的数量的奇偶性一定不同,在这一步时,后手选了 ,先手选了 ,那么此时先后手选的 的数量的奇偶性变为相同,于是一共选了偶数个 ,还剩奇数个 ,此时一共选了奇数个数字,于是还剩偶数个数字,此时后手作为当前局面的先手进入必胜状态;于是这样选先手必败。
在这一步时,后手选了 ,先手选了 ,与上面的证明同理,可得这样先手必败。
由于先手取走了一个 ,那么此时 的个数为偶数,由于每一步先手都跟着后手选,所以先后手必然平分偶数个 ,如果这个个数不能被 整除,也就意味着先手被分到了奇数个 ,加上了最初的那个 ,必败。
那么,怎样的序列才能满足先手能跟着后周的每一步选呢?删除掉左右两边相同的数后,剩下的应当满足相邻奇偶位(如 和 是,但 和 不是)上的数字相同,这里不证正确性,证法与上面相似。
总结
博弈论应当先考虑基本性质
二进制相关问题往往可以拆成每一位考虑
本题特殊的地方在于因为考虑最值, 只需要考虑最高位即可, 这也是常见的贪心做法
一般来说, 数据模拟应当尽量真实以找到更多的性质