bad round 与出题人的坚守

等你等了五千年,只为这一刹那的回眸一笑。

这句话作为台前幕后的标准开头应该是没问题的。

只不过果然还是写不出 vfk 的水平啊…写的比较散乱。而且是前后断断续续地写的,有的写于赛前,有的写于赛后,所以会有行文不连贯的地方,可能也会有后来忘记修正的地方。

前奏

(借用一下 vfk 的标题 qaq)

一切源于一篇博客。

大约是这篇这篇

看到这篇博客的时候,是去年(2018)十二月,手里正有刚刚想到的一个 idea,也就是 1C —— Pictures。

当时我自己搞了个简单的随机图片,然后脑海里就冒出了这个 idea,虽然刚想出来的时候并不会做..

然后就拿着去找 Sooke 了..

我:您有兴趣看一眼我出的一道题吗?

Sooke:我会 $2^n​$。

Sooke:想出洛谷公开赛?

我:不。

Sooke:想出 cf?

我:嗯。

翻翻消息记录发现当时自己太天真了…(2 months 都算少的)

然后我在不会做的情况下第二天写了个英文题面..

然后 Sooke 给我扔了套他出给 PJ 组的题,让我从里面挑给 Div.2,然后我挑了 2B —— Chess。一开始 Sooke 还想把它放在 2A..

ylh 想了道不错的 1A,然而后来因为树太多就换掉了..

然后 PinkRabbit 加入了团队,把 Pictures 切掉了(其实花了 2h…只不过比赛和出题还是不一样的,应该有不少人 A?)。

之后莫名想到了 2A 的 idea,只不过题面一开始不是 upvote / downvote,是幼儿园里老师给小朋友发两种类型的糖果..后来感觉出 cf 用 upvote / downvote 挺合适的。

“我们这场要有交互题!” 我在群里喊出这句话,然后没过几天我就在洗澡的时候想到了 1D —— Binary Tree。一开始我还加了个它是堆的限制,过了几个月才想到可以 BFS…树剖的做法是 Sooke 想到的,之前我差点想用我的 nsqrtn 做 std。这道题是这样的,有一棵以 $1$ 为根的二叉树,你可以询问两点间距离,在 $n\log n$ 次询问内求每个点的父亲。

然后 ylh 想了个 1B,结果最后也没有被采用 qaq

这样六道题就齐了,然而果然还是不想出 div.2 only 鸭…到处找人要题没要到(包括后来出了一题的 lk..),结果 lk 跟我说 lxl 可以出题。然后就有了 1F1E。lxl 说要自己写题面,然而一直咕了几个月都没写..

然后..当时我们的想法是出五题场,把 pictures / binary tree 放 div.1,差点都提交 proposal 了,然而我还是觉得 1B 得换..

然后,我去了雅礼集训,和 lk 面基了,就有了 1E —— GCD。一开始 GCD 是没有根号不带 log 做法的,可 lxl 问了 ccz,就有了。

然后 Sooke 出了一道 dl 的博弈论,我不太喜欢,然而一开始还是让它过了..最后还是给换了 qaq

后来 lk 出了 2C(一开始手牌和牌堆的牌不一定相等,我不会做,就改成了相等..),Sooke 拿出了 2D,这场就有了。

准备

一开始我们还想抢 round 555 的(受 vfk 250 的影响 qaq)..

给 300iq 发了个私信,问什么时候能审,能不能抢 555。然后..

一开始还以为可以的,结果发现第一条才是真的,第二条是假的..(注意 cf 私信顺序从下往上)

我们之前出题的时候就几乎把 Polygon 上要干的事干完了,然而,Aleph0(round 551 出题人)发来了一份 cf 出题须知(不知道是不是 vfk 博客里提到那个长篇英语阅读..),然后发现一堆东西要改..只不过一两天也就改完了。最大的问题是数据要么纯手造要么用 generator,即不能用数据生成器生成出来放 Polygon 上..我自己造的数据还好,lxl 的数据 generator 的参数已经弄丢了,而且lxl 又特别咕

听说 300iq 有 qq,所以就试着加了一下 300iq,拉进了群里。

然后是 300iq 开始审(gu)题(gu),题目比较顺利地全过审了,(然而断断续续的等了好几天),binary tree 获得了 “Great problem!” 的评价。得知必须放 Java 过,然而不需要让 Java 在一半时限内通过(尤指 GCD 这题,不然卡不掉带 log 做法了…),还是比较可以接受的..

300iq 好像有验不完的题和无尽的 coordinating,所以经常失踪..contribution 只排第七举报了。

