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

比如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. 【学习笔记】深入理解js原型和闭包(12)——简介【作用域】

    提到作用域,有一句话大家(有js开发经验者)可能比较熟悉:“javascript没有块级作用域”.所谓“块”,就是大括号“{}”中间的语句.例如if语句: 再比如for语句: 所以,我们在编写代码的时 ...

  2. IOS访问webserver接口

    接口调用参数只能是字符串格式,返回格式支持3种(字符串,数组,DataSet) 需要引用第三方库,包含(DataSet,PlatServinceDataParser,WebserviceCommon, ...

  3. 使用 Azure ARM 部署Word Press 遇到 Extension节点 扩展的问题

    在使用Azure ARM模式部署wordpress,将php网站压缩成zip的形式在DefaultTemplate模板中已扩展的形式实现安装 遇到的问题总结: 1.开始在sites节点中,resour ...

  4. Java格式规范及注释的用法

    /* 需求:演示一个Hello World的Java小程序 思路: 1.定义一个类.因为Java程序都是定义在类中,Java程序都是以类的形式存在的,类的形式其实就是字节码的最终体现 2.定义一个主函 ...

  5. (转)SpringMVC学习(十)——SpringMVC与前台的json数据交互

    http://blog.csdn.net/yerenyuan_pku/article/details/72514022 json数据格式在接口调用中.html页面中比较常用,json格式比较简单,解析 ...

  6. ElasticSearch可视化工具 Kibana

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

  7. web测试需要注意点

  8. HTML基础(一)

    什么是HTMLHTML Hypertext Markup Language:即超文本标记语言 HTML特点 1.HTML不需要编译,直接由浏览器执行 2.HTML文件是一个文本文件 3.HTML文件必 ...

  9. vmware linux虚拟机与本地物理机共享文件夹

    cd /mnt/hgfs 使用Vmware安装了linux虚拟机后,开发时,为了方便文件的传输等,因此需要使用共享文件夹,减少工作量.共享文件夹需要用到vmware提供的vmware tools工具, ...

  10. L2-2 社交集群 (25 分)(一个写挫的并查集)

    题目: 思路: 就是一个并查集的裸题,不过在数据查找方面可能不好处理,暴力完全可以解决这个问题啊!! #include <bits/stdc++.h> #include <cstdi ...