BZOJ3622 已经没有什么好害怕的了 动态规划 容斥原理 组合数学
原文链接https://www.cnblogs.com/zhouzhendong/p/9276479.html
题目传送门 - BZOJ3622
题意
给定两个序列 $a,b$ ,各包含 $n$ 个数字。
现在给 $a$ 中元素与 $b$ 中元素配对。问使得所有配对中 $a_?>b_?$ 的个数比 $a_?<b_?$ 的个数恰好多 $k$ 的方案总数。
答案对 $10^9+9$ 取模,保证 $a$ 和 $b$ 中的所有数字互不相同。
$n\leq 2000$
题解
首先闭着眼睛排个序。
然后,我们发现一个非常好的性质:如果要使得 $a_i$ 的配对 $b_?$ 满足 $a_i>b_?$ 那么,满足 $1\leq ?\leq c_i$ ,其中 $c_i$ 表示在 $1\leq j\leq n$ 中满足 $b_j<a_i$ 的最大 $j$ 值。
我们先把问题转化一下,变成求恰好得到 $x$ 个 $a_?>b_?$ 的方案数。那么显然 $x=\cfrac{n+k}{2}$ 。如果 $x$ 不是整数,那么答案显然是 $0$ 。
下面说的满足条件是指 $a_?>b_?$ 。
于是我们考虑动态规划。
记 $f_{i,j}$ 表示在 $a_1,a_2,...,a_i$ 中选择 $j$ 个,匹配比他小的 $b_i$ 的方案数。
那么我们可以轻松确定转移方程:
$$f_{i,j}=f_{i-1,j}+f_{i-1,j-1}\times \max(c_i-j+1,0)$$
我们假设 $f_i=f_{n,i}$ ,并设 $g_i$ 为配对所有的元素,恰好有 $i$ 个满足条件的方案数。
于是下式成立:
$$f_i=\sum_{j=i}^n\binom{j}{i}g_j$$
回忆一下 $f$ 的定义,$f_i$ 表示在 $n$ 个里面选择 $i$ 个匹配 $i$ 个满足条件的方案数。
考虑所有的最终情况。
满足条件个数为 $j$ 的总共有 $g_j$ 种。每一个这样的方案中选择的 $j$ 个数中,任选 $i$ 个,所得到的方案,都会对 $f_i$ 有贡献。
所以,$f_i=\sum_{j=0}^{n}\binom{j}{i}g_j=\sum_{j=i}^n\binom{j}{i}g_j$ 。
于是我们来用 $f$ 表示 $g$ 。
$$\begin{eqnarray*}g_k&=&\sum_{i=k}^{n}g_i\binom{i}{k}\sum_{j=k}^{i}(-1)^{j-k}\binom{i-k}{j-k} \\&=&\sum_{i=k}^{n}g_i\sum_{j=k}^{i}(-1)^{j-k}\binom{i}{k}\binom{i-k}{j-k}\\&=&\sum_{i=k}^{n}g_i\sum_{j=k}^{i}(-1)^{j-k}\binom{i}{j}\binom{j}{k}\\&=&\sum_{i=k}^{n}(-1)^{i-k}\binom{i}{k}\sum_{j=i}^{n}g_j\binom{j}{i}\\&=&\sum_{i=k}^{n}f_i(-1)^{i-k}\binom{i}{k}\end{eqnarray*}$$
然后按照这个公式算一算就可以了。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=2005,mod=1e9+9;
int n,k,a[N],b[N],c[N];
int C[N][N],Fac[N];
int f[N][N];
int main(){
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
for (int i=1;i<=n;i++)
scanf("%d",&b[i]);
sort(a+1,a+n+1),sort(b+1,b+n+1);
for (int i=1;i<=n;i++)
for (c[i]=c[i-1];c[i]<n&&b[c[i]+1]<a[i];c[i]++);
for (int i=Fac[0]=1;i<=n;i++)
Fac[i]=1LL*Fac[i-1]*i%mod;
for (int i=0;i<=n;i++)
C[i][i]=C[i][0]=1;
for (int i=1;i<=n;i++)
for (int j=1;j<i;j++)
C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
for (int i=0;i<=n;i++)
f[i][0]=1;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
f[i][j]=(1LL*f[i-1][j-1]*max(c[i]-j+1,0)+f[i-1][j])%mod;
int ans=0,x=(n+k)/2;
if (x*2!=n+k){
puts("0");
return 0;
}
for (int i=x;i<=n;i++)
ans=(1LL*f[n][i]*C[i][x]%mod*Fac[n-i]*((i-x+1)%2*2-1)+ans)%mod;
ans=(ans+mod)%mod;
printf("%d",ans);
return 0;
}
BZOJ3622 已经没有什么好害怕的了 动态规划 容斥原理 组合数学的更多相关文章
- [bzoj3622]已经没有什么好害怕的了_动态规划_容斥原理
bzoj-3622 已经没有什么好害怕的了 题目大意: 数据范围:$1\le n \le 2000$ , $0\le k\le n$. 想法: 首先,不难求出药片比糖果小的组数. 紧接着,我开始的想法 ...
- bzoj3622已经没有什么好害怕的了
bzoj3622已经没有什么好害怕的了 题意: 给n个数Ai,n个数Bi,将Ai中的数与Bi中的数配对,求配对Ai比Bi大的比Bi比Ai大的恰好有k组的方案数.n,k≤2000 题解: 蒟蒻太弱了只能 ...
- [BZOJ3622]已经没有什么好害怕的了(容斥DP)
给定两个数组a[n]与b[n](数全不相等),两两配对,求“a比b大”的数对比“b比a大”的数对个数多k的配对方案数. 据说做了这题就没什么题好害怕的了,但感觉实际上这是一个套路题,只是很难想到. 首 ...
- BZOJ3622 已经没有什么好害怕的了 【dp + 二项式反演】
题目链接 BZOJ3622 题解 既已开题 那就已经没有什么好害怕的了 由题目中奇怪的条件我们可以特判掉\(n - k\)为奇数时答案为\(0\) 否则我们要求的就是糖果大于药片恰好有\(\frac{ ...
- bzoj3622已经没有什么好害怕的了 dp+组合+容斥(?)
3622: 已经没有什么好害怕的了 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1033 Solved: 480[Submit][Status][ ...
- BZOJ3622 已经没有什么好害怕的了(动态规划+容斥原理)
显然可以转化为一个阶梯状01矩阵每行每列取一个使权值和为k的方案数.直接做不可做,考虑设f[i][j]为前i行权值和至少为j,即在其中固定了j行选1的方案数.设第i行从1~a[i]列都是1且a[i]+ ...
- BZOJ3622 已经没有什么好害怕的了
Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output 4 HINT 输入的2*n个数字保证全不相 ...
- 【BZOJ3622】已经没什么好害怕的了 容斥原理+dp
Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output 4 HINT 输入的2*n个数字保证全不相 ...
- 洛谷 P4859 && BZOJ3622: 已经没有什么好害怕的了
题目描述 给出 \(n\) 个数 \(a_i\) ,以及 \(n\) 个数 \(b_i\) ,要求两两配对使得 \(a>b\) 的对数减去 \(a<b\) 的对数等于 \(k\) . ...
随机推荐
- lanmp安装
下载安装(ssh登录服务器,执行如下操作即可,需要用到root用户权限来安装)源码编译安装wget http://dl.wdlinux.cn:5180/lanmp_laster.tar.gztar z ...
- Go斐波拉契数列(Fibonacci)(多种写法)
1 前言 斐波拉契数列有递归写法和尾递归和迭代写法. 2 代码 //recursion func fib(n int) int{ if n < 2{ return n }else{ return ...
- js之雪花飘落
有很多网站都有雪花或花瓣飘落的特效,看上去很好看.我来用js实现这个效果. 在写代码之前可以先引入bass.css对样式做下处理: 1.html部分 先建一个文件夹,在body中插入如下代码 < ...
- Confluence 6 查看站点状态
请注意,有关站点的活动信息在默认情况下是禁用的.请查看下面的说明. 如果这个插件被启用的话,有关站点的全局活动状态将会在你的 Confluence 站点中显示出来.显示的数据包括: 在给定的时间内有多 ...
- Confluence 6 配置 MySQL 服务器
在这一步,你将要配置你的 MySQL 数据库服务器. 注意: 如果你尝试连接你的 Confluence 到一个已经存在的 MySQL 数据库服务器.我们强烈建议你按照下面描述的安装步骤在 MySQL ...
- Confluence 6 编辑站点欢迎消息使用模板编辑器的小提示
站点欢迎消息是一个模板而不是一个页面,所以你需要使用模板编辑器来对你的消息进行编辑. 你可以和在你 Confluence 中其他页面中一样,在站点欢迎消息模板中添加文本,连接和宏.但是添加图片的话会有 ...
- Git- 连接远程仓库
如何使用Git 连接远程仓库呢?远程仓库->一般指的是代码托管平台.那就先来瞅瞅三个较熟悉的版本(代码)托管服务平台. 版本(代码)托管服务平台: 码云(gitee.com):是开源中国社区团队 ...
- ionic在ios侧滑页面空白 禁用视图滑动后退
本人在ios10左右滑动的时候,经常出现左滑页面后退,然后整个页面空白现象,只能强行退出,并重新登录,最简单的方法就是禁用侧滑后退这个功能: 在app.js上config增加如下: $ionicCon ...
- JPA核心类与使用
点击访问:JPA环境配置(一) Persistence: Persistence用于获取EntityManagerFactory实例,这个类中包含一个名为createEntityManagerFact ...
- PDF编辑方法,PDF如何去除数字签名
有些人会在PDF文件中添加数字签名,但当PDF文件有数字签名的时候就无法对PDF文件进行编辑.添加等操作.这个时候就需要去除PDF文件中的数字签名了,要怎么做呢,就由我来跟大家分享一下小编我的去除数字 ...