愚蠢的線上法官

ImALAS發表於2024-06-20

給一個官解的簡單理解,沒有官解的嚴謹證明。

同官解,用 \(i\to j\) 表示 \(i\)\(j\) 的祖先。

行列式的處理手法並不多,常規的手拆並不奏效,我們考慮化用 \(\gcd\) 矩陣的求法:定義矩陣 \(C[i][j]=[j\to A_i],D[i][j]=[i\to A_j](v_i-v_{fa_i})\),當 \(k=n\) 的時候 \(C,D\) 都是方陣,顯然 \(B=C\times D\),於是 \(\det(B)=\det(C)\times \det(D)\),此時 \(C,D\) 的行列式是好求的,\(\mathcal O(n)\) 算就行。

然後考慮 \(k\neq n\),由 Cauchy-Binet 公式,\(|B|=\sum_{|S|=k} |C_{1\dots k, S}|\times |D_{S,1\dots k}|\)

常見思路是考察 \(|C_{1\dots k,S}|\) 的組合意義,發現等價於給 \(A_1,\dots,A_k\) 各自欽定一個祖先,形成一個排列 \(\sigma\),累加貢獻 \((-1)^{|\sigma|}\)

對於這類行列式 / 其它的一些容斥問題,我們可以嘗試透過構造去除一部分不好計算的貢獻。具體的,如果 \(A_u,A_v\) 對應的匹配點可以交換,那麼這些方案的係數全部會被抵消。稱係數未被抵消的方案為合法方案。

考慮一個合法方案的生成,自底向上構造,我們發現任何一個時刻,不會有一個點的子樹內有 \(>1\) 個未匹配點,於是對於給定的 \(S\),匹配的方案是唯一的,並且這樣就抵消掉了 \((-1)^{|\sigma|}\) 這個煩人的東西。我們只需要把 \(v_i-v_{fa_i}\) 哪些東西的貢獻算出來就好!

仍然考慮上述合法方案的生成方式,設 \(f_{u,0/1}\)\(u\) 子樹內還剩 \(0/1\) 個未匹配點的貢獻和,轉移就是子節點做一遍樹上揹包,然後分 \([u\in A]\) 是否為真進行討論即可。時間複雜度 \(\mathcal O(n)\)

相關文章