[BZOJ3622]已经没有什么好害怕的了(容斥DP)
给定两个数组a[n]与b[n](数全不相等),两两配对,求“a比b大”的数对比“b比a大”的数对个数多k的配对方案数。
据说做了这题就没什么题好害怕的了,但感觉实际上这是一个套路题,只是很难想到。
首先显然“a比b大”的个数是确定的,问题转化成求“a比b大”的数对个数为m的方案数。
不好算考虑容斥,总结下容斥的一些套路。(From ATP's Blog)
1.全部-至少一个+至少两个-…=一个也没有的
2.所有的-一个也没有的=至少有一个的
3.至少有k个的-C(k+1,k)* 至少有k+1个的+C(k+2,k) *至少有k+2个的…=恰好有k个的
4.将“强制一部分满足要求,一部分不满足”转化为只强制一部分满足要求,然后容斥
5.补集转化 \ Min-Max容斥 \ 与质因子相关的容斥用$\mu$做容斥系数。
(还有一种类似FMT思想的容斥,不过只是用于求解问题中简便使用的,一般不作为容斥方法)
这题用的是第三种,同样的题可见[BZOJ3198][SDOI2013]Spring(容斥+Hash)
这样,问题就变成求“a比b大”的数对个数不少于m的方案数。
将a,b均排序,考虑DP,f[i][j]表示给前i个a中的至少j个安排数值更低的b的方案数。
则有:f[i][j]=f[i-1][j]+f[i-1][j-1]*(k-(j-1))
其中k为b中小于a[i]的最后一个数的位置。
理解起来就是,如果i与k之后的配对,方案数为f[i-1][j],否则i有k-(j-1)种选法。
问题得解,注意特判n和m不同奇偶,DP转移是特判j=0即可。
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=;
const ll mod=;
int n,m;
ll ans;
ll f[N][N],C[N][N],fac[N];
int a[N],b[N]; int main(){
freopen("bzoj3622.in","r",stdin);
freopen("bzoj3622.out","w",stdout);
scanf("%d%d",&n,&m);
if ((n^m)&){ puts(""); return ; }
m=(n+m)>>; fac[]=;
rep(i,,n) fac[i]=fac[i-]*i%mod;
rep(i,,n) scanf("%d",&a[i]);
rep(i,,n) scanf("%d",&b[i]);
rep(i,,n){
C[i][]=;
rep(j,,i) C[i][j]=(C[i-][j-]+C[i-][j])%mod;
}
sort(a+,a+n+); sort(b+,b+n+);
f[][]=;
rep(i,,n){
int k=; while (k<=n && b[k]<a[i]) k++; k--;
rep(j,,i) f[i][j]=(f[i-][j]+f[i-][j-]*max(k-j+,))%mod;
f[i][]=f[i-][];
}
ll t=;
rep(i,m,n) f[n][i]=(f[n][i]*fac[n-i])%mod,ans=(ans+t*f[n][i]*C[i][m]%mod+mod)%mod,t=-t;
printf("%lld\n",(ans+mod)%mod);
return ;
}
[BZOJ3622]已经没有什么好害怕的了(容斥DP)的更多相关文章
- 【BZOJ3622】已经没有什么好害怕的了 容斥+DP
[BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...
- BZOJ3622 已经没有什么好害怕的了 二项式反演+DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3622 题解 首先显然如果 \(n - k\) 为奇数那么就是无解.否则的话,"糖果& ...
- BZOJ3622(容斥+dp)
思路 "恰k个"考虑求至少k.k+1--个容斥 题面说所有数字都不同,可以将所求转化为糖比药多的组数恰为\((n+k)/2\)的方案数 \(f[i][j]\)数组我觉得更好的理解方 ...
- P4859-已经没有什么好害怕的了【容斥,dp】
正题 题目链接:https://www.luogu.com.cn/problem/P4859 题目大意 两个长度为\(n\)的序列\(a,b\)两两匹配,求\(a_i>b_i\)的组数比\(a_ ...
- 【BZOJ3622】已经没有什么好害怕的了(动态规划,容斥)
[BZOJ3622]已经没有什么好害怕的了(动态规划,容斥) 题面 BZOJ 题解 很明显的,这类问题是要从至少变成恰好的过程,直接容斥即可. 首先我们要求的是(糖果>药片)=(药片>糖果 ...
- BZOJ3622 已经没有什么好害怕的了 【dp + 二项式反演】
题目链接 BZOJ3622 题解 既已开题 那就已经没有什么好害怕的了 由题目中奇怪的条件我们可以特判掉\(n - k\)为奇数时答案为\(0\) 否则我们要求的就是糖果大于药片恰好有\(\frac{ ...
- [bzoj3622]已经没有什么好害怕的了_动态规划_容斥原理
bzoj-3622 已经没有什么好害怕的了 题目大意: 数据范围:$1\le n \le 2000$ , $0\le k\le n$. 想法: 首先,不难求出药片比糖果小的组数. 紧接着,我开始的想法 ...
- bzoj3622已经没有什么好害怕的了
bzoj3622已经没有什么好害怕的了 题意: 给n个数Ai,n个数Bi,将Ai中的数与Bi中的数配对,求配对Ai比Bi大的比Bi比Ai大的恰好有k组的方案数.n,k≤2000 题解: 蒟蒻太弱了只能 ...
- bzoj3622已经没有什么好害怕的了 dp+组合+容斥(?)
3622: 已经没有什么好害怕的了 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1033 Solved: 480[Submit][Status][ ...
随机推荐
- Remmarguts' Date(POJ2449+最短路+A*算法)
题目链接:http://poj.org/problem?id=2449 题目: 题意:求有向图两点间的k短路. 思路:最短路+A*算法 代码实现如下: #include <set> #in ...
- bzoj 1050 并查集
先按边长排序,假设s与t连通,那么我们可以枚举s与t的路径中最短的一条边,通过类似与kruskal的方法找到s与t的路径在当前最小边权情况下尽量小的最大边权,用这个比值更新答案. 特别的,我们对于某一 ...
- Less & Sass
CSS不是一种编程语言.它开发网页样式,但是没法用它编程.也就是说,CSS基本上是设计师的工具,它没有变量,也没有条件语句,只是一行行单纯的描述.有人就开始为CSS加入编程元素,这被叫做"C ...
- Perl6 Bailador框架(3):路径匹配
use v6; use Bailador; =begin pod 注意的是, 当/:one设置时 虽然你有/admin或/about, 但这个/:one不会跟现有的匹配 只跟没有的匹配: 也就是说, ...
- Linux中查看进程占用内存的情况【转】
转自:http://hutaow.com/blog/2014/08/28/display-process-memory-in-linux/ Linux中查看某个进程占用内存的情况,执行如下命令即可,将 ...
- (十七)vmware无法将网络更改为桥接状态
故障现象,导致虚拟机无法正常上网 设备管理器中的驱动设备正常加载,但是注意这两个虚拟网卡是有问题的 将这两个虚拟网卡删除 只剩物理网卡了,重新启动电脑 将虚拟机里的网络设置删除 清空网卡后点击恢复默认 ...
- 2017多校第10场 HDU 6172 Array Challenge 猜公式,矩阵幂
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6172 题意:如题. 解法: #include <bits/stdc++.h> using ...
- C中级 MariaDB Connector/C API 编程教程
引言 - 环境搭建 首先开始环境搭建. 主要在Window 10 + Visual Studio 2015 上构建使用 mariadb connector/c api 进行数据操作开发. 为什么选择在 ...
- 根据节点解析xml
config.xml文件如下: <?xml version="1.0" encoding="gb2312" ?> <root> < ...
- Matcher匹配器查找字符串指定内容
public static void main(String[] args) { String s = "我的手机号码是18988888888,曾经用过18987654321,还用过1881 ...