#P8210. [THUPC2022 初赛] 造计算机

[THUPC2022 初赛] 造计算机

题目描述

小R和小C听说贵系有一门造计算机的课之后吓得连夜提交了退学申请。

开玩笑的啦!正处于大一的他们对这门课不但不害怕,甚至有些想笑。他们超强的动手能力甚至驱使他们想造一个玩意玩玩。

当然由于他们毕竟才大一,计算机专业课基本上都没上过,经过长时间的艰苦奋战,他们终于造出了一个奇怪的玩意:

这台计算机只有 nn 个内存单元,反而有足够多个寄存器。内存单元的编号从 11nn ,寄存器从 n+1n+1 开始往上编号。每个内存单元和寄存器可以存储一个整数。

目前他们已经设计好了一类指令:swap i, j,表示交换编号为 iijj 的单元里的数,其中 iijj 均为正整数且 iji \neq j 。他们打算写一段程序来测试这条指令。

最开始, nn 个内存单元中乱序存放着 1n1\thicksim n 这些数,且每个数恰好出现一次。而每个寄存器里存放的是它的编号。

两人打算设计一段指令序列,使得计算机依次执行完这些指令后,所有内存和寄存器中的数都归位,也就是恰好等于它自己的编号。

虽然没学过计算机专业课,小R和小C还是懂一点皮毛的,因此他们规定每条 swap 指令操作的两个位置至少有一个需要是寄存器,也就是 iijj 至少有一者应当大于 nn

然而,正当他们写完程序开始运行时,却发现系统崩溃了!在查找了半天原因后,他们发现了一个奇怪的 bug:他们设计出来的计算机不能运行两条相同的指令!也就是说,他们不能在一段程序里出现两条相同的 swap i, j 指令。更进一步他们发现即使出现一条 swap i, j 一条 swap j, i 也不行,因为计算机会自动将这两条指令视为同一条。

然后可怜的小R和小C就斯巴达了。不过他们在弃疗之前还是打算利用现有的架构把程序写出来。不仅如此,他们还希望用到的寄存器数量尽可能少。你能帮帮他们吗?

输入格式

第一行:一个正整数 n (1n105)n\ (1 \leq n \leq 10^5) 表示内存单元的数量。

第二行: nn 个正整数aia_i 依次表示第 ii 个内存单元中的初始值,保证所有 aia_i 构成一个 1n1 \thicksim n 的排列。

输出格式

第一行:两个非负整数 m,km,k,分别表示你用到的寄存器数量和指令的条数。

接下来 kk 行,每行输出两个正整数 i,ji, j,依次表示你设计的每一条指令中交换的两个位置。你需要保证 1i,jn+m1 \leq i,j \leq n+m,并且满足题目中对于指令的限制条件。

如果有多种设计指令的方案满足题目所需,输出任意一种即可。

你需要最小化 mm 而无需最小化 kk,但需要保证 k106k \leq 10^6。输入数据保证符合要求的解存在。

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

提示

【样例解释】

最初,前 44 个单元的值依次为 (2,1,3,4)(2,1,3,4)

执行指令 swap 3, 4,各单元的值变为 (2,1,4,3)(2,1,4,3)

执行指令 swap 1, 3,各单元的值变为 (4,1,2,3)(4,1,2,3)

执行指令 swap 2, 4,各单元的值变为 (4,3,2,1)(4,3,2,1)

执行指令 swap 1, 4,各单元的值变为 (1,3,2,4)(1,3,2,4)

执行指令 swap 2, 3,各单元的值变为 (1,2,3,4)(1,2,3,4)

可以证明 m=1m=1 是不行的。