#CF2146D2. 最大和或(困难版本)
最大和或(困难版本)
D2. 最大和或(困难版本)
每次测试时间限制: 秒
每次测试内存限制: 兆字节
这就是问题的困难版本。两个版本的区别在于,在这个版本中,。只有你解决了这个问题的所有版本,才能破解。
题目描述
你被赋予两个整数 和 ()。
设 。我们将创建两个数组 和 ,两者均由 个整数组成。
最初, 和 都等于 。
你必须重新排序数组 ,以最大化以下值:
这里, 表示按位的 OR 运算。
你还需要构造一种可能的重新排序数组 的方法。
输入
每个测试包含多个测试用例。第一行包含测试用例的数量 ()。
以下是测试用例的描述。
每个测试用例中唯一的行包含两个整数 和 ()—— 分别是 中的最小和最大元素。
设 。保证所有测试用例的 之和不超过 。
输出
对于每个测试用例:
- 在第一行打印一个整数 —— 即最大值 。
- 在第二行打印 个不同的整数 —— 重新排序后的数组 。
如果有多个答案,你可以打印任意一个。
示例
输入
7
0 3
0 9
0 15
6 10
1 4
3 6
1000000007 1000000009
输出
12
3 2 1 0
90
7 8 5 4 3 2 9 0 1 6
240
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
70
10 8 7 6 9
20
2 1 4 3
28
4 3 6 5
3000000039
1000000008 1000000007 1000000009
注释
在第一个测试用例中,重排序后的数组 是 。
该表达式的值为 。
可以证明这是表达式的最大可能值。
在第二个测试用例中,重排序后的数组 是 。
该表达式的值为 。可以证明这是表达式的最大可能值。
在第三个测试用例中,可以证明 是表达式的最大可能值。
在第四个测试用例中,重排序后的数组 是 。
该表达式的值为 $(10|6) + (8|7) + (7|8) + (6|9) + (9|10) = 14 + 15 + 15 + 15 + 11 = 70$。
可以证明这是表达式的最大可能值。