#P5862. [IOI 2015] sorting

[IOI 2015] sorting

题目描述

Aizhan 有一个由 NN 个互不相同的整数组成的序列 S[0],S[1],⋯ ,S[N−1]S[0],S[1],\cdots,S[N-1],其中 S[i]S[i] 取值范围是 [0,N−1][0,N-1]。Aizhan 试图通过交换某些元素对的方法将这个序列按照升序排序。Aizhan 的朋友 Ermek 也想交换某些元素对, Ermek 的交换未必有助于 Aizhan 的排序。

Ermek 和 Aizhan 打算通过若干轮次来修改这个序列。在每一轮,Ermek 首先做一次交换,然后 Aizhan 做另一次交换。更确切地说,做交换的人选择两个有效的下标并交换这两个下标的元素。请注意这两个下标可能相同。如果它们相等,则对这个元素自身做交换,并不改变这个序列。

Aizhan 知道 Ermek 并不关心对序列 SS 排序的事情。Aizhan还知道 Ermek 将会选择哪些下标。Ermek 打算参加 MM 轮交换,将这些轮次从 00 到 M−1M-1 编号。对于 00 到 M−1M-1 之间的每个 ii,Ermek 在第 ii 轮将选择下标 X[i]X[i] 和 Y[i]Y[i] 的元素进行交换。

Aizhan 要对序列 SS 按升序进行排序。在每一轮之前,如果 Aizhan 看到当前的序列已经按升序排列,她将结束这个排序过程。给定初始序列 SS 以及 Ermek 要选择的下标,请你找出一个交换的序列,使得 Aizhan 能完成对序列 SS 的排序。此外,在有些子任务中,你还要找出尽可能短的交换序列来完成排序任务。题目保证通过 MM 或更少的轮次能够将序列 SS 排好序。

请注意如果 Aizhan 发现在 Ermek 的交换之后,序列 SS 已经排好序,则 Aizhan 可以选择交换两个相同下标(例如 00 和 00)的元素。这样,序列 SS 在这一轮次之后也完成排序,于是也达到了 Aizhan 的目标。另外,如果初始序列 SS 就已经排好序,那么所需的最少排序轮数就是 00。

输入格式

  • 第 11 行有一个正整数 NN,表示序列 SS 的长度;
  • 第 22 行有 NN 个正整数,分别为 S[0],⋯ ,S[N−1]S[0],\cdots,S[N-1],即初始序列 SS;
  • 第 33 行有一个正整数 MM,表示 Ermek 打算做交换的次数;
  • 第 44 到 M+3M+3 行,有两个正整数 X[i]X[i],Y[i]Y[i],表示对于 0≤i≤M−10\le i\le M-1, 在第 ii 轮 Ermek 打算交换下标为 X[i]X[i] 和 Y[i]Y[i] 的数组。

输出格式

  • 第 11 行 : 交换的长度 RR;
  • 第 2+i2+i(0≤i<R0\le i < R)行:P[i]P[i],Q[i]Q[i]。

注:PP,QQ分别为两个整数数组。利用这两个数组报告 Aizhan 完成对序列 SS 排序的一种可能的交换序列,假设这个交换序列的长度为 RR,对于 00 到 R−1R-1 之间的每个 ii,Aizhan 在轮次 ii 选择的下标将被存入 P[i]P[i] 和 Q[i]Q[i]。 你可以假设数组 PP 和 QQ 均已分别被分配了 MM 个元素。

5
4 3 2 1 0
6
0 1
1 2
2 3
3 4
0 1
1 2

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

3
1 4
4 2
2 2

提示

对于 100%100\% 的数据,1≤N≤2×1051 \le N\le 2 \times 10^5,1≤M≤6×1051 \le M \le 6 \times 10^5。要求 RR 取最小值。