0821 & 0822 考试分析

发布时间 2023-08-22 20:22:43作者: mindeveloped

先看结果吧。

Ranking

day1 (0821): 100 + 100 + 20 + 0 = 220
day2 (0822): 70 + 100 + 0 + 70 = 240

减少失误

最为显著的是这两天都有较大规模挂分的现象出现。0821 中 t4 的树套树因为变量名的错误直接挂成了 \(0\) pts (期望 \(70\) pts),0822 中 t1 由于没开long long没有拿到 \(100\) pts,以及 t3 的爆搜挂了 \(20\) pts。这和平时训练和打洛谷/Codeforces时习惯使用提交的方式验证代码的正确性,习惯下载数据调试以及平时改代码时使用补丁式改法,导致查错依赖评测机有直接关系。考场上大样例出锅时完全束手无策,只能肉眼调试代码。好不容易找到了错误,又将平时补丁式的改法运用在代码上,导致代码即使过了大样例也漏洞百出,而且极其浪费时间。
对于调试代码,正确的方式应该主要为以下几点:(其实总结起来就一点:你在考场上能用的!)

  1. 打印中间结果
    这是最容易使用,最不耗费时间的方法。优点是可以快速定位到出错的片段,但缺点是只能对小数据使用。使用时要尽量使输出的内容更加直观,便于查错。数据结构题常使用此法打印整个数据结构的状态。
  2. assert
    在验证中间答案正确性时可以使用 assert(Aborted状态码为 3,但是 RE 通常为 3221225620/3221225477/3221225725)。缺点是知道错误以后很难定位到出错片段,但优点是便于排查错误。常在第一遍写时添加到易出错的片段,便于之后调试。
  3. 构造数据
    适用于过小样例但是大样例出锅的情况,主要用于寻找特殊情况的处理,使用时注意不要把自己绕进去(有时你的思路就是错的),建议作为最后的方法使用。这几天考试中均因为提前使用此方法而或多或少浪费了时间,以后一定要注意。
    (注意:这和下载数据不是同一件事!后者应该避免使用!)
  4. gdb
    非常有力的调试工具,缺点是用多了会降智,有时使用 watch 输出结果不如用代码输出直观。

时间分配

考试的时间分配上比之前好了很多,如果调试时间再稍微缩短,则每场考试有充足的想正解的时间。由于今年的目标是 NOIP/CSP-S 高分,因此应有两道题的正解,策略上可以直接省去浏览题目的环节,直接开始想正解,想不出来正解直接打出较多的部分分,可以确保较好的考试状态,也减少时间消耗。暴力或部分分应该提前打,这样后面就可以全心全意想正解(这也是这几场考试的坑,当你还有暴力没打完时注意力会明显下降,最后 \(40min\) 几乎可以说是废的)。训练时不要与其他人交流(别人的策略会严重干扰你的策略,而且真正考场上不能这样,所以停止你的狗叫行为)。
以下是考试调整后的时间节点:
\(60min\) 对这次的考试有一个大概的把握,知道每道题在磕之前最多能拿多少部分分,同时此时应打完所有一眼正解。
\(120min\) 打完所有的部分分,了解哪道题最好打正解,并开始磕。
剩下的时间可以全部用于想正解,打正解,调正解。
\(230min\) 将所有题的代码重新编译,确保不会 CE,检查低级错误。
比之前简单了很多,而且效果也会好很多。

思维习惯

可能之前被 CF 的构造题打怕了,现在不是很喜欢去构造找性质。其实遇到题应该勇敢的去构造,这才是对思维能力考察的体现。这可能也是受到了调试能力的影响,导致对自己代码能力不是特别自信(?)

薄弱知识点

  1. 因为太依赖树形数据结构,导致静态的离线做法掌握不好,平时应该多加训练,毕竟离线做法学好了很多题代码过程能很简单。
  2. 树链剖分,因为最近用得太少了,应是下阶段的重要目标。
  3. 容斥原理,建议观看《组合数学》系列课程,真的是很多问题的神器。

总结

这几天的考试无疑收获很多,直接把之前的所有坏习惯全都翻出来了。习惯要靠平时的训练养成,平时的训练应注意方法,主要是注意调试习惯,不要为了快速 A 掉一道题而去下数据/轰炸评测机/看题解,记住训练时做题不是为了 A 掉,而是为了从题中学到知识,这样才能使能力真正提升,也会使考试更有状态。