将袋鼠大小和口袋大小分别从小到大排序。

枚举从左往右第一只没有被放入任何口袋的袋鼠$x$,那么$x$之前的所有袋鼠、以及$x$能装入的所有口袋都应该在匹配边上。

按这只袋鼠将上下两个序列分为两部分,设$f[i]$表示左边内部有$i$条匹配边的方案数,$g[i]$表示右边内部有$i$条匹配边的方案数。

那么枚举左右各剩下$i$个点未匹配,则对答案的贡献是$f[L-i]\times g[R-i]\times i!$。

对于$f,g$的求解,假设是求$f$,那么从右往左考虑每个袋鼠,限制会越来越松。

所以设$dp[i][j]$表示考虑了$i$开始到最后一只袋鼠,目前有$j$条匹配边的方案数。

对于第$i-1$只袋鼠,它可选的匹配边条数是固定的,减去$j$就是它匹配某个口袋的方案数。

时间复杂度$O(n^3)$。

#include<cstdio>
#include<algorithm>
const int N=305,P=1000000007;
int n,i,j,ca,cb,l,r,a[N],b[N],A[N],B[N],fac[N],f[N],g[N],dp[N][N],ans;
inline void up(int&a,int b){a+=b;if(a>=P)a-=P;}
inline void dpl(){
int i,j,k,o;
for(i=1;i<=ca+1;i++)for(j=0;j<=ca;j++)dp[i][j]=0;
dp[ca+1][0]=1;
for(i=ca;i;i--){
for(k=0,o=cb;o;o--)if(A[i]<B[o])k++;else break;
for(j=0;j<=ca;j++)if(dp[i+1][j]){
up(dp[i][j],dp[i+1][j]);
up(dp[i][j+1],1LL*dp[i+1][j]*(k-j)%P);
}
}
for(l=ca,i=0;i<=ca;i++)f[i]=dp[1][i];
}
inline void dpr(){
int i,j,k,o;
for(i=0;i<=cb;i++)for(j=0;j<=cb;j++)dp[i][j]=0;
dp[0][0]=1;
for(i=1;i<=cb;i++){
for(k=0,o=1;o<=ca;o++)if(A[o]<B[i])k++;else break;
for(j=0;j<=cb;j++)if(dp[i-1][j]){
up(dp[i][j],dp[i-1][j]);
up(dp[i][j+1],1LL*dp[i-1][j]*(k-j)%P);
}
}
for(r=cb,i=0;i<=cb;i++)g[i]=dp[cb][i];
}
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d%d",&a[i],&b[i]);
std::sort(a+1,a+n+1),std::sort(b+1,b+n+1);
for(fac[0]=i=1;i<=n;i++)fac[i]=1LL*fac[i-1]*i%P;
for(i=1;i<=n;i++){
ca=cb=0;
for(j=1;j<i;j++)A[++ca]=a[j];
for(j=1;j<=n;j++)if(b[j]<=a[i])B[++cb]=b[j];
dpl();
ca=cb=0;
for(j=i+1;j<=n;j++)A[++ca]=a[j];
for(j=1;j<=n;j++)if(b[j]>a[i])B[++cb]=b[j];
dpr();
for(j=0;j<=l&&j<=r;j++)up(ans,1LL*f[l-j]*g[r-j]%P*fac[j]%P);
}
return printf("%d",ans),0;
}

  

