覆盖 0 次
没有被前缀或后缀选中,元素保持原来的符号。
TODAY'S RESEARCH · Codeforces 33C
今天开始研究 Wonderful Randomized Sum。先不背结论,而是从每个元素究竟被翻转几次开始推导。
两边翻转、中间不变 → 选择一个和最大的连续中间段。
还没有把推导完整写成自己的 AC 代码。
PROBLEM · 题目
CODEFORCES 33C
给定一个整数序列。可以选择一个前缀乘以 −1,再选择一个后缀乘以 −1;前后缀都可以为空,也可以相交。求操作后最大的序列总和。
在洛谷查看原题OBSERVATION · 自己观察到的规律
同一个元素只可能被覆盖 0 次、1 次或 2 次。
没有被前缀或后缀选中,元素保持原来的符号。
只属于前缀或只属于后缀,乘一次 −1,符号翻转。
(−1) × (−1) = 1,前后缀重叠部分最终不变。
无论前后缀是否相交,都可写成:左边翻转|中间不变|右边翻转。
TRANSFORM · 代数转化
设原数组总和为 S,中间不变区间的元素和为 M。两侧元素之和就是 S − M,它们都会被取反。
最终总和
M − (S − M) = 2M − S S 是固定的,因此只需让 M 尽可能大。 问题转化为:求最大子段和。KADANE · 实现方向
用 sum 记录整个数组的元素和 S。
current = max(0LL, current + x)。如果当前连续和已经为负,就从后面重新开始。
best = max(best, current),得到允许为空的最大子段和 M。
最终输出 2 * best - sum。
CHECKPOINT · 当前进度
NEXT · 接下来完成