查看、提交及评测题目
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 提交,为了方便助教验证提交,我们会额外记录一些信息。包括:
- 参与评测的提交所对应的 commit hash,助教可以根据这个 commit hash 找到对应的提交;
- 如果在编译过程中没有使用 cmake 或 make,则分别会显示一条警告信息。(具体请见 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: 系统错误。评测系统在测试你的程序时出现错误,请联系管理员处理。