BZOJ4221 : JOI2012 kangaroo的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. BZOJ 4221 [JOI2012春季合宿]Kangaroo (DP)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4221 题解 orz WYC 爆切神仙DP 首先将所有袋鼠按大小排序.考虑从前往后DP, ...

  3. Exercises - Kangaroo

    Write a definition for a class named Kangaroo with the following methods: An __init__ method that in ...

  4. 6656 Watching the Kangaroo

    6656 Watching the KangarooDay by day number of Kangaroos is decreasing just liketiger, whale or lion ...

  5. Gym 101981K - Kangaroo Puzzle - [玄学][2018-2019 ACM-ICPC Asia Nanjing Regional Contest Problem K]

    题目链接:http://codeforces.com/gym/101981/problem/K Your friend has made a computer video game called “K ...

  6. 【BZOJ4388】JOI2012 invitation 堆+线段树+并查集(模拟Prim)

    [BZOJ4388]JOI2012 invitation Description 澳洲猴举办了一场宴会,他想要邀请A个男生和B个女生参加,这A个男生从1到A编号,女生也从1到B编号.现在澳洲猴知道n组 ...

  7. E - Cheap Kangaroo(求多个数的最大公约数)

    Description There are N kangaroos going out to eat at an Indian restaurant. The ith kangaroo wants t ...

  8. Gym - 101981K The 2018 ICPC Asia Nanjing Regional Contest K.Kangaroo Puzzle 暴力或随机

    题面 题意:给你1个20*20的格子图,有的是障碍有的是怪,你可以每次指定上下左右的方向,然后所有怪都会向那个方向走, 如果2个怪撞上了,就融合在一起,让你给不超过5w步,让所有怪都融合 题解:我们可 ...

  9. 第三十五个知识点:给针对ECDLP问题的Pollard rho,Pollard "Kangaroo",parallel Pollard rho攻击的一个粗略的描述

    第三十五个知识点:给针对ECDLP问题的Pollard rho,Pollard "Kangaroo",parallel Pollard rho攻击的一个粗略的描述 我们的目标是对任 ...

随机推荐

  1. GHOST分区丢失只剩C盘

    很多人装系统时会经常会使用GHOST来恢复自己的系统,当WINDOWS系统出现意外时,再用GHOST的“From Image to 分区”来对系统进行恢复,这样就可以省去繁琐耗时的重新安装操作系统的工 ...

  2. How to Repair GRUB2 When Ubuntu Won’t Boot

    Ubuntu and many other Linux distributions use the GRUB2 boot loader. If GRUB2 breaks—for example, if ...

  3. xargs -i和-I的区别【转】

    xargs与find经常结合来进行文件操作,平时删日志的时候只是习惯的去删除,比如  # find . -type f -name "*.log" | xargs rm -rf * ...

  4. java并发编程系列七:volatile和sinchronized底层实现原理

    一.线程安全 1.  怎样让多线程下的类安全起来 无状态.加锁.让类不可变.栈封闭.安全的发布对象 2. 死锁 2.1 死锁概念及解决死锁的原则 一定发生在多个线程争夺多个资源里的情况下,发生的原因是 ...

  5. openstack新版本ocata的接口改动

    新增placement API,部分替代了原先的nova api的部分功能接口 可在此页面查看API详情及示例:https://specs.openstack.org/openstack/nova-s ...

  6. ubuntu系统初始化网络及mysql配置

    安装系统时需要安装open-ssh服务软件,否则无法远程连接 1.修改root密码 # sudo passwd 输入密码即可 切换到root用户,需要输入刚才的root密码 # su - 2.配置网络 ...

  7. Spring boot教程mybatis访问MySQL的尝试

    Windows 10家庭中文版,Eclipse,Java 1.8,spring boot 2.1.0,mybatis-spring-boot-starter 1.3.2,com.github.page ...

  8. ES6 模块与 CommonJS 模块的差异

    ES6 模块与 CommonJS 模块完全不同.它们有两个重大差异 CommonJS 输出是值的拷贝,即原来模块中的值改变不会影响已经加载的该值,ES6静态分析,动态引用,输出的是值的引用,值改变,引 ...

  9. confusion_matrix(混淆矩阵)

    作者:十岁的小男孩 凡心所向,素履可往 目录 监督学习—混淆矩阵 是什么?有什么用?怎么用? 非监督学习—匹配矩阵 混淆矩阵 矩阵每一列代表预测值,每一行代表的是实际的类别.这个名字来源于它可以非常容 ...

  10. github 推送代码

    一.所有更新一起推送 .git init //初始化本地仓库 . git add . //添加全部文件 .git commit -m 'add all the file' //提交修改 .git st ...