2024从国庆到CSP前总结
前言
这是一篇迟来的总结,不过可能也不算太迟。
正文
截至起稿时间(2024.10.23),这个月已经讲了四次课,考了五场试。内容基本全是基于前一段时间的内容进行提升,对我而言很有帮助。我也意识到自己的很多问题,包括考试也包括做题,后面我会进行详细地分析。
关于讲课
内容涉及到了 ds、dp、图论、数学、字符串,所遴选的题目均为提高水平及以上,题目颜色从蓝到黑,以紫为主。
ds 方面主要是选的合并数据结构的题,对于这些题我们还是要回归题目本身,先去想题目的性质,然后考虑维护什么信息,如果不好维护我们怎么转换,然后选取什么样的数据结构?空间、时间、代码实现难度都是我们需要考虑的。给的题写了 \(\frac{3}{4}\),但是最难写也是最有含金量的题基本没碰。必须在 noip 前把这种硬骨头啃下来!
dp 的题太过于巧妙,我见到了许多技巧,感觉这些非常高妙。但是我认为还是要老老实实先去想朴素 dp,然后优化就交给上天吧!但是一些固定技巧还是需要掌握,像决策单调性、斜率优化啥的的题都必须要会写。还有就是需要特别注意一些不好想 dp 状态的题目,这个时候就放手一搏吧(雾不要害怕直接上高维 dp / 超级状压 dp,然后慢慢分析题目性质去剪枝。截止起稿时间题单完成度(8/20),感觉写不动,代码没思路。问了一些学长,建议可以看题解是如何实现的,但是真正写代码时必须独立完成!
图论感觉讲得比较杂(本来也就该这样),主要要注意的是建模,这方面还需要多做题。其次就是 tarjan 的一堆东西需要熟练,我还做的不太到位,需要抽时间多复习几次!然后是进阶的圆方树,还有虚树(了解大概怎么建优秀就行)需要花一点时间搞。
数学讲了拉插,现在完全搞懂了,线性基在之前讲线性代数的时候自己悟出来了。但是数学的内容都很重要,现在我还是对一些数学知识有遗忘,记忆不深刻。而我在数学方面下的功夫还不是特别多,之后重点要搞数学,得把一些东西学透。
贪心的东西挺有趣也挺考人的,需要一定时间的思考,但是还好。不想做代码难度太大的题时可以做几道放松一下。
总之讲课的内容有很多需要加深、强化,后面需要更加努力了。
考试
10.14 考的图论的基础练习,反映出我很多问题。对待事物非常马虎,这很致命!必须改掉这个坏毛病!表现出的“症状”就是第一题建模时没把条件写全然后寄了。审题验证对于题目的想法能力欠缺,考试时第二题没想通透。T4 就差一步也说明了我图论建模能力不足。我要多注意偏序关系以及相等关系!这些二元关系都可以看成点与点之间的长度限制。
10.15 的题有点难崩,第一道是 wqs 二分+最小生成树,之前水哥还讲过,我没太想起来。T2 经典二分图建模写了,T3 alpha beta 剪枝,但是我连暴力 dfs 都写假了,还花了不少时间,真正考试还需要注意时间的分配,T4 是有向图割点,自己赛时按自己的想法写了一个发现假了,结果需要掌握支配树的知识,但是我认为现阶段还不需要掌握所以没去改题。
10.19 开始就是比较综合的 noip 及以上的模拟赛了。第一题签到不管;第二题是一个性质较为明显的题,但是我没想出 dp 就去贪心了,结果假了,以后遇到这种情况考虑转换 dp 记录的状态,然后再去尝试,而不是干啥都往贪心方面去想,要给 dp 留空间,也要适当考虑贪心。T3 一眼线段树维护一段状态,但是时间不够我就没写,下来感觉维护不难就鸽了。T4 就是要从最简单情况入手找性质,然后发现一些简单的二维偏序关系,于是就可以类似 cdq 分治 一样去建图,感觉题很好,然后就去写了题解。
10.21 考得不好,T1 挂了,纯推式子有一个地方计算错误,T2 非常傻逼一道题居然没有想出来(最大子段和套上枚举最大最小),我都已经写完最大子段和但就是不知道怎么找最大,这时其实直接钦定就行,反正如果不优就一定会被更新掉。T3 我都没太把题读对,然后套线段树加奇妙优化乱搞,正确性有点假但是数据水把我放过了,后面把题目读清楚才发现求最小不是相差最小(虽然代码写的是最小),于是按最小的插入然后按顺序(或倒序)扫一遍就行,那树状数组存一下就做完了。T4 神秘题不知道没讲也就暂时没管了。
10.22 T1 \(O(n)\) 时间 \(O(1)\) 空间薄纱所有解法!薄纱标算!T2 以为是 SA 然后写了一个板子就去乱搞,最后没发现什么有用的性质就数据分治了一下 70pts,结果正解就是优化 35pts 的暴力,其中 \(O(n)\) 判断是否可以更新答案的地方可以用 hash 预处理加上 \(\log n\) 的二分判断。后面两道很神秘没管。
10.23 成为耐挂王了,300pts->70pts。很难过,又想起去年了,很晚才睡着。题很简单,目测绿蓝蓝黑,前三道真随便做,结果第一题没特判上界有一个地方,第二题 kmp 求反函数炸了,赛后改成 exkmp 就过了,T3 也是一个性质题,结果下面运动会排练吵得我一直没想出代码实现就难崩,就两个树状数组再记一记前缀的东西就行,明明都写了就是组合计数的有一点地方一直没有推出来导致 0 pts,最后真就差一点。T4 都没有时间去想了,主要因为中午睡觉起来头昏导致 T2 调久了且还把最坏情况 kmp 复杂度算错。
总结
关于做题:
对于一个题目,先去通读题面,了解你需要求什么东西,观察要求的东西有什么特点,比如如果只是求一个最值你就可以考虑二分啥的,或者优先考虑 dp 贪心这两个。然后就需要根据具体题目去分析性质,根据性质做题。
具体做题的时候比如你发现了性质先别慌,想想它可能跟什么有关,然后把能找到的性质尽量都找找,像什么答案是取一段一段前/后缀的,或者是取满足一些条件的一定不劣之类的可以对状态进行剪枝。把这些性质找完后罗列出来,看看怎么将它们有机结合,具体的还是得看题。然后做题的时候不强制去想正解,你先去想怎么做能满足正确性。满足正确性后就需要去关注数据范围和\(\color\red数据边界\)。
因为我实力还不够,有的题可能就不能直接想出正解,这时我可以先得到一个不优秀的解法,然后考虑去用数据结构优化一些找状态的过程,如果有很多状态重复就应该考虑预处理一些东西把它们记下来。如果发现这些还不行那就需要考虑优化记录的状态了,想想能不能找到一些条件去等价代替当前条件,或者用更松弛的条件去代替然后容斥一下。
想好过程之后应该把它写在纸上重新验证一下,这时需要想对于你需要用到的算法有什么特殊的数据存在让其时间复杂度最劣。然后尝试手玩一下。最后确定无误就赶快敲代码。
关于考试:
考试不是单纯的做题,而是做题与骗分、时间规划、心态等多重因素共同作用的结合体。对于现阶段的我来说,T1 肯定能切,如果是 csps 那 T2 也能稳切,这时就需要慢慢来但还要注意时间。
在我心中这些因素的排序是这样的:\(\text{心态}\ge\text{时间规划}\ge\text{做题}\ge\text{骗分}\)。我的心态还不太好,需要多磨练,有时会因为比预期提前做出 T1 而兴奋,也会因为思路被卡、代码调不出而慌张,这是不行的。真正考试时需要放平心态,不要被旁人压力,\(\color\red相信\)自己还是很强的!然后对于时间规划,我要把 T1 的完成时间控制在 50min 以前,但是就算超出也不要慌 ,就说明题可能较难,正常做就行。T2 正常做完要控制在 2h 内,因为这样才有时间去想后面两道题的部分分。如果看 T3 眉清目秀可以先去把 T4 暴力打完再冲 T3 正解,否则就去找找性质,看如果能凑出 \(\ge50pts\) 就直接把部分分写完去看 T4,实在想不出来也没关系,大不了就拿 20 到 30 分。想想万一 T4 能凑出更多的分呢?