今天没听懂 h10 的讲课 但已经没有什么好害怕的了

题意

给你两个序列 \(a,b\) 每个序列共 \(n\) 个数 , 数之间两两不同

问 \(a\) 与 \(b\) 之间有多少配对方案 使得 \(a_i>b_i\) 的对数 比 \(b_i > a_i\) 的恰好多 \(k\) 对.

\((1 \le k \le n \le 2000)\)

题解

首先这个对数多的有点恶心 , 我们直接转化成 \(a_i > b_i\) 的共有 \(\frac{n+k}{2}\) 对 (自行模拟一下...)

然后不是整数的时候答案就是 \(0\) ... 这个我没有判断 , 但过了...

然后我们还是用 \(k\) 表示 \(a_i>b_i\) 的对数 .

看到 恰好 我们不难想到 至少 . 我们考虑如何计算至少 \(k\) 对的贡献 .

因为这有一个鬼畜的定理...

广义容斥定理 (二项式反演?) :

\[\displaystyle b_k = \sum_{i=k}^n \binom i k a_i
\]

\[\Updownarrow
\]

\[\displaystyle a_k = \sum_{i=k}^{n} (-1)^{i-k} \binom i k b_i
\]

这个 h10 讲了证明... 感性理解然后记忆一下吧...

不难想到一个简单的 \(dp\) 我们令 \(dp[i][j]\) 为 \(a\) 中前 \(i\) 个数能选出比 \(b\) 大共有 \(j\) 对的方案数.

然后我们记 \(\displaystyle \sum_{j=1}^n [a_i>b_j] = t_i\) . 也就是 \(a_i\) 比 多少个 \(b_j\) 大

\[\displaystyle dp[i][j]=dp[i-1][j] + dp[i-1][j-1]\times (t_i -j + 1)
\]

\(dp[i-1][j]\) 就是上一个同样 \(j\) 对时候 此时可以直接转移

\(dp[i-1][j-1]\times (t_i-j+1)\) 这个就是你当前已选了 \(j-1\) 对 , 当前还剩下 \(t_i-j+1\) 个可选

可以这样理解 前者是当前不选时候的贡献 后者是选择时候的贡献

然后此处我们不难发现 \(a\) 必须都要是有序的 不然会算错

DOFY : 排序是为了方便计数....不然你计不了答案...

就是你之前选的方案的 \(t_i\) 应该被后面给包括了 就是后面选方案的时候要算上当前的方案

然后我们令 \(F_i\) 为至少有 \(i\) 对满足 \(a > b\) 的方案数.

\[F_i = f_{n,i} \times (n-i)!
\]

然后令恰好有 \(k\) 对满足的 \(G_k\) 就是

\[\displaystyle G_k=\sum_{i=k}^n (-1)^{i-k} \binom i k F_i
\]

然后代码就比较好写咯...

代码

/**************************************************************
Problem: 3622
User: zjp_shadow
Language: C++
Result: Accepted
Time:2184 ms
Memory:64488 kb
****************************************************************/ #include <bits/stdc++.h>
#define For(i, l, r) for(register int i = (l), i##end = (int)(r); i <= i##end; ++i)
#define Fordown(i, r, l) for(register int i = (r), i##end = (int)(l); i >= i##end; --i)
#define Set(a, v) memset(a, v, sizeof(a))
using namespace std; inline bool chkmin(int &a, int b) {return b < a ? a = b, 1 : 0;}
inline bool chkmax(int &a, int b) {return b > a ? a = b, 1 : 0;} inline int read() {
int x = 0, fh = 1; char ch = getchar();
for (; !isdigit(ch); ch = getchar()) if (ch == '-') fh = -1;
for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);
return x * fh;
} void File() {
#ifdef zjp_shadow
freopen ("3622.in", "r", stdin);
freopen ("3622.out", "w", stdout);
#endif
} typedef long long ll;
const int N = 2010;
const ll Mod = 1e9 + 9;
int n, k, a[N], b[N], t[N]; inline void Add(ll &a, ll b) { if ((a += b) >= Mod) a -= Mod; }
ll dp[N][N], F[N], G[N], fac[N], C[N][N]; void Init(int maxn) {
fac[0] = 1;
For (i, 1, maxn)
fac[i] = fac[i - 1] * i % Mod;
C[0][0] = 1;
For (i, 1, maxn) {
C[i][0] = 1;
For (j, 1, maxn)
C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % Mod;
}
} int main () {
File(); Init(2000);
n = read(); k = read();
k = (n + k) >> 1;
For (i, 1, n) a[i] = read();
For (i, 1, n) b[i] = read();
sort(a + 1, a + 1 + n); dp[0][0] = 1;
For (i, 1, n) {
For (j, 1, n)
if (a[i] > b[j]) ++ t[i];
For (j, 0, n) {
Add(dp[i][j], dp[i - 1][j]);
if (!j) continue ;
Add(dp[i][j], dp[i - 1][j - 1] * max(0, (t[i] - j + 1)) % Mod);
}
}
For (i, 1, n)
F[i] = dp[n][i] * fac[n - i] % Mod;
For (i, k, n) {
G[k] += ((i - k) & 1 ? -1 : 1) * (C[i][k] * F[i] % Mod);
G[k] = (G[k] % Mod + Mod) % Mod;
}
printf ("%lld\n", G[k]); return 0;
}

