ACM学习小结

    前段时间为自己队伍总结了一下算法方面的东西,最近又有学弟学妹问ACM学习的东西,借着选拔赛刚好结束,忽觉得为什么要单单为我们队总结算法,而不是将整个ACM的学习来个小结,于是,此文便诞生了。在谈及正题之前,我也先说下,ACM的学习人各有异,我的方法也不一定就适用于所有人,大家可以根据自己情况进行处理。另外,大家也可以去acmicpc.info那去找各种退役日志,包含很多人的学习方法。
    先说我最初学ACM的水平吧,从大一开始正式接触C++,就是不知算法,不会代码,乃至还略微想过要转专业啥的人。所以,对于想学ACM的人,与那时的我相比,只高不低,最少,在同一起跑线上。
    首先,一般要学ACM的人都是听过ACM的人,一般就是自己学校有这个东西的,那么作为一个准ACMer,首要任务就是先要从人山人海中脱颖而出,成功加入ACM队才行。我的感觉,就以天大的ACM选拔为例吧,首先,选拔赛的题目涉及高端算法的并不会太多,毕竟选拔面向的一般是大一大二的学生,叫一个不大会算法或者只是略微学了点算法的人去做算法题,也体现不出什么。就像这第二轮选拔赛一样,这次算法题出的不怎么多,主要是模拟题数学题为主。于是乎,对于选拔赛,我的建议就是,一个字,刷!刷他个两三百道,然后再遇到选拔赛也就没那么容易被打倒了,当然,如果其他人也在刷,那也只能让自己刷的更多才行了。
    如果能在大一入队最好,因为这样你就有ACM最为关键的一个时间段,暑假集训。之所以说它关键,也是因为它给ACMer提升的东西太多了,总结起来,我认为有两点:1、来自高年级ACMer的学习平台,包括可以方便提问题,以及TA们的授课等,这能够让初学者以较快的速度或者较短的时间突破自身不算太复杂的瓶颈。2、时间,个人认为暑假集训之所以关键,大部分原因都要归于这点,就以天大而言,暑假集训从早上9点到晚上9点,中间吃饭花掉1个小时左右,一天有11个小时学习,你或许会问,怎么可能集中的了精力学那么久,实际上,当你看到周遭全是盯着电脑屏幕看题,噼噼啪啪键盘敲击声不绝于耳时,你就知道,你能够坚持,这也就是人们常说的环境。然后,暑假放一周,一般会培训7~9周时间,周天放半天,一个暑假就算以7周计算也有差不多480+的集训时间,如果你够疯狂,周天不给自己放加,晚上多训一会,一个暑假哪怕对于一个初学者也是有逆天的可能的!
    那么没入队的呢?实际上,入队的人的优势就在于不需要太多的自觉性就能学习,因为培训时间定好了,大家都去了,队友都去了,自己不去岂不是卖队友?或者没组队之前就是谁还愿意跟你组?至于问问题,实际上百度也可以解决大部分问题。所以没入队的唯一能依靠的就是自己的意志力了,坚持像入了队的人一样或者不比他们差太多乃至比他们做的更过,那么一个暑假过后,他们与你也拉不开什么差距,待到第二年选拔赛,自己大二,水平已经有了,在于大一的新人竞争时就有了足够的优势,入队几乎没什么难度。
    接着,我说说具体学习上的吧,这应该算是ACM一直以来的难题,因为没有人能够说自己的方法就很好,就能成功,有的人就适合刷题提升实力,有的人就适合做比赛,有的人就适合看论文,还有人就适合玩ipad~。找到一条对自己能力提升最快的路,或者几条路,这对ACMer而言不仅是一个难题更是一种煎熬,尤其是在有大片可控时间时,或许,会发现怎么都提升不了水平,又或者提升的微乎其微,一种有劲无处使的感觉。这,习惯上被称为ACMer的瓶颈,突破了它,实际上就是验证了某条路对自己行得通,这是自己水平也就上去了。
    之于我,破掉这层瓶颈的方法就是“ACM刷题流”,正如“你若是天才,我便做疯子”,你能看下题目就能AC的题,我就做它个十几二十道,反正看书没啥看的,论文又找不到,比赛又被虐,着实无趣的很,索性一个劲的刷题,看着自己排名蹭蹭蹭的上升,管他实力具体究竟有没有上升,反正心是爽了一些,而且接着比赛的时候乍然发现,这题不是那啥的变体么,这题不是那两题的结合么?这题虽然没做过,但是感觉可以这样做!于是,突然觉得做了那么多题,虽然都是水题或者偶尔跳出道难题还是有用的,不知道怎么提升自己水平的,但的确它就做到了。
    然后,当我刷够八九百题的时候,一个个经典算法,经典数据结构,经典男人八题就出现了,死磕磕不动,跳过心又有所不甘,对自己
