CF1491G Switch and Flip

题目描述

有 $n$ 枚硬币,编号从 $1$ 到 $n$。最初,第 $i$ 个位置上放着编号为 $c_i$ 的硬币,并且所有硬币正面朝上($(c_1, c_2, \dots, c_n)$ 是 $1$ 到 $n$ 的一个排列)。你可以对这些硬币进行若干操作。 每次操作,你可以进行如下步骤: - 选择两个不同的下标 $i$ 和 $j$。 - 交换第 $i$ 个位置和第 $j$ 个位置上的硬币。 - 同时翻转第 $i$ 个和第 $j$ 个位置上的硬币(如果原来是正面朝上,操作后就变为反面朝上,反之亦然)。 请构造一个操作序列,最多包含 $n+1$ 次操作,使得所有操作结束后,第 $i$ 个位置上放着编号为 $i$ 的硬币,并且所有硬币正面朝上。 注意,你不需要最小化操作次数。

输入格式

第一行包含一个整数 $n$($3 \leq n \leq 2 \cdot 10^5$),表示硬币的数量。 第二行包含 $n$ 个整数 $c_1, c_2, \dots, c_n$($1 \leq c_i \leq n$,对于 $i \neq j$ 有 $c_i \neq c_j$)。

输出格式

第一行输出一个整数 $q$($0 \leq q \leq n+1$),表示你使用的操作次数。 接下来的 $q$ 行,每行输出两个整数 $i$ 和 $j$($1 \leq i, j \leq n, i \neq j$),表示本次操作选择的位置。

说明/提示

用 $i$ 表示编号为 $i$ 的硬币正面朝上,用 $-i$ 表示编号为 $i$ 的硬币反面朝上。 第一个样例中操作后的硬币变化如下: - $[~~~2,~~~1,~~~3]$ - $[-3,~~~1,-2]$ - $[-3,~~~2,-1]$ - $[~~~1,~~~2,~~~3]$ 第二个样例中,硬币已经在正确的位置上,因此不需要进行任何操作。 由 ChatGPT 4.1 翻译