尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

洛谷 P4859 已经没有什么好害怕的了 题解(DP,二项式反演)

洛谷 P4859 已经没有什么好害怕的了 题解(DP,二项式反演)
📅 发布时间:2026/6/20 3:09:19

给两个长为 \(n\) 的数组 \(a, b,\) 求将 \(a_i, b_j\) 两两匹配使得 \(a_i > b_j\) 的数量比 \(a_i < b_j\) 的数量多 \(k\)。数字不重复, \(k \le n \le 2000\)。

注意到,其实 \(a_i>b_j\) 和 \(a_i<b_j\) 分别的个数都是确定的,其中需要有 \(\frac{n+k}{2}\) 个 \(a_i>b_j\),\(\frac{n-k}{2}\) 个 \(a_i<b_j\)。于是问题就被转化成,有多少种将 \(a_i,b_j\) 两两配对的方案,使得 \(a_i>b_j\) 的个数恰好为 \(\frac{n+k}{2}\)。如果 \(n+k\) 是奇数那么无解。下文为了表述方便,令 \(k=\frac{n+k}{2}\)。

然后我们发现出现了“恰好”的限制,“恰好”的限制一般来讲是不好计数的。遇到这种问题,我们可以先求出“至少”的方案数,然后再通过二项式反演推出恰好的方案数。

首先我们将 \(a_i,b_i\) 都从小到大排序,这样对于每一个 \(a_i\) 来说,他能匹配的 \(b_j\) 恰好就是一段前缀,且这个前缀的长度只增不减。接下来,考虑设 \(f_{i,j}\) 表示考虑了 \(a\) 的前 \(i\) 个数,其中我们钦定匹配了 \(j\) 对(这里的钦定就是恰好的意思,剩下的 \(a_i\) 是否匹配我们不管)的匹配方案数。注意这里状态不是所有的数的匹配方案数,而是指的是我们钦定的那些数的匹配方案数。因为如果我们把状态设为了前者,转移就不太方便了。

然后现在我们考虑怎么做转移。如果 \(a_i\) 我们要钦定他和一个 \(b\) 去匹配,那么一共有 \(cnt_i-j\) 种方案,其中 \(cnt_i\) 是比 \(a_i\) 小的 \(b\) 的数量。如果 \(a_i\) 不与任意一个 \(b\) 去匹配,那么方案数就不变。于是有:

\[f_{i,j}\gets f_{i-1,j-1}\times (cnt_i - (j-1)) + f_{i-1,j} \]

当我们算完之后,再统一算剩下的没有钦定的数的贡献:

\[f_{n,k}\gets f_{n,k}\times (n-k)! \]

现在我们有了【至少选 \(k\) 个 \(a_i>b_j\) 的方案数 \(f_{n,k}\)】,我们想要推回恰好选 \(k\) 个的方案数 \(ans_k\),因为有:

\[f_{n,k}=\sum_{i=k}^n\binom{i}{k}ans_i \]

利用二项式反演,我们就能求出 \(ans_i\) 了:

\[ans_k=\sum_{i=k}^n(-1)^{i-k}\binom{i}{k}f_{n,i} \]

const int MAXN = 2e3 + 5, mod = 1e9 + 9;
int n, k, f[MAXN][MAXN], cnt[MAXN], a[MAXN], b[MAXN], fac[MAXN], ifac[MAXN];void add(int &x, int y) {x += y;if (x >= mod) x -= mod;
}int quickpow(int a, int b) {int ret = 1;while (b) {if (b & 1) ret = ret * a % mod;a = a * a % mod; b >>= 1;}return ret;
}int C(int n, int m) {if (n < m) return 0;return fac[n] * ifac[n - m] % mod * ifac[m] % mod;
}void work() {cin >> n >> k;for (int i = 1; i <= n; ++i)cin >> a[i];for (int i = 1; i <= n; ++i)cin >> b[i];sort(a + 1, a + 1 + n);sort(b + 1, b + 1 + n);if ((n + k) % 2 == 1) return cout << 0 << endl, void();k = (n + k) / 2;int j = 0;for (int i = 1; i <= n; ++i) {while (j < n && b[j + 1] < a[i]) ++j;cnt[i] = j;}f[0][0] = 1;for (int i = 1; i <= n; ++i) {for (int j = 0; j <= n; ++j) {f[i][j] = f[i - 1][j];if (j > 0 && j <= cnt[i]) add(f[i][j], f[i - 1][j - 1] * (cnt[i] - (j - 1)) % mod);}}fac[0] = 1;for (int i = 1; i <= n; ++i)fac[i] = fac[i - 1] * i % mod;ifac[n] = quickpow(fac[n], mod - 2);for (int i = n - 1; i >= 0; --i)ifac[i] = (ifac[i + 1] * (i + 1)) % mod;for (int i = 0; i <= n; ++i)f[n][i] = f[n][i] * fac[n - i] % mod;int ans = 0, coff = 1;for (int i = k; i <= n; ++i) {add(ans, coff * C(i, k) % mod * f[n][i] % mod);coff = (mod - coff);}cout << ans << endl;
}

相关新闻

  • 飞鱼uu单人防空4
  • HaluMem:揭示当前AI记忆系统的系统性缺陷,系统失效率超50%
  • 团队作业2-需求规格说明书

最新新闻

  • CANN/ge GetOutputsSize API文档
  • 2026年6月最新万国中国官方售后服务电话客服网点地址一览 - 亨得利官方服务中心
  • 我热爱上班 !哈哈哈,已封
  • 2026 年郑州市厨卫屋顶防水修缮三家横向测评:吉修匠 99.8 分稳居榜首 - 吉修匠
  • 孩子近视防控全方案技术解析:配镜与干预双维度 - 起跑123
  • Gemma-3-12B-IT WebUI安全加固:HTTPS、IP白名单与频率限制实战

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号