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

比如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. qconbeijing2016

    http://2016.qconbeijing.com/schedule 大会日程 2016年04月21日 星期四 09:15 开场致辞 地点 1号厅   主题演讲 工程效率提升 业务核心架构 容器集 ...

  2. 生成HTML表格的后台模板代码

    有时候,我们需要在后台拼接生成前端的html表格,一般的做法就是各种string.StringBuilder的拼接(例子省略...),这样的话如果表头不同就没法做到代码的重用,增加代码的冗余,下面我分 ...

  3. 动手实现 React-redux(二):结合 context 和 store

    既然要把 store 和 context 结合起来,我们就先构建 store.在 src/index.js 加入之前创建的 createStore 函数,并且构建一个 themeReducer 来生成 ...

  4. 虚方法(virtual)

    虚方法(virtual) Virtual 关键字用于修饰方法.属性.索引器或事件声明,并且允许在派生类中重写这些对象. 看一段代码: using System ; class A { public v ...

  5. ubuntu用户自定义的命令alias永久生效

    cd ~ vi .bash_profile alias ll='ls -ltr' . .bash_profile ps:写在.bashrc终端断开就没了

  6. RabbitMq+Haproxy负载均衡

    HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性.负载均衡,以及基于TCP和HTTP的应用程序代理. HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保 ...

  7. Apache CXF 框架结构和基本原理

    CXF旨在为服务创建必要的基础设施,它的整体架构主要由以下几个部分组成: 1.Bus 它是C X F架构的主干,为共享资源提供了一个可配置的场所,作用非常类似于S p r i n g的Applicat ...

  8. ArrayList不同循环方式

    一: ArrayList<String> list = new ArrayList<String>();  list.add("1");  list.add ...

  9. anzhuaggeoip

    1.因启动geoip模块,需要先安装GeoIP # wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz # tar xv ...

  10. Using URL Schemes to Communicate with Apps

    要素:1)通信双方:2)协议:3)支持机制(系统,进行协议注册):4)数据 https://developer.apple.com/library/content/documentation/iPho ...