tricks
包括但不限于 trick,还有一些思考方向之类的东西。
数据结构
线段树
- 线段树分治:在一条长度为 \(n\) 时间轴上有 \(m\) 次操作,每个操作生效的时间区间给定为 \([l_i , r_i]\)。对于 \(q\) 次询问,每次询问一个点,求在这个点生效的所有操作的贡献之和。
根号
杂项
数学
概率期望
-
考虑期望是否可以转化为 合法方案数 / 总方案数,此时需要每个方案出现的概率相同(若不同可以考虑转化为相同的),且计数是比较容易的。
-
从 \(X\) 状态第一次走到 \(Y\) 状态的期望时间,可以转化为从 \(X\) 出发到 \(Y\) 和从 \(Y\) 出发到 \(Y\) 两部分拼起来。这也是 PGF 的经典结论,不过并不仅可以用于 PGF。
组合计数
-
这启示我们在数学类 dp 优化不了,且组合意义不会的时候,要改改状态尽量把 dp 转移式写得简单点,然后瞪眼找通项,
虽然能找到的概率不大。 -
在看到例如「都不是 / 是」的词时,可以看作恰好 \(0\) 个不是,然后用反演做。
博弈论
图论
树上问题
杂项
-
在求类似于 \(\sum _{l,r} f(l,r)\) 的时候,如果数据范围允许,可以考虑分治。
-
当不关心一个数组的具体值,只关心它是否能与另一个数组匹配,或者只关心它的出现次数,可以考虑把这个数组哈希掉(若时间复杂度允许)。
-
有时候,可行性问题不能做可以考虑转化为最优性问题。
-
当需要维护最大值,并且支持状态的转移的时候,若不一定能通过最大值直接转移(例如换根 dp 中以 \(v\) 为根的子树 max 信息 不能直接从 \(u\) 的子树 max 转移,因为可能出现 \(u\) 的子树 max 是 \(v\) 的情况),可以同时维护不在同一组被的次大值。
-
在序列上的问题中,有时候可以考虑把序列按照 \(n,1,n-1,2,n-3,\ldots\) 的顺序排列,有时候会有意想不到的作用(类似于 \(a_i \gets a_i-i\))。
-
当要算某个东西 \({} \bmod p\) 的结果,复杂度和 \(p\) 有关,且 \(p\) 可以分解成 \(\prod p_i\) 满足 \(p_i\) 较小且两两互质时,可以考虑先分解,分别求出来答案,再用 CRT 合并。
-
当一个东西(例如神必构造)当范围很小的时候可以手算,看看范围大的时候是否可以通过某种手段转化到范围小的情况。
-
对于括号匹配相关问题,或者只有 \(-1,1\) 两种数的数组,可以考虑把前缀和画到折线图上考虑。然后还要注意括号序列的一大堆结论。

浙公网安备 33010602011771号