1 条题解
-
0
题目分析
本题是 JOI 2014 的一道难题,要求在 行 列的网格上,通过选择性地放置装置,使得从顶部任意列下落的球最终都到达底部同一列,且总花费最小。
核心难点
- 最大 ,无法枚举列。
- 最大 ,需要低于 的算法。
- 装置的作用是局部映射:如果球在第 行落在 内,就会被传送到 列。
问题转化
将过程看作函数复合。设 表示经过第 行(装置 所在行)后的列变化:
- 不放置装置 :(恒等映射)。
- 放置装置 : $ f_i(x) = \begin{cases} C_i & \text{if } x \in [A_i, B_i] \\ x & \text{otherwise} \end{cases} $
整个系统的变换为: $ F(x) = (f_M \circ f_{M-1} \circ \cdots \circ f_1)(x) $ 目标是选择哪些 放置装置,使得 是常数函数 (对所有 成立)。
倒推思路
从底部向上思考更直观。
最后一行(装置 ):
球进入第 行列 ,若 对所有 成立,则 必须全部等于某个值 ,且从 到底部时就是 (最后一行无装置,所以 )。
于是要求:对所有 ,。分析放置装置 的情况:
- 若 ,则 ,所以必须 。
- 若 ,则 ,所以必须 。
第二点意味着:不在区间 内的 只能是 这一个值。因此 必须覆盖除了 之外的所有列。
但如果 在区间外,则 (在区间内)不能等于 ,与 矛盾。
所以 必须在区间内,且区间外无元素,即: 并且 。结论:装置 必须放置,且必须 ,,。
继续倒推
假设从第 行开始,所有进入列最终都要到达 。
设此时进入列为 ,经过装置 后变为 ,然后进入下一行递归。要求对所有 , 最终映射到 。
即: 必须等于某个 ,使得从 开始后续过程能到 。同样分析装置 若放置:
- 时,,所以必须 且 最终到 。
- 时,,所以必须 。
因此,不在区间内的 只能是 这一个值。所以 必须覆盖除了 之外的所有列。
若 在区间外,则 (在区间内)不能等于 ,矛盾。
所以 必须在区间内,且区间外无元素,即: 并且 ,且 最终到 。这意味着:如果放置装置 ,它必须覆盖整行,且它的 值必须与下一行期望的“入口列”相同。
关键推论
由上述推导可得:
- 若在某一行放置装置,则该装置必须覆盖整行()。
- 所有被放置装置的 必须相同,记为 。
- 这些装置必须连续放置,从某一行 开始到 结束。
- 在 行之前不能有装置(否则不满足覆盖整行条件)。
但这样一来,从第 行到第 行没有装置,球会保持初始列 不变,到达第 行时列是 。
为了使 经过装置 后变成 ,我们需要对所有可能的 都有 或在 内且 。
由于 ,所以只要 ,无论 是什么,经过装置 后都变成 。所以可行方案是:
选择某个 ,并选择一个连续的行区间 ,使得对其中每个装置 都有 ,然后放置这些装置。总花费就是这些 的和。
与样例的冲突
但是,样例 1 中放置了装置 2、4、5,其中装置 2 的区间是 ,不是 ,不符合“必须覆盖整行”的推论。
这说明上述推导有误——我们错误地假设了“要使所有 映射到同一个值,区间必须覆盖整行”。其实并不需要。
修正思路:允许部分覆盖
正确思路:
不要求 本身是常数,而是要求 经过后续步骤后能到达同一个 。
这意味着 可以不同,只要它们最终都能到 。这样,装置 放置时,会将区间 内的所有列映射到 ,区间外的列保持不变。
为了让所有列最终到 ,需要满足:- 区间内的列: 最终能到 。
- 区间外的列:它们本身(即 )最终能到 。
于是,问题转化为:从底部向上,维护“哪些列最终能到达 ”的集合,然后判断能否让所有列最终到 。
图论建模(正解框架)
考虑每个列 作为一个节点。
放置装置 表示:将区间 的所有节点用一条有向边连接到节点 ,花费 。
不放置装置 表示:每个节点 到 的边(花费 0)。目标:选择一些装置(即一些边集),使得从任意节点 出发,沿着选择的边行走,最终都到达同一个节点 。
注意:因为装置是按顺序作用的,这个行走方向是正向(从上到下)。等价于:选择一个 ,对于所有 ,存在一条从 到 的路径(使用某些装置边),且总花费最小(花费是所选边的费用之和,但一条边被多条路径共享时只计一次费用)。
这可以转化为:从 反向建图,用 Dijkstra 求从 到所有节点的最短路,但这里边的费用是在选择装置时一次性支付的,所以需要设计合适的状态转移。
最终做法是:
- 定义 表示从第 行开始,所有列最终要到达 的最小花费。
- 从 倒推到 。
- 转移时考虑装置 是否放置,放置时会将一个区间的列映射到 ,然后要求 和区间外列最终都到 。
- 用线段树优化区间取最小值的操作。
复杂度
使用线段树优化 Dijkstra 式的 DP 转移,总复杂度 ,可处理 且 很大的情况。
总结
本题的核心是将装置映射转化为图论问题,通过最短路和区间数据结构优化求解。关键突破点是放弃“每行必须覆盖整行”的错误推论,采用“允许部分覆盖,但要求所有列最终汇于一点”的思路,从而得到可行的算法框架。
- 1
信息
- ID
- 6002
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者