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. You have been tasked with optimizing the production of a certain type of tree for an especially large and important order.
The tree in question is a rooted tree with n vertices labelled with distinct integers from 0 to n−1. The vertex labelled 0 is the root of the tree, and for any non-root vertex v the label of its parent p(v) is less than the label of v.
All trees at the factory are made from bamboo blanks. A bamboo is a rooted tree such that each vertex has exactly one child, except for a single leaf vertex with no children. The vertices of a bamboo blank can be labelled arbitrarily before its processing is started.
To process a bamboo into another tree a single type of operation can be made: choose an arbitrary non-root vertex v such that its parent p(v) is not a root either. The operation consists of changing the parent of v to its parent's parent p(p(v)). Note that parents of all other vertices remain unchanged, in particular, the subtree of v does not change.
Efficiency is crucial, hence you have to minimize the number of operations to make the desired tree from a bamboo blank. Construct any optimal sequence of operations to produce the desired tree.
Note that the labelling of the resulting tree has to coincide with the labelling of the desired tree. Formally, the labels of the roots have to be equal, and for non-root vertices with the same label the labels of their parents should be the same.
It is guaranteed that for any test present in this problem an answer exists, and further, an optimal sequence contains at most 106 operations. Note that any hack that does not meet these conditions will be invalid.
Input
The first line contains a single integer n — the number of vertices in the tree (2≤n≤105).
The second line contains n−1 integers p(1),…,p(n−1) — indices of parent vertices of 1,…,n−1 respectively (0≤p(i)<i).
Output
In the first line, print n distinct integers id1,…,idn — the initial labelling of the bamboo blank starting from the root vertex (0≤idi<n).
In the second line, print a single integer k — the number of operations in your sequence (0≤k≤106).
In the third line print k integers v1,…,vk describing operations in order. The i-th operation consists of changing p(vi) to p(p(vi)). Each operation should be valid, i.e. neither vi nor p(vi) can be the root of the tree at the moment.
Examples
input
5
0 0 1 1
output
0 2 1 4 3
2
1 3
input
4
0 1 2
output
0 1 2 3
0
题意
现在有一个链,然后每次操作可以使得fa[x]=fa[fa[x]],就是使得自己的爷爷变成自己的父亲。然后操作若干次,就会变成一颗树。
现在题目给你一个根为0的树,说这个是由一条链操作得到的,让你还原这条链的样子,并输出方案,要求操作次数最少。
题解
我们把操作转换一下,其实就是使得一个子树的父亲,变成自己的兄弟。
我们手动模拟一下,可以发现,树链的长度是一定的,我们如果让深度大于等于他的子树插进去的话,那么深度肯定会+1的,于是我们就每次插入深度大于等于他的就好了。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
int fa[maxn],mx[maxn],n;
vector<int>son[maxn];
vector<int>order;
bool cmp(int x,int y){
return mx[x]<mx[y];
}
void dfs1(int x){
for(int i=0;i<son[x].size();i++){
dfs1(son[x][i]);
mx[x]=max(mx[x],mx[son[x][i]]+1);
}
sort(son[x].begin(),son[x].end(),cmp);
}
void dfs2(int x){
cout<<x<<" ";
for(int i=0;i<son[x].size();i++){
dfs2(son[x][i]);
if(i==0)continue;
for(int j=0;j<=mx[son[x][i-1]];j++){
order.push_back(son[x][i]);
}
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<n;i++){
scanf("%d",&fa[i]);
son[fa[i]].push_back(i);
}
dfs1(0);
dfs2(0);
cout<<endl;
cout<<order.size()<<endl;
for(int i=0;i<order.size();i++){
cout<<order[i]<<" ";
}
cout<<endl;
}
Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) F. Tree Factory 构造题的更多相关文章
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2)
A - Forgetting Things 题意:给 \(a,b\) 两个数字的开头数字(1~9),求使得等式 \(a=b-1\) 成立的一组 \(a,b\) ,无解输出-1. 题解:很显然只有 \( ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) D. Power Products
链接: https://codeforces.com/contest/1247/problem/D 题意: You are given n positive integers a1,-,an, and ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) C. p-binary
链接: https://codeforces.com/contest/1247/problem/C 题意: Vasya will fancy any number as long as it is a ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) B2. TV Subscriptions (Hard Version)
链接: https://codeforces.com/contest/1247/problem/B2 题意: The only difference between easy and hard ver ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) A. Forgetting Things
链接: https://codeforces.com/contest/1247/problem/A 题意: Kolya is very absent-minded. Today his math te ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) E. Rock Is Push dp
E. Rock Is Push You are at the top left cell (1,1) of an n×m labyrinth. Your goal is to get to the b ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) B. TV Subscriptions 尺取法
B2. TV Subscriptions (Hard Version) The only difference between easy and hard versions is constraint ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) A. Forgetting Things 水题
A. Forgetting Things Kolya is very absent-minded. Today his math teacher asked him to solve a simple ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) D. Power Products 数学 暴力
D. Power Products You are given n positive integers a1,-,an, and an integer k≥2. Count the number of ...
随机推荐
- 【STM32H7教程】第17章 STM32H7之GPIO的HAL库API
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第17章 STM32H7之GPIO的HAL库API ...
- spring cloud 2.x版本 Spring Cloud Stream消息驱动组件基础教程(kafaka篇)
本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server.eureka-client.eureka-ri ...
- PHP 的异步并行和协程 C 扩展 Swoole (附链接)
PHP的异步.并行.高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列, ...
- SqlServer PIVOT行转列
PIVOT通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合. 测试数据 INSERT INTO [TestRows2Columns] ...
- GPU跑tf-faster-rcnn demo以及训练自己的数据
https://blog.csdn.net/qq_39123369/article/details/85245512
- oracle学习笔记(十二) 查询练习(二) 高级查询
高级查询练习 /*--------------------------------------------- 分组查询 -------------------------------------*/ ...
- windows7_删除”右键-新建“菜单中的多余项
这边文章比较好用:分享下 https://blog.csdn.net/ddgweb/article/details/17993251 在使用windows7的过程中,由于安装了较多的软件,在桌面或者资 ...
- Python 内置函数补充匿名函数
Python3 匿名函数 定义一个函数与变量的定义非常相似,对于有名函数,必须通过变量名访问 def func(x,y,z=1): return x+y+z print(func(1,2,3)) 匿名 ...
- jdk api 1.6,1.7,1.8,1.9版本(中文)
有需要的朋友,请自行到百度云下载 链接:https://pan.baidu.com/s/18WgEZ1WpBz5YexbbgikJcA 提取码:xry4
- C# abstract 和 interface 区别
抽象类主要用来提供多个派生类可共享的基类的公共定义,它与非抽象类的主要区别如下: 抽象类不能直接实例化. 抽象类中可能包含抽象成员,但非抽象类中不可以. 抽象类不能被密封. 接口具有以下特征 接口类类 ...