luogu

loj

可以发现度数\(< 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 和二叉树的更多相关文章

  1. 【luoguP4006 清华集训2017】小Y和二叉树

    题目描述 小 Y 是一个心灵手巧的 OIer,她有许多二叉树模型. 小 Y 的二叉树模型中,每个结点都具有一个编号,小 Y 把她最喜欢的一个二叉树模型挂在了墙上,树根在最上面,左右子树分别在树根的左下 ...

  2. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

  3. [LOJ#2324]「清华集训 2017」小Y和二叉树

    [LOJ#2324]「清华集训 2017」小Y和二叉树 试题描述 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙 ...

  4. UOJ#339. 【清华集训2017】小 Y 和二叉树 贪心

    原文链接 www.cnblogs.com/zhouzhendong/p/UOJ339.html 前言 好久没更博客了,前来更一发. 题解 首先,我们考虑一个子问题:给定根,求出最小中序遍历. 如果根节 ...

  5. loj2324 「清华集训 2017」小 Y 和二叉树

    https://loj.ac/problem/2324 太智障,一开始以为中序遍历的第一个点一定是一个叶子,想了个贪心.然而,手算了一下,第一个点都过不了啊. input 5 2 3 4 1 3 3 ...

  6. LOJ2324「清华集训 2017」小Y和二叉树

    题目链接 瞎jb贪一发就过了.首先度数<=2且编号最小的点一定是中序遍历最靠前的点,我们从这个点开始dfs一遍算出子树中度数<=2且编号最小的点记为\(f(i)\),然后从这个点开始一步一 ...

  7. LOJ2324. 「清华集训 2017」小 Y 和二叉树【贪心】【DP】【思维】【好】

    LINK 思路 首先贪新的思路是处理出以一个节点为根所有儿子的子树中中序遍历起始节点最小是多少 然后这个可以两次dfs来DP处理 然后就试图确定中序遍历的第一个节点 一定是siz<=2的编号最小 ...

  8. uoj#339. 【清华集训2017】小 Y 和二叉树(构造)

    传送门 膜拜大米饼巨巨 构造思路太神仙了-- 先考虑这个序列的开头,肯定是一个度数小于等于\(2\)且标号最小的节点,设为\(u\) 如果一个点度数小于等于\(2\),我们称这个点可以被选择,一个点的 ...

  9. 【luogu P4007 清华集训2017】小Y和恐怖奴隶主

    题目背景 “A fight? Count me in!” 要打架了,算我一个. “Everyone, get in here!” 所有人,都过来! 题目描述 小 Y 是一个喜欢玩游戏的 OIer.一天 ...

随机推荐

  1. 【转】python 输入一个时间,获取这个时间的下一秒

    原文:https://blog.csdn.net/l_d_56/article/details/84832198 输入一个时间,获取这个时间的下一秒 PS:下面代码使用于 python 2.7 tim ...

  2. redis数据类型为key的常用命令

    redis默认自带16个库select 7切换到redis第8个数据库dbsize查看reids有几个keykeys *查看所有k,vclear清空控制台FLUSHDB清空当前数据库的kvFLUSHA ...

  3. 综合开源框架之RxJava/RxAndroid

    * 一种帮助做异步的框架. 类似于 AsyncTask. 但其灵活性和扩展性远远强于前者. * 主页: https://github.com/ReactiveX/RxJava * 中文资料: * ht ...

  4. 代码实现:定义一个文件输入流,调用read(byte[] b)方法,将a.txt文件中的内容打印出来(byte数组大小限制为5)

    package com.loaderman.test; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; im ...

  5. Android Stuido中断点调试和高级调试

    写一个简单的调试程序 import android.os.Bundle; import android.support.v7.app.AppCompatActivity; public class M ...

  6. [idea]创建一个控制台程序

    新建项目时,选择JBoss即可.

  7. 六十九:flask上下文之线程隔离的g对象的使用

    保存全局对象的g对象g对象是在整个flask应用运行期间都是可以使用的,并且也是和request一样,是线程隔离的,这个对象是专门用来存放开发者自己定义的一些数据,方便在整个flask程序中都可以使用 ...

  8. java源码-LinkedHashMap类设计

    LinkedHashMap 继承于 hashMap LinkedHashMap .Entry 继承 HashMap.Node 继承 Map.Entry类 LinkedHashMap .Entry 该E ...

  9. delete file SVN commit error has no URL

    在提交SVN的时候遇到这个提交失败的提示: delete file SVN commit error has no URL 我的提交顺序是: 先在自己工程的文件夹删除 ->工程中删除 -> ...

  10. 使用robotframework做接口测试4——搞定接口签名及密码加密

    接口签名是我做接口测试撞到的第一块石头,刚到新公司,本来想默默憋出来一个大招,然后碰到了签名接口,直接给跪了.于是只好找开发哥哥帮忙,把签名算法的java文件拿到,一行行对着用python实现了一遍. ...