【luoguP4006 清华集训2017】小Y和二叉树
题目描述
小 Y 是一个心灵手巧的 OIer,她有许多二叉树模型。
小 Y 的二叉树模型中,每个结点都具有一个编号,小 Y 把她最喜欢的一个二叉树模型挂在了墙上,树根在最上面,左右子树分别在树根的左下方与右下方,且他们也都满足这样的悬挂规则。为了让这个模型更加美观,小 Y 选择了一种让这棵二叉树的中序遍历序列最小的悬挂方法。所谓中序遍历最小,就是指中序遍历的结点编号序列的字典序最小。
一天,这个模型不小心被掉在了地上,幸运的是,所有结点和边都没摔坏,但是她想不起这个模型原来是怎么悬挂的了,也就是说:她想不起来树根节点的编号了。
小 Y 最近忙于准备清华集训,所以没太多时间处理别的事情,她只好找到同样心灵手巧的你帮忙复原她的二叉树模型。
输入输出格式
输入格式:
从文件 binary.in 中读入数据。
第一行为一个正整数 n ,表示点的个数。
后接 n 行,每行若干个整数:
第 i + 1 行的第一个整数为 ki ,表示编号为 i 的结点的度数,后接 ki 个整数 ai; j ,表示编号为 i 的结点与编号为 ai; j 的结点之间有一条边。
同一行输入的相邻两个元素之间,用恰好一个空格隔开。
输出格式:
输出到文件 binary.out 中。
输出共一行, n 个整数,表示字典序最小的中序遍历。
题意:给一颗二叉树,你可以随意选择根节点和随意改变儿子顺序,求字典序最小的中序遍历;
题解:
①不断构造;
②假定选好了根节点。mn[v]表示,v的子树中开头的最小值,(根除外)一个结点的度数小于等于2,一个节点可以开头。这样从根不断向下找mn小的做左儿子贪心可以构造出序列;
③现在找根节点,首先最左面的节点一定是固定的,为度数小于等于2的最小值;从这个点u不断往上找,预处理以u为根的所有mn[],然后u对有一个儿子的情况,那么mn较小的应该是u的右儿子,mn较大的应该是u的父亲,只有一个儿子v,mn[v]小于v,那么在真正的结构里v应该是u的右儿子,否则v是u的父亲;不断递归u向上找即可;
④最后再dfs一次输出答案;
#include<cstdio>
#include<iostream>
using namespace std;
const int N=;
int n,m,d[N],rt,st,o,hd[N],ls[N],rs[N],son[N][],mn[N];
struct Edge{int v,nt;}E[*N];
char gc(){
static char *p1,*p2,s[];
if(p1==p2)p2=(p1=s)+fread(s,,,stdin);
return(p1==p2)?EOF:*p1++;
}
int rd(){
int x=; char c=gc();
while(c<''||c>'') c=gc();
while(c>=''&&c<='') x=x*+c-'',c=gc();
return x;
}
void adde(int u,int v){E[o]=(Edge){v,hd[u]};hd[u]=o++;}//
void dfsA(int u,int fa){
int cnt=;
for(int i=hd[u],v;i!=-;i=E[i].nt){
if((v=E[i].v)==fa) continue;
son[u][cnt++]=v;
dfsA(v,u);
mn[u] = min(mn[v],mn[u]);
}
}//
void find(int u){
if(d[u]==&&u!=st) {rt=u;return;}
else if(u!=st&&d[u]==||d[u]==&&u==st){
if(son[u][]<mn[son[u][]]) find(son[u][]);
else {rt=u; return;}
}
else{
if(mn[son[u][]]>mn[son[u][]]) find(son[u][]);
else find(son[u][]);
}
}//
int dfsB(int u,int fa){
if(d[u]==&&u!=rt) return u;
int tmp=n+; if(u!=rt&&d[u]==||u==rt&&d[u]==) tmp=u;
for(int i=hd[u],v,now;i!=-;i=E[i].nt){
if((v=E[i].v)==fa) continue;
if((now=dfsB(v,u))<tmp) rs[u]=ls[u],ls[u]=v,tmp=now;
else rs[u]=v;
}
return tmp;
}//
void dfsC(int u){
if(ls[u]) dfsC(ls[u]);
printf("%d ",u);
if(rs[u]) dfsC(rs[u]);
}
int main()
{ freopen("mzoj1120.in","r",stdin);
freopen("mzoj1120.out","w",stdout);
n=rd();
for(int i=;i<=n;i++){
hd[i]=-;d[i]=rd();
for(int j=;j<=d[i];j++) adde(i,rd());
if(d[i]<=) {mn[i]=i; if(!st)st=i;} else mn[i]=n+;
}
//d[st]++;
dfsA(st,);
find(st);
dfsB(rt,);
dfsC(rt);
return ;
}//by tkys_Austin;
【luoguP4006 清华集训2017】小Y和二叉树的更多相关文章
- [清华集训2017]小 Y 和地铁(神奇思路,搜索,剪枝,树状数组)
世界上最不缺的就是好题. 首先考虑暴搜.(还有什么题是从这东西推到正解的……) 首先单独一个换乘站明显没用,只用考虑一对对的换乘站. 那么有八种情况:(从题解偷图) 然后大力枚举每个换 ...
- 【清华集训】小Y和地铁
图已挂,前往luogu 题目: 小 $\rm Y$ 是一个爱好旅行的 $\rm OIer$.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁.她发现每条地铁线路可以看成平面上的一条 ...
- 清华集训2017D2T1 小 Y 和地铁(metro)
题目:https://www.luogu.org/problem/show?pid=P4005 题意:一条线段,给定n个点(n<=44)其中每个点可能对应另外一个点.如果一个点有对应点,那么就要 ...
- Loj #2324. 「清华集训 2017」小 Y 和二叉树
Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...
- [LOJ#2324]「清华集训 2017」小Y和二叉树
[LOJ#2324]「清华集训 2017」小Y和二叉树 试题描述 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙 ...
- 【UOJ#340】【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划)
[UOJ#340][清华集训2017]小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划) 题面 UOJ 洛谷 题解 考虑如何暴力\(dp\). 设\(f[i][a][b][c]\)表示当前到了第\(i\) ...
- loj #2325. 「清华集训 2017」小Y和恐怖的奴隶主
#2325. 「清华集训 2017」小Y和恐怖的奴隶主 内存限制:256 MiB时间限制:2000 ms标准输入输出 题目类型:传统评测方式:文本比较 题目描述 "A fight? Co ...
- [LOJ#2323]「清华集训 2017」小Y和地铁
[LOJ#2323]「清华集训 2017」小Y和地铁 试题描述 小Y是一个爱好旅行的OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的 ...
- Loj #2321. 「清华集训 2017」无限之环
Loj #2321. 「清华集训 2017」无限之环 曾经有一款流行的游戏,叫做 *Infinity Loop***,先来简单的介绍一下这个游戏: 游戏在一个 \(n \times m\) 的网格状棋 ...
随机推荐
- 201621123040 《Java程序设计》第1周学习总结
1.本周学习总结 关键词 JAVA概述 HelloWorld JDK JRE JVM JAVA基础语法 相关联系 通过一周的学习,我对JAVA有了初步的了解,JAVA是一种优秀的跨平台编写代码的应用平 ...
- 原生ajax的请求函数
ajax:一种请求数据的方式,不需要刷新整个页面:ajax的技术核心是 XMLHttpRequest 对象:ajax 请求过程:创建 XMLHttpRequest 对象.连接服务器.发送请求.接收响应 ...
- HP DL380服务器RAID信息丢失数据恢复方法和数据恢复过程分享
[数据恢复故障描述] 客户服务器属于HP品牌DL380系列,存储是由6块73GB SAS硬盘组成的RAID5,操作系统是WINDOWS 2003 SERVER,主要作为企业部门内部的文件服务器来 ...
- nyoj 聪明的kk
聪明的kk 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 聪明的"KK"非洲某国展馆的设计灵感源于富有传奇色彩的沙漠中陡然起伏的沙丘,体现出本国 ...
- JAVA_SE基础——56.包的创建
接下来我来给大家讲下--包 , 先看一段代码 class Demo1{ public static void main(String[] args) { System.out.println(&quo ...
- 初次面对c++
第一次实验 2-4源码: #include<iostream> using namespace std; int main() { int day; cin>>day; swi ...
- SpringBoot(六):springboot热部署
在j2ee项目开发中,热部署插件是JRebel.JRebel的使用为开发人员带来了极大的帮助,且挺高了开发便捷.而在SpringBoot开发生态环境中,SpringBoot热部署常用插件是:sprin ...
- Hive函数:LAG,LEAD,FIRST_VALUE,LAST_VALUE
参考自大数据田地:http://lxw1234.com/archives/2015/04/190.htm 测试数据准备: create external table test_data ( cooki ...
- Hive:把一段包含中文的sql脚本粘贴到beeline client运行中文乱码
背景: 在做项目过程中不可能hive表中都是非中文字段.在最近做的项目中就遇到需要在beeline界面上执行查询脚本,但脚本中包含中文,正常一个脚本用文本写好后,粘贴到beeline窗口运行时,发现中 ...
- css水平垂直居中的方法与 vertical-align 的用法
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 1. 已知元素宽度 方法一:已知宽高,可以用position定位 + margin负值的方法 : 绝对定位 ...