闲扯
蒟蒻又来做例题了。。。
这道题调了半天,结果是维护前缀和的最小值的时候弄成了原数组的值。。。。
题面
Solution
使用二分答案,将求解转化为判定。
对于当前二分出的平均值,我们要确定它的合法性,我们可以将所有数先减去平均值。
这时我们相当于是要找去一段区间,使得它的和大于 $0$ 。
我们慢慢来解决这个问题。
对于没有长度限制,找出一个区间,使它的和最大。
这是一个经典问题,只需要 $O(n)$ 扫描这个区间,将新的数加入子段。当和为负值,就将子段清空。扫描过程中出现的最大子段和即为所求。
对于有长度限制,找出一个区间,使它的和最大。
子段和转化为前缀和相减,则有: $\max\limits_{i-j\geq L}(A_{j+1},A_{j+1},\cdots,A_i)=\max\limits_{L\leq i\leq n}(sum_i-\min\limits_{0\leq j\leq i-L} sum_j)$ 。
随着 $i$ 的增长, $j$ 的取值范围每次只会增加 $1$ 。所以我们每次更新一下最小值即可。
Code
1 |
|
总结
对于不同的二分的模板一定要记清楚,不然考试打炸了就。。。。