1 条题解

  • 0
    @ 2026-9-3 11:12:35

    题解

    思路

    关键结构

    将所有区间按左端点递增排列。左端点不能相同;否则右端点较小的区间会被另一个包含。同理,右端点也两两不同,且必须与左端点保持相同的递增次序。

    因此,只要选出两个大小为 nn 的坐标集合 L,RL,R,并将第 ii 小的左端点与第 ii 小的右端点配对,就只需保证每个前缀中左端点数不少于右端点数。坐标 xx 必须选入 LL。这样数出的是无标号区间集合,最后乘上 n!n! 得到有序序列数。

    做法

    子任务 1:枚举区间序列

    列出 [1,m][1,m] 上的全部 m(m+1)/2m(m+1)/2 个区间,枚举其中 nn 个不重复区间的排列。逐对判定包含关系,并检查是否有左端点 xx。

    设 S=m(m+1)/2S=m(m+1)/2,时间复杂度为 O(P(S,n)n2)O(P(S,n)n^2),空间复杂度为 O(S+n)O(S+n)。

    子任务 2:位集合枚举端点

    用两个 mm 位二进制集合分别表示 L,RL,R。只枚举各有 nn 个位的集合,要求 x∈Lx\in L,然后检查排序后每个 li≤ril_i\le r_i。每对合法端点集合贡献 n!n!。

    时间复杂度上界为 O(4mm)O(4^m m),空间复杂度为 O(2m)O(2^m)。

    子任务 3:端点扫描 DP

    设 f[a][b]f[a][b] 表示已处理若干个坐标,已放置 aa 个左端点、bb 个右端点的方案数。始终只保留 0≤b≤a≤n0\le b\le a\le n。对于当前坐标 ii,有四种选择:

    1. 不放端点;
    2. 只放一个左端点;
    3. 只放一个右端点;
    4. 同时放一个左端点和一个右端点。

    在 i=xi=x 时必须放左端点,所以只保留第 2、4 种转移。其他坐标保留全部四种转移。答案为 f[n][n]⋅n!f[n][n]\cdot n!。

    当 n>mn>m 时左端点无法两两不同,直接输出 00。否则由 n⋅m≤100000n\cdot m\le100000 和 n≤mn\le m 可知 n≤316n\le316,因此 O(mn2)O(mn^2) 复杂度可以通过。使用滚动数组后,空间复杂度为 O(n2)O(n^2)。

    独立组合数校验

    设

    $$B(p,a,b)=\binom pa\binom pb-\binom p{a+1}\binom p{b-1}.$$

    根据反射原理,B(p,a,b)B(p,a,b) 是在 pp 个坐标上选 aa 个左端点、bb 个右端点,且任意前缀中左端点不少于右端点的方案数。在 xx 之前枚举已放置的 (a,b)(a,b),再分别讨论 xx 处“只放左端点”和“左右都放”,可得到一个 O(n2)O(n^2) 的独立公式实现。本包用该实现与端点 DP 交叉验证。

    复杂度

    三层做法的时间复杂度依次为 O(P(m(m+1)/2,n)n2)O(P(m(m+1)/2,n)n^2)、O(4mm)O(4^m m) 与 O(mn2)O(mn^2);对应空间复杂度依次为 O(m2+n)O(m^2+n)、O(2m)O(2^m) 与 O(n2)O(n^2)。独立组合数校验为 O(m+n2)O(m+n^2) 时间、O(m)O(m) 空间。

    正确性证明

    合法区间集合与满足前缀条件的端点选择一一对应:正向映射由排序后的端点得到;反向映射将第 ii 小的左、右端点配对,前缀条件保证 li≤ril_i\le r_i。递增次序保证任意两区间不互相包含。DP 精确枚举每个坐标对左、右端点的四种选择,并在 xx 禁止不含左端点的转移,因此 f[n][n]f[n][n] 正好数出全部无标号合法集合。区间两两不同,乘 n!n! 后正好得到所有有序序列。

    • 1

    信息

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