CF1909H Parallel Swaps Sort

题目描述

你有一个排列 $p_1, p_2, \dots, p_n$,它是 $[1, 2, \dots, n]$ 的一个排列。你可以进行如下操作若干次(也可以一次都不做): - 选择一个偶数长度的子数组 $[l, r]$; - 交换 $a_l$ 和 $a_{l+1}$; - 如果 $l+3 \leq r$,则交换 $a_{l+2}$ 和 $a_{l+3}$; - $\dots$ - 交换 $a_{r-1}$ 和 $a_r$。 请在不超过 $10^6$ 次操作内将该排列排序。你不需要最小化操作次数。

输入格式

第一行包含一个整数 $n$($2 \le n \le 3 \cdot 10^5$),表示排列的长度。 第二行包含 $n$ 个整数 $p_1, p_2, \ldots, p_n$($1 \le p_i \le n$,$p_i$ 互不相同),表示初始排列。

输出格式

输出你的操作,格式如下: 第一行输出一个整数 $k$($0 \le k \le 10^6$),表示操作次数。 接下来的 $k$ 行,每行两个整数 $l$ 和 $r$($1 \leq l < r \leq n$,$r-l+1$ 必须为偶数),表示一次操作。每次操作选择子数组 $[l, r]$ 并按题意交换其元素。 所有操作后,要求对于每个 $i$($1 \leq i \leq n$),都有 $a_i = i$。

说明/提示

在第一个测试样例中: - 初始时,$p = [2, 5, 4, 1, 3]$。 - 第一次操作选择 $[l, r] = [1, 4]$,交换 $(a_1, a_2)$ 和 $(a_3, a_4)$,新排列为 $p = [5, 2, 1, 4, 3]$。 - 第二次操作选择 $[l, r] = [1, 2]$,交换 $(a_1, a_2)$,新排列为 $p = [2, 5, 1, 4, 3]$。 - 第三次操作选择 $[l, r] = [2, 5]$,交换 $(a_2, a_3)$ 和 $(a_4, a_5)$,新排列为 $p = [2, 1, 5, 3, 4]$。 - 第四次操作选择 $[l, r] = [1, 4]$,交换 $(a_1, a_2)$ 和 $(a_3, a_4)$,新排列为 $p = [1, 2, 3, 5, 4]$。 - 第五次操作选择 $[l, r] = [4, 5]$,交换 $(a_4, a_5)$,新排列为 $p = [1, 2, 3, 4, 5]$,排列已排序。 在第二个测试样例中,排列已经有序,因此不需要进行任何操作。 由 ChatGPT 4.1 翻译