题意

给出两个长度为 \(n\) 的数列 \(a,b\) ,\(2n\) 个数都互不相同,求有多少种对应方式使得 \(a_i>b_i\) 的个数比 \(a_i<b_i\) 的个数恰好多 \(k\) 。\(n\le 2000\) 。

分析

容易把问题转化成有多少种对应方案使得 \(a_i>b_i\) 的个数恰好多 \(m\) 。这是一个序列上的计数问题,一种经典的思路是分阶段考虑。

首先给 \(a\) 排序,预处理出 \(b\) 中有多少个数比 \(a_i\) 小,记为cnt[i] 。分阶段考虑,设 f[i][j] 表示给 \(a\) 的前 \(i\) 个分配 \(j\) 个小于它们的的方案数。那么有转移:

\[f[i][j]=f[i-1][j]+f[i-1][j-1]*(cnt[i]-(j-1))
\]

除了这 \(j\) 个以外其他是随便选的。这就导致了计算重复,所以我们考虑如何减去重复。设 \(g_i\) 表示整个对应中恰好有 \(i\) 个小于它们的,那么有:

\[g[i]=f[n][i](n-i)!-重复
\]

这里最妙的方法是,重复我们反过来求。重复的是什么呢?就是随便匹配的过程中得到的那些 \(a_i>b_i\) 的方案。这些方案在 \(g[k],k>i\) 中是包含的!!\(g_k\) 中每一个方案被 \(f[n][i]\) 算多了 \(\binom k i\) 次.

\[g[i]=f[n][i](n-i)!-\sum _{i<k\le n}\binom k ig[k]
\]

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long giant;
inline char nchar() {
static const int bufl=1<<20;
static char buf[bufl],*a,*b;
return a==b && (b=(a=buf)+fread(buf,1,bufl,stdin),a==b)?EOF:*a++;
}
inline int read() {
int x=0,f=1;
char c=nchar();
for (;!isdigit(c);c=nchar()) if (c=='-') f=-1;
for (;isdigit(c);c=nchar()) x=x*10+c-'0';
return x*f;
}
const int maxn=2e3+1;
const int q=1e9+9;
inline int Plus(int x,int y) {return ((giant)x+(giant)y)%q;}
inline int Sub(int x,int y) {return Plus(x,q-y);}
inline int Multi(int x,int y) {return (giant)x*y%q;}
inline int mi(int x,int y) {
int ret=1;
for (;y;y>>=1,x=Multi(x,x)) if (y&1) ret=Multi(ret,x);
return ret;
}
inline int inv(int x) {return mi(x,q-2);}
int a[maxn],b[maxn],f[maxn],g[maxn],le[maxn],fac[maxn],ifac[maxn];
inline int C(int n,int m) {return Multi(Multi(fac[n],ifac[m]),ifac[n-m]);}
int main() {
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
int n=read();
int k=read();
if ((n+k)&1) puts("0"),exit(0);
fac[0]=ifac[0]=fac[1]=ifac[1]=1;;
for (int i=2;i<=n;++i) ifac[i]=inv(fac[i]=Multi(fac[i-1],i));
for (int i=1;i<=n;++i) a[i]=read();
for (int i=1;i<=n;++i) b[i]=read();
sort(a+1,a+n+1),sort(b+1,b+n+1);
for (int i=1,j=0;i<=n;++i) {
for (;j<n && b[j+1]<a[i];++j);
le[i]=j;
}
f[0]=1;
for (int i=1;i<=n;++i) for (int j=i;j;--j) f[j]=Plus(f[j],Multi(f[j-1],max(le[i]-j+1,0)));
g[n]=f[n];
for (int i=n-1;i;--i) {
int &gi=g[i]=0;
for (int j=i+1;j<=n;++j) gi=Plus(gi,Multi(g[j],C(j,i)));
gi=Sub(Multi(f[i],fac[n-i]),gi);
}
printf("%d\n",g[(n+k)>>1]);
return 0;
}

