[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\)." ...
随机推荐
- 学生ID查询
var http = require("http"); var server = http.createServer(function(req,res){ //得到url var ...
- python全栈开发-logging模块(日记专用)
一.概述 很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,l ...
- Python内置函数(46)——format
英文文档: format(value[, format_spec]) Convert a value to a "formatted" representation, as con ...
- iot:下一步要做的工作
1.DeviceMessage抽象(定义&支持扩展)2.createDeviceMessage.analyseDeviceMessage(支持扩展)3.日志打印4.错误处理5.断线重连6.交互 ...
- Linux之Shell命令
开始接触Linux命令行,学习Linux文件系统导航以及创建.删除.处理文件所需的命令. 注:文末有福利! 几个快捷键: Linux发行版通常使用Ctrl+Alt组合键配合F1~F7进入要使用的控制 ...
- redis中的aof模式,产生的是增量数据,还是全量数据?
先说答案:全量数据. 1.修改redis.conf,开启rdb,禁用aof 上面这个是持久化文件的路径,我们ll看下: 2.启动redis后,cli查看里面的key [root@mini1 redis ...
- python request
python request a. 客户端向服务端发送多层字典的值 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 obj = ...
- CMDB开发
浅谈ITIL TIL即IT基础架构库(Information Technology Infrastructure Library, ITIL,信息技术基础架构库)由英国政府部门CCTA(Central ...
- Hive函数:GROUPING SETS,GROUPING__ID,CUBE,ROLLUP
参考:lxw大数据田地:http://lxw1234.com/archives/2015/04/193.htm 数据准备: CREATE EXTERNAL TABLE test_data ( mont ...
- 框架学习之Struts2(四)---拦截器和标签
一.拦截器概述 1.1 在struts2框架中封装了很多功能,struts2里面封装的功能都是在拦截器里面,struts2里面又很多拦截器,但不是每次这些拦截器都执行,每次执行型默认的拦截器. 默认拦 ...