小寄巧
-
对于图上求期望 / 概率,是 DAG 的可以拓扑排序 dp,非 DAG 的可以考虑高斯消元。
-
对于二进制问题可以考虑将每一位拆开计算。
-
对于贡献存在于整棵树上的 dp,考虑分两次分别计算子树内和子树外的贡献。
-
对于边权为 \(1\) 的图,常采用 Bfs 求解各种问题。
-
多次多个元素的贡献可以拆成多次单个元素贡献的和。
-
在时间复杂度允许的情况下,考虑一些暴力的方式。
-
对于判断可以或不可以的题目,可以先看可以或不可以时满足的条件。
-
当出现
至少一个
等字眼时,考虑用总的情况减去全部非法的情况。 -
AC 自动机上 dp 一般考虑设状态为:\(dp(i,j)\) 表示枚举到 AC 自动机上第 \(i\) 个点,字符串长度为 \(j\) 时的方案数。在 \(n\) 较小的时候也可以在加上一维状压。
-
正序做困难时考虑反向做(包括但不限于组合数学、序列问题、图上删边等问题)。
-
结合题面实际以及算法实际,不要只想着一个式子。
-
可以从数据范围推出时间复杂度。
-
考虑添加极值(例如将数组添加一个 \(n+1\) 位等等)来完成某些答案的统计。
-
求期望时常常可以利用线性性质将期望拆开。
-
当 dp 题目中出现差值的时候,可以考虑差值 dp。具体的,状态中设一维 \(x\),dp 值记录与 \(x\) 的差值,答案就是 \(x+dp_x\)。
-
当填表法过于繁琐时,考虑刷表法。
-
当 dp 某一维不可避免的达到了很大的范围,考虑矩阵快速幂优化 dp。
-
当在奇怪的地方看见 \(\gcd\) 或要进行 \(\gcd\) 求和的时候,考虑数论求解/莫比乌斯反演。
-
遇到取整的时候不妨考虑 \(-0.5\)。
-
树上 \(n\) 个关键点之间形成的最小联通子图的大小为 \(\sum\limits_{i=1}^n \operatorname{dep}_{a_i}-\sum\limits_{i=1}^{n-1}\operatorname{dep}_{\operatorname{lca}(a_i,a_i+1)}-{\operatorname{dep}_{\operatorname{lca}(a_1,a_2,a_3,\cdots,a_n)}}\)(按 DFS 序排序后)。
-
没有修改操作时线段树复杂度可能并不优秀。
-
for (int T = S; T; T = (T - 1) & S)
可以不重不漏枚举 S 二进制下的所有子集。 -
先考虑朴素算法,再考虑优化。
-
两个数列的相对值不变视为一致(即对应位置元素差相同)时,考虑差分维护。