1 条题解

  • 0
    @ 2026-9-3 10:43:12

    数学课程:题解

    思路

    对一个排列建立大根笛卡尔树:最大值是根,最大值左侧和右侧分别递归形成左右子树。对于值 xx,所有包含 xx 的连续子数组的不同最大值,恰好是笛卡尔树上从 xx 到根的所有祖先值。因此,xx 是好数当且仅当它在笛卡尔树中的深度为 mm。问题转化为统计恰好有 kk 个深度为 mm 的结点的排列。

    设 f(d,s,c)f(d,s,c) 表示当前子树根深度为 dd、子树大小为 ss,且整棵子树中恰有 cc 个结点最终位于目标深度 mm 的排列数。

    枚举最大值在当前排列中的位置。若左侧大小为 ll,右侧大小为 r=s−1−lr=s-1-l,还要从其余 s−1s-1 个值中选择 ll 个放入左侧,方案数为 (s−1l)\binom{s-1}{l}。再枚举目标结点数在两棵子树间的分配即可。

    做法

    子任务 1 枚举所有 n!n! 个排列,用单调栈建立笛卡尔树,统计深度为 mm 的结点数。

    子任务 2 中 m=1m=1。任何非空笛卡尔树都恰有一个根结点深度为 11,所以当 k=1k=1 时答案是 n! mod pn!\bmod p,否则为零。

    满分做法记忆化上述区间长度动态规划。边界如下:

    • 空树只有在需要的结点数为零时贡献 11;
    • 当当前深度已经是目标深度时,只有 c=1c=1 才合法,此时当前子树的任意排列均可,贡献 s!s!;
    • 若剩余深度不足以容纳非零目标数,或 cc 超过该深度最多可能拥有的结点数,可以立即剪枝。

    组合数用杨辉三角形预处理,因此模数 pp 不需要是质数。

    复杂度

    状态数为 O(nmk)O(nmk),直接枚举根位置和左右目标数分配,时间复杂度上界为 O(n2mk2)O(n^2m k^2);剪枝后可通过本题限制。空间复杂度为 O(nmk)O(nmk)。

    • 1

    信息

    ID
    1292
    时间
    2000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    0
    上传者