ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[NOI2020] 超现实树

2021-08-26 10:33:03  阅读:135  来源: 互联网

标签:超现实 chd rs int NOI2020 ls && now


我们定义链树为:在该树上的任意节点,左右子树大小的最小值小于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;
}

标签:超现实,chd,rs,int,NOI2020,ls,&&,now
来源: https://www.cnblogs.com/dixiao/p/15188360.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有