QOJ.ac

QOJ

Time Limit: 1 s Memory Limit: 512 MB Total points: 100

#3244. 造计算机

الإحصائيات

题目描述

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

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

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

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

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

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

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

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

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

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

输入格式

从标准输入读入数据。

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

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

输出格式

输出到标准输出。

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

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

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

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

样例1输入

2
2 1

样例1输出

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

样例1解释

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

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

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

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

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

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

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

About Issues

We understand that our problem archive is not perfect. If you find any issues with the problem, including the statement, scoring configuration, time/memory limits, test cases, etc.

You may use this form to submit an issue regarding the problem. A problem moderator will review your issue and proceed it properly.

STOP! Before you submit an issue, please READ the following guidelines:

  1. This is not a place to publish a discussion, editorial, or requests to debug your code. Your issue will only be visible by you and problem moderators. Other users will not be able to view or reply your issues.
  2. Do not submit duplicated issues. If you have already submitted one, please wait for an moderator to review it. Submitting multiple issues will not speed up the review process and might cause your account to be banned.
  3. Issues must be filed in English or Chinese only.
  4. Be sure your issue is related to this problem. If you need to submit an issue regarding another problem, contest, category, etc., you should submit it to the corresponding page.

Active Issues 0

No issues in this category.

Closed/Resolved Issues 0

No issues in this category.