@@ -118,7 +118,7 @@ Tags 一栏,你可以为题目添加 Tag,用于说明这个题目用在了
118118
119119![ ] ( img/create_statements.png )
120120
121- > [ !NOTE ]
121+ {: .note }
122122> 如果你需要去 Codeforces 上拉 mashup 来验题(或者是赛后要上 gym)的话,不管实际语言是什么,此处都建议选择 ` English ` 。
123123
124124Codeforces 的题目渲染存在一个奇怪特性。只要你选择的不是英文或是俄文,将题目导入 Codeforces 之后,题面数学公式将无法正常渲染。具体情况可能如图。
@@ -159,7 +159,7 @@ Polygon 也具有类似 git 的版本管理机制。虽然细节上不一定足
159159
160160![ ] ( img/modified_files.png )
161161
162- > [ !NOTE ]
162+ {: .note }
163163> 建议每做完一个阶段的修改,都进行一次 commit。
164164
165165点击右下角的 ` Commit Changes ` ,即可编辑 Commit Message 并** 正式提交** 所有的修改。
@@ -230,10 +230,12 @@ Polygon 也具有类似 git 的版本管理机制。虽然细节上不一定足
230230
231231在开始之前,我们先讲一讲 Generator 应当遵守的范式。
232232
233+ {: .highlight }
233234> Generator 可以追求一定的复用性。我们可以通过传递不同的参数,来让一个 Generator 生成多组不同的数据。
234235
235236比如可以让我们的 Generator 具有如下行为:我们用 ` ./gen-rand -n 10 ` 可以生成一组 $$ n = 10 $$ 的数据,改成 ` ./gen-rand -n 99 ` 从而生成一组 $$ n = 99 $$ 的数据。
236237
238+ {: .highlight }
237239> Generator 的行为应当是可复现的。你在任何时间、任何处理器架构、任何操作系统上,只要是同一个 Generator 和相同的参数,都应当得到相同的一组数据。
238240
239241有些输入量极大的题,单组输入数据可能动辄十几 MB,总共加起来可能要突破若干 GB。只要 Generator 的行为是可复现的,我们记下 Generator 的代码以及我们用到的参数,就相当于存下了这组数据。因为我们可以在任何时候由此将数据造出来。而造出来的数据,就属于用完就可以删的东西了。
@@ -445,6 +447,7 @@ Validator 也是一个相当重要的工具。它用于检验所有的输入数
445447
446448并且 Codeforces Authors' Polygon Rules 也推荐你这么做:
447449
450+ {: .highlight }
448451> Use array-reading functions ``` read*s(n,...) ``` instead of loops whenever possible.
449452
450453这样做除了方便还有一个好处:如果其中有数字超出了范围,testlib 会通过错误信息告诉你是第几个数超出了范围。例如如下错误信息:
@@ -455,7 +458,7 @@ FAIL Integer element a[2] equals to 1000000001, violates the range [-10^9, 10^9]
455458
456459我们很容易知道,是序列 $$ a $$ 的第 $$ 2 $$ 个数超出了范围。
457460
458- > [ !NOTE ]
461+ {: .note }
459462> 在 Validator 中,所有的不可见字符都需要显式的写上对应的读入语句,从而保证输入数据的格式是完全正确的。
460463
461464具体的,你需要用 ` inf.readEoln(); ` 语句去读换行符,用 ` inf.readSpace(); ` 去读空格,用 ` inf.readEof(); ` 去读文件结尾。
@@ -753,7 +756,7 @@ abc def hahaha
753756
754757在需要 Special Judge(也就是一个题可能有多种满足要求的输出)的题目中,我们可能需要手写自定义的 Checker 来验证选手输出的正确性。
755758
756- > [ !WARNING ]
759+ {: .warning }
757760> 永远不要信任选手程序的输出;同时,也要在编写 Checker 的时候预防好 std 可能出错的情况。
758761
759762我们依旧是使用 testlib 库进行 Checker 的编写。
@@ -855,8 +858,9 @@ int main(int argc, char *argv[]) {
855858- `ouf`:读取选手输出
856859- `ans`:读取 std 输出
857860
858- > [!NOTE]
861+ {: .note }
859862> 在 Checker 运行之前,Validator 是已经运行过的。请不要在 Checker 中对输入数据进行额外合法性检查。
863+ >
860864> 同时请不要用 `inf.readSpace` 等函数去读输入或是输出数据中的空白字符。
861865
862866比如输入数据保证 $$x \neq y$$ 的话,你正常把 x 和 y 读入进来即可,额外写 `ensuref` 判断 x 是否等于 y 是没有意义的。
@@ -876,7 +880,7 @@ Codeforces Authors' Polygon Rules 要求,自定义 Checker 必须遵循 [readA
876880- ```_wa```(WRONG_ANSWER):表示输出被判定为错误。
877881- ```_fail```(CRASHED):表示评测出错,也即 Judgement Failed。
878882
879- > [!WARNING]
883+ {: .warning }
880884> 对于多测的情况,务必记得不要提前返回 ```_ok```。
881885
882886在编写 Checker 的时候,如果出现「std 输出不合法」、「选手程序输出优于 std 输出」或者是「std 没有找到解但是选手程序找到了」等 std 出现错误的情况,请务必保证结果是 CRASHED。在大部分平台上(包括但不限于 Codeforces、DOMJudge 等),这一评测结果都会以**相当醒目**的方式通知到出题组,告诉出题组这道题出锅了。
@@ -1029,14 +1033,14 @@ int main(int argc, char *argv[]) {
10291033times: 4
10301034```
10311035
1032- > [ !WARNING ]
1036+ {: .warning }
10331037> 通过 cout 向选手程序输出内容后,也请记得刷新输出缓冲区。否则选手程序将无法读到内容。
10341038
10351039在交互题中,只要有一方没有读到对方的东西,都会触发 IDLENESS_LIMIT_EXCEEDED
10361040
10371041在 Codeforces 以及 Polygon 平台上,当交互器工作结束后,Checker 会开始工作,并检查输出数据中的内容是否符合要求。也就是说,交互器和 Checker 都有资格返回 WA,只有他们俩都顺利运行结束,结果才会是 AC。
10381042
1039- > [ !WARNING ]
1043+ {: .warning }
10401044> 为了兼容性考虑,建议将所有的判断 WA 的逻辑放在交互器内。不少平台(比如 DOMJudge)没有最后的 Checker 检查输出数据这一步。
10411045
10421046### 有关题目的其他部分
@@ -1286,10 +1290,10 @@ Polygon 还会去检验你的 Checker 是否会在奇怪刁钻输出上出错。
12861290- 运行 Generator 并产生所有输入数据,之后使用 Validator 进行检验。
12871291- 运行 std 并产生所有输出数据,之后使用 Checker 进行检验。
12881292
1289- > [ !WARNING ]
1293+ {: .warning }
12901294> 需要注意,Standard Package 产生的测试数据中,行尾标识符将全是 Windows 风格的 CRLF(也即 ``` \r\n ``` ),而非 Unix 风格的 LF(也即 ``` \n ``` )。
12911295
1292- > [ !WARNING ]
1296+ {: .warning }
12931297> 在 linux 评测环境中,``` \r\n ``` 极有可能会对正常的评测产生干扰,比如用 cin 读一个字符串的时候,额外读到一个 ``` \r ``` 。如果评测环境是 linux,并且需要使用 Standard Package 造出来的数据,请通过 ` dos2unix ` 等工具进行转换。或者使用下文提到的 Linux Package。
12941298
12951299并且需要注意,即便你是在 linux 环境中使用 doall.sh 产生所有数据,所有文件的行尾标识符也依旧会是 CRLF 而非 LF。
@@ -1381,7 +1385,7 @@ Windows Package 与上述的 Standard Package 几乎没有区别,只是把所
13811385 └── 18.a
13821386```
13831387
1384- > [ ! note]
1388+ {: . note }
13851389> 在 Linux Package 的测试数据中,所有的行尾标识符均是 LF(也即 ``` \n ``` )。
13861390
13871391# 创建比赛/题目集
@@ -1420,7 +1424,7 @@ Polygon 上的比赛可以很方便的一键导入 Codeforces。
14201424
14211425![ ] ( img/give_codeforces_read_access.png )
14221426
1423- > [ !TIP ]
1427+ {: .note }
14241428> 如果你担心把 codeforces 打错,别忘了 Polygon 的域名是 polygon.codeforces.com。你可以从这里复制。
14251429
14261430之后我们可以回到 Codeforces 本站。在 gym 页面,点击 mashup 选项,即可找到 Create new mashup 的入口。
@@ -1451,7 +1455,7 @@ Duration 按照实际需求填写即可。但是不能为空。
14511455
14521456# 构建题面 pdf
14531457
1454- > [ !NOTE ]
1458+ {: .note }
14551459> 遇到实在无法解决的问题,请考虑将 Package 下载到本地,并使用 XeLaTeX 等更加现代的引擎进行题面的构建。
14561460
14571461在 Statements 页面,有一个选项叫做 ` In PDF ` ,其作用是使用 LaTeX 构建一份该题目的 pdf 文件。
17781782\end {document}
17791783```
17801784
1781- > [ !WARNING ]
1785+ {: .warning }
17821786> 截至在本文刚写完的时候,Polygon 的题面构建功能似乎出现了一些 bug。所有涉及到改变字体指定的包(包括 CJK 和 ctex),都会导致最终产生的 PDF 出现字体问题。具体情况可以参照[ 这篇博客] ( https://codeforces.com/blog/entry/146531 ) 。对于有需要的情况,请考虑参照下文“本地构建”一章所讲的内容,本地进行构建。
17831787
17841788### lstlisting 样式
0 commit comments