CF1508E Tree Calendar

题目描述

小糸侑和七海燈子新婚啦!在婚礼当天,侑送给燈子一棵有 $n$ 个结点、以 $1$ 号结点为根的有向树,以及一个标号 $a$,它是该树的某种 DFS 序。树中的每条边都从根节点指向子节点。 调用 dfs(1) 后,以下算法会返回以 $1$ 为根的树的一个 DFS 序 $a$: ``` order := 0 a := array of length n function dfs(u): order := order + 1 a[u] := order for all v such that there is a directed edge (u -> v): dfs(v) ``` 注意,对于给定的树,可能存在不同的 DFS 序。 燈子非常喜欢这个礼物,于是决定玩一玩!在婚礼后的每一天,燈子都会执行以下操作一次: - 在所有满足 $a_u < a_v$ 的有向边 $u \rightarrow v$ 中,选择字典序最小的 $(a_{u'}, a_{v'})$ 对应的边 $u' \rightarrow v'$。 - 交换 $a_{u'}$ 和 $a_{v'}$。 距离婚礼已经过去了好几天,燈子已经忘记了婚礼是哪一天,也忘记了最初的标号 $a$!担心侑会生气,燈子决定请你帮忙推断出这两个信息。 作为她的好朋友,你需要根据当前的标号,求出距离婚礼已经过去了多少天,以及树的最初标号。如果当前标号无法通过上述过程从某个初始标号得到,请告知燈子。

输入格式

第一行包含一个整数 $n$($2 \le n \le 3 \cdot 10^5$),表示树的结点数。 第二行包含 $n$ 个整数 $a_1, a_2, \ldots, a_n$($1 \le a_i \le n$,且所有 $a_i$ 互不相同),表示当前的标号。 接下来的 $n-1$ 行,每行包含两个整数 $u_i$ 和 $v_i$($1 \le u, v \le n$,$u \ne v$),表示一条从 $u_i$ 指向 $v_i$ 的有向边。所有边构成一棵以 $1$ 为根的有向树。

输出格式

如果当前标号无法通过上述过程从某个 DFS 序得到,输出 NO。 否则,第一行输出 YES。第二行输出一个整数,表示距离婚礼已经过去了多少天。第三行输出 $n$ 个用空格分隔的整数,表示树的最初标号。 如果有多组正确答案,可以输出任意一组。也就是说,你可以输出任意一组(DFS 序,天数),使得从你给出的 DFS 序经过恰好该天数的操作后能得到当前的标号。

说明/提示

下图展示了第一个样例测试的动画。节点内的白色数字表示节点编号 $i$,橙色方框内的数字表示 $a_i$ 的值。 ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF1508E/3e50fa34f107fc2604db0e1747008bb1dad1f82b.png) 由 ChatGPT 4.1 翻译