17蒟蒻转眼或成退役老学叔
真正接触acm是在大二上学期,大一学校安排的课程程序设计基础主要是写类似于pascal的伪代码,自己也缺乏了解的渠道,对拿奖拿到手软的大佬充满羡慕。直到大二刚开学,我参加了院里举行的acm实验室选拔赛,差不多cf次div2的难度,当时做了三道模拟排在27,进实验室只取前20,遗憾落榜。后来跟班里面的小伙伴一起没日没夜刷洛谷(当时是没有技巧的刷题,十分吃力收获有但不丰盈),学期末举行郑大校赛总算挤进了实验室。至于为什么一直想进这个实验室,因为实验室意味着本校的最高水平(里面个个都是人才说话又好听)。
刷题,不能盲目。当时为了过完洛谷的新手村和普及场刷了好多天,其实当你达到一定水平这些题可以不刷,但最好都看看,中文题面又不浪费时间,那些水题大多都是模拟,自己先来一个思路然后去题解区验证一波,那些思路无脑又需要写大模拟的题可以考虑不写。跟着洛谷普及场刷题感觉算法带入的略慢,平均一天不到10题的话,前面很多没有必要的题。不过也怪自己刷题慢,算法知道的少这样和小伙伴一起打比赛即便你思路比他更加活跃但也只能比他更快的过签到,其他的需要算法不是聪不聪明就能解决的。尽早的多接触算法是非常非常必要的,最小生成树,线性筛,最短路,贪心,基本的动态规划那些都是十分基础的,首先理解它的原理不要去背,去理解原题,然后多刷题,最好一个专题一个专题的刷,刚学最小生成树,刷一天就能刷透一个算法。当然,这些算法都太基础的,变式很多,不要陷进去太久。接下来多接触第二层次的算法,图论,树形等等,像线段树,二分图(匈牙利),树状数组~~ 这些都贯穿整个acm生涯,线段树也太频繁了~~。
第三阶段,就是更难一点的算法,往往都需要一些前置知识,像博弈论,单调队列,主席树,莫队,分块,模拟退火,后缀数组,FFT(我会用但是不理解原理)等等。学到的算法越多眼界就越开阔,比如我可以用模拟退火求极值的思想去解计算几何的问题,用珂朵莉树set维护的思想,去搞线段树区间赋值的那个东西。
再往上,单调队列优化dp,支配树,基环树等等原理或实现很难的算法。比赛是团队的竞技,如果你对哪个方面实在不感冒,比如我就有点烦字符串,因为难一点的字符串问题很多是并不简单的dp或者是ac自动机什么什么的算法,你和队友之间可以分工搞。
Claris说过,人傻就要刷题,那就刷题,还有必须补题,不是补那些不是给人做的题,补那些需要思维量有意义的题,放聪明点,放开点,都大学了别像高中一样放不下课本,大学很多科目突击一下也是可以考的不错的。最后,希望你也可以在省赛区域赛有个不错的成绩。
acm,是一场博弈,是一个锻炼,也是一种情怀。