1. 程式人生 > 其它 >AtCoder 比賽記錄

AtCoder 比賽記錄

ARC 140

打得很爛。Rank 590,Performance 1696。

D - One to One

每個點都有恰好一個出邊,所以這是一個外向基環森林。因此連通塊數就等於環的個數,我們只需要求出所有方案中環的個數的總和。直接算比較難辦,考慮算每個環對答案的貢獻。

首先,假如忽略掉 \(A_i=-1\) 的連通塊,剩下的環是一定存在的,可以預先加到答案裡。然後,觀察到任意一個點數為 \(k\) 的、由 \(A_i=-1\) 的連通塊組成的環,都會出現在 \(n^{c-k}\) 種方案裡,其中 \(c\)\(A_i=-1\)\(i\) 的個數。接下來就是要計算出,對於所有 \(k=1,2,\dots,c\)

,點數為 \(k\) 的環有多少個。

假如我們任取 \(k\)\(A_i=-1\)\(i\),並設它們所在的連通塊大小為 \(s_1,s_2,\dots,s_k\),那麼這 \(k\) 個連通塊可以組成 \((k-1)!\prod_{i=1}^k s_i\) 種不同的環,且這些環的大小都是 \(k\)。所以,可以直接 dp(或者分治 fft)算出環的個數,並求出答案。

時間複雜度 \(\mathcal{O}(n^2)\)(dp)或者 \(\mathcal{O}(n\log^2 n)\)(分治 fft)。