我谔谔,被卡常力,,,
题意简述
给定一个数 $C$ ,维护一个集合 $S$,支持 $n$ 次操作,操作是加入或删除一个数 $x$。
每次操作结束后求集合中两个数的和模 $C$ 的最大值,强制在线。
$n\le 5\times 10^5$。
主要思路
首先把数都模 $C$,然后答案只有可能是两数的和或两数的和减去 $C$。
后者直接把两个最大的数拎出来求一下得了,非常好搞。
考虑前者如何处理。
再把这里的答案分成两个相等数和两个不等数,前者显然也随便做。
对于每个 $x\in S$,容易找到 $y\in S, y\neq x$ 使得对于 $x$ 答案最优(即 $x + y$ 最接近 $C$)。
试图对每个 $x\in S$ 维护一个匹配 $(x, y)$。
此时发现删除 $x$ 不好删,万一有一大堆数的最优匹配都是 $x$ 呢?复杂度退化。
于是考虑令每个数只在一个匹配中,即令匹配为双向的。这样复杂度可以保证,那么正确性呢?
考虑 $(y, z)$ 为匹配,此时加入 $x$,其最优匹配为 $y$ 且 $x > z$。此时若 $x$ 不删去,$z$ 永远不能成为 $y$ 的最优解。
所以每次删除数对其匹配更新一下即可保证正确性。
复杂度 $O(n\log n)$。
参考代码
比较卡常,搞了好久才过,,,
1 |
|