1 条题解
-
0
题目大意
给定两个长度为 的排列 和 。每次操作可以选择两个不同的下标 ,交换 和 ,代价为 。
求将 变成 的最小总代价,并输出任意一种达到该代价的操作序列。问题转化
将 变成 ,相当于要把每个数 放到某个目标位置 ,使得最终该位置上的数等于 。因为 和 都是排列,所以存在一个双射:原始位置 上的数 应该去往目标位置 ,且满足 (实际上更自然的建模是:把 送到位置 ,但最终位置 上的数必须是 ,所以 必须等于 ,即 只能匹配到满足 的 ?不对,因为 可以移动多次,最终位置 上的数可以是任何原始数,只要它等于 。所以实际上我们需要重新排列 中的数,使得每个位置 上的数变成 。这等价于找到一个置换 ,使得对于每个 ,把 移动到位置 ,并且最终位置 上的数恰好是 ,即集合 。这意味着 是 的一个排列,并且满足 ,即 经过 重排后等于 。因此 实际上就是 到 的排列对应关系:令 表示数值 在 中的位置, 表示数值 在 中的位置,那么数值 需要从 移动到 。所以问题变为:我们有 个物品,每个物品 的初始位置为 ,目标位置为 ,且物品 上还附带一个“值”就是 本身(但值在交换中也会移动)。每次交换两个位置 上的物品(即交换 和 ),代价为 。注意这里的 是当前在该位置上的数值,即物品的编号。目标是让每个物品 到达位置 。
这个模型与常见的“通过交换使每个物品归位”问题不同,因为代价不仅依赖于位置差,还依赖于数值差。但注意,数值差 恰好等于两个物品的编号之差的绝对值。所以代价是位置差和编号差的最小值。
关键观察
考虑一次交换 ,它同时改变了两个物品的位置和它们所处的位置。我们可以将整个过程看作是在二维平面上的 个点:每个物品 对应一个点,其横坐标为当前位置 ,纵坐标为当前数值 。初始时点集为 ,目标点集为 。一次交换 相当于交换两个点的横坐标(因为 和 位置上的物品互换,所以它们的横坐标互换),同时因为数值也互换,所以它们的纵坐标也互换。也就是说,一次操作同时交换两个点的 横坐标 和 纵坐标。操作代价为 ,其中 是交换的两个点的横坐标之差, 是纵坐标之差。
因此,问题变成:平面上有 个点,每个点有初始坐标 和目标坐标 ,但点之间没有标签,我们只需要通过若干次“同时交换两个点的全部坐标”的操作,使得点集变成目标点集(即存在一个匹配关系,每个初始点要去某个目标点)。注意,因为点是无标签的,我们实际上可以自由决定哪个初始点去哪个目标点,只要最终点集相同。这等价于找出一个初始点到目标点的匹配,使得总代价最小,其中匹配代价定义为将点 移动到点 所需的最小代价。而将一个点从 移动到 可以通过一系列相邻交换实现,每步代价为 ,因此最小代价恰好是曼哈顿距离 。为什么?因为我们可以先只交换横坐标(每次交换相邻两个点,横坐标差为 ,纵坐标差可能任意,但代价取 ,如果 则代价为 ;如果 则代价为 ?实际上相邻交换时 ,所以代价 只要 ;若 则代价为 ,但两个不同点纵坐标不可能相等(因为值不同),所以总是 。因此相邻交换的代价恒为 。同理,交换纵坐标也可以通过相邻交换(纵坐标差为 )实现代价 。所以曼哈顿距离就是所需的最少操作次数,每次操作代价 ,总代价即为曼哈顿距离。因此,将初始点 匹配到目标点 的代价就是曼哈顿距离 。
于是问题简化为:给定初始点集 和目标点集 ,求一个完美匹配使得所有匹配的曼哈顿距离之和最小。这是一个二分图最小权匹配问题,其中左部为初始点,右部为目标点,边权为曼哈顿距离。因为 ,可以用最小费用最大流求解。
求解最小权匹配
标程使用最小费用流,建图方式:
- 源点 连接每个左部点(初始位置 ),容量 ,费用 。
- 每个左部点 连接每个右部点 (目标位置 ),容量 ,费用 。
- 每个右部点连接汇点 ,容量 ,费用 。
跑最小费用最大流后,每条满流的边 就表示初始点 匹配到目标点 。记匹配结果为:对于每个 ,它匹配到 ,即点 要去目标位置 ,且该目标点的纵坐标应为 。注意,初始点 的纵坐标是 ,但匹配时我们只关心位置匹配,因为纵坐标会自动匹配:由于排列性质,匹配后所有 会恰好对应所有 ,所以最终点的纵坐标也会正确。
构造操作序列
得到匹配后,我们知道了每个初始点的目标坐标 。现在我们需要通过一系列交换操作(每次交换两个点的全部坐标)将点集从 变成 。注意,这里点的标签(即它们所代表的数值)已经隐含在纵坐标中,但我们只需操作坐标,无需关心标签。我们采用两阶段构造:
- 调整横坐标:通过交换操作,使每个点的横坐标等于它的目标横坐标 ,此时纵坐标可能还未对齐。
- 调整纵坐标:在横坐标已经正确的基础上,再通过交换操作使纵坐标也等于目标纵坐标 。
关键是如何保证每次交换的代价为 ,且总操作次数等于所有点的曼哈顿距离之和。标程中使用了类似冒泡排序的方法:不断寻找两个点 满足 (其中 是当前横坐标),然后交换它们。这样的交换会使两个点的横坐标更接近各自的目标,且由于 ?实际上并不一定是 ,但可以证明存在一种顺序使得每次交换的横坐标差为 (相邻交换),并且总交换次数恰好等于所有点的横坐标偏移绝对值之和。标程的实现通过重复扫描直到无法再找到这样的对,从而最终使所有 。因为 较小,可以接受 的构造。类似地,再处理纵坐标。
为什么这样构造的总代价等于曼哈顿距离之和?
因为在横坐标调整阶段,每次交换的 且 为任意值(可能很大),但代价取 (因为 ),所以每步代价 ,总代价等于横坐标调整的总交换次数,即所有点的 之和。同理,纵坐标调整阶段,每次交换的 ,代价也为 ,总代价等于纵坐标偏移之和。因此总代价为曼哈顿距离之和,达到了理论下界,即为最小总代价。算法步骤总结
- 读入 ,排列 和 。
- 建二分图:左部点 对应初始位置,右部点 对应目标位置。边权 。
- 用最小费用最大流(或匈牙利算法 + 顶标)求最小权完美匹配,得到 。
- 构造 个点的当前坐标 ,目标坐标 。
- 调整横坐标:
while true:
找到一对 使得 ,则交换点 和 (即交换它们的 和 ),并记录操作 (输出时下标需加 )。重复直到不存在这样的对。 - 调整纵坐标:
while true:
找到一对 使得 ,则交换点 和 ,记录操作。重复直到所有 。 - 输出操作总数和操作序列。
复杂度分析
- 最小费用流:点数 ,边数 ,每次增广 ,总复杂度 ,但 ,且所有测试用例 之和 ,因此可行。
- 构造部分:每次交换至少使一个点的横坐标(或纵坐标)更接近目标,最多 次交换,每次检查 ,总复杂度 ,可接受。
代码实现细节
标程中使用了最小费用流(SPFA + DFS 增广),并记录了每条边的反向边来恢复匹配。构造时,它用
pc数组存储每个点的当前坐标和目标坐标,然后分别用两个while循环模拟排序。注意,它判断的条件中使用了<=和<,确保交换后两点更接近目标。最后输出所有操作。正确性证明概要
- 下界:任何操作序列的总代价至少为所有点的曼哈顿距离之和,因为每次操作最多使曼哈顿距离和减少 (且只能减少 ),而初始曼哈顿距离和为 ,因此最小总代价不小于该和。
- 可达性:上述构造方法恰好以每步代价 的方式实现了所有横坐标和纵坐标的调整,总操作数等于曼哈顿距离和,因此达到下界,是最优的。
示例验证
以题目第三个样例为例: 。
初始点:。
目标点:。
最小权匹配可求得: 等。
构造过程会输出题目所给的操作序列,总代价 ,与输出一致。注意输出时下标需加 。
- 1
信息
- ID
- 7270
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者