SOJ1642 金银变换 题解
题意
给定两个整数序列 \(A\) 和 \(B\),以及一个整数 \(k\),判断能否对 \(A\) 进行有限次如下操作,使得 \(A\) 和 \(B\) 相等。
交换 \(A\) 的两个相邻且长度均为 \(k\) 的子串。形式化地说,选定整数 \(1 \le i \le n-2k+1\)(其中 \(n\) 为 \(A\) 的长度),对于 \(0 \le j < k\) 中的每个 \(j\),交换 \(A_{i+j}\) 和 \(A_{i+k+j}\)。
多组数据,\(1\le n,m \le 10^5,1 \le \sum{n},\sum{m} \le 10^6\)
题解
首先有一个显然的结论,无论怎么交换,数的下标 \(mod\) \(k\) 始终不变。于是可以将数列按 \(mod\) \(k\) 分组,若 \(A\) 和 \(B\) 每组中的数不相等,则一定无解。
然后先考虑所有数不相等的情况。我们先把两个序列操作一下,改为将一个序列排成 \(A_i=i\) 的形式。
能想到一种做法是依次考虑 \(i\),保持 \([1,i-1]\) 位置上的数不动,将 \(i\) 移到下标为 \(i\) 的位置上。由上面的结论,我们很容易想到一种做法:先判断数 \(i\) 所在的位置 \(j\) 与 \(i\) 的距离,若不能被 \(k\) 整除,则无解;否则从 \(j\) 开始一路向左移过来。复杂度 \(O(n^2)\)。
对于每组,看一次交换操作的影响。发现是相邻两项的交换。则逆序对变化 \(1\)。于是我们发现,\(YES\) 的必要条件是每组的逆序对个数奇偶性相同(因为排序后每组逆序对都是 \(0\))。
实际上该条件也是充分的。按照上述方法操作,最后 \(∀i∈[1,n-2k+1]∩[n-k+1,n]\),\(A_i=i\)。此时 \(n-k+1\) 所在的组逆序对数为 \(0\)。其他组 \(\le 1\)。因为奇偶性相同,则均为 \(0\)。
于是我们得到了所有数互不相同时的 \(O(nlogn)\) 做法。再考虑一般情况。若一组内有两数相等,则他们转换后的值可以交换;注意到转换后的值互不相同,则交换一定使逆序对数变化 \(1\)。因为 \(YES\) 要求的是所有组的逆序对数奇偶性相同,则有数相同的组可以“配合”其他组。于是我们只考虑所有数互不相同的组,求出的答案即为原问题的答案。时间复杂度 \(O(\sum{n} logn)\)。