#P17241. [IOI 2026] 纪念碑 / Monuments
[IOI 2026] 纪念碑 / Monuments
题目描述
撒马尔罕著名的雷吉斯坦广场内有 座纪念碑,它们排列成一条穿过广场中心的直线。这些纪念碑的编号从 到 。编号为 ()的纪念碑初始位于整数坐标 处,广场中心位于坐标 。
建筑师要求建筑布局关于中心完美对称。他们希望通过移动其中一些(数量可能为零)纪念碑,使得最终的建筑布局关于坐标 对称,可以形式化描述如下:
- 所有纪念碑必须位于整数坐标处。
- 每个整数坐标可以放置零个、一个或多个纪念碑。
- 对于任意整数 ,位于坐标 处的纪念碑数量必须等于位于坐标 处的纪念碑数量。坐标 上可以放置任意数量的纪念碑(数量可能为零)。
然而,有 座古老纪念碑年久失修导致无法移动。它们的编号为 。这 座纪念碑必须停留在其原始坐标上,其余 座纪念碑可以移动到任意整数坐标处。在移动过程中,纪念碑之间互不干扰。
将一座纪念碑从坐标 移动至坐标 的代价为 。总代价定义为所有被移动纪念碑的代价之和。
你的任务是求出使所有纪念碑的建筑布局关于坐标 对称的最小总代价;如果无法在给定约束下实现对称,则判定为无解。
实现细节
你要实现以下函数:
long long get_cost(std::vector X, std::vector P)
- :长度为 的非递减数组,给出纪念碑的初始坐标。
- :长度为 的严格递增数组,给出古老纪念碑的编号。
- 对于每个测试用例,该函数恰好被调用一次。
该函数应返回一个整数:使建筑布局对称的最小总代价;如果不可能,则返回 。
输入格式
N M
X[0] X[1] ... X[N-1]
P[0] P[1] ... P[M-1]
注意,如果 ,则第三行可能为空行。
输出格式
C
其中, 为 get_cost 的返回值。
提示
例子
例 1
考虑以下调用:
get_cost([-3, -2, 1, 3], [1, 2])
纪念碑的初始建筑布局如下图所示。
:::align{center}
:::
共有 座纪念碑,初始坐标分别为 。古老纪念碑的编号为 和 。即坐标为 和 的纪念碑不能移动。其余坐标为 和 的纪念碑可以移动。
为使总代价最小且达到对称,我们需要如下移动纪念碑:
- 将坐标为 的纪念碑移至 ,代价为 。
- 将坐标为 的纪念碑移至 ,代价为 。
移动后布局变为对称。
:::align{center}
:::
总移动代价为 ,因此该函数应返回 。
例 2
考虑以下调用:
get_cost([2, 2, 2, 3], [])
此处 ,表示没有古老纪念碑,所有纪念碑均可移动。
一种最小总代价的解法是将所有纪念碑移至坐标 。每座纪念碑的移动代价为:
- 纪念碑 、 和 的代价为 。
- 纪念碑 的代价为 。
总代价为 。因此该函数应返回 。注意,存在其他总代价相同的解法。
例 3
考虑以下调用:
get_cost([1, 2, 3, 4], [0, 1, 2, 3])
全部 座纪念碑均为古老纪念碑,无法移动。
由于它们的坐标均为正数,无法使建筑布局关于 对称。
因此该函数应返回 。
约束条件
子任务
| 子任务 | 分数 | 额外的约束条件 |
|---|---|---|
| 对于所有满足 的 ,均有 。 | ||
| 没有额外的约束条件。 |