[NOI2020] 超现实树
我们定义链树为:在该树上的任意节点,左右子树大小的最小值小于2.
举个例子:
那么我们思考,链树显然可以在叶子节点任意替换成其他子树。
那么在主链上,我们可以做到生成任意深度大于主链长度的树。
反过来,一颗任意的树则无法做到,即当一颗树可以生成时,一定有对应的链树存在。
那么我们只在所有树里判断链树即可。
那么我们思考链树有几种状态:
只有右节点
只有左节点
有一个左叶子节点,当前主链为右链。
有一个右叶子节点,当前主链为左链。
我们发现,四种状态的链树,不能互相转换,缺少一种则会存在无限个该形态链树被无法生成。
我们只需要把所有链树合并,维护一颗四叉树并判断即可。
#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;
}
[NOI2020] 超现实树的更多相关文章
- 洛谷 P6776 - [NOI2020] 超现实树(找性质,神仙题)
洛谷题面传送门 nb tea 一道! 首先考虑怎样入手分析这个看似非常不可做的问题.首先题目涉及高度无穷的树,根本枚举不了.不过我们冷静一下就会发现,如果我们记 \(mx=\max\limits_{i ...
- [loj3343]超现实树
定义1:两棵树中的$x$和$y$对应当且仅当$x$到根的链与$y$到根的链同构 定义2:$x$和$y$的儿子状态相同当且仅当$x$与儿子所构成的树与$y$与儿子所构成的树同构 根据题中所给的定义,有以 ...
- Solution -「NOI 2020」「洛谷 P6776」超现实树
\(\mathcal{Description}\) Link. 对于非空二叉树 \(T\),定义 \(\operatorname{grow}(T)\) 为所有能通过若干次"替换 \( ...
- NOI2020网上同步赛 游记
Day1 预计得分:\(32pts\)(我裂开了--) T1 美食家 表示考试的时候想到了关于矩阵快速幂的想法,甚至连分段后怎么处理都想好了,但是没有想到拆点,还有不知道怎么处理重边(这个考虑是多余的 ...
- NOI2020 同步赛划水记
因为太菜了没去现场参加 NOI 就算去了估计也只能混个Fe(雾) "两天都会各有一道签到题,争取拿到70分.剩下的题每道题打30分暴力.每天130分,就能稳拿Ag了."--ls D ...
- WC2021 云划水记
Day -38 - 2459208(2020.12.24) CCF 发公告了,线上举办 hopping. 刚看到还纠结了一会儿,但想想还是报了.虽说是去摸鱼,打打暴力分就走人.但毕竟有牌和没牌也是不一 ...
- Solution -「多校联训」朝鲜时蔬
\(\mathcal{Description}\) Link. 破案了,朝鲜时蔬 = 超现实树!(指写得像那什么一样的题面. 对于整数集 \(X\),定义其 好子集 为满足 \(Y\sub ...
- B树——算法导论(25)
B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...
- ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单
前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...
随机推荐
- Poetry(2)Poetry的基本使用方式
Poetry的基本使用 准备工作 如果你是在一个已有的项目里使用Poetry,你只需要执行 poetry init 命令来创建一个 pyproject.toml 文件: poetry init 可看到 ...
- 【UE4 C++ 基础知识】<10>资源的引用
2种引用方式 硬引用(Hard Reference) 即对象 A 引用对象 B,并导致对象 B 在对象 A 加载时加载 硬引用过多会导致运行时很多暂时用不到的资源也被加载到内存中 大量资源会导致进程阻 ...
- 用例图示例:使用系统边界表示多个项目 / Using System Boundary to model Multiple Projects in Use Case Diagram
什么是用例图? 用例是一种捕获系统功能需求的技术.用例描述了一个独立于实现细节的期望行为.用例的目标是捕获用户设想的所有系统级功能.从用户的角度来看,用例是关于系统应该做什么的.用例捕获系统利益相关者 ...
- 5.31日 Scrum Metting
日期:2021年5月31日 会议主要内容概述:讨论草稿箱前后端接口,讨论账单页面设计. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 文件导入功能 ...
- Scrum Meeting 0529
零.说明 日期:2021-5-29 任务:简要汇报七日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 七日内已完成的任务 后两日计划完成的任务 困难 qsy PM&前端 完成后端管 ...
- 最短路计数(SPFA× Dijkstra√)
题目描述 给出一个n个顶点m条边的无向无权图,顶点编号为1−n.问从顶点1开始,到其他每个点的最短路有几条. 输入格式 第一行包含2个正整数n,m,为图的顶点数与边数. 接下来M行,每行2个正整数x, ...
- 基于 Istio 的全链路灰度方案探索和实践
作者|曾宇星(宇曾) 审核&校对:曾宇星(宇曾) 编辑&排版:雯燕 背景 微服务软件架构下,业务新功能上线前搭建完整的一套测试系统进行验证是相当费人费时的事,随着所拆分出微服务数量的不 ...
- jQuery淡入淡出效果
如果是通过鼠标点击事件来触发动画效果可以使用 $("#button").click(function(){ $("#div").stop().fadeToggl ...
- vue配置请求拦截器和响应拦截器
首先确保我们已经设置的store.js进行值的存取,这时候我们需要配置请求和响应的拦截器设置 main.js import Vue from 'vue' import App from './App' ...
- 详解calc()函数功能
calc()对大家来说,或许很陌生,不太会相信calc()是css中的部分.因为看其外表像个函数,既然是函数为何又出现在CSS中呢?这一点也让我百思不得其解,今天有一同事告诉我,说CSS3中有一个属性 ...