题意

给出两个长度为 \(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]
\]

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long giant;
  4. inline char nchar() {
  5. static const int bufl=1<<20;
  6. static char buf[bufl],*a,*b;
  7. return a==b && (b=(a=buf)+fread(buf,1,bufl,stdin),a==b)?EOF:*a++;
  8. }
  9. inline int read() {
  10. int x=0,f=1;
  11. char c=nchar();
  12. for (;!isdigit(c);c=nchar()) if (c=='-') f=-1;
  13. for (;isdigit(c);c=nchar()) x=x*10+c-'0';
  14. return x*f;
  15. }
  16. const int maxn=2e3+1;
  17. const int q=1e9+9;
  18. inline int Plus(int x,int y) {return ((giant)x+(giant)y)%q;}
  19. inline int Sub(int x,int y) {return Plus(x,q-y);}
  20. inline int Multi(int x,int y) {return (giant)x*y%q;}
  21. inline int mi(int x,int y) {
  22. int ret=1;
  23. for (;y;y>>=1,x=Multi(x,x)) if (y&1) ret=Multi(ret,x);
  24. return ret;
  25. }
  26. inline int inv(int x) {return mi(x,q-2);}
  27. int a[maxn],b[maxn],f[maxn],g[maxn],le[maxn],fac[maxn],ifac[maxn];
  28. inline int C(int n,int m) {return Multi(Multi(fac[n],ifac[m]),ifac[n-m]);}
  29. int main() {
  30. #ifndef ONLINE_JUDGE
  31. freopen("test.in","r",stdin);
  32. #endif
  33. int n=read();
  34. int k=read();
  35. if ((n+k)&1) puts("0"),exit(0);
  36. fac[0]=ifac[0]=fac[1]=ifac[1]=1;;
  37. for (int i=2;i<=n;++i) ifac[i]=inv(fac[i]=Multi(fac[i-1],i));
  38. for (int i=1;i<=n;++i) a[i]=read();
  39. for (int i=1;i<=n;++i) b[i]=read();
  40. sort(a+1,a+n+1),sort(b+1,b+n+1);
  41. for (int i=1,j=0;i<=n;++i) {
  42. for (;j<n && b[j+1]<a[i];++j);
  43. le[i]=j;
  44. }
  45. f[0]=1;
  46. 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)));
  47. g[n]=f[n];
  48. for (int i=n-1;i;--i) {
  49. int &gi=g[i]=0;
  50. for (int j=i+1;j<=n;++j) gi=Plus(gi,Multi(g[j],C(j,i)));
  51. gi=Sub(Multi(f[i],fac[n-i]),gi);
  52. }
  53. printf("%d\n",g[(n+k)>>1]);
  54. return 0;
  55. }

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. 20145209刘一阳《网络对抗》Exp9 Web安全基础实践

    20145209刘一阳<网络对抗>Exp9 Web安全基础实践 基础问题回答 1.SQL注入攻击原理,如何防御? SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面请求 ...

  2. 成都Uber优步司机奖励政策(4月14日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  3. 验证码示例代码演示——以php为例

    运行 · 修改index.php(图片验证码的生成示例) [html] view plain copy initNECaptcha({ captchaId: 'YOUR_CAPTCHA_ID', // ...

  4. Maven学习(二)-----Maven启用代理访问

    Maven启用代理访问 如果你的公司正在建立一个防火墙,并使用HTTP代理服务器来阻止用户直接连接到互联网.如果您使用代理,Maven将无法下载任何依赖. 为了使它工作,你必须声明在 Maven 的配 ...

  5. Redis的事物

    Redis的事物 Redis 事物常用命令 multi标记一个事物块的开始   exec:执行所有事物块内的命令   discard: 取消事物,放弃执行事物块的所有命令   watch key [k ...

  6. java nio实现文件复制

    public class TransferTo { public static void main(String[] args) throws Exception { FileChannel in = ...

  7. hdu2187悼念512汶川大地震遇难同胞——老人是真饿了(贪心 简单题)

    传送门 简单题 #include<bits/stdc++.h> using namespace std; struct node { double dan,weight; }a[]; bo ...

  8. xxl_job springboot改造

    代码地址:https://gitee.com/sharehappy/xxl_job_springboot 官方文档:https://github.com/xuxueli/xxl-job/blob/ma ...

  9. Linux命令之tar命令

    [root@linux ~]# tar [-cxtzjvfpPN] 文件与目录 .... 参数: -c :建立一个压缩文件的参数指令(create 的意思): -x :解开一个压缩文件的参数指令! - ...

  10. RetinaNet 迁移学习到自标数据集

    Keras-RetinaNet 在自标数据集 alidq 上训练 detection model RetinaNet 模型部署与环境配置 参考README 数据预处理 数据统计信息: 类别:gun1, ...