题目大意:
有两个排列,长度分别为 \(n,m\),每次你可以选择两个整数 \(1 \le i \le n, 1 \le j \le m\),并交换 \(p_{1} \sim p_{i - 1}\) 和 \(p_{i + 1} \sim p_{n}\) 两个整体,\(q,j\) 同理。
请构造出一种不超过 \(10000\) 的操作次数,使得 \(\forall p_{i} = i, q_{j} = j\)。
\(n,m \le 2500\)。
解题思路:
这种类型的构造题往往是可以通过想想自己希望的形态。
首先,我们并不知道两个怎么做,所以先考虑一个排列怎么做。
Solution 1:
因为排序,我们又只有 \(O(n)\) 步,所以考虑能否快速的交换两个数,并不影响其他的位置。
我们最多只有 \(4n\) 步来解决这个问题,而我们要交换 \(n\) 次,所以希望找到 \(4\) 步之内的方案,越少越好。
通过手模若干种方案,我们发现假设要交换 \(A,B\),只需要在 \(A\) 操作一次,在 \(B\) 操作一次,在 \(A\) 再操作一次就可以了。
那么我们做到了 3 步交换。
我当时自己想的时候只考虑了不超过两步的,应该只要不超次数就做下去...
Solution 2:
换一种方向考虑,相当于从大小的角度换成位置的角度,要让 \(i\) 出现在 \(i + 1\) 之前一个位置。
那么相当于每次把 \(i + 1\) 拼在 \(i\) 后面。
我们还是只有 4 次来解决这个问题,如何在不改变 \(1 \sim i\) 的时候将 \(i + 1\) 拼上。
观察操作,发现每次将 \(p_{x}\) 拼在了 \(p_{x + 1} \sim p_{n}\) 后面,那么我们考虑先将 \(1 \sim i\) 移到最后,然后再对 \(i\) 操作一次。
而将 "..." 移到最后,也可以通过观察操作,即将 \(p_{1} \sim p_{x-1}\) 放到了最后。
那么假设 \(1 \sim i\) 在 \(l \sim r\) 这些位置上,我们可以对 \(p_{r + 1}\) 操作一次,再对 \(p_{j} = i + 1\) 操作一次。
这样就可以 2n 步了。
那么我们考虑将一个排列推展到两个排列,自然也会出现构造出来的次数不同的情况。
于是我们希望让快的那个等等慢的那个,也就是快的那个要做一些无用操作。
因为是交换的 \(p_{1} \sim p_{i - 1}\) 和 \(p_{i + 1} \sim p_{n}\) 两个整体,所以重复做一次会直接还原。
那么对于步数同奇偶的情况我们解决了。