套路总结
鉴于博主退役了 这些东西就公开出来造福大众吧
足足11k 省选到NOI的心血
套路总结
数据结构
实现
1.封装可以使代码变得更好调试
其他
1.合并类数据结构注意有重点可能会使复杂度假掉or总复杂度是总点数
2.权值线段树后缀减1仍保证大小顺序 可以考虑二分出最小的值 对于最小的值减x个令它最往前的x个位置-1就可以保证相对顺序仍不变
3.势能分析:珂朵莉树、EI Tree
图论
仙人掌
1.连通块计数:点-边+环
2.最大流/最小割:环上min删掉加到对面
3.描述对于任意两个点 \(s,t\),至多只会有两条从 \(s\) 到 \(t\)的边不相交的简单路径。
其他
1.欧拉回路注意弹栈时更新路径
2.圆方树注意x不应该被弹栈 可维护路径并
3.tarjan几种写法注意区分
4.kruskal重构树是二叉树
多项式
1.乘法映射加法做卷积
2.斯特林数等考虑只有k项可以插值
3.树上公用边计数 考虑代入x
4.\((P^{n+1}(y))' = (n+1)P^n(y)P'(y)\\ (P^{n+1}(y))'=(P^n(y))'P(y)+P^n(y)P'(y)\)
比较对应项系数
树论
1.联通块直径合并考虑端点合并
2.长度相关长链剖分 大小相关重链剖分
3.点分治注意测试极限数据避免复杂度假掉
4.每次到根的染色考虑类比LCT的access
5.两点LCA可以考虑两次Access的切换点
6.一个区间的LCA最大值考虑从叶子合并以后把编号相邻的合并出一个贡献对然后二维数点(log^2)
DP
1.状态和值反过来 (agc033D、soj918)
2.构造一种奇怪的顺序来 DP (luoguP5606)
3.行列不好更新时或许可以尝试斜列更新
4.绝对值考虑拆开讨论or中位数
5.从小到大插入维护联通块dp
6.树形dp联通块大小:选点
字符串
1.考虑枚举i 每i个分段统计答案O(nlgn)
2.trie建SAM注意bfs建复杂度才对
3.回文分奇偶后二分
4.大部分字符串算法(manacher kmp pam等)都是均摊复杂度 注意不可以直接可持久化(pam可以存转移边优化完成可持久化)
均摊
随机
1.前缀min/max O(logn) LIS O(sqrtn)
2.\(\sum k\le N\)可以发现不同的\(k\)只有\(\sqrt{N}\)
3.\(phi\)迭代\(O(log)\)次就会降到1;\(\gcd\) 变化只有 \(O(\log)\) 段;给 \(n\) 个数求 \(\gcd\) 总复杂度为 \(O(n+\log W)\),辗转相除高消复杂度为 \(O(n^3+n^2\log W)\)
定理
-
pick定理:格点三角形面积=完全内部点数+边上点数/2-1
-
Dilworth定理:最长反链=最小链覆盖
-
最长合法括号子序列 n-sn+2minsi
4. 拓展欧拉公式\(a^x \equiv a^{min(x,x\% \phi(p)+\phi(p))}(mod \ p)\)(O(logn)次降到1)
网络流
1.\((1-x)a+bx+(x_i\text{^}x_j) (x=0/1)\)最小割建图
2.形式如a^2的费用时考虑凸费用拆边
3.二分图独立集 最小点覆盖 最大匹配之间的转化
4.上下界费用流注意连边方向(di>0往t连) 以及区分 真s 和 虚s
5.棋盘/相邻限制->黑白染色
6.回路->考虑纵横方向拆点
7.优化考虑流完按照剩余流量建新点
8.平面图最小割转对偶图最短路
9.二分图可以考虑匈牙利算法的过程(维护增广链的过程,增广环上的边可以交换)
10.最大权闭合子图 (正连S,负连T,保留原边,最小割)
11.一定在二分图最大匹配上的点:有流量且无剩下的增广路(不能从s到达)
数论
1.\(\mu\)大部分时间可以看做容斥系数 直接往里套就行了
组合意义
- \(2^x\)拆所有子集计算贡献
- \(x^k\)重复计数k次相乘
- 连通图计数 先求不钦定连通以后多项式ln 反过来同理
- 子序列计数考虑矩阵维护
- polya定理以后大概率和gcd有关 转数论做法
- 固定1号点所在的联通块容斥
- 排列的逆序对数等于n-环数
逆序对数奇偶性=n-环数=偶环个数
排序最少交换次数n-环数
8.竞赛图强联通分量对于每个点存在长度为3~n的所有环 可以直接EGF
计算几何
1.注意设eps
2.和向量点积最大的一定在凸包上 多种问题都可以转化为凸包
3.遇事不决 辛普森积分
4.凸多边形三角剖分DP(中间可以划分开两边独立dp)/(拆对偶图树形结构)
概率期望
1.期望的常见设法 x时期望多少次贡献1/到达x的期望
2.遇事不决 迭代/二分
3.求期望题可以设一个势能函数,证明每次势能期望增加 \(1\),答案等于末势能减初势能,但并不是无条件成立(例如 CF1025G 里面终态一定是势能最大)
4.方差之类的拆开以后考虑(\sum)^2考虑两两对于答案的贡献 不一定非要组合意义
奇怪的东西
1.\(n=40\)常见的meet in the middle 和 \(O(2^m),O(2^{n-m})\)数据分治
2.\(n=60\text{~}70\)常见的拆分数
3.对于只考虑大小关系的考虑枚举答案/二分以后设置为\(1,-1\)
4.坐标问题考虑旋转坐标系; \((k+1)\) 维曼转 \(2^k\) 维切 (CF685C)
5.乘除取 \(\ln\) 转成加减
6.极值相关问题 考虑可能算法会贪心选择而不用优化 比如最短路/最小生成树/费用流等
7.xor具有传递性
8.可持久化如果可以建操作树 可以用树的结构来维护
9.回退数据结构如果更改是比较能接受的复杂度可以考虑存储哪些被更改回退的时候类似栈回退
10.修改查询时间复杂度相差悬殊时考虑不平衡分块
11.行列独立
12.出现次数为偶数/判定全部出现 随机权值哈希
错误总结
时间复杂度退化
1.lower_bound(begin,end,val)需要随机访问迭代器,也就是set和map之类的会退化成nlgn 它们需要使用set.lower_bound(val)
- memset尽量按个数清
C++内部实现
1.多组数据/弹出尾部 注意%s输出的时候可能会输出奇奇怪怪的东西
正确性
1.凸优化最后需要重新计算答案
数理知识
1.\(A^* \cdot A = |A|I\)
2.子序列计数考虑矩阵维护
3.容斥的时候大部分时候容斥和计算方案复杂度是分开的
4.polya定理以后大概率和gcd有关 转数论做法
5.固定1号点所在的联通块容斥
6.连通图计数 先求不钦定连通以后多项式ln 反过来同理
7.线性基有很多贪心的性质 比如高位可以代替低位
多项式
inv
ln
复合函数求导:\((f \cdot g)' = f'(g)g'\)
exp
牛顿迭代
除法
倒过来
线性递推
多项式取模 之后求贡献就可以了
BM
增量法构造 上次失配点记作c
证明考虑展开
拉格朗日插值
常用生成函数
套路
循环卷积是奇数时可以回退
求导大法好
取 \(\ln\) 大法好
换元大法好
矩阵
矩阵树(外向内向仙人掌)
反演
FWT
二项式
单位根
斯特林
莫比乌斯
这个随便吧
Min-max容斥
数论
杜教筛
考虑构造一个\(h=g*f\)其中\(h\)方便求前缀和 \(g\)方便单点求值
powerful number
CRT/exCRT
Cipolla
BSGS
一般是原根高次幂
原根判定
组合数学
斯特林数
第一类 置换 中括号
第二类 集合 花括号
第二类有方便的公式
常用组合意义
n次方->n个计数
\(\prod a_i\) 的转化 (atcoderDwango2020C)
\(\sum^n_{i=1}\prod^n_{j=i}\frac{1}{a_j}\) 的转化 (soj951)
\((n-1)!\) 的转化(第一类斯特林数、环排列)(固定点数和边数连通图计数)
猎人杀
常用组合公式
\(|A||B|=|AB|\) (均为方阵) 证明考虑构造矩阵 $$\begin{bmatrix}A&O\ -I&B\end{bmatrix}$$
\(AA^*=|A|I\)
给定形态小根堆个数为 \(\frac{n!}{\prod sz_i}\)
\(n\) 个点,已经连成 \(k\) 个连通块,大小为 \(a_i\),再连方案数为 \(n^{k-2}\prod a_i\)
博弈
阶梯Nim
奇数层的xor
翻硬币
等价于每个正面硬币单独存在的异或
删边游戏
奇环缩成点 偶环缩成点+边
Nim积
由于\(\{1,\oplus,\otimes\}\)构成完整的域(不会证 别找我)
又由于费马数\(t=2^{2^x}\)有性质(1.$a<t ,a\otimes t=a\cdot t$2. \(t\otimes t = \frac{3}{2} t\))所以可以分治乘快速求
具体来说