题解:P13091 [FJCPC 2025] 中位数
很简单的一道题,不知道为什么有人会说难。
设阈值 \(x\),把原数组映射成二值串 \(b_i=[a_i\ge x]\)。若存在一种合并顺序使最后剩下的数字 \(\ge x\),则任何更小的阈值都同样可行,答案关于 \(x\) 单调,于是用二分查找定位极大可行值。
一次判定时,从左到右扫 \(b\) 并用栈维护当前序列:当栈顶连续出现两个 \(0\) 时,必然可以立即与接下来的一个元素合并而不劣,于是提前弹掉一个零即可保证序列里永无三连零;扫完后统计栈内 \(1\) 与 \(0\) 的个数,因长度为奇数,若 \(1\) 多于 \(0\) 就能通过若干次 \(1\,0\,1\) 或 \(0\,1\,1\) 型合并把差距逐步扩大,最终留下 \(1\),说明阈值成功。反之若 \(0\) 不少于 \(1\),剩余序列再怎么合并也无法让 \(1\) 胜出,阈值失败。
时间复杂度 \(O(n\log V)\),其中 \(V\) 为值域。

浙公网安备 33010602011771号