毛啸IOI2017参赛总结2018-09-28 17:14:16阅读量:4233

 
 

在这篇文章中,我将从非比赛和比赛两个方面总结此次IOI的经历。

这次IOI除去比赛之外的部分还是非常顺利的,这次比赛的地点是在伊朗首都德黑兰,时间是在728日到84日,也就是夏天,整个比赛过程中没见过一滴雨,气温也是相当的热,好在大部分时间都待在空调房里面。伊朗的伙食还算符合胃口,有米饭,虽然米饭的做法与中国的完全不一样,但足以让我们感到宾至如归。德黑兰有很多山,但是山上不见任何绿色植物,因为整个伊朗基本都是沙漠。

伊朗的一个特殊之处在于它是一个政教合一的穆斯林国家,因此基本所有当地人都是穆斯林,妇女被要求裹头巾,男性也不要露膝盖。在伊朗的厕所里面没有小便器,只有蹲坑(蹲坑里面还有为穆斯林特殊准备的喷头),因此男厕所和女厕所一样也经常排队。伊朗的领导人非常受尊敬,到处都有领导人照片。

伊朗的基础设施相对中国来说落后,德黑兰的机场和国内的相形见绌,整个机场非常小,热闹程度也是门可罗雀。很容易就找到了参加IOI的选手和迎接我们的领队。

这次我们的guide相当的友好,英文水平非常高,我感觉他基本就是母语水平,我们成为了相当好的朋友,我回去之后他还给我写了一封信。

在伊朗的中间几天我们去了不少地方,自然方面我们参观了bird gardern,人文方面我们参观了Milad Tower,在塔上一览美不胜收的德黑兰全景,出来的时候我们还去了一个纪念品店,伊朗的各种特产琳琅满目、目不暇接。我们也参观了Planetarium,我发现伊朗的卫星水平相当的高,

这次伊朗的主办方也是非常重视这次比赛,每次我们出行前面都有警车开道。闭幕式在一个据说是国家领导人开会的会堂里举行,外面的国旗包罗万象,里面也是相当宏伟,巨大的穹顶,庞大的主席台,真是一个富丽堂皇的宫殿,我们进去都要安检。闭幕式的时候伊朗副总统都来发言了。总之,我们可以说是享受了贵宾级别的待遇。

我与其他国家的选手的交流也不少,我与伊朗的Arash Mahmoudian之前就认识很久,他是去年IOI的金牌,我们IOI上的交流当然也不少,在第二天比赛出来结果已经盖棺定论之后,我们都没有拿到金牌,当时我饭都吃不下去,就和他聊天聊了很久心情才稳定下来。试机赛的时候我遇到了俄罗斯的EndagorionEndagorion不是参赛选手,他是一个CodeforcesTopcoder上都很有名的人物,我和他聊了几句。我们从bird garden回来的时候坐车,旁边坐着几个越南的,我们交流了很久,一个越南选手称我是他们的偶像,当然他们是夸大其词(最后说这句话的人拿了金牌,而我只拿了银牌,命运真是有趣),我和他说起我认识的他们的一个学长,然后我们便开始聊起他们那边一般怎么读大学,越南不像中国有清华北大,他们厉害的人基本都去了新加坡这些地方。我们车上还有一个丹麦的女选手,我们也与她有很多交流。与会说中文的选手和老师交流就更多了,我和Richard Peng(彭泱)就有很多交流,我和台湾队的交流就更多了,在最后两天我和台湾的几个选手去四楼玩棋牌,同时也遇到了几个丹麦选手,我们玩了很多有趣的游戏,比如一个可以旋转九宫格的五子棋。此外我懂得一点法语和西班牙语,我还特意与几个这些语言为母语的人有过交流,虽然最后基本一句话也说不出来,遗憾的是并没有外国选手与我们交流中文。

虽然这些经历都很愉快,但是想要弥补我比赛失误造成的不愉快依然是杯水车薪。作为一个在Codeforces上被预测冠军次数比真正的冠军还要多的选手,我最后只获得了银牌,这大概是除了上帝以外,没有第二个人想过的结果。

那么先讲下我比赛的经历吧。

在比赛前,我就关注到了日本的选手yutaka1999,当时他除了atcoder比我高之外,在CodeforcesTopcoderrating都比我低不少,在atcoder上他是前十,我Codeforces保持过很久的世界第四,但是在IOI前不久几次不幸的经历让我直接丢掉几百的rating,到比赛前不久,yutaka1999Codeforces上成功把我反超,当然我的Topcoderrating一直都在IOI选手中遥遥领先。然而在IOI前不久,yutaka1999拿了IMO的第一名,这使我IOI打败他的意愿更强了。

