1. 程式人生 > >【BZOJ3622】已經沒有什麼好害怕的了

【BZOJ3622】已經沒有什麼好害怕的了

題目大意

對於兩個數列\(a,b\),求有多少種排列\(p,q\)滿足\(a_{p_i}>b_{q_i}\)的個數恰好為\(k\)

題目分析

由“恰好”引發思考。

考慮容斥。

設詢問函式\(q(i)\)表示欽定\(i\)\(a>b\)的關係的方案數。

再設貢獻函式\(g(i)\)表示有i個\(a>b\)關係的方案對答案的貢獻。

再設容斥係數\(f(i)\),使得最終答案為\(\sum_{i=k}^nq(i)* f(i)\)

首先考慮如何快速求出詢問函式\(q(i)\)。首先將兩個數列分別排序。設\(dp[i][j]\)表示\(a\)數列前\(i\)個數的匹配關係處理後,欽定了\(j\)

對關係的方案數。設\(pos\)表示\(b_{pos}<a_i\)\(pos\)的最大值。顯然有轉移方程:

\(dp[i][j]=dp[i-1][j]+dp[i-1][j-1]*(pos-j+1)\)

那麼\(q(i)=dp[n][i]* (n-i)!\)就能快速求出了。

再考慮求出容斥係數。

根據套路,我們可以\(O(n^2)\)遞推這玩意兒。

根據容斥原理,\(g(x)=\sum_{i=k}^x\dbinom{x}{i}f(i)\)

\(x=k\)時,\(g(x)=1\),那麼顯然\(f(x)=1\)

\(x>k\)時,\(g(x)=0\),則有:

\(\sum_{i=k}^x\dbinom{x}{i}f(i)=0\)

\(\sum_{i=k}^{x-1}\dbinom{x}{i}f(i)+f(x)=0\)

\(f(x)=-\sum_{i=k}^{x-1}\dbinom{x}{i}f(i)\)

這樣我們就能遞推求出容斥係數了。時間複雜度\(O(n^2)\)