P7128 「RdOI R1」序列(sequence)
题目描述
有一序列 $x$ ,长度为 $q$ ,序列中的每个数只出现一次。
即:序列 $x$ 是 $1$ 到 $q$ 的一个排列。
对于序列 $x$ 的操作只有一种:对于一个数 $x_i$ ,你可以使其与 $x_{2i}$ 或 $x_{2i+1}$ 交换位置(如果它们存在的话)。
现在请你使序列 $x$ 变为一个升序序列,并按顺序输出你进行的操作。
输入格式
输入数据共 $2$ 行。
第 $1$ 行, $1$ 个正整数,$q$。
第 $2$ 行, $q$ 个正整数, $x_{1~q}$。
输出格式
输出数据共 $ans$ 行, $ans$ 表示你的操作次数。
第 $1$ ~ $ans$ 行,每行两个整数,$i$ ,$j$ ,表示交换 $x_i$ 和 $x_j$ 的位置 $(i < j)$。
说明/提示
【样例说明】
样例#1说明:
交换 $2$ 和 $3$ ,序列变为:$2,1,3$。
再交换 $2$ 和 $1$ ,序列变为:$1,2,3$。
【数据范围】
对于 $40\%$ 的数据,$3 \le q \le 2^{10}$。
对于 $100\%$ 的数据,$3 \le q \le 2^{17}$,$1 \le x_i \le q$。
【提示】
- 使用 Special Judge。
- $q = 2 ^ p - 1(p \in \mathbb{N}^*)$
- 最多进行 $2q\times\lceil\log_2 q\rceil$ 次操作。
- 样例的输出数据只是众多方案中的一种。
- 因为是 `special judge` ,因此不提供附加样例。
---
【文件读入读出】**(模拟,提交代码时不需使用)**
- 文件名:`sequence.cpp`
- 读入文件名:`sequence.in`
- 读出文件名:`sequence.out`