一些技巧
MITM
折半是一个非常实用的技巧。
Meet In The Middle,常见于满足一定条件(多为和一定)的子集计数问题。
数据范围使朴素 dfs 或状压擦边过不去时,可以将集合分成两个集合 \(L\),\(R\),用 hash 统计 \(L\) 子集的信息(多写成类似 DP 的形式,难点),然后枚举 \(R\) 子集计算答案。例题
关于 bitset
bitset 本质就是将 \(w\) 个 bool 压成一个 ull。
例题。
朴素 bitset 空间会炸(当然你可以把空间折半卡过)。将询问每 \(w\) 个分成一组,使用 bitset \(f_{i,j}\) 维护第 \(i\) 个点在第 \(j\) 次询问中对于起点的可达性即可,空间复杂度 \(O(n)\)。
杂项 & 易错点
- 树链剖分跳链时比较的是链头深度,不是当前节点深度。
- 注意“出现次数”一类问题,有意义变量可能只有 \(\sqrt{n}\) 种取值。
- 异或时注意相同的可以抵消,将区间转成前缀。
- 倍增时如果没法倍增路径长度,可以倍增点数,维护走 \(2^k\) 个点的路径长度。(可能矩乘也有类似套路)

浙公网安备 33010602011771号