知识点梳理
dp
dp是一切题目的正解
在我看来,所有的题都是dp的思路,状态转移的部分实际上是所有算法都具备的,所有的算法都有自己的状态和转移方法。对于有后效性的dp依然可以通过一些操作去除后效性。(虽然有复杂度的提高)。
重要的dp分为几类
- 线性
- 背包
- LIS
- LCS
- 维度
- 区间
- 树形
- 数位
- 期望
- 状压
- 插头
d
p
\ dp
dp可以很简单,也可以很难。
根据某位大佬说,
d
p
\ dp
dp相当于有向无环图,就是在图上求最长路/最短路/联通性问题。
解除后效性可以用很多方法包括开更多数组,添加更多状态,倒着
d
p
\ dp
dp等等等。
优化
在我看来,主要有四个:
- 前缀和
- 单调性
- 斜率
- 数据结构
难度可以说是依次递增。
图论
图论的题目灵活多变,但不是说不能分类,大概有这几类。
- 最短路问题
- 联通性问题
- 生成树问题
- 树上问题
- 网络流
图论问题的多变来源于他的定义。图论是元素与元素的关系,而几乎所有东西都能被抽象为元素(不能抽象的东西我还没见过)。
点事元素,边就是元素之间的联系,如此一来图论要解决的问题就非常明了了。尽管将问题转化为元素之间东方关系可能是困难的,我们依然有一些技巧来帮助我们抽象它们。
- 分层图
- 差分约束
- 数论建图
这些是少数可以整理出来的方法。这样系统的方法是弥足珍贵的,对于我们而言也是及其幸运的。善用这些方法可以解决大量问题。
数据结构
这是最简单的东西,只要学会了就能做一大堆题。
没啥好说的,不会就去学,学会就能用。
需要注意,很多时候我们必须在树上进行操作。不过我们可以采用很多方法将数据结构树上化。
- 求dfs序
- 线段树->树链剖分
- splay->LCT
- 分块->树上分块
- 可持久化
其中可持久化不仅仅能实行树上操作,不过它确实是树上操作的好帮手。可持久化几乎可以使用在所有的数据结构上,即使是队列,堆这样的简单数据结构。他的实用性是难以想象的。
数学
世界上最难的也是最简单的东西。一个二年级的小学生都学的东西。然而超级超级难。
大概这么分类,知识点巨多。
- 整除理论
- 整除基本知识和定理
- 整除分块
- 带余除法
- 最大公约数理论
- 算数基本定理
- 素数分解
- 既约剩余系
- 不定方程(同余方程)
- 一次不定方程
- 二次不定方程
- 一元一次同余方程
- 二次剩余
- 指数与原根
- 数论函数
- 积性函数
- 欧拉函数
- 莫比乌斯函数
- 积性函数性质
- 数论函数变换
- 莫比乌斯变换
- 狄利克雷卷积
- 傅里叶变换
- 数论变换
- 积性函数
- 组合数学
- 基础组合数学
- 杨辉三角
- 卢卡斯定理
- 数列基础
- 斐波那契数列
- 数列通项
- 线性代数
- 矩阵运算
- 线性代数基础
- 矩阵对于其他算法的优化
- 博弈论
- 瞎搞的博弈论
- 有理论基础的博弈论
- 计算几何
数学真的是很难很难,但oi不会要求真正困难的数数学知识。尽管如此,熟练使用数学依然及其困难。
数学有时有出其不意的效果。
常用算法和离线算法
常用算法
- 搜索
- 贪心
- 排序
- 二分
- 倍增
- 离散化
- 高精度
- 启发式合并
离线算法
- cdq
- 整体二分