tricks
-
对于一些操作类的计数问题,可以考虑操作到无法操作之后对不满足条件的剩余情况进行计数。
-
遇到不会的计数或不会优化的 dp,可以考虑容斥。
-
容斥复杂度太高时,可以考虑将情况划分为等价类。
-
对于树的 constructive,考虑从叶子开始。
-
\(\dbinom{n}{\lfloor \frac{n}{2} \rfloor}\)。
-
树上高斯消元 \(\mathcal{O}(n)\) 做法。
-
优化 dp 时,可以考虑真正有用的限制是什么,对于用处不大的内容,可以考虑压掉(如 CF1750F)。
-
可以考虑使用连边刻画构造的限制。
-
对于难以优化的 dp,若贡献关于二进制每一位独立,可以考虑将二进位制拆成两部分,进行 meet in the middle 式的转移,将复杂度中 \(V\) 变为 \(\sqrt V\)。
-
对于难以入手的神秘题,大多具有良好性质。在无法发现性质时,可以通过增加约束条件或寻找必要条件或打表等方式猜结论。
-
对于询问出现偶数次的元素,考虑随机赋权维护异或和。
-
对于排列求逆的操作,可以考虑将 \((i, p_i)\) 视作二元组,求逆即为 \(\operatorname{swap}(i, p_i)\)。
-
颜色段均摊。
-
扫描线维护矩形面积并:对于 SGT 每一个节点维护 \(cover_i\) 表示完整覆盖该节点对应区间的区间个数,\(cover\) 不下传,若 \(cover_i > 0\) 则贡献为 \(r - l + 1\),否则需要 push_up。
-
对求第 \(k\) 大的题,若是多个序列并起来的第 \(k\) 大,且满足某种单调性,可以考虑二分答案 + 双指针。
-
区间数颜色:维护 \(lst\)。
-
数论很神奇。
-
不要忘记差分约束。
-
最大流最小割定理。
-
从值域考虑,将 \(> v\) 的数视为 \(1\),\(\le v\) 的数视为 \(0\)。
-
对于强制在线且修改需要重构的题(如维护 AC 自动机),可以考虑二进制分组,维护大小为 \(2 ^ k, 2 ^ {k - 1}, \cdots, 1\) 的数据结构,合并组的时候暴力重构。
-
对于将字符串相等定义为 \(\exist\) 双射 \(f: \{a, b, \cdots, z\} \to \{a, b, \cdots, z\}\) 满足 \(f(s_i) = t_i\) 的题,考虑使用 \(lst\) 进行判断。
-
对于查区间 \([l, r]\) 的题,先考虑 \(l = 1, r = n\)。
-
对于灵活度很大的题,要敢于猜答案不会太大。
-
考虑 DP。
-
Hall 定理推论:\(|S| - \max\limits_{T \subseteq S} (|T| - |N(T)|)\)。
-
李超线段树(合并)。
-
KTT。
-
单侧递归。
-
换维扫描线。
-
对于一个公平组合游戏,操作加上一个直接结束,SG 值变为原来的 SG 值 \(+1\)。

浙公网安备 33010602011771号