多校第六场1010
题目链接
题意是有两个人在玩游戏,有一棵树,一开始每个节点都是没有颜色的,然后A先手,B后手,每次A可以选一个未上色节点涂成白色,B选一个未上色节点涂成黑色,同时与其直接相邻的点也被涂成黑色(无论已经上色与否),B在游戏过程中随时可以做一个小动作就是切割树的一条边。当所有点都被上色时,如果节点中有一个是白色的,那么A获胜否则B获胜,问最后胜利的情况。
看起来B好像很吊的样子,随时可以切边,但是实际上分析一下找找规律,发现B要赢其实很难的,不考虑切割时,只有在一棵树只有两个点的时候,B才能赢(找规律得出)。当一部分连通块被染色时,实际上这部分连通块相当于被切割出去了。
当A对一个点染色的时候,B想要赢必须想办法把这个点与其周围某个相邻点连成的”2-连通块“分割出去,但是不能随便分割,因为有可能导致其它点找不到匹配点。
于是问题就变成了对于树上任意一点,能否找到一个匹配点,使得被这两个点被切割后剩下部分仍然能满足这个性质。我们从叶子节点开始找匹配,就可以解决。同时,要确保B的机会数一定使每次的点对都能被分割出去。其实就是 [K>=n/2-1]
#include<algorithm>
#include<cstring>
#include<string>
#include<set>
#include<map>
#include<time.h>
#include<cstdio>
#include<vector>
<