CF1486D - Max Median-巧妙二分答案

前言:

其实看题的时候差不多把正解的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

猜你喜欢

转载自blog.csdn.net/qq_35577488/article/details/113867825
max