小寄巧

  1. 对于图上求期望 / 概率,是 DAG 的可以拓扑排序 dp,非 DAG 的可以考虑高斯消元。

  2. 对于二进制问题可以考虑将每一位拆开计算。

  3. 对于贡献存在于整棵树上的 dp,考虑分两次分别计算子树内和子树外的贡献。

  4. 对于边权为 \(1\) 的图,常采用 Bfs 求解各种问题。

  5. 多次多个元素的贡献可以拆成多次单个元素贡献的和。

  6. 在时间复杂度允许的情况下,考虑一些暴力的方式。

  7. 对于判断可以或不可以的题目,可以先看可以或不可以时满足的条件。

  8. 当出现 至少一个 等字眼时,考虑用总的情况减去全部非法的情况。

  9. AC 自动机上 dp 一般考虑设状态为:\(dp(i,j)\) 表示枚举到 AC 自动机上第 \(i\) 个点,字符串长度为 \(j\) 时的方案数。在 \(n\) 较小的时候也可以在加上一维状压。

  10. 正序做困难时考虑反向做(包括但不限于组合数学、序列问题、图上删边等问题)。

  11. 结合题面实际以及算法实际,不要只想着一个式子。

  12. 可以从数据范围推出时间复杂度。

  13. 考虑添加极值(例如将数组添加一个 \(n+1\) 位等等)来完成某些答案的统计。

  14. 求期望时常常可以利用线性性质将期望拆开。

  15. 当 dp 题目中出现差值的时候,可以考虑差值 dp。具体的,状态中设一维 \(x\),dp 值记录与 \(x\) 的差值,答案就是 \(x+dp_x\)

  16. 当填表法过于繁琐时,考虑刷表法。

  17. 当 dp 某一维不可避免的达到了很大的范围,考虑矩阵快速幂优化 dp。

  18. 当在奇怪的地方看见 \(\gcd\) 或要进行 \(\gcd\) 求和的时候,考虑数论求解/莫比乌斯反演。

  19. 遇到取整的时候不妨考虑 \(-0.5\)

  20. 树上 \(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 序排序后)。

  21. 没有修改操作时线段树复杂度可能并不优秀。

  22. for (int T = S; T; T = (T - 1) & S) 可以不重不漏枚举 S 二进制下的所有子集。

  23. 先考虑朴素算法,再考虑优化。

  24. 两个数列的相对值不变视为一致(即对应位置元素差相同)时,考虑差分维护。

posted @ 2024-02-27 19:10  dingzibo_qwq  阅读(24)  评论(0编辑  收藏  举报