题目

看到这个数据范围就发现我们需要一个\(O(n^2)\)的做法了,那大概率是\(dp\)了

看到恰好\(k\)个我们就知道这基本是个容斥了

首先解方程发现我们需要使得\(a>b\)的恰好有\(\frac{n+k}{2}\)组

如果不整除我们直接输出\(0\)就好了

之后开始使用套路,直接广义容斥

\[ans=\sum_{i=k}^n(-1)^{i-k}\binom{i}{k}g_i
\]

\(g_i\)表配出至少\(i\)对\(a>b\)的情况

显然我们现在需要一个\(dp\)来算一下\(g\)

首先发现两个数组是没有顺序的,所以先习惯性排个序

设\(dp_{i,j}\)表示从\(a\)数组的前\(i\)个数中,已经配出\(j\)对\(a>b\)的方案数

边界\(dp_{0,0}=1\)

我们排序的作用这个时候就体现出来了,我们设\(d_i\)表示满足\(b_j<a_i\)的最大的\(j\)

由于\(a,b\)两个数组都是有序的,我们知道\(d_i\)肯定是单调不降的

于是有这样的方程

\[dp_{i,j}=dp_{i-1,j}+max(d_i-(j-1),0)dp_{i-1,j-1}
\]

就是考虑对于第\(i\)个数满足\(a>b\)的只有\(d_i\)个,减去和前\(i-1\)个匹配的\(j-1\)个,剩下的我们随便找出一个来匹配就好了

之后\(g_i=dp_{n,i}(n-i)!\),就是让没有满足\(a<b\)的那些随便匹配一下就好

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define pt putchar(1),puts("")
const int maxn=2e3+5;
const int mod=1e9+9;
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
int n,k;
int dp[maxn][maxn];
int a[maxn],b[maxn];
int fac[maxn],inv[maxn];
inline LL ksm(LL a,int b) {
LL S=1;
while(b) {if(b&1) S=S*a%mod;b>>=1;a=a*a%mod;}
return S;
}
inline int C(int n,int m) {
if(m>n) return 0;
return 1ll*fac[n]*inv[n-m]%mod*inv[m]%mod;
}
int main() {
n=read();k=read();
for(re int i=1;i<=n;i++) a[i]=read();
for(re int i=1;i<=n;i++) b[i]=read();
if((n+k)&1) {puts("0");return 0;}
std::sort(a+1,a+n+1),std::sort(b+1,b+n+1);
fac[0]=1;
for(re int i=1;i<=n;i++) fac[i]=(1ll*i*fac[i-1])%mod;
inv[n]=ksm(fac[n],mod-2);
for(re int i=n-1;i>=0;--i) inv[i]=(1ll*(i+1)*inv[i+1])%mod;
dp[0][0]=1;
for(re int i=1;i<=n;i++) {
int cnt=0;
for(re int j=1;j<=n;j++)
cnt+=(a[i]>b[j]);
for(re int j=0;j<=i;j++)
dp[i][j]=dp[i-1][j];
for(re int j=1;j<=i;j++)
dp[i][j]=(dp[i][j]+1ll*dp[i-1][j-1]*max(cnt-j+1,0)%mod)%mod;
}
k=(n+k)/2;
LL ans=0;
for(re int i=k;i<=n;i++)
if((i-k)&1) ans=(ans-1ll*C(i,k)*dp[n][i]%mod*fac[n-i]%mod+mod)%mod;
else ans=(ans+1ll*C(i,k)*dp[n][i]%mod*fac[n-i]%mod)%mod;
printf("%d\n",(int)ans);
return 0;
}

