查看、提交及评测题目

By LauYeeYu,更新于 2024.2.5。

查看题目

有以下几种方法可以跳转到题目页面:

题目首页上会显示题目的基本信息,包括题目名称、题目描述、输入输出格式、样例输入输出、数据范围等。

提交题目

在题目页面上,点击「提交」按钮,在输入框中输入代码,然后点击「提交」按钮即可提交代码。

ACM Class OnlineJudge 会自动识别提交方式。通常情况下,自动识别会准确判断提交的语言,但是有时候会出现错误。如果出现错误,可以手动选择语言。

对于一般的题目(非提交 C++ 头文件、不限定 Verilog 等),ACM Class OnlineJudge 支持的提交方式为 C++、Git 仓库、Python。

如果题目限定提交头文件,那么提交方式只有 C++。

如果题目限定提交 Verilog,那么提交方式只有 Verilog。

如果题目评测方式为「自定义评测」,那么提交方式为纯文本。

如果题目评测点包含内存检查 (valgrind),那么提交方式为 C++ 和 Git 仓库。

提交后,浏览器会自动跳转到提交详情页面,你的代码会自动评测(具体见评测方式),评测结果会显示在提交页面上。评测过程中会显示当前已经评测完成的数据点的情况。在完成评测前,可以随时终止评测。

评测方式

对于一般的评测,会经历三个阶段:编译、运行、检查。(可能会有一些阶段被省略)

在编译阶段,会根据题目指定的评测方式以及您的提交方式进行编译,具体编译流程请看编译流程部分。此阶段的错误将会被显示为 Compile Error。(有一些情况不会经历编译阶段,如无需编译的语言、特殊提交方式等)

在运行阶段,会根据题目指定的方式运行之前编译好的代码。评测详情显示的评测点的运行时长、内存占用、文件占用信息都是这个阶段运行的结果。如果此阶段程序意外退出,会显示 Runtime Error。如果此阶段程序运行超时,会显示 Time Limit Exceeded。

在检查阶段,会根据题目指定的方式检查运行的结果。

敬请注意:在每个阶段中,为保证评测不会影响服务器的正常运行,评测均会在沙箱里面完成(沙箱会限制文件系统、运行 CPU 数、运行时长等参数),因此环境可能和您的本地环境有所不同。

编译流程

C++ 编译流程

对于 C++ 提交,我们会使用类似下面的指令进行编译:

g++ code.cpp -o code -fmax-errors=10 -O2 -DONLINE_JUDGE -lm -std=c++20

Git 编译流程

对于 Git 编译,我们首先会使用类似下面的指令复制仓库:

git clone <repo_url> . --depth 1 --recurse-submodules --shallow-submodules --no-local

然后检查是否有 CMakeLists.txt 文件,如果则有运行(没有则会显示一条警告信息)

cmake .

最后检查是否有 GNUmakefile/makefile/Makefile 中任意一个文件(如果之前运行了 cmake,则为生成的 Makefile),如果有则运行(没有则会显示一条警告信息)

make

这个过程完成后,我们会将项目根目录的 code 文件作为编译结果。

Verilog 编译流程

对于 Verilog 编译,我们会使用类似下面的指令进行编译:

iverilog answer.v -o code

编译参数及编译器版本

请参见 关于页面

查看评测详情

在「评测详情」列表中,找到需要查看的提交,点击提交的「评测状态」或「语言」栏即可跳转到提交详情。

评测详情页面上会显示提交的代码以及每个评测点的评测详情(包括评测结果、运行时长、内存占用、文件占用、评测时的提示信息)等信息。如果有编译时的提示信息,也会显示在提交代码上方。

对于 Git 提交,为了方便助教验证提交,我们会额外记录一些信息。包括:

评测状态

Pending: 等待测试。这可能由于评测机正忙,也可能由于所有评测机均已下线。

Compiling: 正在编译。你的程序正在被评测机编译成可执行文件。

Judging: 正在测试。你的程序正在被评测机运行以检查正确性。

Accepted: 通过。你的程序正确通过全部测试点。

Aborted: 评测中断。这可能是由于你或管理员手动中断了评测,也可能是因为评测机在评测时下线。

Voided: 成绩无效。你的程序被管理员标记为无效。

Wrong Answer: 答案错误。你的程序在某个测试点输出了错误的答案。

Compile Error: 编译错误。你的程序没有通过编译。

Runtime Error: 运行时错误。你的程序在运行时发生崩溃,这可能由于数组越界、程序返回值不为 0、除以 0 等。

Time Limit Exceeded: 时间超限。你的程序没有在规定时间内得出答案,这可能由于死循环,或算法复杂度过高。

Memory Limit Exceeded: 内存超限。你的程序请求了过多的内存。

Memory Leak: 内存泄露。你的程序输出了正确的答案,但是却发生内存泄露,请检查动态内存管理。

Disk Limit Exceeded: 磁盘超限。你的程序使用了过多的磁盘空间,请检查磁盘空间管理。

Bad Problem: 题目数据错误。题目配置有误,无法完成评测,请联系助教处理。如果在上题过程中遇到此错误,请检查题目数据包。

System Error: 系统错误。评测系统在测试你的程序时出现错误,请联系管理员处理。