Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions docs/manual/luogu/problem/interactive-problems.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ int main() {

### 需要使用 SPJ 的情况

事实上,大部分函数式交互题目并不像上例那么简单。以 [P13612 [IOI 2018] combo 组合动作](https://www.luogu.com.cn/problem/P13612) 为例,本题需要选手实现函数 `string guess_sequence(int N)`,允许选手调用函数 `int press(string p)`,且根据函数调用次数反馈评分。这个时候需要用到 Special Judge 功能。在文件目录下需要 interactive_lib.cpp 和 checker.cpp,并且同时勾选交互题和 Special Judge 标签。
事实上,大部分函数式交互题目并不像上例那么简单。以 [P13612 [IOI 2018] combo 组合动作](https://www.luogu.com.cn/problem/P13612) 为例,本题需要选手实现函数 `string guess_sequence(int N)`,允许选手调用函数 `int press(string p)`,且根据函数调用次数反馈评分。这个时候需要用到 Special Judge 功能。在文件目录下需要 interactive_lib.cpp 和 checker.cpp,并且同时勾选交互题和 Special Judge 标签。同时,checker.cpp 需要注册为 Interaction。

在此类情况下,测试数据在 checker、interactive_lib 的流转如下:
- 从 checker 的 inf 流读取试题原本的测试数据,再使用 stdout 输出信息。
Expand Down Expand Up @@ -190,4 +190,4 @@ int main(int argc, char **argv) {

1. 缓冲区问题。C/C++ 语言的输入输出函数均自带有一定的缓冲区,因此你输出的内容不一定能立刻被交互库/SPJ 所读取。如果不在合适的时间清空缓冲区,很可能会造成两个程序互相等待对方输出的情况而 TLE。
2. 每次输出完一定内容、希望对面的程序开始进行处理时,都必须手动清空缓冲区。在 C 语言中,可使用 `fflush(stdout)` 函数。在 C++ 语言中,可使用 `std::cout << std::flush` ;在使用 `std::endl` 输出一个换行时,C++ 语言也会自动清空缓冲区。
3. 交互库(以及 SPJ)最好不要占用太多的 CPU 资源,因为它将与用户的程序在同一个核心上执行。最好在评测程序等待来自 SPJ 的输入,或者评测程序已经结束运行之后,再进行复杂的计算。
3. 交互库(以及 SPJ)最好不要占用太多的 CPU 资源,因为它将与用户的程序在同一个核心上执行。最好在评测程序等待来自 SPJ 的输入,或者评测程序已经结束运行之后,再进行复杂的计算。