[冲刺国赛 2022] 4.28 CW 模拟赛 T3. 草莓蛋糕
前言
神秘, 怎么赛时还拥有 \(\textrm{key observation}\)
那个啥, 记得分配
思路
首先考虑把 \(\max\) 拆开
如果 \(a_x + a_y \geq b_x + b_y\), 即 \(a_x - b_x \geq b_y - a_y\), 那么最后的取值是 \(a_x + a_y\), 否则是 \(b_x + b_y\)
不妨令 \(h(x) = a_x - b_x\), \(h(y) = b_{y} - a_{y}\), 那么条件就是 \(h(x) \geq h(y)\), 其中两个集合的 \(h\) 维护略有不同
这个观察还是比较好想的
接下来如何维护?
考虑分析一下问题
注意到对于 \(\mathbb{A}\) 中的一个 \(a_x\), 我们需要找到 \(h(y) \leq h(x)\) 中的最小的 \(a_y\)
对于 \(\mathbb{A}\) 中的一个 \(b_x\), 我们需要找到 \(h(y) \geq h(x)\) 中的最小的 \(b_y\)
不难发现我们可以线段树维护关于 \(h\) 的一个前后缀最小值, 就可以 \(\mathcal{O}(n \log n)\) 解决一次询问
考虑优化
最终不能枚举任意一个集合中的元素, 必须一起维护
考虑用线段树维护这个过程, 发现选哪边作为最大值就是比较判据量的大小关系,所以开一个值域为 \(h\) 值域的线段树,每个节点维护判据量在此区间的两家蛋糕的信息, 只需要分别维护两家蛋糕的 \(\min a_x, \min b_x\) 以及最终答案即可
加入与删除可以通过维护叶子节点的 \(\textrm{multiset}\) 实现, 复杂度 \(\mathcal{O} (q \log q)\)
想象一下, 不难发现移动上面那条绿线, 我们可以简单地把问题简化到求
- 绿线右侧 \(\mathbb{A}\) 中的 \(a_x\) 与 绿线左侧 \(\mathbb{B}\) 中的 \(a_y\) 之和的最小值
- 绿线左侧 \(\mathbb{A}\) 中的 \(b_x\) 与 绿线右侧 \(\mathbb{B}\) 中的 \(b_y\) 之和的最小值
这是比较显然的, 从而转化到了区间上
而这种分两半取两半的操作, 是经典的线段树应用, 在 从前的一个问题中 亦有记载
然后就这样愉快地解决了
总结
\(\max\) 不好处理, 考虑分讨之后拆开
插入删除求最值问题可以尝试借助 \(\rm{STL}\) 处理, 只要残次删除加入不多还是可以胜任的, 注意 \(\textrm{set, multiset}\) 都是 \(\log n\) 维护最值的
线段树本质上是一个 \(\log n\) 级别的拆分, 然后任意两个数一定会在某一层被分在两个部分
注意是两个位置而非两段


浙公网安备 33010602011771号