1 条题解
-
0
题意重述
我们有 个车站 ,可以放 个标志(位置任意实数)。
定义 为:在 和 之间,离 最近的标志到 的距离,如果之间没有标志,则 。
目标是:,,。
第一步:化简
设 ,即 。
令 为 右侧第一个标志的位置(若没有则为 )。
那么:- 若 ,则 。
- 若 ,则 。
即:
对于 对称地定义 为 左侧第一个标志位置(若没有则为 ):
第二步:拆分总和
将总和按 分组:
$$S = \sum_{i=1}^n \left[ \sum_{j>i} c(i,j) + \sum_{j<i} c(i,j) \right] $$
1. 对 的部分
设 是 右侧第一个标志的位置。
设 是满足 的最小下标(若 则 )。
那么:- 当 时,。
- 当 时,。
于是:
$$\sum_{j>i} c(i,j) = \sum_{j=i+1}^{next(i)-1} (x_j - x_i) + (n - next(i) + 1) \cdot (r_i - x_i) $$
2. 对 的部分
设 是 左侧第一个标志的位置。
设 是满足 的最大下标(若 则 )。
那么:- 当 时,。
- 当 时,。
于是:
$$\sum_{j<i} c(i,j) = \sum_{j=prev(i)+1}^{i-1} (x_i - x_j) + prev(i) \cdot (x_i - l_i) $$
第三步:标志位置的最优性
因为 关于标志位置是分段线性的,最优解中标志可以放在某个车站位置(或边界)而不损失最优性。
因此我们只需考虑标志放在车站处的情况。
第四步:动态规划设计
设 表示已经放了 个标志,最后一个标志在车站 时,前 个车站相关的 的最小值。
但这样定义不方便计算完整的 ,因为 与后面的车站有关。
我们换个角度:
标志将数轴分成若干段,每段内(不含两端)的车站没有标志,这些车站的 和 由两端标志决定。
更清晰的 DP 状态
设 表示在前 个车站中放了 个标志(第 个标志在车站 ),且只考虑这些车站以及它们之间的贡献的最小代价。
但是要小心处理“贡献”的定义,因为 与 有关,即使 在 之后也可能与前面的标志相关。
第五步:贡献计算重组
我们可以将 重新组合,使得 DP 容易计算。
对于任意 :
$$\sum_{j \neq i} c(i,j) = \sum_{j>i} \min(r_i - x_i, x_j - x_i) + \sum_{j<i} \min(x_i - l_i, x_i - x_j) $$设 ,。
注意 是 到右侧第一个标志的距离, 是 到左侧第一个标志的距离。那么:
$$\sum_{j>i} \min(A_i, x_j - x_i) = \sum_{j=i+1}^{next(i)-1} (x_j - x_i) + (n - next(i) + 1) \cdot A_i $$$$\sum_{j<i} \min(B_i, x_i - x_j) = \sum_{j=prev(i)+1}^{i-1} (x_i - x_j) + prev(i) \cdot B_i $$
第六步:DP 方程推导
如果我们设标志位置在车站集合 中,那么对任意 :
- 若 是标志,则 ,,但实际上 左右标志是自己?这里要小心,标志本身 如何定义?若 处有标志,那么离 最近的标志就是 自己(距离 0),所以 对任何 成立?不对,题目说“离第 个站最近的标记”,若标记就在 ,距离为 0,所以 。这意味着标志所在站对 贡献为 0,这样显然标志应尽量覆盖多的车站以减少贡献。
换个思路,直接建模:
设我们在位置 放了标志。
对车站 ,设左右最近标志为 (可能重合)。- 若 ,则 ,(左标志在自身)。
- 若 ,则 ,。
- 若 ,则 ,。
第七步:DP 方程简化
因为标志在车站上,设标志下标为 。
$$A_i = x_{p_{t+1}} - x_i, \quad B_i = x_i - x_{p_t} $$
对标志 和 之间的车站 (),有:那么对 在 中:
$$\sum_{j>i} \min(A_i, x_j - x_i) + \sum_{j<i} \min(B_i, x_i - x_j) $$可以提前用前缀和预处理计算,记作 表示区间 内车站对 的贡献总和(注意这里要考虑这些车站与所有 的配对,不仅区间内)。
仔细推导发现, 可以 用前缀和计算,因为: 对于 ,,。
那么:
$$\sum_{j>i} \min(A_i, x_j - x_i) = \sum_{j=i+1}^{r-1} (x_j - x_i) + (n - r + 1) \cdot (x_r - x_i) $$$$\sum_{j<i} \min(B_i, x_i - x_j) = \sum_{j=l+1}^{i-1} (x_i - x_j) + l \cdot (x_i - x_l) $$这两个和式可以用 的前缀和 快速计算。
第八步:最终 DP
设 表示已经放了 个标志,最后一个标志在 ,且考虑了前 个车站相关贡献的最小值。
$$dp[t][i] = \min_{j < i} \{ dp[t-1][j] + cost(j, i) \} $$
转移时,枚举上一个标志位置 :其中 表示区间 内车站(不包括 端点)对 的贡献总和(已经包含了它们与所有其他站的 贡献)。
计算 需要 公式,用前缀和预处理。
第九步:复杂度优化
直接 DP 复杂度 太大。
观察到 满足四边形不等式,决策单调性成立,因此可以用分治优化或单调队列优化到 或 。这里 ,, 可过。
第十步:边界处理
- 第一个标志之前和最后一个标志之后的区间需要特殊处理,可以将虚拟标志放在 和 处。
- 注意标志位置在车站上, 中 是标志下标,区间 内无标志。
第十一步:预处理公式
设 ,。
对 ,区间 内车站 对 的贡献:
$$\text{right\_part}(i) = (pref[r-1] - pref[i]) - (r-1-i) \cdot x_i + (n - r + 1) \cdot (x_r - x_i) $$$$\text{left\_part}(i) = (i - l - 1) \cdot x_i - (pref[i-1] - pref[l]) + l \cdot (x_i - x_l) $$所以 $cost(l, r) = \sum_{i=l+1}^{r-1} [\text{right\_part}(i) + \text{left\_part}(i)]$。
这个和可以进一步化简成关于 的 公式,从而快速计算。
第十二步:算法步骤
- 读入 。
- 计算前缀和 。
- 预处理 的 计算方法。
- DP:,用决策单调性优化。
- 最终答案 = (即最后一个标志 到 的区间贡献)。
第十三步:总结
本题关键:
- 将 转化为最近标志距离。
- 重组总和为可 DP 形式。
- 预处理 公式。
- 决策单调性优化 DP。
- 1
信息
- ID
- 5943
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者