一个简单的想法是,给编号为 i 的叶子赋权 m-i-1,并用该值填满其所在的整条链,然后进行一次 collect,这样在 dfs 时如果遇到了叶子编号比自己靠后的链便会先访问它,这样就可以通过嵌套结构来识别链头挂的点是哪个。可以做到的代价为 m,得分 47。
思考一下这个做法为什么不牛?我们共有 m 条链,如果我们需要给 m 条链分配两两不同的权值,那所需的值域也会达到 m。有什么办法在保证每条链有一个独有的标记的情况下还能够保证递归结构吗?
思考一下,我们需要保证递归结构,只需要让每次在主链上递归时如果有副链的儿子,优先递归它就行了。所以链头和其余部分是可以使用不同的权值的,不妨使用一个二元组 (x,y) 来编号一条链,表示我们将该链链头的权值设为 x,其余部分设为 y。由于需要满足前面所述的性质,需要保证任意一条链的 x 值均小于任意一条链的 y 值。
不难发现此时我们只需要 2\sqrt m 的值域就能编号所有链了。递归还原时,先递归处理掉所有挂在链头上的链,便可以得知该链所编号的二元组。之后遍历链上每个点,继续递归还原所有挂在该点上的链即可。