漫山遍野都是fake的光影。

题目

  1. [LGP4859] 已经没有什么好害怕的了

    给定两个长度为n的数组a和b,将a中元素与b中元素配对,求满足ai>bj的配对(i,j)个数减去满足ai<bi的配对(i,j)个数恰好为k的方案数,保证ab中无重复元素。

  2. [某年NOI欢乐赛] 决斗

    给定两个长度为n的数组a和b,将a中元素与b中元素随机配对,求满足ai≥bj的配对(i,j)个数k次方的期望。

题解

对于前一个问题,我们转换为求满足ai>(≥)bj的配对(i,j)恰好为k=(n+k)/2的方案数。这样就能与第二个问题形式上保持一致。称这样配对的配对为“配对”(雾)。

其次将ab从小到大排序,然后依次为a数组配对,设f[i,j]表示前i个位置上确定了j个“配对”的方案数(跳过剩下的i-j对不为“配对”的配对的转移),w[i]表示满足bj≤ai的最大的j,有转移 f[i,j]=f[i-1,j]+f[i-1,j-1]*(w[i]-j+1)。后边那个系数其实是(w[i]-w[i-1])+(w[i-1]-(j-1))得来的。

如果你有兴趣尝试dp前i个位置上恰好有j个配对,会发现不为“配对”的情况根本dp不动。

考虑对f[n,i]统一确定剩下的(n-i)个配对,记g[i]=f[n,i]*(n-i)!。显然g[i]的统计是有重复的。具体的,设h[i]为恰好有i个“配对”的方案数,h[i]在g[j]中被统计C(i,j)次,其中i≥j。

即g[i]=Σ[j≥i] h[j]*C(j,i),移项得h[i]=g[i] Σ[j>i] h[j]*C(j,i),可以递推求解了。

后一个问题的后续操作已经不重要了你说是吧

参考实现

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2019;
const int mod=1e9+9;int n,K,a[N],b[N],w[N],f[N][N],c[N][N];int main() {scanf("%d%d",&n,&K);for(int i=1; i<=n; ++i) scanf("%d",a+i);for(int i=1; i<=n; ++i) scanf("%d",b+i);if((n+K)&1) {puts("0");return 0;}K=(n+K)/2;sort(a+1,a+n+1);sort(b+1,b+n+1);for(int i=1,j=0; i<=n; ++i) {while(j<n&&b[j+1]<=a[i]) ++j;w[i]=j;}for(int i=0; i<=n; ++i) {c[i][0]=1;for(int j=1; j<=i; ++j)c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;}f[0][0]=1;for(int i=1; i<=n; ++i) {f[i][0]=f[i-1][0];int J=min(i,w[i]);for(int j=1; j<=J; ++j) f[i][j]=(f[i-1][j]+(ll)f[i-1][j-1]*(w[i]-j+1)%mod)%mod;for(int j=J+1; j<=i; ++j)f[i][j]=f[i-1][j];}int fc=1;for(int i=n; i>=K; --i) {w[i]=(ll)f[n][i]*fc%mod;for(int j=i+1; j<=n; ++j) w[i]=(w[i]+mod-(ll)w[j]*c[j][i]%mod)%mod;fc=(ll)fc*(n-i+1)%mod;}printf("%d\n",w[K]);return 0;
}

转载于:https://www.cnblogs.com/nosta/p/11174462.html

