【BZOJ3622】已经没有什么好害怕的了(动态规划+广义容斥)
大致题意: 有\(n\)个糖果和\(n\)个药片,各有自己的能量。将其两两配对,求糖果比药片能量大的组数恰好比药片比糖果能量大的组数多\(k\)组的方案数。
什么是广义容斥(二项式反演)
我们首先来介绍一下什么是广义容斥。
我们要证明下面这样一个式子:
\]
观察右边这个式子,我们将\(f_n=\sum_{i=0}^nC_n^ig_i\)代入就可以得到:
\]
把\(C_n^i\)移入,可以得到:
\]
通过暴力展开我们可以证明\(C_n^iC_i^j=C_n^jC_{n-j}^{i-j}\),代入得:
\]
然后我们调换\(i\)和\(j\)的枚举顺序,并让\(i\)变为原先的\(n-i-j\)可得:
\]
然后代入二项式定理(因此这又称为二项式反演)\((x+y)^n=\sum_{i=0}^nC_n^ix^iy^{n-i}\)得:
\]
由于式子中出现了一个\(0^{n-j}\),因此只有当\(n-j=0\),即\(n=j\)时,该式才有值,代入得:
\]
因此原式恒成立,得证。
简单转化
恰好多\(k\)组这个条件不是很好求,所以我们可以将其转化一下。
由于总数\(n\)是固定的,所以我们容易求出糖果比药片能量大的组数应为\(\frac{n+k}2\)。
动态规划
接下来,我们就要使用\(DP\)了。
首先,我们把糖果和药片分别按能量排一边序。
则这样可以保证后枚举到的的糖果所能胜过的药片的区间一定能覆盖先枚举到的糖果的区间。
然后,设\(f_{i,j}\)表示糖果匹配到第\(i\)个,且已经与\(j\)个药片匹配的方案数,并设\(g_i\)表示能与第\(i\)个糖果匹配的药片数,则我们可以推出转移方程为:
\]
广义容斥
从前面\(DP\)得到的\(f_{n,i}\),我们可以轻松推得糖果大于药片的对数大于等于\(i\)的方案数。
由于我们已经确定了\(i\)对,而剩下的\((n-i)\)对实际上可以随意匹配,因此便是一个全排列。即:
\]
我们可以设\(F_i\)表示糖果大于药片的对数恰好等于\(i\)的方案数,则可得:
\]
然后用先前提到的广义容斥,就可以得到:
\]
已知糖果比药片能量大的组数应为\(\frac{n+k}2\),则\(F_{\frac{n+k}2}\)即为答案。
而这可以直接求。
代码
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 2000
#define X 1000000009
#define Qinv(x) Qpow(x,X-2)
#define Inc(x,y) ((x+=(y))>=X&&(x-=X))
#define C(x,y) (1LL*Fac[x]*Inv[y]%X*Inv[(x)-(y)]%X)
using namespace std;
int n,k,a[N+5],b[N+5],g[N+5],Fac[N+5],Inv[N+5],f[N+5][N+5];
I int Qpow(RI x,RI y) {RI res=1;W(y) y&1&&(res=1LL*res*x%X),x=1LL*x*x%X,y>>=1;return res;}//快速幂
class FastIO
{
private:
#define FS 100000
#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
#define pc(c) (C^FS?FO[C++]=c:(fwrite(FO,1,C,stdout),FO[(C=0)++]=c))
#define tn(x) (x<<3)+(x<<1)
#define D isdigit(c=tc())
int T,C;char c,*A,*B,FI[FS],FO[FS],S[FS];
public:
I FastIO() {A=B=FI;}
Tp I void read(Ty& x) {x=0;W(!D);W(x=tn(x)+(c&15),D);}
Tp I void write(Ty x) {W(S[++T]=x%10+48,x/=10);W(T) pc(S[T--]);}
Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
I void clear() {fwrite(FO,1,C,stdout),C=0;}
}F;
int main()
{
RI i,j,t,ans=0;for(F.read(n,k),i=1;i<=n;++i) F.read(a[i]);for(i=1;i<=n;++i) F.read(b[i]);//读入数据
for(sort(a+1,a+n+1),sort(b+1,b+n+1),i=1;i<=n;++i) {g[i]=g[i-1];W(g[i]^n&&a[i]>b[g[i]+1]) ++g[i];}//排序,然后求出g[i]
for(f[0][0]=i=1;i<=n;++i) for(j=0;j<=i;++j) f[i][j]=f[i-1][j],j&&Inc(f[i][j],1LL*f[i-1][j-1]*(g[i]-j+1)%X);//DP转移
for(Fac[0]=i=1;i<=n;++i) Fac[i]=1LL*Fac[i-1]*i%X;for(Inv[n]=Qinv(Fac[n]),i=n-1;~i;--i) Inv[i]=1LL*Inv[i+1]*(i+1)%X;//初始化阶乘及阶乘逆元
for(i=t=n+k>>1;i<=n;++i) Inc(ans,1LL*((i^t)&1?X-1:1)*C(i,t)%X*f[n][i]%X*Fac[n-i]%X);//求出最终答案
return F.write(ans),F.clear(),0;//输出答案
}
【BZOJ3622】已经没有什么好害怕的了(动态规划+广义容斥)的更多相关文章
- bzoj3622已经没有什么好害怕的了 dp+组合+容斥(?)
3622: 已经没有什么好害怕的了 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1033 Solved: 480[Submit][Status][ ...
- BZOJ - 3622:已经没有什么好害怕的了 (广义容斥)
[BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...
- 【BZOJ3622】已经没有什么好害怕的了(动态规划,容斥)
[BZOJ3622]已经没有什么好害怕的了(动态规划,容斥) 题面 BZOJ 题解 很明显的,这类问题是要从至少变成恰好的过程,直接容斥即可. 首先我们要求的是(糖果>药片)=(药片>糖果 ...
- BZOJ3622 已经没有什么好害怕的了 动态规划 容斥原理 组合数学
原文链接https://www.cnblogs.com/zhouzhendong/p/9276479.html 题目传送门 - BZOJ3622 题意 给定两个序列 $a,b$ ,各包含 $n$ 个数 ...
- 洛谷P4859 已经没有什么好害怕的了 [DP,容斥]
传送门 思路 大佬都说这是套路题--嘤嘤嘤我又被吊打了\(Q\omega Q\) 显然,这题是要\(DP\)的. 首先思考一下性质: 为了方便,下面令\(k=\frac{n+k}{2}\),即有恰好\ ...
- BZOJ 3622 : 已经没有什么好害怕的了(dp + 广义容斥原理)
今天没听懂 h10 的讲课 但已经没有什么好害怕的了 题意 给你两个序列 \(a,b\) 每个序列共 \(n\) 个数 , 数之间两两不同 问 \(a\) 与 \(b\) 之间有多少配对方案 使得 \ ...
- 【BZOJ3622】已经没有什么好害怕的了 容斥+DP
[BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...
- [BZOJ3622]已经没有什么好害怕的了(容斥DP)
给定两个数组a[n]与b[n](数全不相等),两两配对,求“a比b大”的数对比“b比a大”的数对个数多k的配对方案数. 据说做了这题就没什么题好害怕的了,但感觉实际上这是一个套路题,只是很难想到. 首 ...
- BZOJ3622 已经没有什么好害怕的了 【dp + 二项式反演】
题目链接 BZOJ3622 题解 既已开题 那就已经没有什么好害怕的了 由题目中奇怪的条件我们可以特判掉\(n - k\)为奇数时答案为\(0\) 否则我们要求的就是糖果大于药片恰好有\(\frac{ ...
随机推荐
- java中Excel导出
转载:https://www.cnblogs.com/gudongcheng/p/8268909.html,稍加修改了 https://www.cnblogs.com/hanfeihanfei/p/7 ...
- php连接数据库mysql数据库
查找数据 $con = mysqli_connect('localhost', 'root', '', 'mydb'); if (!$con) { die('数据库连接失败' . mysqli_con ...
- 二分搜索 - Binary Search
二分搜索是一种在有序数组中寻找目标值的经典方法,也就是说使用前提是『有序数组』.非常简单的题中『有序』特征非常明显,但更多时候可能需要我们自己去构造『有序数组』.下面我们从最基本的二分搜索开始逐步深入 ...
- javascrip基础学习
JS是一种解释性脚本语言,在网页开发用经常用到(HTML CSS),用于控制网页的行为.现在RTT的柿饼UI也是用JS来开发的,所以很有必要学习一下. 注释:// ./* */ 语句分行: 折行\ ...
- B P5 第十三届北航程序设计竞赛预赛
https://buaacoding.cn/contest-ng/index.html#/188/problems 其实这题挺简单的. 注意到答案的大小最多是22 二分,check长度是mid的不同子 ...
- Hadoop Intro - Configure 01
hadoop配置文件详解.安装及相关操作 一. Hadoop伪分布配置 1. 在conf/hadoop-env.sh文件中增加:export JAVA_HOME=/home/Java/j ...
- ssh RSA key变化后处理
root@localhost:/# scp -r root@172.19.47.30:/home/linux-4.16.2-devm.1.2.aarch64.dongbo ./@@@@@@@@@@@@ ...
- 性能测试工具Jmeter08-Jmeter断言(检查点)
断言是在请求的返回层面增加一层判断机制.因为请求成功了,并不代表结果一定正确,因此需要检测机制提高测试准确性. 下面介绍常用的jmeter三种断言 1.响应断言 例如: 模式匹配规则 2.Size A ...
- [转]创建一个JavaScript弹出DIV窗口层的效果
本文转自:http://www.soso.io/article/23698.html <!doctype html> <html lang="en"> &l ...
- git如何使用
Git是分布式的,但多数时候仍然要使用中央仓库作为所有开发者的交互中心,和svn一样,开发人员仍要在本地写代码并提交到中央服务器.Git相较于svn最大的优势就在于其强大的分支系统,而git的工作流程 ...