Trick 积累和易错
积累 Tricks。
-
常见的贡献问题
-
贡献之和考虑转换方式求贡献 / 对于小范围问题类似 dp 的方式求贡献。
-
贡献最大转换成考虑能否在有限步骤内完成使得贡献最大。
-
有限操作次数、贡献最小考虑均摊及调整法。
-
-
P1306 对于斐波那契数列 \(f\),\(\gcd{f_n,f_m} = f_{gcd(n,m)}\)。
-
对于 \(\sum\limits_{i=1}^{n}{\sum\limits_{j=1}^{m}{\gcd(i,j)}}\),记 \(f_i = \sum\limits_{i=1}^{n}{\sum\limits_{j=1}^{m}{d \mid \gcd(i,j)}}\) 的个数,\(g_i = \sum\limits_{i=1}^{n}{\sum\limits_{j=1}^{m}{\gcd(i,j) = d}}\) 的个数,则原式 \(= f_i - \sum\limits_{k=1}^{\lfloor{\frac{n}{i}}\rfloor}{g_{ki}}\)。
-
CF1706E 对于区间 \([l,r]\) 内点的 lca,其等价于区间内 \(dfn\) 最大最小两点的 lca。
-
求合法的括号序列可以赋值
(为 \(1\),)为 \(-1\),对于前缀和 \(pre_i = pre_j\) 的 \([i,j]\) 是合法括号序列的必要不充分条件,如果出现))((则不合法,此时就需要判是否有 \(pre_i < pre_{i+1}\) 且 \(pre_i < pre_{i-1}\) 的情况,这样是不合法的,可以线段树维护 \(pre_i\) 最后出现的位置 \(lst\),那么 \(lst\) 前面的都不可取。 -
对于一个给定数组 \(a\),以及未给定的 \(m,k\),如果 \(a\) 满足 \(\forall a_i \bmod m = k\),那么 \(a\) 的差分数组 \(d\) 一定满足 \(\forall d_i,m\mid d_i\)。
-
对于树上最大独立集问题,考虑 \(f_{u,0/1}\) 表示不选或选当前点,那么有 \(f_{u,0} \leftarrow \sum\limits_{v\in son_u}{f_{v,1}},f_{u,1} \leftarrow \sum\limits_{v\in son_u}{\max(f_{v,0},f_{v,1})}\)。
-
分割集合成两个不重集合时可以考虑状压的思想。
-
对于某些区间满足条件求答案的问题考虑 \(f_i\) 表示以 \(i\) 结尾的计数等,可以考虑暴力方程后树形数据结构维护 / 斜率优化。
-
遇到两个不定条件其中一个较好做时,考虑固定另一个条件去做好做的,再考虑如何维护不定情况下另一个条件。
-
查询 AC 自动机中的字符串在给定文本串中出现几次的问题,转化成 \(fail\) 树上子树和问题,通常树状数组或者线段树维护。
-
复制一遍字符串 \(S\) 并向其插入一个字符,那么左右半边一定有一半是原串 \(S\)。
-
冒泡排序的本质就是对于 \(a_x\) 找到序列中 \(a_x\) 之前有多少个比它大的数的个数 \(y\),那么 \(k\) 次冒泡过后 \(a_x\) 所在位置分成两种情况:
- 如果 \(y \geq k\),那么最后 \(a_x\) 会出现在 \(a_{x-y}\) 的位置上。
- 如果 \(y < k\),那么 \(a_x\) 在剩余的位置一定是按照单增的顺序排的。
- 这样可以树状数组或线段树维护。
-
求子串可以枚举前缀然后考虑这段前缀的后缀。
-
子矩阵加可以用扫描线拆分成四个区间加。
-
遇到逆序对问题可以考虑将 \((i,a_i)\) 放到坐标系上。
-
对于 AC 自动机上一个模式串的前缀,在 fail 树上从根到该点的路径即为其所有子串。
-
对于划分集合包含一段连续整数的问题,分界点一定是 \(x \in S\) 且 \((x+1) \not\in S\)。
-
线段树区间查或修记得判 \(ql > qr\) 不合法的情况。
-
期望 dp 一定是倒着推,状态需要是知道后面才向前转移,一般是“剩余”之类的状态定义。
-
找到最小的 \(k\) 使得存在 \(s\) 满足 \(\forall i \in [1,n],a_i \bmod k = s\),结论就是差值的 \(\gcd\)。
-
平面图最小割 \(\leftrightarrow\) 对偶图最短路。
-
最大流结果 \(\leftrightarrow\) 最小割结果
-
memset
-0x3f不等价与-0x3f3f3f3f3f3f3f3f而是~0x3f3f3f3f3f3f3f3f -
区间问题最好都判一下 \(L>R\) 要
swap。 -
网络流通常可以处理限制类问题。(限制类问题可以想想网络流)
-
最大流输出方案的问题直接判反向边有没有值,有的话说明该边有流量过即输出。
-
\(1 \sim n\) 的约数个数大约是 \(n\log n\) 级别。
-
\(1 \sim n\) 的素数个数大约是 \(\frac{n}{\log n}\) 级别。
-
\(\{a_1 + y, a_2 + y, \dots ,a_n + y\}\) 的这样一个集合,对于任意的 \(\gcd(a_i + y,a_j+y) = x\) 一定满足 \(x\mid (a_i - a_j)\)。
-
对于求不满足 \(ax + by = N(x,y\geq 0)\) 且有解的最大 \(N\),有 \(N = (a - 1)(b - 1) - 1\)
- 拓展:对于 \(n \in [0,N]\),\(n\) 和 \(N - n\) 中一定有一个可以被表示成如上 \(ax + by = c(x,y\geq 0)\) 的形式且有解
-
子树内选点问题可以考虑一条边被经过后产生的贡献。
-
单调不增 / 不降的 \(n\) 项序列且值域 \([0,m]\) 的序列数为 \(\binom{n+m}{m}\)。
-
对于 \(k \leq n\),总会存在一段连续子段 \([l, r]\) 使得 \(sum_{[l,r]} \bmod k = 0\)。
-
遇到图论建模(网络流等)一定要算一算总共加多少边再开数组。
-
对于字符串循环节,长度为 \(len\) 的一段前缀的最短循环节为 \(len - nxt_{len}\)(kmp 的 next 指针)。
-
对于经典的相邻不同色的染色问题(\(n\) 个空 \(m\) 种颜色),对于链的方案数为 \(m \times (m - 1)^{n - 1}\),对于环有 \((m-1)^n + (-1)^n(m-1)\)
-
点数 - 边数 = 联通块数
-
对于奇素数 p,模 p 意义下二次剩余和二次非剩余均有 \(\frac{p - 1}{2}\) 个。

浙公网安备 33010602011771号