P11714 [清华集训 2014] 主旋律 题解

P11714 [清华集训 2014] 主旋律

Link

写一个自己认为非常顺畅的思维过程吧,也是一个加强了对容斥的理解。

Sol

首先,SCC 这种东西是无法被刻画的(或者说很难去很好的刻画),因为它太过于整体化了,没有办法分割成为子问题继续计数。

此时想到正难则反,考虑对于整体不为 SCC 的图计数,那么考虑对于这个图缩点,得到的应该是一个点数大于二的 DAG。

好的,我们设 \(E_{S,T}\) 表示所有的从 \(S\) 集合连向 \(T\) 集合的边的数量,\(f_S\) 表示将 \(S\) 中所有的元素连成一个 SCC 的方案数,\(g_S\) 表示将 \(S\) 内的所有点连成若干个 SCC 且 两个 SCC 之间没有边 的按 SCC 个数带上容斥系数的和。

这里非常关键,因为当我们给 \(g_S\) 带上系数的时候,我们在后面的转移中不用关心 SCC 个数,只关心点集合了。

考虑点集 \(S\) 上的所有子图,总方案数为 \(2^{E_{S,S}}\) ,现在按照缩点后入度为 \(0\) 的 SCC 的并集分类。

若缩点后有 \(k\) 个入度为 \(0\) 的 SCC ,设他们的点集为 \(C_1,C_2,\dots C_k\),那么它们会在每个非空并里面被计算到 \(1\) 次,那么有:

\[\begin{align} 2^{E_{S,S}}&=\sum\limits_{\emptyset \not=T\subseteq S} g_S\times2^{E_{T,S/T}+E_{S/T,S/T}}\\ g_S&=2^{E_{S,S}}-\sum\limits_{\emptyset \not=T\subsetneqq S} g_S\times2^{E_{T,S/T}+E_{S/T,S/T}} \end{align} \]

现在我们已经完成了入度为 \(0\) 的 SCC 的容斥,现在我们应该考虑在 \(g_S\)\(f_S\) 里面去寻找两者的关联。

然后又是非常经典的套路了。

首先考虑 \(\operatorname{lowbit}(S)\) 这个点所在的集合 \(T\),首先,这个点会贡献一个 \(f_T\),然后 \(S/T\) 这个集合会提供一个带符号的 \(g_{S/T}\),由于多了一个集合,整体会带一个 \(-1\) 的容斥系数。

那么根据上面的分析,有:

\[\begin{align} g_S&=f_S-\sum\limits_{T\subsetneq S \land \operatorname{lowbit}(S)\in T} f_Tg_{S/T}\\ f_S&=g_S+\sum\limits_{T\subsetneq S \land \operatorname{lowbit}(S)\in T} f_Tg_{S/T} \end{align} \]

现在成功的建立了一个转移,但是需要注意的是,\(g\) 的递推用到了所有真子集,然后 \(f\) 的递推也用到了所有真子集,但是两者不依赖,可以先转移 \(g\) ,再用 \(g\) 转移 \(f\) ,实现的时候细节一点就行。

现在转移为 \(\mathcal{O}(3^n)\),但是我们还有一个 \(E\) 没有处理。

这个东西看上去是一个 \(4^n\) 的东西,其实使用 \(\operatorname{lowbit}\) 加上邻域就能做到 \(\mathcal{O}(3^n)\)

整体时间复杂度 \(\mathcal{O}(3^n)\)

Tricks

这道题我认为,这个做法的精妙之处在于 \(g_S\) 的定义,将 \(g_S\) 定义为带容斥系数的和有利于后面的更好转移,而不是直接计数在后面的时候计算容斥系数。

还有就是 \(\operatorname{lowbit}\) 在状态压缩里面的优化作用,真的很有效果。

References

https://www.luogu.com.cn/article/lh8xquk0

posted @ 2026-06-03 15:49  To_string  阅读(7)  评论(0)    收藏  举报