tricks

包括但不限于 trick,还有一些思考方向之类的东西。


数据结构

线段树

  • 线段树分治:在一条长度为 \(n\) 时间轴上有 \(m\) 次操作,每个操作生效的时间区间给定为 \([l_i , r_i]\)。对于 \(q\) 次询问,每次询问一个点,求在这个点生效的所有操作的贡献之和。

根号

  • 1e6 以下不会 log 可以考虑根号。当 根号跑不满 / 常数较小 / 时限较为宽松 的时候还是有机会的。

杂项

  • 笛卡尔树可以做到 \(O(n)\) 预处理,在最值分治中 \(O(1)\) 求每个分治区间的最值。

数学

概率期望

  • 考虑期望是否可以转化为 合法方案数 / 总方案数,此时需要每个方案出现的概率相同(若不同可以考虑转化为相同的),且计数是比较容易的。

  • \(X\) 状态第一次走到 \(Y\) 状态的期望时间,可以转化为从 \(X\) 出发到 \(Y\) 和从 \(Y\) 出发到 \(Y\) 两部分拼起来。这也是 PGF 的经典结论,不过并不仅可以用于 PGF。

组合计数

  • 这启示我们在数学类 dp 优化不了,且组合意义不会的时候,要改改状态尽量把 dp 转移式写得简单点,然后瞪眼找通项,虽然能找到的概率不大

  • 在看到例如「都不是 / 是」的词时,可以看作恰好 \(0\) 个不是,然后用反演做。

博弈论

  • 零和博弈(即双方得分总和固定的博弈)常用的 dp 方式是把先手与后手的分数差放到状态里或者令为状态的值。

图论

树上问题

  • 若问题与树的直径有关,例如支持对可变的树的直径的某种操作,可以考虑树的重心。

杂项

  • 在求类似于 \(\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\) 两种数的数组,可以考虑把前缀和画到折线图上考虑。然后还要注意括号序列的一大堆结论

posted @ 2025-09-12 09:34  little__bug  阅读(14)  评论(0)    收藏  举报