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)\)
将矩阵看作一维数组,仅保留第一行,那么:
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\)
28.一个 trick:(虽然你完全可以用整除分块做)

29.\(f_n\) 是卡特兰数的第 \(n\) 项,那么:
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\) ,则
可以莫队
40.普通幂转下降幂
41.奇妙转化,来自 ABC277 Ex:
证明:如果 \(t > A\) ,那么 \(B + t > L\) ,那么 \(B \ge L - t + 1\)
这样就可以拆成 \(A \ge x \lor B \ge y\) ,然后 2-SAT
42.看见中位数就要二分答案

该文被密码保护。
浙公网安备 33010602011771号