牛客小白月赛 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)\)。因此

\[f(k) = |(c_1 + c_4 - c_2 - c_3)\cdot k + (\operatorname{sufa}(c_2) - \operatorname{sufb}(c_4) - \operatorname{prea}(c_1) + \operatorname{preb}(c_3))| \]

\(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 记录

posted @ 2025-04-07 20:54  DengStar  阅读(70)  评论(0)    收藏  举报