“商汤杯”不咕不孤比赛游记

比赛背景

比赛是商汤公司(SenseTime)冠名赞助的,主办是北邮周行算协和北大算协。据man男说出题团队似乎还挺强的(毕竟他自己的题都没过QAQ。

比赛分为北邮、北大两个赛区,其中北邮区要参加一个不知什么玩意的初赛,而北大不需要初赛(PKU确实很强)。其实感觉初赛题还行,出的也挺认真的,只不过我没太认真做了。

最有意思的应该是赛制了,有组队和匹配两种形式。每支队伍只有两人,且允许双开。我选择匹配了一位队友,幸好匹配的不是什么完全没有经验的小白,两个人可以交流一下想法。

游记

最水预赛

一开始都没注意到有这个比赛,就是舍友告诉我有这么个事且填了个报名表,之后就再也没关注这个比赛。结果到了初赛前一天,国际学院的史云天同学来加我微信,说是我的匹配队友。

我:???

然后看了一眼邮箱,发现自己收到了一份匹配信息,告诉我比赛OJ、账号以及队友的联系方式。因为当天碰巧周末我回家,比赛时间我又要去学校,于是就决定打一小会。

看题发现题目按难度顺序排布,第一题字面签到,直接输出;第二题贪心,造个结构体排个序就完事。写完之后看了一下队友开的C题,似乎是一个二分答案,于是就放心地让队友写了(他NOIp 2018 370多分)。不过后来看出题人的代码似乎比二分答案要简单的多,没仔细注意。看看排名没问题,我就下线和妈妈回学校了。全程与队友没有题目交流,真·随机匹配。

虚晃一枪的决赛

本来说决赛是2020年11月26日,结果和计导考试冲突了,直接gg,推迟一周。(我计导考试真·翻车实录,有机会再记。)

复赛推迟到12月6日早上,又是一个美好的周日被浪费了。早上上了震耳欲聋的闹钟(其实昨晚试图用腾讯云那个语音合成TTS合成一个古怪闹钟,后来觉得还是小米那个天气闹钟对我冲击力更大)。7:30终于挣扎地爬起来,滚去食堂吃了一口万年没吃过的早餐(豆浆好喝),然后去了N118。

到场后几经周折找到座位,打开OBS调各种画质最低录屏(防作弊),然后开始发呆(我发现我所有很有仪式感的考试都不太行)。开考前不到10分钟队友来了,搬出了四块砖头(刘汝佳两本、李煜东再加Sedgewick的那本橘皮《算法》),给孩子吓傻了,第一次见这样的“纸质材料”。

开场之后延续初赛和队友毫无交流的传统,胡乱看题,队友看A题看了半天胡乱敲了一个我也不知道是啥的东西又删掉了。我看C题是个树上不平等博弈问题感觉有点混乱,写了一些奇奇怪怪的东西也理不清脑子。一看榜发现一堆人过F题,于是叫上队友一起看F题。

我想了一下差分之类的东西感觉不太好弄,后来画了画图发现可以直接暴力维护个栈。队友同时也想出来了,于是我动手开写,写完发现本机直接RE,调了一下才发现STL中的栈如果为空,那么访问栈顶.top()会直接RE,而不是像数组越界返回随机值。所以写while (s.top() == (xx) && !s.empty())是无法避免栈越界爆RE的,只能提前判断。

这次多了个心眼本机多试一些极端样例,改了点小错,交上去之后一发AC。

之后我继续看C,依旧感觉脑子乱七八糟,看了看榜感觉其它题似乎也不太可写,于是就弃疗了。去看看队友在干啥,结果队友告诉我自己在写暴力。我想了想1 \leq n \leq 10^{12}这个数据范围,最理想的情况也就是O(\sqrt{n})。暴力是不可能的,看起来似乎能打表。

看榜发现除了7分钟过这道A题的PKU队以外,其它队伍都是代码30~40kB,而运行时间大多在20ms以内。而一血的队伍码量不太大,但是内存和耗时都很长,这就说明很多人打表过了这题,于是我果断接手来打表。

当时想的是,可以打一个0/1表,然后直接导到一个std::bitset里面,结果发现好家伙,std::bitset这玩意存个10^{10}都费劲,当时还探究了一下怎么直接把0/1串存到std::bitset里面。后来又思考怎么打表,算了一下发现想要筛法筛到10^{12}内存会爆;而暴力枚举需要2个小时,哪怕提前拿筛法筛出10^8也无济于事,因为后面太大了。

这个时候到了午饭时间,北邮算协的同学不停的送水和汉堡。汉堡是个相当好吃的鸡腿堡,我和队友胡吃海塞,他吃了2个我吃了3个。吃到最后算协的同学跑过来问坐在我们正后方的刘涛学长(最终第3名):“学长请问以前你们办比赛食物垃圾怎么处理?”学长乱编了几个答案送走那位同学之后感慨道“这么讲究的吗”。这次比赛的后勤保障做的还是很好的,给算协的同学点赞。

边吃汉堡边看题,折腾了半天之后,我发现可以先枚举个10^{10},这样10分钟肯定能跑出来,之后再枚举高的一位。之后由这个想法,我忽然反应过来由于满足这个性质的数很稀疏,可以直接从10^8开始,在10^{12}的表的基础上枚举下一位,然后暴力特判,这样只需要每次判断几万个数就行。于是打了三次表把表打出来了。

样例过了之后我这次依旧多了个心眼拍了几组,发现在我取数大于10^{11}的时候输出总是0。仔细检查才发现自己0的个数数错了少打了一个表,赶紧重新打了个新表,仔细拍了几组数据。提交之后心率显示一度飙升到了100+,幸好还是一发过了,这个时候排名离领奖区差了一点点。果断和队友弃疗。

比赛的过程中给每人发了两只小黄鸭,到比赛结尾的时候可以说全场都是“听取鸭声一片”,异常喜感。结束的时候发现同题目队伍也有可以领奖的,老队友谢国富一人贡献13发罚时,靠提交速度闯进了前15。可怜我虽然两次都是一发过,但是提交太晚,最后没去成商汤公司参观。队友代替一个有事的同学,成功得到参观票一张。据王泽昊说商汤的茶点似乎非常好吃,是我菜了QAQ。(要罚时没速度,要rush罚时爆炸)不过既然吃的很饱又把该过的题都一发过了,还得到了两只小黄鸭,我自己还是很开心的!

发表评论