决定比赛时间真是件难事..从一开始的 round 555 抢不到,到 5.18 是 APIO & 俄罗斯最后一轮国家队选拔(这俩是一个东西..),再到 5.21 ~ 5.26 得放弃 whk / sc 选手,然后 6.8 和 Google Code Jam 冲突,6 月一堆 whk 考试,7 月不仅太晚还有 ISIJ,NOI……无论选什么时间都会放弃一部分人,就像某部门决定调整某些政策一样。

最后还是端午节拯救世界..大家好像都比较同意 6.7。

从北京回来的高铁上,突然看到 Sooke 在群里“A big hug to 300iq!”

诶诶诶,上 contests 了!

诶诶诶,之前开玩笑说的 0x233 真来了!

于是想搞个什么宣传一下。

想了想感觉雀不错,就 p 了张图:

结果最后还是插进来一场 Div.2 … 0x233 没了…

lxl 自己说要写题面,咕了两个多月,终于:

然后 xht37 和神仙 rushcheyo 都来验题了。听说所有题都被 rushcheyo 秒了..

风怒

Round #0x233 开始了。

Sooke:这个 F 也是树上问距离诶。

我:好像和 WC2018 即时战略有点像?

再一看..非常冷静地在群里宣布,我们的 1D binary tree 没了。

UPD:Binary Tree 已上传至 GuOJLOJ

二叉树被替换为了操作二,剩下的部分和我们题的做法完全一样——树剖。

感觉挺难受的..赛前四天撞题谁顶得住啊。而且我自己挺喜欢这题的,感觉做法非常巧妙。而且我们的题不给出树的形态,有的做法只能过那道题,不能过我们这题。

只不过 Sooke 之前就提过 Portals 这道题,于是就想换成 Portals。

一波未平,一波又起。

cy:这个 GCD 好像和一场中国比赛有点像。

然后扔上来一篇题解,求的东西不一样,但做法大同小异。

ok,风怒撞题。

然后群里就各种方案了..

cy 扔上来了四道题..

lk:我去找 _rqy 要一道计数!

lxl:第十一分块!

于此同时,我们发现 Portals 原来想的做法是假的,给 300iq 也没能切掉..

当时有点想出五题场,或者强行把 GCD 出出来,毕竟不完全一样。

只不过好消息还是传来了,Sooke 想到了 Portals 的正解,Bug(其实我现在想换这题名字了,还是 modadd 好听)的分块做法和线段树做法也相继有了。

然后,经过讨论,我们不知道为什么觉得换题之后码量比原来减少了,结果就决定把时间改成 2h。

lk 坚持认为 portals 是一道非常难的题。cy 给 portals 的评分比 1EF 都高。最后还是放在了 1D。然后赛后被喷 PJ 题放 1D。最后每题 AC 人数还是单调下降的,说明题目顺序安排的没有任何问题。关于 cards 和 circle,我们是认为对于 div.2 选手 circle 更难,而 div.1 选手顺切无所谓,所以就这样放了。而且 circle 更简单也可能是对于中国选手。而且我们这场每个偶数题都比前一题好写。

因为 cy 把 lxl 题切了,modadd 做了比较久,而且 lxl 和 300iq 都认为 modadd 更难,而且我看了题解之后会做 lxl 题不会 modadd,所以就把 modadd 放在了 F。

于是比赛的题目得到了最终的确定,也就是大家看到的这几题。

然后就是紧张的造题了。

写 modadd 题面里的伪代码时,去网上搜了半天,终于搞出来了一份特别丑的..然后想起来 3 LGM 那场 Chinese Round 的 G 有伪代码,就去找象要,结果没要到..自己研究了半天文档还是不会,就去找 zzq 要,然后顺利要到了。

由于自己本来就菜,又被长期的睡眠不足 + 极度紧张的造题给降智,我看了半天 cy 写的 modadd 题解都不会做..然后我要在不会做的情况下造数据..就胡乱造了一点。只不过这题就算纯随机应该也够强。

本来 lxl 题的数据也是个大问题,我自己是个链菊花随机完全二叉树出题人,lxl 又是只鸽子..幸好 300iq 帮忙造了一点数据,把 Spaly(单旋)也卡掉了。

大约在比赛前 2h,基本上所有东西都造完了。然后,KAN 突然在赛前 1h 出现,删掉了一堆题面里的逗号,提了一堆题面的 Issues..然后就不停修锅,差点都忘记发 scoring distribution 了。

赛前 5min 的时候终于把 KAN 提的所有 Issues fix 了..

为了连贯性先讲了下造题的事。

