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

比如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. XSS漏洞解析(二)

    上篇我们讲了XSS的一些相关的内容,这篇我们就直接上代码demo解决实际问题吧. 主要的问题是xssfilter的编写,我们直接去网上找一下框架,一般有js,php,java等语言都有相关的XSS的相 ...

  2. 使用ant build build.xml报“includeantruntime was not set”警告及"Class not found: javac1.8"问题

    问题1:ant编译build.xml报“includeantruntime was not set”警告. 警告详情: warning: 'includeantruntime' was not set ...

  3. phpstorm中快速添加函数注释

    Preferences 或 command+,快捷键 Live Templates - PHP 下方 - 新建模板 ,Abbreviation 命名随便写,点击Edit Variables配置变量信息 ...

  4. Java JDK装配置

     1- 介绍 本文章介绍JAVA开发环境安装是基于:  Java8(JDK8) 2- 下载JDK http://www.oracle.com/technetwork/java/javase/dow ...

  5. ios水果风暴游戏源码项目下载

    这是一款ios水果风暴游戏源码下载,介绍给大家一下,喜欢的朋友可以下载学习一下吧.应用介绍:这是一个以获得高分和挑战更高难度为目的的游戏.游戏中有九种不同的卡通水果,您可以交换屏幕中两个相邻水果的位置 ...

  6. Docker 启动时报错:iptables:No chain/target/match by the name

    重新启动docker后,就好了. service docker restart

  7. nginx 新手入门

    Nginx 是一个高性能的http 和反向代理服务器,也是一个代理服务器. Nginx比Apache 更加轻量级,占用的资源少,抗并发,二apache是阻塞型的,在高并发下,nginx更占优势. 我们 ...

  8. ElasticSearch可视化工具 Kibana

    Kibana要和ElasticSearch 版本一致,默认的端口号是:5601

  9. 北京区域赛I题,Uva7676,A Boring Problem,前缀和差分

    转载自https://blog.csdn.net/weixin_37517391/article/details/83821752 题解 其实这题不难,只要想到了前缀和差分就基本OK了. 我们要求的是 ...

  10. 字符串KMP || POJ 2185 Milking Grid

    求一个最小矩阵,经过复制能够覆盖原矩阵(覆盖,不是填充,复制之后可以有多的) *解法:横着竖着kmp,求最大公倍数的做法是不对的,见http://blog.sina.com.cn/s/blog_69c ...