题目链接

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

如果这个点度数还剩2(也就是除掉之前确定的左儿子后的度数),那么选\(f(i)\)小的作为右儿子,如果度数剩1,那么比较\(f(i)\)与i谁更小,若\(i<=f(i)\)则把i作为父亲否则作为右儿子。每次不断跳到它的父亲,没父亲了就是根了,之后的事就是把这条链上的每个点的右儿子的子树给确定出来,这个算出\(f(i)\)后搞一搞就行了,注意i只有一个儿子时若\(i<f(ch)\)那么把这个ch调到右边去。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#define P puts("lala")
#define cp cerr<<"lala"<<endl
#define ln putchar('\n')
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
using namespace std;
inline int read()
{
char ch=getchar();int g=1,re=0;
while(ch<'0'||ch>'9') {if(ch=='-')g=-1;ch=getchar();}
while(ch<='9'&&ch>='0') re=(re<<1)+(re<<3)+(ch^48),ch=getchar();
return re*g;
}
typedef long long ll;
typedef pair<int,int> pii; const int N=1000050;
const int inf=0x3f3f3f3f;
int deg[N],head[N],cnt=0;
pii oo=pii(inf,inf);
struct node
{
int to,next;
}e[N<<1];
inline void add(int x,int y)
{
e[++cnt]=(node){y,head[x]};head[x]=cnt;
}
int n,f[N],ch[N][2],g[N];
void dfs(int u,int fa)
{
pii minn=oo,sec=oo;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(v==fa) continue;
dfs(v,u);
if(pii(f[v],v)<minn)
{
if(minn<sec) sec=minn;
minn=pii(f[v],v);
}
else if(pii(f[v],v)<sec) sec=pii(f[v],v);
}
if(minn==oo) f[u]=u,ch[u][0]=ch[u][1]=0;
else if(sec==oo)
{
if(u<minn.fi) ch[u][0]=0,ch[u][1]=minn.se,f[u]=u;
else ch[u][0]=minn.se,ch[u][1]=0,f[u]=minn.fi;
}
else ch[u][0]=minn.se,ch[u][1]=sec.se,f[u]=minn.fi;
} void dfs2(int u,int fa)
{
int tot=-1;
g[u]=inf;
if(deg[u]<=2) g[u]=u;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(v==fa) continue;
dfs2(v,u);
ch[u][++tot]=v;
g[u]=min(g[u],g[v]);
}
if(tot==1&&g[ch[u][1]]<g[ch[u][0]]) swap(ch[u][0],ch[u][1]);
else if(tot==0&&g[ch[u][0]]>=ch[u][0]) ch[u][1]=ch[u][0],ch[u][0]=0;
} void print(int o)
{
if(ch[o][0]) print(ch[o][0]);
printf("%d ",o);
if(ch[o][1]) print(ch[o][1]);
} void wj()
{
#ifndef ONLINE_JUDGE
freopen("binary.in","r",stdin);
freopen("binary.out","w",stdout);
#endif
}
int main()
{
wj();
int i,j,opt,T;
n=read();
int minx=inf;
for(i=1;i<=n;++i)
{
deg[i]=read();
for(j=1;j<=deg[i];++j) add(i,read());
if(deg[i]<=2&&i<minx) minx=i;
}
dfs2(minx,0);
int u=minx;
while(u)
{
if(ch[u][0]) dfs(ch[u][0],u);
u=ch[u][1];
}
u=minx;
while(u)
{
printf("%d ",u);
if(ch[u][0]) print(ch[u][0]);
u=ch[u][1];
}
return 0;
}

