1 条题解

  • 0
    @ 2025-11-11 10:31:28

    题目理解

    我们有一个长度为 N1N-1 的序列 BB,要求统计长度为 NN 的序列 AA 的数量,满足:

    1. 子序列条件AA 删掉一个元素后等于 BB
    2. LIS 条件:存在一个排列 HH,使得 AiA_i 是以 HiH_i 结尾的最长递增子序列的长度

    关键观察

    1. LIS 条件的转化

    对于排列 HH,设 f(i)f(i) 是以 HiH_i 结尾的 LIS 长度,那么 ff 序列必须满足:

    • f(i)1f(i) \ge 1
    • 如果 f(i)=kf(i) = k,那么存在某个 j<ij < i 使得 Hj<HiH_j < H_if(j)=k1f(j) = k-1
    • 对于每个 kk,第一次出现 f(i)=kf(i) = k 的位置 ii 对应的 HiH_i 必须小于所有后面 f(j)=kf(j) = kHjH_j

    实际上,ff 序列对应着一个LIS 构造过程:当我们按顺序处理排列时,维护每个 LIS 长度的最小末尾元素。

    2. 已知结论

    对于一个序列 AA,存在排列 HH 使得 AiA_i 是以 HiH_i 结尾的 LIS 长度,当且仅当:

    • A1=1A_1 = 1
    • AiAi1+1A_i \le A_{i-1} + 1 对所有 i2i \ge 2
    • 对于每个 k1k \ge 1,第一次出现 Ai=kA_i = k 的位置 ii 必须小于所有后面 Aj=kA_j = k 的位置 jj 对应的 HjH_j(这实际上意味着序列必须满足某种单调性)

    更简洁地说:AA 必须满足 A1=1A_1 = 1Aimax{A1,,Ai1}+1A_i \le \max\{A_1, \dots, A_{i-1}\} + 1

    3. 问题重述

    现在问题变成:统计序列 AA 的数量,使得:

    1. AA 的长度为 NNBB 的长度为 N1N-1,且 AA 删掉一个元素等于 BB
    2. A1=1A_1 = 1
    3. Aimax{A1,,Ai1}+1A_i \le \max\{A_1, \dots, A_{i-1}\} + 1 对所有 i2i \ge 2

    算法设计

    1. 分析删除位置

    AA 删除了位置 pp 后得到 BB,那么:

    • 对于 i<pi < pBi=AiB_i = A_i
    • 对于 ipi \ge pBi=Ai+1B_i = A_{i+1}

    2. 必要条件

    由于 AA 必须满足 A1=1A_1 = 1Aimaxj<iAj+1A_i \le \max_{j<i} A_j + 1,我们可以推导出:

    • Mi=max{A1,,Ai}M_i = \max\{A_1, \dots, A_i\}
    • 那么 Ai+1Mi+1A_{i+1} \le M_i + 1

    3. 动态规划思路

    我们可以枚举删除的位置 pp,然后检查 BB 序列是否能够插入一个合适的值 xx 在位置 pp 使得整个序列满足条件。

    但是直接枚举 N106N \le 10^6 个位置,每个位置检查 O(N)O(N) 会超时。

    4. 关键观察

    实际上,满足 LIS 条件的序列 AA 必须满足:每当 Ai=kA_i = k 是第一次出现时,所有后面的 Aj=kA_j = k 必须对应着递增的 HjH_j

    这意味着:如果我们在位置 pp 插入值 xx,那么:

    • xx 不能破坏已有的"第一次出现"结构
    • xx 必须满足 xMp1+1x \le M_{p-1} + 1x1x \ge 1

    5. 高效算法

    我们可以预处理:

    • 前缀最大值 preMax[i]=max{B1,,Bi}preMax[i] = \max\{B_1, \dots, B_i\}
    • 后缀最大值 sufMax[i]=max{Bi,,BN1}sufMax[i] = \max\{B_i, \dots, B_{N-1}\}

    对于每个删除位置 pp,可插入的值 xx 必须满足:

    1. xpreMax[p1]+1x \le preMax[p-1] + 1(基于前缀条件)
    2. 如果 x>preMax[p1]x > preMax[p-1],那么 x=preMax[p1]+1x = preMax[p-1] + 1(因为不能跳过数字)
    3. 插入后不能破坏后缀的 LIS 结构

    实际上,经过分析可以发现:对于大多数位置 pp,可插入的值 xx 是唯一确定的,或者只有很少的选择。

    高效解法(基于官方思路)

    实际上,经过深入分析,这个问题有 O(N)O(N) 的解法:

    1. 序列 AA 必须满足 A1=1A_1 = 1Aimaxj<iAj+1A_i \le \max_{j<i} A_j + 1
    2. 当我们在位置 pp 插入值 xx 时:
      • 如果 p=0p = 0xx 必须是 1
      • 如果 p>0p > 0xmax{B1,,Bp1}+1x \le \max\{B_1, \dots, B_{p-1}\} + 1
    3. 此外,插入不能破坏 LIS 的结构,这意味着对于每个值 kk,所有 Ai=kA_i = k 必须对应着递增的 HiH_i

    最终的高效解法需要维护每个值最后一次出现的位置等信息,在 O(N)O(N) 时间内统计答案。

    复杂度分析

    • 时间复杂度O(N)O(N)
    • 空间复杂度O(N)O(N)

    总结

    这道题的关键在于:

    1. 理解 LIS 序列的性质A1=1A_1 = 1Aimaxj<iAj+1A_i \le \max_{j<i} A_j + 1
    2. 分析删除操作的影响:枚举删除位置,检查可插入的值
    3. 维护 LIS 结构:确保插入的值不破坏"第一次出现"的单调性

    通过深入分析 LIS 序列的组合结构,我们可以得到高效的计数算法。

    • 1

    信息

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