套路总结

鉴于博主退役了 这些东西就公开出来造福大众吧
足足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的切换点

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 kle N)可以发现不同的(k)只有(sqrt{N})

​ 3.(phi)迭代(O(log))次就会降到1;(gcd) 变化只有 (O(log)) 段;给 (n) 个数求 (gcd) 总复杂度为 (O(n+log W)),辗转相除高消复杂度为 (O(n^3+n^2log W))

定理

  1. pick定理:格点三角形面积=完全内部点数+边上点数/2-1

  2. Dilworth定理:最长反链=最小链覆盖

  3. 最长合法括号子序列 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 ext{^}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)大部分时间可以看做容斥系数 直接往里套就行了

组合意义

  1. (2^x)拆所有子集计算贡献
  2. (x^k)重复计数k次相乘
  3. 连通图计数 先求不钦定连通以后多项式ln 反过来同理
  4. 子序列计数考虑矩阵维护
  5. polya定理以后大概率和gcd有关 转数论做法
  6. 固定1号点所在的联通块容斥

计算几何

​ 1.注意设eps

​ 2.和向量点积最大的一定在凸包上 多种问题都可以转化为凸包

​ 3.遇事不决 辛普森积分

​ 4.凸多边形三角剖分DP(中间可以划分开两边独立dp)/(拆对偶图树形结构)

概率期望

​ 1.期望的常见设法 x时期望多少次贡献1/到达x的期望

​ 2.遇事不决 迭代/二分

​ 3.求期望题可以设一个势能函数,证明每次势能期望增加 (1),答案等于末势能减初势能,但并不是无条件成立(例如 CF1025G 里面终态一定是势能最大)

奇怪的东西

​ 1.(n=40)常见的meet in the middle 和 (O(2^m),O(2^{n-m}))数据分治

​ 2.(n=60 ext{~}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)

  1. memset尽量按个数清
C++内部实现

​ 1.多组数据/弹出尾部 注意%s输出的时候可能会输出奇奇怪怪的东西

正确性

​ 1.凸优化最后需要重新计算答案

数理知识

​ 1.(A^* cdot A = |A|I)

​ 2.子序列计数考虑矩阵维护

​ 3.容斥的时候大部分时候容斥和计算方案复杂度是分开的

​ 4.polya定理以后大概率和gcd有关 转数论做法

​ 5.固定1号点所在的联通块容斥

​ 6.连通图计数 先求不钦定连通以后多项式ln 反过来同理

​ 7.线性基有很多贪心的性质 比如高位可以代替低位

多项式

inv

[fh=1(mod x^{n/2}) \ (g-h)^2 =0 (mod x^n) \ g^2 -2gh+h^2 =0\ g-2h+fh^2 =0 \ g=2h-fh^2 ]

ln

复合函数求导:((f cdot g)' = f'(g)g')

[ln' f = frac{f'}{f} ]

exp

