T1. [AGC060F] Spanning Trees of Interval Graph
我們令 \(S = \sum C_{i,j}\)。
我們設兩個矩陣 \(G_{i,j} = [[L_i,R_i] \cap [L_j,R_j]]\) 以及 \(D_{i,i} = \sum G_{i,j}\)。
那麼根據矩陣樹定理,我們知道生成樹的數量就是 \(\det(D - G)\)。然而直接高斯消元複雜度是 \(O(S^3)\) 的,難以接受。我們需要考慮如何最佳化 \(G\)。
考慮矩陣行列式引理,我們需要構造出兩個 \((S - 1) \times m\) 的矩陣 \(A,B\),使得 \(G = A \times B^T\),那麼根據矩陣行列式引理:\(\det(D-G) = \det(I - B^TD^{-1}A)\det(D)\),其中 \(I\) 為單位矩陣。接下來的問題就變成了如何構造大小為 \((S - 1) \times m\) 的矩陣 \(A,B\)。
為了求出 \(A,B\) 後方便計算答案,我們令 \(m = 2 \times n - 1\)。
那麼此時我們考慮用兩個點來表示兩個區間是否有交,不難發現其實就是相交的點數減相交的邊數是否為 \(1\)。那麼 \(A,B\) 的構造如下:
-
\(A_{i,2 \times j - 1} = B_{i,2 \times j - 1} = [j \in [L_i,R_i]]\)
-
\(A_{i,2 \times j} = -1 \times [[j,j + 1] \in [L_i,R_i]]\)
-
\(B_{i,2 \times j} = [[j,j + 1] \in [L_i,R_i]]\)
很明顯 \(G_{i,j}=A_{i}\times B_{j}\)。
那麼我們就可以在 \(O(n^3)\) 內解決問題。