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

猜你喜欢

转载自www.cnblogs.com/Trrui/p/9971156.html