二分笔记 CF1486D

题目
我们可以考虑二分答案,为了保证它可以有个单调性,所以我们可以考虑二分出x,小于等于最大中位数的值,那么我们就要判断他是否可行,也就是在原序列当中是否存在一个连续的子序列长度大于等于k且保证它的中位数大于等于我的x。那么我们就可以保证。如果x可行的话那么比x小的数它一定可行。当x不可行的话,那比x大的数它都不可行。那么最后我们只需要找到它可行的集合当中最大的那一个数,也就是小于等于最大中位数的值最大,也就是等于最大中位数的值。
接下来我们只要去想这个check怎么check就好了。我们可以用一个很经典的套路我们不去考虑具体的大小,我们只考虑相对的大小,相对于x比x小的数和比x大的数。设成1和-1。接下来我们对这个数组进行前缀和。我们假设已经确定好了左端点和右端点。那么左端点到右端点之间的和有三种情况。如果大于0。表示我这个x。取的有点小了。可以让x变大一点。如果小于0这个表示我这个x太大了,可以让它变小一点。如果我的这个值x==0.则表示现在是正好我是一个这个序列的中位数。那接下来我们就要去想这个左端点和右端点,我们怎么去枚举?我们可以去维护一个前缀和。再去维护一个前i个前缀和中的最小值。那么我们就可以这么去做。sum( I.)表示前i的前缀和和minn(I-k.)为在i-k之前最小的前缀和。如果他们两个相减小于0的话。那么我的x一定是太大了。反之,我可以让我的x尽量变得大一点,
二分的时间复杂度为O(logn),check的时间复杂度为O(n),整体时间复杂度为O(nlogn)
总结
1.对于找一个固定的最大值。我们可以去二分小于等于这个最大值的值。然后通过取等的情况找到这个最大值。
2.对于这种排序问题,我们不用去考虑具体的谁大谁小,只要考虑相对的大小就可以了,设成1,-1的情况

posted @ 2025-10-19 22:18  kksc111  阅读(14)  评论(0)    收藏  举报