有效地刷题只有两种情况:
- 刷套题。找比赛的感觉,给自己定位;
- 刷知识点专题。巩固基础。
除了刷题,更重要的一件事是做比赛。一般来说,建议常去 TopCoder 和 Codeforces 比赛。这些地方题目质量有保障,大家的代码是公开的。同时很关键的是,这样的平台可以让你对题目的难度、比赛的进度、国内外顶级选手的实力做到心中有数,培养在大型比赛中所需要的大局观和节奏感。
另外,你可以尝试忘掉拿奖的事情。只要你真的有兴趣,拿奖是小 case
然后,要避免切水题,切一些稍稍高过自己水平的较难题,自虐提高难度
TC div2 500-1000, div1都是锻炼思维的神器
spoj的数据结构题要切一些
还有sgu,不过切不动...
ACM本身没有止境,如果所有东西都会,感到胸有成竹,建议看看算法书...一定会有新发现的
初学阶段要做的就是熟悉语言基础;熟悉基本数据结构和常见简单算法。
这些内容,书本里都有。推荐的书籍,《算法导论》。至于语言入门书太多了,不列举。
进阶阶段,看一下圈内的论文,学习进阶的算法和数据结构,比如变种的平衡树SBT;比如线性的素数筛法,中国剩余定理;比如dinic,预留推进,最高顶标;亦或者是快速的半平面交,凸包的交,高维凸包;又比如龙贝格积分,拉格朗日插值。
这里面有个重要的分类,就是动态规划。其实动态规划在学术界,我就用呵呵来形容好了。因为你根本就遇不到OI/ACM中那么复杂绕人的问题和模型,即使遇到了,直接建模,剩下的交给cplex就好。但是,在ACM界你会遇到很多很多的DP问题,变种,卡空间、卡时间,各种卡。所以得多看论文,培养解题的感觉是很重要的。
前一部分还是可以找到一些好看的书籍的,比如网络流,数论(初等数论、计算数论),数值分析,计算几何等。至于DP则没有啥好书了,作为一个刚上路的人,你会觉得理论和现实,差距真的好远好远。(但回过头来会发现其实理论真的描述了一切)
高级阶段,如果说初学阶段要做的是打基础,进阶阶段是加深深度,那么高级阶段就是加大广度。你需要涉猎许多理论,系统性的学习。比如你只知道dinic,只知道dijkstra,只知道bellman-ford是不行的,你需要知道整个图论它大概讲的是啥,你需要知道还有什么你是不懂的,不会的;再比如你只知道孙子定理,只知道丢番图方程是不行的,你需要系统地学习数论知识,你要深刻理解欧拉函数,要深刻理解莫比乌斯函数,要深刻理解扩展欧几里德,要深刻理解原根,等等等等。这样你才能知道原来扩展欧几里德可以轻松解出线性丢番图方程,你才能知道原来解二次丢番图方程要先解一下佩尔方程,你才能知道解高次同余方程就是质因数分解+扩展欧几里德+中国剩余定理。
在你涉猎了足够多的知识之后,再选择性的深入学习。为什么说是选择性的深入学习呢?因为一个人的精力始终有限,方方面面不能都照顾到,剩下的就要交给队友了,不然ACM为啥是个三人的比赛呢?
2. 实践部分
其实实践部分才是重中之重。
首先要知道ACM的代码是个什么样的水平。
1. 代码不多,大多在100行左右,多的在300行左右。当然,这些都是普遍的,也不排除有很长很长的代码。或者换种说法,大多数代码在1KBit左右,长的代码在3K,打表的代码不算。
2. 编程风格极“差”。这其中的代表有:
(1)几乎所有变量都是全局变量,因为平时练习中有内存限制,而静态变量区的大小足以应付。并且我们都知道,静态区的速度是要优于堆区的速度的,所以一般是不用new或者malloc的。
(2)代码怎么简单怎么写,以效率第一,牺牲部分代码可读性,牺牲安全性。
举个例子,比如用C++的选手,在没有特殊情况下,一般使用scanf而不用cin,这是因为前者效率比后者高许多,但scanf是有很多安全漏洞的,但是我们不管,因为我们正确的使用是不会导致问题的。
再举个例子,比如你用scanf读数据读到文件尾(EOF),一般的想法是用EOF != scanf(...)作为循环判断条件,而ACMer可能会写成~scanf(...)。总之,代码简写,效率第一。
3. ACM里的代码大多数是结构化编程,面向对象的绝对不用,基于对象的可以用一点。这是由于代码长度和效率优先的思想综合导致的。
好了,接下来是实践的正文。
ACM最重要的是什么,是 代码控制力。要做到写代码跟你讲话一样,不说错字(编译错误),不说错话(运行错误),表意正确(代码逻辑正确)。楼上说的做TC、CF的比赛当然是好的,但是这些并不适合初学者。
|
|
|
|
|
|
|
相关的知识
图论 路径问题 0/1边权最短路径 BFS 非负边权最短路径(Dijkstra) 可以用Dijkstra解决问题的特征 负边权最短路径 Bellman-Ford Bellman-Ford的Yen-氏优化 差分约束系统 Floyd 广义路径问题 传递闭包 极小极大距离 / 极大极小距离 Euler Path / Tour 圈套圈算法 混合图的 Euler Path / Tour Hamilton Path / Tour 特殊图的Hamilton Path / Tour 构造 生成树问题 最小生成树 第k小生成树 最优比率生成树 0/1分数规划 度限制生成树 连通性问题 强大的DFS算法 无向图连通性 割点 割边 二连通分支 有向图连通性 强连通分支 2-SAT 最小点基 有向无环图 拓扑排序 有向无环图与动态规划的关系 二分图匹配问题 一般图问题与二分图问题的转换思路 最大匹配 有向图的最小路径覆盖 0 / 1矩阵的最小覆盖 完备匹配 最优匹配 稳定婚姻 网络流问题 网络流模型的简单特征和与线性规划的关系 最大流最小割定理 最大流问题 有上下界的最大流问题 循环流 最小费用最大流 / 最大费用最大流 弦图的性质和判定 |
|
|
|
|
|
|