1 条题解

  • 0
    @ 2025-8-24 22:49:18

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar xiaolilsq
    灰名不比红名好看(

    搬运于2025-08-24 22:49:18,当前版本为作者最后更新于2023-08-03 23:51:10,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    考虑 Prüfer 序列构造树的过程,从前往后扫过整个序列,记录当前度数为 11 的点集 SS,以及已经被删除的点集 TT,每次如果遇到数 x∉(ST)x\not\in (S\cup T),那么就将 SS 中最小值连上 xx,然后删除 SS 中的最小值将其加入 TT,而 xx 则可能可以加入 SS 也可能不加入 SS,序列扫完后必然 S=1,T=n2|S|=1,|T|=n-2,这时 SS 中唯一的数就会连上 nn

    于是可以如此 dp,设 f(i,j,S,T)f(i,j,S,T) 表示考虑 imi\sim m 这个序列中的子序列为最后一段,S,TS,T 为上面描述的两个点集,其中 jjnn 距离的总和以及方案数。按照上面转移 O(1)O(1),且 ST=S\cap T=\varnothing,所以复杂度为 O(3nnm)O(3^nnm)

    考虑 Prüfer 序列具体构造过程是如何从 O(nlogn)O(n\log n) 优化到 O(n)O(n) 的,类似的,优化掉 3n3^n,用一个集合 L=STL=S\cup T,那么实际上 SS 就是 LL 的一个后缀加上最多前面一个新加的点,所以可以将 3n3^n 优化到 2nn22^nn^2,时间复杂度复杂度优化为 O(2nn3m)O(2^nn^3m)

    但是我们发现如果当且 dp 要求的是 jjnn 的距离,那么我们唯一关心的就是 jj 连出去的父亲,所以如果新加的点如果不是 jj 那么我们其实完全不关心它具体是谁,于是一个 nn 可以被优化为一个 0101 储存的状态,即 SS 中当前最小的点是否恰好为 jj,于是时间复杂度优化为 O(2nn2m)O(2^nn^2m),可以通过所有数据。

    • 1

    信息

    ID
    8352
    时间
    2000ms
    内存
    150~512MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者