题解-bzoj4221 JOI2012kangaroo
Problem
题意:给定\(n\)只袋鼠,每只袋鼠有俩属性\(a,b\),若\(a_i\leq b_j\),则\(i\)是可以被\(j\)放置在袋子里的,求经过一系列放置操作后无法进行操作时的状态有多少种可能(每只袋鼠只能被一只袋鼠放在袋子里,同时也只能放一只袋鼠在袋子里)
\(n\leq 300,\forall i\in[1,n]a_i\geq b_i\)
Solution
将每只袋鼠拆成出点和入点后做匹配,相当于剩余未匹配点中\(\min a\geq \max b\)的匹配方案数
由于\(a_i\geq b_i\)保证不可能自己连向自己,相当于是自由匹配,所以点与点之间的顺序是没有任何关系的,考虑将两者从大到小排序
设\(f[i][j][k]\)表示当前考虑到第\(i\)只袋鼠的体积,这\(i\)只袋鼠中有\(j\)只已经被匹配,设\(t\)为第\(i\)只袋鼠能塞进的最小口袋(\(t\)也递增),则\(k\)表示前\(t\)个口袋中与袋鼠\([i+1,n]\)中匹配的数量
考虑到在定义下的\(f[i][j][k]\)中,这\(j\)只已经被匹配的袋鼠所对应的口袋一定在区间\([1,t]\)中,所以口袋\([1,t]\)分为三类:
- ① 和区间\([1,i]\)内共\(j\)只袋鼠匹配的口袋,共\(j\)个
- ② 和区间\([i+1,n]\)内共\(k\)只袋鼠匹配的口袋,共\(k\)个
- ③ 自由节点,尚未匹配,共\(t-j-k\)个
理顺了这些可以得到以下仨转移式(一般自己写可能会有情况缺漏,反正我是想了很久)
\]
\]
\]
自然统计答案
\]
Code
#include <bits/stdc++.h>
using namespace std;
#define rg register
template <typename _Tp> inline _Tp read(_Tp&x){
char c11=getchar();x=0;while(!isdigit(c11))c11=getchar();
while(isdigit(c11))x=x*10+c11-'0',c11=getchar();return x;
}
const int N=301,p=1e9+7;
int f[N][N][N],a[N],b[N];
int n,ans;
template <typename _tp> inline void pls(int&A,_tp B){A=A+B<p?A+B:A+B-p;}
inline bool cmp(const int&A,const int&B){return A>B;}
void init();void work();void print();
int main(){init();work();print();return 0;}
void work(){
f[0][0][0]=1;
for(rg int i=1,t=1;i<=n;++i){
if(!t)++t;
while(a[i]<b[t]&&t<=n)++t;--t;
for(rg int j=0;j<i;++j)
for(rg int k=0;k+j<=t;++k){
pls(f[i][j][t-j],f[i-1][j][k]);
pls(f[i][j+1][k],1ll*f[i-1][j][k]*(t-j-k)%p);
if(k)pls(f[i][j+1][k-1],1ll*f[i-1][j][k]*k%p);
}
}
}
void print(){
for(rg int i=0;i<=n;++i)
pls(ans,f[n][i][0]);
printf("%d\n",ans);
}
void init(){
read(n);
for(rg int i=1;i<=n;++i)
read(a[i]),read(b[i]);
sort(a+1,a+n+1,cmp);
sort(b+1,b+n+1,cmp);
}
题解-bzoj4221 JOI2012kangaroo的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- ELASTICSEARCH 搜索的评分机制
从我们在elasticsearch复合框输入搜索语句到结果显示,展现给我们的是一个按score得分从高到底排好序的结果集.下面就来学习下elasticsearch怎样计算得分. Lucene(或 El ...
- 错误 3 未找到类型“sdk:Label”。请确保不缺少程序集引用并且已生成所有引用的程序集。
错误: 错误 3 未找到类型“sdk:Label”.请确保不缺少程序集引用并且已生成所有引用的程序集. 错误 1 命名空间“http://schemas.microsoft.com/winfx/200 ...
- jsp查询修改
也是只帖代码....不讲解. 1.search.jsp <%@ page language="java" import="java.util.*" pag ...
- luogu 1850 换教室 概率+dp
非常好的dp,继续加油练习dp啊 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) ...
- kindeditor编辑器上传图片
使用的是asp.net MVC 上传图片. 1.下载Kindeditor的对应的包 2.html页面 @{ Layout = null; } <!DOCTYPE html> <htm ...
- js中 onreadystatechange 和 onload的区别
IE的script 元素只支持onreadystatechange事件,不支持onload事件. FF的script 元素不支持onreadystatechange事件,只支持onload事件. 如果 ...
- 第25月25日 urlsession
1. private lazy var session: URLSession = { let configuration = URLSessionConfiguration.default conf ...
- JDK自带的LinkedHashMap来实现LRU算法
1 代码如下 public class LRULinkedHashMap<K, V> extends LinkedHashMap<K, V> { private final i ...
- Flume思维导图
- MySql数据库学习笔记(2)
DELETE 语法:delete from 表名 [where condition] delete from grade; TRUNCATE 用于完全清空表数据,但表结构.索引.约束不变: 语法: t ...