bzoj 4013: [HNOI2015]实验比较
Description
Input
Output
输出仅一行,包含一个正整数,表示合法质量序列的数目对 10^9+7取模的结果。
Sample Input
1 < 2
1 < 3
2 < 4
1 = 5
Sample Output
HINT
不同的合法序列共5个,如下所示:
Source
这个题如果是第一次碰到的话还是有难度的,以至于当年CJ没有一个人做出这个题;
首先我们把带等号的用并查集并起来,然后题目说明了对于每个点至多记住一个<他的点;
那么这样构成了森林的关系,然后我们加一个超级根,然后考虑如何树型DP;
首先状态就比较难设:dp[i][j],表示i的子树内有j个等价类的方案数;
我们考虑如何合并(x,i),(y,j)两棵树的答案,首先枚举合并后的等价类的个数k,(max(i,j),i+j);
现在问题的转化为有k个盒子,i个红球(有顺序),j个蓝球(有顺序);
要保证每个盒子内不能有相同颜色的球(可以有颜色不同的),且每个盒子必须有球,而且红球和蓝球内部的顺序不能变;
那么答案其实是:
首先把红球全部放进去,然后用蓝球去填还没有放球的k-i个盒子,在把剩余的蓝球放入有了红球的盒子i个盒子中;
然后我们就可以愉快地转移了,记得当前这个点先不要放进去,因为他不能和子树内的点构成等价类,所以要最后加进去;
自己注意实现细节即可;复杂度为O(n^3)。。。
//MADE BY QT666
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=105;
const int Mod=1e9+7;
int fa[N],size[N];
int head[N],to[N],nxt[N],cnt,n,m;
ll dp[N][N],g[N],c[N][N];
int q[N],tt,du[N];
void lnk(int x,int y){
du[y]++;
to[++cnt]=y,nxt[cnt]=head[x],head[x]=cnt;
}
int find(int x){
if(x!=fa[x]) fa[x]=find(fa[x]);
return fa[x];
}
void dfs(int x,int f){
for(int p=head[x];p;p=nxt[p]){
int y=to[p];if(y==f) continue;
dfs(y,x);
if(!size[x]){
for(int i=1;i<=size[y];i++) g[i]+=dp[y][i];
size[x]+=size[y];
for(int i=1;i<=size[y];i++) dp[x][i]=g[i];
}
else{
for(int i=1;i<=size[x];i++){
for(int j=1;j<=size[y];j++){
for(int k=max(i,j);k<=i+j;k++){
(g[k]+=dp[x][i]*dp[y][j]%Mod*c[k][i]%Mod*c[i][j-(k-i)]%Mod)%=Mod;
}
}
}
size[x]+=size[y];
for(int i=1;i<=size[x];i++) dp[x][i]=g[i];
}
}
if(x){
size[x]++;
for(int i=1;i<=size[x];i++) dp[x][i]=g[i-1];
if(size[x]==1) dp[x][1]=1;
}
else{
for(int i=1;i<=size[x];i++) dp[x][i]=g[i];
}
memset(g,0,sizeof(g));
}
struct data{
int x,y;
}e[N];
int main(){
freopen("pairwise.in","r",stdin);
freopen("pairwise.out","w",stdout);
scanf("%d%d",&n,&m);int tot=0;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
int x,y;char s[10];
scanf("%d",&x);scanf("%s",s+1);scanf("%d",&y);
if(s[1]=='<') e[++tot]=(data){x,y};
if(s[1]=='=') {
int u=find(x),v=find(y);
if(u!=v) fa[u]=v;
}
}
for(int i=1;i<=tot;i++){
if(find(e[i].x)!=find(e[i].y)) lnk(find(e[i].x),find(e[i].y));
else {puts("0");return 0;}
}
for(int i=1;i<=n;i++) if(find(i)==i) q[++tt]=i;
for(int i=1;i<=tt;i++) if(du[q[i]]==0) lnk(0,q[i]);
for(int i=0;i<=n;++i) c[i][0]=1;
for(int i=1;i<=n;++i)
for(int j=1;j<=i;++j){
c[i][j]=(c[i-1][j-1]+c[i-1][j])%Mod;
}
dfs(0,0);
ll ans=0;for(int i=1;i<=size[0];i++) (ans+=dp[0][i])%=Mod;
printf("%lld\n",ans);
return 0;
}
bzoj 4013: [HNOI2015]实验比较的更多相关文章
- 4013: [HNOI2015]实验比较
4013: [HNOI2015]实验比较 链接 分析: 首先把等号用并查集合并起来. 由于只存在最多一个质量不比i差的数,发现这是森林.若x<y,连边x->y.于是建虚拟根节点0. 然后树 ...
- 【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 【HNOI2015】 实验比较
题目链接:实验比较 如果我们把相等关系全部缩起来的话,这道题给出的小于关系如果有环,那么就是不合法的,否则就构成了一片森林. 定义等于号连起来的所有变量看做一个块. 然后我们就可以令\(f_{i,j} ...
- BZOJ 4013/Luogu P3240 [HNOI2015] 实验比较 (树形DP)
题目传送门 分析 放一个dalao博客: xyz32768 的博客,看完再回来看本蒟蒻的口胡吧(其实嘛-不回来也行) 精髓是合并的方案数的计算,至于为什么是Ci−1j−1\large C_{i-1}^ ...
- BZOJ 4013 实验比较
Description 小D被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有\(N\)张图片,编号为\(1\)到\(N\).实验分若干轮进行,在每轮实验中,小\(D\)会被要 ...
- bzoj 4010 [HNOI2015]菜肴制作——贪心
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4010 和 bzoj 2535 差不多.因为当前怎么决策与该点后面连的点的标号情况有关,所以按 ...
- bzoj 4010: [HNOI2015]菜肴制作 拓扑排序
题目链接: 题目 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory Limit: 512 MB 问题描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴 ...
随机推荐
- JAVA基础5——与String相关的系列(2)
差异点比较 String使用+直接拼接 这种情况需要分两种情况来讨论: 1. 都是确定的字符串常量之间进行的+号拼接的时候,由于在编译器就可以确定其具体值了,所以编译器在编译期的时候就会把这些常量拼接 ...
- HDU 1060 Leftmost Digit 基础数论
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1060 这道题运用的是数学方法. 假设S=n^n.两边同时取对数,得到lgS=nlgn.即有S=10 ...
- 前端chrome浏览器调试
引言 "工欲善其事,必先利其器" 恩,这句话我觉得说的特别有道理,举个例子来说吧,厉害的化妆师都有一套非常专业的刷子,散粉刷负责定妆,眼影刷负责打眼影,各司其职,有了专业的工具才能 ...
- php 将pdf转成图片且将图片拼接
说明: 1.pdf转图片通过安装php扩展imagick实现. 2.由于windows扩展安装的一系列问题,建议在linux环境开发,windows大伙可以尝试安装. 3.为Centos 安装Imag ...
- Windows下Tomcat调优
windows tomcat 优化 1. tomcat conf server.xml 在server.xml中修改以一部分,增加节点数目,可以很好的提高性能: <Connector port ...
- C++ 函数对象
函数对象 c++中函数名后的()称为函数调用运算符.函数调用运算符也可以重载,如果某个类重载了函数调用运算符,则该类的实例就是一个函数对象.函数对象本身并不是很有用,但他们使得算法操作的参数化策略成为 ...
- 浅谈 Integer 类
在讲解 Integer 之前,我们先看下面这段代码: public static void main(String[] args) { Integer i = 10; Integer j = 10; ...
- Ubuntu 14.4 Django模型迁移到数据库提示 LookupError: unknown encoding: utf8mb4 解决方法
由于数据库中需要存储emoji表情,因此需要mysql支持utf8mb4,参考前面的文章升级数据库. 但是由于服务器上面的python-mysqldb连接包版本为1.2.3不支持utf8mb4,因此报 ...
- PHP中的会话控制
了解HTTP(超文本传输协议)可以知道,它采用请求与响应的模式,最大的特点就是无连接无状态. 无连接:每次连接仅处理一个客户端的请求,得到服务器响应后,连接就结束了 无状态:每个请求都是独立的,服务器 ...
- SSH中的免password登录
1:运行命令 ssh-keygen -t rsa 产生秘钥 ,位于~/.ssh目录下(假设在这期间有什么提示.一路敲击enter下去,什么都不用输入) 2:运行命令 cp ~/.ssh/id_rs ...