ARC105
博弈场。
A
不写
B
考虑两个数的情况,发现答案是 \(\gcd\),然后写一发 \(\gcd\) 就可以了。
C
不写
D(博弈、结论)
博弈题
思路
容易发现游戏的后半部分就是 Nim,并且后半部分的先后手是确定的。所以问题相当于两个人分别希望使得盘子里的数量的异或和为 \(0\) / 不为 \(0\)。
根据直觉我们发现想要把异或和控制到 \(0\) 很难。比如考虑 \(n\) 为偶数的情况,后手想要控到 \(0\),那么很多情况先手只需要尽可能把大的堆到一起后手就输了。那么考虑什么时候后手赢,显然全相同后手就赢了。进一步我们发现如果每个元素个数为偶数那么后手也会赢。
考虑证明这是一个充要条件,即证明存在奇数后手必败。先手只需要放一个奇数元素,若后手把元素叠在上面,那么先手也叠;后手不叠,先手就另外放空盘子。显然先手永远有东西放且局面异或和始终不为 \(0\)。
对于 \(n\) 为奇数,类似推导即可。判断只需要排序后看元素个数。
正解
结论是相同的,不过题解直接用了取最大值的思路。我开始对此有所顾虑,认为可能把剩下数拆开还是有可能达到这个值的。但事实上 \(a\oplus b\leq a+b\),所以这样做是对的。
总结
感觉不少博弈论都是尝试把局面固定在某个特定的状态。
E(图论、博弈论)
还是博弈,感觉比 D 更萌萌一些。
思路
发现如果只剩两个联通块那么双方都无所谓决策了,只需要看步数奇偶性就可以了。
假设有 \(C\) 个联通块,那么猜想两个人最开始的 \(C-2\) 步都在合并联通块,目标是把剩余步数变成奇数/偶数。发现其中一个人希望把 \(1\) 和 \(n\) 所在的两个联通块都变成奇数,我们从这个人出发考虑,假设是先手。先判掉 \(n\) 为奇数的情况。假设先手能把局面固定在都是奇数,那么假设后手不操作这两个联通块,先手也不操作。否则后手操作其中一个,先手只需要给这个加上一个奇数就可以了。所以如果有一个是奇数则先手必胜。反之如果是后手则要求都是奇数。
并查集做就可以了。
正解
就这么做(
总结
不少博弈题都可以从步数奇偶性考虑。
F(DP、容斥)
容斥,一生之敌!
思路
题目等价于问原图有多少个联通二分子图。尝试枚举二分图的左部,然后计数连通图的方案。试图使用包括 Matrix-Tree 在内的一系列奇怪技巧,失败了。
正解
考虑一个子问题:如何计数连通子图的个数?
可以设计一个 DP:\(f(S)\) 表示 \(S\) 点集构成的连通子图的个数。可以想到转化为计数不连通。我们钦定与 \(x\) 相连的点集为 \(T\),那么这种情况的贡献是 \(f(T)h(S\setminus T)\),其中 \(h(S)\) 表示 \(S\) 点集的一般图数量。
回到原问题,自然想到先计数二分图再考虑连通图。假设 \(S\) 点集二分图数量为 \(g(S)\),那么容易通过枚举左部点的方法来计算 \(g(S)\)。对于连通图,沿用上面的方法即可。时间复杂度 \(O(n2^n+3^n)\)。
总结
集合 \(S\) 去掉最低位可以写成S & (S - 1)。上面的高维前缀和初始化为cnt[(1 << u) | (1 << v)]++。
连通图计数经典的套路是容斥转为计数不连通,然后把点集割成两部分。
遇到比较复杂的问题可以去除一些条件,转而考虑更简单的子问题或者更一般的大问题。

浙公网安备 33010602011771号