概述
GDKOI 2017 参赛总结
石门实验中学 酱油选手***
概述
2017年2月18日~19日,GDKOI 2017在广州市顺利举行,石门实验中学参赛选手共3人,教练员1名。这次比赛,我校参赛选手的最终成绩并不理想。在两天的比赛过程中,也出现了大大小小的一些问题。希望此次比赛的失利和对问题的分析能帮助我们以后在类似的赛事中避免可能出现的问题。
Day 0
17日下午,我们一行人到达了中山大学西苑宾馆,在前台折腾了半天才办好住宿的事情。之后去吃了晚餐,伙食比GDOI 2016的四会中学不知道高到哪里去了。当晚和lzh在房间内看TVB的连续剧。
Day 1
18日是正式比赛的Day 1,吃早餐的时候竟然偶遇了《C++一本通》作者本人。从中大站乘坐8号线到鹭江站,约7:45到达考场。由于六楼机房出现了一些网络上的问题,比赛被延迟20分钟开始,结束时间顺延,即从8:20比赛至12:20。更坑的是,由于下发不了比赛注意事项,不得不由评委宣读一遍。试题解压密码是zha.xi.de.le~,似乎是藏语的一句祝福(扎西德勒)。
今年在D盘根目录下提供了check.pyc的脚本,可以帮助选手检查目录的设置,还是相当人性化的。
T1是签到题,题目大意如下[1]:
给定一个n*m的地图,每个格子中的元素为下述三种当中的一种:
玩家。整个地图中有且仅有一名玩家,且其无法移动。
糖炮。对于每个糖炮,会给出其爆炸时间d,其中0<d<=9。
普通方块。
所有糖炮的爆炸均以其所在位置为中心,往上、下、左、右四边延伸L的长度(不包括中心)。当一个糖炮爆炸后,若其爆炸范围内还有其他糖炮,则该糖炮同时被引爆。所有的爆炸均是瞬间发生的。
问玩家在第几秒时会被炸到。若不会被炸,则输出-1。
数据范围相当小,如果没有记错似乎是n,m<=1000,糖炮个数<=3000。显然可以直接模拟,做法很多,理论上应该可以随意水过。
我在考试时写的是:对于每个糖炮,记录其坐标(x,y)、爆炸时间t和是否已经被引爆。将糖炮按爆炸时间从小到大排序,依次检查每一个糖炮,若其尚未被引爆,则引爆之。检查其爆炸范围内是否存在未被引爆的糖炮,若有,则继续引爆。倘若足够细心,在实现上每一步都谨慎一些,是可以AC的。但我的引爆过程是用DFS实现的,且“将当前糖炮标记为已被引爆”是在“引爆当前糖炮爆炸范围内未被引爆的糖炮”之后执行的,这样一来将有一个严重的隐患,但我浑然不觉。
在手工调试过了几组小数据后,我自认这题已经写得天衣无缝,便接着做T2了。
T2题目大意如下:
给定两个只含0和1的串,并要求完成以下两个任务之一:
Easy模式:分别求两个串中的最长合法子串长度。
Hard模式:给定的串可能缺失1位,缺失可能发生在任何位置,缺失的可能是0或1。在此前提下,求分别两个串中的最长合法子串长度。
其中,合法串的定义如下:
空串是合法的。[2]
如果串S合法,那么0S1、01S、S01也合法。
如果串S1和串S2都合法,那么S1S2也合法。[3]
有30%的数据是Easy,其余70%的数据是Hard。我在考场的判断失误,用了以下做法:
对于Easy模式的case,二分答案k。检查时,枚举S的所有长度为k的子串[4],看是否合法。即确定是否存在一个合法子串Si..Si+k-1,其中0<=i<len(S)。而判断子串的合法性,则采取如下步骤:查找子串中的“01”,将其删去;不断重复此步骤,直至串中找不到“01”为止。此时若串为空,则该串为合法串;否则该串不合法。
然而直到赛后选手讨论时,我才突然意识到,似乎本题答案并不具有单调性。
而对于Hard模式的case,我枚举添加后的(len+1)*2种新串,对它们分别做Easy模式并取所得答案中的最大值。显然效率极低,且由于其建立在本身就是错误的Easy模式解法上,因此也是错误的。
T3题目大意如下:
有p·q个小朋友,分别被编号为0~p·q-1。
两个小朋友x和y之间的默契值为min(|x-y|,p·q-|x-y|)。两个小朋友为好朋友,当且仅当它们之间的默契值为p或q。
现在这p·q个小朋友要手拉手围成若干个圈进行活动,每圈至少有3人,相邻的两人必须为好朋友。所有小朋友都要参与活动,问有多少种分配方案,答案对109+7取模。两种方案是不同的,当且仅当存在两个小朋友在方案1中拉着手,而在方案2中不拉着手。
将题目抽象后,一种解法是显然的:令S={0,1,2,…,p·q-1},枚举所有合法有序子集,将它们进行组合,若某些子集的交集为空且并集为S,则这是一种合法方案。由此易求得所有的方案数。
事实上,我就是这么写的。如果写对了的话,起码20分还是稳的。然而我再次高估了自己。我没有考虑到各圈人数不相等的方案,于是组合的过程就炸了。虽然也有被样例误导的原因,但说实话主要还是自己考虑问题不够全面周到。
不过,好在还有30分的特判数据。显然对于p=1的情况,只有{0,1,2,…,p·q-1}是合法的,故答案为1,10分到手。然而对于p=2的情况,我并没有手画模拟,而是根据我的错误枚举,得到了一个神奇的规律(貌似是一个长度为4的循环节),交了个假的表。
T4题目大意如下:
有n件顺次排列的物品,物品i的体积和质量分别为vi和wi。每次可以从左端或右端取一件物品装入一个容积和最大承重分别为V和W的容器。若容器中所装物品体积和超过V或质量和超过W则必须换新容器。问最少需要多少个容器。保证存在合法方案。
第一遍读题的时候我是没有留意到从左端或右端取这个条件的,但又考虑到数据范围较大,难以用背包实现,因此写了贪心。分别按体积贪一次,按质量贪一次。
后来检查发现这个条件,应当可以用dp做。设f(i,j)表示左端为i右端为j的答案,则容易实现状态转移,所求即为f(0,n-1)。但是我仍然太天真,我保留了之前的贪心,在三种情况中取最小值。
中午回中大吃饭的时候还蛮开心的,毕竟感觉自己估分起码150+。吃完饭去跟yhf的房间,跟lzh、zyc和yf打了会德州,yf的心理战术也是比较变态,被惨虐。然后lzh慷慨地请我去吃了kfc。
下午到六中听评讲,似乎还是GDOI 2016那几个命题人。据传抓到选手作弊,sigh。
T1的思路是对的,评测结果也有过半AC。我开始有点小期待成绩。而且,数据出得很均匀,随机输出1至9和-1当中的一个就有10分。
T2的Easy居然是典型的括号序列问题,可以用前缀和或者栈做,然而我在考场上丝毫没有意识到这一点。以后对于一些经典的问题模型还是要常练,最起码要能看得出来。
而Hard模式则可以用dp做,状态的表示方法也较多。但必须承认我没有听懂多少。
T3居然是插头dp……太可怕了。完全听不懂。
T4似乎也是类似dp,但是难度比较高。值得一提的是数据比较水,有好几个没看清题目的选手都贪了80分。
直到这个时候,我都还是相当期待我的分数的。
今年组委会写了个新系统,可以围观评测。当然,考虑到大量因素,目前还不能公开围观,所以只是讲台上给我们投影了一下分数。
居然有dalao AK了!而且似乎跑的比标程快?貌似是WC前15的fj邀请选手。
一直往下翻……然而还是没有看到认识的。南海选手可能day1考的不是特别好。终于看到几个石中的,两百多分的样子。最可怕的是sc,240分。
再往下,过了漫长的一段时间,大量的初中生挤在100分左右的分数段。好不容易看到lzh和zzr的,但是我的却还没有出现。
我很想安慰自己,可能是刚才看漏了也说不定,再不济总不会没上50分吧。可是过了30分,我还是没看见。
浏览器最右侧的进度条一直划向页面的最底部,是一行刺眼的字。
“佛山市南海区石门实验中学,***,初二,男,10。”
万万没想到,比自己预想的分数相差了整整十倍。
分数看完了,有人欢喜有人忧。我坐在后排的座位上失魂落魄,可是也没有什么用。随它吧,反正也没人关心。不可描述的滋味一直萦绕在我的心头。
可是终究还是要签字的。经过一阵混乱,我还是从yhf手里拿到了成绩单。T1全部RE了。T2爆炸,全部WA。T3就在第三个p=1的特判点拿了分,其它点不是WA就是TLE。T4也全部WA了。
如果说后面三道题的情况还在意料之中,T1也太让我大跌眼镜了。无论如何,总不可能爆零的。实在令我难以接受。我没有签字,而是选择复评,尽管我自己心里也明白,翻盘的机会渺茫。不想麻烦队友,我便让签了字的lzh和zzr先坐地铁回去吃饭了。
中山楼四楼的机房外排起了长长的队伍,石门中学的yqm也来了。里面的评委忙了一会,让我们进去,按需要复评的题目分组排队等候。又经过大半天的焦急等候,才到我。
复评的方式极其原始,是把选手代码拷下来,一个个数据点单独跑。没有想到的是,T1才跑到第一个点,就出现段错误了。评委判断我应该是死递归了,我不是很服气,理论上不大可能出现这种情况的,于是我请他把每次调用递归时的参数都输出看一下。
神奇的事情出现了,调用的参数居然出现了循环,还真是死递归。
是的,正是我上面T1提到的那个隐患,直接造成爆零。排队半天却换来这个结果,让我气急败坏,却又无可奈何。心情复杂,一个人坐地铁回了中大,草草地吃了顿饭。
为了调解一下郁闷的心情,当晚和lzh、yhf、zyc一共四个人跑去上下九玩了。转了三趟地铁,还要步行十几分钟,感觉也挺疯的。后来才知道zzr去了小蛮腰,也是厉害。
Day 2
早上起来比较晚了,吃了一点早餐马上赶地铁,就怕迟到。结果到了考场才发现,原来我们是最早到的。
Day 2似乎成功解决了网络问题,比赛也就8点准时开考。解压密码是with-no-regret。是啊,有哪个选手不希望自己能不留遗憾地完成一场比赛呢?
T1的题意倒是很明确,却让我这个数学渣感觉难以下手:
平面上有n*m个格点,求以这些格点为顶点能组成的面积为正整数的三角形个数。答案对109+7取模。
再看数据范围,20分是n,m<=10肯定稳,直接n6枚举判断。不管怎么样,先把暴力打完了再说。
打完暴力面临着两个选择,是往下继续打暴力还是好好想想这题?
我的内心其实是纠结的。一方面,被数学题支配的恐惧一直笼罩在我的心头,挥之不去。但另一方面,Day 1的失败深深影响着我,我也知道很大程度上是因为我当时太贪心,没有把T1的分拿稳了再去解决后面的题。更何况,这还是Day 2,后面的题即使打了暴力,能骗到分的机会又有多大呢?
我还是决定把这题尽力做好再说。而这一个决定,让我在接下来的3个小时里用掉了两张草稿纸,写了三份代码,却还是没能够再拿多哪怕20分。
尽管如此,我也并不认为这个选择是不明智的。无论结果如何,至少在这一题上,我真的尝试过了。我尽力了。
最后还剩大约几十分钟的时候,我开始写后三题的暴力。我自己也明白,不过是死马当活马医,希望不大。但我对自己的码速还算比较满意的,相信应该能够写完暴力。
T2的题目大意如下:
你有n个人,第i个人战斗力为ai或bi,选择哪一个战斗力由你指定。你要挑战一个战斗力固定为H的人。
你要依次派出若干个人,若你派出的第i个人由你指定为战斗力xi,对于你派出的人i,j,k,...,m必须严格满足H<xi<xj<xk<...<xm。问你最多能派出多少人。
我想不到正解,也来不及思考了,只能打了个贪心:令xi=min{ai,bi}且将这n个人按xi升序排序,从第一个满足xi>H的人开始选。若第i个人被选,只要满足排序后i<j且xi<xj那么第j个人也被选。
T3的题目大意如下:
有无限多的n种士兵,分别从第1种到第n种。若gcd(i,j)=1,则第i种士兵和第j种士兵可以成为一种组合。在此前提下,求一共有多少种不同的组合。
值得一提的是,此题的时限为15s,运行内存限制为1GB。只有3个数据,分别为20、30和50分。
直觉告诉我,这是一道数学题,同时还告诉我,我并不会做。几乎是下意识地,我打了n2的枚举,对于20分的task是可以解决的。为了尽可能骗多点分,我还加入了记忆化。虽然后来证明这并没有什么用。
T4号称小学生数据结构题,然而我已经没有多少时间仔细看题了,因此题面也记不清了。依稀记得的是似乎可以用模拟做部分分,但是相当难写,也难调。
就这样水过了Day 2上午的比赛,心情非常不爽,因为感觉自己马上就要滚粗了。
下午两点退房,由于提前已经把房卡给了lws,东西全都收拾完了,并不慌。还跟yhf、lzh和zyc打了几盘德州,这回基本上也没什么输赢,估计大家的心情都不在牌上了。
临坐地铁前lzh要去买贡茶,顺带请了我一杯可可奶茶,软妹币13块,orz。
就这样,gdkoi 2017最后一次坐地铁到六中听评讲。长风楼五楼的会议室里挤满了比昨天更多的选手。虽说迟到了一点,但评委们也还没到。
刚开始讲题没多久,就告诉我们:成绩已经出来了。这个时候我整个心思已经完全不在题目上了,反正讲了也基本听不懂,只能干巴巴地等着发我校的成绩单。焦躁难安,看着小祖刷了会空间才放松了一点。
T1讲完,发了一波似乎是东莞的成绩。T2讲完又发一波。终于讲完T3,要发佛山了。
我坐在座位上,坐立不安地等候着广播里念出“佛山市南海区石门实验中学”(尽管我知道这是不可能的,因为组委会每次都会将我校少得可怜的几张成绩单并入实验学校一起发),然而等了半晌还是杳无音讯,实在是坐不住了,挤到前排去等。
又从一片混乱中抢到了分数单,居然比Day 1高(但是万一不比Day 1高还得了?),水了40分。再看每题得分,T1 20分,好吧。T2贪心居然爆零,T3 暴力20分,T4没写。
Day 2也算还在意料之中,但是总分就比较尴尬了。10+40=50,GDKOI 2017卒。
最后再说点什么
这次也确实算是炸得很惨烈吧。连我自己都没有意识到,从广州回来之后好几天,经常是整个人都板着张脸,以至于lw都察觉了。她跟我谈心时候说的一些话也有道理吧,比赛本来就是有一定的偶然性,偶尔失手也是正常的,etc.。
不过自身的原因也是有的,在Day 1出完成绩跟lws谈的时候我就意识到了这一点。
今年中山和广州的初中选手在scoreboard上霸占了超过半壁江山之多。人家的成功绝对不是偶然的,我们也要知己知彼,分析别人的成功和自己的失败的原因。
测试的成绩确实是一段时期内所付出的努力的一种有效体现,但更重要的是透过成绩来分析这背后的隐含信息。总不可能说别人的选手就比我们智商高,更有天赋。
那么,无非是在方法和时间等方面上下功夫罢了。人人都知道,关键是有谁下了苦功。
当然,我也确实见过一种选手,可以整天玩,偶尔用功一下,比赛的时候照样轻松AK虐场,这种差距不是光靠努力就可以弥补的。但是我们要成为的也并不是AK选手啊,我们只是希望通过我们自己的努力,做到最好,尽力了就行,只求问心无愧。
经历一些挫折也是必经的历程吧。没有哪个成功的OIer从来没炸过,至少到目前为止我还没听说过,即使tourist、wjmzbmr、ACRush等神犇也是凡人。
懈怠,是失败的主导原因。lkb,你还对OI抱有最初纯粹的热爱吗?我常常这样质问自己。没有了动力就会停下脚步,失去了方向就会驻足不前。寒假备课一个月,我自己也学了挺多东西。lws也常常跟我们讲,如果没兴趣就不要学,与其坐在机房里浪费时间还不如回教室搞好文化科。
确实,当OI成为了一项你需要靠别人的监督才能做题的东西的时候,已经废了。
写到这里,我想讲些更深层次的思考。
也许是我过于悲观,但是我校OI的发展确实面临着很大的挑战,前景不容乐观。其实也不光是我校,整个大环境下,我觉得形势都相当严峻。自从10年杜子德取消了大学保送之后,少了很多抱着功利心的选手。可是近年来自主招生等政策又重新让竞赛的圈子里加入了一些不太纯粹的因素,讲到底,抱着追求利益心态来学习的人依然存在。
正是这样,原本严肃、诚信的OI竞赛,可以说应该作为五大学科奥赛中最后一片神圣的净土,其美好的面貌也已经不复存在了。我们可以看到,近年来,每年都会出现NOIP初赛泄题、复赛作弊的现象。而广东,作为传统强省,也是多年来很少发生作弊现象的一个赛区,今年也有多名选手作弊。在GDKOI 2017期间,更出现了有选手利用上洗手间的机会使用手机的现象,令人感到痛心。
其实写了这么多,也不算是一篇专业、正式的竞赛总结,又不像记叙文,只能说是比较真实的反映了我整个竞赛的心路历程吧,虽然废话很多。
最后的最后,还是希望自己能利用好剩下的三个月,有条理地好好康复,争取市选过线,五月份在东莞市东华中学的GDOI 2017上一雪前耻吧。
2017年2月23日
于石门实验中学电脑三室
[1] 由于手头没有官方题面可供考证,本文所有的题目和相关数据范围都是根据笔者及同校选手的回忆整理的,不保证一定正确。所有题目的版权及最终解释权归GDKOI组委会所有。
[2] 但题目描述中保证输入的串不为空。
[3] 原版题面中并没有此条件,是在比赛过程中临时通知补充的。
[4] 事实上,一个合法子串的长度必定为偶数。为了方便,我当时二分的是k/2,检查时则长度为k。
最后
以上就是斯文可乐为你收集整理的GDKOI 2017 参赛总结的全部内容,希望文章能够帮你解决GDKOI 2017 参赛总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复