1. 赛事初印象:NOI2024的独特氛围
第一次踏入NOI2024的赛场,扑面而来的是与往届截然不同的氛围。今年组委会在场地布置上花了不少心思——主会场入口处用LED灯带拼出的二进制欢迎词,签到台旁实时显示选手排名的动态排行榜,还有那些穿着印有各种算法梗文化衫的志愿者们。最让我惊讶的是热身赛区的设备配置:清一色的机械键盘+144Hz显示器,连座椅都换成了符合人体工学的新款。
作为参加过三届NOI的老选手,我注意到今年有几个显著变化:首先是赛制调整,传统题与创新题的比例从7:3变成了5:5;其次是评测系统升级,现在可以实时看到每个测试点的通过情况;最重要的是新增了"极限挑战"环节——在最后1小时会解锁一道超高难度附加题,解出可直接获得30%的额外分数。
2. 赛前备战:我的三个月特训方案
去年省选失利后,我重新规划了训练计划。周一、三、五专攻动态规划和图论,周二、四啃数学与数据结构,周末则用来模拟赛和错题复盘。工具方面,我搭建了本地评测系统,用脚本自动抓取洛谷、Codeforces的新题,并按知识点和难度分类。
特别要分享的是我的"错题本数字化"方案:用Python写了个爬虫自动同步各大OJ的提交记录,配合Markdown+Git进行版本管理。这样不仅能追踪每道错题的迭代过程,还能用可视化工具分析薄弱环节。到赛前最后一周,我的代码模板已经迭代到V7.3版本,包含37个经过实战检验的算法实现。
3. 赛场实战:D2T3那道改变战局的题
第二天第三题堪称本届赛事的分水岭。题目给出一个n≤1e5的树结构,要求找出所有满足特定条件的子树,并输出其哈希值之和。表面看是常规的树形DP,但有两个陷阱:一是哈希函数设计需要防止碰撞,二是内存限制严格到连map都不能随便用。
我的解题过程堪称惊险:先用常规方法写了暴力DP,结果在测试点5就MLE。紧急改用指针池优化内存,又发现哈希冲突问题。最后灵光一现——既然子树结构具有递归性,何不采用类似后缀数组的倍增思想?在还剩17分钟时终于AC,后来才知道全场只有9人完全通过此题。
4. 意外插曲:评测机故障引发的加时赛
比赛进行到第二天下午,整个华南赛区的评测系统突然宕机。当时我正在调试一道线段树优化题,突然发现提交后迟迟没有反馈。组委会很快启动应急预案——延长比赛时间2小时,并提供本地校验工具。
这个意外反而给了我机会:多出来的时间让我重新审视那道卡了半天的计算几何题。原本用的是标准的凸包算法,后来发现可以将问题转化为旋转卡壳模型的变种。最终这个"因祸得福"的解法让我在该题拿到了全场唯一的满分。
5. 选手村见闻:那些令人惊叹的神操作
住在选手村的那几天,我见识到了各路高手的"骚操作"。比如广东队的选手用vim宏录制了整套代码模板插入流程,敲3个键就能生成200行的标准线段树;还有浙江队的同学带了个自定义机械键盘,把常用算法绑定到宏键上。最绝的是某位选手在比赛时开着自制的IDE插件,能实时显示代码的时间复杂度预测。
晚上交流会上,我学到了几个实用技巧:用std::array替代vector可以节省15%的内存访问时间;对于DFS序问题,预先计算欧拉序能大幅简化代码;还有那个著名的"骗分导论"作者现场演示了如何用随机化算法在部分测试点偷分。
6. 赛后反思:从试题看算法竞赛趋势
分析今年的题目,能明显看出几个趋势:一是对数学能力要求更高,D1T1就出现了组合数+生成函数的综合应用;二是强调工程实践能力,有题需要自己实现内存池来优化性能;三是开始注重可解释性,解题报告占到了20%的分数。
我最大的收获是对"竞技编程"有了新理解——不再只是追求AC,更要培养系统性思维。比如有道题需要先证明算法正确性才能设计出高效实现,这比单纯敲代码难得多。现在回头看,那些熬夜调试的夜晚和爆零的经历,都是成长的必经之路。