题解 - Luogu P14464 海底列車(collapse)
愚蠢的 次数做法,除了代码短一点点和好想就没啥优势了。
简述题意
给两棵有根树 ,每次可以交换 中某两个距离为偶的点的父亲,问能否在 次操作内将 变成 。。
解法
对于一棵树,黑白染色,两种颜色的点的度数集合分别记为 ,则 这个无序二元组相同的两棵树,他们都是可以互相转化的。这个东西的必要性是显然的(操作不会改变点的度数),我们考虑用构造把它的充分性得出来。
考虑只根据 生成一棵树 ,然后让等价类里面所有的 都可以在 次操作之内和它转化,我们就可以得到 。
我们发现只要每次我们在 上接上去一个叶子, 上就一定可以操作。具体来说,每次操作是:
- 如果 ,那么把这个 对应的节点和 中一个用某种方式定下来的非 度点相连,在此之后这条边应当视作不存在(毕竟它不能再发生改变了);
- 否则必定有 ,对称地操作即可。
当我想要在 (以下直接称为 )连起来一条边 ,其中 是叶子:
- 如果这条边存在,pass;
- 令 路径上的第二个点是 , 路径上的第二个点是 , 的任意一个不是 的邻点是 ,那么一次操作我们进行 。
- 容易发现由于 度数为 ,每次只是把一个叶子剥出去,不影响后续操作。
模拟以上过程需注意绝对不可以让 的编号影响其和 之间的转化。
暴力模拟,复杂度 。
题解 - Luogu P14464 海底列車(collapse)
http://sunsetglow95.github.io/sol-LGP14464/