Tricks

前面写的确实废 /kk

1.图论路径最值/删边:离线加边并查集

2.图论两种限制的题目(不是2-sat):
一般的套路就是条件按照第一种权值为关键字排序,询问按照第二种关键字排序
然后给条件分块,然后对于一个块只把第一关键字符合条件的询问放进去
在把当前块前面的点按照第二关键字排序
这样当前块前面的点都是符合当前询问点对于第一关建字条件的
而且第二关键字都是单调的,所以就可以双指针扫一下
然后对于每个询问,暴力处理一下当前块的贡献
[HNOI2016]最小公倍数

3.仙人掌问题
先看作树上问题,得出大致思路(树形DP),再将仙人掌整成圆方树,结合之前的思路,修改讨论细节

4.无向联通图生成树个数为 nn2
具体证明有 prufer 序唯一性可证得

5.当树上一节点答案由任意两个儿子贡献时,可以利用前缀和 O(degu) 解决(树背包,树形DP)

6.枚举 s (二进制)的子集:

for (re int t = s; t; t = (t - 1) & s)

时间复杂度为 O(3n)

可以利用高维前缀和优化,比如求 fi=jiaj

for (re int j = 0; j < n; ++j)
	for (re int i = 0, up = 1 << n; i < up; ++i)
		if (i >> j & 1) f[i] += f[i ^ (1 << j)];

时间复杂度 O(n2n)

7.建圆方树时,Tarjan 要算反父亲的返祖边;而仙人掌的圆方树则不算,但仙人掌可能圆点间连边,所以在 Tarjan 时,对于 low[v] > dfn[u] 的要 Add(u, v)

8.n 个数中选不相邻的 K 个,使得和最小,考虑反悔贪心,即每次取优先队列最小的,删除左右两个数,同时向其中插入左 + 右 - 自己,找左右用双向链表维护

9.给序列 a ,每次给 l,r ,询问 1×al+2×al+1++(rl+1)×ar,可先预处理出前缀和 s、二阶前缀和 ssANS=ssrssl1(l1)(srsl1)
若带修改套树状数组,时间复杂度多一个 log

10.带点权有向图,边 (u,v) 表示 u 依赖于 v,合法地选择一些点,使点权和最大(求最大权闭合图
网络流:S 连向正权点,容量为点权,负权点连 T,容量为点权绝对值,依赖边不变,容量为 +,答案为 wi[wi>0]maxf

11.循环矩阵乘法时间复杂度为 O(n2)
将矩阵看作一维数组,仅保留第一行,那么:

ci=j=1najb(ij+n)%n+1

12.稀疏方程组的高斯消元,如 CF24D Broken robot
只需手动模拟,复杂度降维 O(n)

13.区间 gcd
一维不带修改直接线段树
一维带修改:将 [L,R]gcd 转化为 差分数组 (L,R]gcd 再与 aLgcd,修改变为单点
二维:树套数/四分树

14.区间加减将序列变为 0,转化为单点加减将差分序列变为 0

15.树上一堆点的 LCA 即为 dfn 最大和最小的两个点的 LCA

16.一个 n 个点的有根叶向树,有 n!i=1n1sizi 种拓扑序

17.比较若干大数乘积的大小,可以将每个大数取对数,将乘积转化为求和([IOI2015] 马)

18.平面图最小割等于其对偶图最短路

19.换根 DP 通解:
1. 记录 tmp=fu
2. 让 fu 去除 v 的贡献
3. 将 u 当作 v 的一个儿子,更新 fv
4. dfs(v, u)
5. 回溯 fu=tmp

20.φd=σ

21.图论结论:
1. 二分图最小点覆盖 = 最大匹配
· 最小点覆盖方案:
1. 从右部每个没有匹配的点开始dfs
2. 右部向左部走的时候走非匹配边
3. 左部向右部走时走匹配边
4. 然后标记经过的点
5. 一种方案就是左部标记过的点+右部未标记的点
1. 二分图最大独立集 = 总点数-最小点覆盖
2. DAG 最小路径点覆盖 = 总点数-拆点后最大匹配
3. DAG 最小链覆盖 = 总点数-拆点后传递闭包建出的二分图的最大匹配 = 最长反链长度(Dilworth 定理)
4. DAG 最小反链覆盖 = 最长链长度

22.维护 n 个集合,然后一次给一段区间的集合全部加入/删除若干个数
1).离线 + 差分 + 扫描
「ZJOI2016」大森林「JOISC 2021 Day1」饮食区
[l,r] 的集合操作,就拆成在 l 加入操作,在 r+1 去除操作
2).线段树 + 标记永久化
「C.E.L.U-02」苦涩
直接用线段树维护 n 个集合,区间插入就在 logn 个线段树节点上插入,当作打标记,且不下传,以保证时间复杂度
3).ODT
旭日东升
对每种要插入的数整一个 ODT,那么每个区间只会被插入一次,至多删除一次,所以复杂度是优秀且稳定的!

23.序列 A 排序后若为等差数列,那么其公差 dgcd(|A1A2|,|A2A3|,,|An1An|)

24.“一个无向图选一个边集使得所有点的度数为奇数”有解的充要条件是——该无向图不存在点数为奇数的连通块

25.树上到所有节点距离和最小的点是重心

26.森林的联通块数 = 点数 - 边数

27.若 (ab)|(a xor b),则 a and b=b

proof:y=a and b, x=ay, z=byab=xz, a xor b=x+z(ab)|(a xor b)(xz)|(x+z)z=0QED.

28.一个 trick:(虽然你完全可以用整除分块做)

i=1nni=2i=1nnin2

29.fn 是卡特兰数的第 n 项,那么:

f0=1fn=f0fn1+f1fn2+f2fn3++fn1f0fn=4n2n+1fn1fn=1n+1(2nn)fn=(2nn)(2nn1)

30.(nm)1(mod2)mn

31.另类最短路 Dijkstra 的正确性未知?不妨考虑建分层图!

32.学会用 hash,出自 「CSP-S 2022」 星战

33.做高维前缀和/差分时尽量不要调用 n 以外的部分,比如当要 i -> i | (1 << j) 时,改为 i ^ (1 << j) -> i ;当要 i | (1 << j) -> i 时,改为 i -> i ^ (1 << j)

34.直径相关问题,考虑中心

35.求 n 一次多项式的卷积,考虑分治 NTT,每次卷最小的两个,复杂度是 O(nlog2n)

36.计算 a<b 的方案数,或许可以用总方案数减去 a=b 的方案数再除以 2(前提是 a<b 的方案数等于 a>b 的方案数)

37.一个 1n 的排列的期望逆序对数为 n(n1)4

38.记 F(n,m)=i=0m(ni) ,则

F(n,m)=F(n,m1)+(nm)F(n,m)=2F(n1,m)(n1m)

可以莫队

i=1ni(ni)=n2n1

40.普通幂转下降幂

nm=k=0m{mk}nk_=k=0m{mk}(nk)k!

41.奇妙转化,来自 ABC277 Ex:

LA+BtZ,AtBLt+1

证明:如果 t>A ,那么 B+t>L ,那么 BLt+1

这样就可以拆成 AxBy ,然后 2-SAT

42.看见中位数就要二分答案

本文作者:After-glow

本文链接:https://www.cnblogs.com/Aftglw/p/15759658.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   After-glow  阅读(19)  评论(0编辑  收藏  举报
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
点击右上角即可分享
微信分享提示