【题解】CF1175C 二分、贪心
考虑二分答案,判定条件等价于存在一个 \(x\) 满足存在 \(\ge k\) 个位置满足 \(|a_i-x|\le mid\) 。
考虑固定 \(x\) ,那么要统计的即在 \([x-mid,x+mid]\) 这个范围内的 \(a_i\) 的个数。
对于这个问题有两个解决办法:
方法一:转化成枚举区间是否能被覆盖
直接做我们发现很难,正难则反。
因为覆盖的范围是一段区间,所以考虑枚举区间判定这段区间存不存在一个 \(x\) 能够覆盖该区间。
将所有 \(x\) 覆盖的范围看成一个滑动窗口,那么其实等价于 check
某段区间能不能被值域上长度为 \(2\times mid +1\) 的滑动窗口覆盖。
只要值域上区间的长度 \(\le 2\times mid+1\) 即可。
并且我们发现其具有单调性,直接双指针就可以在 \(O(n)\) 的时间内 check
。
总的复杂度为 \(O(n\log a_i)\) 。
方法二:枚举 \(x\) 转化成枚举值域区间左端点
对于一个固定的 \(x\) 能够覆盖的值域区间 \([x-mid,x+mid]\) 覆盖的最靠左的点的值为 \(pos\) 我们将区间左端点固定为 \(pos\) ,\([pos,pos+2\times mid]\) 一定不劣。
因此值域左端点一定可以是 \(a\) 中的元素。
因此我们可以直接枚举值域左端点双指针维护右端点。