徐明宽IOI2017参赛总结2018-09-28 17:14:53阅读量:4211

 
 

首先我很荣幸能作为中国队的一员参加在伊朗德黑兰举办的第29届国际信息学奥林匹克竞赛,同时要感谢CCF的组织、领队老师们翻译题面,也要感谢胡伟栋老师多年来的指导、感谢他让我以IOI的赛制做了2011~2015年的IOI题目——IOI的策略与国内OI比赛的策略有很多不同之处,我下面写的一部分东西也是可以通过做模拟赛总结出来的。

28号上午,我们经迪拜中转,到达伊朗伊玛目霍梅尼国际机场(IKA),发现机场很小,好像只有2个行李传送带(回程发现只有10个登机口)。同时发现有些地方只标波斯数字而不标阿拉伯数字,便背了一遍两者的对应关系。中午在酒店吃的饭,虽然蔬菜种类不多而且没有猪肉,但感觉还是比较对胃口的。下午去参观了Birds Garden

第二天上午试机,4道题都和之前网上练习赛的一样,1道传统题、1道交互题、1道通信题、1道提交答案题。除了提交答案题以外的3道题都有一定思维难度而代码量很小(30行左右),我们把这3道题写完了以后就去找伊朗队、美国队(罗哲正)等聊天去了。下午开幕式,有民族特色的舞蹈,也有阿卡贝拉表演。然后介绍代表队时出了个大笑话:把韩国队的国旗弄成朝鲜的了。往返的车上我们分别与越南队和丹麦队愉快地聊了聊天。之后领队们要去翻译题面,我们和他们都被断网了。

虽然这几天德黑兰最高气温有41度,但是各个室内场所的空调系统都很不错,总体上还是比北京凉快。时差3.5小时,我出发之前就睡得比较晚,所以很适应。day1日程6点到8点早饭、9点到14点比赛,早上很早就有morning call,我果断挂掉等自己的闹钟,卡着8点吃完早饭,然后还是等了好长时间才入场。

看到题目,第一题nowruz居然就是提答,看了看感觉完全没思路,再看后两道传统题,感觉都不太简单。9:15理解完3道题的题意后我决定先做第二题wiring。先画了几个小例子,发现在一些情况下交叉连边肯定不优,然后想了想还是不会做,于是看部分分,注意到有13所有红色接点的位置坐标小于任何蓝色接点的位置坐标,然后就发现一定有一种最优策略可以切成若干段红红……红蓝蓝……或者蓝蓝……蓝红红……,就有了个O(n^2) DP,而且可以前缀和优化成O(n)。于是我就写了一下,交上去发现只有那13分,手构了个红蓝红蓝红的小例子发现程序输出无解了,于是意识到还有一个接点直接连最近的异色接点这种转移方式,改了一下就AC了,这时时间只有10:09。并不明白为什么O(n)的题要出10^5的数据范围。

然后再看nowruz,还是不会做,我手玩了第一个点帮助理解题意,到10:28的时候终于得到9.83分了。然后我写了个比较复杂的构造算法,发现后几个点的输出总是不合法,写了个 special judge 帮助调试。到了12:06,我nowruz只得了34.47分,决定先去做第三题train(我习惯在5小时的考试中剩余2小时的时候把每道题都仔细想一遍)。train是在一张图上博弈,我想了想把同一个人控制的强连通分量缩点也没什么用,便写了个直接按照博弈定义bfs然后迭代的代码,自己构造了些小例子然后瞎调,在12:50的时候莫名其妙地AC了。接下来我感觉nowruz的构造算法没什么希望,就写了个随机dfs算法,在13:33的时候得到了73.14分。最后半小时一直在调参、换随机种子,最终得到了74.20分(还剩39秒的时候的74.26分提交由于网络原因没交上去)。

出来以后发现我day1rank3,中国队其他人的成绩都不理想。佩服rank1等好几个最后一分钟绝杀wiring的人。接下来日程排得比较满,当晚参观了Gonbad Mina PlanetariumAb-o-Atash ParkNature Bridge,很晚回到酒店以后第二天又有Dolphin ShowTour of Milad Tower。期间他们抱怨自己day1的失误,丹麦队的Alice Ryhl在我们旁边也不知道聊什么,气氛比较尴尬。

