二分
把求解问题转化为判定问题,int->bool
牺牲一个log,使得思维简单化
使用前提有单调性
比较经典的是:第K大,0/1分数规划,凸包上二分
平衡树、权值线段树的查询,一定程度上都类似于二分的过程
三分
凸函数,找最值
复杂度:$O(2*log_{frac{3}{2}}n)$其实并不优秀
分治
顾名思义,就是分而治之
一般分治就是分治,考虑本层[l,r],考虑[l,mid],[mid+1,r]
好处是有的放矢,可以范围地划分统计答案的位置。
划分为子问题是条件
对于处理区间问题尤为经典
对于本层的[l,r],可以统计左端点在[l,mid],右端点在[mid+1,r]部分的答案。一般再用数据结构维护
以及:位运算按位分治,splay分治建树
利用分治的思想算法很多:
多项式系列,(动态)点分治,cdq分治,,
cdq分治
和一般分治不同的是,cdq分治更着眼于前一半对后一半的影响,也就是有极性(普通分治一般没有极性)
经常处理条件含偏序的问题,cdq分治本身的排序和处理顺序就无形中进行了降维
就对cdq分治的顺序有要求了。cdq左,合并,cdq右,对于分治dp是必要的。一般的多维偏序顺序无所谓
点分治
处理树上路径统计(点对)的一大利器。
枚举重心,统计过重心的所有路径,典型地分治“有的放矢”的特点
类似树形dp的处理方式,更易于数据结构的维护
O(nlogn)logn的上界仅仅在树为链的时候才会达到。
非常常规而优秀的一个算法
分治本质是一个树形结构(线段树),点分治维护分治树,就可以支持一些小范围的修改操作了。
动态点分治
为了不重不漏,经常维护到分治树父亲部分的一些信息(因为父亲只有一个)
边分治
线段树分治
贪心
智商与直觉的算法
(这个是NOIP热门算法(逃~))
当前最优解->局部最优解。复杂度通常较低
经典的问题:字典序问题
一些题是直接贪心:可以严谨(打表)证明
一些高端的贪心为了保证是对的,干脆支持反悔操作:
往往利用差分得以实际上的反悔
网络流的退流就是经典的模型
模拟
emmm
考察选手的代码能力和心态~~~
倍增
本质是进行2进制拆分
一次跳跃2^k使得复杂度在log
经典:倍增求LCA,后缀排序。经常见于树上路径处理
也有不同的:NOIP2018保卫王国
经常也有倍增预处理
快速幂
枚举
动态规划
正所谓万物皆可DP
只要问题具有最优子结构,无后效性,子问题重叠性性质
本质是对搜索的路径压缩(也即记忆化搜索)
状态、阶段、决策、转移
状态设计还是比较灵活的,因题而异。
(对于一些后面dp还要考虑前面一些填法的时候,不妨在填入的时候,对未来做出承诺或者限制[学习笔记]对未来做出承诺的DP小结)
阶段主要为了防止后效性考虑
决策就是合法性和最优性了
转移的影响也是考虑定义
方式有如:递推,记忆化搜索,甚至map当做队列来存(12.26模拟赛T3)
基础DP
背包
0/1,完全,分组,多重
是动态规划的基础问题,对于物品的组合处理有借鉴的意义
FFT可以优化背包问题
状压DP
对于一类数据范围较小,但是要求精确打击的问题
可以用状压dp解决。即暴力记录一些物质的属性
通常复杂度是2^k,3^k这种
斯坦纳树
连接一些关键点的最小生成树
插头dp
基于连通性的状压dp
暂时没写过什么题。。。
数学期望DP
做多了其实不是很麻烦
考虑期望的线性优美性质
数位DP
基于数字数位一类(无聊)DP
写起来细节很多
通常对拍好写,通常不对拍一定丸
动态DP
带修改,但是最后的结果还要通过dp来实现
dp的转移矩阵就出现辣!可以每次只改一个值,最后花费一定时间,直接算出答案
各种线段树、树剖、全局平衡树(不会)维护转移矩阵就出现辣!
DP套DP
???
然后是各种优化
使得基本上列出正确的DP式子
没有不能做的
单调队列优化DP
对于决策的取值是一段区间
并且“某些决策”在一次不优秀之后,一定“到死”不可能更优秀
以此排除没用的决策。使得队头永远是最优决策
O(N)优秀复杂度
数据结构优化DP
非常暴力了,没有单调的优秀性质,只能再费一个logn(甚至2个)。数据结构维护每个决策点的贡献。
线段树维护单调栈,树状数组LIS,区间贡献拆成L加R+1减………………
斜率优化DP
属于数形结合
可以化成:y=k[i]*x+f[i]+b[i]的形式,其中f[i]是dp值,(有交叉项,那么推式子的时候往这边想)
就转化为了给定一条斜率为k的直线,选择(x,y)使得截距达到最值
维护凸包
根据x、k的单调性问题,单调队列,二分三分,平衡树维护凸包(还不会),线段树维护vector维护区间凸包(前提是加入一定按照x递增)
决策单调性优化DP
DP中最玄学一块
四边形不等式:
如果w(l,r-1)+w(l+1,r)<=w(l,r)+w(l+1,r-1)(取min情况)
那么w满足四边形不等式
如果f[i][j]=min(f[i][k]+f[k+1][j]+w[i][j])w满足四边形不等式
那么f满足决策单调性
(好像)对于:f[i][j]=min(f[i][k]+w[k+1][j]),w满足四边形不等式,那么f也满足决策单调性。。
DP凸优化/WQS二分
一类有限制的选择的DP,把选择看成横坐标,最值看成纵坐标,画出的函数图像是一个凸包。那么可以DP凸优化
通过二分进行降维,实现O(n^2)-O(nlogn)的转化
数据结构
队列
栈
链表
并查集
并查集重构树
按秩合并
路径压缩
可持久化
树状数组
线段树
李超线段树
SegmentTree Beats
线段树分治
线段树优化建图
平衡树
Trie树
KD-Tree
Link-Cut-Tree
树套树
分块
左偏树
虚树
Kruskal重构树
并查集重构树
二进制分组
图论
树
最小生成树
LCA
树链剖分
dfs序
bfs序
欧拉遍历序
最短路
二分图
网络流
最大流
最小割
费用流
上下界网络流
Tarjan
强连通分量
2-SAT
点双联通分量
边双联通分量
其他
拓扑排序
长链剖分
数学
初等数论
基础芝士
约数
素数
(扩展)Lucas定理
(扩展)中国剩余定理
Miller-Robin
Pollar-Rho
(扩展)欧拉定理
组合数学
prufer序列
斯特林数
整数划分数
置换群
矩阵
高斯消元
行列式
多项式
生成函数
数列的递推
组合生成函数
指数生成函数
卷积生成函数
筛法
埃拉托尼斯筛
欧拉筛
杜教筛
Min_25筛
莫比乌斯反演
数论函数
整除分块
微积分
导数
积分
计算几何
凸包
旋转卡壳
Grahamn
半平面交
格林公式
辛普森积分
字符串
KMP
Manacher
Trie树
AC自动机
后缀数组
树上后缀排序
后缀平衡树
后缀自动机
后缀树
搜索
DFS
BFS
迭代加深
A*
IDA*
DLX
其他
爬山算法
模拟退火