洛谷 - 交互题配置教程
〇、更新日志
(Update on 2025/05/25)
- 修改或更新了部分表述不准确或过时的内容;
- 修改了对 Art Collection 一题在洛谷中状态的描述;
- 今年洛谷新增了通信题模板,希望其他无法评测的题能够及时跟进。
一、前置知识
在浏览这篇专栏文章之前,确保你已经阅读并理解了以下内容:
- 交互题功能说明
- [洛谷日报#271]Testlib——最强出题辅助工具库
- Special Judge 使用说明
- 题目测试点配置文件
二、配置方法
经测试,该方法能够实现 P1733 和 P1947 的配置。
0. 题面撰写
Grader 函数式交互题请参照 P1947,IO 数据式交互题请参照 P1733,写好一个清晰易懂没有歧义的题面。如果可以提供交互库,但无法直接置于题面中,请使用题目附件添加功能将交互库上传,方便选手测试。
1. 交互库编写
按照上述博客编写交互库和 Special Judge 程序(如果需要)。确认无误后,将交互库命名为 interactive_lib.cpp,Special Judge 程序(如果有)命名为 checker.cpp。
2. 文件上传
- 如果是 Grader 函数式交互题,那么需要先本地生成好测试数据(输入和输出都需要),然后将交互库和测试数据合成一个 zip 压缩包,上传至题目数据点配置文件中,并勾选特殊题目的
交互题标签。如果有 Special Judge 程序,那么还需要勾选Special Judge标签(特别地,如果交互库使用了Testlib库,即在程序头文件中包含了testlib.h头文件,那么同样需要选上Special Judge标签)。 - 如果是 IO 数据式交互题,那么需要先本地生成好交互库需要的输入文件(或者,在交互库中随机生成测试数据),并勾选特殊题目
交互题(即使没有交互库,但在checher.cpp中调用了registerInteraction函数来实现交互)和Special Judge标签。如果想直接通过 Special Judge 程序进行交互,那么可以用一个空的interactive_lib.cpp来代替交互库,这样就可以让 Special Judge 同时承担交互和判题的功能。
3. 提交程序
-
如果是 Grader 函数式交互题,那么需要在交互库开头包含或使用你提交的程序中的库函数所用到的头文件或命名空间(如果有),并且正确地声明题目所给的供选手使用的函数(即使你的程序中没有使用),然后编写题目要求的函数并提交。
-
如果是 IO 数据式交互题,那么需要像正常题目一样编写一个完整的程序,与其有所不同的是,你的输出是交互库的输入,你的输入是交互库的输出。
4. 本地测试
目前只研究出了 Grader 函数式交互题(无 Special Judge)在 Windows 系统下测试的方法。 请确保你的所有文件(包括交互库,测试程序,附加头文件)在同一个目录下。
如果将交互库命名为 interactive_lib.cpp,需要测试的程序命名为 std.cpp,那么可以在同一目录下新建一个 Windows 批处理文件(即以 .bat 为后缀的文件),写入以下代码:
g++ interactive_lib.cpp std.cpp -o std.exe -std=c++14
std.exe
pause
或者直接点击下载。
保存并运行批处理文件,如果你的代码和交互库代码都没有编译错误,那么就可以直接通过标准输入输出进行交互来获得结果。方法参考了这篇博客并进行了简化。
以下用 [BalticOI 2022 Day1] Art Collections 的样例作为正常运行的实例。
文件放置(compile.bat 为批处理文件):
运行结果: