[HNOI2015]实验比较 树形dp+组合数学
在合并的时候有可以加等于,或者继续用小于,
比如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+组合数学的更多相关文章
- [BZOJ4013][HNOI2015]实验比较(树形DP)
4013: [HNOI2015]实验比较 Time Limit: 5 Sec Memory Limit: 512 MBSubmit: 756 Solved: 394[Submit][Status] ...
- P3240 [HNOI2015]实验比较 树形DP
\(\color{#0066ff}{ 题目描述 }\) 小D 被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有 \(N\) 张图片,编号为 \(1\) 到\(N\).实验分若 ...
- 2018.10.30 NOIP模拟 排列树(树形dp+组合数学)
传送门 考试的时候乱搞过了. 其实题目就是让你求拓扑排序方案数. 直接树形dpdpdp然后组合数转移一下就行了. 乱搞代码
- BZOJ_2111_[ZJOI2010]Perm 排列计数_树形DP+组合数学
Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic ...
- 4013: [HNOI2015]实验比较
4013: [HNOI2015]实验比较 链接 分析: 首先把等号用并查集合并起来. 由于只存在最多一个质量不比i差的数,发现这是森林.若x<y,连边x->y.于是建虚拟根节点0. 然后树 ...
- [BZOJ3167][P4099][HEOI2013]SAO(树形DP)
题目描述 Welcome to SAO ( Strange and Abnormal Online).这是一个 VR MMORPG, 含有 n 个关卡.但是,挑战不同关卡的顺序是一个很大的问题. 有 ...
- lightoj 1382 - The Queue(树形dp)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1382 题解:简单的树形dp加上组合数学. #include <iostr ...
- 树形DP——动态规划与数据结构的结合,在树上做DP
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第15篇,也是动态规划系列的第4篇. 之前的几篇文章当中一直在聊背包问题,不知道大家有没有觉得有些腻味了.虽然经典的文 ...
- poj3417 LCA + 树形dp
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ...
随机推荐
- 【前端】jQurey Plugin
; (function ($, window, document, undefined) { "use strict"; var defaults = { name: " ...
- 代码审查的艺术:Dropbox 的故事
Dropbox 的 iOS 应用中的每一行代码,都是开始于被添加到 Maniphest 中的一个 bug 或者功能任务,Maniphest 是我们的任务管理系统.当一位工程师在上面接受一个任务,那么在 ...
- java课程设计全程实录——第0天
本次课设计划在5月25日完成.目前还剩18天. 第0天主要完成事项如下: 搭建开发环境 制定开发进度规划表 阅读前人的课设 详细: 1.IDE的下载,安装,以及配合使用的阿里巴巴编程规约插件的安装与测 ...
- Linux系统结构与终端控制台
Linux系统结构与终端控制台 作者:Vashon 时间:20150418 以下主要是对Linux系统终端控制台切换及基本操作的范例,其他的理论就不多说了,直接进入实践部分. Starting.... ...
- codevs 1316 文化之旅 2012年NOIP全国联赛普及组
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文 ...
- (转)为Spring集成的Hibernate配置二级缓存
http://blog.csdn.net/yerenyuan_pku/article/details/52896195 前面我们已经集成了Spring4.2.5+Hibernate4.3.11+Str ...
- Unity3D windows平台视频录制录屏插件 UnityRecorder
例子:从官方例子简单改了 using UnityEditor;using UnityEditor.Recorder;using UnityEditor.Recorder.Input;using Sys ...
- Swift学习——流程控制
1.for in循环 (1)简单使用: for-in和范围运算符 for i in 1...3 { println(i) } (2)如果在循环中用不到i,可用_代替 for _ in 1...3 { ...
- 【vc】高精度时间函数的使用
方法一: 函数定义如下: int UsSleep(int us);//返回实际的微秒延时时间 代码实现如下: //参数一表示 需要等待的时间 微秒为单位 int UsSleep(int us) { / ...
- CreateProcess Access violation(越界访问)
https://stackoverflow.com/questions/11339186/createprocess-fails-with-an-access-violation My aim is ...