这使得不论是我的同学和学长,还是国际上的很多人,都对我有很好的期望。王宏教授在CTSC之后也和我说过:今年就指望你了

除了这些外部的指标和前瞻,我自己对自己的能力也有基本的认识,我深知我写代码非常容易出错,经常调错调半天,但是基本上不存在题目不会做,所有题目想一想都是会做的,IOI时间是五个小时,不存在时间问题。现在想想,这个认识当时无非就是两个问题,一是忽视了速度问题,认为五小时等于无限,而是没有发现自己不仅是写代码,在想题的过程中就容易出问题,这两个问题深深的影响了我的考试发挥。

我赛前也是非常的自信,基本满脑子想的都是我冠军或者yutaka冠军我亚军,可以说是非常的自信。

当然读者可能不太清楚IOI赛制,IOI赛制大概就是选手做完题可以提交看到自己的最终结果,但是选手不能看排行榜,外面的人却能看。全国选手一起看排行榜这件事,当然也对我的心态产生了或多或少的影响。

第一试比赛刚进去的时候,满脑子想的都是快点拿100分。出乎我的意料,第一题居然是一个提交答案题,那就先跳过吧。第二题看起来很可做,第三题看起来是一个博弈题,等我把第二题做了,再来想。

第二题初一看就是一个贪心,nm相等的时候直接连过去就行了,我看了下有没有nm相等的部分分,居然没有,我觉得很奇怪,但也没有管了。直接连过去等价于前缀和之后绝对值加起来,这样nm不相等大概就是维护绝对值的和,贪心复制元素使得和减少。我当时抱着求稳的心态,先写了个暴力,结果居然拿了0分,我当时觉得很不可思议,为什么暴力会错,我查了一遍代码没有错,然后开始造极限数据发现答案看起来很正常。

这个时候我犯了一个严重的错误:抱着希望自己算法是对的心态去查错。我当时就希望发现变量打反打错,少打一句话这种平时经常出现的问题,然而搞了很久都没有发现,然后我发现n略小于m的数据答案比把同样规模的n等于m的答案要小很多,但是却完全不知道为什么。

然而,这个时候我居然还是没有查出错,只好开始写个函数对拍,拍完之后才发现我结论是错的。我快速拿满分的目标彻底泡汤了,而且我把一个想一分钟就能发现的错误活生生用机械方法查了一个小时。

这个时候我心态还没算太崩,我至少发现这题不是一个简单题,这样如果能拿满分更能证明我的水平,但是的确时间不多了,必须快点想到算法。

于是我想了一会儿便开始用一个看起来很高级的做法,每次连一个点或者换一个点,然后判一下度数,我觉得因为直接做费用流是对的,那么一步一步做费用流就是对的,于是可以这样做了。

当时我心态显然没有前面好了,犯了很多小错误,踉踉跄跄的把代码改对之后,终于发现自己算法的问题了,的确一步一步做费用流是对的,但是这并不意味着每次换一个点,可能换多个,而这个问题我想都没想过,如果想过的话,我显然马上发现这个做法的问题。

这下我更急了,我想,既然每次可以换多个点,那我就不显式的换,而是维护一下差分,每次改变差分,后来我的确实现了一个不会产生错误的做法,但是这个时候我发现这个做法没有任何办法优化成可以通过满分的做法,我等于花了这么长时间又写了一个暴力做法。

这个时候只剩下两个小时,而我只有一个暴力分,我当时已经不知道做什么了,想先拿点暴力分肯定没错,说不定大家都只有暴力分。我马上写了第二题第二档暴力分,然后开始看第三档,却不知道这样设置部分分意义何在,我思考了下这个部分分的意义,然后结合前一档部分分,居然会标算了。现在想想,当时早点想部分分,多好。

然后我踉踉跄跄的写完,然后还错了几次才获得满分,这个时候还剩一个小时,我想一个小时丢下一整道传统题不做去做提答题肯定不划算,于是我看了看第三题,推了推发现好像能做,当时顾不得去证明什么的了,随便想了想觉得没错就写了,想着反正这么多部分分,怎么样都能拿点,顺利的话,如果回去做第一题,两百多分还可能是不错的成绩,而且既然我做了这么久,说不定我第二题是唯一一个或者少数几个获得满分的选手呢。

第三题的样例基本上等于没有,我全程从来没有错过样例,但是我一直是0分,我想了想为什么第一个过不了,发现我做法还要打几个补丁。

