题目链接

https://codeforces.com/contest/1246/problem/D

题解

首先考虑答案的下界是\(n-1-dep\) (\(dep\)为树的深度,即任何点到根的最大边数),因为每一次操作只会使一个子树内的点深度\(-1\), 也就最多使得最大深度\(-1\).

那么这个下界能否达到呢?答案是肯定的,因为考虑将过程倒过来,每次选择一个子树将它沿某条边向下移动,对于任何一棵非链的树,最深点到根的路径上一定存在分叉,因此就一定可以通过移动使得最大深度\(+1\).

考虑如何构造: 我的做法是依然倒着思考,DFS整棵树,保证最深点所在子树最后遍历,然后得到的遍历序就是输出的第一个序列。从前往后遍历第一个序列,在第二个答案序列中插入数量等于从上一个点DFS到这个点前进的步数的后一个数。

例如从3号点走到4号点,先后退了\(2\)步又前进了\(3\)步,那么就在第二个答案序列中插入\(3\)个\(4\).

至于算法的正确性,手推一下就很显然了。

代码

#include<bits/stdc++.h>
#define llong long long
using namespace std; inline int read()
{
int x=0; bool f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^'0');
if(f) return x;
return -x;
} const int N = 1e5;
struct Edge
{
int v,nxt;
} e[(N<<1)+3];
int fe[N+3];
int fa[N+3];
int mxd[N+3];
int hvs[N+3];
vector<int> id;
vector<int> opt;
int n,en,cnt; void addedge(int u,int v)
{
en++; e[en].v = v;
e[en].nxt = fe[u]; fe[u] = en;
} void dfs1(int u)
{
for(int i=fe[u]; i; i=e[i].nxt)
{
int v = e[i].v;
if(v==fa[u]) continue;
dfs1(v);
if(mxd[v]+1>mxd[u]) {mxd[u] = mxd[v]+1,hvs[u] = v;}
}
} void dfs2(int u)
{
id.push_back(u);
for(int i=1; i<=cnt; i++) opt.push_back(u);
cnt = 0;
for(int i=fe[u]; i; i=e[i].nxt)
{
int v = e[i].v;
if(v==fa[u]||v==hvs[u]) continue;
dfs2(v);
}
if(hvs[u]) {dfs2(hvs[u]);}
cnt++;
} int main()
{
scanf("%d",&n);
for(int i=2; i<=n; i++) {scanf("%d",&fa[i]); fa[i]++; addedge(fa[i],i); addedge(i,fa[i]);}
dfs1(1);
dfs2(1);
for(int i=0; i<id.size(); i++) printf("%d ",id[i]-1); puts("");
printf("%d\n",opt.size());
for(int i=0; i<opt.size(); i++) printf("%d ",opt[i]-1); puts("");
return 0;
}

