题解 - Luogu P14464 海底列車(collapse)

愚蠢的 2n2n 次数做法,除了代码短一点点和好想就没啥优势了。

简述题意

给两棵有根树 T1,T2T_1,T_2,每次可以交换 T1T_1 中某两个距离为偶的点的父亲,问能否在 2n2n 次操作内将 T1T_1 变成 T2T_2n5000n\le 5000

解法

对于一棵树,黑白染色,两种颜色的点的度数集合分别记为 S0,S1S_0,S_1,则 (S0,S1)(S_0,S_1) 这个无序二元组相同的两棵树,他们都是可以互相转化的。这个东西的必要性是显然的(操作不会改变点的度数),我们考虑用构造把它的充分性得出来。

考虑只根据 (S0,S1)(S_0,S_1) 生成一棵树 TxT_x,然后让等价类里面所有的 TT 都可以在 nn 次操作之内和它转化,我们就可以得到 T1TxT2T_1\to T_x\to T_2

我们发现只要每次我们在 TxT_x 上接上去一个叶子,TT 上就一定可以操作。具体来说,每次操作是:

  • 如果 1S01\in S_0,那么把这个 11 对应的节点和 S1S_1 中一个用某种方式定下来的非 11 度点相连,在此之后这条边应当视作不存在(毕竟它不能再发生改变了);
  • 否则必定有 1S11\in S_1,对称地操作即可。

当我想要在 T1,T2T_1,T_2(以下直接称为 TT)连起来一条边 xyx\to y,其中 xx 是叶子:

  • 如果这条边存在,pass;
  • yxy\to x 路径上的第二个点是 ppxyx\to y 路径上的第二个点是 ssyy 的任意一个不是 pp 的邻点是 tt,那么一次操作我们进行 (x,t)(x,t)
  • 容易发现由于 xx 度数为 11,每次只是把一个叶子剥出去,不影响后续操作。

模拟以上过程需注意绝对不可以让 TT 的编号影响其和 TxT_x 之间的转化。

暴力模拟,复杂度 O(n2)O(n^2)


题解 - Luogu P14464 海底列車(collapse)
http://sunsetglow95.github.io/sol-LGP14464/
作者
SunsetGlow95
发布于
2025年11月25日
许可协议