然而令我没有想到的是,我全程一个subtask都过不了,全是0分,我顿时变得无比焦急,这个时候,回去做第一题肯定来不及了,我赶紧写了个第一个subtask的暴力,结果我对拍都来不及,交了一个暴力上去结果都来不及看,最后几秒钟改了我标算程序的几个错,然后交上去,悻悻离场,我当时还抱着最后一个程序奇迹获得满分的希望,当然最后这个希望也破灭了。

令我没有想到的是,第二题满分一大堆,而yutaka居然有280多分,我看到这个结果差点要哭出来,本来以为是我和他争冠军,结果第一天结束直接成了他一个人的游戏。

第一题居然随便90分,不做第一题真是大失策。

下午调了调第三题,发现我很神经的写错了几个地方,改完之后立即多了不少分,后来想了想发现我算法是错的,这么一说我整个第一天基本只有一个小时在做有用功,写第二题的满分和第三题那个第一个subtask的暴力。

我当时便开始思考人生,到底是什么问题呢,我做提答,万一提答像CTSC2015那样只能拿几分呢,当年金策同学就是两个传统都不会还在提答上浪费时间,最后提答获得两分,传统题还只有15分,导致总分只有17分,2015年我去浙江省选,直接第三题获得满分,无论其他人提答题怎么挣扎,都完全无法超过我的分数。冬令营我很不喜欢提答题,提答题分数非常低,冬令营之后算总分我依然是第一名。NOI2016第二天我做的多好,按部就班的做完两个传统,再完全放下传统一个一个点做提答题,最后守住了冠军。

而在传统题满分上用掉很多时间虽然很危险,但我从来没出过事情,NOI2016第一天我两个小时才做完第一题满分,而别人10分钟95分,我最后第一天依然是满分,而别人没有一个满分。NOI2017的同步赛的第二天,我第一题和第二题加起来浪费了四个多小时,最后还不是都做完了,还有时间把第三题的暴力也写了。

而要说我真正出问题的一次,还是我集训队互测的第一场,我在汪乐平的题上浪费了三个多小时,最后去做赵晟宇的题,却一直没有做出来,而那题我还有35分。那次我对自己的总结是应该写快一点,就可以拿到200分,200分在当时就是第一名了。

所以我到底主要是策略问题,还是能力问题,还是完全是运气?我感觉非常难受,在反复的思考中渐渐疲倦了。

后来我知道了第三题的做法,还是比较妙的,仔细想想我在平时还是可能想得到的,但是当时人非常急显然不太可能想得到。

虽然第三题的做法确实比较好玩,可惜我无心品味。

没事没事,还有二试。

我付出的汗水不会欺骗我。

仔细想想,自己那么多年NOI以及省选都翻盘了,没有一次没翻得了,我的OI生涯没有一块银牌,除了最初什么都不会的时候拿的铜牌,其他都是金牌,NOI去现场拿的也都是金牌,金牌我也有两种拿法,一试下来直接稳了,或者二试成功翻盘。自己大概生来就是这两种结局的命,所以当时口头上和杨家齐同学说我要打银牌了,其实内心还是觉得很有希望的。

我想起了我NOI2015 day2前对自己说的话:第二试就当第一试没考,最后二试成功翻盘。那么我IOI也这么打吧。

于是我仔细想想,反正现在拿第一名也不可能了,既然我CodeforcesTopcoder综合水平全场第一,那么只要我发挥正常,单场比赛第一名问题应该不大。于是我想着二试拿单场第一名。

于是二试进场之后,飞快的在第一题上拿到了99.71分,然后很快想到了第二题的做法,好像可以按叶子一层一层往上剥。

今天这么顺利,看起来很可能拿满分啊。我当时这么想。

然后发现我第二题一直当完全图在想,马上又变得没思路起来。

我想了想,发现好像dfs一棵生成树,然后按dfs序确定就行了,确定的时候可以二分就是log的。

啪啪啪开始打第二题,结果发现一个问题,我需要知道没有边的答案才能二分,这不就是个细节嘛,稍微处理下就行了。

然而,事实证明处理这个细节不简单,我想了很久都不会。Eureka!这不是dfs树嘛,那就没有横叉边咯!我马上有一个麻烦的做法,找一个连通块,和下面肯定有连边,如果和一个点有多条连边那么不可能都在答案中,直接确定,否则的话我可以做到每个点最多询问一次,也是线性的。

看起来好麻烦,我想了想能不能转化成更简单的做法,花了不少时间很遗憾的发现并不能。

于是咬咬牙开始写,写完发现已经没有多少时间了。

我从没想到写完第二题居然过了这么久。

