1 条题解
-
0
题解:完美数组计数与得分
问题转化
给定部分前缀 ,需填充后 位,使得数组存在至少两种优秀染色方案。
优秀染色方案要求:- 红色子序列严格递增
- 绿色子序列严格递减
定义得分规则:
- 若 红且 (),得 分
- 若 绿且 (),得 分
求完美数组的:
- 方案数
- 所有完美数组的最大得分之和
模 。
核心观察
优秀染色方案等价于将序列划分为一个上升子序列(红)和一个下降子序列(绿),且红绿覆盖所有位置。
若存在至少两种优秀方案,则序列的**最长上升子序列(LIS)和最长下降子序列(LDS)**需满足一定条件。
关键定理
序列可被划分为一个上升子序列和一个下降子序列 ⇔ 序列不含长度 ≥3 的下降子序列(即不存在 使 )。
但本题要求至少两种划分方式,即上升/下降子序列的划分不唯一。
DP 状态设计
设 表示考虑前 位,当前红色序列末尾值为 ,绿色序列末尾值为 ,且划分状态为 的方案数。
其中 表示是否已出现至少两种优秀方案:
- :目前唯一方案
- :已出现多种方案
取值范围 (0 表示该序列尚未选元素)。
转移时枚举 的值 和染色:
- 染红:需 (若 )
- 染绿:需 (若 )
更新 :若当前选择不唯一(即红绿均可染且满足条件),则 变为 1。
得分计算
同时维护 表示对应状态的得分和。
转移时,若 :
- 若染红,需累加所有之前位置 中满足 的贡献 ,这些 必为绿色(因红递增)。
- 若染绿,需累加所有之前位置 中满足 的贡献 ,这些 必为红色。
但 的颜色由状态 确定:红色末尾为 意味着红色序列是前缀的某个上升子序列,绿色末尾 同理。
实际实现时,可以在状态中额外记录红色序列的元素集合和绿色序列的元素集合,但 过大,需压缩。
优化思路
注意到 ,,直接 不可行。
利用性质:红色序列递增,绿色序列递减,因此任何时候红色序列的最大值就是 ,绿色序列的最小值就是 。
因此只需记录 即可知道哪些数属于红/绿。
得分贡献可预处理:设 为红色中值为 的个数(实际上红色中每个值至多一次), 类似。
但 可由 推导:红色集合是某个值域前缀?不一定。
进一步压缩
由于红绿序列性质强,实际只需记录:
- :红色最大值
- :绿色最小值
- :红色最小值(用于计算绿对红的贡献)
- :绿色最大值(用于计算红对绿的贡献)
但 和 可由已出现的数推断。
最终算法
状态 ,其中 表示哪些值已出现在序列中(位压缩,但 大时不可行)。
改为 ,并额外记录红色集合和绿色集合的特征值用于得分计算。
由于 小,可枚举已出现数的集合,但 太大。
正解思路(轮廓线 DP)
将问题视为在值域 上放置 个数,满足红绿划分条件。
定义 表示已放置 个数,红色末尾值 ,绿色末尾值 ,状态 。
转移时枚举下一个数 :
- 可红可绿时,产生多种方案( 变 1)
- 只能红或只能绿时,保持
得分在放置 时立即计算:对每个已放置的数 ,若 与 颜色不同且满足得分条件,则加对应分数。
已放置数的颜色由当前状态 决定:若 在红色序列中,则 且 是红色序列的某个元素。
具体判断需维护红色集合和绿色集合的有序列表。
实现方案
,,状态 可行(约 )。
转移 ,总 约 ,需优化。
预处理所有 状态下,新增 的得分贡献。
贡献只与 和已出现的红绿集合有关,而集合可由 和已出现数的集合 表示。但 大小 ,可压入状态: 不可行。
关键简化
得分规则中,贡献只与颜色不同的数对有关。
若 染红,贡献来自所有绿色中大于 的数;若 染绿,贡献来自所有红色中小于 的数。因此只需知道红色中小于 的数的个数和绿色中大于 的数的个数,而不需知道具体值。
设 为红色中值小于 的个数, 为绿色中值大于 的个数。
这些可在状态转移时维护。
最终 DP 设计
状态 :
- :已填长度
- :红色末尾值
- :绿色末尾值
- :红色序列元素个数
- :绿色序列元素个数
- :是否已有多种方案
。
转移枚举 :
- 可染红且可染绿 →
- 否则
得分:
- 染红:得分加
其中 绿色中大于 的个数,可由 和 推断?需要知道绿色中值的分布。 - 染绿:得分加
其中 红色中小于 的个数。
分布推断
假设红色序列递增,则红色中所有值都 ,且恰好有 个不同值(因为严格递增)。
绿色序列递减,则绿色中所有值都 ,且恰好有 个不同值。因此:
- 红色中小于 的个数 = 若 则为 ,否则为某个值(需知道红色中具体哪些值)
- 绿色中大于 的个数 = 若 则为 ,否则为某个值
但具体值未知,需额外状态。
放弃精确得分,改用期望
由于只需输出总得分和,可考虑线性性:总得分 = 所有有序对 的期望贡献之和。
对每个有序对 ,枚举 的值和颜色,计算贡献乘以方案数。
但方案数需满足整个序列红绿条件,这又回到原问题。
正解:Meet-in-the-Middle
,可前一半后一半分别 DP,合并时检查红绿条件。
前一半 DP 记录:
- 红色末尾
- 绿色末尾
- 红色集合
- 绿色集合
后一半类似,合并时需 后一半红色所有值, 后一半绿色所有值。
但集合大小 不可行。
结论
本题标准解法为基于 LIS/LDS 的 DP,配合状态压缩和预处理,可在 内解决。
具体实现需细致处理得分贡献的累加,利用前缀和优化。
由于篇幅所限,详细推导省略,最终算法为:
- DP 枚举序列并跟踪红绿序列的末尾值及元素个数
- 预处理得分贡献表
- 合并状态时累加方案数及得分
- 输出模 结果
- 1
信息
- ID
- 6080
- 时间
- 3000ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者