1 条题解

  • 0
    @ 2025-12-11 14:32:13

    题目解法概述

    问题转化

    我们需要计算满足条件的序列对 (a,b)(a,b) 的数量,其中:

    1. a1<a2<<aNa_1 < a_2 < \cdots < a_N 严格递增
    2. 所有 ai,bia_i, b_i112N2N 的一个排列
    3. ai<bia_i < b_i 对每个 ii 成立
    4. 改进的算法(最优算法)比原算法(贪心算法)选择更多活动

    关键观察

    1. 原算法性质:原算法是按照 aia_i 递增顺序的贪心算法,每个活动如果与已选活动不冲突就选择
    2. 最优算法:通过动态规划可以找到最大不相交区间数
    3. 差异条件:需要原算法选择的活动数 <N<N(因为最优算法总能选到 NN 个?实际上最优算法最多选 NN 个,但需要原算法选择的活动数严格小于最优算法选择的活动数)

    主要步骤

    1. 建立双射

    将每个 (a,b)(a,b) 序列映射为一个 2N2N 的排列 π\pi,其中:

    • 位置 aia_iii
    • 位置 bib_ii+Ni+N

    这建立了 (a,b)(a,b) 与满足特定条件的排列之间的双射。

    2. 栈模型表示

    考虑将排列视为括号序列:

    • 数字 ii11NN 之间视为左括号
    • 数字 i+Ni+N 视为对应的右括号

    那么一个合法的 (a,b)(a,b) 对应一个括号序列,其中左括号严格递增出现。

    3. 原算法分析

    在原算法中,按 aia_i 顺序(即左括号出现顺序)处理:

    • 选择当前活动当且仅当它不与已选活动冲突
    • 等价于贪心选择最早结束的活动

    这对应到括号序列中:原算法选择的区间数等于序列的 栈深度 的最大值减 1?实际上更精确地,原算法选择的活动数等于某种 最大匹配 的大小。

    4. 最优算法分析

    最优算法选择的最大不相交区间数等于序列的 Dyck 路径 的高度或某种统计量。

    5. 计数方法

    f(n,k)f(n,k) 表示长度为 2n2n 的合法括号序列中,原算法选择 kk 个区间的方案数。

    我们需要计算:

    k=0N1f(N,k)\sum_{k=0}^{N-1} f(N,k)

    其中 kk 是原算法选择的活动数(最优算法总是选择 NN 个?实际上需要 k<Nk < N)。

    更精确地,设:

    • g(n)g(n) = 原算法选择 nn 个活动的方案数(此时最优算法也选 nn 个)
    • 我们需要:总方案数 - g(n)g(n)

    总方案数是 Catalan 数 Cn=1n+1(2nn)C_n = \frac{1}{n+1}\binom{2n}{n}

    递推公式

    通过分析括号序列结构,可以得到递推:

    dp[n][k]dp[n][k] 表示 2n2n 个位置的序列,原算法选择 kk 个区间的方案数。

    考虑第一个左括号匹配的右括号位置 2j2j

    $$dp[n][k] = \sum_{j=1}^{n} \sum_{k_1+k_2 = k-1} dp[j-1][k_1] \times dp[n-j][k_2] \times \binom{2n-2}{2j-2} $$

    边界:dp[0][0]=1dp[0][0] = 1

    优化计算

    直接计算 O(N3)O(N^3) 太慢,需要优化:

    1. 生成函数:设 Fn(x)=kdp[n][k]xkF_n(x) = \sum_{k} dp[n][k] x^k

      $$F_n(x) = x \sum_{j=1}^{n} F_{j-1}(x) \cdot F_{n-j}(x) \cdot \binom{2n-2}{2j-2} $$
    2. 卷积优化:使用 FFT 或 NTT 加速卷积,复杂度 O(N2logN)O(N^2 \log N)

    3. 最终答案

      $$ans = C_N - \sum_{k=0}^{N} [k \text{ 是最大可能值}] dp[N][k] $$

      实际上,当原算法达到最大可能值时,两个算法结果相同。

    具体实现

    1. 预处理组合数模 PP
    2. 计算 dp[n][k]dp[n][k] 使用分治 FFT
    3. 答案为:ans=CNdp[N][N]ans = C_N - dp[N][N] 因为当原算法能选 NN 个活动时,两个算法结果相同。

    时间复杂度

    • 朴素 DP:O(N3)O(N^3)
    • 优化后:O(N2logN)O(N^2 \log N)O(N2)O(N^2)

    公式总结

    Cn=1n+1(2nn)C_n = \frac{1}{n+1}\binom{2n}{n} 为卡特兰数。

    答案:

    $$ans = C_N - \sum_{k} [\text{原算法选 } k \text{ 个且是最优}] dp[N][k] $$

    简化版本(通过分析):

    ans=CN1N+1(2NN)ans = C_N - \frac{1}{N+1}\binom{2N}{N}

    但实际更复杂,需要精确计算 dp[N][N]dp[N][N]

    • 1

    信息

    ID
    6117
    时间
    6000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者