牛客小白月赛 113F 最小差值 题解
牛客小白月赛 113F 最小差值 题解
应该比较典,虽然我没做出来。
处理绝对值相关问题的套路是把绝对值拆开,也就是把 \(|x - y|\) 确定为 \(x - y\) 或 \(y - x\),否则我们不知道这个式子的真实值,没法进一步处理。
假设只有一个数组 \(a\),把数组中的元素视作数轴上的点,则这些点把数轴划分成了 \(O(n)\) 个区间:\((-\infty, a_{1}), [a_{1}, a_{2}), \cdots, [a_{n}, +\infty)\)。对同一个区间中的点 \(k\),\(|a_{i} - k|\) 的被拆开的形式相同。严谨地说,设 \(|a_i - k| = s_i \cdot (a_i - k)\),\(s_i \in \{1, -1\}\),则 \(s_i\) 在同一个区间中为定值。对于两个区间的情况,也可以这样处理:把两个数组中的元素视作数轴上的点,则数轴被划分为 \(O(n + m)\) 个区间。我们分别计算每个区间的答案,然后取最小值。
设对于区间 \([L, R]\) 中的点 \(k\),\(a\) 中有 \(c_1\) 个元素小于等于 \(k\),\(c_2\) 个元素大于 \(k\);\(b\) 中有 \(c_3\) 个元素小于等于 \(k\),\(c_4\) 个元素大于 \(k\)。记 \(f(k) = \left|\left(\sum\limits_{i = 1}^{n} |a_i - k|\right) - \left(\sum\limits_{i = 1}^{n} |b_i - k|\right) \right|\),\(\operatorname{prea}, \operatorname{sufa}, \operatorname{preb}, \operatorname{sufb}\) 分别为 \(a, b\) 的前/后缀和数组。则第一个和式的贡献为 \((c_1 \cdot k - \operatorname{prea}(c_1)) + (\operatorname{sufa}(c_2) - c_2 \cdot k)\),第二个和式的贡献为 \((c_3 \cdot k - \operatorname{preb}(c_3)) + (\operatorname{sufb}(c_4) - c_4 \cdot k)\)。因此
记 \(p = c_1 + c_4 - c_2 - c_3\),\(q = \operatorname{sufa}(c_2) - \operatorname{sufb}(c_4) - \operatorname{prea}(c_1) + \operatorname{preb}(c_3)\),则 \(f(k) = |p \cdot k + q|\),绝对值中是一个一次函数。绝对值最小处只可能在 \(L, R\) 和最靠近 \(0\) 的位置取到。函数的零点为 \(-q / p\),由于 \(k\) 必须是整数,为了避免误差,直接计算零点下取整及其周围两个点即可。
时间复杂度 \(O(n \log n)\)(视 \(n, m\) 同级),瓶颈在排序。AC 记录