bzoj 3622 已经没有什么好害怕的了 类似容斥,dp
3622: 已经没有什么好害怕的了
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 1213 Solved: 576
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
5 35 15 45
40 20 10 30
Sample Output
HINT
输入的2*n个数字保证全不相同。
Source
先把两个数列a,b从小到大排序。
设f[i][j]表示前i对数中,满足糖果大于药片的对数“至少”有j对的方案数。
总共要组n对数,其中糖果大于药片的组数比药片大于糖果的组数多k组,那么总共需要 m=(n+k)/2 对数满足糖果大于药片,剩下的满足药片大于糖果。
先用next[]数组记录对于a中的每个数,在j中有next[i]个数比它小,则a[i]可以和next[i]个数组成糖果大于药片的数对。
进行DP: f[i][j]=(f[i-1][j]+f[i-1][j-1]*max(next[i]-(j-1),0)%mod
这样求出来的是“至少”有j对的方案数,而我们需要的是“恰好”有m对的方案数。
显然(并不)这是一个容斥问题:
f[n][i]表示总共n对数中,至少有i对数满足“糖果大于药片”。在a数列中,剩下的(n-i)个数各自要找b数列中剩下的一个数配对,方案共有 (n-i)! (←阶乘) 种。
设dp[n][i]=“n对数中恰好i对数满足糖果大于药片”的方案数,则dp[n][i] = f[n][i]*(n-i)! -多余部分
接下来分析多余部分:
若j>i,在dp[n][j]中(这里的dp[n][j]是已经算完的正确答案,为此需要倒序计算)的一部分可能会被算进f[n][i]中,这种误算的方案有C[j][i]*dp[n][j]种。
所以: dp[n][i]=f[n][i]*(n-i)! - ( Σ(i<j<=n) C[j][i]*dp[n][j] ) 注意取模
之后发现dp数组只用到了[n][i],所以第一维可以扔掉了
十分巧妙,倒着去推出,估计看到数据范围我也不会去想这样的方法。
容斥一般20还行,这么多貌似(⊙o⊙)…
#pragma GCC optimize(2)
#pragma G++ optimize(2)
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring> #define ll long long
#define N 2007
#define mod 1000000009
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,m;
int a[N],b[N];
int num[N];
ll f[N][N],dp[N],C[N][N],A[N]; void init_C()
{
for (int i=;i<=n;i++)C[i][]=;
for (int i=;i<=n;i++)
for (int j=;j<=i;j++)
C[i][j]=(C[i-][j]+C[i-][j-])%mod;
A[]=;
for (int i=;i<=n;i++)(A[i]=A[i-]*i)%=mod;
}
int main()
{
n=read(),m=(read()+n)/;
for (int i=;i<=n;i++)a[i]=read();
for (int i=;i<=n;i++)b[i]=read();
sort(a+,a+n+),sort(b+,b+n+);
for (int i=,j=;i<=n;i++)
{
while(j<=n&&b[j]<a[i])j++;
num[i]=j-;
}
init_C();
for (int i=;i<=n;i++)f[i][]=;
for (int i=;i<=n;i++)
for (int j=;j<=i;j++)
f[i][j]=(f[i-][j]+f[i-][j-]*max(num[i]-j+,))%mod;
for (int i=n;i>=m;i--)
{
dp[i]=f[n][i]*A[n-i]%mod;
for(int j=i+;j<=n;j++)
dp[i]=((dp[i]-dp[j]*C[j][i]%mod)%mod+mod)%mod;
}
printf("%lld\n",dp[m]);
}
bzoj 3622 已经没有什么好害怕的了 类似容斥,dp的更多相关文章
- P4859-已经没有什么好害怕的了【容斥,dp】
正题 题目链接:https://www.luogu.com.cn/problem/P4859 题目大意 两个长度为\(n\)的序列\(a,b\)两两匹配,求\(a_i>b_i\)的组数比\(a_ ...
- 【BZOJ3622】已经没有什么好害怕的了 容斥+DP
[BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...
- BZOJ 3622: 已经没有什么好害怕的了 [容斥原理 DP]
3622: 已经没有什么好害怕的了 题意:和我签订契约,成为魔法少女吧 真·题意:零食魔女夏洛特的结界里有糖果a和药片b各n个,两两配对,a>b的配对比b>a的配对多k个学姐就可能获胜,求 ...
- BZOJ 3622 : 已经没有什么好害怕的了(dp + 广义容斥原理)
今天没听懂 h10 的讲课 但已经没有什么好害怕的了 题意 给你两个序列 \(a,b\) 每个序列共 \(n\) 个数 , 数之间两两不同 问 \(a\) 与 \(b\) 之间有多少配对方案 使得 \ ...
- [BZOJ 3622]已经没有什么好害怕的了
世萌萌王都拿到了,已经没有什么好害怕的了—— (作死) 笑看哪里都有学姐,真是不知说什么好喵~ 话说此题是不是输 0 能骗不少分啊,不然若学姐赢了,那么有头的学姐还能叫学姐吗? (作大死) 这 ...
- ●BZOJ 3622 已经没有什么好害怕的了
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3622 题解: 容斥,dp1).可以求出需要多少对"糖果>药片"(K ...
- BZOJ.5407.girls/CF985G. Team Players(三元环计数+容斥)
题面 传送门(bzoj) 传送门(CF) \(llx\)身边妹子成群,这天他需要从\(n\)个妹子中挑出\(3\)个出去浪,但是妹子之间会有冲突,表现为\(i,j\)之间连有一条边\((i,j)\), ...
- [BZOJ3622]已经没有什么好害怕的了(容斥DP)
给定两个数组a[n]与b[n](数全不相等),两两配对,求“a比b大”的数对比“b比a大”的数对个数多k的配对方案数. 据说做了这题就没什么题好害怕的了,但感觉实际上这是一个套路题,只是很难想到. 首 ...
- bzoj 3622 已经没有什么好害怕的了——二项式反演
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3622 令 f[i] 表示钦定 i 对 a[ ]>b[ ] 的关系的方案数:g[i] 表 ...
随机推荐
- Java数据持久层框架 MyBatis之背景知识二
对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...
- SpringMvc4.x---快捷的ViewController
@RequestMapping("/index") public String hello(){ return "index"; } 此处无任何的业务处理,只是 ...
- Django_上传图片和模版获取图片
需求: 在Django中,上传图片,存入数据库中的文件的路径,而不是图片本身,也就是说,图片等数据静态文件都可以放到第三方服务器上,我想在把图片保存到Django本地项目中,并可以通过Django自带 ...
- Servlet--HttpSession接口,HttpSessionContext接口,Cookie类
HttpSession接口 定义 public interface HttpSession 这个接口被 Servlet 引擎用来实现在 HTTP 客户端和 HTTP 会话两者的关联.这种关联可能在多外 ...
- 通过脚本生成poco实体
今天在做开发时,需要把表映射成实体,又没有EF这种工具,就从网上下了一个工具,但使用时觉得太重了,所以就自己写了一个,基于mysql的. 功能:输入表名,得到这个表的poco实体 SELECT COL ...
- JMeter打开jmx文件报错解决方法
错误提示: Error Problem loading XMLfrom:'D:\software\apace-jmeter-3.3\bin\线程组jmx', missing class com.tho ...
- Jenkins初识
Jenkins Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. 功能 Jenkins功能包括 ...
- Go语言入门——dep入门
本文出现了大量maven的内容,更适合java程序员阅读,如果你的语言做依赖管理的方案与maven差异很大,可能在有些地方会不理解 从很久之前go语言在依赖解决和管理方面方案的匮乏就被不少人诟病.光指 ...
- mysql插入数据时检查是否某字段已存在
SELECT\n" + " '',\n" + " '{0}',\n" + " '{1}',\n" + " '{2}'\n ...
- dlib下训练自己的物体检测器--手的检测
之前我们在Linux上安装了dlib(http://www.cnblogs.com/take-fetter/p/8318602.html),也成功的完成了之前的人脸检测程序, 今天我们来一起学习怎样使 ...