题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=3622

题解:

容斥,dp
1).可以求出需要多少对"糖果>药片"(K对);
2).把两个数组A,B从小到大排序。
然后求出 nxt[i]表示 A[i]>B[nxt[i]] 且 nxt[i]为能取到的最大值
换句话说,nxt[i]表示有多少个 B的元素小于A[i]
3).定义 dp[i][k]表示前 i个A中有 k个选择了比它小的 B元素,其它的暂时不选 的方案数。
转移显然 dp[i][k]=dp[i-1][k](1)+dp[i-1][k-1]*(nxt[i]-(k-1))(2)
(1)式表示当前这个A元素暂时不选与它匹配的B元素。
(2)式表示当前这个A元素选择一个比它小的B元素与它匹配。
    那么显然会有nxt[i]-(k-1)种选择。(应该懂了排序和求nxt[]的目的了吧)
求出了 dp[N][k]后,但是还有 (N-k)个元素没有匹配怎么办?
直接把 dp[N][k]*(N-k)! 表示剩下的元素随意匹配。
那么这时 dp[N][k]的含义即为:全部匹配后,至少有 k 对 "糖果>药片"的方案数(但是有重复的统计)。
然后为了求出恰好有 K 对 "糖果>药片"的方案数。就需要用到容斥:

4).容斥
不难发现,每个 dp[N][k+1]的方案在 dp[N][k]里出现了 C(k+1,k)次,
那么需要减去重复的。容斥系数如下:
dp[N][k]     :1
dp[N][k+1]     :-C(k+1,k)
dp[N][k+2]    :+C(k+2,k)
...
dp[N][k+j]    :(-1)^(j)*C(k+j,k)
诶,这个容斥系数怎么推出来的呢。看看这个题目的解法,一样的套路哦。

所以把那些东西加起来就是答案了。


另外,还可以更加直接暴力一点:
从后往前枚举 k,计算出 f[k],表示全部匹配后,恰好有 k 对 "糖果>药片"的方案数。
                      N
那么 f[k]=dp[N][k] - (  ∑ f[j]*C(j,k) )  , 即直接把多余的重复减去就好了。
                    j=k+1

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define _ %mod
#define MAXN 2500
#define filein(x) freopen(#x".in","r",stdin);
#define fileout(x) freopen(#x".out","w",stdout);
using namespace std;
const int mod=1000000009;
int dp[MAXN][MAXN],C[MAXN][MAXN],fac[MAXN],A[MAXN],B[MAXN],nxt[MAXN];
int N,K,ANS;
int main()
{
scanf("%d%d",&N,&K);
if((N+K)&1) return printf("0"),0;
else K=(N+K)/2; fac[0]=1;
for(int i=1;i<=N;i++) fac[i]=(1ll*fac[i-1]*i)_;
for(int i=0;i<=N;i++){
C[i][0]=1;
for(int j=1;j<=i;j++)
C[i][j]=(1ll*C[i-1][j-1]+C[i-1][j])_;
}
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); B[N+1]=0x3f3f3f3f;
for(int i=1,j=0;i<=N;i++){
while(B[j+1]<A[i]) j++; nxt[i]=j;
}
dp[0][0]=1;
for(int i=1;i<=N;i++){
dp[i][0]=dp[i-1][0];
for(int k=1;k<=i;k++)
dp[i][k]=(1ll*dp[i-1][k]+1ll*dp[i-1][k-1]*max(nxt[i]-k+1,0)_)_;
}
for(int i=K;i<=N;i++){
dp[N][i]=(1ll*dp[N][i]*fac[N-i])_;
ANS=(ANS+1ll*dp[N][i]*C[i][K]*(((i-K)&1)?-1:1)_+mod)_;
}
/*for(int i=N;i>=K;i--){
dp[N][i]=(1ll*dp[N][i]*fac[N-i])_;
for(int j=i+1;j<=N;j++)
dp[N][i]=(1ll*dp[N][i]-1ll*dp[N][j]*C[j][i]_+mod)_;
}*/
printf("%d",dp[N][K]);
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 已经没有什么好害怕的了——二项式反演

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

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

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

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

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

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

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

  9. bzoj 3622 DP + 容斥

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

随机推荐

  1. 1013团队Beta冲刺day1

    项目进展 李明皇 今天解决的进度 点击首页list相应条目将信息传到详情页 明天安排 优化信息详情页布局 林翔 今天解决的进度 前后端连接成功 明天安排 开始微信前端+数据库写入 孙敏铭 今天解决的进 ...

  2. 自主学习之RxSwift(二) -----flatMap

    最近项目中有这么一个需求,下面是三个网络请求 A.从服务器获取到时间戳(GET 方法,获取 timeLine) B.进行用户头像上传,获得回传的URL(POST方法,参数为 userId, timeL ...

  3. 从一次输入框无法输入的bug,谈如何限制输入框输入类型

    bug的产生和修改 上周临近周末休息的时候,一个同事跑过来了,对我说:"阿伦啊,有一个页面出问题了,火狐浏览器所有的input都没法输入了."我一听,是不是你给加了什么属性,让in ...

  4. 技术文档分享_linux中生成考核用的GPT分区表结构修复

    注:历史版本,后期改用python实现了 实验一: 目的:用于生成大量模拟破坏GPT分区结构案例,并生成唯一方式修复后的评判方法.故障:在一个完整的GPT分区磁盘上,丢失了GPT主分区表,或备份分区表 ...

  5. python3 常用模块

    一.time与datetime模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们 ...

  6. iot前台开发环境:请求示例

    参考链接:http://www.cnblogs.com/keatkeat/category/872790.html 编辑->update保存 一.typescipt import { Injec ...

  7. (java基础)Java输入输出流及文件相关

    字节流: 所有的字节输入输出都继承自InputStream和OutputStream,通常用于读取二进制数据,最基本单位为单个字节,如图像和声音.默认不使用缓冲区. FileInputStream和F ...

  8. linux centos6.8 下安装mysql 步骤

    安装环境:vmware12.centos6.8.centos中配置阿里云数据元 1.下载mysql 运行: sudo yum -y install mysql-server 如果下载失败,可以卸载重新 ...

  9. Lua编写wireshark插件初探——解析Websocket上的MQTT协议

    一.背景 最近在做物联网流量分析时发现, App在使用MQTT协议时往往通过SSL+WebSocket+MQTT这种方式与服务器通信,在使用SSL中间人截获数据后,Wireshark不能自动解析出MQ ...

  10. SpringBoot(五):@ConfigurationProperties配置参数绑定

    在springmvc或其他ssh框架中如果我们要实现一个配置参数的加载,需要使用代码实现读取properties文件等操作,或者需要使用其他属性@value(name="username&q ...