YC313A [ 20240703 CQYC省选模拟赛 T1 ] 人生(life)
题意
给定一个 \(n\) 个点的有向图,保证每条边形如 \(i \to j, i < j\),已经有一些点被染色。
你需要求出有多少不同的染色和建边方案,使得每条黑白交错的路径数量为奇数。
\(n \le 10 ^ 5\)。
\(Sol\)
先考虑如何暴力 \(\text{dp}\)。
我们发现对于一个点 \(j\),影响她贡献的只有 \(\forall i, i < j\)。
若连一条 \(i \to j\) 的边,对于所有以 \(i\) 结尾的路径都会扩展到 \(j\)。
显然对于偶数条结尾的点没有意义,不难设出 \(f_{i, j, k, 0/1}\) 表示前 \(i\) 个点,有 \(j\) 黑点个数结尾的路径条数为奇数,有 \(k\) 个白点结尾的路径条数为奇数,所有前 \(i\) 个点的路径条数的奇偶性为 \(0/1\)。
转移时直接枚举有多少个奇数白点连向 \(i + 1\),有多少奇数偶点连向 \(i + 1\) 即可。
复杂度是 \(O(n ^ 4)\) 的,有点小爆。
集中注意力,发现我们并不关心有多少点连向 \(i + 1\),转移变为从 \(j\) 个数里选出奇数个还是偶数个的方案数,显然这就是 \(2 ^ {j - 1}\)。
观察转移式,我们钦定了这 \(j\) 个点是否连向 \(i\),对于剩下的点是直接乱连的,方案数乘上 \(2 ^ {i - j}\)。
将二者合并,发现当且仅当 \(j = 0\) 时,当前点为偶数的情况,系数为 \(0\),对于考虑当前点为奇数的情况,系数为 \(2 ^ i\),否则都是 \(2 ^ {i - 1}\)。
修改状态定义,设 \(f_{i, 0/1, 0/1, 0/1}\) 表示前 \(i\) 个点,是否有黑点以奇数结尾,是否有白点以奇数结尾,前 \(i\) 个点的路径条数的奇偶性为 \(0/1\)