AGC027F Grafting

发布时间 2023-07-21 08:35:03作者: Ender_32k

首先如果一开始 \(A\)\(B\) 相同,可以直接输出 \(0\)

否则 \(O(n^2)\) 枚举一个被操作的叶子 \(x\),和 \(x\) 接到了的 \(y\) 点,此时 \(x\) 不能再被操作,所以将其当作新树 \(A'\)\(B\) 的根节点。

由于操作是作用于叶子的,所以一个非叶节点想要被操作,当且仅当其所有后辈节点都被扔出去了。反之,如果不操作一个点 \(u\) 的话,\(u\) 的祖先也不会被操作。

如果需要操作一个点 \(u\),说明 \(u\)\(A'\)\(B\) 中的父亲不同,因为你断开再连回去显然不优。如果 \(u\)\(A'\)\(B\) 中的父亲不同,那么你也一定要操作这个点,所以这是充分必要的。

根据上面那个结论,可以知道每个点需不需要被操作。由于操作顺序从叶子到根,所以如果存在一个点 \(u\),其在 \(A'\) 中的父亲 \(\text{fa}_{A',u}\) 需要被操作,但是 \(u\) 不能被操作,那么就无解了。

否则把所有需要操作的 \(u\) 找出来,如果其 \(A'\) 中的父亲 \(\text{fa}_{A',u}\) 需要被操作,那么 \(u\) 操作的顺序一定比 \(\text{fa}_{A',u}\) 前;如果其 \(B\) 中的父亲 \(\text{fa}_{B,u}\) 需要被操作,那么 \(u\) 操作的顺序一定在 \(\text{fa}_{B,u}\) 后。建图 \(O(n)\) 跑拓扑序即可,如果无环即有解,为需要被操作的点数加上你枚举的那个叶子 \(x\)

复杂度 \(O(Tn^3)\),不知道为啥我写的这么长,这场 F 比 E 简单啊。

评测记录