【题解】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\) 中的元素。

因此我们可以直接枚举值域左端点双指针维护右端点。

代码记录

posted @ 2021-11-15 17:46  Themaxmaxmax  阅读(29)  评论(0编辑  收藏  举报