山东大学宿子腾在第36次CSP认证考试中获得满分,第37次CSP认证考试将于3月30日举办,报名正在进行中。每年CSP高分考生(200分及以上)均可报名参加CCSP竞赛,CCF不定期邀请CSP高分和CCSP获奖选手分享经验,希望能够帮助同学们取得更大的进步。
非常欢迎更多CSP优秀学子分享自己的宝贵经验,联系:csp@ccf.org.cn
与算法竞赛的缘起
得益于初中学校的课外兴趣拓展班项目,我从初中开始接触信息学奥林匹克竞赛。在老师的教导下,我初识了循环分支递归等基础算法。我也由此感受到了计算机的魅力,感受到了学习算法时的乐趣。在老师的帮助下,我在第二年参加了CSP-J组的比赛并获得了普及组二等奖。
凭借着初中时相对优秀的成绩,我借助自主招生进入了高中的竞赛班。虽然我们学校以化学竞赛为主,左右权衡之下,我选择了自己更加热爱的信息学竞赛。彼时学识浅薄的我显然没有料到,信息竞赛会对我的人生走向带来多大的改变。
虽然我们高中的信奥师资力量薄弱,得以于教练和学长的引路,我依旧学的津津有味。由于参赛经验的不足,我并没有在第一次NOIP中拿到奖项。回到机房后,我痛定思痛,迅速调整自己的心态,开始准备第二年的NOIP。在学长的带领下,我开始进行高强度的训练,也开始热衷于撰写博客,分享自己的学习心得,传播算法知识和一些题目的解法。我也积极在洛谷等社区平台上上传自己的题解,与其他选手进行交流。这段时光中,我的算法能力得到了充足的锻炼,也有幸结识了许多优秀的选手。这段时间,我受益良多,开阔了自己的视野。
之后的我在CSP-S和NOIP 2021中取得了省一等奖,并开始停课准备省一等奖。受限于教育资源的短缺以及升学带来的种种压力,我开始陷入到提升的瓶颈,直到省选来临进步也十分有限。省选成绩并不理想,我将学习重心回归到文化课上。
参加NOIP前机房合影,最后排左二为宿子腾
在信息奥赛经历和CCF的影响下,一颗算法竞赛的心在我心底埋下。在进入大学以后我准备重拾算法竞赛,我开始着手准备CCF CSP认证和XCPC等系列比赛。在这里我和志同道合的队友两年拿下了一金三银的成绩。
在老师的介绍下,我了解到了CCF CSP对选手能力认证的关键作用,以及学校对于该项竞赛肯定的认可。我报名了第36次CSP认证,并有幸拿到了500分的成绩。
电话微波炉(暂定)队部分队员于ICPC2024(昆明)留影,左一为宿子腾
认证体验分享
由于本次认证是我第一次参加,在我向参加了往届CSP认证的同学咨询了他们的经验之后,我总结了一些有关CCF-CSP认证的参赛经验。
不同于初高中生参加的CSP-J/S,CCF-CSP认证采用NOI赛制,该项赛制的一大利好是选手可以多次提交并实时了解自己的分数,从而对赛时时间的安排有着更加清晰的规划。同时在每道题目中出题人也贴心得设计了多个部分分,在我们还未想到正解的情况下,也可以借助一些较劣的复杂度实现或特殊的数据特征取得一部分分数。
同时,在认证时,给出的题目题目难度大多为升序排列。需要注意的是,这里的题目难度是正解的难度,也就是说,后面题目的部分分也可能非常容易得到。所以我们不必抓住一个题目不放,我们可以同时关注多个题目,选择最有思路的题目去实现。
以我第36次CSP认证的经验为例。在第二题中,我首先想到了不考虑修改操作的情况,并发现这个过程能够O(n) 解决,加上修改复杂度为O(n^2),由于暂时没有更近一步的思路,我选择先完成了O(n^2) 的代码求稳。在第五题中,在一开始我同样没有较好的思路,我选择使用一个比较笨的方式完成了O(n^2) 的做法,拿下了保底30pts。在后来我有了一点单调栈的思路,但还未确定其正确性,因此我选择了使用线段树维护所需的信息,以O(nlogn) 的复杂度拿下了70pts。在此之后我的心态更加从容,我有较为充足的时间和较低的代价完成单调栈做法的代码,最终代码再一次完成更新并AC了这道题目。
在考试过程中,我第一次采用了步步前进的这种策略,它帮助我稳定的拿下了一个又一个部分分。如果只是想着冲击正解,一时没有思路可能会极大影响自己的心态,选择快速实现部分分做法反而是一种稳定心态的好方法。当然,这个策略也有它的缺陷,一个题用三份代码来完成,如果代码实现出现了问题,将会严重压缩后面的做题时间,这也是对选手代码功底的一个考验。
第36次CSP认证考试成绩单截图
备考建议分享
从历次CSP认证的出题难度及风格来看,整体题目难度是在不断变化的,遇到过难的题目也不要紧张,冷静思考一步步整合题目信息,解决题目的一个个部分分才是拿到高分的关键。
在题型分布上,第一题属于签到题或者简单模拟题,大部分选手都能快速完成。第三题属于大模拟,其风格上类似工程代码,思维难度较低,但非常考验选手的代码功底和对题目各种数据的存储方式的安排能力。而二四五题比较偏向思维题,难度层面依次递增,主要考察选手的算法功底,选手需要发现题目中的某些关键性质,借助算法和数据结构完成对题目信息的处理和转化,并完成题目给出的任务。
总体来看,比赛成绩主要与两个因素相关:其一是选手的代码功底和算法功底。比赛过程中选手需要快速完成多道题目的代码,不乏一些码量较大的代码,想要保证代码少出bug,平日积极的代码练习是必不可少的。大量题目的训练可以帮助选手练就“所得即所想”的本领。同时,比赛也着重考察选手的算法功底,选手需要对主流算法都有所了解,并且领会其背后的具体性质,灵活变通使用方式才能熟练应用与具体问题的解决之中。其二,是选手赛时的心态和手感,临场发挥的变数是非常大的,选手需要调整好自己的心态。可以通过赛前热身等方式调整自己手感到最佳状态。
如果在赛时暂时遇到挫折,要根据剩余时间和题目的进度进行冷静的决策:题目完全没思路,还是代码难以实现?代码出现了奇奇怪怪的不可名状问题,还是能够准确定位的实现问题?评估自身当前的状态,来决定自己应当及时止损,还是要背水一战。切忌破罐子破摔,搞崩了心态,赛后诸葛亮。
电话微波炉(暂定)队于ICPC2024南京留影,左一为宿子腾
结语
在文化课期间伏案苦读的日日夜夜,我总能想起在机房时的拼搏时光。每当困惑迷茫之时,那段为热爱而奋斗的日子总能给与我精神的力量。可能这就是算法竞赛的魅力吧!
非常感谢CCF能给我这个分享经历与感悟的机会。我真诚地祝愿CSP认证与CCSP竞赛蒸蒸日上,祝愿大家能够在接下来的CSP认证与CCSP竞赛中取得理想的成绩!