在合并的时候有可以加等于,或者继续用小于,

比如siz[x]和siz[y]合并,小于的区间为max(siz[x],siz[y])<=k<=siz[x]+siz[y],

然后就是合并成多少个小于号的方案数了,

 #include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdlib>
#define N 107
#define M 207
#define mod 1000000007
#define ll long long
using namespace std; int n,m,S;
int cnt,head[N],next[M],rea[M];
int fa[N],du[N],siz[N];
bool boo[N],hash[N];
struct Node
{
int x,y;
}a[N];
ll c[N][N],f[N][N],g[N],ans; void add(int u,int v)
{
next[++cnt]=head[u];
head[u]=cnt;
rea[cnt]=v,du[v]++;
}
int find(int num)
{
if (fa[num]!=num) fa[num]=find(fa[num]);
return fa[num];
}
void dfs(int u,int fa)
{
boo[u]=;bool flag=;
for (int i=head[u];i!=-;i=next[i])
{
int v=rea[i];
if (v==fa) continue;
dfs(v,u);
if (flag)
{
memset(g,,sizeof(g));
for (int i1=;i1<=siz[u];i1++)
if (f[u][i1])
for (int j1=;j1<=siz[v];j1++)
if (f[v][j1])
for (int k1=max(i1,j1);k1<=i1+j1;k1++)
g[k1]=(g[k1]+f[u][i1]*f[v][j1]%mod*c[k1][i1]%mod*c[i1][j1-(k1-i1)]%mod)%mod;
siz[u]+=siz[v];
for (int i=;i<=siz[u];i++)
f[u][i]=g[i];
}
else
{
flag=;
siz[u]=siz[v];
for (int i=;i<=siz[v];i++)
f[u][i]=f[v][i];
}
}
if (u!=S)
{
siz[u]++;if (!flag) f[u][]=;
else for (int i=siz[u];i>=;i--) f[u][i]=f[u][i-];
}
}
bool dfs_circle(int u)
{
for (int i=head[u];i!=-;i=next[i])
{
int v=rea[i];
if (boo[v]) return false;
boo[v]=true;
if (!dfs_circle(v)) return false;
}
return true;
}
int main()
{
memset(head,-,sizeof(head));
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
fa[i]=i;
for (int i=;i<=n;i++)
c[i][]=;
for (int i=;i<=n;i++)
for (int j=;j<=i;j++)
c[i][j]=(c[i-][j]+c[i-][j-])%mod;
//========================================================================================
int x,y,top=;char ch[];
for (int i=;i<=m;i++)
{
scanf("%d%s%d",&x,&ch,&y);
if (ch[]=='=')
{
int u=find(x),v=find(y);
fa[v]=u;
continue;
}
else if (ch[]=='>') swap(x,y);
a[++top].x=x,a[top].y=y;
}
m=top;
for (int i=;i<=m;i++)
{
int u=find(a[i].x),v=find(a[i].y);
if (u!=v) add(u,v);//如果一个相等集合中有相互比较关系
else
{
printf("0\n");
return ;
}
}
for (int i=;i<=n;i++)
if (!boo[i])
{
boo[i]=;
if (!dfs_circle(i))
{
printf("0\n");
return ;
}
}
S=n+;
for (int i=;i<=n;i++)
{
int zhi=find(i);
if (!du[zhi]&&!hash[zhi])
{
add(S,zhi);
hash[zhi]=;
}
}
//=========================================================================================
dfs(S,-);
for (int i=;i<=siz[S];i++)
ans=(ans+f[S][i])%mod;
printf("%lld\n",ans);
}

[HNOI2015]实验比较 树形dp+组合数学的更多相关文章

  1. [BZOJ4013][HNOI2015]实验比较(树形DP)

    4013: [HNOI2015]实验比较 Time Limit: 5 Sec  Memory Limit: 512 MBSubmit: 756  Solved: 394[Submit][Status] ...

  2. P3240 [HNOI2015]实验比较 树形DP

    \(\color{#0066ff}{ 题目描述 }\) 小D 被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有 \(N\) 张图片,编号为 \(1\) 到\(N\).实验分若 ...

  3. 2018.10.30 NOIP模拟 排列树(树形dp+组合数学)

    传送门 考试的时候乱搞过了. 其实题目就是让你求拓扑排序方案数. 直接树形dpdpdp然后组合数转移一下就行了. 乱搞代码

  4. BZOJ_2111_[ZJOI2010]Perm 排列计数_树形DP+组合数学

    Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic ...

  5. 4013: [HNOI2015]实验比较

    4013: [HNOI2015]实验比较 链接 分析: 首先把等号用并查集合并起来. 由于只存在最多一个质量不比i差的数,发现这是森林.若x<y,连边x->y.于是建虚拟根节点0. 然后树 ...

  6. [BZOJ3167][P4099][HEOI2013]SAO(树形DP)

    题目描述 Welcome to SAO ( Strange and Abnormal Online).这是一个 VR MMORPG, 含有 n 个关卡.但是,挑战不同关卡的顺序是一个很大的问题. 有 ...

  7. lightoj 1382 - The Queue(树形dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1382 题解:简单的树形dp加上组合数学. #include <iostr ...

  8. 树形DP——动态规划与数据结构的结合,在树上做DP

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第15篇,也是动态规划系列的第4篇. 之前的几篇文章当中一直在聊背包问题,不知道大家有没有觉得有些腻味了.虽然经典的文 ...

  9. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

随机推荐

  1. 【Laravel】 常用命令

    自动创建项目 laravel new || laravel new xxx || composer create-project --prefer-dist laravel/laravel blog ...

  2. oracle 函数、聚焦函数

    oracle 常用的函数 以及 聚焦函数 --1,字符函数 --当没有表可以用个的时候oracle自带一个虚表dual -- || 表示连接符号 将字符串连接到一起 式显示 Lower(char):将 ...

  3. poj1190 生日蛋糕

    题意: 要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当i < M时,要求Ri > ...

  4. poj2377 Bad Cowtractors

    思路: 最大生成树. 实现: #include <iostream> #include <cstdio> #include <vector> #include &l ...

  5. 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start:解决

    严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.ContainerBase.addChildInternal Contain ...

  6. iOS 音频视频制作

    --iOS多媒体 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制, ...

  7. mysql use index() 优化查询

    mysql use index() 优化查询 FORCE INDEX/IGNORE INDEX 的语法: SELECT *** FROM TABLE [{USE|IGNORE|FORCE} INDEX ...

  8. How To Build Kubernetes Platform (构建Kubernetes平台方案参考)

    Architecture Architecture Diagram Non-Prod Environment Prod Environment Cluster Networking Container ...

  9. Java后端学习路线_备战

    SpringCloud项目实战 Dubbo项目实战 项目实战应涵括哪些技术: 缓存.消息队列 WEB应用服务器(Weblogic.Jetty.JBoss.WebSphere) NoSQL(MongoD ...

  10. 在移动端实现1px的边框

    由于分辨率 DPI 的差异,高清手机屏上的 1px 实际上是由 2×2 个像素点来渲染,有的屏幕甚至用到了 3×3 个像素点 所以 border: 1px 在移动端会渲染为 2px 的边框 与设计图产 ...