题意:

  给定两个序列$a$和$b$,让它们进行匹配,求出使得$a_i > b_j$的个数比$a_i < b_j$的个数恰好多$k$,求这样的匹配方法数

题解:

  这题的各种表示有一点相似又截然不同,很容易混淆。

  直接求恰好满足$k$对不好求,所以先放宽条件,这样子有利于构造动规方程。

  先用$f_{i, j}$表示在前$i$个中,至少选择$j$个$a > b$的匹配的方案数(是匹配的方案数,只关心匹配那一部分,不关心其它的部分),容易得到动规方程:

                     ƒi,j = ƒi - 1,j + (Lasti - (j - 1)) * ƒi - 1,j - 1

  其中$Last_i$表示第一个小于$a_i$的$b_j$。

  $(Last_i - (j - 1))$表示原有$Last_i$种选择,被选走了$j - 1$种,此时因为是“至少”,所以其它的匹配是不用管的。

  那么现在考虑求出恰好为$k$的方案数。

  首先令$g_i$表示前$N$个$a$中,满足至少有$i$个$a > b$的方案数,那么

                      gi = ƒN,j * (N - i) !

  这时候才考虑了其它的部分,所以需要乘上阶乘。

  再令$f'_i$表示恰好满足$i$组的方案数,那么考虑容斥,在所有的$g_j$中,每个$f'_i (i > j)$被算了$C_i^j$次,因为不考虑其它的,仅$i$个已匹配好的任意取$j$个,其它的随便排,正好被$g_j$囊括,当然这一部分是多余的,所以

                      ƒ'i = gj - Cj, i * ƒ'j (j > i)

代码:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> #define MOD 1000000009 using namespace std; typedef long long LL; const int MAXN = + ; LL g[MAXN][MAXN]; LL f[MAXN]= {}; LL fac[MAXN];
LL C[MAXN][MAXN]; int N, K; int Candy[MAXN], Pill[MAXN]; int Last[MAXN]= {}; void Preparation () {
fac[] = ;
for (int i = ; i <= N; i ++)
fac[i] = fac[i - ] * i % MOD; 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;
} int main () {
scanf ("%d%d", & N, & K); Preparation (); for (int i = ; i <= N; i ++)
scanf ("%d", & Candy[i]);
for (int i = ; i <= N; i ++)
scanf ("%d", & Pill[i]); sort (Candy + , Candy + N + );
sort (Pill + , Pill + N + ); for (int i = ; i <= N; i ++)
for (int j = N; j >= ; j --)
if (Pill[j] < Candy[i]) {
Last[i] = j;
break;
} for (int i = ; i <= N; i ++)
g[i][] = ;
for (int i = ; i <= N; i ++)
for (int j = ; j <= i; j ++)
g[i][j] = (g[i - ][j] + (Last[i] - j + ) * g[i - ][j - ] % MOD) % MOD; for (int i = N; i >= ; i --) {
f[i] = g[N][i] * fac[N - i] % MOD;
for (int j = i + ; j <= N; j ++)
f[i] = ((f[i] - C[j][i] * f[j] % MOD) % MOD + MOD) % MOD;
} printf ("%lld\n", f[(N + K) >> ]); return ;
} /*
4 2
5 35 15 45
40 20 10 30
*/

BZOJ - Problem 3622 - 已经没有什么好害怕的了的更多相关文章

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

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

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

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

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

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

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

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

  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]已经没有什么好害怕的了

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

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

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

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

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

随机推荐

  1. 【数据库_Mysql】MySQL动态语句 if set choose where foreach trim

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) ...

  2. 【比赛】HNOI2018 道路

    这题很考思维啊,考验我们能否快速从省选难度跳转到普及难度 考试的时候真的想得太多,觉得省选不可能这么简单吧,然后就打脸 设 \(f[i][j][x]\) 表示从根到 \(x\) 号点,有 \(i\) ...

  3. [AT2557] [arc073_c] Ball Coloring

    题目链接 AtCoder:https://arc073.contest.atcoder.jp/tasks/arc073_c 洛谷:https://www.luogu.org/problemnew/sh ...

  4. Codeforces Round #406 (Div. 2)滚粗记

    A 一看到题,不是一道解不定方程的裸题吗,调了好久exgcd. 其实一个for就好了啊 B 一直WA ON TEST 7真是烦,一想会不会是编号太大了,又写了一个map版本,无用. 调了好久好久才发现 ...

  5. python之选择排序

    选择排序:比如在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换......第N-1趟遍历剩下的2个 ...

  6. 《JavaScript高级程序设计(第三版)》-2

    变量 ECMAScript变量是松散类型的,即可以保存任何类型的数据. 初始化变量不会把它标记类型,初始化的过程只是给变量付一个值,因此可以在修改变量的同时修改值的类型.但并不推荐这样做. var m ...

  7. The 14th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple - C 暴力 STL

    What Kind of Friends Are You? Time Limit: 1 Second      Memory Limit: 65536 KB Japari Park is a larg ...

  8. unity直连android真机在Profiler性能分析测试

    基础步骤: 1.Unity打开你要测试的项目:File–Build Settings 2.如下图,按图顺序进行1.2.3.4.5操作,如果做过了,2就是灰色的,不能被点击,4和5需要相对应. 3.确保 ...

  9. 为Azure Web Site 添加ADFS验证支持之一 设置ADFS的信任关系

    很多时候企业开发的应用都会通过AD(Active Directory)进行验证用户名密码的,在企业里面统一一个AD来进行账号密码管理也是一个很好的实践.当企业打算将一个应用迁移到Azure的时候,使用 ...

  10. input file 图片上传展示重新上传

    html <div> <label class="imgMark">说明:</label> <div class="erWeiM ...