CF1852B Imbalanced Arrays 题解
题意:

思路:
考虑最终 $ B $ 中绝对值最大的数 $ maxv $ 。当 $ maxv > 0 $ 时,其所对应的 $ A_i = n $ ;当 $ maxv < 0 $ 时,其所对应的 $ A_i = 0 $ 。那么, $ A $ 中不可能同时存在 $ 0 $ 和 $ n $ ; $ A $ 中一定存在至少 $ 1 $ 个 $ 0 $ 或 $ n $ 。
对 $ A $ 从小到大排序后,使用双指针,不断判断首尾两端是否为 $ 0 $ 或 $ n $ :
-
当首端为 $ 0 $ 且尾端为 $ n $ 时,不可能构造出来 $ B $ ;
-
当首端不为 $ 0 $ 且尾端不为 $ n $ 时,不可能构造出来 $ B $ ;
-
当首端为 $ 0 $ 且尾端不为 $ n $ 时,首端对应的 $ B_i = -n = maxv $ ,将首端从 $ A $ 中删除, $ A $ 的长度减 $ 1 $ ,即 $ n = n - 1 $ 。继续判断首尾两端是否为 $ 0 $ 或 $ n $ ;
-
当首端不为 $ 0 $ 且尾端为 $ n $ 时,尾端对应的 $ B_i = n = maxv $ ,将尾端从 $ A $ 中删除, $ A $ 的长度减$ 1 $ ,即 $ n = n - 1 $,由于 $ maxv > 0 $ ,其对 $ A $ 数组中每个数都贡献了 $ 1 $ ,所以 $ A $ 数组中剩余的每个数都要减 $ 1 $ 。此处对 $ A $ 数组中剩余的每个数的减 $ 1 $ 操作,如果 $ for $ 循环遍历减 $ 1 $ ,显然会超时。因此,我们另设一个变量 $ cnt $ ,记录减 $ 1 $ 的操作次数。继续判断首尾两端是否为 $ 0 $ 或 $ n $ 。在继续判断首尾两端是否为 $ 0 $ 或 $ n $ 时,先减去 $ cnt $ 再判断。
上述过程中,我们将问题转化为:长度为 $ n - 1 $ 的 $ A $ 数组,是否可以构造出来长度为 $ n - 1 $ 且满足条件的 $ B $ 数组。 不断重复该过程,直至无法构造出来 $ B $ 或所有 $ B_i $ 均被赋值即可。显然,这样构造出来的 $ B $ 一定满足上述条件。
浙公网安备 33010602011771号