构造题 Codeforces2128E2 Submedians (Hard Version)
https://codeforces.com/problemset/problem/2128/E2
题解
有好几步,每步都挺有意思的。
直接看 hard version,找找性质。按照它定义的中位数。我们想下对某个集合 A 已经计算出了中位数集合;把原来的区间变长恰好 1,在集合 A 中多加入一个数字,那么新的中位数集合和现在的差不多,定量描述一下,就是两个中位数集合一定有交。
因此,可能的中位数集合一定是一个大区间,只需要找到最大和最小的即可。恰巧,此事在 easy version 中亦有记载。对于某个钦定中位数 \(v\),定义两个数组 \(\text{big}, \text{small}\),满足:
\[\text{big}_i=
\begin{cases}
1,&a_i\ge v\\
-1,&a_i<v
\end{cases}
\]
那么某个区间 \([l,r]\) 就应当满足 \(\sum \text{big}_i\ge 0, \sum \text{small}_i\ge 0\),仔细分析一下,前者就是保证中位数 \(\ge v\),后者保证 \(\le v\)。但是仔细想一下,只需要保证前者,我们就能找到所有中位数的最大值。因此再结合二分,就可以找到这个最大值,同时也能顺便指出一个对应的区间。
现在只剩下最后一步了!我们知道了中位数最大值 \(mx\) 和对应区间 \([l_1,r_1]\),以及最小值 \(mn\) 和对应区间 \([l_2,r_2]\),想要求出 \([mn,mx]\) 之间的对应区间。有趣的是,我们回忆起第一部分的性质,端点变化时,中位数集合是连续变化的!因此,我们直接让 \([l_1,r_1]\) 连续变化到 \([l_2,r_2]\),那么中间的状态就能覆盖所有 \([mn,mx]\) 中的数字!这题也就做完了。

浙公网安备 33010602011771号