CF1486D - Max Median-巧妙二分答案

2023大厂真题提交网址(含题解):

www.CodeFun2000.com(http://101.43.147.120/)

最近我们一直在将收集到的机试真题制作数据并搬运到自己的OJ上,供大家免费练习,体会真题难度。现在OJ已录入50+道2023年最新大厂真题,同时在不断的更新。同时,可以关注"塔子哥学算法"公众号获得每道题的题解。
在这里插入图片描述

前言:

其实看题的时候差不多把正解的80%想明白了。但是还是离正解差了一丢丢。

题目大意:

给你一个长度为 n n n的序列。让你找到一个长度不小于 k k k的连续子序列,使得它的中位数最大。

一个长度为 n n n的序列的中位数是排序后第 ⌊ n + 1 2 ⌋ \lfloor \frac{n+1}{2}\rfloor 2n+1位置的值.

题目思路:
二分答案+巧妙 c h e c k check check

我们二分最后的答案 x x x然后检查是否存在一个长度不小于 k k k的连续子序列,使得它的中位数大于等于 x x x

做法:将小于 x x x的数赋值成 − 1 -1 1,大于等于 x x x的数赋值成 1 1 1.那么一个连续子序列的中位数大于等于 x x x的条件就是它的总和大于等于 0 0 0.

因为 n u m 1 ≥ n u m − 1 num_1 \geq num_{-1} num1num1,那么 n u m 1 ≥ l e n 2 num_1 \geq \frac{len}{2} num12len.那么第 ⌊ n + 1 2 ⌋ \lfloor \frac{n+1}{2}\rfloor 2n+1位置的值一定是 1 1 1.

所以我们只需要维护一个前缀和,对于一个区间右端点 i i i,我们只需要在 [ 1 , i − k ] [1,i-k] [1,ik]区间内找到一个尽量小的前缀和然后判断两者相减是否大于等于 0 0 0即可。

单调性证明:

这个是最让我感到奇怪的地方。我最开始还以为这个问题是要三分答案.没想到是二分。说到底还是没搞清楚它为什么单调。

我们上述的算法其实可以看作 c h e c k check check每一个长度 ≥ k \geq k k的子区间是否符合条件。所以其实我们只需要证明对于某一个子区间是单调的就可以了。

注意我们对二分的定义:我们不是直接二分答案 x x x,而是二分范围 [ x , + ∞ ] [x,+∞] [x,+]

所以显然当 x x x越小的时候,越可能成立。当 x x x越大时,越难成立.设最终答案为 y y y.

x ≤ y x \leq y xy时合法,反之不合法。构成二分答案模型。

启示:

其实我们也知道了一种在不排序的情况下求序列中的中位数的方法:值域二分答案。

拓展:

若将题目中的中位数换成算数平均值,如何做。

c h e c k check check答案的时候,将序列每个数同时减去答案 x x x.然后找到一个区间累和大于等于 0 0 0的即合法。

因为将每个数同时减去答案 x x x后,算数平均值 ≥ 0 \geq 0 0的即原序列算数平均值 ≥ x \geq x x

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值