Tricks

前面写的确实废 /kk

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

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

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

4.无向联通图生成树个数为 \(n^{n - 2}\)
具体证明有 prufer 序唯一性可证得

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

6.枚举 \(\texttt{s}\) (二进制)的子集:

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

时间复杂度为 \(\mathcal O(3^n)\)

可以利用高维前缀和优化,比如求 \(f_i = \sum_{j \subseteq i} a_j\)

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)];

时间复杂度 \(\mathcal O(n 2 ^n)\)

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

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

9.给序列 \(a\) ,每次给 \(l, r\) ,询问 \(1 \times a_l + 2 \times a_{l + 1} + \dots + (r - l + 1) \times a_r\),可先预处理出前缀和 \(s\)、二阶前缀和 \(ss\)\(ANS = ss_r - ss_{l - 1} - (l - 1) (s_r - s_{l - 1})\)
若带修改套树状数组,时间复杂度多一个 \(\log\)

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

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

\[c_i = \sum_{j = 1} ^ n a_j b_{(i - j + n) \% n + 1} \]

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

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

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

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

16.一个 \(n\) 个点的有根叶向树,有 \(n! \prod_{i = 1}^n \frac 1 {siz_i}\) 种拓扑序

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

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

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

20.\(\varphi * d = \sigma\)

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\) 个集合,区间插入就在 \(\log n\) 个线段树节点上插入,当作打标记,且不下传,以保证时间复杂度
3).ODT
旭日东升
对每种要插入的数整一个 ODT,那么每个区间只会被插入一次,至多删除一次,所以复杂度是优秀且稳定的!

23.序列 \(A\) 排序后若为等差数列,那么其公差 \(d\)\(\gcd(|A_1 - A_2|, |A_2 - A_3|, \cdots, |A_{n - 1} - A_n|)\)

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

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

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

27.若 \(\tt (a - b) | (a\ xor\ b)\),则 \(\tt a\ and\ b = b\)

\[ \begin{aligned} &\tt proof:\\ &\tt y = a\ and\ b,\ x = a - y, \ z = b - y\\ &\tt a - b = x - z,\ a\ xor\ b = x + z\\ &\tt (a-b)|(a\ xor\ b) \Leftrightarrow (x-z)|(x + z) \Leftrightarrow z = 0 \\ &\tt QED. \end{aligned} \]

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

\[\sum_{i = 1} ^ n \lfloor \frac n i \rfloor = 2 \sum_{i = 1} ^ {\lfloor \sqrt n \rfloor} \lfloor \frac n i \rfloor - \lfloor \sqrt n \rfloor ^2 \]

29.\(f_n\) 是卡特兰数的第 \(n\) 项,那么:

\[\begin{aligned} &f_0 = 1\\ &f_n = f_0 f_{n - 1} + f_1 f_{n - 2} + f_2 f_{n - 3} + \cdots + f_{n - 1} f_0\\ &f_n = \frac {4n - 2}{n + 1} f_{n - 1}\\ &f_n = \frac 1 {n + 1} \binom{2n} {n}\\ &f_n = \binom {2n} n - \binom{2n} {n - 1} \end{aligned} \]

30.\(\binom n m \equiv 1 \pmod 2 \Leftrightarrow m \subseteq n\)

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,每次卷最小的两个,复杂度是 \(\mathcal O(n \log ^2n)\)

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

37.一个 \(1\sim n\) 的排列的期望逆序对数为 \(\frac {n(n−1)} 4\)

38.记 \(F(n, m) = \sum_{i = 0} ^ m \binom n i\) ,则

\[\begin{aligned} &F(n, m) = F(n, m - 1) + \binom n m\\ &F(n, m) = 2F(n - 1, m) - \binom {n - 1} m \end{aligned} \]

可以莫队

\[\sum_{i = 1} ^ n i \cdot \binom n i = n 2^{n - 1} \]

40.普通幂转下降幂

\[n^m = \sum_{ k= 0} ^ m {m\brace k} n^{\underline k} = \sum_{k = 0} ^ m {m\brace k}\binom n k k! \]

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

\[L \le A + B \Longleftrightarrow \forall t \in \mathbb{Z} , A \ge t \lor B \ge L - t + 1 \]

证明:如果 \(t > A\) ,那么 \(B + t > L\) ,那么 \(B \ge L - t + 1\)

这样就可以拆成 \(A \ge x \lor B \ge y\) ,然后 2-SAT

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

posted @ 2022-01-03 15:27  After-glow  阅读(37)  评论(0)    收藏  举报