BZOJ 3622 : 已经没有什么好害怕的了(dp + 广义容斥原理)的更多相关文章

  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】3622: 已经没有什么好害怕的了(DP+容斥原理)

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

  4. [BZOJ 3622]已经没有什么好害怕的了

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

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

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

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

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

  9. bzoj 3622 DP + 容斥

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

随机推荐

  1. 解决微软surface pro在某些情况下wifi转输速度过慢的问题 - z

    我是新款i7 surface.昨天到的货,狗东. 在公司使用的时候网络很正常,但回到家里之后就特别卡.5G频段也特别卡,基本处于无法观看视频的地步.台式电脑(我台式用的无线网卡)和手机都没问题. 于是 ...

  2. 机器学习sklearn19.0聚类算法——Kmeans算法

    一.关于聚类及相似度.距离的知识点 二.k-means算法思想与流程 三.sklearn中对于kmeans算法的参数 四.代码示例以及应用的知识点简介 (1)make_blobs:聚类数据生成器 sk ...

  3. WPF 矩形框8个控制点伸缩及拖拽

    最近在研发图片控件矩形框8个控制点进行控制边框的大小.位置等信息,之前查阅了相关的信息,比如别人整合的类:ControlResizer 这个类虽然是好,但是很大程度上是有限制,换句话说,它需要你二次更 ...

  4. mysql 通过慢查询日志查写得慢的sql语句

    MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启动时,mysqld 会写一个包含所有执行时间超过long_query_t ...

  5. C#_Math函数总结

    Math.abs() 计算绝对值. Math.acos() 计算反余弦值. Math.asin() 计算反正弦值. Math.atan() 计算反正切值. Math.atan2() 计算从x 坐标轴到 ...

  6. Ionic 入门与实战之第三章:Ionic 项目结构以及路由配置

    原文发表于我的技术博客 本文是「Ionic 入门与实战」系列连载的第三章,主要对 Ionic 的项目结构作了介绍,并讲解了Ionic 中的路由概念以及相关配置. 原文发表于我的技术博客 1. Ioni ...

  7. ABAQUS粘弹性边界及地震荷载施加的简单实现(Matlab生成input文件)

    思路 粘弹性边界因为能够考虑地基辐射阻尼而使得结构抗震的计算结果更趋于合理,所以在需要考虑结构地基相互作用的结构抗震计算时,是较为常用的地基边界处理和地震荷载施加方法.而ABAQUS软件是经常用来进行 ...

  8. ansible一键部署k8s单机环境

    一.虚拟机准备 干净的Centsot7.4.4G内存.2个CPU 最小化安装,最好带虚拟化 二.执行初始化脚本 注意:脚本中配置静态网卡根据实际网卡名称配置,我用的是ens33 可以用 sed -i ...

  9. webpack笔记

    打包 img src src 必须以 点(.) 开始,才能被打包. 如: ./img/logo.png ../img/logo.png 使用 process a.js window.Base_Url ...

  10. Mysql抓包工具 - MySQL Sniffer 使用小结 (含带general_log日志)

    在mysql运维工作中,一般会使用tcpdump做一些分析(直接读分析日志比较难以看明白,在数据库连接值高时使用):对于mysql实时的连接监控分析,通常会使用"mysqladmin/sho ...