出题寄(贰)

· · 个人记录

其实“序”这个字不太恰当来着?说是非作者写的才叫“序”。

文中所述比赛:FeOI Round 2

有的人可能还记得我之前写过另一篇出题寄,那一篇因为风格很奇怪被我隐藏了,私信我也不会给你看。

观前提示:除特意说明外,文章中的题号(ABCDEF)均指其所属句子所处于的时间背景下对应的题目。

不知道,反正不是我提出的,大概是因为 998244353 是个质数?

大概是 24 年 6 月提出来的?

比赛是 24 年 7 月交审的,审核是 24 年 11 月(末)来开始的😅。

:::align{center} \ A 题的评论时间 :::

一开始的题目组成大概是这样的:

A:现 A

B:现 B

C:现 C

D:这个题

E:现 D

F:【保密】

最初的审核情况是除了 D 全部过审(F 是过审了的)。

D 没过的原因是和这个题相似。(这个 D 我觉得很有意思啊😭,之前搞 Round 1 的时候也因为类似的原因被毙了)

基本上在初审之后,大部分的交流都放在 Discord 上,审核会创建一个服务器并邀请我们所有人进到这个服务器里。这个服务器里还有一个叫做 CFTestingHelpBot 的机器人,看起来是用于自动配置比赛之类的。以及后面 Tester 的反馈也是在这个服务器上发表,不过放心 Tester 并不能看到作者与审核之间的交流。

难题都搞定了,凑一个中档题还不简单?

我们也是这么想的,然后就凑了 3 个月的 D......

:::align{center} \ "status: declined" 的题目均为被拒掉的 D 题(D1B=D2D) :::

过审的题目均符合要求,但没过审的题目各有各的原因。

I'm afraid this problem might have appeared before, as its setting is very simple.

I think this problem is a bit boring and the difficulty is easier than normal div.2 D.

I'm still afraid this problem might have appeared before, actually I found a problem that is almost identical to this one, ......

以上为一部分被拒的题目的原因。

你可能会问:这里面也没有难度=D1B 的题目啊?

还真是。原本沟通是预期当 D 的题目(也就是 Vocanlic Eruption)是现 F??不过和审核沟通的时候选的是 n^2 版本。🤔

经过几个世纪(没这么快)之后,我们总算是凑出了完整的一场比赛:

A:现 A

B:现 B

C:现 C

D:现 D

E:现 F

F:【保密】(同文章开头的 F)

首先你必须知道的是,Codeforces 上的所有题目都必须要在 Polygon 上进行准备,因此必须科普一些 Polygon 上的造题流程。

对于 Polygon 中的一道题,有这些部分:

  1. General info。生成信息,用于填写题目基本信息,如题目名、输入输入文件、时空限制等。
  2. Statement。题面,但是题解也写在此处,看起来各个语言的 Statement 是独立的。
  3. Files。文件,包含题目内部的文件(题面源码、配置文件等),以及答案检查器、数据生成器、数据检验器也放在此处。
  4. Checker。答案检查器,相当于洛谷的 SPJ,即使你的答案检查方式是文本比对也需要手动选择一个程序作为 checker。
  5. Validator。数据检验器,大部分 OJ 并没有这个功能,作用是判断你生成出来的数据合不合法,因为 Codeforces 存在 hack 机制,必须用 Validator 来检验 hack 是否合法。(当然也会检测题目本身的数据)
  6. Tests。数据,值得注意的是,除了样例等很小的数据之外,会要求你手写一个或多个数据生成器+传参来制造数据。
  7. Stesses。对拍,你可以选择若干个程序,再选择一个数据生成器进行(云端)对拍,当然它会手动帮你随机种子,只要你数据生成器写法规范的话。
  8. Solution files。解法文件也就是程序,你至少把 std 上传到这里面,因为数据的输出文件都是通过 std 自动生成的,除此之外你甚至可以把不能通过的程序上传到这里。
  9. Invocations。调用(直译),可以选择若干程序和若干测试点批量查看每个程序在每个测试点上的运行结果。
  10. Issues。议题,没用过不知道干啥的。
  11. Packages。打包,将题目传到 Codefoeces 上用的。(经评论区提醒,“Codefoeces”是个 typo)
  12. Manage access。管理权限。

