Codeforces Round #658(E未做)

C

假设我们已经确定了匹配集合(S,|S|=x)
考虑剩下的位置,考虑能变换的最小匹配数

(num)为最大颜色的个数
最小匹配数为(max(0,2*num-(n-x)))

那么让(num)尽量小即可

D

令蛇长(L)
令某个点为关键点,满足该点有三个大于等于(L)的分支,我们可以利用关键点让蛇翻转

结论1:若蛇某端点能到达一个关键点,则能到达所有关键点

结论2:若蛇到达不了关键点,则不能实现翻转

证明:
考虑树上的直径,若蛇不能到达直径,可以把直径删掉,取蛇所在连通块,显然这并不影响答案
若蛇能到达直径,我们可以证明其永远不能离开,若能离开,则显然图中会存在关键点
若蛇当前在直径,则不能离开,显然不能翻转;若蛇不在直径,与蛇能到达直径矛盾

我们找到图中任意关键点(root),以其作为根
将蛇移动,若能使端点互为祖先关系,则可以到达(root)
令端点为((a,b)),选择一端点作为起始点
起始点往下走到能前往的最深的叶子节点,另一端往下走到能前往的最深叶子节点,反复交替,知道互为祖先
可以用倍增或长链剖分来模拟这个过程

原文地址:https://www.cnblogs.com/Grice/p/13363770.html