算法理解汇总

(可能有错别字和误用)

基础算法

二分

把求解问题转化为判定问题,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是必要的。一般的多维偏序顺序无所谓

[学习笔记]CDQ分治

点分治

处理树上路径统计(点对)的一大利器。

枚举重心,统计过重心的所有路径,典型地分治“有的放矢”的特点

类似树形dp的处理方式,更易于数据结构的维护

O(nlogn)logn的上界仅仅在树为链的时候才会达到。

非常常规而优秀的一个算法

分治本质是一个树形结构(线段树),点分治维护分治树,就可以支持一些小范围的修改操作了。

动态点分治

为了不重不漏,经常维护到分治树父亲部分的一些信息(因为父亲只有一个)

边分治

线段树分治

贪心

智商与直觉的算法

(这个是NOIP热门算法(逃~))

当前最优解->局部最优解。复杂度通常较低

经典的问题:字典序问题

一些题是直接贪心:可以严谨(打表)证明

[学习笔记]贪心

一些高端的贪心为了保证是对的,干脆支持反悔操作:

反悔自动机与反悔堆——有关贪心的反悔操作

往往利用差分得以实际上的反悔

网络流的退流就是经典的模型

模拟

[学习笔记]模拟

emmm

考察选手的代码能力和心态~~~

倍增

本质是进行2进制拆分

一次跳跃2^k使得复杂度在log

经典:倍增求LCA,后缀排序。经常见于树上路径处理

也有不同的:NOIP2018保卫王国

经常也有倍增预处理

快速幂

[学习笔记]快速幂&&快速乘

枚举

动态规划

正所谓万物皆可DP

只要问题具有最优子结构,无后效性,子问题重叠性性质

本质是对搜索的路径压缩(也即记忆化搜索)

状态、阶段、决策、转移

状态设计还是比较灵活的,因题而异。

(对于一些后面dp还要考虑前面一些填法的时候,不妨在填入的时候,对未来做出承诺或者限制[学习笔记]对未来做出承诺的DP小结

阶段主要为了防止后效性考虑

决策就是合法性和最优性了

转移的影响也是考虑定义

方式有如:递推,记忆化搜索,甚至map当做队列来存(12.26模拟赛T3)

基础DP

基础dp例题整理

背包

0/1,完全,分组,多重

是动态规划的基础问题,对于物品的组合处理有借鉴的意义

FFT可以优化背包问题

状压DP

对于一类数据范围较小,但是要求精确打击的问题

可以用状压dp解决。即暴力记录一些物质的属性

通常复杂度是2^k,3^k这种

斯坦纳树

连接一些关键点的最小生成树

[学习笔记]斯坦纳树

插头dp

基于连通性的状压dp

暂时没写过什么题。。。

数学期望DP

做多了其实不是很麻烦

考虑期望的线性优美性质

概率和数学期望小结

数位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中最玄学一块

决策单调性优化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)的转化

[学习笔记]凸优化/WQS二分/带权二分

数据结构

队列

链表

并查集

并查集重构树

按秩合并

路径压缩

可持久化

树状数组

线段树

李超线段树

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

其他

随机化算法

爬山算法

模拟退火

离线算法

线段树分治略

cdq分治略

整体二分

扫描线

莫队

时光倒流

 

posted @ 2018-11-30 16:43  *Miracle*  阅读(497)  评论(2编辑  收藏  举报