算法竞赛入门
前言
因为最近指导一些朋友入门算法竞赛,颇有心得 懒得以后复述,不妨写篇博客。
适用于OI / ACM
第零阶段
建议使用codeblocks,vscode,sublime,vim,emacs等编辑器或者IDE。不建议使用dev!不建议使用dev!不建议使用dev!
各大OJ介绍:OJ就是online judge,在线做题网站。
第一阶段
这一阶段主要是学习语法和简单的模拟。
要求:
熟练使用函数,结构体,高维数组,循环语句等。
自我感觉能够把编程语言当一门工具来使用。
掌握基础的debug方法,如输出调试等。
第二阶段
这一阶段学习简单算法。
这里开始要明确算法竞赛中的几大板块:数学(数论,组合计数,概率期望,线性基等),图论,树论,字符串,数据结构,DP,其他。
目标,掌握二分,枚举,dfs,bfs,树和图的储存方式,树的遍历,gcd,埃氏筛,简单线性DP,前缀和与差分,并查集。
会使用桶,栈,队列。
这一阶段主要是起到了一个引入和过渡的作用。
第三阶段
这里需要学大量的重要算法,同时代码能力会得到提高。
需要学会的知识如下:
数据结构:线段树,树状数组。
DP:多维DP,树形DP。
图论:最短路的三种算法,分层图,最小生成树,tarjan。
树论:树的简单信息统计(如深度,子树大小),树上差分。
字符串:字符串hash,kmp。
数论:gcd,exgcd,crt,线性筛素数,线性求逆元。
组合计数:组合数,lucas定理。
概率期望:简单的概率期望DP。
其他:STL(set,优先队列,map),对拍。
这一部分完成后,普通题目应该都不成问题。
第四阶段
学习各种经典高级算法,如点分治,整体二分,树套树,主席树,多项式算法(FFT,分治FFT...)等。目标是能够解决正常省选难度的题。
第五阶段
紧跟时事,学习当下热门算法与套路。