凸费用:动态增加转移
网络流:动态加边
最简单的方式就是在对每一条流量减少的边检查是否需要加边。
需要对费用函数和边集建立起映射。
动态规划:动态转移
刚做了一道比较经典的题目,满足随着状态的递增,DP值的增量减少。于是就可以当且仅当这个前面所有的状态都被用完以后再加入这个状态,就可以大大减少预处理的复杂度。
反正只要证明出来费用满足凸性,就可以考虑一下动态加入。
整体二分
要考虑二分完答案以后该干些什么,一般来说是统计大于或者小于二分值得数量之类的。
刚刚用过的经典应用就是路径最值。区间维护最大值的东西不太支持删除,利用整体二分就可以转化为计数问题简单解决。
二进制分组
一般是处理序列上两两元素之间的问题。
按二进制每一位的不同,先统计分成的两组间相互贡献的答案,然后递归下去。
二分图匹配
匈牙利算法。
这个算法建立在找交错路径的思想上。
显然
A+B
个点的二分图不会超过
min(A,B)
个匹配。
考虑从每一个未匹配点出发,尝试去寻找交错路。显然一个点被找过,而没有发现交错路,下一次就不需要再找了,于是可以弄一个标志数组,在每一次找到增广路以后清空,其余情况对每一个找不到增广路的点打上不要再次经过的标记。
总时间复杂度
O(VE)
网络流算法
dinic
优化
- 当前弧优化:记一个 curx 表示增广到哪一条边,在bfs时重置 cur 数组。
- 假如某个点
x
被增广完还有剩余流量,就将
disx 标为 −1 ,表示不需要再尝试增广这个点。
SAP
优化
- 当前弧(SAP需要在重置标号时重置当前弧)
- GAP
- 拒绝无用重复增广
高斯消元
可以解出满足若干个方程组的变量的值。
若出现
0=1
这种方程就是无解。
解的数量与自由元数量有关。
拉格朗日乘数法
多元变量的最优化问题。
组合数学
- 插板法
- 差分表
博弈
- 构博弈图转为二分图匹配问题
- 阶梯 nim 游戏
欧拉回路
搞出一个欧拉图或者只存在两个奇点的连通图就可以考虑欧拉回路了。
计算几何
点事件、圆重叠计数(通过求焦点和点事件)
莫队和分块
莫队:可以转化为只有插入或只有删除。
分块:要求可以快速处理一整个块的询问和修改即可。
同样的,分块还可以对询问区间对询问进行分块。
注意调整分块大小。
矩阵乘法
不要死脑筋,状态很重要。
字符串
- KMP:重点是构 fail , fail 数组的意义是这一位为结尾的后缀与前缀相等的最长字符串的长度。
- AC自动机:构出 trie 以后 bfs 构 fail ,然后建立 trie 图。
- 后缀自动机: fail 树从叶子到根经过了每一个后缀的后缀。
- 后缀数组: height 数组是关键。
概率
条件概率
P(A|B)=P(AB)P(B)期望的线性性