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 大酒店,为其品评菜肴 ...
随机推荐
- Spring框架——AOP代理
我们知道AOP代理指的就是设计模式中的代理模式.一种是静态代理,高效,但是代码量偏大:另一种就是动态代理,动态代理又分为SDK下的动态代理,还有CGLIB的动态代理.Spring AOP说是实现了AO ...
- openface 训练数据集
训练深度网络模型OpenFace还不是运用faceNet的model作为训练模型,所以在准确性上比faceNet要低,如果你只是做一个简单的分类,建议你看看官网的demo3(http://cmusat ...
- C语言之找零钱
#include<stdio.h>int main(){ int one,tow,five,num=1; for (one = 1; one < num*10; one++) { f ...
- CentOS下redis集群安装
环境: 一台CentOS虚拟机上部署六个节点,创建3个master,3个slave节点 1.下载并解压 cd /root wget http://download.redis.io/releases/ ...
- .net程序员做的第一个安卓APP
我从毕业之后一直做的是ASP.NET,从毕业到现在都已经五六个年头了.一个事物接触久了就会慢慢没有了新鲜感热情也褪去的差不多了,我又是对新事物比较感兴趣的,虽说Android早就不算什么新事物,当对于 ...
- JavaScript OOP(三):prototype原型对象(即构造函数的prototype属性)
通过构造函数生成的实例化对象,无法共享属性或方法(即每个实例化对象上都有构造函数中的属性和方法):造成了一定的资源浪费 function Obj(name,age){ this.name=name; ...
- php执行linux命令的6个函数
一般情况下,很少会用php去执行linux命令,不过特殊情况下,你也许会用到这些函数.以前我知道有二个函数可以执行linux命令,一个是exec,一个是shell_exec.其实有很多的,结合手册内容 ...
- JAVA调用WCF
Java环境下生成代理类的工具有很多,如wsdl2Java,wsimport 等.本文中使用的工具是wsimport. 1.wsdl2Java 生成命令实例: wsdl2Java -p package ...
- keepalived结合nginx实现nginx高可用
1.简介 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障.一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台 ...
- 【new File(String Path)加载资源问题】
2017-12-17 15:07:38 [原创-wx] 一.我们在用IO流加载资源的时候,创建文件资源 1 File file = New File("String Path" ...