常见问题及解答

NFLSOJ 是一个基于 UOJ 的在线评测网站。

这里是开发日志。欢迎大家对 OJ 开发提出建设性建议!(更欢迎你来亲手实现你的想法!)

评测机的操作系统是 Ubuntu Linux 14.04 LTS x64

C++ 的编译器是 g++ 7.2.0,编译命令:g++ code.cpp -std=c++03 -o code -lm -O2 -DONLINE_JUDGE。如果选择 C++11-std=c++03 会变为 -std=c++11C++14C++17 类似。

C 的编译器是 gcc 7.2.0,编译命令:gcc code.c -std=c90 -o code -lm -O2 -DONLINE_JUDGE。如果选择 C11-std=c90 会变为 -std=c11

Pascal 的编译器是 fpc 2.6.2,编译命令:fpc code.pas -O2

Java7JDK 版本是 jdk-7u80,编译命令:javac code.java

Java8JDK 版本是 jdk-8u144,编译命令:javac code.java

Python 会先编译为优化过的字节码 .pyo 文件。支持的 Python 版本分别为 2.7.63.4.3

FreeBASIC 的编译器版本是 fbc 1.05.0,编译命令:fbc -b code.bas -x code -O 2 -d ONLINE_JUDGE

NFLSOJ 目前暂时不提供头像存储服务。你可以使用 Gravatar。Gravatar 是一个全球的头像存储服务。在 Gravatar 上传头像后,你的头像将会与你的电子邮箱绑定,可以在不同的网站上使用。支持 Gravatar 的网站包括各种 Wordpress 网站和许多 OJ,比如 UOJ 和 vjudge。在这些网站上,只要你的电子邮箱填对了,那么你的头像也就能立刻显示了。

Gravatar 地址:https://cn.gravatar.com/

Accepted 答案正确。恭喜你通过了这道题。
Wrong Answer 答案错误。仅仅通过样例数据的测试并不一定是正确答案,一定还有你没想到的地方。
Runtime Error 运行时错误。像非法的内存访问,数组越界,调用禁用的系统函数都可能出现这类问题,请点击评测详情获得输出。
Time Limit Exceeded 时间超限。请检查程序是否有死循环,或者应该有更快的算法。
Memory Limit Exceeded 内存超限。数组开太大了,或者可能有内存泄露。
Output Limit Exceeded 输出超限。你的输出居然比正确答案长了两倍!
Dangerous Syscalls 危险系统调用。如果该语言支持正确,你可能忘删了文件输入输出,或者想要 hack OJ。
Judgement Failed 评测失败。多半是出题人或者 OJ 管理员的锅。
No Comment 没有评论。评测机对您的程序无话可说。

NFLSOJ 的赛制与真实的赛制基本一致,也许有一些细微的差异。

不同的赛制决定了选手是否有以下权限:

赛制名称 测试全部数据 1 显示排行榜 2 可以 Hack 3
OI
IOI
UOJ
ICPC
CF
  • 1 ^ 在比赛中提交了一道题的程序后,选手会即时看到评测结果。如果赛制测试全部数据,选手就能看到这次提交每个测试点的真实情况和真实分数;否则选手在比赛期间只能看到样例测试的结果。
  • 2 ^ 如果赛制允许显示排行榜,比赛时选手可以看到实时的排行榜,以及其他选手的提交记录;否则选手在比赛期间只能看到自己的分数。
  • 3 ^ 如果赛制允许 Hack 其他选手的代码,选手可以 AC 某道题后,锁定这道题,之后就可以 Hack 其他选手的满分代码。锁定某道题之后选手无法继续提交这道题。

没有特别的限制。准确来说,栈空间限制与总的空间限制是一样的。如果你在本机上大数据 RE,OJ 上 AC 可能是这个原因。

这也意味着 OJ 上的自定义测试可以测试一些在本机上可能爆栈的数据。你也可以手动开栈:

  • 若本机是 Windows 系统,可以在编译命令中加入 -Wl,--stack=你想要的栈大小 (单位为字节)即可。
  • 若本机是 Linux 系统,可以在终端中输入 ulimit -s 你想要的栈大小(单位为 KB),那么在这个终端中运行的程序的栈空间限制就都会变成你设置的那样。(但是这里设置的栈空间不能太大,可以输入命令 ulimit -Hs 查看最多能够允许的大小;同时也可以在 /etc/profile 最后也加上这句话,这样就不用每次都用命令改变了)

对于这类问题,我们在这里简单列一下可能原因:

  • 评测机系统是 Linux,如果使用 scanfprintf 请用 %lld(而不是 %I64d)读取或输出 64 位整数。
  • Linux 中换行符是 \nWindows 中是 \r\n。有些数据在 Windows 下生成,而 NFLSOJ 评测环境为 Linux 系统。这种情况在字符串输入中非常常见。
  • 评测系统建立在 Linux 下,可能由于使用了 Linux 的系统定义的函数或变量而出现 CE,但在 Windows 下正常。
  • Linux 对内存的访问控制更为严格,因此在 Windows 上可能正常运行的无效指针或数组下标访问越界,在评测系统上无法运行。
  • 严重的内存泄露的问题很可能会引起系统的保护模块杀死你的进程。因此,凡是使用 malloc(或 callocreallocnew 等)分配的内存空间,请使用 free(或 delete)完全释放。
  • 为了防止一些奇怪的操(yōu)作(huà),我们禁掉了以下字符串(仅对 C/C++ 生效):pragma _Pragma __attribute__ optimize asm __asm__ __asm。这些字符串只要作为一个完整的词出现,就会触发编译错误(哪怕出现在注释和字符串中也算)。
  • 当然数据可能真的有问题。但是如果不止一个人通过了这道题,那最好不要怀疑是数据的锅。反之,可以立即联系我们上报!

交互式的题一般给了一个头文件要你 include 进来,以及一个实现接口的源文件 grader。好像大家对多个源文件一起编译还不太熟悉。

对于 C++g++ -o code grader.cpp code.cpp

对于 C 语言:gcc -o code grader.c code.c

如果你是悲催的电脑盲,实在不会折腾没关系!你可以把 grader 的文件内容完整地粘贴到你的 code 的 include 语句之后,就可以了!

什么你是 Pascal 选手?一般来说都会给个 grader,你需要写一个 Pascal 单元。这个 grader 会使用你的单元。所以你只需要把源文件取名为单元名 + .pas,然后:

对于 Pascal 语言:fpc grader.pas

就可以啦!

NFLSOJ博客使用的是 Markdown,基于marked.js

大家可以阅读这篇文章学习简单的 Markdown 语法。

当然,你也可以直接插入 HTML

如果不想学 Markdown,直接写文本也是可以的,不过注意换行需要两个回车。

如果你想出题、想办比赛、发现了 bug 或者对网站有什么建议,可以通过下面的方式联系我们:

  • 私信联系root。
  • 下面的邮箱地址暂时是假的→_→。可以联系 2915154295@qq.comdaiyan2003@126.com

  • 邮件联系root@acm.nflsoj.com。
  • 你也可以进 QQ 群水水,群号是611469647。