zoukankan      html  css  js  c++  java
  • [NOI2020] 超现实树

    我们定义链树为:在该树上的任意节点,左右子树大小的最小值小于2.
    举个例子:
    image

    那么我们思考,链树显然可以在叶子节点任意替换成其他子树。
    那么在主链上,我们可以做到生成任意深度大于主链长度的树。
    反过来,一颗任意的树则无法做到,即当一颗树可以生成时,一定有对应的链树存在。
    那么我们只在所有树里判断链树即可。

    那么我们思考链树有几种状态:

    只有右节点
    只有左节点
    有一个左叶子节点,当前主链为右链。
    有一个右叶子节点,当前主链为左链。

    我们发现,四种状态的链树,不能互相转换,缺少一种则会存在无限个该形态链树被无法生成。

    我们只需要把所有链树合并,维护一颗四叉树并判断即可。

    #include<iostream>
    #include<cstdio>
    #define ll long long 
    #define N 200005
    
    ll n,m,T,cnt;
    int rt;
    int ls[N],rs[N],ok[N],chd[N][4];
    
    inline int leaf(int x){
    	return x != 0 && (ls[x] == 0 ) && (rs[x] == 0);
    }
    
    int check(int x){
    	if(x == 0 || leaf(x))
    		return 1;
    	return (check(ls[x])==0&&check(rs[x])==0)? 0:1;
    }
    
    inline void merge(int &now,int x){
    	if(now == 0)
    	now = ++cnt;
    	if(leaf(x)){
    		ok[now] = 1;
    		return ;
    	}
    	if(leaf(ls[x]) && leaf(rs[x])){
    		merge(chd[now][2],ls[x]);
    		merge(chd[now][3],rs[x]);
    		return ;
    	}
    	if(ls[x] == 0)
    	merge(chd[now][1],rs[x]);
    	if(rs[x] == 0)
    	merge(chd[now][0],ls[x]);
    	if(rs[x] && leaf(ls[x]))
    	merge(chd[now][3],rs[x]);
    	if(ls[x] && leaf(rs[x]))
    	merge(chd[now][2],ls[x]);
    }
    
    inline bool grow(int x){
    	if(x == 0)
    	return 0;
    	if(ok[x] == 1)
    	return 1;
    	return grow(chd[x][0]) && grow(chd[x][1]) && grow(chd[x][2]) && grow(chd[x][3]);
    }
    
    int main(){
    	scanf("%lld",&T);
    	while(T -- ){
    		scanf("%lld",&m);
    		for(int i = 1;i <= m;++i){
    			scanf("%lld",&n);
    			for(int j = 1;j <= n;++j){
    				scanf("%d%d",&ls[j],&rs[j]);
    			}
    			if(check(1) == 0)
    			continue;
    			merge(rt,1);			
    			}
    		if(!grow(1))
    		puts("No");
    		else
    		puts("Almost Complete");
    		for(int i = 1;i <= cnt;++i)
    		chd[i][0] = chd[i][1] = chd[i][2] = chd[i][3] = ok[i] = 0;
    		rt = cnt = 0;				
    	}
    	return 0;
    }
    
  • 相关阅读:
    使用systemctl管理指定服务需要做的配置
    挖矿病毒
    灰度发布系统
    血一般的教训,请慎用insert into select
    关于程序bug的闲谈
    来自一个网络监控软件的自述
    为什么CTO、技术总监、架构师都不写代码,还这么牛逼?
    原来 Elasticsearch 还可以这么理解
    爬了20W+条猫咪交易数据,它不愧是人类团宠
    NPUCTF2020 这是什么觅🐎
  • 原文地址:https://www.cnblogs.com/dixiao/p/15188360.html
Copyright © 2011-2022 走看看