实力有所质疑,对自己方法有所质疑。其实现在看来,大概是这种方法第一阶段的能力提升因子,已经被我大部分吸收掉,这或许也就成了第二个瓶颈。这时,我对ACM也有了一些自我见解,敢有冲击final的野心啥的了,也开始查漏补缺,也就是看一些不会的算法,传说中的算法,一跳出来就能吓死人的算法了。接下来,读一些论文,认识到了一些牛人(额,我认识TA,TA不认识我那种),然后忽然发现以前一直在用的算法,还有这么奇葩的变体,还有这么牛叉的转化,思路又是大开,对以往认为的神题也有了进一步理解,可以根据题目讲解啥的将它做掉了。这个阶段,实际上是一个比较让人舒服的阶段,因为不用去天天盯着排名看,与五虎上将较劲,不用数自己还差多少题就刷进POJ前多少多少名啥的。而且,它还能让人真的就解决某类问题,真的就感觉到自己水平的提升,然而,尽管如此,还是不建议大家一上来就直接跳过第一阶段来磕论文,毕竟有时我们需要的是读懂并能实现,而非单纯了解思想,而没有第一阶段的积淀,也很难将一个高端论文的算法实现的,当然,如果你属于就适合读论文那种也例外。
    论文终有限,到最后,经历一次次搜索后,终于发现没有自己能读的文章了,于是,就是我现在的模样了,太高端的也就是传说中的算法级别啥的论文没办法读,太低端的又不用读就知道怎么做。这时,也只好回归ACM刷题流的本行了。
    我喜欢照着POJ的AC数由高到低刷,因为,这让我有一种循序渐进的感觉,觉得只要是别人和我旗鼓相当都能AC的题,我也没有理由做不出来。加上我也知道我的目标不是刷光POJ水题撑撑门面就撤的那种,所以我能心安理得的轻松切掉水题,然后逐步上升,渐渐发现,按照这种方式遇到的题,难住自己的不会太多,自己的水平随着做题的多少水涨船高,遇到实在不会做的,也有了能够去做出来的基础与信心,毕竟,刚才自己才过了一个AC数与此题旗鼓相当的题。所以,做到线段树,咬咬牙,破了,就学会了线段树;做到男人八题的树的分治,也硬着头皮上了,然后是Splay,块状链表,变异polya定理啥的,因为我始终坚信着,AC数意味着难度,我能AC与这道题AC数相差不多的题,也必然能够AC这道题。渐渐地,1W次AC以上的题没了,1000次以上AC的题没了,现在,大多数都是遇到5、6百题的题了。
    我说不上这方法的好坏,只是这方法不仅从水平上提升了我,也让我不至于有那种有力无处使的感觉,因为题数无穷尽,永远都可以找到题来练习。到了现在么,我总结出来的算法,也就树链剖分等一些偏一点的东西不会了,其他的,大多知道算法什么的,尽管或许我不能保证遇到其他题一定能AC,但是能够确保知道怎么做。
    总结起来,就是:
    刷题,囤积基础编程能力的技巧;
    刷题&看些简单PPT或者听老队员讲讲算法啥的,也是囤积基础能力;
    拼命刷题,将自己不会的暴露出来,将自己会的熟练起来;
    读论文,有了前面的基础,大牛教主写的论文也就不会显得那么难以攻破了,也能学到一些以前未曾想过的算法的运用;
    最后的刷题,也是现在我在做的,实际上目的也和前面差不多了,就是查漏补缺,然后,暑假的时候应该会把最后自己不会的东西看一下了,诸如树链剖分、莫比乌斯反演、傅立叶变换啥的。
    哦,补充一点,还有ACM应该准备的一些东西,必备东西我就不说了,论文啥的我上面也提了,额,实际上就想说说模板的问题。我的模板,从大一上期还没入队就开始整理了,当时很杂很乱,连累加求k^3的程序都有,然后逐渐缩减,变化,随着自己水平的提升,对于模板的认识也在提高,以前的模板大多去掉了,只留下些许让自己的模板看起来像模板的东西,实际上,比赛场上,遇到模板题的概率微乎其微,带模板大多数作用,也只是让自己有一个心理安慰罢了,而整理模板却不一样了,它让你对ACM有个系统的认识,有个大体的总结,这是去网上down模板所不能给你的!所以,我想说的就是,模板尽量自己整理,做不了教主那样随手一写就成了他人的模板,也要学习大牛用自己的模板吧?
    我的个人总结,对ACM认知,差不多如此,还是那句话,每个人都有自己的方法,生搬硬套不一定适用,但是也可以促进生成自己的一套方法,接下来的话,会把关于我们队的写写了。

你可能感兴趣的:(ACM学习小结)