1 条题解
-
0
C1. Magnitude (Easy Version) 详细题解
题目重述
给定一个长度为 的数组 ,初始 。按顺序处理每个元素 ,每次可以选择:
- 令 ,或
- 令 。
求最终 的最大可能值。
核心观察
绝对值操作可以在任何时刻进行。一旦取绝对值, 变为非负数,后续操作在此基础上继续。直觉上,我们只关心在什么时候“翻转”符号。事实上,可以证明:最优策略中,至多取一次绝对值。因为如果两次取绝对值,中间必然会有一次正负变化,而我们可以合并为一次。
考虑前缀和 ()。假设我们在处理完第 个元素后(即 )取绝对值,则 变为 ,然后继续加上剩余元素(不再取绝对值,因为后续再取可以合并到这次)。最终结果为:
因此,我们需要最大化这个值,其中 可以取 ( 表示从不取绝对值,结果为 )。
而 $|S_p| - S_p = \begin{cases} 0, & S_p \ge 0 \\ -2S_p, & S_p < 0 \end{cases}$。所以最大值等于:
$$S_n + \max_{0\le p\le n}(|S_p| - S_p) = S_n + \max(0,\; -2\min_{p} S_p) = S_n - 2\cdot\min(0,\; \min_{p} S_p). $$记 ,则答案为:
算法步骤
- 计算全部元素的和 。
- 遍历数组,计算前缀和 ,并记录最小前缀和 (包括 的初始状态)。
- 答案 。
- 输出答案(注意使用 64 位整数)。
正确性证明
- 任何操作序列可以转化为:存在某个分界点 ,使得前 个元素正常加(不取绝对值),然后第 步后取一次绝对值,后续元素直接加(不再取绝对值)。因为若在多个位置取绝对值,可以合并:假设在 和 ()取绝对值,则 的变化为 ,但后续操作等价于在 处一次取绝对值后,将后面部分视为整体。形式化证明可参考贪心:绝对值操作相当于符号翻转,多次翻转等价于一次。
- 因此所有可能结果形如 。最大值即为上述表达式。
- 由于 在 时为 ,否则为 ,所以最大值对应 (若为负)或 。
- 当所有前缀和 时,,答案为 ;否则答案为 。
复杂度
- 每个测试用例 时间, 额外空间。
- 所有测试用例的 总和 ,完全可行。
示例验证
- 例1:,,,,。
- 例2:全正,,。
- 例3:全负,,,。
- 例4:,,,,。
- 例5:全正,。
均与样例输出一致。
总结
本题的关键在于发现只需考虑一次绝对值操作,并转化为前缀和的最小值。通过简单扫描即可求得答案,避免了复杂的 DP。这是 Codeforces 上典型的贪心/数学题,适合快速解决。
- 1
信息
- ID
- 6940
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者