[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\)." ...
随机推荐
- 项目Alpha冲刺Day2
一.会议照片 二.项目进展 1.今日安排 初步搭建后台框架,根据昨天的最终设计再修改原型,成功使用powerDesigner导出sql. 2.问题困难 使用了比较多的框架,而且是首次尝试纯java配置 ...
- C语言——第六周作业
题目 题目一:高速公路超速处罚 1.实验代码 #include <stdio.h> int main() { int speed,maxspeed; double x; scanf(&qu ...
- python网络爬虫,知识储备,简单爬虫的必知必会,【核心】
知识储备,简单爬虫的必知必会,[核心] 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌 ...
- python的迭代器、生成器、装饰器
迭代器.生成器.装饰器 在这个实验里我们学习迭代器.生成器.装饰器有关知识. 知识点 迭代器 生成器 生成器表达式 闭包 装饰器 实验步骤 1. 迭代器 Python 迭代器(Iterators)对象 ...
- Vue-cli+Vue.js2.0+Vuex2.0+vue-router+es6+webpack+node.js脚手架搭建和Vue开发实战
Vue.js是一个构建数据驱动的web界面的渐进式框架.在写这边文章时Vue版本分为1.0++和2.0++,这个是基于Vue2.0的项目. Vue-cli是构建单页应用的脚手架,这个可是官方的. Vu ...
- Python内置函数(48)——__import__
英文文档: __import__(name, globals=None, locals=None, fromlist=(), level=0) This function is invoked by ...
- cookieUtil
public class CookieUtil { /** * 设置cookie * @param name cookie名字 * @param value cookie值 * @param maxA ...
- LSTM主要思想和网络结构
在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义.我们不会将所有的东西都全部丢弃,然后用空白的大脑进行思考.我们的思想拥有持久性. 相关信息和当前预测位置之间的间 ...
- python、java实现二叉树,细说二叉树添加节点、深度优先(先序、中序、后续)遍历 、广度优先 遍历算法
数据结构可以说是编程的内功心法,掌握好数据结构真的非常重要.目前基本上流行的数据结构都是c和c++版本的,我最近在学习python,尝试着用python实现了二叉树的基本操作.写下一篇博文,总结一下, ...
- Android fragment切换后onresume时报 Attempt to write to field 'int android.support.v4.app.Fragment.mNextAnim'
动态加载fragment以后,调用了remove方法移除Fragment,在返回来的时候报 Attempt to write to field 'int android.support.v4.app. ...