#AEAI06005. 执行日志中的阶段恢复追踪

执行日志中的阶段恢复追踪

题目描述

一次长任务会被拆成若干阶段顺序执行。现场日志可能记录某阶段成功、失败、超时、恢复完成或整单取消。你需要根据日志维护当前应执行的阶段、已完成数量和失败状态。

每个阶段有任务编号 tid、最大重试次数 max_retry 和回滚位置 rollback。初始当前阶段为第 1 个。日志规则如下:

  • SUCCESS tid:若 tid 正好是当前阶段,则标记该阶段完成,并推进到下一阶段。
  • FAIL tidTIMEOUT 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 tidFAIL tidTIMEOUT tidRECOVERED tid

输出格式

若出现取消,输出:

TASK_CANCELLED

若某阶段失败次数超过上限,输出:

TASK_FAILED tid

否则输出:

PROGRESS current completed completed/n next_tid

其中 current 为当前阶段下标;若全部完成则为 n+1completed 为已完成阶段数,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