Loading

[冲刺国赛 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)\)

感觉是非常神奇的问题, 考虑其本质
pE7BUbT.png

想象一下, 不难发现移动上面那条绿线, 我们可以简单地把问题简化到求

  • 绿线右侧 \(\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\) 级别的拆分, 然后任意两个数一定会在某一层被分在两个部分
注意是两个位置而非两段

posted @ 2025-04-29 20:16  Yorg  阅读(23)  评论(0)    收藏  举报