题目链接
做法
用$a$表示药片数组,$b$表示糖果数组,两个数组都先升序排列。
考虑dp,$f_{i,j}$表示前$i$个数中有$j$对$a>b$的方案数,
我们这里认为每个a有两种选择,一是选择一个比他小的b来组成新的一对,二是空着不选择,而不是选择一个比他大的b,一定要注意。
那么根据上面的定义,可以得到dp方程,
由于b是升序,所以对于$a_i$,比它小的b一定是一个前缀,所以$now_i$表示b中比我小的是$[1,now_i]$,因为a也是升序,所以$now_i$一定是单调不降的,我们用一个指针维护即可。
那么dp出$f$之后有什么用呢?
我们用$ans_i$表示最后所有点都有匹配后$a>b$的对数有$i$对的方案数($f$中不是有些还没匹配吗),我们最后要求的就是$ans_\frac{n+k}{2}$
发现$ans$并不好求,定义$g_i$表示最后所有点都有匹配后$a>b$的对数有大于$i$对的方案数,那么我们将a中原先没有匹配的点随意匹配,即
发现$ans_i$对于$g_j$的贡献即为$\binom{i}{j}(i\ge j)$
也就是说
可以二项式反演
直接枚举算出$ans_\frac{n+k}{2}$即可
代码
1 |
|