BZOJ3861 : Tree
把集合看成左边的点,图中的点看成右边的点,若集合$i$不包含$j$,则连边$i->j$,得到一个二分图,等价于求这个二分图的完备匹配个数。
设$f[i][j]$表示考虑了前$i$个集合,匹配了$j$个集合的方案数。
转移则是枚举当前集合是否匹配,然后设$g[i][j]$表示考虑了前$i$个内部点,匹配了$j$个集合的方案数。
最后方案数再除以每种集合出现次数的阶乘即可。
时间复杂度$O(n^2)$。
#include<cstdio>
#include<algorithm>
const int N=1010,P=1000000007;
int T,n,i,j,k,x,a[N],s[N],v[N],f[N][N],g[N][N],inv[N];unsigned long long h[N],w[N];
inline void up(int&a,int b){a+=b;if(a>=P)a-=P;}
int solve(){
for(i=1;i<=n;i++)v[i]=0;
for(i=1;i<=n;i++){
scanf("%d",&a[i]),s[i]=s[i-1]+a[i];
for(w[i]=j=0;j<a[i];j++)scanf("%d",&x),w[i]^=h[x],v[x]++;
}
for(i=1;i<=n;i++)if(v[i]!=1)return 0;
std::sort(w+1,w+n+1);
for(f[1][0]=i=1;i<=n;i=j){
for(j=i;j<=n&&w[i]==w[j];j++);
f[1][0]=1LL*f[1][0]*inv[j-i]%P;
}
for(i=2;i<=n;i++){
for(j=0;j<=i;j++)g[0][j]=f[i-1][j];
for(j=1;j<=a[i];j++)for(k=0;k<=i;k++)g[j][k]=0;
for(j=1;j<=a[i];j++)for(k=0;k<=i;k++)if(g[j-1][k]){
if(k<i)up(g[j][k+1],1LL*g[j-1][k]*(i-1-k)%P);
up(g[j][k],g[j-1][k]);
}
for(j=0;j<=i;j++)f[i][j]=g[a[i]][j],g[0][j]=1LL*f[i-1][j]*(s[i-1]-j)%P;
for(j=1;j<=a[i];j++)for(k=0;k<=i;k++)g[j][k]=0;
for(j=1;j<=a[i];j++)for(k=0;k<=i;k++)if(g[j-1][k]){
if(k<i)up(g[j][k+1],1LL*g[j-1][k]*(i-1-k)%P);
up(g[j][k],g[j-1][k]);
}
for(j=1;j<=i;j++)up(f[i][j],g[a[i]][j-1]);
}
return f[n][n];
}
int main(){
for(i=1;i<N;i++)h[i]=h[i-1]*233+17;
for(inv[0]=inv[1]=1,i=2;i<N;i++)inv[i]=1LL*(P-inv[P%i])*(P/i)%P;
for(i=1;i<N;i++)inv[i]=1LL*inv[i]*inv[i-1]%P;
while(~scanf("%d",&n)){
if(!n)return 0;
printf("Case #%d: %d\n",++T,solve());
}
}
BZOJ3861 : Tree的更多相关文章
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- SAP CRM 树视图(TREE VIEW)
树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...
- 无限分级和tree结构数据增删改【提供Demo下载】
无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...
- 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- Leetcode 笔记 110 - Balanced Binary Tree
题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...
- Leetcode 笔记 100 - Same Tree
题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...
- Leetcode 笔记 99 - Recover Binary Search Tree
题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...
- Leetcode 笔记 98 - Validate Binary Search Tree
题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...
- Leetcode 笔记 101 - Symmetric Tree
题目链接:Symmetric Tree | LeetCode OJ Given a binary tree, check whether it is a mirror of itself (ie, s ...
随机推荐
- javascript 添加行,删除行,datepicker获取当前日期和上一个月日期并设置格式,笔记
$(function () { getdatepicker(); today(); getPreMonth(); getdatetimepicker(); }); function today(){ ...
- http响应头设置
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletExcep ...
- javascript 类型比较方法
不要使用new Number().new Boolean().new String()创建包装对象: 用parseInt()或parseFloat()来转换任意类型到number: 用String() ...
- JavaScript 使用 mediaDevices API 选择摄像头
大多数智能手机都有前置和后置摄像头,当你在创建视频应用时你可能想要选择或者切换前置.后置摄像头. 如果你开发的是一款聊天应用,你很可能会想调用前置摄像头,但如果你开发的是一款拍照软件,那么你会更倾向于 ...
- Java基础98 gson插件的使用
1.要用到的包 2.实例 实体类 people package com.shore.entity; /** * @author DSHORE/2019-4-21 * */ public class P ...
- InterruptedException 异常
当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法. 抛InterruptedException的代表方法有: 1. jav ...
- python3笔记(一)初识Python
基础资料 什么是Python? Python官方网站 安装Python python的优点 完成同一个任务,C语言要写1000行代码,Java只需要写100行,而Python可能只要20行. pyth ...
- python 全栈开发,Day123(图灵机器人,web录音实现自动化交互问答)
昨日内容回顾 . 百度ai开放平台 . AipSpeech技术,语言合成,语言识别 . Nlp技术,短文本相似度 . 实现一个简单的问答机器人 . 语言识别 ffmpeg (目前所有音乐,视频领域,这 ...
- python 全栈开发,Day77(图书管理系统)
一.图书管理系统 完整代码链接: https://github.com/py3study/bms_multi 本项目使用session来实现一个简单的图书管理系统 未登录不允许访问后台: 直接访问后台 ...
- .NetCore下使用Prometheus实现系统监控和警报 (六)进阶Grafana集成自定义收集指标
Prometheus中包含了很多收集指标,那么我们怎来在Grafana中来使用呢? 接下来我们还是以之前自定义的来演示如图:我们在Prometheus中已经可以看到这个之前我们自定义的类型了 关于Gr ...