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.一天 ...
随机推荐
- umount 报错was not found in /proc/mounts
前段时间在整理服务器时,看到nfs都是通过公网调用的,但是实际这几台服务器都是可以内网互通的,为了更稳定的使用,打算把这些挂载都更改为通过内网ip挂载,什么都设置好之后,操作第一台服务器没有问题,um ...
- Linux安全工具之fail2ban防爆力破解
一:简单介绍 fail2ban是一款实用软件,可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作 在企业中,有些很多人会开放root登录,这样就有机会给黑客造成暴力破解的机会 ...
- 微信小程序之数据缓存和数据获取
在一个微信小程序中 避免不了的就是在多个页面获取数据,而且还会在不同的页面获取相同的数据,写起来就是一大坨,看着就不愉快 那么今天说一下 这个方法 wx.setStorage(OBJECT) 这个方法 ...
- Fragment全解析系列
(一):那些年踩过的坑 开始之前 最新版知乎,单Activity多Fragment的架构,响应可以说非常“丝滑”,非要说缺点的话,就是没有转场动画,并且转场会有类似闪屏现象.我猜测可能和Fragmen ...
- vue调试工具vue-devtools安装
vue-devtools是一款基于chrome浏览器的插件,用于vue应用的调试,这款vue调试神器可以极大地提高我们的调试效率.帮助我们快速的调试开发vue应用. 这里介绍一下vue-devtool ...
- selenium expected_conditions 源码学习记录
#expected_conditions模块收集了一系列的场景判断方法 #源码地址 # https://seleniumhq.github.io/selenium/docs/api/py/_modul ...
- 运维之思科篇——NAT基础配置
一. NAT(网络地址转换) 1. 作用:通过将内部网络的私有IP地址翻译成全球唯一的公网IP地址,使内部网络可以连接到互联网等外部网络上. 2. 优点: 节省公有合法IP地址 处理地址重叠 增强灵活 ...
- maven中GroupID 和ArtifactID
artifactId :unique base name of the primary artifact being generated by this project GroupID 是项目组织唯一 ...
- k8s开启cadvisor http 服务
k8s开启cadvisor http 服务 cadvisor介绍: Google的 cAdvisor 是另一个知名的开源容器监控工具. 只需在宿主机上部署cAdvisor容器,用户就可通过Web界面或 ...
- robotframework-requests--中文注解版
最近工作原因在研究RobotFramework对REST测试的方案,找到几个相关类库.但使用requests感觉更方便,研究了一下requests类库的源码,并将注释换成中文为方便使用.关于Reque ...