竞赛说明与规则
参赛资格与参与方式
欢迎所有人参加美国计算机奥林匹克竞赛(USACO)的线上竞赛和培训。只有美国的中学生才有资格入选 USACO 训练营的决赛选手,并角逐美国国际信息学奥林匹克竞赛(IOI)或欧洲信息学奥林匹克竞赛(EGOI)代表队的成员资格。
所有新参赛者都从青铜级别开始,在当前级别中表现特别出色的参赛者将晋升到下一级别参加后续竞赛(晋升标准因每场竞赛而异,因为每场竞赛都有所不同)。请在所有竞赛中使用相同的登录 ID,以便我们跟踪每个人的进展。晋升是永久性的,即使跨赛季也是如此。例如,一旦你从白银级别晋升到黄金级别,就无需再参加白银级别的竞赛。
参赛无需任何费用。
竞赛形式
每场竞赛通常有 3 或 4 道题目,你需要用 C、C++、Java 或 Python 语言提交解决方案程序。我们经常被问到学习哪种语言“最好”——鉴于 C++ 是国际信息学奥林匹克竞赛(IOI)唯一支持的语言,一旦你达到较高级别,显然 C++ 是最佳选择。我们也支持 Java 和 Python,以扩大竞赛的参与范围,因为这两种语言也非常受欢迎,尤其在解决低级别的问题时使用它们是完全合理的。
题目本质上是算法类的,因此可能需要巧妙的算法和/或数据结构才能在时间限制内正确解决所有测试用例。你每道题目的得分取决于你的程序在时间限制内能够解决的输入用例数量(对于大多数竞赛,C 和 C++ 每个输入用例的时间限制为 2 秒,Java 和 Python 每个输入用例的时间限制为 4 秒,不过每场竞赛或每道题目可能会使用略有不同的限制)。所有题目描述都力求直白,不会故意设置“隐藏陷阱”(不过要注意,合法但复杂的数据集可用于测试)。题目具有一定挑战性,很少会出现大量参赛者获得接近满分的情况!
竞赛时长通常为 4 - 5 个小时。你可以在整个竞赛开放时间段内选择任意时间段参加竞赛。当你开始竞赛时,个人计时器开始倒计时,你可以通过本网站查看竞赛题目并提交解决方案。
当你提交程序时,它将针对多个评测测试用例运行,对于每个测试用例,你将收到反馈,反馈显示在彩色框中:绿色表示正确,红色表示错误。错误提交会根据问题类型进一步区分:X(答案错误)、T(超出时间限制)、!(运行时错误或超出内存限制)、E(输出文件为空)或 M(缺少输出文件)。
如果你的程序编译失败,将显示编译器的错误信息。第一个测试用例通常与题目描述中给出的样例用例相同,你需要正确解决该用例后才能获得其余用例的反馈(竞赛期间不会公布其余用例,尽管你会收到是否解决这些用例的反馈)。评委保留在竞赛结束后添加或删除测试用例的权利,因此即使你的程序在竞赛期间通过了所有用例,仍然值得对其进行测试。
如果你在竞赛中获得满分,你将获得“竞赛内晋升”资格;
否则,竞赛结束后,所有得分高于该场竞赛晋升阈值的参赛者将获得晋升。如果你获得竞赛内晋升,你可以在整个竞赛开放时间段内的任何时间开始参加下一场竞赛,并且拥有完整的计时时间;也就是说,你在上一场竞赛中花费的时间不会影响你参加下一场竞赛的可用时间。
竞赛的官方语言是英语,不过为了方便国际参赛者,我们会尽量将题目集翻译成其他几种语言。如果翻译版本之间存在分歧,应以英语版本为准。
竞赛行为与学术诚信
USACO 非常重视学术诚信,并采取了严格的政策来确保竞赛的公正性:
- 独立完成,不得团队协作。
- 禁止使用生成式人工智能(如 Copilot 或 ChatGPT 等服务)。
- 美国学生在竞赛期间不得使用虚拟专用网络(VPN)或相关技术来隐藏自己的 IP 地址(即你的 IP 地址应该是你学校或家庭互联网服务提供商的地址)。
- 禁止与竞赛负责人以外的人讨论竞赛题目。
- 竞赛进行期间,不得分享任何与竞赛相关的技术信息或代码。
- USACO 竞赛环境旨在模拟国际信息学奥林匹克竞赛的环境,所有代码必须从头编写,你只能参考描述你所使用编程语言语法或库函数的资料。因此,你不得使用预先编写好的代码或“模板”来快速开始编程,也不得参考除提供编程语言基本功能(如语法、库函数、输入/输出等)信息之外的资源。
- 不得使用多个登录 ID。账户中不得使用无效信息(如无效的姓名、毕业年份或国家)。
- 不得提交对评测机器有恶意行为的代码(即不得尝试打开网络连接、故意拖慢评测机器等)。评测环境会监控活动和系统调用以防止违规行为。代码必须通过 usaco.org 网站的界面提交(即选择你的文件并点击“提交解决方案”);禁止尝试通过其他方式(如试图自动化此过程的脚本)提交。
违反上述任何政策的参赛者将被终身禁止参加所有 USACO 活动。请勿作弊——没有第二次机会!(实际上,在 USACO 竞赛中作弊对你没有任何好处;诚实地尝试解决问题,你能学到更多东西!)我们经常会就作弊行为联系学生的老师或校长;过去曾有学生因此被开除,所以要知道作弊的后果可能不仅仅是不能参加 USACO 竞赛。如果大学或其他项目询问被取消资格的参赛者的 USACO 参赛情况,我们会如实告知。
一般技术细节
- 你的程序大小必须小于 100,000 字节,且必须在 30 秒内编译完成。除非另有说明,你的程序总内存使用量将限制在约 256MB。在评测服务器上出现“运行时错误”,但在你本地机器上没有出现,一个常见原因是分配了过多内存。
- 不要提交打开与当前竞赛任务无关的数据文件的程序。只能读取题目指定的输入文件,并只向指定的输出文件写入内容。不要使用“临时”数据文件。
- 除非另有说明,程序必须具有确定性,对于相同的输入,每次运行都应产生相同的答案。非确定性的程序可能会被取消资格。请注意,基于随机数的程序仍然可以提交——它们应该使用固定的随机数种子,以便每次运行都能得到相同的答案。
- 除非另有说明,不能保证所有可能的合法数据集都能在时间限制内完美解决(例如,我们可能会给出一个需要接近最优解的任务,并给予部分分数)。对于某些题目(特别是较高级别),由于 Python 运行速度较慢,可能无法在规定的运行时间内解决所有输入。我们通常会尽量确保所有题目都能在 C/C++/Java 中完全解决,并且所有青铜级别的题目也能在 Python 中完全解决。
- 尽管我们通常设计的题目数值答案可以用标准的 32 位整数表示,但不能保证一定如此。如果需要使用更大的数据类型(如 64 位整数),我们通常会在题目描述中注明,以方便你,但最终你有责任判断何时需要使用这些类型。
- 本质上只是由打印语句组成的程序可能会被取消资格。如果竞赛期间提供了某些测试用例的反馈,你不得重复提交本质上只是打印语句的程序,以逆向推导输入。程序必须实际计算所需的答案,而不是仅仅从预计算的查找表中打印结果。
- 程序不得暂停并等待按键输入。例如,如果你在代码中调用 system(“pause”),评测环境可能会因等待不存在的按键输入而超时,返回类似“输出文件为空”的错误。
- 过去 USACO 竞赛和培训系统中使用的标题(如 PROB: 和 LANG:)不再需要。相反,提交代码时,请务必从下拉框中为你的程序选择正确的语言。
- 对于编译型语言,你无需消除所有编译器警告。当然,编译器错误会导致你的提交无法进行评测。
- 一些程序——特别是 2020 年 12 月竞赛之前的大多数任务的解决方案——会从题目描述中指定的文件(如
cow.in
)读取输入。如果你使用文件输入,在open
语句中不要指定完整的路径名,只需写cow.in
。请注意,文件名区分大小写。如果题目中说cow.in
,那么你必须使用cow.in
,因为CoW.In
和COW.IN
是不行的。一些程序会将输出写入题目描述中指定的文件(如cow.out
);在open
语句中不要指定路径名,只需写cow.out
。和输入文件名一样,输出文件名也区分大小写。如果一个题目使用文件输入/输出,那么写入标准输出(stdout)或标准错误输出(stderr)的内容将不会被评测。请注意,从 2020 年 12 月的竞赛开始,输入和输出从基于文件的方式改为基于终端的方式,使用标准输入和标准输出(如 C++ 中的 cin 和 cout)。题目的输入和输出说明会指定使用哪种模式。 - 几乎每个程序的输出都是“行”的形式。由于这是一个 UNIX 环境,所有输入/输出文件中的行都以单个换行符
\n
结尾,而不是回车符加换行符\r\n
(尽管设计良好的程序通常不应关心使用哪种约定)。如果你的输出每行末尾没有换行符,可能会被判定为错误。请注意,输入文件和输出文件的最后一行也应以换行符\n
结尾——这是常见的错误来源:如果你在本地测试代码,请确保输入文件的最后一行以\n
结尾,特别是当你使用 Python 等语言中的 split(“\n”) 来分隔各行时。这可能是我们收到“在我的系统上运行正常,但在竞赛服务器上不行”这类邮件的首要原因。 - 对于一些输入规模较大的较高级题目,参赛者使用快速输入/输出可能会更有助于在时间限制内通过。对于 C++ 用户,如果你使用 cin/cout,可能需要在主函数顶部添加:
ios::sync_with_stdio(false);
cin.tie(0);
对于 Java 用户,可能需要使用 BufferedReader 而不是 Scanner。
- 如果你针对同一道题目多次提交解决方案,只有最后一次提交的会被评测。这意味着如果你在提交后发现错误,可以重新提交。重新提交没有惩罚(不过请合理控制重新提交的频率,以减轻服务器负担)。当然,一旦你的计时时间结束,就不能再提交解决方案了。
- 评委保留在评测过程中增加时间限制或添加/删除测试用例以得出最终结果的权利。
- 评委的决定为最终决定。
特定语言技术细节
- C/C++ 程序员:程序使用 gcc/g++ 7.5.0 编译,使用
“-O2” 优化标志和 “-lm” 来访问数学库
,使用 “-std=c++11” 或 “-std=c++17” 来支持 C++11 或 C++17。整数类型(int)为 32 位;如果需要 64 位整数,使用 “long long”。使用 C 风格的输入/输出(如 scanf、printf)读写 long long 变量时,使用 “%lld” 格式字符串。
- Java 程序员:程序使用 OpenJDK 运行环境 11.0.10 进行编译和执行。你必须将整个程序提交在一个文件中,并且这个文件必须有且只有一个与文件名相同的公共类(例如,如果你的文件名为 “MyFile.java”,那么它应该包含 “public class MyFile”)。这个类需要有你的公共静态主函数(public static void main)。文件中的所有其他类都不应使用 “public” 标签定义(例如,定义为 “class MyOtherClass”)。源代码中不要包含 “package” 行。
- Python 程序员:我们同时提供 Python 2.7.17 和 Python 3.6.9 版本;提交时请务必选择正确的版本,因为为一个版本开发的程序通常不能在另一个版本中正常运行(使用 “python –version” 检查你本地 Python 解释器的版本)。请注意,由于 Python 运行速度较慢,即使为 Python 提交的程序增加了时间限制,我们也不能总是保证能够解决某些题目中的最大测试用例(我们会尽力设计竞赛,让 Python 程序员也能参与,特别是在较低级别,但当你晋升到较高级别时,运行时间变得更加关键,你可能最终需要考虑学习一种更快的语言)。执行时会使用 “-O” 标志来启用一些优化。
请注意,Pascal 支持已停止。
问题澄清与联系竞赛组织者
如果你发现题目表述不佳或存在歧义,可以发邮件给竞赛组织者 Brian Dean(bcdean@clemson.edu)请求澄清;你可能只会收到“请更仔细地阅读题目”这样的回复,但有价值的重要澄清信息会发布在竞赛页面上。如果你给 Dean 博士发关于竞赛的邮件,请确保邮件主题包含 “USACO” 一词。另外,请注意他使用美国东部时间,在这个时间段内你更有可能得到及时回复。
引用
[[1] 原文地址]: https://usaco.org/index.php?page=instructions