那么接下来就是调错了,改了几个错之后我就开始不管什么规模的数据都拍不出错了,于是我交了一发,轻轻松松的等待结果,但是发现居然错误答案,只过了几个subtask

我感到很惊讶,多对拍了几下终于拍出了错。然后发现好像不能任意选连通块,接着还是错的,但是多了点分,我继续对拍,结果惊讶的发现我算法好像错了(实际上不能任意选连通块的时候,我就应该发现自己算法错了,但是当时想都没想过算法问题)。

我瘫坐在哪里完全不知所措,比赛只剩下半个小时了,而我竟然又写了一个错误算法,这次竟然还拍过了这么多数据,而且拍过了那么大的数据。为什么,为什么我两天都被错误算法坑害。完蛋了,真要拿银牌了!我觉得一个英文单词“tantalized”最可以形容当时我的状态,这个单词的意思是将一个美好的东西摆在别人面前,近在咫尺,却永远不让别人得到,我第二题无非就是这样,对拍过了那么多,眼看就要获得满分,却获得不了,而我整个OI生涯无非也就是这样,去年CTSC本来以为进队了,却发现自己只有第五名,今年我甚至都过了CTSC这么难的一关,已经到了国际金牌门口,却栽在IOI上。我当时真的感觉大概是老天爷在tantalize我。

但是比赛还没结束,我当时想尽我全力再拼一下吧,第二题70分我还是有的,而且我错误的做法已经拿到了49分,于是当时我赶紧改成暴力,但是却是0分,而且拍不出错,然后我发现checker没有判生成树,心想要是这个问题,那麻烦就大了,估计考试结束都不一定弄得完,于是肉眼看了一下,却没有看出问题。我看了下第三题的部分分,权衡了一下应该做第三题。接下来就是我比赛中唯一做的很精彩的地方。

首先,当时因为服务器问题比赛延迟15分钟,我自己是没有受到服务器影响的,相当于白送我15分钟,比赛竟然延迟15分钟,我发现第三题好像就是找轮换,于是随便写了一个,其实我并不觉得这么简单的做法能得满分,果然,一发交上去0分。

然后我改了一下,交上去居然有22分,过了所有s=0却过不了s不等于0。我觉得很奇怪。

我认真想了想第三题,好像只和轮换的左右端点有关,然后写了一个,过了所有s=0的数据获得了50分,另外50分我完全不知所措。

这个时候,奇迹出现了,在比赛结束前几秒,比赛居然又延迟了15分钟。

这个时候我做了一个精彩的决定,退回去做第二题,我马上写了个一个判生成树,果然是这个问题,我几分钟就发现问题在哪里,马上第二题获得了70分。

仔细想想,我金牌的希望还是很渺茫,除非我能拿到第三题的满分。

于是我全力想第三题,还是没有想出来问题,最后猜了一个结论还是错的。

考试结束了。

我顶着一头阴云离开了考场。

今天第一题随便过(如果99分算过的话),二三题暴力的话:100+70+50,而如果我奔着这个目标去,两个多小时我就能拿到这个分数,剩下的时间肯定够我搞掉至少一个题了。

中午吃饭,很郁闷的吃,和Arash Mahmoudian聊了一会儿,他虽然去年是金牌,今年也没拿到金牌,他说他发挥出了自己的水平,其他的分都不会,而我和他也讲了我两天的不顺经历。其实由于延时了榜没更新,当时我还没有看到终榜,还抱着一点金的希望。

然而之后王宏教授告诉了我结果,于是一切都盖棺定论了。

盖棺定论,尘埃落定,那26块金牌,还有不出所料获得冠军的yutaka1999,是今天的主角,而我,只能在一旁祝贺。

然后我看到了分数线,是那么的低,如果我第一试选择做提答,或者第二天第二题直接写70分从而拿到第三题满分,或者第二天第二题不想到那个错误算法而是直接想到满分算法,都不用拿银牌了。

仔细想想,自己还是心态问题,前面想翻盘的时候从来没有第二天我还想单天拿第一名这种想法,都是想着拿金牌,如果第二试我也奔着金牌,肯定不会死磕第二题。

有好几句话我都忍不住直接抄用了前面几个学长的写的考试经历中的句子,我觉得写的很好也很符合我当时的情况,就直接用了。

下午和杜瑜皓、金策还有几个前面几届的学长网上聊了很久,当然收到了不少的安慰。

雅礼中学上一个IOI选手刘研绎,也是CTSC冠军进去,都是NOI同步赛第一名,也是银牌,本来我以为我不可能重复他的命运,没想到还是落得一样的结局。

