今年的比赛最大的变化就是改用OJ判题了,相比于PC^2确实省事了不少,至少可以直接复制样例了。题目方面依旧是刘汝佳命题,这点还是相当好的,至少给人以足够的安全感。
开始比赛之后安叔瞬间就把前半部分题目抢过去了……想到可能前面的题目会比较简单我就让安叔分我一点,然后安叔就把A丢给我了,接着很快安叔就决定上去敲C了。于是我就开始默默地看题了……A是找个最长的近似回文子串,算了一下暴力没问题,然后又看了H,完成区间加和查询单点就可以了,但是又仔细想了一下其实排个序+二分+前缀和更好写一些,这时琦琦又给我拿来J,我看了一下虽然变量范围很大,但是因为前面是三次方,后面只有一次方,实际上可以将左边的变量的范围缩小到1000,直接暴力枚举一下就可以了,这个题也比较好做。再接着琦琦又让我看了一下B,想了一下直接用链表模拟就可以了,只不过写起来可能略复杂。后来我还看了一下F,只不过没仔细看,感觉直接最短路就可以了,但是在边那里转移的时候要分情况讨论一下。因为这时安叔刚好写完了C而且发现没过样例,我就没再仔细想F了,赶紧让安叔打了一下C的代码我就上去敲J了,并把手头的题简单排了个序JAHBF(不过后来才发现其实F比B要好写的多)摞到了面前,并叮嘱了一下琦琦不要抢我的题。
在我敲J的期间,安叔发现了C的bug,改了一下然后1A了,接着我也很快敲完了J,1A。然后就去写A了,敲了几行之后觉得A还是有点代码量的,于是就问了一下琦琦G是不是很好写,琦琦说很水,于是就先让他去敲G了。G题1A之后我就继续写A了,但是写完之后发现没过样例,而且长度那里差的很远,仔细读了一下题才发现原来子串长度是包含那些不是字母的字符的,后来赶紧改了一下交了,结果返回了WA,于是赶紧打了代码把机子让给了队友。查了下代码发现自己后来改代码的时候忽略了回文串长度为偶数时,一开始要先把两个点中间的非字母字符的数量加到结果中去,改了一下2A了。
接着我继续按原来的顺序敲H和B,两个也都1A了,因为之前本来就没仔细想F,所以决定还是先写一下F的转移方程,于是就让安叔先去敲I了。列完转移方程后才发现原来F很好敲,于是赶紧把机子要过来拍了一个Dijkstra,1A。不过后来安叔I题遇到了些问题,用Dijkstra敲完之后T了,我看了下代码之后觉得有些小地方可以优化,不过改完交还是T,于是就考虑是不是确实算法复杂度有些高。上个厕所回来之后觉得可以直接开两个数组去记忆化搜索,但是安叔问我乘0操作可能会产生环,这样会不会出问题。我细想了一下发现其实只有乘0操作才可能让数变得更小,而且如果要变成0的话那么必然是一开始就乘0代价最小(或者x本来就是0),所以一开始就把0这个状态赋好初值就不会出现环的问题了。于是我上去重敲I,调了之后就1A了。这是就只剩下D和E了,我决定先和琦琦搞定E,D自然就留给安叔去想了,剩下的比赛中也基本在交替地敲D和E的过程中度过了。
其实E在我敲水题的时候琦琦就已经有想法了,我们商量了一下后决定他敲计算几何部分,我敲dp部分,也不大记得这两部分是在什么时候敲的了,但是最后敲完之后发现没过样例,而且是计算几何部分的代码存在bug,在I题A掉之后我就和琦琦一起开始查bug了。很快琦琦还是找到了bug,但是交上去之后却WA了,我们便开始想是不是还有特殊情况,很快琦琦又找到了一些特殊情况,但是我们都忘记先构造几个样例了,琦琦改了代码交上去之后还是WA,在构造了之前想到的特殊情况的样例之后才发现改完的代码压根没解决这样的样例,只是我们以为改好了而已,于是就这样白白WA了一发……最终我们还是把代码改好了,大概在结束前30分钟A掉了这个题目,剩下的时间就都给安叔去敲D了,不过由于D确实还是有些复杂,最终结束时也没能敲完。
从比赛的整体过程来看,我们还算比较顺利。在比赛前一天我就提醒了一下校队的队员们不要在机子上调试,因为省赛可做的题目还是很多的,在机子上调试太浪费时间了,所以这次我们基本都是打印代码进行查错了,事实也证明这样确实节省了不少时间,我们机子基本都用在了开题上面。不过这次1A率还是偏低,我心目中的1A不仅仅是交上去之后就能AC,而应当是敲完之后不用调试就能过样例并AC,但这次我们却在很多时候敲完之后发现过不了样例,于是改为打印代码去查错,这样还是浪费了不少时间的,后面还是要加强自己思维的严谨性以及尽量降低代码级别的错误。
在回来的路上,我告诉琦琦如果今年我考研顺利话一定还会再来一年,到时候我们剑指final。自从CSU_BMW解散之后我已经一年没有训练了,在这一年里我用代码做了很多有趣的项目,暑假也去金山云实习了一个多月真实地体验了一下IT男的感觉,但总觉得这一年心里没有了一年前那种很踏实的感觉,总觉得自己还有未完成的事情。从我在初入ACM就在博客上写下“我要把中南带进世界总决赛”开始,这个梦想就从未扑灭过,如果明年还有机会,我愿用明年所有的时间再一次践行我的承诺。