徐明宽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分提交由于网络原因没交上去)。
出来以后发现我day1是rank3,中国队其他人的成绩都不理想。佩服rank1等好几个最后一分钟绝杀wiring的人。接下来日程排得比较满,当晚参观了Gonbad Mina Planetarium、Ab-o-Atash Park、Nature Bridge,很晚回到酒店以后第二天又有Dolphin Show和Tour of Milad Tower。期间他们抱怨自己day1的失误,丹麦队的Alice Ryhl在我们旁边也不知道聊什么,气氛比较尴尬。
day2是2道交互题和1道传统题。看完题目后决定先写第一题prize,这个二分查找在写的过程中发现有不少细节,写写改改,最后我先花不超过473次询问找出“棒棒糖”的个数,然后在“棒棒糖”这一层二分查找,如果发现一个区间里已经找完所有的非“棒棒糖”就不再在这个区间中找了。10:25时才写完,交上去试试,发现居然AC了(而且最多只花了4760次询问,把最开始找出“棒棒糖”的个数部分和接下来二分查找的第一步合并一下就是4759次询问,就和出题人的最优解一样了)。
接下来我去做第三题books,在11:02时写出了一个22分贪心,但是之后就没思路了,便去做第二题simurgh,在11:52写出了一个51分做法,并在12:19做出了后面19分部分分。然后我意识到把这两种做法结合一下就是正解,但代码量很大,权衡了一下,决定还是先写simurgh后30分再想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中国队收获2金2银,成绩并不是很理想。从题目上看,这次IOI六道题全都有不小的思维难度,而国内常见的数据结构题一道都没有;一试第一题是一道提交答案题,但与国内常见的提交答案题不同,这道题并没有要求选手观察每个测试点的性质,而是直接写一个算法就能做出所有测试点,而且,评分方法很良心,送了很多分,不像国内常见的提交答案题评分方法更注重区分度;二试出现了两道交互题,虽然国内很少见这个题型,但是中国队做这两道题的结果还不错。
这次我们出现失误有个原因是题目给的样例太弱了,许多错误的算法都能过样例,如果不考虑周全、想出一个能过样例的算法就写的话可能会浪费很多时间。这或许是国内OI比赛希望贴近IOI实时反馈而给大样例的一个弊端——在国内OI比赛的一些题目中,如果跑大样例发现错了,我们可以从大样例中摘取前几行来调试,很快地知道是算法错了还是写错了;在IOI中,如果交上去发现错了,我们又懒得写数据生成器和暴力来对拍的话,就有可能会调试很久才能知道是算法错了还是写错了。但虽然如此,我觉得国内OI比赛给大样例还是比不给好,只是希望以后的选手们能增强自己造小数据(主要是想想除了题目给的样例以外的情况再写)的能力,而且不要怪出题人把小样例弄得特别弱——出题人没有帮你排除错误算法的义务。
虽然这次IOI题目的样例很弱,但是题目的部分分设置却对想出正解有不小的提示作用。IOI2017第一试第二题(子任务2)这样的提示,与NOI2017第一试第二题这样花哨的部分分表格形成鲜明对比——部分分不是只用来增加区分度的,它还能在一道思维难度很高的题目中起到一定的启发效果。希望以后国内OI比赛命题能向国际学习一下,首先题目本身思维难度要提高,其次区分度不是越高越好,简单题的区分度要降低一些(像今年IOI两试的第一题)。
总的来说我觉得这次IOI我发挥的不错,能拿到rank2倍感荣幸。同时比赛之外的部分也很愉快,景点都挺好的(虽然玩得有点累,有一天回到酒店已经半夜了),我们和guide聊了许多东西,和其他国家的队员们也有许多交流。我想这次IOI必将成为我人生中一次难忘的经历。