在算法竞赛圈里,CF 通常指 Codeforces,所谓 CF 评测,Codeforces 对选手提交的代码进行自动编译、运行、判题并给出结果的一整套流程,很多新手第一次参加 CF 比赛时,看到“In queue”“Pretests passed”“Hacked”等状态会一头雾水,理解 CF 评测机制,不仅能减少等待时的焦虑,还能帮助你更快定位错误、提高上分效率。

CF 评测的基本流程
一次典型的 CF 评测大致会经历这些步骤:
- 提交代码:你选择语言、粘贴代码并点击 Submit。
- 进入队列:系统显示“In queue”,表示评测机正在排队处理。
- 编译代码:如果代码无法编译,会直接返回 Compilation error。
- 运行预测试:也就是 Pretests,它通常包含样例和一些基础数据。
- 预测试通过:显示“Pretests passed”,但这并不等于最终 Accepted。
- 锁题与 Hack:比赛中你可以锁题,查看别人代码并尝试构造数据 Hack。
- 系统测试:比赛结束后,所有提交会进入 System Test,使用完整测试数据。
- 更新 Rating:系统测试结束后,CF 根据成绩计算新的分数和段位。
CF 评测中最容易让人误判的一点就是:Pretests passed 不等于 AC,很多代码只是过了预测试,却在系统测试中被更强的数据击倒。
常见 CF 评测状态解读
- Accepted:通过全部测试,也就是常说的 AC。
- Wrong answer:答案错误,通常简写为 WA。
- Time limit exceeded:超时,简写 TLE,说明算法复杂度或常数过大。
- Memory limit exceeded:超内存,简写 MLE。
- Runtime error:运行错误,常见于数组越界、除零、递归爆栈等。
- Compilation error:编译错误,先检查语言版本和语法。
- Idleness limit exceeded:交互题常见,通常是没有及时 flush 输出。
- Hacked:你的代码被其他选手 Hack 成功。
- Skipped:提交被跳过,可能是重复提交或系统判定无效。
- Judgement failed:评测机或题目数据异常,通常需要等待重判。
看懂这些状态,是掌握 CF 评测的第一步。
预测试与系统测试的区别
CF 评测分为预测试和系统测试,预测试数据较少,目的是快速筛掉明显错误的代码;系统测试数据更全面,包含边界、极限和 Hack 数据,很多选手都有这样的经历:比赛时 Pretests passed,以为自己稳了,结果赛后一看,System Test 直接 WA,这说明你的代码可能只考虑了常规情况,没有处理边界条件。
每次提交后不要只看样例是否通过,要多问自己:数据范围最大时会怎样?会溢出吗?多测清空了吗?数组开够了吗?特殊输入考虑了吗?
CF 评测慢怎么办
CF 评测慢通常有几个原因:比赛高峰期提交量太大、题目包含特殊评测、交互题运行较慢、评测机排队等,遇到“In queue”时,不建议反复提交同一份代码,因为重复提交可能造成 Skipped,还会增加服务器压力,更好的做法是继续看下一题,或者回头检查当前代码。
如何根据 CF 评测结果优化代码
如果经常 WA,重点检查边界、溢出、初始化、多测清空和题意理解。
如果经常 TLE,优先优化时间复杂度,其次减少常数,比如使用快读、避免频繁 STL 操作。
MLE,检查数组大小和容器占用。
RE,检查越界、递归深度、除零和空指针。
如果是交互题 ILE,记得每次输出后 flush。
CF 评测不仅是一个“交代码等结果”的过程,更是一套严格、快速的自动裁判系统,理解它的流程和状态,能让你在比赛中更冷静,也能帮助你从每次 WA、TLE、RE 中快速成长,下一次看到“Pretests passed”时,别急着庆祝;等 System Test 结束,看到绿色的 Accepted,那才是 CF 评测给你的最终答案。

