2025.04.28 CW 模拟赛 C. 多重集

C. 多重集

题目描述

有两个初始为空的多重集 \(A, B\),其中每个元素都有两个属性 \(a, b\)

\(Q\) 次修改操作,每次修改会对两个多重集中的一个进行一次插入或者删除。

每次操作完成后,你需要求 \(\max(a_x + a_y, b_x + b_y)\) 的最小值,其中 \(x \in A, y \in B\)

保证删除的一定存在。


思路

考场上只想得到 \(\mathcal{O}(q^2 \log q)\) 的暴力: 使用 \(3\)multiset 分别维护集合 \(\rm{A, B}\) 和最终的取值 \(val\).

发现最终所求涉及到两个集合内的元素, 直接维护是平方级别的, 我们考虑对于 \(\max\) 进行分类讨论并将式子拆开.

思考一下, 当式子取值为 \(a_x + a_y\) 时, 需要满足什么条件? 显然当且仅当 \(a_x + a_y \ge b_x + b_y\) 时, 原式会取到 \(a_x + a_y\). 同理, 当 \(a_x + a_y \le b_x + b_y\) 时, 原式会取到 \(b_x + b_y\).

对于 \(a_x + a_y \le b_x + b_y\), 我们将不等式进行移项, 得

\[a_x - b_x \le b_x - b_y \]

为了方便表示, 我们令 \(h_x = \begin{cases} a_x - b_x & x \in \textrm{A} \\ b_x - a_x &x \in \textrm{B} \end{cases}\). 不难发现, 根据上面的推导, 我们可以通过 \(h_x\)\(h_y\) 的值大小确定最终答案.

因为题目中有多次修改和询问, 我们考虑使用数据结构维护. 具体来说, 我们将 \(h\) 数组离散化后开一棵权值线段树, 将 \(h_x\) 作为下标.

对于每一个节点, 我们需要存储以下几个值

  • 当前节点的答案 \(res\);
  • 当前节点最小的 \(a_x, b_{x'}(x, x' \in \textrm{A})\)\(a_y, b_{y'}(y, y' \in \textrm{B})\), 我们将其计入一个 \(mn\) 数组内.

那么合并两个节点时, 首先有 \(res_u = \min(res_{ls}, res_{rs})\), \(mn_{u, i} = \min(mn_{ls, i}, mn_{rs, i})\). 其次由于这棵线段树是以 \(h\) 为下标的, 所以自然有左儿子的 \(h_x\) 小于右儿子的 \(h_y\), 对于 \(res\) 就有

\[res = \min(res, \text{左儿子的 }a_y + \text{右儿子的 }a_x, \text{左儿子的 }b_x + \text{右儿子的 }b_y) \]

对于底层叶子结点, 我们采用 multiset 维护 \(mn\) 数组的更新. 总时间复杂度 \(\mathcal{O}(q \log q)\).

posted @ 2025-04-30 15:52  Steven1013  阅读(41)  评论(0)    收藏  举报