自己代表国家的四分之一,却铩羽而归,就算我自己觉得没关系,这份国家的责任我也得担当啊。虽然比赛已经无可挽回,但是我至少还能总结自己为什么考得这么差,从而给后人留下教训。

一方面是策略,我最近的OI比赛策略基本就是乱打,这还其实是有历史原因的。

我自从去年CTSC的失利之后对OI比赛的喜爱程度便有所下降,因为当时我那一年的OI已经失败了,而第二年因为太长了所以没有怎么想过,所以我当时就有点想把重点转到Codeforces这些更类似ACM而不是OI的网赛上,当然最开始因为NOI的缘故,OI比赛策略并没有多少影响,我依然是非常好的看一遍所有题,想一遍所有题,从最简单的下手这种策略,NOI之后,我马上开始专注于网赛,基本所有比赛都开着O2C++11这些国内OI比赛没有的东西,而且我有一个相当大的模板库,拉模板也变得非常熟练,因为网赛是要模板的,我相当于在OI生涯并没有正式结束的时候,提前成为了一个不错的网赛、ACM选手。

再之后几个月因为特殊原因所有算法竞赛都停了。中间清华集训之前做了一点点训练,其实清华集训的策略就已经存在一定的问题,比如第二试花了很长时间做一个传统题而没怎么做提答题完全就是IOI的缩影,但是清华集训上凭借着自己前几年积累下来的实力加上运气并不是太差,并没有出很大的问题。

到了今年年初我开始恢复做各种网赛,碰巧今年冬令营是一个不太需要策略的比赛,因为题目基本都不可做,于是导致我很久没有碰过OI比赛,加上平时训练喜欢拉模板,虽然集训队之后的训练并没有说不能拉模板,但是这导致我IOI前正规的OI比赛基本没有 ,包括集训队互测在内的很多次仅有的OI比赛我也暴露出过我在正解上花时间过长的问题,而即便有这些问题,我依然能奇迹般的在考试结束前将自己能拿到的分拿到手。即使是没有拿到手,我基本都归因于写题太慢而没有考虑到策略问题,因为我当时还是希望我网赛能打好,而网赛重点是过题的速度。

这个时候我的考试策略完全网赛化,就是不断的打正解,于是我成了随机开题,然后打满分算法这种策略。碰巧CTSC遇到了一道原题,第一天碰巧获得了满分,后来的NOI同步赛我第一天因为卡常数只得了292,但是包括现场选手在内我依然是第一名。大概是受到这些比赛的影响,我IOI便开始渴望NOICTSC式的胜利,就是第一天通过满分获得接近满分的成绩拿到第一名甚至是遥遥领先,而第二天保守一点,直接保住第一名。显然这个策略到IOI失败了,于是我两天像无头苍蝇一样乱撞。试想如果我最开始按部就班的策略留到IOI,虽然不一定能打败yutaka1999,但是金牌肯定完全不是问题。

另一方面是心态,考前自满的心态可能是存在的,但是它的存在性依然存疑,我考前并没有哪次考试发挥自己满意过,比如Google Codejam我因为小bug,从有进final希望的三十多名直接掉到完全没有希望的七十多名。即便这种心态存在,我并不觉得它是主要问题。

我认为我心态方面的主要问题是在进入考场后而不是进考场之前,进考场之后我的确认真了起来,毕竟是这种打比赛,但是到了后面比赛越来越不顺,包括到了第二天的时候,心态开始崩了,心态一崩,自然影响发挥,于是我连想几个错误算法,写代码的bug也明显增多,调错,看错能力也明显下降,对待各种东西都没法认真了,策略当然也是按照自己固有的思路来,而我的固有思路恰好在IOI上失败了。

最后是实力方面,不得不说对于任何考试失败,不管心态和策略的影响有多大,实力的影响都是在那里的。如果我想题能力更强,我就不会想那些错误算法,即使想到了,也能更快想到它们的问题,我甚至可能在第一试的最后一个小时想到第三题的做法,同理第二试的第二个题我想题也会更顺利。如果我代码能力更强,能够不出bug,那么第一试第二题的三个错误算法可能更快就否掉了,第二试的第二题也能很快否掉自己的算法,还有时间去想更好的算法。当然与前二者相比,实力方面的问题相形见绌,同时当然也是最难在短时间内解决的。

愿我的失败能为后面的选手敲响警钟。


明年IOI在日本,我们在德黑兰看到了相当厉害的日本IOI宣传片,相信现在喜欢看日本动漫的选手一定会很享受明年的IOI吧,因此我在这里祝明年以及以后每年的IOI选手能够正常发挥,取得好成绩。