day22道交互题和1道传统题。看完题目后决定先写第一题prize,这个二分查找在写的过程中发现有不少细节,写写改改,最后我先花不超过473次询问找出棒棒糖的个数,然后在棒棒糖这一层二分查找,如果发现一个区间里已经找完所有的非棒棒糖就不再在这个区间中找了。10:25时才写完,交上去试试,发现居然AC了(而且最多只花了4760次询问,把最开始找出棒棒糖的个数部分和接下来二分查找的第一步合并一下就是4759次询问,就和出题人的最优解一样了)。

接下来我去做第三题books,在11:02时写出了一个22分贪心,但是之后就没思路了,便去做第二题simurgh,在11:52写出了一个51分做法,并在12:19做出了后面19分部分分。然后我意识到把这两种做法结合一下就是正解,但代码量很大,权衡了一下,决定还是先写simurgh30分再想books。大约13:00时,评测机出现了一些问题,之后告诉我们延时15分钟。13:25时,我终于把simurgh调对了,之后就去优化books的贪心,最终在14:13时拿到了50分。结果离比赛结束还有不到一分钟的时候又告诉我们再延时15分钟……我想这15分钟没时间再想正解并写出来了啊,就开始不停改贪心提交,不出所料地没拿到更多分数。

晚上参观了Botanical Garden,我们和日本队一桌吃的晚饭。第二天上午水上公园Opark挺好玩的,下午到Azadi Tower拍了张照片。之后闭幕式,颁奖时金牌第2~26名分两批颁,第1名单独颁奖。晚上我和罗哲正、钟知闲一起与俄罗斯队等进行了一些简单交流,把剩下的小礼品都送出去了。最后一天上午杨家齐和老师们一起出去了,而酒店要求我们11点退房,我和毛啸找了个guide翻译跟酒店交涉,成功延了一段时间。中午我们4个人到酒店里的中餐馆吃了顿饭,感觉味道还不错。

这次IOI中国队收获22银,成绩并不是很理想。从题目上看,这次IOI六道题全都有不小的思维难度,而国内常见的数据结构题一道都没有;一试第一题是一道提交答案题,但与国内常见的提交答案题不同,这道题并没有要求选手观察每个测试点的性质,而是直接写一个算法就能做出所有测试点,而且,评分方法很良心,送了很多分,不像国内常见的提交答案题评分方法更注重区分度;二试出现了两道交互题,虽然国内很少见这个题型,但是中国队做这两道题的结果还不错。

这次我们出现失误有个原因是题目给的样例太弱了,许多错误的算法都能过样例,如果不考虑周全、想出一个能过样例的算法就写的话可能会浪费很多时间。这或许是国内OI比赛希望贴近IOI实时反馈而给大样例的一个弊端——在国内OI比赛的一些题目中,如果跑大样例发现错了,我们可以从大样例中摘取前几行来调试,很快地知道是算法错了还是写错了;在IOI中,如果交上去发现错了,我们又懒得写数据生成器和暴力来对拍的话,就有可能会调试很久才能知道是算法错了还是写错了。但虽然如此,我觉得国内OI比赛给大样例还是比不给好,只是希望以后的选手们能增强自己造小数据(主要是想想除了题目给的样例以外的情况再写)的能力,而且不要怪出题人把小样例弄得特别弱——出题人没有帮你排除错误算法的义务。

虽然这次IOI题目的样例很弱,但是题目的部分分设置却对想出正解有不小的提示作用。IOI2017第一试第二题(子任务2)这样的提示,与NOI2017第一试第二题这样花哨的部分分表格形成鲜明对比——部分分不是只用来增加区分度的,它还能在一道思维难度很高的题目中起到一定的启发效果。希望以后国内OI比赛命题能向国际学习一下,首先题目本身思维难度要提高,其次区分度不是越高越好,简单题的区分度要降低一些(像今年IOI两试的第一题)。


总的来说我觉得这次IOI我发挥的不错,能拿到rank2倍感荣幸。同时比赛之外的部分也很愉快,景点都挺好的(虽然玩得有点累,有一天回到酒店已经半夜了),我们和guide聊了许多东西,和其他国家的队员们也有许多交流。我想这次IOI必将成为我人生中一次难忘的经历。