Олимпиадный тренинг

Задача . E. Дерево-календарь


Yuu Koito и Touko Nanami — молодожёны! В день свадьбы Yuu подарила Touko ориентированное дерево с \(n\) вершинами и корнем в \(1\), а также маркировку \(a\), которая является некоторым DFS обходом дерева. Каждое ребро в этом дереве направлено в сторону от корня.

Следующий алгоритм после вызова dfs(1) возвращает \(a\) — DFS-обход дерева, корнем которого является \(1\):


номер := 0
a := массив длины n

функция dfs(u):
номер := номер + 1
a[u] := номер
для всех v, для которых есть ориентированное ребро (u -> v):
dfs(v)

Обратите внимание, что для дерева может существовать несколько различных DFS-обходов

Touko настолько понравился подарок, что она решила поиграть с ним! Каждый день, начиная с дня после свадьбы, Touko выполняет следующую процедуру один раз:

  • Среди всех ориентированных рёбер \(u \rightarrow v\) таких, что \(a_u < a_v\), выберите рёбро \(u' \rightarrow v'\) с лексикографически минимальной парой \((a_{u'}, a_{v'})\).
  • Обменяйте местами \(a_{u'}\) и \(a_{v'}\).

Прошли дни со свадьбы, а Touko как-то забыла, когда была свадьба, и какой была оригинальная маркировка \(a\)! Опасаясь, что Yuu может разозлиться, Touko решила попросить вас определить эту информацию, используя текущую маркировку.

Будучи ее хорошим другом, вы должны найти количество дней, прошедших со свадьбы, и оригинальную маркировку дерева. Однако есть шанс, что Touko могла ошибиться в процессе, в результате чего текущую маркировку невозможно получить ни из какой начальной маркировки, в этом случае, пожалуйста, сообщите об этом Touko.

Входные данные

В первой строке входных данных содержится целое число \(n\) (\(2 \le n \le 3 \cdot 10^5\)) — количество вершин в дереве.

Во второй строке содержатся \(n\) целые числа \(a_1\), \(a_2\), ..., \(a_n\) (\(1 \le a_i \le n\), все \(a_i\) различны) — текущая маркировка дерева.

Каждая из следующих \(n - 1\) строк содержит два целых числа \(u_i\) и \(v_i\) (\(1 \le u, v \le n\), \(u \neq v\)), описывающие ориентированное ребро от \(u_i\) до \(v_i\). Ребра образуют корневое ориентированное дерево с корнем в \(1\).

Выходные данные

Если текущую маркировку невозможно получить ни из какого DFS-обхода, выведите NO.

В противном случае в первой строке выведите YES. Во второй строке выведите единственное целое число, обозначающее количество дней со дня свадьбы. В третьей строке выведите \(n\) чисел через пробел, обозначающих оригинальную маркировку дерева.

Если есть несколько правильных решений, вы можете вывести любое. Это означает, что вы можете вывести любую пару (DFS-обход, количество дней), для которой мы получим текущую конфигурацию, начав из DFS-обхода, который вы предоставили, ровно через предоставленное вами количество дней.

Примечание

Следующая анимация демонстрирует первый пример. Белая метка внутри вершины обозначает номер вершины \(i\), а оранжевая метка — значение \(a_i\).


Примеры
Входные данныеВыходные данные
1 7
4 5 2 1 7 6 3
1 5
7 6
1 2
2 7
3 4
1 3
YES
5
1 4 2 3 7 6 5
2 7
7 6 5 3 1 4 2
4 3
2 5
3 7
1 4
7 2
2 6
NO

time 2000 ms
memory 512 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
 Кол-во
С++ Mingw-w645
Комментарий учителя