AGC060 F. Spanning Trees of Interval Graph
AGC060 F. Spanning Trees of Interval Graph
Statement
给定一张图,每个点对应一个二元组 \((l,r)\) 满足 \(1\leq l\leq r\leq n\),任意两点间有连边当且仅当所对二元组为 \((l_1,r_1),(l_2,r_2)\) 满足 \(\max\{l_1,l_2\}\leq\min\{r_1,r_2\}\),求这张图的生成树个数,对 \(998\;244\;353\) 取模。
点集将以压缩的形式给出,即给定 \(c_{i,j}\) 表示对应二元组为 \((i,j)\) 的结点数,保证 \(1\leq c_{i,j}\leq 10^4\)。
\(2\leq n\leq 4\times 10^3\)。
Solution
方便起见,接下来对系数的运算都是在 \(F_{998\;244\;353}\) 中完成的。
首先运用矩阵树定理,可以知道答案是图所对应的 Laplace 矩阵删去第 \(i\) 行第 \(i\) 列后的行列式。
不妨把 \(i\) 选为一个\((1,n)\) 的点,如果删完了变成 \(0\) 我们后面再进行特判,此时依然假设每个 \((i,j)\) 都存在至少一个对应点在删完后的矩阵中。
熟知定义式 \(\det(A)=\sum\limits_{p\in S(n)}(-1)^{\tau(p)}\prod\limits_{i=1}^nA_{i,p_i}\)。
考虑如若 \(i,j\) 都对应同一个二元组,且 \(p_i,p_j\) 均不对应该二元组,那么有 \(A_{i,p_i}=A_{j,p_i},A_{i,p_j}=A_{j,p_j}\),于是构造 \(p'\) 是 \(p\) 交换了 \(p_i,p_j\),显然有 \((-1)^{\tau(p)}+(-1)^{\tau(p')}=0,\prod\limits_{i=1}^mA_{i,p_i}=\prod\limits_{i=1}^mA_{i,p'_i}\),而且这构成一个双射。因此这样的 \((p,p')\) 两两抵消了,所以我们接下来只需要计算使得每个二元组对应的点中至多有一个向外连的置换的加权和。
对于一个二元组对应的所有点,现在只有只在内部连和接收外部一条入边并向外连一条出边这两种情况。我们建立对二元组再建立一个置换 \(q\),如果这个二元组 \(i\) 向外连了就将 \(q_i\) 设为连向的点所处的二元组,否则 \(q_i=i\)。从 \((-1)^{\tau(p)}=(-1)^{\lvert p\rvert-\text{cyc}(p)}\) 的角度来看可以发现 \((-1)^{\tau(p)}\) 就是 \((-1)^{\tau(q)}\) 乘上每个二元组内部的置换 \(h\)(如果有一个点向外连了就换成连回到另一个没入度的点上)的 \((-1)^{\tau(h)}\) 之积,因为 \((-1)^{\lvert q\rvert}\) 把每个向外连边了的二元组内部本来还没形成置换环而导致差了的 \(-1\) 给补上了。
那你现在只需要算出来对每个二元组算出来向外连和不向外连两种情况下的内部贡献即可。
在这里我们显然只关心每个点连的是自己还是别人,于是枚举连自己的点的点数,剩下是一个错排,但是加权(权是 \((-1)^{\tau(p)}\),于是我们需要先算出来长为 \(n\) 的加权错排和是多少,发现正常的递推式本来就是交换一次,因此可以直接套过来,记 \(f_n\) 为长为 \(n\) 的错排加权和,可以得到 \(f_0=1,f_1=0,f_{n+2}=-(n+1)(f_n+f_{n+1})\),解得通项 \(f_n=(-1)^{n-1}(n-1)\)。
记这个连通块大小是 \(m\),每个点度数是 \(x\),于是就可以写出来不向外连的式子是
而向外连恰好一条边的是
我们有 \(1\leq m\leq 1+x\leq 1+\sum\limits_{i=1}^n\sum\limits_{j=i}^nc_{i,j}\leq 802000001<998244353\),因此这两个式子都不会取到 \(0\),以及它们的和是 \((1+x)^m\) 也不会取到 \(0\)。
总之我们现在转为了计算一个 \(\frac{n(n+1)}{2}\times \frac{n(n+1)}{2}\) 的矩阵的行列式,已经可以做到 \(\mathcal{O}(n^6)\),接下来思考下如何做进一步优化。
方便起见先对每一行除一下使得对角线上全是 \(1\)(由上面的讨论可得不会出现 \(0\))。
我们再建出一个 \(n\times n\) 的矩形并只保留上三角(含对角线)部分,对应这 \(\frac{n(n+1)}{2}\) 个二元组。
记二元组 \((i,j)\) 所对的行向量为 \(v_{i,j}\),手玩下可以发现 \(v_{i,j}-v_{i+1,j}-v_{i,j-1}+v_{i+1,j-1}\) 只在 \((i,j),(i+1,j),(i,j-1),(i+1,j-1)\) 上非 \(0\),且这些位置上也一定不会是 \(0\)(因为由上可知 \(\frac{m(1+x)^{m-1}}{(1+x)^m-m(1+x)^{m-1}}\neq -1\)),那观察下除了这些 \(2\times 2\) 矩形外你还剩下些什么?恰好是所有 \(i\leq j\leq i+1\) 的 \(v_{i,j}\),有 \(2n-1\) 个,那感受下这个应该对应到矩形的第一行和第 \(n\) 列上这 \(2n+1\) 元。
于是我们按照 \(j-i\) 升序排列这些二元组 \((i,j)\),将拥有的一个以 \((i,j)\) 为左下角的 \(2\times 2\) 矩形对应的向量换到矩阵的 \((i,j)\) 二元组所对应行,这些部分都是上三角的,剩下的是那 \(2n-1\) 个向量,处于矩形第一行和第 \(n\) 列上的二元组在矩阵上所对应的行上。你希望把这些也消成上三角,所以你先以这些第一行和第 \(n\) 列上的二元组视作主元,把那 \(2n-1\) 个向量一点点用已经拥有的 \(2\times 2\) 矩形的向量消为关于主元的线性表示,具体来说可以在矩形上从下往上一行行消,每个矩形可以把一个不在第一行也不在第 \(n\) 列上的元往后推,于是就一点点推到了只在第一行和第 \(n\) 列上可以非 \(0\)。然后现在就得到了一个 \((2n-1)\times(2n-1)\) 的矩阵,对这个矩阵做高斯消元,然后求解行列式即可。
以及你这里隐式地做了很多次交换,需要具体算下是否要乘以 \(-1\),选一个好的实现方式可以只交换偶数次。
然后说回如果 \(c_{1,n}=1\) 该怎么办,这样后面在矩形的右上角就一直是 \(0\) 了,发现影响只是少了右上角的 \(2\times 2\) 小矩形,然后把 \(2n-1\) 个主元中的右上角 \((1,n)\) 换为 \((2,n-1)\) 即可。
综上,可以在时间复杂度 \(\mathcal{O}(n^3)\) 下求出生成树数。
本文来自博客园,作者:山田リョウ,转载请注明原文链接:https://www.cnblogs.com/yamadaryou/p/19508010

感觉把所有 at 的题的题解全都塞一篇博客里有点糖了,以及好像很久很久以来做的 arc/agc 的题也都忘了塞进去。
以后还是好玩的题就单独发下吧,其他可能懒得写了。
以及这是我第一道单杀的问号题!!!
浙公网安备 33010602011771号