bzoj3622-已经没有什么好害怕的的了的更多相关文章

  1. [bzoj3622]已经没有什么好害怕的了_动态规划_容斥原理

    bzoj-3622 已经没有什么好害怕的了 题目大意: 数据范围:$1\le n \le 2000$ , $0\le k\le n$. 想法: 首先,不难求出药片比糖果小的组数. 紧接着,我开始的想法 ...

  2. bzoj3622已经没有什么好害怕的了

    bzoj3622已经没有什么好害怕的了 题意: 给n个数Ai,n个数Bi,将Ai中的数与Bi中的数配对,求配对Ai比Bi大的比Bi比Ai大的恰好有k组的方案数.n,k≤2000 题解: 蒟蒻太弱了只能 ...

  3. [BZOJ3622]已经没有什么好害怕的了(容斥DP)

    给定两个数组a[n]与b[n](数全不相等),两两配对,求“a比b大”的数对比“b比a大”的数对个数多k的配对方案数. 据说做了这题就没什么题好害怕的了,但感觉实际上这是一个套路题,只是很难想到. 首 ...

  4. BZOJ3622 已经没有什么好害怕的了 【dp + 二项式反演】

    题目链接 BZOJ3622 题解 既已开题 那就已经没有什么好害怕的了 由题目中奇怪的条件我们可以特判掉\(n - k\)为奇数时答案为\(0\) 否则我们要求的就是糖果大于药片恰好有\(\frac{ ...

  5. bzoj3622已经没有什么好害怕的了 dp+组合+容斥(?)

    3622: 已经没有什么好害怕的了 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1033  Solved: 480[Submit][Status][ ...

  6. BZOJ3622 已经没有什么好害怕的了 动态规划 容斥原理 组合数学

    原文链接https://www.cnblogs.com/zhouzhendong/p/9276479.html 题目传送门 - BZOJ3622 题意 给定两个序列 $a,b$ ,各包含 $n$ 个数 ...

  7. BZOJ3622 已经没有什么好害怕的了(动态规划+容斥原理)

    显然可以转化为一个阶梯状01矩阵每行每列取一个使权值和为k的方案数.直接做不可做,考虑设f[i][j]为前i行权值和至少为j,即在其中固定了j行选1的方案数.设第i行从1~a[i]列都是1且a[i]+ ...

  8. BZOJ3622 已经没有什么好害怕的了

    Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output 4 HINT 输入的2*n个数字保证全不相 ...

  9. 【BZOJ3622】已经没什么好害怕的了 容斥原理+dp

    Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output 4 HINT 输入的2*n个数字保证全不相 ...

  10. 洛谷 P4859 && BZOJ3622: 已经没有什么好害怕的了

    题目描述 给出 \(n\) 个数 \(a_i\)​ ,以及 \(n\) 个数 \(b_i\)​ ,要求两两配对使得 \(a>b\) 的对数减去 \(a<b\) 的对数等于 \(k\) . ...

随机推荐

  1. 20155322 2016-2017-2 《Java程序设计》第10周学习总结

    20155322 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 第10周学习的主要内容Java和Android开发学习指南(第二版)(EPUBIT,Jav ...

  2. struts2官方 中文教程 系列四:Action

    先贴个本帖的地址,免得其它网站被爬去了struts2教程 官方系列四:Action  即 http://www.cnblogs.com/linghaoxinpian/p/6905521.html 下载 ...

  3. VS2008 "无法找到资源编译器dll 请确保路径正确"

    系统环境:windows 8.1 企业版 x64 (装有 .NET 2.0 / 3.5 / 4.0 /  4.5) 安装前确认系统已安装 .NET 2.0 / 3.5 .在安装时,最好是默认安装,并且 ...

  4. python之奇思妙想

    一.概述 本篇主要介绍自己平常所遇到的各种有趣的关于python的简短例子 二.正文 chapter 1 解决思路: s='{:,.2f}'.format(100000.0) print(s) cod ...

  5. Paper Reading - Show and Tell: A Neural Image Caption Generator ( CVPR 2015 )

    Link of the Paper: https://arxiv.org/abs/1411.4555 Main Points: A generative model ( NIC, GoogLeNet ...

  6. 机器学习之决策树(ID3)算法

    最近刚把<机器学习实战>中的决策树过了一遍,接下来通过书中的实例,来温习决策树构造算法中的ID3算法. 海洋生物数据:   不浮出水面是否可以生存 是否有脚蹼 属于鱼类 1 是 是 是 2 ...

  7. linux-ubuntu配置通过22端口远程连接

    当安装好ubuntu后获取到对应主机的ip地址,要想通过类似xshell这样的远程连接工具连接到ubuntu主机,需要在你刚刚安装好的ubuntu主机上安装openssh这个软件,才能通过远程来连接u ...

  8. [leetcode-914-X of a Kind in a Deck of Cards]

    In a deck of cards, each card has an integer written on it. Return true if and only if you can choos ...

  9. Python3 函数式编程自带函数

    一 map函数 引子 需求1:num1=[1,2,3,4],我的需求是把num1中的每个元素平方后组成新列表. ret = [] num1 = [1,2,3,4] for i in num1: ret ...

  10. python正则表达式中含有变量的写法

    使用格式化字符串的方式实现举例: re.findall("(this,%s,'(.*?)'"%str(i),"abcd(this,1,'123123)')这里i为变量