吉林大学欧阳承风在第36次CSP认证考试中获得满分,第37次CSP认证考试将于3月30日举办,报名即将开启。每年CSP高分考生(200分及以上)均可报名参加CCSP竞赛,CCF不定期邀请CSP高分和CCSP获奖选手分享经验,希望能够帮助同学们取得更大的进步。
非常欢迎更多CSP优秀学子分享自己的宝贵经验,联系:csp@ccf.org.cn
前言
对我而言,这次分享既是一次经验的分享,又是一次经验的总结。半年的成与败历历在目,我正好借此机会反思并总结,希望我和大家都能在此有所收获。
CCF与我的算法竞赛生涯
在我读初一的时候,我在学校的宣传下知道了NOIP和CCF。当时我没有报名,毕竟当时我只浅薄地自学了python。之后我跟随学校学习了C++以及一些算法基础,练习一年后,初二那年我报名参加了CSP-J并获得一等奖。由于初中知识水平有限,初三那年无法战胜CSP-S。高一时再次在CSP-S上失利。
两次在CSP-S上栽倒,我意识到了自己因为初中年少无知导致了基础薄弱,于是重新学习了一遍各种基础算法,将一切推倒重来。我建立了自己的博客,写满了从基础一步一步往上的几乎所有学习记录。经历了基础的历练,我不再是以前那个软弱的自己,高一时获得了NOIP一等奖。高二时拿到CSP-S一等,并且排名比较前,感觉理想的话有机会冲击省队。很可惜,那年的NOIP我失误较大。由于NOIP分数也会作为省选参考,且我们省没有春季测试,于是我只能退出算法竞赛,开始备战高考。
中学期间比赛证书
对CSP认证的理解
考入吉林大学后,我参加了第35、36次CSP认证,也是我第一次接触CSP认证。
CSP认证由五道题组成,每题100分。且题目含有部分分,不一定要通过所有测试点才能获得分数。
第一、二题主要考查基础语法、简单算法和基础数据结构。其中第一题是签到题,主要考查基础语法。第二题需要经过一定思考设计算法,掌握简单的算法如二分、DFS等,并能够正确使用基础数据结构,如栈、队列等,一般就能够轻松应对。
第三题一般是和工程、项目有关的大模拟题。非常考查考生的代码规划能力和代码实现能力。需要在充分理解题意的基础上,合理规划需要实现哪些功能,明确清楚每一步需要干什么。代码能力(也即码力)一般的考生建议最后再开始尝试此题。此题需要时间较长,建议留一到两小时来处理。
第四、五题一般是传统的算法题。算法竞赛水平相对弱的考生可以考虑先完成暴力算法获取部分分后,再思考正解。因为一般情况下CSP认证后两题还是有一定难度,不会正解不必担心。两题中有一题相对简单,可以尝试;另一题要么代码不易实现,要么思维难度较大。所以可以考虑完成一题,另一题获得部分分后,再对第三题发起全面攻势。
以我参加的第35次CSP认证为例。第五题,看到区间剖离,可以很快想到Splay维护不同颜色段。对于维护不同颜色,可以用启发式分裂,或者离线出树形进行树上启发式合并。我当时没带纸质资料,Splay维护颜色段写的有点问题,于是只能基于Splay维护区间剖离,来写50分部分分。我因为第五题没能做出来,剩下的时间也就两个小时多,紧张导致最终第三题也没写出来,获得了0分,最终以350分遗憾离场。
第36次CSP认证第三、四题难度不大,所以这次高分很多,但满分不多。对于第五题,直接做是考虑枚举每个位置,然后每次打败一个,检测是否能再往外打。但是可以发现这种方式不方便扩展,信息复用率比较低,于是考虑怎么做能重复利用信息。可以发现如果你可以击败一个人,他边上所有的比他小的那些你都可以击败。所以可以利用笛卡尔树来转换,求出每个点往两边第一个比他大的位置,然后再以两者中更小者作为重构树上这个点的父亲。如果这条父亲链一路上去,存在一个父亲自己无法战胜,就需要增大初始值。这时父亲链就被多次访问了,提高了信息复用率。碍于篇幅,就不进行详细讲解了。
由此可见,算法竞赛需要敏捷的思维、强大的码力和明智的决策。
第36次CSP认证成绩单截图
CSP认证备考建议
基于以上内容,我的备考建议是在思维、码力与决策上下功夫。
大家平时练习应该大多在洛谷等线上评测平台。在此,我推荐在codeforces以及 atcoder上面做题,上面的题目以思维题为主,能有效的提高算法竞赛所需的转换能力、跳跃性思维、发现性质的能力等。
除了思维以外,这两个平台会经常举行短时长的比赛,有更多实战机会。实战训练考查的不止是思维和码力,还有自己的决策能力。到底哪些题应该放下,哪些题应该投入更多时间去做,考生应当培养能够判断这些问题的能力。可以去CSP模拟系统做往年CSP认证真题,去找到这种决策的感觉,这也是我今后需要训练的一个重点。
平时训练的时候,还应该追求更快地完成和更少的提交次数,尽可能一次写对。在这个过程中代码能力会逐渐提升。代码能力是我的薄弱点,我第36次CSP认证分数比第35次高的一个原因也是其满分所需的思维难度更大,但是代码能力要求相对低。这部分的训练还可以通过适当做一些模拟题来练习(但是不宜过多)。
另外,自己做完题后,可以多看看其他人的解法,可以积累思维经验。还可以多看看其他人的代码写法,借鉴优秀的写法也能够提升代码能力。
结语
热爱算法竞赛的话,路自然会越走越开。我祝愿CCF越来越好,也祝愿热爱算法竞赛的各位越来越好。