前言:
这次省赛是在青岛科技大学,5月7号-8号。我们山东建筑大学出了4个正式队参加(随着每届省赛的正式名额的增加,我们学校已经没必要出星花队了,因为我们实验室水平能够参加省赛ACMer光正式队就够了-_-|)。
我们是周六(5月7号)一早6点多和山大的一块拼车,坐汽车出发去青岛。山大可是10个队呢,满满的大神,心里默默地膜拜了一番(其实几乎每年打省赛我们学校都会和山大的拼车,所以我参加的这几次,每次都膜拜一番)。
住的酒店不错,伙食挺好,下午一块坐车去崂山校区参加开幕式和热身赛。
热身赛:
原定的下午3点半的热身赛,因为开幕式2点半就结束了,所以热身赛也提前了。
来到赛场,我的天,实验室有点小哦,大概一个赛场能装的下20个队伍吧。打开电脑,PC^2找不到快捷方式哦,我们3个linux(ubuntu?)小白傻了眼。就问周围的队伍PC^2怎么打开,也是有的会有的不会,后来还是志愿者用终端给打开了PC方,心里为明天的正式赛捏了把汗。
拿到题目,一看就3个题,我的天,还是中文的哦,因为提前就打开了PC^2和CB,所以题目发下来就直接看题目了,省去了登录PC^2和敲头文件的时间(明天正式赛也是这样多好啊*_*)。
扫一眼A题,题意之复杂,让我相信A肯定不是最简单的。看B题,水题,然后就敲,其实一开始用这里的键盘还是有点不太习惯的,大概3分钟吧,敲完测试,提交1Y。这时队友xyb(大一学弟)告诉我C题是水题,直接判断两个字符串包含的字母和个数是否一样,我说太简单了,输入两个字符串s,t,排序,然后strcmp判断,测试样例全过,提交,WA啦,哎我去,我习惯性地想到又是大一学弟理解错题意了或者解法想错了,然后我就读一遍题,发现题意是只能交换一次,所以我就改了改,如果两个字符串如果相等则YES,否则判断是否是一次正确的交换,敲完提交,又WA,顿时就怒了,这还错??!!过了几分钟发现bug,两个字符完全相等时,如果每个字母都是唯一也是该是NO才对,修改后提交,3Y。然后我就去找我们学校的其他大一的队,去教教他们PC^2的使用和测试内存和时限。这期间两个队友(学弟)一直在讨论A题,又是最短路,又是dp的,就让xyb上去敲。我也不知道他的思路是什么,然后看到他开了一个int w[maxn][100],我就知道他能过这个题或者他的想法是正解的可能性极小。然后我就用Dijkstra的原理看能不能由目前最小的去更新其他点。出去上个厕所顺便证明一下其正确性(我们赛前都说好,脑袋有点迷糊的话就去上个厕所清醒清醒),回去之后让xyb赶紧把他的代码提交一下看看什么结果,对了更好(错了我就可以敲我的思路了,哈哈哈哈,我是不是很坏),提交果然WA了。然后我就上去按我的思路敲,敲了提交,过了。
然后就是测试内存和时限,我们测的2s跑10^10不超时(不过事实证明这测貌似并不对),然后就把头文件作为CB的default code保存起来(不过事实证明这也不行,哈哈哈,大家不要学我们)。
正式赛:
8点20进赛场,然后看见PC2已经打开了,坐定之后,讨论了一下战术安排,然后就等着比赛开始了。
过了8点50,志愿者开始发题目,我们几乎是A赛场最后拿到题目的队伍,接下来惊人的一幕就发生了,大家都开始拆信封!!我的天,我心想着说,这样不好吧,这么可以这样呢,然后对面的队伍(好像是山东工商学院的)也在拆,我本着不能乱来的原则没有拆,同时坐在我们右边的山科的reliant队伍也没有拆,他们还说好没有素质啊(其实我心里也是这么想的),然后我就告诉队友说:山科不拆,我们就不拆!不过我说完山科就开始拆了,那么我们就也跟着拆了(可能我们是A赛场最后一个拆的,哈哈哈哈)。
题目一人一份,我先登录PC2,然后就看题,赛前安排我是ABCD,队友(大二学弟)cyp是EFGH,xyb是IJK,但是看到目录A题是Return of the Nim,就知道可能是个博弈,然后翻开大眼一扫,没错就是博弈了,然后告诉我右边的cyp:A是博弈,你去看。同时他告诉我G是水题(其实他是听到山科的说的,哈哈),我就立马去看G,真是水题,求1-n每个数的m次幂的和,心想太简单了,一定会有一个小坑的,然后就仔细数了一下mod,啊哈,是1e8+7,坑被我发现了,这应该会有队伍会栽一下吧,心里一阵暗喜,很快把代码敲好,测试没有问题,搞笑的是,现在比赛都还没有开始(哈哈哈),所以我等着PC2开通,然后打算拿个全场FB,够我回去吹几天的了。9点PC2准时开通,我立马选定题目,文件,提交,然后ID是1,我心里那个激动呀,然后返回一个红红WA,卧槽,我心里那个怕呀,C语言入门级别的题让我写错了,还是全场ID为1的WA!!刷榜看见也有人交G,但是好像也错了,我检查几遍代码发现并没有错啊。。。这时戏剧性的一幕发生了,旁边山科队的队员向志愿者反应G题该是1e9+7,我偷听到这立马改了mod,交上就过了,嘴上还骂了两句街。然后队友cyp告诉我I题是水题,我一看是斐波那契,f[n]mod2,其实就是奇偶性嘛,第一反应就想到了有循环,然后把斐波那契的前十几写出来,发现每6个就有循环,然后字符串模拟mod 6,直接输出结果,测试前几项全对,就交上去了,10分钟1Y。
这时刷榜,我们还是比较靠前的,发现有人过F,正好队友xyb读完了F,告诉我题意,就是“对于任意的x,如果a*x^2+b*x+c=0,则x是个整数”,在给定a,b,c,判断这句话是否成立。然后向队友问了两种情况,大概了解了解法。然后就开敲。这个时候整个比赛中最精彩的一幕发生了,队友cyp(从一开始就负责看A题的学弟)告诉我:祥哥,A题很难,但是我会,哈哈哈哈……我说真的?他说先找找模板。然后我就接着敲F,敲完,测试样例全过,提交,WA。然后检查代码发现忘了处理a=0的情况,然后就是又讨论了一下,感觉可以了,再次提交,又WA。这时cyp告诉他想敲A,于是我把F题代码打印了一下,继续找bug,而cyp则开始敲A。
(这个过程应该是G题对一部分提交重判了,然后我G题2Y也就变成了1Y,全场FB!)
不一会我发现二次方程如果无解该输出YES,但是输出了NO,我就把A题写到一半的cyp赶下来,我上去改了改,然后提交,44分钟3Y。就接着让cyp去敲A。然而他很快就写完了,给我说:祥哥我写完了。其实一开始我是不太信A题这么难他是能做出来的,况且现在榜上并没有人碰A啊,然后我就问你检查好了吗?数组开小了吗?爆int了吗?他说检查好了,没用数组,不会爆int,然后我就给他检查输入的名字有没有打错,在再三确认无误下,就让他去交了,他说如果过了,我们就拿到一血了,然后就返回了一个绿绿的YES,我太佩服他了,48分钟1Y,并且拿到FB。然后我就郑重地告诉他:如果这真是个难题,那就可能就带偏榜了。(事实证明多少有点这个趋势(斜眼笑)
再次刷榜,我们4题了,到了第3名,感觉这场比赛打的很顺啊,要拿金牌的节奏啊。然后我们队我看了C、cyp看了D、xyb看了J题,cyp告诉我说D题可以10^10复杂度的暴力dp,祥哥你敢不敢写,然后我就想昨天热身赛测的速度很快,我就说为啥不敢,然后他们两个就讨论J题,我就去写D的暴力dp。我先把所以询问离线,但是10^10的数组没法开,但因为每个状态只受前两行影响,所以我把第一维滚动了一下,然后就是暴力dp了。写好之后,样例不过,然后就是一顿debug,改好之后样例过了,我就说碰碰运气我交了,然后提交,半天没反应就预感会超时,然后结果也是不出意料,返回了TLE。这时J题他们终于讨论出了结果,cyp要写,然后我就让出了电脑上了厕所,回来之后问xyb J题题意,在得知题意之后,我说,这不是水题吗,把价值排序,然后从大到小O(n)扫一遍,并记录后缀和,同时更新答案就可以了啊,为什么你们讨论了那么久呢。。。然后cyp告诉他就是这么写的,然后我还想抢下电脑自己写,因为我敢保证这是正解啊,然后他说他也是这个思路,没事的,一定会过的。这我才放心的让他接着敲了。
果然,没一会cyp就敲了J题,测试样例不过,发现一个变量写错,修改,然后就可以过了样例,我就又给他出了一组数据也过了,我就说交吧,这是个水题相信你写不错,然后就提交,103分钟1Y。
然后我就接过键盘接着改我的D题,我还想再碰碰运气,看暴力dp能不能过。在cyp敲J的时候,xyb就一直在看C题。而我在改D题的时候,又精彩的一幕发生了,xyb拿着稿纸对着cyp说:鹏哥,通过这个表你能看出什么(很严肃地说)。Cyp突然就笑了,并对我说:C题我会了祥哥。然后就把稿纸拿给我看,卧槽,这不是杨辉三角吗!!然后就扔下手里的D,去写C。
C就是先预处理阶乘,然后枚举每一个烟花,如果能炸到w位置,就算它的贡献,其中求组合数用了Lucas定理,写好之后测试样例全过,自己又随手出了一组样例也过,就提交了,然后返回一个WA,这明明就是正解,怎么会WA呢。然后就检查代码,发现n和m都比较小,用不着Lucas,就本着越复杂越容易出错的原则,就把Lucas删掉了,其实心想就算不用Lucas也可能不对,因为我感觉问题不在这,然后就一行一行的看代码。突然就看到了问题,原来是res在累加每一次的答案之后,忘记res%=mod了,这肯定会炸,然后就修改,样例全过,提交,145分钟2Y。 这时刷榜,我们已经6题了,排在很靠前的位置,金牌应该没问题,能再出一个题金牌就稳了。这时还才11点半,比赛才进行一半。我们还是有机会出题的。然后我就接着看D,他们两个去看K了。
我又随便剪了剪枝,抱着侥幸心理又提交了一次D,还是TLE。然后就彻底放弃了暴力,开始相信这是一个组合数学的题了。我一开始想着从给定的位置一路向上,然后累加过程中的组合数,但是队友给我否了。我把蜂窝转换成二维坐标,然后把3种转移方式画出来。发现去枚举其中的一种转移方式,然后另外两种方式不用枚举,而直接用组合数就可以计算,这下就不超时,我相信这是正解,然后就重新写D。
写完了测试样例并不过,一直想不明白为什么会不对。然后不停地的分析每一步,才发现枚举第一个转移方式时,所算的组合数不对。然后就推了推发现,是另外一种情况。但是这种情况我一时半会想不到解法,只要高复杂度的dp能解,但是复杂度太高,肯定超时啊,这时就封榜了。我向两个学弟求助,说帮我解决了这个问题我就能过了D题,可是他们两个讨论半天无果,cyp说他想打个表来找规律,然后我就把键盘让给他了,我去旁边继续推公式。
我转换思路突然就想到了解法,这时cyp的打表程序都还没写完就被我撵下去了,然后我就在我原来的代码上改了改。测试前面的好多组数据都对,然后我就提交了,然后返回了一个绿绿的YES,248分钟3Y。这下金牌稳了。Cyp问我,祥哥,咱接下来干啥,我就说吃饭啊,哈哈哈。
最后揭榜,7题,除去星花队,我们排名第5,创造了我们学校的历史最好成绩,拿到了我们学校的第一块省赛金牌。
赛后开会,才发现我们的成绩都是在教练刘老师的预料之内,都说刘老师的嘴是开过光的,看来一点都不假,哈哈哈哈
出了赛场,遇到了山理工的教练刘晓红刘老师,追上去给老师打了个招呼,和刘老师聊了会天(因为考研的事,机缘巧合地让我接触到了刘老师),感觉刘老师好和蔼啊,好亲切呀有没有,对山理工今年没能拿到金牌表示挺遗憾的,不过相信他们明年拿金是一定没有问题的。然后闭幕式之后还有机会和刘老师合了影,心里真激动。这次比赛我收获的很多,取得首块金牌,有这么好的队友,和一群可爱的学弟学妹,收获和刘晓红老师,还有教练刘毅老师和带队老师的满满的师生情。
回来学校的第二天,我看到了K题,才发现K是个水题,我以前在bc上做过的,不用20分钟我就可以过掉它。。。。。。我好后悔最后50分钟没有看K题。。。如果我出了K题,我们就是季军呀,这是一个我想都不敢想的高度,而我,就是与它擦肩而过,我对不起我的队友,对不起刘老师的叮嘱,对不起学校,也对不起ACM比赛,我没有把比赛坚持到最后,对不起的是ACM比赛精神。
我告诉刘老师,这在我心里是个坎,可能永远也过不去。
为了证明我不是事后诸葛亮,现在贴出和K题几乎原题的题目连接:HDU5501
点击打开链接
总结:
我们能取得这样的成绩,当然运气也是好了点,但是不得不说我们每出的一道题,都是我们能力范围内的(甚至包括没有出的K题也是能力范围内的,只是战略出了点问题),去年我和另外两个队友参加省赛,信誓旦旦地要拿金,最终只拿到了银。今年换成我一个大四狗带两个小学弟参加,或许是我又多了一年的沉淀,多了一份沉重吧,今年没卡题,心态也没出现问题,耗我时间最长的D题,我也是一直坚信能做出来,所以虽然做的时间很长,但是封榜后不久还是过了它。
回想起大二在山科时的比赛,那次是打了铁的,可能骨子里会认为自己并没有那么差(不敢说自己优秀),所以那次打击还是很大的,回来后我就常向那年山科的冠军队请教(那年的冠军队,一个是比赛之前我们就在qq上认识了,一个是我高中同学,现在都是我很好的哥们),自己还决定去刷书,刷的就是LRJ的入门经典,UVA上的题目质量是真心不错,刷完大概一遍(除了前4章基础篇和第12章的高级篇),真得有种脱胎换骨的感觉,这一点我可保证绝对是真的。然后还去CF上刷比赛,刷比赛为了保持竞技状态,然后把IOI国家集训队的论文拷在手机里,算法书看够的时候就看论文,看懂就提高,看不懂就多看几遍,硬啃。那一年基本上把时间都花到了ACM上,上课也是在看算法书,作业啊都是抄一下,考试的话就是到时候再突击。经过一年的训练,大三下学期在山师的省赛我们只是拿了银而已,其实当时有个dp是可以做的,但是当时是队友负责dp,我就没去想,赛后我补题很快就过了(和今年的K有点像。。)。所以我认为去年拿银是我们队伍出了问题(某一个人有问题就算是队伍出了问题)。
今年和我组队的两个学弟(一个大一,一个大二)很可爱,会思考,虽然他们两个讨论的效率不太高,但是我们队还是很和谐的。自从去年省赛过后,就开始准备考研了,中间参加了一次CCPC的网络资格赛,和几场网络赛,一场长春CCPC赛,和一场青岛区域赛(拿到了铜牌,也是我们学校在区域赛上奖牌的零突破,拿到了第一块区域赛铜牌),其他就没有A题的时间了,都是在准备考研。仔细想想大家都拼命的复习考研,我还有心思参加ACM比赛,也算是比较奇葩了。
总的来说我们今年拿到金牌,也算是实至名归了,谢谢刘老师的指导和栽培,谢谢队友,也谢谢实验室的每个ACMer的努力,当然也要谢谢女朋友的体谅和陪伴啊^_^,也希望我们学校的学弟学妹们继续加油,给你们开了个好头,希望你们能再创辉煌,让我们学校的ACM水平更上一层楼!