Logo HelloWorld信息学奥赛题库

少儿编程

时间限制:1 s 空间限制:512 MB

#4062. 「eJOI2020」异或排序

统计

题目描述

本题译自 eJOI2020 Problem D. Xor Sort

给定一个整数 $S$ 和一个包含 $N$ 个非负整数的数列 $A$(下标从 $1$ 开始)。你可以对数列进行如下操作:选取任意一个下标 $i$($1\le i\le N$),再选取它相邻元素中的一个 $j$($1\le j\le N$,满足 $j=i-1$ 或 $j=i+1$),把 $A_i$ 换为 $(A_i\oplus A_j)$,其中 $\oplus$ 是异或运算。异或运算的定义见「数据范围与提示」。

你的目标是把 $A$ 数列变为一个排好序的数列:

  • 若 $S=1$,则最后的序列必须严格递增,即对于 $1\le i<N$,有 $Ai<A{i+1}$;
  • 若 $S=2$,则最后的序列必须单调不减,即对于 $1\le i<N$,有 $Ai\le A{i+1}$。

找到能满足条件的一组操作序列。

你不需要最小化操作数,只需要保证操作数不超过 $40000$ 即可。

输入格式

第一行两个整数 $N,S$。

接下来一行 $N$ 个非负整数 $A_1,A_2,\ldots ,A_N$。

输出格式

第一行输出一个整数 $K\ (0\le K\le 40000)$,表示操作数。

接下来 $K$ 行,按时间顺序输出操作序列,每行输出两个整数 $i,j$,$i$ 表示要被替换的元素下标,$j$ 表示参与替换的另一个元素下标。

样例 1

input

5 1
3 2 8 4 1

output

3
1 2
4 3
5 4

$$ [3, 2, 8, 4, 1] \to [\mathbf{1}, 2, 8, 4, 1] \to [1, 2, 8, \mathbf{12}, 1] \to [1, 2, 8, 12, \mathbf{13}] $$

样例 2

input

5 2
4 4 2 0 1

output

3
3 2
4 3
5 4

$$ [4, 4, 2, 0, 1] \to [4, 4, \mathbf{6}, 0, 1] \to [4, 4, 6, \mathbf{6}, 1] \to [4, 4, 6, 6, \mathbf{7}] $$

数据范围与提示

对于所有数据,$1\le S\le 2,2\le N\le 1000,0\le A_i<2^{20}$。

详细子任务附加限制及分值如下表:

子任务编号 附加任务 分值
$1$ $2\le N\le 150,\ S=1$,保证 $A$ 中元素互不相同 $25$
$2$ $2\le N\le 200,\ S=1$,保证 $A$ 中元素互不相同 $35$
$3$ $2\le N\le 1000,\ S=2$ $40$

当进行异或操作时,设 $a,b$ 分别为一个比特位,当 $a=b$ 时结果为 $1$,否则为 $0$。

当对整数 $a,b$ 进行异或操作时,仅对对应比特位进行异或操作。

$$ \begin{align} 75 & \oplus 29 \ \ \ \ \ \ \ \ \ \ = 86 \ 1001011 & \oplus 0011101 = 1010110 \end{align} $$

在 C / C++ / Java 语言中,可以用 ^ 运算符进行异或运算。