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. php的core问题

    我们在编写代码的时候,可能会发现,路径下多了一个类似这样的文件, 拿php举例  :  core.php_bin.4528.1379650721 这是因为我们在编写代码时候,出现了指针溢出,段错误等问 ...

  2. java 包引入时*会全部加载吗

    有一个虚拟机参数: -XX:+TraceClassLoading 这两种写法,最终加载的类是一样的. 对比了一下输出的都是618行

  3. 3-mybatis-xml配置

    配置文件主要在官网文档是已有详细说明. 1  properties 在上一节中已经有说明. 2 settings MyBatis中的调整设置. <settings> <!--全局地开 ...

  4. 收集的21个优秀的学习资源Kotlin

    一.教程 1.The Kotlin Website Kotlin 官方网站(英文) 2.Kotlin editor Kotlin 在线编辑器   3.Keddit:在开发Android应用程序时学习K ...

  5. Zabbix - 配置服务器对第三方服务的监控

    需求: 需要配置zabbix监控,使得zabbix服务器可以监控到另一台服务器上运行的第三方服务的状态,当状态异常时发送告警邮件. 限制:被监控的服务器不允许安装任意客户端,且该台服务器不能联通外网 ...

  6. flutter 打包

    iOS打包 iOS打包需要注意一下一些设置 info.plist 设置ATS.白名单.字符串等等 Assets.xcassets 替换icon,替换LaunchImage中内容 注意LaunchIma ...

  7. 通过ssh管道连接内网数据库(mysql)

    公网连接内网数据库(如云数据库)时,通常需要白名单:如果不是白名单IP,通常需要一个跳板机(类似代理)来连接内网数据库, 下方以mysql为例(其他数据库基本一致): import pymysql a ...

  8. ansible报错处理

    [root@localhost ~]# ansible testhosts -m command -a 'rm -rf /tmp/haha' [WARNING]: Consider using the ...

  9. POJ 1182-食物链 [并查集] 《挑战程序设计竞赛》2.4

    Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...

  10. springboot中静态属性/静态方法从YAML(yml)读取配置属性

    启动类添加注解@EnableConfigurationProperties import jnetman.session.SnmpPref; import org.springframework.bo ...