[e^x = 1+frac{1}{1!}x + frac{1}{2!}x^2+...\ taylor展开:F = f(x0) + frac{x-x0}{1!}f'(x0)+frac{(x-x0)^2}{2!}f''(x0)+...\ g=g0*(1-lng0+f) ]

牛顿迭代

[x_{n+1}=x_n-frac{f(x_n)}{f'(x_n)} ]

除法

倒过来

线性递推

[f(x) = x^k -b1 x^{k-1} - ... -bk ]

多项式取模 之后求贡献就可以了

BM

增量法构造 上次失配点记作c

[t= frac{Delta i}{Delta c}\ R_Delta = {0,0,0,(i-c-1)个0, t, -tcdot R_{c,1},-t...}\ ]

证明考虑展开

拉格朗日插值

[F = sum y_{i} frac{prod(x-x_j)}{prod(x_i-x_j)} ]

常用生成函数

[frac{1}{1-x} = 1+x+...\ frac{1+x}{(1-x)^3} = 1+4x+9x^2+...\ frac{1}{(1-x)^k}=sum^n_{i=0}{i+k-1choose k-1}x^i\ -ln(1-x)=sum_{ige 1}frac{x^i}{i} ]

套路

求导大法好

(ln) 大法好

换元大法好

矩阵

矩阵树(外向内向仙人掌)

[Normal: |D-E|\ 外向:D(y,y)++\ 内向:D(x,x)++\ (去掉(i,i)表示以i为根)\ 仙人掌计数:一般建一个虚点\ 给定一个森林连起来:n^{k-2}prod a_i(考虑prufer)\ prufer:度数为1且标号最小 删掉 把临点加入序列 ]

反演

FWT

[or:fwt(x0,x0+x1) \ and:fwt(x0+x1,x1)\ xor:fwt(x0+x1,x0-x1) ]

二项式

[f(n) = sum_{i=0}^n inom{n}{i} g(i) Leftrightarrow g(n) = sum_{i=0}^n inom{n}{i}(-1)^{n-i} f(i) ]

单位根

[frac{1}{k}sum_{i=0}^{k-1} w_k^{ni} = [k|n] ]

斯特林

[f(n) = sum_{i=1}^n egin{Bmatrix}{n\i}end{Bmatrix} g(i) Leftrightarrow g(n) = sum_{i=1}^n (-1)^{n-i}egin{bmatrix}{n\i} end{bmatrix}f(i) ]

莫比乌斯

这个随便吧

Min-max容斥

[Min(S) = sum (-1)^{T-1} Max(T) \ kMin(S) = sum (-1)^{T-k} inom{T-1}{k-1}Min(T) ]

数论

杜教筛

考虑构造一个(h=g*f)其中(h)方便求前缀和 (g)方便单点求值

powerful number

[k_ige 2 \ n以内有O(sqrt{n})个 \写成a^2b^3爆搜即可 \考虑如何求f的前缀和 \构造g使得g(p)=f(p)且g的前缀和比较好计算 \令f=g*h可得h(1)=1且h(p)=0\由于积性函数 所有有值的位置都是powerful number ]

CRT/exCRT

[P_i = prod_{j e i}{p_j} (mod p_i) \ ans = sum a_i P_i^{-1}(mod p_i)P_i (mod P) ]

Cipolla

[考虑一个x^{k} = n(mod p) 有两个解 +a, - a \ 设 随机出一个(a^2-n)^{frac{p-1}{2}} = -1(mod p) \ 定义 w=sqrt{a^2-n}为虚数单位\结论就是x=(a+w)^{frac{p+1}{2}} (直接虚数乘法) ]

BSGS

一般是原根高次幂

原根判定

[对于任意一个质因子d 都满足a^{frac{phi}{d}} e 1(mod p) ]

组合数学

斯特林数

第一类 置换 中括号

第二类 集合 花括号

第二类有方便的公式

[egin{Bmatrix} n\m end{Bmatrix} = frac{1}{m!}sum_{i=0}^m(-1)^{i}inom{m}{i}(m-k)^n ]

常用组合意义

n次方->n个计数

(prod a_i) 的转化 (atcoderDwango2020C)

(sum^n_{i=1}prod^n_{j=i}frac{1}{a_j}) 的转化 (soj951)

((n-1)!) 的转化(第一类斯特林数、环排列)(固定点数和边数连通图计数)

猎人杀

常用组合公式

[考虑n个数 满足sum a_i = s 求prod a_i之和 \ 考虑拆分a_i = b_i+c_i (b_ige 0,c_i ge 1) 再插板即可 ]

(|A||B|=|AB|) (均为方阵) 证明考虑构造矩阵 $$egin{bmatrix}A&O -I&Bend{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 ,aotimes t=acdot t$2. (totimes t = frac{3}{2} t))所以可以分治乘快速求

具体来说

[t=2^{2^a}\ c1=mul(x/t,y/t)\ c2=mul(x\%t,y/t)oplus mul(x/t,y\%t)\ c3=mul(x\%t,y\%t)\ mul(x,y) = (c1oplus c2)cdot t oplus c3 oplus mul(t/2,c1) ]

原文地址:https://www.cnblogs.com/hanyuweining/p/13549559.html