题目解析
对于只交换 111 对二元组的情况,我们直接枚举 AAA 中要交换的二元组和 BBB 中要交换的二元组即可,时间复杂度 O(N2)\mathrm{O}(N^2)O(N2)。
我们主要考虑交换 222 对二元组的情况。
首先考虑 S\tt{S}S,在未交换交换元素时,令:
diffS=∑iNAxi−∑iNBxi\tt{diffS = \sum_i^NAx_i - \sum_i^NBx_i} diffS=i∑N Axi −i∑N Bxi
此时若交换的 111 对二元组分别为 AiA_iAi 和 BjB_jBj ,那么:
S=∣diffS−2×(Axi−Bxj)∣\tt{S = \vert diffS - 2 \times (Ax_i - Bx_j) \vert} S=∣diffS−2×(Axi −Bxj )∣
对于交换 222 对二元组的情况,我们只需要将 AAA 中的元素两两结合,BBB 中的元素两两结合,就可以把选择 222 对二元组交换转化为选择 111 对两两结合后的二元组交换。
那么对于上式,我们可以枚举 Axi\tt{Ax_i}Axi ,二分 Bxj\tt{Bx_j}Bxj 。
具体的,我们把 BBB 的两两结合的 Bxj\tt{Bx_j}Bxj 排序去重,然后找到最大的 Bxj\tt{Bx_j}Bxj 使得 diffS−2×(Axi−Bxj)<0\tt{diffS - 2 \times (Ax_i - Bx_j) \lt 0}diffS−2×(Axi −Bxj )<0,此时 Bxj\tt{Bx_j}Bxj 和 Bxj+1\tt{Bx_{j + 1}}Bxj+1 即为与 Axi\tt{Ax_i}Axi 交换后能够使得 S\tt{S}S 最小的两个元素,其中 Bxj\tt{Bx_j}Bxj 或 Bxj+1\tt{Bx_{j + 1}}Bxj+1
可能有一个不存在,要注意判别。
对于 T\tt{T}T 同理。
整个算法时间复杂度 O(N2logN2)\mathrm{O}(N^2\log{N^2})O(N2logN2)。
AC 代码