.做简单题是入门的不二方法. 不要过早地涉及太高级的RMQ之类的东西. 即使你只需要用3天时间来入门,这3天也绝对不要碰太高级的东西. 入门的阶段要注意的几个事项: 我强烈建议在入门阶段就提高自己的准确率. 一个题目,你提交多少次才可以AC? 你预计自己花多少时间可以AC这个题目,而实际你花费了多少时间?? 尽量避免WA后才发现自己看错题目,或者花了几个小时,才发现自己的代码里有些很愚蠢的错误之类的事情发生. 从弱智题开始,一步步来.
补充一点,建议从入门阶段开始参加TC比赛.TC比赛对训练CODING能力帮助很大. 如果TC DIV2 250P 的成绩可以做到200以上,那基本上就可以等同于入门了.
2.当你发觉有些题目很无聊,不屑去做,而另外一些题目又想不到怎么做的时候,你就该进修一下了. 这个时候应该做题和学资料一起来.
一些比较重要的知识我列举一下:
基础型的知识:
最基本的图搜索dfs,bfs,最短路径[dijkstra(n^2的和mlogn的都要掌握),bellman-ford],网络流[ford-fulkerson和pre-push比较常用],floyd传递闭包,toposort拓扑索,欧拉回路求法,二分图匹配
基础数论:O(n^0.5)朴素检测素数,筛法+O(n/logn)检测素数,Miller-Rabin随机检测素数,gcd理论及euclid算法,euclid-extend算法,中国剩余定理,高精度,欧拉函数
基本组合数学:排列公式,组合公式,二项式定理,容斥原理,鸽笼原理,动态规划[特别重要].
计算几何学:各种点与直线之间关系的求法,凸包算法.
提高型的知识:
图论: 看图论导引吧
数论: 看初等数论吧 //初学的话,数论概论比较好
组合数学: 递推关系,生成函数,特殊计数序列,群论
计算几何: 看计算几何书吧
另外,提高期需要看国家队集训论文和黑书. 论文和黑书是提高的重要材料,不过比较难懂.
STL: 当你大概了解STL实现的原理,就可以开始使用STL了. 没了解的时候不推荐使用,这会导致很多麻烦.
一般的string,vector,set,map,algorithm,queue,list,deque,stack 都要掌握,在某些时候可以省下很多机械重复工夫[前提是这些工夫对于你是机械重复的. 如果without stl,你不能写出答案,那还是练习一下徒手写吧. 相信你不会只是为了增加题数而做题]
以上列举的知识[特别是提高型的]一时间想不全,以后想到会陆续补充.
所谓的做题和学资料一起来,我建议的方法是,开一个题,如果觉得不懂,可以问人[欢迎来问我,如果我会做的话]. 最好请别人不要告诉自己具体做法,只是给出相关的知识,然后自己去学习. 学习的过程中,自己不断尝试用新学的知识去解决遇到的问题. 这样我觉得提高得是最快的.
3.剩下的事情,就是不断积累了.
多做题,多看书.
这里推荐2个OJ
1是PKU. PKU现在国内人气最高. 题目更新快,每月有比赛,管理员认真管理,题目多人讨论.我觉得是最理想的场所. ZJU已经荒废很久了,你在上面提问,得到的回答会比在PKU的少得多. 而且PKU题目分层好,从入门级到世界冠军级都适合在上面做,赞!
http://acm.pku.edu.cn
还有1个是UVA. 别被UVA吓到了.其实UVA上也是有很多简单题的. UVA是一个世界性的OJ,人气旺,多人讨论,几乎每题都能在论坛里找到解答[那些只有10几个人会做的题除外] UVA题目的分层也很好,而且更新也很快. 但是唯一的缺点是访问速度慢. 优点是水题少[我讨厌水题]. 大家自己选择吧
http://acm.uca.es/p/
有些同学未入门就到SGU做题,在这里说明一下,我极度不赞成这种做法.
打个比方,就好像小学生在做大学物理的题目一样.
虽然某些题目的确可以解出.
但是这将会是一个陷阱.
可能刚开始做的几个简单题会进步很快. 但是慢慢地学习曲线会趋向于log函数,最后举步维艰.
而在UVA或PKU做题,学习曲线将线性上升,强烈推荐!! ^_^
最后希望大家在ACM道路上能够坚持下来. 祝大家都能学得一身本领.
Go everyone.
Go gdut acm.