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. 对于当前点 ...
随机推荐
- CentOS针对磁盘IO[jdb2进程]的优化
CentOS的jdb2进程总是沾满io,查了一些资料后才知道,这个问题源自系统bug,在此记录一下解决办法: 将高IO的磁盘,用以下参数remount即可 mount -t ext4 -o remou ...
- IP地址分类/IP地址10开头和172开头和192开头的区别/判断是否同一网段(A、B、C三类地址)【转】
简单来说在公司或企业内部看到的就基本都是内网IP,ABC三类IP地址里的常见IP段. 每个IP地址都包含两部分,即网络号和主机号. InterNIC将IP地址分为五类:A类保留给ZF或大型企业,B类分 ...
- Linux su命令详解
su switch user,用于切换用户用 su常见命令参数 用法:su [选项]... [-] [用户 [参数]... ] Change the effective user id and gro ...
- 剑指offer 07斐波那契数列
现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 java版本: public class Solution { public static void m ...
- ZT Android4.2蓝牙基础架构学习
Android4.2蓝牙基础架构学习 分类: Jellybean Bluetooth Bluetooth 2013-10-13 23:58 863人阅读 评论(3) 收藏 举报 androidblue ...
- 字节(byte)与位(bit)基础回顾
预估方式:一个uid,String类型,最长约50字节,即50Byte,一天100亿PV,则100亿*50Byte,约500G容量存ES中或Hbase中,无法存日志文件中,一个docker磁盘才50G ...
- Ubuntu 12.04常用快捷键
===== 桌面 ===== ALT + F1: 聚焦到桌面左侧任务导航栏,可按上下键导航. ALT + F2: 运行命令 ALT + F4: 关闭窗口 ALT + TAB: 切换程序窗口 ALT + ...
- UE4的csv文件导入、URL地址的读取及动态材质的设置
1.csv文件的导入 UE4是可以直接导入csv文件的,其过程和其他文件资源(图片Texture,静态网格物体StaticMesh等)相似,但在导入过程中有一些需要注意的点. 如下图所示 这是一份编辑 ...
- POI导出excel,本地测试没问题,linux测试无法导出
java.lang.RuntimeException: java.io.IOException: No such file or directory at org.apache.poi. ...
- jquery与json的结合
通过AJAX异步减少网络内容传输,而JSON则可以把传输内容缩减到纯数据:然后利用jQuery内置的AJAX功能直接获得JSON格式的数据:在客户端直接绑定到数据控件里面,从而达到最优. 1 2 3 ...