关于一名大一零基础蒟蒻ACM变强的路子
20.10.8 我加入集训队,虽然当初回头出的题很水,都是一些会写代码就能做的题。但在当初的我wa了好几发的时候,心中真的极度不平静。非常害怕被刷下来。不过最后有惊无险用数学知识解开了那些题。我坚持了一年的数学竞赛倒是帮了我蛮多。也许当初没有那急智,或许我也不会选择ACM的路子,也不会有现在这个我。
说回ACM,大一前第一个月,我主要任务其实是学会一门C语言和C++,因为零基础的我,最痛苦的事情就是学语法,好在我背书记忆能力不错,把所有可能性背下来之后自然而然贯通了起来。也逐渐把C++的语法慢慢掌握了起来。当初印象里最绝望的是指针这一章,课本讲的稀里糊涂,网上讲的东西看起来很深奥,其实是真的很玄乎。无奈之下我也是曲线救国,从别的学长那里请教了好久慢慢搞懂了这些。之后封装多态也慢慢通过语法背诵掌握了起来。这样下来就到了11月了。(我是9月开始学的C语言)
另一方面,我刚进集训队就分组,分到了一个曾经打过oi的人和一个大二的绩点怪。我曾经也觉得这样的组合其实挺适合的,三个人都有打ACM的氛围,变强指日可待,或许可以坚持到我的大三。可现实远远比理想骨感,我打完第一场省赛的时候,大二学姐就因为学业压力放弃了ACM,因为ACM的提升更加困难,它并不像学习那样简单的就能掌握,而且还有海量的算法和技巧是今后鸡肋的东西。
说回我自己,我从11月开始正式学习算法和数据结构。当初因为分组的关系,我被分到了数论和动态规划。我把科技点硬生生从简单的递归,提升到了欧拉函数,然后是死活也学不明白了。矩阵系列更是因为没有线性代数的基础,学起来异常吃力。至于组合数学,容斥原理更是只学会了普通的递推互斥,其余一窍不通。抛开这些,我学会了简单博弈和sg函数,这些东西大抵是在一场又一场超越我自身能力的训练赛中收获的,仅仅很少一部分是自己在自主学习中掌握的。这点也让我意识到,其实我的平时学习压力是不够的,而且课程对我来说也是不能放下的东西。这一切都在束缚着我的手脚。
大约12月份,也就是期末考,校赛的时候。我被卡了一道图论板子题,成为了我一道过不去的坎。我意识到我的算法学习不应该因为所谓的分组而干扰。真正的算法选手不应该是“我不负责xxx,所以这题我做不来也很正常”,而是,“虽然我不负责xxx,但是我可以讲给你我用这个知识的思路”,甚至在队友可能完全没有思路的时候,我配合着我自己的所学可以给他一定的启发,让他知道这题其实是某几个知识点的变种。
于是我的寒假开始了。在此之前,我的题量大概是20到30左右(有人问我这个题量怎么算,我按洛谷照绿+,CF1800算的,别人我不管,主要是我不喜欢做太简单的题,感觉提升力度很低)
寒假报了寒假牛客算法训练营,简单的提高了一下见识。我当时第一次接触状压dp,印象也是异常深刻,因为那也是我第一次在赛场上遇到高精度算法。
还有递推,曾经我对递推只能是玄学推,在罚坐五小时的训练营中,我逐渐把握住了递推的奥妙,这种感觉令我着实着迷。
当然寒假少不了CF,因为这个阴间场时间对我来说极度不友好,我的生物钟偏早,不适合学校打这个,寒假就成了我们上分的好时机。我也在寒假第一次达到青色,所谓的初始色。
大抵寒假就是这样,其余的时间不是约朋友出去玩,就是谈恋爱,还有就是打游戏刷视频,毕竟生理需求还是要正常解决。
大一下开始之后,我逐渐意识到学校的课程对计算机系的学生来说是有些落后甚至是过时的。我开始打定决心自学算法,一个大一下,在其他大一学习离散而生疏代码的一个学期里,我却每天都在集训室坚持敲代码补题思考算法,读英语。
在同学还在寝室里睡觉的时候你却要逼着自己早点爬起来去背单词,看算法书,在他们打游戏的时候,你只能耐着性子走出寝室找自习室敲代码。我觉得这才是大一ACMER最大的困难,周围的人不一定在卷,但是竞赛圈子不卷就是被卷。
于是我搬出了宿舍,因为我的学习确实影响了其他人的休息和娱乐。我开始找状态全面学习算法。
我又重新分到了一个队友,不过这个队友跟我组队的时间并不长。
我把数论分给了他,而我负责了他们俩都不愿意负责的数据结构。
先是自己开始琢磨起了oiwiki这个网站里的知识,后来发现oiwiki很多讲的不全,开始学起了wiki,然后英语需求量也在增大。
大约在4月左右,我把数论的算法基本都扫了一遍,但是都是浅尝辄止,因为很多算法是需要时间推导才能学会,我感觉大一已经来不及像我这么折腾,我需要有更多的时间留给别的算法,比如图论和数据结构。
这主要的原因是4月我的昆明站打铁,给了我巨大的刺激。我终于明白了,打过一次铁之后对ACM算法理解更深这句话的意义。
我的那个队友退队了。昆明站也给他同样巨大的打击。
将近5月份,我加入了一个奇怪的算法群,这个算法群说是交流群,不过更多时候感觉是个吹水群。这个群倒是给了我蛮大的帮助。我这人擅长费曼学习,因此在他们问一些基础算法的时候,为了给他们讲明白,我会开始回头自学这个算法,把当初背下来的算法默写出来,然后思考这个算法的底层逻辑是什么。逐渐开始明白了KMP,ac自动机,前缀树,二分,树状数组等一些比较简单但是思维量蛮大的算法。
从这时候开始我的算法算是得到了一次质变,从当初一个学破数学的,正式成为了一个可以打代码的数据结构选手。
这时候的我刷题量已经开始停滞,但是我学习的脚步却没有停下。我开始捡起了DP,学起了一些更加底层的dp思想,我重新开始认真构思dp的含义和效果。逐渐走出了当初对DP的恐惧。
说出来你们可能不信,当初第一次接触dp,就觉得这就是一个玄学算法。
再然后就是省赛拿了个银,虽然是银首,一道签到题赛时被我歪成了金牌题,就离谱了起来。
省赛落幕,我正式进入了考试周。其实讲到这里大家就会发现我基本没提我平时的课程,其实我绝大部分时间都是翘课敲代码,仅仅是考前一两天拿来复习,就足以应付我学校的考试了。
文章洋洋洒洒写了很多,其实有用的干货并不多,主要是记录下自己的学习过程,希望给后来学ACM的零基础小学弟小学妹有一点参考,也希望你们不要被考试束缚手脚。
我学成这样都还是个废物,你又有什么资本不努力就做ac梦呢?