LOJ2324「清华集训 2017」小Y和二叉树的更多相关文章

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

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

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

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

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

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

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

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

  5. loj #2325. 「清华集训 2017」小Y和恐怖的奴隶主

    #2325. 「清华集训 2017」小Y和恐怖的奴隶主 内存限制:256 MiB时间限制:2000 ms标准输入输出 题目类型:传统评测方式:文本比较   题目描述 "A fight? Co ...

  6. [LOJ#2323]「清华集训 2017」小Y和地铁

    [LOJ#2323]「清华集训 2017」小Y和地铁 试题描述 小Y是一个爱好旅行的OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的 ...

  7. 【loj2325】「清华集训 2017」小Y和恐怖的奴隶主 概率dp+倍增+矩阵乘法

    题目描述 你有一个m点生命值的奴隶主,奴隶主受伤未死且当前随从数目不超过k则再召唤一个m点生命值的奴隶主. T次询问,每次询问如果如果对面下出一个n点攻击力的克苏恩,你的英雄期望会受到到多少伤害. 输 ...

  8. LibreOJ #2325. 「清华集训 2017」小Y和恐怖的奴隶主(矩阵快速幂优化DP)

    哇这题剧毒,卡了好久常数才过T_T 设$f(i,s)$为到第$i$轮攻击,怪物状态为$s$时对boss的期望伤害,$sum$为状态$s$所表示的怪物个数,得到朴素的DP方程$f(i,s)=\sum \ ...

  9. LOJ2325. 「清华集训 2017」小 Y 和恐怖的奴隶主【矩阵快速幂优化DP】【倍增优化】

    LINK 思路 首先是考虑怎么设计dp的状态 发现奴隶主的顺序没有影响,只有生命和个数有影响,所以就可以把每个生命值的奴隶主有多少压缩成状态就可以了 然后发现无论是什么时候一个状态到另一个状态的转移都 ...

随机推荐

  1. Docker Compose安装部署Jenkins

    流水线可以让项目发布流程更加清晰,docker可以大大减少Jenkins配置. 1.前言 数据卷挂载到 /var 磁盘目录下,因为该磁盘空间较大,后面需要挂载容器数据卷,以防内存吃紧. 为了可以留存启 ...

  2. GreatSQL季报(2021.12.26)

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 自从GreatSQL 8.0.25 于 2021.8.26发布以来,针对MGR的 ...

  3. BMP位图之代码实现

    从16位开始,不存在调色板,顶多存在一个RGBQUAD的掩码. 16位位图,我没有拿到对应的素材,但是根据官方文档的描述和代码验证后,我总结为下: 当biCompression为BI_RGB时,此时是 ...

  4. MES对接Simba实现展讯平台 IMEI 写号与耦合测试

    文章开始之前,必须对Simba工具点一个大大的赞,Simba为了适应市面上不同厂家开发的 MES 系统,特地开发了统一的接口,各个 MES 厂家只需要按照接口规范去做开发,然后将中间件加载到 Simb ...

  5. Luogu1502 窗口的星星 (线段树扫描线)

    将每个点拓展为矩形,将\(y\)离散,延\(x\)轴扫描,每次更新最值 用了一百年的pushdown操作疑似有问题,亦或这道题特殊,我乱改了pushdown位置就过了,我能怎么办,WA了一发,y数组没 ...

  6. Digester解析xml原理

    Tomcat内部是使用Digester来解析xml文件的,将xml转化为java对象. digester底层是基于SAX+事件驱动+栈的方式来搭建实现的,SAX主要用来解析xml,事件驱动主要是在解析 ...

  7. redis-zset命令

    一.BZPOPMAX key [key ...] timeout BZPOPMAX 是有序集合命令 ZPOPMAX带有阻塞功能的版本. 在参数中的所有有序集合均为空的情况下,阻塞连接.参数中包含多个有 ...

  8. java数组---概念

    1.数组的定义 数组是相同类型数据的有序集合.数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们. 2.数组的建 ...

  9. C#基础_C#计算样本标准差和总体标准差

    首先我们先了解样本标准差和总体标准差: 样本标准差=方差的算术平方根=s=sqrt(((x1-x)^2 +(x2-x)^2 +......(xn-x)^2)/(n-1)) 总体标准差=σ=sqrt(( ...

  10. 【MySQL】从入门到精通8-SQL数据库编程

    上期:[MySQL]从入门到精通7-设计多对多数据库 第零章:Mac用户看这里: mac终端写MySQL和windows基本相同,除了配置环境变量和启动有些许不同以外. 先配置环境变量,在终端输入vi ...