博弈论
题单:https://cplusoj.com/d/senior/contest/69faf5321363e1a076b48956
T1
首先把吃掉最后一颗就输的定义修改一下,改成不能全部吃完,无法操作的人输了,然后,注意到,如果给糖果从大到小排序,删掉最大值相当于删掉最左边一列,全部减一相当于删掉最下面一列,如图
,然后可以转为在网格图上走,
,注意,黑色边界不能走到,然后就可以分析每个节点的状态了,如图
,其中,⚪是必胜态,×是必败态,注意到一个斜线上的状态都是相同的,所以我们直接跳到最右上角的点,然后判断往上走还是右走是否能赢就行了。
T2
打表题,首先把sg函数打表打出来,然后发现零的位置间隔一直是4,4,10,4,12,所以周期就是34,然后把76以内的表打出来,然后询问的时候mod 43就行了。
T3
这题没什么性质,考虑直接维护sg函数,设sg(u)表示只考虑u的子树的sg函数,转移的话,考虑所有后继状态,就是选择子树内的白色点,然后这个点到u的所有点全部染黑,实际上相当于把u子树分割成若干个森林,然后这个状态的sg值就是所有森林的sg值的异或和。
考虑如何维护这个东西,我们可以使用01trie来维护u的所有后继状态的sg值,我们发现,u的所有后继状态,实则是u的儿子v的所有后继状态和v的兄弟们的sg值的异或和,所以说我们可以将v的01trie异或上兄弟们的异或和,可以用一个tag维护,然后与u的01trie合并就行了,还有,u如果是白色点,自己可以被涂黑,再插入这个后继状态就行了。已经知道了u所有后继状态的sg值,如何求mex呢,考虑01trie上二分,如果0边上已经满了,那么就递归1边,否则递归0边,所以trie上还要记录这个子树是不是满的,然后求答案的时候利用已经算出来的sg值再dfs一边就行了。
T4
首先,这个不是公平组合游戏,因为公平组合游戏的条件是无法行动者输,而这个的条件是达到某个状态时直接获胜,所以,考虑修改游戏描述。先分析 \(1 \times n(n>1)\) 的情况,显然是先手必胜的,所以先手会尽量避免割出这种情况,那我们直接强制规定必须割边长 \(>1\) 的长方形,然后不能割的人输,然后记忆化搜索计算sg函数就行了。(注意求mex的时候,vis数组清空的问题)
T5
不妨设x>=y,如果相等的话,先手胜,如果x>=2y的话,x可以变成x mod y或者 x mod y+y,因为后者必须转移到前者,所以后者的状态是前者取反,所以必有一个是必败点,所以x>=2y必胜,那么就是x<2y的情况,只有一种转移,x直接-y就行。时间复杂度跟欧几里得算法一样,O(log n)。
T6
打表题,考虑组之间是独立的,所以只用考虑每组的sg函数再异或起来就行,所以说对于每对x,y打表,如图:
,显然,这是一个分形,递归求解即可。
浙公网安备 33010602011771号