1 条题解
-
0
题目理解
我们有一个长度为 的序列 ,要求统计长度为 的序列 的数量,满足:
- 子序列条件: 删掉一个元素后等于
- LIS 条件:存在一个排列 ,使得 是以 结尾的最长递增子序列的长度
关键观察
1. LIS 条件的转化
对于排列 ,设 是以 结尾的 LIS 长度,那么 序列必须满足:
- 如果 ,那么存在某个 使得 且
- 对于每个 ,第一次出现 的位置 对应的 必须小于所有后面 的
实际上, 序列对应着一个LIS 构造过程:当我们按顺序处理排列时,维护每个 LIS 长度的最小末尾元素。
2. 已知结论
对于一个序列 ,存在排列 使得 是以 结尾的 LIS 长度,当且仅当:
- 对所有
- 对于每个 ,第一次出现 的位置 必须小于所有后面 的位置 对应的 (这实际上意味着序列必须满足某种单调性)
更简洁地说: 必须满足 且 。
3. 问题重述
现在问题变成:统计序列 的数量,使得:
- 的长度为 , 的长度为 ,且 删掉一个元素等于
- 对所有
算法设计
1. 分析删除位置
设 删除了位置 后得到 ,那么:
- 对于 :
- 对于 :
2. 必要条件
由于 必须满足 且 ,我们可以推导出:
- 设
- 那么
3. 动态规划思路
我们可以枚举删除的位置 ,然后检查 序列是否能够插入一个合适的值 在位置 使得整个序列满足条件。
但是直接枚举 个位置,每个位置检查 会超时。
4. 关键观察
实际上,满足 LIS 条件的序列 必须满足:每当 是第一次出现时,所有后面的 必须对应着递增的 。
这意味着:如果我们在位置 插入值 ,那么:
- 不能破坏已有的"第一次出现"结构
- 必须满足 且
5. 高效算法
我们可以预处理:
- 前缀最大值
- 后缀最大值
对于每个删除位置 ,可插入的值 必须满足:
- (基于前缀条件)
- 如果 ,那么 (因为不能跳过数字)
- 插入后不能破坏后缀的 LIS 结构
实际上,经过分析可以发现:对于大多数位置 ,可插入的值 是唯一确定的,或者只有很少的选择。
高效解法(基于官方思路)
实际上,经过深入分析,这个问题有 的解法:
- 序列 必须满足 且
- 当我们在位置 插入值 时:
- 如果 : 必须是 1
- 如果 :
- 此外,插入不能破坏 LIS 的结构,这意味着对于每个值 ,所有 必须对应着递增的
最终的高效解法需要维护每个值最后一次出现的位置等信息,在 时间内统计答案。
复杂度分析
- 时间复杂度:
- 空间复杂度:
总结
这道题的关键在于:
- 理解 LIS 序列的性质: 且
- 分析删除操作的影响:枚举删除位置,检查可插入的值
- 维护 LIS 结构:确保插入的值不破坏"第一次出现"的单调性
通过深入分析 LIS 序列的组合结构,我们可以得到高效的计数算法。
- 1
信息
- ID
- 5216
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者