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\) 是一个可行解。
由此去二分即可。