【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)\)

update:还有二项式反演的方法。

\(f(i)\)表示关系恰好有\(i\)个的方案数。

我们显然有:\(q(x)=\sum\limits_{i=x}^{n}\dbinom{i}{x}f(i)\)

二项式反演后得到:\(f(x)=\sum\limits_{i=x}^{n}(-1)^{i-x}\dbinom{i}{x}q(i)\)

就完了。

posted @ 2018-11-16 19:37  Trrui  阅读(138)  评论(0编辑  收藏  举报