[LGP4859,...] 一类奇怪的容斥套DP相关推荐

  1. hdu-5794 A Simple Chess(容斥+lucas+dp)

    题目链接: A Simple Chess Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Ot ...

  2. CSPS 2019 Day2 T1 Emiya 家今天的饭(容斥 + 计数 dp)

    Description 给定一个 n×mn \times mn×m 的矩阵,每一行最多选一个数,每一列可以选若干个数,但是每一列选的数不能超总数的一半.求有多少个不同的方案数. Solution 容斥 ...

  3. 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings

    题目链接 题目大意: 就是给你一个2n2n2n个点的完全图,从这个图里面抽出2n−12n-12n−1条边,这些边形成一颗树,现在问你剩下的图里面点进行完美匹配有多少种方案? 解题思路: 一开始被完美匹 ...

  4. HDU 6143 Killer Names(排列+容斥,dp)

    Killer Names HDU 6143 (容斥+排列组合,dp+整数快速幂) 2017ACM暑期多校联合训练 - Team 8 1011 Killer Names 题目链接 Time Limit: ...

  5. Luogu P4707 重返现世 (拓展Min-Max容斥、DP)

    题目链接 https://www.luogu.org/problem/P4707 题解 最近被神仙题八连爆了-- 首先Min-Max容斥肯定都能想到,问题是这题要用一个扩展版的--Kth Min-Ma ...

  6. 洛谷P5664:Emiya 家今天的饭(容斥、dp)

    解析 应该是比较入门的容斥了 统计方案用总方案数-某列超过1半的方案数 dp设计的一个trick是只统计差值 代码 #include<bits/stdc++.h> using namesp ...

  7. 【XSY3657】因数分解(容斥,DP)

    考虑没有 bib_ibi​ 的限制怎么做. 先把 n!n!n! 质因数分解:n!=∏i=1kpiqin!=\prod\limits_{i=1}^kp_i^{q_i}n!=i=1∏k​piqi​​. 设 ...

  8. UOJ #390 【UNR #3】百鸽笼 容斥+DP

    题目分析 算法0 每个管理员选哪一列,将构成一个长度为 N − 1 N-1 N−1的序列,序列的种数可以通过经典的将 a a a个相同元素插入到一个没有该元素的长度为 b b b的序列里问题,轻松求出 ...

  9. loj#2542. 「PKUWC2018」随机游走(MinMax容斥 期望dp)

    题意 题目链接 Sol 考虑直接对询问的集合做MinMax容斥 设\(f[i][sta]\)表示从\(i\)到集合\(sta\)中任意一点的最小期望步数 按照树上高斯消元的套路,我们可以把转移写成\( ...

最新文章

  1. python使用argparse解析命令行参数
  2. 柱状图、堆叠柱状图、瀑布图有什么区别?怎样用Python绘制?(附代码)
  3. linux网络速度不稳定,关于Linux下上网速度慢的问题
  4. 「高并发秒杀」mysql只修改字段名称
  5. mybatis批量夺标添加_MyBatis+MySQL同时执行多条SQL,实现多表插入数据
  6. MySQL—通过Adjacency List(邻接表)存储树形结构
  7. php 特有,PHP特殊数据类型有哪些?原来这门编程语言如此有趣
  8. 改造create-react-app 通过npm命令动态打包文件
  9. 源代码 oa办公系统jsp_【程序源代码】经典的办公系统开发框架
  10. php基础--变量及作用域
  11. 4.3.5 心跳和协调者的关系
  12. nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)
  13. SPI 读取不同长度 寄存器_几种常用的总线设计:UART/SPI/I2C
  14. 极智AI | 目标检测实现分享二:听说克莱今天复出了?详解 YOLOv2 算法与克莱检测
  15. 测试 CS4344 立体声DA转换器
  16. 电脑端口号怎么查看?运行cmd命令查看电脑端口的方法图解
  17. 形象标识 新松机器人_新松机器人自动化股份有限公司
  18. Linux命令之bc命令
  19. vs启动错误:Exception Processing Message 0xc0000005 Parameters...
  20. mac m1 office卸载重装(学校官方正版)

热门文章

  1. stl的complex(二)
  2. 题目1022:游船出租
  3. oracle常用日期函数
  4. 「BZOJ 3994」「SDOI 2015」约数个数和「莫比乌斯反演」
  5. Codeforces Round #504 E. Down or Right
  6. MySQL:创建、修改和删除表
  7. 微信小程序开发(1)
  8. 利用jQuery和CSS实现环形进度条
  9. 华为软件编程规范和范例 可读性
  10. MVC 3 登录、注销