可以看的出来,在 Polygon 上造题还是比较麻烦的,特别是写数据生成器这一块。

不知道大家以前有没有观察过,Codeforces 题目如果有多测,那么测试点的输入部分会以各个测试数据一亮一暗的形式呈现。这个其实就是通过 Validator 实现的效果,Validator 中没读到一组新的测试数据是需要手动设置这是第几组测试数据。

造题的过程其实没什么好讲的,就是纯纯的苦力活。这里提一嘴一些和国内主流 OJ 与之前的 Codeforces 大相径庭的部分。造完题审核还会帮你 check,非常的良心(

我觉得国内的正式比赛还是很有必要按照 Polygon 这套流程搞一遍的,至少可以避免 95% 的小锅。

Testing 环节还是很有意思的。抢先体验赤石谁不想要呢。

Tester 既可以你邀请,审核员那边也会搞来很多 Tester。

Testing 的形式就是让 Tester 进行 VP(虚拟参赛),相当于假装这是一场真正的 Codeforces 去打,但是没有排行榜可以参考。VP 完之后需要反馈,比如对题目的看法,哪里有问题需要修改等。

这里选取一些 Tester 的反馈放上来。

看得出来这场比赛有亿点难,然后我们就把这里面的 F 给删了,把 E 挪到了 F 的位置并新加了一个 E。此时题目的布局和大家最终见到的版本一模一样。(事实上是新加的新 E 后扔的旧 F)

这是改完题目后的 Tester 的反馈。

我们还根据 Tester 的反馈改进了题目中的很多细节,例如在 B 题中添加了欧几里得距离的定义。甚至还把 A 和 B 的数据范围削弱了,本来 A 除了数据组数都是 10^9Bn\leq 10^5,各个点的坐标范围为 10^9

Fun Fact:在 B 题的原数据范围下 double 会被卡精度,所有 Tester 的代码均会 fst。😮

通过 Testing 其实可以看得出来 C 和 D 之间的 gap 有一点大,但是没有想到在正式比赛的时候有那么大。

虽然由于是谁我不说需要参加中考,因此我们只好把时间定在 7 月初。事实上,这个时间在不到 6 月就定了,没有这个因素的话比赛估计还能再提早个几周。

赛前几天需要把比赛公告在博客中发出来,夹带私货(你好,Codeforces!),然后在 Codeforces 首页置顶。然后就会收到评论:

Oh, Chinese round!!

PS:中文评论可能会使你的 Contribution 爆炸。

叽里咕噜一嘴,所有在 Codeforces 上的权限,如博客置顶、比赛管理等,貌似都是 KAN 给的,不知道 Mike 是不是被架空了(

大概这段时间专门分配到这场比赛的俄语翻译会把所有题目添加一份俄语题面,也就是说你不需要准备俄语题面。当然他不会帮你把中文翻译成英文?

然后就是最后的修锅阶段,主要是检查一下题面有没有写的有问题的地方。这里审核推荐我们使用 AI 辅助检查题面和题解,不得不说 AI 还是挺好用的,修了一堆 bug,审核最后也会手动帮忙检查一遍。

然鹅比赛时后三题的题面还是出锅了,不管这几题都不是我负责,我真棒!

比赛当天下午(北京时间,也就是比赛前几个小时),审核告诉我们需要在比赛时答疑问题,俄语问题会由 KAN 回答,同时如果需要发公告的话就发公告(还真发了)。

但是 7 月 5 号当天白天我们几乎都在机房里训练,直到晚上回到宿舍后才看到这条消息,也就是比赛前一小时。

在写了在写了