loj#P3376. 「eJOI2020」异或排序

「eJOI2020」异或排序

题目描述

本题译自 eJOI2020 Problem D. Xor Sort

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

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

  • S=1S=1,则最后的序列必须严格递增,即对于 1i<N1\le i<N,有 Ai<Ai+1A_i<A_{i+1}
  • S=2S=2,则最后的序列必须单调不减,即对于 1i<N1\le i<N,有 AiAi+1A_i\le A_{i+1}

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

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

输入格式

第一行两个整数 N,SN,S

接下来一行 NN 个非负整数 A1,A2,,ANA_1,A_2,\ldots ,A_N

输出格式

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

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

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

数据范围与提示

对于所有数据,1S2,2N1000,0Ai<2201\le S\le 2,2\le N\le 1000,0\le A_i<2^{20}

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

子任务编号 附加任务 分值
11 2N150, S=12\le N\le 150,\ S=1,保证 AA 中元素互不相同 2525
22 2N200, S=12\le N\le 200,\ S=1,保证 AA 中元素互不相同 3535
33 2N1000, S=22\le N\le 1000,\ S=2 4040

当进行异或操作时,设 a,ba,b 分别为一个比特位,当 a=ba=b 时结果为 11,否则为 00

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

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

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