【bzoj 3622】已经没有什么好害怕的了的更多相关文章

  1. BZOJ 3622: 已经没有什么好害怕的了 [容斥原理 DP]

    3622: 已经没有什么好害怕的了 题意:和我签订契约,成为魔法少女吧 真·题意:零食魔女夏洛特的结界里有糖果a和药片b各n个,两两配对,a>b的配对比b>a的配对多k个学姐就可能获胜,求 ...

  2. bzoj 3622 已经没有什么好害怕的了 类似容斥,dp

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

  3. BZOJ 3622 : 已经没有什么好害怕的了(dp + 广义容斥原理)

    今天没听懂 h10 的讲课 但已经没有什么好害怕的了 题意 给你两个序列 \(a,b\) 每个序列共 \(n\) 个数 , 数之间两两不同 问 \(a\) 与 \(b\) 之间有多少配对方案 使得 \ ...

  4. [BZOJ 3622]已经没有什么好害怕的了

    世萌萌王都拿到了,已经没有什么好害怕的了——    (作死) 笑看哪里都有学姐,真是不知说什么好喵~ 话说此题是不是输 0 能骗不少分啊,不然若学姐赢了,那么有头的学姐还能叫学姐吗?  (作大死) 这 ...

  5. ●BZOJ 3622 已经没有什么好害怕的了

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3622 题解: 容斥,dp1).可以求出需要多少对"糖果>药片"(K ...

  6. bzoj 3622 已经没有什么好害怕的了——二项式反演

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3622 令 f[i] 表示钦定 i 对 a[ ]>b[ ] 的关系的方案数:g[i] 表 ...

  7. 解题:BZOJ 3622 已经没有什么好害怕的了·

    题面 用来学习二项式反演的题目 大于等于/小于等于 反演出 恰好等于 设前者为f(n),后者为g(n),则有$f(n)=\sum\limits_{i=0}^nC_n^ig(n)<->g(n ...

  8. BZOJ 3622: 已经没有什么好害怕的了(二项式反演)

    传送门 解题思路 首先将\(a\),\(b\)排序,然后可以算出\(t(i)\),表示\(a(i)\)比多少个\(b(i)\)大,根据容斥套路,设\(f(k)\)表示恰好有\(k\)个\(a(i)\) ...

  9. 【BZOJ 3622】3622: 已经没有什么好害怕的了(DP+容斥原理)

    3622: 已经没有什么好害怕的了 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 683  Solved: 328 Description Input ...

  10. bzoj 3622 DP + 容斥

    LINK 题意:给出n,k,有a,b两种值,a和b间互相配对,求$a>b$的配对组数-b>a的配对组数恰好等于k的情况有多少种. 思路:粗看会想这是道容斥组合题,但关键在于如何得到每个a[ ...

随机推荐

  1. Hadoop shell 一查就会

    Hadoop shell 命令有三种格式 hdfs + dfs (必须是dfs) Hadoop + dfs Hadoop + df 命令 说明 hadoop 版本查看 hadoop version h ...

  2. 并发编程之ThreadLocal源码分析

    当访问共享的可变数据时,通常需要使用同步.一种避免同步的方式就是不共享数据,仅在单线程内部访问数据,就不需要同步.该技术称之为线程封闭. 当数据封装到线程内部,即使该数据不是线程安全的,也会实现自动线 ...

  3. fzu 2132 LQX的作业

    Problem 2132 LQX的作业 Accept: 67    Submit: 150Time Limit: 1000 mSec    Memory Limit : 32768 KB Proble ...

  4. 本地快速搭建 FTP 服务器

    一.什么是FTP FTP(File Transfer Protocol)是TCP/IP网络上两台计算机传送文件的协议,使得主机间可以共享文件. 二.搭建前期准备 1.首先打开控制面板找到“程序”点击打 ...

  5. ORA-00054 资源正忙

    现象: 执行update.truncate提示 ORA-00054: resource busy and acquire with NOWAIT specified. 解决方法: 因为系统是RAC系统 ...

  6. css3动画运用

    https://daneden.github.io/animate.css/ https://minimamente.com/example/magic_animations/    http://i ...

  7. Solo 博客系统 1.7.0 发布 - 新版 MD 编辑器

    本次发布主要是更新了 Markdown 编辑器,加入了全屏.Emoji 自动完成.粘贴时自动转换为 MD 格式的特性.(1.7.0 版本变更记录请看这里) 目前的 Markdown 编辑器有多好用呢? ...

  8. 献给java求职路上的你们

    为了更好的树立知识体系,我附加了相关的思维导图,分为pdf版和mindnote版.比如java相关的导图如下: 由于时间仓促,有些地方未写完,后面会继续补充.如有不妥之处,欢迎及时与我沟通. 相关概念 ...

  9. c# axPageLayoutControl 加数据框

    private void axPageLayoutControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IPageLayoutControl ...

  10. python的学习笔记之——time模块常用内置函数

    1.Python time time()方法 Python time time() 返回当前时间的时间戳(1970纪元后经过的浮点秒数). time()方法语法: time.time() 举例: #! ...