CF1779C Least Prefix Sum 题解

CF1779C Least Prefix Sum 题解

CF链接:Least Prefix Sum

Luogu链接:Least Prefix Sum


$ {scr color {CornflowerBlue}{ ext{Solution}}} $

先来解释一下题意:

给定一个数组,问最少把多少个数变成相反数,使得$ forall cal{i}$,$ sum_{k=1}^i a_k$ $ le$ $ sum_{k=1}^m a_k$

发现对于所有数据点,$ cal{n} le 2 imes 10^5$,说明需要 $ Ο(cal{n log n}) $ 或者 $ O(cal{n}) $的算法。

分析一下题目,发现要分成$ cal{i} > cal{m}$ 与$ cal{i} < cal{m}$两种情况分类讨论

  • 当 $cal{i}$ $ > cal{m}$时:

什么时候才能使$ sum_{k=1}^i a_k$ $ le$ $ sum_{k=1}^m a_k$ 成立呢?

是不是只要使新加的每一段都小于等于0就行了?($ sum_{k=m}^i a_k$ $ le$ $ 0$)

也很好证明:一个数($ sum_{k=1}^m a_k$)加上一个小于等于0的数($ sum_{k={m+1}}^i a_k$),一定不大于原数。

  • 当 $cal{i}$ $ < cal{m}$时:

同理,只要使后加的每一段都小于等于0就行了($ sum_{k=i}^i a_k$ $ ge$ $ 0$)

也很好证明:一个数($ sum_{k=1}^i a_k$)加上一个大于等于0的数($ sum_{k=i}^m a_k$),一定不小于原数。

而且,由于这两种情况类似(博主太懒),那就只考虑当 $cal{i}$ $ > cal{m}$的情况吧。

问题已经转化完了,接下来怎么办?

第一眼想到的是贪心。

设当前要取第$cal{i}$个。

有一个不成熟的贪心:如果目前累加和加上$a_i$还是小于等于$0$的,就加上$a_i$,如果大于$0$了,就把$a_i$取反,$ ans+1$。

Hack数据

5 1
1 -1000 999 2 3
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » CF1779C Least Prefix Sum 题解