1 条题解
-
0
题解
思路
由于条件与顺序无关,先把序列排序为 。若每个前缀都是好序列,则任意连续段删去较小的前缀后最小值增大、总和减小,所以仍然好;再删去中间元素也不会破坏不等式。因此只需检查所有前缀。
固定最小值后,可以按每个值出现次数计数。把排列数统一乘上 ,每确定某个值出现
cnt次就乘 ,即可从多重集合恢复有序序列数。做法
子任务 1:枚举全部序列
枚举 个序列,排序后检查全部前缀,复杂度 。
子任务 2:枚举最小值的计数 DP
固定最小值参数 ,令 。状态
dp[used][sum][level]表示已放入used个元素、累计偏移为sum、当前处理偏移层level时的带阶乘权方案数。枚举当前层出现次数cnt,乘 转移到下一层;前缀合法条件给出used+cnt的下界,且sum+cnt*level不超过 。对全部 求和即可。中档 时直接枚举全部最小值。
满分优化
合法排序序列满足 ;若 ,则前 项必须全部等于 。进一步用最小可能增长率估计可证:有贡献的最小值只可能位于
因此只需枚举 个最小值。记忆化 DP 的维度均为 ,每个状态枚举出现次数,足以通过 。
正确性说明
排序不改变子序列多重集合。所有前缀合法推出所有连续段合法,而从连续段删去中间元素只会减小右侧总和,故前缀判定等价于完美性。计数 DP 逐层枚举每个值的出现次数,
used、sum和层级下界恰好编码所有前缀约束;阶乘与逆阶乘给每个多重集合乘上准确排列数,因此无重无漏。满分算法仅删除已证明不可能产生合法序列的最小值区间,答案保持不变。复杂度
子任务 1 为 ;子任务 2 枚举全部最小值;满分算法枚举 个最小值,最坏时间复杂度 ,空间复杂度 。
- 1
信息
- ID
- 1298
- 时间
- 5000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者