然后是上帝视角..其实其它权限都没怎么用,只不过 ban 掉了 xht37 参加比赛(

只不过有的选项看着很爽,比如,一开始 problems 是空的你可以 add problems(最后是 300iq 还是谁加的,那时我还在修锅),还有喜闻乐见的 Is it rated? 选项,rated 范围,能否查看排行榜,什么时候开始封榜,能不能 vp。

赛前在造锅和修锅之余,也会盯着 registrants 看。然后就看到 JOHNKRAM 报了,司报了,xyx 报了,myy 报了,ACRush 报了,_rqy 报了,txc 报了,Radewoosh 报了,800iq 报了,dmy 报了,kcz 报了,yyb 报了,ljh 报了,wqy 报了,yww 报了……群里大约就是上文去掉逗号,加上换行符和感叹号。

最后倒计时的时候真的就像 vfk 那篇博客一样。

还有 5 秒。

题面有锅吗?

还有 4 秒。

数据有锅吗?

还有 3 秒。

题面或者数据有锅吗?

还有 2 秒。

题面和数据有锅吗?

还有 1 秒。

有锅也修不了了,contribution 见鬼去吧!

…..

没办法,赛前 5min 还在修锅的我就是这么想的..只不过最后除了 circle 的样例解释没什么锅。

比赛

比赛就这么开始了。cf 并没有卡诶。

Div.1 怎么卡住了..

完了,史上最难 1A 实锤了..

6min 的时候终于有人过了 1A,div.2 那边已经成片过 A 了。

然后第二个 div.1 AC 是 B..完了,要被喷 swap(A, B) 了。

25min 的时候有人过 1D 了。赛前我就奶过 portals 一血会比 pictures 早,lk 还不信。

然后我们就看着司登顶之后一点点地往下掉..

赛时真的可以看 system test 的结果,只不过评测优先度比较低。在 problems 界面还可以看到每题已经测了几个人的 st,其中有多少个过了。成功让 Sooke 学到了再强的 pt 也会有人 fst 这个道理。

当然我们还得回答参赛者的提问。

what mean is the draw the top card from the pile?

意思是 可以在最顶上的一张画画?

海星,是不是可以画数字上去。

In Test 1

why is the output:

2

1 1

2 1

is wrong?

I think it is legitimate.

一看评测记录,他第一行输出的 1,悲惨的故事。

问的最多的是 pictures 权值减到负怎么办..于是让 300iq 发了个 announcement。

还有一位坚称 cards 样例 3 答案是 16 的老哥,好像是在手上把牌排好序了。

Hi! I am a Chinese! Could you explain why there is a “19****17” in the sample 3?

回答分为 text,yes,no 和 no comments,正好可以回答他。

problem D in the example the edges for bad permutation are drawn incorrectly

嗯,额,诶??woc 真的画错了..打开本地造 notes 的 pptx,发现是对的..这个锅 Sooke 背了。

赶紧让 300iq 发了个 announcement,然后去修锅。

修好了之后让 300iq 发个 fixed,结果一直没发..

然后看到司在猛肝 1F..然后听群友们说,他写的是 1 log 正解,被卡常了..woc,那不是得去谢罪,卡分块把 treap 卡掉了..但我们不能做什么,只能为他默哀。后来才听说司写的 $\log^2$..

300iq:check it out,https://codeforces.com/contest/1172/submission/55260499

然后之后半个小时几乎都在尝试卡他..然而根本卡不掉..赛后私信问他,也没太看懂他的做法,只不过他说他相信这个做法是对的..

然后在迷迷糊糊的看榜,回答问题,尝试卡人中,2h 就这么过去了。

dmy 被我们送上黑红了,然而好多神仙被狙了..

1F 的英文题解还没好..contribution 要没了。

果然比赛结束 announcement 的 up 就开始往下掉,只不过没掉很多。

有位神仙 hack 了 cards,而且是 hack 了过了 st 的..之后我才发现,我之前没意识到不打空白牌可能步数比求那个 max 还大,他的 test 就是针对这个卡的,如果你发现能直接 1~n 就输出答案就过了,如果把两者取 min 就挂了。

然后开始弄中文题解。hexo 博客折叠块总是漏掉百分号,漏掉引号,搞了半个多小时才搞好..

搞了一整天,整个人都非常晕,然而这时我要尝试去写自己还不完全会的 1F 的英文题解..写到一半还是放弃了,就去发 editorial,先把 1F 空着了。

之后 300iq 同意帮忙写题解,就去睡觉了。

自我感觉 good problems, bad round。如果能不强求在原定的端午节把比赛出出来,或许能办的更好。

后记

出这场 cf,究竟是为了什么。

肯定不是为了钱。虽然 cf 会发工资,但要是为了钱,我肯定不会去出 cf,要耗费的时间精力太多了。

真的不推荐其他人在退役之前去出 cf,不然的话,可能出着出着就退役了。

把这么多本可以用来刷题的时间用来出 cf,后悔吗?

其实,也是一份宝贵的经历吧。与其说后悔,不如说害怕自己的努力不被人认可,如果数百小时的努力换来的是他人的批评甚至 unrated,可能就真的不只是后悔了。

出这场 cf,我得到了什么呢?

以往的团队合作中,我要么是作为参与者而非组织者,要么其他成员都只是默默完成自己的任务。而且所谓的“团队合作”多半是学校里所谓的“研究性学习”。要统一各方面的意见,的确是一件难事。一开始面对“fst 是 cf 灵魂”的 Sooke(看来他负责的 cards 挺有灵魂的…),然后是“我一眼就切了”和“我想不到啊”的 lk,“来道大分块啊” 的 lxl,还有自说自话,不对自己说的话里提到的概念加以定义或解释,让人根本看不懂的 cy。协调各方的意见可能是一件需要学习的事情吧。

然后的话,也是影响比较大的,我对题目和出题人的要求提升了很多。回首自己之前在洛谷的两场公开赛,第一场漏洞满篇,满屏毒瘤,第二场也有不少的问题。出了 cf 之后,不仅是自己出题变得更加规范了,对自己做的题要求也更严了。国内很多题目质量堪忧,因为题目的外在(题面、题解、数据范围、输入输出格式)而非 idea 本身过于毒瘤而不想做题的事也会发生,抱怨其他题目、比赛成了家常便饭。但回首想来,我也是从一个毒瘤大模拟、无意义 dp 出题人成长起来的。

我讨厌不用心的出题人,讨厌不严谨甚至误导人的博客,因为,我认为出题给别人做、写博客给别人看是应当对别人负责的。如果没有精力、不想负责的话,出题给自己做,博客保存在本地就好了,发出来干什么?即使是能力不够,也得有认真负责的态度才行。如果没有,别人骂你,只当骂醒好了。如果骂不醒,那着实该骂。

一道好题应该被仔细推敲过。好题应该有很强的数据,好题应该有清晰的题面,好题的标程应该优美题解应该详尽。

一道好题不应该是两道题拼在一起,一道好题会有自己的idea —— 而它应该不加过多包装地突出这个idea。

一道好题应该新颖。真正的好题,应该是能让人脑洞出新的好题的好题。

一道好题应该具有它的选拔性质,具有足够的区分度。应该至少4档部分分,让新手可以拿到分,让高手能够展示自己的实力。

—— vfk《UOJ精神之源流

当我指出其他人题目里的种种不足,当我抛开他人博客中不严谨的话语而豁然开朗大叫原文之漏洞满篇时,有没有想过他人付出的心血呢?当然有,只是我认为尊重不是基于付出,而是基于负责的态度,基于真正做了什么的。就好比你追一个女孩子,辛辛苦苦付出了那么多,如果不提升自己,如果不付出真心,别人凭什么喜欢你?

说到底,对写给别人的东西负责,是我自己的一种坚守,我自己并不是总能做到,也不是生来就能做到。但我会努力去做,无论在怎样的大环境下,我想尽我所能创造一片小小的净土。

我们所可以自慰的,想来想去,也还是所谓对于将来的希望。希望是附丽于存在的,有存在,便有希望,有希望,便是光明。如果历史家的话不是诳话,则世界上的事物可还没有因为黑暗而长存的先例。黑暗只能附丽于渐就灭亡的事物,一灭亡,黑暗也就一同灭亡了,它不永久。然而将来是永远要有的,并且总要光明起来;只要不做黑暗的附着物,为光明而灭亡,则我们一定有悠久的将来,而且一定是光明的将来。

—— 鲁迅《记谈话》(十二省联考 2019 hope 题解)

说回这场 cf,我按照 cf 出题规范去出题,一遍遍地检查,直接原因当然是 cf 是如此要求的。但我这么去做,绝不只是为了过审,而是为了上千名参赛者,我认为我有理由以认真负责的态度,准备一场好的 cf,呈现给大家 —— 当然也包括正在读着这篇博客的你。

现在我也能够体会到 vfk 当时写《UOJ精神之源流》时的心情了。执著的坚守与残酷现实的矛盾,出题人与参赛者的隔阂,心中交杂的歉意与不甘……无论这场 cf 是否让你满意,我想,我做到了我应该做的,仍然走在自己一直坚持的那条路上。

尽管发生了一些意外,或许这场 cf 并不让你满意,但我认为,I did my best.

附:cf 出题须知

after 后记

CF 的工资大约咕了一个月。

付款方式千万不要选 PayPal。