[HNOI2015]实验比较
Description
Input
Output
输出仅一行,包含一个正整数,表示合法质量序列的数目对 10^9+7取模的结果。
Sample Input
1 < 2
1 < 3
2 < 4
1 = 5
Sample Output
HINT
不同的合法序列共5个,如下所示:
假设只存在‘<’号,那么显然u点子树的方案:
枚举儿子节点 $v$ 的时候,我们用 $tol$ 表示已处理过的子树的总大小
$$f_u = f_u*f_v*C_{tol+f_v}^{f_v}$$
如果存在‘=’的话,显然=只会是不同子树的关系
由于子树间的等号关系不好处理,我们可以将其放到状态中,
我们记 $f_{u, k}$ 为在以 $u$ 为根的子树中生成的序列含有 $k$ 个 '<' 的方案数。
如果从当前已处理的子树选i个‘<',从v子树选j个’<'
那么u子树的‘<'个数范围为[max(i,j),i+j]
那么u子树’<'的分布有多少种?
现在相当于将 $i$ 个白球, $j$ 个黑球放入 $k$ 个盒子中,且同个盒子不能有相同颜色的球,盒子不能空。
$$f_{u, k} += \sum_{i = 1}^a \sum_{j = 1}^b p_i*q_j*C_k^i*C_i^{j-(k-i)}$$
其中 $C_k^i$ 表示在 $k$ 个盒子中选出 $i$ 个放白球,因为所有盒子都要放球,所以剩下的 $k-i$ 个盒子必定放黑球,
剩下 $j-(k-i)$ 个黑球要放在 $i$ 个放白球的盒子中。
$$f_{u, k} += \sum_{i = 1}^a \sum_{j = 1}^b p_i*q_j*C_k^i*C_i^{j-(k-i)}$$
其中 $C_k^i$ 表示在 $k$ 个盒子中选出 $i$ 个放白球,因为所有盒子都要放球,所以剩下的 $k-i$ 个盒子必定放黑球,
剩下 $j-(k-i)$ 个黑球要放在 $i$ 个放白球的盒子中。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long lol;
struct Node
{
int next,to;
}edge[];
int head[],num,set[],n,m,pre[],rt[];
bool vis[];
lol Mod=1e9+,c[][],f[][],size[],ans;
void add(int u,int v)
{
num++;
edge[num].next=head[u];
head[u]=num;
edge[num].to=v;
}
int find(int x)
{
if (x==) return ;
if (set[x]!=x) set[x]=find(set[x]);
return set[x];
}
lol C(int x,int y)
{
return c[y][x];
}
bool pd(int x)
{int i;
vis[x]=;
for (i=head[x];i;i=edge[i].next)
{int v=edge[i].to;
if (vis[v]) return ;
if (pd(v)==) return ;
}
return ;
}
void dfs(int x)
{int i,j,k,l;
int zyys=;
lol g[];
for (i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
memset(g,,sizeof(g));
dfs(v);
if (zyys)
{
for (j=;j<=size[x];j++)
{
for (k=;k<=size[v];k++)
{
for (l=max(j,k);l<=j+k;l++)
{
g[l]+=(((f[x][j]*f[v][k])%Mod)*C(j,l)%Mod)*C(k-l+j,j)%Mod;
g[l]%=Mod;
}
}
}
size[x]+=size[v];
for (j=;j<=size[x];j++)
f[x][j]=g[j];
}
else
{
zyys=;size[x]+=size[v];
for (j=;j<=size[x];j++)
f[x][j]=f[v][j];
}
}
if (!zyys) f[x][]=;
size[x]++;
for (i=size[x];i;i--)
f[x][i]=f[x][i-];
}
int main()
{int i,j,x,y;
char ch;
cin>>n>>m;
for (i=;i<=n;i++)
{
c[i][]=;
for (j=;j<=i;j++)
c[i][j]=(c[i-][j-]+c[i-][j])%Mod;
}
for (i=;i<=n;i++)
set[i]=i;
for (i=;i<=m;i++)
{
scanf("%d %c %d",&x,&ch,&y);
if (ch=='<')
{
pre[y]=x;
}
else if (ch=='=')
{
int p=find(x),q=find(y);
if (p!=q)
{
set[p]=q;rt[p]=;
pre[q]=max(pre[q],pre[p]);
}
}
}
for (i=;i<=n;i++)
if (rt[i]==) add(find(pre[i]),i);
for (i=;i<=n;i++)
if (vis[i]==)
if (pd(i)==)
{
cout<<<<endl;
return ;
}
dfs();
for (i=;i<=size[];i++)
ans=(ans+f[][i])%Mod;
cout<<ans;
}
[HNOI2015]实验比较的更多相关文章
- 【BZOJ4013】[HNOI2015]实验比较(动态规划)
[BZOJ4013][HNOI2015]实验比较(动态规划) 题面 BZOJ 洛谷 题解 看题目意思就是给你一棵树,连边表示强制顺序关系.然后你要给点染色,在满足顺序关系的情况下,将序列染成若干个颜色 ...
- 4013: [HNOI2015]实验比较
4013: [HNOI2015]实验比较 链接 分析: 首先把等号用并查集合并起来. 由于只存在最多一个质量不比i差的数,发现这是森林.若x<y,连边x->y.于是建虚拟根节点0. 然后树 ...
- [BZOJ4013][HNOI2015]实验比较(树形DP)
4013: [HNOI2015]实验比较 Time Limit: 5 Sec Memory Limit: 512 MBSubmit: 756 Solved: 394[Submit][Status] ...
- bzoj 4013: [HNOI2015]实验比较
Description 小D 被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有 N 张图片,编号为 1 到 N.实验分若干轮进行,在每轮实验中,小 D会被要求观看某两张随机选 ...
- P3240 [HNOI2015]实验比较 树形DP
\(\color{#0066ff}{ 题目描述 }\) 小D 被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有 \(N\) 张图片,编号为 \(1\) 到\(N\).实验分若 ...
- BZOJ4013 : [HNOI2015]实验比较
首先用并查集将等号缩点,然后拓扑排序判断有没有环,有环则无解,否则通过增加超级源点$0$,可以得到一棵树. 设$f[x][y]$表示$x$子树里有$y$种不同的数字的方案数,由底向上DP. 对于当前点 ...
- luogu P3240 [HNOI2015]实验比较
传送门 首先根据题目条件,题目中如果是=的点可以缩起来,然后\(a<b\)连边\(a\rightarrow b\),而且所有点入度为最多1,那么判掉有环的不合法情况,题目中的依赖关系就是一颗外向 ...
- 【BZOJ】4013: [HNOI2015]实验比较
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4013 中第i 条涉及的图片对为(KXi, Xi),判断要么是KXi < Xi ,要么 ...
- 【LG3240】[HNOI2015]实验比较
题面 洛谷 题解 30pts 爆搜即可. 100pts 题意描述里有一句:"对每张图片\(i\),小\(D\)都最多只记住了某一张质量不比\(i\)差的另一张图片\(K_i\)." ...
随机推荐
- 使用Spark MLlib进行情感分析
使用Spark MLlib进行情感分析 使用Spark MLlib进行情感分析 一.实验说明 在当今这个互联网时代,人们对于各种事情的舆论观点都散布在各种社交网络平台或新闻提要 ...
- vue style width a href动态拼接问题 ?
style width 这个问题 折磨了我一个上午了 好惭愧 因为项目涉及到 进度条 所以必须用行内样式 style 用过vue的都知道 vue中style的用法 大众用法 :style=&quo ...
- MongoDb进阶实践之三 MongoDB查询命令详述
一.引言 上一篇文章我们已经介绍了MongoDB数据库的最基本操作,包括数据库的创建.使用和删除数据库,文档的操作也涉及到了文档的创建.删除.更新和查询,当然也包括集合的创建.重命 ...
- ssh整合之一spring的单独运行环境
这是本人第一次写博客,不足之处,还希望各位园友指出,在此先谢谢各位了! 先说我们的这三大框架,即struts,spring,hibernate,我们要进行整合的话,第一步是先单独搭建我们的Spring ...
- C++中explicit关键字
explicit: 防止隐式转换使用. 隐式转换:不同类型的变量可以互相转换,如将一个整形数值赋值给一个类,ClassXX lei = 4: C++中, 一个参数的构造函数(或者除了第一个参数外其余 ...
- 使用java 打印日历
package hangshu; /* * 打印从1900年到2.year年的日历 */ import java.util.Scanner; public class Calender { publi ...
- 关于block的循环引用的问题
在block的循环引用的问题上我们都知道如果在block内部修改外部的变量的时候,要加__block以防止循环引用的问题,但是如果block是当前对象的一个属性的时候,要修改当前对象的一个属性的时候就 ...
- python/MySQL(索引、执行计划、BDA、分页)
---恢复内容开始--- python/MySQL(索引.执行计划.BDA.分页) MySQL索引: 所谓索引的就是具有(约束和加速查找的一种方式) 创建索引的缺点是对数据进行(修改.更新.删除) ...
- hive-jdbc获取查询日志慢的问题发现与解决
1.问题描述: 数据平台的临时查询一直有一个问题,就是日志获取太慢了,每次都是和结果一块出来的,这就非常影响用户的体验,半天都没任何输出.另一个是Beeline客户端不一致,beeline客户端每次都 ...
- 用js来实现那些数据结构06(队列)
其实队列跟栈有很多相似的地方,包括其中的一些方法和使用方式,只是队列使用了与栈完全不同的原则,栈是后进先出原则,而队列是先进先出(First In First Out). 一.队列 队列是一种特 ...