Infinite Card Game
这里不符合“玩家行动只与游戏局面有关”,就不要往SG函数想了
先看这篇题解
这篇题解最开始的贪心我在赛时的时候想到了的,所以说博弈论完全是可以用贪心的,不要怕
但是这里贪心还有一个问题,在对手攻击力比这张牌防御力大的区间中,对手可能有多张牌的防御力最大,这个时候难道每一个点都要连边吗?其实不用,连接其中随便一个就好了,因为我们发现,在每一回合开始时,无论是谁出牌,都不用关注出的这个牌的攻击力是多少,只要防御力是相等的,攻击力多少并不会影响接下来的游戏的走向(这点非常重要,不然时间复杂度就不对了;其实我们贪心用的也是这个思想,就是每个人出牌的时候,只要攻击力比对方上次出的牌的防御力大,我们就应该出防御力最大的,因为攻击力根本不会影响游戏的走向)
题解说的边的方向,是从自己连向对手;但是我们一般连边都是从对手连向自己(因为我们要从对手的状态推到自己的状态),然而如果按照这种连边就不太好想,而像题解这么连边,就可以利用每个点只有一个出边进行dfs,很方便地讨论每一个点的状态
比如从某个点开始走,走的方向肯定是确定的,如果最终走下来的路径是一条链,那么这个点(以及这条链上的每一个点)的胜负状态肯定是唯一确定的;如果最终是一个环,那么这些点肯定都是平局(所以我们可以不用题解说的,总牌数减必胜减必败等于平局这种方法,而是直接在图上进行统计;然而题解的这种思想也要记住)。但是其实判环的代码有点麻烦,如果用vis判断,vis每次肯定不能清空,然后可能出现这种情况
红色线段的点在上一次dfs中已经找过了,但是vis肯定为\(1\)了,而第二次dfs的时候肯定不能直接判断这些都是平局的点
然后这一道题目最后一个注意的点就是,题目要求Monocarp先手,看起来我们似乎只用建立Monocarp的\(n\)个点就好了;然而如果这样做,行倒是行,但是没有上面说的两边都建边简单,所以以后不要被题目所求的量迷惑了