Problem D: 巅峰状态曲线

Memory Limit:128 MB Time Limit:1.000 S
Judge Style:Text Compare Creator:
Submit:34 Solved:14

Description

机器人社的成员每天给“状态日志”打一个效能分:状态好的日子是正分,摸鱼、生病是负分。社长想复盘每位成员“状态最好的一段连续日子”,看看巅峰是怎么一步步攒出来的。

给定 N 天的效能值 A[1] … A[N],值可正可负。请选一段非空连续区间 [l r](至少包含 1 天),使区间和 A[l] + … + A[r] 最大,输出三个数:最大区间和、l、r。

平局规则:若多个区间同时取得最大和,选 l 最小的;l 也相同,选 r 最小的。

注意:区间必须非空——即使所有效能值都是负数,也必须选一天,此时答案就是最大的那个单日值。

Input

输入第一行一个整数 N。第二行 N 个整数 A[1] … A[N]。

Output

输出一行三个整数:最大区间和、起点天 l、终点天 r。

Sample Input Copy

8
4 -3 5 -2 -1 2 6 -2

Sample Output Copy

11 17

样例解释

样例 1:第 1 至第 7 天的和为 4−3+5−2−1+2+6 = 11,是所有连续区间中最大的。注意第 2 天虽然拖了后腿,但丢掉它再单独从第 3 天开始并不会更优。

HINT

1 ≤ N ≤ 100000,−1000 ≤ A[i] ≤ 1000。提示:想一想逐对枚举所有区间在大数据下的运算量。

AI 辅助编程建议

①确认需求。 让 AI 复述“区间必须非空”这一条——全部为负时答案不是 0,而是最大的单日值,这是本题最容易漏的规则;再复述两个平局规则的先后顺序(先比起点、再比终点);确认起点终点都是天数编号、从 1 开始。

②生成程序。 请 AI 说明所选算法与复杂度:逐对枚举所有区间是 O(N²),一次扫描的 Kadane 算法是 O(N)。追问它:N=100000 时 O(N²) 大约要做多少次加法,还能不能接受。

③审查逻辑。 重点检查三处:重新开始的判定条件是 cur < 0 还是 cur ≤ 0——写成 ≤ 会把“和恰好为 0”的前缀扔掉,导致起点不再最早;更新答案必须用严格大于,否则会记录到更靠后的区间;全负数据时程序走的是哪条分支、结果是否为最大单日值。

④补充测试。 除题面样例外,还应检查:全负;全正(整段全取);N=1;最大段在开头与在结尾;存在多个同值区间(验证“起点最早、终点最早”两条平局规则);N=100000 的随机数据。

⑤迭代修正。 如果实际输出与预期不一致,把输入、预期输出和实际输出一并提供给 AI,并说明怀疑方向(例如“全负数据错了”还是“平局区间选晚了”);修改后重新运行全部测试。