ACM从入门到放弃
前言
写给我校新接触C语言的同学们,大概是ACM竞赛会涉及到的一些知识。因个人水平有限,同时我也是刚刚开始打ACM,内容并不会很深入。如有错漏之处,请加QQ:1208874505 联系我(Ice_teapoy)。具体内容大概有:
- 算法略讲
- 板子
- 奇怪的吐槽
- 其他
对刚刚接触算法竞赛的同学们的建议
1.如果对语言还不是很熟悉,请先多做一些入门题。不仅是为了掌握语言,更是为了熟悉编程思维。同时刷水题不要上瘾,只追求过题数量并不能真正提高水平。水题150~200左右应该开始比较系统的算法学习。
2.学习算法最好的方式是了解思想后自己尝试实现,再去阅读别人的板子寻找别人代码的优点。打印几百页板子甚至背熟都并没有什么用。
3.ACM是团队竞赛,所以发展自己擅长的方向很重要(DP、数论、图论、计算几何、数据结构等),但擅长Debug的队友显然更受欢迎。
4.日常刷题尽量计时,不要钻牛角尖,远超自己能力范围的算法没必要死磕。你花一两个月完成的代码不一定会(甚至一定不会)考到类似的题,即使考到,你也不一定能调出来。
5.前人的经验不一定要听,方法很多,思路很广,不走寻常路不是坏事。但前人的教训最好吸取,ACMer的竞赛生涯不长,掉进坑里还是挺疼的。
6.ACM竞赛是一种很难的东西,事实上,它只适合少部分人,而且知识更新换代的速度非常快。如果想取得好的成绩需要付出很大的精力。注意是付出很大精力,并不仅仅是时间。
7.很多时候非技术原因才是竞赛失利的主要原因,考试策略和调整心态非常重要。
技能树
如果你了解C的基本语法,明白什么是变量、数据类型、判断、循环、数组、函数,并能够使一份CE的代码成功运行起来,那么这份教程将比较适合你。否则,请百度C语言+变量(数据类型、if语句、switch语句、循环、数组、函数等) _(:3丿∠) _
另外,以下知识列表以知识点方向为分类标准,并不是推荐学习顺序。
算法详解与模板待添加。
基础
基础知识
模拟
排序
递推
递归
搜索
- 深度优先搜索
- 广度优先搜索
贪心
- 贪心算法
二分
图论
图
树
邻接矩阵存图与遍历
- Vector存图与遍历
- 邻接表存图与遍历
一笔画问题
哈密顿回路问题
差分约束系统
生成树算法
- Prim最小生成树算法
- Kruskal最小生成树算法
- Boruvka最小生成树算法
- 严格次小生成树算法
- 生成树计数算法
最短路算法
- Floyd多源最短路算法
- Dijkstra单源最短路算法
- 朴素Dijkstra
- 堆优化Dijkstra
- Bellman-Ford单源最短路算法
- SPFA单源最短路算法
- Johnson多源最短路算法
- Dijkstra次短路算法
- K短路算法
LCA(最近公共祖先)算法
- 倍增法
- 树链剖分
- Tarjan
强连通分量(缩点)
- Kosaraju算法
- Tarjan算法
二分图算法
- 匈牙利二分图最大匹配算法
- Dinic实现二分图最大匹配(网络流)
- *KM最大权匹配算法
仙人掌与圆方树
动态规划(DP)
线性DP
- LIS(最长上升子序列)
- LCS(最长公共子序列)
- LCIS(最长公共上升子序列)
- 最大子段和问题
背包DP
- 0-1背包问题
- 输出方案
- 完全背包问题
- 多重背包问题
- 混合背包问题
- 二维费用背包问题
- 分组背包问题
- 有依赖背包问题
- 泛化物品
- 求次优解、第K优解
区间DP
树形DP
数位DP
概率期望DP
状态压缩DP
DP优化
- 斜率优化
- 数据结构优化
- 矩阵乘法优化
- 鹰蛋问题
数据结构
栈
队列
- 单调队列
堆
- 二叉堆
- 斐波那契堆
- 可并堆
- 配对堆
并查集
- 加权并查集
- 可持久化并查集
线段树
- 可持久化线段树
- 权值线段树
- 动态开点线段树
树状数组
ST表
块状链表
Splay(伸展树)
Treap
范浩强treap
替罪羊树
树套树
LCT(Link-Cut Tree)
网络流
Edmonds-Karp最大流算法
Dinic最大流算法
ISAP最大流算法
HLPP最高标号预流推进算法
zkw最小费用最大流
Primal-Dual原始对偶算法
上下界最大流
字符串算法
高精
KMP匹配算法
Manacher算法
字符串hash
Trie树
后缀数组
AC自动机
后缀自动机
数论
欧几里得算法
- 辗转相除法
- 扩展欧几里得算法
逆元
快速幂
筛法求积性函数
- 莫比乌斯函数
- 欧拉函数
- 约数个数
- 约数的和
中国剩余定理
BSGS
整除分块
Pollard-Rho算法
计算几何
基础表示
常用函数
多边形
凸包
半平面交
旋转卡壳
最小圆覆盖
三维计算几何
多维立体几何