Codeforces 1246D/1225F Tree Factory (构造)的更多相关文章

  1. Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) F. Tree Factory 构造题

    F. Tree Factory Bytelandian Tree Factory produces trees for all kinds of industrial applications. Yo ...

  2. Problem - D - Codeforces Fix a Tree

    Problem - D - Codeforces  Fix a Tree 看完第一名的代码,顿然醒悟... 我可以把所有单独的点全部当成线,那么只有线和环. 如果全是线的话,直接线的条数-1,便是操作 ...

  3. codeforces 1041 E. Tree Reconstruction 和度数有关的构造树

    CF 1041E:http://codeforces.com/contest/1041/problem/E 题意: 告诉你一个树的节点个数,显然有n-1条边.已知去掉一条边后,两个集合中最大的节点值. ...

  4. Codeforces Round #453 (Div. 1) D. Weighting a Tree(构造)

    题意 一个 \(n\) 个点 \(m\) 条边的无向连通图中每个点都有一个权值,现在要求给每条边定一个权值,满足每个点的权值等于所有相连的边权之和,权值可负. 题解 如果图是一棵树,那么方案就是唯一的 ...

  5. CodeForces 658C Bear and Forgotten Tree 3 (构造)

    题意:构造出一个 n 个结点,直径为 m,高度为 h 的树. 析:先构造高度,然后再构造直径,都全了,多余的边放到叶子上,注意直径为1的情况. 代码如下: #pragma comment(linker ...

  6. 【CF1247F】Tree Factory(构造)

    题意:给定一棵n个点的树,要求将一条可以随意标号的链通过若干次操作变成这棵树 一次操作是指若v不为根且v的父亲不为根,则将v以及v的子树移到v的父亲的父亲上 要求给出标号方案,操作次数以及方案 n&l ...

  7. 详细讲解Codeforces Round #624 (Div. 3) E. Construct the Binary Tree(构造二叉树)

    题意:给定节点数n和所有节点的深度总和d,问能否构造出这样的二叉树.能,则输出“YES”,并且输出n-1个节点的父节点(节点1为根节点). 题解:n个节点构成的二叉树中,完全(满)二叉树的深度总和最小 ...

  8. Codeforces.911F.Tree Destruction(构造 贪心)

    题目链接 \(Description\) 一棵n个点的树,每次可以选择树上两个叶子节点并删去一个,得到的价值为两点间的距离 删n-1次,问如何能使最后得到的价值最大,并输出方案 \(Solution\ ...

  9. Codeforces 1247F. Tree Factory

    传送门 正难则反,把链操作成树不好想,那么考虑一下如何把树变成链 每次操作相当于把一个兄弟变成儿子(我把你当兄弟你竟然想把我当儿子.jpg) 注意到每次操作最多只能使树的深度增加 $1$ 因为链的深度 ...

随机推荐

  1. Qt的多线程总结以及使用(一)

    Qt提供QThread类以进行多任务的处理.Qt提供的线程可以做到单个进程做不到的事情.在这里实现最简单的一个多线程.最简单的线程的基类为QThread,然后需要重写QThread的run(),在ru ...

  2. element-ui表格带复选框使用方法及默认选中方法

    一.实现多选:步骤1:在表格中添加一列 步骤2:在data中定义以及数组用来存储选中的元素.例如:multipleSelection:[] selection-change方法用户实时监听选中元素 实 ...

  3. 如何使用JDBC连接数据库

    1 JDBC:java database connectivity,是java程序与数据库系统通信的标准api 2 下载mysql JDBC驱动,解压缩找到mysql-connector-java-5 ...

  4. mybatis generator代码生成器的使用

    一.有关mybatis generator的使用可以查看如下网址:http://www.mybatis.org/generator/index.html 二.如下是我自己整理的学习步骤: <1& ...

  5. 10.自定义EL函数和自定义标签

    需要在JSP页面中进行一些常见逻辑操作(如对字符串进行操作),首先考虑是否可以用到sun公司提供的EL函数库(fn.tld)和JSTL 核心标签库 如果sun公司的EL函数库没有或者无法满足,就需要自 ...

  6. 二、MySQL介绍

    目录 一.MySQL背景 二.MySQL的优点 三.MySQL安装 四.MySQL服务的启动和停止 五.MySQL登录和退出 六.MySQL常用命令 (一)常用命令 (二)语法规范 (三)SQL语言细 ...

  7. maskrcnn-benchmark训练自己数据

    需要修改的地方 1. ./maskrcnn_benchmark/data/datasets/voc.py 将CLASSES 内容改为自己的数据标签 2. ./maskrcnn_benchmark/co ...

  8. 图像处理---《在图片上打印文字 windows+GDI+TrueType字体》

    图像处理---<在图片上打印文字  windows+GDI+TrueType字体> 刚开始使用的是putText()函数做,缺陷是只能显示非中文: 接着,看大多数推荐Freetype库来做 ...

  9. okhttp拦截器之RetryAndFollowUpInterceptor&BridgeInterceptor分析

    在上一次[https://www.cnblogs.com/webor2006/p/9096412.html]对okhttp的拦截器有了一个初步的认识,接下来则对具体的拦截器一个个进行了解. Retry ...

  10. JavaScript教程——函数(arguments 对象)

    arguments 对象 定义 由于 JavaScript 允许函数有不定数目的参数,所以需要一种机制,可以在函数体内部读取所有参数.这就是arguments对象的由来. arguments对象包含了 ...