ARC143E+CF1667D
ARC143E
题面
给定一个树,树上每个节点都有一个黑白棋,给定每个棋初始是黑还是白。
现在想把树上每个棋子都删掉,但是每次只能删白色的棋子,而且删掉这个棋子之后会把所有和它相邻的节点上的棋子的颜色取反(如果没有棋子不要管)。
求字典序最小的删除方案,或判断无解。
数据范围:\(n\le 2\times 10^5\) 。
题解
这种会影响周围节点的操作一般要从最简单的地方——叶子去考虑。
我们先从叶子 \(x\) 考虑,如果 \(x\) 是白色,那么 \(x\) 一定要在 \(fa_x\) 之前删除,否则就一定要在其之后删。
这样确定叶子之后,如果 \(x'\) 没有出叶子之外的节点了,那么我们就已经确定了他所有儿子和 \(x'\) 的删除先后关系,也就知道了 \(x\) 会被取反的次数,进而推测出其和 \(fa_{x'}\) 的关系。
这样一层一层来,我们就确定了整棵树的先后关系,无解也是好判断的。
所以我们就有了一些先后关系,这显然形成了一个DAG,输出方案也是好做的。
CF1667D
题面
对于一棵树上的边相邻定义为两个边有公共点
现在给定一棵树,每次可以删掉一条仍有偶数条边与之相邻的边,判断是否存在一个删边序列使得所有边都被删除了。
求任意一个删除方案,或判断无解。
数据范围 :\(n\le 2\times 10^5\) 。
题解
发现删去一条边会改变周围的边,我们同样考虑从叶子往根去考虑。
但是我们发现,这里我们无法用一个" \(x\) 在 \(fa_x\) 之前/后 " 来表示,因为即使 \(x\) 是叶子, \((fa_x,x)\) 也会关系到 \(fa_x\) 的其他边,我们只能知道 \((fa_x,x)\) 在删除的时候 \(fa_x\) 的度数要为奇数。
现在我们重新考虑一下条件,偶数条边与之相邻,就意味着删除 \((u,fa_u)\) 时,\(u\) 的度数的奇偶性和 \(fa_u\) 度数的奇偶性要相同,我们就把这个奇偶性记为边 \((u,fa_u)\) 的权值。
并且我们考虑删边的时候, 我们可以确定 \(deg_x\) 为 \(0/1\) 的个数是多少,所以如果 \(x\) 的所有儿子边的权值我们都知道的话,那么我们是可以推出 \((x,fa_x)\) 的权值的(或判断无解)。
而如果我们从叶子一层层往上推,是一定可以满足 "知道 \(x\) 所有儿子边的权值" ,所以每一个边的权值我们都是可以知道的。
那么之后就一定有解了吗?有又怎么构造方案呢?
我声称:如果在一棵树上,对于每一个点 \(x\) ,与 \(x\) 相邻的所有边,和这些边之间的拓扑关系所构成的一个子图没有环,并且整棵树边之间的拓扑关系和上述子图的交相同(即拓扑关系只存在与边相邻的情况),那么整个图是没有环的。
证明可以感性理解一下,就是我们无法从 \(x\) 的子树中不通过 \(fa_x\) 到达其他地方。
那么我们就可以对每一个 \(x\) 分开考虑。
对于 \(x\) ,因为 \(deg_x\) 的奇偶性的变换是 \(...\rightarrow0\rightarrow1\rightarrow0\rightarrow1\) 的,所以我们可以给 \(x\) 的每一个儿子边记录一下权值,然后按\(deg_x\) 的变换分配一下就可以了,最后再在整个图中跑拓扑就行了。
启发
-
对于这样的一个问题:
给定一棵树 ,有一个操作,会影响相邻的点/边,然后构造操作的顺序
我们都可以考虑从叶子开始考虑。
-
如果在一棵树上,对于每一个点 \(x\) ,与 \(x\) 相邻的所有边,和这些边之间的拓扑关系所构成的一个子图没有环,并且整棵树边之间的拓扑关系和上述子图的交相同(即拓扑关系只存在与边相邻的情况),那么整个图是没有环的。