#CSES1698. 交换轮排序

交换轮排序

题目背景

翻译自 CSES-1698 题。

题目描述

给定一个包含数字 1,2,,n1, 2, \dots, n 的排列数组,你的任务是通过交换轮来对数组进行排序。在每一轮交换中,你可以选择任意数量的不同元素对,并交换每一对元素。

你的任务是找到最小的交换轮数,并展示每轮交换时你如何选择交换对。

输入格式

第一行包含一个整数 nn,表示数组的大小。

第二行包含 nn 个整数 x1,x2,,xnx_1, x_2, \dots, x_n,表示初始的排列。

输出格式

首先输出一个整数 kk,表示最小的交换轮数。

然后,对于每一轮,输出交换的次数以及每次交换的索引。你可以输出任意一个有效的解决方案。

样例

5
5 2 1 3 4
2
2
1 3
4 5
1
3 5

样例1解释

初始数组是 [5, 2, 1, 3, 4]。 经过第一轮交换,数组变成 [1, 2, 5, 4, 3]。 经过第二轮交换,数组变成 [1, 2, 3, 4, 5],完成排序。

说明/提示

1n2×1051 \leq n \leq 2 \times 10^5