luogu P4006 小 Y 和二叉树
可以发现度数\(< 3\)的点可以作为先序遍历的第一个点,那么就把度数\(< 3\)的编号最小的点作为第一个点.然后现在要确定它的左右儿子(或者是右儿子和父亲).我们把第一个点作为根,设\(f_x\)为\(x\)子树内先序遍历第一个点的最小值,一遍树型dp求出来
做的时候要用个变量记录这个点要放左右儿子还是右儿子和父亲,如果当前这个点是上一个点的父亲(或者是第一个点),那么这个点就要放右儿子和父亲,否则放左右儿子
如果只有一个儿子\(y\),就比较两种方式哪一种得到的下一个数最小.如果要放左右儿子,那如果\(f_y<x\)那\(y\)就在左子树,否则在右子树;如果要放右儿子和父亲,然后\(f_y<y\)就放右儿子,否则放父亲
如果有两个儿子,就把\(f\)更小的放在前面,也就是放左右儿子是\(f\)更小的放左儿子,放右儿子和父亲时\(f\)更小的放右儿子
确定好位置后就递归进子树处理子树答案
#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define db double
using namespace std;
const int N=1e6+10;
int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int to[N<<1],nt[N<<1],hd[N],tot=1;
void add(int x,int y)
{
++tot,to[tot]=y,nt[tot]=hd[x],hd[x]=tot;
}
int n,dg[N],f[N];
void dfs(int x,int ffa)
{
f[x]=n+1;
int cn=0;
for(int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y==ffa) continue;
dfs(y,x),f[x]=min(f[y],f[x]),++cn;
}
if(cn<2) f[x]=min(f[x],x);
}
void dd(int x,int ffa,bool ty)
{
--dg[x];
if(!dg[x])
{printf("%d ",x);return;}
if(ty==1)
{
printf("%d ",x);
if(dg[x]==1)
{
int c1=0;
for(int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y!=ffa) c1=y;
}
dd(c1,x,f[c1]==c1);
}
else
{
int c1=0,c2=0;
for(int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y!=ffa) c2=c1,c1=y;
}
if(f[c1]<f[c2]) dd(c1,x,0),dd(c2,x,1);
else dd(c2,x,0),dd(c1,x,1);
}
}
else
{
if(dg[x]==1)
{
int c1=0;
for(int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y!=ffa) c1=y;
}
if(f[c1]<x)
{
dd(c1,x,0);
printf("%d ",x);
}
else
{
printf("%d ",x);
dd(c1,x,0);
}
}
else
{
int c1=0,c2=0;
for(int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y!=ffa) c2=c1,c1=y;
}
if(f[c1]<f[c2])
{
dd(c1,x,0);
printf("%d ",x);
dd(c2,x,0);
}
else
{
dd(c2,x,0);
printf("%d ",x);
dd(c1,x,0);
}
}
}
}
int main()
{
n=rd();
for(int i=1;i<=n;++i)
{
dg[i]=rd();
for(int j=1;j<=dg[i];++j) add(i,rd());
}
int rt=n+1;
for(int i=1;i<=n;++i)
if(dg[i]<3) {rt=i;break;}
dfs(rt,0);
++dg[rt],dd(rt,0,1);
return 0;
}
luogu P4006 小 Y 和二叉树的更多相关文章
- 【luoguP4006 清华集训2017】小Y和二叉树
题目描述 小 Y 是一个心灵手巧的 OIer,她有许多二叉树模型. 小 Y 的二叉树模型中,每个结点都具有一个编号,小 Y 把她最喜欢的一个二叉树模型挂在了墙上,树根在最上面,左右子树分别在树根的左下 ...
- 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#339. 【清华集训2017】小 Y 和二叉树 贪心
原文链接 www.cnblogs.com/zhouzhendong/p/UOJ339.html 前言 好久没更博客了,前来更一发. 题解 首先,我们考虑一个子问题:给定根,求出最小中序遍历. 如果根节 ...
- loj2324 「清华集训 2017」小 Y 和二叉树
https://loj.ac/problem/2324 太智障,一开始以为中序遍历的第一个点一定是一个叶子,想了个贪心.然而,手算了一下,第一个点都过不了啊. input 5 2 3 4 1 3 3 ...
- LOJ2324「清华集训 2017」小Y和二叉树
题目链接 瞎jb贪一发就过了.首先度数<=2且编号最小的点一定是中序遍历最靠前的点,我们从这个点开始dfs一遍算出子树中度数<=2且编号最小的点记为\(f(i)\),然后从这个点开始一步一 ...
- LOJ2324. 「清华集训 2017」小 Y 和二叉树【贪心】【DP】【思维】【好】
LINK 思路 首先贪新的思路是处理出以一个节点为根所有儿子的子树中中序遍历起始节点最小是多少 然后这个可以两次dfs来DP处理 然后就试图确定中序遍历的第一个节点 一定是siz<=2的编号最小 ...
- uoj#339. 【清华集训2017】小 Y 和二叉树(构造)
传送门 膜拜大米饼巨巨 构造思路太神仙了-- 先考虑这个序列的开头,肯定是一个度数小于等于\(2\)且标号最小的节点,设为\(u\) 如果一个点度数小于等于\(2\),我们称这个点可以被选择,一个点的 ...
- 【luogu P4007 清华集训2017】小Y和恐怖奴隶主
题目背景 “A fight? Count me in!” 要打架了,算我一个. “Everyone, get in here!” 所有人,都过来! 题目描述 小 Y 是一个喜欢玩游戏的 OIer.一天 ...
随机推荐
- 12 Linux ACL权限
1.查看facl权限 getfacl /home/test.txt [root@localhost ~]# getfacl /home/test.txt getfacl: Removing leadi ...
- layui template list
//第一步:编写模版.你可以使用一个script标签存放模板,如: <script id="demo" type="text/html"> < ...
- Qt新安装之后出现Error while building/deploying (kit: Desktop Qt 5.7.0 GCC 64bit) When executing step "Make”
Ubuntu14.04初次安装Qt之后可能出现Error while building/deploying project *** (kit: Desktop Qt 5.7.0 GCC 64bit ...
- Tree 树形控件
用清晰的层级结构展示信息,可展开或折叠. 基础用法 基础的树形结构展示. <el-tree :data="data" :props="defaultProps&qu ...
- 解决Mysql无法导入存在null数据的问题
其实很简单,在mysql的控制台输入 SET @@GLOBAL.sql_mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"; 然后重 ...
- c#根据配置文件反射
由于项目中用到了反射,准备把各个类库都先写在配置文件中,然后读取配置文件,再对配置文件中配置的类库进行反射. 这样做的好处是各个类库保持独立,其中一个类库出现问题不会影响其他类库,更新项目时,只要更新 ...
- python在shell中环境变量使用
1.用Python Shell设置或获取环境变量的方法: 设置系统环境变量 os.environ['环境变量名称']='环境变量值' #其中key和value均为string类型 os.putenv( ...
- UOJ#494K点最短路
#include <cstdio> #include <iostream> #include <cstring> #include <queue> #d ...
- jvm的学习笔记:二、类的初始化,代码实战(1)
对于静态字段来说,直接定义该字段的类才会被初始化 System.out.println(MyChild1.str); 输出: myParent1 static block hello myParent ...
- alembic的使用