@(Codeforces Round ##703 Div2 D. Max Median 二分答案) 传送门:https://codeforces.com/contest/1486/problem/D
题意
给一个长度为n的数组,在里面找若干个长度$\ge k$的区间,问这些区间中最大的中位数是多少。 中位数,请输出最大值。
思路
依靠我们小学二年级的知识,将一个序列排序后,中位数为中间的数字。 奇数则为$\frac{(n+1)}{2}$,偶数为$\frac{n}{2}$处。 所以不管奇偶,都会有一半$(\ge)$中位数,一半$(<)$中位数。即$(\ge)$中位数$>(<)$中位数的数。
$eg:1\;2\;3 \;4。$ $3个(\ge)2,1个(<)2$,则$2$一定是中位数,$2个(\ge)3,2个(<)3$,则$3$不是中位数。
所以我们可以O(n)判断一个数字是不是中位数。
首先要获取这个中位数,也就是答案,那么就二分获取答案!
我们二分获取x之后,判断该数字是不是可以为中位数,如果是l=mid,否则r=mid-1。
对于怎么O(n)判断,用一个前缀和数字存取与x大小有关的。 $if(a[i]>=x) \;sum[i] = sum[i-1]+1$ $else\;sum[i]=sum[i-1]-1$
当处理完前缀和之后,从第k个开始检查,有没有在一个区间里起点到终点,$(\ge x)$的数是否大于$(<x)$。 存在,直接返回true,否则返回false。
Code(78MS)
1 | # |
本文作者:jujimeizuo
本文地址: https://blog.jujimeizuo.cn/2021/02/19/codeforces-round-703-div2-d/
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0 协议。转载请注明出处!