1 条题解
-
0
D. Swap Dilemma 详细题解
题目重述
给定两个长度均为 的数组 和 ,元素均为互不相同的正整数。每次操作可以选择 中的两个下标 ,交换 与 ;同时选择 中的两个下标 ,满足 ,交换 与 。问能否通过若干次(含零次)操作使 与 完全相同(即对应位置元素相等)。
核心观察
- 由于元素互异,将数组视为排列。若 与 的元素集合不同,则显然不可能变成相同,直接输出
NO。 - 当元素集合相同时,我们可以将元素离散化:将每个元素映射为它在排序后的秩( 到 )。这样 和 转化为两个排列 和 (长度为 )。问题转化为:能否通过操作使 变成 。
操作对排列奇偶性的影响
一个排列的逆序对数的奇偶性称为该排列的奇偶性(或符号)。交换排列中的两个不同元素(即执行一次对换)会改变逆序对数的奇偶性(奇变偶,偶变奇)。因此,任何一次交换都会翻转排列的奇偶性。
在题目的一次操作中:
- 我们在 中交换两个元素(相当于对 执行一次对换),
- 同时在 中交换两个元素(相当于对 执行一次对换)。
因此,这次操作会同时翻转 的奇偶性和 的奇偶性。于是,两个排列奇偶性的差值(相同则差为 ,不同则差为 )在每次操作后保持不变。
初始时,若 与 的奇偶性不同,则无论怎么操作,它们的奇偶性始终不同。而最终要求 ,此时两者的奇偶性必然相同。因此,奇偶性不同是不可能的充要条件之一。
奇偶性相同是否充分?
答案是肯定的。可以证明:只要元素集合相同且 与 的奇偶性相同,就能通过一系列合法操作将 变为 。构造思路如下:
- 利用长度为 的交换(即交换相邻元素)可以生成整个对称群(因为相邻对换生成所有置换)。但操作要求同时交换 和 中相同距离的两个位置。然而我们可以通过组合操作来模拟“单独在 上执行一次相邻交换,而保持 不变”的效果。例如,先在 上交换相邻元素 和 ,同时在 上交换两个相邻元素 和 (距离也是 );然后再进行一次相反的操作(比如在 上再换回来,同时 上不执行交换)。但 上不执行交换意味着我们要在 上交换两个相同位置(),这种退化交换虽然允许( 时 ,则 中需选择 ,即无实际交换),但这不会改变 。所以我们可以先在 上做一次交换,同时在 上做一次不影响结果的“空交换”(),这样只改变了 。随后再在 上做一次交换,同时 上做一次“空交换”,就只改变了 。因此,通过组合,我们可以独立地 或 上执行任意交换(只要交换距离相同,但我们可以先用距离 的交换来改变其中一个数组,再用距离 的交换来改变另一个)。更严谨的证明是利用了:长度为 的交换(即不交换)是允许的,因此我们可以先单独对 做一系列相邻交换(每次用距离 ,同时 上用距离 但交换相同元素,即 ,相当于无变化),然后单独对 做相邻交换。由于相邻交换足以生成所有排列,我们就能将 变为任意我们想要的排列,同时将 变为另一个排列。最后,由于初始 和 奇偶性相同,我们可以通过一系列相邻交换将 变成 ,而在这个过程中,我们只需在 上执行这些交换,同时在 上执行相反的交换(即把 中本应变化的部分抵消掉)。实际上,一个更简单的结论是:利用长度为 的交换并允许在 上同时做任意交换(包括空交换),我们可以实现在 上的任意置换,同时保持 不变;同理可实现 上的任意置换。因此只要两个排列奇偶性相同,就能让它们变得相等。
因此,奇偶性相同是充分必要条件。
算法步骤
- 对于每个测试用例:
- 读入 及数组 。
- 检查 和 的元素是否相同(排序后比较)。若不同,输出
"NO",继续下一个测试用例。
- 将 和 中的元素离散化:将元素值映射为 到 的序号(按升序)。得到排列 和 。
- 分别计算 和 的逆序对数的奇偶性(即排列的符号)。可以使用树状数组(或归并排序)在 时间内计算逆序对数,但只需奇偶性,可用异或优化。
- 若 和 的奇偶性相同,输出
"YES",否则输出"NO"。
复杂度分析
- 排序检查集合:。
- 离散化映射:。
- 计算逆序对奇偶性:,可用树状数组或归并排序。
- 所有测试用例的 总和 ,总复杂度 ,完全可行。
正确性总结
- 必要性:每次操作同时翻转两个排列的奇偶性,因此两者奇偶性差为不变量。最终相等时奇偶性相同,故初始必须相同。
- 充分性:当元素集合相同且奇偶性相同时,可以通过构造(利用长度为 和长度为 的交换)独立地在 上执行任意交换,从而将 逐步变成 ,同时保持 不变(或同步调整),故一定可行。
因此,该解法正确且高效。
- 由于元素互异,将数组视为排列。若 与 的元素集合不同,则显然不可能变成相同,直接输出
- 1
信息
- ID
- 6930
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者