1 条题解
-
0
题目理解
我们有一列火车,从站 开到站 ,列车长 Bajtazar 要在途中进行 次查票。
查票发生在离开某个站点之后,即在区间 进行查票,我们把这个查票位置记为 ()。已知所有乘客的行程信息: 表示从站 上车、在站 下车的乘客数量。
关键规则:
- 如果在某段查票,会检查该段列车上所有乘客的票。
- 如果某个乘客在之前已经被查过票,那么再次查到时不计入工资。
目标:选择 个查票位置,使得查到的不重复的乘客数最多。
思路分析
1. 乘客被查到的条件
假设一个乘客从 上车, 下车()。
这个乘客会在离开站点 之后的区间里都在车上。如果我们在这 个区间中的任何一个查票,都会查到这个乘客。
但只有第一次查到时才算工资。因此,如果我们选择的查票位置中,该乘客行程覆盖的第一个查票位置是 (),那么该乘客的票会在位置 被计入。
2. 问题转化
我们要选择 个查票位置( 中选 个),最大化总收益。
收益计算方式:
对于每个乘客 ,如果我们在 中选择了至少一个查票点,那么该乘客会被计入最小的那个查票点的贡献中。
3. 动态规划设计
设 表示我们考虑了前 个可能的查票位置(即 ),并且在这里选择了 次查票,所能获得的最大查票数。
转移方程: [ dp[i][t] = \max_{0 \le j < i} \left( dp[j][t-1] + gain(j, i) \right) ] 其中 表示当上一次查票在位置 (若 表示还没查过票),这次查票在位置 时,新增的乘客数量。
4. 计算 gain(j, i)
包含所有满足以下条件的乘客 :
- (在位置 查票时乘客在车上)
- 或者 ?
我们需要仔细分析:乘客 在位置 被第一次查到,当且仅当:- (在位置 时乘客在车上)
- 在 区间内没有查票(否则之前就查到了)
因为 是上一次查票位置,那么 之间没有查票。
所以如果 ,那么乘客可能在 或更早被查到过,不算在 中。
因此条件为:。也就是说, = 所有满足 的乘客 的数量。
5. 预处理 gain 数组
我们可以预处理一个二维数组 表示 。
注意 从 到 , 从 到 ,且 。
计算方式:
固定 ,对于每个 (),对于每个 (),如果 ,那么乘客 会对 贡献 。我们可以用差分数组优化这个预处理,达到 预处理,但 可能有点大。不过 ,也许可接受。
更高效的方法:
定义 表示从 上车,在位置 查票时能查到的乘客数(即 的 之和)。
那么: [ g[j][i] = \sum_{a = j+1}^{i} cnt[a][i] ] 其中 。我们可以 预处理 ,然后 预处理 。
但 太大(2.16e8),需要优化。
6. 优化 gain 计算
注意到: [ g[j][i] = g[j][i-1] + cnt[i][i] - \sum_{a=j+1}^{i-1} x_{a,i} ] 其中 ,而 表示那些从 () 上车、在 下车的乘客,他们在位置 查票时已经下车了,所以不算。
这样我们可以在 时间内预处理 。
7. 动态规划实现
我们设 表示前 个位置选了 次查票,且最后一次在 查票的最大收益。
同时用 记录前一个查票位置,用于输出方案。转移: [ dp[i][t] = \max_{0 \le j < i} ( dp[j][t-1] + g[j][i] ) ] 初始 ,其他 。
答案:。
8. 输出方案
通过 回溯,得到查票位置序列。
复杂度分析
- 预处理 :(这里可以优化到 ,通过后缀和)
- 预处理 :(也可以优化到 )
- DP:
由于 , 约 可接受。
总结
这道题的核心在于:
- 理解“乘客只在第一次被查时计入”这一规则
- 将问题转化为动态规划模型
- 高效预处理增益数组
- 通过记录前驱状态输出方案
这样就能在给定限制内求出最优查票方案。
- 1
信息
- ID
- 4515
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者