我是ErikTse,如果你或你的朋友是计算机专业的新生,这个视频值得你收藏和转发给你的朋友们。
不要再问up高中有没有打过oi(奥林匹克信息学竞赛)了,up是纯零基础选手,大一才开始学c语言的,现在是准大三,获得过一些不错的奖项,有ICPC亚洲区域赛(济南)银牌、CCPC全国邀请赛(湘潭)金牌、ICPC全国邀请赛(西安)铜牌。
有不少朋友都想要up出一期关于算法的学习路线,于是有了这期视频,其实这一份计划不仅能帮助你学习ACM竞赛,还可以帮助你准备蓝桥杯、RAICOM等相关竞赛,并且在算法面试、考研、保研的机试中实现乱杀。
以下是一份针对大一零基础选手的算法学习路线建议,分为大一上、下学期,大二上、下学期四个部分:
大一上学期
基础知识
学习一门编程语言,推荐 C++。
掌握基本的数据类型、运算符、循环、分支、函数、数组等基本语法。
熟悉常用数据结构,如数组、链表、栈、队列等,这些都要会用数组来模拟实现,其中原因一个是加深自己对这一类数据结构的理解,另一个是这可以使得算法跑的更快,使用起来也更方便。
算法入门
学习算法基础知识,如时间复杂度、空间复杂度等,学会根据题目数据猜算法复杂度和打表。
掌握基本排序算法,如冒泡排序、选择排序、插入排序(主要学习算法思想)等。
学习基础算法,如前缀和与差分、二分查找、双指针、离散化、快速幂、乘法逆元、gcd、lcm等。
学习基本的递归算法,如斐波那契数列、暴力搜索(包括剪枝和记忆化)、分治法等。
初步了解图论、动态规划、贪心算法等常用算法思想,整理一些动态规划、贪心的模型。
练习
刷入门级别的题目,如洛谷的入门题(建议刷够100题)。
可以去尝试打一打Atcoder Beginner Contest(推荐,一般题意比较明确,思维难度较低)或Codeforces Div4,赛后一定要补题并多写博客,总结做题思路和代码细节。
也推荐大家去打一打牛客小白月赛(中文题面),对新手比较友好。
一定要参加校内的 ACM 集训队或者社团,在群里多说话,不要怕被大佬嘲笑,即便可能问的问题比较低级但是也要勇敢提问,多与同学交流学习经验。
这时候很多学校会举办ACM新生赛,一定要参加并争取拿到较好的名次。
大一下学期
数据结构进阶
掌握树的遍历、图的遍历等基本算法。
熟悉STL中的优先队列、map、set、multiset、vector、lower_bound、upper_bound等常用数据结构和算法的用法。
学习线段树、拓扑图、并查集、树状数组等数据结构。
算法进阶
学习线性的动态规划算法,掌握背包问题(01背包、多重背包、完全背包、混合背包、二维费用背包)、最长上升子序列等经典问题,理解多重背包的二进制优化。
学习贪心算法,掌握最小生成树(Prim和Kruskal)、最短路径(单源最短路Dijkstra,多源最短路Floyd)等问题的贪心思想。
初步了解数论,包括欧拉函数、欧拉定理、埃氏筛法(学习思想)、欧拉筛法、exgcd。
这时候也是思维提升的关键时期,要注意总结各种乱七八糟的结论,有条件的可以适当证明,写成一片文章,时不时翻出来看看。
练习
刷洛谷普及-到普及的题(黄题),同样建议至少刷够100题(如果想看up带刷100题的uu们留下你的评论和弹幕,一键三连,点赞过1000必出这个系列)。
练习线段树、并查集、图等高级数据结构的相关题目,可以在闲暇的时间找几道题来做,并自己写一篇文章关于对这个数据结构的理解。
这时候很多学校会举办ACM校赛,一定要参加并争取进队,一般只有进队了才有后续参加比赛的资格。
可以去尝试打一打Codeforces Div2(一般可以做到C题),cf的比赛比较考察思维,而对数据结构的考察较少,赛后一定要补题并多写博客,总结做题思路和代码细节。
当然ABC和Div3的训练也不要落下,牛客小白月赛和练习赛也很不错,推荐去做一做。
大二上学期
算法深入
学习字符串算法,如 KMP 算法、Manacher算法等。
学习数据结构,如单调栈、单调队列、trie等等。
学习高级的图论算法,如SPFA、二分图、DAG-DP、Tarjan强联通分量、倍增LCA、Tarjan离线求LCA等。
学习博弈论的相关知识,如基本博弈类型(巴什博奕、尼姆博弈、威佐夫博弈)、SG函数、mex操作等等。
简单的计算几何
学习计算几何的基础知识,如向量、点、线、面、叉乘等基本概念。
掌握平面几何和立体几何中的基本算法,如点线距离、线面交、求二维凸包等。
练习
刷洛谷绿题到蓝题。
练习字符串匹配、图论等高级算法的相关题目,要写更多dp的题目,尽量各种类型的都做一些,比如计数dp(一般是求方案数)、存在性dp(一般求某种情况是否存在、可行)、区间dp(尝试四边形不等式优化)、期望dp、数位dp、状压dp、树上dp(这个往往很难)。
参加 ACM 竞赛,多参加省内外的比赛(一般在牛客竞赛上可以看到),积累比赛经验和认识到更高水平的选手。
这时候可以多去打Codeforces上的比赛(Div2,Div3),一定要补题,写博客,尽量把分数刷上1600。
这个时间段也一般是第一次打正式比赛的时间,好好发挥一下~
推荐大家在正式比赛前,和队友进行几场vp,对正式赛题目有一个了解。
大二下学期
这时候的练习就比较自由了~
尽量多去提升思维,遇到不会的算法再去学,没必要不断的学习新的很复杂的算法(这样的性价比比较低)。
算法拓展
学习树剖、主席树(可持久化线段树)等高级数据结构和算法。
学习分块、莫队、Pollard Rho大数质因数分解、dp中的斜率优化、矩阵快速幂、差分约束系统等算法。
学习更深层的数论和组合数学,包括莫比乌斯反演、约数定理、生成函数、高斯消元、线性基等等。
练习
这时候尽量跟队友分工,常见的分工是三个人分别学dp(字符串)、图论(数据结构)、数论(博弈论)。
持续打Codeforces和Atocder保持手感,牛客小白月赛要尽量做到ak(all kill全部做完)。
参加 ACM 竞赛,多参加全国性的比赛,提高自己的竞赛水平。
以上是一份大一零基础选手的 ACM 算法竞赛学习路线建议,希望对你有所帮助。
需要注意的是,除了以上的学习和练习,平时的补题写题解、阅读题解、自己讲给自己(同学)听等也是非常重要的,希望你能够坚持下去,不断提升自己的编程能力和算法竞赛水平。
Comments NOTHING