#AEAI06005. 执行日志中的阶段恢复追踪
执行日志中的阶段恢复追踪
题目描述
一次长任务会被拆成若干阶段顺序执行。现场日志可能记录某阶段成功、失败、超时、恢复完成或整单取消。你需要根据日志维护当前应执行的阶段、已完成数量和失败状态。
每个阶段有任务编号 tid、最大重试次数 max_retry 和回滚位置 rollback。初始当前阶段为第 1 个。日志规则如下:
SUCCESS tid:若tid正好是当前阶段,则标记该阶段完成,并推进到下一阶段。FAIL tid或TIMEOUT tid:若tid正好是当前阶段,则该阶段重试次数加一;当重试次数大于max_retry时,任务失败。RECOVERED tid:若tid在阶段表中,则读取该阶段的rollback。若回滚位置在1..n内,当前阶段改为该位置,并清除该位置及之后所有完成标记。CANCEL:立即取消整单,忽略后续日志。
若日志中的 tid 不存在,或对应的阶段不是当前阶段,则该条日志除 RECOVERED 的有效回滚外不改变推进状态;当前阶段已经超过 n 时,后续带 tid 的日志不再改变状态。
输入格式
第一行输入阶段数 n。接下来 n 行,每行输入:
tid max_retry rollback
随后一行输入日志条数 k。接下来输入 k 条日志,格式为 CANCEL,或 SUCCESS tid、FAIL tid、TIMEOUT tid、RECOVERED tid。
输出格式
若出现取消,输出:
TASK_CANCELLED
若某阶段失败次数超过上限,输出:
TASK_FAILED tid
否则输出:
PROGRESS current completed completed/n next_tid
其中 current 为当前阶段下标;若全部完成则为 n+1。completed 为已完成阶段数,next_tid 为当前阶段任务编号,全部完成时为 0。
数据范围与测试提示
- 正式测试会覆盖样例没有出现的边界输入,请不要依赖样例规模或样例顺序写特判。
- 输出只包含题目要求的字段,不要输出调试信息;浮点结果按题面要求保留 6 位小数。
- 日志可能从任意阶段开始,也可能包含重复恢复、无效事件和终止后的多余事件。
- 阶段恢复次数、最后一次有效阶段和失败原因要在每条日志后按顺序维护。
FAIL/TIMEOUT次数超过max_retry才失败,等于上限仍可继续;CANCEL立即终止并忽略后续日志。
样例
输入样例 1
3
101 1 1
102 2 1
103 1 2
3
SUCCESS 101
SUCCESS 102
SUCCESS 103
输出样例 1
PROGRESS 4 3 3/3 0
输入样例 2
3
1 2 1
2 2 1
3 1 2
5
SUCCESS 1
FAIL 2
RECOVERED 2
SUCCESS 1
SUCCESS 2
输出样例 2
PROGRESS 3 2 2/3 3