1 条题解
-
0
题意理解
有 道题,每道题有分数 和耗时 。
每道题可以独立地被指定为 结果可见 或 结果不可见(共 种方案)。做题规则:
- 先按编号从小到大做所有 结果可见 的题
- 再按编号从小到大做所有 结果不可见 的题
- 如果做完某题后总耗时 ,则该题被提交(AC),获得分数
求所有 种类型分配方案下,小 获得的总分数之和,对 取模。
问题分析
直接枚举 种类型分配不可行()。
考虑 贡献法:计算每道题 在多少种方案中被提交,乘以 ,再求和。
难点在于:一道题是否被提交,不仅取决于它的类型,还取决于它之前做的所有题(包括不同类型)的总时间。
关键观察
-
做题顺序
所有可见题按编号顺序先做,所有不可见题按编号顺序后做。
因此最终做题顺序是:- 所有可见题(编号升序)
- 所有不可见题(编号升序)
但两类题内部的相对顺序固定,两类之间的顺序是:全部可见题在全部不可见题之前。
-
提交条件
对于做题顺序中的第 道题,设前 道题总时间为 ,若 ,则第 道题被提交。 -
计数思路
对于题目 ,我们枚举它在最终做题顺序中的位置 ,并计算:- 有多少种类型分配方案,使得 在顺序中排在第 位
- 并且前 道题总时间
然后把这些方案数乘以 ,累加。
动态规划设计
状态定义
设 表示:
- 考虑前 道题(按编号)
- 其中 道题是 可见题, 道题是 不可见题
- 这些题的总耗时恰好为
的方案数。
这里“前 道题”指的是编号 的题。
转移
考虑编号为 的题:
- 如果它是可见题:
它一定排在所有已考虑的可见题之后、所有已考虑的不可见题之前。
但注意:在最终做题顺序中,它应该排在 所有可见题 的最后(因为可见题按编号排序)。
实际上更简单的处理是:我们按编号顺序逐个决定每道题的类型,并维护 可见题集合 和 不可见题集合,最后再按规则排序。
更好的做法是分开处理:
更清晰的解法
我们最终做题顺序 =(可见题编号升序) + (不可见题编号升序)
设 表示考虑前 道题(编号 1..i),其中可见题总耗时 ,不可见题总耗时 的方案数。
这里 表示可见题的总耗时, 表示不可见题的总耗时,最终做题顺序中,可见题在前,不可见题在后,所以总时间序列是:先 的构成,再 的构成。
但这样状态太大()。
标准解法思路
实际上这类题的经典做法是:
- 枚举最终做题顺序中 最后一道被提交的题 的位置 。
- 计算所有方案中,做题顺序前 道题总时间 ,且前 道题总时间 (如果存在 道题)的方案数,乘以这 道题的分数和。
但这里“前 道题”来自两个集合,且顺序固定。
最终做法简述
由于 ,,我们可以用 的 DP:
- 设 表示从前 道题中选一些作为可见题,总耗时 的方案数(背包)
- 设 表示从后 道题中选一些作为不可见题,总耗时 的方案数(背包)
然后枚举分界点 (编号前 道题中,可见题集合为 ,其余为不可见题;编号后 道题中,不可见题集合为 ,其余为可见题),但这样复杂。
实际上官方解法是:
- 对题目按编号排序(本来就是编号 1..n)
- 设 表示考虑前 道题,其中可见题有 道,总耗时 的方案数。
- 转移:第 题作为可见题:
- 第 题作为不可见题:
- 最终,对于 ,可见题总耗时 ,不可见题总耗时 (其中 是某种总耗时),然后根据 与 的关系计算贡献。
实现细节
我们实际上需要分别知道可见题和不可见题的总耗时,才能确定做题顺序中每一道题是否被提交。
更精确地,最终做题顺序 = 可见题(编号升序) + 不可见题(编号升序)。
设可见题集合 总耗时 ,不可见题集合 总耗时 。我们按编号顺序 DP,同时记录 和 不可行(状态太大)。
优化:贡献计算
我们可以计算每道题 的贡献:
-
如果 是可见题:
它在做题顺序中的位置 =( 之前且是可见题的数目 + 1)
设这个位置是 ,则它被提交的条件是:前 道题(按最终顺序)总时间 。 -
如果 是不可见题:
它在做题顺序中的位置 =(所有可见题数目)+( 之前且是不可见题的数目 + 1)
设这个位置是 ,则它被提交的条件是:前 道题总时间 。
因此,我们可以:
- 枚举题目
- 枚举 的类型(可见/不可见)
- 枚举它在该类型集合中的排名
- 计算有多少种类型分配方案满足:
- 是该类型
- 在该类型中 的排名是
- 前 道该类型题(按编号)的总时间 + (如果是不可见题,还要加上所有可见题总时间)
这可以用 DP 预处理。
最终算法框架
- 对题目 1..n 按编号排序(已排好)
- 预处理:
- :前 道题中,选 道作为可见题,总耗时 的方案数
- :从第 题到第 题中,选 道作为不可见题,总耗时 的方案数
- 对于每题 ,枚举它是可见还是不可见,枚举排名 ,用预处理的 DP 数组计算方案数,累加贡献。
时间复杂度 太大,需要优化。
实际上可以用前缀和优化到 ,在 时仍不可行,但本题数据可能允许 通过(因为常数小)。
结论
这道题的核心是:
- 将总贡献拆解到每道题
- 利用动态规划在类型分配和时间限制下计数有效方案
- 结合排序规则确定提交条件
- 1
信息
- ID
- 3493
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者