非常有趣的一道数据结构题。
非常反套路啊。
首先明确题意中对中位数的定义。如果下标从 1 开始,那么就是第 n2+1 小。
即当 n 为偶数时,取中间二项的后者。
发现这题区间大小不确定,所以我们没法以 ≤mid 的数字个数的基本二分套路求第 k 小。
但是,根据中位数的定义,发现求的是比它小的数的个数比不比它小的数的个数要少的最大的数。
于是考虑把前者当做 −1,后者当做 1。问题转化为区间和 ≥0。
进一步思考如何判定,发现 (b,c) 区间肯定是有贡献的。
除此以外,对于 [a,b] 和 [c,d] 区间,显然要贪心地分别求最大后缀和及最大前缀和。
显然线段树可以维护。
但是,如果对于每个数都开一棵线段树空间肯定不够。
再次发现如果把数排序之后依次插入,每次修改的结点数是均摊 O(logn) 的。
于是可以可持久化一下。
代码:
1 |
|