雨落之前
贵校是状压王国吗。
初始设 \(f_{S, T}\) 为下雨的点集为 \(S\),使用过的边集为 \(T\) 可行解数量,这样状态就是 \(O(2^{C_{n}^2 + n})\) 级别的,太不牛了,我们需要进行一个状态的压。
考虑先处理一下第一个维度,那么发现用了哪些点我是不关心的,我只关心用的点数量和还没有达到 \(a_i\) 的限制的点的数量,当我的 \(|S| = a_i\) 时,我可以任意分配到底哪个点为 \(i\) 来记录方案数,类似贡献延后钦定,这一部分状态数优化到 \(O(n^2)\)。
接下来是边集的转化,不妨将边 \((u, v)\) 分为三种类型:
- \((u, v)\) 都不在 \(S\) 中。
- \((u, v)\) 都在 \(S\) 中。
- 一个在 \(S\) 中一个不在 \(S\) 中,不妨令在 \(S\) 中的结点为 \(u\),不在 \(S\) 中的结点为 \(v\)。
前面两种显然可以只用统计个数,利用一样的手法将状态数优化到 \(O(n^2)\),接下来的重中之重是分析第三个状态的具体数量。
记录目前在 \(S\) 中的每个点 \(x\),其像第三类出边的数量为 \(b_x\),此时,我们对于 \(x\) 的顺序是不关心的,也就是说,我们可以将 \(b\) 当成一个可重集,更近一步,我们只关心关于 \(b\) 的一个桶,因为我们还是分配对应出现次数具体是什么,下面我们证明这一步状态数为 \(O(2^n)\) 级别:
- 将桶数组做一个前缀和,不难发现状态数为:长度为 \(i\),值域为 \([0, n - i]\) 的不降序列个数和,利用组合计数技巧和恒等式可以得到这一部分和为 \(O(2^n)\)。
具体来说,实现可以暴力状压。
到目前为止,我们将状态数做到了惊人的 \(O(2^n n^4)\)。
std 说使用轮廓线依次考虑每种第三类边的连边,可以做到总复杂度 \(O(2^n n^5)\),显然这不是本题的关键点,是偏技巧性的东西。

浙公网安备 33010602011771号