SPOJ-COT3 Combat on a tree
简要题意
给定一棵有根树,初始有黑点白点。两人交替操作,每次选择一个白点,将这个点到根路径上所有点染黑,选不了则输。求先手能否必胜;如果能,给出第一步可能的所有走法。
数据范围:\(1\le n\le 10^5\)。
题解
小清新题。难度不配黑题。
进行一次操作以后,这个点到根路径上所有点两侧的子树全部都变得彼此独立,只需要将 \(\mathrm{SG}\) 值异或起来即可。考虑求出所有子树的 \(\mathrm{SG}\) 值,则判定胜负和输出第一步都很容易。一个朴素的 \(n^2\) 做法是对于每个子树,枚举第一步的选择。但是这样不好优化。考虑利用子树内已经求出的信息。易得新的后续状态的 \(\mathrm{SG}\) 函数集合,是每个儿子的集合内元素异或上其他儿子的 \(\mathrm{SG}\) 值,求并,再加入所有儿子的 \(\mathrm{SG}\) 值得到。需要一种数据结构,支持全局异或,加入一个数,快速合并去重,快速求 \(\operatorname{mex}\)。01-Trie 即可。