Special Judge
本页面主要介绍部分评测工具/OJ 的 spj 编写方法.
简介
Special Judge (简称:spj,别名:checker)是当一道题有多组解时,用来判断答案合法性的程序.
Warning
spj 还应当判断文件尾是否有多余内容,及输出格式是否正确(如题目要求数字间用一个空格隔开,而选手却使用了换行).但是,目前前者只有 Testlib 可以方便地做到这一点,而后者几乎无人去特意进行这种判断.
判断浮点数时应注意 NaN.不合理的判断方式会导致输出 NaN 即可 AC 的情况.
在对选手文件进行读入操作时应该要检查是否正确读入了所需的内容,防止造成 spj 的运行错误.(部分 OJ 会将 spj 的运行错误作为系统错误处理)
Note
以下均以 C++ 作为编程语言,以「要求标准答案与选手答案差值小于 1e-3,文件名为 num,单个测试点满分为 10 分」为例.
Testlib
Testlib 是一个 C++ 的库,用于辅助出题人使用 C++ 编写算法竞赛题.
必须使用 Testlib 作为 spj 的 评测工具/OJ:Codeforces、洛谷、UOJ 等.
可以使用 Testlib 作为 spj 的 评测工具/OJ:LibreOJ (Lyrio)、Lemon、牛客网等.
SYZOJ 2 所需的修改版 Testlib 托管于 pastebin1,但此修改版并未修改交互模式.syzoj/testlib 处托管了一份可以在 SYZOJ 2 上使用交互模式的 Testlib.
Lemon 所需的修改版 Testlib 托管于 GitHub - GitPinkRabbit/Testlib-for-Lemons.注意此版本 Testlib 注册 checker 时应使用 registerLemonChecker(),而非 registerTestlibCmd().此版本继承自 matthew99 的旧版,添加了一些 Testlib 的新功能.如果你使用 LemonLime,则可以使用原生的 Testlib.
DOMJudge 所需的修改版 Testlib 托管于 cn-xcpc-tools/testlib-for-domjudge.此版本 Testlib 同时可作为 Special Judge 的 checker 和交互题的 interactor.
Arbiter 所需的修改版 Testlib 托管于 testlib-for-arbiter.
其他评测工具/OJ 大部分需要按照其 spj 编写格式修改 Testlib,并将 testlib.h 与 spj 一同上传;或将 testlib.h 置于 include 目录.
---|---
## Lemon
Note
Lemon 有现成的修改版 Testlib,建议使用 Testlib.
LemonLime 最新版已经支持使用原版 Testlib 编写评测器,如果你使用 LemonLime,建议使用 Testlib.
---|---
Cena
---|---
## CCR
---|---
Arbiter
---|---
## HUSTOJ
---|---
QDUOJ
相较之下,QDUOJ 略为麻烦.它带 spj 的题目没有标准输出,只能把 std 写进 spj,待跑出标准输出后再判断.
---|---
## HDOJ
HDOJ 和 QDUOJ 的情况基本一致,也需要在 spj 中实现 std 后与选手输出比较.但与 QDUOJ 不同的是,HDOJ 会比较答案与 spj 输出在标准输出的内容后给出最终结果.因此,上传输出时仅需上传 spj 在正确时的输出即可.
HDOJ 需上传 Windows 下编译后的二进制文件,而非源代码.
---|---
对应的答案文件为:
---|---
## SYZOJ 2
Note
SYZOJ 2 有现成的修改版 Testlib,建议使用 Testlib.
LibreOJ 的最新版本已不再基于 SYZOJ,而是基于 [Lyrio](https://github.com/lyrio-dev/lyrio).Lyrio 支持使用原版 Testlib 编写评测器,这也是更加通用且推荐的做法.
---|---
牛客网
Note
牛客网有现成的修改版 Testlib,建议使用 Testlib.
---|---
## DOMJudge
Note
DOMJudge 支持任何语言编写的 spj,参见:[problemarchive.org output validator 格式](https://www.problemarchive.org/wiki/index.php/Output_validator).
DOMJudge 有现成的修改版 Testlib,建议使用 Testlib.
DOMJudge 使用的 Testlib 及导入 Polygon 题目包方式的文档:<https://github.com/cn-xcpc-tools/testlib-for-domjudge>
DOMJudge 的 [默认比较器](https://github.com/Kattis/problemtools/blob/master/support/default_validator/) 自带了浮点数带精度比较,只需要在题目配置的 `validator_flags` 中添加 `float_tolerance 1e-3` 即可.
---|---
也可以使用 Kattis Problem Tools 提供的头文件 validate.h 编写,以实现更加复杂的功能.
参考资料
本页面最近更新: 2026/1/7 08:56:54,更新历史 发现错误?想一起完善?在 GitHub 上编辑此页! 本页面贡献者:Xeonacid, NachtgeistW, sshwy, cubercsl, Enter-tainer, HeRaNO, StudyingFather, ZnPdCo, CCXXXI, Chrogeek, countercurrent-time, H-J-Granger, Menci, Tiphereth-A, 2014CAIS01, aberter0x3f, AngelKitty, c-forrest, cjsoft, diauweb, Early0v0, ezoixx130, GavinZhengOI, GekkaSaori, Gesrua, GitPinkRabbit, Ir1d, Konano, kxccc, LovelyBuggies, lychees, Makkiy, mgt, minghu6, P-Y-Y, Peanut-Tang, PotassiumWings, SamZhangQingChuan, SukkaW, Suyun514, weiyong1024, yzy-1 本页面的全部内容在CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用