📖 CBOJ 用户指引

欢迎来到 CBOJ!这里整理了判题状态含义、语言注意事项、以及「代码人道主义」的放宽规则。

如果您还有要问的,或者系统出现问题,请联系管理员 CB-X2-Jun,邮箱 cbx2jun@cc.cc(不一定会看),洛谷 UID 1219707,GitHub 为 CB-X2-Jun。

我们欢迎您加入官方 QQ 群,群号 784244286。

📊 判题状态说明

你的提交会经过评测系统,最终显示以下状态之一:

Accepted (AC) — 通过:您的代码运行正常且输出了正确内容。
Wrong Answer (WA) — 答案错误:您的代码运行正常,但输出了错误的内容。
Time Limit Exceeded (TLE) — 超时:您的代码运行时长太长,超过了时限。
Memory Limit Exceeded (MLE) — 超过内存限制:您的代码占了太多内存。
Runtime Error (RE) — 运行时错误:您的代码在运行过程中出现错误,或返回码不为 0。
Compile Error (CE) — 编译错误:您的代码未通过编译。
Pending — 等待评测/评测中:您的代码正在等待后端进行评测,或者正在评测。请注意,如果长时间(>5min)保持 Pending,很可能后端出问题,请联系管理员排查。
System Error (SE) — 系统错误:这不是您的问题,而是系统出现了某些不对劲的错误。
Cancelled — 已被取消:您的提交可能存在违规行为,被管理员无效化。
Unaccepted — 未通过(WA/TLE/MLE/RE/CE/SE 的统称)

🛠️ 语言注意事项

部分语言对代码结构有特殊要求,请按照以下规范提交:

语言 要求
Java 8 / 11 / 17 / 21 类名必须是 Main,包含 public static void main(String[] args)
Kotlin JVM 必须定义顶层 fun main(args: Array<String>) 或 fun main()
Scala 必须定义 object Main { def main(args: Array[String]): Unit = ... }
Ceylon 必须使用 shared void run()
Eiffel 必须 class MAIN、create make、feature make
Erlang 必须 -module(main).、-export([start/0]).、start() -> ...
Prolog 必须定义 main 谓词,例如 :- initialization(main). main :- ...
Go 必须 package main 和 func main()
Rust 必须 fn main()
Haskell 必须 main = ...
Pascal 建议 program Main; begin ... end.(可任意命名)
Ada 建议 procedure Main is ...(可任意命名)
Fortran 建议 program main(可任意命名)
D 必须 void main()
Dart 必须 void main()
B 必须 main(),且 B 标准库不太对劲,只能使用类似 extrn printf; 的方式使用 C 标准库
Zig 入口函数:pub fn main(init: std.process.Init) !void (Zig 0.16.0 及更新版本)。
输出必须使用 std.Io.File.stdout(),例如: try std.Io.File.stdout().writeStreamingAll(init.io, "Hello, World!\n");
绝对不要使用 std.debug.print,因为它输出到 stderr,OJ 只比对 stdout,会导致 Wrong Answer。
Agda 必须定义 main : IO ⊤。Agda 通过 MAlonzo 后端编译为 Haskell 再交给 GHC 编译执行,因此有以下几处坑:

① IO 原语需要手动 postulate:Agda.Builtin.IO 只提供 IO 类型,不导出 getLine、putStrLn、_>>=_,必须自行声明并用 {-# COMPILE GHC ... #-} 绑定到 Haskell:
postulate
            getLine  : IO String
            putStrLn : String → IO ⊤
            _>>=_    : ∀ {A B : Set} → IO A → (A → IO B) → IO B
          
          {-# FOREIGN GHC import qualified Data.Text.IO as T #-}
          {-# COMPILE GHC getLine  = T.getLine #-}
          {-# COMPILE GHC putStrLn = T.putStrLn #-}
          {-# COMPILE GHC _>>=_    = \_ _ m f -> m >>= f #-}
② _>>=_ 不能直接写成 (>>=):前两个参数是隐式类型参数,必须写成 \_ _ m f -> m >>= f,否则 MAlonzo 生成的 Haskell 会因类型不匹配而编译失败(报错形如 (>>=) is applied to too few arguments)。

③ 终止检查:递归函数必须直接对归纳类型的结构子项做模式匹配(如 (x ∷ xs)),不能在递归调用里用 tailOrNil xs、headOrZero xs 这类辅助函数,否则 Agda 会报 Termination checking failed。

④ 字符串与字符:primStringToList / primStringFromList 在 Agda.Builtin.String;字符与自然数互转用 primCharToNat / primNatToChar。
Thue / Thue with l 无需特殊入口,直接提交规则 + 初始状态。规则终止行为单独一行的 ::=。
Thue:默认非确定性模式,每次随机选择可应用的规则(符合 Thue 语言原意)。
Thue with l:确定性左到右模式,同一份代码每次运行结果一致,适合调试和需要可复现的场景。
⚠️ 本实现限制:单条规则左右各最多 63 字符,规则总数最多 128 条,状态空间最多 16KB。
C / C++ int main() 或 int main(void)
C# 必须包含 class Program { static void Main(string[] args) { ... } } 或 static void Main()
F# 需包含 [<EntryPoint>] let main argv = ...,或也可以使用 printfn 等顶层代码(但建议显式入口点)
Objective-C / Objective-C++ 必须包含入口点 int main(int argc, char *argv[]) 或 int main(void),与 C/C++ 相同
Swift 无需显式 main 函数,直接写顶层代码(如 print("string xxxx"))即可。
也可以使用 @main 属性标记结构体,但 OJ 中推荐直接写顶层代码
Icon 必须 procedure main()
Scheme (Guile) 无需特殊入口,直接执行 (display "Hello, World!") 等。
R 无需特殊入口,直接执行 cat("Hello, World!\n") 等。
Forth 无需特殊入口,直接执行,但必须加上 bye 使程序即刻退出,否则会输出版权与帮助信息,导致 WA
Python 3 / PyPy3 无需特殊入口,直接执行 print 等
Ruby / PHP / Lua / Perl / Tcl / Bash 无需特殊入口,直接执行
JavaScript / TypeScript / LiveScript 无需特殊入口,直接执行 console.log 等
Brainfuck / Fish / Befunge 无需特殊入口,直接执行代码
BASIC (Yabasic) 无需特殊入口,直接执行 PRINT 等
Lisp / Common Lisp 无需特殊入口,直接执行 (format t ...) 等
Elixir 无需特殊入口,直接执行 IO.puts 等
Clojure 无需特殊入口,直接执行 (println ...) 等
Julia / Groovy 无需特殊入口,直接执行 println 等
OCaml 无需特殊入口,直接执行 print_endline 等
Nim 无需特殊入口,直接执行 echo 等
💡 提示: 如果你不确定入口点怎么写,可以参考 C1000. Hello, World! 中的示例代码。

💚 代码人道主义:放宽规则

我们理解不同语言的启动开销和运行特性不同。为了让每种语言都能公平竞技,CBOJ 为以下语言设置了更宽松的时间限制和内存限制。
以下倍率适用于所有题目,实际时限 = 题目时限 × 时间倍率,实际内存 = 题目的存限制 × 内存倍率。

语言 时间倍率 1000ms 时限 → 实际 (ms) 内存倍率 256MB 限制 → 实际 (MB)
C / C++ 1.0 1000 1 256
Pascal / Fortran / Ada / D 1.0 1000 1 256
Python 3 1.5 1500 1 256
PyPy 3 2.0 2000 1 256
Java 8 / 11 / 17 / 21 2.0 2000 5 1280
Kotlin JVM 2.0 2000 5 1280
Scala 2.0 2000 5 1280
Ceylon 2.0 2000 5 1280
Clojure 5.0 5000 5 1280
Groovy 5.0 5000 5 1280
Erlang 3.0 3000 3 768
Elixir 2.0 2000 3 768
Julia 1.5 1500 8 2048
Haskell / Agda 1.5 1500 3 768
Swift 1.2 1200 3 768
Rust / Go 1.0 1000 1 256
其他语言 1.0 1000 1 256
📌 说明: 放宽的时限和内存只影响评测判定,不会影响你在提交记录中看到的时间/内存统计。 例如,Java 在 1000ms 的题目中实际可以运行 2000ms,但记录中仍会显示真实耗时。

❓ 常见问题

Q: 为什么我的代码本地能跑,OJ 上却报错?

A: 最常见的原因是 入口点不符合要求。请对照上方的“语言注意事项”检查你的代码结构。 例如 Java 必须用 public class Main,Ceylon 必须用 shared void run()。

Q: 为什么 Erlang / Clojure 启动这么慢?

A: Erlang 的 BEAM VM 和 Clojure 的 JVM 启动本身就有较大开销。 我们已为这些语言设置了“人道主义”倍率,请放心提交。

Q: 我的提交一直在 Pending,正常吗?

A: 由于 CBOJ 的评测在 GitHub Actions 上运行,提交后可能需要排队等待 Runner 分配。 如果超过 5 分钟仍为 Pending,可能是评测机出现异常,请联系管理员。

Q: 什么是 System Error?

A: 通常表示评测系统内部出现了问题(如 GitHub Actions 触发失败、数据库写入异常等)。 如果遇到,建议稍后重新提交,或联系管理员排查。

Q: 我可以查看其他人的代码吗?

A: 你可以查看其他人的提交记录,但只能看到测试点详情,无法查看源代码。 只有你自己和管理员能看到你的完整代码。


CBOJ 是一个由爱好者维护的在线评测系统,如有问题请反馈。
本页最后更新:2026-08-25