luogu#P7128. 「RdOI R1」序列(sequence)

「RdOI R1」序列(sequence)

题目描述

有一序列 xx ,长度为 qq ,序列中的每个数只出现一次。

即:序列 xx11qq 的一个排列。

对于序列 xx 的操作只有一种:对于一个数 xix_i ,你可以使其与 x2ix_{2i}x2i+1x_{2i+1} 交换位置(如果它们存在的话)。

现在请你使序列 xx 变为一个升序序列,并按顺序输出你进行的操作。

输入格式

输入数据共 22 行。

11 行, 11 个正整数,qq

22 行, qq 个正整数, x1qx_{1~q}

输出格式

输出数据共 ansans 行, ansans 表示你的操作次数。

11 ~ ansans 行,每行两个整数,iijj ,表示交换 xix_ixjx_j 的位置 (i<j)(i < j)

3
3 1 2
1 3
1 2
7
1 3 2 7 6 4 5
2 4
1 2
1 3
3 7
2 5
1 2
1 3
3 6
1 2
2 5
1 3
1 2
2 4
1 2
1 3
1 2

提示

【样例说明】

样例#1说明:

交换 2233 ,序列变为:2,1,32,1,3

再交换 2211 ,序列变为:1,2,31,2,3

【数据范围】

对于 40%40\% 的数据,3q2103 \le q \le 2^{10}

对于 100%100\% 的数据,3q2173 \le q \le 2^{17}1xiq1 \le x_i \le q

【提示】

  • 使用 Special Judge。
  • q=2p1(pN)q = 2 ^ p - 1(p \in \mathbb{N}^*)
  • 最多进行 2q×log2q2q\times\lceil\log_2 q\rceil 次操作。
  • 样例的输出数据只是众多方案中的一种。
  • 因为是 special judge ,因此不提供附加样例。

【文件读入读出】(模拟,提交代码时不需使用)

  • 文件名:sequence.cpp
  • 读入文件名:sequence.in
  • 读出文件名:sequence.out