训练记录PART7

再不更博客我就……!!!……吃cjb!

T112-2018 Bytedance-MW Wintercamp Selection Contest C

  题意:给出一棵 \(N(\leq 10^6)\) 个点的带边权的树。甲乙两人轮流博弈,每次可以选择将一条边 \(e\) 的边权 \(w_e\) 减一。若减完后变成 \(0\),则割掉不包含根的那个连通块。双方执最优策略,问先手是否必胜。如果必胜的话,还要输出所有可行的第一步删边方案。
  题解:如果边权 \(w_e=1\),有一个很简单的结论:子树 $sg_x=(sg_{y_1}+1) \oplus (sg_{y_2}+1) \dots $。这个可以用归纳法来证明。
  此题中边权可以大于 \(1\)。事实上,还有一个一般性的基于图的做法。
  链接可参考这里:([https://blog.csdn.net/acm_cxlove/article/details/7854532)。
  主要思想是基于对原图进行等价变换。
    等价变换①:偶环可以“缩成”一个点(偶环里的边将变成这个点的子环)。
    等价变换②:自环可以拆成一个新的儿子。
  直接将此题的树看成图,可以发现子树 \(sg_y\)\(sg_x\) 的贡献是 \(sg_y \oplus [w_{x,y} \nmid 2]\) 。特殊情况是 \(sg_y+1[w_{x,y}=1]\)
  第二问相当于,我们要将某一条边减少一,使根的 \(sg\) 变为 \(0\)。直接 \(DFS\) 下去,每次维护需要将当前的 \(sg\) 变成多少才能合法。

猜你喜欢

转载自www.cnblogs.com/jiangshibiao/p/10055197.html