loj#P3376. 「eJOI2020」异或排序
「eJOI2020」异或排序
题目描述
本题译自 eJOI2020 Problem D. Xor Sort
给定一个整数 和一个包含 个非负整数的数列 (下标从 开始)。你可以对数列进行如下操作:选取任意一个下标 (),再选取它相邻元素中的一个 (,满足 或 ),把 换为 ,其中 是异或运算。异或运算的定义见「数据范围与提示」。
你的目标是把 数列变为一个排好序的数列:
- 若 ,则最后的序列必须严格递增,即对于 ,有 ;
- 若 ,则最后的序列必须单调不减,即对于 ,有 。
找到能满足条件的一组操作序列。
你不需要最小化操作数,只需要保证操作数不超过 即可。
输入格式
第一行两个整数 。
接下来一行 个非负整数 。
输出格式
第一行输出一个整数 ,表示操作数。
接下来 行,按时间顺序输出操作序列,每行输出两个整数 , 表示要被替换的元素下标, 表示参与替换的另一个元素下标。
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
数据范围与提示
对于所有数据,。
详细子任务附加限制及分值如下表:
子任务编号 | 附加任务 | 分值 |
---|---|---|
,保证 中元素互不相同 | ||
,保证 中元素互不相同 | ||
当进行异或操作时,设 分别为一个比特位,当 时结果为 ,否则为 。
当对整数 进行异或操作时,仅对对应比特位进行异或操作。
$$\begin{align} 75 & \oplus 29 \ \ \ \ \ \ \ \ \ \ = 86 \\ 1001011 & \oplus 0011101 = 1010110 \end{align} $$在 C / C++ / Java 语言中,可以用 ^
运算符进行异或运算。