4013: [HNOI2015]实验比较
4013: [HNOI2015]实验比较
分析:
首先把等号用并查集合并起来。
由于只存在最多一个质量不比i差的数,发现这是森林。若x<y,连边x->y。于是建虚拟根节点0。
然后树形dp,f[i][j]表示第i棵子树内,分成了j段的方案数,即存在j-1个小于号。
依次合并每个子树,假设一棵树内是a段,一棵树内是b段,合并后变成k段,$k \in [max(a,b), a + b]$
$f[i][k]=f[u][a] \times f[v][b] \times C_{k}^{a} \times C_{a}^{b-(k-a)}$
后面一项的意义:此时相当于有k个盒子,有a个白球,b个黑球,每个盒子里不能同时出现两个黑球或者白球。那么先让每个白球选一个盒子放进去,黑球先补上空着的,最后多出的黑球放到以前白球的盒子里。
复杂度:复杂度的话,看似O(N^4),但是,每个点对只会在其LCA处被枚举到并产生O(N)的运算量 精细地实现的话复杂度是O(N^3)的。by CRZbulabula
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
#include<set>
#include<map>
#include<queue>
#include<vector>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
}
inline int Read() {
char ch = getchar();for(;ch!='<'&&ch!='='&&ch!='>'; ch=getchar());
return (ch == '<' ? : (ch == '=' ? : ));
} const int N = , mod = 1e9 + ;
struct Edge { int to, nxt; } e[];
int head[N], C[N][N], fa[N], ext[N][N], vis[N], deg[N], q[N], siz[N], f[N][N], tmp[N], En;
vector<int> vec[N]; inline void add_edge(int u,int v) {
++En; e[En].to = v, e[En].nxt = head[u]; head[u] = En; deg[v] ++;
}
int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); }
inline void add(int &x,int y) { x += y; if (x >= mod) x -= mod; }
inline int mul(int x,int y) { return 1ll * x * y % mod; }
void dfs(int u) {
siz[u] = f[u][] = ;
for (int I = head[u]; I; I = e[I].nxt) {
int v = e[I].to;
dfs(v);
for (int i = ; i < siz[u]; ++i)
for (int j = ; j <= siz[v]; ++j)
for (int k = max(i, j); k <= i + j; ++k) {
int A = mul(f[u][i + ], f[v][j]), B = mul(C[k][i], C[i][j - k + i]);
add(tmp[k + ], mul(A, B));
}
siz[u] += siz[v];
for (int i = ; i <= siz[u]; ++i) f[u][i] = tmp[i], tmp[i] = ;
}
}
int main () {
int n = read(), m = read();
C[][] = ;
for (int i = ; i <= n; ++i) {
C[i][] = ;
for (int j = ; j <= i; ++j)
C[i][j] = (C[i - ][j] + C[i - ][j - ]) % mod;
}
for (int i = ; i <= n; ++i) fa[i] = i;
for (int i = ; i <= m; ++i) {
int x = read(), ty = Read(), y = read();
if (!ty) {
x = find(x), y = find(y);
if (x != y) fa[x] = y;
}
else if (ty == ) vec[x].push_back(y);
else vec[y].push_back(x);
}
for (int i = ; i <= n; ++i) {
int x = find(i);
for (int sz = vec[i].size(), j = ; j < sz; ++j) {
int y = find(vec[i][j]);
if (!ext[x][y]) add_edge(x, y), ext[x][y] = ;
}
}
for (int i = ; i <= n; ++i)
if (deg[i] == && fa[i] == i) add_edge(, i);
int L = , R = ;
q[++R] = ;
while (L <= R) {
int u = q[L ++]; vis[u] = ;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (!(--deg[v])) q[++R] = v;
}
}
for (int i = ; i <= n; ++i)
if (fa[i] == i && !vis[i]) { cout << ; return ; }
dfs();
int ans = ;
for (int i = ; i <= siz[]; ++i) add(ans, f[][i]);
cout << ans;
return ;
}
4013: [HNOI2015]实验比较的更多相关文章
- bzoj 4013: [HNOI2015]实验比较
Description 小D 被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有 N 张图片,编号为 1 到 N.实验分若干轮进行,在每轮实验中,小 D会被要求观看某两张随机选 ...
- 【BZOJ】4013: [HNOI2015]实验比较
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4013 中第i 条涉及的图片对为(KXi, Xi),判断要么是KXi < Xi ,要么 ...
- [BZOJ4013][HNOI2015]实验比较(树形DP)
4013: [HNOI2015]实验比较 Time Limit: 5 Sec Memory Limit: 512 MBSubmit: 756 Solved: 394[Submit][Status] ...
- 【BZOJ4013】[HNOI2015]实验比较(动态规划)
[BZOJ4013][HNOI2015]实验比较(动态规划) 题面 BZOJ 洛谷 题解 看题目意思就是给你一棵树,连边表示强制顺序关系.然后你要给点染色,在满足顺序关系的情况下,将序列染成若干个颜色 ...
- BZOJ 4013/Luogu P3240 [HNOI2015] 实验比较 (树形DP)
题目传送门 分析 放一个dalao博客: xyz32768 的博客,看完再回来看本蒟蒻的口胡吧(其实嘛-不回来也行) 精髓是合并的方案数的计算,至于为什么是Ci−1j−1\large C_{i-1}^ ...
- [HNOI2015]实验比较
Description 小D 被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有 N 张图片,编号为 1 到 N.实验分若干轮进行,在每轮实验中,小 D会被要求观看某两张随机选 ...
- 【bzoj4013】 HNOI2015—实验比较
http://www.lydsy.com/JudgeOnline/problem.php?id=4013 (题目链接) 题意 给出$n$个数的$m$个大小关系,问它们之间可以形成的单调不降的序列有多少 ...
- P3240 [HNOI2015]实验比较 树形DP
\(\color{#0066ff}{ 题目描述 }\) 小D 被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有 \(N\) 张图片,编号为 \(1\) 到\(N\).实验分若 ...
- BZOJ4013 : [HNOI2015]实验比较
首先用并查集将等号缩点,然后拓扑排序判断有没有环,有环则无解,否则通过增加超级源点$0$,可以得到一棵树. 设$f[x][y]$表示$x$子树里有$y$种不同的数字的方案数,由底向上DP. 对于当前点 ...
随机推荐
- sqlserver的资源调控器
参考SQL Server2014管理最佳实战,所做的笔记. 1:创建资源池 use master go create resource pool poolAdhoc with ( min_cpu_pe ...
- asp.net 一般处理程序接收上传文件的问题
在使用Html+ashx处理文件上传时,遇到上传文件超过4M的问题,首先HTML代码如下: <!DOCTYPE html> <html> <head> <me ...
- Oracle DB 12.2(12cR2)的一个新特性:硬解析失败的SQL语句(需要符合一定条件)打印到alert_sid.log中.
How to Identify Hard Parse Failures (Doc ID 1353015.1)Bug 16945190 - Diagnostic enhancement to dump ...
- [翻译] RDVTabBarController
RDVTabBarController https://github.com/robbdimitrov/RDVTabBarController 效果: Supports iPad and iPhone ...
- RYU基础整理
1. RYU结构,源码 1.1 RYU文件目录 下面介绍ryu/ryu目录下的主要目录内容. base base中有一个非常重要的文件:app_manager.py,其作用是RYU应用的管理中心.用于 ...
- Eclipse Debug Daemon Thread
Daemon Thread ["http-bio-8080"-exec-2] (Suspended (exception RuntimeException)) ThreadPool ...
- 对象在hibernate中的状态
首先hibernate中对象的状态有三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate().get().load() ...
- CSS3动画理解与应用
CSS3动画理解与应用 Transform:对元素进行变形:Transition:对元素某个属性或多个属性的变化,进行控制(时间等),类似flash的补间动画.但只有两个关键贞.开始,结束.Anima ...
- 给 Virtualbox 中 Ubuntu 系统设置静态 IP
虚拟机网络选择 桥接网卡 模式. 主要涉及两个步骤: 1. 修改 /etc/network/interfaces 文件: 2. 修改 dns : 第一步,修改 interfaces 文件: sudo ...
- 使用 libffi 实现 AOP
核心还是利用oc消息的查找派发机制,进行类结构的动态修改,用新函数替换老函数,然后再调用老函数. 前言 众所周知,使用runtime的提供的接口,我们可以设定原方法的IMP,或交换原方法和目标 ...