CF1486D题解

题面

题意:
给你一个长度为 \(n\) 的数列 \(a\) ,求 \(a\) 中所有长度 \(\geq k\) 的子串的中位数的最大值。


首先考虑二分答案。
然后想怎么去判断做到的这个 \(x\) 是否成立。我们定义一个数组 \(b\) ,其中 \(b_i=\begin{cases} 1, & a_i\geq x \\ -1, & a_i<x \end{cases}\) 。则 \([i,j]\) 区间中位数 \(\geq x\) 的充要条件是 \(\sum_{m=i}^j b_m>0\)
首先想到前缀和维护,则条件变成了 \(S_j-S_i>0\)
因为区间的长度不定,而我要尽可能的满足 \(S_j-S_i>0\) ,所以定义一个数组 \(m\) 来维护 \(S_1\sim S_i\) 的最小值。那么,只要 \(S_j-m_{j-k}>0\) ,就说明在 \([1,j-k]\) 区间内存在一个 \(i\) 使得 \(S_j-S_i>0\) ,也就是说明 \(x\) 是一个可行解。
由此去二分即可。

代码

posted @ 2022-04-08 19:01  1358id  阅读(24)  评论(0编辑  收藏  举报