首先用并查集将等号缩点,然后拓扑排序判断有没有环,有环则无解,否则通过增加超级源点$0$,可以得到一棵树。

设$f[x][y]$表示$x$子树里有$y$种不同的数字的方案数,由底向上DP。

对于当前点$x$,依次遍历它的所有儿子$y$,设以$x$为根的子树里之前已经有了$s[x]$个点,$y$子树里有$s[y]$个点,那么枚举之前部分里数字种类数$A$,$y$子树里数字种类数$B$,以及合并后用等号连接的数字个数$C$,有$f'[x][A+B-C]+=f[x][A]\times f[y][B]\times C_A^C\times C_{A+B-C}^A$。

因为一对点只会在lca处被DP到,所以时间复杂度为$O(n^3)$。

#include<cstdio>
const int N=110,P=1000000007;
int n,m,i,j,x,y,c[N][N],fa[N],f[N];
int g[N],v[N],nxt[N],ed,dp[N][N],tmp[N],s[N],vis[N],ans;
int d[N],h,t,q[N];
char op[5];
inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;d[y]++;}
int F(int x){return fa[x]==x?x:fa[x]=F(fa[x]);}
void dfs(int x){
vis[x]=dp[x][0]=1;
for(int i=g[x];i;i=nxt[i])if(!vis[v[i]]){
int y=v[i];
dfs(y);
for(int A=0;A<=s[x]+s[y];A++)tmp[A]=0;
for(int A=0;A<=s[x];A++)for(int B=1;B<=s[y];B++)for(int C=0;C<=A&&C<=B;C++)if(A+B>C)
tmp[A+B-C]=(1LL*dp[x][A]*dp[y][B]%P*c[A][C]%P*c[A+B-C][A]+tmp[A+B-C])%P;
s[x]+=s[y];
for(int A=0;A<=s[x];A++)dp[x][A]=tmp[A];
}
s[x]++;
for(int A=s[x];A;A--)dp[x][A]=dp[x][A-1];
dp[x][0]=0;
}
int main(){
scanf("%d%d",&n,&m);
for(c[0][0]=i=1;i<=n;i++)for(c[i][0]=c[i][i]=j=1;j<i;j++)c[i][j]=(c[i-1][j-1]+c[i-1][j])%P;
for(i=1;i<=n;i++)fa[i]=i;
while(m--){
scanf("%d%s%d",&x,op,&y);
if(op[0]=='='){
if(F(x)==F(y))continue;
fa[fa[x]]=fa[y];
}else f[y]=x;
}
for(i=1;i<=n;i++)fa[i]=F(i);
for(i=1;i<=n;i++)if(f[i])add(fa[f[i]],fa[i]);
for(i=1;i<=n;i++)if(!d[i]&&fa[i]==i)add(0,i);
for(h=1,i=0;i<=n;i++)if(!d[i])q[++t]=i;
while(h<=t)for(i=g[q[h++]];i;i=nxt[i])if(!(--d[v[i]]))q[++t]=v[i];
if(t<=n)return puts("0"),0;
for(dfs(0),i=2;i<=s[0];i++)ans=(ans+dp[0][i])%P;
return printf("%d",ans),0;
}

  

BZOJ4013 : [HNOI2015]实验比较的更多相关文章

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

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

  2. 【BZOJ4013】[HNOI2015]实验比较(动态规划)

    [BZOJ4013][HNOI2015]实验比较(动态规划) 题面 BZOJ 洛谷 题解 看题目意思就是给你一棵树,连边表示强制顺序关系.然后你要给点染色,在满足顺序关系的情况下,将序列染成若干个颜色 ...

  3. 4013: [HNOI2015]实验比较

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

  4. 【bzoj4013】 HNOI2015—实验比较

    http://www.lydsy.com/JudgeOnline/problem.php?id=4013 (题目链接) 题意 给出$n$个数的$m$个大小关系,问它们之间可以形成的单调不降的序列有多少 ...

  5. bzoj 4013: [HNOI2015]实验比较

    Description 小D 被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有 N 张图片,编号为 1 到 N.实验分若干轮进行,在每轮实验中,小 D会被要求观看某两张随机选 ...

  6. [HNOI2015]实验比较

    Description 小D 被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有 N 张图片,编号为 1 到 N.实验分若干轮进行,在每轮实验中,小 D会被要求观看某两张随机选 ...

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

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

  8. luogu P3240 [HNOI2015]实验比较

    传送门 首先根据题目条件,题目中如果是=的点可以缩起来,然后\(a<b\)连边\(a\rightarrow b\),而且所有点入度为最多1,那么判掉有环的不合法情况,题目中的依赖关系就是一颗外向 ...

  9. 【BZOJ】4013: [HNOI2015]实验比较

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4013 中第i 条涉及的图片对为(KXi, Xi),判断要么是KXi < Xi ,要么 ...

随机推荐

  1. hiho一下 第九十五周 数论四·扩展欧几里德

    题目 : 数论四·扩展欧几里德 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho周末在公园溜达.公园有一堆围成环形的石板,小Hi和小Ho分别站在不同的石板上 ...

  2. Leetcode 之Validate Binary Search Tree(53)

    判断是否是有效的二叉搜索树,即左子树的值小于根结点,右子树的值大于根结点.可以采用递归的方式来完成,递归时如何 传递有效的参数与根结点进行比较,是此题的难点. bool isValidBST(Tree ...

  3. AMD64与IA64的区别

    其实很多人从字面上,都以为AMD64就是针对AMD CPU的,IA64是针对INTEL CPU,其实是错的,我最初也是这样认为,其实不然: 你在市面上买的到的intel 64位 CPU都属于amd64 ...

  4. 再论pyquery

    发现对于QQ群 空间文件的抓取毫无办法. QQ空间的代码可圈可点: 做了一个js的“客户端”,第一次加载时,将文件的列表信息全部抓取出来,然后基于js进行翻页和排序. 因此,想要抓取js渲染的dom, ...

  5. 【VirtualBox】VirtualBox的桥接网络模式,为啥网络不稳定?

    网桥模式访问外网非常慢,经常卡死,ping时断时续 七搞八搞,反复重启了几次 TMD  就好了,也不知道什么情况,VirtualBox还是不太好使啊..... 网桥模式 设置 如下: 参考资料: ht ...

  6. css调用外部样式和css样式说明剧中显示

    <title>边走边乔</title><link href="css/style.css" rel="stylesheet" ty ...

  7. object-c 系列教程

    1.object-c 基本数据类型 2.object-c 控制语句 3.object-c面向对象1 4.object-c面向对象2 5.object-c 继承多态 动态数据类型

  8. javascript 布尔类型值判断

    javascript中,值非null的对象在if()中都会被判断为true: if([]) {// true} if({}) {// true} if(null) {// false} if(&quo ...

  9. python在线文档

    中文 http://python.usyiyi.cn/--------------------------不完整 http://www.pythondoc.com/pythontutorial27/i ...

  10. 【pymongo】连接认证 auth failed解决方法

    故事背景: 我在虚拟机(ip:192.168.xx.xx)上建立了一个mongo的数据库,里面已经存好了内容.里面的一个database叫做 "adb", 里面有个collecti ...