Плюсануть
Поделиться
Класснуть
Запинить


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

Вы можете самостоятельно решать эти задачи столько раз, сколько вам это понадобится.
   

H. Морской бой

*особая задача поиск в глубину и подобное реализация *2100

Вам дано расположение кораблей на доске 10 × 10 при игре в морской бой. На ней по правилам должно быть размещено:

  • четырехпалубных ­— 1 шт.;
  • трехпалубных — 2 шт.;
  • двухпалубных — 3 шт.;
  • однопалубных — 4 шт.

Корабли не должны «изгибаться» и касаться друг друга любым образом. Ваша задача для данного набора досок указать соответствуют ли они описанным правилам.

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

В первой строке записано число n (1 ≤ n ≤ 10) — количество досок. Каждая доска описывается 10 строками по 10 символов. Символ «0» обозначает, что клетка пуста, а символ «*», что занята. Описания досок разделяются пустыми строками.

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

Выведите n строк YES или NO. Первое слово выводите, если доска соответствует правилам, а второе в противном случае.

E. Нужно больше боссов

графы Деревья поиск в глубину и подобное *2100

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

Естественно, некоторые переходы будут охраняться монстрами (если можно пройти куда угодно без боя, то это слишком просто и совсем не весело, так ведь?). Некоторые важные переходы будут охраняться очень сильными монстрами, требующими серьёзной подготовки и разработки специальной боевой тактики (обычно таких монстров в играх называют боссами). Ваш друг как раз хочет, чтобы вы ему помогли расставить боссов по переходам.

Игра начнётся в локации \(s\) и закончится в локации \(t\), но эти локации пока не определены. После того, как эти две локации будут выбраны, ваш друг хочет поставить босса в каждый такой переход, что, не пользуясь этим переходом, невозможно попасть из локации \(s\) в локацию \(t\). Чем больше боссов будет в игре, тем лучше (чем сложнее игра, тем она веселее, так ведь?), и поэтому ваш друг попросил вас определить максимально возможное количество боссов, принимая во внимание любой возможный выбор локаций \(s\) и \(t\).

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

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

Затем следуют \(m\) строк, каждая содержит два числа \(x\) и \(y\) (\(1 \le x, y \le n\), \(x \ne y\)), обозначающие локации, соединенные очередным переходом.

Гарантируется, что никакая пара локаций не соединена напрямую более чем одним переходом, и что можно из любой локации достичь любой другой локации, пользуясь только этими переходами.

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

Выведите одно число — максимальное количество боссов, которое можно поставить, по всем возможным парам локаций \(s\) и \(t\).

F. Берляндия и кратчайшие пути

графы кратчайшие пути Перебор поиск в глубину и подобное *2100

В Берляндии \(n\) городов, некоторые пары из которых соединены дорогами. Все дороги — двусторонние. Каждая дорога соединяет два различных города. Между парой городов — не более одной дороги. Города пронумерованы от \(1\) до \(n\).

Известно, что из столицы (город с номером \(1\)) можно добраться до любого другого города, перемещаясь по дорогам.

Президент Берляндии планирует улучшение дорожной сети страны. Бюджета хватает на ремонт \(n-1\) дороги. Президент планирует выбрать такой набор из \(n-1\) дороги, что:

  • из столицы будет возможно добраться до любого другого города по выбранной \(n-1\) дороге,
  • пусть \(d_i\) — количество дорог, сколько придется преодолеть на пути из столицы в город \(i\), двигаясь только по выбранной \(n-1\) дороге, тогда \(d_1 + d_2 + \dots + d_n\) — должно быть минимально.

Иными словами, набор из \(n-1\) дорог должен сохранять связность страны и сумма расстояний от города \(1\) до всех городов должна быть минимальна (при условии перемещения только по выбранной \(n-1\) дороге).

Президент поручил министерству подготовить \(k\) возможных вариантов выбрать \(n-1\) дорогу так, чтобы выполнялись оба условия выше.

Напишите программу, которая найдет \(k\) возможных вариантов выбрать дороги для ремонта. Если \(k\) вариантов не существует, то программа должна вывести всевозможные подходящие варианты.

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

В первой строке входных данных записаны целые числа \(n\), \(m\) и \(k\) (\(2 \le n \le 2\cdot10^5, n-1 \le m \le 2\cdot10^5, 1 \le k \le 2\cdot10^5\)), где \(n\) — количество городов в стране, \(m\) — количество дорог, а \(k\) — количество вариантов выбрать набор дорог для ремонта. Гарантируется, что \(m \cdot k \le 10^6\).

Далее в \(m\) строках перечислены дороги, по одной дороге в строке. Каждая строка содержит два целых числа \(a_i\), \(b_i\) (\(1 \le a_i, b_i \le n\), \(a_i \ne b_i\)) — номера городов, которые соединяет \(i\)-я дорога. Между каждой парой городов не более одной дороги. Заданный набор дорог таков, что в любой город можно добраться из столицы.

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

Выведите \(t\) (\(1 \le t \le k\)) — количество вариантов выбора набора дорог. Напомним, что вам надо найти \(k\) различных вариантов, если \(k\) вариантов не существует, то найти всевозможные различные варианты.

Далее выведите \(t\) строк. Каждая из строк должна содержать один из вариантов. Вариант следует выводить как последовательность из \(m\) символов, где \(j\)-й символ равен '1', если \(j\)-я дорога включена в вариант и равен '0', если не включена. Дороги следует нумеровать в соответствии с их порядков во входных данных. Варианты выбора можно выводить в любом порядке. Все строки выведенные \(t\) строк должны быть различны.

Так как гарантируется, что \(m \cdot k \le 10^6\), то суммарный размер всех выведенных \(t\) строк не будет больше \(10^6\).

Если ответов несколько, выведите любой из них.

E. Военная задача

графы Деревья поиск в глубину и подобное *1600

В этой задаче вам требуется помочь Берляндской армии организовать их систему распространения приказов.

Всего в Берляндской армии есть \(n\) офицеров. Первый офицер — командующий армии, он не имеет никаких вышестоящих командующих. Любой другой офицер имеет ровно одного непосредственного командующего. Если офицер \(a\) является непосредственным командующим офицера \(b\), то можно сказать, что офицер \(b\) непосредственный подчиненный офицера \(a\).

Офицер \(x\) является подчиненным (непосредственным или по цепочке) офицера \(y\), если выполняется одно из следующих условий:

  • офицер \(y\) непосредственный командующий офицера \(x\);
  • непосредственный командующий офицера \(x\) является подчиненным офицера \(y\).

Например, на картинке ниже подчиненными офицера \(3\) являются: \(5, 6, 7, 8, 9\).

Структура Берляндской армии организована таким образом, что каждый офицер, кроме командующего, является подчиненным командующего армией.

Формально, Берляндская армия может быть представлена как дерево, состоящее из \(n\) вершин, в котором вершина \(u\) соответствует офицеру с номером \(u\). Предок вершины \(u\) соответствует непосредственному командующему офицера \(u\). Корень (который имеет номер \(1\)) соответствует командующему армией.

Военное министерство Берляндии приказало вам ответить на \(q\) запросов, \(i\)-й запрос представлен в виде \((u_i, k_i)\), где \(u_i\) — это некоторый офицер, а \(k_i\) — некоторое натуральное число.

Для обработки \(i\)-го запроса представим, как приказ, отданный офицером с номером \(u_i\) распространяется по поддереву \(u_i\). Этот алгоритм очень похож на DFS (depth first search, обход в глубину).

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

Посмотрим на следующий пример:

Если офицер \(1\) распространяет приказ, офицеры в его поддереве получат приказ в следующем порядке : \([1, 2, 3, 5 ,6, 8, 7, 9, 4]\).

Если офицер \(3\) распространяет приказ, офицеры в его поддереве получат приказ в следующем порядке: \([3, 5, 6, 8, 7, 9]\).

Если офицер \(7\) распространяет приказ, офицеры в его поддереве получат приказ в следующем порядке: \([7, 9]\).

Если офицер \(9\) распространяет приказ, офицеры в его поддереве получат приказ в следующем порядке: \([9]\).

Чтобы ответить на \(i\)-й запрос \((u_i, k_i)\), сформируем последовательность того, в каком порядке офицеры будут получать приказ, если \(u_i\)-й офицер начал его распространять. Ответом будет являться \(k_i\)-й элемент сформированной последовательности или -1, если в ней меньше \(k_i\) элементов.

Запросы необходимо рассматривать независимо. Запрос не затрагивает следующие запросы.

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

Первая строка входных данных содержит два целых числа \(n\) и \(q\) (\(2 \le n \le 2 \cdot 10^5, 1 \le q \le 2 \cdot 10^5\)) — количество офицеров в Берляндской армии и количество запросов.

Вторая строка входных данных содержит \(n - 1\) целое число \(p_2, p_3, \dots, p_n\) (\(1 \le p_i < i\)), где \(p_i\) — номер офицера, являющегося непосредственным командующим офицера с номером \(i\). Командующий армией имеет номер \(1\) и не имеет непосредственного командующего.

Следующие \(q\) строк описывают запросы. Запрос с номером \(i\) описан парой (\(u_i, k_i\)) (\(1 \le u_i, k_i \le n\)), где \(u_i\) — номер офицера, который начинает распространять приказ, и \(k_i\) — позиция требуемого офицера в порядке распространения приказа.

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

Выведите \(q\) чисел, где \(i\)-е число — это офицер на позиции \(k_i\) в порядке распространения приказа в поддереве офицера \(u_i\), если распространение приказа начинается с него. Выведите "-1", если количество офицеров, получивших приказ, меньше \(k_i\).

Запросы необходимо рассматривать независимо. Они не влияют друг на друга.

D. Марсоход

графы Деревья поиск в глубину и подобное реализация *2000

Наташа передвигалась по Марсу на марсоходе. Но неожиданно он сломался, а именно — логическая схема внутри него. Она представляет собой неориентированное дерево (связный ациклический граф) с корнем в вершине \(1\), в котором листья, не являющиеся корнем — входы, все остальные вершины — логические элементы, в том числе корень — выход. На каждый вход подается один бит. На выходе возвращается один бит.

Логические элементы бывают четырех видов: AND (И, \(2\) входа), OR (ИЛИ, \(2\) входа), XOR (исключающее ИЛИ, \(2\) входа), NOT (НЕ, \(1\) вход). Логические элементы принимают значения со своих прямых потомков (входов) и возвращают результат функции, которую они выполняют. Наташе известна логическая схема марсохода, а также то, что в ней сломался ровно один вход. Чтобы починить марсоход, ей нужно изменить значение на этом входе.

Для каждого входа определите, каким будет результат на выходе, если изменить именно этот вход.

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

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 10^6\)) — количество вершин графа (входов + элементов).

\(i\)-я из следующих \(n\) строк содержит описание \(i\)-й вершины: сначала идёт строка "AND", "OR", "XOR", "NOT" или "IN" (означает вход схемы) — тип вершины. Если эта вершина — "IN", то далее написано значение данного входа (\(0\) или \(1\)), в противном случае — номера вершин-входов данного элемента: "AND", "OR", "XOR" — \(2\) входа (номера вершин), "NOT" — \(1\) вход (номер вершины). Вершины нумеруются с единицы.

Гарантируется, что во входных данных задана корректная логическая схема с выходом в вершине \(1\).

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

Выведите строку из символов '0' и '1' (без кавычек) — ответы на задачу для каждого листка по порядку их сортировки по номеру вершины во входных данных.

Примечание

Изначальная схема из тестового примера (до изменения входа):

Зелёным цветом обозначены единичные биты, жёлтым — нулевые.

Если изменить бит на входе \(2\) на \(0\), то на выходе будет \(1\).

Если изменить бит на входе \(3\) на \(0\), то на выходе будет \(0\).

Если изменить бит на входе \(6\) на \(1\), то на выходе будет \(1\).

Если изменить бит на входе \(8\) на \(0\), то на выходе будет \(1\).

Если изменить бит на входе \(9\) на \(0\), то на выходе будет \(0\).

B. Химическая таблица

графы Конструктив матрицы поиск в глубину и подобное снм *1900

Учёные Иннополиса продолжили исследование периодической таблицы. Существуют n·m известных элементов, и они представлены в периодической таблице — прямоугольнике, состоящем из n строк и m столбцов. Каждый элемент может быть описан своими координатами в таблице (r, c) (1 ≤ r ≤ n, 1 ≤ c ≤ m).

Недавно учёные открыли, что для каждых четырёх различных элементов в этой таблице, которые образуют прямоугольник со сторонами, параллельными сторонам таблицы, если они имеют экземпляры трёх из четырёх элементов, то с помощью ядерного синтеза они могут произвести четвёртый элемент. Так, если имеются элементы с позиций (r1, c1), (r1, c2), (r2, c1), где r1 ≠ r2 и c1 ≠ c2, то можно произвести элемент (r2, c2).

Использованные экземпляры элементов не выбрасываются и могут быть использованы в дальнейшем для создания других элементов. Созданные элементы также могут в этом участвовать.

Учёные Иннополиса уже имеют образцы q элементов. Они хотят получить образцы всех n·m элементов таблицы. Чтобы добиться этого, они могут купить некоторые образцы в других лабораториях, а потом произвести остальные в некотором порядке. Помогите им определить, какое минимальное число элементов им надо купить.

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

Первая строка входных данных содержит три целых числа n, m, q (1 ≤ n, m ≤ 200 000; 0 ≤ q ≤ min(n·m, 200 000)) — размеры таблицы элементов и количество элементов, которые учёные уже имеют.

Следующие q строк содержат по два целых числа каждая: ri, ci (1 ≤ ri ≤ n, 1 ≤ ci ≤ m), которые описывают расположение уже имеющихся элементов в таблице.

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

Выведите минимальное количество элементов, которые надо купить.

Примечание

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

Тест 1

Мы можем получить недостающий элемент ядерным синтезом, поэтому не требуется ничего покупать.

Тест 2

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

Тест 3

Существует несколько возможных решений. Одно из них описано ниже.

Заметим, что непосредственно после покупки обозначенного красным элемента мы все еще не можем произвести элемент, обозначенный числом 4. Мы сможем это сделать только после получения элемента, обозначенного 1.

F. Проекты дорог

Деревья дп поиск в глубину и подобное *2600

Берляндия состоит из \(n\) городов, некоторые из которых соединены двусторонними дорогами таким образом, что между каждой парой вершин существует ровно один путь, проходящий по каждой дороге не более одного раза. Каждая дорога характеризуется своей длиной. Города пронумерованы от \(1\) до \(n\).

Время пути между некоторыми городами \(v\) и \(u\) — это суммарная длина дорог на кратчайшем пути из \(v\) в \(u\).

Два наиболее важных города Берляндии имеют номера \(1\) и \(n\).

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

Новая дорога может быть построена только между такими городами \(v\) и \(u\), что \(v \neq u\) и \(v\) и \(u\) еще не соединены никакой дорогой.

Они создали планы \(m\) возможных проектов. Каждый проект — это просто длина \(x\) новой дороги.

Поликарп работает главным аналитиком Министерства Транспорта Берляндии, разбираться с этими \(m\) проектами — его задача. Для \(i\)-го проекта он должен выбрать некоторые города \(v\) и \(u\) и построить новую дорогу длины \(x_i\) между ними так, чтобы время пути между самыми важными городами было максимально возможным.

К сожалению, Поликарп совсем не программист, да и никакой аналитик в мире не справится со всеми проектами с помощью лишь ручки и бумаги.

Поэтому он просит вас помочь ему посчитать максимально возможное время пути между самыми важными городами для каждого проекта. Обратите внимание, что \(v\) и \(u\) выбираются независимо для каждого проекта.

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

В первой строке записаны два целых числа \(n\) и \(m\) (\(3 \le n \le 3 \cdot 10^5\), \(1 \le m \le 3 \cdot 10^5\)) — количество городов и количество проектов, соответственно.

В каждой из следующих \(n - 1\) строк записаны по три целых числа \(v_i\), \(u_i\) и \(w_i\) (\(1 \le v_i, u_i \le n\), \(1 \le w_i \le 10^9\)) — описание \(i\)-й дороги. Гарантируется, что между каждой парой городов существует ровно один путь, проходящий по каждой дороге не более одного раза.

В каждой из следующих \(m\) строк записано по одному целому числу \(x_j\) (\(1 \le x_j \le 10^9\)) — длина дороги для \(j\)-го проекта.

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

Выведите \(m\) строк, \(j\)-я строка должна содержать одно целое число — максимально возможное время пути между самыми важными городами для \(j\)-го проекта.

Примечание

Сеть дорог из первого примера:

Можно построить дорогу длины \(1\) между городами \(5\) и \(6\), чтобы получить \(83\) в качестве времени пути между \(1\) и \(7\) (\(1 \rightarrow 2 \rightarrow 6 \rightarrow 5 \rightarrow 3 \rightarrow 4 \rightarrow 7\) \(=\) \(18 + 4 + 1 + 12 + 24 + 24 = 83\)). Другие доступные пары городов дадут ответ меньше или равный \(83\).

B. Бейджик

графы Перебор поиск в глубину и подобное *1000

Как вы, возможно, знаете в ЛКШ за плохое поведение ставят дырки в бейджик. Вот и сегодня один из суровых преподавателей поймал группу из \(n\) школьников за очередной проделкой. Пронумеруем для удобства школьников в этой группе от \(1\) до \(n\).

Преподаватель подошёл к школьнику \(a\) и поставил ему дырку в бейджик. Тот, правда, попытался оправдаться, что зачинщиком бы некоторый другой школьник \(p_a\).

После этого преподаватель подошёл к школьнику \(p_a\) и поставил дырку в бейджик и ему. Тот в ответ послал его к школьнику \(p_{p_a}\).

Так продолжалось некоторое время, но, так как количество школьников было конечно, то через некоторое время преподаватель пришёл к школьнику, которому он уже поставил дырку.

После этого он поставил в бейдж этого школьника вторую дырку и счёл на этом свой долг выполненным.

Вы не знаете с какого школьника \(a\) начал преподаватель. Но вы знаете все числа \(p_i\). Выясните для каждого возможного школьника \(a\) того школьника, которому была поставлена вторая дырка.

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

Первая строка входных данных содержит одно целое число \(n\) (\(1 \le n \le 1000\)) — количество нашкодивших школьников.

Вторая строка содержит \(n\) целых чисел \(p_1\), ..., \(p_n\) (\(1 \le p_i \le n\)), где \(p_i\) это номер школьника, к которому посылает преподавателя школьник под номером \(i\).

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

Для каждого школьника \(a\) от \(1\) до \(n\) выведите номер школьника, которому поставят две дырки, если преподаватель начнёт ставить дырки со школьника \(a\).

Примечание

Картинка иллюстрирует первый пример.

В первом примере, если \(a = 1\), то преподаватель подойдёт к школьникам \(1\), \(2\), \(3\), \(2\), тем самым вторую дырку получит школьник \(2\).

В первом примере, если \(a = 2\), то преподаватель подойдёт к школьникам \(2\), \(3\), \(2\) и школьник \(2\) получит вторую дырку в бейдж. Если \(a = 3\), то учитель подойдёт к школьникам \(3\), \(2\), \(3\), тем самым школьник \(3\) получит вторую дырку в бейджик.

Во втором примере с какого бы школьника не начал преподаватель, этот же школьник и будет тем, кто получит вторую дырку в бейджике.

F. Мобильная сеть

графы Деревья поиск в глубину и подобное снм *2600

Вы руководите мобильным оператором и хотите предлагать конкурентоспособные цены для создания сети.

В сети есть \(n\) узлов.

Ваш конкурент уже предложил некоторые подключения между узлами по некоторым фиксированным ценам. Эти подключения двусторонние. Всего ваш конкурент предложил \(m\) подключений. \(i\)-е из этих подключений соединяет узлы \(fa_i\) и \(fb_i\) и стоит \(fw_i\).

У вас есть список из \(k\) подключений, которые вы хотите предложить. Гарантируется, что эти подключения не образуют ни одного цикла. \(j\)-е из этих подключений соединит вершины \(ga_j\) и \(gb_j\). Эти подключения тоже двусторонние. Вы еще не определились с ценой каждого из подключений.

Вы можете выбрать стоимости этих подключений любыми целыми числами независимо для каждого из подключений. После этого клиент выберет \(n - 1\) такое подключение из предложенных вами и вашим конкурентом, что все узлы будут объединены в единую сеть, а суммарная стоимость данных подключений будет минимальна. Если существует несколько способов сделать такой выбор, клиент выберет такой, где число ваших подключений максимально.

Вы хотите предложить такие цены, что клиент выберет все \(k\) ваши подключения, а суммарная стоимость этих подключений максимально возможная.

Выведите эту максимально возможную суммарную стоимость, или \(-1\), если она не ограничена.

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

Первая строка содержит три целых числа \(n\), \(k\) и \(m\) (\(1 \leq n, k, m \leq 5 \cdot 10^5, k \leq n-1\)) — количество узлов, количество ваших подключений, количество подключений, предложенных конкурентом, соответственно.

Каждая из следующих \(k\) строк содержит два целых числа \(ga_i\) и \(gb_i\) (\(1 \leq ga_i, gb_i \leq n\), \(ga_i \not= gb_i\)), описывающее ваше подключение между узлами \(ga_i\) и \(gb_i\). Гарантируется, что эти подключения не образуют цикла.

Следующие \(m\) строк содержат по три целых числа \(fa_i\), \(fb_i\) и \(fw_i\) (\(1 \leq fa_i, fb_i \leq n\), \(fa_i \not= fb_i\), \(1 \leq fw_i \leq 10^9\)), описывающие подключение, предложенное конкурентом между узлами \(fa_i\) и \(fb_i\) по цене \(fw_i\). Среди этих подключений нет таких, которые соединяют узел сам с собой, а также нескольких подключений между одной и той же парой узлов. Кроме того, эти подключения заданы в порядке возрастания цены (то есть \(fw_{i-1} \leq fw_i\) для всех \(i\)).

Обратите внимание, некоторые подключения могут присутствовать как в вашем списке, так и в списке конкурента (но ни одно не будет присутствовать дважды в одном списке).

Гарантируется, что объединение ваших подключений и подключений конкурента связывает все узлы.

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

Выведите единственное число — максимально возможную прибыль, если вы можете произвольно выбирать стоимости ваших подключений. Если прибыль неограничена, выведите \(-1\).

Примечание

В первом примере оптимально дать стоимость \(3\) подключению \(1-3\), стоимость \(3\) подключению \(1-2\), стоимость \(8\) подключению \(3-4\). В таком случае самый дешевый способ получить связную сеть стоит \(14\), и клиент из таких способов выберет тот, которые содержит все ваши подключения.

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

D. Охота за мышью

графы поиск в глубину и подобное *1700

Медицинский факультет Берляндского Государственного Университета недавно завершил свою приемную кампанию. Как обычно, порядка \(80\%\) абитуриентов — девушки, и большинство из них планируют жить в общежитии в ближайшие \(4\) (в лучшем случае) года.

Общежитие состоит из \(n\) комнат и единственной мыши! Девушки решили установить ловушки для мышей в некоторых комнатах, чтобы избавиться от страшного монстра. Установка ловушки в \(i\)-й комнате стоит \(c_i\) бурлей. Комнаты пронумерованы от \(1\) до \(n\).

Мышь не сидит все время на месте, она постоянно бегает. Если она находилась в комнате \(i\) в секунду \(t\), то к секунде \(t + 1\) она перебежит в комнату \(a_i\), не посещая больше никаких других комнат (\(i = a_i\) значит, что мышь не покинет комнату \(i\)). История начинается с секунды \(0\). Если мышь находится в комнате с ловушкой, то она оказывается поймана в эту ловушку.

И все было бы довольно просто, если бы девушки знали, где мышь находится. К сожалению, это не так, мышь может быть в любой комнате от \(1\) до \(n\) в секунду \(0\).

Какое минимальное количество бурлей девушки должны потратить на установку ловушек, чтобы гарантировать, что мышь будет поймана вне зависимости от комнаты, в которой она начинала.

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

В первой строке записано одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество комнат в общежитии.

Во второй строке записаны \(n\) целых чисел \(c_1, c_2, \dots, c_n\) (\(1 \le c_i \le 10^4\)) — \(c_i\) — стоимость установки ловушки в комнату \(i\).

В третьей строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\)) — \(a_i\) — комната, в которую перебежит мышь к следующей секунде, из комнаты \(i\).

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

Выведите единственное целое число — минимальное количество бурлей, которое девушки должны потратить на установку ловушек, чтобы гарантировать, что мышь будет поймана вне зависимости от комнаты, в которой она начинала.

Примечание

В первом примере достаточно установить ловушку в комнаты \(1\) и \(4\). Если мышь начнет в комнате \(1\), то будет поймана сразу. Если мышь начнет в любой другой комнате, то она прибежит в комнату \(4\) рано или поздно.

Во втором примере достаточно установить ловушку в комнату \(2\). Если мышь начнет в комнате \(2\), то будет поймана сразу. Если мышь начнет в любой другой комнате, то она прибежит в комнату \(2\) в секунду \(1\).

Пути мыши, начиная с каждой комнаты, для третьего примера:

  • \(1 \rightarrow 2 \rightarrow 2 \rightarrow \dots\);
  • \(2 \rightarrow 2 \rightarrow \dots\);
  • \(3 \rightarrow 2 \rightarrow 2 \rightarrow \dots\);
  • \(4 \rightarrow 3 \rightarrow 2 \rightarrow 2 \rightarrow \dots\);
  • \(5 \rightarrow 6 \rightarrow 7 \rightarrow 6 \rightarrow \dots\);
  • \(6 \rightarrow 7 \rightarrow 6 \rightarrow \dots\);
  • \(7 \rightarrow 6 \rightarrow 7 \rightarrow \dots\);

Поэтому достаточно установить ловушки в комнатах \(2\) и \(6\).

F. Сессия в БГУ

Бинарный поиск графы Паросочетания поиск в глубину и подобное снм *2400

Поликарп учится в Берляндском государственном университете. Совсем скоро ему предстоит сдать сессию. Он должен сдать \(n\) экзаменов.

Для каждого экзамена \(i\) известны два дня: \(a_i\) — день основной сдачи экзамена, \(b_i\) — день пересдачи (\(a_i < b_i\)). В один день Поликарп может сдавать не более одного экзамена. Для каждого экзамена Поликарп самостоятельно выбирает, в какой из двух дней его сдать. Необходимо сдать все \(n\) экзаменов.

Поликарп хочет сдать сессию как можно быстрее. Выведите минимальный номер дня, в который Поликарп сможет сдать все \(n\) экзаменов, либо выведите -1, если сдать сессию полностью невозможно.

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

В первой строке входных данных записано одно целое число \(n\) (\(1 \le n \le 10^6\)) — количество экзаменов.

В следующих \(n\) строках записаны по два целых числа \(a_i\) и \(b_i\) (\(1 \le a_i < b_i \le 10^9\)), где \(a_i\) означает день основной сдачи \(i\)-го экзамена, а \(b_i\) означает день пересдачи \(i\)-го экзамена.

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

Если Поликарп не сможет сдать все \(n\) экзаменов, выведите -1. В противном случае выведите минимальный номер дня, когда Поликарп сможет это сделать.

B. Ктулху

графы поиск в глубину и подобное снм *1500

...И пошел старик к синему морю; видит, на море черная буря. Стал он кликать золотую рыбку, но, увы, появился лишь Ктулху...

А на другом конце земного шара Пентагон уже вовсю собирает данные, прогнозирует поведение монстра и готовит сверхсекретное супероружие. Из-за высокой сейсмической активности и плохих погодных условий до сих пор не удалось сделать качественные фотоснимки со спутников. Результатом первичного анализа объекта оказался неориентированный граф c n вершинами и m ребрами. Теперь лучшим умам мира предстоит определить, можно ли считать этот граф Ктулху или нет.

Для простоты предположим, что Ктулху из космоса выглядит как некоторое сферическое тело, к которому прикреплены отростки-щупальца. Формально, Ктулху назовем такой неориентированный граф, который может быть представлен как набор из трех или более корневых деревьев, корни которых соединены простым циклом.

Гарантируется, что граф не содержит кратных ребер и петель.

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

В первой строке даны два целых числа — количество вершин n и количество ребер m графа (1 ≤ n ≤ 100, 0 ≤ m ≤ ).

В каждой из последующих m строк записаны пары целых чисел x и y, которые обозначают существование ребра между вершинами x и y в графе (1 ≤ x, y ≤ n, x ≠ y). Гарантируется, что граф не содержит кратных ребер и петель.

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

Выведите «NO», если граф не является Ктулху, и «FHTAGN!» в противном случае.

Примечание

Простым циклом назовем множество из v вершин, которые можно пронумеровать так, что будут существовать ребра только между вершинами с номерами 1 и 2, 2 и 3, ..., v - 1 и v, v и 1.

Дерево — связный неориентированный граф из n вершин и n - 1 ребер (n > 0).

Корневое дерево — дерево, в котором выделена одна вершина, корень.

A. Побег короля

графы поиск в глубину и подобное реализация *1000

Алиса и Боб играют в шахматы на большом поле с размерами \(n \times n\). У Алисы осталась только одна фигура — ферзь, который находится в позиции \((a_x, a_y)\), а у Боба остался только король, расположенный на \((b_x, b_y)\). Алиса считает, что поскольку её ферзь доминирует на поле, то победа уже её.

Но Боб придумал хитрый план, который принесет ему победу, для этого ему нужно передвинуть его короля на позицию \((c_x, c_y)\). Поскольку Алису отвлекает её чувство превосходства, она больше не передвигает её фигуру, поэтому только Боб может передвигать его фигуру.

Боб победит, если он может передвинуть его короля с позиции \((b_x, b_y)\) на \((c_x, c_y)\), не попадая под шах. Не забудьте, что король может передвигаться только в соседние \(8\) ячеек. Король находится под шахом, если находится в той же строке, столбце или диагонали, что и ферзь.

Определите, сможет ли Боб победить или нет.

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

Первая строка содержит одно целое число \(n\) (\(3 \leq n \leq 1000\)) — размеры шахматного поля.

Вторая строка содержит два целых числа \(a_x\) и \(a_y\) (\(1 \leq a_x, a_y \leq n\)) — координаты ферзя Алисы.

Третья строка содержит два целых числа \(b_x\) и \(b_y\) (\(1 \leq b_x, b_y \leq n\)) — координаты короля Боба.

Четвёртая строка содержит два целых числа \(c_x\) и \(c_y\) (\(1 \leq c_x, c_y \leq n\)) — координаты позиции, куда Боб хочет передвинуть его короля.

Гарантируется, что король Боба не находится под шахом и то, что конечная точка тоже не под шахом.

Кроме того, король не находится на том же квадрате, что и ферзь (то есть \(a_x \neq b_x\) или \(a_y \neq b_y\)), и конечная точка не совпадает ни с позицией ферзя (то есть \(c_x \neq a_x\) или \(c_y \neq a_y\)), ни с позицией короля (то есть \(c_x \neq b_x\) или \(c_y \neq b_y\)).

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

Выведите «YES» (без кавычек), если Боб может попасть из позиции \((b_x, b_y)\) в \((c_x, c_y)\), не попадая под шах, иначе выведите «NO».

Вы можете выводить каждую из букв в любом регистре (строчную или заглавную).

Примечание

На приведенных ниже рисунках квадраты, контролируемые черным ферзем, отмечены красным цветом, а квадрат, куда Боб хочет передвинуть короля, обозначен синим.

В первом примере король может достичь цели, например, через квадраты \((2, 3)\) и \((3, 2)\). Обратите внимание, что прямой маршрут через \((2, 2)\) попадает под шах.

Во втором примере ферзь контролирует четвёртую строку, и король не может её пересечь.

В третьем примере ферзь контролирует третий столбец.

E. Спрятанный двудольный граф

Бинарный поиск графы интерактив Конструктив поиск в глубину и подобное *2800

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

Единственный вопрос, который может задать Алиса, заключается в следующем: она дает Бобу \(s\) — подмножество вершин исходного графа, а он отвечает ей, сколько есть ребер в графе, которые соединяют две вершины в \(s\). Поскольку он не хочет, чтобы Алиса задавала слишком много вопросов, он разрешает ей задать не более \(20000\) вопросов. Кроме того, он подозревает, что Алиса может вводить ложные сообщения в их канал связи, поэтому, когда Алиса наконец сообщит ему, является ли граф двудольным или нет, ей также необходимо предоставить доказательство — или само разделение, или цикл нечетной длины.

Ваша задача — помочь Алисе задавать запросы и проверить, является ли граф двудольным.

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

Первая строка содержит одно целое число \(n\) (\(1 \leq n \leq 600\)) — количество вершин в графе Боба.

Протокол взаимодействия

Сначала считайте одно целое число \(n\) (\(1\leq n\leq 600\)) — количество вершин в графе Боба.

Чтобы сделать запрос, выведите две строки. Первая в формате «? k» (\(1 \leq k \leq n\)), где \(k\) — количество вершин в запросе. Вторая строка должна содержать \(k\) различных чисел \(s_1, s_2, \dots, s_k\) (\(1 \leq s_i \leq n\)) — вершины в запросе.

После каждого запроса нужно считать одно целое число \(m\) (\(0 \leq m \leq \frac{n(n-1)}{2}\)) — количество ребер, которые соединяют вершины в множестве \(\{s_i\}\).

Вы не можете задать более \(20000\) запросов.

Если \(m = -1\), то это значит, что вы задали больше вопросов, чем можно, или то, что вы вывели некорректный запрос. Ваша программа должна немедленно завершиться (например, вызывая функцию exit(0)). Вы получите вердикт Wrong Answer; это значит, что вы задали слишком много вопросов, или то, что вы задали некорректный запрос. Если вы это проигнорируете, вы можете получить любой другой вердикт, так как вы будете продолжать считывать из закрытого потока.

После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Когда вы уже знаете ответ, вам нужно его вывести.

Формат вывода зависит от того, является ли граф двудольным, или нет.

Если граф двудольный, выведите две строки. Первая строка должна содержать букву «Y» (которая значит «YES»), после нее должен идти пробел и одно целое число \(s\) (\(0 \leq s \leq n\)) — количество вершин в первой доли графа. Вторая строка должна содержать \(s\) целых чисел \(a_1, a_2, \dots, a_s\) — вершины, принадлежащие первой доли. Все \(a_i\) должны быть различны, и все ребра в главном графе должны иметь только один конец в \(\{a_i\}\).

Если граф не является двудольным, выведите две строки. Первая строка должна содержать букву «N» (которая значит «NO»), после нее должен идти пробел и одно целое число \(l\) (\(3 \leq l \leq n\)) — длина простого цикла нечетной длины. Вторая строка должна содержать \(l\) целых чисел \(c_1, c_2, \dots, c_l\) — вершины цикла. Должно выполнятся условие, что для любого \(1 \leq i \leq l\) должно быть ребро \(\{c_i, c_{(i \mod l)+1}\}\) в главной графе, и все \(c_i\) должны быть различны. Если существует несколько решений, выведите любое из них.

Входные данные для взломов

Для взломов вам нужно использовать специальный формат.

Первая строка содержит два целых числа \(n\) и \(m~(1 \leq n \leq 600, 0 \leq m \leq \frac{n(n-1)}{2})\) — количество вершин и ребер в графе.

Каждая из следующих \(m\) строк содержит два целых числа \(u_i\) и \(v_i~(1 \leq u_i, v_i \leq n)\), которые значат, что существует ребро между вершинами \(u_i\) и \(v_i\). Не должно быть кратных ребер и петель, также граф должен быть связным.

Например, чтобы получить первый пример, нужно ввести такой тест:


4 4
4 1
1 3
3 2
2 4
Примечание

В первом примере Алиса узнает, что в графе есть \(4\) ребра. В следующих трех запросах она узнает, что вершина \(1\) имеет ребра с двумя вершинами: \(3\) и \(4\). Затем она узнает, что, хотя вершина \(2\) имеет ребро с \(4\), вершина \(3\) не имеет ребро с \(4\). Остается только одно возможное местоположение для оставшегося ребра — это \((2, 3)\). Это значит, что граф представляет собой цикл из четырех вершин, причем \((1, 2)\) является первой долей, а \((3, 4)\) второй. Здесь также можно вывести «3 4» как ответ.

Во втором примере мы также имеем граф из четырех вершин и четырех ребер. Во втором запросе Алиса узнает, что между вершинами \((1, 2, 4)\) есть три ребра. Единственный способ, при котором такое может произойти, это тогда, когда они образуют треугольник. Поскольку треугольник не является двудольным, Алиса может использовать это как доказательство того, что граф не является двудольным. Заметьте, что она не узнала, где находится четвертое ребро, но она в любом случае может уже ответить Бобу.

G. Истоки и стоки

битмаски Перебор поиск в глубину и подобное *2700

Задан ацикличный ориентированный граф, состоящий из \(n\) вершин и \(m\) ребер. Граф не содержит кратных ребер и петель.

Вершина называется истоком, если в нее не входит ребер. Вершина называется стоком, если из нее не исходит ребер. Эти определения подразумевают, что некоторые вершины могут быть одновременно истоком и стоком.

Количество истоков в графе равно количеству стоков, и это число не превосходит \(20\).

К графу применяется следующий алгоритм:

  1. если в графе нет истоков и стоков, то выйти;
  2. выбрать произвольный исток \(s\), произвольный сток \(t\), добавить ребро из \(t\) в \(s\) в граф и перейти к шагу \(1\) (эта операция удаляет \(s\) из истоков и \(t\) из стоков). Обратите внимание, что \(s\) и \(t\) могут быть одной и той же вершиной, тогда добавляется петля.

В конце проверяется, стал ли граф сильно связным (любая вершина достижима из любой другой).

Ваша задача — проверить, что граф становится сильно связным вне зависимости от выбора истоков и стоков на втором шаге алгоритма.

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

В первой строке записаны два целых числа \(n\) и \(m\) (\(1 \le n, m \le 10^6\)) — количество вершин и количество ребер в графе, соответственно.

В каждой из следующих \(m\) строк записаны по два целых числа \(v_i, u_i\) (\(1 \le v_i, u_i \le n\), \(v_i \ne u_i\)) — описание \(i\)-го ребра изначального графа.

Гарантируется, что количество истоков равно количеству стоков, и это число не превышает \(20\). Гарантируется, что граф не содержит кратных ребер. Гарантируется, что граф не содержит циклов.

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

Выведите «YES», если граф становится сильно связным вне зависимости от выбора истоков и стоков на втором шаге алгоритма. В противном случае выведите «NO».

D. Корректный BFS?

графы Деревья кратчайшие пути поиск в глубину и подобное *1700

Алгоритм BFS определяется следующим образом.

  1. Алгоритм выполняется над некоторым неориентированным графом, вершины которого пронумерованы от \(1\) до \(n\). Инициализируем \(q\) как новую очередь, содержащую только вершину \(1\), также пометим вершину \(1\) как использованную.
  2. Извлечем вершину \(v\) из начала очереди \(q\).
  3. Напечатаем номер вершины \(v\).
  4. Переберем в произвольном порядке все вершины \(u\) такие, что \(u\) является соседом \(v\) и ещё не помечена как использованная. Пометим вершину \(u\) как использованную и добавим в конец очереди \(q\).
  5. Если очередь не является пустой, продолжим выполнение с шага 2.
  6. В противном случае закончим.

Так как порядок обхода соседей в каждой вершине не является фиксированным, то для данного графа BFS может вывести несколько различных последовательностей.

В данной задаче вам нужно проверить, может ли данная последовательность соответствовать какому-то запуску BFS на заданном дереве, начиная с вершины \(1\). Деревом называется неориентированный граф, в котором между каждой парой вершин есть ровно один простой путь.

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

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)), обозначающее количество вершин в дереве.

Следующие \(n - 1\) строк задают рёбра дерева. Каждая из них содержит два целых числа \(x\) и \(y\) (\(1 \le x, y \le n\)) — концы соответствующего ребра дерева. Гарантируется, что заданный граф является деревом.

Последняя строка содержит \(n\) различных целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le n\)) — последовательность, которую вам нужно проверить.

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

Выведите «Yes» (без кавычек), если порядок вершин соответствует какому-то корректному BFS на данном дереве, и «No» (без кавычек) иначе.

Вы можете выводить каждую из букв в любом регистре (строчную или заглавную).

Примечание

Оба теста из примеров содержат одинаковое дерево.

Для этого дерева существует два возможных порядка вершин, соответствующих какому-то запуску BFS.

  • \(1, 2, 3, 4\),
  • \(1, 3, 2, 4\).

Порядок вершин \(1, 2, 4, 3\) не может получится в результате BFS.

E. Наибольшее паросочетание

битмаски графы дп Перебор поиск в глубину и подобное *2400

Вам даны \(n\) блоков, каждый из которых выглядит как [color\(_1\)|value|color\(_2\)], при чём блок можно также перевернуть, чтобы получить [color\(_2\)|value|color\(_1\)].

Назовём последовательность блоков корректной, если касающиеся концы блоков совпадают по цветам. Например, последовательность из трёх блоков A, B и C является корректной, если левый цвет B совпадает с правым цветом A и правый цвет B совпадает с левым цветом C.

Ценность последовательности равна сумме ценностей (value) отдельных блоков в ней.

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

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

Первая строка входных данных содержит одно целое число \(n\) (\(1 \le n \le 100\)).

Каждая из следующих \(n\) строчек описывает очередной блок и состоит из трёх целых чисел \(\mathrm{color}_{1,i}\), \(\mathrm{value}_i\) и \(\mathrm{color}_{2,i}\) (\(1 \le \mathrm{color}_{1,i}, \mathrm{color}_{2,i} \le 4\), \(1 \le \mathrm{value}_i \le 100\,000\)).

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

Выведите ровно одно целое число — максимальная суммарная ценность блоков, образующих корректную последовательность.

Примечание

В первом примере возможно составить корректную подпоследовательность из всех блоков.

Один из корректных способов следующий:

[4|2|1] [1|32|2] [2|8|3] [3|16|3] [3|4|4] [4|1|2]

Первый блок из входных данных ([2|1|4] \(\to\) [4|1|2]) и второй ([1|2|4] \(\to\) [4|2|1]) перевёрнуты.

Во втором примере один из оптимальных ответов состоит только из первых трёх блоков упорядоченных следующим образом (второй или третий блок из входных данных перевёрнут):

[2|100000|1] [1|100000|1] [1|100000|2]

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

C. Безопасность сети

графы математика поиск в глубину и подобное снм сортировки *2200

К компьютерной сети Метрополии подключены \(n\) серверов, каждому из которых назначен некоторый ключ шифрования, выбранный в диапазоне от \(0\) до \(2^k - 1\) включительно. Обозначим через \(c_i\) ключ шифрования, назначенный \(i\)-му серверу. Также некоторые \(m\) пар серверов напрямую соединены каналом передачи данных. Из-за особенностей используемых алгоритмов шифрования канал передачи данных безопасен, только если два соединённых этим каналом сервера используют различные ключи шифрования. Изначально ключи шифрования выбраны таким образом, что все каналы передачи данных безопасны.

Вам стало известно, что по интернету активно распространяется новый вирус, который при заражении им какого-либо сервера Метрополии изменяет его ключ шифрования. А именно, в теле вируса хранится некоторое неизвестное вам число \(x\), выбранное в том же диапазоне, и если вирусом заразится сервер \(i\), то его ключ шифрования изменится с \(c_i\) на \(c_i \oplus x\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ.

К сожалению, вы не знаете ни число \(x\), ни какие именно серверы Метрополии будут заражены опасным вирусом, поэтому решили посчитать количество вариантов, при которых безопасность каналов нарушена не будет. Формально, вам требуется найти количество пар \((A, x)\), где \(A\) — некоторое подмножество серверов (возможно пустое), а \(x\) — возможное значение внутреннего параметра вируса в диапазоне от \(0\) до \(2^k - 1\) включительно, таких что если вирус с параметром \(x\) заразит компьютеры из подмножества \(A\), а остальные компьютеры заражены не будут, то все каналы передачи данных останутся безопасными. Поскольку эта величина может быть достаточно большой, найдите остаток от её деления на \(10^9 + 7\).

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

В первой строке входных данных записаны три целых числа \(n\), \(m\) и \(k\) (\(1 \leq n \leq 500\,000\), \(0 \leq m \leq \min(\frac{n(n - 1)}{2}, 500\,000)\), \(0 \leq k \leq 60\)) — количество серверов, количество пар серверов, непосредственно соединённых каналом передачи данных, и параметр \(k\), определяющий диапазон возможных значений ключа шифрования.

Следующая строка содержит \(n\) целых чисел \(c_i\) (\(0 \leq c_i \leq 2^k - 1\)), \(i\)-е из которых соответствует ключу шифрования, используемому на \(i\)-м сервере.

Следующие \(m\) строк содержат по два целых числа \(u_i\) и \(v_i\) (\(1 \leq u_i, v_i \leq n\), \(u_i \ne v_i\)), означающих, что эти два сервера соединены каналом передачи данных. Гарантируется, что любая пара серверов встречается в этом списке не более одного раза.

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

В единственной строке выходного файла выведите одно число — количество удачных исходов заражения какого-то подмножества компьютеров вирусом по модулю \(10^9 + 7\).

Примечание

Рассмотрим первый пример.

Возможные значения числа \(x\), содержащегося в вирусе, равны \(0\), \(1\), \(2\) и \(3\).

Для значений \(0\), \(2\) и \(3\) вирус может заразить любое подмножество серверов, что дает нам \(16\) исходов для каждого значения. Если же вирус содержит число \(1\), то он может заразить либо все серверы, либо ни одного. Таким образом, количество удачных исходов равно \(16 + 2 + 16 + 16 = 50\).

F. Множества листьев

графы Деревья жадные алгоритмы поиск в глубину и подобное снм сортировки Структуры данных *2400

Вам дано неориентированное дерево, состоящее из \(n\) вершин.

Назовём вершину листом, если она соединена ровно с одной другой вершиной.

Под расстоянием между двумя вершинами будем понимать количество рёбер на кратчайшем пути между этими вершинами.

Назовем некоторое множество листьев красивым, если максимальное расстояние между любой парой листьев из этого множества не превышает \(k\).

Перед вами стоит задача разделить все листья дерева на непересекающиеся красивые множества. Определите минимальное количество множеств, которые можно получить в результате описанного разделения.

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

В первой строке следуют два целых числа \(n\) и \(k\) (\(3 \le n \le 10^6\), \(1 \le k \le 10^6\)) — количество вершин в дереве и максимальное расстояние между парой листьев, принадлежащих одному красивому множеству.

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

Гарантируется, что описанные рёбра формируют дерево.

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

Выведите минимальное количество красивых множеств в разбиении всех листьев.

Примечание

Картинка описывает разбиение дерева из первого примера.

B. Пересекающиеся поддеревья

Деревья интерактив поиск в глубину и подобное *1900

Вы играете в странную игру с Ли Ченом. У вас есть дерево с \(n\) вершинами, нарисованное на листе бумаги. Вершины дерева не пронумерованы, но различимы. Каждый из вас независимо пронумеровал вершины целыми числами от \(1\) до \(n\). Вы не знаете нумерацию друг друга.

Вы и Ли Чен выбрали по поддереву (то есть связному подграфу) в этом дереве. При этом ваше поддерево в вашей нумерации состоит из вершин \(x_1, x_2, \ldots, x_{k_1}\), а поддерево Ли Чена в его нумерации состоит из вершин \(y_1, y_2, \ldots, y_{k_2}\). Значения \(x_1, x_2, \ldots, x_{k_1}\) и \(y_1, y_2, \ldots, y_{k_2}\) известны вам обоим.

На рисунке показаны две нумерации дерева: слева ваша нумерация, а справа — Ли Чена. Поддеревья, которые вы выбрали, выделены. В этих поддеревьев две общие вершины.

Вы хотите узнать, есть ли хотя бы одна общая вершина у ваших поддеревьев. К счастью, ваш друг Андрей знает ваши с Ли Ченом нумерации. Вы можете спросить у Андрея не более \(5\) вопросов, каждый из которых один из следующих двух типов:

  • A x: Андрей посмотрит на вершину \(x\) в вашей нумерации и скажет вам ее номер в нумерации Ли Чена;
  • B y: Андрей посмотрит на вершину \(y\) в нумерации Ли Чена и скажет вам ее номер в вашей нумерации.

Выясните, есть ли общая вершина у ваших поддеревьев. Если есть, то найдите обозначение любой одной из этих вершин в вашей нумерации.

Протокол взаимодействия

Каждый тест состоит из нескольких тестовых случаев.

Сначала считайте строку, которая содержит одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество тестовых случаев.

Далее для каждого тестового случая ваша программа должна взаимодействовать с программой жюри следующим образом.

В первой строке считайте одно целое число \(n\) (\(1 \leq n \leq 1\,000\)) — количество вершин в дереве.

Далее в каждой из следующих \(n-1\) строк считайте два целых числа \(a_i\) и \(b_i\) (\(1\leq a_i, b_i\leq n\)) — ребро дерева, которое соединяет вершины \(a_i\) и \(b_i\), в соответствии с вашей нумерацией вершин.

В следующей строке считайте одно целое число \(k_1\) (\(1 \leq k_1 \leq n\)) — количество вершин в вашем поддереве.

Следующая строка содержит \(k_1\) различных целых чисел \(x_1,x_2,\ldots,x_{k_1}\) (\(1 \leq x_i \leq n\)) — номера вершин в вашем поддереве, в соответствии с вашей нумерацией. Гарантируется, что эти вершины формируют поддерево.

Следующая строка содержит одно целое число \(k_2\) (\(1 \leq k_2 \leq n\)) — количество вершин в поддереве Ли Чена.

Следующая строка содержит \(k_2\) различных целых чисел \(y_1, y_2, \ldots, y_{k_2}\) (\(1 \leq y_i \leq n\)) — номера (в соответствии с нумерацией Ли Чена) вершин поддерева Ли Чена. Гарантируется, что вершины формируют поддерево, если мы применим скрытую перестановку Ли Чена на дереве, чтобы перенумеровать вершины.

Тесты будут предоставляться друг за другом, поэтому вы должны завершить взаимодействие с предыдущим тестовым случаем (то есть, выведя номер общей вершины или \(-1\), если такой вершины нет), чтобы начать получать следующий.

Далее вы можете задавать Андрею два разных типа вопросов.

  • Вы можете вывести «A x» (\(1 \leq x \leq n\)). Это значит, что Андрей посмотрит на вершину \(x\) в вашей нумерации и скажет вам, какой номер имеет эта вершина в нумерации Ли Чена.
  • Вы можете вывести «B y» (\(1 \leq y \leq n\)). Это значит, что Андрей посмотрит на вершину \(y\) в нумерации Ли Чена и скажет вам, какой номер имеет эта вершина в вашей нумерации.

Вы можете задать не более \(5\) вопросов в одном тестовом случае.

Когда вы готовы отвечать, выведите «C s», где \(s\) — либо номер в вашей нумерации любой из вершин, которая есть в обоих поддеревьях, либо \(-1\), если таких нет. Вывод ответа не считается вопросом. Не забудьте сбросить буфер вывода, чтобы перейти к следующему тестовому случаю.

После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Если программа жюри возвращает \(-1\) вместо ответа на запрос, это значит, что вы задали больше вопросов, чем разрешено, или задали недопустимый вопрос. Ваша программа должна немедленно завершиться (например, вызовом функции exit(0)). Вы получите вердикт Wrong Answer; это значит, что вы задали слишком много вопросов, или то, что вы задали некорректный запрос. Если вы это проигнорируете, вы можете получить любой другой вердикт, так как вы будете продолжать считывать из закрытого потока.

Входные данные для взломов

Чтобы взломать, используйте следующий формат. Обратите внимание, что вы можете взламывать только с одним тестовым случаем.

Первая строка должна содержать одне целое число \(t\) (\(t=1\)).

Вторая строка должна содержать одно целое число \(n\) (\(1 \leq n \leq 1\,000\)).

Третья строка содержит \(n\) целых чисел \(p_1, p_2, \ldots, p_n\) (\(1\leq p_i\leq n\)) — скрытая перестановка от \(1\) до \(n\). Эта перестановка задает нумерацию, которую использует Ли Чен. То есть вершина, которая у вас имеет номер \(i\), имеет номер \(p_i\) в нумерации Ли Чена.

Каждая из следующих \(n-1\) строк должна содержать два целых числа \(a_i\) и \(b_i\) (\(1\leq a_i, b_i\leq n\)). Эти ребра должны формировать дерево.

Следующая строка должна содержать одно целое число \(k_1\) (\(1 \leq k_1 \leq n\)).

Следующая строка должна содержать \(k_1\) различных целых чисел \(x_1,x_2,\ldots,x_{k_1}\) (\(1 \leq x_i \leq n\)). Эти вершины должны формировать поддерево.

Следующая строка должна содержать одно целое число \(k_2\) (\(1 \leq k_2 \leq n\)).

Следующая строка должна содержать \(k_2\) различных целых чисел \(y_1, y_2, \ldots, y_{k_2}\) (\(1 \leq y_i \leq n\)). Эти вершины должны формировать поддерево в нумерации Ли Чена.

Примечание

В первом примере \([2, 3, 1]\) является скрытой перестановкой Ли Чена, а во втором примере его скрытой перестановкой является \([5, 3, 2, 4, 1, 6]\).

В первом примере есть дерево из трех вершин. Сверху расположено дерево в вашей нумерации и поддерево, которое вы выбрали, а внизу расположено дерево пронумерованное Ли Ченом и его поддерево:

Первым вопросом вы можете попросить Андрея посмотреть на вершину \(1\) в вашей нумерации и сказать её в нумерации Ли Чена. Андрей ответит \(2\). В этот момент вы знаете, что оба ваших поддеревья содержат одну и ту же вершину (то есть вершину \(1\), в соответствии с вашей нумерацией), значит вы могли бы вывести «C 1» и закончить. Однако, вы просите Андрея посмотреть, как обозначена вершина \(2\) в нумерации Ли Чена и сказать её номер в вашей нумерации. Андрей ответит \(1\) (этот вопрос был показан по единственной причине — показать вам как задавать вопросы).

Во втором примере есть два тестовых случая. Первый выглядит так же, как и пример в условии:

Сначала мы спросим «B 2», и Андрей ответит \(3\). В таком случае, мы знаем, что \(3\) является общей вершиной, и более того, любое поддерево с размером \(3\), которое имеет вершину \(3\), так же будет содержать вершину \(1\), то есть мы может вывести либо "C 1", либо "C 3".

Во втором тестовом случае второго примера:

В таком случае, вы знаете что есть только одно поддерево с размером \(3\), которое не содержит вершину \(1\), — это \(4,5,6\). Вы спрашиваете Андрея номер вершины \(1\) в нумерации Ли Чена. Он отвечает \(5\). В таком случае, вы знаете, что поддерево Ли Чена не содержит \(1\), значит его поддерево должно содержать \(4,5,6\) (в его нумерации), по этому два поддерева не имеют общих вершин.

C. Гиперпространственная магистраль

графы Деревья поиск в глубину и подобное *2300

В неуказанной Солнечной системе есть \(N\) планет. Космическая правительственная компания недавно наняла космических подрядчиков, чтобы построить \(M\) двусторонних шоссе Hyperspace™, каждое из которых соединяет пару разных планет. Основная цель, заключавшаяся в том, чтобы убедиться, что любая планета может быть достигнута из любой другой планеты, используя только шоссе Hyperspace™, была полностью выполнена. К сожалению, у многих космических подрядчиков были друзья и двоюродные братья в космическом совете директоров компании, поэтому компания решила сделать нечто большее, чем просто соединение всех планет.

Для того, чтобы оправдать траты огромных сумм космических денег на магистрали Hyperspace™, они решили ввести жесткое правило на сети Hyperspace™: для любого путешествия, которое начинается и заканчивается в одной и той же вершине, и посещает каждую планету не более одного раза, каждая пара планет на маршруте должна быть непосредственно связана с помощью шоссе Hyperspace™. Другими словами, для каждого простого цикла индуцированный подграф на множестве планет на нем является кликой.

Вы разрабатываете навигационное приложение Hyperspace™, и ключевая техническая проблема, с которой вы столкнулись — это поиск минимального количества шоссе Hyperspace™, которыми нужно воспользоваться для путешествия из планеты \(A\) на планету \(B\). Поскольку эта задача слишком проста для Bubble Cup, вот более сложная задача: ваша программа должна сделать это для \(Q\) пар планет.

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

В первой строке входного файла записаны три целых числа \(N\) (\(1\leq N\leq 100\,000\)), \(M\) (\(1\leq M\leq 500\,000\)) и \(Q\) (\(1\leq Q\leq 200\,000\)), описывающих количество планет, количество шоссе Hyperspace™, и количество запросов, соответственно.

Каждая из следующих M строк содержит описание шоссе: шоссе \(i\) описывается двумя числа \(u_i\) и \(v_i\) (\(1 \leq u_i < v_i \leq N\)), обозначающими, что \(u_i\) и \(v_i\) соединены с помощью шоссе Hyperspace™. Гарантируется, что сеть планет и шоссе Hyperspace™ всегда является связным простым графом.

Каждая из следующих \(Q\) строк содержит запрос: запрос \(j\) описывается двумя числами \(a_j\) и \(b_j\) \((1 \leq a_j < b_j \leq N )\), обозначающих, что мы хотим узнать, какое минимальное количество шоссе Hyperspace™ понадобится чтобы добраться из планеты \(a_j\) на планету \(b_j\).

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

Выведите \(Q\) строк: \(j\)-я строка вывода должна содержать минимальное количество шоссе Hyperspace™, которое понадобится чтобы добраться из планеты \(a_j\) на планету \(b_j\).

Примечание

Граф из второго примера:

D. Укрась яблоню

графы Деревья дп жадные алгоритмы Конструктив поиск в глубину и подобное сортировки *1600

В саду Аркадия растет одна яблоня. Ее можно представить как множество точек развилок, соединенных ветками так, что между любыми двумя развилками существует ровно один путь по веткам. Развилки пронумерованы от \(1\) до \(n\), развилка номер \(1\) называется корнем.

Поддеревом развилки \(v\) называется множество развилок \(u\) таких, что путь из \(u\) в корень проходит через \(v\). Обратите внимание, сама вершина \(v\) тоже входит в поддерево \(v\).

Листом называется такая развилка, поддерево которой содержит только одну развилку.

Скоро Новый год, поэтому Аркадий решил украсить яблоню. Он повесит по лампочке некоторого цвета на каждый лист и затем посчитает число счастливых развилок. Счастливой развилкой называется такая развилка \(t\), что все лампочки в поддереве \(t\) имеют различные цвета.

Аркадий заинтересован в следующем вопросе: для каждого \(k\) от \(1\) до \(n\), какое минимальное число различных цветов лампочек необходимо, чтобы число счастливых развилок было не меньше \(k\)?

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

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 10^5\)) — количество развилок в дереве.

Вторая строка содержит \(n - 1\) целое число \(p_2\), \(p_3\), ..., \(p_n\) (\(1 \le p_i < i\)), где \(p_i\) означает, что есть ветка между развилками \(i\) и \(p_i\). Гарантируется, что данное множество веток задает дерево.

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

Выведите \(n\) целых чисел. \(i\)-е из них должно быть равно минимальному количеству цветов, необходимых для того, чтобы число счастливых развилок было не меньше \(i\).

Примечание

В первом примере для \(k = 1\) и \(k = 2\) можно все лампочки сделать одного цвета: счастливыми будут развилки \(2\) и \(3\). Для \(k = 3\) нужно повесить лампочки разных цветов, тогда все развилки будут счастливыми.

Во втором примере для \(k = 4\) можно, например, повесить лампочки цвета \(1\) в развилки \(2\) и \(4\), а лампочку цвета \(2\) в развилку \(5\). Тогда счастливыми будут развилки \(2\), \(3\), \(4\) и \(5\).

A. Cеть компании Bmail

*особая задача Деревья поиск в глубину и подобное *900

Когда-то давно в небезызвестной компании Bmail был только один маршрутизатор. Шли года и с течением времени закупались новые маршрутизаторы. Каждый раз при покупке нового маршрутизатора он соединялся с одним из купленных до него. Вам заданы значения \(p_i\) — номер маршрутизатора к которому был подключен \(i\)-й после покупки (\(p_i < i\)).

Сейчас в Bmail всего \(n\) маршрутизаторов. Выведите последовательность маршрутизаторов на пути от первого до \(n\)-го.

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

В первой строке записано целое число \(n\) (\(2 \le n \le 200000\)) — количество маршрутизаторов. Далее во второй строке записано \(n-1\) целое число \(p_2, p_3, \dots, p_n\) (\(1 \le p_i < i\)), где \(p_i\) равно номеру маршрутизатора, к которому подключили \(i\)-й после покупки.

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

Выведите путь от \(1\)-го до \(n\)-го маршрутизатора. Пусть должен начинаться с числа \(1\) и заканчиваться числом \(n\). Все номера в пути должны быть различны.

E. Сергей и метро

Деревья дп поиск в глубину и подобное *2000

Мэр уездного города N Сергей Семёнович днями и ночами думает об улучшении жизни Nчан. К сожалению, все мыслимые и немыслимые идеи по модернизации городского пространства уже были приведены в исполнение и больше мэру нечем занимать свой ум днём (ночью он теперь спит). Однако, его помощники быстро нашли выход из положения, они рисуют на бумаге новый город и предлагают мэру составлять проекты его улучшения.

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

Как показатель качества схемы метро, Сергей Семёнович использует сумму попарных расстояний между всеми парами станций. Расстоянием между двумя станциями называется минимально возможное количество перегонов на пути между ними.

Сергей Семёнович решил добавить в схему новые перегоны. А именно, он дорисовал перегон между станциями \(u\) и \(v\), если эти станции не были соединены перегоном напрямую, но у них была общая станция-сосед, то есть существовала такая станция \(w\), что в оригинальной схеме присутствовал перегон между \(u\) и \(w\) и перегон между \(w\) и \(v\). Вам поставлена задача вычислить сумму попарных расстояний между всеми парами станций в получившейся схеме метрополитена.

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

В первой строке входных данных записано целое число \(n\) (\(2 \leq n \leq 200\,000\)) — количество станций метро в выдуманной помощниками мэра схеме. В каждой из последующих \(n - 1\) строк записаны два числа \(u_i\) и \(v_i\) (\(1 \leq u_i, v_i \leq n\), \(u_i \ne v_i\)), соответствующие номерам двух станций, соединённых перегоном.

Гарантируется, что заданные во входных данных \(n\) станций и \(n - 1\) перегон образуют дерево.

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

Выведите одно целое число, равное сумме расстояний между всеми парами станций после того как Сергей Семёнович дорисует новые перегоны между всеми станциями, у которых есть общая станция-сосед.

Примечание

В первом примере в новой схеме от каждой станции до каждой существует прямой перегон, поэтому сумма расстояний \(6\).

Во втором примере перегоны существуют между всеми парами станций, кроме пары \((1, 4)\), расстояние для которой равно \(2\).

D. Развлечения с целыми числами

графы математика поиск в глубину и подобное реализация *1800

Вам дано положительное целое число \(n\) большее или равное \(2\). Для пары целых чисел \(a\) и \(b\) (\(2 \le |a|, |b| \le n\)), вы можете преобразовать \(a\) в \(b\) тогда и только тогда, когда существует целое число \(x\), такое что \(1 < |x|\) и (\(a \cdot x = b\) или \(b \cdot x = a\)), где \(|x|\) обозначает модуль числа \(x\).

После такого преобразования ваш счёт увеличивается на \(|x|\) и вам больше не разрешается превращать \(a\) в \(b\) и \(b\) в \(a\).

Изначально ваш счёт равен \(0\). Вы можете начать с любого числа и преобразовывать его столько раз, сколько вы хотите. Какого наибольшего счёта можно добиться?

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

Единственная строка содержит ровно одно целое число \(n\) (\(2 \le n \le 100\,000\)) — целое число определённое выше.

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

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

Примечание

В первом примере можно делать такие преобразования: \(2 \rightarrow 4 \rightarrow (-2) \rightarrow (-4) \rightarrow 2\).

В третьем примере, нельзя выполнить ни одного преобразования.

E. Компания

Бинарный поиск Деревья жадные алгоритмы поиск в глубину и подобное Структуры данных *2300

У компании \(X\) есть \(n\) сотрудников, пронумерованных от \(1\) до \(n\). У каждого сотрудника \(u\) есть его прямой начальник \(p_u\) (\(1 \le p_u \le n\)), кроме сотрудника \(1\), у которого начальника нет. Гарантируется, что значения \(p_i\) образуют дерево. Сотрудник \(u\) называется ответственным за сотрудника \(v\), если \(u\) является прямым начальником \(v\) или есть такой сотрудник \(w\), что \(w\) ответственен за \(v\), и \(u\) является прямым начальником \(w\). Любой сотрудник также считается ответственным за самого себя.

Также, для каждого сотрудника \(u\) мы определим его уровень \(lv(u)\) следующим образом:

  • \(lv(1)=0\)
  • \(lv(u)=lv(p_u)+1\) если \(u \neq 1\)

У компании есть \(q\) возможных планов на ближайшее будущее. При чём \(i\)-й из них задаётся двумя числа \(l_i\) и \(r_i\), означающими что в этом плане принимают участие все сотрудники в отрезке \([l_i, r_i]\) и только они. Чтобы всё прошло гладко, у плана должен быть проектный менеджер, который является ответственным за всех сотрудников в этом плане. Более формально, если сотрудник \(u\) выбирается как проектный менеджер \(i\)-го плана, то для каждого сотрудника \(v \in [l_i, r_i]\), \(u\) должен быть ответственен за \(v\). Заметим, что при этом не обязательно \(u\) сам должен находится в отрезке \([l_i, r_i]\). Также, \(u\) всегда выбирается таким образом, что \(lv(u)\) является максимально возможным (чем больше уровень, тем меньше компания может платить сотруднику).

До того как любой план начнёт выполняться, компания позволила JATC заглянуть в свои планы. С первого взгляда он заметил, что для каждого плана можно уменьшить количество вовлечённых в него сотрудников ровно на один без каких-либо проблем. Будучи жадной, компания спрашивает у JATC: какого же именно сотрудника надо выкинуть из плана, чтобы уровень менеджера проекта был максимально возможным? JATC уже выяснил ответ и теперь предлагает это сделать и вам.

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

Первая строка содержит два целых числа \(n\) и \(q\) (\(2 \le n \le 100\,000\), \(1 \le q \le 100\,000\)) — количество сотрудников и количество планов соответственно.

Вторая строка содержит \(n-1\) целых чисел \(p_2, p_3, \dots, p_n\) (\(1 \le p_i \le n\)), где \(p_i\) является прямым начальником сотрудника \(i\).

Гарантируется, что значения \(p_i\) задают ориентированное дерево с корнем в вершине \(1\).

Каждая из \(q\) следующих строк содержит два целых числа \(l_i\) и \(r_i\) (\(1 \le l_i<r_i \le n\)) — отрезок сотрудников, вовлечённых в соответствующий план.

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

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

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

Примечание

В примере:

В первом запросе мы можем выбрать \(4\), \(5\) или \(6\) и менеджером проекта в таком случае будет \(3\).

Во втором запросе, если мы выберем любого сотрудника кроме сотрудника \(8\), то менеджером проекта будет сотрудник \(1\), если же мы выберем сотрудника \(8\), то проектным менеджером будет \(3\). Так как \(lv(3)=1 > lv(1)=0\), то оптимальным ответом будет выбрать сотрудника \(8\).

В третьем запросе, как бы мы ни выбирали сотрудника, проектным менеджером всегда окажется сотрудник \(1\).

В четвёртом запросе, если мы выберем \(9\) или \(10\), то менеджером проекта будет \(3\), если же мы выберем \(11\), то проектным менеджером окажется \(7\). Так как \(lv(7)=3>lv(3)=1\), то оптимальным ответом будет выбрать сотрудника \(11\).

F. Модернизация городов

графы поиск в глубину и подобное *2900

В королевстве \(X\) есть \(n\) городов, пронумерованных от \(1\) до \(n\). Люди путешествуют между городами используя различные односторонние дороги. Как пассажир, JATC нашёл странным, что для любого города \(u\) нельзя начать в нём поездку и после этого в него же и вернуться. Тем самым, королевство представляет из себя ациклический граф.

Будучи раздражённым дорожной системой, JATC решил встретиться с королём и попросить его сделать хоть что-нибудь. В ответ король сказал, что он собирается модернизировать некоторые города, чтобы улучшить транспортную ситуацию. Однако, в целях экономии бюджета, король хочет модернизировать только важные или полуважные города. Город \(u\) называется важным, если для любого города \(v \neq u\) есть путь или из \(v\) в \(u\), или из \(u\) в \(v\). Город \(u\) называется полуважным, если он важным не является, но можно удалить ровно одну вершину \(v \neq u\), так что \(u\) станет важным. Король собирается перейти к действиям, сразу как только обнаружит все эти города. Помогите ему с этим, чтобы ускорить процесс.

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

Первая строка входных данных содержит два целых числа \(n\) и \(m\) (\(2 \le n \le 300\,000\), \(1 \le m \le 300\,000\)) — количество городов и количество односторонних дорог.

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

Гарантируется, что города королевства образуют ациклический граф, не содержащий кратных рёбер и петель.

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

Выведите одно целое число — количество городов, которые нужно модернизировать.

Примечание

В первом примере:

  • Начиная из города \(1\) мы можем добраться до всех городов, кроме города \(6\). Также из города \(6\) мы не можем добраться до города \(1\). Тем самым, если мы удалим города \(6\), город \(1\) станет важным. Значит город \(1\) является полуважным.
  • Для города \(2\) множество городов, которые не достижимы из \(2\), и из которых не достижима \(2\) равно \(\{6\}\). Тем самым удаление города \(6\) делает город \(2\) важным. Значит город \(2\) полуважный.
  • Для города \(3\) соответствующее множество равно \(\{5, 6\}\). Тем самым удаление ни города \(5\), ни \(6\) не сделает город \(3\) важным. Значит он не является важным или полуважным.
  • Для города \(4\) соответствующее множество пусто, следовательно город \(4\) является важным.
  • У города \(5\) это множество равно \(\{3, 6\}\), а у города \(6\) равно \(\{3, 5\}\). Поэтому также как и город \(3\) они не являются важными или полуважными.
  • Город \(7\) является важным, так как в него можно добраться из любого другого города.
Тем самым есть два важных города (\(4\) и \(7\)) и два полуважных (\(1\) и \(2\)).

Во втором примере важными являются города \(1\) и \(4\), а города \(2\) и \(3\) являются полуважными.

D. Три фигуры

дп кратчайшие пути поиск в глубину и подобное *2200

Вы наткнулись на новый вид шахматной головоломки. Доска, на которой вы играете, не обязательно \(8 \times 8\), но обязательно \(N \times N\). На каждой клетке записано некоторое число от \(1\) до \(N^2\), и все числа попарно различны. В \(j\)-й клетке \(i\)-й строки записано число \(A_{ij}\).

У вас в распоряжении только три фигуры: конь, слон и ладья. Вначале вы выставляете одну из фигур в клетку с номером \(1\) (вы сами выбираете какую). Далее вы хотите добраться до клетки с номером \(2\) (возможно, проходя через некоторые другие клетки в процессе), далее — до клетки \(3\) и так далее, пока не достигнете клетки \(N^2\). За один шаг вы можете либо сделать один валидный ход текущей фигурой, либо заменить фигуру на другую в вашем распоряжении. Каждая клетка может быть посещена любое количество раз.

Конь может ходить на две клетки по горизонтали и одну по вертикали, либо на две клетки по вертикали и одну по горизонтали. Слон двигается по диагонали. Ладья движется по вертикали или горизонтали. Во время хода фигуры она должна переместиться в клетку, отличную от текущей.

Вы хотите минимизировать общее количество шагов. Среди всех путей с одинаковым количеством шагов вам нужно выбрать тот, который минимизирует количество замен фигур.

Найдите путь, отвечающий всем условиям.

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

Первая строка содержит одно число \(N\) (\(3 \le N \le 10\)) — размер шахматной доски.

Каждая из следующих \(N\) строк содержит \(N\) чисел \(A_{i1}, A_{i2}, \dots, A_{iN}\) (\(1 \le A_{ij} \le N^2\)) — числа, написанные на клетках \(i\)-й строки доски.

Гарантируется, что все \(A_{ij}\) попарно различны.

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

В единственной строке выведите два числа — количество шагов в лучшем ответе и количество замен в нем.

Примечание

Один из оптимальных ответов описан ниже (начальная фигура — конь):

  1. Перейти в \((3, 2)\)
  2. Перейти в \((1, 3)\)
  3. Перейти в \((3, 2)\)
  4. Заменить коня на ладью
  5. Перейти в \((3, 1)\)
  6. Перейти в \((3, 3)\)
  7. Перейти в \((3, 2)\)
  8. Перейти в \((2, 2)\)
  9. Перейти в \((2, 3)\)
  10. Перейти в \((2, 1)\)
  11. Перейти в \((1, 1)\)
  12. Перейти в \((1, 2)\)

F. Вверх и вниз по дереву

Деревья дп поиск в глубину и подобное *2500

Вам задано дерево из \(n\) вершин с корнем в вершине \(1\). Также на данном дереве расположена фишка. Первоначально фишка находится в корне дерева. Вы можете двигать фишку по ребрам дерева следующим образом: пусть текущая вершина с фишкой \(v\), тогда у вас есть два возможных хода:

  • спуститься к любому листу поддерева вершины \(v\);
  • если вершина \(v\) — лист, то подняться вверх по дереву не более чем \(k\) раз. Другими словами, если \(h(v)\) — глубина вершины \(v\) (глубина корня равна \(0\)), то вы можете передвинуть фишку в вершину \(to\) такую, что \(to\) — некоторый предок \(v\) и \(h(v) - k \le h(to)\).

В данной задаче считается, что корень не является листом (даже если его степень равна \(1\)). Посчитайте максимальное количество различных листов, которые вы сможете посетить одной последовательностью ходов.

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

В первой строке заданы два целых числа \(n\) и \(k\) (\(1 \le k < n \le 10^6\)) — количество вершин в дереве и ограничение на высоту подъема.

Вторая строка содержит \(n - 1\) целых чисел \(p_2, p_3, \dots, p_n\), где \(p_i\) — непосредственный родитель вершины \(i\).

Гарантируется, что входные данные задают дерево с корнем в вершине \(1\).

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

Выведите единственное целое число — максимально возможное количество различных листов, которые вы сможете посетить одной последовательностью ходов.

Примечание

Граф из первого примера изображен ниже:

Один из возможных оптимальных обходов: \(1 \rightarrow 2 \rightarrow 1 \rightarrow 5 \rightarrow 3 \rightarrow 7 \rightarrow 4 \rightarrow 6\).

Граф из второго примера:

Один из возможных оптимальных обходов: \(1 \rightarrow 7 \rightarrow 5 \rightarrow 8\). Заметим, что невозможно добраться из вершины \(6\) в \(7\) или \(8\) и наоборот.

B. Мультиёж

графы кратчайшие пути поиск в глубину и подобное *1800

Кто-то незнакомый подарил Ване на день рождения ежа — связный неориентированный граф, состоящий из одной вершины степени хотя бы \(3\), которую мы будем называть центром, и нескольких вершин степени 1. Ваня посчитал, что ёж — это слишком скучный граф, и решил сделать \(k\)-мультиёж.

Определим \(k\)-мультиёж следующим образом:

  • \(1\)-мультиёж — это ёж: одна вершина степени хотя бы \(3\) и несколько вершин степени 1.
  • Для всех \(k \ge 2\), \(k\)-мультиёж — это \((k-1)\)-мультиёж, для каждой висячей вершины \(v\) которого проделали следующие операции: пусть \(u\) — её единственный сосед, удалим вершину \(v\), создадим новый ёж с центром в вершине \(w\), соединим ребром вершины \(u\) и \(w\). Новые ежи могут отличаться как друг от друга, так и от подаренного Ване.

Таким образом, \(k\)-мультиёж является деревом. Ваня сделал \(k\)-мультиёж, но не уверен, что нигде не ошибся, поэтому попросил вас проверить, является ли созданное им дерево \(k\)-мультиежом.

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

В первой строке записано \(2\) числа \(n\) и \(k\) (\(1 \le n \le 10^{5}\), \(1 \le k \le 10^{9}\)) — количество вершин дерева и параметр ежа.

В следующих \(n-1\) строках описаны рёбра дерева. Каждое ребро описывается парой \(u\) \(v\) (\(1 \le u, \,\, v \le n; \,\, u \ne v\)) вершин, которые оно соединяет.

Гарантируется, что описанный граф является деревом.

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

Выведите "Yes" (без кавычек), если граф является \(k\)-мультиежом, и "No" (без кавычек), если не является.

Примечание

2-мультиёж из первого примера выглядит так:

Его центр — вершина \(13\). Ежи, созданные на последнем шаге: [4 (центр), 1, 2, 3], [6 (центр), 7, 8, 9], [5 (центр), 10, 11, 12, 13].

Дерево из второго примера не является ежом, потому что степень центра должна быть хотя бы \(3\).

A. Водоснабжение

графы поиск в глубину и подобное *1400

Корпуса общежития German University in Cairo (GUC) пронумерованы числами от 1 до n. Для обеспечения водоснабжения под землей корпуса соединены трубами. Все трубы — направленные, то есть вода может течь только в определенном направлении, и не может течь в обратном. Также для каждой трубы известен ее диаметр, он обозначает объем воды, который может выдержать эта труба. Для каждого корпуса имеется не более, чем одна входящая в него труба, и не более, чем одна исходящая из него труба.

С началом нового семестра, студент Лулу, проживающий в общежитии, хочет установить баки с запасами воды и краны для экстренного слива воды. Бак нужно установить в каждый корпус, который имеет выходящую из него трубу и не имеет входящей. Кран нужно установить во всех корпусах, где есть входящая труба, но нет выходящей. Таким образом получится, что вода из любого корпуса с баком сможет дойти до корпуса с краном.

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

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

В первой строке через пробел записано два целых числа n и p (1 ≤ n ≤ 1000, 0 ≤ p ≤ n) — количество корпусов и количество труб.

Затем следуют p строк — описание p труб, i-ая строка содержит три целых числа ai bi di. Она задает трубу диаметра di выходящую из корпуса ai и ведущую в корпус bi    (1 ≤ ai, bi ≤ n, ai ≠ bi, 1 ≤ di ≤ 106).

Гарантируется, что для каждого корпуса имеется не более одной входящей трубы, и не более одной исходящей трубы.

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

На первой строке выведите t — количество пар корпусов, где нужно установить бак и слив.

На следующих t строках выведите по три числа: tanki, tapi, и diameteri, где tanki ≠ tapi (1 ≤ i ≤ t). Здесь tanki и tapi — номера корпусов, где будут установлены бак и слив, соответственно, а diameteri — максимально возможный объем воды, который можно пропустить. Все эти t строк должны быть упорядочены в порядке возрастания tanki.

F. Выбери два пути

Деревья дп жадные алгоритмы поиск в глубину и подобное *2500

Задано неориентированное невзвешенное дерево, состоящее из \(n\) вершин.

Неориентированное дерево — это связный неориентированный граф с \(n - 1\) ребром.

Ваша задача — выбрать две пары вершин этого дерева (все выбранные вершины должны быть различны) \((x_1, y_1)\) и \((x_2, y_2)\) таким образом, что \(x_1\) и \(y_1\) не должны принадлежать простому пути от \(x_2\) до \(y_2\) и наоборот (\(x_2\) и \(y_2\) не должны принадлежать простому пути от \(x_1\) до \(y_1\)).

Гарантируется, что для заданного дерева всегда возможно выбрать такие пары.

Среди всех возможных способов выбрать эти пары вам необходимо выбрать способ с максимальным количеством общих вершин между путями от \(x_1\) до \(y_1\) и от \(x_2\) до \(y_2\). И среди всех таких пар вам необходимо выбрать пару с максимальной суммарной длиной этих двух путей.

Гарантируется, что для заданного дерева существует ответ, содержащий хотя бы две общие вершины между путями.

Длина пути — это количество ребер в нем.

Простой путь — это путь, посещающий каждую вершину не более одного раза.

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

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

Каждая из следующих \(n - 1\) строк описывает ребра дерево.

Ребро \(i\) описывается двумя целыми числами \(u_i\) и \(v_i\), номерами вершин, которые оно соединяет (\(1 \le u_i, v_i \le n\), \(u_i \ne v_i\)).

Гарантируется, что заданные ребра образуют дерево.

Гарантируется, что для заданного дерева существует ответ, содержащий хотя бы две общие вершины между путями.

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

Выведите любые две пары вершин, удовлетворяющие ограничениям, описанным в условии задачи.

Гарантируется, что для заданного дерева всегда возможно выбрать такие пары.

Примечание

Картинка, соответствующая первому тестовому примеру:

Пересечение путей равно \(2\) (вершины \(1\) и \(4\)), а суммарная длина равна \(4 + 3 = 7\).

Картинка, соответствующая второму тестовому примеру:

Пересечение путей равно \(2\) (вершины \(3\) и \(4\)), а суммарная длина равна \(5 + 3 = 8\).

Картинка, соответствующая третьему тестовому примеру:

Пересечение путей равно \(3\) (вершины \(2\), \(7\) и \(8\)), а суммарная длина равна \(5 + 5 = 10\).

Картинка, соответствующая четвертому тестовому примеру:

Пересечение путей равно \(5\) (вершины \(1\), \(2\), \(3\), \(4\) и \(5\)), а суммарная длина равна \(6 + 6 = 12\).

E. Лес минимального диаметра

Деревья жадные алгоритмы Конструктив поиск в глубину и подобное *2000

Задан лес — неориентированный граф из \(n\) вершин такой, что каждая его компонента связности является деревом.

Диаметр (также «длиннейший кратчайший путь») связного неориентированного графа — это максимальное число ребер на кратчайшем пути между всеми парами вершин.

Ваша задача — добавить несколько ребер (возможно ноль) в граф так, чтобы он стал деревом, а диаметр этого дерева был минимально возможным.

Если существует несколько правильных ответов, то выведите любой.

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

В первой строке записаны два целых числа \(n\) и \(m\) (\(1 \le n \le 1000\), \(0 \le m \le n - 1\)) — количество вершин графа и количество ребер, соответственно.

В каждой из следующих \(m\) строк записаны по два целых числа \(v\) и \(u\) (\(1 \le v, u \le n\), \(v \ne u\)) — описания ребер.

Гарантируется, что заданный граф — это лес.

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

В первой строке выведите диаметр полученного дерева.

В каждой из следующих \((n - 1) - m\) строк выведите по два целых числа \(v\) и \(u\) (\(1 \le v, u \le n\), \(v \ne u\)) — описания добавленных ребер.

Полученный граф должен быть деревом, а его диаметр должен был минимально возможным.

Eсли \(m = n - 1\), то, очевидно, ребра не будут добавлены и весь вывод состоит из одного числа — диаметра заданного дерева.

Если существует несколько правильных ответов, то выведите любой.

Примечание

В первом примере добавление ребер (1, 4) или (3, 4) приведет к диаметру 3. Добавление ребра (2, 4), однако, сделает диаметр равным 2.

Ребро (1, 2) — это единственный вариант добавляемого ребра для второго примера. Диаметр равен 1.

В третьем примере нельзя добавить никаких ребер. Диаметр уже 2.

F. Дерево максимальной стоимости

Деревья дп поиск в глубину и подобное *1900

Задано дерево, состоящее ровно из \(n\) вершин. Дерево — это связный неориентированный граф с \(n-1\) ребром. Каждой вершине \(v\) этого дерева соответствует некоторое значение \(a_v\).

Пусть \(dist(x, y)\) — расстояние между вершинами \(x\) и \(y\). Расстояние между вершинами — это количество ребер на простом пути между ними.

Определим стоимость дерева как следующую величину: сначала давайте зафиксируем одну вершину дерева. Пусть она равна \(v\). Тогда стоимость дерева равна \(\sum\limits_{i = 1}^{n} dist(i, v) \cdot a_i\).

Ваша задача — найти максимально возможную стоимость дерева, если вы можете выбирать \(v\) самостоятельно.

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

Первая строка входных данных содержит одно целое число \(n\), количество вершин в дереве (\(1 \le n \le 2 \cdot 10^5\)).

Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 2 \cdot 10^5\)), где \(a_i\) равно значению вершины \(i\).

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

Гарантируется, что заданные ребра образуют дерево.

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

Выведите одно целое число — максимально возможную стоимость дерева, если вы можете выбрать любую вершину в качестве вершины \(v\).

Примечание

Картинка, соответствующая первому тестовому примеру:

Вы можете выбрать вершину \(3\) как корень, тогда ответ будет равен \(2 \cdot 9 + 1 \cdot 4 + 0 \cdot 1 + 3 \cdot 7 + 3 \cdot 10 + 4 \cdot 1 + 4 \cdot 6 + 4 \cdot 5 = 18 + 4 + 0 + 21 + 30 + 4 + 24 + 20 = 121\).

Во втором тестовом примере дерево состоит только из одной вершины, поэтому ответ всегда равен \(0\).

D. Красивый граф

графы поиск в глубину и подобное *1700

Дан неориентированный невзвешенный граф, состоящий из \(n\) вершин и \(m\) ребер.

В каждую вершину графа вы должны записать одно из следующих чисел: \(1\), \(2\) и \(3\). Граф станет красивым, если для каждого ребра сумма чисел, записанных на соединяемых этим ребром вершинах, будет нечетной.

Посчитайте количество способов расставить во все вершины числа \(1\), \(2\) и \(3\) так, чтобы получившийся граф был красивым. Так как это количество может быть достаточно большим, выведите его по модулю \(998244353\).

Обратите внимание, что в каждой вершине графа вы должны написать ровно одно число.

Гарантируется, что в заданном графе нет петель и кратных ребер.

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

Первая строка содержит целое число \(t\) (\(1 \le t \le 3 \cdot 10^5\)) — количество тестов, для которых нужно решить задачу.

Первая строка каждого теста содержит два числа \(n\) и \(m\) (\(1 \le n \le 3 \cdot 10^5, 0 \le m \le 3 \cdot 10^5\)) — количество вершин и ребер в графе соответственно. В следующих \(m\) строках содержится описание ребер: в \(i\)-й строке заданы два целых числа \(u_i\), \( v_i\) (\(1 \le u_i, v_i \le n; u_i \neq v_i\)) — номера вершин, которые соединяет \(i\)-е ребро.

Гарантируется, что \(\sum\limits_{i=1}^{t} n \le 3 \cdot 10^5\) и \(\sum\limits_{i=1}^{t} m \le 3 \cdot 10^5\).

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

Для каждого теста выведите по одной строке, в которой выведите целое число — количество способов расставить в вершины числа \(1\), \(2\) и \(3\) так, чтобы получившийся граф был хорошим. Так как это количество может быть достаточно большим, выведите его по модулю \(998244353\).

Примечание

В первом тестовом примере подходят четыре варианта:

  1. поставить в вершину \(1\) число \(1\), а в вершину \(2\) — число \(2\);
  2. поставить в вершину \(1\) число \(3\), а в вершину \(2\) — число \(2\);
  3. поставить в вершину \(1\) число \(2\), а в вершину \(2\) — число \(1\);
  4. поставить в вершину \(1\) число \(2\), а в вершину \(2\) — число \(3\).

Во втором тестовом примере не существует способа, удовлетворяющего описанным выше условиям.

A. Сумма в дереве

Деревья жадные алгоритмы Конструктив поиск в глубину и подобное *1600

У Мити есть корневое дерево из \(n\) вершин, пронумерованных от \(1\) до \(n\), причем корень дерева имеет номер \(1\). В каждой его вершине \(v\) было записано целое число \(a_v \ge 0\). Для каждой вершины \(v\) Митя вычислил величину \(s_v\): сумму чисел, записанных на пути от вершины \(v\) до корня, а также \(h_v\) — глубину вершины \(v\), то есть количество вершин на пути от вершины \(v\) до корня (таким образом, \(s_1=a_1\), \(h_1=1\)).

После этого Митя уничтожил исходные значения \(a_v\). К сожалению, он также случайно уничтожил все значения \(s_v\) для вершин, находящихся на четной глубине (то есть тех, для которых \(h_v\) является четным). Ваша задача состоит в том, чтобы восстановить значения \(a_v\) для каждой из вершин либо определить, что это невозможно. Среди возможных вариантов нужно выбрать тот, при котором сумма значений \(a_v\) во всем дереве является минимально возможной.

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

В первой строке содержится число \(n\) — число вершин в дереве (\(2 \le n \le 10^5\)). В следующей строке заданы числа \(p_2\), \(p_3\), ... \(p_n\), где \(p_i\) обозначает номер вершины, которая является предком вершины \(i\) в дереве (\(1 \le p_i < i\)). В последней строке входных данных содержатся целые числа \(s_1\), \(s_2\), ..., \(s_n\) (\(-1 \le s_v \le 10^9\)), где уничтоженные значения заменены на \(-1\).

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

Выведите единственное число — минимально возможную сумму чисел \(a_v\) в вершинах исходного дерева или \(-1\), если такого дерева не существует.

C. Построй дерево

Бинарный поиск графы Деревья жадные алгоритмы Конструктив поиск в глубину и подобное *2400

Погуляв по заснеженному лесу, Миша очень полюбил деревья и решил нарисовать своё!

Это дерево состоит из \(n\) вершин, пронумерованных различными целыми числами от \(1\) до \(n\). В этом дереве вершина \(1\) является корнем, а у любой другой вершины \(i\) есть непосредственный предок \(p_{i}\) (при этом \(i\) — непосредственный потомок \(p_{i}\)).

Вершина \(u\) лежит в поддереве вершины \(v\), если переходя по непосредственным предкам из вершины \(u\) (\(u\), \(p_{u}\), \(p_{p_{u}}\), ...), можно попасть в вершину \(v\). В частности, любая вершина \(v\) лежит в поддереве самой себя. Число вершин в поддереве вершины \(v\) называется размером поддерева. Миша рассматривает только те деревья, в которых все вершины лежат в поддереве вершины \(1\).

На рисунке ниже изображено дерево из \(6\) вершин. Поддерево вершины \(2\) состоит из вершин \(2\), \(3\), \(4\), \(5\). Таким образом, размер поддерева этой вершины равен \(4\).

Назовём разветвлённостью дерева максимальное количество непосредственных потомков какой-то из его вершин. Так, разветвлённость дерева на рисунке выше равна 2. Помогите Мише построить дерево из \(n\) вершин, в котором сумма размеров всех поддеревьев равна в точности \(s\), а разветвлённость — минимально возможная.

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

В первой и единственной строке входных данных записаны два целых числа \(n\) и \(s\) — число вершин в дереве и требуемая сумма размеров поддеревьев (\(2 \le n \le 10^5\); \(1 \le s \le 10^{10}\)).

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

Если требуемого дерева не существует, выведите «No». Иначе в первой строке выходных данных выведите «Yes», а в следующей строке выведите числа \(p_2\), \(p_3\), ..., \(p_n\), где вершина с номером \(p_i\) является непосредственным предком вершины с номером \(i\).

Примечание

Для первого примера одним из оптимальных деревьев изображено ниже. Сумма размеров поддеревьев в этом дереве равна \(3 + 1 + 1 = 5\), а разветвлённость равна \(2\).

Для третьего примера одним из оптимальных деревьев изображено ниже. В этом дереве сумма размеров поддеревьев равна \(6 + 3 + 2 + 1 + 2 + 1 = 15\), а разветвлённость равна \(2\).

F. Печеньки

Бинарный поиск Деревья дп игры поиск в глубину и подобное Структуры данных *2400

Митя и Вася играют в интересную игру. У них есть подвешенное дерево из \(n\) вершин, пронумерованных числами от \(1\) до \(n\). В этом дереве вершина \(1\) является корнем, а родителем вершины \(i \ge 2\) является вершина \(p_i\) (при этом будем говорить, что вершина \(i\) — ребенок вершины \(p_i\)).

В каждой вершине дерева находятся печеньки, в вершине \(i\) находится \(x_i\) печенек. Чтобы съесть одну печеньку в вершине \(i\), нужно потратить \(t_i\) единиц времени. Также в игре есть одна фишка. Изначально она находится в корне дерева. Чтобы переместить фишку по ребру, соединяющему вершину \(i\) с ее родителем, нужно потратить \(l_i\) единиц времени.

Митя и Вася ходят по очереди, Митя начинает. На своем ходу Митя перемещает фишку из вершины, где она находится, в одного из ее детей. Вася на своем ходу может удалить какое-то ребро, ведущее из вершины, в которой стоит фишка, в одного из ее детей, или не удалять ничего.

На любом своем ходу Митя может закончить игру. После этого он двигает фишку вверх до корня, по пути съедая какие-то печеньки. Митя может потратить суммарно на спуск, подъем и поедание печенек не более \(T\) единиц времени. Обратите внимание, что в конце игры фишка всегда оказывается в корне: Митя не может оставить фишку ни в какой промежуточной вершине, даже если требуемое число печенек уже было съедено — он обязан переместить фишку в корень (и на каждое перемещение фишки по ребру из вершины \(v\) в ее предка он тратит \(l_v\) единиц времени).

Какое максимальное количество печенек Митя может съесть, независимо от действий Васи?

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

В первой строке находятся два числа \(n\), \(T\) — количество вершин в дереве и время, которое у него есть на это (\(2\le n \le 10^5\); \(1\le T\le10^{18}\)).

Во второй строке находятся \(n\) чисел \(x_1\), \(x_2\), ..., \(x_n\) — число печенек в каждой вершине (\(1\le x_i\le10^6\)). В третьей строке находятся \(n\) чисел \(t_1\), \(t_2\), ..., \(t_n\) — время, которое требуется, чтобы съесть одну печеньку в \(i\)-й вершине (\(1\le t_i\le10^6\)).

Далее следует \(n - 1\) строка, которые описывают дерево. Для каждого \(i\) от \(2\) до \(n\) в отдельной строке записаны два числа \(p_i\) и \(l_i\), где \(p_i\) — родитель вершины \(i\), а \(l_i\) — время, которое требуется Мите для перемещения фишки вдоль ребра из вершины \(i\) в ее родителя (\(1\le p_i < i\), \(0\le l_i \le 10^9\)).

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

Выведите одно целое число — максимальное число печенек, которое может съесть Митя.

Примечание

В первом примере Митя может первым ходом переместить фишку в вершину \(2\). В этом случае, как бы после этого не играл Вася, Митя сможет съесть не менее \(11\) печенек. Ниже приведен пример того, как могла происходить игра:

  1. Митя перемещает фишку в вершину \(2\).
  2. Вася отрезает ребро, ведущее в вершину \(4\).
  3. Митя перемещает фишку в вершину \(5\).
  4. Так как у вершины \(5\) нет детей, Вася не отрезает ничего.
  5. Митя заканчивает игру и поднимается наверх, по пути собирая печеньки (\(7\) в вершине \(5\), \(3\) в вершине \(2\), \(1\) в вершине \(1\)).

Митя тратит \(1+0\) времени на движение вниз, \(0+1\) на движение вверх, \(7\cdot 2\) чтобы съесть \(7\) печенек в вершине 5, \(3\cdot 3\) чтобы съесть \(3\) печеньки в вершине 2, \(1\cdot 1\) чтобы съесть \(1\) печеньку в вершине 1. Суммарное время равно \(1+0+0+1+7\cdot 2+3\cdot 3+1\cdot 1=26\).

E. Андрей и такси

Бинарный поиск графы поиск в глубину и подобное *2200

Андрей предпочитает такси другим видам транспорта, но вот в последнее время таксисты начали вести себя неподобающим образом. Для того, чтобы стрясти побольше денег с пассажира, они порой не против прокатиться по кругу, иногда даже не единожды. Дороги в городе Андрея односторонние, и, вообще говоря, не всегда из одной части города можно добраться до другой. Но к особенностям дорог все привыкли, а вот к ушлым таксистам нет.

Мэр города решил поменять направления некоторых дорог таким образом, чтобы таксист больше не смог бесконечно увеличивать счетчик клиента. Другими словами, таксист, находящийся на конкретном перекрестке, не мог бы попасть на него повторно, совершив ненулевой маршрут.

Для того, чтобы поменять направление дороги, нужны регулировщики. Для каждой конкретной дороги известно, сколько регулировщиков нужно, чтобы поменять направление дороги на противоположное. Разрешено менять направление дорог последовательно, то есть одни и те же регулировщики могут поучаствовать в изменении нескольких дорог.

Необходимо вычислить минимальное количество регулировщиков, необходимых для выполнения задания, и список дорог, у которых необходимо поменять направление.

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

В первой строке заданы два целых числа \(n\) и \(m\) (\(2 \leq n \leq 100\,000\), \(1 \leq m \leq 100\,000\)) — количество перекрестков в городе и количество дорог, соответственно.

В каждой из следующих \(m\) строк содержатся три целых числа \(u_{i}\), \(v_{i}\) и \(c_{i}\) (\(1 \leq u_{i}, v_{i} \leq n\), \(1 \leq c_{i} \leq 10^9\), \(u_{i} \ne v_{i}\)) — номер перекрестка, на котором дорога начинается, номер перекрестка, где она заканчивается и количество регулировщиков, необходимых для изменения направления этой дороги.

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

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

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

Примечание

В первом примере имеется два простых цикла: \(1 \rightarrow 5 \rightarrow 2 \rightarrow 1\) и \(2 \rightarrow 3 \rightarrow 4 \rightarrow 5 \rightarrow 2\). Один регулировщик сможет развернуть только дорогу \(2 \rightarrow 1\), второй цикл в одиночку он разрушить не сможет. Два регулировщика уже смогут развернуть дороги \(2 \rightarrow 1\) и \(2 \rightarrow 3\), после чего не останется перекрестка, на который можно попасть снова, совершив ненулевой маршрут.

Во втором примере одного регулировщика недостаточно, чтобы разрушить маршрут \( 1 \rightarrow 3 \rightarrow 2 \rightarrow 1 \). С помощью трёх регулировщиков можно, например, развернуть дороги \(1 \rightarrow 3\) ,\( 2 \rightarrow 4\), \(1 \rightarrow 5\).

D. Подсчёт GCD

Деревья дп поиск в глубину и подобное Структуры данных теория чисел *2000

Дано дерево из \(n\) вершин. На каждой вершине дерева записано число; на \(i\)-й вершине записано число \(a_i\).

Определим функцию \(g(x, y)\) как наибольший общий делитель всех чисел, записанных на вершинах на простом пути от вершины \(x\) до вершины \(y\) (включая эти две вершины). Также определим \(dist(x, y)\) как количество вершин на простом пути между \(x\) и \(y\), включая концы пути. \(dist(x, x) = 1\) для каждой вершины \(x\).

Посчитайте максимальное значение \(dist(x, y)\) по всем таким парам вершин, что \(g(x, y) > 1\).

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

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

Во второй строке задано \(n\) целых чисел \(a_1\), \(a_2\), ..., \(a_n\) \((1 \le a_i \le 2 \cdot 10^5)\) — числа, записанные на вершинах дерева.

Затем следует \(n - 1\) строка, каждая из которых содержит два числа \(x\) и \(y\) \((1 \le x, y \le n, x \ne y)\), обозначающие ребро между вершиной \(x\) и вершиной \(y\). Гарантируется, что эти ребра задают дерево.

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

Если не существует такой пары вершин \(x, y\), что \(g(x, y) > 1\), выведите \(0\). Иначе выведите максимальное значение \(dist(x, y)\) по всем таким парам.

C. Джони Солвинг

графы Конструктив математика поиск в глубину и подобное *2700

Сегодня вторник, а значит в команде Джони Солвинг снова идёт спор, кто из них Джони, а кто Солвинг. Для того, чтобы разрешить спор ребята позвали Умника. Умник дал ребятам связный граф из \(n\) вершин без петель и кратных рёбер, такой что степень каждой вершины не менее \(3\), а также дал число \(1 \leq k \leq n\). Так как Джони - громкий дурачок, то он заявил что сможет найти в этом графе простой путь длины хотя бы \(\frac{n}{k}\). Солвинг же, немного подумав, сказал, что сможет найти \(k\) простых по вершинам циклов с представителями, таких что:

  • Длина каждого цикла не менее \(3\).
  • Длина каждого цикла не кратна \(3\).
  • В каждом цикле найдётся представитель - такая вершина, которая отсутствует во всех других выведенных циклах.
Вам нужно помочь ребятам разрешить спор, для этого по заданному графу выведите либо решение для Джони: простой путь длины хотя бы \(\frac{n}{k}\) (\(n\) необязательно делится на \(k\)), либо решение для Солвинга: \(k\) циклов, удовлетворяющих условиям выше. Если отсутствуют решения для обоих ребят - выведите \(-1\).
Входные данные

Первая строка содержит три числа \(n\), \(m\) и \(k\) (\(1 \leq k \leq n \leq 2.5 \cdot 10^5, 1 \leq m \leq 5 \cdot 10^5\))

Последующие \(m\) строк содержат описание рёбер графа в виде пар вершин \(v\), \(u\) (\(1 \leq v, u \leq n\)). Гарантируется, что \(v \neq u\) и что все \(m\) пар различны.

Гарантируется, что степень каждой вершины не менее \(3\)

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

Выведите PATH в первой строке, если решаете задачу для Джони. Во-второй строке выведите кол-во вершин в пути \(c\) (\(c \geq \frac{n}{k}\)), а в третьей через пробел вершины в пути в порядке следования.

Выведите CYCLES в первой строке, если решаете задачу для Солвинга. Далее нужно вывести ровно \(k\) циклов в следующем формате: в первой строке выведите кол-во вершин в цикле \(c\) (\(c \geq 3\)), во второй строке выведите сам цикл в формате аналогичном пути, причем первая вершина во второй строке должна являться представителем

Выведите одно число \(-1\), если отсутствует оба решения. Кол-во выведенных чисел не должно превосходить \(10^6\). Гарантируется, что если существует хотя бы одно из решений (для Джони или Солвинга), то и существует вывод удовлетворяющий ограничению.

D. Килани и игра

графы кратчайшие пути поиск в глубину и подобное реализация *1900

Килани играет в игру со своими друзьями. Игра представляет из себя клетчатое поле размером \(n \times m\), где каждая клетка или пуста, или заблокирована, также у каждого игрока есть один или несколько замков на поле (ни одна клетка не содержит более одного замка).

Игра происходит в несколько раундов. В каждом раунде игроки по очереди расширяются: сначала расширяется первый игрок, затем расширяется второй игрок, и так далее. Расширение происходит следующим образом: для каждого замка, которым владеет игрок, он пытается расшириться в свободные клетки поблизости. Игрок \(i\) может расшириться из клетки со своим замком в пустую клетку, если она достижима за не более чем \(s_i\) (где \(s_i\) — это показатель скорости игрока) движений влево, вверх, вправо или вниз, не проходящих через заблокированные клетки или клетки с замками других игроков. Игрок рассматривает множество клеток, в которые он может расшириться, и моментально строит во всех них свой замок. После этого ход переходит к следующему игроку.

Игра заканчивается, когда ни один игрок не может сделать ход. Вам дано поле игры и скорости расширения для каждого игрока. Килани хочет узнать для каждого игрока как много клеток он будет контролировать (иметь там замок) после того как игра закончится.

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

Первая строка содержит три целых числа \(n\), \(m\) и \(p\) (\(1 \le n, m \le 1000\), \(1 \le p \le 9\)) — размеры поля и количество игроков.

Вторая строка содержит \(p\) целых чисел \(s_i\) (\(1 \le s \le 10^9\)) — скорости расширения для каждого игрока.

Следующие \(n\) строк задают игровое поле. Каждая из них состоит из \(m\) символов, где «.» обозначает пустую клетку, «#» обозначает заблокированную клетку, а цифра \(x\) (\(1 \le x \le p\)) обозначает замок, принадлежащий игроку \(x\).

Гарантируется, что у каждого игрока есть хотя бы один замок на поле.

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

Выведите \(p\) целых чисел — количество клеток, контролируемых каждым игроком после конца игры.

Примечание

Картинка ниже показывает состояние игры до начала, после первого раунда и после второго раунда в первом примере.

Во втором примере первый игрок «заблокирован», так что он ничего не сможет захватит в течении всей игры. Все остальные игроки будут расширяться наверх в течении первых двух раундов, а на третьем раунде только второй игрок расширится влево.

D. Лунный новый год и прогулка

графы жадные алгоритмы кратчайшие пути поиск в глубину и подобное Структуры данных *1500

Приближается лунный новый год, а Боб решил отправиться на прогулку в ближайший парк.

Парк может быть представлен как связный граф из \(n\) вершин и \(m\) неориентированных ребер. Изначально Боб находился в вершине \(1\) и записал \(1\) в свою записную книжку. Он может переходить из одной вершины в другую по данным ребрам. Каждый раз, когда он посещает вершину, еще не записанную в его книжку, он записывает ее. После того, как он посетит все вершины как минимум по разу, он закончит прогулку, а в его книжке будет записана перестановка вершин \(a_1, a_2, \ldots, a_n\).

Гулять скучно, а решать задачи — интересно. Боб хочет узнать лексикографически минимальную перестановку, которую он может получить по итогам прогулки. Бобу эта задача кажется простой, поэтому он отдал ее вам.

Последовательность \(x\) лексикографически меньше последовательности \(y\), если и только если выполняется один из следующих пунктов:

  • \(x\) — префикс \(y\), но \(x \ne y\) (обратите внимание, в этой задаче такое невозможно, так как все рассматриваемые последовательности имеют одинаковую длину);
  • в первой позиции, где \(x\) и \(y\) различны, в последовательности \(x\) элемент меньше, чем соответствующий элемент в \(y\).
Входные данные

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \leq n, m \leq 10^5\)) — числе вершин и ребер в графе, соответственно.

Следующие \(m\) строк описывают неориентированные ребра графа. \(i\)-я из этих строк содержит два целых числа \(u_i\) и \(v_i\) (\(1 \leq u_i, v_i \leq n\)) — вершины, соединенные \(i\)-м ребром.

Обратите внимание, что в графе могут быть кратные ребра и петли. Гарантируется, что граф связный.

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

Выведите лексикографически наименьшую последовательность \(a_1, a_2, \ldots, a_n\) из тех, которые может записать Боб.

Примечание

В первом примере одним из возможных путей Боба является путь \(1 \rightarrow 2 \rightarrow 1 \rightarrow 3\). Боб в этом случае запишет последовательность \(\{1, 2, 3\}\), которая является лексикографически наименьшей.

Во втором примере Боб может пойти по пути \(1 \rightarrow 4 \rightarrow 3 \rightarrow 2 \rightarrow 3 \rightarrow 4 \rightarrow 1 \rightarrow 5\). Тогда он запишет последовательность \(\{1, 4, 3, 2, 5\}\), которая является лексикографически наименьшей.

E. Дерево

графы Деревья дп поиск в глубину и подобное Структуры данных *2500

Дано дерево из \(n\) вершин и \(q\) запросов.

Каждый запрос начинается с трех целых чисел \(k\), \(m\) и \(r\), и продолжается \(k\) вершинами дерева \(a_1, a_2, \ldots, a_k\). Чтобы ответить на запрос, предположите, что дерево подвешено за вершину \(r\). Рассмотрим разбиения данных \(k\) вершин на не более чем \(m\) групп так, что выполняются следующие условия:

  • Каждая вершина принадлежит ровно одной группе, каждая группа содержит хотя бы одну вершину.
  • Ни в одной группе нет двух вершин таких, что одна является предком (не обязательно непосредственным) другой.

Выведите количество различных таких разбиений по модулю \(10^{9}+7\) для каждого запроса.

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

Первая строка содержит два целых числа \(n\) и \(q\) (\(1 \le n, q \le 10^{5}\)) — количество вершин в дереве и количество запросов, соответственно.

Каждая из следующих \(n-1\) вершин содержит два целых числа \(u\) и \(v\) (\(1 \le u, v \le n, u \ne v\)), обозначающие ребро между вершинами \(u\) и \(v\). Гарантируется, что данный граф является деревом.

Каждая из следующих \(q\) строк начинается с трех целых чисел \(k\), \(m\) и \(r\) (\(1 \le k, r \le n\), \(1 \le m \le min(300,k)\)) — количество вершин, максимальный размер группы и корень дерева для данного запроса, соответственно. После этого следуют \(k\) различных целых чисел \(a_1, a_2, \ldots, a_k\) (\(1 \le a_i \le n\)) — вершины текущего запроса.

Гарантируется, что сумма значений \(k\) по всем запросам не превосходит \(10^{5}\).

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

Выведите \(q\) строк, где \(i\)-я строка содержит ответ на \(i\)-й запрос.

Примечание

Рассмотрим первый пример.

В первом запросе нужно разделить три данные вершины (\(7\), \(4\) и \(3\)) на не более чем три группы, считая, что корнем дерева является вершина \(2\). Когда дерево подвешено за вершину \(2\), вершина \(4\) является предком вершин \(3\) и \(7\). Поэтому нельзя все вершины отнести к одной группе. Есть только \(1\) способ разделить эти вершины на две группы: \([4]\) и \([3, 7]\). Кроме того, есть один способ разделить данные вершины на три группы: \([7]\), \([4]\) и \([3]\). Таким образом, есть всего \(2\) способа разбить данные вершины на не более чем три группы.

Во втором запросе дерево подвешено за вершину \(4\), при этом \(6\) является предком \(2\), а \(2\) является предком \(1\). Поэтому нельзя все вершины отнести к одной группе.

F1. Разрезание дерева (легкая версия)

Деревья поиск в глубину и подобное *1800

Задано неориентированное дерево из \(n\) вершин.

Некоторые вершины покрашены в красный цвет, некоторые — в синий, а некоторые не покрашены совсем. Гарантируется, что дерево содержит хотя бы одну красную вершину и хотя бы одну синюю вершину.

Вы выбираете ребро и удаляете его из дерева. Дерево распадается на две связных компоненты. Назовем ребро хорошим, если в каждой из двух компонент не будет одновременно синей и красной вершин.

Сколько хороших ребер в данном дереве?

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

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

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 2\)) — цвета вершин. \(a_i = 1\) значит, что вершина \(i\) покрашена в красный, \(a_i = 2\) значит, что вершина \(i\) покрашена в синий, и \(a_i = 0\) значит, что вершина \(i\) не покрашена.

В \(i\)-й из следующих \(n - 1\) строк содержится два целых числа \(v_i\) и \(u_i\) (\(1 \le v_i, u_i \le n\), \(v_i \ne u_i\)) — ребра дерева. Гарантируется, что данные ребра образуют дерево. Гарантируется, что дерево содержит хотя бы одну красную вершину и хотя бы одну синюю вершину.

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

Выведите одно целое число — количество хороших ребер в данном дереве.

Примечание

Дерево из первого примера:

Единственное хорошее ребро — это ребро \((2, 4)\). После его удаления дерево распадается на компоненты \(\{4\}\) и \(\{1, 2, 3, 5\}\). В первой компоненте есть только красная вершина, а во второй — только синие и непокрашенные вершины.

Дерево из второго примера:

Каждое ребро в нем хорошее.

Дерево из третьего примера:

Ребро \((1, 3)\) разделяет дерево на компоненты \(\{1\}\) и \(\{3, 2\}\), во второй есть одновременно красная и синяя вершины, поэтому это ребро не хорошее. Ребро \((2, 3)\) разделяет дерево на компоненты \(\{1, 3\}\) и \(\{2\}\), в первой есть одновременно красная и синяя вершины, поэтому это ребро также не хорошее. Потому ответ равен 0.

F2. Разрезание дерева (сложная версия)

Деревья дп Комбинаторика поиск в глубину и подобное *2700

Задано неориентированное дерево из \(n\) вершин.

Некоторые вершины покрашены в один из \(k\) цветов, а некоторые не покрашены совсем. Гарантируется, что дерево содержит хотя бы одну вершину каждого из \(k\) цветов. Может быть ноль непокрашенных вершин.

Вы выбираете набор из ровно \(k - 1\) ребер и удаляете его из дерева. Дерево распадается на \(k\) связных компонент. Назовем набор хорошим, если ни в одной из полученных компонент не будет вершин различных цветов.

Сколько хороших наборов ребер есть в данном дереве? Два набора считаются различными, если существует такое ребро, что оно присутствует в одном наборе и отсутствует в другом.

Ответ может быть довольно большим, поэтому выведите его по модулю \(998244353\).

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

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

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le k\)) — цвета вершин. \(a_i = 0\) значит, что вершина \(i\) не покрашена, любое другое число значит, что вершина \(i\) покрашена в этот цвет.

В \(i\)-й из следующих \(n - 1\) строк содержится два целых числа \(v_i\) и \(u_i\) (\(1 \le v_i, u_i \le n\), \(v_i \ne u_i\)) — ребра дерева. Гарантируется, что данные ребра образуют дерево. Гарантируется, что дерево содержит хотя бы одну вершину каждого из \(k\) цветов. Может быть ноль непокрашенных вершин.

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

Выведите одно целое число — количество хороших наборов ребер в данном дереве. Два набора считаются различными, если существует такое ребро, что оно присутствует в одном наборе и отсутствует в другом.

Ответ может быть довольно большим, поэтому выведите его по модулю \(998244353\).

Примечание

Дерево из первого примера:

Единственный хороший набор — это ребро \((2, 4)\). После его удаления дерево распадается на компоненты \(\{4\}\) и \(\{1, 2, 3, 5\}\). В первой компоненте есть только вершина цвета \(1\), а во второй — только вершины цвета \(2\) и непокрашенные вершины.

Дерево из второго примера:

Хорошие наборы: \(\{(1, 3), (4, 7)\}\), \(\{(1, 3), (7, 2)\}\), \(\{(3, 6), (4, 7)\}\) и \(\{(3, 6), (7, 2)\}\).

C. Соединить

Перебор поиск в глубину и подобное снм *1400

Алиса живет на плоской земле, которая может быть представлена как квадратная решетка \(n \times n\) со строками и столбцами, пронумерованными от \(1\) до \(n\). Обозначим клетку на пересечении строки \(r\) и столбца \(c\) упорядоченной парой \((r, c)\). Каждая клетка решетки является либо землей, либо водой.

Пример планеты с \(n = 5\). Она также является первым примером.

Алиса живет на клетке, которая является землей, \((r_1, c_1)\). Она хочет добраться до другой клетки, которая является землей, \((r_2, c_2)\). В любой момент она может переместиться в одну из соседних с ней ячеек — в одном из четырех направлений (т.е. вверх, вниз, влево или вправо).

К сожалению, Алиса не умеет плавать, и можно перемещаться только пешком (т.е. только по земле). В итоге путешествие Алисы может быть невозможно.

Чтобы помочь Алисе, вы хотите создать не более одного туннеля между какими-то двумя земляными клетками. Туннель позволяет Алисе перемещаться между двумя его концами. Создание туннеля требует некоторых затрат: стоимость туннеля между клетками \((r_s, c_s)\) и \((r_t, c_t)\) равна \((r_s-r_t)^2 + (c_s-c_t)^2\).

Таким образом, ваша задача — найти минимальную стоимость постройки не более одного туннеля так, чтобы Алиса смогла добраться от клетки \((r_1, c_1)\) до клетки \((r_2, c_2)\). Если постройка туннеля не обязательна, стоимость полагается равной \(0\).

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

Первая строка содержит одно целое число \(n\) (\(1 \leq n \leq 50\)) — длину стороны квадратной решетки.

Вторая строка содержит два целых числа, разделенных пробелами, \(r_1\) и \(c_1\) (\(1 \leq r_1, c_1 \leq n\)), обозначающих клетку, где находится Алиса.

Третья строка строка содержит два целых числа, разделенных пробелами, \(r_2\) и \(c_2\) (\(1 \leq r_2, c_2 \leq n\)), обозначающих клетку, куда намерена попасть Алиса.

Каждая из следующих \(n\) строк содержит строку из \(n\) символов. \(j\)-й символ \(i\)-й такой строки (\(1 \leq i, j \leq n\)) это 0, если клетка \((i, j)\) — земля, и 1, если клетка \((i, j)\) — вода.

Гарантируется, что и \((r_1, c_1)\), и \((r_2, c_2)\) это земля.

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

Выведите одно целое число — минимальную возможную стоимость постройки не более одного туннеля так, чтобы Алиса смогла добраться от клетки \((r_1, c_1)\) до клетки \((r_2, c_2)\).

Примечание

В первом примере должен быть построен туннель между клетками \((1, 4)\) и \((4, 5)\). Стоимость такого туннеля равна \((1-4)^2 + (4-5)^2 = 10\), что является оптимальным. Таким образом, Алиса сможет дойти от \((1, 1)\) до \((1, 4)\), использовать туннель от \((1, 4)\) до \((4, 5)\), а затем дойти от \((4, 5)\) до \((5, 5)\).

Во втором примере должен быть построен туннель между клетками \((1, 3)\) и \((3, 1)\). Стоимость такой постройки равна \((1-3)^2 + (3-1)^2 = 8\).

D. Выбор гурмана

графы дп жадные алгоритмы поиск в глубину и подобное снм *2000

Гурман Яблочков работает редактором известного гастрономического издания. Он разъезжает по всему миру, дегустируя новые изыски именитых шеф-поваров самых фешенебельных ресторанов высокой кухни. У Яблочкова есть свой фирменный способ ревью: в каждом заведении Яблочков заказывает два набора блюд в разные дни. Все заказанные блюда разные, так как Яблочков не любит есть одно и то же. Для каждой пары блюд из разных наборов он точно помнит, какое из них лучше по его ощущениям, или что они одинаковы по вкусовым качествам. Затем гурман оценивает каждое блюдо положительным целым числом.

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

Гурман в первый день дегустировал набор из \(n\) блюд, во второй день набор из \(m\) блюд. Он составил таблицу ощущений \(a\) размером \(n \times m\), в которой описал свои впечатления. Если по мнению эксперта блюдо \(i\) из первого набора лучше блюда \(j\) из второго набора, то \(a_{ij}\) равно «>», в противоположном случае \(a_{ij}\) равно «<». Блюда также могут быть равны по уровню, тогда \(a_{ij}\) равно «=».

Теперь Яблочков хочет, чтобы вы помогли ему оценить каждое блюдо в наборах целым положительным числом. Так как Яблочков очень строгий дегустатор, то постарается оценить блюда так, чтобы максимальная из оценок была как можно меньше. В то же время Яблочков очень справедливый, поэтому никогда не оценивает блюда так, чтобы это шло вразрез с его ощущениями. Другими словами, если \(a_{ij}\) равно «<», то оценка блюда \(i\) из первого набора должна быть меньше оценки блюда \(j\) из второго набора, если \(a_{ij}\) равно «>», то должна быть больше, а если \(a_{ij}\) равно «=», то должна совпадать.

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

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

В первой строке заданы два целых числа \(n\) и \(m\) (\(1 \leq n, m \leq 1000\)) — количества блюд в каждый из двух дней.

Каждая из следующих \(n\) строк содержит строку из \(m\) символов, \(j\)-й символ в \(i\)-й строке задаёт значение \(a_{ij}\). Все строки состоят только из символов «<», «>» и «=».

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

В первой строке выведите «Yes», если можно сделать корректную оценку всем блюдам и «No» иначе.

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

Примечание

В первом примере все блюда первого дня лучше всех блюд второго дня. Значит, самой высокой оценкой будет \(2\) для всех блюд первого дня.

В третьем примере таблица противоречива: нет ни одного набора оценок, который удовлетворял бы ей.

E. Рюкзак

дп жадные алгоритмы поиск в глубину и подобное *2300

У вас есть набор предметов, у каждого из которых есть какой-то целочисленный вес не более \(8\). Вы называете подмножество набора предметов хорошим, если суммарный вес предметов в подмножестве не превосходит \(W\).

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

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

В первой строке записано одно целое число \(W\) (\(0 \le W \le 10^{18}\)) — максимально возможный вес хорошего подмножества.

Вторая строка описывает набор предметов, который у вас есть. Она содержит \(8\) целых чисел \(cnt_1\), \(cnt_2\), ..., \(cnt_8\) (\(0 \le cnt_i \le 10^{16}\)), где \(cnt_i\) — количество предметов веса \(i\) в наборе.

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

Выведите одно целое число — максимальный вес хорошего подмножества.

F2. Покрывающее дерево с одной фиксированной степенью

графы жадные алгоритмы Конструктив поиск в глубину и подобное снм *1900

Задан неориентированный невзвешенный связный граф, состоящий из \(n\) вершин и \(m\) ребер. Гарантируется, что в графе отсутствуют петли и кратные ребра.

Ваша задача — найти любое такое покрывающее дерево этого графа, что степень первой вершины (вершины с номером \(1\)) вершины равна \(D\) (или сказать, что таких покрывающих деревьев не существует). Напомним, что степень вершины — это количество ребер, инцидентных ей.

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

Первая строка входных данных содержит три целых числа \(n\), \(m\) и \(D\) (\(2 \le n \le 2 \cdot 10^5\), \(n - 1 \le m \le min(2 \cdot 10^5, \frac{n(n-1)}{2}), 1 \le D < n\)) — количество вершин, количество ребер и необходимая степень первой вершины соответственно.

Следующие \(m\) строк описывают ребра: ребро \(i\) представлено в виде пары целых чисел \(v_i\), \(u_i\) (\(1 \le v_i, u_i \le n\), \(u_i \ne v_i\)), которые означают номера вершин, соединяемых этим ребром. В заданном графе отсутствуют петли и кратные ребра, то есть для каждой пары (\(v_i, u_i\)) в списке ребер не существует других пар (\(v_i, u_i\)) или (\(u_i, v_i\)), также для каждой пары \((v_i, u_i)\) выполняется условие \(v_i \ne u_i\).

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

Если не существует покрывающего дерева, удовлетворяющего условию задачи выведите «NO» в первой строке.

Иначе выведите «YES» в первой строке и затем выведите \(n-1\) строк, описывающих ребра такого покрывающего дерева, что степень первой вершины (вершины с номером \(1\)) равна \(D\). Убедитесь, что ребра выводимого покрывающего дерева представляют собой подмножество ребер входных данных (порядок ребер не важен, также ребро \((v, u)\) может быть выведено как \((u, v)\)).

Если существует несколько возможных ответов, выведите любой.

Примечание

Картинка, соответствующая первому и второму тестовым примерам:

Картинка, соответствующая третьему тестовому примеру:

C. Дерево и рёбра

графы Деревья математика поиск в глубину и подобное снм *1500

Вам дано дерево (связный неориентированный граф без циклов), состоящее из \(n\) вершин. Каждое из \(n - 1\) рёбер дерева покрашено в чёрный или красный цвет.

Вам также дано целое число \(k\). Рассмотрим последовательности из \(k\) вершин. Скажем, что последовательность \([a_1, a_2, \ldots, a_k]\) является хорошей, если она удовлетворяет следующему:

  • Мы пройдём некоторый путь в дереве (возможно посещающий несколько раз одну и ту же вершину или ребро), начинающийся в \(a_1\) и заканчивающийся в \(a_k\).
  • Начнём в \(a_1\), затем перейдём в \(a_2\) по кратчайшему пути между \(a_1\) и \(a_2\), затем перейдём в \(a_3\) аналогичным образом, и так далее, пока наконец не пройдём кратчайший путь из \(a_{k-1}\) в \(a_k\).
  • Если в результате такого процесса мы пройдём хотя бы по одному чёрному ребру, то последовательность является хорошей.

Рассмотрим дерево, изображенное на рисунке. Если \(k=3\), то следующие последовательности являются хорошими: \([1, 4, 7]\), \([5, 5, 3]\) и \([2, 3, 7]\). Следующие последовательности не являются хорошими: \([1, 4, 6]\), \([5, 5, 5]\), \([3, 7, 3]\).

Всего есть \(n^k\) последовательностей вершин, посчитайте сколько из них являются хорошими. Так как это число может быть очень большим, выведите его по модулю \(10^9+7\).

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

Первая строка содержит два целых числа \(n\) и \(k\) (\(2 \le n \le 10^5\), \(2 \le k \le 100\)),  — размер дерева и длина последовательности вершин.

Каждая из следующих \(n - 1\) строк содержит три целых числа \(u_i\), \(v_i\) и \(x_i\) (\(1 \le u_i, v_i \le n\), \(x_i \in \{0, 1\}\)) — где \(u_i\) и \(v_i\) задают концы соответствующего ребра, а \(x_i\) задаёт его цвет (\(0\) обозначает красное ребро, а \(1\) чёрное).

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

Выведите одно число — количество хороших последовательностей по модулю \(10^9 + 7\).

Примечание

В первом примере все последовательности (\(4^4\)) длины \(4\) являются хорошими, кроме следующих:

  • \([1, 1, 1, 1]\)
  • \([2, 2, 2, 2]\)
  • \([3, 3, 3, 3]\)
  • \([4, 4, 4, 4]\)

Во втором примере, все рёбра красные, а значит нет ни одной хорошей последовательности.

G. Приватизация дорог в Древляндии

Бинарный поиск графы Деревья жадные алгоритмы Конструктив поиск в глубину и подобное *1900

Древляндия состоит из \(n\) городов и \(n-1\) дороги. Все дороги являются двусторонними и соединяют пару различных городов. Из любого города по дорогам можно добраться до любого другого. Всё верно, топология страны — это именно неориентированное дерево.

В Древляндии есть несколько частных дорожных компаний. Правительство решило передать дороги в собственность компаний. После приватизации каждая дорога будет принадлежать какой-то одной компании, одна компания может владеть несколькими дорогами.

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

Выберите такое минимальное количество компаний \(r\), что возможно распределить все дороги по этим компаниям так, что количество городов с двумя или более дорогами одной компании не превосходит \(k\). Другими словами, назовём город хорошим, если все его дороги принадлежат различным компаниям. Ваша задача найти минимальное \(r\), что существует распределение всех дорог по компаниям от \(1\) до \(r\), что количество не являющимися хорошими городов не превосходит \(k\).

Картинка иллюстрирует первый пример (\(n=6, k=2\)). Ответ на этот тест содержит \(r=2\) компании. Числа на рёбрах соответствуют номерам дорог. Цвета рёбер соответствуют компаниям: красный цвет обозначает первую компанию, синий цвет обозначает вторую компанию. Серая вершина (с номером \(3\)) соответвует городу, который не является хорошим. Количество таких вершин (в данном случае, только одна) не превосходит \(k=2\). Невозможно получить не более \(k=2\) таких вершин, если ответ содержит только одну компанию.
Входные данные

В первой строке записаны два целых числа \(n\) и \(k\) (\(2 \le n \le 200000, 0 \le k \le n - 1\)) — количество городов и максимальное возможное количество городов с двумя или более дорогами одной компании.

Следующие \(n-1\) строк содержат описания дорог, по одному описанию в строке. Каждая строка содержит пару целых чисел \(x_i\), \(y_i\) (\(1 \le x_i, y_i \le n\)), где \(x_i\), \(y_i\) — номера городов, которые соединены \(i\)-й дорогой.

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

В первую строку выведите искомое число \(r\) (\(1 \le r \le n - 1\)). Во вторую строку выведите \(n-1\) целое число \(c_1, c_2, \dots, c_{n-1}\) (\(1 \le c_i \le r\)), где \(c_i\) — это номер компании, которая должна владеть \(i\)-й дорогой. Если ответов несколько, то выведите любой из них.

B. Lynyrd Skynyrd

Деревья дп математика поиск в глубину и подобное Структуры данных *2000

Недавно Линэрд и Скинэрд отправились в магазин, где Линэрд купил себе перестановку \(p\) длины \(n\), а Скинэрд купил себе массив \(a\) длины \(m\), состоящий из чисел от \(1\) до \(n\).

Линэрду и Скинэрду скучно, поэтому они решили задать вам \(q\) вопросов, имеющих следующий вид: «есть ли у подотрезка массива \(a\) c \(l\)-й по \(r\)-ю позицию включительно подпоследовательность, которая является циклическим сдвигом \(p\)?».

Перестановка длины \(n\) — это последовательность из \(n\) чисел, в которой каждое число от \(1\) до \(n\) встречается ровно один раз.

Циклический сдвиг перестановки \((p_1, p_2, \ldots, p_n)\) — это перестановка \((p_i, p_{i + 1}, \ldots, p_{n}, p_1, p_2, \ldots, p_{i - 1})\) для какого-то \(i\) от \(1\) до \(n\). Так, например, у перестановки \((2, 1, 3)\) есть три различных циклических сдвига: \((2, 1, 3)\), \((1, 3, 2)\), \((3, 2, 1)\).

Подпоследовательность подотрезка массива \(a\) с \(l\)-й по \(r\)-ю позицию включительно — это последовательность \(a_{i_1}, a_{i_2}, \ldots, a_{i_k}\) для каких-то \(i_1, i_2, \ldots, i_k\) таких, что \(l \leq i_1 < i_2 < \ldots < i_k \leq r\).

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

В первой строке даны три целых числа \(n\), \(m\), \(q\) (\(1 \le n, m, q \le 2 \cdot 10^5\)) — длина перестановки \(p\), длина массива \(a\) и число запросов.

В следующей строке даны \(n\) целых чисел от \(1\) до \(n\), \(i\)-е из них — \(i\)-й элемент перестановки. Каждое число от \(1\) до \(n\) встречается ровно один раз.

В следующей строке даны \(m\) целых чисел от \(1\) до \(n\), \(i\)-е из них — \(i\)-й элемент массива \(a\).

В следующих \(q\) строках дано описание запросов. В \(i\)-й из этих строк даны два целых числа \(l_i\) и \(r_i\) (\(1 \le l_i \le r_i \le m\)), означающие, что \(i\)-й вопрос относится к отрезку массива с \(l_i\)-й по \(r_i\)-ю позицию включительно.

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

В единственной строке выведите строку длины \(q\), состоящую из \(0\) и \(1\), при этом на \(i\)-й позиции должна стоять \(1\), если у подотрезка массива \(a\) c \(l_i\)-й по \(r_i\)-ю позицию включительно есть подпоследовательность, которая является циклическим сдвигом \(p\), и \(0\) в противном случае.

Примечание

В первом примере отрезок с \(1\)-й по \(5\)-ю позицию это \(1, 2, 3, 1, 2\). В нём есть подпоследовательность \(1, 3, 2\), которая является циклическим сдвигом перестановки. В отрезке с \(2\)-й по \(6\)-ю позицию есть подпоследовательность \(2, 1, 3\), совпадающая с перестановкой. Отрезок с \(3\)-й по \(5\)-ю позицию это \(3, 1, 2\), в нём есть только одна подпоследовательность длиной \(3\) (\(3, 1, 2\)), но она не совпадает ни с каким циклическим сдвигом перестановки.

Во втором примере у перестановки циклические сдвиги это \(1, 2\) и \(2, 1\). Отрезок с \(1\)-й по \(2\)-ю позицию это \(1, 1\), его подпоследовательности не совпадает ни с каким циклическим сдвигом перестановки. Отрезок с \(2\)-й по \(3\)-ю позицию это \(1, 2\), он совпадает с перестановкой. Отрезок с \(3\)-й по \(4\)-ю позицию это \(2, 2\), его подпоследовательности не совпадает ни с каким циклическим сдвигом перестановки.

C. Queen

Деревья поиск в глубину и подобное *1400

Вам дано корневое дерево, вершины которого пронумерованы от \(1\) до \(n\). Дерево — это связный граф без циклов. В корневом дереве есть выделенная вершина, называющаяся корнем.

Предками вершины \(i\) называются все вершины, лежащие на пути от корня до вершины \(i\), кроме самой вершины \(i\). Родителем вершины \(i\) называется ближайший к \(i\) предок \(i\). В данном вам дереве родитель вершины \(i\) имеет номер \(p_i\). Для корня величина \(p_i\) равна \(-1\).

Пример возможного дерева для \(n=8\), корнем является вершина \(5\). Родителем вершины \(2\) является вершина \(3\), а родителем вершины \(1\) является вершина \(5\). Предками вершины \(6\) являются вершины \(4\) и \(5\), а предками вершины \(7\) являются вершины \(8\), \(3\) и \(5\)

Вы заметили, что некоторые вершины не уважают других. А именно, если \(c_i = 1\), то вершина \(i\) не уважает каждого из своих предков, а если \(c_i = 0\), то она их уважает.

Вы решили по очереди удалять из дерева вершины: на каждом шаге вы выбираете не корневую вершину, которая не уважает своего родителя, и которую не уважают все вершины, для которых она является родителем. Если таких вершин несколько, то вы выбираете вершину с минимальным номером. При удалении вершины \(v\) все вершины, для которых \(v\) была родителем, соединяются ребром с родителем \(v\).

Пример удаления вершины \(7\).

Как только подходящих вершин для удаления нет, вы заканчиваете процесс. Выведите порядок, в котором вы удалите вершины. Обратите внимание, что этот порядок задается однозначно.

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

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

Далее в \(n\) строках идёт идёт описание вершин дерева: в \(i\)-й строке находятся два целых числа \(p_i\) и \(c_i\) (\(1 \le p_i \le n\), \(0 \le c_i \le 1\)), где \(p_i\) — номер родителя вершины \(i\), а \(c_i = 0\), если вершина \(i\) уважает своих предков, и \(c_i = 1\), если вершина \(i\) не уважает никого из своих предков. У корня дерева вместо номера предка записано число \(-1\), для нее \(c_i=0\). Гарантируется, что значения \(p_i\) задают некоторое корневое дерево из \(n\) вершин.

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

В случае, если вы удалите хотя бы одну вершину, в единственной строке через пробел выведите номера всех удаленных вершин в том порядке, в котором вы их удалите. В случае, если никого не нужно удалять, выведите единственное число \(-1\).

Примечание

Процесс удаления в первом примере будет происходить по следующему сценарию (см. картинку ниже, вершины с \(c_i=1\) отмечены жёлтым):

  • сначала будет удалена вершина \(1\), так как она не уважает предков и все вершины, для которых она родитель (это одна вершина \(2\)) ее не уважают, а среди таких вершина номер \(1\) — наименьший номер;
  • вершина \(2\) при этом будет соединена ребром с вершиной \(3\);
  • затем будет удалена вершина \(2\), так как она не уважает предков, и все вершины, для которых она родитель (это одна вершина \(4\)) ее не уважают;
  • при этом вершина \(4\) будет соединена ребром с вершиной \(3\);
  • затем будет удалена вершина \(4\), так как она не уважает предков, и все вершины, для которых она родитель (таких нет) ее не уважают (vacuous truth);
  • из дерева будет удалена вершина \(4\);
  • процесс удаления завершается, так как нет подходящих вершин.

Во втором примере вершины не нужно удалять:

  • у \(2\) и \(3\) есть вершины, для которых они являются родителями, но которые их уважают;
  • \(4\) и \(5\) уважают руководство.

В третьем примере дерево будет меняться следующим образом:

F. Граф без длинных ориентированных путей

графы поиск в глубину и подобное *1700

Дан связный неориентированный граф, состоящий из \(n\) вершин и \(m\) ребер. В заданном графе нет ни петель, ни кратных ребер.

Ориентируйте ребра графа таким образом, что в полученном ориентированном графе не будет путей, состоящих из двух или более ребер.

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

В первой строке заданы два целых числа \(n\) и \(m\) (\(2 \le n \le 2 \cdot 10^5\), \(n - 1 \le m \le 2 \cdot 10^5\)) — количество вершин и ребер, соответственно.

Следующие \(m\) строк задают ребра: ребро \(i\) задается парой вершин \(u_i\), \(v_i\) (\(1 \le u_i, v_i \le n\), \(u_i \ne v_i\)). В заданном графе нет кратных ребер, т. е. для каждой пары (\(u_i, v_i\)) не существует других пар (\(u_i, v_i\)) и (\(v_i, u_i\)) в списке ребер. Также гарантируется, что данный граф является связным (между любой парой вершин существует путь).

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

Если невозможно ориентировать ребра таким образом, что в графе не будет путей из двух или более ребер, выведите "NO" в первой строке.

Иначе в первой строке выведите "YES", а затем выведите любую подходящую ориентацию ребер в виде бинарной строки (строки, состоящей только из '0' и '1') длины \(m\). \(i\)-й символ строки должен быть '0', если \(i\)-е ребро графа надо ориентировать из \(u_i\) в \(v_i\), и '1' в противном случае. Ребра пронумерованы в том же порядке, в котором заданы во входных данных.

Примечание

Граф в первом примере из условия:

Один из возможных ответов:

D. Прыгание лягушки

математика поиск в глубину и подобное теория чисел *2100

Лягушка изначально находится в позиции \(0\) на числовой прямой. У лягушки есть два положительных числа \(a\) и \(b\). Из позиции \(k\) он может перейти либо в позицию \(k+a\), либо в \(k-b\).

Пусть \(f(x)\) — количество различных целых чисел, координаты которых лягушка может достичь, если она всегда будет находиться в интервале \([0, x]\). Лягушке не нужно посещать все эти числа за один раз, то есть число считается, если лягушка может каким-то образом достичь его, если она начинает с \(0\).

Дается число \(m\), найдите \(\sum_{i=0}^{m} f(i)\). Другими словами, найдите сумму по всем \(f(i)\) для всех \(i\) от \(0\) до \(m\).

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

Первая строка содержит три целых числа \(m, a, b\) (\(1 \leq m \leq 10^9, 1 \leq a,b \leq 10^5\)).

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

Выведите одно целое число — искомую сумму.

Примечание

В первом примере нам нужно найти \(f(0)+f(1)+\ldots+f(7)\). У нас есть \(f(0) = 1, f(1) = 1, f(2) = 1, f(3) = 1, f(4) = 1, f(5) = 3, f(6) = 3, f(7) = 8\). Сумма этих чисел равна \(19\).

Во втором примере \(f(i) = i+1\), то есть нужно найти сумму \(\sum_{i=0}^{10^9} i+1\).

В третьем примере лягушка не может прыгать.

D. Палиндромный XOR

графы поиск в глубину и подобное *2400

Вам дана строка \(s\), состоящая из символов «1», «0» и «?». Гарантируется, что первый символ в \(s\) будет «1». Пусть \(m\) будет количеством символов в \(s\).

Подсчитайте количество способов выбрать пару целых чисел \(a, b\), которые удовлетворяют следующему:

  • \(1 \leq a < b < 2^m\)
  • При записи без начальных нулей двоичные представления \(a\) и \(b\) являются палиндромами.
  • Двоичное представление побитового XOR \(a\) и \(b\) подходит под шаблон \(s\). Строка \(t\) подходит под шаблон \(s\), если длины \(t\) и \(s\) одинаковы и для каждого \(i\), \(i\)-й символ \(t\) равен \(i\)-му символу в \(s\), или же \(i\)-й символ в \(s\) равен «?».

Посчитайте это по модулю \(998244353\).

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

Первая строка содержит строку \(s\) (\(1 \leq |s| \leq 1\,000\)). \(s\) состоит только из «1», «0» and «?». Гарантируется, что первый символ в \(s\) — это «1».

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

Выведите одно целое число — количество пар, удовлетворяющих условиям, по модулю \(998244353\).

Примечание

В первом примере, нам подходят \((111, 10001), (11, 10101), (1001, 11111)\).

A. Праздник

графы Деревья поиск в глубину и подобное *900

В компании работает n сотрудников, пронумерованных от 1 до n. У каждого сотрудника либо нет руководителя, либо есть ровно один непосредственный руководитель — некоторый другой сотрудник с другим номером. Сотрудник A называется начальником другого сотрудника B, если выполняется хотя бы одно из двух условий:

  • Сотрудник A — непосредственный руководитель сотрудника B.
  • У сотрудника B есть непосредственный руководитель, сотрудник C, такой, что A является начальником сотрудника C.

В структуре компании нет циклов. То есть никакой сотрудник не является начальником своего непосредственного руководителя.

Сегодня компания собирается организовать праздник. Для этого необходимо разделить всех n сотрудников на несколько групп: каждый человек должен относиться ровно к одной группе. Более того, в каждой группе не должно быть таких двух сотрудников A и B, что A является начальником B.

Ваша задача — найти наименьшее возможное количество таких групп.

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

Первая строка содержит целое число n (1 ≤ n ≤ 2000) — количество сотрудников.

Следующие n строк содержат целые числа pi (1 ≤ pi ≤ n или pi = -1). Каждое pi обозначает непосредственного руководителя i-го сотрудника. Если pi равно -1, то i-ый сотрудник не имеет непосредственного руководителя.

Гарантируется, что никакой сотрудник не является своим собственным непосредственным руководителем (pi ≠ i). Также гарантируется, что структура компании не содержит циклов.

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

Выведите единственное целое число — минимальное количество групп, на которые можно разделить всех сотрудников.

Примечание

В первом примере достаточно трех групп:

  • Сотрудник 1
  • Сотрудники 2 и 4
  • Сотрудники 3 и 5

B. Кошачье преобразование фурфурье

битмаски Конструктив математика поиск в глубину и подобное *1300

Кошачье преобразование фурфурье это популярный алгоритм в программировании, использующийся при создании длинных кошек. Неко хочет применить этот алгоритм, чтобы создать идеальную длинную кошку.

Предположим у нас есть кошка с целым числом \(x\). Идеальная длинная кошка это кошка с числом равным \(2^m - 1\) для некоторого неотрицательного \(m\). Например числа \(0\), \(1\), \(3\), \(7\), \(15\) подходят для идеальных длинных кошек.

В кошачьем преобразовании фурфурье можно менять \(x\) используя следующие операции:

  • (Операция А): вы выбираете произвольное неотрицательное число \(n\) и заменяете \(x\) на \(x \oplus (2^n - 1)\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ.
  • (Операция Ы): заменить \(x\) на \(x + 1\).

Первая применённая операция должна быть типа А, вторая операция — типа Ы, третья снова типа А, и так далее. Формально, если пронумеровать операции с единицы в порядке их выполнения, то операции с нечётным номером должны быть типа А, а операции с чётным номером — типа Ы.

Неко хочет производит идеальных длинных кошек в промышленном масштабе, поэтому на одну кошку он может потратить не более \(40\) операций. Можете ли вы ему помочь и составить план операций, которые нужно проделать?

Обратите внимание, что не требуется минимизировать число выполненных операций. Достаточно лишь, чтобы число операций не превосходило \(40\).

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

Единственная строка содержит одно целое число \(x\) (\(1 \le x \le 10^6\)).

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

В первой строке выведите одно целое число \(t\) (\(0 \le t \le 40\)) — количество операций, которое нужно применить.

Затем для каждой операции с нечётным номером выведите соответствующее число \(n_i\) в ней. В частности, выведите \(\lceil \frac{t}{2} \rceil\) целых чисел \(n_i\) (\(0 \le n_i \le 30\)), обозначающих замену \(x\) на \(x \oplus (2^{n_i} - 1)\) в соответствующем шаге.

В случае если существует несколько возможных ответов, выведите любой из них. Можно показать, что в ограничениях задачи существует хотя бы один возможный ответ.

Примечание

В первом примере один из возможных способов преобразовывать число выглядит следующим образом: \(39 \to 56 \to 57 \to 62 \to 63\). Или более подробно:

  1. Выбираем \(n = 5\). \(x\) заменяется на \(39 \oplus 31\), то есть \(56\).
  2. Увеличиваем \(x\) на \(1\), тем самым он становится равным \(57\).
  3. Выбираем \(n = 3\). \(x\) заменяется на \(57 \oplus 7\), то есть \(62\).
  4. Увеличиваем \(x\) на \(1\), тем самым он становится равным \(63 = 2^6 - 1\).

Во втором и третьем примере число можно не преобразовывать.

E. Неко и флэшбеки

графы Конструктив поиск в глубину и подобное *2400

Перестановкой длины \(k\) называется последовательность из \(k\) целых чисел от \(1\) до \(k\), в которой каждое число встречается ровно один раз. Например последовательность \([3, 1, 2]\) является перестановкой длины \(3\).

Когда Неко было пять лет, он придумал массив \(a\) из \(n\) положительных целых чисел и перестановку \(p\) длины \(n - 1\). Затем он выполнил следующее:

  • Составил массив \(b\) длины \(n-1\), где \(b_i = \min(a_i, a_{i+1})\).
  • Составил массив \(c\) длины \(n-1\), где \(c_i = \max(a_i, a_{i+1})\).
  • Составил массив \(b'\) длины \(n-1\), где \(b'_i = b_{p_i}\).
  • Составил массив \(c'\) длины \(n-1\), где \(c'_i = c_{p_i}\).

Например, если массив \(a\) был равен \([3, 4, 6, 5, 7]\), а перестановка \(p\) была равна \([2, 4, 1, 3]\), то Неко составил бы массивы следующим образом:

  • \(b = [3, 4, 5, 5]\)
  • \(c = [4, 6, 6, 7]\)
  • \(b' = [4, 5, 3, 5]\)
  • \(c' = [6, 7, 4, 6]\)

Затем он записал массивы \(b'\) и \(c'\) на бумажку, после чего благополучно о ней забыл. Спустя 14 лет, в процессе уборки своей комнаты, он обнаружил эту старую бумажку с массивами \(b'\) и \(c'\). К сожалению, Неко не смог вспомнить какой массив \(a\) и перестановку \(p\) он при этом использовал.

В случае если Неко ошибся, и массива \(a\) и перестановки \(p\), приводящим к таким \(b'\) и \(c'\) не существует, выведите -1. Иначе помогите восстановить ему любой возможный массив \(a\).

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

Первая строка содержит одно целое число \(n\) (\(2 \leq n \leq 10^5\)) — количество элементов в массиве \(a\).

Вторая строка содержит \(n-1\) целых чисел \(b'_1, b'_2, \ldots, b'_{n-1}\) (\(1 \leq b'_i \leq 10^9\)).

Третья строка содержит \(n-1\) целых чисел \(c'_1, c'_2, \ldots, c'_{n-1}\) (\(1 \leq c'_i \leq 10^9\)).

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

В случае если Неко совершил ошибку и массива \(a\) и перестановки \(p\), приводящих к описанным \(b'\) и \(c'\) не существует, то выведите -1, иначе выведите \(n\) целых чисел \(a_i\) (\(1 \le a_i \le 10^9\)), обозначающих элементы массива \(a\).

В случае если существует несколько возможных решений, выведите любое из них.

Примечание

Первый пример разобран в условии задачи.

В третьем примере для \(a = [3, 4, 5, 2, 1, 4, 3, 2]\), возможная перестановка \(p\) выглядит следующим образом \([7, 1, 5, 4, 3, 2, 6]\). В таком случае Неко построил бы следующие:

  • \(b = [3, 4, 2, 1, 1, 3, 2]\)
  • \(c = [4, 5, 5, 2, 4, 4, 3]\)
  • \(b' = [2, 3, 1, 1, 2, 4, 3]\)
  • \(c' = [3, 4, 4, 2, 5, 5, 4]\)

D. Сервал и подвешенное дерево

Бинарный поиск Деревья дп жадные алгоритмы поиск в глубину и подобное *1900

Теперь Сервал — младший ученик средней школы Джапари, и он все еще в восторге от математики, как и раньше.

Как математически талантливый мальчик, он любит играть с числами. На этот раз он хочет поиграть с числами на подвешенном дереве.

Деревом называется связный граф без циклов. Подвешенное дерево имеет выделенную вершину, называемую корнем. Родителем вершины \(v\) называется последняя отличная от \(v\) вершина на пути от корня к вершине \(v\). Дети вершины \(v\) — все вершины, для которых \(v\) является родителем. Вершина называется листом, если у нее нет детей.

Подвешенное дерево Сервала имеет \(n\) вершин, корень дерева — вершина \(1\). Сервал хочет написать по одному числу в каждую из вершин, но есть некоторые ограничения. В каждой из вершин, кроме листьев, записана операция \(\max\) или \(\min\), указывающая, что число в этой вершине должно быть равно максимуму или минимуму среди всех чисел, написанных в ее детях, соответственно.

Предположим, что в дереве \(k\) листьев. Сервал хочет написать числа \(1, 2, \ldots, k\) в эти \(k\) листьев (каждое число должно использоваться ровно один раз). Он любит большие числа, поэтому он хочет максимизировать число в корне. Как его лучший друг, вы можете помочь ему?

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

Первая строка содержит целое число \(n\) (\(2 \leq n \leq 3\cdot 10^5\)) — количество вершин в дереве.

Вторая строка содержит \(n\) целых чисел, \(i\)-е из них описывает операцию на вершине \(i\). \(0\) обозначает \(\min\) и \(1\) обозначает \(\max\). Если вершина является листом, будет записано \(0\) или \(1\), но вы можете игнорировать это число.

Третья строка содержит \(n-1\) целое число \(f_2, f_3, \ldots, f_n\) (\(1 \leq f_i \leq i-1\)), где \(f_i\) обозначает родителя вершины \(i\).

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

Выведите одно целое число — максимальное значение числа в корне, которое Сервал может получить.

Примечание

Примеры показаны на рисунках ниже. Числа, написанные в середине вершин, являются их номерами, а сверху написаны числа, которые пишет Сервал.

В первом примере, независимо от того, как вы расположите числа, ответ будет \(1\).

Во втором примере, независимо от того, как вы расположите числа, ответ будет \(4\).

В третьем примере одним из оптимальных решений для достижения \(4\) является расстановка чисел \(4\) и \(5\) на вершины \(4\) и \(5\).

В четвертом примере оптимальным решением является поставить число \(5\) на вершину \(5\).

B. Противные пары

жадные алгоритмы поиск в глубину и подобное реализация сортировки Строки *1800

Задана строка, состоящая из строчных латинских букв.

Пара соседних букв в строке считается противной, если данные буквы так же соседние в алфавите. Например, строка «abaca» содержит противные пары на позициях \((1, 2)\) — «'ab» и \((2, 3)\) — «ba». Буквы 'a' и 'z' не считаются соседними в алфавите.

Можете ли вы так переставить местами буквы в данном строке, чтобы в ней не было противных пар? Выбирая новый порядок, помните, что нельзя добавлять в строку новые буквы или удалять уже имеющиеся. Также можно сохранить начальный порядок.

Если существует несколько ответов, выведите любой из них.

Также требуется ответить на \(T\) независимых запросов.

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

В первой строке записано одно целое число \(T\) (\(1 \le T \le 100\)) — количество запросов.

В каждой из следующих \(T\) строк записана строка \(s\) \((1 \le |s| \le 100)\) — очередной запрос. Гарантируется, что она содержит только строчные латинские буквы.

Обратите внимание, во взломах можно использовать только \(T = 1\).

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

Выведите \(T\) строк. В \(i\)-й строке должен быть записан ответ на \(i\)-й запрос.

Если ответ на \(i\)-й запрос существует, то выведите строку с новым порядком букв такую, что она не содержит противных пар. Выбирая новый порядок, помните, что нельзя добавлять в строку новые буквы или удалять уже имеющиеся. Также можно сохранить начальный порядок.

Если существует несколько ответов, выведите любой из них.

Если ответа на запрос нет, выведите «No answer».

Примечание

В первом примере ответ «bdac» также корректен.

Второй пример показывает, что только соседние буквы в алфавите неприемлемы. Одинаковые подходят.

В третьем примере множество правильных ответов.

D. 0-1-Дерево

Деревья дп поиск в глубину и подобное разделяй и властвуй снм *2200

Задано дерево (неориентированный связный ацикличный граф), состоящее из \(n\) вершин и \(n - 1\) ребра. На каждом ребре записано число, каждое из чисел — это либо \(0\) (назовем такие ребра \(0\)-ребрами), либо \(1\) (назовем их \(1\)-ребрами).

Назовем упорядоченную пару вершин \((x, y)\) (\(x \ne y\)) корректной, если при проходе по простому пути от \(x\) до \(y\) мы никогда не пройдем по \(0\)-ребру после прохода по \(1\)-ребру. Ваша задача — посчитать количество корректных пар в дереве.

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

Первая строка входных данных содержит одно целое число \(n\) (\(2 \le n \le 200000\)) — количество вершин в дереве.

Затем следует \(n - 1\) строка, каждая из которых описывает ребро дерева. Каждое ребро представлено в виде трех целых чисел \(x_i\), \(y_i\) и \(c_i\) (\(1 \le x_i, y_i \le n\), \(0 \le c_i \le 1\), \(x_i \ne y_i\)) — вершины, соединенные этим ребром, и число, записанное на нем, соответственно.

Гарантируется, что заданный набор ребер формирует дерево.

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

Выведите одно целое число — количество корректных пар вершин.

Примечание

Картинка, соответствующая первому тестовому примеру:

C. Восстановление перестановки

графы жадные алгоритмы Конструктив математика поиск в глубину и подобное сортировки Структуры данных *2100

Вася написал в тетради некоторую перестановку \(p_1, p_2, \ldots, p_n\) чисел от \(1\) до \(n\), то есть для всех \(1 \leq i \leq n\) выполнено \(1 \leq p_i \leq n\), и все \(p_1, p_2, \ldots, p_n\) различны. После этого он записал \(n\) значений \(next_1, next_2, \ldots, next_n\). Значение \(next_i\) равно минимальному индексу \(i < j \leq n\), такому что \(p_j > p_i\). Если такого \(j\) не существует, то определим значение как \(next_i = n + 1\).

Вечером Вася шел домой из школы, и из-за дождя тетрадь намокла. Теперь некоторые написанные числа невозможно разобрать. Перестановка, а также некоторые значения \(next_i\) полностью утеряны! Если для какого-то \(i\) значение \(next_i\) теперь неизвестно, то скажем, что \(next_i = -1\).

Вам даны значения \(next_1, next_2, \ldots, next_n\) (возможно, некоторые числа теперь равны \(-1\)). Помогите Васе найти любую такую перестановку \(p_1, p_2, \ldots, p_n\) чисел от \(1\) до \(n\), что он может записать её в тетрадь, и все значения \(next_i\), не равные \(-1\), будут посчитаны правильно.

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

В первой строке находится одно целое число \(t\) — количество тестовых случаев (\(1 \leq t \leq 100\,000\)).

В следующих \(2 \cdot t\) строках находится описание тестовых случаев, по две строки на каждый. В первой из этих строк находится единственное целое число \(n\) — количество чисел в перестановке, выписанной Васей (\(1 \leq n \leq 500\,000\)). В следующей строке находится \(n\) целых чисел \(next_1, next_2, \ldots, next_n\), разделенных пробелами (\(next_i = -1\) или \(i < next_i \leq n + 1\)).

Гарантируется, что сумма \(n\) по всем тестовым случаям не превосходит \(500\,000\).

Во взломах разрешается использовать только один тестовый случай, то есть \(T = 1\).

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

Выведите \(T\) строк, в \(i\)-й ответ на \(i\)-й тестовый случай.

Если таких перестановок \(p_1, p_2, \ldots, p_n\) чисел от \(1\) до \(n\), которые мог выписать Вася не существует, то выведите единственное число \(-1\).

Иначе выведите \(n\) различных целых чисел \(p_1, p_2, \ldots, p_n\), разделённых пробелами (\(1 \leq p_i \leq n\)). Все определённые значения \(next_i\), не равные \(-1\), должны быть вычислены верно из перестановки \(p_1, p_2, \ldots, p_n\) по определению из условия задачи. Если существует несколько таких перестановок, найдите любую.

Примечание

В первом тестовом случае для перестановки \(p = [1, 2, 3]\) получится \(next = [2, 3, 4]\), так как каждый элемент перестановки меньше следующего. Можно заметить, что это единственная подходящая перестановка.

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

В четвертом тестовом случае не существует ни одной подходящей перестановки, поэтому ответ \(-1\).

C. Распространение новостей

графы поиск в глубину и подобное снм *1400

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

Изначально какой-нибудь пользователь \(x\) узнает новость из какого-то внешнего источника. Затем этот пользователь отправляет новость всем своим друзьям (два пользователя считаются друзьями, если они оба принадлежат к какой-нибудь группе). Друзья продолжают отправлять новость своим друзьям, и так далее. Процесс заканчивается, когда не останется ни одной пары друзей, в которой один пользователь знает новость, а другой — нет.

Для каждого пользователя \(x\) определите, сколько пользователей в конечном итоге узнает новость, если \(x\) начнет ее распространять.

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

В первой строке записаны два целых числа \(n\) и \(m\) (\(1 \le n, m \le 5 \cdot 10^5\)) — the количество пользователей и групп, соответственно.

Затем следуют \(m\) строк, каждая из которых описывает группу. \(i\)-я строка начинается целым числом \(k_i\) (\(0 \le k_i \le n\)) — количество пользователей в \(i\)-й группе. Затем следуют \(k_i\) различных чисел, обозначающих пользователей, принадлежащих к \(i\)-й группе.

Гарантируется, что \(\sum \limits_{i = 1}^{m} k_i \le 5 \cdot 10^5\).

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

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

C. Цикл

графы поиск в глубину и подобное *2000

Турнир — ориентированный граф без петель, в котором каждая пара вершин соединена ровно одним ребром. То есть для любых двух вершин u и v (u ≠ v) либо есть ребро из u в v, либо есть ребро из v в u.

Дан турнир из n вершин. Требуется найти в нем цикл длины три.

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

В первой строке задано целое число n (1 ≤ n ≤ 5000). В следующих n строках задана матрица смежности графа A (без пробелов). Ai, j = 1, если в графе есть ребро из вершины i в вершину j, в противном случае Ai, j = 0. Ai, j обозначает j-ый символ в i-ой строке.

Гарантируется, что заданный граф является турниром, то есть Ai, i = 0, Ai, j ≠ Aj, i (1 ≤ i, j ≤ n, i ≠ j).

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

Выведите три различные вершины графа a1, a2, a3 (1 ≤ ai ≤ n), такие что Aa1, a2 = Aa2, a3 = Aa3, a1 = 1, или «-1», если цикла длины три не существует.

Если решений несколько, выведите любое.

B. Nauoo и окружность

Деревья дп Комбинаторика поиск в глубину и подобное *1900

Nauuo — девочка, которая любит рисовать окружности.

Однажды она нарисовала окружность и захотела нарисовать на ней дерево.

Дерево — это связный неориентированный граф из \(n\) вершин и \(n-1\) ребер. Вершины пронумерованы целыми числами от \(1\) до \(n\).

Nauuo хочет нарисовать дерево на окружности, причем вершины должны лежать на \(n\) различных точках на окружности, а ребра — это отрезки, не пересекающиеся друг с другом.

«Не пересекающиеся друг с другом» означает, что любые два ребра не должны иметь общих точек, кроме концов отрезков.

Nauuo хочет нарисовать дерево, используя перестановку из \(n\) элементов. Перестановка из \(n\) элементов это последовательность целых чисел \(p_1,p_2,\ldots,p_n\), в которой каждое целое число от \(1\) до \(n\) встречается ровно один раз.

После выбора перестановки Nauuo нарисует \(i\)-ю вершину в \(p_i\)-й точке на окружности, а затем нарисует ребра, основываясь на положении вершин.

По данному дереву Nauuo хочет знать, сколько есть перестановок, подходящих под условие (ребра образуют непересекающиеся отрезки между вершинами). Она хочет узнать ответ по модулю \(998244353\), можете ли вы ей помочь?

Очевидно, что корректность перестановки не зависит от выбранных \(n\) точек на окружности.

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

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

В каждой из следующих \(n-1\) строк записаны два целых числа \(u\) и \(v\) (\(1\le u,v\le n\)), описывающих ребро между вершинами \(u\) и \(v\).

Гарантируется, что данные ребра образуют дерево.

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

Выведите одно целое число — количество перестановок, при которых возможно нарисовать дерево на окружности, не нарушая условия, по модулю \(998244353\).

Примечание

Пример 1

Корректные перестановки и их деревья.

А вот пример некорректной перестановки: ребра \((1,3)\) и \((2,4)\) пересекаются.

Example 2

Каждая перестановка приводит к корректному дереву, так что ответ равен \(4! = 24\).

E. Минимальное покрытие отрезков

Деревья дп жадные алгоритмы поиск в глубину и подобное разделяй и властвуй реализация Структуры данных *2200

Даны \(n\) отрезков в формате \([l; r]\) на числовой прямой.

Также даны \(m\) запросов в формате \([x; y]\). Какое минимальное число отрезков надо взять так, чтобы каждая точка (не обязательно целочисленная) от \(x\) до \(y\) была покрыта хотя бы одним из них?

Если нельзя выбрать отрезки так, чтобы каждая точка от \(x\) до \(y\) была покрыта, тогда выведите -1 на этот запрос.

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

В первой строке записаны два целых числа \(n\) и \(m\) (\(1 \le n, m \le 2 \cdot 10^5\)) — количество отрезков и количество запросов, соответственно.

В каждой из следующих \(n\) строк записаны по два целых числа \(l_i\) и \(r_i\) (\(0 \le l_i < r_i \le 5 \cdot 10^5\)) — данные отрезки.

В каждой из следующих \(m\) строк записаны по два целых числа \(x_i\) и \(y_i\) (\(0 \le x_i < y_i \le 5 \cdot 10^5\)) — запросы.

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

Выведите \(m\) целых чисел. \(i\)-е число должно быть ответом на \(i\)-й запрос: либо минимальное число отрезков необходимое, чтобы каждая точка (не обязательно целочисленная) от \(x_i\) до \(y_i\) была покрыта хотя бы одним из них, либо -1, если нельзя выбрать отрезки так, чтобы каждая точка от \(x_i\) до \(y_i\) была покрыта.

Примечание

В первом примере три запроса:

  1. запрос \([1; 3]\) может быть покрыт отрезком \([1; 3]\);
  2. запрос \([1; 4]\) может быть покрыт отрезками \([1; 3]\) и \([2; 4]\). Нельзя покрыть \([1; 4]\) одним отрезком;
  3. запрос \([3; 4]\) может быть покрыт отрезком \([2; 4]\); Не важно, что покрыты какие-то точки вне данного запроса.

Во втором примере четыре запроса:

  1. запрос \([1; 2]\) может быть покрыт отрезком \([1; 3]\). Обратите внимание, что можно выбрать любой из отрезков \([1; 3]\);
  2. запрос \([1; 3]\) может быть покрыт отрезком \([1; 3]\);
  3. запрос \([1; 4]\) не может быть покрыт никаким набором отрезков;
  4. запрос \([1; 5]\) не может быть покрыт никаким набором отрезков. Обратите внимание, что отрезки \([1; 3]\) и \([4; 5]\) вместе не покрывают \([1; 5]\), потому что даже нецелые точки должны быть покрыты. Здесь \(3.5\) не покрыта, например.

D. Восстанавливай!

графы жадные алгоритмы поиск в глубину и подобное сортировки теория чисел *1800

Авторы загадали массив \(a\), состоящий из \(n\) целых чисел; каждое число не меньше \(2\) и не больше \(2 \cdot 10^5\). Вы не знаете его, но Вы знаете массив \(b\), который был получен из массива \(a\) при помощи следующей последовательности операций:

  1. Сначала весь массив \(b\) равен массиву \(a\);
  2. Затем для каждого \(i\) от \(1\) до \(n\):
    • если \(a_i\) является простым числом, тогда число \(p_{a_i}\) добавляется в массив \(b\), где \(p\) — бесконечная последовательность простых чисел (\(2, 3, 5, \dots\));
    • иначе (если \(a_i\) не является простым числом), наибольший делитель \(a_i\), не равный \(a_i\), добавляется в \(b\);
  3. Затем получившийся массив длины \(2n\) перемешивается и дается Вам во входных данных.

Здесь \(p_{a_i}\) означает \(a_i\)-е простое число. Первое простое число \(p_1 = 2\), второе простое число \(p_2 = 3\), и так далее.

Ваша задача — восстановить любой подходящий массив \(a\), который формирует заданный массив \(b\). Гарантируется, что ответ существует (таким образом, массив \(b\) получен из какого-либо подходящего массива \(a\)). Если существует несколько возможных ответов, Вы можете вывести любой.

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

Первая строка входных данных содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество элементов в \(a\).

Вторая строка входных данных содержит \(2n\) целых чисел \(b_1, b_2, \dots, b_{2n}\) (\(2 \le b_i \le 2750131\)), где \(b_i\) равно \(i\)-му элементу \(b\). \(2750131\) является \(199999\)-м простым числом.

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

В единственной строке выходных данных выведите \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(2 \le a_i \le 2 \cdot 10^5\)) в любом порядке — массив \(a\), из которого можно получить массив \(b\) при помощи последовательности ходов, описанных в условии задачи. Если существует несколько возможных ответов, Вы можете вывести любой.

E. Покрывай!

графы Деревья кратчайшие пути поиск в глубину и подобное снм *1700

Задан неориентированный невзвешенный связный граф, состоящий из \(n\) вершин и \(m\) ребер. Гарантируется, что в данном графе нет петель и кратных ребер.

Ваша задача — выбрать не более \(\lfloor\frac{n}{2}\rfloor\) вершин в данном графе так, чтобы каждая невыбранная вершина была смежна (другими словами, связана ребром) с хотя бы одной выбранной вершиной.

Гарантируется, что ответ существует. Если существует несколько решений, выведите любое из них.

Требуется ответить на несколько независимых запросов.

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

В первой строке записано одно целое число \(t\) (\(1 \le t \le 2 \cdot 10^5\)) — количество запросов.

Затем следуют \(t\) запросов.

В первой строке каждого запроса записаны два целых числа \(n\) и \(m\) (\(2 \le n \le 2 \cdot 10^5\), \(n - 1 \le m \le min(2 \cdot 10^5, \frac{n(n-1)}{2})\)) — количество вершин и количество ребер, соответственно.

Следующие \(m\) строк задают ребра: ребро \(i\) представлено парой целых чисел \(v_i\), \(u_i\) (\(1 \le v_i, u_i \le n\), \(u_i \ne v_i\)), являющимися номерами вершин, связянных ребром.

В данном графе нет петель и кратных ребер, т. е. для каждой пары (\(v_i, u_i\)) в списке ребер больше нет пар (\(v_i, u_i\)) или (\(u_i, v_i\)), и для каждой пары (\(v_i, u_i\)) выполняется \(v_i \ne u_i\). Гарантируется, что данных граф связен.

Гарантируется, что \(\sum m \le 2 \cdot 10^5\) по всем запросам.

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

Для каждого запроса выведите две строки.

В первой строке выведите \(k\) (\(1 \le \lfloor\frac{n}{2}\rfloor\)) — количество выбранных вершин.

Во второй строке выведите \(k\) различных целых чисел \(c_1, c_2, \dots, c_k\) в произвольном порядке, где \(c_i\) равно номеру \(i\)-й выбранной вершины.

Гарантируется, что ответ всегда существует. Если существует несколько решений, выведите любое из них.

Примечание

В первом запросе любая вершина или любая пара вершин подойдет.

Обратите внимание, что не обязательно минимизировать количество выбранных вершин. Во втором запросе двух вершин достаточно (вершины \(2\) и \(4\)), но три так же подойдут.

F1. Короткая разноцветная полоска

дп Комбинаторика поиск в глубину и подобное *2200

Это первая подзадача задачи F. Единственные различия между этой и второй подзадачами — это ограничения на значение \(m\) и ограничение по времени. Вам нужно решить обе подзадачи, чтобы взламывать эту подзадачу.

Во вселенной всего есть \(n+1\) разных цветов, пронумерованных от \(0\) до \(n\). Есть полоска, длина которой \(m\) сантиметров, изначально покрашенная в цвет \(0\).

Алиса взяла кисть и начала разукрашивать полоску. Для каждого \(i\) от \(1\) до \(n\) в таком порядке она выбирает два числа \(0 \leq a_i < b_i \leq m\) такие, что отрезок \([a_i, b_i]\) сейчас покрашен одним цветом, и красит его в цвет \(i\).

Алиса выбрала такие отрезки, что сейчас каждый сантиметр имеет отличный от \(0\) цвет. Формально, отрезок \([i-1, i]\) покрашен в цвет \(c_i\) (\(c_i \neq 0\)). Каждый цвет, кроме \(0\), виден на полоске.

Посчитайте количество пар последовательностей \(\{a_i\}_{i=1}^n\), \(\{b_i\}_{i=1}^n\), которые дадут заданную полоску.

Так как это число может быть очень большим, выведите его по модулю \(998244353\).

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

Первая строка содержит два целых числа \(n\), \(m\) (\(1 \leq n \leq 500\), \(n = m\)) — количество цветов, исключая цвет \(0\), и длина полоски, соответственно.

Вторая строка содержит \(m\) целых чисел \(c_1, c_2, \ldots, c_m\) (\(1 \leq c_i \leq n\)) — цвет, который видно на отрезке \([i-1, i]\) после того, как раскраска закончилась. Гарантируется, что для каждого \(j\) от \(1\) до \(n\) есть индекс \(k\) такой, что \(c_k = j\).

Обратите внимание, что так как, в этой подзадаче \(n = m\), то \(c\) — это перестановка целых чисел от \(1\) до \(n\).

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

Выведите одно целое число — количество способов получить такую полоску по модулю \(998244353\).

Примечание

В первом примере всего есть \(5\) способов, все они показаны на рисунке ниже. Здесь \(0\) — белый цвет, \(1\) — красный, \(2\) — зеленый, а \(3\) — синий.

Ниже показан пример неправильной раскраски. Во второй операции отрезок 1 3 не покрашен ни в один цвет, поэтому он не может быть покрашен в цвет \(2\).

G. Самая удивительная вершина

поиск в глубину и подобное Структуры данных *3000

Вам дано корневое дерево с \(n\) вершинами. Вершины нумеруются от \(1\) до \(n\); корнем является вершина \(1\).

С каждой вершиной связаны два числа: \(a_i\) и \(b_i\). Обозначим множество всех предков \(v\) (включая саму вершину \(v\)) как \(R(v)\). Обозначим крутость вершины \(v\) как

\(\)\left| \sum_{w \in R(v)} a_w\right| \cdot \left|\sum_{w \in R(v)} b_w\right|,\(\)

где \(|x|\) обозначает абсолютную величину \(x\).

Нужно выполнить \(q\) запросов двух типов:

  • 1 v x — увеличить \(a_v\) на положительное число \(x\).
  • 2 v — найти максимальную крутость в поддереве вершины \(v\).
Входные данные

Первая строка содержит два целых числа \(n\) и \(q\) (\(1 \leq n \leq 2\cdot 10^5, 1 \leq q \leq 10^5\)) — количество вершин в дереве и количество запросов соответственно.

Вторая строка содержит \(n - 1\) целых чисел \(p_2, p_3, \dots, p_n\) (\(1 \leq p_i < i\)), где \(p_i\) значит, что есть ребро между вершинами \(i\) и \(p_i\).

Третья строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(-5000 \leq a_i \leq 5000\)) — начальные значения \(a_i\) для каждой вершины.

Четвертая строка содержит \(n\) целых чисел \(b_1, b_2, \dots, b_n\) (\(-5000 \leq b_i \leq 5000\)) — значения \(b_i\) для каждой вершины.

Каждая из следующих \(q\) строк описывает запрос. Каждая из них имеет одну из двух форм:

  • 1 v x  (\(1 \leq v \leq n\), \(1\leq x \leq 5000\)).
  • 2 v  (\(1 \leq v \leq n\)).
Выходные данные

Для каждого запроса второго типа нужно в отдельной строке вывести максимальную крутость в соответствующем поддереве.

Примечание

Начальная крутость вершин равна \([100, 91, 57, 64, 57]\). Самая крутая вершина в поддереве вершины \(1\) (первый запрос) — это вершина \(1\), а самая крутая вершина в поддереве вершины \(2\) (второй запрос) — это вершина \(2\).

После первого обновления (третий запрос), крутость вершин станет равна \([100, 169, 57, 160, 57]\), и поэтому самая крутая вершина во всем дереве (четвертый запрос) теперь \(2\).

После второго обновления (пятый запрос), крутость вершин станет равна \([100, 234, 57, 240, 152]\), поэтому самая крутая вершина (шестой запрос) теперь \(4\).

E. Дороги в Бертауне

графы поиск в глубину и подобное *2000

В Бертауне n перекрестков и m двусторонних дорог. Известно, что от любого перекрестка можно добраться до любого другого по существующим дорогам.

С ростом количества машин в городе возникла проблема пробок. Чтобы решить эту проблему, правительство решило сделать движение на всех дорогах односторонним, таким образом разгрузив движение. Ваша задача — определить, существует ли способ ввести одностороннее движение так, чтобы сохранилась возможность добраться от любого перекрестка до любого другого. В случае положительного ответа также требуется найти один из возможных способов ориентировать дороги.

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

В первой строке через пробел записаны два целых числа n и m (2 ≤ n ≤ 105, n - 1 ≤ m ≤ 3·105) — количество перекрестков и дорог в городе соответственно. Далее следует m строк по два числа в каждой — описание дорог в городе. Каждая дорога задается двумя целыми числами ai и bi (1 ≤ ai, bi ≤ n, ai ≠ bi) — номерами перекрестков, которые она соединяет.

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

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

Если решения не существует, выведите одно число 0. Иначе выведите m строк по два целых числа pi и qi в каждой — ориентацию каждой дороги. То есть поток машин по односторонней дороге будет проходить в сторону от перекрестка pi к перекрестку qi. Дороги можно выводить в любом порядке. Если решений несколько, выведите любое.

B. Плюс из рисунка

поиск в глубину и подобное реализация Строки *1300

Вам дан рисунок с размерами \(w \times h\). Определите, имеет ли данный рисунок одну «+» форму или нет. «+» форма определена ниже:

  • «+» форма имеет одну центральную заполненную клетку.
  • Должно быть несколько (как минимум одна) последовательных заполненных клеток в каждом направлении (влево, вправо, вверх, вниз) от центра, то есть каждый из четырёх лучей должен быть непустым.
  • Все остальные клетки незаполненны.

Определите, имеет ли данный рисунок одну «+» форму или нет.

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

Первая строка содержит два целых числа \(h\) и \(w\) (\(1 \le h\), \(w \le 500\)) — высота и длина рисунка.

\(i\)-я из следующих \(h\) строк содержит строку \(s_{i}\) длины \(w\), которая состоит из «.» и «*», где «.» обозначает незаполненную клетку, а «*» обозначает заполненную клетку.

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

Если данное изображение удовлетворяет всем условиям, выведите «YES». Иначе выведите «NO».

Вы можете выводить каждую букву в любом регистре (строчную или заглавную).

Примечание

В первом примере данная картина содержит одну «+» форму.

Во втором примере две вертикальные ветви расположены в разных столбцах.

В третьем примере есть заполненная точка вне фигуры.

В четвертом примере ширина двух вертикальных ветвей составляет \(2\).

В пятом примере есть две фигуры.

В шестом примере внутри фигуры есть пустое пространство.

D. Полное зеркало

Деревья дп Конструктив поиск в глубину и подобное реализация хэши *2400

Дерево состоит из \(n\) вершин. Выберите одну вершину как корень. Он должен удовлетворять условию ниже.

  • Для каждой пары вершин \(v_{1}\) и \(v_{2}\), если \(distance\)(\(root\), \(v_{1}\)) \(= distance\)(\(root\), \(v_{2})\), тогда \(degree\)(\(v_{1}\)) \(= degree\)(\(v_{2}\)), где \(degree\) — количество смежных вершин, а \(distance\) — количество ребер между двумя вершинами.

Определите и найдите, есть ли такой корень в дереве. Если есть несколько ответов, выведите любой из них.

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

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 10^{5}\)) — количество верши.

Каждая из следующих \(n-1\) строк содержит два целых числа \(v_{i}\) и \(u_{i}\) (\(1 \le v_{i} \lt u_{i} \le n\)), которые значат, что существует ребра между вершинами \(v_{i}\) и \(u_{i}\). Гарантируется, что граф — дерево.

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

Если такой корень существует, выведите любой из них. Иначе выведите \(-1\).

Примечание

Рисунок до первого примера. \(1\), \(5\), \(7\) — также могут быть корнями.

Рисунок до второго примера. Невозможно найти корень графа.

E2. Вторжение Далеков (средняя)

графы Деревья кратчайшие пути поиск в глубину и подобное *2100

После успешных полевых испытаний, Хайди хочет развернуть ловушку вдоль какого-нибудь Коридора, не обязательно первого. Она хочет избежать встречи с Далеками внутри Временного Вихря, поэтому для большей осторожности она рассматривает размещение ловушек только вдоль тех коридоров, которые не будут использоваться в соответствии с текущим планом Далеков, который представляет из себя минимальное остовное дерево из Коридоров. Хайди знает, что потребности в энергии для всех Коридоров теперь разные, и что у Далеков есть единственный план, который они собираются использовать.

Вашей задачей является вычисление функции \(E_{max}(c)\), которая определена также как и в лёгкой версии — как наибольшее \(e \le 10^9\), такое что если мы изменим энергию коридора \(c\) на \(e\), то Далеки могут им воспользоваться. Однако теперь эту функцию нужно вычислить для каждого коридора, который Хайди рассматривает.

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

Первая строка содержит целые числа \(n\) и \(m\) (\(2 \leq n \leq 10^5\), \(n - 1 \leq m \leq 10^6\)) — количество точек и количество Временных Коридоров.

Каждая из следующих \(m\) строк содержит номера точек \(a\) и \(b\) и требуемой энергии \(e\) (\(1 \leq a, b \leq n\), \(a \neq b\), \(0 \leq e \leq 10^9\)).

Ни одна пара \(\{a, b\}\) не повторяется. Гарантируется, что граф является связным. Все требования на уровни энергии \(e\) являются различными.

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

Выведите \(m-(n-1)\) строк по одному целому числу в каждой: \(E_{max}(c_i)\) для \(i\)-го Коридора \(c_i\) из входных данных, среди тех, которые не входят в План Далеков (минимальное остовное дерево)

Примечание

Если \(m = n-1\), то вам следует ничего не выводить.

F. Казак Вус и граф

графы жадные алгоритмы поиск в глубину и подобное реализация *2400

У Казака Вуса есть простой граф из \(n\) вершин и \(m\) ребер. Пусть \(d_i\) — степень \(i\)-й вершины. Напомним, что степень вершины \(i\) — это количество прилагаемых ребер к вершине \(i\).

Ему нужно оставить не более \(\lceil \frac{n+m}{2} \rceil\) ребер. Пусть \(f_i\) — степень \(i\)-й вершины после удаления. Нужно удалить ребра так, чтобы \(\lceil \frac{d_i}{2} \rceil \leq f_i\) для каждого \(i\). Другими словами, нужно чтобы степень каждой вершины уменьшилась на не более чем в два раза.

Помогите Вусу оставить правильное количество ребер!

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

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \leq n \leq 10^6\), \(0 \leq m \leq 10^6\)) — количество вершин и ребер соответственно.

Каждая из следующих \(m\) строк содержит два целых числа \(u_i\) и \(v_i\) (\(1 \leq u_i, v_i \leq n\)) — вершины, между которыми находиться ребро.

Гарантируется, что в графе нет петель и кратных ребер.

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

В первой строке выведите одно целое число \(k\) (\(0 \leq k \leq \lceil \frac{n+m}{2} \rceil\)) — количество ребер, которые нужно оставить.

В каждой из следующих \(k\) строк выведите по два целых числа \(u_i\) и \(v_i\) (\(1 \leq u_i, v_i \leq n\)) — вершины, ребро между которыми нужно оставить. Нельзя выводить одно и то же ребро два или более раза.

E. Покраска дерева

Деревья дп поиск в глубину и подобное *2100

Вам задано дерево (неориентированный связный ацикличный граф), состоящее из \(n\) вершин. Вы играете в игру на этом дереве.

Изначально все вершины белые. На первом ходу игры Вы выбираете одну вершину и красите ее в черный. Затем на каждом ходу Вы выбираете белую вершину, смежную (соединенную ребром) с любой черной вершиной и красите ее в черный.

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

Рассмотрим следующий пример:

Вершины \(1\) и \(4\) уже покрашены в черный цвет. Если Вы выберете вершину \(2\), Вы получите \(4\) очка за компоненту связности, состоящую из вершин \(2, 3, 5\) и \(6\). Если Вы выберете вершину \(9\), Вы получите \(3\) очка за компоненту связности, состоящую из вершин \(7, 8\) и \(9\).

Ваша задача — максимизировать количество очков, которое Вы получите.

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

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

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

Гарантируется, что заданные ребра образуют дерево.

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

Выведите одно целое число — максимальное количество очков, которое вы получите, если будете играть оптимально.

Примечание

Первый тестовый пример показан в условии задачи.

A2. Прибавление на дереве: революция

Деревья Конструктив поиск в глубину и подобное реализация *2500

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

Вам дано дерево с \(n\) вершинами. Изначально на каждом ребре написан \(0\). За одну операцию вы можете выбрать любые \(2\) различных листа \(u\), \(v\) и любое целое число \(x\), и прибавить \(x\) ко всем числам записанных на ребрах на простом пути с \(u\) до \(v\). Обратите внимание, что в предыдущей подзадаче \(x\) могло быть любым действительным, теперь оно должно быть целым.

Для примера на изображении ниже показан результат применения двух операций к графу: прибавления \(2\) на пути от \(7\) до \(6\), а потом прибавления \(-1\) на пути от \(4\) до \(5\).

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

Лист это вершина степени \(1\). Простой путь это путь, не содержащий ни одну вершину дважды.

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

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 1000\)) — количество вершин в дереве.

Каждая из следующих \(n-1\) строк содержит три целых числа \(u\), \(v\), \(val\) (\(1 \le u, v \le n\), \(u \neq v\), \(0 \le val \le 10\,000\)), обозначающие что между вершинами \(u\) и \(v\) есть ребро, на котором в заданной конфигурации написано \(val\). Гарантируется, что данные ребра образуют дерево. Гарантируется, что все числа \(val\) различные и четные.

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

Если требуемой последовательности операций не существует, в первой строке выведите «NO».

Если же она существует, в первой строке выведите «YES». Во второй строке выведите \(m\) — количество операций, которое вы собираетесь применить (\(0 \le m \le 10^5\)). Заметьте, что минимизировать количество операций не требуется!

В следующих \(m\) строках выведите операции в следующем формате:

\(u, v, x\) (\(1 \le u, v \le n\), \(u \not = v\), \(x\) — целое число, \(-10^9 \le x \le 10^9\)), где \(u, v\) — листья, \(x\) — прибавляемое число.

Гарантируется, что если существует последовательность операций, дающая заданную конфигурацию, то существует и последовательность операций, дающая ее, которая удовлетворяет всем заданными ограничениям.

Примечание

Конфигурация с первого примера нарисована ниже, и ее невозможно достичь.

Последовательность операций с второго примера иллюстрирована ниже.

B. Динамический диаметр

*особая задача Деревья поиск в глубину и подобное разделяй и властвуй Структуры данных

Вам дано взвешенное неориентированное дерево с \(n\) вершинами, а также список из \(q\) обновлений. Каждое обновление меняет вес одного ребра. Ваша задача — вычислить диаметр дерева после каждого обновления.

(Расстоянием между двумя вершинами называется сумма весов ребер на единственном простом пути между этими двумя вершинами. Диаметр дерева — наибольшее из этих расстояний.)

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

Первая строка содержит три разделенных пробелом целых числа \(n\), \(q\) и \(w\) (\(2 \leq n \leq 100,000, 1 \leq q \leq 100,000\), \(1 \leq w \leq 20,000,000,000,000\)) – число вершин в дереве, число обновлений и ограничение на вес ребер. Вершины пронумерованы от \(1\) до \(n\).

Следующие \(n-1\) строк описывают изначальное дерево. \(i\)-я из этих строк содержит три целых числа \(a_i\), \(b_i\), \(c_i\) (\(1 \leq a_i, b_i \leq n\), \(0 \leq c_i < w\)), обозначающих, что изначально есть ребро между вершинами \(a_i\) и \(b_i\) с весом \(c_i\). Гарантируется, что эти \(n-1\) строк описывают дерево.

Последние \(q\) строк описывают обновления. \(j\)-я из этих строк содержт два целых числа \(d_j\), \(e_j\) (\(0 \leq d_j < n - 1, 0 \leq e_j < w\)). Эти два числа вы должны изменить следующим образом:

  • \(d'_j = (d_j + last) \bmod (n - 1)\),
  • \(e'_j = (e_j + last) \bmod w\),
где \(last\) — диаметр дерева после предыдущего обновления (изначально \(last=0\)). Пара \((d'_j, e'_j)\) обозначает, что в данном обновлении вес \(d'_j+1\)-го ребра становится равным \(e'_j\).
Выходные данные

Выведите \(q\) строк. Для всех возможных \(i\) строка \(i\) должна содержать диаметр дерева после \(i\)-го обновления.

Система оценки

Подзадача 1 (11 баллов): \(n,q \leq 100\) и \(w \leq 10,000\)

Подзадача 2 (13 баллов): \(n,q \leq 5,000\) и \(w \leq 10,000\)

Подзадача 3 (7 баллов): \(w \leq 10,000\), и все ребра дерева имеют вид \(\{1, i\}\) (То есть граф имеет вид «звезды» с центром в вершине 1.)

Подзадача 4 (18 баллов): \(w \leq 10,000\), и все ребра дерева имеют вид \(\{i, 2i\}\) и \(\{i, 2i+1\}\) (То есть если мы подвесим дерево за вершину 1, то оно будет иметь вид сбалансированного бинарного дерева.)

Подзадача 5 (24 балла): гарантируется, что после каждого обновления по крайней мере один из наидлиннейших простых путей проходит через вершину \(1\)

Подзадача 6 (27 баллов): нет дополнительных ограничений

Примечание

Первый пример показан на рисунке ниже. Рисунок слева показывает изначальное дерево. Каждый следующий рисунок показывает ситуацию после очередного обновления. Вес обновленного ребра показан зеленым, а диаметр — красным.

Первое обновление меняет вес \(3\)-го ребра, т.е. \(\{2, 4\}\), на \(1030\). Наибольшее расстояние между какой-либо парой вершин равно \(2030\) — расстояние между \(3\) и \(4\).

Так как ответ равен \(2030\), то для второго обновления \(\)d'_2 = (1 + 2030) \bmod 3 = 0\(\) \(\)e'_2 = (1020 + 2030) \bmod 2000 = 1050\(\) Поэтому вес ребра \(\{1, 2\}\) меняется на \(1050\). Теперь наибольшее расстояние между вершинами \(\{1, 4\}\), оно равно \(2080\).

Для третьего обновления имеем \(\)d'_3 = (1 + 2080) \bmod 3 = 2\(\) \(\)e'_3 = (890 + 2080) \bmod 2000 = 970\(\) Теперь, так как вес ребра \(\{2, 4\}\) уменьшается до \(970\), наиболее удаленная пара вершин, внезапно, \(\{1, 3\}\), а расстояние — \(2050\).

F. Graph Traveler

графы дп математика Перебор поиск в глубину и подобное реализация Структуры данных теория чисел *2300

Гильдон проводит эксперименты с интересной машиной под названием Graph Traveler. В этой машине есть ориентированный граф из \(n\) вершин, пронумерованных от \(1\) до \(n\). \(i\)-я вершина имеет \(m_i\) выходящих ребер, они обозначаются \(e_i[0]\), \(e_i[1]\), \(\ldots\), \(e_i[m_i-1]\), где каждый элемент обозначает номер вершины конца ребра. В графе могут быть кратные ребра и петли. Кроме того, в каждой вершине \(i\) написано некоторое целое число \(k_i\).

Путь по графу определяется следующим образом.

  1. Гильдон выбирает вершину, с которой начнет путь, а также некоторое начальное целое число. Запомним это число в переменную \(c\).
  2. Когда Гильдон приходит в вершину \(i\), а также, в начале, если путь начинается с вершины \(i\), он добавляет значение \(k_i\) к \(c\).
  3. Следующая вершина пути — это \(e_i[x]\), где \(x\) — такое целое число \(0 \le x \le m_i-1\), что \(x \equiv c \pmod {m_i}\). Гильдон переходит в эту следующую вершину и возвращается на шаг 2.

Ясно, что такой путь никогда не кончается, потому что шаги 2 и 3 будут повторяться бесконечное число раз.

Например, предположим, что Гильдон начинает в вершине \(1\) с \(c = 5\), при этом \(m_1 = 2\), \(e_1[0] = 1\), \(e_1[1] = 2\), \(k_1 = -3\). Сразу после того, как он начинает в вершине \(1\), \(c\) становится равным \(2\). Так как единственное целое число \(x\) (\(0 \le x \le 1\)) такое, что \(x \equiv c \pmod {m_i}\), это \(0\), то Гильдон пойдет в вершину \(e_1[0] = 1\). После того как он попадет в вершину \(1\) снова, \(c\) станет равной \(-1\). Единственное целое число \(x\), удовлетворяющее сравнению, есть \(1\), поэтому он идет в вершину \(e_1[1] = 2\), и так далее.

Так как Гильдон достаточно любознательный, он хочет спросить у вас \(q\) вопросов. Каждый раз он хочет узнать, сколько различных вершин он посетит бесконечное число раз, если он начнет с определенной вершины с определенным числом \(c\). Обратите внимание, что не нужно учитывать вершины, которые будут посещены только конечное число раз.

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

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 1000\)) — количество вершин в графе.

Вторая строка содержит \(n\) целых чисел. \(i\)-е из них равно \(k_i\) (\(-10^9 \le k_i \le 10^9\)) — число, написанное в \(i\)-й вершине.

Следующие \(2 \cdot n\) строк описывают ребра, выходящие из каждой вершины. \((2 \cdot i + 1)\)-я строка содедржит одно целое число \(m_i\) (\(1 \le m_i \le 10\)) — число исходящих ребер из вершины \(i\). \((2 \cdot i + 2)\)-я строка содержит \(m_i\) целых чисел \(e_i[0]\), \(e_i[1]\), \(\ldots\), \(e_i[m_i-1]\), все значения которых лежат в пределах от \(1\) до \(n\) включительно.

Следующая строка содержит одно целое число \(q\) (\(1 \le q \le 10^5\)) — количество вопросов Гильдона.

Каждая из следующих \(q\) строк содержит два целых числа \(x\) и \(y\) (\(1 \le x \le n\), \(-10^9 \le y \le 10^9\)), которые означают, что Гильдон хочет начать путь с вершины \(x\), а начальное значение переменной \(c\) должно быть \(y\).

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

Для каждого запроса выведите количество различных вершин, которые будут посещены бесконечно много раз, если Гильдон начнет путь из вершины \(x\) с начальным значением \(y\).

Примечание

Граф в первом примере показан на рисунке ниже:

Три числа, показанные на вершине \(i\), равны соответственно \(i\), \(k_i\) и \(m_i\). Числа на ребрах показывают их номер в списке выходящих ребер из \(i\)-й вершины.

Путь для каждого запроса показан ниже. Он описывается последовательностью фраз, каждая в формате «вершина (\(c\) после добавления \(k_i\))».

  • \(1(0) \to 2(0) \to 2(0) \to \ldots\)
  • \(2(0) \to 2(0) \to \ldots\)
  • \(3(-1) \to 1(-1) \to 3(-1) \to \ldots\)
  • \(4(-2) \to 2(-2) \to 2(-2) \to \ldots\)
  • \(1(1) \to 3(1) \to 4(1) \to 1(1) \to \ldots\)
  • \(1(5) \to 3(5) \to 1(5) \to \ldots\)

Во втором примере граф такой же, как в первом, но у вершин ненулевые значения. Поэтому ответы отличаются от ответов в первом примере.

Пути во втором примере показаны ниже:

  • \(1(4) \to 2(-1) \to 2(-6) \to \ldots\)
  • \(2(-5) \to 2(-10) \to \ldots\)
  • \(3(-4) \to 1(0) \to 2(-5) \to 2(-10) \to \ldots\)
  • \(4(-3) \to 1(1) \to 3(-2) \to 4(-3) \to \ldots\)
  • \(1(5) \to 3(2) \to 1(6) \to 2(1) \to 2(-4) \to \ldots\)
  • \(1(9) \to 3(6) \to 2(1) \to 2(-4) \to \ldots\)

G. Инди альбом

Деревья поиск в глубину и подобное Строки строковые суфф. структуры Структуры данных хэши *2700

Любимая экспериментальная инди группа Мишки недавно выпустила новый альбом! У песен этого альбома есть одна общая особенность. Название каждой песни \(s_i\) — одно из следующих типов:

  • \(1~c\) — одна строчная латинская буква;
  • \(2~j~c\) — название \(s_j\) (\(1 \le j < i\)) с приписанной к нему справа одной строчной латинской буквой.

Песни пронумерованы от \(1\) до \(n\). Гарантируется, что первая песня всегда типа \(1\).

Вове тоже интересен новый альбом, но он никак не может найти время его послушать целиком. Поэтому он решил задать Мишке несколько вопросов о нем, чтобы узнать, достойна ли какая-нибудь песня прослушивания. Все вопросы имеют одинаковый формат:

  • \(i~t\) — посчитать количество вхождений строки \(t\) в \(s_i\) (название \(i\)-й песни альбома), как подстроки, \(t\) состоит только из строчных латинских букв.

И хотя Мишка не понимает, какая польза от этой информации, он старается помочь Вове. Однако вопросов так много, что он не справляется. Помогите, пожалуйста, Мише ответить на все вопросы Вовы.

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

В первой строке записано одно целое число \(n\) (\(1 \le n \le 4 \cdot 10^5\)) — количество песен в альбоме.

В каждой из следующих \(n\) строк записано название \(i\)-й песни альбома в следующем формате:

  • \(1~c\)\(s_i\) — это одна строчная латинская буква;
  • \(2~j~c\)\(s_i\) — это название \(s_j\) (\(1 \le j < i\)) с приписанной к нему справа одной строчной латинской буквой.

В следующей строке записано одно целое число \(m\) (\(1 \le m \le 4 \cdot 10^5\)) — количество вопросов Вовы.

В каждой из следующих \(m\) строк записан \(j\)-й вопрос Вовы в следующем формате:

  • \(i~t\) (\(1 \le i \le n\), \(1 \le |t| \le 4 \cdot 10^5\)) — посчитать количество вхождений строки \(t\) в \(s_i\) (название \(i\)-й песни альбома), как подстроки, \(t\) состоит только из строчных латинских букв.

Гарантируется, что суммарная длина всех строк \(t\) из вопросов не превосходит \(4 \cdot 10^5\).

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

На каждый вопрос выведите одно целое число — количество вхождений строки вопроса \(t\) в название \(i\)-й песни альбома, как подстроки.

Примечание

Названия песен из первого примера:

  1. d
  2. da
  3. dad
  4. dada
  5. dadad
  6. dadada
  7. dadadad
  8. dadadada
  9. d
  10. do
  11. dok
  12. doki
  13. dokid
  14. dokido
  15. dokidok
  16. dokidoki
  17. do
  18. dok
  19. doki
  20. dokidoki

Тогда вхождения для каждого вопроса следующие:

  1. строка «da» начинается в позициях \([1, 3, 5, 7]\) в названии «dadadada»;
  2. строка «dada» начинается в позициях \([1, 3, 5]\) в названии «dadadada»;
  3. строка «ada» начинается в позициях \([2, 4, 6]\) в названии «dadadada»;
  4. строка «dada» начинается в позициях \([1, 3]\) в названии «dadada»;
  5. нет вхождений строки «dada» в названии «dad»;
  6. строка «doki» начинается в позиции \([1]\) в названии «doki»;
  7. строка «ok» начинается в позиции \([2]\) в названии «doki»;
  8. строка «doki» начинается в позициях \([1, 5]\) в названии «dokidoki»;
  9. строка «doki» начинается в позиции \([1]\) в названии «dokidok»;
  10. строка «d» начинается в позиции \([1]\) в названии «d»;
  11. нет вхождений строки «a» в названии «d»;
  12. строка «doki» начинается в позициях \([1, 5]\) в названии «dokidoki».

F. Биты и выбор

битмаски дп жадные алгоритмы поиск в глубину и подобное *2600

Вам дан массив \(a\) из \(n\) целых чисел.

Вам нужно найти наибольшее возможное значение \(a_{i} | ( a_{j} \& a_{k} )\) по всем таким тройкам \((i,j,k)\), что \(i < j < k\).

Здесь \(\&\) обозначает операцию побитового И, а \(|\) обозначает операцию побитового ИЛИ.

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

В первой строке ввода записано целое число \(n\) (\(3 \le n \le 10^{6}\)) — размер массива \(a\).

Во второй строке записаны \(n\) целых чисел, разделенных пробелами \(a_1\), \(a_2\), ..., \(a_n\) (\(0 \le a_{i} \le 2 \cdot 10^{6}\)) — массив \(a\).

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

Выведите одно целое число — максимальное возможное значение выражения, описанного в условии.

Примечание

В первом примере единственная возможная тройка это \((1, 2, 3)\). Таким образом, ответ равен \(2 | (4 \& 6) = 6\).

Во втором примере есть \(4\) возможные тройки:

  1. \((1, 2, 3)\), значение которой \(2|(8\&4) = 2\).
  2. \((1, 2, 4)\), значение которой \(2|(8\&7) = 2\).
  3. \((1, 3, 4)\), значение которой \(2|(4\&7) = 6\).
  4. \((2, 3, 4)\), значение которой \(8|(4\&7) = 12\).

Таким образом максимальное значение равно \(12\).

D. Корова и вечеринка

графы поиск в глубину и подобное снм *1700

Легендарный фермер Джон готовит большую вечеринку. В гости были приглашены животные со всего мира. Сейчас гости проголодались, так что Джон попросил свою корову Бесси достать чего-нибудь перекусить.

Есть \(n\) разных видов закусок, пронумерованных числами \(1, 2, \ldots, n\). У Бесси есть \(n\) закусок, по одной закуске каждого вида. У каждого гостя есть ровно два любимых вида закусок. Процесс перекуса будет происходить следующим образом:

  • Сначала Бесси упорядочит всех гостей в каком-то порядке.
  • Затем, в этом порядке гости будут по одному подходить к закускам.
  • Каждый гость будет в свой ход съедать все оставшиеся закуски любимых типов. В случае, если не осталось ни одной закуски любимых типов, то гость уйдёт очень грустным.

Помогите Бесси минимизировать число грустных гостей, упорядочив гостей правильным образом.

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

Первая строка содержит целые числа \(n\) и \(k\) (\(2 \le n \le 10^5\), \(1 \le k \le 10^5\)) — количество закусок и количество гостей.

\(i\)-я из следующих \(k\) строк содержит два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\), \(x_i \ne y_i\)) — любимые виды закусок для \(i\)-го гостя.

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

Выведите одно целое число — минимальное возможное количество грустных гостей.

Примечание

В первом примере Бесси может упорядочить гостей следующим образом: \(3, 1, 2, 4\). Гость \(3\) пойдёт первым и съест закуски \(1\) и \(4\). Затем идёт гость \(1\) и съедает закуску \(2\), так как закуска \(1\) уже съедена. Затем приходит гость \(2\) и съедает только закуску \(3\). Так как все закуски уже съедены, то гость \(4\) будет грустным.

Во втором примере можно упорядочить гостей как \(2, 1, 3, 5, 4\). Тогда все гости будут удовлетворены.

F. Коала и блокнот

графы Деревья кратчайшие пути поиск в глубину и подобное Строки Структуры данных *2600

Страна коал состоит из \(n\) городов и \(m\) двусторонних дорог, их соединяющих. Дороги пронумерованы от \(1\) до \(m\) в порядке входных данных. Гарантируется, что можно добраться от каждого города до любого другого города.

Коала начинает путешествие из города \(1\). Каждый раз, когда он проходит по дороге, он записывает её номер в блокнот. Он не делает пробелов между числами, так что все записи склеятся в одно большое число.

Перед тем как отправится в свой путь, Коала интересуется какое число может получится в блокноте в зависимости от конечного пункта. Для каждого возможного конечного пункта выясните, какое наименьшее число может для него получиться?

Так как эти числа могут быть достаточно большими, вычислите их по модулю \(10^9+7\). Обратите внимание, что нужно вычислить остаток минимального возможного числа, не минимально возможный остаток.

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

Первая строка содержит два целых числа \(n\) и \(m\) (\(2 \le n \le 10^5, n - 1 \le m \le 10^5\)) — количество городов и количество дорог соответственно.

\(i\)-я из следующих \(m\) строк содержит целые числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\), \(x_i \ne y_i\)), обозначающие двустороннюю дорогу между \(x_i\) и \(y_i\).

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

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

Выведите \(n - 1\) целое число — ответ для каждого города за исключением первого.

\(i\)-е число должно быть равно наименьшему числу, которое получилось бы для конечной точки \(i+1\). Так как это число может быть достаточно большим, выведите его остаток по модулю \(10^9+7\).

F. Нестабильная сортировка строки

графы жадные алгоритмы поиск в глубину и подобное реализация снм Строки Структуры данных *2100

Авторы загадали строку \(s\), состоящую из \(n\) строчных букв латинского алфавита.

Вам задано две перестановки ее индексов (не обязательно одинаковых) \(p\) и \(q\) (обе длины \(n\)). Напомним, что перестановкой называется массив длины \(n\), содержащий каждое целое число от \(1\) до \(n\) ровно один раз.

Для всех \(i\) от \(1\) до \(n-1\) выполняются следующие свойства: \(s[p_i] \le s[p_{i + 1}]\) и \(s[q_i] \le s[q_{i + 1}]\). Это значит, что если вы выпишете все символы \(s\) в порядке индексов в перестановке, результирующая строка получится отсортированной в неубывающем порядке.

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

Если существует несколько возможных ответов, вы можете вывести любой.

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

Первая строка входных данных содержит два целых числа \(n\) и \(k\) (\(1 \le n \le 2 \cdot 10^5, 1 \le k \le 26\)) — длину строки и необходимое количество различных символов.

Вторая строка входных данных содержит \(n\) целых чисел \(p_1, p_2, \dots, p_n\) (\(1 \le p_i \le n\), все \(p_i\) являются различными целыми числами от \(1\) до \(n\)) — перестановку \(p\).

Третья срока входных данных содержит \(n\) целых чисел \(q_1, q_2, \dots, q_n\) (\(1 \le q_i \le n\), все \(q_i\) являются различными целыми числами от \(1\) до \(n\)) — перестановку \(q\).

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

Если невозможно найти подходящую строку, выведите «NO» в первой строке.

Иначе выведите «YES» в первой строке и строку \(s\) во второй строке. Она должна состоять ровно из \(n\) строчных букв латинского алфавита, содержать хотя бы \(k\) различных символов и подходить заданным перестановкам.

Если существует несколько возможных ответов, вы можете вывести любой.

D. Остров Сокровищ

дп поиск в глубину и подобное Потоки хэши *1900

Сокровища! Кто не мечтал о них в детстве? Именно так подумал юный Вася и отправился в длительное путешествие к Острову Сокровищ.

Остров Сокровищ представляет собой прямоугольное поле \(n \times m\), окруженное океаном. Пронумеруем строки поля последовательными целыми числами от \(1\) до \(n\) сверху вниз, а столбцы последовательными целыми числами от \(1\) до \(m\) слева направо. Обозначение \((r, c)\) соответствует клетке, расположенной в строке \(r\) и столбце \(c\). В некоторых клетках острова растут непроходимые леса, а остальные клетки свободные и проходимые. Сокровище закопано в клетке \((n, m)\).

Вася высадился с корабля в клетку \((1, 1)\). Теперь он хочет добраться до сокровища. Вася сильно спешит за сокровищем, поэтому может перемещаться только в клетку в следующей строке (вниз) или следующем столбце (вправо), то есть из клетки \((x, y)\) он может сделать ход только в клетки \((x+1, y)\) и \((x, y+1)\). Конечно, Вася не может заходить в клетки, где растёт непроходимый лес.

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

Помогите Злой Ведьме определить, на каком минимальном количестве клеток ей придётся вырастить непроходимый лес, чтобы Вася не смог добраться до сокровища?

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

Первая строка содержит два целых положительных числа \(n\), \(m\) (\(3 \le n \cdot m \le 1\,000\,000\)) — размеры острова.

Следующие \(n\) строк содержат строки \(s_i\) длины \(m\), задающие описание острова, \(j\)-й символ строки \(s_i\) равен «#», если в клетке \((i, j)\) острова растёт непроходимый лес и «.», если клетка свободна. Напомним, что Вася высаживается в клетке \((1, 1)\), то есть в первой клетке первой строки и идёт навстречу сокровищам, находящимся в клетке \((n, m)\), то есть в последней клетке последней строки.

гарантируется, что клетки \((1, 1)\) и \((n, m)\) не содержат леса.

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

Выведите одно целое число \(k\)  — минимальное количестве клеток, в которых Злой Ведьме нужно вырастить непроходимый лес, чтобы Вася не смог добраться до сокровища.

Примечание

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

H. Укладывание плитки

Деревья Конструктив поиск в глубину и подобное *2800

Новая пешеходная зона в центре Москвы состоит из \(n\) площадей, соединённых друг с другом с помощью \(n - 1\) пешеходных дорожек. Простым путём называется такая последовательность площадей, что никакая площадь не встречается в последовательности дважды, и любые две соседние в последовательности площади напрямую соединены пешеходной дорожкой. Размером простого пути будем называть количество площадей в образующей его последовательности. Дорожки спроектированы таким образом, что между любой парой различных площадей существует ровно один простой путь.

В рамках подготовки к празднованию дня города московская мэрия планирует обновить плитку на всех \(n\) площадях. Всего существует \(k\) видов плитки разных цветов, пронумерованных от \(1\) до \(k\). Для каждой площади нужно выбрать ровно один вид плитки, который будет там уложен в процессе обновления. Чтобы сделать прогулки по центру Москвы более увлекательными, было решено назначить типы плиток площадям таким образом, чтобы для любого возможного простого пути размера ровно \(k\), при прогулке вдоль этого пути встречались бы все \(k\) различных типов плитки.

Определите, можно ли уложить плитку подходящим образом или нет.

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

Первая строка содержит два целых числа \(n\), \(k\) (\(2 \le k \le n \le 200\,000\)) — количество площадей в Москве, количество различных цветов плитки.

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

Гарантируется, что от любой площади можно добраться до любой другой, причём единственным способом.

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

Выведите «Yes», если уложить плитку возможно, и «No» иначе.

В случае если ваш ответ «Yes», выведите \(n\) целых чисел от \(1\) до \(k\) — цвет плитки для каждой площади.

Примечание

Ниже изображена карта пешеходной зоны из первого и второго примеров, а также корректный выбор типов плитки для \(k = 4\).

D. Покраска ребер

графы Конструктив поиск в глубину и подобное *2100

Вам дан ориентированный граф из \(n\) вершин и \(m\) ориентированных ребер. Гарантируется, что в нем нет ни петель, ни кратных ребер.

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

Найдите хорошую \(k\)-покраску с минимально возможным значением \(k\).

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

В первой строке заданы два целых числа \(n\) и \(m\) (\(2 \le n \le 5000\), \(1 \le m \le 5000\)) — количество вершин и ребер, соответственно.

Следующие \(m\) строк содержат описание ребер — по одному в строке. Каждое ребро задается парой целых чисел \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \ne v\)) — они обозначают ребро из вершины \(u\) в вершину \(v\).

Гарантируется, что каждая упорядоченная пара \((u, v)\) входит в список ребер не более одного раза.

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

В первой строке выведите одно целое число \(k\) — количество цветов в \(k\)-покраске графа.

Во второй строке выведите \(m\) целых чисел \(c_1, c_2, \dots, c_m\) (\(1 \le c_i \le k\)), где \(c_i\) — цвет \(i\)-го ребра (ребра нумеруются в том порядке, в котором заданы во входных данных).

Если ответов несколько, выведите любой (но все равно надо минимизировать \(k\)).

H. Function Composition

поиск в глубину и подобное *2900

We are definitely not going to bother you with another generic story when Alice finds about an array or when Alice and Bob play some stupid game. This time you'll get a simple, plain text.

First, let us define several things. We define function \(F\) on the array \(A\) such that \(F(i, 1) = A[i]\) and \(F(i, m) = A[F(i, m - 1)]\) for \(m > 1\). In other words, value \(F(i, m)\) represents composition \(A[...A[i]]\) applied \(m\) times.

You are given an array of length \(N\) with non-negative integers. You are expected to give an answer on \(Q\) queries. Each query consists of two numbers – \(m\) and \(y\). For each query determine how many \(x\) exist such that \(F(x,m) = y\).

Input

The first line contains one integer \(N\) \((1 \leq N \leq 2 \cdot 10^5)\) – the size of the array \(A\). The next line contains \(N\) non-negative integers – the array \(A\) itself \((1 \leq A_i \leq N)\). The next line contains one integer \(Q\) \((1 \leq Q \leq 10^5)\) – the number of queries. Each of the next \(Q\) lines contain two integers \(m\) and \(y\) \((1 \leq m \leq 10^{18}, 1\leq y \leq N)\).

Output

Output exactly \(Q\) lines with a single integer in each that represent the solution. Output the solutions in the order the queries were asked in.

Note

For the first query we can notice that \(F(3, 10) = 1,\ F(9, 10) = 1\) and \(F(10, 10) = 1\).

For the second query no \(x\) satisfies condition \(F(x, 5) = 7\).

For the third query \(F(5, 10) = 6\) holds.

For the fourth query \(F(3, 1) = 1.\)

For the fifth query no \(x\) satisfies condition \(F(x, 10) = 8\).

I. The Light Square

2-sat жадные алгоритмы поиск в глубину и подобное *2100

For her birthday Alice received an interesting gift from her friends – The Light Square. The Light Square game is played on an \(N \times N\) lightbulbs square board with a magical lightbulb bar of size \(N \times 1\) that has magical properties. At the start of the game some lights on the square board and magical bar are turned on. The goal of the game is to transform the starting light square board pattern into some other pattern using the magical bar without rotating the square board. The magical bar works as follows:

It can be placed on any row or column

The orientation of the magical lightbulb must be left to right or top to bottom for it to keep its magical properties

The entire bar needs to be fully placed on a board

The lights of the magical bar never change

If the light on the magical bar is the same as the light of the square it is placed on it will switch the light on the square board off, otherwise it will switch the light on

The magical bar can be used an infinite number of times

Alice has a hard time transforming her square board into the pattern Bob gave her. Can you help her transform the board or let her know it is impossible? If there are multiple solutions print any.

Input

The first line contains one positive integer number \(N\ (1 \leq N \leq 2000)\) representing the size of the square board.

The next \(N\) lines are strings of length \(N\) consisting of 1's and 0's representing the initial state of the square board starting from the top row. If the character in a string is 1 it means the light is turned on, otherwise it is off.

The next \(N\) lines are strings of length \(N\) consisting of 1's and 0's representing the desired state of the square board starting from the top row that was given to Alice by Bob.

The last line is one string of length \(N\) consisting of 1's and 0's representing the pattern of the magical bar in a left to right order.

Output

Transform the instructions for Alice in order to transform the square board into the pattern Bob gave her. The first line of the output contains an integer number \(M\ (0 \leq M \leq 10^5\)) representing the number of times Alice will need to apply the magical bar.

The next \(M\) lines are of the form "col \(X\)" or "row \(X\)", where \(X\) is \(0\)-based index of the matrix, meaning the magical bar should be applied to either row \(X\) or column \(X\). If there is no solution, print only -1. In case of multiple solutions print any correct one.

Note

Example 1: It is impossible to transform square board from one format to another

Example 2: Magic bar can be applied on first row or column.

E. Туризм

графы Деревья дп жадные алгоритмы поиск в глубину и подобное снм *2200

Лёша решил отправиться в туристическую поездку по стране.

Для простоты стоит считать, что в стране есть \(n\) городов и \(m\) двусторонних дороги, которые их соединяют. Лёша живёт в городе \(s\) и изначально находится в нём. Каждый город в стране по своему хорош, и чтобы сравнивать города между собой, Лёша поставил каждому городу оценку \(w_i\), которая тем больше, чем интереснее город кажется Лёше.

Лёша считает, что его поездка по стране будет интересной только в том случае, если ему ни в какой момент времени не придётся ехать назад по дороге, по которой он только что проехал. Другими словами, если Лёша переехал из города \(u\) в город \(v\), следующим в своей поездке Лёша может выбрать любой город, соединённый с \(v\) дорогой, кроме города \(u\).

Помогите Лёше спланировать поездку так, чтобы сумма оценок по всем посещённым им городам была максимальна. Считайте, что оценка любого посещённого города учитывается в сумме только один раз, даже если город был посещён не единожды.

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

Первая строка содержит два целых числа \(n\), \(m\), (\(1 \le n \le 2 \cdot 10^5\), \(0 \le m \le 2 \cdot 10^5\)) — количество городов и дорог в стране.

Вторая строка содержит \(n\) целых чисел \(w_1, w_2, \ldots, w_n\) (\(0 \le w_i \le 10^9\)) — оценки всех городов.

Следующие \(m\) строк содержат описание дорог. Каждая из \(m\) строк содержит два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\)) — города, которые соединяются дорогой.

Гарантируется, что любые два города соединены не более, чем одной дорогой, никакой город не соединён дорогой с самим собой, а также что из любого города можно добраться в любой другой по дорогам.

Последняя строка содержит одно целое число \(s\) (\(1 \le s \le n\)) — номер стартового города.

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

Выведите одно целое число — максимальную сумму оценок посещённых городов, которую можно получить.

E. Лабиринт

Деревья дп поиск в глубину и подобное Теория вероятностей *2500

Лабиринт представляет из себя дерево (неориентированный граф, в котором между любой парой вершин существует ровно один путь). В лабиринте с определенной вероятностью выбираются вершины входа и выхода. Выход из лабиринта ищется при помощи обхода в глубину, в случае нескольких возможных ходов, ход выбирается равновероятно. Рассмотрим псевдокод:


DFS(x)
if x == вершина выхода then
завершить обход дерева
flag[x] <- TRUE
перемешать порядок вершин в V(x) // здесь каждая перестановка V(x) равновероятна
for i <- 1 to length[V] do
if flag[V[i]] = FALSE then
count++;
DFS(V[i]);
count++;

V(x) — список вершин смежных с x. Массив flag изначально заполнен FALSE. Изначально DFS запускается с параметром вершины входа. По завершению обхода в переменной count будет находится количество ходов.

Требуется посчитать математическое ожидание количества ходов для нахождения выхода из лабиринта.

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

В первой строке задается число вершин в графе n (1 ≤ n ≤ 105). В следующих n - 1 строках задаются пары чисел ai и bi, которые показывают существования ребра между ai и bi вершинами (1 ≤ ai, bi ≤ n). Гарантируется, что заданный граф является деревом.

В следующих n строках задаются пары неотрицательных чисел xi и yi, которые характеризуют вероятность выбора i-ой вершины в качества входа и выхода соответственно. Вероятности выбрать вершину i в качестве входа и выхода равны и соответственно. Сумма по всем xi и сумма по всем yi положительны и не превосходят 106.

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

Выведите матожидание количества ходов. Абсолютная или относительная погрешность не должна превосходить 10 - 9.

Примечание

В первом примере вершина входа всегда 1 и вершина выхода всегда 2.

Во втором примере вершина входа всегда 1, вершина выхода с вероятностью 2/5 будет 2 или с вероятность 3/5 будет 3. Матожидания для вершин выхода 2 и 3 будут равны (симметричные случаи). На первом ходе с вероятностью 0.5 можно пойти в вершину выхода или с вероятностью 0.5 не в вершину выхода. В первом случаи количество ходов равно 1, во втором оно будет равно 3. Итоговое матожидание считается как 2 / 5 × (1 × 0.5 + 3 × 0.5) + 3 / 5 × (1 × 0.5 + 3 × 0.5)

F. Алиса и кактус

графы математика поиск в глубину и подобное Теория вероятностей *3000

Алиса недавно нашла несколько кактусов, растущих рядом с ее домом! Спустя несколько месяцев, все больше и больше кактусов стало появляться и вскоре они заблокировали всю дорогу. Поэтому Алиса хочет уничтожить их.

Кактус это связный неориентированный граф. Никакое ребро такого графа не принадлежит более, чем одному простому циклу. Простым циклом будем называть последовательность различных вершин \(x_1, x_2, \ldots, x_k\) графа, такую что \(k \geq 3\) и пары вершин \(x_1\) и \(x_2\), \(x_2\) и \(x_3\), \(\ldots\), \(x_{k-1}\) и \(x_k\), \(x_k\) и \(x_1\) соединены ребром. Ребра \((x_1, x_2)\), \((x_2, x_3)\), \(\ldots\), \((x_{k-1}, x_k)\), \((x_k, x_1)\) называются принадлежащими этому циклу.

Количество кактусов очень большое, поэтому уничтожить их будет тяжело. Но Алиса обладает магией. Когда она использует магию, каждая вершина кактуса удаляется независимо от других с вероятностью \(\frac{1}{2}\). Когда вершина удаляется, все ребра, соседние с этой вершиной также удаляются.

Алиса хочет протестировать свою магию. Она выбрала кактус с \(n\) вершинами и \(m\) ребрами. Обозначим за \(X[S]\) (где \(S\) это подмножество удаленных вершин) количество компонент связности в оставшемся графе после удаления вершин множества \(S\). Перед тем, как использовать магию, она хочет узнать дисперсию случайной величины \(X\), если все вершины графа имеют вероятность \(\frac{1}{2}\) быть удаленными и все эти \(n\) событий независимы. По определению дисперсия равна \(E[(X - E[X])^2]\), где \(E[X]\) это математическое ожидание случайной величины \(X\). Помогите ей и посчитайте это число по модулю \(10^9+7\).

Формально, обозначим за \(M = 10^9 + 7\) (простое число). Можно показать, что ответ может быть представлен в виде несократимой дроби \(\frac{p}{q}\), где \(p\) и \(q\) это целые числа и \(q \not \equiv 0 \pmod{M}\). Выведите целое число, равное \(p \cdot q^{-1} \bmod M\). Другими словами, найдите такое целое число \(x\), что \(0 \le x < M\) и \(x \cdot q \equiv p \pmod{M}\).

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

Первая строка содержит два целых числа \(n\) и \(m\), разделенных пробелом (\(1 \leq n \leq 5 \cdot 10^5, n - 1 \leq m \leq 5 \cdot 10^5\)) — количество вершин и ребер в кактусе.

Следующие \(m\) строк содержат по два целых числа \(u\) и \(v\), разделенных пробелом каждая (\(1 \leq u, v \leq n, u \neq v\)), означающих, что существует ребро между вершинами \(u\) и \(v\).

Гарантируется, что заданный граф не содержит петель и кратных ребер и является кактусом.

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

Выведите одно целое число — дисперсию количества компонент связности в графе, остающемся после удаления множества вершин, при том, что любая вершина имеет вероятность \(\frac{1}{2}\) быть удаленной и эти события независимы. Это число надо найти и вывести по модулю \(10^9+7\).

Примечание

В первом примере ответ равен \(\frac{7}{64}\). Когда все вершины удалены, значение \(X\) равно \(0\), иначе оно равно \(1\). Поэтому математическое ожидание \(X\) равно \(0\times\frac{1}{8}+1\times\frac{7}{8}=\frac{7}{8}\). Тогда дисперсия \(X\) равна \((0 - \frac{7}{8})^2\times\frac{1}{8}+(1-\frac{7}{8})^2\times\frac{7}{8} = (\frac{7}{8})^2\times\frac{1}{8}+(\frac{1}{8})^2\times\frac{7}{8} = \frac{7}{64}\).

Во втором примере ответ равен \(\frac{1}{4}\).

F. Максимальное поддерево

графы Деревья дп поиск в глубину и подобное *2200

Пусть у вас есть \(k\) одномерных отрезков \(s_1, s_2, \dots s_k\) (каждый отрезок представляется двумя числами — координатами его концов). Тогда вы можете построить граф из \(k\) вершин на этих отрезках. Между \(i\)-й и \(j\)-й вершинами (\(i \neq j\)) есть ребро тогда и только тогда, когда отрезки \(s_i\) и \(s_j\) пересекаются (когда существует хотя бы одна точка, принадлежащая обоим отрезкам).

Например, если \(s_1 = [1, 6], s_2 = [8, 20], s_3 = [4, 10], s_4 = [2, 13], s_5 = [17, 18]\), то граф будет выглядеть следующим образом:

Дерево размера \(m\) считается хорошим, если можно выбрать \(m\) таких одномерных отрезков, что граф, построенный на этих отрезках, совпадает с деревом.

Вам задано дерево, найдите максимальный размер хорошего поддерева этого дерева. Напомним, что поддеревом называется связный подграф дерева.

Обратите внимание, что вам нужно ответить на \(q\) независимых запросов.

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

Первая строка содержит число \(q\) (\(1 \le q \le 15 \cdot 10^4\)) — количество запросов.

Первая строка каждого запроса содержит число \(n\) (\(2 \le n \le 3 \cdot 10^5\)) — количество вершин дерева.

Каждая из следующих \(n - 1\) содержит два числа \(x\) и \(y\) (\(1 \le x, y \le n\)) — ребро между вершинами \(x\) и \(y\). Гарантируется, что заданный граф является деревом.

Гарантируется, что сумма всех \(n\) не превосходит \(3 \cdot 10^5\).

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

На каждый запрос выведите одно число — максимальный размер хорошего поддерева заданного дерева.

Примечание

В первом запросе одно из хороших поддеревьев размера \(8\) состоит из вершин: \({9, 4, 10, 2, 5, 1, 6, 3}\).

D. Конкурс котиков

2-sat графы Паросочетания поиск в глубину и подобное *2400

В Котовице в ближайшие выходные будет проходить конкурс котиков. Для конкурса нужно выбрать жюри и участников. Всего в Котовице \(n\) жителей и \(n\) котиков, у каждого жителя живёт ровно один котик. Жители и котики пронумерованы целыми числами от \(1\) до \(n\), причем у \(i\)-го жителя живёт \(i\)-й котик.

Каждый житель Котовице знаком с несколькими котиками, включая, конечно же, своего. Для конкурса нужно выбрать нескольких жителей на роль жюри, и нескольких котиков на роль участников. Для того, чтобы конкурс состоялся, в нём должен принять участие хотя бы один член жюри, и хотя бы один участник. Для того, чтобы конкурс прошёл честно, ни один член жюри не должен быть знаком ни с одним участником. И, наконец, чтобы конкурс прошёл наиболее интересно, было решено, что количество членов жюри плюс количество участников должно равняться \(n\).

Помогите жителям Котовице выбрать состав жюри и участников для предстоящего конкурса, либо определите, что это сделать невозможно.

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

Первая строка содержит целое число \(t\) (\(1 \le t \le 100\,000\)) — количество тестовых случаев. Далее следует описание \(t\) тестовых случаев, каждый из которых задан следующим образом:

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \le n \le m \le 10^6\)) — количество жителей в Котовице и количество пар знакомых жителей и котиков.

В следующих \(m\) строках заданы пары целых чисел \(a_i\) и \(b_i\) (\(1 \le a_i, b_i \le n\)), обозначающих, что \(a_i\)-й житель знаком с \(b_i\)-м котиком. Каждая пара жителя и котика встречается в списке знакомых не более одного раза.

Гарантируется, что для любого \(i\) в списке присутствует пара из \(i\)-го жителя и \(i\)-го котика.

Тестовые случаи разделены одной пустой строкой.

Гарантируется, что сумма \(n\) по всем тестам не превосходит \(10^6\), и что сумма \(m\) по всем тестам не превосходит \(10^6\).

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

Для каждого тестового случая выведите:

  • «No», если выбрать состав жюри и участников для конкурса невозможно.
  • Иначе выведите «Yes».

    Во второй строке выведите два целых числа \(j\) и \(p\) (\(1 \le j\), \(1 \le p\), \(j + p = n\)) — количество членов жюри и участников в конкурсе.

    В третьей строке выведите \(j\) различных целых чисел от \(1\) до \(n\) — номера жителей, которые должны быть выбраны на роль жюри.

    В четвертой строке выведите \(p\) различных целых чисел от \(1\) до \(n\) — номера котиков, которые должны быть выбраны на роль участников.

    Если существует несколько корректных ответов, выведите любой из них.

Примечание

В первом тестовом случае на роль жюри можно выбрать первого и третьего жителя, ни один из них не знаком со вторым котиком, поэтому его можно выбрать на роль участника.

Во втором тестовом случае на роль жюри можно выбрать второго жителя, он не знаком ни с первым, ни с третьим котиком, которых можно выбрать на роль участников.

В третьем тестовом случае ответа не существует, потому что единственный житель знаком с единственным котиком. Поэтому они не могут участвовать в конкурсе одновременно. Значит, в конкурсе не будет участвовать ни один житель, либо ни один котик.

В четвёртом тестовом случае, каждый житель знаком с каждым котиком, поэтому в конкурсе не могут одновременно участие какой-то житель и какой-то котик.

B. 0-1 MST

графы поиск в глубину и подобное снм сортировки *1900

Уджан накопил много ненужного хлама в своих ящиках, значительная часть которого является тетрадями с записями по математике: настало время их разобрать. Сейчас он нашёл старую запылившуюся тетрадь по теории графов с описанием одного графа.

Это неориентированный взвешенный граф с \(n\) вершинами. К тому же, это полный граф: каждая пара вершин соединена ребром. Вес каждого ребра равен либо \(0\), либо \(1\); к тому же, ровно \(m\) рёбер имеют вес \(1\), а все остальные рёбра имеют вес \(0\).

Так как Уджан не очень сильно желает разбирать свои записи, он решил найти вес минимального остовного дерева данного графа. (Вес остовного дерева графа равняется сумме весов всех его рёбер.) Можете ли вы найти ответ за Уджана, чтобы он прекратил валять дурака?

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

Первая строка ввода содержит два целых числа \(n\) и \(m\) (\(1 \leq n \leq 10^5\), \(0 \leq m \leq \min(\frac{n(n-1)}{2},10^5)\)), количество вершин и количество рёбер веса \(1\) в данном графе.

\(i\)-тая из следующих \(m\) строк содержит целые числа \(a_i\) и \(b_i\) (\(1 \leq a_i, b_i \leq n\), \(a_i \neq b_i\)), концы \(i\)-го ребра с весом \(1\).

Гарантируется, что ни одно ребро не повторяется во вводе.

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

Выведите одно целое число, вес минимального остовного дерева в данном графе.

Примечание

Граф из первого примера показан на картинке ниже. Пунктирные рёбра имеют вес \(0\), все остальные рёбра имеют вес \(1\). Одно из возможных остовных деревьев покрашено в оранжевый цвет и имеет общий вес \(2\).

Во втором примере, вес каждого ребра \(0\), поэтому вес любого остовного дерева равен \(0\).

C. Баланс сумм

битмаски графы дп поиск в глубину и подобное *2400

У Уджана в коробках накопилось много чисел. Ему нравится баланс и порядок, поэтому он решил перераспределить числа.

Всего есть \(k\) коробок, пронумерованных числами от \(1\) до \(k\). \(i\)-я коробка содержит \(n_i\) целых чисел. Числа могут быть и отрицательными. Все данные числа различны.

Уджан ленивый, поэтому он выполнит следующее перераспределение ровно один раз. Вначале он выберет по одному числу из каждой коробки, всего \(k\) чисел. Затем он поместит выбранные числа по одному числу в каждую из коробок, так, что количество чисел в каждой коробке такое же, как и в начале. Учтите, что он может поместить число, которое он выбрал из одной коробки обратно в ту же коробку.

Уджан будет рад, если сумма чисел во всех коробках станет одинаковая. Может ли он достичь этого, и сбалансировать таким образом все коробки, как все вещи и должны быть?

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

Первая строка ввода содержит одно целое число \(k\) (\(1 \leq k \leq 15\)), количество коробок.

\(i\)-я из следующих \(k\) строк начинается с одного целого числа \(n_i\) (\(1 \leq n_i \leq 5\,000\)), количества чисел в коробке с номером \(i\). Затем та же строка содержит \(n_i\) чисел \(a_{i,1}, \ldots, a_{i,n_i}\) (\(|a_{i,j}| \leq 10^9\)), числа, которые находятся в \(i\)-й коробке.

Гарантируется, что все числа \(a_{i,j}\) различны.

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

Если Уджан не может достичь своей цели, выведите «No». В противоположном случае выведите сначала «Yes», и затем выведите \(k\) строк. \(i\)-я из этих строк должна содержать два целых числа \(c_i\) и \(p_i\). Эти числа должны означать то, что Уджан выберет число \(c_i\) из \(i\)-й коробки и поместит его в \(p_i\)-ю коробку.

Если существует больше одного решения, выведите любое.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную).

Примечание

В первом примере Уджан может поместить число \(7\) во \(2\)-ю коробку, число \(2\) в \(3\)-ю коробку, число \(5\) в \(1\)-ю коробку, а число \(10\) оставить в той же \(4\)-й коробке. Тогда коробки будут содержать числа \(\{1,5,4\}\), \(\{3, 7\}\), \(\{8,2\}\) и \(\{10\}\). Сумма чисел в каждой коробке станет равна \(10\).

Во втором примере невозможно выбрать и перераспределить числа данным способом.

В третьем примере можно поменять местами числа \(-20\) и \(-10\), тогда сумма чисел в обеих коробках станет равна \(-10\).

B2. Обмен книгами (сложная версия)

математика поиск в глубину и подобное снм *1300

Единственное отличие между простой и сложной версиями — ограничения.

Есть \(n\) детей, каждый из которых читает уникальную книгу. В конце каждого дня \(i\)-й ребёнок отдаёт свою книгу \(p_i\)-му ребёнку (в случае, когда \(i = p_i\) ребенок отдает свою книгу самому себе). Гарантируется, что все значения \(p_i\) — различные целые числа от \(1\) до \(n\) (то есть \(p\) — перестановка). Последовательность \(p\) не меняется изо дня в день, она фиксированная.

Например, если \(n=6\) и \(p=[4, 6, 1, 3, 5, 2]\), то в конце первого дня книга \(1\)-го ребёнка будет у \(4\)-го ребёнка, книга \(2\)-го ребёнка будет у \(6\)-го ребёнка и так далее. В конце второго дня книга \(1\)-го ребёнка будет у \(3\)-го ребёнка, книга \(2\)-го ребёнка будет у \(2\)-го ребёнка и так далее.

Перед вами стоит задача — для каждого \(i\) от \(1\) до \(n\) определить число дней, через которое книга \(i\)-го ребёнка вернётся обратно к нему в первый раз.

Предположим что \(p = [5, 1, 2, 4, 3]\). Книга \(1\)-го ребёнка будет передана следующим детям:

  • после \(1\)-го дня она будет у \(5\)-го ребёнка,
  • после \(2\)-го дня она будет у \(3\)-го ребёнка,
  • после \(3\)-го дня она будет у \(2\)-го ребёнка,
  • после \(4\)-го дня она будет у \(1\)-го ребёнка.

Таким образом, после четвертого дня книга первого ребёнка вернётся к своему владельцу. Книга четвёртого ребёнка вернётся к нему в первый раз сразу после первого дня.

Вы должны ответить на \(q\) независимых запросов.

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

Первая строка входных данных содержит одно целое число \(q\) (\(1 \le q \le 1000\)) — количество запросов. Затем следуют \(q\) запросов.

Первая строка запроса содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество детей в запросе. Вторая строка запроса содержит \(n\) целых чисел \(p_1, p_2, \dots, p_n\) (\(1 \le p_i \le n\), все \(p_i\) различны, т.е. \(p\) является перестановкой), где \(p_i\) — это ребёнок, который получит книгу от \(i\)-го ребёнка.

Гарантируется, что \(\sum n \le 2 \cdot 10^5\) (сумма \(n\) по всем запросах не превосходит \(2 \cdot 10^5\)).

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

Для каждого запроса выведите ответ на него: \(n\) целых чисел \(a_1, a_2, \dots, a_n\), где \(a_i\) — номер дня, в конце которого книга \(i\)-го ребёнка вернётся к нему в первый раз в этом запросе.

N. Wires

графы жадные алгоритмы поиск в глубину и подобное *2000

Polycarpus has a complex electronic device. The core of this device is a circuit board. The board has \(10^9\) contact points which are numbered from \(1\) to \(10^9\). Also there are \(n\) wires numbered from \(1\) to \(n\), each connecting two distinct contact points on the board. An electric signal can pass between wires \(A\) and \(B\) if:

  • either both wires share the same contact point;
  • or there is a sequence of wires starting with \(A\) and ending with \(B\), and each pair of adjacent wires in the sequence share a contact point.
The picture shows a circuit board with \(5\) wires. Contact points with numbers \(2, 5, 7, 8, 10, 13\) are used. Here an electrical signal can pass from wire \(2\) to wire \(3\), but not to wire \(1\).

Currently the circuit board is broken. Polycarpus thinks that the board could be fixed if the wires were re-soldered so that a signal could pass between any pair of wires.

It takes \(1\) minute for Polycarpus to re-solder an end of a wire. I.e. it takes one minute to change one of the two contact points for a wire. Any contact point from range \([1, 10^9]\) can be used as a new contact point. A wire's ends must always be soldered to distinct contact points. Both wire's ends can be re-solded, but that will require two actions and will take \(2\) minutes in total.

Find the minimum amount of time Polycarpus needs to re-solder wires so that a signal can pass between any pair of wires. Also output an optimal sequence of wire re-soldering.

Input

The input contains one or several test cases. The first input line contains a single integer \(t\) — number of test cases. Then, \(t\) test cases follow.

The first line of each test case contains a single integer \(n\) (\(1 \le n \le 10^5\)) — the number of wires. The following \(n\) lines describe wires, each line containing two space-separated integers \(x_i, y_i\) (\(1 \le x_i, y_i \le 10^9\), \(x_i \neq y_i\)) — contact points connected by the \(i\)-th wire. A couple of contact points can be connected with more than one wire.

Sum of values of \(n\) across all test cases does not exceed \(10^5\).

Output

For each test case first print one line with a single integer \(k\) — the minimum number of minutes needed to re-solder wires so that a signal can pass between any pair of wires. In the following \(k\) lines print the description of re-solderings. Each re-soldering should be described by three integers \(w_j, a_j, b_j\) (\(1 \le w_j \le n\), \(1 \le a_j, b_j \le 10^9\)). Such triple means that during the \(j\)-th re-soldering an end of the \(w_j\)-th wire, which was soldered to contact point \(a_j\), becomes soldered to contact point \(b_j\) instead. After each re-soldering of a wire it must connect two distinct contact points. If there are multiple optimal re-solderings, print any of them.

D. Гармоничный граф

графы жадные алгоритмы Конструктив поиск в глубину и подобное снм сортировки *1700

Вам дан неориентированный граф из \(n\) вершин и \(m\) ребер. Вершины пронумерованы целыми числами от \(1\) до \(n\).

Назовем граф гармоничным если и только если выполняется следующее свойство:

  • Для каждой такой тройки целых чисел \((l, m, r)\), что \(1 \le l < m < r \le n\), если есть путь из вершины \(l\) в вершину \(r\), тогда существует путь из вершины \(l\) в вершину \(m\).

Иначе говоря, в гармоничном графе, если из вершины \(l\) можно по ребрам дойти до вершины \(r\) (\(l < r\)), тогда также должно быть можно дойти до вершин \((l+1), (l+2), \ldots, (r-1)\).

Какое минимальное число ребер надо добавить в граф, чтобы он стал гармоничным?

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

В первой строке входного файла записаны два целых числа \(n\) и \(m\) (\(3 \le n \le 200\ 000\) и \(1 \le m \le 200\ 000\)).

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

Гарантируется, что граф простой (в нем нет петель, а также между каждой парой вершин существует не более одного ребра).

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

Выведите минимальное количество ребер которое нужно добавить в граф, чтобы он стал гармоничным.

Примечание

В первом примере граф не гармоничный (например, при \(1 < 6 < 7\), из вершины \(1\) можно достичь вершину \(7\) по пути \(1 \rightarrow 2 \rightarrow 7\), но из вершины \(1\) нельзя достичь вершину \(6\)). Однако добавление ребра \((2, 4)\) достаточно, чтобы сделать его гармоничным.

Во втором примере граф уже гармоничный.

E. Отправьте дерево Чарли

Деревья Комбинаторика поиск в глубину и подобное снм *3300

Рождество постучало в дверь, и наш главный герой, Боб, готовил захватывающий подарок для своего давнего второго лучшего друга Чарли. Поскольку ему не нравится шоколад, он решил вместо этого украсить дерево. Дерево Боба можно представить в виде неориентированного связного графа с \(n\) вершинами (пронумерованными от \(1\) до \(n\)) и \(n-1\) ребрами. Первоначально Боб поместил украшение с номером \(i\) на вершину \(i\) для каждого \(1 \le i \le n\). Однако, поскольку такая простая композиция получилась некрасивой, он решил немного переместить украшения. Формально Боб сделал следующие шаги:

  • Сначала он выписал все \(n-1\) ребра в некотором порядке.
  • Затем он рассмотрел все ребра один за другим в таком порядке. Для каждого ребра \((u, v)\) он поменял местами украшение вершины \(u\) с украшением вершины \(v\).

После этого Боб оказался довольным такой аранжировкой и пошел спать.

На следующее утро Боб просыпается, только чтобы узнать, что его прекрасная аранжировка разрушена! Прошлой ночью младший брат Боба, Бобо, бросил некоторые украшения на пол, когда играл с деревом. К счастью, украшения не были потеряны, поэтому Боб может восстановить дерево в кратчайшие сроки. Однако он полностью забыл, как дерево выглядело вчера. Поэтому, учитывая номера украшений, которые все еще на дереве, Боб хочет узнать количество возможных конфигураций дерева. Поскольку результат может быть довольно большим, Боб будет рад, если вы сможете вывести результат по модулю \(1000000007\) (\(10^9+7\)). Обратите внимание, что, возможно, не существует никаких возможных конфигураций.

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

Первая строка содержит одно целое число \(n\) (\(2 \leq n \leq 500\,000\)) — количество вершин.

Каждая из следующих \(n - 1\) строк содержит два целых числа \(u\) и \(v\) (\(1 \leq u, v \leq n\)), которые обозначают, что существует ребро между вершинами \(u\) и \(v\). Гарантируется, что граф — дерево.

Последняя строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le n\)). Для каждого \(i\), \(a_i = 0\) значит, что украшение вершины \(i\) было сброшено. Иначе \(a_i\) обозначает номер украшения, что находится в вершине \(i\). Гарантируется, что каждый номер встречается не более одного раза.

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

Выведите количество конфигураций по модулю \(1000000007\) (\(10^9+7\)).

Примечание

В первом примере возможными конфигурациями дерева являются \([2, 4, 1, 3]\) и \([3, 4, 2, 1]\).

Во втором примере обратите внимание, что есть \(4! = 24\) возможных перестановок ребер, но возможны только \(12\) различные финальные конфигурации.

В третьем примере легко увидеть, что украшение с номером \(1\) не может оставаться в вершине \(1\) после перестановок.

D. Секретные пароли

графы поиск в глубину и подобное снм *1500

Один малоизвестный хакер захотел заполучить пароль администратора от тестирующей системы AtForces, чтобы узнать задачи с предстоящего контеста. Чтобы достичь этого, он пробрался в кабинет администратора и украл листочек, на котором записан список из \(n\) паролей — строк, состоящих из строчных букв латинского алфавита.

Хакер вернулся домой и начал готовиться ко взлому. Он обнаружил, что в системе содержатся только пароли с украденного листочка, и что система определяет эквивалентность паролей \(a\) и \(b\) следующим образом:

  • два пароля \(a\) и \(b\) эквивалентны, если существует символ, который есть и в \(a\), и в \(b\);
  • два пароля \(a\) и \(b\) эквивалентны, если существует другой пароль \(c\) из списка, которому эквивалентны одновременно и \(a\), и \(b\).

Если в системе установлен некоторый пароль, а применяется ему эквивалентный, то пользователь получает доступ к системе.

К примеру, если в списке содержатся пароли «a», «b», «ab», «d», то с точки зрения системы пароли «a», «b», «ab» эквивалентны друг другу, а пароль «d» никакому другому не эквивалентен. Иначе говоря, если:

  • установленный пароль равен, например, «b», то можно зайти в систему под любым из трёх паролей: «a», «b», «ab»;
  • установленный пароль равен «d», то можно зайти в систему только под паролем «d».

Известно, что ровно один пароль из списка является паролем администратора от тестирующей системы. Помогите хакеру понять, какое минимальное количество паролей понадобится использовать при взломе, чтобы гарантированно получить доступ к системе. Имейте в виду, что хакер не знает, какой именно пароль установлен в системе.

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

В первой строке задано число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество паролей. В следующих \(n\) строках заданы пароли администратора из списка — непустые строки \(s_i\), длины которых не превышают \(50\) символов. Некоторые строки могут совпадать.

Гарантируется, что суммарная длина всех паролей не превышает \(10^6\) символов. Все они состоят только из строчных букв латинского алфавита.

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

В единственной строке выведите минимальное количество паролей, использование которых позволит гарантированно получить доступ к системе.

Примечание

Во втором примере необходимо использовать любой из паролей, чтобы получить доступ к системе.

F. Экономические проблемы

графы Деревья дп поиск в глубину и подобное Потоки Структуры данных *2400

Электросеть дворцов в Берляндии состоит из 2-х сетей: основной и запасной. Провода во дворцах сделаны из дорогого материала, поэтому их продажа будет отличной идеей!

Каждая из сетей (основная и запасная) имеет главный узел (он имеет номер \(1\)), из которого ток поступает на другие узлы сети. Все узлы доступны от главного по единственному пути. В обеих сетях количество узлов, из которых ток не распространяется дальше, равно \(n\).

Иными словами, каждая из сетей является отдельным корневым ориентированным деревом с \(n\) листьями и с корнем в вершине \(1\). В каждом дереве свои вершины и своя независимая нумерация вершин.

Кроме электросетей во дворце есть \(n\) приборов, каждый из которых соединён с одним из узлов основной и с одним из узлов запасной сети. Приборы соединяются только с такими узлами, из которых ток не распространяется далее (то есть, которые являются листьями). Каждый такой узел (лист дерева) соединён ровно с одним прибором.

В этом примере основная сеть содержит \(6\) узлов (изображена сверху), а запасная — \(4\) узла (изображена снизу). Количество приборов равно \(3\), они пронумерованы синим цветом.

Гарантируется, что вся электросеть (две сети и \(n\) приборов) может быть изображена на схеме способом, аналогичным картинке выше:

  • основная сеть будет составлять дерево сверху, в котором все провода ведут в направлении «сверху вниз»,
  • запасная сеть будет составлять дерево снизу, в котором все провода ведут в направлении «снизу вверх»,
  • приборы — горизонтальный ряд между ними, пронумерованный от \(1\) до \(n\) слева направо,
  • провода между узлами сетей изображены непересекающимися отрезками.

Формально, для каждого дерева существует такой обход в глубину из вершины \(1\), что его листья посещаются в порядке их присоединения к приборам \(1, 2, \dots, n\) (то есть сначала узел, присоединенный к прибору \(1\), затем узел, присоединенный к прибору \(2\), и так далее).

Предприниматель хочет продать (удалить) максимальное количество проводов так, чтобы на каждый прибор поступал ток из хотя бы одной сети. Иначе говоря, для каждого прибора должен существовать путь до главного узла сети (основной или запасной), проходящий по проводам сети от этого главного узла.

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

В первой строке записано целое число \(n\) (\(1 \le n \le 1000\)) — количество приборов во дворце.

В следующей строке записано целое число \(a\) (\(1 + n \le a \le 1000 + n\)) — количество узлов в основной электросети.

В следующей строке содержатся \(a - 1\) целых чисел \(p_i\) (\(1 \le p_i \le a\)). Каждое число \(p_i\) задает провод от \(p_i\)-го узла к \((i + 1)\)-му.

В следующей строке записаны \(n\) чисел \(x_i\) (\(1 \le x_i \le a\)) — номер узла в основной электросети, с которым соединен \(i\)-й электроприбор.

В следующей строке записано целое число \(b\) (\(1 + n \le b \le 1000 + n\)) — количество узлов в запасной электросети.

В следующей строке содержатся \(b - 1\) целых чисел \(q_i\) (\(1 \le q_i \le b\)). Каждое число \(q_i\) задает провод от \(q_i\)-го узла к \((i + 1)\)-му.

В следующей строке записаны \(n\) чисел \(y_i\) (\(1 \le y_i \le b\)) — номер узла в запасной электросети, с которым соединен \(i\)-й электроприбор.

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

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

Выведите единственное целое число — максимальное количество проводов, которые можно удалить из сети так, чтобы каждый прибор продолжил получать электрический ток.

Примечание

Для первого примера ниже на картинке изображен один из возможных вариантов решения (красным цветом отмечены провода, которые можно удалить):

Второй и третий примеры изображены ниже:

F. Почти одинаковое расстояние

графы поиск в глубину и подобное *2900

Пусть \(G\) — простой граф, а \(W\) — непустое подмножество множества вершин этого графа. Назовем \(W\) почти-\(k\)-единым, если для каждой пары различных вершин \(u,v \in W\) расстояние между \(u\) и \(v\) равно либо \(k\), либо \(k+1\).

Вам задано дерево из \(n\) вершин. Для каждого \(i\) от \(1\) до \(n\) найдите максимальный размер почти-\(i\)-единого множества вершин.

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

В первой строке задано одно целое число \(n\) (\(2 \leq n \leq 5 \cdot 10^5\)) — количество вершин в дереве.

Затем следуют \(n-1\) строк, \(i\)-я из которых содержит два целых числа \(u_i\), \(v_i\) (\(1 \leq u_i, v_i \leq n\)), обозначающих, что существует ребро, соединяющее вершины \(u_i\) и \(v_i\).

Гарантируется, что заданный граф — дерево.

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

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

Примечание

Рассмотрим первый пример.

  • Единственное максимальное почти-\(1\)-единое множество вершин — это \(\{1, 2, 3, 4\}\).
  • Одно из максимальных почти-\(2\)-единых множеств — \(\{2, 3, 5\}\), также таким множеством является \(\{2, 3, 4\}\).
  • Максимальное почти-\(3\)-единое множество — любые две вершины на расстоянии \(3\).
  • Почти-\(k\)-единое множество может состоять из единственной (любой) вершины для любого \(k \geq 1\).

Во втором примере существует почти-\(2\)-единое множество размера \(4\): \(\{2, 3, 5, 6\}\).

G. Подмножество с суммой ноль

графы Конструктив математика поиск в глубину и подобное *2700

Вам даны \(n\) целых чисел \(a_1, a_2, \dots, a_n\), причем для каждого \(1\le i \le n\) выполняется \(i-n\le a_i\le i-1\).

Найдите какое-то непустое подмножество этих чисел, сумма которых равна \(0\). Можно показать, что при данных ограничениях такое подмножество существует. Если существуют несколько подмножеств с суммой ноль, вы можете вывести любое из них.

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

Во входных данных находятся несколько (не меньше одного) тестовых случаев. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^6\)) — количество тестовых случаев. Далее следуют описания тестовых случаев.

Первая строка описания тестового случая содержит единственное целое число \(n\) (\(1\le n \le 10^6\)).

Вторая строка описания тестового случая содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(i-n \le a_i \le i-1\)).

Гарантируется, что сумма значений \(n\) по всем тестовым случаям не превосходит \(10^6\).

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

Для каждого теста, выведите две строки.

В первой строке выведите \(s\) (\(1\le s \le n\)) — количество элементов в вашем подмножестве.

В второй строке выведите \(s\) чисел \(i_1, i_2, \dots, i_s\) (\(1\le i_k \le n\)). Все числа должны быть попарно различными, а сумма \(a_{i_1} + a_{i_2} + \dots + a_{i_s}\) должна быть равна \(0\). Если существуют несколько подмножеств с суммой ноль, вы можете вывести любое из них.

Примечание

В первом примере, сумма равна \(a_1 = 0\).

Во втором примере, сумма равна \(a_1 + a_4 + a_3 + a_2 = 0\).

E. Ближайшая противоположная четность

графы кратчайшие пути поиск в глубину и подобное *1900

Вам задан массив \(a\), состоящий из \(n\) целых чисел. За один ход вы можете прыгнуть с позиции \(i\) в позицию \(i - a_i\) (если \(1 \le i - a_i\)) или в позицию \(i + a_i\) (если \(i + a_i \le n\)).

Для каждой позиции \(i\) от \(1\) до \(n\) вы хотите узнать минимальное количество ходов, необходимое, чтобы достичь любой позиции \(j\) такой, что \(a_j\) имеет четность, отличающуюся от четности \(a_i\) (то есть если \(a_i\) нечетно, то \(a_j\) должно быть четным и наоборот).

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

Первая строка входных данных содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество элементов в \(a\).

Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\)), где \(a_i\) равно \(i\)-му элементу \(a\).

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

Выведите \(n\) целых чисел \(d_1, d_2, \dots, d_n\), где \(d_i\) равно минимальному количеству ходов, необходимому, чтобы достичь любой позиции \(j\) такой, что \(a_j\) имеет четность, отличающуюся от четности \(a_i\) (то есть если \(a_i\) нечетно, то \(a_j\) должно быть четным и наоборот) или же -1, если такой позиции достичь невозможно.

E. Тесты для задачи D

Деревья Конструктив поиск в глубину и подобное разделяй и властвуй *2200

Нам было очень сложно придумать тесты для задачи D. Чтобы подготовить сильные тесты, нам пришлось решить следующую задачу.

Для заданного неориентированного помеченного дерева, состоящего из \(n\) вершин, найдите набор отрезков, такой что:

  1. концы каждого отрезка являются целыми числами от \(1\) до \(2n\), и каждое целое число от \(1\) до \(2n\) должно встречаться как конец ровно одного отрезка;
  2. все отрезки — невырожденные;
  3. для каждой такой пары чисел \((i, j)\), что \(i \ne j\), \(i \in [1, n]\) и \(j \in [1, n]\), вершины \(i\) и \(j\) соединены ребром тогда и только тогда, когда отрезки \(i\) и \(j\) пересекаются, но ни отрезок \(i\) не содержится полностью в отрезке \(j\), ни отрезок \(j\) полностью не содержится в отрезке \(i\).

А вы можете решить эту задачу?

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

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 5 \cdot 10^5\)) — количество вершин в дереве.

Следующие \(n - 1\) строк содержат по два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\), \(x_i \ne y_i\)), описывающие концы \(i\)-го ребра.

Гарантируется, что данный граф является деревом.

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

Выведите \(n\) пар целых чисел, \(i\)-я пара должна содержать два целых числа \(l_i\) и \(r_i\) (\(1 \le l_i < r_i \le 2n\)) — концы \(i\)-го отрезка. Все \(2n\) целых чисел, которые вы вывели, должны быть различными.

Гарантируется, что ответ всегда существует.

A. Статуи

поиск в глубину и подобное *1500

В этой задаче Аня и Маша играют в игру с очень неприятным соперником. Аня и Маша находятся в двух противоположных клетках шахматной доски (размером 8 × 8): Аня — в верхней правой, а Маша — в нижней левой. Кроме них, на доске находятся несколько статуй. Каждая статуя занимает полностью ровно одну клетку. В клетке, в которой есть статуя, не может быть больше ничего и никого — ни другой статуи, ни Ани, ни Маши.

Аня присутствует на доске в качестве статиста (она стоит и не двигается), а Маша принимает активное участие в игре. Ее цель — прийти в клетку к Ане. Маша и статуи делают ходы по очереди, первой ходит Маша. За один свой ход Маша может перейти в любую соседнюю по стороне или по диагонали клетку, в которой нет статуи, либо остаться в клетке, в которой она находится. Статуи на своем ходу все одновременно спускаются на одну клетку вниз, а те, которые были в нижнем ряду — сваливаются с доски и больше не появляются.

В тот момент, когда одна из статуй оказывается в клетке, в которой находится Маша, статуи объявляются победителями. В тот момент, когда Маша приходит в клетку, в которой ее ждет Аня, Маша объявляется победительницей.

Очевидно, что от статуй ничего не зависит, поэтому все зависит от Маши. Определите, кто из них выиграет, если Маша не сделает стратегической ошибки.

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

Даны 8 строк длины 8, описывающие изначальную позицию на доске. Первая строка отвечает за верхний ряд доски, вторая — за второй сверху, и так далее, последняя — за нижний. Каждый символ строки соответствует одной клетке доски в соответствующем ряду, причем символы идут в том же порядке, что и соответствующие им клетки. Если клетка пуста, соответствующий символ — «.». Если в клетке Маша — символ «M». Если в клетке Аня — символ «A». Если в клетке статуя — символ «S».

Гарантируется, что последний символ первой строки — обязательно «A», первый символ последней строки — обязательно «M». Остальные символы — «.» или «S».

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

Если выиграет Маша, выведите строку «WIN». Если выиграют статуи, выведите строку «LOSE».

C. Jeremy Bearimy

графы Деревья жадные алгоритмы поиск в глубину и подобное *2000

Добро пожаловать! Все хорошо.

Вы прибыли в Среднее место, место между Хорошим местом и Плохим местом. Вам поручено выполнить два задания, одно сделает всех людей счастливыми, другое будет мучить их вечно.

У вас есть список \(k\) пар людей, которые прибыли в новый район. Вам нужно назначить каждому из \(2k\) людей свой из \(2k\) домов. Каждый человек будет владельцем ровно одного дома и каждый дом будет иметь ровно одного владельца.

Конечно, в этом районе можно перемещаться между домами. Всего есть \(2k - 1\) дорога, каждая из них соединяет два дома. Требуется некоторое время, чтобы проехать по дороге. Эти времена известны для каждой дороги. Район спроектирован таким образом, что между любыми двумя домами существует ровно один путь по дорогам от одного дома до другого, не проходящий по одной и той же дороге дважды. Другими словами, граф, в котором вершины это дома, а ребра это дороги это дерево.

Люди в каждой из \(k\) пар людей хорошо дружат и любят ходить в гости. Мы пронумеруем пары людей от \(1\) до \(k\). Обозначим за \(f(i)\) время, которое требуется \(i\)-й паре людей, чтобы проехать между домами друг друга.

Как уже было сказано ранее, вы должны сопоставить каждому из \(2k\) людей один из \(2k\) домов. У вас есть две миссии, одна назначена из Хорошего места, другая назначена из Плохого места. Эти миссии заключаются в следующем:

  • Первая миссия, из Хорошего места, заключается в том, чтобы сопоставить людям дома, так чтобы сумма \(f(i)\) по всем парам \(i\) была минимальна. Давайте обозначим эту минимальную возможную сумму за \(G\). Это дает нам уверенность, что все пары друзей могут легко и эффективно посещать друг друга;
  • Вторая миссия, из Плохого места, заключается в том, чтобы сопоставить людям дома, так чтобы сумма \(f(i)\) по всем парам \(i\) была максимальна. Давайте обозначим эту максимальную возможную сумму за \(B\). Это дает нам уверенность, что все пары друзей могут только трудно и неэффективно посещать друг друга;

Чему равны значения \(G\) и \(B\)?

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

В первой строке находится единственное целое число \(t\) (\(1 \le t \le 500\)), количество тестовых случаев. В следующих строках находится описание тестовых случаев.

Первая строка каждого тестового случая содержит единственное целое число \(k\), обозначающая количество пар людей (\(1 \le k \le 10^5\)). В следующих \(2k - 1\) строках находится описание дорог; в \(i\)-й строке находится три целых числа \(a_i, b_i, t_i\), которые обозначают, что \(i\)-я дорога соединяет дома \(a_i\) и \(b_i\) и требует \(t_i\) единиц времени, чтобы проехать по ней (\(1 \le a_i, b_i \le 2k\), \(a_i \neq b_i\), \(1 \le t_i \le 10^6\)). Гарантируется, что данные дороги образуют структуру дерева.

Гарантируется, что сумма всех \(k\) по всем тестовым случаям не превосходит \(3 \cdot 10^5\).

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

Для каждого тестового случая, выведите два целых числа \(G\) и \(B\), разделенные пробелом.

Примечание

Для первого тестового случая, мы можем получить минимальную сумму равную \(G = 15\). Один из способов достичь такую сумму это следующее назначение домов:

  • Первой паре людей назначим дома \(5\) и \(6\), что даст нам \(f(1) = 5\);
  • Второй паре людей назначим дома \(1\) и \(4\), что даст нам \(f(2) = 6\);
  • Третьей паре людей назначим дома \(3\) и \(2\), что даст нам \(f(3) = 4\).

Обратите внимание, что тогда сумма всех \(f(i)\) это \(5 + 6 + 4 = 15\).

Также мы можем получить максимальную сумму равной \(B = 33\). Один из способов достичь такую сумму это следующее назначение домов:

  • Первой паре людей назначим дома \(1\) и \(4\), что даст нам \(f(1) = 6\);
  • Второй паре людей назначим дома \(6\) и \(2\), что даст нам \(f(2) = 14\);
  • Третьей паре людей назначим дома \(3\) и \(5\), что даст нам \(f(3) = 13\).

Обратите внимание, что тогда сумма всех \(f(i)\) это \(6 + 14 + 13 = 33\).

E. Тортик - ложь

графы Конструктив поиск в глубину и подобное Структуры данных *2400

Мы заботимся о моральном состоянии участников соревнования. Поэтому вместо задачи мы предлагаем вам полакомиться кусочком торта.

Ох, кто-то уже разрезал торт! Мы просили их дождаться вас, но они не послушали. Если поторопитесь, успеете взять кусочек. Вы, конечно, перед тем, как попробовать торт, задумались, как торт был разрезан.

Известно, что торт изначально представлял собой правильный \(n\)-угольник, каждая вершина которого имела уникальный номер от \(1\) до \(n\). Вершины были пронумерованы в некотором произвольном порядке.

Каждый кусок торта — это треугольник. Торт разрезали на \(n - 2\) куска следующим образом: каждый раз проводили один разрез ножом (от вершины до вершины) такой, что от текущего торта отделялся ровно один треугольный кусок, а оставшаяся часть продолжала составлять выпуклый многоугольник. Иными словами, каждый раз выбирали три подряд идущие вершины многоугольника и отрезали соответствующий треугольник.

Возможный процесс разрезания торта представлен на рисунке ниже.

Пример разрезания 6-угольного торта.

Вам задан набор получившихся \(n-2\) треугольных кусочков в произвольном порядке. Вершины каждого из кусочков записаны в произвольном порядке — по или против часовой стрелки. Каждый кусочек задается тремя числами — номерами соответствующих ему вершин \(n\)-угольного торта.

Например, для ситуации с рисунком выше вам мог быть задан набор кусочков: \([3, 6, 5], [5, 2, 4], [5, 4, 6], [6, 3, 1]\).

Вас интересуют два вопроса.

  • Какая была нумерация вершин \(n\)-угольного торта?
  • В каком порядке отрезались кусочки?

Формально, вам предстоит найти две перестановки \(p_1, p_2, \dots, p_n\) (\(1 \le p_i \le n\)) и \(q_1, q_2, \dots, q_{n - 2}\) (\(1 \le q_i \le n - 2\)) такие, что если вершины торта пронумерованы числами \(p_1, p_2, \dots, p_n\) в порядке по или против часовой стрелки, то при отрезании кусков торта в порядке \(q_1, q_2, \dots, q_{n - 2}\) всегда отрезается треугольный кусок так, что оставшаяся часть образует один выпуклый многоугольник.

Например, для рисунка выше искомыми перестановками могли бы быть: \(p=[2, 4, 6, 1, 3, 5]\) (или любой её циклический сдвиг, или её переворот и после этого любой циклический сдвиг) и \(q=[2, 4, 1, 3]\).

Напишите программу, которая по заданным треугольным кусочкам находит любую подходящую пару перестановок \(p\) и \(q\).

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

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следуют \(t\) независимых наборов входных данных.

Первая строка каждого набора состоит из одного целого числа \(n\) (\(3 \le n \le 10^5\)) — количество вершин в торте.

Далее следуют \(n - 2\) строк, описывающих номера вершин кусков торта: каждая строка состоит из трех различных целых чисел \(a, b, c\) (\(1 \le a, b, c \le n\)) — номера вершин куска торта, записанные в произвольном порядке. Сами куски тоже заданы в произвольном порядке.

Гарантируется, что ответ на каждый из тестов существует. Также гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

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

Выведите \(2t\) строк — ответы на заданные \(t\) наборов в порядке их записи во входных данных. Каждый ответ должен состоять из \(2\) строк.

В первой строке ответа на набор входных данных выведите \(n\) различных чисел \(p_1, p_2, \dots, p_n\)(\(1 \le p_i \le n\)) — номера вершин торта в порядке по или против часовой стрелки. Просмотр вершин торта можно начать с любой из них.

Во второй строке ответа на набор входных данных выведите \(n - 2\) различных чисел \(q_1, q_2, \dots, q_{n - 2}\)(\(1 \le q_i \le n - 2\)) — порядок отрезания кусков торта. Номер куска торта соответствует его номеру во входных данных.

Если существует несколько ответов, выведите любой. Гарантируется, что ответ на каждый из тестов существует.

D. Dr. Evil Underscores

битмаски Деревья дп жадные алгоритмы Перебор поиск в глубину и подобное разделяй и властвуй Строки *1900

Сегодня Бакри в качестве дружеского подарка вручил Бадави \(n\) целых чисел \(a_1, a_2, \dots, a_n\) и дал ему задачку выбрать такой \(X\), что \(\underset{1 \leq i \leq n}{\max} (a_i \oplus X)\) принимает минимальное возможное значение, где \(\oplus\) обозначает операцию побитового исключающего ИЛИ.

Бадави, как обычно, ленится, поэтому вы решили помочь ему и найти минимальное возможное значение \(\underset{1 \leq i \leq n}{\max} (a_i \oplus X)\).

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

В первой строке записано одно целое число \(n\) (\(1\le n \le 10^5\)).

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 2^{30}-1\)).

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

Выведите одно целое число — минимальное возможное значение \(\underset{1 \leq i \leq n}{\max} (a_i \oplus X)\).

Примечание

В первом примере можно выбрать \(X = 3\).

Во втором примере можно выбрать \(X = 5\).

B. Числа на дереве

графы Деревья жадные алгоритмы Конструктив поиск в глубину и подобное Структуры данных *1800

Евлампию подарили корневое дерево, вершины которого пронумерованы от \(1\) до \(n\). В каждой \(i\)-й вершине написано число \(a_i\). Евлампий посчитал для каждой вершины \(i\) величину \(c_i\) — количество вершин \(j\) в поддереве вершины \(i\), для которых \(a_j < a_i\).

Иллюстрация ко второму примеру, первым написано \(a_i\), а в скобках написано \(c_i\)

После нового года Евлампий не смог вспомнить, каким был его подарок! Он помнит дерево и значения \(c_i\), однако совсем забыл, какие числа \(a_i\) были написаны в вершинах. Помогите ему восстановить исходные числа!

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

В первой строке содержится целое число \(n\) \((1 \leq n \leq 2000)\) — количество вершин в дереве.

Далее в \(n\) строках идёт описание вершин дерева: в \(i\)-й строке находятся два целых числа \(p_i\) и \(c_i\) (\(0 \leq p_i \leq n\); \(0 \leq c_i \leq n-1\)), где \(p_i\) — номер родителя вершины \(i\) или \(0\) для корня дерева, а \(c_i\) — количество вершин \(j\) в поддереве вершины \(i\), для которых \(a_j < a_i\).

Гарантируется, что значения \(p_i\) задают некоторое корневое дерево из \(n\) вершин.

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

Если решение существует, то в первой строке выведите «YES», а во второй строке выведите \(n\) чисел \(a_i\) \((1 \leq a_i \leq {10}^{9})\) — искомые числа, которые были записаны в вершинах дерева. Если решений несколько, выведите любое из них. Можно показать, что если решение существует, то также существует решение, где все \(a_i\) лежат от \(1\) до \(10^9\).

Если же решения не существует, то выведите «NO».

B. Шнурки и шестиклассники

графы Перебор поиск в глубину и подобное реализация *1200

Аня и Маша ведут математический кружок у шестиклассников. Во время кружка шестиклассники ведут себя плохо. Они принесли на кружок много шнурков, и связались друг с другом. А именно, каждый шнурок связывает вместе двух шестиклассников. При этом, если два шестиклассника связаны шнурком, то шнурок связывает как первого со вторым, так и второго с первым.

Чтобы навести порядок, Аня и Маша делают следующее. Сначала Аня для каждого шестиклассника находит, со сколькими другими шестиклассниками он связан шнурками. Если шестиклассник связан ровно с одним другим, Аня объявляет ему выговор. Потом Маша собирает в группу всех шестиклассников, которым Аня объявила выговор, и выгоняет вон из класса. Выгнанные шестиклассники отвязываются и уходят из класса, забирая с собой шнурки, которыми они были привязаны. Потом снова Аня для каждого шестиклассника находит, со сколькими другими шестиклассниками он связан, и так далее. И так они делают, пока Ане удается объявить хотя бы один выговор.

Определите, сколько групп шестиклассников будут выгнаны из класса.

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

В первой строке даны два целых числа n и m — исходное число шестиклассников и шнурков (). Шестиклассники пронумерованы числами от 1 до n, а шнурки — числами от 1 до m. В следующих m строках дано по два целых числа a и b — номера шестиклассников, связанных i-ым шнурком (1 ≤ a, b ≤ n, a ≠ b). Гарантируется, что никакие два шестиклассника не связаны более чем одним шнурком. Никакой шнурок не связывает шестиклассника с самим собой.

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

Выведите единственное число — количество групп шестиклассников, которые будут выгнаны из класса.

Примечание

В первом примере Ане с Машей не выгонят ни одной группы шестиклассников — в изначальной позиции все шестиклассники привязаны к двум другим шестиклассникам, и Ане не удастся сделать ни одного выговора.

Во втором примере четыре шестиклассника связаны в цепочку, а еще два бегают отдельно. Сначала Аня с Машей выгонят двух крайних шестиклассников из цепочки (1 и 4), а затем — двух оставшихся из цепочки (2 и 3). При этом бегающие отдельно от остальных шестиклассники останутся в классе.

В третьем примере Аня с Машей сразу же выгонят всех шестиклассников, кроме четвертого, и на этом процесс закончится. Правильный ответ — один.

C. Освещение префиксов

графы поиск в глубину и подобное снм *2400

В линию было расположено \(n\) ламп, пронумерованных целыми числами от \(1\) до \(n\). Каждая лампа изначально либо выключена (\(0\)) или включена (\(1\)).

Вам дано \(k\) подмножеств \(A_1, \ldots, A_k\) множества ламп \(\{1, 2, \dots, n\}\), таких что пересечение любых трех подмножеств пусто. Другими словами, для всех \(1 \le i_1 < i_2 < i_3 \le k\) выполнено \(A_{i_1} \cap A_{i_2} \cap A_{i_3} = \varnothing\).

За одну операцию вы можете выбрать одно из этих \(k\) подмножеств и изменить состояние всех ламп из этого подмножества (выключенные лампы становятся включенными, включенные становятся выключенными). Гарантируется, что для данных подмножеств можно совершить несколько операций так, чтобы все лампы стали включенными.

Обозначим за \(m_i\) минимальное количество операций, которое вы должны совершить, чтобы первые \(i\) ламп оказались включенными. Обратите внимание, что при этом состояние других ламп (с номерами между \(i+1\) и \(n\)) может быть любым.

Посчитайте \(m_i\) для всех \(1 \le i \le n\).

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

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

Во второй строке находится двоичная строка длины \(n\), обозначающая начальное состояние каждой лампы (лампа \(i\) выключена, если \(s_i = 0\), включена, если \(s_i = 1\)).

Описание каждого из \(k\) подмножеств следует, в следующем формате:

В первой строке описания находится единственное целое число \(c\) (\(1 \le c \le n\))  — количество элементов в подмножестве.

Во второй строке описания находится \(c\) различных целых чисел \(x_1, \ldots, x_c\) (\(1 \le x_i \le n\))  — элементы подмножества.

Гарантируется, что:

  • Пересечение любых трех подмножеств пусто;
  • С помощью нескольких операций можно сделать все лампы одновременно включенными.
Выходные данные

Вы должны вывести \(n\) строк. В \(i\)-й строке должно содержаться единственное целое число \(m_i\)  — минимальное количество операций, необходимое для того чтобы сделать все лампы с номерами от \(1\) до \(i\) включенными.

Примечание

В первом тесте:

  • Для \(i = 1\), мы можем сделать одну операцию с множеством \(A_1\), итоговые состояния будут \(1010110\);
  • Для \(i = 2\), мы можем сделать операции с множествами \(A_1\) и \(A_3\), итоговые состояния будут \(1100110\);
  • For \(i \ge 3\), we can apply operations on \(A_1\), \(A_2\) and \(A_3\), the final states will be \(1111111\).

Во втором тесте:

  • Для \(i \le 6\), мы можем просто сделать одну операцию с множеством \(A_2\), итоговые состояния будут \(11111101\);
  • Для \(i \ge 7\), мы можем сделать операции с множествами \(A_1, A_3, A_4, A_6\), итоговые состояния будут \(11111111\).

C. Атака Ксенона

Деревья дп жадные алгоритмы Комбинаторика поиск в глубину и подобное *2300

На другом этаже A.R.C. Markland-N, молодой человек Саймон "Ксенон" Джексон отдыхает, завершив свои работы по проекту быстрее запланированного (впрочем как всегда). Так как свободного времени достаточно много, он надевает свой легендарный хакерский "X" инстинкт и бежит сражаться против банд кибермира.

Его целью является сеть из \(n\) небольших банд. Их сеть состоит из ровно \(n - 1\) прямых соединений, каждое из которых связывает какие-то две банды вместе. Соединения устроены таким образом, что любые две банды соединены через последовательность прямых соединений.

Изучая данные, Ксенон понял, что банды используют для самозащиты следующую форму шифрования. Каждому соединению назначено целое число от \(0\) до \(n - 2\), таким образом, что все назначенные числа различны, а каждое число назначено какому-то соединению. Если атакующий пытается получить доступ к защищённым данным, то ему придётся прорваться через \(S\) слоёв с паролями, где \(S\) определяется как:

\(\)S = \sum_{1 \leq u < v \leq n} mex(u, v)\(\)

Здесь \(mex(u, v)\) обозначает наименьшее неотрицательное целое число, которое не встречается на соединениях на единственном простом пути между бандами \(u\) и \(v\).

Ксенон не знает каким образом числа были назначены соединениям, но это не проблема. Он собирается поручить своим AI перебрать и взломать все пароли, но перед этим он хочет знать чему равно наибольшее возможное значение \(S\), чтобы настроить AI наиболее эффективно.

Сейчас Ксенон ушёл писать скрипты для AI, и он собирается их закончить в течение двух часов. Не могли бы вы найти наибольшее значение \(S\) перед тем, как он вернётся?

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

Первая строка содержит целое число \(n\) (\(2 \leq n \leq 3000\)) — количество банд в сети.

Каждая из следующих \(n - 1\) строк содержит числа \(u_i\) и \(v_i\) (\(1 \leq u_i, v_i \leq n\); \(u_i \neq v_i\)), обозначающие прямое соединение между бандами \(u_i\) и \(v_i\).

Гарантируется, что связи расположены таким образом, что каждая пара банд соединена ровно одним простым путём.

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

Выведите наибольшее возможное значение \(S\) — количества слоёв с паролями в сети банд.

Примечание

В первом примере можно достичь максимального \(S\) следующим образом:

В этой сети, \(mex(1, 2) = 0\), \(mex(1, 3) = 2\) и \(mex(2, 3) = 1\). Таким образом, \(S = 0 + 2 + 1 = 3\).

Во втором примере можно достичь максимального \(S\) таким образом:

В этой сети все ненулевые значения mex перечислены ниже:

  • \(mex(1, 3) = 1\)
  • \(mex(1, 5) = 2\)
  • \(mex(2, 3) = 1\)
  • \(mex(2, 5) = 2\)
  • \(mex(3, 4) = 1\)
  • \(mex(4, 5) = 3\)

Таким образом, \(S = 1 + 2 + 1 + 2 + 1 + 3 = 10\).

F. Три пути в дереве

Деревья дп жадные алгоритмы поиск в глубину и подобное *2000

Вам задано невзвешенное дерево с \(n\) вершинами. Напомним, что дерево — это связный неориентированный граф без циклов.

Ваша задача — выбрать три различных вершины \(a, b, c\) в этом дереве таких, что количество ребер, принадлежащих как минимум одному из простых путей между \(a\) и \(b\), \(b\) и \(c\), или \(a\) и \(c\), максимально. Обратите внимание на примечания для лучшего понимания.

Простой путь — это путь, который посещает каждую вершину не более одного раза.

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

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

Следующая \(n - 1\) строка описывает ребра дерева в виде \(a_i, b_i\) (\(1 \le a_i\), \(b_i \le n\), \(a_i \ne b_i\)). Гарантируется, что заданный граф является деревом.

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

Первой строкой выведите одно целое число \(res\) — максимальное количество ребер, принадлежащих как минимум одному из простых путей между \(a\) и \(b\), \(b\) и \(c\), или \(a\) и \(c\).

Во второй строке выведите три целых числа \(a, b, c\) таких, что \(1 \le a, b, c \le n\) и \(a \ne, b \ne c, a \ne c\).

Если существует несколько подходящих ответов, вы можете вывести любой.

Примечание

Изображение, соответствующее первому примеру (и другой правильный ответ):

Если выбрать вершины \(1, 5, 6\), то путь между вершинами \(1\) и \(5\) состоит из ребер \((1, 2), (2, 3), (3, 4), (4, 5)\), путь между \(1\) и \(6\) состоит из ребер \((1, 2), (2, 3), (3, 4), (4, 6)\) и путь между \(5\) и \(6\) состоит из ребер \((4, 5), (4, 6)\). Объединение этих путей — \((1, 2), (2, 3), (3, 4), (4, 5), (4, 6)\), следовательно, ответ — \(5\). Можно показать, что лучшего ответа не существует.

F. Красоты Берляндии

Деревья жадные алгоритмы Конструктив поиск в глубину и подобное сортировки *2100

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

У вас есть карта этой сети, таким образом для каждого участка железной дороги известно, какие станции он соединяет.

У каждого из \(n-1\) участков есть целочисленный параметр красота пейзажа за окном, однако эти значения на карте не указаны и вам неизвестны. Все эти значения лежат в границах от \(1\) до \(10^6\), включительно.

Вы произвели опрос \(m\) пассажиров: \(j\)-й пассажир сообщил три значения:

  • станция отправления \(a_j\);
  • станция прибытия \(b_j\);
  • минимальную из красот пейзажа за окном на пути следования из \(a_j\) в \(b_j\) (поезд ехал кратчайшим путём из \(a_j\) в \(b_j\)).

Вы хотите улучшить карту и на каждом участке железной дороги указать величину \(f_i\)красота пейзажа за окном. Эти значения должны быть согласованы с опросом пассажиров.

Выведите любой возможный набор значений \(f_1, f_2, \dots, f_{n-1}\), которые согласуется с опросами или укажите, что такой не существует.

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

В первой строке входных данных записано целое число \(n\) (\(2 \le n \le 5000\)) — количество железнодорожных станций в Берляндии.

В следующих \(n-1\) строках записаны описания участков железных дорог: \(i\)-й участок задаётся двумя целыми числами \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n, x_i \ne y_i\)), где \(x_i\) и \(y_i\) — номера станций, которые соединены \(i\)-м участком железной дороги. Все участки железной дороги — двунаправлены. Из любой станции можно проехать в любую другую по железной дороге.

Следующая строка содержит число \(m\) (\(1 \le m \le 5000\)) — количество опрошенных пассажиров. Далее содержится \(m\) строк, \(j\)-я строка содержит три целых числа \(a_j\), \(b_j\) и \(g_j\) (\(1 \le a_j, b_j \le n\); \(a_j \ne b_j\); \(1 \le g_j \le 10^6\)) — станция отправления, прибытия и минимальная красота пейзажа за окном во время пути.

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

Если ответа не существует, то выведите единственное число -1.

В противном случае выведите \(n-1\) целое число \(f_1, f_2, \dots, f_{n-1}\) (\(1 \le f_i \le 10^6\)), где \(f_i\) — возможная красота пейзажа за окном для \(i\)-й дороги.

Если существует несколько возможных ответов, вы можете вывести любой из них.

E. Модернизация в Древляндии

*особая задача Деревья поиск в глубину и подобное

Древляндия состоит из \(n\) городов и \(n-1\) двусторонних дорог, соединяющих некоторые пары городов. Из любого города можно добраться до любого другого города. Вы правы — система городов и дорог в Древляндии образует неориентированное дерево.

Правительство объявило тендер на модернизацию инфраструктуры городов, при этом допустимо модернизировать произвольное подмножество \(S\) городов (возможно, все города), которое удовлетворяет следующим требованиям:

  • подмножество городов должно быть «связным», то есть из любого города подмножества \(S\) можно доехать до любого другого города подмножества \(S\) по дорогам, перемещаясь только по городам из \(S\);
  • количество «тупиковых» городов в \(S\) должно быть равно заданному числу \(k\). Город является тупиковым, если он является единственным городом в \(S\), либо связан ровно с одним другим городом из \(S\).
Здесь изображён один из возможных способов выбрать \(S\) (синие вершины) для заданной конфигурации и \(k=4\). Тупиковыми вершинами являются вершины с номерами \(1\), \(4\), \(6\) и \(7\).

Помогите Древляндии с модернизацией — найдите любое из возможных подмножеств \(S\) или определите, что такого подмножества не существует.

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

В первой строке записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте. Далее следуют сами наборы входных данных.

Каждый набор входных данных начинается строкой, которая содержит два целых числа \(n\) и \(k\) (\(2 \le n \le 3 \cdot 10^5\), \(1 \le k \le n\)) — количество городов в Древляндии и количество «тупиковых» городов в подмножестве \(S\).

Далее следует \(n-1\) строка с описаниями дорог. Каждая дорога задаётся двумя целыми числами \(x\) и \(y\) (\(1 \le x, y \le n\), \(x \ne y\)) — номерами городов, которые соединены дорогой. Гарантируется, что из каждого города можно добраться до любого другого, перемещаясь только вдоль дорог.

Сумма значений \(n\) по всем наборам входных данных в тесте не превосходит \(3 \cdot 10^5\).

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

Для каждого набора входных данных выведите Yes или No (в любом регистре), в зависимости от того, существует ответ или нет. Если ответ существует, то далее выведите \(m\) (\(1 \le m \le n\)) — количество городов в найденном подмножестве. Затем выведите \(m\) различных чисел от \(1\) до \(n\) — номера городов, которые составляют найденное подмножество. Номера городов можно выводить в любом порядке. Если решений несколько, то выведите любое из них.

D. Вокруг света

битмаски графы графы Деревья дп Комбинаторика математика поиск в глубину и подобное *3000

Ги-Мануэль и Тома планируют \(144\) кругосветных путешествия.

Вам дан простой взвешенный неориентированный связный граф из \(n\) вершин и \(m\) рёбер со следующим ограничением: не существует простого цикла (т. е. цикла, проходящего через каждую вершину не больше раза) длины больше \(3\), проходящего через вершину \(1\). Стоимостью пути (необязательно простого) в этом графе является XOR весов всех рёбер, входящих в этот путь, причём каждое ребро считается столько, сколько раз через него проходит путь.

Однако, путешествия стоимостью \(0\) их не устраивают.

Вы можете выбрать любое подмножество рёбер, инцидентных вершине \(1\), и удалить их. Сколько существует таких множеств, что при их удалении в полученном графе нет нетривиального цикла (необязательно простого) стоимостью \(0\), проходящего через вершину \(1\)? Цикл называется нетривиальным, если существует ребро, через которое он проходит нечётное количество раз. Так как ответ может быть большим, выведите его по модулю \(10^9+7\).

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

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \le n,m \le 10^5\)) — количество вершин и рёбер в графе. \(i\)-я из следующих \(m\) строк содержит три целых числа \(a_i\), \(b_i\) и \(w_i\) (\(1 \le a_i, b_i \le n, a_i \neq b_i, 0 \le w_i < 32\)) — концы \(i\)-го ребра и его вес. Гарантируется, что в графе нет мультирёбер, граф является связным, и не существует простого цикла длины больше \(3\), проходящего через вершину \(1\).

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

В единственной строке выведите ответ по модулю \(10^9+7\).

Примечание

На рисунках представлены графы из примеров. В первом примере в графе нет нетривиальных циклов со стоимостью \(0\), так что мы можем как удалить единственное ребро, инцидентное вершине \(1\), так и не удалять. Во втором примере если мы не удаляем ребро \(1-2\), то в графе будет цикл \(1-2-4-5-2-1\) со стоимостью \(0\); аналогично, если мы не удаляем ребро \(1-3\), то в графе будет цикл \(1-3-2-4-5-2-3-1\) со стоимостью \(0\). Единственный вариант — удалить оба ребра. В третьем примере подходят все подмножества, кроме тех двух, при которых остаются оба ребра \(1-3\) и \(1-4\).

F. Супер Джабер

графы кратчайшие пути поиск в глубину и подобное реализация *2600

Джабер супергерой в большой стране, которая может быть представлена как таблица с \(n\) строками и \(m\) столбцами, где в каждой клетке этой таблицы находится свой город.

Джабер дал каждому городу в стране свой цвет от \(1\) до \(k\). За одну секунду он может пройти из текущего города в любой соседний по стороне город или в любой город, с таким же цветом, как цвет текущего города.

Джабер должен выполнить \(q\) миссий. В каждой миссии он начинает в городе в строке \(r_1\) и столбце \(c_1\) и должен помочь кому-то в городе в строке \(r_2\) и столбце \(c_2\).

Джабер просит вашей помощи в расчете минимального возможного времени, необходимого, чтобы попасть из стартового города в конечный в каждой миссии.

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

В первой строке находится три целых числа \(n\), \(m\) и \(k\) (\(1 \leq n, m \leq 1000\), \(1 \leq k \leq min(40 , n \cdot m)\)) — количество строк, столбцов и цветов.

Каждая из следующих \(n\) строк содержит \(m\) целых чисел. В \(i\)-й строке, \(j\)-е число это \(a_{ij}\) (\(1 \leq a_{ij} \leq k\)), оно равно цвету, данному городу в строке \(i\) и столбце \(j\).

В следующей строке находится единственное целое число \(q\) (\(1 \leq q \leq 10^{5}\))  — количество миссий.

В каждой из следующих \(q\) строк находится четыре целых числа \(r_1\), \(c_1\), \(r_2\), \(c_2\) (\(1 \leq r_1 , r_2 \leq n\), \(1 \leq c_1 , c_2 \leq m\))  — координаты начального и конечного городов для очередной миссии.

Гарантируется, что для каждого цвета между \(1\) и \(k\) существует хотя бы один город с таким цветом.

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

Для каждой миссии выведите минимальное время, необходимое, чтобы попасть в клетку \((r_2, c_2)\), начав в клетке \((r_1, c_1)\).

Примечание

В первом тесте:

  • миссия \(1\): Джабер должен пойти из клетки \((1,1)\) в клетку \((3,3)\) потому что они одинакового цвета, затем из клетки \((3,3)\) в клетку \((3,4)\) потому что они соседние по стороне (всего два хода);
  • миссия \(2\): Джабер уже начинает в конечной клетке.

Во втором тесте:

  • миссия \(1\): \((1,1)\) \(\rightarrow\) \((1,2)\) \(\rightarrow\) \((2,2)\);
  • миссия \(2\): \((1,1)\) \(\rightarrow\) \((3,2)\) \(\rightarrow\) \((3,3)\) \(\rightarrow\) \((3,4)\);
  • миссия \(3\): \((1,1)\) \(\rightarrow\) \((3,2)\) \(\rightarrow\) \((3,3)\) \(\rightarrow\) \((2,4)\);
  • миссия \(4\): \((1,1)\) \(\rightarrow\) \((1,2)\) \(\rightarrow\) \((1,3)\) \(\rightarrow\) \((1,4)\) \(\rightarrow\) \((4,4)\).

C. Идеальная клавиатура

жадные алгоритмы поиск в глубину и подобное реализация *1600

Поликарп хочет собрать свою собственную клавиатуру. Клавиатуры с несколькими рядами слишком сложны для него, его клавиатура будет состоять только из одного ряда, где все \(26\) строчных латинских букв будут расположены в определенном порядке.

Поликарп использует один и тот же пароль \(s\) на всех сайтах, где он зарегистрирован (это плохо, но ему все равно). Он хочет собрать клавиатуру, которая позволит набирать этот пароль очень легко. Он не любит двигать пальцами при вводе пароля, поэтому для каждой пары соседних символов в \(s\) они должны быть соседними на клавиатуре. Например, если пароль abacaba, то клавиатура cabdefghi... идеальна, так как символы a и c соседние на клавиатуре, и a и b соседние на клавиатуре.

Гарантируется, что в \(s\) нет двух соседних одинаковых символов, поэтому, например, password не может быть паролем (два символа s являются соседними).

Можете ли вы помочь Поликарпу с выбором идеальной клавиатуры, если это возможно?

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

Первая строка содержит одно целое число \(T\) (\(1 \le T \le 1000\)) — количество наборов тестовых данных.

Затем следуют \(T\) наборов тестовых данных, каждый из которых содержит одну строку \(s\) (\(1 \le |s| \le 200\)). \(s\) состоит только из строчных латинских букв. В \(s\) нет двух соседних одинаковых символов.

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

Для каждого набора входных данных выведите результат в следующем виде:

  • если невозможно собрать идеальную клавиатуру, выведите NO (в верхнем регистре, это имеет значение в этой задаче);
  • в противном случае выведите YES (в верхнем регистре), а затем строку, состоящую из \(26\) строчных латинских букв — идеальную клавиатуру. Каждая латинская буква должна появиться в этой строке ровно один раз. Если ответов несколько, выведите любой из них.

E. 1-деревья и запросы

Деревья кратчайшие пути поиск в глубину и подобное Структуры данных *2000

Гильдонг забирался на гору, проходя через миллионы деревьев. Вдохновившись ими, он внезапно придумал интересную идею про деревья: А что если мы добавим еще одно ребро в дерево?

Затем, он узнал, что такие древовидные графы называются 1-деревья. Так как Гильдон устал от решения задач на деревья, он решил проверить, могут ли похожие техники для деревьев использованы также для решения задач на 1-деревья. Вместо того, чтобы решать задачти самому, он решил проверить вас, запросами на 1-деревьях.

Сначала, он даст вам дерево (не 1-дерево) на \(n\) вершинах, а затем задаст вам \(q\) запросов. Каждый запрос состоит из \(5\) целых чисел: \(x\), \(y\), \(a\), \(b\), и \(k\). Это означает, что вам надо проверить, есть ли путь из вершины \(a\) в вершину \(b\), которые содержит ровно \(k\) ребер, после добавления двустороннего ребра между вершинами \(x\) и \(y\). Путь может содержать одни и те же вершины и ребра несколько раз. Все запросы независимы друг от друга; т.е. добавленное ребро удаляется для следующего запроса.

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

Первая строка содержит одно целое число \(n\) (\(3 \le n \le 10^5\)), количество вершин в дереве.

Следующие \(n-1\) строки содержат по два целых числа \(u\) и \(v\) (\(1 \le u,v \le n\), \(u \ne v\)) каждая, которые означают, что есть ребро между вершинами \(u\) и \(v\). Все ребра неориентированные и различные.

В следующей строке записано одно целое число \(q\) (\(1 \le q \le 10^5\)), количество запросов, которое Гильдон хочет вам задать.

Следующие \(q\) строк содержат по пять целых чисел \(x\), \(y\), \(a\), \(b\), и \(k\) каждая (\(1 \le x,y,a,b \le n\), \(x \ne y\), \(1 \le k \le 10^9\)) — целые числа, описанные в условии. Гарантируется, что ребра между вершинами \(x\) и \(y\) не было в исходном дереве.

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

Для каждого запроса, выведите «YES» если есть путь, который содержит ровно \(k\) ребер, от \(a\) до \(b\), после добавления неориентированного ребра между вершинами \(x\) и \(y\). Иначе, выведите «NO».

Вы можете выводить все буквы в любом регистре (верхнем или нижнем).

Примечание

Следующая картинка описывает дерево (кружочки и отрезки) и добавленные ребра для каждого запроса (пунктирные линии).

Возможные пути для ответов «YES»:

  • \(1\)-й запрос: \(1\)\(3\)\(2\)
  • \(2\)-й запрос: \(1\)\(2\)\(3\)
  • \(4\)-й запрос: \(3\)\(4\)\(2\)\(3\)\(4\)\(2\)\(3\)\(4\)\(2\)\(3\)

D. Курони и празднование

Деревья интерактив Конструктив поиск в глубину и подобное *1900

Это интерактивная задача.

После АС после 13 вердиктов Превышено Время Исполнения по задаче с геометрии, Курони отправился в итальянский ресторан, чтобы отпраздновать это святое достижение. К сожалению, лишний соус дезориентировал его, и он теперь потерялся!

Соединенные Штаты Америки могут быть смоделированы как дерево (хотя стойте...) с \(n\) вершинами. Корень дерева находится в вершине \(r\), в которой находится гостиница Курони.

У Курони есть приложение для телефона, предназначенное для оказания ему помощи в таких экстренных случаях. Чтобы использовать приложение, ему нужно ввести две вершины \(u\) и \(v\), и оно вернет вершину \(w\), которая является наименьшим общим предком этих двух вершин.

Однако, поскольку батарея телефона была почти полностью разряжена во время праздничной вечеринки Курони, он может использовать приложение не более \(\lfloor \frac{n}{2} \rfloor\) раз. После этого телефон разрядится и не останется ничего, чтобы помочь нашему дорогому другу! :(

Поскольку ночь холодная и темная, Курони должен вернуться, чтобы он мог воссоединиться со своей удобной кроватью и подушками. Можете ли вы помочь ему выяснить местоположение своего отеля?

Протокол взаимодействия

Взаимодействие начинается с чтения одного целого числа \(n\) (\(2 \le n \le 1000\)), количества вершин дерева.

Затем прочтите \(n-1\) строку, \(i\)-я из которых содержит два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\), \(x_i \ne y_i\)), обозначающие, что есть ребро, соединяющее вершины \(x_i\) и \(y_i\). Гарантируется, что ребра сформируют дерево.

После этого, вы можете делать запросы типа "? u v" (\(1 \le u, v \le n\)), чтобы найти наименьшего общего предка вершин \(u\) и \(v\).

После запроса считайте результат \(w\) как целое число.

В случае, если ваш запрос не соответствует требованиям, или вы задали более \(\lfloor \frac{n}{2} \rfloor\) запросов, программа выведет \(-1\) и прекратит взаимодействие. Вы получите вердикт Неправильный ответ. Вам нужно завершить работу вашей программы, чтобы не получить другие вердикты.

Когда вы узнаете вершину \(r\), выведите "! \(r\)" и выйдите после этого. Этот запрос не учитывается в пределе \(\lfloor \frac{n}{2} \rfloor\).

Обратите внимание, что дерево фиксировано заранее и не будет изменяться во время запросов, то есть интерактор не адаптивен. После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Формат взломов

Для взломов используйте следующий формат:

Первая строка должна содержать два целых числа \(n\) и \(r\) (\(2 \le n \le 1000\), \(1 \le r \le n\)), обозначающих количество вершин и вершину с отелем Курони.

\(i\)-я из следующих \(n-1\) строк должна содержать два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\))  — обозначающих, что есть ребро, соединяющее вершины \(x_i\) и \(y_i\).

Представленные ребра должны сформировать дерево.

Примечание

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

Рисунок ниже изображает дерево с примера:

D. Корова и поля

Бинарный поиск графы жадные алгоритмы кратчайшие пути поиск в глубину и подобное сортировки Структуры данных *1900

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

Кор-федерация Коровников приказала Фермеру Джону построить одну дополнительную двустороннюю дорогу. У фермы есть \(k\) особых полей, и было решено построить дорогу между двумя различными особыми полями. Фермер Джон может построить дорогу даже между полями, которые уже соединены дорогой.

Уже после постройки дороги, Бесси вернется по кратчайшему пути от поля \(1\) к полю \(n\). Так как Бесси нужно больше тренироваться, Фермер Джон должен максимизировать длину данного кратчайшего пути. Помогите ему!

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

В первой строке заданы три целых числа \(n\), \(m\) и \(k\) (\(2 \le n \le 2 \cdot 10^5\), \(n-1 \le m \le 2 \cdot 10^5\), \(2 \le k \le n\))  — количество полей на ферме, количество дорог и количество особых полей.

Во второй строке заданы \(k\) целых чисел \(a_1, a_2, \ldots, a_k\) (\(1 \le a_i \le n\))  — номера особых полей. Все \(a_i\) различны.

В \(i\)-й из следующих \(m\) строк задано два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\), \(x_i \ne y_i\)), описывающих двустороннюю дорогу между полями \(x_i\) и \(y_i\).

Гарантируется, что из любого поля можно добраться до любого другого поля. Также гарантируется, что для любой пары полей существует не более одной дороги, непосредственно соединяющей их.

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

Выведите единственное число  — максимально возможную длину кратчайшего пути из \(1\) в \(n\) после того, как Фермер Джон построит одну дорогу оптимально.

Примечание

Граф из первого примера изображен ниже. Особые поля отмечены красным. Для Фермера Джона оптимально построить дорогу между полями \(3\) и \(5\), тогда кратчайший путь из \(1\) в \(5\) будет равен \(3\).

Граф из второго примера изображен ниже. Фермер Джон должен построить дорогу между полями \(2\) и \(4\), тогда кратчайший путь из \(1\) в \(5\) будет равен \(3\).

F. Корова и отпуск

Деревья поиск в глубину и подобное снм *3300

Бесси планирует отпуск! Кор-лифония состоит из \(n\) городов, соединенных \(n-1\) двусторонними дорогами. Гарантируется, что из любого города можно добраться до любого другого.

Бесси рассматривает \(v\) возможных планов проведения отпуска, \(i\)-й план описывается начальным городом \(a_i\) и конечным городом \(b_i\).

Известно, что только в \(r\) городах оборудованы специальные стоянки для отдыха. Бесси быстро устает, поэтому не может проехать более чем по \(k\) дорогам подряд, не отдохнув на стоянке. Фактически, отдых для Бесси настолько важен, что она готова ради этого посещать города по несколько раз.

Для каждого плана отпуска, существует ли маршрут для Бесси, который позволит ей добраться из начального города в конечный?

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

В первой строке задано три целых числа \(n\), \(k\) и \(r\) (\(2 \le n \le 2 \cdot 10^5\), \(1 \le k,r \le n\))  — количество городов, максимальное количество дорог, которое Бесси может преодолеть подряд без отдыха и количество стоянок для отдыха.

В каждой из следующих \(n-1\) строк задано два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\), \(x_i \neq y_i\)), означающих, что город \(x_i\) и город \(y_i\) соединены дорогой.

В следующей строке задано \(r\) целых чисел  — города со стоянками для отдыха. Все города различны.

В следующей строке задано целое число \(v\) (\(1 \le v \le 2 \cdot 10^5\))  — количество планов проведения отпуска.

В каждой из следующих \(v\) строк задано два целых числа \(a_i\) и \(b_i\) (\(1 \le a_i, b_i \le n\), \(a_i \ne b_i\))  — начальный и конечный город плана отпуска.

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

Если Бесси может достичь конечного города, не проезжая более \(k\) дорог без отдыха подряд, для \(i\)-го плана, выведите YES. Иначе, выведите NO.

Примечание

Граф из первого примера изображен ниже. Города со стоянками для отдыха отмечены красным.

В первом плане, Бесси может посетить следующие города в таком порядке: \(1, 2, 3\).

Во втором плане, Бесси может посетить следующие города в таком порядке: \(3, 2, 4, 5\).

В третьем плане, Бесси не сможет достигнуть конечного города. Например, если она попытается проехать следующим образом: \(3, 2, 4, 5, 6\), ей придется проехать более \(2\) дорог без отдыха.

Граф из второго примера изображен ниже.

D. Метро

графы поиск в глубину и подобное *1600

Классическая для городов Берляндии схема метрополитена представляет собой набор n станций, соединенных n переездами, каждый из которых соединяет ровно две станции и не проходит через какие-либо другие. Кроме того, в классической схеме с каждой станции можно добраться до любой другой, двигаясь по переездам. Переезды можно использовать в обе стороны для перемещения. Между каждой парой станций — не более одного переезда.

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

Это открытие имело мощный социальный эффект — ведь теперь станции можно было сравнивать по принципу их удаления от кольцевой. Например, один житель мог сказать: «я живу в трех переездах от кольцевой», а другой ему ответить: «неудачник, а — я в одном». В интернете стали появляться приложения, предлагающие рассчитать удаленность станции от кольцевой (пошлите смс на короткий номер...).

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

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

В первой строке содержится целое число n (3 ≤ n ≤ 3000), n — количество станций (и одновременно переездов) в схеме метро. Далее в n строках содержатся описания переездов, по одному в строке. Каждая строка содержит пару целых чисел xi, yi (1 ≤ xi, yi ≤ n), и обозначает наличие переезда со станции xi до станции yi. Станции пронумерованы от 1 до n в произвольном порядке. Гарантируется, что xi ≠ yi и то, что между каждой парой станций не более одного переезда. Переезды можно использовать для перемещения в обе стороны. Гарантируется, что заданное описание представляет собой классическую схему метрополитена.

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

Выведите n чисел. Числа разделяйте пробелами, i-ое из них должно быть равно удалению i-ой станции от кольцевой. Для станций на кольцевой выводите число 0.

B. WeirdSort

поиск в глубину и подобное сортировки *1200

Вам задан массив \(a\) длины \(n\).

Кроме того, вам задано множество различных позиций \(p_1, p_2, \dots, p_m\), где \(1 \le p_i < n\). Позиция \(p_i\) означает, что вы можете поменять местами элементы \(a[p_i]\) и \(a[p_i + 1]\). Вы можете применить эту операцию любое количество раз для каждой из заданных позиций.

Ваша задача — определить, возможно ли отсортировать заданный массив в неубывающем порядке (\(a_1 \le a_2 \le \dots \le a_n\)), используя только разрешенные обмены местами.

Например, если \(a = [3, 2, 1]\) и \(p = [1, 2]\), то сначала мы можем поменять местами элементы \(a[2]\) и \(a[3]\) (т.к. позиция \(2\) содержится в заданном множестве \(p\)). Получим массив \(a = [3, 1, 2]\). Затем поменяем местами \(a[1]\) и \(a[2]\) (позиция \(1\) также содержится в \(p\)). Получим массив \(a = [1, 3, 2]\). Наконец, снова поменяем местами \(a[2]\) и \(a[3]\) и получим массив \(a = [1, 2, 3]\), отсортированный в порядке неубывания.

Вы можете заметить, что если \(a = [4, 1, 2, 3]\) и \(p = [3, 2]\), то отсортировать массив невозможно.

Вам требуется ответить на \(t\) независимых наборов тестовых данных.

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

Первая строка теста содержит одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

Затем следуют \(t\) наборов входных данных. Первая строка каждого набора содержит два целых числа \(n\) и \(m\) (\(1 \le m < n \le 100\)) — количество элементов в \(a\) и количество элементов в \(p\). Вторая строка каждого набора содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 100\)). Третья строка каждого набора содержит \(m\) целых чисел \(p_1, p_2, \dots, p_m\) (\(1 \le p_i < n\), все \(p_i\) различны) — множество позиций, описанное в условии задачи.

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

Для каждого набора тестовых данных выведите ответ на него — «YES» (без кавычек), если возможно отсортировать заданный массив в неубывающем порядке (\(a_1 \le a_2 \le \dots \le a_n\)), используя только разрешенные обмены местами. Иначе выведите «NO».

G. Автодополнение

дп поиск в глубину и подобное Структуры данных *2600

У вас есть множество строк \(S\). Каждая строка состоит из строчных букв латинского алфавита.

Для каждой строки вы хотите посчитать, сколько секунд потребуется, чтобы набрать ее в вашем текстовом редакторе. Чтобы набрать строку, вам нужно начать с пустой строки и преобразовать ее в ту строку, которую вы хотите набрать, при помощи следующих операций:

  • для текущей строки \(t\) можно выбрать любую строчную латинскую букву \(c\) и приписать ее \(t\), после чего текущая строка станет \(t + c\). Это действие требует \(1\) секунду;
  • использовать автодополнение. При использовании автодополнения с текущей строкой \(t\) вам показывается список всех таких строк \(s \in S\), что \(t\) — префикс \(s\). Этот список включает саму строку \(t\), если \(t\) принадлежит \(S\), и строки в нем расположены в лексикографическом порядке. Вы можете превратить \(t\) в \(i\)-ю строку из этого списка за \(i\) секунд. Обратите внимание, что вы можете выбирать любую строку из списка, это не обязательно должна быть та строка, которую вы хотите набрать.

Чему равно минимальное количество секунд, которое нужно затратить, чтобы набрать каждую строку из \(S\)?

Обратите внимание, что строки множества \(S\) задаются во входных данных необычным образом.

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

В первой строке задано одно целое число \(n\) (\(1 \le n \le 10^6\)).

Затем следуют \(n\) строк, в \(i\)-й из которых заданы целое число \(p_i\) (\(0 \le p_i < i\)) и одна строчная латинская буква \(c_i\). Эти строки задают множество строк, подмножеством которого является \(S\), следующим образом: всего есть \(n + 1\) строка, пронумерованная от \(0\) до \(n\); \(0\)-я строка — пустая, а \(i\)-я строка (\(i \ge 1\)) — результат приписывания символа \(c_i\) к строке \(p_i\) справа. Гарантируется, что все эти строки различны.

В следующей строке задано одно целое число \(k\) (\(1 \le k \le n\)) — количество строк в \(S\).

В последней строке заданы \(k\) целых чисел \(a_1\), \(a_2\), ..., \(a_k\) (\(1 \le a_i \le n\), все \(a_i\) попарно различны), обозначающих индексы строк, сгенерированных вышеуказанным способом, принадлежащих множеству \(S\) — формально, если обозначить \(i\)-ю сгенерированную строку как \(s_i\), то \(S = {s_{a_1}, s_{a_2}, \dots, s_{a_k}}\).

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

Выведите \(k\) целых чисел, \(i\)-е из которых должно быть равно минимальному количеству секунд, требуемому, чтобы набрать строку \(s_{a_i}\).

Примечание

В первом примере \(S\) состоит из следующих строк: ieh, iqgp, i, iqge, ier.

D. Матрица Нэша

графы Конструктив поиск в глубину и подобное реализация *2000

Нэш придумал интересную, но простую игру, где игрок просто должен выполнять инструкции, написанные на клетке, где игрок сейчас стоит.

В эту игру играют на доске \(n\times n\). Строки и столбцы этой доски пронумерованны от \(1\) до \(n\). Клетку на пересечении \(r\)-й строки и \(c\)-го столбца будем обозначать, как \((r, c)\).

Некоторые клетки этой доски называются заблокированными зонами. На каждой клетке доски написан один из следующих \(5\) символов  — \(U\), \(D\), \(L\), \(R\) или \(X\)  — инструкции для игрока. Пусть текущая клетка  — \((r, c)\). Если символ в клетке \(R\), игрок должен переместиться в клетку справа, \((r, c+1)\), для \(L\) игрок должен переместиться в клетку слева, \((r, c-1)\), для \(U\) игрок должен переместиться в клетку выше, \((r-1, c)\), для \(D\) игрок должен переместиться в клетку ниже, \((r+1, c)\). Если же символ в клетке равен \(X\), то эта клетка является заблокированной зоной. Игрок должен оставаться в этой клетке (и с этого момента игра для него не слишком интересна).

Гарантируется, что символы записаны таким образом, что игрок никогда не будет вынужден сойти с доски, в какой бы клетке он не начал.

Когда игрок начинает в какой-то клетке, он должен двигаться в соответствии с символом в текущей клетке. Игрок двигается до тех пор, пока он не попадет в заблокированную зону. Может оказаться так, что игрок будет двигаться бесконечно долго.

Для каждой из \(n^2\) клеток таблицы Алиса, ваш друг, хотела бы узнать, как пройдет игра, если игрок начнет в этой клетке. Для каждой стартовой клетки доски, она запишет клетку, в которой игрок остановится, или то, что игрок никогда не остановится. Она предоставила вам эту информацию: для каждой клетки \((r, c)\) она написала:

  • пару (\(x\),\(y\)), значащую, что если игрок начинает в клетке \((r, c)\), то он остановится в клетке (\(x\),\(y\)).
  • или пару (\(-1\),\(-1\)), значащую, что если игрок начинает в клетке \((r, c)\), он будет двигаться бесконечно долго, и никогда не попадет в заблокированную зону.

Возможно, Алиса хочет вас обмануть, и не существует доски, которая удовлетворяет всей информации, которую она вам предоставила. Для данной информации, восстановите подходящую доску, или определите, что ее не существует. Если существует несколько подходящих досок, вы можете найти любую из них. 

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

Первая строка содержит одно целое число \(n\) (\(1 \leq n \leq 10^{3}\))  — сторону доски.

\(i\)-я из последующих \(n\) строк содержит \(2n\) чисел \(x_1, y_1, x_2, y_2, \dots, x_n, y_n\), где \((x_j, y_j)\) (\(1 \leq x_j \leq n, 1 \leq y_j \leq n\), или \((x_j,y_j)=(-1,-1)\))  — пара, записанная Алисой для клетки \((i, j)\).

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

Если не существует доски, удовлетворяющей информации, которую вам дала Алиса, выведите INVALID.

Иначе, выведите VALID. В \(i\)-й из следующих \(n\) строк, выведите строку из \(n\) символов, соответствующих \(i\)-й строке найденной вами подходящей доски. Каждый символ должен быть равен \(U\), \(D\), \(L\), \(R\) или \(X\). Если существует несколько подходящих досок, вы можете найти любую из них. 

Примечание

В первом примере:

Доска с вывода подходит.

  • Если игрок начинает в \((1,1)\), он не будет двигаться, следуя \(X\), и останется там.
  • Если игрок начинает в \((1,2)\), он пойдет влево, следуя \(L\), и остановится в \((1,1)\).
  • Если игрок начинает в \((2,1)\), он пойдет вправо, следуя \(R\), и остановится в \((2,2)\).
  • Если игрок начинает в \((2,2)\), он не будет двигаться, следуя \(X\), и останется там.

Ходы игрока для разных клеток изображены на картинке ниже:

Во втором примере:

Доска с вывода подходит, так как игрок, начавший с клетки, отличной от центральной клетки \((2,2)\), будет двигаться по циклу и никогда не остановится. Если бы он начал в \((2,2)\), он бы там и остался, следуя инструкции \(X\) .

Ходы игрока для разных клеток изображены на картинке ниже:

C. Прыгающая лягушка

Бинарный поиск жадные алгоритмы поиск в глубину и подобное реализация Структуры данных *1100

Слева от строки \(s = s_1 s_2 \ldots s_n\), состоящей из \(n\) символов, находится лягушка (точнее, изначально лягушка находится в клетке \(0\)). Каждый символ строки \(s\) — это или 'L', или 'R'. Это значит, что если лягушка находится в \(i\)-й клетке и \(i\)-й символ — это 'L', то она может прыгать только влево. Если лягушка стоит в \(i\)-й клетке и \(i\)-й символ — это 'R', то она может прыгать только вправо. Из клетки \(0\) лягушка может прыгать только вправо.

Заметим, что лягушка может прыгать в одну и ту же клетку дважды и может совершить столько прыжков, сколько ей потребуется.

Лягушка хочет достичь \(n+1\)-й клетки. Лягушка выбирает некоторое целое положительное значение \(d\) перед самым первым прыжком (и потом не может изменить его) и прыгает не более, чем на \(d\) клеток за раз. То есть, если \(i\)-й символ — 'L', то лягушка может прыгнуть в любую клетку из отрезка \([max(0, i - d); i - 1]\), а если \(i\)-й символ — 'R', то лягушка может прыгнуть в любую клетку из отрезка \([i + 1; min(n + 1; i + d)]\).

Лягушка не хочет прыгать слишком далеко, поэтому ваша задача — найти минимальное возможное значение \(d\), при котором лягушка сможет достичь клетки \(n+1\) из клетки \(0\), если будет прыгать не более, чем на \(d\) клеток за раз. Гарантируется, что всегда возможно достичь \(n+1\) из \(0\).

Вам нужно ответить на \(t\) независимых наборов входных данных.

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

Первая строка теста содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Следующие \(t\) строк описывают наборы входных данных. \(i\)-й описан строкой \(s\) состоящей из не менее, чем \(1\), и не более, чем \(2 \cdot 10^5\) символов 'L' и 'R'.

Гарантируется, что сумма длин строк по всем наборам входных данных не превосходит \(2 \cdot 10^5\) (\(\sum |s| \le 2 \cdot 10^5\)).

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

Для каждого набора входных данных выведите ответ — минимальное возможное значение \(d\), при котором лягушка может достичь клетки \(n+1\) из клетки \(0\), если будет совершать прыжки длиной не более, чем \(d\).

Примечание

Картинка, описывающая первый набор тестовых данных из примера и один из возможных ответов:

Во втором наборе тестовых данных из примера лягушка может прыгнуть только напрямую из \(0\) в \(n+1\).

В третьем наборе тестовых данных лягушка может выбрать \(d=3\), прыгнуть в клетку \(3\) из клетки \(0\) и затем прыгнуть в клетку \(4\) из клетки \(3\).

В четвертом наборе тестовых данных из примера лягушка может выбрать \(d=1\) и прыгнуть \(5\) раз вправо.

В пятом наборе тестовых данных из примера лягушка может прыгнуть только напрямую из \(0\) в \(n+1\).

В шестом наборе тестовых данных из примера лягушка может выбрать \(d=1\) и прыгнуть \(2\) раза вправо.

F. Максимально белое поддерево

графы Деревья дп поиск в глубину и подобное *1800

Вам задано дерево, состоящее из \(n\) вершин. Деревом называется связный неориентированный граф с \(n-1\) ребром. Каждая вершина \(v\) этого дерева имеет свой цвет (\(a_v = 1\), если вершина \(v\) белая, и \(0\), если вершина \(v\) черная).

Вам нужно решить следующую задачу для каждой вершины \(v\): какую максимальную разницу между количеством белых вершин и количеством черных вершин вы можете получить, если выберете некоторое поддерево заданного дерева, которое содержит вершину \(v\)? Поддеревом дерева называется связный подграф заданного дерева. Более формально, если вы выберете поддерево, которое содержит \(cnt_w\) белых вершин и \(cnt_b\) черных вершин, вам нужно максимизировать \(cnt_w - cnt_b\).

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

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

Вторая строка теста содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 1\)), где \(a_i\) — это цвет \(i\)-й вершины.

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

Гарантируется, что заданные ребра образуют дерево.

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

Выведите \(n\) целых чисел \(res_1, res_2, \dots, res_n\), где \(res_i\) — максимальная возможная разница между количеством белых и количеством черных вершин в некотором поддереве, которое содержит вершину \(i\).

Примечание

Первый тестовый пример представлен ниже:

Черные вершины выделены жирным.

Во втором тестовом примере лучшими поддеревьями для вершин \(2, 3\) и \(4\) являются вершины \(2, 3\) и \(4\) соответственно. И лучшим поддеревом для вершины \(1\) является поддерево, состоящее из вершин \(1\) и \(3\).

C. Ехаб и неПутевые MEXы

Деревья жадные алгоритмы Конструктив поиск в глубину и подобное *1500

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

  • Каждое написанное число является целым числом от \(0\) до \(n-2\) включительно.
  • Все написанные числа различны.
  • Наибольшее значение среди \(MEX(u,v)\) среди всех пар вершин \((u,v)\) минимально возможно.

Здесь \(MEX(u,v)\) обозначает наименьшее неотрицательное целое число, которое не записано ни на одном ребре уникального простого пути между вершинами \(u\) и \(v\).

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

В первой строке записано целое число \(n\) (\(2 \le n \le 10^5\))   — количество узлов в дереве.

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

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

Выведите \(n-1\) целых чисел. \(i\)-е из них должно быть равно числу, записанным на \(i\)-м ребре (в порядке ввода).

Примечание

Дерево с второго примера:

E. НАСТОЯЩАЯ Теория чисел от Ехаба

графы кратчайшие пути Перебор поиск в глубину и подобное теория чисел *2600

Вам дан массив \(a\) длины \(n\), который имеет специальное условие: каждый элемент в этом массиве имеет не более 7 делителей. Найдите длину кратчайшей непустой подпоследовательности этого массива, произведение элементов которой является полным квадратом.

Последовательность \(a\) является подпоследовательностью массива \(b\), если \(a\) можно получить из \(b\), удалив несколько (возможно, ноль или все) элементов.

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

Первая строка содержит единственное целое число \(n\) (\(1 \le n \le 10^5\)) — длину массива \(a\).

Вторая строка содержит \(n\) целых чисел \(a_1\), \(a_2\), \(\ldots\), \(a_{n}\) (\(1 \le a_i \le 10^6\)) — элементы массива \(a\).

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

Выведите длину кратчайшей непустой подпоследовательности \(a\), произведение элементов которой является полным квадратом. Если существует несколько таких кратчайших подпоследовательностей, вы можете найти любую из них. Если такой подпоследовательности нет, выведите «-1».

Примечание

В первом примере, вы можете выбрать подпоследовательность \([1]\).

Во втором примере, вы можете выбрать подпоследовательность \([6, 6]\).

В третьем примере, вы можете выбрать подпоследовательность \([6, 15, 10]\).

В четвертом примере, такой подпоследовательности не существует.

F. Последняя теорема Ехаба

графы жадные алгоритмы Конструктив поиск в глубину и подобное *2500

Идет 5555-й год. У вас есть граф, и вы хотите найти длинный цикл и огромный независимый набор просто потому, что можете. Но пока что вы хотите найти хоть одно из двух.

Для связного графа с \(n\) вершинами вы можете или:

  • найти независимое множество с ровно \(\lceil\sqrt{n}\rceil\) вершинами.
  • найти простой цикл длиной не менее \(\lceil\sqrt{n}\rceil\).

Независимое множество  — это множество вершин такое, что никакие две вершины из него не связаны ребром. Простой цикл  — это цикл, который не содержит ни одной вершины дважды. Гарантировано, что вы всегда можете решить хотя бы одну из этих задач.

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

Первая строка содержит два целых числа \(n\) и \(m\) (\(5 \le n \le 10^5\), \(n-1 \le m \le 2 \cdot 10^5\))  — количество вершин и ребер в графе.

Каждая из следующих \(m\) строк содержит два разделенных пробелом целых числа \(u\) и \(v\) (\(1 \le u,v \le n\)), которые означают, что между вершинами \(u\) и \(v\) есть ребро. Гарантируется, что граф связен и не содержит никаких петель или двойных ребер.

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

Если вы решили решить первую задачу, то в первой строке выведите 1, а затем строку, содержащую \(\lceil\sqrt{n}\rceil\) различных целых чисел, не превышающих \(n\), вершины в желаемом независимом наборе.

Если вы решили решить вторую задачу, то в первой строке выведите 2, затем строку, содержащую одно целое число \(c\), представляющее длину найденного цикла, за которой следует строка, содержащая \(c\) различных целых чисел, не превышающих \(n\)  — вершины в нужном цикле, в порядке, в котором они идут в цикле.

Примечание

В первом примере:

Обратите внимание, что вы можете решить обе задачи, поэтому вывод цикла \(2-4-3-1-5-6\) также является решением.

Во втором примере:

Обратите внимание, что если есть несколько ответов, вы можете вывести любой, поэтому, например, вывод цикла \(2-5-6\) разрешен.

В третьем примере:

D. Бесконечный путь

графы математика Перебор поиск в глубину и подобное теория чисел *2200

Вам задана цветная перестановка \(p_1, p_2, \dots, p_n\), то есть \(i\)-й элемент перестановки имеет цвет \(c_i\).

Назовем бесконечным путем последовательность \(i, p[i], p[p[i]], p[p[p[i]]] \dots\), в которой все элементы одного цвета (\(c[i] = c[p[i]] = c[p[p[i]]] = \dots\)).

Мы также можем определить умножение перестановок \(a\) и \(b\), как перестановку \(c = a \times b\), в которой \(c[i] = b[a[i]]\). Более того, можно определить степень \(k\) перестановки \(p\), как \(p^k=\underbrace{p \times p \times \dots \times p}_{k \text{ times}}\).

Найдите такое минимальное \(k > 0\), что \(p^k\) содержит хотя бы один бесконечный путь (т.е. существует позиция \(i\) в \(p^k\), такая, что последовательность, начинающаяся с \(i\) является бесконечным путем).

Можно доказать, что ответ всегда существует.

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

В первой строке задано единственное число \(T\) (\(1 \le T \le 10^4\)) — количество наборов входных данных.

Следующие \(3T\) строк содержат сами наборы — по одному на три строки. В первой строке задано единственное целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — размер перестановки.

Во второй строке задано \(n\) целых чисел \(p_1, p_2, \dots, p_n\) (\(1 \le p_i \le n\), \(p_i \neq p_j\) при \(i \neq j\)) — перестановка \(p\).

В третьей строке задано \(n\) целых чисел \(c_1, c_2, \dots, c_n\) (\(1 \le c_i \le n\)) — цвета соответствующих элементов перестановки.

Гарантируется, что сумма \(n\) не превосходит \(2 \cdot 10^5\).

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

Выведите \(T\) целых чисел — по одному на набор входных данных. Для каждого набора выведите минимальное \(k > 0\) такое, что \(p^k\) содержит хотя бы один бесконечный путь.

Примечание

В первом наборе, \(p^1 = p = [1, 3, 4, 2]\) и последовательность, стартующая с \(1\): \(1, p[1] = 1, \dots\) — бесконечный путь.

Во втором наборе, \(p^5 = [1, 2, 3, 4, 5]\) и, очевидно, она содержит несколько бесконечных путей.

В третьем наборе, \(p^2 = [3, 6, 1, 8, 7, 2, 5, 4]\) и последовательность, стартующая с \(4\): \(4, p^2[4]=8, p^2[8]=4, \dots\) — бесконечный путь, так как \(c_4 = c_8 = 4\).

E. Запросы на дереве

графы Деревья поиск в глубину и подобное *1900

Вам дано корневое дерево, состоящее из \(n\) вершин, пронумерованных от \(1\) до \(n\). Корень дерева находится в вершине с номером \(1\).

Дерево — это связный неориентированный граф с \(n-1\) ребром.

Вам заданы \(m\) запросов. \(i\)-й запрос состоит из множества \(k_i\) различных вершин \(v_i[1], v_i[2], \dots, v_i[k_i]\). Ваша задача — определить, существует ли путь от корня до некоторой вершины \(u\) такой, что каждая из заданных \(k\) вершин или принадлежит этому пути, или расположена на расстоянии \(1\) от некоторой вершины на этом пути.

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

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

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

Гарантируется, что заданные ребра формируют дерево.

Следующие \(m\) строк описывают запросы. \(i\)-я строка описывает \(i\)-й запрос и начинается с целого числа \(k_i\) (\(1 \le k_i \le n\)) — количества вершин в текущем запросе. Затем следуют \(k_i\) целых чисел: \(v_i[1], v_i[2], \dots, v_i[k_i]\) (\(1 \le v_i[j] \le n\)), где \(v_i[j]\) — это \(j\)-я вершина в \(i\)-м запросе.

Гарантируется, что все вершины в одном запросе различны.

Также гарантируется, что сумма всех \(k_i\) не превосходит \(2 \cdot 10^5\) (\(\sum\limits_{i=1}^{m} k_i \le 2 \cdot 10^5\)).

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

Для каждого запроса выведите ответ — «YES», если существует путь от корня до некоторой вершины \(u\) такой, что каждая из \(k\) заданных вершин или принадлежит этому пути, или расположена на расстоянии \(1\) от какой-либо вершины на этом пути, и «NO» в противном случае.

Примечание

Изображение, относящееся к примеру:

Рассмотрим запросы.

Первый запрос — \([3, 8, 9, 10]\). Ответ — «YES», так как вы можете выбрать путь от корня \(1\) до вершины \(u=10\). Тогда вершины \([3, 9, 10]\) принадлежат пути от \(1\) до \(10\) и вершина \(8\) расположена на расстоянии \(1\) от вершины \(7\), которая также принадлежит этому пути.

Второй запрос — \([2, 4, 6]\). Ответ — «YES», так как вы можете выбрать путь до вершины \(u=2\). Тогда вершина \(4\) находится на расстоянии \(1\) от вершины \(1\), которая принадлежит этому пути, а вершина \(6\) находится на расстоянии \(1\) от вершины \(2\), которая принадлежит этому пути.

Третий запрос — \([2, 1, 5]\). Ответ — «YES», так как вы можете выбрать путь до вершины \(u=5\) и все вершины из запроса будут принадлежать этому пути.

Четвертый запрос — \([4, 8, 2]\). Ответ — «YES», так как вы можете выбрать путь до вершины \(u=9\), и вершины \(2\) и \(4\) расположены на расстоянии \(1\) от вершины \(1\), которая принадлежит этому пути, а вершина \(8\) расположена на расстоянии \(1\) от вершины \(7\), которая принадлежит этому пути.

Ответ и на пятый, и на шестой запросы — «NO», потому что вы не можете выбрать подходящую вершину \(u\).

E. Смайлик Жордана

*особая задача геометрия поиск в глубину и подобное реализация

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

Входные данные содержат два целых числа \(row\), \(col\) (\(0 \le row, col \le 63\)), разделенных пробелом.

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

Выведите «IN» или «OUT».

C. K-полное слово

жадные алгоритмы поиск в глубину и подобное реализация снм Строки *1500

Слово \(s\) длины \(n\) называется \(k\)-полным, если

  • \(s\) — палиндром, то есть \(s_i=s_{n+1-i}\) для всех \(1 \le i \le n\);
  • \(s\) имеет период \(k\), то есть \(s_i=s_{k+i}\) для всех \(1 \le i \le n-k\).

Например, «abaaba» — это \(3\)-полное слово, а «abccba» нет.

Бобу вручили слово \(s\) длины \(n\), состоящее только из строчных букв латинского алфавита, и целое число \(k\) такое, что \(n\) делится на \(k\). Он хочет превратить слово \(s\) в любое \(k\)-полное слово.

Для этого Боб может выбирать некоторую позицию \(i\) (\(1 \le i \le n\)) и заменять букву на позиции \(i\) на любую другую строчную букву латинского алфавита.

Поэтому теперь Боба интересует минимальное количество позиций, буквы на которых ему необходимо заменить, чтобы превратить \(s\) в любое \(k\)-полное слово.

Обратите внимание, что Боб может сделать ноль изменений, если слово \(s\) уже \(k\)-полное.

Требуется ответить на \(t\) независимых наборов входных данных.

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

В первой строке записано одно целое число \(t\) (\(1 \le t\le 10^5\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записаны два целых числа \(n\) и \(k\) (\(1 \le k < n \le 2 \cdot 10^5\), \(n\) делится на \(k\)).

Во второй строке записано слово \(s\) длины \(n\).

Гарантируется, что слово \(s\) состоит только из строчных букв латинского алфавита. Также гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

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

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

Примечание

В первом наборе входных данных одно из оптимальных решений — это «aaaaaa».

Во втором наборе входных данных слово уже \(k\)-полное.

F. Независимое множество

Деревья дп поиск в глубину и подобное *2500

Эрик — учитель по теории графов. Сегодня он рассказывает независимое множество и реберно-порожденный подграф.

Для данного графа \(G=(V,E)\) независимым множеством называется такое подмножество вершин \(V' \subset V\), что для каждой пары \(u,v \in V'\), \((u,v) \not \in E\) (то есть в \(E\) нет ребра, соединяющего две вершины из \(V'\)).

Реберно-порожденный подграф состоит из подмножества ребер \(E' \subset E\) и всех вершин оригинального графа, которые инцидентны хотя бы одному ребру подграфа.

Для \(E' \subset E\) обозначим за \(G[E']\) реберно-порожденный подграф такой, что \(E'\) — это множество ребер этого подграфа. Иллюстрации этих определений:

В качестве упражнения на закрепление материала он дал студентам следующую задачу:

Дано дерево \(G=(V,E)\), посчитайте сумму \(w(H)\) по всем реберно-порожденным подграфам \(H\) графа \(G\), кроме пустого, где \(w(H)\) — это количество независимых множеств в \(H\). Формально, посчитайте \(\sum \limits_{\emptyset \not= E' \subset E} w(G[E'])\).

Докажите Эрику, что вы умнее его учеников, предъявив правильный ответ как можно скорее. Обратите внимание, что ответ может быть довольно большой, поэтому выведите его по модулю \(998,244,353\).

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

В первой строке записано одно целое число \(n\) (\(2 \le n \le 3 \cdot 10^5\)), обозначающее количество вершин в графе \(G\).

В каждой из следующих \(n-1\) строк записаны два целых числа \(u\) and \(v\) (\(1 \le u,v \le n\), \(u \not= v\)), задающие ребра данного дерева.

Гарантируется, что данные ребра образуют дерево.

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

Выведите одно целое число, обозначающее ответ по модулю \(998,244,353\).

Примечание

Во втором примере все независимые множества изображены на рисунке.

F. Роботы на поле

графы жадные алгоритмы матрицы поиск в глубину и подобное снм Структуры данных *2200

Задано прямоугольное поле размера \(n \times m\). Каждая клетка поля покрашена либо в черный цвет ('0'), либо в белый цвет ('1'). Цвет клетки \((i, j)\) обозначается как \(c_{i, j}\). Вам также задана карта направлений: для каждой клетки указано направление \(s_{i, j}\), которое равно одному из четырех символов 'U', 'R', 'D' и 'L'.

  • Если \(s_{i, j}\) равно 'U', то из клетки \((i, j)\) есть переход в клетку \((i - 1, j)\);
  • если \(s_{i, j}\) равно 'R', то из клетки \((i, j)\) есть переход в клетку \((i, j + 1)\);
  • если \(s_{i, j}\) равно 'D', то из клетки \((i, j)\) есть переход в клетку \((i + 1, j)\);
  • если \(s_{i, j}\) равно 'L', то из клетки \((i, j)\) есть переход в клетку \((i, j - 1)\).

Гарантируется, что самая верхняя строка не содержит символов 'U', самая нижняя строка не содержит символов 'D', самый левый столбец не содержит символов 'L' и самый правый столбец не содержит символов 'R'.

Вы хотите поставить роботов на поле (не более одного робота в клетку). При этом следующие условия должны быть соблюдены.

  • Во-первых, каждый робот всегда обязан перемещаться (то есть он не может пропустить ход). За один ход каждый робот перемещается в соседнюю клетку в соответствии с текущим направлением.
  • Во-вторых, вам необходимо поставить роботов таким образом, что не найдется такого хода, перед которым два различных робота стоят в одной и той же клетке (это также значит, что вы не можете поставить двух роботов в одну и ту же клетку). Таким образом, Если поле равно «RL» (одна строка, два столбца, цвета здесь не важны), то вы можете поставить двух роботов в клетки \((1, 1)\) и \((1, 2)\), но если поле равно «RLL», то вы не можете поставить роботов в клетки \((1, 1)\) и \((1, 3)\), потому что в течение первой секунды оба робота будут стоять в клетке \((1, 2)\).

Роботы делают бесконечное количество ходов.

Ваша задача — поставить максимальное количество роботов таким образом, чтобы удовлетворить все условия, описанные выше, а среди всех таких способов вам необходимо выбрать такой, что количество черных клеток, на которых стоят роботы перед началом всех перемещений является максимально возможным. Заметьте, что вы можете ставить роботов только перед началом всех перемещений.

Вам необходимо ответить на \(t\) независимых наборов тестовых данных.

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

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 5 \cdot 10^4\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Первая строка набора тестовых данных содержит два целых числа \(n\) и \(m\) (\(1 < nm \le 10^6\)) — количество строк и количество столбцов соответственно.

Следующие \(n\) строк содержат по \(m\) символов каждая, где \(j\)-й символ \(i\)-й строки равен \(c_{i, j}\) (\(c_{i, j}\) равно либо '0', если клетка \((i, j)\) покрашена в черный цвет, либо '1', если клетка \((i, j)\) покрашена в белый цвет).

Следующие \(n\) строк также содержат по \(m\) символов каждая, где \(j\)-й символ \(i\)-й строки равен \(s_{i, j}\) (\(s_{i, j}\) равно 'U', 'R', 'D' или 'L', и описывает направление клетки \((i, j)\)).

Гарантируется, что сумма размеров полей не превосходит \(10^6\) (\(\sum nm \le 10^6\)).

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

Для каждого набора тестовых данных выведите два числа — максимальное количество роботов, которое вы можете поставить, чтобы удовлетворить все ограничения, указанные в условии задачи, и максимальное количество черных клеток, в которых находятся роботы перед началом всех перемещений, если количество поставленных роботов максимально. Заметьте, что вы можете ставить роботов только перед началом всех перемещений.

A. Linova и королевство

Деревья дп жадные алгоритмы поиск в глубину и подобное сортировки *1600

Написание легких романов является очень важной частью жизни Linova. Прошлой ночью ей приснилось сказочное королевство. Linova написала легкий роман про это королевство, как только проснулась. Конечно, она стала его королевой.

 

Всего есть \(n\) городов и \(n-1\) двусторонняя дорога, соединяющая некоторые пары городов королевства. Из любого города вы можете попасть в любой другой город, пройдя по некоторым дорогам. Города пронумерованы от \(1\) до \(n\) и город \(1\) является столицей королевства. Таким образом, структура королевства является деревом.

Как королева, Linova планирует выбрать ровно \(k\) городов для развития индустрии, тогда как в остальных городах будет развиваться туризм. Столица также может быть как индустриальным, так и туристическим городом.

Раз в год в столице будет проходить встреча. Для участия во встрече, каждый индустриальный город посылает участника. Все посланники приедут в столицу по кратчайшему пути (который как известно единственный в дереве).

Путешествие по туристическим городам очень приятно. Для каждого посланника, его уровень счастья равен количеству туристических городов на его пути.

Для того, чтобы люди любили королеву, Linova хочет выбрать \(k\) городов так, чтобы максимизировать сумму уровней счастья всех посланников. Можете ли вы посчитать максимальную возможную сумму для нее?

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

Первая строка содержит два целых числа \(n\) и \(k\) (\(2\le n\le 2 \cdot 10^5\), \(1\le k< n\))  — количество городов и индустриальных городов, соответственно.

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

Гарантируется, что из любого города можно достичь любой другой по дорогам.

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

Выведите строку, содержащую единственное целое число  — максимальную возможную сумму уровней счастья всех посланников, которую можно достичь.

Примечание

В первом тесте, Linova может выбрать города \(2\), \(5\), \(6\), \(7\) для развития индустрии, тогда уровень счастья посланника из города \(2\) будет равен \(1\), уровни счастья посланников из городов \(5\), \(6\), \(7\) будут равны \(2\). Таким образом, сумма уровней счастья будет равна \(7\) и можно доказать, что это максимальная возможная сумма, которая может быть.

Во втором тесте, выбрав города \(3\) и \(4\) для развития индустрии можно достичь суммы \(3\), но обратите внимание, что Linova планирует выбрать ровно \(k\) городов для развития индустрии, поэтому максимальная сумма равна \(2\).

B. Назначение весов ребрам

битмаски Деревья жадные алгоритмы Конструктив математика поиск в глубину и подобное *1800

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

  • Для каждых двух разных листов \(v_{1}\) и \(v_{2}\) этого дерева, побитовое исключающее ИЛИ весов всех ребер на простом пути между \(v_{1}\) и \(v_{2}\) должно быть равно \(0\).

Обратите внимание, что вы можете назначать очень большие натуральные числа (такие как \(10^{(10^{10})}\)).

Гарантируется, что такое назначение всегда существует при данных ограничениях. Теперь определим \(f\) как количество различных весов среди назначенных весов.

В этом примере назначение верно, потому что побитовое исключающее ИЛИ всех весов ребер между каждой парой листьев равно \(0\). Значение \(f\) здесь равно \(2\), потому что есть \(2\) различных веса ребер (\(4\) и \(5\)).

В этом примере назначение не удовлетворяет условию, поскольку побитовое исключающее ИЛИ всех весов ребер между вершинами \(1\) и \(6\) (\(3, 4, 5, 4\)) не равно \(0\).

Чему равны минимальное и максимальное возможные значения \(f\) для данного дерева? Найдите и выведите оба.

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

Первая строка содержит целое число \(n\) (\(3 \le n \le 10^{5}\))  — количество вершин в данном дереве.

\(i\)-я из следующих \(n-1\) строк содержит два целых числа \(a_{i}\) и \(b_{i}\) (\(1 \le a_{i} \lt b_{i} \le n\))  — это означает, что существует ребро между \(a_{i}\) и \(b_{i}\). Гарантируется, что данный граф образует дерево из \(n\) вершин.

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

Выведите два целых числа  — минимальное и максимальное возможное значения \(f\), которые могут быть получены из правильного назначения данного дерева. Обратите внимание, что такое назначение всегда существует при данных ограничениях.

Примечание

В первом примере возможные назначения для минимума и максимума показаны на рисунке ниже. Конечно, есть и другие назначения.

Во втором примере возможные назначения для минимума и максимума показаны на рисунке ниже. Значение \(f\) для правильного назначения этого дерева всегда равно \(3\).

В третьем примере возможные назначения для минимума и максимума показаны на рисунке ниже. Конечно, есть и другие назначения.

D. Вложенные резинки

Деревья дп Конструктив математика поиск в глубину и подобное *2700

У вас есть дерево из \(n\) вершин. Вы собираетесь преобразовать это дерево в \(n\) резинок на бесконечной плоскости. Должно выполняться следующее;

  • Для каждой пары вершин \(a\) и \(b\), резинки \(a\) и \(b\) должны пересекаться тогда и только тогда, когда между \(a\) и \(b\) в дереве существует ребро.
  • Форма резинки должна быть простой петлей. Другими словами, резинка  — это замкнутая кривая без самопересечений.

Теперь давайте дадим следующие определения:

  • Резинка \(a\) включает резинку \(b\), если и только если резинка \(b\) находится полностью внутри резинки \(a\), и они не пересекаются.
  • Последовательность резинок \(a_{1}, a_{2}, \ldots, a_{k}\) (\(k \ge 2\)) называется вложенной, если и только если для всех \(i\) (\(2 \le i \le k\)), \(a_{i-1}\) включает в себя \(a_{i}\).
Это пример преобразования. Обратите внимание, что резинки \(5\) и \(6\) являются вложенными.

Можно доказать, что при заданных ограничениях существует преобразование и последовательность вложенных резинок.

Какую максимальную длину последовательности вложенных резинок можно получить из данного дерева? Найдите и выведите ее.

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

Первая строка содержит целое число \(n\) (\(3 \le n \le 10^{5}\))  — количество вершин в данном дереве.

\(i\)-я из следующих \(n-1\) строк содержит два целых числа \(a_{i}\) и \(b_{i}\) (\(1 \le a_{i} \lt b_{i} \le n\))  — это означает, что существует ребро между \(a_{i}\) и \(b_{i}\). Гарантируется, что данный граф образует дерево из \(n\) вершин.

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

Выведите ответ.

Примечание

В первом примере можно получить вложенную последовательность из \(4\) резинок (\(1\), \(2\), \(5\) и \(6\)) с помощью следующего преобразования, приведенного ниже. Конечно, существуют и другие преобразования для создания вложенной последовательности длины \(4\). Однако вы не можете сделать последовательность из \(5\) или более вложенных резинок для данного дерева.

Одно из возможных преобразований для второго примера приведено ниже.

B. Пары чисел

математика Перебор поиск в глубину и подобное теория чисел *1900

Допустим, мы имеем пару чисел (a, b). Мы можем получить новую пару чисел вида (a + b, b) или (a, a + b) из данной. Назовем такое действие шагом.

Пусть начальная пара чисел — (1,1). Ваша задача — найти число k, наименьшее количество шагов, необходимых чтобы получить из (1,1) пару, в которой хотя бы одно число равно n.

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

Входные данные содержат единственное целое число n (1 ≤ n ≤ 106).

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

Выведите единственное число k.

Примечание

Из пары (1,1) можно за три хода получить пару, содержащую 5: (1,1)  →  (1,2)  →  (3,2)  →  (5,2).

C. Настя и неожиданный гость

графы дп кратчайшие пути поиск в глубину и подобное *2400

Если девушка не идет к Денису, то Денис идет к девушке. Руководствуясь таким принципом, молодой человек вышел из дома, купил цветы и направился к Насте.

По пути от его дома до дома его возлюбленной есть дорога из \(n\) полос, перейти которую за один зеленый свет не всегда возможно. Предвидя это, добрый мэр распорядился поставить в некоторых точках этой дороги островки безопасности. Каждый островок расположен после какой-то полосы, а также в начале и в конце дороги. На них пешеходы могут отдохнуть, набраться сил и дождаться зеленого света.

Денис подошел к левому краю дороги ровно в тот момент, когда загорелся зеленый свет. Мальчик знает, что светофор сначала горит \(g\) секунд зеленым, а потом \(r\) секунд красным, потом опять \(g\) секунд зеленым и так далее.

Формально, дорогу можно представить как отрезок \([0, n]\). Изначально Денис стоит в точке \(0\). Его задача - попасть в точку \(n\) за минимальное возможное время.

Oн знает множество различных целых чисел \(d_1, d_2, \ldots, d_m\), где \(0 \leq d_i \leq n\)  — координаты точек, в которых расположены островки безопасности. Только в одной из этих точек мальчик может находиться в момент, когда горит красный свет.

К сожалению, из-за волнения Денис не всегда может контролировать себя, поэтому сейчас на его передвижения наложены некоторые ограничения:

  • Он обязан двигаться всегда, пока горит зеленый, ведь сложно стоять, когда тебя ждет такая девушка. Денис за \(1\) секунду может изменить свое положение на \(\pm 1\). При этом он должен всегда оставаться внутри отрезка \([0, n]\).
  • Он может менять направление движения только на островках безопасности (ведь это безопасно). Это означает, что если за предыдущую секунду мальчик изменил свое положение на \(+1\), то если он находится на островке безопасности, он может изменить свое положение на \(\pm 1\), иначе он может изменить свое положение вновь только на \(+1\). Аналогично, если за предыдущую секунду он изменил свое положение на \(-1\), на островке безопасности он может изменить свое положение на \(\pm 1\), а в любой другой точке вновь только на \(-1\).
  • В момент, когда загорается красный, мальчик должен оказаться на каком-то островке безопасности. Он сможет продолжить движение в любом направлении, когда вновь загорится зеленый.

Считается, что Денис перешел дорогу как только его координата станет равна \(n\).

Эта задача оказалась не так проста, ведь возможно, таким способом даже невозможно перейти дорогу. Так как у Дениса все мысли о любви, он не справился решить ее и попросил нас помочь ему в этом. Найдите минимальное возможное время, за которое он сможет перейти дорогу по таким правилам, либо установите, что это сделать невозможно.

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

В первой строке находится два целых числа \(n\) и \(m\) \((1 \leq n \leq 10^6, 2 \leq m \leq min(n + 1, 10^4))\)  — ширина дороги и количество островков безопасности.

Во второй строке находится \(m\) различных целых чисел \(d_1, d_2, \ldots, d_m\) \((0 \leq d_i \leq n)\)  — точки, в которых расположены островки безопасности. Гарантируется, что среди них есть \(0\) и \(n\).

В третьей строке находится два целых числа \(g, r\) \((1 \leq g, r \leq 1000)\)  — время, которое на светофоре горит зеленый свет и время, которое на светофоре горит красный свет.

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

Выведите одно целое число  — минимальное время, за которое Денис может перейти дорогу по всем правилам.

Если перейти дорогу по всем правилам невозможно выведите \(-1\).

Примечание

В первом тесте оптимальный маршрут такой:

  • за первый зеленый свет дойти до \(7\) и вернуться на \(3\). В этом случае, мы сменим направление движения в точке \(7\), что разрешено, поскольку в этой точке есть островок безопасности. В конце мы окажемся в точке \(3\), где также есть островок безопасности. Следующие \(11\) секунд мы должны подождать красный свет.
  • за второй зеленый свет дойти до \(14\). Снова подождать красный свет.
  • за \(1\) секунду перейти в \(15\). В итоге Денис оказывается в конце дороги.

Всего получается \(45\) секунд.

Во втором тесте невозможно перейти дорогу по всем правилам.

D. Настя и машина времени

графы Деревья Конструктив поиск в глубину и подобное *2600

Придя к Насте, Денис обнаружил, что она ему не рада... Но у молодого человека есть последняя надежда. Он хочет купить все вещи, что нравятся Насте. Тогда-то она уж точно согласится с ним общаться.

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

Денис находится в вершине \(1\) в момент времени \(0\). Он хочет хоть раз побывать в каждой вершине и вернуться назад как можно раньше.

Денис может проходить вдоль любой дороги за \(1\) времени. Увы, город столь велик, что сделать это быстро никак не выйдет. Поэтому Денис пошел на отчаянный шаг. Он достал свою карманную машину времени, которую он собрал у себя в подвале. С ее помощью Денис может стоя на месте сменить время на любое неотрицательное время, которое меньше текущего.

Но у машины времени есть один нюанс. Если герой окажется в одном месте и в одно и то же время дважды, произойдет взрыв вселенских масштабов и не получится порадовать Настю. Поэтому Денис просит вас проложить ему маршрут с использованием машины времени такой, что он обойдет все площади и вернется на первую и при этом максимальное время в котором он побывал будет минимально.

Формально, маршрут Дениса можно представить как последовательность пар \(\{v_1, t_1\}, \{v_2, t_2\}, \{v_3, t_3\}, \ldots, \{v_k, t_k\}\), где \(v_i\) — номер площади, а \(t_i\)  — время, в котором сейчас находится мальчик.

Должны быть выполнены следующие условия:

  • Маршрут начинается на площади \(1\) в момент времени \(0\), то есть \(v_1 = 1, t_1 = 0\) и заканчивается на площади \(1\), то есть \(v_k = 1\).
  • Все переходы делятся на два типа:
    1. Стоя на площади сменить время: \(\{ v_i, t_i \} \to \{ v_{i+1}, t_{i+1} \} : v_{i+1} = v_i, 0 \leq t_{i+1} < t_i\).
    2. Пройти по одной из дорог: \(\{ v_i, t_i \} \to \{ v_{i+1}, t_{i+1} \}\). При этом \(v_i\) и \(v_{i+1}\) соединены дорогой и \(t_{i+1} = t_i + 1\).
  • Все пары \(\{ v_i, t_i \}\) должны быть различны.
  • Среди \(v_1, v_2, \ldots, v_k\) встречаются все площади.

Вам нужно найти маршрут такой, что максимальное время, в котором побывает Денис будет минимальным, то есть маршрут, для которого \(\max{(t_1, t_2, \ldots, t_k)}\) будет минимально возможным.

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

В первой строке находится единственное целое число \(n\) \((1 \leq n \leq 10^5)\)  — количество площадей в городе.

В следующих \(n - 1\) строках находится по два целых числа \(u\) и \(v\) \((1 \leq v, u \leq n, u \neq v)\)  — номера площадей, соединенных дорогой.

Гарантируется, что заданный граф является деревом.

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

В первой строке выведите целое число \(k\) \((1 \leq k \leq 10^6)\)  — длина пути Дениса.

В следующих \(k\) строках выведите пары \(v_i, t_i\)  — пары, описывающие маршрут Дениса (как в условии).

Все требования к маршруту, описанные в условии должны быть выполнены.

Гарантируется, что при заданных ограничениях существует хотя бы один маршрут и ответ, длина которого не превосходит \(10^6\). Если возможных ответов несколько, выведите любой.

B. Однополюсные магниты

графы Конструктив поиск в глубину и подобное снм *2000

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

У вас есть таблица размером \(n\times m\). Изначально вы можете поставить несколько магнитов с северным полюсом и несколько магнитов с южным полюсом в некоторые клетки этой таблицы. Вам разрешено расставлять сколько угодно магнитов, в том числе несколько в одну клетку.

Можно выполнять следующую операцию: выбрать один магнит с северным полюсом и один магнит с южным полюсом для активации. Если они находятся в одной строке или в одном столбце, но занимают разные клетки, то магнит с северным полюсом переместится на одну клетку ближе к магниту с южным полюсом. Иначе, если они занимают одинаковые клетки или не находятся в одной строке или в одном столбце, то ничего не произойдет. Обратите внимание, что магниты с южным полюсом неподвижны.

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

  1. В каждой строке и каждом столбце таблицы находится хотя бы один магнит с южным полюсом.
  2. Если клетка таблицы черная, тогда можно переместить какой-нибудь магнит с северным полюсом в эту клетку с помощью некоторой последовательности операций из начального расположения магнитов.
  3. Если клетка таблицы белая, тогда никакой магнит с северным полюсом невозможно переместить в эту клетку с помощью некоторой последовательности операций из начального расположения магнитов.

Определите, можно ли расположить магниты в таблице так, что все условия будут выполнены. Если это возможно, найдите минимальное количество магнитов с северным полюсом, которое для этого требуется (минимизировать количество магнитов с южным полюсом не нужно).

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

В первой строке находятся два целых числа \(n\) и \(m\) (\(1\le n,m\le 1000\))  — количество строк и столбцов в таблице, соответственно.

Следующие \(n\) строк описывают раскраску таблицы: \(i\)-я из этих строк содержит строку длины \(m\), в которой \(j\)-й символ обозначает цвет клетки таблицы, находящейся в строке \(i\) и столбце \(j\). Символы «#» и «.» обозначают черный и белый цвета соответственно. Гарантируется, что строка не содержит других символов.

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

Выведите единственное целое число, которое равно минимальному количеству магнитов с северным полюсом, которое требуется.

Если не существует способа расставить магниты, который будет удовлетворять всем условиям, выведите единственное целое число \(-1\).

Примечание

В первом тесте возможно расположить магниты следующим образом:

Во втором тесте можно показать, что не существует необходимых расположений магнитов. На следующей картинке показаны три примера расположений, которые удовлетворяют не всем условиям. Первый пример нарушает правило \(3\), потому что мы можем переместить магнит с северным полюсом вниз на белую клетку. Второй пример нарушает правило \(2\), потому что мы не можем переместить магнит с северным полюсом в левую нижнюю черную клетку никакой последовательностью операций. Третий пример нарушает правило \(1\), потому что нет ни одного магнита с южным полюсом в первом столбце.

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

Во четвертом тесте можно показать, что не существует необходимых расположений магнитов. На следующей картинке два примера расположений, которые удовлетворяют не всем условиям. Первый пример нарушает правило \(1\), потому что нет ни одного магнита с южным полюсом в первой строке. Второй пример нарушает правила \(1\) и \(3\), потому что нет ни одного магнита с южным полюсом во второй строке, а кроме того, мы можем переместить магнит с северным полюсом на одну клетку вверх, и он попадет на белую клетку.

В пятом тесте мы можем поставить магниты с южным полюсом во все клетки и не использовать ни одного магнита с северным полюсом. Поскольку нет ни одной черной клетки, это будет корректной расстановкой магнитов.

C. Задача про кванторы

графы дп математика поиск в глубину и подобное *2600

Логические кванторы — это очень хороший инструмент для создания некоторых утверждений о множестве. В этой задаче мы будем рассматривать множество вещественных чисел. Множество вещественных чисел содержит ноль и отрицательные числа. Есть два вида кванторов: всеобщности (\(\forall\)) и существования (\(\exists\)). Вы можете прочитать больше про них здесь.

Квантор всеобщности используется, чтобы сказать, что утверждение выполнено для всех вещественных чисел. Например:

  • \(\forall x,x<100\) читается как: для всех вещественных чисел \(x\) число \(x\) меньше, чем \(100\). Это утверждение ложно.
  • \(\forall x,x>x-1\) читается как: для всех вещественных чисел \(x\) число \(x\) больше, чем \(x-1\). Это утверждение верно.

Квантор существования используется, чтобы сказать, что существует некоторое вещественное число, для которого утверждение выполнено. Например:

  • \(\exists x,x<100\) читается как: существует вещественное число \(x\) такое, что \(x\) меньше, чем \(100\). Это утверждение верно.
  • \(\exists x,x>x-1\) читается как: существует вещественное число \(x\) такое, что \(x\) больше, чем \(x-1\). Это утверждение верно.

Кроме того, эти кванторы могут быть вложенными. Например:

  • \(\forall x,\exists y,x<y\) читается так: для всех вещественных чисел \(x\) существует вещественное число \(y\) такое, что \(x\) меньше, чем \(y\). Это утверждение верно для всех \(x\), потому что существует \(y=x+1\).
  • \(\exists y,\forall x,x<y\) читается так: существует вещественное число \(y\) такое, что для всех вещественных чисел \(x\) число \(x\) меньше, чем \(y\). Это утверждение ложно, потому что оно утверждает, что существует максимальное вещественное число: число \(y\) больше, чем любое \(x\).

Обратите внимание, что порядок переменных и кванторов важен для значения и верности утверждения.

Всего есть \(n\) переменных \(x_1,x_2,\ldots,x_n\), и вам дана формула вида \(\) f(x_1,\dots,x_n):=(x_{j_1}<x_{k_1})\land (x_{j_2}<x_{k_2})\land \cdots\land (x_{j_m}<x_{k_m}), \(\)

где \(\land\) обозначает логическое И. Это означает, что \(f(x_1,\ldots, x_n)\) истинно, если каждое неравенство \(x_{j_i}<x_{k_i}\) выполнено. Иначе, если хотя бы одно неравенство не выполнено, то \(f(x_1,\ldots,x_n)\) ложно.

Ваша задача — выбрать значения каждого из кванторов \(Q_1,\ldots,Q_n\) либо квантором всеобщности (\(\forall\)), либо квантором существования (\(\exists\)) так, что утверждение \(\) Q_1 x_1, Q_2 x_2, \ldots, Q_n x_n, f(x_1,\ldots, x_n) \(\)

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

Обратите внимание, что порядок переменных, в котором они идут в утверждении фиксирован. Например, если \(f(x_1,x_2):=(x_1<x_2)\), то вам не разрешено сделать переменную \(x_2\) идущей первой, и получить утверждение \(\forall x_2,\exists x_1, x_1<x_2\). Если вы выберете \(Q_1=\exists\) и \(Q_2=\forall\) получившееся утверждение будет однозначно равно \(\exists x_1,\forall x_2,x_1<x_2\).

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

В первой строке находятся два целых числа \(n\) и \(m\) (\(2\le n\le 2\cdot 10^5\); \(1\le m\le 2\cdot 10^5\)) — количество переменных и неравенств в формуле, соответственно.

Следующие \(m\) строк описывают формулу. \(i\)-я из этих строк содержит два целых числа \(j_i\), \(k_i\) (\(1\le j_i,k_i\le n\), \(j_i\ne k_i\)).

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

Если ни одной расстановки кванторов такой, что утверждение будет верно, не существует, выведите единственное целое число \(-1\).

Иначе на первой строке выведите максимальное возможное количество кванторов всеобщности.

На следующей строке выведите строку длины \(n\), в которой \(i\)-й символ это «A», если \(Q_i\) должен быть квантором всеобщности (\(\forall\)), или «E», если \(Q_i\) должен быть квантором существования (\(\exists\)). Все символы должны быть в верхнем регистре. Если существует несколько возможных решений, в которых количество кванторов всеобщности максимально возможное, выведите любое.

Примечание

В первом тесте утверждение \(\forall x_1, \exists x_2, x_1<x_2\) верно. Ответы «EA» и «AA» дают ложные утверждения. Ответ «EE» дает верное утверждение, но количество кванторов всеобщности будет меньше, чем в нашем ответе.

Для второго теста можно показать, что ни одной расстановки кванторов такой, что утверждение будет верно, не существует.

В третьем тесте утверждение \(\forall x_1, \forall x_2, \exists x_3, (x_1<x_3)\land (x_2<x_3)\) верно: мы можем выбрать \(x_3=\max\{x_1,x_2\}+1\).

F. Феникс и память

графы жадные алгоритмы поиск в глубину и подобное Структуры данных *2600

Феникс хотел сделать фото своих \(n\) друзей, пронумерованных \(1, 2, \dots, n\). Друзья стояли в ряд в некотором порядке. И тут вдруг пришли печенеги с половцами и всех переставили.

Теперь Фениксу нужно восстановить данный порядок, но он почти ничего не помнит! Все, что Феникс запомнил, — что \(i\)-й слева друг имеет номер от \(a_i\) по \(b_i\) включительно. Единственным ли является порядок друзей, подходящий под его воспоминания?

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

В первой строке задано целое число \(n\) (\(1 \le n \le 2\cdot10^5\)) — количество друзей.

В \(i\)-й из следующих \(n\) строк заданы два целых числа \(a_i\) и \(b_i\) (\(1 \le a_i \le b_i \le n\)) — то, что запомнил Феникс про \(i\)-ю позицию слева.

Гарантируется, что информация, которую запомнил Феникс, не противоречива, и существует хотя бы один подходящий порядок.

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

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

В противном случае, выведите NO. Далее, выведите любые два подходящих порядка на следующих двух строках. Если существует несколько ответов, выведите любой.

C. Орак и Game of Life

графы кратчайшие пути поиск в глубину и подобное реализация *2000

Обратите внимание на необычное ограничение по памяти в этой задаче.

Орак любит игры. Недавно он придумал новую игру, «Game of Life».

Вы должны играть в эту игру на черно-белом клетчатом поле из \(n\) строк и \(m\) столбцов. Каждая клетка либо белая, либо черная.

На каждой итерации этой игры (исходная итерация это \(0\)) цвет клетки будет изменяться по следующим правилам:

  • Если на текущей итерации нет соседних клеток с таким же цветом, как и эта клетка, ее цвет на следующей итерации останется прежним.
  • Иначе, ее цвет на следующей итерации будет другим.

Две клетки являются соседними, если у них есть общая сторона.

Орак уже выбрал исходное состояние игры, и он хочет знать для клетки \((i,j)\)\(i\)-й строке и \(j\)-м столбце), чему будет равен ее цвет на итерации \(p\). Он может задавать вам эти вопросы по несколько раз.

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

В первой строке записано три целых числа \(n,m,t\ (1\le n,m\le 1000, 1\le t\le 100\,000)\), описывающие количество строк и столбцов, и количество запросов Орака.

Каждая из следующих \(n\) строк содержит бинарную строку длины \(m\), \(j\)-й символ в \(i\)-й строке описывает изначальный цвет клетки \((i,j)\). '0' означает белый, '1' означает черный.

Каждая из следующих \(t\) строк содержит три целых числа \(i,j,p\ (1\le i\le n, 1\le j\le m, 1\le p\le 10^{18})\), описывающие запрос Орака.

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

Выведите \(t\) строк, в \(i\)-й из которых вы должны вывести ответ на \(i\)-й запрос Орака. Если цвет клетки черный, вы должны вывести '1', иначе, вы должны вывести '0'.

Примечание

В первом примере картинка выше описывает исходну ситуацию и цвета клеток на итерациях \(1\), \(2\), и \(3\). Вы можете увидеть, что цвет клетки \((1,1)\) на итерации \(1\) черный, цвет клетки \((2,2)\) после итерации \(2\) черный, и цвет клетки \((3,3)\) после итерации \(3\) тоже черный.

Во втором примере можно доказать, что клетки никогда не поменяют свой цвет.

D. Цикл

Перебор поиск в глубину и подобное реализация *2500

Маленький Петя очень любит прямоугольные таблицы, состоящие из символов «0» и «1». Недавно он получил в подарок от мамы одну такую таблицу с n строками и m столбцами. Строки нумеруются сверху вниз от 1 до n, столбцы нумеруются слева направо от 1 до m. Петя сразу же решил во что бы то ни стало найти в таблице самый длинный крутой цикл.

Циклом называется последовательность попарно различных клеток, в которой каждые две последовательно идущие клетки имеют общую сторону, а также первая клетка имеет общую сторону с последней. Цикл называется крутым, если для него одновременно выполняются все следующие условия:

  • Цикл целиком состоит из клеток, содержащих «1».
  • Каждая клетка, принадлежащая циклу, имеет общую сторону ровно с двумя другими клетками, принадлежащими этому циклу.
  • Каждая клетка таблицы, содержащая «1» либо принадлежит циклу, либо находятся снаружи него (см. определение ниже).

Для формального определения понятия «снаружи», нарисуем цикл на плоскости. Каждой клетке цикла (i, j) (i — номер строки, j — номер столбца) поставим в соответствие точку на плоскости с координатами (i, j). Соединим отрезком прямой каждую пару точек, для которых соответствующие им клетки принадлежат циклу и имеют общую сторону. Таким образом, на плоскости мы получим замкнутую ломаную без самопересечений и самокасаний. Эта ломаная делит плоскость на две связные области: конечной и бесконечной площади. Считается, что клетка (r, c) лежит снаружи цикла, если она не принадлежит циклу и соответствующая ей точка на плоскости с координатами (r, c) лежит в области бесконечной площади.

Помогите Пете найти длину самого длинного крутого цикла в таблице. Длиной цикла называется количество клеток, принадлежащих ему.

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

Первая строка содержит два целых числа n и m (1 ≤ n, m ≤ 1000) — количество строк и столбцов в таблице, соответственно. Каждая из следующих n строк содержит по m символов. Каждый символ может быть либо «0», либо «1».

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

Выведите одно число — длину самого длинного крутого цикла в таблице. Если таких циклов не существует, выведите 0.

Примечание

В первом примере есть всего один цикл, он же является крутым.

Во втором примере вообще не существует ни одного цикла.

В третьем примере есть два крутых цикла: один длины 12, другой длины 24.

В четвертом примере также есть всего один цикл, но он не является крутым, поскольку существует клетка, содержащая «1», которая находится внутри этого цикла.

F. Восстановление 01-строки

Конструктив математика поиск в глубину и подобное *1500

Для некоторой 01-строки \(s\) (то есть такой, что каждый символ \(s_i\) — это либо '0', либо '1') выписали все пары подряд идущих символов (все подстроки длины \(2\)). Для каждой пары (подстроки длины \(2\)) посчитали количество символов '1' (единиц) в ней.

Вам заданы три числа:

  • \(n_0\) — количество пар подряд идущих символов (подстрок), в которых \(0\) единиц;
  • \(n_1\) — количество пар подряд идущих символов (подстрок), в которых \(1\) единица;
  • \(n_2\) — количество пар подряд идущих символов (подстрок), в которых \(2\) единицы.

Например, для строки \(s=\)«1110011110» были бы выписаны следующие подстроки: «11», «11», «10», «00», «01», «11», «11», «11», «10». Таким образом, \(n_0=1\), \(n_1=3\), \(n_2=5\).

Ваша задача — по заданным \(n_0, n_1, n_2\) восстановить любую подходящую 01-строку (бинарную строку) \(s\). Гарантируется, что хотя бы одно из чисел \(n_0, n_1, n_2\) отлично от \(0\). Также гарантируется, что решение существует.

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

В первой строке записано целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных в тесте. Далее во входных данных записаны сами наборы.

Каждый набор состоит из одной строки, которая содержит три целых числа \(n_0, n_1, n_2\) (\(0 \le n_0, n_1, n_2 \le 100\); \(n_0 + n_1 + n_2 > 0\)). Гарантируется, что ответ для заданных \(n_0, n_1, n_2\) существует.

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

Выведите \(t\) строк. Каждая из строк должна содержать ответ в виде 01-строки (бинарной строки) на соответствующий набор входных данных. Если возможных ответов несколько, выведите любой из них.

E. Раскраска графа

графы дп поиск в глубину и подобное *2100

Вам задан неориентированный граф без петель и кратных ребер, состоящий из \(n\) вершин и \(m\) ребер. Также вам задано три числа \(n_1\), \(n_2\) и \(n_3\).

Определите, можно ли расставить в вершины графа цифры 1, 2 и 3 так, чтобы выполнялись следующие условия:

  1. В каждой вершине должно стоять ровно одно из чисел 1, 2, 3;
  2. Суммарно количество чисел 1 во всех вершинах должно равняться \(n_1\);
  3. Суммарно количество чисел 2 во всех вершинах должно равняться \(n_2\);
  4. Суммарно количество чисел 3 во всех вершинах должно равняться \(n_3\);
  5. Для каждого ребра \((u, v)\) должно быть верно \(|col_u - col_v| = 1\), где \(col_x\) — цвет вершины с индексом \(x\).

Если существует несколько раскрасок, удовлетворяющим все описанным выше условиям, разрешено найти любую из них.

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

В первой строке следуют два целых числа \(n\) и \(m\) (\(1 \le n \le 5000\); \(0 \le m \le 10^5\)) — количество вершин в графе и количество ребер в графе.

Во второй строке следуют три целых числа \(n_1\), \(n_2\) и \(n_3\) (\(0 \le n_1, n_2, n_3 \le n\)) — необходимое количество цифр 1, 2 и 3, соответственно. Гарантируется, что \(n_1 + n_2 + n_3 = n\).

В следующих \(m\) строках следует описание ребер: в \(i\)-й строке следуют два целых числа \(u_i\), \(v_i\) (\(1 \le u_i, v_i \le n\); \(u_i \neq v_i\)) — номера вершин, которые соединяет \(i\)-е ребро. Гарантируется, что граф не содержит петель и кратных ребер.

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

Если существует раскраска, удовлетворяющая всем описанным условиям, выведите в первую строку «YES» (без кавычек). Во вторую строку выведите строку длины \(n\), состоящую только из цифр 1, 2 и 3, причем \(i\)-й символ этой строки должен быть равен цифре, которую нужно поставить в \(i\)-ю вершину.

Если подходящей раскраски не существует, выведите «NO» (без кавычек).

C. Джонни и ожерелье Меган

Бинарный поиск битмаски графы Конструктив поиск в глубину и подобное снм *2500

У младшей сестры Джонни, Меган, недавно был день рождения. Её брат подарил ей коробочку, подписанную как: «Твое прекрасное ожерелье — сделай сама!». Коробочка содержит много частей ожерелья и магический клей.

Каждая часть ожерелья представляет собой цепочку, соединяющую две жемчужины. Цвет каждой из жемчужин может быть представлен целым неотрицательным числом. Магический клей позволяет Меган склеивать две жемчужины (возможно, из одной части ожерелья) в одну. Красота соединения двух жемчужин цветов \(u\) и \(v\) определяется следующим образом: пусть \(2^k\) — максимальная степень двух, делящая \(u \oplus v\) — исключающее или \(u\) и \(v\). Тогда красота соединения равна \(k\). Если \(u = v\), вы можете считать, что красота равна \(20\).

Каждая жемчужина может быть склеена с другой максимум один раз. Склеивание двух частей ожерелья объединяет их. Используя клей несколько раз, Меган может наконец получить свое ожерелье, которое является циклом, сделанным из соединенных последовательно частей ожерелья (так, что каждая жемчужина в ожерелье соединена с ровно одной другой жемчужиной). Красота такого ожерелья равна минимальной красоте соединений в нем. Девочка хочет использовать все доступные части ожерелья, чтобы получить ровно одно ожерелье, содержащее все части, с максимальной возможной красотой. Помогите ей!

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

Первая строка содержит целое число \(n\) \((1 \leq n \leq 5 \cdot 10^5)\) — количество частей ожерелья в коробочке.

Каждая из следующих \(n\) строк содержит два целых числа \(a\) и \(b\) \((0 \leq a, b < 2^{20})\), которые обозначают цвета жемчужин из этой части ожерелья. Жемчужины на \(i\)-й строке имеют индексы \(2i - 1\) и \(2i\), соответственно.

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

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

Следующая строка должна содержать \(2n\) различных целых чисел \(p_i\) \((1 \leq p_i \leq 2n)\) — индексы исходных жемчужин в порядке, в котором они должны быть расположены в ожерелье. Индексы жемчужин, принадлежащих одной части, должны быть расположены на соседних позициях в перестановке (поэтому \(1\,4\,3\,2\) не является корректным выводом, а \(2\,1\,4\,3\) и \(4\,3\,1\,2\) являются). Если существует несколько подходящих ответов, вы можете вывести любой.

Примечание

В первом примере следующие пары жемчужин объединяются: \((7, 9)\), \((10, 5)\), \((6, 1)\), \((2, 3)\) и \((4, 8)\). Красота соединений равна: \(3\), \(3\), \(3\), \(20\), \(20\), соответственно.

Иллюстрация показывает эту конструкцию:

E. Джеймс и погоня

графы Деревья поиск в глубину и подобное Теория вероятностей *3000

У Джеймса Бонда есть новый план, как поймать своего врага. Есть несколько городов и ориентированные дороги между ними, причем используя эти дороги можно добраться из любого города до любого другого. Когда враг появляется в каком-то городе, Бонд знает её следующий пункт назначения, но понятия не имеет, какой путь она выберет, чтобы ехать туда.

Город \(a\) называется интересным, если для любого города \(b\), существует ровно один простой путь из \(a\) в \(b\). Простым путем называется последовательность различных городов, в которой для каждых двух соседних городов есть дорога, ведущая из первого города во второй.

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

Вы ответственны за поиск всех интересных городов. Выведите их, либо сообщите, что их недостаточно много. Под недостаточно много, Джеймс подразумевает строго меньше \(20\%\) всех городов.

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

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 2\,000\)) — количество наборов входных данных. Каждый набор входных данных описывается следующим образом:

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \leq n \le 10^5\), \(0 \leq m \le 2 \cdot 10^5\)) — количество городов и дорог между ними. Каждая из следующих \(m\) строк содержит два целых числа \(u\) и \(v\) (\(u \neq v\); \(1 \leq u, v \leq n\)), которые обозначают дорогу из города \(u\) в город \(v\).

Гарантируется, что между каждой упорядоченной парой городов существует максимум одна дорога. Сумма \(n\) по всем наборам входных данных не превышает \(10^5\), а сумма \(m\) не превышает \(2 \cdot 10^5\).

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

Если строго меньше \(20\%\) всех городов являются интересными, выведите \(-1\). Иначе, пусть \(k\) равно количеству интересных городов. Выведите \(k\) различных целых чисел в порядке возрастания — номера интересных городов.

Примечание

На всех иллюстрациях, если город интересный, он помечен зеленым, а иначе — красным.

В первом наборе входных данных, все города интересные.

Во втором наборе входных данных, ни один город не интересен.

В третьем наборе входных данных, города \(1\), \(2\), \(3\) и \(5\) интересные.

В четвертом наборе входных данных, только город \(1\) является интересным. Это строго меньше, чем \(20\%\) всех городов, поэтому ответ \(-1\).

E. Перестановка дерева

Деревья дп жадные алгоритмы поиск в глубину и подобное *2000

У Ashish есть дерево, состоящее из \(n\) вершин, пронумерованных от \(1\) до \(n\), с корнем в вершине \(1\). \(i\)-я вершина дерева имеет стоимость \(a_i\), и в ней записана бинарная цифра \(b_i\). Ashish хочет, чтобы в конце в \(i\)-й вершине была записана бинарная цифра \(c_i\).

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

  • Выберите любые \(k\) вершин из поддерева любой вершины \(u\) и переставьте цифры в этих вершинах так, как пожелаете, за стоимость \(k \cdot a_u\). Здесь он может выбрать \(k\) в диапазоне от \(1\) до размера поддерева \(u\).

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

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

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

Первая строка содержит одно целое число \(n\) \((1 \le n \le 2 \cdot 10^5)\), обозначающее количество вершин в дереве.

\(i\)-я из следующих \(n\) строк содержит 3 разделенных пробелом целых числа \(a_i\), \(b_i\), \(c_i\) \((1 \leq a_i \leq 10^9, 0 \leq b_i, c_i \leq 1)\) — стоимость \(i\)-й вершины, ее начальная цифра и желаемая цифра.

Каждая из следующих строк \(n - 1\) содержит два целых числа \(u\), \(v\) \((1 \leq u, v \leq n, \text{ } u \ne v)\), что означает, что между вершинами \(u\) и \(v\) в дереве есть ребро.

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

Выведите минимальную общую стоимость, за которую можно сделать так, чтобы в каждой вершине была записана желаемая цифра для этой вершины, или \(-1\), если сделать это невозможно.

Примечание

Дерево, соответствующие примерам \(1\) и \(2\):

В примере \(1\) мы можем выбрать вершину \(1\) и \(k = 4\) за стоимость \(4 \times 1\) = \(4\) и выбрать вершины \({1, 2, 3, 5}\), переставить их цифры и получить желаемые цифры в каждой позиции.

В примере \(2\) мы можем выбрать вершину \(1\) и \(k = 2\) за стоимость \(10000 \times 2\), выбрать вершины \({1, 5}\), обменять их цифры, после чего аналогичным образом выбрать вершину \(2\) и \(k = 2\) за стоимость \(2000 \times 2\) и вершины \({2, 3}\), обменять их цифры, чтобы получить нужные цифры в каждой позиции.

В примере \(3\) невозможно получить нужные цифры, потому что среди начальных цифр нет цифры \(1\).

D. Последнее следствие Ехаба

графы Деревья жадные алгоритмы Конструктив поиск в глубину и подобное реализация *2100

Для связного неориентированного графа с \(n\) вершинами и целого числа \(k\), вы должны, на ваш выбор:

  • или найти независимое множество с ровно \(\lceil\frac{k}{2}\rceil\) вершинами.
  • или найти простой цикл длины не более \(k\).

Независимое множество  — это набор вершин такой, что никакие две из них не связаны ребром. Простой цикл  — это цикл, который не содержит ни одной вершины дважды.

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

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

Первая строка содержит три целых числа \(n\), \(m\), and \(k\) (\(3 \le k \le n \le 10^5\), \(n-1 \le m \le 2 \cdot 10^5\)) — количество вершин и ребер в графе и параметр \(k\) из условия.

Каждая из следующих \(m\) строк содержит два целых числа \(u\) и \(v\) (\(1 \le u,v \le n\)), которые обозначают, что между вершинами \(u\) и \(v\) есть ребро. Гарантируется, что граф связен и не содержит петель или кратных ребер.

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

Если вы решили решить первую задачу, то в первой строке выведите \(1\), а затем строку, содержащую \(\lceil\frac{k}{2}\rceil\) различных целых чисел, не превышающих \(n\)  — вершины в желаемом независимом наборе.

Если же вы решили решить вторую задачу, то в первой строке выведите \(2\), затем строку, содержащую одно целое число, \(c\), представляющее длину найденного цикла, а затем строку, содержащую \(c\) различных целых чисел, не превышающих \(n\) — вершины в нужном цикле, в порядке их появления в цикле.

Примечание

В первом примере:

Обратите внимание, что вывод независимого множества \(\{2,4\}\) тоже зачтется, но вывод цикла \(1-2-3-4\) — нет, потому что его длина должна быть не более \(3\).

Во втором примере:

Обратите внимание, что вывод независимого множества \(\{1,3\}\) или цикла \(2-1-4\) также зачтутся.

В третьем примере:

В четвертом примере:

D. Решить лабиринт

графы жадные алгоритмы Конструктив кратчайшие пути поиск в глубину и подобное реализация снм *1700

Vivek столкнулся с интересной задачей. У него есть лабиринт, который можно описать таблицей \(n \times m\). Каждая клетка может быть одного из следующих типов:

  • Пустая — '.'
  • Стена — '#'
  • Хороший человек  — 'G'
  • Плохой человек — 'B'

Единственный выход из лабиринта находится в клетке \((n, m)\).

Человек может перейти в клетку если она не содержит стену и она имеет общую сторону с его текущей клеткой. Vivek хочет заблокировать (заменить на стены) некоторые пустые клетки, чтобы все хорошие люди могли дойти до выхода из лабиринта, но чтобы все плохие люди не могли. Клетку которая исходно содержит 'G' или 'B' нельзя блокировать, но через нее можно проходить.

Ваша задача  — определить, можно ли заменить несколько (ноль или более) пустых клеток на стены, чтобы удовлетворить описанным ограничениям.

Гарантируется, что клетка \((n,m)\) пустая. Vivek разрешается ее блокировать.

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

В первой строке записано одно целое число \(t\) \((1 \le t \le 100)\) — количество наборов входных данных. Далее следуют описания наборов входных данных.

В первой строке каждого набора входных данных записаны два целых числа \(n\), \(m\) \((1 \le n, m \le 50)\) — количество строк и столбцов в лабиринте.

В каждой из следующих \(n\) строк записаны \(m\) символов. Они описывают исходный лабиринт. Если символ в строке равен '.', тогда соответствующая клетка пустая, если символ равен '#', тогда клетка содержит стену, а 'G' и 'B' обозначают, что клетка содержит хорошего или плохого человека, соответственно.

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

Для каждого набора входных данных, выведите «Yes» или «No», в зависимости от того, можно ли заменить некоторые пустые клетки на стены, чтобы удовлетворить описанным ограничениям.

Вы можете выводить каждую букву в любом регистре (верхнем или нижнем).

Примечание

В первом и во втором наборах входных данных все условия уже выполнены.

В третьем наборе входных данных есть только одна свободная клетка \((2,2)\), и если мы заменим ее на стену, то хороший человек в клетке \((1,2)\) не сможет выйти.

В четвертом наборе входных данных хороший человек в клетке \((1,1)\) не может сбежать с самого начала, поэтому ответ «No».

В пятом наборе входных данных можно заблокировать клетки \((2,3)\) и \((2,2)\).

В последнем наборе входных данных можно заблокировать выход \((2, 2)\).

E. Сборка ожерелья

графы дп жадные алгоритмы Перебор поиск в глубину и подобное теория чисел *1900

В магазине продаются \(n\) бусинок. Цвет каждой бусинки описывается строчной буквой латинского алфавита («a»–«z»). Вы хотите купить какие-то бусинки, чтобы собрать из них ожерелье.

Ожерелье — набор бусинок, соединенных по кругу.

Например, если в магазине продаются бусинки «a», «b», «c», «a», «c», «c», то вы можете собрать следующие ожерелья (это не все возможные варианты):

А следующие ожерелья нельзя собрать из бусинок, которые продаются в магазине:

Первое ожерелье собрать не получится, потому что в нем есть три бусинки «a» (из двух доступных). Второе ожерелье собрать не получится, потому что в нем есть бусинка «d», которой нет в магазине.

Назовем ожерелье \(k\)-красивым, если при его повороте по часовой стрелке на \(k\) бусинок ожерелье остается неизменным. Например, вот последовательность из трех поворотов некоторого ожерелья.

Так как после трех поворотов по часовой стрелке ожерелье не изменилось, то оно является \(3\)-красивым. Как можно заметить, это ожерелье также является \(6\)-красивым, \(9\)-красивым и так далее, но не является \(1\)-красивым или \(2\)-красивым.

В частности, ожерелье длины \(1\) является \(k\)-красивым для любого целого \(k\). Ожерелье, которое состоит из бусинок одинакового цвета, тоже является красивым для любого \(k\).

Вам даны числа \(n\) и \(k\), а также строка \(s\), содержащая \(n\) строчных букв латинского алфавита — каждая буква задает бусинку в магазине. Вы можете купить любое подмножество бусинок и соединить их в произвольном порядке. Найдите максимальную длину \(k\)-красивого ожерелья, которое вы можете собрать.

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

В первой строке записано одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов тестовых данных в тесте. Далее следуют \(t\) наборов тестовых данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(k\) (\(1 \le n, k \le 2000\)).

Вторая строка каждого набора содержит строку \(s\), содержащую \(n\) строчных букв латинского алфавита — набор бусинок в магазине.

Гарантируется, что сумма \(n\) по всем наборам тестовых данных в тесте не превосходит \(2000\).

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

Выведите \(t\) ответов на наборы тестовых данных. Каждый ответ является целым положительным числом — максимальной длиной \(k\)-красивого ожерелья, которое вы можете собрать.

Примечание

Первый набор тестовых данных разобран в условии.

Во втором наборе тестовых данных \(6\)-красивое ожерелье можно собрать из всех букв.

В третьем наборе тестовых данных \(1000\)-красивое ожерельем можно собрать, например, из бусинок «abzyo».

E. ВыживатеЛи

жадные алгоритмы поиск в глубину и подобное реализация сортировки Структуры данных *2400

Ли приобрел некоторой еды на обед, но приглашать друзей Ли на обед смертельно опасно. Ли напуган, он не хочет умирать, хотя бы пока не увидит Online IOI 2020...

Всего есть \(n\) различных видов еды и \(m\) лучших друзей Ли. У Ли есть \(w_i\) тарелок \(i\)-го вида еды, и у каждого друга Ли есть два любимых вида еды: любимые блюда \(i\)-го друга — это \(x_i\) и \(y_i\) (\(x_i \ne y_i\)).

Ли начнет вызывать своих друзей по одному. Каждый, кого вызвали, пойдет на кухню и попытается съесть по одной тарелке каждого из его любимых видов еды. Каждый друг зайдет на кухню ровно один раз.

Но проблема в следующем: если друг съест хотя бы одну тарелку еды (суммарно), то он станет абсолютно безвреден. Но если другу нечего есть (не осталось ни \(x_i\), ни \(y_i\)), то он съест самого Ли \(\times\_\times\).

Ли может выбрать, в каком порядке приглашать друзей, а потому Ли хочет понять, может ли он пережить ужин или нет. Также его интересует непосредственно сам порядок.

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

В первой строке заданы два целых числа \(n\) и \(m\) (\(2 \le n \le 10^5\); \(1 \le m \le 2 \cdot 10^5\)) — количество видов еды и количество друзей Ли.

Во второй строке заданы \(n\) целых чисел \(w_1, w_2, \ldots, w_n\) (\(0 \le w_i \le 10^6\)) — количество тарелок с едой каждого вида.

В \(i\)-й строке из следующих \(m\) строк заданы два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\); \(x_i \ne y_i\)) — любимые виды еды \(i\)-го друга.

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

Если Ли может пережить обед, выведите ALIVE (регистр букв не важен), иначе выведите DEAD (регистр не важен).

Также, если он может пережить обед, выведите порядок, в котором Ли следует вызывать друзей. Если существует несколько возможных порядков, выведите любой из них.

Примечание

В первом примере, любой из следующих порядков друзей будет корректным: \([1, 3, 2]\), \([3, 1, 2]\), \([2, 3, 1]\), \([3, 2, 1]\).

Во втором примере, Ли следует вызвать второго друга первым (тогда он съест тарелку еды \(1\)), а потом и первого друга (этот друг съесть тарелку еды \(2\)). Если же Ли вызовет сначала первого друга, то он съесть по одной тарелке еды \(1\) и \(2\), а следовательно другому другу ничего не останется.

F. ПобедитеЛи

дп игры поиск в глубину и подобное *2700

Ли предпочитает завершать свои истории стильно, но не в этот раз. Благо, Белый Медведь успел придти к нему на помощь. В благодарность, Ли решил показать Белому его новую игру под названием «Critic»...

Данная игра — один на один. Она состоит из \(t\) раундов, каждый раунд определяется двумя целыми числами \(s_i\) и \(e_i\) (которые определены заранее и известны перед началом игры, \(s_i\) и \(e_i\) могут отличаться от раунда к раунду). В начале соответствующего раунда число \(s_i\) написано на доске.

Игроки ходят по очереди. Каждый игрок стирает число на доске (назовем его \(a\)) и выбирает, что написать: \(2 \cdot a\) или \(a + 1\). Тот, кто напишет на доске число строго больше чем \(e_i\), проигрывает.

Сейчас Ли хочет сыграть в «Critic» против Белого, и для каждого раунда он уже выбрал соответствующие \(s_i\) и \(e_i\). Ли начинает первый раунд, и проигравший текущего раунда будет начинать в следующем раунде.

Победитель последнего раунда считается победителем всей игры, а проигравший, соответственно, проигравшим всей игры.

Определите, может ли Ли победить независимо от действий Белого. Также, определите, может ли он проиграть независимо от действий Белого.

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

В первой строке задано единственное целое число \(t\) (\(1 \le t \le 10^5\)) — количество раундов в игре.

В следующих \(t\) строках заданы по два целых числа \(s_i\) и \(e_i\) (\(1 \le s_i \le e_i \le 10^{18}\)) — информация про \(i\)-й раунд.

Раунды играются в том порядке, как они заданы во входных данных, \(s_i\) и \(e_i\) для всех раундов известны всем до начала игры.

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

Выведите два числа.

Первым числом выведите 1, если Ли может победить независимо от действий Белого, иначе выведите 0.

Вторым числом выведите 1, если Ли может проиграть независимо от действий Белого, иначе выведите 0.

Примечание

Напоминаем, проигрывает тот, кто напишет число строго больше чем \(e_i\).

F1. Загадана пара вершин (простая версия)

Бинарный поиск графы Деревья интерактив кратчайшие пути поиск в глубину и подобное *2400

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

Это интерактивная задача.

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

  • Вы даете список вершин дерева и в результате получаете вершину из списка, сумма растояний от которой до двух загаданных вершин минимально (если таких вершин в списке несколько, вы получите одну из них). Вы также получите сумму расстояний от этой вершины до двух загаданных вершин.

Напомним, что деревом называется связный граф без циклов. Расстоянием между двумя вершинами называется количество ребер, лежащих на простом пути между ними.

Более формально, пусть две загаданные вершины это \(s\) и \(f\). За один запрос, вы можете дать множество вершин \(\{a_1, a_2, \ldots, a_c\}\) дерева. В результате вы получите два числа \(a_i\) и \(dist(a_i, s) + dist(a_i, f)\). Вершина \(a_i\) является любой вершиной из данного вами множества, для которой число \(dist(a_i, s) + dist(a_i, f)\) минимально.

Вы можете сделать не более \(14\) запросов.

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

В первой строке находится единственное целое число \(t\) \((1 \leq t \leq 10)\) — количество наборов входных данных. Обратите внимание на то, как организован процесс взаимодействия.

В первой строке каждого набора входных данных находится единственное целое число \(n\) \((2 \le n \le 1000)\) — количество вершин дерева.

В следующих \(n - 1\) строках находится по два целых числа \(u\), \(v\) \((1 \le u, v \le n, u \ne v)\) — ребра дерева.

Протокол взаимодействия

Для того, чтобы сделать запрос, выведите единственную строку в следующем формате:

  • В начале строки выведите «? c » (без кавычек), где \(c\) \((1 \leq c \leq n)\) равно количеству вершин в списке, про который вы хотите сделать запрос. После этого должны следовать \(c\) различных целых чисел из отрезка \([1, n]\)  — номера вершин из списка.

В ответ на запрос, вы получите два целых числа \(x\), \(d\)  — вершина (из вершин из списка из запроса) с минимальной суммой расстояний до двух загаданных вершин и сумма расстояний от этой вершины до двух загаданных вершин. Если список вершин в запросе некорректный или вы превысили лимит на количество запросов, вы получите \(x = d = -1\). В этом случае, вы должны завершить вашу программу немедленно.

После того, как вы угадаете загаданные вершины, выведите единственную строку «! » (без кавычек). После этого выведите два целых числа из отрезка \([1, n]\)  — загаданные вершины. Вы можете выводить их в любом порядке.

После этого, вы должны считать строку. Если вы угадали вершины правильно, вы получите строку «Correct». В этом случае вы должны продолжить решать оставшиеся наборы входных данных или завершить программу, если все наборы входных данных были решены. Иначе, вы получите строку «Incorrect». В этом случае, вы должны завершить программу немедленно.

Запрос угадывания загаданных вершин не считается в количестве сделанных запросов.

Интерактор не адаптивный. Загаданные вершины не меняются во время запросов.

Не забывайте считать строку «Correct» / «Incorrect» после запроса угадывания вершин.

Вы должны решить набор входных данных перед получением входных данных следующего набора входных данных.

Ограничение на \(14\) запросов существует для каждого набора входных данных по отдельности, а не для всех входных данных вместе.

После вывода запроса, не забывайте выводить символ переноса строки и сбрасывать буфер выходного потока. Иначе, вы получите вердикт Idleness limit exceeded. Чтобы это сделать, используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • обратитесь к документации для других языков.

Взломы

Чтобы сделать взлом, используйте следующий формат теста:

В первой строке должно находиться единственное целое число \(t\) \((1 \leq t \leq 10)\) — количество наборов входных данных. Затем должно следовать описание наборов входных данных.

Первая строка каждого набора входных данных должна содержать единственное целое число \(n\) \((2 \le n \le 1000)\) — количество вершин в дереве. Во второй строке должно находиться два различных целых числа из отрезка \([1, n]\) — загаданные вершины. Следующая \(n - 1\) строка должна содержать по два целых числа \(u\), \(v\) \((1 \le u, v \le n, u \ne v)\) — ребра дерева.

Примечание

Дерево из первого теста изображено на картинке, загаданные вершины \(1\) и \(3\).

F2. Загадана пара вершин (сложная версия)

Бинарный поиск графы Деревья интерактив кратчайшие пути поиск в глубину и подобное *2700

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

Это интерактивная задача.

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

  • Вы даете список вершин дерева и в результате получаете вершину из списка, сумма растояний от которой до двух загаданных вершин минимально (если таких вершин в списке несколько, вы получите одну из них). Вы также получите сумму расстояний от этой вершины до двух загаданных вершин.

Напомним, что деревом называется связный граф без циклов. Расстоянием между двумя вершинами называется количество ребер, лежащих на простом пути между ними.

Более формально, пусть две загаданные вершины это \(s\) и \(f\). За один запрос, вы можете дать множество вершин \(\{a_1, a_2, \ldots, a_c\}\) дерева. В результате вы получите два числа \(a_i\) и \(dist(a_i, s) + dist(a_i, f)\). Вершина \(a_i\) является любой вершиной из данного вами множества, для которой число \(dist(a_i, s) + dist(a_i, f)\) минимально.

Вы можете сделать не более \(11\) запросов.

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

В первой строке находится единственное целое число \(t\) \((1 \leq t \leq 10)\) — количество наборов входных данных. Обратите внимание на то, как организован процесс взаимодействия.

В первой строке каждого набора входных данных находится единственное целое число \(n\) \((2 \le n \le 1000)\) — количество вершин дерева.

В следующих \(n - 1\) строках находится по два целых числа \(u\), \(v\) \((1 \le u, v \le n, u \ne v)\) — ребра дерева.

Протокол взаимодействия

Для того, чтобы сделать запрос, выведите единственную строку в следующем формате:

  • В начале строки выведите «? c » (без кавычек), где \(c\) \((1 \leq c \leq n)\) равно количеству вершин в списке, про который вы хотите сделать запрос. После этого должны следовать \(c\) различных целых чисел из отрезка \([1, n]\)  — номера вершин из списка.

В ответ на запрос, вы получите два целых числа \(x\), \(d\)  — вершина (из вершин из списка из запроса) с минимальной суммой расстояний до двух загаданных вершин и сумма расстояний от этой вершины до двух загаданных вершин. Если список вершин в запросе некорректный или вы превысили лимит на количество запросов, вы получите \(x = d = -1\). В этом случае, вы должны завершить вашу программу немедленно.

После того, как вы угадаете загаданные вершины, выведите единственную строку «! » (без кавычек). После этого выведите два целых числа из отрезка \([1, n]\)  — загаданные вершины. Вы можете выводить их в любом порядке.

После этого, вы должны считать строку. Если вы угадали вершины правильно, вы получите строку «Correct». В этом случае вы должны продолжить решать оставшиеся наборы входных данных или завершить программу, если все наборы входных данных были решены. Иначе, вы получите строку «Incorrect». В этом случае, вы должны завершить программу немедленно.

Запрос угадывания загаданных вершин не считается в количестве сделанных запросов.

Интерактор не адаптивный. Загаданные вершины не меняются во время запросов.

Не забывайте считать строку «Correct» / «Incorrect» после запроса угадывания вершин.

Вы должны решить набор входных данных перед получением входных данных следующего набора входных данных.

Ограничение на \(11\) запросов существует для каждого набора входных данных по отдельности, а не для всех входных данных вместе.

После вывода запроса, не забывайте выводить символ переноса строки и сбрасывать буфер выходного потока. Иначе, вы получите вердикт Idleness limit exceeded. Чтобы это сделать, используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • обратитесь к документации для других языков.

Взломы

Чтобы сделать взлом, используйте следующий формат теста:

В первой строке должно находиться единственное целое число \(t\) \((1 \leq t \leq 10)\) — количество наборов входных данных. Затем должно следовать описание наборов входных данных.

Первая строка каждого набора входных данных должна содержать единственное целое число \(n\) \((2 \le n \le 1000)\) — количество вершин в дереве. Во второй строке должно находиться два различных целых числа из отрезка \([1, n]\) — загаданные вершины. Следующая \(n - 1\) строка должна содержать по два целых числа \(u\), \(v\) \((1 \le u, v \le n, u \ne v)\) — ребра дерева.

Примечание

Дерево из первого теста изображено на картинке, загаданные вершины \(1\) и \(3\).

G. Изменение дерева

графы Деревья Конструктив Паросочетания Перебор поиск в глубину и подобное *2800

Вам дано дерево с \(n\) вершинами. Вы можете изменить строение дерева с помощью следующей многошаговой операции:

  1. Выберите три вершины \(a\), \(b\) и \(c\) такие, чтобы \(b\) соединена ребром и с \(a\) и с \(c\).
  2. Для каждой вершины \(d\) кроме \(b\), которая соединена ребром с \(a\), удалите ребро, соединяющее \(d\) и \(a\), и добавьте ребро, соединяющее \(d\) и \(c\).
  3. Удалите ребро, соединяющее \(a\) и \(b\), и добавьте ребро, соединяющее \(a\) и \(c\).

В качестве примера рассмотрим следующее дерево:

Следующая диаграмма иллюстрирует последовательность шагов, которые происходят, когда мы применяем операцию к вершинам \(2\), \(4\) и \(5\):

Можно доказать, что после каждой операции полученный граф все еще является деревом.

Найдите минимальное количество операций, которые необходимо выполнить, чтобы превратить дерево в звезду. Звезда  — это дерево с одной вершиной степени \(n - 1\), называемой его центром, и \(n - 1\) вершинами степени \(1\).

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

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

\(i\)-я из следующих \(n - 1\) строк содержит два целых числа \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\), \(u_i \neq v_i\)), обозначающих существование ребра, соединяющего вершины \(u_i\) и \(v_i\). Гарантируется, что данные ребра образуют дерево.

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

Выведите единственное целое число  — минимальное количество операций, необходимое для преобразования дерева в звезду.

Можно доказать, что при данных ограничениях всегда можно превратить дерево в звезду, используя не более \(10^{18}\) операций.

Примечание

Первый пример соответствует дереву из условия. Как мы уже видели, мы можем превратить дерево в звезду с центром в вершине \(5\), применив одну операцию к вершинам \(2\), \(4\) и \(5\).

Во втором тестовом примере данное дерево уже является звездой с центром в вершине \(4\), поэтому никаких операций выполнять не нужно.

C. Выбор цветов для букета

Бинарный поиск дп жадные алгоритмы Перебор поиск в глубину и подобное сортировки Структуры данных *2000

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

Придя в цветочный магазин, Володя обнаружил, что букет можно составлять из цветов \(m\) различных видов, причём количество цветов каждого вида не ограничено. Володя знает, что от первого цветка \(i\)-го вида в букете его супруга становится счастливее на \(a_i\), а от каждого следующего цветка такого вида она становится счастливее на \(b_i\). То есть, если в букете \(x_i > 0\) цветов вида \(i\), то за цветы этого вида жена Володи становится счастливее на \(a_i + (x_i - 1) \cdot b_i\) (а в случае, если цветов типа \(i\) в букете не будет, счастье жены Володи из-за цветов этого типа не изменится).

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

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

В первой строке задано одно целое число \(t\) (\(1 \leq t \leq 10\,000\)) — количество наборов входных данных. Затем следует описание \(t\) наборов входных данных, каждый из которых задан следующим образом.

В первой строке набора записаны два целых числа \(n\) и \(m\) (\(1 \le n \le 10^9\), \(1 \le m \le 100\,000\)) — требуемое количество цветов в букете и количество доступных видов цветов.

Каждая из следующих \(m\) строк описывает вид цветов и содержит два целых числа \(a_i\) и \(b_i\) (\(0 \le a_i, b_i \le 10^9\)) — увеличение счастья от первого цветка \(i\)-го вида и увеличение счастья от каждого последующего цветка этого вида.

Наборы разделены одной пустой строкой.

Гарантируется, что сумма \(m\) по всем наборам входных данных не превосходит \(100\,000\).

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

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

Примечание

В первом примере если взять 1 цветок первого типа и 3 цветка второго типа, то итоговое увеличение счастья от букета будет равно \(5 + (1 + 2 \cdot 4) = 14\).

В втором примере если взять 2 цветка первого типа, 2 цветка второго типа и 1 цветок третьего типа, то итоговое увеличение счастья от букета будет равно \((5 + 1 \cdot 2) + (4 + 1 \cdot 2) + 3 = 16\).

D. Величественная коричневая древесная змея

Деревья дп жадные алгоритмы поиск в глубину и подобное *3000

Существует неориентированное дерево, состоящее из \(n\) вершин, соединенных \(n-1\) двусторонним ребром. Также есть змея, находящаяся внутри этого дерева. Ее голова находится в вершине \(a\) и ее хвост находится в вершине \(b\). Тело змеи занимает все вершины на простом пути между вершинами \(a\) и \(b\).

Змея хочет узнать, может ли она развернуться, то есть переместить свою голову в вершину, где начинался хвост и переместить свой хвост в вершину, где начиналась голова. К сожалению, движения змеи ограничены структурой дерева.

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

Будем обозначать позицию змеи, как \((h,t)\), где \(h\)  — это номер вершины дерева, в которой находится голова и \(t\)  — номер вершины дерева, где находится хвост. Змея сможет развернуться с помощью последовательности операций \((4,7)\to (5,1)\to (4,2)\to (1, 3)\to (7,2)\to (8,1)\to (7,4)\).

Определите, сможет ли змея развернуться с помощью некоторой последовательности операций.

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

В первой строке находится единственное целое число \(t\) (\(1\le t\le 100\))  — количество наборов входных данных. Следующие строки содержат описания наборов входных данных.

В первой строке каждого набора входных данных находится три целых числа \(n,a,b\) (\(2\le n\le 10^5,1\le a,b\le n,a\ne b\)).

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

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

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

Для каждого набора входных данных выведите «YES», если змея может развернуть себя и «NO», иначе.

Примечание

Первый набор входных данных изображен на картинке в тексте условия задачи.

Во втором наборе входных данных дерево имеет форму пути. Можно показать, что змея не сможет развернуться.

В третьем наборе входных данных, можно показать, что змея не сможет развернуться.

В четвертом наборе входных данных пример последовательности операций:

\((15,12)\to (16,11)\to (15,13)\to (10,14)\to (8,13)\to (4,11)\to (1,10)\)

\(\to (2,8)\to (3,4)\to (2,5)\to (1,6)\to (4,7)\to (8,6)\to (10,5)\)

\(\to (11,4)\to (13,8)\to (14,10)\to (13,15)\to (11,16)\to (12,15)\).

E. Ориентация ребер

графы Конструктив поиск в глубину и подобное *2000

Вам задан граф, состоящий из \(n\) вершин и \(m\) ребер. Не гарантируется, что заданный граф связен. Некоторые ребра уже ориентированы и вы не можете менять их направление. Остальные ребра являются неориентированными и вам необходимо выбрать какое-то направление для всех этих ребер.

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

Вам необходимо ответить на \(t\) независимых наборов тестовых данных.

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

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 2 \cdot 10^4\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Первая строка набора тестовых данных содержит два целых числа \(n\) и \(m\) (\(2 \le n \le 2 \cdot 10^5\), \(1 \le m \le min(2 \cdot 10^5, \frac{n(n-1)}{2})\)) — количество вершин и количество ребер в графе, соответственно.

Следующие \(m\) строк описывают ребра графа. \(i\)-е ребро представлено тройкой целых чисел \(t_i\), \(x_i\) и \(y_i\) (\(t_i \in [0; 1]\), \(1 \le x_i, y_i \le n\)) — типом ребра (\(t_i = 0\), если ребро является неориентированным, и \(t_i = 1\), если ребро является ориентированным) и вершинами, которые соединяет это ребро (неориентированное ребро соединяет вершины \(x_i\) и \(y_i\), а ориентированное ребро идет из вершины \(x_i\) в вершину \(y_i\)). Гарантируется, что граф не содержит петель (ребер, идущих из вершину в саму себя) и кратных ребер (то есть для каждой пары (\(x_i, y_i\)) не существует других пар (\(x_i, y_i\)) или (\(y_i, x_i\))).

Гарантируется, что сумма \(n\) и сумма \(m\) не превосходят \(2 \cdot 10^5\) (\(\sum n \le 2 \cdot 10^5\); \(\sum m \le 2 \cdot 10^5\)).

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

Выведите ответ на каждый набор тестовых данных — «NO», если невозможно ориентировать неориентированные ребра таким образом, чтобы получившийся граф был ориентированным и ацикличным, иначе выведите «YES» в первой строке, а затем \(m\) строк, описывающие ребра получившегося ориентированного ацикличного графа (в любом порядке). Заметьте, что вы не можете менять направление уже ориентированных ребер. Если существует несколько ответов, выведите любой.

Примечание

Объяснение второго набора тестовых данных примера:

Объяснение третьего набора тестовых данных примера:

G. Перевороты столбцов

2-sat графы поиск в глубину и подобное реализация снм *2300

Вам дана таблица \(a\) размера \(2 \times n\) (из двух строк и \(n\) столбцов), состоящая из целых чисел от \(1\) до \(n\).

За один ход вы можете выбрать какой-то столбец \(j\) (\(1 \le j \le n\)) и обменять местами значения \(a_{1, j}\) и \(a_{2, j}\). Каждый столбец может быть выбран не более одного раза.

Ваша задача — найти минимальное количество ходов, необходимое для того, чтобы получить перестановки размера \(n\) в первой и во второй строках, или же определить, что это сделать невозможно.

Вам необходимо ответить на \(t\) независимых наборов тестовых данных.

Напомним, что перестановкой размера \(n\) называется такой массив размера \(n\), который содержит каждое целое число от \(1\) до \(n\) ровно один раз (порядок элементов не важен).

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

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 2 \cdot 10^4\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Первая строка набора тестовых данных содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество столбцов в таблице. Вторая строка набора входных данных содержит \(n\) целых чисел \(a_{1, 1}, a_{1, 2}, \dots, a_{1, n}\) (\(1 \le a_{1, i} \le n\)), где \(a_{1, i}\) — это \(i\)-й элемент первой строки таблицы. Третья строка набора входных данных содержит \(n\) целых чисел \(a_{2, 1}, a_{2, 2}, \dots, a_{2, n}\) (\(1 \le a_{2, i} \le n\)), где \(a_{2, i}\) — это \(i\)-й элемент второй строки таблицы.

Гарантируется, что сумма \(n\) не превосходит \(2 \cdot 10^5\) (\(\sum n \le 2 \cdot 10^5\)).

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

Выведите ответ на каждый набор тестовых данных: -1, если невозможно получить перестановки размера \(n\) в первой и второй строках таблицы, или же одно целое число \(k\) в первой строке, где \(k\) равно минимальному количеству ходов, необходимому для получения перестановок в обеих строках, а затем \(k\) различных целых чисел \(pos_1, pos_2, \dots, pos_k\) во второй строке (\(1 \le pos_i \le n\)) в любом порядке — индексы столбцов, в которых вам необходимо обменять значения местами для получения перестановок в обеих строках. Если существует несколько ответов, выведите любой.

A. Граф

*особая задача Бинарный поиск дп математика поиск в глубину и подобное Тернарный поиск *2100

Дан неориентированный граф, в котором каждое ребро покрашено либо в чёрный цвет, либо в красный цвет.

Ваша задача присвоить каждой вершине по вещественному числу таким образом, что:

  • сумма чисел на обеих концах каждого чёрного ребра равна \(1\);
  • сумма чисел на обеих концах каждого красного ребра равна \(2\);
  • сумма модулей всех присвоенных чисел наименьшая возможная.

Если это не возможно, выведите, что не существует такого комплекта чисел.

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

Первая строка содержит два целых числа \(N\) (\(1 \leq N \leq 100\,000\)) и \(M\) (\(0 \leq M \leq 200\,000\)): количество вершин и рёбер, соответственно. Вершины пронумерованы последовательными числами \(1, 2, \ldots, N\).

Следующие \(M\) строк содержат описание рёбер. Каждая строка содержит три целых числа \(a\), \(b\) и \(c\), которые обозначают, что между вершинами \(a\) и \(b\) (\(1 \leq a, b \leq N\)) есть ребро цвета \(c\) (\(1\) обозначает чёрное, \(2\) обозначает красное).

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

Если решение существует, выведите в первой строке слово «YES» и во второй строке выведите \(N\) чисел. Для каждого \(i\) (\(1 \le i \le N\)), \(i\)-е из этих чисел должно равняться числу, присвоенному вершине с номером \(i\).

Вывод должен соответствовать следующим ограничениям точности:

  • сумма чисел на концах каждого ребра должна отличаться от нужной суммы для этого ребра меньше, чем на \(10^{-6}\);
  • сумма модулей всех присвоенных чисел отличается от наименьшего возможного меньше, чем на \(10^{-6}\).

Если существует несколько решений, выведите любое из них.

Если решения не существует, выведите одно слово «NO».

Система оценки

Подзадачи:

  1. (5 баллов) \(N \leq 5\), \(M \leq 14\)
  2. (12 баллов) \(N \leq 100\)
  3. (17 баллов) \(N \leq 1000\)
  4. (24 баллов) \(N \leq 10\,000\)
  5. (42 баллов) Без дополнительных ограничений.
Примечание

Примите во внимание, что во втором примере решение не уникальное.

B2. Посёлок (Максимум)

*особая задача Деревья поиск в глубину и подобное *2500

Эта задача разбита на две. В данной задаче, вам нужно найти максимальный ответ. В задаче же Посёлок (Минимум) вам нужно найти минимальный возможный ответ. За каждую из этих задач можно получить по \(50\) баллов.

В одном посёлке люди живут в \(N\) домах. В каждом доме живёт ровно один житель. Дома соединены дорогами. Каждая дорога соединяет два дома и имеет длину \(1\) км. Из каждого дома можно достичь любой другой дом, идя по одной или нескольким дорогам. В общем в посёлке ровно \(N-1\) дорог.

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

Пример посёлка с семью домами

Например, если всего есть семь домов, соединённых дорогами так, как показано на рисунке, то наибольшая общая длина равняется \(18\) км (этого можно достичь, перемещая жителей \(1 \to 7\), \(2 \to 3\), \(3 \to 4\), \(4 \to 1\), \(5 \to 2\), \(6 \to 5\), \(7 \to 6\)).

Напишите программу, которая находит наибольшую возможную сумму кратчайших путей (в км), а также распределение жителей по новым домам.

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

Первая строка содержит одно целое число \(N\) (\(1 < N \le 10^5\)). Дома пронумерованы последовательными целыми числами \(1, 2, \ldots, N\).

Затем следуют \(N-1\) строк, которые описывают дороги. Каждая строка содержит два целых числа \(a\) и \(b\) (\(1 \le a, b \le N\), \(a \neq b\)), что означает, что дома с номерами \(a\) и \(b\) соединены дорогой.

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

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

Во второй строке опишите одно правильное распределение жителей по новым домам с наибольшей возможной общей длиной: \(N\) различных целых чисел \(v_1, v_2, \ldots, v_N\). Для каждого \(i\), \(v_i\) обозначает номер дома, в который должен переехать житель из дома с номером \(i\) (\(v_i \neq i\)). Если существует несколько распределений, выведите любое из них.

Система оценки

Подзадачи:

  1. (6 баллов) \(N \leq 10\)
  2. (19 баллов) \(N \leq 1\,000\)
  3. (25 баллов) Без дополнительных ограничений.

C. Дядя Богдан и настроение страны

Деревья жадные алгоритмы математика поиск в глубину и подобное *1800

Дядя Богдан, будучи матросом на корабле капитана Флинта, порой скучает по родине. Сегодня он рассказал о том, как в его государстве вводили индекс счастья населения.

Всего в стране \(n\) городов и \(n−1\) двусторонняя дорога, соединяющая некоторые пары городов. Из любого города можно попасть в любой другой, пройдя по некоторым дорогам. Города пронумерованы от \(1\) до \(n\) и город \(1\) является столицей. Таким образом, структура государства является корневым деревом.

Всего в стране проживает \(m\) человек. В \(i\)-м городе проживает \(p_i\) человек, но все работают в столице. После напряженного рабочего дня, каждый из жителей возвращается в свой город по кратчайшему пути.

У каждого жителя есть свое настроение: кто-то уходит с рабочего места в хорошем настроении, а у кого-то настроение уже испорчено. Более того, и по пути домой настроение жителя может испортиться. Если настроение человека испортилось, то оно уже не может улучшиться.

В каждом городе установлен детектор настроения — он отслеживает настроение каждого, кто побывал в этом городе. Детектор настроения \(i\)-го города считает индекс счастья \(h_i\) как количество человек в хорошем настроении минус количество в плохом. Для простоты будем считать, что настроение жителя внутри города не меняется.

Детектор настроения — это новая разработка и нет полной уверенности, что все приборы отработают должным образом. После того, как все жители страны добрались до своих городов, власти обратились к Дяде Богдану, лучшему программисту государства, с просьбой определить корректны ли данные индекса счастья всех городов или где-то закралась ошибка.

Дядя Богдан успешно справился с задачей. А удастся ли это Вам?

Более формально, Вам требуется определить: «Возможно ли, что, после возвращения всех жителей по домам, для каждого города \(i\) будет верно, что индекс счастья в этом городе в точности равен \(h_i\)».

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

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10000\)) — количество наборов входных данных.

В первой строке каждого набора заданы два целых числа \(n\) и \(m\) (\(1 \le n \le 10^5\); \(0 \le m \le 10^9\)) — количество городов и жителей в стране соответственно.

Во второй строке каждого набора заданы \(n\) целых чисел \(p_1, p_2, \ldots, p_{n}\) (\(0 \le p_i \le m\); \(p_1 + p_2 + \ldots + p_{n} = m\)), где \(p_i\) — численность населения города \(i\).

В третьей строке заданы \(n\) целых чисел \(h_1, h_2, \ldots, h_{n}\) (\(-10^9 \le h_i \le 10^9\)), где \(h_i\) — индекс счастья города \(i\).

В следующих \(n − 1\) строках заданы описания дорог, по одному в строке. В каждой строке заданы два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\); \(x_i \neq y_i\)), где \(x_i\) и \(y_i\) — номера городов, которые соединены \(i\)-й дорогой.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

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

Для каждого набора входных данных выведите YES, если все детекторы настроения исправны или NO — иначе. Буквы в словах YES и NO можно выводить в любом регистре.

Примечание

Рассмотрим первый набор входных данных первого теста:

Под конец рабочего дня все жители страны находятся в столице. Рассмотрим один из возможных вариантов развития событий:

  • житель города \(1\): живет в столице и его настроение не ухудшалось;
  • житель города \(4\): посетил города \(1\) и \(4\), настроение ухудшилось между городами \(1\) и \(4\);
  • житель города \(3\): посетил города \(1\) и \(3\) в хорошем настроении;
  • житель города \(6\): посетил города \(1\), \(3\) и \(6\), настроение ухудшилось между городами \(1\) и \(3\);
Таким образом,
  • \(h_1 = 4 - 0 = 4\),
  • \(h_2 = 0\),
  • \(h_3 = 1 - 1 = 0\),
  • \(h_4 = 0 - 1 = -1\),
  • \(h_5 = 0\),
  • \(h_6 = 0 - 1 = -1\),
  • \(h_7 = 0\).

Второй набор первого теста:

У всех жителей страны уже испортилось настроение в столице. Это единственный возможный вариант развития событий.

Первый набор второго теста:

Второй набор второго теста:

Можно показать, что требуемые значения индексов счастья недостижимы в обоих наборах второго теста.

D. Капитан Флинт и сокровище

графы Деревья жадные алгоритмы поиск в глубину и подобное реализация Структуры данных *2000

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

Заданы массивы \(a\) и \(b\) длины \(n\). Изначально, \(ans\) равен \(0\) и определена следующая операция:

  1. Выбрать позицию \(i\) (\(1 \le i \le n\));
  2. Добавить к \(ans\) значение \(a_i\);
  3. Если \(b_i \neq -1\), то добавить к \(a_{b_i}\) значение \(a_i\);

Какой максимальный \(ans\) можно получить, применив эту операцию к каждой позиции \(i\) (\(1 \le i \le n\)) ровно один раз?

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

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

В первой строке каждого набора задано одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длина массивов \(a\) и \(b\).

Во второй строке каждого набора задано \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(−10^6 \le a_i \le 10^6\)).

В третьей строке каждого набора задано \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) (\(1 \le b_i \le n\) или \(b_i = -1\)).

Дополнительное ограничение: гарантируется, что для \(i\) (\(1 \le i \le n\)) последовательность \(b_i, b_{b_i}, b_{b_{b_i}}, \ldots\) не зациклится, то есть будет всегда оканчиваться на \(-1\).

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

В первой строке выведите одно целое число, максимальный \(ans\), который можно получить.

Во второй строке опишите последовательность выполнения операций, чтобы получить этот максимальный ответ: \(n\) различных целых чисел \(p_1, p_2, \ldots, p_n\) (\(1 \le p_i \le n\)), где \(p_i\) обозначает позицию, операция над которой выполняется \(i\)-й по порядку. Если существует несколько таких последовательностей, выведите любою из них.

G. Выбираем направления

графы Деревья дп поиск в глубину и подобное *2800

Дан неориентированный связный граф, состоящий из \(n\) вершин и \(m\) ребер. \(k\) вершин этого графа — особенные.

Вы должны ориентировать каждое ребро графа (или оставить некоторые ребра неориентированными за дополнительную плату). Вы можете оставить \(i\)-е ребро неориентированным, заплатив \(w_i\) монет, или бесплатно ориентировать его.

Назовем вершину насыщенной, если она достижима из всех особенных вершин по ребрам графа (если ребро осталось неориентированным, по нему можно ходить в любом направлении). После того, как вы выберете направления для ребер графа (возможно, оставив некоторые неориентированными), вы получите \(c_i\) монет за каждую насыщенную вершину \(i\). То есть вашу итоговую прибыль можно посчитать по формуле \(\sum \limits_{i \in S} c_i - \sum \limits_{j \in U} w_j\), где \(S\) — множество насыщенных вершин, а \(U\) — множество ребер, оставшихся неориентированными.

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

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

В первой строке заданы три целых числа \(n\), \(m\) и \(k\) (\(2 \le n \le 3 \cdot 10^5\), \(n - 1 \le m \le \min(3 \cdot 10^5, \frac{n(n-1)}{2})\), \(1 \le k \le n\)).

Во второй строке заданы \(k\) попарно различных целых чисел \(v_1\), \(v_2\), ..., \(v_k\) (\(1 \le v_i \le n\)) — индексы специальных вершин.

В третьей строке заданы \(n\) целых чисел \(c_1\), \(c_2\), ..., \(c_n\) (\(0 \le c_i \le 10^9\)).

В четвертой строке заданы \(m\) целых чисел \(w_1\), \(w_2\), ..., \(w_m\) (\(0 \le w_i \le 10^9\)).

Затем следуют \(m\) строк, в \(i\)-й из которых заданы два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\), \(x_i \ne y_i\)) — концы \(i\)-го ребра.

Между каждой парой вершин существует не более одного ребра.

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

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

Примечание

Рассмотрим первый пример:

  • лучший способ насытить вершину \(1\) — направить ребра следующим образом: \(2 \to 1\), \(3 \to 2\); \(1\) — единственная насыщенная вершина, поэтому ответ равен \(11\);
  • лучший способ насытить вершину \(2\) — оставить ребро \(1-2\) неориентированным, а другое ребро направить так: \(3 \to 2\); \(1\) и \(2\) — насыщенные вершины, стоимость ребра \(1-2\) равна \(10\), поэтому ответ равен \(2\);
  • лучший способ насытить вершину \(3\) — направить ребра следующим образом: \(2 \to 3\), \(1 \to 2\); \(3\) — единственная насыщенная вершина, поэтому ответ равен \(5\).

Лучший план действий во втором примере — направить все ребра по циклу: \(1 \to 2\), \(2 \to 3\), \(3 \to 4\) и \(4 \to 1\). Таким образом, все вершины будут насыщенными.

E. Пары пар

графы Деревья жадные алгоритмы Конструктив поиск в глубину и подобное *2600

У вас есть простой связный неориентированный граф, состоящий из \(n\) вершин и \(m\) ребер.

Рассмотрим все способы разбить на пары некоторое подмножество из этих \(n\) вершин, чтобы ни одна вершина не присутствовала более чем в одной паре.

Такое паросочетание считается хорошим, если для каждой пары выбранных пар индуцированный подграф, содержащий все \(4\) вершины, по два из каждой пары, имеет не более \(2\) ребер (из \(6\) возможных ребер). Более формально, для любых двух выбранных пар \((a,b)\) и \((c,d)\) индуцированный подграф с вершинами \(\{a,b,c,d\}\) должен иметь не более \(2\) ребер.

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

Теперь сделайте одно из двух

  • Найдите простой путь, состоящий как минимум из \(\lceil \frac{n}{2} \rceil\) вершин. Здесь путь называется простым, если он не посещает какую-либо вершину несколько раз.
  • Найдите хорошее паросочетание, в котором по крайней мере у \(\lceil \frac{n}{2} \rceil\) вершин есть пара.

Можно показать, что в каждом графе, удовлетворяющим ограничениям из условия, можно найти или первое, или второе (или оба).

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

Каждый тест содержит несколько наборов входных данных. В первой строке записано количество наборов входных данных \(t\) (\(1 \le t \le 10^5\)). Описание наборов входных данных приведено ниже.

Первая строка каждого набора входных данных содержит \(2\) целых числа \(n, m\) (\(2 \le n \le 5\cdot 10^5\), \(1 \le m \le 10^6\)), обозначающих количество вершин и ребер графа соответственно.

Каждая из следующих \(m\) строк содержит \(2\) целых числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \neq v\)), что обозначает наличие неориентированного ребра между вершинами \(u\) и \(v\) в данном графе.

Гарантируется, что данный граф является связным и простым  — он не содержит кратных ребер и петель.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(5\cdot 10^5\).

Гарантируется, что сумма \(m\) по всем наборам входных данных не превышает \(10^6\).

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

Для каждого набора входных данных придерживайтесь следующего формата вывода:

Если вы нашли хорошее паросочетание, в первой строке выведите «PAIRING» (без кавычек).

  • Затем выведите \(k\) (\(\lceil \frac{n}{2} \rceil \le 2\cdot k \le n\)), количество пар в вашем паросочетании.
  • Затем в каждой из следующих \(k\) строк выведите по \(2\) целых числа \(a\) и \(b\)  —, обозначающих, что \(a\) и \(b\) находятся в одной паре. Заметьте, что в графе не обязано быть ребро между вершинами \(a\) и \(b\)!
  • Это паросочетание должно быть хорошим, и каждая вершина должен входить не более в \(1\) пару.

В противном случае в первой строке выведите «PATH» (без кавычек).

  • Затем выведите \(k\) (\(\lceil \frac{n}{2} \rceil \le k \le n\)), количество узлов на вашем пути.
  • Затем во второй строке выведите \(k\) целых чисел, \(v_1, v_2, \ldots, v_k\), в том порядке, в котором они встречаются на пути. Формально, \(v_i\) и \(v_{i+1}\) должны иметь ребро между ними для каждого \(i\) (\(1 \le i < k\)).
  • Этот путь должен быть простым, то есть ни одна вершина не должна встречаться на нем более одного раза.
Примечание

Путь, полученный в первом наборе входных данных, следующий.

Вот хорошее паросочетание для первого набора входных данных.

Вот нехорошее паросочетание для первого набора входных данных  — подграф \(\{1,3,4,5\}\) имеет \(3\) ребра.

Вот паросочетание, полученное во втором наборе входных данных.

Оно хорошее потому, что  —

  • Подграф \(\{1,8,2,5\}\) содержит ребра (\(1\),\(2\)) и (\(1\),\(5\)).
  • Подграф \(\{1,8,4,10\}\) содержит ребра (\(1\),\(4\)) и (\(4\),\(10\)).
  • Подграф \(\{4,10,2,5\}\) содержит ребра (\(2\),\(4\)) и (\(4\),\(10\)).

Вот еще одно хорошее паросочетание для второго набора входных данных.

G. Омкар и пироги

битмаски дп кратчайшие пути математика поиск в глубину и подобное *2900

У Омкара есть поднос для пирогов с \(k\) местами (\(2 \leq k \leq 20\)). Каждое место на подносе содержит либо шоколадный пирог, либо тыквенный пирог. Омкару не нравится, как пироги расположены в настоящее время, и у него есть другое идеальное расположение, которое он предпочел бы этому.

Чтобы помочь Омкару, \(n\) эльфов построились в очередь на замену пирогов на подносе. \(j\)-й слева эльф способен поменять пироги на позициях \(a_j\) и \(b_j\) местами.

Чтобы максимально приблизиться к своему идеальному расположению, Omkar может выбрать последовательный подотрезок эльфов и затем пропустить свой поднос через этот подотрезок, начиная слева. Однако, поскольку эльфы приложили столько усилий, чтобы собраться в строку, они просят, чтобы выбранный Омкаром подотрезок содержал как минимум \(m\) (\(1 \leq m \leq n\)) эльфов.

Формально, Omkar может выбрать два целых числа \(l\) и \(r\), удовлетворяющих \(1 \leq l \leq r \leq n\) и \(r - l + 1 \geq m\), после чего сначала будут поменяны пироги в позициях \(a_l\) и \(b_l\), затем пироги в позициях \(a_{l + 1}\) и \(b_{l + 1}\) и т.д. пока, наконец, не будут поменяны местами пироги \(a_r\) и \(b_r\).

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

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

Первая строка содержит три целых числа \(n\), \(m\) и \(k\) (\(1 \leq m \leq n \leq 10^6\) и \(2 \leq k \leq 20\)) — число эльфов, минимальную длину подотрезка и число мест в подносе Омкара соответственно.

Вторая и третья строки содержат по строке длиной \(k\), состоящей из \(0\) и \(1\), которые представляют собой начальное расположение пирогов и идеальное расположение пирогов; \(j\)-й символ в каждой строке равен \(0\), если \(j\)-е место в расположении содержит шоколадный пирог, и равен \(1\), если \(j\)-е место в расположении содержит тыквенный пирог. Не гарантируется, что две строки имеют одинаковое количество \(0\) или одинаковое количество \(1\).

Ниже следуют \(n\) строк. \(j\)-я из этих строк содержит два целых числа \(a_j\) и \(b_j\), (\(1 \leq a_j, b_j \leq k\), \(a_j \neq b_j\)), которые указывают на то, что \(j\)-й эльф слева может поменять местами пироги в подносе на позициях \(a_j\) и \(b_j\).

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

Выводите две строки.

Первая строка должна содержать одно целое \(s\) (\(0 \leq s \leq k\)), равное количеству позиций, которые содержат один и тот же тип пирога в окончательном расположении Омкара и в идеальном расположении Омкара; \(s\) должно быть максимально возможным.

Вторая строка должна содержать два целых числа \(l\) и \(r\), удовлетворяющих \(1 \leq l \leq r \leq n\) и \(r - l + 1 \geq m\), обозначающих, что Омкар должен пропустить свой поднос через подотрезок \(l, l + 1, \dots, r\), чтобы добиться конечного расположения в котором есть \(s\) позиций, в которых тот же тип пирога, что и в идеальном расположении.

Если ответов несколько, то можно вывести любой из них.

Примечание

В первом примере, изменения будут проходить вот так:

  • Поменяйте \(1\) и \(3\): 11000 становится 01100
  • Поменяйте \(3\) и \(5\): 01100 становится 01001
  • Поменяйте \(4\) и \(2\): 01001 становится 00011
Окончательная расстановка такая же, как и у идеального пирога 00011, поэтому есть \(5\) позиций с тем же типом пирога, что и в оптимальной.

Во втором примере, изменения будут идти вот так:

  • Поменяйте \(1\) и \(3\): 11000 становится 01100
  • Поменяйте \(1\) и \(5\): 01100 становится 01100
  • Поменяйте \(4\) и \(2\): 01100 становится 00110
  • Поменяйте \(1\) и \(5\): 00110 становится 00110
Окончательная расстановка имеет \(3\) позиции с тем же типом пирога, что и идеальная расстановка 00011, это позиции \(1\), \(2\) и \(4\). В этом случае подотрезок эльфов \((l, r) = (2, 3)\) более оптимален, но этот подотрезок имеет только длину \(2\) и поэтому не удовлетворяет ограничению, заключающемуся в том, что подотрезок должен иметь длину не менее \(m = 3\).

D. Рарити и новое платье

дп кратчайшие пути поиск в глубину и подобное реализация *2100

В бутике Карусель вновь кипит работа! Рарити решила посетить бал пони и для этого ей, конечно, необходимо новое платье, ведь выходить в свет в одном и том же платье несколько раз является признаком дурного тона. Для того чтобы сшить платье, ей прежде всего нужна выкройка, которую она вырежет из прямоугольного куска разноцветной ткани.

Кусок разноцветной ткани состоит из \(n \times m\) отдельных квадратных лоскутков. Так как Рарити любит платья со вкусом, выкройка должна быть целиком составлена из лоскутков одного цвета. Выкройка должна быть квадратной и, так как Рарити обожает ромбы, его стороны должны находиться под углом \(45^{\circ}\) к сторонам куска ткани (так он больше всего похож на классическое представление ромба).

Примеры подходящих выкроек: Примеры неподходящих выкроек: Первая состоит из лоскутков разного цвета, вторая выходит за границы куска ткани, третья не является квадратом со сторонами под углом \(45^{\circ}\) к сторонам куска ткани.

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

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

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 2000\)). Каждая из следующих \(n\) строк содержит \(m\) символов — строчных латинских букв, \(j\)-я из которых соответствует лоскутку в текущей строке и \(j\)-м столбце. Лоскутки с одинаковыми буквами имеют одинаковые цвета, с различными — различные.

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

Выведите единственное число — количество способов вырезать выкройку, чтобы удовлетворить условия Рарити.

Примечание

В первом тесте из условия подходят все выкройки размера \(1\) и одна размера \(2\).

Во втором тесте из условия подходят только выкройки размера \(1\).

B. Boboniu ходит по графу

графы Перебор поиск в глубину и подобное хэши *2300

У Boboniu есть ориентированный граф с \(n\) вершинами и \(m\) ребрами.

Исходящая степень каждой вершины не превосходит \(k\).

У каждого ребра есть целочисленный вес от \(1\) до \(m\). Никакие два ребра не имеют одинаковый вес.

Boboniu любит ходить по графу придерживаясь определенных правил, которые задаются последовательностью \((c_1,c_2,\ldots,c_k)\). Если в текущий момент он стоит в вершине \(u\) с исходящей степени \(i\), тогда после этого он перейдет в вершину по ребру с \(c_i\)\((1\le c_i\le i)\) номером в отсортированном по весу порядке среди всех ребер исходящих из \(u\).

Boboniu попросил вас посчитать число таких последовательностей \((c_1,c_2,\ldots,c_k)\), что:

  • \(1\le c_i\le i\) для всех \(i\) (\(1\le i\le k\)).
  • Начав с любой вершины \(u\), возможно вернуться обратно в \(u\) за конечное время передвигаясь по графу по описанным правилам.
Входные данные

В первой строке записаны три целых числа \(n\), \(m\) и \(k\) (\(2\le n\le 2\cdot 10^5\), \(2\le m\le \min(2\cdot 10^5,n(n-1) )\), \(1\le k\le 9\)).

Каждая из следующих \(m\) строк содержит три целых числа \(u\), \(v\) и \(w\) \((1\le u,v\le n,u\ne v,1\le w\le m)\), описывающих ребро из \(u\) в \(v\) с весом \(w\). Гарантируется, что в графе нет петель и кратных ребер, и из каждой вершины исходит хотя бы одно ребро.

Гарантируется, что исходящая степень каждой вершины не превышает \(k\) и никакие два ребра не имеют одинаковый вес.

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

Выведите одно целое число: количество последовательностей.

Примечание

В первом примере есть две последовательности: \((1,1,3)\) и \((1,2,3)\). Синие ребра обозначают \(c_i\)-е по весу ребра, по которым решил ходить Boboniu.

Для третьего примера есть только одна последовательность: \((1,2,2,2)\).

Исходящая степень вершины \(u\) это количество ребер исходящих из \(u\).

E. Паросочетание с расстояниями

Деревья Конструктив поиск в глубину и подобное *3200

Вам дано целое число \(k\) и дерево \(T\) с \(n\) вершинами (\(n\) четно).

Обозначим за \(dist(u, v)\) количество ребер на кратчайшем пути между вершинами \(u\) и \(v\) в \(T\).

Определим неориентированный взвешенный полный граф \(G = (V, E)\) следующим образом:

  • \(V = \{x \mid 1 \le x \le n \}\) т.е. множество целых чисел от \(1\) до \(n\)
  • \(E = \{(u, v, w) \mid 1 \le u, v \le n, u \neq v, w = dist(u, v) \}\) т.е. существует ребро между каждой парой разных вершин, вес ребра равен расстоянию между соотвествующими вершинами в \(T\)

Ваша задача — найти совершенное паросочетание в \(G\) с суммой весов ребер \(k\) \((1 \le k \le n^2)\).

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

В первой строке записано два целых числа \(n\), \(k\) (\(2 \le n \le 100\,000\), \(n\) четное, \(1 \le k \le n^2\)): количество вершин и необходимый вес паросочетания.

В \(i\)-й из следующих \(n - 1\) строк записаны два целых числа \(v_i\), \(u_i\) (\(1 \le v_i, u_i \le n\)), описывающих ребро между вершинами \(v_i\) и \(u_i\) в \(T\). Гарантируется, что данный граф является деревом.

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

Если не существует необходимого паросочетания, выведите «NO» (без кавычек) в единственной строке.

Иначе, выведите «YES» (без кавычек) в первой строке вывода.

Затем, выведите \(\frac{n}{2}\) строк, в \(i\)-й из них выведите \(p_i, q_i\) (\(1 \le p_i, q_i \le n\)): \(i\)-ю пару в паросочетании.

Примечание

Дерево это связный неориентированный граф без циклов.

Паросочетание это множество попарно несмежных ребер, без петель; таким образом, никакие два ребра не имеют общих концов.

Совершенное паросочетание это паросочетание, которое покрывает все вершины графа; таким образом, каждая вершина инцидентна ровно одному ребру паросочетания.

E1. Деление весов (простая версия)

Деревья жадные алгоритмы поиск в глубину и подобное Структуры данных *2000

Простая и сложная версии на самом деле являются разными задачами, поэтому прочитайте условия обеих задач внимательно.

Вам задано взвешенное корневое дерево, вершина \(1\) — корень этого дерева.

Дерево — это связный граф без циклов. У корневого дерева есть специальная вершина, называемая корнем. Предком вершины \(v\) называется последняя отличная от \(v\) вершина на пути от корня к вершине \(v\). Потомками вершины \(v\) называются все вершины, для которых \(v\) является предком. Вершина называется листом, если у нее нет потомков. Взвешенное дерево — это такое дерево, в котором у каждого ребра есть некоторый вес.

Вес пути — это сумма весов всех ребер на этом пути. Вес пути от вершины до самой себя равен \(0\).

Вы можете совершить последовательность из нуля или более ходов. В течение одного хода вы можете выбрать ребро и поделить его вес на \(2\) с округлением вниз. Более формально, в течение одного хода вы выбираете какое-то ребро \(i\) и делите его вес на \(2\) с округлением вниз (\(w_i := \left\lfloor\frac{w_i}{2}\right\rfloor\)).

Ваша задача — найти минимальное количество ходов, необходимых для того, чтобы сделать сумму весов путей от корня до каждого листа не превосходящей \(S\). Другими словами, если \(w(i, j)\) — это вес пути от вершины \(i\) до вершины \(j\), то вам необходимо сделать \(\sum\limits_{v \in leaves} w(root, v) \le S\), где \(leaves\) — это список всех листьев.

Вам необходимо ответить на \(t\) независимых наборов тестовых данных.

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

Первая строка теста содержит одно целое число \(t\) (\(1 \le t \le 2 \cdot 10^4\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Первая строка набора тестовых данных содержит два целых числа \(n\) и \(S\) (\(2 \le n \le 10^5; 1 \le S \le 10^{16}\)) — количество вершин в дереве и максимально возможная сумма весов, которую вы можете получить. Следующая \(n-1\) строка описывает ребра дерева. Ребро \(i\) описывается тремя целыми числами \(v_i\), \(u_i\) и \(w_i\) (\(1 \le v_i, u_i \le n; 1 \le w_i \le 10^6\)), где \(v_i\) и \(u_i\) — вершины, которые соединены ребром \(i\), а \(w_i\) — вес этого ребра.

Гарантируется, что сумма всех \(n\) не превосходит \(10^5\) (\(\sum n \le 10^5\)).

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

Для каждого набора тестовых данных выведите ответ на него: минимальное количество ходов, необходимое, чтобы сделать сумму весов путей от корня до каждого листа не превосходящей \(S\).

E2. Деление весов (сложная версия)

Бинарный поиск Деревья жадные алгоритмы поиск в глубину и подобное сортировки *2200

Простая и сложная версии на самом деле являются разными задачами, поэтому прочитайте условия обеих задач внимательно.

Вам задано взвешенное корневое дерево, вершина \(1\) — корень этого дерева. Также каждое ребро имеет свою собственную стоимость.

Дерево — это связный граф без циклов. У корневого дерева есть специальная вершина, называемая корнем. Предком вершины \(v\) называется последняя отличная от \(v\) вершина на пути от корня к вершине \(v\). Потомками вершины \(v\) называются все вершины, для которых \(v\) является предком. Вершина называется листом, если у нее нет потомков. Взвешенное дерево — это такое дерево, в котором у каждого ребра есть некоторый вес.

Вес пути — это сумма весов всех ребер на этом пути. Вес пути от вершины до самой себя равен \(0\).

Вы можете совершить последовательность из нуля или более ходов. В течение одного хода вы можете выбрать ребро и поделить его вес на \(2\) с округлением вниз. Более формально, в течение одного хода вы выбираете какое-то ребро \(i\) и делите его вес на \(2\) с округлением вниз (\(w_i := \left\lfloor\frac{w_i}{2}\right\rfloor\)).

Каждое ребро \(i\) имеет свою стоимость \(c_i\), которая равна либо \(1\), либо \(2\) монетам. Каждый ход с ребром \(i\) стоит \(c_i\) монет.

Ваша задача — найти минимальную суммарную стоимость, необходимую для того, чтобы сделать сумму весов путей от корня до каждого листа не превосходящей \(S\). Другими словами, если \(w(i, j)\) — это вес пути от вершины \(i\) до вершины \(j\), то вам необходимо сделать \(\sum\limits_{v \in leaves} w(root, v) \le S\), где \(leaves\) — это список всех листьев.

Вам необходимо ответить на \(t\) независимых наборов тестовых данных.

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

Первая строка теста содержит одно целое число \(t\) (\(1 \le t \le 2 \cdot 10^4\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Первая строка набора тестовых данных содержит два целых числа \(n\) и \(S\) (\(2 \le n \le 10^5; 1 \le S \le 10^{16}\)) — количество вершин в дереве и максимально возможная сумма весов, которую вы можете получить. Следующая \(n-1\) строка описывает ребра дерева. Ребро \(i\) описывается четырьмя целыми числами \(v_i\), \(u_i\), \(w_i\) и \(c_i\) (\(1 \le v_i, u_i \le n; 1 \le w_i \le 10^6; 1 \le c_i \le 2\)), где \(v_i\) и \(u_i\) — вершины, которые соединены ребром \(i\), \(w_i\) — вес этого ребра, а \(c_i\) — цена этого ребра.

Гарантируется, что сумма всех \(n\) не превосходит \(10^5\) (\(\sum n \le 10^5\)).

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

Для каждого набора тестовых данных выведите ответ на него: минимальную суммарную стоимость, необходимую, чтобы сделать сумму весов путей от корня до каждого листа не превосходящей \(S\).

D. Два пути

графы Деревья дп кратчайшие пути поиск в глубину и подобное *1900

Как вы знаете, Васин брат живет во Флатландии. Во Флатландии n городов, соединенных n - 1 двусторонней дорогой. Города пронумерованы от 1 до n. Из любого города можно добраться до любого другого двигаясь по дорогам.

Компания «Два пути», в которой работает Васин брат, выиграла тендер на ремонт двух путей во Флатландии. Путем называется последовательность различных городов, последовательно соединенных дорогами. Пути, которые надо отремонтировать, компания может выбрать самостоятельно. Единственное условие, накладываемое тендером — они не должны пересекаться (то есть иметь общих городов).

Известно, что прибыль, которую получит компания «Два пути», равна произведению длин выбранных двух путей. Считая длину каждой дороги равной 1, а длину пути равной количеству дорог в ней, найдите максимальную возможную прибыль компании.

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

В первой строке записано целое число n (2 ≤ n ≤ 200), где n — количество городов в стране. Далее в n - 1 строке записаны сами дороги. Каждая строка содержит пару номеров соединяемых городов ai, bi (1 ≤ ai, bi ≤ n).

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

Выведите максимальную возможную прибыль.

F. x-простые подстроки

дп Перебор поиск в глубину и подобное Строки строковые суфф. структуры *2800

Дано целое число \(x\) и строка \(s\), состоящая из цифр от \(1\) до \(9\) включительно.

Подстрокой строки называется последовательная подпоследовательность этой строки.

Пусть \(f(l, r)\) будет равно сумме цифр в подстроке \(s[l..r]\).

Назовем подстроку \(s[l_1..r_1]\) \(x\)-простой, если

  • \(f(l_1, r_1) = x\);
  • не существует таких значений \(l_2, r_2\), что
    • \(l_1 \le l_2 \le r_2 \le r_1\);
    • \(f(l_2, r_2) \neq x\);
    • \(x\) делится на \(f(l_2, r_2)\).

Разрешено удалять любые символы из строки. Если вы удаляете символ, то две полученные части строки склеиваются, не меняя порядок.

Какое минимальное количество символов надо удалить из строки, чтобы она не содержала \(x\)-простых подстрок? Если \(x\)-простых подстрок нет в данной строке \(s\), то выведите \(0\).

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

В первой строке записана строка \(s\) (\(1 \le |s| \le 1000\)). \(s\) содержит только цифры от \(1\) до \(9\) включительно.

Во второй строке записано одно целое число \(x\) (\(1 \le x \le 20\)).

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

Выведите одно целое число — минимальное количество символов, которые надо удалить из строки, чтобы она не содержала \(x\)-простых подстрок? Если \(x\)-простых подстрок нет в данной строке \(s\), то выведите \(0\).

Примечание

В первом примере в строке две \(8\)-простых подстроки «8» и «53». Можно удалить данные символы, чтобы избавиться от обеих: «116285317». Полученная строка «1162317» не содержит \(8\)-простых подстрок. Также можно удалить такие символы: «116285317».

Во втором примере необходимо просто удалить обе единицы.

В третьем примере нет \(13\)-простых подстрок. В нем вообще нет подстрок с суммой цифр равной \(13\).

В четвертом примере в строке не должно быть ни «34», ни «43». Поэтому необходимо удалить либо все тройки, либо все четверки. Их по \(5\) штук, поэтому можно удалить любые из них.

D. Максимально распределенное дерево

Деревья дп жадные алгоритмы математика поиск в глубину и подобное реализация сортировки теория чисел *1800

Вам задано дерево, состоящее из \(n\) вершин. Вы должны сопоставить каждому из \(n-1\) ребер этого дерева целое число таким образом, чтобы выполнялись следующие условия:

  • каждое число должно быть целым и строго больше \(0\);
  • произведение всех \(n-1\) чисел должно быть равно \(k\);
  • количество \(1\)-ц среди всех \(n-1\) чисел должно быть минимально возможным.

Назовем \(f(u,v)\) сумму чисел на простом пути из вершины \(u\) в вершину \(v\). Также, назовем \(\sum\limits_{i=1}^{n-1} \sum\limits_{j=i+1}^n f(i,j)\) как индекс распределения дерева.

Определите максимально возможный индекс распределения, который можно получить. Так как ответ может быть слишком большим, выведите его по модулю \(10^9 + 7\).

В данной задаче, так как число \(k\) может быть слишком большим, задана факторизация \(k\) на простые числа.

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

В первой строке задано одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

В первой строке каждого набора задано одно целое число \(n\) (\(2 \le n \le 10^5\)) — количество вершин в дереве.

В каждой из следующих \(n-1\) строк заданы ребра: в \(i\)-й строке заданы два целых числа \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\); \(u_i \ne v_i\)) — номера вершин, соединенных \(i\)-м ребром.

В следующей строке задано одно число \(m\) (\(1 \le m \le 6 \cdot 10^4\)) — количество простых в факторизации \(k\).

В следующей строке заданы \(m\) простых чисел \(p_1, p_2, \ldots, p_m\) (\(2 \le p_i < 6 \cdot 10^4\)) такие, что \(k = p_1 \cdot p_2 \cdot \ldots \cdot p_m\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\), сумма \(m\) по всем наборам не превосходит \(6 \cdot 10^4\), и что заданные ребра в каждом наборе образуют дерево.

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

Выведите максимально возможный индекс распределения. Так как ответ может быть слишком большим, выведите его по модулю \(10^9+7\).

Примечание

В первом наборе входных данных, один из возможных ответов изображен на рисунке ниже:

В данном случае, \(f(1,2)=1\), \(f(1,3)=3\), \(f(1,4)=5\), \(f(2,3)=2\), \(f(2,4)=4\), \(f(3,4)=2\), и сумма этих \(6\) чисел равна \(17\).

Во втором наборе входных данных, один из возможных ответов изображен ниже:

В этом случае, \(f(1,2)=3\), \(f(1,3)=1\), \(f(1,4)=4\), \(f(2,3)=2\), \(f(2,4)=5\), \(f(3,4)=3\), и сумма этих \(6\) чисел равна \(18\).

C. Star Trek

*особая задача графы Деревья дп игры Комбинаторика матрицы поиск в глубину и подобное *2600

The United Federation of Planets is an alliance of \(N\) planets, they are indexed from \(1\) to \(N\). Some planets are connected by space tunnels. In a space tunnel, a starship can fly both ways really fast. There are exactly \(N-1\) space tunnels, and we can travel from any planet to any other planet in the Federation using these tunnels.

It's well known that there are \(D\) additional parallel universes. These are exact copies of our universe, they have the same planets and space tunnels. They are indexed from \(1\) to \(D\) (our universe has index \(0\)). We denote the planet \(x\) in universe \(i\) by \(P_x^i\). We can travel from one universe to another using dimension portals. For every \(i\) (\(0\leq i \leq D-1\)), we will place exactly one portal that allows us to fly from \(P_{A_i}^i\) to \(P_{B_i}^{i+1}\), for some planet indices \(A_i\) and \(B_i\) (i.e. \(1 \leq A_i, B_i \leq N\)).

Once all the portals are placed, Starship Batthyány will embark on its maiden voyage. It is currently orbiting around \(P_1^0\). Captain Ágnes and Lieutenant Gábor have decided to play the following game: they choose alternately a destination (a planet) to fly to. This planet can be in the same universe, if a space tunnel goes there, or it can be in another universe, if a portal goes there. Their aim is to visit places where no one has gone before. That's why, once they have visited a planet \(P_x^i\), they never go back there (but they can visit the planet \(x\) in another universe). Captain Ágnes chooses the first destination (then Gábor, then Ágnes etc.). If somebody can't choose a planet where they have not been before in his/her turn, he/she loses.

Captain Ágnes and Lieutenant Gábor are both very clever: they know the locations of all tunnels and portals, and they both play optimally. For how many different placements of portals does Captain Ágnes win the game? Two placements are different if there is an index \(i\) (\(0\leq i \leq D-1\)), where the \(i\)th portal connects different pairs of planets in the two placements (i.e \(A_i\) or \(B_i\) differs).

This number can be very big, so we are interested in it modulo \(10^9+7\).

Input

The first line contains two space-separated integers, \(N\) (\(1\leq N \leq 10^{5}\)) – the number of planets and \(D\) (\(1 \leq D \leq 10^{18}\)) – the number of additional parallel universes. Each of the next \(N-1\) lines contains two space-separated integers \(u\) and \(v\) (\(1 \leq u, v \leq N\)), denoting that \(P_u^i\) and \(P_v^i\) are connected by a space tunnel for all \(i\) (\(0 \leq i \leq D\)).

Output

You should print a single integer, the number of possible placements of portals where Captain Ágnes wins modulo \(10^9+7\).

Scoring
\( \begin{array}{|c|c|c|} \hline \text{Subtask} & \text{Points} & \text{Constraints} \\ \hline 1 & 0 & \text{samples}\\ \hline 2 & 7 & N=2 \\ \hline 3 & 8 & N \leq 100 \: \text{and} \: D = 1 \\ \hline 4 & 15 & N \leq 1000 \: \text{and} \: D = 1\\ \hline 5 & 15 & D=1 \\ \hline 6 & 20 & N \leq 1000 \: \text{and} \: D \leq 10^5\\ \hline 7 & 20 & D \leq 10^5\\ \hline 8 & 15 & \text{no additional constraints}\\ \hline \end{array} \)
Note

There is only 1 portal and \(3 \cdot 3 = 9\) different placements. The following 4 placements are when the Captain wins.

B. Spring cleaning

*особая задача графы Деревья поиск в глубину и подобное Структуры данных *2300

Spring cleanings are probably the most boring parts of our lives, except this year, when Flóra and her mother found a dusty old tree graph under the carpet.

This tree has \(N\) nodes (numbered from \(1\) to \(N\)), connected by \(N-1\) edges. The edges gathered too much dust, so Flóra's mom decided to clean them.

Cleaning the edges of an arbitrary tree is done by repeating the following process: She chooses 2 different leaves (a node is a leaf if it is connected to exactly one other node by an edge), and cleans every edge lying on the shortest path between them. If this path has \(d\) edges, then the cost of cleaning this path is \(d\).

She doesn't want to harm the leaves of the tree, so she chooses every one of them at most once. A tree is cleaned when all of its edges are cleaned. The cost of this is the sum of costs for all cleaned paths.

Flóra thinks the tree they found is too small and simple, so she imagines \(Q\) variations of it. In the \(i\)-th variation, she adds a total of \(D_i\) extra leaves to the original tree: for each new leaf, she chooses a node from the original tree, and connects that node with the new leaf by an edge. Note that some nodes may stop being leaves during this step.

For all these \(Q\) variations, we are interested in the minimum cost that is required to clean the tree.

Input

The first line contains two space-separated integer, \(N\) and \(Q\) (\(3 \leq N \leq 10^{5}\), \(1 \leq Q \leq 10^{5}\)) – the number of nodes the tree has and the number of variations.

Each of the next \(N-1\) lines contains two space-separated integers \(u\) and \(v\) denoting that nodes \(u\) and \(v\) are connected by an edge (\(1 \leq u, v \leq N\)).

The next \(Q\) lines describe the variations. The first integer in the \(i\)th line is \(D_i\) (\(1 \leq D_i \leq 10^{5}\)). Then \(D_i\) space-separated integers follow: if the \(j\)th number is \(a_j\), it means that Flóra adds a new leaf to node \(a_j\) (\(1 \leq a_j \leq N\)). We may add more than one leaf to the same node. \(\sum_{1}^{Q} D_i \leq 10^{5}\) i.e. the sum of \(D_i\) in all varations is at most \(10^5\).

After each variation, Flóra restarts and adds extra leaves to the original tree.

Output

You should print \(Q\) lines. In the \(i\)-th line, print a single integer: the minimum cost required to clean the \(i\)-th variation of the tree. If the tree cannot be cleaned, print \(-1\).

Scoring
\( \begin{array}{|c|c|l|} \hline \text{Subtask} & \text{Points} & \text{Constraints} \\ \hline 1 & 0 & \text{samples}\\ \hline 2 & 9 & Q = 1, \text{there is an edge between node} \: 1 \: \text{and} \: i \: \text{for every} \: i \: (2 \leq i \leq N), \\ & & \text{Flóra can't add extra leaf to node} \: 1 \\ \hline 3 & 9 & Q = 1, \text{there is an edge between node} \: i \: \text{and} \: i+1 \: \text{for all} \: (1 \leq i < N), \\ & & \text{Flóra can't add extra leaf to node} \: 1 \: \text{nor node} \: N \\ \hline 4 & 16 & N \leq 20000, Q \leq 300\\ \hline 5 & 19 & \text{the original tree is a perfect binary tree rooted at node \)1\(} \\ & & \text{(i.e. each internal node has exactly \)2\( children, and every leaf} \\ & & \text{has the same distance from the root)}\\ \hline 6 & 17 & D_i = 1 \: \text{for all} \: i\\ \hline 7 & 30 & \text{no additional constraints}\\ \hline \end{array} \)
Note

The following picture shows the second variation. A possible solution is to clean the path between leaves \(1 - 6\), \(A - 7\) and \( B - 3\).

You can download the above example and an additional (bigger) sample input here: https://gofile.io/d/8QlbsS

B. Догонялки на дереве

Деревья дп игры поиск в глубину и подобное *1900

Алиса и Боб играют в забавную игру — догонялки на дереве.

В эту игру играют на дереве из \(n\) вершин, пронумерованных от \(1\) до \(n\). Напомним, что дерево на \(n\) вершинах — это неориентированный, связный граф с \(n-1\) ребрами.

Изначально Алиса располагается в вершине \(a\), а Боб — в вершине \(b\). Они ходят по очереди, и Алиса делает первый ход. За свой ход Алиса может перепрыгнуть в вершину с расстоянием не более \(da\) от текущей вершины. Боб же за свой ход может перепрыгнуть в вершину с расстоянием не более \(db\) от текущей вершины. Расстояние между двумя вершинами определяется как количество рёбер на уникальном простом пути между ними. В частности, любому из игроков разрешается остаться на одной и той же вершине в свой ход. Заметим, что при выполнении хода игрок занимает только начальную и конечную вершины своего хода, а не вершины между ними.

Если после не более чем \(10^{100}\) ходов Алиса и Боб занимают одну и ту же вершину, то победителем объявляется Алиса. В противном случае побеждает Боб.

Определите победителя, если оба игрока играют оптимально.

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

Каждый тест содержит несколько наборов входных данных. В первой строке указано количество наборов входных данных \(t\) (\(1 \le t \le 10^4\)). Описание наборов входных данных приведено ниже.

Первая строка каждого набора входных данных содержит пять целых чисел \(n,a,b,da,db\) (\(2\le n\le 10^5\), \(1\le a,b\le n\), \(a\ne b\), \(1\le da,db\le n-1\)) — количество вершин, вершину Алисы, вершину Боба, максимальное расстояние прыжка Алисы и максимальное расстояние прыжка Боба, соответственно.

Следующие \(n-1\) строк описывают ребра дерева. \(i\)-я из этих строк содержит два целых числа \(u\), \(v\) (\(1\le u, v\le n, u\ne v\)), обозначающие ребро между вершинами \(u\) и \(v\). Гарантируется, что данный граф является деревом.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(10^5\).

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

Для каждого набора входных данных выведите одну строку, содержащую победителя игры: «Alice» или «Bob».

Примечание

В первом наборе входных данных Алиса может выиграть, перейдя к вершине \(1\). Тогда куда бы Боб не двигался дальше, Алиса сможет перейти к той же самой вершине на следующем шаге.

Во втором наборе входных данных у Боба есть следующая победная стратегия. Куда бы Алиса ни двигалась, Боб всегда будет двигаться к той из вершин \(1\) или \(6\), которая более удалена от Алисы.

D. Игра Пар

интерактив Конструктив математика поиск в глубину и подобное теория чисел *2800

Это интерактивная задача.

Дано целое число \(n\). Два игрока, First и Second играют в следующую игру:

  1. First берет \(2n\) целых чисел \(1, 2, \dots, 2n\), и разбивает их на \(n\) попарно непересекающихся пар по своему усмотрению.
  2. Затем, Second выбирает ровно одно число из каждой пары (тоже по своему усмотрению).

Чтобы определить победителя игры, мы вычисляем сумму чисел, выбранных Second. Если сумма всех этих чисел кратна \(2n\), то выигрывает Second. Иначе выигрывает First.

Вам дано \(n\). Выберите каким игроком вы будете играть и выиграйте игру.

Протокол взаимодействия

Начните взаимодействие с чтения целого числа \(n\) (\(1 \le n \le 5 \cdot 10^5\)).

После прочтения выведите единственную строку, содержащую либо First, либо Second, обозначающую, за кого вы хотите играть. Взаимодействие затем варьируется в зависимости от того, за кого вы решили играть.

Если вы выбрали First, выведите единственную строку, содержащую \(2n\) целых чисел \(p_1, p_2, \dots, p_{2n}\), обозначающих, что число \(i\) принадлежит к \(p_i\)-й паре для \(1\le i \le 2n\). Таким образом, должно выполняться \(1 \le p_i \le n\), а каждое число от \(1\) до \(n\) включительно должно встречаться ровно дважды.

Если вы выбрали игру Second, то интерактор выведет \(2n\) целых чисел \(p_1, p_2, \dots, p_{2n}\), что означает, что число \(i\) принадлежит к \(p_i\)-й паре. В ответ в единственной строке выведите \(n\) целых чисел \(a_1, a_2, \dots, a_n\). Они должны содержать ровно по одному числу из каждой пары.

Независимо от того, какого игрока вы выбрали, интерактор прекратит работу, выведя единственное целое число: \(0\), если ваш ответ на тестовый случай правильный (то есть вы играете за First и он не может выбрать подходящие числа из ваших пар, или если вы играете за Second и сумма выбранных вами чисел кратна \(2n\)), или \(-1\), если он неправильный. Ваша программа должна завершиться сразу после прочтения этого числа.

Если в какой-то момент вы сделаете некорректное взаимодействие, то интерактор выведет \(-1\) и завершит взаимодействие. Вы получите вердикт Неверный ответ. Убедитесь в том, что вы немедленно прекращаете работу, чтобы избежать получения других вердиктов.

После вывода очередной строки не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Формат взломов

Для взлома используйте следующий формат:

Первая строка содержит целое число \(n\) (\(1 \le n \le 5 \cdot 10^5\)).

Вторая строка содержит \(2n\) целых чисел \(p_1, p_2, \dots, p_{2n}\), обозначающих, что число \(i\) принадлежит к паре \(p_i\)-th, если взламываемое решение решает играть как Second. Если взламываемое решение выбирает играть как First, то эти пары не имеют значения, но \(p_1, p_2, \dots, p_{2n}\) все равно должны формировать разбиение \(1, 2, \dots, 2n\) на \(n\) непересекающихся пар.

Примечание

В первом примере \(n = 2\), и вы решили играть как Second. Интерактор выбирает пары \((1, 2)\) и \((3, 4)\), а вы отвечаете числами \(1\) и \(3\). Это правильный выбор, так как он содержит ровно одно число из каждой пары, а сумма \(1 + 3 = 4\) делится на \(4\).

Во втором примере снова \(n = 2\), и вы играете как Первый. Вы выбираете пары \((2, 4)\) и \((1, 3)\). Интерактор не может выбрать число из каждой пары так, чтобы их сумма делилась на \(4\), поэтому ответ верен.

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

C. Link Cut центроиды

графы Деревья Конструктив поиск в глубину и подобное *1700

Fishing Prince любит деревья и особенно он любит деревья с ровно одним центроидом. Деревом называется связный граф без циклов.

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

Например, вершина \(2\) является центроидом дерева на следующей картинке, потому что после того, как вы удалите ее, размер наибольшей компоненты связности оставшегося графа будет равен \(2\). Невозможно удалить другую вершину, чтобы этот размер был меньше.

Однако, в некоторых деревьях может быть больше одного центроида, например:

Обе вершины \(1\) и \(2\) являются центроидами, потому что размер наибольшей компоненты связности будет равен \(3\) после удаления любой из них.

Сейчас у Fishing Prince есть дерево. Он должен удалить одно ребро дерева. После этого он должен добавить одно ребро. Получившийся после этих двух операций граф снова должен стать деревом. Можно добавить только что удаленное ребро.

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

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

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится единственное целое число \(t\) (\(1\leq t\leq 10^4\)) — количество наборов входных данных. Описание наборов входных данных следует.

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

Каждая из следующей \(n-1\) строки содержит два целых числа \(x, y\) (\(1\leq x,y\leq n\)). Они означают, что существует ребро, соединяющее вершины \(x\) и \(y\).

Гарантируется, что данный граф является деревом.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

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

Для каждого набора входных данных выведите две строки.

В первой строке выведите два целых числа \(x_1, y_1\) (\(1 \leq x_1, y_1 \leq n\)), которые означают, что вы удаляете ребро между вершинами \(x_1\) и \(y_1\). Должно существовать ребро, соединяющее вершины \(x_1\) и \(y_1\).

Во второй строке выведите два целых числа \(x_2, y_2\) (\(1 \leq x_2, y_2 \leq n\)), которые означают, что вы добавляете ребро между вершинами \(x_2\) и \(y_2\).

Граф, получающийся после применения этих двух операций, должен снова являться деревом.

Если существует несколько возможных решений, выведите любое.

Примечание

Обратите внимание, что вы можете добавлять то же самое ребро, которое вы удалили.

В первом наборе входных данных после удаления и добавления одного и того же ребра вершина \(2\) по-прежнему останется единственным центроидом.

Во втором наборе входных данных вершина \(2\) станет единственным центроидом после удаления ребра между вершинами \(1\) и \(3\) и добавления ребра между вершинами \(2\) и \(3\).

E. Егор в республике Дагестан

графы дп жадные алгоритмы Конструктив кратчайшие пути поиск в глубину и подобное *2500

Егор — известный российский певец, рэпер, актёр и блогер, и наконец-то он решил дать концерт в солнечной республике Дагестан.

В республике есть \(n\) городов, некоторые пары которых соединены \(m\) односторонними дорогами без дополнительных условий. Иными словами, дорожная сеть Дагестана представляет собой произвольный ориентированный граф. Егор собирается прилететь в город \(1\), проехать из него по дорогам вдоль некоторого пути до города \(n\), дать в нём концерт и улететь.

Как и у любого артиста, у Егора есть множество недоброжелателей и слишком назойливых фанатов, поэтому ездить Егор и его команда будут только по безопасным дорогам. В Дагестане есть два типа дорог, чёрные и белые: по чёрным можно безопасно проехать только ночью, а по белым — только утром. Перед началом поездки менеджер Егора составляет расписание: он выбирает для каждого города его тип, чёрный или белый, и если команда посещает какой-то город, то уехать из него она сможет только по одной из дорог соответствующего типа. После определения расписания Егор выбирает любой маршрут из города \(1\) в город \(n\), причём из соображений безопасности этот путь должен быть кратчайшим. Менеджер Егора очень любит Дагестан и хочет задержаться здесь подольше, поэтому он попросил Вас составить такое расписание, чтобы из города \(1\) в город \(n\) не существовало пути вообще, или кратчайший путь был максимально возможной длины.

Путём является один город или последовательность дорог такая что начало каждой дороги в последовательности (кроме первой) является концом предыдущей. Егор может перемещаться вдоль пути, только если все его дороги безопасны.

Длиной пути называется количество дорог в нём. Кратчайшим путём называется путь минимальной длины.

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

Первая строка содержит числа \(n\), \(m\) (\(1 \leq n \leq 500000\), \(0 \leq m \leq 500000\)) — количество городов и дорог, соответственно.

В \(i\)-й из следующих \(m\) строк даны три целых числа — \(u_i\), \(v_i\) и \(t_i\) (\(1 \leq u_i, v_i \leq n\), \(t_i \in \{0, 1\}\)) — номера городов, соединяемых дорогой, и тип дороги (\(0\) — ночная, \(1\) — утренняя).

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

В первой строке выведите длину искомого пути (или \(-1\), если можно подобрать расписание так, чтобы пути из \(1\) в \(n\) не существовало).

Во второй строке выведите искомое расписание — строку из \(n\) целых чисел, где \(i\)-е число равно \(0\), если из \(i\)-го города можно уехать только по ночным дорогам, и \(1\), если только по утренним.

Если существует несколько решений, выведите любое из них.

Примечание

В первом примере, если покрасить город \(1\) в белый цвет, кратчайший путь будет состоять из одной дороги, \(1 \rightarrow 3\). Иначе, независимо от цветов остальных городов кратчайший путь будет \(1 \rightarrow 2 \rightarrow 3\).

Во втором примере город \(3\) следует покрасить в чёрный цвет, а из города \(2\) существуют дороги обоих цветов в город \(4\). Обратите внимание: может существовать дорога, соединяющая город с самим собой.

C. Ладейное поле

графы поиск в глубину и подобное снм *1700

Дана шахматная доска размера \(n \times n\). Строки и столбцы доски пронумерованы от \(1\) до \(n\). Клетка \((x, y)\) лежит на пересечении столбца номер \(x\) и строки номер \(y\).

Ладья это шахматная фигура, которая за один ход может переместиться на любое количество клеток по вертикали, либо по горизонтали. На доске размещены \(m\) ладей (\(m < n\)), которые не бьют друг друга. То есть, нет пары ладей, стоящих на одной вертикали или горизонтали.

За один ход можно сделать ход одной из ладей. То есть, переместить ее на любое количество клеток по вертикали или горизонтали. При этом, после хода ладья снова не должна оказаться под боем других ладей. Какое минимальное количество ходов нужно сделать, чтобы разместить все ладьи на главной диагонали?

Главной диагональю называются клетки \((i, i)\), где \(1 \le i \le n\).

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

В первой строке дано целое число \(t\) — количество тестовых случаев (\(1 \leq t \leq 10^3\)). Далее дано описание \(t\) тестовых случаев.

В первой строке даны два целых числа \(n\) и \(m\) — размер поля и количество ладей (\(2 \leq n \leq 10^5\), \(1 \leq m < n\)). Следующие \(m\) строк содержат пары целых чисел \(x_i\) и \(y_i\) — позиции ладей, \(i\)-я ладья исходно стоит в клетке \((x_i, y_i)\) (\(1 \leq x_i, y_i \leq n\)). Гарантируется, что в исходной расстановке ладьи не бьют друг друга.

Сумма \(n\) по всем тестовым случаям не превышает \(10^5\).

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

Для каждого из \(t\) тестовых случаев в новой строке выведите наименьшее количество ходов, которые требуются, чтобы поставить все ладьи на главную диагональ.

Можно доказать, что это всегда возможно.

Примечание

Возможные ходы для первых трех тестовых случаев:

  1. \((2, 3) \to (2, 2)\)
  2. \((2, 1) \to (2, 3)\), \((1, 2) \to (1, 1)\), \((2, 3) \to (2, 2)\)
  3. \((2, 3) \to (2, 4)\), \((2, 4) \to (4, 4)\), \((3, 1) \to (3, 3)\), \((1, 2) \to (1, 1)\)

F. Огненный ливень

Бинарный поиск графы поиск в глубину и подобное реализация снм Структуры данных *2800

На плоскости есть \(n\) отрядов, пронумерованных от \(1\) до \(n\), \(i\)-й отряд находится в точке с целочисленными координатами \((x_i, y_i)\). Все отряды находятся в различных точках.

Бримстоун должен посетить каждый отряд как минимум один раз. Вы можете выбрать, с каким отрядом в одной точке изначально находится Бримстоун.

Чтобы перейти от одного отряда к другому, Бримстоун выбирает одно из четырех направлений движения (вверх, вниз, вправо или влево) и двигается в этом направлении с постоянной скоростью — один единичный отрезок в секунду — до тех пор, пока не придёт к какому-либо отряду. Как только он приходит к какому-либо отряду, он может повторить этот процесс.

Каждые \(t\) секунд происходит огненный ливень, и в эти моменты Бримстоун должен находиться в одной точке с любым своим отрядом. Он может сколько угодно времени стоять на месте в одной точке с любым отрядом.

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

Помогите Бримстоуну, найдите минимальное целое положительное \(t\) такое, что обход можно произвести, добавив не более одного отряда. Если такого \(t\) не существует, вы должны сообщить об этом.

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

В первой строке находится единственное целое число \(n\) \((2 \le n \le 1000)\) — изначальное количество отрядов.

В каждой из следующих \(n\) строк содержатся два целых числа \(x_i\), \(y_i\) \((|x_i|, |y_i| \le 10^9)\) — координаты \(i\)-го отряда.

Гарантируется, что все точки различны.

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

Выведите единственное целое число — минимальное время \(t\), такое что обход всех отрядов можно произвести, добавив не более одного нового отряда.

Если ни одного такого \(t\) не существует, выведите \(-1\).

Примечание

В первом примере из условия можно добавить отряд в точку \((0, 0)\), после чего все отряды можно будет обойти при \(t = 100\). Можно доказать, что при \(t < 100\), даже добавив не более одного нового отряда, не получится сделать обход, поэтому ответ \(100\).

Во втором тесте из условия нельзя посетить все отряды ни при каком \(t\), даже при добавлении не более одного нового отряда, поэтому ответ \(-1\).

В третьем тесте можно добавить отряд в точку \((1, 0)\), и тогда все отряды можно будет обойти при \(t = 2\). Можно доказать, что это минимальное такое \(t\).

В четвертом тесте не нужно добавлять новый отряд и можно обойти все отряды при \(t = 2\). Можно доказать, что это минимальное такое \(t\).

G. Очередное взвешивание графа

битмаски графы дп математика поиск в глубину и подобное Потоки *2600

Дан ориентированный ацикличный граф (ориентированный граф, не содержащий циклов) из \(n\) вершин и \(m\) дуг. \(i\)-я дуга ведет из вершины \(x_i\) в вершину \(y_i\) и имеет вес \(w_i\).

Ваша задача — для каждой вершины \(v\) выбрать некоторое целое число \(a_v\), после чего на каждой дуге \(i\) записать такое число \(b_i\), что \(b_i = a_{x_i} - a_{y_i}\). Вы должны выбрать числа таким образом, чтобы:

  • все \(b_i\) были положительны;
  • значение выражения \(\sum \limits_{i = 1}^{m} w_i b_i\) было минимально возможным.

Можно показать, что для любого ориентированного ацикличного графа с неотрицательными \(w_i\) такой способ выбрать числа существует.

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

В первой строке заданы два целых числа \(n\) и \(m\) (\(2 \le n \le 18\); \(0 \le m \le \dfrac{n(n - 1)}{2}\)).

Далее следуют \(m\) строк, \(i\)-я из них содержит три целых числа \(x_i\), \(y_i\) и \(w_i\) (\(1 \le x_i, y_i \le n\), \(1 \le w_i \le 10^5\), \(x_i \ne y_i\)) — описание \(i\)-й дуги.

Гарантируется, что строки задают описание \(m\) дуг ориентированного ацикличного графа без кратных дуг.

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

Выведите \(n\) целых чисел \(a_1\), \(a_2\), ..., \(a_n\) (\(0 \le a_v \le 10^9\)), которые необходимо записать на вершинах, чтобы все \(b_i\) были положительны, и значение выражения \(\sum \limits_{i = 1}^{m} w_i b_i\) было минимально возможным. Если ответов несколько — выведите любой. Можно показать, что ответ всегда существует, и хотя бы один из оптимальных ответов удовлетворяет ограничениям \(0 \le a_v \le 10^9\).

D. Соединение районов

Конструктив поиск в глубину и подобное *1200

В городе есть \(n\) районов, \(i\)-й район принадлежит \(a_i\)-й бандитской группировке. Изначально никакая пара районов не соединена друг с другом.

Вы — мэр города, и вам хочется построить \(n-1\) двустороннюю дорогу, чтобы соединить все районы (два района могут быть соединены напрямую или через другие соединенные районы).

Если два района, принадлежащие одной и той же банде, связаны дорогой напрямую, то эта банда поднимет восстание.

Вы не хотите такого поворота, поэтому ваша задача — построить \(n-1\) двустороннюю дорогу таким образом, что все районы достижимы друг из друга (быть может, с использованием промежуточных районов) и каждая пара районов, связанных напрямую, принадлежит разным бандам, или определить, что невозможно построить \(n-1\) дорогу, удовлетворив все условия.

Вам необходимо ответить на \(t\) независимых наборов тестовых данных.

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

Первая строка теста содержит одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Первая строка набора тестовых данных содержит одно целое число \(n\) (\(2 \le n \le 5000\)) — количество районов. Вторая строка набора тестовых данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)), где \(a_i\) — номер банды, которой принадлежит \(i\)-й район.

Гарантируется, что сумма всех \(n\) не превосходит \(5000\) (\(\sum n \le 5000\)).

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

Для каждого набора тестовых данных выведите:

  • NO единственной строкой, если невозможно соединить все районы, удовлетворяя всем требованиям, заданным в условии задачи.
  • YES первой строкой и \(n-1\) дорогу на следующей \(n-1\) строке. Каждая дорога должна быть представлена как пара целых чисел \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n; x_i \ne y_i\)), где \(x_i\) и \(y_i\) — два района, которые соединяет \(i\)-я дорога.

Для каждой дороги \(i\), условие \(a[x_i] \ne a[y_i]\) должно выполняться. Кроме того, все районы должны быть достижимы друг из друга (быть может, с использованием промежуточных районов).

D. Бандиты в городе

Бинарный поиск графы Деревья жадные алгоритмы поиск в глубину и подобное *1900

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

Город состоит из \(n\) площадей, которые соединяют \(n-1\) дорог так, что от каждой площади обычно можно добраться до другой ровно одним способом. Площадь под номером \(1\) является главной площадью города.

Во время воскресной прогулки дороги между площадями в городе были изменены на односторонние таким образом, что теперь можно добраться от главной площади до любой другой.

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

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

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

В первой строке входного файла содержится одно целое число \(n\) — количество площадей в городе (\(2 \le n \le 2\cdot10^5\)).

Во второй строке входного файла содержатся \(n-1\) целых чисел \(p_2, p_3 \dots p_n\) — означающие, что существует дорога из площади \(p_i\) в \(i\) (\(1 \le p_i < i\)).

В третьей строке содержатся \(n\) целых чисел \(a_1, a_2, \dots, a_n\) — количество горожан на каждой площади изначально (\(0 \le a_i \le 10^9\)).

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

Выведите одно целое число — количество горожан, которые задержит бандит при оптимальных действиях обеих сторон.

Примечание

В первом примере горожане на площади \(1\) могут разделиться на две группы \(2 + 1\), тогда на второй и третьей площади окажется по \(3\) человека.

Во втором примере независимо от действий граждан бандит сможет поймать хотя бы \(4\) человека.

D. Ракетные шахты

графы кратчайшие пути поиск в глубину и подобное Структуры данных *1900

Страна Берляндия состоит из n городов, пронумерованных целыми числами от 1 до n. Некоторые города соединены двунаправленными дорогами, каждая из которых имеет некоторую длину. Из каждого города существует путь в любой другой город по дорогам. Согласно Самым Секретным Документам, Берляндию охраняют Самые Секретные Ракеты. Точное местонахождение Самых Секретных Ракетных Шахт неизвестно, но Вася сумел достать информацию, в которой сказано, что все Шахты расположены точно на расстоянии l от столицы, которая находится в городе номер s.

В документах дано формальное определение: в некотором месте, являющемся городом или точкой на дороге, находится Самая Секретная Ракетная Шахта тогда и только тогда, когда кратчайшее расстояние от этого места до столицы по дорогам страны в точности равно l.

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

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

В первой строке находятся три целых числа n, m и s (2 ≤ n ≤ 105, , 1 ≤ s ≤ n) — количество городов, дорог в стране и номер столицы соответственно. Далее в m строках даны описания дорог, каждая из которых описывается тремя целыми числами vi, ui, wi (1 ≤ vi, ui ≤ n, vi ≠ ui, 1 ≤ wi ≤ 1000), где vi, ui — номера городов, которые соединяет эта дорога, а wi — ее длина. Последняя строка входных данных содержит целое число l (0 ≤ l ≤ 109) — расстояние от столицы до ракетных шахт. Гарантируется, что:

  • между любыми двумя городами существует не более одной дороги;
  • каждая дорога соединяет два различных города;
  • из каждого города существует хотя бы один путь в любой другой город по дорогам.
Выходные данные

Выведите единственное число — сколько Самых Секретных Ракетных Шахт находится в Берляндии.

Примечание

В первом примере шахты расположены в городах 3 и 4, а также на дороге (1, 3) на расстоянии 2 от города 1 (соответственно, на расстоянии 1 от города 3).

Во втором примере одна из шахт расположена точно на середине дороги (1, 2), а еще две — на дороге (4, 5) на удалении 3 от города 4 в сторону города 5 и на удалении 3 от города 5 в сторону города 4.

C. Тимбилдинг

графы поиск в глубину и подобное снм Структуры данных *2500

Начался новый учебный год, и в университет Берляндии пришли \(n\) новых студентов, которых разбили на \(k\) групп, причем некоторые группы могли оказаться пустыми. Среди студентов есть \(m\) пар знакомых, причём знакомые студенты могут быть как из одной, так и из разных групп.

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

Алиcу интересует: сколько существует способов выбрать две различные группы студентов так, чтобы получилось сыграть в игру по всем правилам. При этом в игре должны участвовать все студенты обеих групп.

Обратите внимание, что команды, на которые Алиca разделит студентов, не обязаны совпадать с группами, в которых учатся участники. Более того, команды могут быть разного размера (или даже пустыми).

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

В первой строке заданы три целых числа \(n\), \(m\) и \(k\) (\(1 \le n \le 500\,000\); \(0 \le m \le 500\,000\); \(2 \le k \le 500\,000\)) — количество студентов, количество пар знакомых студентов и количество групп, соответственно.

Во второй строке заданы \(n\) целых чисел \(c_1, c_2, \dots, c_n\) (\(1 \le c_i \le k\)), где \(c_i\) равняется номеру группы, в которой учится \(i\)-й студент.

Далее следуют \(m\) строк. В \(i\)-й строке заданы два числа \(a_i\) и \(b_i\) (\(1 \le a_i, b_i \le n\)), означающие, что \(a_i\)-й и \(b_i\)-й студент знают друг друга. Гарантируется, что \(a_i \neq b_i\), и что если пара студентов знает друг друга, то она встречается ровно один раз.

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

Выведите одно число — количество способов выбрать две различные группы так, чтобы получилось сыграть в игру по всем правилам.

Примечание

Граф знакомств для первого тестового примера выглядит следующим образом (рядом с каждым студентом подписан номер его группы):

В данном случае нам подходят способы:

  • Выбрать первую и вторую группу — например, можно отнести студентов номер \(1\) и \(4\) к первой команде, а студентов номер \(2\) и \(3\) ко второй.
  • Выбрать вторую и третью группу — можно отнести студентов номер \(3\) и \(6\) к первой команде, а студентов номер \(4\) и \(5\) ко второй.
  • Выбрать первую и третью группы мы не можем, потому что не существует разбиения на команды, удовлетворяющего правилам игры.

Во втором тестовом примере мы можем выбрать любую пару групп. Обратите внимание, что несмотря на то, что в третьей группе нет студентов, мы все равно можем ее выбирать.

E. Найти вершину

Деревья дп интерактив Перебор поиск в глубину и подобное *3500

Это интерактивная задача.

Вам задано дерево — связный неориентированный граф без циклов. В нём загадали одну из вершин. Вы можете задавать вопросы интерактору: за один вопрос вы можете выбрать ребро и узнать, какой из двух концов ребра находится ближе к загаданной вершине, то есть, до какого из двух концов меньше кратчайшее расстояние от загаданной вершины. Вам требуется определить загаданную вершину за минимальное для данного дерева число запросов в худшем случае.

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

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

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

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

Протокол взаимодействия

После считывания выходных данных вы можете отправлять интерактору запросы двух типов:

  1. «\(u\) \(v\)» — узнать для ребра дерева \((u, v)\) (\(1 \le u, v \le n\)), какой из его концов ближе к загаданной вершине. В ответ вы получите одно число: номер одной из двух вершин. Обратите внимание, что \(u\) и \(v\) должны быть соединены ребром в дереве, поэтому они не могут находиться на равном расстоянии от загаданной вершины.
  2. «\(u\)» — сообщить интерактору о том, что вы выяснили номер загаданной вершины. После вывода этой команды ваша программа должна немедленно завершиться.

После каждого вопроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Idleness Limit Exceeded или Превышено реальное время работы. Для сброса буфера вы можете использовать:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • sys.stdout.flush() в Python;
  • смотрите документацию для других языков.

В случае, если вы сделаете большее число запросов, чем может быть необходимо для данного дерева в худшем случае, вы получите вердикт Неправильный ответ.

Примечание

Взломы в данной задаче запрещены.

E. Долгое выздоровление

Конструктив поиск в глубину и подобное *3500

Пациент был заражен неизвестной болезнью. Его тело представляет собой бесконечную сетку из треугольных ячеек, которая выглядит следующим образом:

Две клетки являются соседними, если у них есть общая сторона. Поэтому у каждой ячейки (\(x\), \(y\)) есть ровно три соседа:

  • (\(x+1\), \(y\))
  • (\(x-1\), \(y\))
  • (\(x+1\), \(y-1\)), если \(x\) четно и (\(x-1\), \(y+1\)) в противном случае.

Изначально некоторые ячейки заражены, все остальные здоровы. Начинается процесс выздоровления. Каждую секунду для ровно одной ячейки (хотя может быть несколько ячеек, которые могут изменить свое состояние) происходит одно из следующих событий:

  • Здоровая клетка с по крайней мере \(2\) зараженными соседями становится зараженной.
  • Зараженная клетка с по крайней мере \(2\) здоровыми соседями становится здоровой.

Если такой клетки нет, то процесс выздоровления останавливается. Пациент считается выздоровевшим, если процесс выздоровления остановлен и все клетки здоровы.

Нас интересует худший сценарий: возможно ли, что пациент никогда не выздоровеет, или, если это невозможно, какова максимально возможная продолжительность процесса выздоровления?

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

В первой строке содержится одно целое число \(n\) \((1 \leq n \leq 250000)\)  — количество зараженных ячеек.

В \(i\)-й из следующих \(n\) строк содержится два разделенных пробелами целых числа \(x_i\) и \(y_i\) \((0 \leq x_i, y_i < 500)\), что означает, что ячейка \((x_i, y_i)\) заражена. Все ячейки \((x_i, y_i)\) попарно различны, а все остальные клетки считаются здоровыми.

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

Если может случиться так, что организм никогда полностью не выздоровеет после болезни, выведите SICK. В противном случае выведите RECOVERED и в следующей строке целое число \(k\) — максимально возможную продолжительность процесса выздоровления, по модулю \(998244353\).

Примечание

Для первого примера следующие рисунки описывают самый длительный возможный процесс восстановления. Можно доказать, что нет периодов восстановления длиной \(5\) и более, и что организм всегда восстанавливается.

\(\hspace{40pt} \downarrow\) \(\hspace{40pt} \downarrow\) \(\hspace{40pt} \downarrow\) \(\hspace{40pt} \downarrow\)

\(\hspace{15pt}\) RECOVERED

Для второго теста можно заразить клетки \((2, 0)\), \((2, 1)\), \((0, 1)\). После этого ни одна клетка не может изменить свое состояние, поэтому ответ SICK, так как не все клетки здоровы.

E. Капитализм

графы Конструктив кратчайшие пути поиск в глубину и подобное *2700

Общество может быть представлено как связный, неориентированный граф с \(n\) вершинами и \(m\) ребрами. Вершины соответствуют людям, а ребро \((i,j)\) обозначает дружбу между людьми \(i\) и \(j\).

В этом обществе доход \(i\)-о человека равен \(a_i\). Человек \(i\) завидует человеку \(j\), если \(a_j=a_i+1\). То есть человек \(j\) имеет ровно на \(1\) больше дохода, чем человек \(i\).

Общество называется капиталистическим, если для всех пар друзей один из друзей завидует другому. Для некоторых пар друзей вы знаете, какой из друзей завидует другому. Для остальных пар, вы не знаете кто кому завидует.

Неравенство доходов общества определяется как \(\max\limits_{1 \leq i \leq n} a_i - \min\limits_{1 \leq i \leq n} a_i\).

Вы знаете про все существующие пары друзей, но не знаете доходы людей. Если это общество не может быть капиталистическим ни при каких доходах людей, сообщите об этом. Иначе, вы должны найти возможные доходы для всех людей такие, чтобы общество было капиталистическим и неравенство доходов было максимальным.

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

В первой строке находится два целых числа \(n\), \(m\) (\(1\le n\le 200\), \(n-1\le m\le 2000\)) — количество людей и пар друзей, соответственно.

Следующие \(m\) строк описывают пары друзей. Каждая пара друзей описывается тремя целыми числами \(i\), \(j\), \(b\) (\(1\le i, j\le n, i\ne j, 0\le b\le 1\)). Это описание означает, что люди \(i\) и \(j\) друзья. Если \(b=1\), то человек \(i\) завидует человеку \(j\). Если \(b=0\), то один из двух друзей должен завидовать другому, но неизвестно кто именно кому.

Существует не более одной дружбы между любой парой людей. Гарантируется, что если рассмотреть все пары друзей как неориентированные ребра, получившийся граф будет связным.

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

Выведите «YES», если заданное общество может быть капиталистическим и «NO», иначе. Вы можете выводить символы в любом регистре (верхнем или нижнем).

Если ответ «YES» вы должны вывести еще две строки. В первой строке выведите максимальное возможное неравенство доходов. В следующей строке вы должны вывести \(n\) целых чисел \(a_1,\ldots, a_n\) (\(0\le a_i\le 10^6\)), где \(a_i\) это доход \(i\)-о человека.

Можно доказать, что если решение существует, то существует решение, в котором \(0\le a_i\le 10^6\) для всех \(i\).

Если существует несколько возможных решений, выведите любое.

Примечание

В первом тесте можно показать, что для заданного общества не может быть неравенство доходов, большее чем \(3\). В приведенном ответе с неравенством доходов, равным \(3\):

  • Человек \(2\) завидует человеку \(1\).
  • Человек \(3\) завидует человеку \(2\).
  • Человек \(5\) завидует человеку \(2\).
  • Человек \(6\) завидует человеку \(5\) (удовлетворено условие на то, кто из друзей завидует другому).
  • Человек \(6\) завидует человеку \(3\).
  • Человек \(2\) завидует человеку \(4\) (удовлетворено условие на то, кто из друзей завидует другому).

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

G. Игра на дереве

Деревья жадные алгоритмы поиск в глубину и подобное Структуры данных *2700

Алиса и Боб играют в игру. У них есть дерево, состоящее из \(n\) вершин. Изначально у Боба есть \(k\) фишек, \(i\)-я фишка расположена в вершине \(a_i\) (все эти вершины уникальны). Перед началом игры Алиса поместит фишку в одну из вершин дерева.

Игра состоит из ходов. На каждом ходу происходят следующие события (последовательно, точно в следующем порядке):

  1. Алиса либо перемещает свою фишку в соседнюю вершину, либо не перемещает ее;
  2. для каждой фишки Боба он либо перемещает ее в соседнюю вершину, либо не перемещает. Обратите внимание, что этот выбор делается независимо для каждой фишки.

Игра заканчивается, когда фишка Алисы находится в одной вершине с одной (или несколькими) фишками Боба. Обратите внимание, что фишки Боба могут находиться в одной и той же вершине, даже если они находились в разных вершинах в начале игры.

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

Для каждой вершины подсчитайте, сколько ходов продлится игра, если Алиса поместит свою фишку в эту вершину.

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

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

Затем следует \(n - 1\) строка, каждая строка содержит два целых числа \(u_i\), \(v_i\) (\(1 \le u_i, v_i \le n\); \(u_i \ne v_i\)) — ребра дерева. Гарантируется, что эти ребра образуют дерево.

Следующая строка содержит одно целое число \(k\) (\(1 \le k \le n - 1\)) — количество фишек Боба.

Последняя строка содержит \(k\) целых чисел \(a_1\), \(a_2\), ..., \(a_k\) (\(1 \le a_i \le n\); \(a_i \ne a_j\), если \(i \ne j\)) — вершины, в которых изначально размещены фишки Боба.

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

Выведите \(n\) целых чисел. \(i\)-е из них должно быть равно числу ходов, которое продлится игра, если Алиса изначально поместит свою фишку в вершину \(i\). Если одна из фишек Боба уже помещена в вершину \(i\), то ответ для вершины \(i\) равен \(0\).

E. Собачьи закуски

Бинарный поиск Деревья дп жадные алгоритмы поиск в глубину и подобное *2300

Gildong играет в игру со своей собакой, Badugi. Они находятся в парке, в котором есть \(n\) перекрестков и \(n-1\) двусторонних дорог, длиной в \(1\) и соединяющих два перекрестка. Пересечения пронумерованы от \(1\) до \(n\), и для каждой пары \(a\) и \(b\) (\(1 \le a, b \le n\)), возможно пройти от \(b\)-го перекрестка до \(a\)-го передвигаясь по дорогам.

Gildong поставил одну закуску на каждый перекресток. Gildong поставил Badugi задачу — съесть все закуски. Badugi начинает на \(1\)-м перекрестке, и он передвигается по следующим правилам:

  • Badugi ищет закуски, которые находятся к нему как можно ближе. Расстояние это длина кратчайшего пути от текущей позиции Badugi до перекрестка с закуской. Однако, обоняние Badugi ограничено до \(k\) метров, так что он может находить только закуски на расстоянии не больше чем \(k\) метров от текущей позиции. Если он не может найти ни одной закуски, задание считается проваленным.
  • Среди всех закусок, которые Badugi чувствует на его текущей позиции, он выбирает закуску с минимальным расстоянием до текущей позиции. Если есть несколько возможных закусок, он выбирает одну любую из них.
  • Он повторяет этот процесс пока он не съест все \(n\) закусок. После этого, он должен снова найти \(1\)-й перекресток, который должен быть на расстоянии не больше чем \(k\) метров от последней съеденной закуски. Если он может найти его, он проходит задание. Иначе, задание считается проваленным.

К сожалению, Gildong не знает значение \(k\). Таким образом, он просит вас найти минимальное значение \(k\), при котором Badugi сможет выполнить задание, если будет действовать оптимально.

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

Тест состоит из одного или нескольких наборов входных данных. В первой строке записано количество наборов входных данных \(t\) (\(1 \le t \le 10^4\)).

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

В каждой из следующих \(n-1\) строк записаны два целых числа \(u\) и \(v\) (\(1 \le u,v \le n\), \(u \ne v\)) , которые описывают двунаправленную дорогу между перекрестками \(u\) и \(v\). Все дороги двухсторонние и различны.

Гарантируется, что:

  • Для каждого набора входных данных, для каждой пары \(a\) и \(b\) (\(1 \le a, b \le n\)), возможно пройти от \(b\)-го перекрестка до \(a\)-го передвигаясь по дорогам.
  • Сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).
Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное возможное значение \(k\), при котором Badugi может выполнить свое задание.

Примечание

В первом наборе входных данных, Badugi может выполнить задание для \(k=2\), передвигаясь следующим образом:

  1. Исходно, Badugi находится на \(1\)-м перекрестке. Ближайшая закуска, очевидно, находится на \(1\)-м перекрестке, поэтому он съедает ее.
  2. Затем, он ищет ближайшую закуску, которая может быть либо на \(2\)-м или на \(3\)-м перекрестке. Предположим, что он выбирает \(2\)-й перекресток. Он переходит на \(2\)-й перекресток, который находится на расстоянии \(1\) метр, и ест закуску.
  3. Единственная закуска находится на \(3\)-м перекрестке, и ему нужно пройти по \(2\) дорогам, чтобы дойти до нее.
  4. После съедения закуски на \(3\)-м перекрестке, ему снова нужно найти \(1\)-й перекресток, который находится на расстоянии \(1\) метр. После того как он возвращается на него, он выполнил свое задание.

Во втором наборе входных данных, единственная возможная последовательность действий это \(1\)\(2\)\(3\)\(4\)\(1\). Так как расстояние между \(4\)-м и \(1\)-м перекрестком равно \(3\), \(k\) должно быть хотя бы \(3\) для того, чтобы Badugi смог выполнить задание.

В третьем наборе входных данных, Badugi может двигаться следующим образом: \(1\)\(5\)\(6\)\(7\)\(8\)\(2\)\(3\)\(4\)\(1\). Можно показать, что это единственный вариант для Badugi выполнить миссию с \(k=3\).

E. Количество простых путей

графы Деревья Комбинаторика поиск в глубину и подобное *2000

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

Ваша задача — посчитать количество простых путей длины хотя бы \(1\) в заданном графе. Заметьте, что пути, которые отличаются только направлением, являются одинаковыми (то есть вам необходимо посчитать количество неориентированных путей). Например, пути \([1, 2, 3]\) и \([3, 2, 1]\) являются одинаковыми.

Вам необходимо ответить на \(t\) независимых наборов тестовых данных.

Напомним, что путем в графе называется такая последовательность вершин \(v_1, v_2, \ldots, v_k\), что каждая пара соседних (последовательных) вершин в этой последовательности соединена ребром. Длиной пути является количество ребер в нем. Простым путем называется такой путь, что все вершины в нем различны.

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

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 2 \cdot 10^4\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

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

Следующие \(n\) строк набора тестовых данных описывают ребра: ребро \(i\) задано парой вершин \(u_i\), \(v_i\) (\(1 \le u_i, v_i \le n\), \(u_i \ne v_i\)), где \(u_i\) и \(v_i\) — это вершины, которые соединяет \(i\)-е ребро. Для каждой пары вершин \((u, v)\) существует не более одного ребра между \(u\) и \(v\). Не существует ребер из вершины в саму себя. Таким образом, в графе отсутствуют петли и кратные ребра. Граф является неориентированным, то есть все его ребра являются двунаправленными. Граф является связным, то есть всегда возможно достичь любую вершину из любой другой вершины, двигаясь по ребрам графа.

Гарантируется, что сумма \(n\) не превосходит \(2 \cdot 10^5\) (\(\sum n \le 2 \cdot 10^5\)).

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

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

Примечание

Рассмотрим второй набор тестовых данных примера. Он выглядит следующим образом:

Здесь есть \(11\) различных простых путей:

  1. \([1, 2]\);
  2. \([2, 3]\);
  3. \([3, 4]\);
  4. \([2, 4]\);
  5. \([1, 2, 4]\);
  6. \([1, 2, 3]\);
  7. \([2, 3, 4]\);
  8. \([2, 4, 3]\);
  9. \([3, 2, 4]\);
  10. \([1, 2, 3, 4]\);
  11. \([1, 2, 4, 3]\).

E. План лекций

графы Деревья Конструктив поиск в глубину и подобное реализация снм сортировки *2400

Иван — учитель по программированию. В течение учебного года он планирует прочитать \(n\) лекций на \(n\) различных тем. Каждая тема должна быть использована ровно в одной лекции. Иван хочет выбрать, какую тему он будет объяснять во время \(1\)-й, \(2\)-й, ..., \(n\)-й лекции — формально он хочет выбрать некоторую перестановку целых чисел от \(1\) до \(n\) (назовем эту перестановку \(q\)). \(q_i\) — это номер темы, которую Иван объяснит во время \(i\)-й лекции.

Для каждой темы (за исключением ровно одной) существует обязательная предшествующая тема (для \(i\)-й темы предшествующая тема — \(p_i\)). Иван не может читать лекцию по теме, не прочитав лекцию по ее предшествующей теме. Существует по крайней мере один допустимый порядок тем в соответствии с этими предварительными ограничениями.

Правильный порядок тем может помочь студентам лучше понять лекции. У Ивана есть \(k\) специальных пар тем \((x_i, y_i)\) таких, что он знает, что студенты лучше поймут \(y_i\)-ю тему, если лекция по ней будет проводиться сразу после лекции по \(x_i\)-й теме. Иван хочет удовлетворить ограничениям на каждую такую пару, то есть для каждого \(i \in [1, k]\) должно существовать некоторое \(j \in [1, n - 1]\) такое, что \(q_j = x_i\) и \(q_{j + 1} = y_i\).

Теперь Иван хочет знать, существует ли порядок тем, удовлетворяющий всем этим ограничениям, и если хотя бы один из них существует, найти любой из них.

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

Первая строка содержит два целых числа \(n\) и \(k\) (\(2 \le n \le 3 \cdot 10^5\), \(1 \le k \le n - 1\)) — количество тем и количество специальных пар тем соответственно.

Вторая строка содержит \(n\) целых чисел \(p_1\), \(p_2\), ..., \(p_n\) (\(0 \le p_i \le n\)), где \(p_i\) — обязательная предшествующая тема для темы \(i\) (или \(p_i = 0\), если у \(i\)-й темы нет предшествующей темы). Ровно одно из этих целых чисел равно \(0\). Существует по крайней мере один порядок тем, такой что для каждой темы \(i\) тема \(p_i\) идет до \(i\)-й темы.

Затем следует \(k\) строк, \(i\)-я строка содержит два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\); \(x_i \ne y_i\)) — темы из специальной пары \(i\). Все значения \(x_i\) попарно различны; аналогично, все значения \(y_i\) попарно различны.

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

Если не существует порядка тем, удовлетворяющих всем ограничениям, выведите \(0\).

В противном случае выведите \(n\) попарно различных целых чисел \(q_1\), \(q_2\), ..., \(q_n\) (\(1 \le q_i \le n\)) — порядок тем, удовлетворяющих всем ограничениям. Если ответов несколько, выведите любой из них.

F. Кошмар Евклида

битмаски графы жадные алгоритмы математика поиск в глубину и подобное снм сортировки *2100

Вы должно быть знаете, что Евклид был математиком. Ну, как оказалось, Морфей об этом тоже знал. Поэтому, когда он захотел разыграть Евклида, он послал ему соответствующий кошмар.

В своем плохом сне, у Евклида был набор \(S\) из \(n\) \(m\)-мерных векторов над полем \(\mathbb{Z}_2\), и он мог их складывать. Другими словами, у него были вектора с \(m\) координатами, каждая координата равнялась либо \(0\), либо \(1\). Сложение векторов определяется следующим образом: пусть \(u+v = w\), тогда \(w_i = (u_i + v_i) \bmod 2\).

Евклид может сложить любое подмножество векторов из \(S\) и сохранить получившийся \(m\)-мерный вектор над \(\mathbb{Z}_2\). В частности, он может сложить пустое подмножество векторов. В таком случае, все координаты получившегося вектора будут равны \(0\).

Пусть \(T\) будет множеством всех векторов, которые могут быть получены как сумма некоторого подмножества векторов из \(S\). Теперь Евклид интересуется, каков размер \(T\), и может ли он использовать только какое-то подмножество \(S'\) множества \(S\), чтобы получить все вектора из \(T\). Как всегда и бывает в таких ситуациях, он не проснется до тех пор, пока не выяснит это. Пока что дела для философа обстоят довольно мрачно. Однако, появилась надежда, когда он заметил, что все вектора из \(S\) содержат максимум \(2\) координаты, равные \(1\).

Помогите Евклиду вычислить \(|T|\), количество \(m\)-мерных векторов над \(\mathbb{Z}_2\), которые могут быть получены как сумма какого-то подмножества векторов из \(S\). Так как оно может быть довольно велико, выведите его по модулю \(10^9+7\). Также, вы должны найти \(S'\), минимальное такое подмножество \(S\), что все вектора из \(T\) могут быть получены как как сумма какого-то подмножества векторов из \(S'\). В случае, если существует несколько таких подмножеств с минимальным количеством элементов, выведите лексикографически минимальный по индексам взятых элементов.

Рассмотрим два множества \(A\) и \(B\), такие что \(|A| = |B|\). Пусть \(a_1, a_2, \dots a_{|A|}\) и \(b_1, b_2, \dots b_{|B|}\) будут возрастающие массивы индексов элементов, взятых в \(A\) и в \(B\), соответственно. \(A\) лексикографически меньше, чем \(B\), если существует такое \(i\), что \(a_j = b_j\) для всех \(j < i\) и \(a_i < b_i\).

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

В первой строке даны два целых числа \(n\), \(m\) (\(1 \leq n, m \leq 5 \cdot 10^5\)), обозначающие количество векторов в \(S\) и количество измерений.

В следующих \(n\) строках дано описание векторов из \(S\). В каждой из них дано целое число \(k\) (\(1 \leq k \leq 2\)), а затем \(k\) различных целых чисел \(x_1, \dots x_k\) (\(1 \leq x_i \leq m\)). Это обозначает \(m\)-мерный вектор, у которого координаты номер \(x_1, \dots x_k\) равны \(1\), а все остальные координаты равны \(0\).

Среди этих \(n\) векторов нет одинаковых.

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

В первой строке выведите два целых числа: остаток от деления \(|T|\) на \(10^9+7\), и \(|S'|\). Во второй строке выведите \(|S'|\) целых чисел — индексы элементов, входящих в \(S'\), в возрастающем порядке. Элементы \(S\) нумеруются с \(1\) в порядке, в котором они даны во входных данных.

Примечание

В первом примере нам даны три вектора:

  • \(10\)
  • \(01\)
  • \(11\)

Оказывается, что мы может представить все вектора из \(2\)-мерного пространства используя эти вектора:

  • \(00\), сумма пустого подмножества векторов;
  • \(01 = 11 + 10\), сумма первого и третьего векторов;
  • \(10 = 10\), просто первый вектор;
  • \(11 = 10 + 01\), сумма первого и второго векторов.

Поэтому, \(T = \{00, 01, 10, 11\}\). Мы можем выбрать любые два из трех векторов \(S\), и все еще будем способны получить все вектора из \(T\). В таком случае, мы выберем два первых вектора. Так как мы не можем получить все вектора из \(T\), используя только один вектор из \(S\), \(|S'| = 2\) и \(S' = \{10, 01\}\) (индексы \(1\) и \(2\)), как множество \(\{1, 2 \}\) — лексикографически минимально. Мы можем получить все вектора из \(T\), используя только вектора из \(S'\), как показано ниже:

  • \(00\), сумма пустого подмножества;
  • \(01 = 01\), просто второй вектор;
  • \(10 = 10\), просто первый вектор;
  • \(11 = 10 + 01\), сумма первого и второго вектора.

E. Различающие корни

Деревья дп поиск в глубину и подобное Структуры данных *2500

Дано дерево из \(n\) вершин. На каждой вершине записано число; на вершине \(i\) записано число \(a_i\).

Предположим, мы подвесили дерево за вершину \(v\) (сделали эту вершину корнем). Назовем \(v\) различающим корнем, если выполняется следующее условие: в каждом пути из \(v\) до некоторого листа дерева все значения, записанные на вершинах, различны. Значения, встречающихся на различных путях, могут совпадать, но значения на каждом пути, рассматриваемом в отдельности, должны быть различны.

Посчитайте количество различающих корней заданного дерева.

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

В первой строке задано одно целое число \(n\) (\(1 \le n \le 2\cdot10^5\)) — количество вершин в дереве.

Во второй строке заданы \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\)).

Далее следуют \(n-1\) строк, в каждой из которых заданы два целых числа \(u\) и \(v\) (\(1 \le u\), \(v \le n\)), обозначающих ребро, соединяющее вершины \(u\) и \(v\).

Гарантируется, что данные ребра задают дерево.

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

Выведите одно целое число — количество различающих корней в дереве.

Примечание

В первом примере из условия вершины \(1\), \(2\) и \(5\)различающие корни.

D. Странное расселение

графы жадные алгоритмы Конструктив Паросочетания поиск в глубину и подобное *2200

В ЛКШ на территории Летово школьники будь жить в домиках. Некоторые пары домиков соединены крытыми переходами, по которым можно перемещаться в обоих направлениях. В некоторых из этих домиках будут жить преподаватели, но из соображений безопасности они не могут быть размещены произвольным образом. А именно, должны выполняться следующие условия:

  • Каждый переход между домами, ни в одном из которых не живут преподаватели, будет закрыт. Все остальные переходы будут открыты.
  • От любого дома до другого должен существовать способ добраться по открытым переходам.
  • Преподаватели не могут жить в домах, соединённых переходом.

Помогите организаторам выбрать домики, в которых будут жить преподаватели, так, чтобы выполнялись все требования безопасности, или определите, что это невозможно.

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

В первой строке дано одно целое число \(t\) (\(1 \le t \le 10^5\)), обозначающее количество наборов входных данных.

Описание каждого набора входных данных начинается с двух чисел \(n\) и \(m\) (\(2 \le n \le 3 \cdot 10^5\), \(0 \le m \le 3 \cdot 10^5\)) — количества домиков и переходов.

Далее следуют \(m\) строк, в каждой из которых даны числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \neq v\)), описывающие переход между домами \(u\) и \(v\). Гарантируется, что между любыми двумя домами существует не более одного перехода, и никакой переход не соединяет домик сам с собой.

Сумма значений \(n\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\), и сумма \(m\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\).

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

Для каждого набора входных данных в первой строке выведите «YES», если организаторы могут поселить преподавателей так, чтобы выполнялись требования безопасности, и «NO» в противном случае. Если ответ «YES», то во второй строке выведите количество домов, в которые нужно поселить преподавателей, а в третьей строке — номера выбранных домов.

Примечание

Следующая картинка соответствует второму примеру из условия:

G. Переезд в столицу

графы дп кратчайшие пути поиск в глубину и подобное *2100

В Берляндии находятся \(n\) городов. Город с номером \(1\) является столицей. Некоторые пары городов соединены односторонней дорогой длины 1.

Перед поездкой Поликарп для каждого города узнал величину \(d_i\) — расстояние от столицы (города с номером \(1\)) до города с номером \(i\). Поликарп начинает своё путешествие в городе с номером \(s\) и, находясь в \(i\)-м городе, выбирает одно из следующих действий:

  1. Поехать из \(i\)-го города в \(j\)-й, если существует дорога из \(i\)-го города в \(j\)-й и \(d_i < d_j\);
  2. Поехать из \(i\)-го города в \(j\)-й, если существует дорога из \(i\)-го города в \(j\)-й и \(d_i \geq d_j\);
  3. Прекратить путешествие.

Так как правительство Берляндии не хочет, чтобы все люди съезжались в столицу, поэтому Поликарп может не более одного раза совершить действие из пункта два. Иными словами, второе действие он может совершить \(0\) или \(1\) раз. Поликарп же, наоборот, хочет оказаться как можно ближе к столице.

Например, если \(n = 6\) и города соединены, как на картинке выше, то Поликарп мог совершить следующие путешествия (не все возможные варианты):

  • \(2 \rightarrow 5 \rightarrow 1 \rightarrow 2 \rightarrow 5\);
  • \(3 \rightarrow 6 \rightarrow 2\);
  • \(1 \rightarrow 3 \rightarrow 6 \rightarrow 2 \rightarrow 5\).

Поликарп хочет узнать для каждого стартового города \(i\) узнать, на какое ближайшее расстояние он может подобраться к столице. Более формально: он хочет узнать минимальное значение \(d_j\), такое что Поликарп может добраться из города \(i\) в город \(j\) по выше описанным правилам.

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

В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

Перед каждым набором входных данных расположена пустая строка.

Первая строка каждого набора содержит два целых числа \(n\) (\(2 \leq n \leq 2 \cdot 10^5\)) и \(m\) (\(1 \leq m \leq 2 \cdot 10^5\)) — количество городов и дорог соответственно.

Далее следуют \(m\) строк, описывающих дороги. Каждая дорога характеризуется двумя целыми числами \(u\) и \(v\) (\(1 \leq u, v \leq n, u \ne v\)) — номера городов, соединённых односторонней дорогой.

Гарантируется, что суммы \(n\) и \(m\) по всем наборам входных данных не превышают \(2 \cdot 10^5\).

Гарантируется, что для каждой пары различных городов \((u, v)\) существует не более одной дороги из \(u\) в \(v\) (но пара встречных дорог из \(u\) в \(v\) и из \(v\) в \(u\) — допустима).

Гарантируется, что из столицы существует путь до всех городов.

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

Для каждого набора входных данных в отдельной строке выведите \(n\) чисел, \(i\)-е из которых равно минимально возможному расстоянию от столицы до города, в котором Поликарп закончил своё путешествие.

D. Путешествие

дп поиск в глубину и подобное реализация снм *1700

В некоторой стране \(n + 1\) городов, пронумерованных от \(0\) до \(n\). \(n\) дорог соединяют эти города, \(i\)-я дорога соединяет города \(i - 1\) и \(i\) (\(i \in [1, n]\)).

У каждой дороги есть направление. Направления задаются строкой из \(n\) символов, каждый символ — либо L, либо R. Если \(i\)-й символ — L, то \(i\)-я дорога сначала направлена из города \(i\) в город \(i - 1\); иначе она направлена из города \(i - 1\) в город \(i\).

Путешественник хочет посетить как можно больше городов этой страны. Сначала он выбирает город, из которого начнет свое путешествие. Каждый день путешественник должен перейти из текущего города в соседний город по дороге, и он может перейти по дороге только в соответствии с ее направлением; то есть, если дорога направлена из города \(i\) в город \(i + 1\), он может перейти из города \(i\) в город \(i + 1\), но не из \(i + 1\) в \(i\). После того как путешественник перемещается в соседний город, все дороги меняют свое направление на противоположное. Если путешественник не может перейти в соседний город, он обязан закончить свое путешествие; также он может закончить путешествие в любой момент, в который захочет.

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

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

В первой строке задано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Каждый набор входных данных состоит из двух строк. В первой строке задано одно целое число \(n\) (\(1 \le n \le 3 \cdot 10^5\)). Во второй строке — последовательность \(s\), состоящая из ровно \(n\) символов, каждый из которых — L или R.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\).

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

Для каждого набора входных данных выведите \(n + 1\) целое число. \(i\)-е число должно быть равно максимальному количеству городов, которое можно посетить за одно путешествие, если это путешествие начинается в \(i\)-м городе.

E. Сопоставление шаблонов

битмаски графы поиск в глубину и подобное сортировки Строки Структуры данных хэши *2300

Вам даны \(n\) шаблонов \(p_1, p_2, \dots, p_n\) и \(m\) строк \(s_1, s_2, \dots, s_m\). Каждый шаблон \(p_i\) состоит из \(k\) символов, каждый из которых — это либо строчная латинская буква или символ подчеркивания. Все шаблоны попарно различны. Каждая строка \(s_j\) состоит из \(k\) строчных латинских букв.

Строка \(a\) подходит под шаблон \(b\), если для каждого \(i\) от \(1\) до \(k\) либо \(b_i\) — это подчеркивание, либо \(b_i=a_i\).

Вам требуется переупорядочить шаблоны таким образом, что первый шаблон, под который подходит \(j\)-я строка, — это \(p[mt_j]\). Разрешается не изменять порядок шаблонов.

Можно ли осуществить такое переупорядочивание? Если можно, то выведите любой корректный порядок.

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

В первой строке записаны три целых числа \(n\), \(m\) and \(k\) (\(1 \le n, m \le 10^5\), \(1 \le k \le 4\)) — количество шаблонов, количество строк и длина каждого шаблона и строки.

В каждой из следующих \(n\) строк записан шаблон — \(k\) символов, каждый из которых — это либо строчная латинская буква или символ подчеркивания. Все шаблоны попарно различны.

В каждой из следующих \(m\) строк записана строка — \(k\) строчных латинских букв, и целое число \(mt\) (\(1 \le mt \le n\)) — номер первого шаблона, под который должна подходить соответствующая строка.

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

Выведите «NO», если невозможно переупорядочить шаблоны так, чтобы первый шаблон, под который подходит \(j\)-я строка, был \(p[mt_j]\).

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

Примечание

Порядок шаблонов в первом примере после переупорядочивания:

  • aaaa
  • __b_
  • ab__
  • _bcd
  • _b_d

Тогда первая строка подходит под шаблоны ab__, _bcd, _b_d в таком порядке, первый из них равен ab__, который действительно \(p[4]\). Вторая строка подходит под шаблоны __b_ и ab__, первый из них __b_, который равен \(p[2]\). Последняя строка подходит под шаблоны _bcd и _b_d, первый из них _bcd, который равен \(p[5]\).

Ответ на этот тест не единственный, другие корректные порядки существуют.

Во втором примере cba не подходит под шаблон __c, а значит, корректного порядка не существует.

В третьем примере в порядке (a_, _b) получается, что первый шаблон под который подходят обе строки — это \(1\), а в порядке (_b, a_) получается, что первый шаблон под который подходят обе строки — это \(2\). Значит, не существует такого порядка, что ответ равен \(1\) и \(2\).

D. Nezzar и тайные перестановки

графы Конструктив поиск в глубину и подобное *2800

Nezzar придумал абсолютно новую игру «Тайные перестановки» и собирается сыграть в нее со своим лучшим другом Nanako.

В начале игры Nanako и Nezzar оба знают два целых числа \(n\) и \(m\). Игра происходит следующим образом.

  • Сначала Nezzar тайно загадывает две перестановки \(p_1,p_2,\ldots,p_n\) и \(q_1,q_2,\ldots,q_n\) целых чисел от \(1\) до \(n\). Nanako тайно загадывает \(m\) неупорядоченных пар \((l_1,r_1),(l_2,r_2),\ldots,(l_m,r_m)\);
  • Затем Nanako показывает выбранные пары Nezzar;
  • Видя эти \(m\) неупорядоченных пар, Nezzar проверяет, существует ли такое \(1 \le i \le m\), что \((p_{l_i}-p_{r_i})\) и \((q_{l_i}-q_{r_i})\) имеют различные знаки. Если да, то Nezzar моментально проигрывает игру и получает счет \(-1\). Иначе счет, который Nezzar получает, равен количеству индексов \(1 \le i \le n\) таких, что \(p_i \neq q_i\).

Однако Nezzar случайно узнал пары Nanako заранее и решил извлечь из этого выгоду. Помогите Nezzar найти две перестановки \(p\) и \(q\) такие, что счет игры будет максимальным.

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

В первой строке находится единственное целое число \(t\) (\(1 \le t \le 5 \cdot 10^5\)) — количество наборов входных данных.

В первой строке описания каждого набора входных данных находятся два целых числа \(n,m\) (\(1 \le n \le 5 \cdot 10^5, 0 \le m \le \min(\frac{n(n-1)}{2},5 \cdot 10^5)\)).

Затем следуют \(m\) строк, \(i\)-я из них содержит два целых числа \(l_i,r_i\) (\(1 \le l_i,r_i \le n\), \(l_i \neq r_i\)), описывающих \(i\)-ю пару, которую выбрал Nanako. Гарантируется, что все \(m\) неориентированных пар различны.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(5 \cdot 10^5\), и что сумма \(m\) по всем наборам входных данных не превосходит \(5\cdot 10^5\).

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

Для каждого набора входных данных выведите две перестановки \(p_1,p_2,\ldots,p_n\) и \(q_1,q_2,\ldots,q_n\) такие, что счет, который получит Nezzar, будет максимальным.

Примечание

В первом наборе входных данных для каждой пары Nanako:

  • для первой пары \((1,2)\): \(p_1 - p_2 = 1 - 2 = -1\), \(q_1 - q_2 = 3 - 4 = -1\), они имеют одинаковый знак;
  • для второй пары \((3,4)\): \(p_3 - p_4 = 3 - 4 = -1\), \(q_3 - q_4 = 1 - 2 = -1\), они имеют одинаковый знак.

Поскольку Nezzar не проиграл моментально, Nezzar получает счет \(4\), потому что \(p_i \neq q_i\) для всех \(1 \leq i \leq 4\). Очевидно, что это максимально возможный счет, который Nezzar может получить.

E. Передвижения и замены

Деревья дп жадные алгоритмы поиск в глубину и подобное *2500

Вам дано \(n - 1\) целое число \(a_2, \dots, a_n\) и корневое дерево с \(n\) вершинами, подвешенное в вершине \(1\). Все листья находятся на одинаковом расстоянии \(d\) от корня.

Деревом называется связный неориентированный граф без циклов. Расстоянием между парой вершин называется количество ребер на простом пути между ними. Все некорневые вершины, имеющие степень \(1\), называются листьями. Если вершины \(s\) и \(f\) соединены ребром, и \(f\) находится на расстоянии от корня большем, чем \(s\), то \(f\) называется сыном \(s\).

Изначально в вершине \(1\) находятся красная и синяя фишки. Давайте обозначим за \(r\) вершину, в которой находится красная фишка, и за \(b\) вершину, в которой находится синяя фишка. Вы должны сделать \(d\) ходов. Ход состоит из трех шагов:

  • Переместить красную фишку в любого сына \(r\).
  • Переместить синюю фишку в любую вершину \(b'\) такую, что \(dist(1, b') = dist(1, b) + 1\). Здесь \(dist(x, y)\) обозначает длину кратчайшего пути между \(x\) и \(y\). Обратите внимание, что \(b\) и \(b'\) не обязательно соединены ребром.
  • Вы можете, если хотите, поменять две фишки местами (или пропустить этот шаг).

Обратите внимание, что \(r\) и \(b\) могут быть равны в любой момент времени, а в корне дерева не записано никакое число.

После каждого хода вы получаете \(|a_r - a_b|\) очков. Какое максимальное количество очков вы можете получить после \(d\) ходов?

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

В первой строке находится единственное целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

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

Во второй строке описания каждого набора входных данных находится \(n-1\) целое число \(v_2, v_3, \dots, v_n\) (\(1 \leq v_i \leq n\), \(v_i \neq i\)) — \(i\)-е из них означает, что есть ребро между вершинами \(i\) и \(v_i\). Гарантируется, что эти ребра образуют дерево.

В третьей строке описания каждого набора входных данных находится \(n-1\) целое число \(a_2, \dots, a_n\) (\(1 \leq a_i \leq 10^9\)) — числа, записанные в вершинах.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

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

Для каждого набора входных данных выведите единственное целое число: максимальное количество очков, которое вы можете получить после \(d\) ходов.

Примечание

В первом наборе входных данных оптимальное решение — это:

  • ход \(1\): \(r = 4\), \(b = 2\); нет замены;
  • ход \(2\): \(r = 7\), \(b = 6\); замена (после нее \(r = 6\), \(b = 7\));
  • ход \(3\): \(r = 11\), \(b = 9\); нет замен.

Общее количество очков равно \(|7 - 2| + |6 - 9| + |3 - 9| = 14\).

Во втором наборе входных данных оптимальное решение — это:

  • ход \(1\): \(r = 2\), \(b = 2\); нет замены;
  • ход \(2\): \(r = 3\), \(b = 4\); нет замены;
  • ход \(3\): \(r = 5\), \(b = 6\); нет замены.

Общее количество очков равно \(|32 - 32| + |78 - 69| + |5 - 41| = 45\).

F. Пары путей

Деревья дп Комбинаторика поиск в глубину и подобное Структуры данных *2600

У вас есть дерево из \(n\) вершин, а также \(m\) простых вершинных путей. Ваша задача — найти, сколько пар этих путей пересекаются по ровно одной вершине. Более формально, вам нужно найти число пар \((i, j)\) \((1 \leq i < j \leq m)\) таких, что \(path_i\) и \(path_j\) имеют ровно одну общую вершину.

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

В первой строке находится единственное целое число \(n\) \((1 \leq n \leq 3 \cdot 10^5)\).

Следующие \(n - 1\) строк описывают дерево. На каждой строке находится два целых числа \(u\) и \(v\) \((1 \leq u, v \leq n)\) описывающие ребро между вершинами \(u\) и \(v\).

В следующей строке находится единственное целое число \(m\) \((1 \leq m \leq 3 \cdot 10^5)\).

Следующие \(m\) строк описывают пути. Каждая строка описывает путь своими крайними точками \(u\) и \(v\) \((1 \leq u, v \leq n)\). Путь задается всеми вершинами на кратчайшем пути из \(u\) в \(v\) (включая \(u\) и \(v\)).

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

Выведите единственное целое число — количество пар путей, которые пересекаются по ровно одной вершине.

Примечание

Дерево и пути в первом примере выглядят так. Пары \((1,4)\) и \((3,4)\) пересекаются по ровно одной вершине.

Во втором примере все пути состоят из единственной одинаковой вершины, так что все пары \((1, 2)\), \((1, 3)\) и \((2, 3)\) пересекаются по одной вершине.

Третий пример, такой же как первый, но с двумя дополнительными путями. Пары \((1,4)\), \((1,5)\), \((2,5)\), \((3,4)\), \((3,5)\), \((3,6)\) и \((5,6)\) пересекаются по ровно одной вершине.

C. Как можно меньше ничьих

графы жадные алгоритмы Конструктив математика Перебор поиск в глубину и подобное реализация *1500

Скоро состоится большой футбольный чемпионат! \(n\) команд будут участвовать в нем, и каждая пара различных команд сыграет ровно один матч друг с другом.

У матча может быть два различных исхода:

  • матч может закончиться вничью, тогда обе команды получат по \(1\) очку;
  • одна из команд может победить, тогда победившая команда получит \(3\) очка, а проигравшая — \(0\).

Счет команды — суммарное количество очков, полученное командой за все матчи, в которых она играла.

Вас интересует гипотетическая ситуация, в которой все команды будут в конце чемпионата иметь одинаковый счет. Простой пример такой ситуации — если все матчи закончатся вничью, но вас интересует подобная ситуация с минимально возможным количеством ничьих.

Ваша задача — найти ситуацию (выбрать результат каждой игры), в которой у всех команд одинаковый итоговый счет, а количество ничьих минимально возможно.

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

В первой строке задано одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

Затем следуют сами наборы входных данных. Каждый набор описывается одной строкой, содержащей целое число \(n\) (\(2 \le n \le 100\)) — количество команд.

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

Для каждого набора входных данных выведите \(\frac{n(n - 1)}{2}\) целых чисел, описывающих результаты игр в следующем порядке: первое число соответствует результату матча между командой \(1\) и командой \(2\), второе — между командой \(1\) и командой \(3\), затем \(1\) и \(4\), ..., \(1\) и \(n\), \(2\) и \(3\), \(2\) и \(4\), ..., \(2\) и \(n\), и так далее, до результата матча между командой \(n - 1\) и командой \(n\).

Число, соответствующее результату матча между командой \(x\) и командой \(y\), должно быть равно \(1\), если побеждает команда \(x\), \(-1\), если побеждает команда \(y\), или \(0\), если матч заканчивается вничью.

Все команды должны иметь одинаковый итоговый счет, и количество ничьих должно быть минимально возможным. Если оптимальных ответов несколько — выведите любой из них. Можно показать, что всегда есть способ составить результаты игр так, что все команды имеют одинаковый итоговый счет.

Примечание

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

Во втором наборе входных данных из примера команда \(1\) побеждает команду \(2\) (команда \(1\) получает \(3\) очка), команда \(1\) проигрывает команде \(3\) (команда \(3\) получает \(3\) очка), и команда \(2\) выигрывает у команды \(3\) (команда \(2\) получает \(3\) очка).

D. Трансформация перестановки

поиск в глубину и подобное разделяй и властвуй реализация *1200

Перестановка — это последовательность длины \(n\) целых чисел от \(1\) до \(n\), в которой все числа встречаются ровно по одному разу. Например, \([1]\), \([3, 5, 2, 1, 4]\), \([1, 3, 2]\) — перестановки, а \([2, 3, 2]\), \([4, 3, 1]\), \([0]\) — нет.

Поликарпу недавно подарили перестановку \(a[1 \dots n]\) длины \(n\). Поликарпу деревья нравятся больше, чем перестановки, поэтому он хочет превратить перестановку \(a\) в корневое бинарное дерево. Массив различных целых чисел он превращает в дерево следующим образом:

  • максимальный элемент массива становится корнем дерева;
  • все элементы слева от максимума — образуют левое поддерево (которое строится по тем же правилам, но применяемым для левого участка массива), но если слева от максимума элементов нет, то у корня нет левого сына;
  • все элементы справа от максимума — образуют правое поддерево (которое строится по тем же правилам, но применяемым для правого участка массива), но если справа от максимума элементов нет, то у корня нет правого сына.

Например, если он строит дерево по перестановке \(a=[3, 5, 2, 1, 4]\), то корнем будет элемент \(a_2=5\), левым поддеревом будет дерево, которое будет построено для подмассива \(a[1 \dots 1] = [3]\), а правым — для подмассива \(a[3 \dots 5] = [2, 1, 4]\). В итоге будет построено следующее дерево:

Дерево, соответствующее перестановке \(a=[3, 5, 2, 1, 4]\).

Другой пример: пусть перестановка имеет вид \(a=[1, 3, 2, 7, 5, 6, 4]\). В этом случае дерево выглядит так:

Дерево, соответствующее перестановке \(a=[1, 3, 2, 7, 5, 6, 4]\).

Обозначим за \(d_v\) глубину вершины \(a_v\), то есть количество ребер на пути от корня до вершины с номером \(a_v\). Заметьте, что глубина корня равна нулю. По заданной перестановке \(a\) для каждой вершины найдите значение \(d_v\).

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

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \le n \le 100\)) – длину перестановки.

Далее следуют \(n\) различных целых чисел \(a_1, a_2, \ldots, a_n\) — перестановка \(a\).

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

Для каждого набор входных данных выведите \(n\) значений — \(d_1, d_2, \ldots, d_n\).

E. Фиб-дерево

Деревья Перебор поиск в глубину и подобное разделяй и властвуй теория чисел *2400

Пусть \(F_k\) обозначает \(k\)-й член последовательности Фибоначчи, определенной следующим образом:

  • \(F_0 = F_1 = 1\)
  • для любого целого \(n \geq 0\), \(F_{n+2} = F_{n+1} + F_n\).

Вам дано дерево с \(n\) вершинами. Напомним, что дерево — это связный неориентированный граф без циклов.

Дерево называется Фиб-деревом, если его количество вершин равно \(F_k\) для некоторого \(k\), и выполняется хотя бы одно из следующих условий:

  • Дерево состоит только из \(1\) вершины;
  • Вы можете разделить его на два Фиб-дерева, удалив некоторое ребро дерева.

Определите, является ли данное дерево Фиб-деревом.

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

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

Далее следуют \(n-1\) строк, каждая из которых содержит два целых числа \(u\) и \(v\) (\(1\leq u,v \leq n\), \(u \neq v\)), обозначающие ребро между вершинами \(u\) и \(v\). Гарантируется, что данные ребра образуют дерево.

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

Выведите «YES», если данное дерево является Фиб-деревом, или «NO», если не является.

Ответ можно вывести в любом регистре. Например, если ответ «YES», то вывод «Yes» или «yeS» также будет считаться правильным ответом.

Примечание

В первом примере можно удалить ребро \((1, 2)\), и дерево будет разбито на \(2\) дерева размера \(1\) и \(2\) соответственно. Любое дерево размера \(2\) является Фиб-деревом, так как его можно разбить на \(2\) дерева размером \(1\).

Во втором примере, независимо от того, какое ребро мы удаляем, дерево будет разбито на \(2\) дерева размера \(1\) и \(4\). Поскольку \(4\) не равняется \(F_k\) ни для какого \(k\), это не Фиб-дерево.

В третьем примере, вот один из возможных порядков удаления ребер, чтобы все деревья в процессе были Фиб-деревьями: \((1, 3), (1, 2), (4, 5), (3, 4)\).

E. Почти отказоустойчивая база данных

жадные алгоритмы Конструктив Перебор поиск в глубину и подобное реализация *2500

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

К сожалению, недавно в базе данных произошла масштабная авария, которая потенциально изменила информацию в каждой копии.

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

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

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

В первой строке задано два целых числа \(n\) и \(m\) (\(2 \le n\); \(1 \le m\); \(n \cdot m \le 250\,000\)) — количество физических копий исходной информации и размер массива исходной информации, соответственно.

В каждой из следующих \(n\) строк задан массив из \(m\) чисел \(s_{i, 1}, s_{i, 2}, \dots, s_{i, m}\) (\(1 \le s_{i, j} \le 10^9\)) — очередная физическая копия в базе данных после аварии.

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

Если можно восстановить массив, который мог бы представлять исходную информацию, то выведите в первой строке слово «Yes», и во второй строке сам массив из ровно \(m\) чисел от \(1\) до \(10^9\).

Если возможных ответов несколько, то выведите любой.

Если ни одного ответа нет, то выведите в единственной строке слово «No».

Примечание

В первом примере массив \([1, 10, 1, 100]\) отличается от первой и второй физических копий ровно в одной позиции, от третьей физической копии ровно в двух позициях.

Во втором примере массив \([1, 1, 1, 1, 1, 1, 1]\) равен первой физической копии и отличается от каждой из остальных девяти физических копий не более чем в двух позициях.

В третьем примере невозможно найти какой-нибудь массив, который отличается не более чем в двух позициях от обеих физических копий после аварии.

D. Dogeforces

Деревья жадные алгоритмы Конструктив поиск в глубину и подобное разделяй и властвуй снм сортировки Структуры данных *2300

В компании Dogeforces работают \(k\) сотрудников. У каждого сотрудника, кроме сотрудников нижнего звена, есть не менее \(2\) подчиненных. У сотрудников нижнего звена нет подчиненных. У каждого сотрудника (кроме руководителя компании) есть ровно один непосредственный начальник. Руководитель компании является непосредственным или косвенным начальником всех сотрудников. Известно, что в Dogeforces любой начальник получает зарплату строго больше, чем все его подчиненные.

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

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

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 500\)) — количество сотрудников нижнего звена.

Далее следует \(n\) строк, где \(i\)-я строка содержит \(n\) целых чисел \(a_{i,1}, a_{i,2}, \dots, a_{i,n}\) (\(1 \le a_{i,j} \le 5000\)) — зарплата общего начальника сотрудников с номерами \(i\) и \(j\). Гарантируется, что \(a_{i,j} = a_{j,i}\). Обратите внимание, что \(a_{i,i}\) равно зарплате \(i\)-го сотрудника.

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

В первую строку выведите одно целое число \(k\) — количество сотрудников в компании.

Во второй строке выведите \(k\) целых чисел \(c_1, c_2, \dots, c_k\), где \(c_i\) — зарплата сотрудника с номером \(i\).

В третьей строке выведите одно целое число \(r\) — номер сотрудника, который является руководителем компании.

В последующих \(k-1\) строках выведите по два целых числа \(v\) и \(u\) (\(1 \le v, u \le k\)) — номер сотрудника и его непосредственного начальника.

Обратите внимание, что сотрудники нижнего звена имею номера с \(1\) по \(n\), а для остальных сотрудников вам предстоит назначить номера от \(n+1\) до \(k\). Если корректных структур компании несколько, вы можете вывести любую из них.

Примечание

Одна из возможных структур в первом примере:

F. Уничтожение ребер

графы Конструктив Перебор поиск в глубину и подобное реализация *2900

Вам дан неориентированный связный граф, состоящий из \(n\) вершин и \(m\) ребер. Ваша цель — уничтожить все ребра данного графа.

Вы можете выбрать любую вершину в качестве начальной и начать ходить от нее по ребрам. Когда вы идете по ребру, вы разрушаете его. Очевидно, что вы не можете пройти по ребру, если оно уже разрушено.

Вы можете выполнить операцию смена режима не более одного раза во время обхода, и эта операция может быть выполнена только тогда, когда вы находитесь в какой-то вершине (вы не можете выполнить ее во время обхода ребра). После смены режима ребра, через которые вы проходите, удаляются следующим образом: первое ребро после смены режима не уничтожается, второе — уничтожается, третье — не уничтожается, четвертое — уничтожается и так далее. Вы не можете переключиться обратно в исходный режим, и вам не нужно выполнять эту операцию, если вы этого не хотите.

Можете ли вы уничтожить все ребра данного графа?

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

Первая строка содержит два целых числа \(n\) и \(m\) (\(2 \le n \le 3000\); \(n - 1 \le m \le \min(\frac{n(n-1)}{2}, 3000\))) — число вершин и число ребер в графе.

Затем следуют \(m\) строк, каждая из которых содержит два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\); \(x_i \ne y_i\)) — концы \(i\)-го ребра.

Эти ребра образуют связный неориентированный граф без кратных ребер.

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

Если невозможно уничтожить все ребра, выведите 0.

В противном случае выведите последовательность ваших действий следующим образом. Сначала выведите \(k\) — количество действий (\(k \le 2m + 2\)). Затем выведите саму последовательность, состоящую из \(k\) целых чисел. Первое целое число должно быть индексом стартовой вершины. Затем каждое следующее целое число должно быть либо индексом следующей вершины в вашем обходе, либо \(-1\), если вы используете операцию смена режима. Вы можете использовать операцию смена режима не более одного раза.

Если ответов несколько, выведите любой из них.

D. Деревья поиска в ширину

графы Деревья Комбинаторика кратчайшие пути математика поиск в глубину и подобное *2600

Будем говорить, что остовное дерево некоторого графа является деревом поиска в ширину с корнем в вершине \(s\), если и только если для всех вершин \(t\) кратчайшее расстояние между вершинами \(s\) и \(t\) в графе равно кратчайшему расстоянию между \(s\) и \(t\) в этом остовном дереве.

Для фиксированного графа можно определить \(f(x,y)\) как число остовных деревьев в данном графе таких, что они являются деревьями поиска в ширину как с корнем в \(x\), так и с корнем в \(y\).

Вам дан неориентированный связный граф с \(n\) вершинами и \(m\) ребрами. Вычислите \(f(i,j)\) для всех \(i\), \(j\) по модулю \(998\,244\,353\).

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

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \le n \le 400\), \(0 \le m \le 600\)) — количество вершин и ребер в графе.

\(i\)-я из следующих \(m\) строк содержит два целых числа \(a_i\), \(b_i\) (\(1 \leq a_i, b_i \leq n\), \(a_i < b_i\)), описывающих ребро, соединяющее \(a_i\) и \(b_i\).

Гарантируется, что все ребра различны, а граф — связный.

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

Выведите \(n\) строк, каждая из которых содержит \(n\) целых чисел.

Число в строке \(i\) на позиции \(j\) должно быть равно \(f(i,j) \bmod 998\,244\,353\).

Примечание

Изображения ниже описывают первый пример.

Дерево из красных ребер является деревом поиска в ширину с корнем как в \(1\), так и в \(2\).

Похожим образом можно построить деревья поисков в ширину для любой пары соседних вершин.

D. Бананы в микроволновке

графы дп поиск в глубину и подобное реализация *2200

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

Пусть \(k\) будет равно текущему количеству бананов в микроволновке. Изначально \(k = 0\). В \(i\)-й операции на вход подаются три параметра \(t_i\), \(x_i\), \(y_i\). В зависимости от значения \(t_i\) необходимо сделать одно из следующий действий:

Тип 1: (\(t_i=1\), \(x_i\), \(y_i\)) — выберите \(a_i\) такое, что \(0 \le a_i \le y_i\), и произведите следующую замену \(a_i\) раз: \(k:=\lceil (k + x_i) \rceil\).

Тип 2: (\(t_i=2\), \(x_i\), \(y_i\)) — выберите \(a_i\) такое, что \(0 \le a_i \le y_i\), и произведите следующую замену \(a_i\) раз: \(k:=\lceil (k \cdot x_i) \rceil\).

Обратите внимание, что \(x_i\) может быть дробным значением. Смотрите формат входных данных для пояснения. Также \(\lceil x \rceil\) — это наименьшее целое число \(\ge x\).

В \(i\)-й момент времени необходимо произвести \(i\)-ю операцию ровно один раз.

Для каждого \(j\) такого, что \(1 \le j \le m\), выведите самый ранний момент времени такой, что вы можете получить ровно \(j\) бананов. Если нельзя получить ровно \(j\) бананов, то выведите \(-1\).

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

В первой строке записаны два целых числа \(n\) \((1 \le n \le 200)\) и \(m\) \((2 \le m \le 10^5)\).

Затем следуют \(n\) строк, где \(i\)-я строка описывает операцию в \(i\)-й момент времени. Каждая строка содержит три целых числа \(t_i\), \(x'_i\) и \(y_i\) (\(1 \le t_i \le 2\), \(1\le y_i\le m\)).

Обратите внимание, что задается \(x'_i\), которое равно \(10^5 \cdot x_i\). Чтобы получить \(x_i\), используйте формулу \(x_i= \dfrac{x'_i} {10^5}\).

Для операций типа 1 \(1 \le x'_i \le 10^5 \cdot m\), а для операций типа 2 \(10^5 < x'_i \le 10^5 \cdot m\).

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

Выведите \(m\) целых чисел, где \(i\)-е число равно самому раннему моменту времени, в который можно получить ровно \(i\) бананов (или \(-1\), если это невозможно).

Примечание

В первом примере мы хотим показать, как получить \(16\) бананов за три момента времени. Изначально \(k=0\).

  • В момент времени 1 мы выбираем \(a_1=2\), поэтому мы применяем обновление типа 1 — \(k := \lceil(k+3)\rceil\) — два раза. Поэтому \(k\) теперь 6.
  • В момент времени 2 мы выбираем \(a_2=0\), поэтому \(k\) не изменяется.
  • В момент времени 3 мы выбираем \(a_3=1\), поэтому мы применяем обновление типа 1 \(k:= \lceil(k+10)\rceil\) один раз. Поэтому \(k\) теперь 16.

Можно показать, что \(k=16\) нельзя получить быстрее, чем за три момента времени, используя данные операции.

Во втором примере мы хотим показать, как получить \(17\) бананов за два момента времени. Изначально \(k=0\).

  • В момент времени 1 мы выбираем \(a_1=1\), поэтому мы применяем обновление типа 1 — \(k := \lceil(k+3.99999)\rceil\) — один раз. Поэтому \(k\) теперь 4.
  • В момент времени 2 мы выбираем \(a_2=1\), поэтому мы применяем обновление типа 2 — \(k := \lceil(k\cdot 4.12345)\rceil\) — один раз. Поэтому \(k\) теперь 17.

Можно показать, что \(k=17\) нельзя получить быстрее, чем за два момента времени, используя данные операции.

F. Рождественская игра

битмаски Деревья дп игры математика поиск в глубину и подобное Структуры данных *2500

Алиса и Боб собираются отмечать Рождество, играя в игру с деревом подарков. Дерево состоит из \(n\) вершин (пронумерованных от \(1\) до \(n\), вершина \(r\) является корнем). На \(i\)-й вершине висят \(a_i\) подарков.

Перед началом игры выбирается некоторое целое число \(k\). Затем игра проходит следующим образом:

  • Алиса начинает игру, затем ходы совершаются обоими игроками по очереди;
  • на каждом ходу текущий игрок выбирает некоторую вершину (например, \(i\)), которая находится на глубине хотя бы \(k\). Затем игрок снимает некоторое положительное целое число подарков, которые висят на этой вершине, — назовем его \(m\) \((1 \le m \le a_i)\);
  • затем игрок вешает эти \(m\) подарков на \(k\)-го предка (назовем его \(j\)) \(i\)-й вершины (\(k\)-м предком вершины \(i\) назовем такую вершину \(j\), что \(i\) — потомок \(j\), а глубина \(j\) ровно на \(k\) меньше глубины \(i\)). Теперь количество подарков на \(i\)-й вершине \((a_i)\) уменьшилось на \(m\), а \(a_j\), соответственно, увеличилось на \(m\);
  • Алиса и Боб играют оптимально. Тот, кто не может совершить ход, проигрывает.

Для каждого возможного корня дерева сообщите, кто выиграет игру — Алиса или Боб.

Глубина вершины \(i\) в дереве с корнем \(r\) определяется, как количество ребер на простом пути из вершины \(r\) до вершины \(i\). Глубина корня \(r\) равна нулю.

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

В первой строке записаны два целых числа \(n\) и \(k\) \((3 \le n \le 10^5, 1 \le k \le 20)\).

В каждой из следующих \(n-1\) строк записаны два целых числа \(x\) и \(y\) \((1 \le x, y \le n, x \neq y)\), описывающие неориентированное ребро между двумя вершинами \(x\) и \(y\). Эти ребра образуют дерево из \(n\) вершин.

В следующей строке записаны \(n\) целых чисел, задающих массив \(a\) \((0 \le a_i \le 10^9)\).

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

Выведите \(n\) целых чисел, где \(i\)-е число равно \(1\), если Алиса выиграет игру, если дерево подвешено за вершину \(i\), и \(0\) в противном случае.

Примечание

Посчитаем ответ для примера с корнем в 1 и в 2.

Корень 1

Алиса всегда выигрывает в данном случае. Возможная игра между Алисой и Бобом выглядит так:

  • Алиса перемещает один подарок из вершины 4 в вершину 3.
  • Боб перемещает четыре подарка из вершины 5 в вершину 2.
  • Алиса перемещает четыре подарка из вершины 2 в вершину 1.
  • Боб перемещает три подарка из вершины 2 в вершину 1.
  • Алиса перемещает три подарка из вершины 3 в вершину 1.
  • Боб перемещает три подарка из вершины 4 в вершину 3.
  • Алиса перемещает три подарка из вершины 3 в вершину 1.

Боб не может сделать ход, а потому проигрывает.

Корень 2

Боб всегда выигрывает в данном случае. Пример игры:

  • Алиса перемещает четыре подарка из вершины 4 в вершину 3.
  • Боб перемещает четыре подарка из вершины 5 в вершину 2.
  • Алиса перемещает шесть подарков из вершины 3 в вершину 1.
  • Боб перемещает шесть подарков из вершины 1 в вершину 2.

Алиса не может сделать ход, а потому проигрывает.

F. Разрезы диаметров

Деревья дп Комбинаторика поиск в глубину и подобное *2400

Задано целое число \(k\) и неориентированное дерево, состоящее из \(n\) вершин.

Длина простого пути (пути, в котором каждая вершина встречается не более одного раза) между некоторой парой вершин равна количеству ребер в данном пути. Диаметр дерева равен максимальной длине пути между всеми парами вершин в дереве.

Вы планируете удалить множество ребер из дерева. Когда ребра удаляются, дерево распадается на несколько меньших деревьев. Множество ребер считается корректным, если у всех полученных деревьев диаметр меньше либо равен \(k\).

Два множества ребер считаются различными, если существует такое ребро, что оно встречается только в одном из множеств.

Посчитайте количество корректных множеств ребер по модулю \(998\,244\,353\).

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

В первой строке записаны два целых числа \(n\) и \(k\) (\(2 \le n \le 5000\), \(0 \le k \le n - 1\)) — количество вершин в дереве и максимальный разрешенный диаметр, соответственно.

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

Заданные ребра образуют дерево.

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

Выведите одно целое число — количество корректных множеств ребер по модулю \(998\,244\,353\).

Примечание

В первом примере диаметр заданного дерева уже меньше либо равен \(k\). Поэтому можно выбрать любое множество ребер, и в полученных деревьях диаметры будут меньше либо равны \(k\). Всего есть \(2^3\) множеств, включая пустое.

Во втором примере нужно удалить единственное ребро. Иначе диаметр будет \(1\), что больше \(0\).

Деревья для третьего и четвертого примеров:

B. Количество строк

графы Комбинаторика математика поиск в глубину и подобное *1600

Для тех, кто еще не понял: этой зимой в городе XXXводске реально холодно! Настолько холодно, что в голову порой лезут странные мысли. Например, сколько существует строк длины ровно n, над алфавитом размера m, таких, что любая подстрока длины в точности k является палиндромом. Ваша задача — найти это количество по модулю 1000000007 (109 + 7). Смотрите не упустите ни одной!

Напоминаем, что подстрока является палиндромом, если она одинаково читается как слева направо, так и справа налево.

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

Первая и единственная строка содержит три целых числа: n, m и k (1 ≤ n, m, k ≤ 2000).

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

Выведите одно целое число — количество строк описанного вида по модулю 1000000007 (109 + 7).

Примечание

В первом примере допустимой является только одна строка: «a» (обозначим как «a» единственную букву нашего алфавита).

Во втором примере (если обозначить буквы алфавита как «a» и «b») допустимы следующие строки: «aaaaa» и «bbbbb».

C. Завершите MST

битмаски графы Деревья жадные алгоритмы Перебор поиск в глубину и подобное снм Структуры данных *2500

Как преподаватель, Riko Hakozaki часто помогает ученикам в решении задач по различным предметам. Сегодня ее попросили помочь с задачей по программированию, которая заключается в следующем.

Вам выдается неориентированный полный граф с \(n\) вершинами, где для некоторых ребер заданы положительные веса, а для остальных нет. Вам нужно назначить всем еще не назначенным рёбрам неотрицательные веса так, чтобы у получившегося графа XOR (побитовое исключающее ИЛИ) всех весов был равен \(0\).

Определим уродство полного графа как вес его минимального остовного дерева, где вес остовного дерева равен сумме весов его рёбер. Нужно назначить веса так, чтобы уродство получившегося графа было как можно меньше.

Напомним, что неориентированный полный граф с \(n\) вершинами содержит все рёбра \((u, v)\) с \(1 \le u < v \le n\); такой граф имеет \(\frac{n(n-1)}{2}\) рёбер.

Она не знает, как решить эту задачу, поэтому просит вас решить ее за нее.

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

Первая строка содержит два целых числа \(n\) и \(m\) (\(2 \le n \le 2 \cdot 10^5\), \(0 \le m \le \min(2 \cdot 10^5, \frac{n(n-1)}{2} - 1)\))  — количество вершин и количество предварительно назначенных рёбер. Гарантируется, что есть по крайней мере одно неназначенное ребро.

\(i\)-я из следующих строк \(m\) содержит три целых числа \(u_i\), \(v_i\) и \(w_i\) (\(1 \le u_i, v_i \le n\), \(u \ne v\), \(1 \le w_i < 2^{30}\)), обознаающие ребро от \(u_i\) до \(v_i\), которому был назначен вес \(w_i\). Ни одно ребро не появляется во вводе более одного раза.

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

Выведите в одной строке одно целое число  — минимальное уродство среди всех возможных назначений весов с XOR суммой равной \(0\).

Примечание

На изображении ниже показан первый пример. Черные веса назначены предварительно, красные веса назначены нами, а минимальное остовное дерево состоит из синих ребер.

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

Деревья Конструктив Перебор поиск в глубину и подобное сортировки Структуры данных *3100

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\).

F. Феникс и землетрясение

графы Деревья жадные алгоритмы Конструктив поиск в глубину и подобное снм *2600

Родина Феникса, Страна Огня, состоит из \(n\) городов, которые были соединены \(m\) дорогами, но из-за землетрясения они все были разрушены. Теперь Страна Огня хочет восстановить \(n-1\) из этих дорог так, чтобы все города стали снова связаны.

Первоначально, в \(i\)-м городе есть \(a_i\) тонн асфальта. Чтобы восстановить дорогу, необходимо \(x\) тонн асфальта. При этом, чтобы восстановить дорогу между городами \(i\) и \(j\), в городах \(i\) и \(j\) должно быть суммарно хотя бы \(x\) тонн асфальта. Другими словами, в городе \(i\) есть \(a_i\) тонн асфальта, а городе \(j\) — \(a_j\) тонн, то после восстановления дороги между ними останется \(a_i+a_j-x\) тонн. Асфальт можно перевозить между городами, если дорога между ними уже восстановлена.

Определите, возможно ли связать все города, и если да, то выведите последовательность дорог, которые нужно восстановить, в соответствующем порядке.

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

В первой строке заданы целые числа \(n\), \(m\) и \(x\) (\(2 \le n \le 3 \cdot 10^5\); \(n-1 \le m \le 3 \cdot 10^5\); \(1 \le x \le 10^9\)) — количество городов, количество дорог и количество асфальта, необходимого для восстановления одной дороги.

В следующей строке заданы \(n\) целых чисел через пробел \(a_i\) (\(0 \le a_i \le 10^9\)) — первоначальное количество асфальта в городе \(i\).

В следующих \(m\) строках задано по два целых числа \(x_i\) и \(y_i\) (\(x_i\ne y_i\); \(1 \le x_i, y_i \le n\)) — города соединенные \(i\)-й дорогой. Гарантируется, что между каждой парой городов есть не более одной дороги, и что перед землетрясением города были связаны.

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

Если невозможно связать все города, выведите NO. В противном случае выведите YES и далее \(n-1\) целое число \(e_1, e_2, \dots, e_{n-1}\) — порядок, в котором нужно восстанавливать дороги. \(e_i\) — это номер \(i\)-й в порядке восстановления дороги. Если существует несколько ответов, выведите любой.

Примечание

В первом примере, дороги восстанавливаются в следующем порядке:

  • Дорога \(3\) восстановлена (соединяет города \(3\) и \(4\)). В городе \(4\) первоначально было \(4\) тонны асфальта. После восстановления, осталось \(3\) тонны.
  • Дорога \(2\) восстановлена (соединяет города \(2\) и \(3\)). Асфальт из города \(4\) можно перевезти в город \(3\) и использовать на дорогу. Осталось \(2\) тонны.
  • Дорога \(1\) восстановлена (соединяет города \(1\) и \(2\)). Асфальт перевезен в город \(2\) и потрачен на дорогу. Осталась \(1\) тонна.
  • Дорога \(4\) восстановлена (соединяет города \(4\) и \(5\)). Асфальт перевезен в город \(4\) и потрачен на дорогу. Больше асфальта не осталось.
Все города теперь связаны.

Во втором примере, города \(1\) и \(2\) используют свой асфальт вместе для постройки дороги. В каждом городе по \(1\) тонне, то есть вместе \(2\) тонны, чего достаточно.

В третьем примере, для восстановления дороги между городами \(1\) и \(2\) асфальта недостаточно.

G. Феникс и одометры

графы математика поиск в глубину и подобное теория чисел *2700

В городе Огня, есть \(n\) перекрестков и \(m\) односторонних дорог: \(i\)-я дорога ведет от перекрестка \(a_i\) к \(b_i\) и имеет длину \(l_i\) миль.

Также есть \(q\) машин, которые могут передвигаться только по этим дорогам. Машина \(i\) стоит у перекрестка \(v_i\) и оборудована одометром с начальным значением \(s_i\), который увеличивается на один за каждую пройденную милю и сбрасывается в \(0\) когда достигает значения \(t_i\). Фениксу дано задание покататься на машинах по каким-то дорогам (возможно, совсем не двигаться) и вернуться к стартовому перекрестку с одометром, сброшенным в \(0\).

Для каждой машины определите, возможно ли это.

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

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

В первой строке заданы два целых числа \(n\) и \(m\) (\(2 \le n \le 2 \cdot 10^5\); \(1 \le m \le 2 \cdot 10^5\)) — количество перекрестков и количество дорог, соответственно.

В каждой из следующих \(m\) строк заданы три целых числа \(a_i\), \(b_i\) и \(l_i\) (\(1 \le a_i, b_i \le n\); \(a_i \neq b_i\); \(1 \le l_i \le 10^9\)) — описание \(i\)-й дороги. Граф дорог необязательно связный. Гарантируется, что между любой парой перекрестков есть не более одной дороги в каждом направлении.

В следующей строке задано целое число \(q\) (\(1 \le q \le 2 \cdot 10^5\)) — количество машин.

В каждой из следующих \(q\) строк заданы три целых числа \(v_i\), \(s_i\) и \(t_i\) (\(1 \le v_i \le n\); \(0 \le s_i < t_i \le 10^9\)) — стартовый перекресток \(i\)-й машины, стартовое значение \(i\)-го одометра и значение, при котором \(i\)-й одометр сбрасывается, соответственно.

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

Выведите \(q\) ответов. Если одометр \(i\)-й машины можно сбросить в \(0\) покатавшись по некоторым дорогам и вернувшись назад в \(v_i\), выведите YES. В противном случае выведите NO.

Примечание

Ниже представлена иллюстрация первого примера:

В первом запросе, Феникс может проехать на машине следующем образом: \(1\) \(\rightarrow\) \(2\) \(\rightarrow\) \(3\) \(\rightarrow\) \(1\) \(\rightarrow\) \(2\) \(\rightarrow\) \(3\) \(\rightarrow\) \(1\). Одометр будет сброшен \(3\) раза, и будет показывать \(0\) к концу поездки.

Во втором примере, можно показать, что не существует способа сбросить одометр в \(0\) и при этом вернуться к пересечению \(1\).

В третьем примере, одометр уже показывает \(0\), а поэтому нет необходимости куда-то ехать.

Ниже представлена иллюстрация второго примера:

C. Филломино 2

жадные алгоритмы Конструктив поиск в глубину и подобное реализация *1400

Филломино это классическая головоломка. (Вам не нужно знать Филломино, чтобы решить эту задачу.) В одной из аудиторий в городе Юньци несколько человек играют в настольную игру, вдохновленную этой головоломкой:

Рассмотрим шахматную доску \(n\) на \(n\). Ее строки пронумерованы от \(1\) до \(n\) сверху вниз. А столбцы пронумерованы от \(1\) до \(n\) слева направо. Клетка на пересечении \(x\)-й строки и \(y\)-го столбца обозначается \((x, y)\). Главная диагональ доски это клетки \((x, x)\) для всех \(1 \le x \le n\).

На главной диагонали доски написана перестановка чисел \(\{1, 2, 3, \dots, n\}\). В каждой из клеток написано ровно одно число. Цель игры — разделить клетки ниже и на главной диагонали (таких клеток ровно \(1+2+ \ldots +n\) штук) на \(n\) связных областей, которые удовлетворяют следующим условиям:

  1. Каждая область должна быть связной. Это означает, что мы можем добраться от любой клетки области до любой другой клетки той же области, посещая только клетки из этой области и перемещаясь из клетки в соседнюю по стороне.
  2. \(x\)-я область должна содержать клетку главной диагонали, в которой написано \(x\), для всех \(1\le x\le n\).
  3. Количество клеток, принадлежащих \(x\)-й области, должно равняться \(x\) для всех \(1\le x\le n\).
  4. Каждая клетка ниже и на главной диагонали должна принадлежать ровно одной области.
Входные данные

Первая строка содержит одно целое число \(n\) (\(1\le n \le 500\)), обозначающее размер доски.

Вторая строка содержит \(n\) целых чисел \(p_1\), \(p_2\), ..., \(p_n\). \(p_i\) это число, написанное в клетке \((i, i)\). Гарантируется, что каждое из чисел \(\{1, \ldots, n\}\) встречаются ровно один раз среди \(p_1\), ..., \(p_n\).

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

Если решения не существует, выведите \(-1\).

Иначе, выведите \(n\) строк. \(i\)-я строка должна содержать \(i\) чисел. \(j\)-е число в \(i\)-й строке должно равняться \(x\), если клетка \((i, j)\) принадлежит области размера \(x\).

Примечание

Решения для примеров изображены на иллюстрациях:

E. Сдвиг на один

геометрия графы Деревья Конструктив поиск в глубину и подобное сортировки *2700

На бесконечной плоскости лежат \(n\) точек. Координаты \(i\)-й точки \((x_i, y_i)\) такие, что \(x_i > 0\) и \(y_i > 0\). Координаты необязательно целые.

За один ход осуществляются следующие операции:

  • выбрать две точки \(a\) и \(b\) (\(a \neq b\));
  • подвинуть точку \(a\) из \((x_a, y_a)\) либо в \((x_a + 1, y_a)\), либо в \((x_a, y_a + 1)\);
  • подвинуть точку \(b\) из \((x_b, y_b)\) либо в \((x_b + 1, y_b)\), либо в \((x_b, y_b + 1)\);
  • удалить точки \(a\) и \(b\).

Ход можно совершить только в том случае, если существует прямая, проходящая через новые координаты \(a\), новые координаты \(b\) и \((0, 0)\).

Иначе ход совершить нельзя, и точки остаются на своих начальных координатах \((x_a, y_a)\) и \((x_b, y_b)\), соответственно.

Нумерация точек не меняется после удаления точек. Если точки удалены, то они не могут быть выбраны в последующих ходах. Обратите внимание, что необходимо двигать обе точки во время хода, нельзя оставлять их в изначальных координатах.

Какое наибольшее количество ходов можно совершить? Какие это ходы?

Если существует несколько ответов, то выведите любой из них.

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

В первой строке записано одно целое \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество точек.

В \(i\)-й из следующих \(n\) строк записаны четыре целых числа \(a_i, b_i, c_i, d_i\) (\(1 \le a_i, b_i, c_i, d_i \le 10^9\)). Координаты \(i\)-й точки — \(x_i = \frac{a_i}{b_i}\) и \(y_i = \frac{c_i}{d_i}\).

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

В первой строке выведите одно целое число \(c\) — наибольшее количество ходов, которые можно совершить.

В каждой из следующих \(c\) строк должно быть записано описание хода: два целых числа \(a\) и \(b\) (\(1 \le a, b \le n\), \(a \neq b\)) — точки, удаляемые на текущем ходу. Должен существовать способ подвинуть точки \(a\) и \(b\) согласно условию так, чтобы существовала прямая, проходящая через новые координаты \(a\), новые координаты \(b\) и \((0, 0)\). Никакая удаленная точка не может быть удалена в последующих ходах.

Если существует несколько ответов, то выведите любой из них. Можно выводить ходы и точки внутри ходов в произвольном порядке.

Примечание

Точки из первого примера и перемещения для тех из них, которые выбираются в ходах:

F. Сундуки и ключи

битмаски дп Перебор поиск в глубину и подобное Потоки *3200

Алиса и Боб играют в игру. У Алисы есть \(n\) сундуков с сокровищами (в \(i\)-м лежит \(a_i\) монет) и \(m\) ключей (\(j\)-й из которых она может продать Бобу за \(b_j\) монет).

Сначала Алиса вешает некоторые замки на сундуки. Есть \(m\) типов замков, замок \(j\)-го типа можно открыть только \(j\)-м ключом. Чтобы повесить замок типа \(j\) на \(i\)-й сундук, Алиса должна заплатить \(c_{i,j}\) долларов. Алиса может повесить произвольное количество различных замков на каждый сундук (возможно, ноль).

Затем Боб покупает у Алисы несколько ключей (возможно, ноль или все) и открывает все сундуки, которые он может открыть (он может открыть сундук, если у него есть ключи от всех замков на этом сундуке). Прибыль Боба — это разность между суммарным количеством монет в открытых сундуках и суммарным количеством монет, которые он тратит на покупку ключей у Алисы. Если прибыль Боба строго положительная (больше ноля), то он выигрывает игру. Иначе Алиса выигрывает игру.

Алиса хочет повесить замки на некоторые сундуки так, чтобы она выиграла игру вне зависимости от ключей, которые Боб купит (Боб не может получить положительную прибыль). Разумеется, она хочет потратить как можно меньше долларов на покупку замков. Помогите ей определить, может ли она выиграть игру, а если может, то сколько долларов ей придется потратить на замки.

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

В первой строке записаны два целых числа \(n\) and \(m\) (\(1 \le n, m \le 6\)) — количество сундуков и количество ключей, соответственно.

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 4\)), где \(a_i\) — это количество монет в \(i\)-м сундуке.

В третьей строке записаны \(m\) целых чисел \(b_1, b_2, \dots, b_m\) (\(1 \le b_j \le 4\)), где \(b_j\) — это количество монет, которые Боб тратит на покупку \(j\)-го ключа у Алисы.

Затем следуют \(n\) строк. В \(i\)-й строке записаны \(m\) целых чисел \(c_{i,1}, c_{i,2}, \dots, c_{i,m}\) (\(1 \le c_{i,j} \le 10^7\)), где \(c_{i,j}\) — это количество долларов, которые Алиса тратит на покупку замка \(j\)-го типа на \(i\)-й сундук.

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

Если Алиса не может гарантированно выиграть (как бы она ни выбирала замки, Боб всегда сможет получить положительную прибыль), то выведите \(-1\).

Иначе выведите одно целое число — минимальное количество долларов, которые необходимо потратить Алисе, чтобы выиграть вне зависимости от действий Боба.

Примечание

В первом примере Алиса должна повесить замки \(1\) и \(3\) типов на первый сундук и замки \(2\) и \(3\) типов на второй сундук.

Во втором примере Алиса должна повесить замки \(1\) и \(2\) типов на первый сундук и замок \(3\) типа на второй сундук.

G. Идти или не идти?

графы жадные алгоритмы кратчайшие пути Перебор поиск в глубину и подобное реализация *2200

Дима проспал будильник, который должен был поднять его в школу.

Диме интересно, успеет ли он прийти на первый урок. Для этого ему необходимо узнать минимальное время, которое потребуется ему, чтобы дойти от дома до школы.

Город, в котором живет Дима, представляет собой прямоугольное поле размером \(n \times m\). Каждая клетка \((i, j)\) на этом поле обозначается одним числом \(a_{ij}\):

  • Число \(-1\) означает, что проход по клетке запрещен;
  • Число \(0\) означает, что клетка свободна, и Дима может по ней пройти.
  • Число \(x\) (\(1 \le x \le 10^9\)) означает, что в клетке расположен портал со стоимостью \(x\). Клетка с порталом также считается свободной.

Из любого портала Дима может отправиться в любой другой портал, при этом время перемещения из портала \((i, j)\) в портал \((x, y)\) соответствует сумме их стоимостей \(a_{ij} + a_{xy}\).

Помимо перемещения между порталами, Дима также может перемещаться между соседними по стороне не занятыми клетками за время \(w\). В частности, он может заходить на клетку с порталом и не пользоваться им.

Изначально Дима находится в левой верхней клетке \((1, 1)\), а школа в правой нижней клетке \((n, m)\).

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

В первой строке содержатся три целых числа \(n\), \(m\) и \(w\) (\(2 \le n, m \le 2 \cdot 10^3\), \(1 \le w \le 10^9\)), где \(n\) и \(m\) — размеры города, \(w\) — время, за которое Дима перемещается между не занятыми клетками.

Следующие \(n\) строк содержат по \(m\) чисел (\(-1 \le a_{ij} \le 10^9\)) — описания клеток.

Гарантируется, что клетки \((1, 1)\) и \((n, m)\) свободны.

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

Выведите одно число — минимальное время, которое потребуется Диме, чтобы добраться до школы. Если он не сможет добраться до школы вообще — выведите «-1».

Примечание

Пояснение к первому примеру:

D. Настя играет с деревом

Деревья дп жадные алгоритмы Конструктив поиск в глубину и подобное реализация снм Структуры данных *2500

У Насти есть невзвешенное дерево из \(n\) вершин, с которым ей не терпится поиграть!

Девочка будет выполнять следующую операцию с деревом столько раз, сколько ей потребуется:

  1. удалить любое существующее ребро, затем
  2. добавить неориентированное ребро между любой парой вершин.

Какое минимальное количество операций требуется девочке, чтобы получить из дерева бамбук? Бамбуком называется дерево, степень вершин в котором не превосходит \(2\).

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

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10\,000\)) — количество наборов входных данных.

В первой строке каждого набора задано число \(n\) (\(2 \le n \le 10^5\)) — количество вершин в дереве.

Следующая \(n - 1\) строка каждого набора входных данных описывают ребро дерево в формате \(a_i\), \(b_i\) (\(1 \le a_i, b_i \le n\), \(a_i \neq b_i\)).

Гарантируется, что заданный граф является деревом и сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

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

Для каждого из наборов входных данных в первой строке выведите одно целое число \(k\) — минимальное количество операций, необходимых, чтобы получить из дерева бамбук.

В последующих \(k\) строках выведите \(4\) целых числа \(x_1\), \(y_1\), \(x_2\), \(y_2\) (\(1 \le x_1, y_1, x_2, y_{2} \le n\), \(x_1 \neq y_1\), \(x_2 \neq y_2\)) — таким образом вы удаляете ребро \((x_1, y_1)\) и добавляете неориентированное ребро \((x_2, y_2)\).

Обратите внимание, что ребро \((x_1, y_1)\) обязано содержаться в графе до его удаления.

Примечание

Обратите внимание, что граф может быть несвязным после какого-то количества операций.

Рассмотрим первый набор входных данных:

Красным обозначены удаленные ребра, а зеленым – добавленные.

D. MEX дерево

Деревья Комбинаторика математика поиск в глубину и подобное реализация *2400

Вам дано дерево из \(n\) вершин, в котором вершины пронумерованы от \(0\) до \(n-1\). Для каждого \(k\) от \(0\) до \(n\) включительно вам необходимо посчитать количество неупорядоченных пар \((u,v)\), \(u \neq v\), таких, что MEX всех номеров вершин на пути от \(u\) до \(v\) равен \(k\).

MEX последовательности целых чисел равен наименьшему неотрицательному целому числу, которое в ней не встречается.

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

Первая строка содержит целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(2 \le n \le 2 \cdot 10^{5}\)).

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

Гарантируется, что данные ребра образуют дерево.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^{5}\).

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

Для каждого набора входных данных выведите \(n+1\) целое число: число путей в дереве таких, что MEX всех номеров вершин на нем равен \(k\), для всех \(k\) от \(0\) до \(n\).

Примечание
  1. В наборе входных данных \(1\):
    • Для \(k = 0\) существует только \(1\) путь из \(2\) в \(3\) с \(MEX([2, 3]) = 0\).
    • Для \(k = 1\) существует \(2\) пути. Один из \(0\) в \(2\) с \(MEX([0, 2]) = 1\), и из \(0\) в \(3\) с \(MEX([0, 2, 3]) = 1\).
    • Для \(k = 2\) существует \(1\) путь из \(0\) в \(1\) с \(MEX([0, 1]) = 2\).
    • Для \(k = 3\) существует \(1\) путь из \(1\) в \(2\) с \(MEX([1, 0, 2]) = 3\)
    • Для \(k = 4\) существует \(1\) путь из \(1\) в \(3\) с \(MEX([1, 0, 2, 3]) = 4\).
  2. В наборе входных данных \(2\):
    • Для \(k = 0\) не существует таких путей.
    • Для \(k = 1\) не существует таких путей.
    • Для \(k = 2\) существует \(1\) путь из \(0\) в \(1\) с \(MEX([0, 1]) = 2\).

A. Огромное дерево Parsa

Деревья дп жадные алгоритмы поиск в глубину и подобное разделяй и властвуй *1600

У Parsa есть огромное дерево на \(n\) вершинах.

На каждой вершине \(v\) он записал два целых числа \(l_v\) и \(r_v\).

Чтобы дерево Parsa выглядело еще более величественным, Nima хочет назначить число \(a_v\) (\(l_v \le a_v \le r_v\)) для каждой вершины \(v\) таким образом, чтобы красота дерева Parsa была максимальной.

Восприятие красоты Nima довольно причудливо. Он определяет красоту дерева как сумму \(|a_u - a_v|\) по всем ребрам \((u, v)\) дерева.

Поскольку дерево Parsa слишком велико, Nima не может самостоятельно максимизировать его красоту. Ваша задача — найти максимальную возможную красоту для дерева Parsa.

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

Первая строка содержит целое число \(t\) \((1\le t\le 250)\) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) \((2\le n\le 10^5)\) — количество вершин в дереве Parsa.

В \(i\)-й из следующих \(n\) строк содержится два целых числа \(l_i\) и \(r_i\) \((1 \le l_i \le r_i \le 10^9)\).

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

Гарантируется, что данный граф является деревом.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

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

Для каждого набора входных данных выведите максимальную возможную красоту для дерева Парса.

Примечание

Деревья в примере:

В первом наборе входных данных одно из возможных назначений — \(a = \{1, 8\}\), что приводит к \(|1 - 8| = 7\).

Во втором наборе входных данных одно из возможных назначений — \(a = \{1, 5, 9\}\), что приводит к красоте \(|1 - 5| + |5 - 9| = 8\).

C. Деревья примирения

Деревья жадные алгоритмы поиск в глубину и подобное Структуры данных *2300

У Soroush и Keshi есть по одному пронумерованному корневому дереву на \(n\) вершин. У обоих деревьев корнем является вершина \(1\).

Раньше Soroush и Keshi воевали. После бесконечных десятилетий борьбы они, наконец, стали союзниками, чтобы подготовить раунд Codeforces. Чтобы отметить это счастливое событие, они решили сделать памятный граф на \(n\) вершинах.

Они добавляют ребро между вершинами \(u\) и \(v\) в памятный граф, если выполняются оба из следующих условий:

  • Одна из вершин \(u\) и \(v\) является предком второй в дереве Soroush.
  • Ни одна из вершин \(u\) и \(v\) не является предком другой в дереве Keshi.

Здесь вершина \(u\) считается предком вершины \(v\), если \(u\) лежит на пути от \(1\) (корня) к \(v\).

Выскочивший из ниоткуда Mashtali попытался найти максимальную клику в памятном графе. Он потерпел неудачу, потому что граф был слишком большим.

Помогите Mashtali, найдя размер максимальной клики в памятном графе.

Напомним, что клика — это такое подмножество вершин графа, каждые две из которых соединены ребром.

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

Первая строка содержит целое число \(t\) \((1\le t\le 3 \cdot 10^5)\) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) \((2\le n\le 3 \cdot 10^5)\).

Вторая строка каждого набора входных данных содержит \(n-1\) целых чисел \(a_2, \ldots, a_n\) \((1 \le a_i < i)\), \(a_i\) — родитель вершины \(i\) в дереве Soroush.

Третья строка каждого набора входных данных содержит \(n-1\) целых чисел \(b_2, \ldots, b_n\) \((1 \le b_i < i)\), \(b_i\) — родитель вершины \(i\) в дереве Keshi.

Гарантируется, что заданные графы являются деревьями.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(3 \cdot 10^5\).

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

Для каждого набора входных данных выведите одно целое число — размер максимальной клики в памятном графе.

Примечание

В первом и третьем наборах входных данных можно выбрать любую вершину.

Во втором наборе входных данных одна из максимальных клик — \(\{2, 3, 4, 5\}\).

В четвертом наборе входных данных одна из максимальных клик — \(\{3, 4, 6\}\).

G. Карта биомов

*особая задача графы Конструктив поиск в глубину и подобное

Поликарп решил сгенерировать карту биомов для своей игры. Карта представляет собой матрицу, разбитую на клетки \(1 \times 1\). В каждой клетке карты должен находиться один из доступных биомов.

Каждый биом определяется двумя параметрами: температура (целое число от \(1\) до \(n\)) и влажность (целое число от \(1\) до \(m\)). Но, возможно, не для каждой комбинации температура/влажность доступен соответствующий биом.

Карта биомов должна быть сгенерирована по следующим правилам:

  • каждая клетка карты принадлежит ровно одному биому;
  • каждому доступному биому принадлежит хотя бы одна клетка карты;
  • если две клетки карты являются соседними по стороне, и они принадлежат биомам с параметрами (\(t_1, h_1\)) и (\(t_2, h_2\)) соответственно, то должно выполняться равенство \(|t_1-t_2| + |h_1-h_2| = 1\);
  • пусть количество доступных биомов равно \(k\). Ни количество строк, ни столбцов карты не должно превышать \(k\).

Помогите Поликарпу сгенерировать карту биомов, которая удовлетворяет всем вышеописанным условиям (или сообщите, что это невозможно).

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

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 20\)) — количество наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 10\)) — максимальные параметры температуры и влажности.

Следующие \(n\) строк содержат по \(m\) целых чисел \(a_{i,1}, a_{i, 2}, \dots, a_{i, m}\) (\(0 \le a_{i, j} \le 100\)), где \(a_{i, j}\) — идентификатор биома с параметрами \((i, j)\), если \(a_{i, j} \neq 0\), иначе биом с такими параметрами недоступен.

Все идентификаторы биомов различны и есть хотя бы два доступных биома.

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

Для каждого набора входных данных выведите ответ в следующем формате:

  • в единственной строке выведите \(-1\), если не существует карты удовлетворяющей всем условиям;
  • иначе в первой строке выведите два целых числа \(h\) и \(w\) — количество строк и столбцов карты соответственно. В следующих \(h\) строках выведите по \(w\) целых чисел — идентификаторы биомов в соответствующих клетках поля.

I. Экскурсии

*особая задача графы Конструктив Паросочетания поиск в глубину и подобное Потоки

Ирина работает в экскурсионной компании Саратова. Сегодня она собирается организовать экскурсии по городам Саратов и Энгельс.

Всего существует \(n_1\) достопримечательность в Саратове и \(n_2\) достопримечательность в Энгельсе. Города разделены рекой, но есть \(m\) автобусных маршрутов, которые проходят по мостам и позволяют туристам добраться из Саратова в Энгельс и обратно. Маршрут \(i\)-го автобуса проходит от \(x_i\)-й достопримечательности в Саратове до \(y_i\)-й достопримечательности в Энгельсе, а также в обратном направлении.

Ирина хочет спланировать экскурсии на текущий день. Экскурсионные поездки начинаются в Саратове утром, продолжаются в Энгельсе днем и заканчиваются в Саратове вечером.

Каждый турист начинает свой экскурсионный день с какой-нибудь достопримечательности Саратова, \(k_i\) туристов начинают с \(i\)-й достопримечательности. Затем гиды везут их в Энгельс: на каждой достопримечательности Саратова гид выбирает автобусный маршрут, ведущий от этой достопримечательности в Энгельс, и все туристы, отправляющиеся с этой достопримечательности, отправляются в Энгельс по этому автобусному маршруту. После завершения экскурсий в Энгельсе происходит то же самое: для каждой достопримечательности в Энгельсе гид выбирает автобусный маршрут, ведущий от этой достопримечательности в Саратов, и все туристы с этой достопримечательности отправляются в Саратов по этому автобусному маршруту.

Этот процесс может привести к такой ситуации, что некоторые туристы вернутся к той же достопримечательности в Саратове, с которой они начали утром. Очевидно, туристам это не нравится, поэтому Ирина хочет выбрать, куда гиды повезут туристов (как по дороге из Саратова в Энгельс, так и по дороге из Энгельса в Саратов), чтобы минимально возможное количество туристов вернулось к той же достопримечательности, с которой они начали. Помогите Ирине найти оптимальный план!

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

Первая строка содержит три целых числа \(n_1\), \(n_2\) и \(m\) (\(1 \le n_1, n_2 \le 100\); \(\max(n_1, n_2) \le m \le n_1 \cdot n_2\)) — количество достопримечательностей в Саратове, количество достопримечательностей в Энгельсе и количество автобусных маршрутов соответственно.

Вторая строка содержит \(n_1\) целых чисел \(k_1, k_2, \dots, k_{n_1}\) (\(1 \le k_i \le 10^6\)), где \(k_i\) — количество туристов, начинающих с \(i\)-й достопримечательности в Саратове.

Затем следует \(m\) строк, каждая из которых описывает автобусный маршрут: \(i\)-я строка содержит два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i \le n_1\); \(1 \le y_i \le n_2\)), что означает, что \(i\)-й маршрут автобуса соединяет \(x_i\)-ю достопримечательность в Саратове и \(y_i\)-ю достопримечательность в Энгельсе. Все автобусные маршруты различны, и у каждой достопримечательности есть по крайней мере один автобусный маршрут, ведущий к ней / от нее.

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

Выведите одно целое число — минимально возможное количество туристов, которые вернутся к тому же месту, откуда они начали.

F1. Падающий песок (простая версия)

графы жадные алгоритмы поиск в глубину и подобное *2500

Это простая версия задачи. Разница в версиях заключается в ограничениях на \(a_i\). Вы можете делать взломы, только если обе версии задачи решены.

Маленький Дорми недавно получил головоломку от своего друга, и ему требуется ваша помощь для ее решения.

Головоломка состоит из вертикальной доски с \(n\) строками и \(m\) столбцами, некоторые ячейки на доске пустые, а некоторые заполнены песком. Также даны \(m\) неотрицательных целых чисел \(a_1,a_2,\ldots,a_m\) (\(0 \leq a_i \leq n\)). В этой версии задачи \(a_i\) равно числу ячеек с песком в столбце \(i\).

Если стукнуть по ячейке, заполненной песком, то весь песок из ячейки упадет вниз на счетчик песка своего столбца (в каждом столбце есть счетчик песка). Когда песок падает, весь песок, в какой-либо момент находящийся в соседней ячейке с падающим песком, тоже начинает падать. А именно, если песок начинает падать из ячейки \((i,j)\), то он будет падать через все ячейки ниже в этом столбце, включая саму ячейку \((i,j)\), вызывая падения во всех ячейках, соседних к какой-либо ячейке на пути. Соседними к ячейке \((i,j)\) являются ячейки \((i-1,j)\), \((i,j-1)\), \((i+1,j)\) и \((i,j+1)\) (если такие существуют). Обратите внимание, что новые падающие ячейки песка тоже вызывают падение соседних ячеек.

За одну операцию вы можете стукнуть по одной ячейке с песком. Головоломка решена, если на счетчике песка в \(i\)-м столбце находится не менее \(a_i\) ячеек с песком для всех столбцов от \(1\) до \(m\).

Вам нужно определить минимальное количество операций, необходимое, чтобы решить головоломку. Маленький Дорми никогда не даст вам головоломку, которую нельзя решить.

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

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \leq n \cdot m \leq 400\,000\)).

Каждая из следующих \(n\) строк содержит \(m\) символов, описывающих очередную строку таблицы сверху вниз. Символ «.» обозначает пустую ячейку, а «#» обозначает ячейку с песком.

Последняя строка содержит \(m\) неотрицательных целых чисел \(a_1,a_2,\ldots,a_m\) (\(0 \leq a_i \leq n\)) — минимальное количество ячеек с песком, которые должны упасть на счетчик песка в каждом столбце. В этой версии задачи \(a_i\) всегда равно количеству ячеек с песком в столбце \(i\).

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

Выведите одно целое число — минимальное количество операций, необходимое, чтобы решить головоломку.

Примечание

В примере \(1\) можно стукнуть ячейку в левом верхнем углу, ячейку во втором сверху ряду в четвертом столбце слева, и ячейку в третьем ряду сверху в шестом столбце слева. Тогда упадет необходимое количество песка в каждом столбце. Можно показать, что нельзя сделать меньше \(3\) операций, и поэтому ответ равен \(3\). Ниже приведен рисунок к первому примеру.

В примере \(2\) можно стукнуть по ячейке в верхнем ряду в правом столбце, и весь песок в таблице упадет вниз. Поэтому ответ равен \(1\). Ниже приведен рисунок ко второму примеру.

F2. Падающий песок (сложная версия)

графы дп жадные алгоритмы поиск в глубину и подобное *3000

Это сложная версия задачи. Разница в версиях заключается в ограничениях на \(a_i\). Вы можете делать взломы, только если обе версии задачи решены.

Маленький Дорми недавно получил головоломку от своего друга, и ему требуется ваша помощь для ее решения.

Головоломка состоит из вертикальной доски с \(n\) строками и \(m\) столбцами, некоторые ячейки на доске пустые, а некоторые заполнены песком. Также даны \(m\) неотрицательных целых чисел \(a_1,a_2,\ldots,a_m\) (\(0 \leq a_i \leq n\)). В этой версии задачи \(a_i\) всегда не превышает количества ячеек с песком в столбце \(i\).

Если стукнуть по ячейке, заполненной песком, то весь песок из ячейки упадет вниз на счетчик песка своего столбца (в каждом столбце есть счетчик песка). Когда песок падает, весь песок, в какой-либо момент находящийся в соседней ячейке с падающим песком, тоже начинает падать. А именно, если песок начинает падать из ячейки \((i,j)\), то он будет падать через все ячейки ниже в этом столбце, включая саму ячейку \((i,j)\), вызывая падения во всех ячейках, соседних к какой-либо ячейке на пути. Соседними к ячейке \((i,j)\) являются ячейки \((i-1,j)\), \((i,j-1)\), \((i+1,j)\) и \((i,j+1)\) (если такие существуют). Обратите внимание, что новые падающие ячейки песка тоже вызывают падение соседних ячеек.

За одну операцию вы можете стукнуть по одной ячейке с песком. Головоломка решена, если на счетчике песка в \(i\)-м столбце находится не менее \(a_i\) ячеек с песком для всех столбцов от \(1\) до \(m\).

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

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

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \leq n \cdot m \leq 400\,000\)).

Каждая из следующих \(n\) строк содержит \(m\) символов, описывающих очередную строку таблицы сверху вниз. Символ «.» обозначает пустую ячейку, а «#» обозначает ячейку с песком.

Последняя строка содержит \(m\) неотрицательных целых чисел \(a_1,a_2,\ldots,a_m\) (\(0 \leq a_i \leq n\)) — минимальное количество ячеек с песком, которые должны упасть на счетчик песка в каждом столбце. В этой версии задачи \(a_i\) всегда не превышает количества ячеек с песком в столбце \(i\).

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

Выведите одно целое число — минимальное количество операций, необходимое, чтобы решить головоломку.

Примечание

В примере \(1\) можно стукнуть по ячейке в левом верхнем углу, и по ячейке в третьей строке сверху в шестом столбце слева. Тогда на счетчики песка упадет необходимый объем песка в каждом столбце. Можно показать, что нельзя решить головоломку менее чем за \(3\) операции, и поэтому ответ равен \(3\). Ниже приведен рисунок к первому примеру.

В примере \(2\) можно стукнуть по ячейке в верхнем ряду в правом столбце, и весь песок в таблице упадет вниз. Поэтому ответ равен \(1\). Ниже приведен рисунок ко второму примеру.

В примере \(3\) можно стукнуть по ячейке в верхнем ряду в правом столбце, и в каждом столбце упадет достаточно песка. Можно показать, что невозможно решить головоломку за менее, чем \(1\) операцию, поэтому ответ \(1\). Ниже приведен рисунок ко второму примеру.

D. Плей-офф турнир

Деревья дп поиск в глубину и подобное реализация Структуры данных *1800

\(2^k\) команд участвуют в плей-офф турнире. Турнир состоит из \(2^k - 1\) игры. Они проводятся следующим образом: во-первых, команды делятся на пары: команда \(1\) играет против команды \(2\), команда \(3\) играет против команды \(4\) (именно в таком порядке) и так далее (таким образом, в этой фазе будет сыграно \(2^{k-1}\) игры). Когда команда проигрывает игру, она выбывает, и каждая игра приводит к выбыванию одной команды (нет ничьих). После этого остается \(2^{k-1}\) команд. Если остается только одна команда, она объявляется чемпионом; в противном случае играется еще \(2^{k-2}\) игр: в первой из них победитель игры «\(1\) против \(2\)» играет против победителя игры «\(3\) против \(4\)», затем победитель игры «\(5\) против \(6\)» играет против победителя игры «\(7\) против \(8\)» и так далее. Этот процесс повторяется до тех пор, пока не останется только одна команда.

Например, на этом рисунке описан хронологический порядок игр с \(k = 3\):

Пусть строка \(s\), состоящая из \(2^k - 1\) символов, описывает результаты игр в хронологическом порядке следующим образом:

  • если \(s_i\) равно 0, то команда с меньшим индексом выигрывает \(i\)-ю игру;
  • если \(s_i\) равно 1, то команда с большим индексом выигрывает \(i\)-ю игру;
  • если \(s_i\) равно ?, то результат \(i\)-й игры неизвестен (любая команда может выиграть эту игру).

Пусть \(f(s)\) — число возможных победителей турнира, описываемого строкой \(s\). Команда \(i\) является возможным победителем турнира, если можно заменить каждый ? на 1 или 0 таким образом, что команда \(i\) является чемпионом.

Вам дается начальное состояние строки \(s\). Вы должны обработать \(q\) запросов следующей формы:

  • \(p\) \(c\) — заменить \(s_p\) символом \(c\) и вывести \(f(s)\) в результате запроса.
Входные данные

Первая строка содержит одно целое число \(k\) (\(1 \le k \le 18\)).

Вторая строка содержит строку, состоящую из \(2^k - 1\) символов — начальное состояние строки \(s\). Каждый символ либо ?, 0, либо 1.

Третья строка содержит одно целое число \(q\) (\(1 \le q \le 2 \cdot 10^5\)) — количество запросов.

Затем следует \(q\) строк, строка \(i\) содержит целое число \(p\) и символ \(c\) (\(1 \le p \le 2^k - 1\); \(c\) - это либо ?, 0, либо 1), описывающие запрос \(i\).

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

Для каждого запроса выведите одно целое число — \(f(s)\).

F. Исправляем фигуры

графы жадные алгоритмы Конструктив математика поиск в глубину и подобное снм *2200

У вас есть связный неориентированный граф, состоящий из \(n\) вершин и \(m\) ребер. У \(i\)-го узла есть начальное значение \(v_i\) и целевое значение \(t_i\).

За одну операцию можно выбрать любое ребро \((i, j)\) и добавить \(k\) к \(v_i\) и \(v_j\), где \(k\) может быть любым целым числом. В частности, \(k\) может быть отрицательным.

Ваша задача определить, можно ли, выполнив некоторое конечное число операций (возможно, ноль), добиться того, что каждого узла \(i\), \(v_i = t_i\).

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

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)), количество наборов входных данных. Затем следуют наборы входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\), \(m\) (\(2 \leq n \leq 2\cdot 10^5\), \(n-1\leq m\leq \min(2\cdot 10^5, \frac{n(n-1)}{2})\)) — количество вершин и ребер соответственно.

Вторая строка содержит \(n\) целых чисел \(v_1\ldots, v_n\) (\(-10^9 \leq v_i \leq 10^9\)) — начальные значения вершин.

Третья строка содержит \(n\) целых чисел \(t_1\ldots, t_n\) (\(-10^9 \leq t_i \leq 10^9\)) — целевые значения вершин.

Каждая из следующих \(m\) строк содержит два целых числа \(i\) и \(j\), обозначающих ребро между вершинами \(i\) и \(j\) (\(1 \leq i, j \leq n\), \(i\ne j\)).

Гарантируется, что граф связный и между одной парой вершин есть не более одного ребра.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\), а сумма \(m\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

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

Для каждого наборам входных данных, если возможно, чтобы значение в каждой вершине стало равно целевому после некоторого количества операций, выведите «YES». В противном случае выведите «NO».

Примечание

Вот визуализация первого тестового случая (оранжевые значения обозначают начальные значения, а синие — целевые):

Один из возможных порядков действий для получения нужных значений для каждого узла следующий:

  • Операция \(1\): Добавить \(2\) к вершинами \(2\) и \(3\).
  • Операция \(2\): Добавить \(-2\) к вершинам \(1\) и \(4\).
  • Операция \(3\): Добавить \(6\) к вершинам \(3\) и \(4\).

Теперь мы видим, что в общей сложности мы добавили \(-2\) к вершине \(1\), \(2\) к вершине \(2\), \(8\) к вершине \(3\) и \(4\) к вершине \(4\), что привело каждую вершину к нужному значению.

Для графа из второго набора входных данных получить нужные значения невозможно.

C. Машины соперников

битмаски математика Перебор поиск в глубину и подобное реализация Теория вероятностей *1900

После победы над соперником из Чёрного Списка вы получаете шанс вытянуть \(1\) из \(x\) доступных призовых карточек. Изначально \(x=3\) и доступны следующие карточки: Взятка, Освобождение от конфискации и Машина соперника. Изначально вероятность вытянуть их в случайной попытке равна \(c\), \(m\) и \(p\) соответственно. Также присутствует фактор изменчивости \(v\). Вы можете играть в гонки с соперником до тех пор, пока не вытяните карточку Машина соперника. Предположим, что вы выигрываете каждую гонку и получаете шанс тянуть призовую карточку. В каждом вытягивании вы достаете одну из \(x\) доступных карточек с соответствующей вероятностью. Пусть вы вытянули карточку и вероятность ее вытягивания до вашей попытки была равна \(a\). Тогда

  • Если это карточка Машина соперника, то игра для вас заканчивается и вы больше не можете участвовать в гонках.
  • Иначе
    1. Если \(a\leq v\), то вероятность вытянутой карточки становится равной \(0\) и она перестает быть доступной для последующих вытягиваний, уменьшая \(x\) на \(1\). Более того, освободившаяся вероятность \(a\) распределяется равномерно среди оставшихся доступных карточек.
    2. Если \(a > v\), вероятность вытянутой карточки уменьшается на \(v\), и освободившаяся вероятность распределяется равномерно среди остальных доступных карточек.

Например,

  • Если \((c,m,p)=(0.2,0.1,0.7)\) и \(v=0.1\), то после вытягивания карточки Взятка новые вероятности будут равны \((0.1,0.15,0.75)\).
  • Если \((c,m,p)=(0.1,0.2,0.7)\) и \(v=0.2\), то после вытягивания карточки Взятка новые вероятности будут равны \((\text{Недоступна},0.25,0.75)\).
  • Если \((c,m,p)=(0.2, \text{Недоступна},0.8)\) и \(v=0.1\), то после вытягивания карточки Взятка новые вероятности будут равны \((0.1, \text{Недоступна} ,0.9)\).
  • Если \((c,m,p)=(0.1,\text{Недоступна},0.9)\) и \(v=0.2\), то после вытягивания карточки Взятка новые вероятности будут равны \((\text{Недоступна},\text{Недоступна},1.0)\).

Вам хочется заполучить машину соперника. Для этого вы должны найти математическое ожидание количества гонок, которые нужно пройти, чтобы вытянуть карточку Машина соперника.

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

Первая строка содержит одно целое число \(t\) (\(1\leq t\leq 10\)) — количество наборов входных данных.

Первая и единственная строка каждого набора содержит четыре действительных числа \(c\), \(m\), \(p\) и \(v\) (\(0 < c,m,p < 1\), \(c+m+p=1\), \(0.1\leq v\leq 0.9\)).

Гарантируется, что каждое из чисел \(c\), \(m\), \(p\) и \(v\) содержит не более \(4\)-х знаков после запятой.

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

Для каждого набора входных данных выведите одну строку, содержащую одно действительное число — математическое ожидание количества гонок, которые нужно пройти, чтобы вытянуть карточку Машина соперника.

Ответ будет считаться верным, если его абсолютная или относительная ошибка не будет превосходить \(10^{-6}\).

Формально, пусть ваш ответ равен \(a\), а ответ жюри – \(b\). Ваш ответ считается правильным, если \(\frac{|a - b|}{\max{(1, |b|)}} \le 10^{-6}\).

Примечание

Обозначим за C вытягивание карточки Взятка, за M — карточки Освобождение от конфискации, за P — карточки Машина соперника.

В первом наборе входных данных возможные последовательности вытягиваний представлены ниже:

  • P с вероятностью \(0.6\);
  • CP с вероятностью \(0.2\cdot 0.7 = 0.14\);
  • CMP с вероятностью \(0.2\cdot 0.3\cdot 0.9 = 0.054\);
  • CMMP с вероятностью \(0.2\cdot 0.3\cdot 0.1\cdot 1 = 0.006\);
  • MP с вероятностью \(0.2\cdot 0.7 = 0.14\);
  • MCP с вероятностью \(0.2\cdot 0.3\cdot 0.9 = 0.054\);
  • MCCP с вероятностью \(0.2\cdot 0.3\cdot 0.1\cdot 1 = 0.006\);
Поэтому математическое ожидание количества гонок равно \(1\cdot 0.6 + 2\cdot 0.14 + 3\cdot 0.054 + 4\cdot 0.006 + 2\cdot 0.14 + 3\cdot 0.054 + 4\cdot 0.006 = 1.532\).

Во втором наборе данных возможные последовательности вытягиваний представлены ниже -

  • P с вероятностью \(0.4\);
  • CP с вероятностью \(0.4\cdot 0.6 = 0.24\);
  • CMP с вероятностью \(0.4\cdot 0.4\cdot 1 = 0.16\);
  • MP с вероятностью \(0.2\cdot 0.5 = 0.1\);
  • MCP с вероятностью \(0.2\cdot 0.5\cdot 1 = 0.1\).

Поэтому математическое ожидание количества гонок равно \(1\cdot 0.4 + 2\cdot 0.24 + 3\cdot 0.16 + 2\cdot 0.1 + 3\cdot 0.1 = 1.86\).

G. Сколько путей?

графы Деревья дп поиск в глубину и подобное *2100

Задан ориентированный граф \(G\), в котором допустимы петли (то есть рёбра из вершины в себя). В \(G\) отсутствуют кратные рёбра, то есть для каждой упорядоченной пары вершин \((u, v)\) существует не более одного ребра из \(u\) в \(v\). Вершины пронумерованы от \(1\) до \(n\).

Назовём путем из \(u\) в \(v\) такую последовательность рёбер, что:

  • вершина \(u\) является началом первого ребра пути;
  • вершина \(v\) является концом последнего ребра пути;
  • для любой пары соседних рёбер следующее ребро начинается с вершины, на которую заканчивается предыдущее ребро.

Дополнительно будем считать, что пустая последовательность рёбер — это путь из \(u\) в \(u\).

Для каждой вершины \(v\) выведите одно из четырёх значений:

  • \(0\), если не существует пути из \(1\) в \(v\);
  • \(1\), если существует ровно один путь из \(1\) в \(v\);
  • \(2\), если существует более одного пути из \(1\) в \(v\) и это число является конечной величиной;
  • \(-1\), если существует бесконечно много путей из \(1\) в \(v\).

Рассмотрим пример, изображённый на рисунке.

Тогда:

  • ответ для вершины \(1\) равен \(1\): существует ровно один путь из \(1\) в \(1\) (путь длины \(0\));
  • ответ для вершины \(2\) равен \(0\): не существует пути из \(1\) в \(2\);
  • ответ для вершины \(3\) равен \(1\): существует ровно один путь из \(1\) в \(3\) (это ребро \((1, 3)\));
  • ответ для вершины \(4\) равен \(2\): существует более одного, но конечное число путей из \(1\) в \(4\) (два пути: \([(1, 3), (3, 4)]\) и \([(1, 4)]\));
  • ответ для вершины \(5\) равен \(-1\): существует бесконечно много путей из \(1\) в \(5\) (петля может быть использована в пути сколько угодно раз);
  • ответ для вершины \(6\) равен \(-1\): существует бесконечно много путей из \(1\) в \(6\) (петля может быть использована в пути сколько угодно раз).
Входные данные

В первой строке записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте. Далее заданы описания \(t\) наборов входных данных. Перед каждым из них в тесте содержится пустая строка.

В первой строке набора входных данных записаны два целых числа \(n\) и \(m\) (\(1 \le n \le 4 \cdot 10^5, 0 \le m \le 4 \cdot 10^5\)) — количество вершин и рёбер в графе, соответственно. Далее входные данные содержат \(m\) строк с описаниями рёбер. Каждая строка состоит из двух целых чисел \(a_i\), \(b_i\) (\(1 \le a_i, b_i \le n\)) — начало и конец \(i\)-го ребра. Вершины графа пронумерованы от \(1\) до \(n\). Заданный граф может содержать петли (допустимо \(a_i = b_i\)), но не может содержать кратных рёбер (недопустимо \(a_i = a_j\) и \(b_i = b_j\) для \(i \ne j\)).

Сумма значений \(n\) по всем наборам входных данных в тесте не превосходит \(4 \cdot 10^5\). Аналогично, сумма значений \(m\) по всем наборам входных данных в тесте не превосходит \(4 \cdot 10^5\).

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

Выведите \(t\) строк. \(i\)-я строка должна содержать ответ на \(i\)-й набор входных данных — последовательность \(n\) целых чисел от \(-1\) до \(2\).

B. Грегор и игра в пешки

графы дп жадные алгоритмы Паросочетания поиск в глубину и подобное Потоки реализация *800

Дана шахматная доска размера \(n\) на \(n\). Клетка на пересечении \(i\)-й сверху ряду и \(j\)-го слева столбца обозначается как \((i,j)\).

На данный момент у Грегора есть несколько пешек в \(n\)-м ряду. Также в \(1\)-м ряду стоят вражеские пешки. За один шаг Грегор перемещает одну из своих пешек. Пешка может ходить на одну клетку вверх (из \((i,j)\) в \((i-1,j)\)), если клетка назначения не занята другой пешкой. В дополнение, пешка может переместиться на одну клетку вверх по диагонали (из \((i,j)\) в \((i-1,j-1)\) или в \((i-1,j+1)\)), если и только если в этой клетке стоит вражеская пешка. Вражеская пешка в таком случае убирается с доски.

Грегор хочет узнать, какое максимальное количество его пешек может достичь \(1\)-го ряда.

Заметьте, что в этой игре ходит только Грегор, вражеские пешки никогда не перемещаются. Также, когда пешка Грегора достигает \(1\)-го ряда, она останавливается и больше не может перемещаться.

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

Первая строка ввода содержит одно целое число \(t\) (\(1\le t\le 2\cdot 10^4\)) — количество наборов входных данных. Далее следует описание этих \(t\) наборов.

Каждый набор входных данных состоит из трех строк. Первая строка содержит одно целое число \(n\) (\(2\le n\le 2\cdot{10}^{5}\)) — размер доски.

Вторая строка содержит бинарную строку длины \(n\), в которой \(1\) на \(i\)-й позиции соответствует вражеской пешке в \(i\)-й слева клетке в первом ряду, а \(0\) соответствует пустой клетке.

Третья строка содержит бинарную строку длины \(n\), в которой \(1\) на \(i\)-й позиции соответствует пешке Грегора в \(i\)-й слева клетке в последнем ряду, а \(0\) соответствует пустой клетке.

Гарантируется, что сумма \(n\) по всем наборам входных данных меньше \(2\cdot{10}^{5}\).

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

Для каждого набора входных данных выведите одно целое число: максимальное количество пешек Грегора, которые могут достичь \(1\)-го ряда.

Примечание

В первом примере Грегор может просто переместить вперед все его \(3\) пешки. Таким образом, ответ равен \(3\).

Во втором примере Грегор может гарантировать, что все его \(4\) пешки достигнут вражеского ряда, следуя раскрашенным путям как показано ниже. Помните — только Грегор делает ходы в этой «игре»!

В третьем примере единственная пешка Грегора застряла перед вражеской пешкой и не может достигнуть желаемого ряда.

В четвертом примере у Грегора нет пешек, поэтому ответ равен \(0\).

F. Равноудалённые вершины

Деревья дп Комбинаторика Перебор поиск в глубину и подобное *2200

Дерево — это неориентированный связный граф, в котором отсутствуют циклы.

Задано дерево из \(n\) вершин. Необходимо посчитать количество способов выбрать в этом дереве ровно \(k\) вершин (т.е. \(k\)-элементное подмножество вершин), так чтобы все попарные расстояния между выбранными вершинами были равны. Иными словами, чтобы существовало такое число \(c\), что для всех \(u, v\) (\(u \ne v\), \(u, v\) — выбранные вершины) было верно \(d_{u,v}=c\), где \(d_{u,v}\) — расстояние от \(u\) до \(v\).

Поскольку ответ может быть очень большим, необходимо вывести его по модулю \(10^9 + 7\).

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

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

Перед каждым набором входных данных расположена пустая строка.

Каждый набор данных состоит из нескольких строк. Первая строка набора данных содержит два целых числа \(n\) и \(k\) (\(2 \le k \le n \le 100\)) — количество вершин в дереве и количество выбираемых вершин соответственно. Далее идут \(n - 1\) строк, каждая содержит два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \neq v\)) — две вершины, которые соединены ребром. Гарантируется, что заданный граф является деревом, отсутствуют петли и кратные рёбра.

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

Для каждого набора входных данных выведите в отдельной строке одно целое число — количество способов выбрать в дереве ровно \(k\) вершин, так чтобы для любых двух пар вершин расстояние между вершинами в паре было одинаковым, по модулю \(10^9 + 7\) (иными словами, выведите остаток при делении на \(1000000007\)).

D. Массив как разность

битмаски графы дп Конструктив математика Перебор поиск в глубину и подобное *1800

Вам дана последовательность из \(n\) целых чисел \(a_1, \, a_2, \, \dots, \, a_n\).

Существует ли последовательность из \(n\) целых чисел \(b_1, \, b_2, \, \dots, \, b_n\) такая, что выполняется следующее свойство?

  • Для каждого \(1 \le i \le n\) существуют два (не обязательно различных) индекса \(j\) и \(k\) (\(1 \le j, \, k \le n\)) такие, что \(a_i = b_j - b_k\).
Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 20\)) — количество наборов входных данных. Затем следуют \(t\) наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 10\)).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, \, \dots, \, a_n\) (\(-10^5 \le a_i \le 10^5\)).

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

Для каждого набора входных данных выведите строку, содержащую YES, если существует последовательность \(b_1, \, \dots, \, b_n\), удовлетворяющая требуемому свойству, и NO в противном случае.

Примечание

В первом наборе входных данных, последовательность \(b = [-9, \, 2, \, 1, \, 3, \, -2]\) удовлетворяет свойству. Действительно, имеет место следующее:

  • \(a_1 = 4 = 2 - (-2) = b_2 - b_5\);
  • \(a_2 = -7 = -9 - (-2) = b_1 - b_5\);
  • \(a_3 = -1 = 1 - 2 = b_3 - b_2\);
  • \(a_4 = 5 = 3 - (-2) = b_4 - b_5\);
  • \(a_5 = 10 = 1 - (-9) = b_3 - b_1\).

Во втором наборе входных данных достаточно выбрать \(b = [0]\), так как \(a_1 = 0 = 0 - 0 = b_1 - b_1\).

В третьем наборе входных данных можно показать, что никакая последовательность \(b\) длины \(3\) не удовлетворяет свойству.

G. Серьезный судья

битмаски Перебор поиск в глубину и подобное сортировки *3000

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

Изначально имеется массив из \(n\) целых чисел \(a_1,\, a_2,\, \dots,\, a_n\). Затем выполняется \(k\) шагов.

Для каждого \(1\le i\le k\) на \(i\)-м шаге сортируется подпоследовательность массива \(a\) с индексами \(j_{i,1}< j_{i,2}< \dots< j_{i, q_i}\), не меняя значений с остальными индексами. Таким образом, в результате подпоследовательность \(a_{j_{i,1}},\, a_{j_{i,2}},\, \dots,\, a_{j_{i,q_i}}\) отсортирована, а все остальные элементы \(a\) остались нетронутыми.

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

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

Первая строка содержит два целых числа \(n\) и \(k\) (\(1\le n\le 40\), \(0\le k\le 10\)) — длину массивов, обрабатываемых алгоритмом Андреа, и количество шагов алгоритма Андреа.

Далее следуют \(k\) строк, каждая из которых описывает подпоследовательность, рассматриваемую на одном из шагов алгоритма Андреа.

В \(i\)-й из этих строк содержится целое число \(q_i\) (\(1\le q_i\le n\)), за которым следуют \(q_i\) целых чисел \(j_{i,1},\,j_{i,2},\,\dots,\, j_{i,q_i}\) (\(1\le j_{i,1}<j_{i,2}<\cdots<j_{i,q_i}\le n\)) — длина подпоследовательности, рассматриваемой на \(i\)-м шаге, и индексы подпоследовательности.

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

Если алгоритм Андреа верен, выведите ACCEPTED, иначе выведите REJECTED.

Примечание

Объяснение первого примера: Алгоритм состоит из \(3\) шагов. Первый сортирует подпоследовательность \([a_1, a_2, a_3]\), второй сортирует подпоследовательность \([a_2, a_3, a_4]\), третий сортирует подпоследовательность \([a_1,a_2]\). Например, если первоначально \(a=[6, 5, 6, 3]\), то алгоритм преобразует массив следующим образом (сортируемая подпоследовательность выделена красным цветом) \(\) [{\color{red}6},{\color{red}5},{\color{red}6},3] \rightarrow [5, {\color{red}6}, {\color{red}6}, {\color{red}3}] \rightarrow [{\color{red}5}, {\color{red}3}, 6, 6] \rightarrow [3, 5, 6, 6] \,.\(\) Можно доказать, что для любого начального массива \(a\), в конце алгоритма массив \(a\) будет отсортирован.

Объяснение второго примера: Алгоритм состоит из \(3\) шагов. На первом сортируется подпоследовательность \([a_1, a_2, a_3]\), на втором — подпоследовательность \([a_2, a_3, a_4]\), на третьем — подпоследовательность \([a_1,a_3,a_4]\). Например, если первоначально \(a=[6, 5, 6, 3]\), то алгоритм преобразует массив следующим образом (сортируемая подпоследовательность выделена красным цветом) \(\) [{\color{red}6},{\color{red}5},{\color{red}6},3] \rightarrow [5, {\color{red}6}, {\color{red}6}, {\color{red}3}] \rightarrow [{\color{red}5}, 3, {\color{red}6}, {\color{red}6}] \rightarrow [5, 3, 6, 6] \,.\(\) Обратите внимание, что \(a=[6,5,6,3]\) является примером массива, который не сортируется алгоритмом.

Объяснение третьего примера: Алгоритм состоит из \(4\) шагов. Первые \(3\) шага ничего не делают, так как сортируют подпоследовательности длиной \(1\), тогда как четвертый шаг сортирует подпоследовательность \([a_1,a_3]\). Например, если первоначально \(a=[5,6,4]\), алгоритм преобразует массив следующим образом (подпоследовательность, которая сортируется, выделена красным цветом) \(\) [{\color{red}5},6,4] \rightarrow [5,{\color{red}6},4] \rightarrow [5,{\color{red}6},4] \rightarrow [{\color{red}5},6,{\color{red}4}]\rightarrow [4,6,5] \,.\(\) Обратите внимание, что \(a=[5,6,4]\) - это пример массива, который не сортируется алгоритмом.

Пояснение четвертого примера: Алгоритм состоит из \(2\) шагов. На первом этапе сортируются подпоследовательности \([a_2,a_3,a_4]\), на втором - весь массив \([a_1,a_2,a_3,a_4,a_5]\). Например, если изначально \(a=[9,8,1,1,1]\), алгоритм преобразует массив следующим образом (подпоследовательность, которая получает сортировку, выделена красным цветом) \(\) [9,{\color{red}8},{\color{red}1},{\color{red}1},1] \rightarrow [{\color{red}9},{\color{red}1},{\color{red}1},{\color{red}8},{\color{red}1}] \rightarrow [1,1,1,8,9] \,.\(\) Поскольку на последнем шаге сортируется весь массив, очевидно, что для любого начального массива \(a\) в конце алгоритма массив \(a\) будет отсортирован.

I. Организовываем музыкальный фестиваль

математика поиск в глубину и подобное *3400

Вы являетесь организатором известного «Цюрихского музыкального фестиваля». На фестивале будут выступать \(n\) певцов, обозначенных целыми числами \(1\), \(2\), \(\dots\), \(n\). Вы должны выбрать, в каком порядке они будут выступать на сцене.

У вас есть \(m\) друзей, и у каждого из них есть набор любимых исполнителей. Для каждого \(1\le i\le m\), \(i\)-му другу нравятся певцы \(s_{i,1}, \, s_{i, 2}, \, \dots, \,s_{i, q_i}\).

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

Вычислите количество правильный порядков выступлений по модулю \(998\,244\,353\).

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

Первая строка содержит два целых числа \(n\) и \(m\) (\(1\le n,\,m\le 100\)) — количество певцов и количество друзей соответственно.

В \(i\)-й из следующих \(m\) строк содержится целое число \(q_i\) (\(1\le q_i\le n\)) — количество любимых певцов \(i\)-го друга — за которым следуют \(q_i\) целых чисел \(s_{i,1}, \, s_{i, 2}, \, \dots, \,s_{i, q_i}\) (\(1\le s_{i,1}<s_{i,2}<\cdots<s_{i,q_i}\le n\)) — номера его любимых певцов.

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

Выведите количество правильный порядков выступлений по модулю \(998\,244\,353\).

Примечание

Объяснение первого примера: Есть \(3\) певца и только \(1\) друг. Другу нравятся два певца \(1\) и \(3\). Таким образом, \(4\) правильных порядка:

  • 1 3 2
  • 2 1 3
  • 2 3 1
  • 3 1 2

Объяснение второго примера: Есть \(5\) певцов и \(5\) друзей. Можно показать, что правильных порядков нет.

Пояснение третьего примера: Есть \(100\) певцов и только \(1\) друг. Другу нравится только певец \(50\), следовательно, все \(100!\) возможных порядков правильны.

Пояснение четвертого примера: Есть \(5\) певцов и только \(1\) друг. Другу нравятся все певцы, следовательно, все \(5!=120\) возможных порядков правильны.

E. Сдвиг перестановки

графы Комбинаторика Конструктив математика Перебор поиск в глубину и подобное снм *2100

Тождественная перестановка длины \(n\) — это массив \([1, 2, 3, \dots, n]\).

Мы применили следующие операции к тождественной перестановке длины \(n\):

  • Вначале мы циклически сдвинули ее вправо на \(k\) позиций, где \(k\) вам неизвестно (вы знаете только то, что \(0 \le k \le n - 1\)). При циклическом сдвиге массива вправо на \(k\) позиций необходимо взять \(k\) последних элементов исходного массива (не меняя их относительный порядок) и дописать \(n - k\) первых элементов исходного массива справа от них (также не меняя относительный порядок этих \(n - k\) элементов). Например, если бы мы циклически сдвинули тождественную перестановку длины \(6\) на \(2\) позиции вправо, мы бы получили массив \([5, 6, 1, 2, 3, 4]\);
  • Далее мы выполнили следующую операцию не более \(m\) раз: выбрали два элемента массива и поменяли их местами.

Вам даны \(n\) и \(m\), а также полученный массив. Ваша задача — найти все возможные значения \(k\) в операции циклического сдвига.

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

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных.

Каждый набор входных данных описывается двумя строками. Первая строка каждого набора содержит два целых числа \(n\) и \(m\) (\(3 \le n \le 3 \cdot 10^5\); \(0 \le m \le \frac{n}{3}\)).

Вторая строка каждого набора содержит \(n\) целых чисел \(p_1, p_2, \dots, p_n\) (\(1 \le p_i \le n\), каждое целое число от \(1\) до \(n\) встречается в последовательности ровно один раз) — полученный массив.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\).

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

Для каждого набора входных данных выведите ответ следующим образом:

  • Вначале выведите одно целое число \(r\) (\(0 \le r \le n\)) — количество возможных значений \(k\) в операции циклического сдвига;
  • Далее выведите \(r\) целых чисел \(k_1, k_2, \dots, k_r\) (\(0 \le k_i \le n - 1\)) — все возможные значения \(k\) в возрастающем порядке.
Примечание

Рассмотрим примеры из условия.

  • В первом наборе входных данных единственное возможное значение для циклического сдвига это \(3\). Если мы сдвинем \([1, 2, 3, 4]\) на \(3\) позиции, мы получим \([2, 3, 4, 1]\). Далее мы можем поменять \(3\)-й и \(4\)-й элементы местами, чтобы получить массив \([2, 3, 1, 4]\);
  • Во втором наборе единственное возможное значение для циклического сдвига это \(0\). Если мы сдвинем \([1, 2, 3]\) на \(0\) позиций, мы получим \([1, 2, 3]\). Далее мы не производим операций обмена (так как нам разрешено совершить не более \(1\)-го обмена), таким образом, полученный массив остается равным \([1, 2, 3]\);
  • В третьем наборе все значения от \(0\) до \(2\) допустимы для циклического сдвига:
    • если мы сдвинем \([1, 2, 3]\) на \(0\) позиций, мы получим \([1, 2, 3]\). Далее мы можем поменять \(1\)-й и \(3\)-й элементы, чтобы получить \([3, 2, 1]\);
    • если мы сдвинем \([1, 2, 3]\) на \(1\) позицию, мы получим \([3, 1, 2]\). Далее мы можем поменять \(2\)-й и \(3\)-й элементы, чтобы получить \([3, 2, 1]\);
    • если мы сдвинем \([1, 2, 3]\) на \(2\) позиции, мы получим \([2, 3, 1]\). Далее мы можем поменять \(1\)-й и \(2\)-й элементы, чтобы получить \([3, 2, 1]\);
  • В четвертом наборе входных данных операции обмена запрещены, однако ни один циклический сдвиг не равен массиву \([1, 2, 3, 4, 6, 5]\).

E. Вы

дп математика поиск в глубину и подобное теория чисел *2600

Вам дано дерево с \(n\) вершинами. Напомним, что дерево — это связный неориентированный граф без циклов.

Пусть \(a_1, a_2, \ldots, a_n\) — последовательность целых чисел. Выполним следующую операцию ровно \(n\) раз:

  • Выберем неудаленную вершину \(u\). Присвоим \(a_u :=\) количество неудаленных вершин, соседних с \(u\). Затем удалим вершину \(u\) вместе со всеми ребрами, концом которых она является.

Для каждого целого числа \(k\) от \(1\) до \(n\) найдите по модулю \(998\,244\,353\) количество различных последовательностей \(a_1, a_2, \ldots, a_n\), удовлетворяющих следующим условиям:

  • можно получить \(a\), выполнив вышеупомянутую операцию ровно \(n\) раз в некотором порядке.
  • \(\operatorname{gcd}(a_1, a_2, \ldots, a_n) = k\). Здесь \(\operatorname{gcd}\) означает наибольший общий делитель элементов в \(a\).
Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10\,000\))  — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 10^5\)).

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

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(3 \cdot 10^5\).

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

Для каждого набора входных данных выведите в одной строке \(n\) целых чисел, где для каждого \(k\) от \(1\) до \(n\) \(k\)-е целое число обозначает ответ, когда \(\operatorname{gcd}\) равен \(k\).

Примечание

В первом наборе входных данных дерево изображено на рисунке.

  • Если мы удалим вершины в порядке \(1 \rightarrow 2 \rightarrow 3\) или \(1 \rightarrow 3 \rightarrow 2\), то полученная последовательность будет \(a = [2, 0, 0]\), которая имеет \(\operatorname{gcd}\), равный \(2\).
  • Если удалить узлы в порядке \(2 \rightarrow 1 \rightarrow 3\), то полученная последовательность будет \(a = [1, 1, 0]\), \(\operatorname{gcd}\) которой равен \(1\).
  • Если удалить узлы в порядке \(3 \rightarrow 1 \rightarrow 2\), то полученная последовательность будет \(a = [1, 0, 1]\), \(\operatorname{gcd}\) которой равен \(1\).
  • Если удалить узлы в порядке \(2 \rightarrow 3 \rightarrow 1\) или \(3 \rightarrow 2 \rightarrow 1\), то полученная последовательность будет \(a = [0, 1, 1]\), \(\operatorname{gcd}\) которой равен \(1\).

Обратите внимание, что здесь мы считаем количество различных последовательностей, а не количество различных порядков удаления узлов.

E. Нижний уровень

meet-in-the-middle Бинарный поиск графы жадные алгоритмы кратчайшие пути поиск в глубину и подобное *3000

В некоторой компьютерной игре игрок управляет героем, который характеризуется одним целочисленным параметром — силой.

На текущем уровне герой попал в систему из \(n\) пещер, пронумерованных от \(1\) до \(n\), и \(m\) коридоров между ними. Каждый коридор соединяет две различные пещеры. Любые две пещеры соединены не более чем одним коридором. Из любой пещеры можно попасть в любую другую, двигаясь по коридорам.

Герой начинает уровень в пещере \(1\), а в каждой из оставшихся пещер находится монстр.

Герой может перемещаться между пещерами по коридорам. Если герой вышел из пещеры и начал движение по коридору, он обязан завершить его и дойти до противоположного конца коридора.

По любому коридору герой может перемещаться в обоих направлениях. Однако герой не может использовать один и тот же коридор два раза подряд. Формально, если герой перешёл по коридору из пещеры \(i\) в пещеру \(j\), он не может сразу же направиться обратно в пещеру \(i\), но может направиться в любую другую пещеру, соединённую коридором с пещерой \(j\).

Известно, что из любой пещеры выходит как минимум два коридора, поэтому герой никогда не попадёт в тупик даже с учётом предыдущего требования.

Чтобы пройти уровень, герою нужно победить монстров во всех пещерах. Когда герой впервые зайдёт в пещеру, ему придётся драться с монстром в ней. Герой может победить монстра в пещере \(i\) только в том случае, если сила героя строго больше \(a_i\). В случае победы над монстром сила героя увеличится на \(b_i\). Если герой не может победить монстра, с которым он дерётся, игра заканчивается и игрок проигрывает.

После того, как герой победит монстра в пещере \(i\), все последующие визиты в пещеру \(i\) не будут иметь последствий — монстра в этой пещере уже не будет, но и сила героя не будет изменяться.

Найдите минимальную необходимую силу, с которой герой должен начать уровень, чтобы иметь возможность победить всех монстров и пройти уровень.

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

Во входных данных находятся несколько наборов входных данных. В первой строке задано одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

Первая строка набора входных данных содержит два целых числа \(n\) и \(m\) (\(3 \le n \le 1000\); \(n \le m \le min(\frac{n(n-1)}{2}, 2000)\)) — число пещер и коридоров.

Вторая строка содержит \(n-1\) целых чисел \(a_2, a_3, \ldots, a_n\) (\(1 \le a_i \le 10^9\)) — значения, с которыми сравнивается сила героя при битве с монстрами в пещерах \(2, 3, \ldots, n\).

Третья строка содержит \(n-1\) целых чисел \(b_2, b_3, \ldots, b_n\) (\(1 \le b_i \le 10^9\)) — прибавки к силе героя за победу над монстрами в пещерах \(2, 3, \ldots, n\).

Каждая из следующих \(m\) строк содержит два целых числа \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\); \(u_i \ne v_i\)) — номера пещер, соединённых коридором.

Никакие две пещеры не соединены более чем одним коридором. Из любой пещеры можно попасть в любую другую, двигаясь по коридорам. Из любой пещеры выходит как минимум два коридора.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(1000\), а сумма значений \(m\) по всем наборам входных данных не превосходит \(2000\).

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

Для каждого набора входных данных выведите одно целое число — минимальную силу героя, необходимую для того, чтобы иметь возможность победить всех монстров и пройти уровень.

Примечание

В первом наборе входных данных герой может пройти уровень, начав с силы \(15\), следующим образом:

  • перейти из пещеры \(1\) в пещеру \(2\): так как \(15 > 11\), герой побеждает монстра, сила героя увеличивается до \(15 + 8 = 23\);
  • перейти из пещеры \(2\) в пещеру \(3\): так как \(23 > 22\), герой побеждает монстра, сила героя увеличивается до \(23 + 7 = 30\);
  • перейти из пещеры \(3\) в пещеру \(4\): так как \(30 > 13\), герой побеждает монстра, сила героя увеличивается до \(30 + 5 = 35\).

Во втором наборе входных данных ситуация аналогична, но прибавки к силе героя в пещерах \(2\) и \(4\) поменялись местами. Герой может использовать другой маршрут, \(1 \rightarrow 4 \rightarrow 3 \rightarrow 2\), и пройти уровень с начальной силой \(15\).

В третьем наборе входных данных герой может пройти уровень, начав с силы \(19\), следующим образом:

  • перейти из пещеры \(1\) в пещеру \(2\): так как \(19 > 10\), герой побеждает монстра, сила героя увеличивается до \(19 + 7 = 26\);
  • перейти из пещеры \(2\) в пещеру \(4\): так как \(26 > 20\), герой побеждает монстра, сила героя увеличивается до \(26 + 10 = 36\);
  • перейти из пещеры \(4\) в пещеру \(5\): так как \(36 > 30\), герой побеждает монстра, сила героя увеличивается до \(36 + 5 = 41\);
  • перейти из пещеры \(5\) в пещеру \(2\): в этой пещере монстра уже нет, поэтому ничего не происходит;
  • перейти из пещеры \(2\) в пещеру \(3\): так как \(41 > 40\), герой побеждает монстра, сила героя увеличивается до \(41 + 2 = 43\).

D2. Mocha и Diana (сложная версия)

графы Деревья жадные алгоритмы Конструктив Перебор поиск в глубину и подобное снм *2500

Это сложная версия задачи. Две версии отличаются ограничениями на \(n\). Вы можете делать взломы, только если обе версии задачи решены.

Лесом называется неориентированный граф без циклов (не обязательно связный).

Mocha и Diana — друзья из Чжицзяна, у каждой из них есть лес с вершинами, пронумерованными от \(1\) до \(n\), и они хотят добавить ребра в свои леса с выполнением следующих условий:

  • После добавления ребер каждый из графов остается лесом.
  • Они добавляют одинаковые ребра. Это значит, что если ребро \((u, v)\) добавляется в лес Mocha, то также ребро \((u, v)\) добавляется в лес Diana, и наоборот.

Mocha и Diana хотят знать, какое максимальное количество ребер они могут добавить, и какие ребра им нужно добавлять.

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

Первая строка содержит три целых числа \(n\), \(m_1\) и \(m_2\) (\(1 \le n \le 10^5\), \(0 \le m_1, m_2 < n\)) — количество вершин и начальное количество ребер в лесе Mocha и в лесе Diana, соответственно.

Каждая из следующих \(m_1\) строк содержит два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \neq v\)) — ребра в лесе Mocha.

Каждая из следующих \(m_2\) строк содержит два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \neq v\)) — ребра в лесе Diana.

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

Первая строка содержит одно целое число \(h\) — максимальное количество ребер, которое можно добавить в каждый из лесов Mocha и Diana.

Каждая из следующих \(h\) строк содержит два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \neq v\)) — ребра, которые нужно добавить.

Если существует несколько решений, выведите любое из них.

Примечание

В первом примере нельзя добавить ни одно ребро.

Во втором примере начальные леса выглядят следующим образом.

Можно добавить ребро \((2, 4)\).

F1. Ближайшее красивое число (упрощённая версия)

Бинарный поиск битмаски жадные алгоритмы Конструктив Перебор поиск в глубину и подобное *1900

Это упрощённая версия задачи F2. Они отличаются только ограничениями (F1: \(k \le 2\), F2: \(k \le 10\)).

Дано число \(n\). Найдите минимальное целое число \(x\) такое, что \(x \ge n\) и \(x\) является \(k\)-красивым числом.

Число называется \(k\)-красивым, если в его десятичной записи, не содержащей лидирующих нулей, встречается не более \(k\) различных цифр. Например, если \(k = 2\), числа \(3434443\), \(55550\), \(777\) и \(21\) являются \(k\)-красивыми, а числа \(120\), \(445435\) и \(998244353\) — нет.

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

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

Каждый набор входных данных состоит из одной строки, содержащей два целых числа \(n\) и \(k\) (\(1 \le n \le 10^9\), \(1 \le k \le 2\)).

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

Для каждого набора входных данных в отдельной строке выведите \(x\) — минимальное целое \(k\)-красивое число, так чтобы \(x \ge n\).

F2. Ближайшее красивое число (усложнённая версия)

битмаски дп жадные алгоритмы Конструктив Перебор поиск в глубину и подобное *2100

Это усложнённая версия задачи F1. Они отличаются только ограничениями (F1: \(k \le 2\), F2: \(k \le 10\)).

Дано число \(n\). Найдите минимальное целое число \(x\) такое, что \(x \ge n\) и \(x\) является \(k\)-красивым числом.

Число называется \(k\)-красивым, если в его десятичной записи, не содержащей лидирующих нулей, встречается не более \(k\) различных цифр. Например, если \(k = 2\), числа \(3434443\), \(55550\), \(777\) и \(21\) являются \(k\)-красивыми, а числа \(120\), \(445435\) и \(998244353\) — нет.

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

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

Каждый набор входных данных состоит из одной строки, содержащей два целых числа \(n\) и \(k\) (\(1 \le n \le 10^9\), \(1 \le k \le 10\)).

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

Для каждого набора входных данных в отдельной строке выведите \(x\) — минимальное целое \(k\)-красивое число, так чтобы \(x \ge n\).

E. Пересадка почек

Деревья дп жадные алгоритмы Конструктив поиск в глубину и подобное *2000

Деревом называется связный граф без циклов. В корневом дереве есть особая вершина, которая называется корнем. Родитель вершины \(v\) (отличной от корня) — вершина перед \(v\) на кратчайшем пути от корня до \(v\). Дети вершины \(v\) — все вершины, для которых \(v\) является родителем.

Вершина называется листом, если у неё нет детей. Назовем вершину почкой, если выполняются три следующих условия:

  • она не является корнем,
  • у неё есть хотя бы один ребёнок, и
  • все её дети — листья.

Вам дано корневое дерево из \(n\) вершин. Вершина \(1\) — корень. За одно действие вы можете выбрать любую почку со всеми её детьми (они являются листьями) и переподвесить её за любую другую вершину дерева. Таким действием вы удаляете ребро, соединяющее почку и родителя, и добавляете ребро между почкой и выбранной вершиной дерева. Эта выбранная вершина не может совпадать с выбранной почкой или быть одним из ее детей. Все дети почки остаются соединёнными с ней.

Какое минимальное количество листьев можно получить, если разрешается сделать любое количество вышеописанных действий (возможно, ни одного)?

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

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится единственное целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит единственное целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество вершин в данном дереве.

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

Гарантируется, что данный граф является деревом.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

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

Для каждого набора входных данных выведите одно число — минимальное количество листьев, которое можно получить после нескольких (возможно нуля) действий.

Примечание

В первом наборе входных данных дерево выглядит следующим образом:

Сначала вы можете выбрать почку \(4\) и переподвесить её за вершину \(3\). После этого вы можете выбрать почку \(2\) и переподвесить её за вершину \(7\). В результате вы получите следующее дерево с \(2\) листьями:

Можно доказать, что это минимальное количество листьев, которое можно получить.

Во втором наборе входных данных дерево выглядит следующим образом:

Вы можете выбрать почку \(3\) и переподвесить её за вершину \(5\). В результате вы получите следующее дерево с \(2\) листьями:

Можно доказать, что это минимальное количество листьев, которое можно получить.

F. Непереводимое название

2-sat графы Конструктив поиск в глубину и подобное реализация снм *2700

У Алисы есть пустое поле из \(n\) строк и \(m\) столбцов. Некоторые клетки этого поля помечены, и ни одна помеченная клетка не касается края поля. (Две клетки считаются соседними, если они касаются по стороне.)

Алиса хочет записать в каждую клетку число так, чтобы они удовлетворяли следующим условиям:

  • в каждой непомеченной клетке записано либо \(1\), либо \(4\);
  • в каждой помеченной клетке записана сумма чисел всех соседних непомеченных клеток (если у помеченной вершины нет соседних непомеченных, то сумма равна \(0\));
  • в каждой помеченной клетке записанное число делится на \(5\).
Не придумав ничего, Алиса решила попросить помощи у Боба. Помогите Бобу найти любое подходящее заполнение поля, или определить, что такого поля не существует.
Входные данные

В первой строке заданы два целых числа \(n\) и \(m\) (\(1 \leq n, m \leq 500\)) — количество строк и столбцов поля, соответственно.

Далее следуют \(n\) строк, каждая состоит из \(m\) символов. Каждый символ — это «.» или «X» — непомеченная или помеченная клетка, соответственно. Ни одна помеченная клетка не касается краев поля.

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

Выведите «NO», если не существует подходящего заполнения. В противном случае выведите «YES». Далее выведите \(n\) строк по \(m\) целых чисел через пробел — числа в клетках поля.

Примечание

Можно показать, что во втором примере не существует подходящего заполнения.

F. Палиндромный гамильтонов путь

графы дп Перебор поиск в глубину и подобное хэши *3000

Задан простой неориентированный граф с \(n\) вершинами, \(n\) четно. Вы планируете написать одну букву на каждой вершине. Каждая буква должна быть одной из первых \(k\) букв латинского алфавита.

Путь в графе называется гамильтоновым, если он посещает каждую вершину ровно один раз. Строка называется палиндромной, если она читается одинаково слева направо и справа налево. Путь в графе называется палиндромным, если при выписывании букв с вершин в порядке пути получается палиндромная строка.

Строка длины \(n\) хорошая, если:

  • каждая буква — это одна из первых \(k\) латинского алфавита;
  • если написать \(i\)-ю букву строки на \(i\)-й вершине графа, то в графе будет существовать палиндромный гамильтонов путь.

Обратите внимание, что путь не обязан проходить по вершинам в порядке \(1, 2, \dots, n\).

Посчитайте количество хороших строк.

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

В первой строке записаны три целых числа \(n\), \(m\) and \(k\) (\(2 \le n \le 12\); \(n\) четно; \(0 \le m \le \frac{n \cdot (n-1)}{2}\); \(1 \le k \le 12\)) — количество вершин в графе, количество ребер в графе и количество первых букв алфавита, которые можно использовать.

В каждой из следующих \(m\) строк записаны по два целых числа \(v\) и \(u\) (\(1 \le v, u \le n\); \(v \neq u\)) — ребра графа. Граф не содержит кратных ребер и петель.

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

Выведите одно целое число — количество хороших строк.

D. Самый сильный билд

Бинарный поиск графы жадные алгоритмы Перебор поиск в глубину и подобное реализация Структуры данных хэши *2000

Иван играет в очередную roguelike компьютерную игру. В игре он управляет одним героем. У героя есть \(n\) слотов для экипировки предметов. Для \(i\)-го слота есть список из \(c_i\) предметов, \(j\)-й из них увеличивает силу героя на \(a_{i,j}\). Предметы для каждого из слотов попарно различные и упорядочены по возрастанию увеличения силы. То есть, \(a_{i,1} < a_{i,2} < \dots < a_{i,c_i}\).

В каждый слот Иван выбирает ровно один предмет. Пусть в \(i\)-й слот он выбрал \(b_i\)-й предмет из соответствующего списка. Последовательность выборов \([b_1, b_2, \dots, b_n]\) называется билдом.

Сила билда — это сумма увеличений силы предметов в нем. Некоторые билды в игре запрещены. Задан список из \(m\) попарно различных запрещенных билдов. Гарантируется, что хотя бы один билд не запрещен.

Какой билд среди не запрещенных в игре имеет максимальную силу? Если есть несколько билдов с максимальной силой, выведите любой из них.

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

В первой строке записано одно целое число \(n\) (\(1 \le n \le 10\)) — количество слотов экипировки.

В \(i\)-й из следующих \(n\) строк содержится описание предметов для \(i\)-го слота. Сначала одно целое число \(c_i\) (\(1 \le c_i \le 2 \cdot 10^5\)) — количество предметов для \(i\)-го слота. Затем \(c_i\) целых чисел \(a_{i,1}, a_{i,2}, \dots, a_{i,c_i}\) (\(1 \le a_{i,1} < a_{i,2} < \dots < a_{i,c_i} \le 10^8\)).

Сумма \(c_i\) не превосходит \(2 \cdot 10^5\).

В следующей строке записано одно целое число \(m\) (\(0 \le m \le 10^5\)) — количество запрещенных билдов.

В каждой из следующих \(m\) строк содержится описание запрещенного билда — последовательность из \(n\) целых чисел \(b_1, b_2, \dots, b_n\) (\(1 \le b_i \le c_i\)).

Билды попарно различные, и существует хотя бы один не запрещенный билд.

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

Выведите билд с максимальной силой среди не запрещенных в игре. Если есть несколько билдов с максимальной силой, выведите любой из них.

F. Вхождения

бпф графы дп Комбинаторика поиск в глубину и подобное снм *2700

Подмассив массива \(a\) с индекса \(l\) по индекс \(r\) — это массив \([a_l, a_{l+1}, \dots, a_{r}]\). Количество вхождений массива \(b\) в массива \(a\) — это количество таких подмассивов массива \(a\), которые равны \(b\).

Вам даны \(n\) массивов \(A_1, A_2, \dots, A_n\); их элементы — целые числа от \(1\) до \(k\). Вы должны построить массив \(a\) из \(m\) целых чисел от \(1\) до \(k\) таким образом, чтобы для каждого заданного массива \(A_i\) выполнялось следующее условие: количество вхождений массива \(A_i\) в массив \(a\) не меньше, чем количество вхождений каждого непустого подмассива \(A_i\) в \(a\) (по отдельности). Обратите внимание, что если \(A_i\) не входит в \(a\), и никакой подмассив \(A_i\) не входит в \(a\), это условие выполняется для \(A_i\).

Ваша задача — посчитать количество различных массивов \(a\), удовлетворяющих этим условиям, и вывести его по модулю \(998244353\).

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

В первой строке заданы три целых числа \(n\), \(m\) и \(k\) (\(1 \le n, m, k \le 3 \cdot 10^5\)) — количество заданных массивов, требуемое количество элементов в массиве \(a\), и верхнее ограничение на элементы массивов.

Затем следуют \(n\) строк. \(i\)-я строка задает массив \(A_i\). Первое число в \(i\)-й строке — \(c_i\) (\(1 \le c_i \le m\)), количество элементов в массиве \(A_i\); затем следуют \(c_i\) целых чисел от \(1\) до \(k\) — элементы массива \(A_i\).

Дополнительное ограничение на входные данные: \(\sum\limits_{i=1}^n c_i \le 3 \cdot 10^5\); то есть общее количество элементов в заданных массивах не превосходит \(3 \cdot 10^5\).

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

Выведите одно целое число — количество различных массивов \(a\), удовлетворяющих данным условиям, по модулю \(998244353\).

D. Divisible by Twenty-Five

дп Перебор поиск в глубину и подобное *1800

Mr. Chanek has an integer represented by a string \(s\). Zero or more digits have been erased and are denoted by the character _. There are also zero or more digits marked by the character X, meaning they're the same digit.

Mr. Chanek wants to count the number of possible integer \(s\), where \(s\) is divisible by \(25\). Of course, \(s\) must not contain any leading zero. He can replace the character _ with any digit. He can also replace the character X with any digit, but it must be the same for every character X.

As a note, a leading zero is any 0 digit that comes before the first nonzero digit in a number string in positional notation. For example, 0025 has two leading zeroes. An exception is the integer zero, (0 has no leading zero, but 0000 has three leading zeroes).

Input

One line containing the string \(s\) (\(1 \leq |s| \leq 8\)). The string \(s\) consists of the characters 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, _, and X.

Output

Output an integer denoting the number of possible integer \(s\).

Note

In the first example, the only possible \(s\) is \(25\).

In the second and third example, \(s \in \{100, 200,300,400,500,600,700,800,900\}\).

In the fifth example, all possible \(s\) will have at least one leading zero.

J. Just Kingdom

Перебор поиск в глубину и подобное Структуры данных *3100

The Just Kingdom is ruled by a king and his \(n\) lords, numbered \(1\) to \(n\). Each of the lords is a vassal of some overlord, who might be the king himself, or a different lord closer to the king. The king, and all his lords, are just and kind.

Each lord has certain needs, which can be expressed as a certain amount of money they need. However, if a lord, or the king, receives any money, they will first split it equally between all their vassals who still have unmet needs. Only if all the needs of all their vassals are met, they will take the money to fulfill their own needs. If there is any money left over, they will return the excess to their overlord (who follows the standard procedure for distributing money).

At the beginning of the year, the king receives a certain sum of tax money and proceeds to split it according to the rules above. If the amount of tax money is greater than the total needs of all the lords, the procedure guarantees everybody's needs will be fulfilled, and the excess money will be left with the king. However, if there is not enough money, some lords will not have their needs met.

For each lord, determine the minimum amount of tax money the king has to receive so that this lord's needs are met.

Input

The first line of the input contains the number of lords \(n\) (\(0 \le n \le 3 \cdot 10^5\)). Each of the next \(n\) lines describes one of the lords. The \(i\)-th line contains two integers: \(o_i\) (\(0 \le o_i < i\)) — the index of the overlord of the \(i\)-th lord (with zero meaning the king is the overlord), and \(m_i\) (\(1 \le m_i \le 10^6\)) — the amount of money the \(i\)-th lord needs.

Output

Print \(n\) integer numbers \(t_i\). The \(i\)-th number should be the minimum integer amount of tax money the king has to receive for which the needs of the \(i\)-th lord will be met.

Note

In the sample input, if the king receives \(5\) units of tax money, he will split it equally between his vassals — the lords \(1\), \(3\), and \(5\), with each receiving \(\frac{5}{3}\) of money.

Lord \(1\) will split the money equally between his vassals — \(2\) and \(4\), with each receiving \(\frac{5}{6}\). Lord \(5\) will keep the money (having no vassals). Lord \(3\) will keep \(1\) unit of money, and give the remaining \(\frac{2}{3}\) to the king. The king will then split the \(\frac{2}{3}\) between the vassals with unmet needs — \(1\) and \(5\), passing \(\frac{1}{3}\) to each. Lord \(5\) will keep the extra cash (now having a total of \(2\), still not enough to meet his needs). Lord \(1\) will split it equally between his vassals, and the extra \(\frac{1}{6}\) will be enough to meet the needs of lord \(4\).

E. Момент цветения

графы Деревья жадные алгоритмы Конструктив Паросочетания поиск в глубину и подобное *2200

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

Ху Тао, будучи маленькой проказницей, попыталась напугать вас этой задачей с графом! Вам дан связный неориентированный граф из \(n\) вершин с \(m\) ребрами. У вас также есть \(q\) запросов. Каждый запрос состоит из двух вершин \(a\) и \(b\).

Изначально все ребра графа имеют вес \(0\). Для каждого запроса вы должны выбрать простой путь, начинающийся из \(a\) и заканчивающийся в \(b\). Затем к весу каждого ребра вдоль этого пути добавляется \(1\). Определите, возможно ли, чтобы после обработки всех \(q\) запросов все ребра в этом графе имели четный вес. Если да, то выведите выбор путей для каждого запроса.

Если это невозможно, определите наименьшее количество дополнительных запросов, которые можно добавить, чтобы это стало возможным. Можно показать, что при заданных ограничениях это число не превысит \(10^{18}\).

Простой путь определяется как любой путь, который не посещает вершину более одного раза.

Считается, что ребро имеет четный вес, если его значение кратно \(2\).

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

Первая строка содержит два целых числа \(n\) и \(m\) (\(2 \leq n \leq 3 \cdot 10^5\), \(n-1 \leq m \leq \min{\left(\frac{n(n-1)}{2}, 3 \cdot 10^5\right)}\)).

Каждая из следующих \(m\) строк содержит два целых числа \(x\) и \(y\) (\(1 \leq x, y \leq n\), \(x\neq y\)), указывающих на неориентированное ребро между вершинами \(x\) и \(y\). Входные данные не будут содержать петель или дублирующихся ребер, и полученный граф будет связным.

Следующая строка содержит одно целое число \(q\) (\(1 \leq q \leq 3 \cdot 10^5\)).

Каждая из следующих \(q\) строк содержит два целых числа \(a\) и \(b\) (\(1 \leq a, b \leq n, a \neq b\)), описание каждого запроса.

Гарантируется, что \(nq \leq 3 \cdot 10^5\).

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

Если можно заставить все веса ребер быть четными, выведите «YES» в первой строке, а затем \(2q\) строк, указывающих выбор пути для каждого запроса в том же порядке, в котором задаются запросы. Для каждого запроса первая строка должна содержать одно целое число \(x\): количество узлов в выбранном пути. Следующая строка должна содержать \(x\) целых чисел \(p_i\), указывающих выбранный путь (\(p_1 = a, p_x = b\) и все числа должны лежать между \(1\) и \(n\)). Этот путь не может содержать одну вершину более одного раза и должен быть корректным простым путем в графе.

Если невозможно заставить все веса ребер быть четными, выведите «NO» в первой строке и минимальное количество запросов, которые нужно добавить, во второй строке.

Примечание

Вот как выглядят запросы для первого примера (красный цвет соответствует 1-му запросу, синий — 2-му, а зеленый — 3-му):

Обратите внимание, что каждое ребро в графе входит либо в \(0\), либо в \(2\) цветных пути.

Граф во втором примере выглядит следующим образом:

Не существует такого назначения путей, которое заставит все ребра иметь четные веса при заданных запросах. Чтобы получить набор запросов, удовлетворяющих условию, нужно добавить по крайней мере \(2\) новых запроса.

E. Запросы частот

Деревья поиск в глубину и подобное Структуры данных *2400

У Пети есть подвешенное дерево, на вершинах которого написаны целые числа. Корень — вершина \(1\). Вам нужно ответить на некоторые вопросы про это дерево.

Дерево — это связный ацикличный граф. Подвешенное дерево имеет специальную вершину — корень. Родителем вершины \(v\) называется следующая вершина на кратчайшем пути от \(v\) до корня.

Каждый запрос задан тройкой целых чисел \(v\), \(l\), и \(k\). Чтобы на него ответить вы должны проделать следующие шаги:

  • Сначала, выпишите последовательность чисел, записанных на вершинах простого пути от \(v\) до корня (включая вершину \(v\) и сам корень).
  • Посчитайте, сколько раз каждой число встречается в этой последовательности. Выкиньте из неё числа, которые встречаются меньше, чем \(l\) раз.
  • Преобразуйте последовательность, удалив из неё дубликаты, и упорядочив числа в ней возрастанию количеств вхождений в изначальную последовательность. В случая совпадения таких количеств, два числа располагаются в произвольном относительном порядке.
  • Ответом на запрос является число, стоящее \(k\)-м в получившейся последовательности. Важно отметить, что так как порядок определён неоднозначно, то в качестве ответа примется любое число, которое могло стоять на этой позиции. Также может получиться, что в результирующей последовательности меньше \(k\), в таком случае ответом считается \(-1\).

Например, если последовательность чисел на пути от \(v\) до корня равна \([2, 2, 1, 7, 1, 1, 4, 4, 4, 4]\), \(l = 2\) и \(k = 2\), то ответ равен \(1\).

Ответьте, пожалуйста, на все вопросы про дерево.

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

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 10^6\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка набора входных данных содержит одно целое число \(n\), \(q\) (\(1 \leq n, q \leq 10^6\)) — количество вершин в дереве и количество запросов.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq n\)), где \(a_i\) — число записанное на \(i\)-й вершине.

Третья строка содержит \(n-1\) целых чисел \(p_2, p_3, \ldots, p_n\) (\(1 \leq p_i \leq n\)), где \(p_i\) — родитель вершины \(i\). Гарантируется, что значения \(p\) задают корректное дерево.

Каждая из последующих \(q\) строк содержит по три целых числа \(v\), \(l\), \(k\) (\(1 \leq v, l, k \leq n\)) — описание вопросов.

Гарантируется, что сумма значений \(n\) и сумма значений \(q\) по всем наборам входных данных не превосходит \(10^6\).

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

Для каждого из запросов, выведите ответ на него. Если ответов несколько, то выведите любой.

C. Бакри и разделение

битмаски графы Деревья дп Конструктив поиск в глубину и подобное *1700

Бакри столкнулся с задачей, но поскольку ему лень ее решать, он просит вашей помощи.

Вам дано дерево на \(n\) вершинах, \(i\)-й вершине присвоено значение \(a_i\) для каждого \(i\) от \(1\) до \(n\). Напомним, что дерево на \(n\) вершинах — это связный граф с \(n-1\) ребрами.

Вы хотите удалить из дерева не менее \(1\), но не более \(k-1\) ребер так, чтобы выполнялось следующее условие:

  • Для каждой компоненты связности вычислим побитовое исключающего ИЛИ значений вершин в ней. Тогда, эти значения должны быть одинаковыми для всех компонент связности.

Возможно ли выполнить это условие?

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

Каждый тест содержит несколько наборов входных данных. Первая строка содержит количество наборов входных данных \(t\) \((1 \leq t \leq 5 \cdot 10^4)\). Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) \((2 \leq k \leq n \leq 10^5)\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, ..., a_n\) \((1 \leq a_i \leq 10^9)\).

В \(i\)-й из следующих \(n-1\) строк содержится два целых числа \(u_i\) и \(v_i\) (\(1 \leq u_i, v_i \leq n\), \(u_i\neq v_i\)), что означает, что между вершинами \(u_i\) и \(v_i\) есть ребро.

Гарантируется, что данный граф является деревом.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

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

Для каждого набора входных данных вы должны вывести одну строку. Если вы можете удалить ребра в соответствии с условиями, написанными выше, выведите «YES» (без кавычек). В противном случае выведите «NO» (без кавычек).

Вы можете вывести каждую букву «YES» и «NO» в любом регистре (верхнем или нижнем).

Примечание

Можно показать, что условие недостижимо для первого, третьего и пятого наборов входных данных.

Во втором наборе входных данных можно просто удалить все ребра. Останется \(5\) компонент связности, каждая из которых содержит только одну вершину со значением \(3\), поэтому побитовое ИЛИ для каждой из них будет \(3\).

В четвертом случае дерево изображено ниже: .

Вы можете удалить ребро \((4,5)\).

Побитовое ИЛИ первой компоненты будет равен \(a_1 \oplus a_2 \oplus a_3 \oplus a_4 = 1 \oplus 6 \oplus 4 \oplus 1 = 2\) (где \(\oplus\) обозначает побитовое ИЛИ).

Побитовое ИЛИ второй компоненты будет равно \(a_5 = 2\).

D. Хемосе на ICPC?

Бинарный поиск Деревья интерактив математика поиск в глубину и подобное реализация теория чисел *2300

Это интерактивная задача!

На последнем региональном этапе Хемосе, ЗейадХаттаб и ЯхиаШериф — члены команды Carpe Diem — не прошли отбор на ICPC по каким-то неизвестным причинам. Хемосе был очень расстроен и у него был плохой день после соревнований, но ЗейадХаттаб очень мудрый и хорошо знает Хемосе, и не хочет видеть его грустным.

Зейад знает, что Хемосе любит задачи с деревьями, поэтому он дал ему задачу с деревом с очень особенным устройством.

У Хемоса есть взвешенное дерево на \(n\) вершинах и \(n-1\) ребрах. К сожалению, Хемосе не помнит веса ребер.

Определим \(Dist(u, v)\) для \(u\neq v\) как наибольший общий делитель весов всех ребер на пути от вершины \(u\) к вершине \(v\).

У Хемосе есть специальное устройство. Хемосе может дать устройству набор вершин, и устройство вернет наибольший \(Dist\) между любыми двумя вершинами из этого набора. Более формально, если Хемосе даст устройству набор из \(S\) узлов, устройство вернет наибольшее значение \(Dist(u, v)\) по всем парам \((u, v)\), для которых \(u\), \(v\) \(\in\) \(S\) и \(u \neq v\).

Хемосе может использовать это устройство не более \(12\) раз, и хочет найти любые две различные вершины \(a\), \(b\) такие, что \(Dist(a, b)\) является максимально возможным. Можете ли вы ему помочь?

Протокол взаимодействия

Начните взаимодействие с чтения одного целого числа \(n\) (\(2 \le n \le 10^3\)) — количества вершин в дереве.

Затем прочитайте \(n-1\) строк.

\(i\)-я из следующих \(n-1\) строк содержит два целых числа \(u_i\) и \(v_i\) (\(1 \leq u_i, v_i \leq n\), \(u_i\neq v_i\)), что означает наличие ребра между вершинами \(u_i\) и \(v_i\).

Гарантируется, что веса ребер были \(\leq 10^9\).

Гарантируется, что данный граф является деревом.

Теперь вы можете начать задавать запросы. Чтобы задать запрос о множестве из \(k\) вершин \(v_1, v_2, \ldots, v_k\) (\(2 \le k \le n\), \(1 \le v_i \le n\), все \(v_i\) различны), выведите:

? \(k\) \(v_1\) \(v_2\) \(\ldots\) \(v_k\).

Вы получите целое число \(x\), наибольшее \(Dist(v_i, v_j)\) по \(1 \le i, j \le k\) с \(i \neq j\).

Когда вы найдете \(a\) и \(b\) (\(1 \le a, b \le n)\), \(a\neq b\)) такие, что \(Dist(a, b)\) является максимально возможным, выведите ответ в следующем формате:

! \(a\) \(b\)

Вывод ответа не учитывается в лимит в \(12\) запросов.

Если существует несколько пар \((a, b)\) с одинаковым наибольшим \(Dist(a, b)\), можно вывести любую.

После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Взломы

Чтобы взломать решение, используйте следующий формат.

Первая строка должна содержать одно целое число \(n\) \((2 \leq n \le 10^3)\) — количество вершин.

В \(i\)-й из следующих \(n-1\) строк должно содержаться три целых числа \(u_i\), \(v_i\), \(w_i\) (\(1 \le u_i, v_i \le n\), \(u_i\ne v_i\), \(1 \le w \le 10^9\)), что означает, что между вершинами \(u_i\) и \(v_i\) есть ребро с весом \(w_i\).

Эти \(n-1\) ребер должны образовывать дерево.

Примечание

Дерево в первом примере приведено ниже:

B. Делись на 25!

дп жадные алгоритмы математика математика поиск в глубину и подобное *900

Задано целое положительное число \(n\). За \(1\) ход можно выбрать любую его цифру и удалить её (т. е. выбирается некоторая позиция в числе и удаляется стоящая в этой позиции цифра). Операцию нельзя произвести, если осталась всего одна цифра. Если получившееся число содержит ведущие нули, то они автоматически удаляются.

Например, если из числа \(32925\) удалить \(3\)-ю цифру, то результатом операции станет число \(3225\), а если из числа \(20099050\) удалить первую цифру, то результатом операции станет число \(99050\) (следующие за первой цифрой \(2\) нуля удаляются автоматически).

Какое наименьшее число ходов необходимо совершить, чтобы получившееся число делилось на \(25\) и было положительным? Гарантируется, что для всех \(n\), заданных во входных данных, ответ существует. Гарантируется, что число \(n\) задано без ведущих нулей.

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

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

Каждый набор входных данных состоит из одной строки, содержащей одно целое число \(n\) (\(25 \le n \le 10^{18}\)). Гарантируется, что для всех \(n\), заданных во входных данных, ответ существует. Гарантируется, что число \(n\) задано без ведущих нулей.

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

Для каждого набора входных данных в отдельной строке выведите целое число \(k\) (\(k \ge 0\)) — наименьшее число ходов, которые нужно сделать, чтобы число стало делиться на \(25\).

Примечание

В первом наборе входных данных уже задано число, которое делится на \(25\).

Во втором наборе входных данных можно удалить цифры \(1\), \(3\) и \(4\), тогда получится число \(75\).

В третьем наборе входных данных достаточно удалить последнюю цифру — получится число \(325\).

В четвёртом наборе входных данных необходимо удалить три последние цифры — получится число \(50\).

В пятом наборе входных данных достаточно удалить цифры \(4\) и \(7\).

E. Садовник и дерево

Деревья жадные алгоритмы Перебор поиск в глубину и подобное реализация Структуры данных *1600

Дерево — это неориентированный связный граф, в котором отсутствуют циклы. В этой задаче речь идет о некорневых деревьях.

Лист дерева — это вершина, которая соединена не более чем с одной другой вершиной.

Садовник Виталий вырастил дерево из \(n\) вершин. Он решил подстричь дерево. Для этого он совершает несколько операций. За одну операцию он удаляет все листья дерева.

Пример дерева.

Например, рассмотрим дерево, изображённое на рисунке выше. На рисунке ниже приведён результат применения к дереву ровно одной операции.

Результат применения операции «удалить все листья».

Обратите внимание на особенные случаи применения операций:

  • применение операции к пустому дереву (из \(0\) вершин) не меняет его;
  • применение операции к дереву из одной вершины приводит к удалению этой вершины (т. е. одна эта вершина считается листом);
  • применение операции к дереву из двух вершин приводит к удалению обеих вершин (обе вершины считаются листьями).

Виталий применил к дереву последовательно \(k\) операций. Сколько вершин в нём осталось?

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

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

Перед каждым набором входных данных расположена пустая строка.

Каждый набор данных состоит из нескольких строк. Первая строка набора данных содержит два целых числа \(n\) и \(k\) (\(1 \le n \le 4 \cdot 10^5\), \(1 \le k \le 2 \cdot 10^5\)) — количество вершин в дереве и количество операций. Далее идут \(n - 1\) строк, каждая содержит два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \neq v\)) — две вершины, которые соединены ребром. Гарантируется, что заданный граф является деревом, в нём отсутствуют петли и кратные рёбра. Гарантируется, что сумма \(n\) из всех наборов входных данных не превосходит \(4 \cdot 10^5\).

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

Для каждого набора входных данных выведите в отдельной строке одно целое число — количество вершин, которое осталось в дереве после применения \(k\) операций.

Примечание

Первый набор входных данных разобран в условии.

Во втором наборе задано дерево из двух вершин. К нему применяются \(200000\) операций. Первая удаляет обе вершины, остальные операции не изменяют дерево.

В третьем наборе входных данных дано дерево из трёх вершин. В результате применения первой операции в нём остаётся всего \(1\) вершина (с номером \(2\)), в результате второй операции дерево становится пустым.

F. Красно-чёрное число

meet-in-the-middle дп математика поиск в глубину и подобное реализация *2100

Дано целое неотрицательное число \(x\), десятичная запись которого содержит \(n\) цифр. Необходимо покрасить каждую его цифру в красный или чёрный цвет, так чтобы число, образуемое красными цифрами, делилось на \(A\), а число, образуемое чёрными цифрами, делилось на \(B\). Как в красный, так и в чёрный цвет должна быть покрашена хотя бы одна цифра. Из всех таких покрасок числа \(x\), которые возможны, необходимо вывести любую такую, чтобы, если в красный покрашено \(r\) цифр, а в чёрный — \(b\) цифр, величина \(|r - b|\) была минимально возможной.

Обратите внимание, что число \(x\), а также числа, образуемые цифрами одного цвета, могут содержать ведущие нули.

Пример покраски числа для \(A = 3\) и \(B = 13\)

На рисунке выше показан пример покраски числа \(x = 02165\) из \(n = 5\) цифр для \(A = 3\) и \(B = 13\). Красные цифры образуют число \(015\), которое делится на \(3\), а чёрные — \(26\), которое делится на \(13\). Заметим, что абсолютная величина разности количеств красных и чёрных цифр равна \(1\), меньшего значения добиться невозможно.

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

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

Каждый набор входных данных состоит из двух строк. Первая строка содержит три целых числа \(n\), \(A\), \(B\) (\(2 \le n \le 40\), \(1 \le A, B \le 40\)). Вторая строка содержит целое неотрицательное число \(x\), состоящее ровно из \(n\) цифр и, возможно, содержащее ведущие нули.

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

Для каждого набора входных данных выведите в отдельной строке:

  • -1, если не существует искомой покраски;
  • строку \(s\) из \(n\) символов, каждый из которых является буквой «R» или «B». Если \(i\)-я цифра числа \(x\) красится в красный цвет, то \(i\)-й символ строки \(s\) должен быть буквой «R», иначе буквой «B».

Число, которое образовано покрашенными в красный цвет цифрами, должно делится на \(A\). Число, которое образовано покрашенными в черный цвет цифрами, должно делится на \(B\). Значение \(|r-b|\) должно быть минимальным, где \(r\)  — количество красных цифр, а \(b\)  — количество чёрных. Если ответов несколько, то выведите любой из них.

Примечание

Первый набор входных данных разобран в условии.

Во втором наборе входных данных нет чётных цифр, поэтому невозможно составить число, которое делится на \(2\).

В третьем наборе входных данных любая покраска, содержащая хотя бы одну красную и одну чёрную цифру, подходит, поэтому можно покрасить \(4\) цифры в красный и \(4\) в чёрный (\(|4 - 4| = 0\), т. е. нельзя улучшить результат).

В четвёртом наборе входных данных существует единственная искомая покраска.

D. Количество предателей

графы дп Конструктив поиск в глубину и подобное снм *1700

Теофанис начал играть в новую онлайн-игру под названием «Among them». Однако, он постоянно играет с игроками из Кипра, и всех их зовут «Андреас» (самое распространенное имя на Кипре).

В каждой игре Теофанис играет с \(n\) другими игроками. Так как у них всех одинаковые имена, то они были пронумерованы от \(1\) по \(n\).

Игроки написали \(m\) комментариев в чате. Каждый комментарий имеет вид «\(i\) \(j\) \(c\)», где \(i\) и \(j\) — это два различных целых числа, а \(c\) — строка (\(1 \le i, j \le n\); \(i \neq j\); \(c\) — это либо imposter (предатель), либо crewmate (член экипажа)). Данный комментарий означает, что игрок \(i\) говорит, что роль игрока \(j\) — это \(c\).

Предатели всегда врут, а члены экипажа всегда говорят правду.

Помогите Теофанису подсчитать максимальное возможное количество предателей среди всех кипрских игроков, или определить, что комментарии противоречат друг другу (ознакомьтесь с заметками для лучшего понимания).

Заметим, что у каждого игрока ровно одна роль: либо imposter (предатель), либо crewmate (член экипажа).

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

В первой строке задано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют наборы входных данных.

В первой строке каждого набора заданы два целых числа \(n\) и \(m\) (\(1 \le n \le 2 \cdot 10^5\); \(0 \le m \le 5 \cdot 10^5\)) — количество игроков, исключая Теофаниса, и количество комментариев.

В каждой из следующих \(m\) строк задан очередной комментарий игроков в форме «\(i\) \(j\) \(c\)», где \(i\) и \(j\) — это два различных целых числа, а \(c\) — строка (\(1 \le i, j \le n\); \(i \neq j\); \(c\) — это либо imposter, либо crewmate).

Для одной пары \((i, j)\) может быть более одного комментария.

Гарантируется, что сумма \(n\) не превосходит \(2 \cdot 10^5\) и сумма \(m\) не превосходит \(5 \cdot 10^5\).

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

Для каждого набора входных данных выведите одно целое число — максимально возможное количество предателей. Если комментарии противоречат друг другу, выведите \(-1\).

Примечание

В первом наборе входных данных, предателями могут быть Андреас \(2\) и Андреас \(3\).

Во втором наборе, предателями могут быть Андреас \(1\), Андреас \(2\), Андреас \(3\) и Андреас \(5\).

В третьем наборе, комментарии противоречат друг другу. Это потому что игрок \(1\) называет игрока \(2\) предателем, в то время как игрок \(2\) называет игрока \(1\) членом экипажа. Если игрок \(1\) — член экипажа, то он должен говорить правду, а значит игрок \(2\) — предатель. Но если игрок \(2\) — предатель, то он лжет, и, следовательно, игрок \(1\) не может быть членом экипажа. Противоречие.

A. Компьютерная игра

дп Перебор поиск в глубину и подобное реализация *800

Монокарп играет в компьютерную игру. Сейчас он хочет пройти первый уровень этой игры.

Уровень — это прямоугольное клеточное поле из \(2\) строк и \(n\) столбцов. Персонаж Монокарпа изначально стоит в клетке \((1, 1)\) — на пересечении \(1\) строки и \(1\) столбца.

Персонаж Монокарпа за одно действие может переместиться из одной клетки в другую, если они — соседние по стороне и/или углу. Формально, из клетки \((x_1, y_1)\) можно за одно действие переместиться в клетку \((x_2, y_2)\), если \(|x_1 - x_2| \le 1\) и \(|y_1 - y_2| \le 1\). Очевидно, выходить за границы уровня нельзя.

На некоторых клетках находятся ловушки. Если персонаж Монокарпа оказывается в такой клетке, он умирает, и игра заканчивается.

Чтобы пройти уровень, персонаж Монокарпа должен оказаться в клетке \((2, n)\) — на пересечении строки \(2\) и столбца \(n\).

Помогите Монокарпу определить, можно ли пройти уровень.

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

В первой строке задано одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следуют сами наборы входных данных, каждый из которых состоит из трех строк.

В первой строке задано одно целое число \(n\) (\(3 \le n \le 100\)) — количество столбцов.

Далее следуют две строки, описывающие уровень. \(i\)-я из этих строк описывает \(i\)-ю строку уровня — строка состоит из символов 0 и 1. Символ 0 соответствует безопасной клетке, символ 1 — клетке с ловушкой.

Дополнительное ограничение на входные данные: клетки \((1, 1)\) и \((2, n)\) — безопасные.

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

Для каждого набора входных данных выведите YES, если уровень можно пройти, и NO, если нельзя.

Примечание

Рассмотрим пример из условия.

Возможный путь в первом наборе входных данных: \((1, 1) \rightarrow (2, 2) \rightarrow (2, 3)\).

Возможный путь во втором наборе входных данных: \((1, 1) \rightarrow (1, 2) \rightarrow (2, 3) \rightarrow (2, 4)\).

Возможный путь в четвертом наборе входных данных: \((1, 1) \rightarrow (2, 2) \rightarrow (1, 3) \rightarrow (2, 4) \rightarrow (1, 5) \rightarrow (2, 6)\).

E. Лестницы

дп Комбинаторика математика Перебор поиск в глубину и подобное реализация Структуры данных *2100

Дана матрица, состоящая из \(n\) строк и \(m\) столбцов. Строки пронумерованы сверху вниз, столбцы пронумерованы слева направо.

Ячейки данной матрицы могут быть свободными или заблокированными.

Назовем путь в матрице лестницей, если он:

  • начинается и заканчивается в свободной ячейке;
  • посещает только свободные ячейки;
  • имеет одну из двух возможных структур:
    1. вторая ячейка лежит на \(1\) справа от первой, третья — на \(1\) снизу от второй, четвертая — на \(1\) справа от третьей, и так далее;
    2. вторая ячейка лежит на \(1\) снизу от первой, третья — на \(1\) справа от второй, четвертая — на \(1\) снизу от третьей, и так далее.

В частности, путь, состоящий из одной ячейки, считается лестницей.

Некоторые примеры лестниц:

Изначально все ячейки в матрице свободные.

Требуется обработать \(q\) запросов, каждый из которых переключает состояние одной ячейки. То есть, если клетка в данный момент свободна, то делает ее заблокированной, а если заблокирована, то делает ее свободной.

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

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

В первой строке записаны три целых числа \(n\), \(m\) и \(q\) (\(1 \le n, m \le 1000\); \(1 \le q \le 10^4\)) — размерности матрицы и количество запросов.

В каждой из следующих \(q\) строк записаны два целых числа \(x\) и \(y\) (\(1 \le x \le n\); \(1 \le y \le m\)) — описание очередного запроса.

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

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

D. Ребра в MST

графы поиск в глубину и подобное снм сортировки *2300

Дан связный взвешенный неориентированный граф без петель и кратных ребер.

Напоминаем, что остовным деревом графа называется ациклический связный подграф данного графа, в который входят все его вершины. Весом дерева называется сумма весов входящих в него ребер. Минимальным остовным деревом (MST) графа называется остовное дерево этого графа, имеющее минимальный возможный вес. Очевидно, что для любого связного графа минимальное остовное дерево существует, но, в общем случае, минимальное остовное дерево графа не единственно.

Ваша задача — для каждого ребра данного графа определить: либо оно входит в любое MST, либо оно входит хотя бы в одно MST, либо оно не входит ни в одно MST.

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

В первой строке даны два целых числа n и m (2 ≤ n ≤ 105, ) — количество вершин и ребер графа, соответственно. Далее следует m строк по три целых числа в каждой — описание ребер графа в формате «ai bi wi» (1 ≤ ai, bi ≤ n, 1 ≤ wi ≤ 106, ai ≠ bi), где ai и bi — номера вершин, которые соединяет i-е ребро, wi — вес ребра. Гарантируется, что граф связный, и не содержит петель и кратных ребер.

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

Выведите m строк — ответы для всех ребер. Если i-е ребро входит в любое MST, выведите «any»; если i-е ребро входит хотя бы в одно MST, выведите «at least one»; если i-е ребро не входит ни в одно MST, выведите «none». Ответы для ребер выводите в том порядке, в котором ребра заданы во входных данных.

Примечание

Во втором примере для данного графа MST единственно: оно содержит первые два ребра.

В третьем примере для данного графа любые два ребра образуют MST. Значит, любое ребро входит хотя бы в одно MST.

J. Robot Factory

битмаски поиск в глубину и подобное *1400

You have received data from a Bubble bot. You know your task is to make factory facilities, but before you even start, you need to know how big the factory is and how many rooms it has. When you look at the data you see that you have the dimensions of the construction, which is in rectangle shape: N x M.

Then in the next N lines you have M numbers. These numbers represent factory tiles and they can go from 0 to 15. Each of these numbers should be looked in its binary form. Because from each number you know on which side the tile has walls. For example number 10 in it's binary form is 1010, which means that it has a wall from the North side, it doesn't have a wall from the East, it has a wall on the South side and it doesn't have a wall on the West side. So it goes North, East, South, West.

It is guaranteed that the construction always has walls on it's edges. The input will be correct.

Your task is to print the size of the rooms from biggest to smallest.

Input

The first line has two numbers which are N and M, the size of the construction. Both are integers:

\(n\) (\(1 \leq n \leq 10^3\))

\(m\) (\(1 \leq m \leq 10^3\))

Next N x M numbers represent each tile of construction.

Output

Once you finish processing the data your output consists of one line sorted from biggest to smallest room sizes.

B. Лягушка-путешественница

графы дп кратчайшие пути поиск в глубину и подобное Структуры данных *1900

Лягушонок Горф отправился в путешествие по Болотному королевству. К несчастью, он не рассчитал длину своего прыжка и упал в колодец глубиной \(n\) метров. Теперь Горф лежит на самом дне колодца и ему предстоит долгий путь наверх.

Стенки колодца в некоторых местах скользкие, а в некоторых, наоборот, очень удобные. А именно, если Горф сейчас находится на глубине \(x\) метров от уровня земли, то за один прыжок он может подняться на любое расстояние от \(0\) по \(a_x\) метров вверх. (Заметим, что Горф не прыгает вниз, только вверх).

К сожалению, Горф не может прыгать без перерывов. После каждого прыжка ему нужно отдохнуть (даже после прыжка на \(0\) метров). А потому, после прыжка в позицию \(x\) метров ниже уровня земли, он соскользнет ровно на \(b_x\) метров вниз (пока отдыхает).

Определите, за какое минимальное число прыжков Горф способен подняться до уровня земли.

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

В первой строке задано целое положительное число \(n\) (\(1 \le n \le 300\,000\)) — глубина колодца.

Во второй строке задано \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le i\)), где \(a_i\) — это максимальная высота, доступная для прыжка с глубины \(i\).

В третьей строке вводится \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) (\(0 \le b_i \le n - i\)), где \(b_i\) — это глубина, на которую лягушонок провалится, взяв перерыв на глубине \(i\).

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

Если лягушонок не может выбраться из колодца, выведите \(-1\). В противном случае сначала выведите целое число \(k\) — минимально возможное количество прыжков.

Далее выведите последовательность глубин \(d_1,\,d_2,\,\ldots,\,d_k\), где \(d_j\) — это глубина, которую достигнет Горф после \(j\)-го прыжка, но до того, как соскользнет вниз во время передышки. Уровень земли считается равным \(0\).

Если существует несколько решений, выведите любое из них.

Примечание

В первом примере Горф находится на дне колодца, за один прыжок вверх поднимается к отметке в \(1\) метр глубины. После этого он соскальзывает вниз на метр и оказывается на отметке в \(2\) метра. С этой отметки он уже сможет выпрыгнуть из колодца за один прыжок.

Во втором примере Горф может допрыгнуть до отметки в один метр, но сразу после этого соскользнет обратно на дно колодца, поэтому ему не выбраться.

В третьем примере выбраться из колодца можно только прыгнув с глубины \(5\). Попасть напрямую туда нельзя, но можно добраться с помощью серии прыжков \(10 \Rightarrow 9 \dashrightarrow 9 \Rightarrow 4 \dashrightarrow 5\), где \(\Rightarrow\) обозначает прыжок вверх, а \(\dashrightarrow\) обозначает спуск.

F. Две сортировки

meet-in-the-middle Бинарный поиск математика поиск в глубину и подобное *3400

Целые числа от \(1\) до \(n\) отсортировали по возрастанию в лексикографическом порядке, рассматривая их как строки, и получили массив \(a_1, a_2, \dots, a_n\).

Требуется найти сумму \((\sum_{i = 1}^n ((i - a_i) \mod 998244353)) \mod 10^9 + 7\).

\(x \mod y\) означает остаток от деления числа \(x\) на число \(y\) — этот остаток всегда неотрицателен и не превосходит \(y - 1\), например \(5 \mod 3 = 2\), \((-1) \mod 6 = 5\).

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

В первой строке содержится одно целое число \(n\) (\(1 \leq n \leq 10^{12}\)).

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

Выведите одно целое число — ответ на задачу.

Примечание

Строка \(a\) лексикографически меньше строки \(b\), если и только если выполняется один из следующих пунктов:

  • \(a\) — префикс \(b\), но \(a \ne b\);
  • в первой позиции, где \(a\) и \(b\) различны, в строке \(a\) находится буква, которая встречается в алфавите раньше, чем соответствующая буква в \(b\).

Например, \(42\) меньше \(6\) лексикографически, так как числа отличаются в первой позиции и \(4 < 6\); \(42 < 420\), так как \(42\) является префиксом \(420\).

Обозначим \(998244353\) за \(M\).

В первом примере последовательность \(a\) будет равна \([1, 2, 3]\).

  • \((1 - 1) \mod M = 0 \mod M = 0\)
  • \((2 - 2) \mod M = 0 \mod M = 0\)
  • \((3 - 3) \mod M = 0 \mod M = 0\)

В результате \((0 + 0 + 0) \mod 10^9 + 7 = 0\)

Во втором примере последовательность \(a\) будет равна \([1, 10, 11, 12, 2, 3, 4, 5, 6, 7, 8, 9]\).

  • \((1 - 1) \mod M = 0 \mod M = 0\)
  • \((2 - 10) \mod M = (-8) \mod M = 998244345\)
  • \((3 - 11) \mod M = (-8) \mod M = 998244345\)
  • \((4 - 12) \mod M = (-8) \mod M = 998244345\)
  • \((5 - 2) \mod M = 3 \mod M = 3\)
  • \((6 - 3) \mod M = 3 \mod M = 3\)
  • \((7 - 4) \mod M = 3 \mod M = 3\)
  • \((8 - 5) \mod M = 3 \mod M = 3\)
  • \((9 - 6) \mod M = 3 \mod M = 3\)
  • \((10 - 7) \mod M = 3 \mod M = 3\)
  • \((11 - 8) \mod M = 3 \mod M = 3\)
  • \((12 - 9) \mod M = 3 \mod M = 3\)

В результате \((0 + 998244345 + 998244345 + 998244345 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3) \mod 10^9 + 7\) \(=\) \(2994733059 \mod 10^9 + 7\) \(=\) \(994733045\)

D. Деревонумерация

битмаски Деревья жадные алгоритмы игры Конструктив поиск в глубину и подобное реализация *2100

Eikooc и Sushi играют в игру.

Игра проводится на дереве из \(n\) вершин, пронумерованных от \(1\) до \(n\). Напомним, что дерево с \(n\) вершинами это неориентированный связный граф с \(n-1\) ребрами.

Игроки поочередно перемещают фишку по дереву. Eikooc делает первый ход, помещая фишку на любую вершину по своему выбору. Sushi делает следующий ход, затем Eikooc, затем Sushi, и так далее. В каждый ход после первого, игрок должен переместить фишку в какую-то вершину \(u\) такую, что:

  • Между вершинами \(u\) и \(v\) (на которой фишка находится данный момент), есть ребро
  • \(u\) не была посещена ранее
  • \(u \oplus v \leq min(u, v)\)

Здесь \(x \oplus y\) обозначает операцию побитового исключающего ИЛИ чисел \(x\) и \(y\).

Оба игрока играют оптимально. Игрок, который не может сделать ход, проигрывает.

Ниже приведены примеры, демонстрирующие правила игры.

Предположим, Eikooc начинает игру, помещая фишку в вершину \(4\). Затем Sushi перемещает фишку в вершину \(6\), которая не была посещена и является соседней к \(4\). Также \(6 \oplus 4 = 2 \leq min(6, 4)\). На следующем ходу Eikooc перемещает фишку в вершину \(5\), которая не была посещена и является соседней к \(6\). Также, \(5 \oplus 6 = 3 \leq min(5, 6)\). У Sushi больше нет ходов для игры, поэтому она проигрывает.
Предположим, Eikooc начинает игру, помещая фишку в вершинул \(3\). Sushi перемещает фишку в вершину \(2\), которая не была посещена и является соседней к \(3\). Также \(3 \oplus 2 = 1 \leq min(3, 2)\). Eikooc не может переместить фишку в вершину \(6\), так как \(6 \oplus 2 = 4 \nleq min(6, 2)\). Поскольку у Eikooc нет ходов для игры, она проигрывает.

Перед началом игры Eikooc решает тайком перенумеровать вершины дерева в свою пользу. Формально, перенумерация — это перестановка \(p\) длины \(n\) (последовательность из \(n\) целых чисел, где каждое целое число от \(1\) до \(n\) встречается ровно один раз), где \(p_i\) обозначает новый номер вершины \(i\).

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

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

Первая строка содержит одно целое число \(t~(1 \le t \le 10^5)\)  — количество наборов входных данных. Описание каждого набора входных данных выглядит следующим образом.

Первая строка каждого набора входных данных содержит целое число \(n~(1 \le n \le 2 \cdot 10^5)\)  — количество вершин в дереве.

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

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

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

Для каждого набора входных данных выведите любую подходящую перестановку  — перестановку длины \(n\), которая максимизирует количество вершин, которые Eikooc может выбрать в первый ход и иметь выиграшную стратегию. Если таких перестановок несколько, вы можете вывести любую из них.

Примечание

В первом наборе входных данных у Eikooc есть только одна вершина. У Sushi не будет ходов после того, как Eikooc выберет эту вершину, и Eikooc выиграет.

Во втором наборе входных данных \(1 \oplus 2 = 3 \nleq min(1, 2)\). Следовательно, после того, как Eikooc выберет любую из вершин, у Sushi не останется ходов, и Eikooc выиграет. И \(\{1, 2\}\), и \(\{2, 1\}\) являются допустимыми перенумерациями.

F. Робот на доске 2

графы Перебор поиск в глубину и подобное реализация *2300

Робот находится на клетчатой прямоугольной доске размера \(n \times m\) (\(n\) строк, \(m\) столбцов). Строки пронумерованы от \(1\) до \(n\) сверху вниз, столбцы — от \(1\) до \(m\) слева направо.

Робот умеет передвигаться из текущей клетки в одну из четырех соседних с ней по стороне.

На каждой клетке доски написан один из символов 'L', 'R', 'D' или 'U', обозначающий направление движения робота, находящегося в этой клетке — влево, вправо, вниз или вверх, соответственно.

Начать свое движение робот может в любой клетке. После этого он за один ход перемещается в соседнюю по стороне клетку в направлении, указанном на текущей клетке.

  • Если робот перемещается за границу доски, он падает и ломается.
  • Если робот оказывается в клетке, в которой он был ранее, то он ломается (он останавливается и больше не двигается).

Робот может выбрать любую клетку в качестве стартовой. Его цель — совершить максимальное количество команд до поломки или остановки.

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

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

В первой строке записано целое число \(t\) (\(1 \le t \le 10000\)) — количество наборов входных данных в тесте.

Перед каждым набором в тесте записана пустая строка. Далее идёт строка, которая содержит целые числа \(n\) и \(m\) (\(1 \le n \le 2000\); \(1 \le m \le 2000\)) — размеры доски. Затем следуют \(n\) строк, \(i\)-я из которых описывает \(i\)-ю строку доски. Каждая из них имеет длину ровно \(m\) и состоит из символов 'L', 'R', 'D' и 'U'.

Гарантируется, что сумма размеров всех досок во входных данных не превосходит \(4\cdot10^6\).

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

Для каждого набора входных данных выведите три целых числа \(r\), \(c\) и \(d\) (\(1 \le r \le n\); \(1 \le c \le m\); \(d \ge 0\)), которые обозначают, что роботу следует начать движение из клетки \((r, c)\), чтобы сделать максимальное количество ходов \(d\). Если ответов несколько, то выведите любой из них.

C. Мастер игры

графы дп жадные алгоритмы поиск в глубину и подобное Структуры данных *1700

\(n\) игроков играют в игру.

В игре есть две различные игровые карты. Для каждого игрока мы знаем его силу на каждой карте. Когда два игрока сражаются на определенной карте, всегда побеждает игрок с большей силой на этой карте. Нет двух игроков с одинаковой силой на одной и той же карте.

Вы — мастер этой игры, и хотите организовать турнир. Всего будет проведено \(n-1\) боев. Пока в турнире участвует более одного игрока, выберите любую карту и любых двух из оставшихся игроков, которые будут сражаться на ней. Игрок, который проиграет, выбывает из турнира.

В итоге останется ровно один игрок, и он объявляется победителем турнира. Для каждого игрока определите, может ли он выиграть турнир.

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

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq 10^5\)) — количество игроков.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \leq a_i \leq 10^9\), \(a_i \neq a_j\) для \(i \neq j\)), где \(a_i\) — сила \(i\)-го игрока на первой карте.

Третья строка каждого набора входных данных содержит \(n\) целых чисел \(b_1, b_2, \dots, b_n\) (\(1 \leq b_i \leq 10^9\), \(b_i \neq b_j\) для \(i \neq j\)), где \(b_i\) — сила \(i\)-го игрока на второй карте.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(10^5\).

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

Для каждого набора входных данных выведите строку длины \(n\). \(i\)-й символ должен быть «1», если \(i\)-й игрок может выиграть турнир, или «0» в противном случае.

Примечание

В первом наборе входных данных \(4\)-й игрок обыграет любого другого игрока в любой игре, поэтому он обязательно выиграет турнир.

Во втором наборе входных данных каждый может стать победителем.

В третьем наборе входных данных есть только один игрок. Очевидно, что он выиграет турнир.

G. Алфавитное дерево

Бинарный поиск Деревья поиск в глубину и подобное Строки строковые суфф. структуры Структуры данных хэши *3500

Вам даны \(m\) строк и дерево на \(n\) вершинах. На каждом ребре написана какая-то буква.

Вы должны ответить на \(q\) запросов. Каждый запрос описывается \(4\) целыми числами \(u\), \(v\), \(l\) и \(r\). Ответом на запрос является общее количество вхождений \(str(u,v)\) в строки с индексами от \(l\) до \(r\). \(str(u,v)\) определяется как строка, составленная путем конкатенации букв, записанных на ребрах кратчайшего пути от \(u\) до \(v\) (в порядке их прохождения).

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

Первая строка содержит три целых числа \(n\), \(m\) и \(q\) (\(2 \le n \le 10^5\), \(1 \le m,q \le 10^5\)).

В \(i\)-й из следующих \(n-1\) строк содержатся два целых числа \(u_i, v_i\) и строчная латинская буква \(c_i\) (\(1 \le u_i, v_i \le n\), \(u_i \neq v_i\)), обозначающие ребро между вершинами \(u_i, v_i\) с символом \(c_i\) на нем.

Гарантируется, что эти ребра образуют дерево.

Следующие \(m\) строк содержат строки, состоящие из строчных латинских букв. Общая длина этих строк не превышает \(10^5\).

Затем следуют \(q\) строк, каждая из которых содержит четыре целых числа \(u\), \(v\), \(l\) и \(r\) (\(1 \le u,v \le n\), \(u \neq v\), \(1 \le l \le r \le m\)), обозначающие запросы.

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

Для каждого запроса выведите одно целое число — ответ на запрос.

D. Расстояние в дереве

Деревья дп поиск в глубину и подобное *1800

Деревом называется связный граф, не содержащий циклов.

Расстоянием между двумя вершинами дерева называется длина (в ребрах) кратчайшего пути между этими вершинами.

Дано дерево из n вершин и положительное число k. Посчитайте количество различных пар вершин дерева, расстояние между которыми равно k. Обратите внимание, что пары (v, u) и (u, v) считаются одной и той же парой.

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

В первой строке записаны два целых числа n и k (1 ≤ n ≤ 50000, 1 ≤ k ≤ 500) — количество вершин дерева и требуемое расстояние между вершинами.

В следующих n - 1 строках записаны ребра дерева в формате «ai bi» (без кавычек) (1 ≤ ai, bi ≤ n, ai ≠ bi), где ai и bi — вершины дерева, соединенные i-м ребром. Все заданные ребра различны.

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

Выведите единственное целое число — количество различных пар вершин дерева, расстояние между которыми равно k.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Примечание

В первом примере парами вершин, расстояние между которыми равно 2, будут пары (1, 3), (1, 5), (3, 5) и (2, 4).

F. Маштали: космическая одиссея

графы Конструктив поиск в глубину и подобное *3000

Ли планировал приблизиться к сердцу Маштали, чтобы осуществить свой коварный план (о котором мы пока не знаем), поэтому он решил украсить граф Маштали. Но он установил для себя несколько правил. А еще он был слишком занят своими планами, что у него не было времени на такие мелкие дела, поэтому он обратился за помощью к вам.

Граф Маштали — это неориентированный взвешенный граф с \(n\) вершинами и \(m\) ребрами с весами, равными либо \(1\), либо \(2\). Ли хочет направить ребра графа Маштали так, чтобы он был как можно красивее.

Ли считает, что красота направленного взвешенного графа равна количеству его вершин Одиссея. Вершина \(v\) является вершиной Оддисея, если \(|d^+(v) - d^-(v)| = 1\), где \(d^+(v)\) — сумма весов исходящих из \(v\) ребер, а \(d^-(v)\) — сумма весов входящих в \(v\) ребер.

Найдите наибольшую возможную красоту графа, которую Ли может получить, направляя ребра графа Маштали. Кроме того, найдите любой способ ее достижения.

Обратите внимание, что вы должны ориентировать каждое из ребер.

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

Первая строка содержит два целых числа \(n\) и \(m\) \((1 \le n \le 10^5;\; 1 \le m \le 10^5)\) — количество вершин и ребер в графе.

В \(i\)-й строке следующих \(m\) строк содержится три целых числа \(u_i\), \(v_i\) и \(w_i\) \(( 1 \le u_i , v_i \le n;\; u_i \neq v_i;\; \bf{w_i \in \{1, 2\}} )\) — концы \(i\)-го ребра и его вес.

Обратите внимание, что граф не обязательно должен быть связным, и он может содержать мультиребра.

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

В первой строке выведите одно целое число — максимальную красоту графа, которую может достичь Ли.

Во второй строке выведите строку длины \(m\), состоящую из \(1\) и \(2\) — направления ребер.

Если вы решили направить \(i\)-е ребро из вершины \(u_i\) в вершину \(v_i\), то \(i\)-й символ строки должен быть \(1\). В противном случае он должен быть равен \(2\).

Примечание

Объяснение к первому примеру:

вершины \(2\) и \(5\) — вершины Одиссея.

Объяснение для третьего примера:

вершины \(1\) и \(6\) — вершины Одиссея.

H. Игра в кальмара

Деревья жадные алгоритмы поиск в глубину и подобное Структуры данных *3100

После просмотра нового сериала «Игра в кальмара» Маштали и Соруш решили провести свою собственную «Игру в кальмара»! Соруш согласился быть ведущим и предоставить деньги для приза победителю, а Маштали стал фронтменом!

\(m\) игроков зарегистрировались для участия в играх, чтобы выиграть большой приз, но когда Маштали узнал, каким огромным будет приз победителя, он решил убить устранить всех игроков, чтобы забрать деньги себе!

Вот как злой Маштали собирается уничтожить игроков:

Дано некорневое дерево с \(n\) вершинами. У каждого игрока есть \(2\) специальные вершины \(x_i\) и \(y_i\).

За одну операцию Маштали может выбрать любую вершину \(v\) дерева. Затем для каждого оставшегося игрока \(i\) он находит вершину \(w\) на простом пути из \(x_i\) в \(y_i\), которая ближе всего к \(v\). Если \(w\ne x_i\) и \(w\ne y_i\), игрок \(i\) будет устранен.

Теперь Маштали задался вопросом: «Какое минимальное количество операций я должен выполнить, чтобы устранить всех игроков и забрать деньги себе?».

Поскольку он думал только о деньгах, он не смог решить задачу самостоятельно и обратился к вам за помощью!

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

Первая строка содержит \(2\) целое число \(n\) и \(m\) \((1 \le n, m \le 3 \cdot 10^5)\) — количество вершин дерева и количество игроков.

Вторая строка содержит \(n-1\) целых чисел \(par_2, par_3, \ldots, par_n\) \((1 \le par_i < i)\) — обозначающих ребро между вершиной \(i\) и \(par_i\).

В \(i\)-й из следующих \(m\) строк содержится два целых числа \(x_i\) и \(y_i\) \((1 \le x_i, y_i \le n, x_i \ne y_i)\) — специальные вершины \(i\)-го игрока.

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

Выведите минимальное количество операций, которые Маштали должен выполнить.

Если Маштали никак не может устранить всех игроков, выведите \(-1\).

Примечание

Пояснение к первому примеру:

В первую операцию, Маштали может выбрать вершину \(1\) и устранить игроков с красным и синим цветами. Во второй операции он может выбрать вершину \(6\) и устранить игрока с оранжевым цветом.

Во втором примере Маштали не сможет устранить первого игрока.

E1. Побег из лабиринта (простая версия)

Деревья жадные алгоритмы кратчайшие пути поиск в глубину и подобное *1700

Эта задача отличается от E2 только поставленным вопросом.

Влад построил лабиринт из \(n\) комнат и \(n-1\) двунаправленного коридора. Из любой комнаты \(u\) по коридорам достижима любая другая комната \(v\). Таким образом, система комнат образует неориентированное дерево.

Влад собрал \(k\) друзей, чтобы сыграть с ними в игру.

Влад начинает игру в комнате с номером \(1\) и выигрывает, если доходит до комнаты, отличной от \(1\), в которую ведёт ровно один коридор. Друзья же расставлены по лабиринту — друг с номером \(i\) стоит в комнате \(x_i\), и никакие два друга не стоят в одной комнате (то есть \(x_i \neq x_j\) для всех \(i \neq j\)). Друзья выигрывают, если одному удаётся встретиться с Владом в какой-либо комнате или коридоре, до того как он выиграет.

За одну единицу времени каждый участник игры может пройти по одному коридору. Все участники ходят одновременно. Участники также могут не двигаться. Каждая комната может вместить всех участников одновременно.

Друзья досконально изучили план и намерены выиграть. Влад в некотором замешательстве от их азарта. Определите, может ли он обеспечить себе победу (то есть победить при любом способе игры друзей)?

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

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

В первой строке входных данных записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте. Перед каждым набором входных данных в тесте содержится пустая строка.

Первая строка набора входных данных содержит два числа \(n\) и \(k\) (\(1 \le k < n \le 2\cdot 10^5\)) — количество комнат и друзей соответственно.

Следующая строка набора входных данных содержит \(k\) целых чисел \(x_1, x_2, \dots, x_k\) (\(2 \le x_i \le n\)) — номера комнат с друзьями. Все \(x_i\) — различны.

Следующие \(n-1\) строк содержат описания коридоров, по два числа на строку \(v_j\) и \(u_j\) (\(1 \le u_j, v_j \le n\)) — номера комнат, которые соединяет коридор \(j\). Все коридоры двунаправленны. Из любой комнаты можно пройти в любую другую, перемещаясь по коридорам.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных в тесте не превосходит \(2\cdot10^5\).

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

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

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

Примечание

В первом наборе входных данных независимо от стратегии друзей Влад может выиграть, пройдя до комнаты \(4\). Игра при этом может выглядеть следующим образом:

Изначальное расположение Влада и друзей. Влад помечен зелёным цветом, друзья — красным.
Расположение по прошествии одной единицы времени.
Конец игры.

Заметим, что если Влад попробует дойти до выхода в вершине \(8\), то друг из комнаты \(3\) сможет его поймать.

E2. Побег из лабиринта (сложная версия)

Деревья дп жадные алгоритмы кратчайшие пути поиск в глубину и подобное *1900

Эта задача отличается от E1 только поставленным вопросом.

Влад построил лабиринт из \(n\) комнат и \(n-1\) двунаправленного коридора. Из любой комнаты \(u\) по коридорам достижима любая другая комната \(v\). Таким образом, система комнат образует неориентированное дерево.

Влад собрал \(k\) друзей, чтобы сыграть с ними в игру.

Влад начинает игру в комнате с номером \(1\) и выигрывает, если доходит до комнаты, отличной от \(1\), в которую ведёт ровно один коридор. Друзья же расставлены по лабиринту — друг с номером \(i\) стоит в комнате \(x_i\), и никакие два друга не стоят в одной комнате (то есть \(x_i \neq x_j\) для всех \(i \neq j\)). Друзья выигрывают, если одному удаётся встретиться с Владом в какой-либо комнате или коридоре, до того как он выиграет.

За одну единицу времени каждый участник игры может пройти по одному коридору. Все участники ходят одновременно. Участники также могут не двигаться. Каждая комната может вместить всех участников одновременно.

Друзья досконально изучили план и намерены выиграть. Также они не хотят зря тратить силы и просят вас определить, могут ли они выиграть и, если могут, какое минимальное количество друзей должно остаться в лабиринте, чтобы они всегда могли поймать Влада.

Иными словами вам нужно определить размер минимального подмножества друзей, который сможет переиграть Влада или сказать что такого подмножества не существует.

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

В первой строке входных данных записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте. Перед каждым набором входных данных в тесте содержится пустая строка.

Первая строка набора входных данных содержит два числа \(n\) и \(k\) (\(1 \le k < n \le 2\cdot 10^5\)) — количество комнат и друзей соответственно.

Следующая строка набора входных данных содержит \(k\) целых чисел \(x_1, x_2, \dots, x_k\) (\(2 \le x_i \le n\)) — номера комнат с друзьями. Все \(x_i\) — различны.

Следующие \(n-1\) строк содержат описания коридоров, по два числа на строку \(v_j\) и \(u_j\) (\(1 \le u_j, v_j \le n\)) — номера комнат, которые соединяет коридор \(j\). Все коридоры двунаправленны. Из любой комнаты можно пройти в любую другую, перемещаясь по коридорам.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных в тесте не превосходит \(2\cdot10^5\).

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

Выведите \(t\) строк, каждая из которых содержит ответ на соответствующий набор входных данных. В качестве ответа выведите \(-1\), если Влад в любом случае победит, и минимальное необходимое число друзей иначе.

Примечание

В первом наборе входных данных даже если все друзья останутся в лабиринте, Влад всё равно сможет выиграть. Поэтому ответ «-1».

Во втором наборе входных данных достаточно оставить друзей из комнат \(6\) и \(7\). Тогда Влад не сможет выиграть. Ответ «2».

Во третьем и четвертом наборах входных данных Влад не сможет выиграть только если все его друзья останутся в лабиринте. Поэтому ответы соответственно «1» и «2».

E. Сумасшедший робот

графы поиск в глубину и подобное *2000

Дана поле, состоящая из \(n\) строк и \(m\) столбцов. Каждая ячейка матрица либо свободна, либо занята. В одной из свободных клеток находится лаборатория. Все ячейки за границами поля заблокированы.

Сумасшедший робот сбежал из лаборатории. В данный момент он находится в некоторой свободной клетке. Вы можете послать ему одну из следующих команд: «идти вправо», «идти вниз», «идти влево» или «идти вверх». Каждая команда означает переход в соседнюю клетку в соответствующем направлении.

Однако, так как робот сумасшедший, он сделает что угодно, кроме выполнения команды. При получении команды, он выберет такое направление, что оно отличается от данного в команде, и ячейка в выбранном направлении не занята. Если есть такое направление, то он переместится в этом направлении. Иначе, он не сделает ничего.

Мы хотим привести робота обратно в лаборатории, чтобы его починить. Для каждой свободной клетке определите, можно ли заставить робота достичь лаборатории, если он начнет в этой клетке. То есть, после каждого шага работа можно будет послать такую команду, что какие бы направления робот ни выбирал, он окажется в лаборатории.

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

В первой строке записано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записаны два целых числа \(n\) и \(m\) (\(1 \le n, m \le 10^6\); \(n \cdot m \le 10^6\)) — количество строк и столбцов поля.

В \(i\)-й из следующих \(n\) строк задается описание \(i\)-й строки поля. Она состоит из \(m\) элементов одного из трех типов:

  • '.' — ячейка свободна;
  • '#' — ячейка занята;
  • 'L' — ячейка содержит лабораторию.

Поле содержит ровно одну лабораторию. Сумма \(n \cdot m\) по всем наборам входных данных не превосходит \(10^6\).

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

На каждый набор входных данных найдите все свободные клетки, из которых можно заставить робота дойти до лаборатории. В заданном поле замените свободные клетки (обозначенные точкой) знаком плюса ('+') в тех клетках, из которых можно заставить робота дойти до лаборатории. Выведите получившееся поле.

Примечание

В первом наборе входных данных нет такой свободной клетки, из которой можно заставить робота дойти до лаборатории. Рассмотрим угловую клетку. Если послать любое направление, то робот перейдет в граничную клетку, которая не является углом. Теперь рассмотрим не угловую граничную клетку. Какое бы направление вы ни послали, робот всегда может выбрать такое другое направление, что он окажется в углу.

В последнем наборе входных данных можно посылать команду, которая противоположна направлению к лаборатории, чтобы у робота не было выбора кроме как двигаться к ней.

D. (XO)R-ождественское дерево

битмаски графы Деревья поиск в глубину и подобное снм *2200

Это была ночь перед рождеством, и пришло время Санте украсить свое Рождественское дерево. Это дерево состоит из \(n\) вершин, соединенных \(n-1\) ребром. На каждом ребре дерева расположена гирлянда, которую можно описать некоторым числом в двоичном представлении.

Посмотреть на это дерево собралось \(m\) эльфов. Каждый эльф выбрал две вершины \(a\) и \(b\), и он смотрит только на гирлянды на простом пути между этими вершинами. В результате созерцания у эльфа появляется любимое число, равное побитовому исключающему ИЛИ значений на ребрах этого пути.

Однако, Северный Полюс только начал восстанавливаться после недавней эпидемии ОРВИ. Из-за этого Санта успел забыть, как выглядели некоторые гирлянды, и проверить их он не может, потому что уже покинул Северный Полюс! К счастью, на помощь пришли эльфы: каждый из них сообщил Санте свою пару вершин \((a_i, b_i)\), и четность количества единичных битов в своем любимом числе. Другими словами, каждый эльф помнит, было ли количество \(1\)-ц в его любимом числе, записанном в двоичном виде, четным или нечетным.

Помогите Санте проверить, могло ли существовать такое дерево, и если да, как оно могло выглядеть, и возможно вы войдете в историю!

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

В первой строке задано одно целое число \(t\) (\(1 \leq t \leq 2 \cdot 10^4\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

В первой строке каждого набора заданы два целых числа \(n\) и \(m\) (\(2 \leq n \leq 2 \cdot 10^5\); \(1 \leq m \leq 2 \cdot 10^5\)) — размер дерева и количество эльфов, соответственно.

В следующих \(n-1\) строках каждого набора заданы по три целых числа \(x\), \(y\) и \(v\) (\(1 \leq x, y \leq n\); \(-1 \leq v < 2^{30}\)), описывающих ребро между вершинами \(x\) и \(y\). Если

  • \(v = -1\), то Санта не помнит как выглядит гирлянда на этом ребре.
  • \(v \geq 0\), то состояние гирлянды равно \(v\).

В следующих \(m\) строках каждого набора заданы по три целых числа \(a\), \(b\) и \(p\) (\(1 \leq a, b \leq n\); \(a \neq b\); \(0 \leq p \leq 1\)) — пара вершин выбранная эльфом и четность количества единичных битов в любимом числе эльфа.

Гарантируется, что сумма \(n\) и сумма \(m\) по всем наборам не превосходят \(2 \cdot 10^5\) (каждая).

Гарантируется, что заданные ребра образуют дерево.

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

Для каждого набора входных данных, сначала выведите YES или NO (в любом регистре), в зависимости от того, существует ли дерево, соответствующее памяти Санты, или нет.

Если ответ YES, выведите \(n-1\) строк по три целых числа в каждом: \(x\), \(y\) и \(v\) (\(1 \le x, y \le n\); \(0 \le v < 2^{30}\)) — ребро дерева и число, описывающее состояние гирлянды на нем. Множество ребер должно совпадать с множеством из входных данных, и если состояние гирлянды на ребре известно, то оно не должно измениться. Вы можете выводить ребра в любом порядке.

Если существует несколько решений, выведите любое.

Примечание

Первый набор входных данных соответствует изображению из условия.

Один из возможных ответов — это присвоить ребру \((1, 2)\) значение \(5\), а ребру \((2, 5)\) — значение \(3\). Этот способ подходит потому что:

  • Первый эльф рассматривает путь между вершинами \(2\) и \(3\). Его любимое число будет равно \(4\), а потому он помнит значение \(1\) (так как в двоичном представлении \(4\) нечетное количество битов \(1\)).
  • Второй эльф рассматривает путь между вершинами \(2\) и \(5\). Его любимое число будет равно \(3\), а потому он помнит значение \(0\) (так как в двоичном представлении \(3\) четное количество битов \(1\)).
  • Третий эльф рассматривает путь между вершинами \(5\) и \(6\). Его любимое число будет равно \(7\), а потому он помнит значение \(1\) (так как в двоичном представлении \(7\) нечетное количество битов \(1\)).
  • Четвертый эльф рассматривает путь между вершинами \(6\) и \(1\). Его любимое число будет равно \(1\), а потому он помнит значение \(1\) (так как в двоичном представлении \(1\) нечетное количество битов \(1\)).
  • Пятый эльф рассматривает путь между вершинами \(4\) и \(5\). Его любимое число будет равно \(4\), а потому он помнит значение \(1\) (так как в двоичном представлении \(4\) нечетное количество битов \(1\)).

Заметим, что существуют и другие возможные ответы.

E. Фиолетовый мелок

графы Деревья жадные алгоритмы игры математика поиск в глубину и подобное сортировки Структуры данных *2400

Два игрока, Красный и Синий, снова в деле, и этот раз они играют с цветными мелками! Сегодня озорной паре под руку попалось корневое дерево, с которым они играют в свою любимую игру, раскрашивая вершины этого дерева.

Игра выглядит следующим образом: есть дерево из \(n\) вершин с корнем в вершине \(1\), и каждая вершина первоначально белого цвета. У Красного и Синего есть ровно по одному ходу. Первым ходит Красный.

В свой ход, Красный может выполнить следующее действие произвольное количество раз:

  • Он выбирает любое поддерево корневого дерева и красит каждую из вершин поддерева в красный.
Однако, для большей честности, Красный может покрасить только \(k\) вершин дерева. Другими словами, после окончания хода Красного, не более \(k\) вершин может быть покрашено в красный.

Далее подходит очередь Синего. Он может выполнять следующее действие произвольное количество раз:

  • Он выбирает любое поддерево корневого дерева и красит каждую вершину поддерева в синий. Однако, ему нельзя выбирать поддеревья, в которых содержатся вершины, уже покрашенные в красный. Ведь в таком случае вершина получится фиолетового цвета, а никто не любит фиолетовый мелок* (англ. purple crayon).
Заметим, что нет ограничения на то, сколько вершин покрасит Синий, главное, что он не красит уже покрашенные Красным вершины.

После того как каждый сделает свой ход, счет игры определяется следующим образом: пусть \(w\) — количество оставшихся белых вершин, \(r\) — количество красных вершин, а \(b\) — количество синих вершин. Счет игры будет равен \(w \cdot (r - b)\).

Красный хочет максимизировать счет, а Синий — минимизировать. Чему будет равен счет игры, если оба игрока действуют оптимально?

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

В первой строке заданы два целых числа \(n\) и \(k\) (\(2 \le n \le 2 \cdot 10^5\); \(1 \le k \le n\)) — количество вершин в дереве и максимальное количество красных вершин.

В следующих \(n - 1\) строках заданы описания ребер дерева. В \(i\)-й строке заданы два целых числа \(u_i\) и \(v_i\) через пробел (\(1 \le u_i, v_i \le n\); \(u_i \neq v_i\)) — \(i\)-е ребро дерева.

Гарантируется, что заданные ребра образуют дерево.

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

Выведите одно число — итоговый счет игры, если и Красный и Синий действуют оптимально.

Примечание

В первом наборе входных данных, одна из оптимальных стратегий следующая:

  • Красный выбирает для покраски поддеревья вершин \(2\) и \(3\).
  • Синий выбирает для покраски поддерево вершины \(4\).
В результате вершины \(2\) и \(3\) покрашены в красный, \(4\) — в синий, а вершина \(1\) — в белый. Счет игры равен \(1 \cdot (2 - 1) = 1\).

Во втором наборе, оптимальная стратегия следующая:

  • Красный выбирает для покраски поддерево вершины \(4\). Тем самым красит вершины \(4\) и \(5\).
  • Синий не может ничего выбрать, а потому ничего не красит.
В результате вершины \(4\) и \(5\) покрашены в красный, а вершины \(1\), \(2\) и \(3\) — белые. Счет игры равен \(3 \cdot (2 - 0) = 6\).

В третьем наборе:

Счет игры равен \(4 \cdot (2 - 1) = 4\).

G. Просто добавь ребро

графы дп поиск в глубину и подобное *3500

Вам дан ориентированный ациклический граф из \(n\) вершин и \(m\) ребер. Для всех ребер графа \(a \to b\) выполняется \(a < b\).

Вам нужно найти количество пар вершин \(x\), \(y\) таких, что \(x > y\), и после добавления в граф ребра \(x \to y\) в нем будет существовать гамильтонов путь.

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

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 5\)): количество наборов входных данных.

Следующие строки содержат описания наборов входных данных.

В первой строке находятся два целых числа \(n\) и \(m\) (\(1 \leq n \leq 150\,000\), \(0 \leq m \leq \min(150\,000, \frac{n(n-1)}{2})\)): количество вершин и ребер в графе.

Каждая из следующих \(m\) строк содержит два целых числа \(a\) и \(b\) (\(1 \leq a < b \leq n\)), описывающих ребро графа \(a \to b\). Никакое ребро \(a \to b\) не встречается более одного раза.

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

Для каждого набора входных данных выведите одно целое число: количество пар вершин \(x\), \(y\), \(x > y\), таких, что после добавления в граф ребра \(x \to y\) в графе найдется гамильтонов путь.

Примечание

В первом примере любое ребро \(x \to y\) такое, что \(x > y\), подойдет, т. к. уже существует путь \(1 \to 2 \to 3\).

Во втором примере подходит только ребро \(4 \to 1\). Если его добавить, появится путь \(3 \to 4 \to 1 \to 2\).

В третьем примере можно добавить ребра \(2 \to 1\), \(3 \to 1\), \(4 \to 1\), \(4 \to 2\).

E. Новогодние конфеты

графы Деревья дп игры кратчайшие пути математика поиск в глубину и подобное реализация теория чисел *2700

Лунный Новый год приближается, и Льдинка только что получила коробку конфет от бабушки с дедушкой! Коробка содержит \(n\) конфет. \(i\)-я конфета имеет вкус \(a_i\).

Льдинка верит, что хорошие вещи случаются парами. К сожалению, вкусы всех конфет попарно различны (все \(a_i\) различны). Льдинка хочет сделать равные вкусы хотя бы у одной пары конфет.

Поэтому она попросила бабушку с дедушкой выполнить несколько замен. Перед выполнением замен Льдинка выбирает две конфеты с номерами \(x\) и \(y\) (\(1 \le x, y \le n\), \(x \ne y\)).

За одну замену дедушка и бабушка Льдинки выбирают неотрицательное целое число \(k\) такое, что \(2^k \ge a_x\), и заменяют вкус \(x\)-й конфеты с \(a_x\) на \(2^k - a_x\) (то есть, присваивают \(a_x := 2^k - a_x\)).

Замены прекратятся только при условии, что \(a_x = a_y\). Заметьте, что другие пары равных по вкусу конфет не остановят процесс.

У Льдинки умные бабушка и дедушка, поэтому они выберут такую последовательность замен, которая минимизирует количество требуемых замен. Поскольку Льдинка любит доставлять неприятности, она хочет максимизировать минимальное требуемое количество замен, выбрав соответствующие \(x\) и \(y\). Она задаётся вопросом, как выбрать такую пару \((x, y)\), что минимальное требуемое количество замен максимально среди всех возможных пар \((x, y)\).

Так как у Льдинки не очень хорошо с математикой, она надеется, что вы поможете ей решить эту задачу.

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

Первая строка ввода содержит единственное целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество конфет.

Вторая строка ввода содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 10^9\)).

Гарантируется, что все \(a_i\) различны.

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

Выведите три целых числа \(x\), \(y\) и \(m\).

\(x\) и \(y\) являются номерами оптимальных конфет для применения замен. Ваш ответ должен удовлетворять \(1 \le x, y \le n\), \(x \ne y\).

\(m\) является минимальным количеством замен, чтобы сделать \(a_x = a_y\). Можно показать, что \(m \le 10^9\) для любой пары конфет.

Примечание

В первом тесте минимальное количество замен, требуемое, чтобы заменить конфету со вкусом \(6\) на конфету со вкусом \(9\), является \(5\). Последовательность замен следующая: \(6 \rightarrow 2 \rightarrow 0 \rightarrow 1 \rightarrow 7 \rightarrow 9\).

Во втором тесте минимальное количество замен, требуемое, чтобы заменить конфету со вкусом \(4\) на конфету со вкусом \(8\), является \(2\). Последовательность замен следующая: \(4 \rightarrow 0 \rightarrow 8\).

F. Развороты

битмаски Конструктив математика поиск в глубину и подобное реализация Строки *2000

Вам даны два целых положительных числа \(x\) и \(y\). Вы можете совершать с числом \(x\) следующую операцию: записать его в двоичном виде без ведущих нулей, приписать справа \(0\) или \(1\), затем развернуть двоичную запись и превратить ее в десятичное число, которое окажется новым значением \(x\).

Например:

  • \(34\) можно одной операцией превратить в \(81\): двоичная запись \(34\) — это \(100010\), если приписать справа \(1\), развернуть и убрать ведущие нули, можно получить \(1010001\), что является двоичной записью числа \(81\);
  • \(34\) можно одной операцией превратить в \(17\): двоичная запись \(34\) — это \(100010\), если приписать справа \(0\), развернуть и убрать ведущие нули, можно получить \(10001\), что является двоичной записью числа \(17\);
  • \(81\) можно одной операцией превратить в \(69\): двоичная запись \(81\) — это \(1010001\), если приписать справа \(0\), развернуть и убрать ведущие нули, можно получить \(1000101\), что является двоичной записью числа \(69\);
  • \(34\) можно превратить в \(69\) за две операции: сначала превратить \(34\) в \(81\), а потом превратить \(81\) в \(69\).

Ваша задача — выяснить, можно ли превратить \(x\) в \(y\) за какое-то (возможно, нулевое) число операций.

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

Единственная строка входных данных содержит два целых числа \(x\) и \(y\) (\(1 \le x, y \le 10^{18}\)).

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

Выведите YES, если вы можете сделать \(x\) равным \(y\), или NO, если это невозможно.

Примечание

В первом примере не надо совершать никаких действий.

Четвертый пример разобран в условии задачи.

G. Необычный сапёр

Бинарный поиск жадные алгоритмы поиск в глубину и подобное снм сортировки *2000

Поликарп очень любит играть в игру сапёр. Недавно он нашёл похожую игру и там такие правила.

На поле находятся мины, для каждой известны координаты её местоположения (\(x_i, y_i\)). Каждая мина имеет время жизни в секундах, после которого она взорвётся. После взрыва мина также детонирует все мины по вертикали и горизонтали на расстоянии \(k\) (две перпендикулярные линии). В итоге получаем взрыв на поле в виде символа «плюс» ('+'). Таким образом, один взрыв может вызвать новые взрывы, а новые взрывы — следующие и так далее.

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

Поликарп хочет установить новый рекорд и просит вас помочь ему рассчитать, за какое минимальное количество секунд можно взорвать все мины.

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

В первой строке входных данных записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Перед каждым набором в тесте записана пустая строка.

Далее идёт строка, которая содержит целые числа \(n\) и \(k\) (\(1 \le n \le 2 \cdot 10^5\), \(0 \le k \le 10^9\)) — количество мин и расстояние, которое задевают мины при взрыве, соответственно.

Затем следуют \(n\) строк, \(i\)-я из которых описывает \(x\) и \(y\) координаты \(i\)-й мины и время до её взрыва (\(-10^9 \le x, y \le 10^9\), \(0 \le timer \le 10^9\)). Гарантируется, что все мины имеют различные координаты.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных в тесте не превосходит \(2 \cdot 10^5\).

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

Выведите \(t\) строк, каждая из строк должна содержать ответ на соответствующий набор входных данных — минимальное количество секунд, за которое можно взорвать все мины.

Примечание
Первый набор входных данных примера.

Первый пример:

  • Секунда \(0\): взрываем мину в клетке \((2, 2)\) она никого не задевает так как \(k=0\).
  • Секунда \(1\): взрываем мину в клетке \((0, 1)\), а мина в клетке \((0, 0)\) взрывается сама.
  • Секунда \(2\): взрываем мину в клетке \((1, 1)\), а мина в клетке \((1, 0)\) взрывается сама.

Второй пример:

  • Секунда \(0\): взрываем мину в клетке \((2, 2)\) получаем:
  • Секунда \(1\): взрывается мина в клетке \((0, 0)\) и так как \(k=2\) взрыв задевает мины в клетках \((0, 1)\) и \((1, 0)\), а их взрывы задевают мину в клетке \((1, 1)\) и на поле не остаётся мин.

C. Скрытые перестановки

интерактив математика поиск в глубину и подобное *1700

Это интерактивная задача.

Жюри загадало перестановку \(p\) длины \(n\) и предлагает Вам её угадать. Для этого жюри создало перестановку \(q\) длины \(n\). Изначально \(q\) является тождественной (\(q_i = i\) для всех \(i\)).

За один запрос Вы можете узнать \(q_i\) для любого \(i\). После каждого Вашего запроса жюри будет изменять \(q\) следующим образом:

  • Сначала жюри создаст перестановку \(q'\) длины \(n\) такую что \(q'_i = q_{p_i}\) для всех \(i\).
  • После этого жюри заменит \(q\) на \(q'\).

Вы можете сделать не более \(2n\) запросов, чтобы угадать перестановку \(p\).

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

В первой строке задано одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество тестовых случаев.

Протокол взаимодействия

Взаимодействие Вашей программы с программой жюри в каждом тестовом случае начинается со считывания числа \(n\) (\(1 \leq n \leq 10^4\)) — длины перестановок \(p\) и \(q\).

Чтобы узнать значение \(q_i\), выведите запрос в формате \(?\) \(i\) (\(1 \leq i \leq n\)). После этого, программа жюри выведет значение \(q_i\).

Вы можете сделать не более \(2n\) запросов. В ответ на некорректный запрос программа жюри выведет \(0\), и после этого Вы должны сразу завершить программу, чтобы получить вердикт Неправильный ответ.

Когда Вы будете готовы сообщить \(p\), выведите \(p\) в формате \(!\) \(p_1\) \(p_2\) \(\ldots\) \(p_n\). После этого следует приступать к обработке следующего тестового случая или завершить программу, если это был последний тестовый случай. Вывод перестановки не считается как один из \(2n\) запросов.

После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Гарантируется, что сумма \(n\) по всем тестовым случаям не превосходит \(10^4\). Интерактор в этой задаче не является адаптивным.

Взломы:

Чтобы сделать взлом, используйте следующий формат:

В первой строке находится одно целое число \(t\) — количество тестовых случаев.

Описание каждого тестового случая должно состоять из двух строк. В первой строке находится число \(n\) — длина перестановок \(p\) и \(q\). Во второй строке находятся \(n\) чисел \(p_1, p_2, \ldots, p_n\) — перестановка, которую должно загадать жюри в данном тестовом случае.

Примечание

В первом тестовом случае жюри загадало перестановку \(p = [4, 2, 1, 3]\).

Перед первым Вашим запросом \(q = [1, 2, 3, 4]\), ответ на запрос будет равен \(q_3 = 3\).

Перед вторым Вашим запросом \(q = [4, 2, 1, 3]\), ответ на запрос будет равен \(q_2 = 2\).

Перед третьим Вашим запросом \(q = [3, 2, 4, 1]\), ответ на запрос будет равен \(q_4 = 1\).

Во втором тестовом случае жюри загадало перестановку \(p = [1, 3, 4, 2]\).

Пустые строки в примере даны только для улучшения читаемости. В тестирующей системе программа жюри не будет выводить пустые строки.

H. Поезда и самолёты

графы Деревья кратчайшие пути поиск в глубину и подобное *3500

Транспортная сеть одного крупного города состоит из \(n\) станций, соединённых \(n-1\) перегонами, и представляет собой дерево. Станция с номером \(1\) является центром города. Для каждого перегона известно время в минутах, за которое его преодолевают поезда. Временем остановки поездов на станциях можно пренебречь. Обозначим за \(dist(v)\) время, за которое можно доехать от станции \(v\) до станции \(1\).

Эта транспортная сеть разделена на зоны, для обозначения которых используются первые \(k\) заглавных латинских букв. Зона станции \(i\) обозначается как \(z_i\). Центр города находится в зоне A. Для всех остальных станций выполнено, что ближайшая в направлении центра города станция находится в зоне с таким же, или лексикографически меньшим, обозначением. Любой перегон полностью принадлежит зоне его конца, более удалённого от центра города.

Турист летит в этот город на самолёте и по прибытии в аэропорт сразу направится в центр города. Опишем подробнее, как происходит поездка от станции \(v\) до станции \(1\):

  • В момент времени \(0\) турист садится на поезд, который едет от станции \(v\) до станции \(1\) по кратчайшему пути. Поездка займёт \(dist(v)\) минут.
  • В любой момент турист может купить билеты для любого подмножества зон. Билет для зоны \(i\) стоит \(pass_i\) евро.
  • Каждые \(T\) минут с момента посадки на поезд (то есть в моменты \(T, 2T, \ldots\)) его будет сканировать система контроля безбилетного проезда. Если туриста сканировали в зоне \(i\) без билета для зоны \(i\), он будет обязан заплатить штраф \(fine_i\) евро. Зона в которой находится турист формально определяется следующим образом:
    • Если турист находится на станции \(1\), то он уже доехал до центра города и не должен платить штраф.
    • Если турист находится на станции \(u \neq 1\), то он находится в зоне \(z_u\).
    • Если турист едет по перегону от станции \(x\) к станции \(y\), то он находится в зоне \(z_x\).
    Обратите внимание, что турист может заплатить штраф в одной зоне несколько раз.

Турист всегда выберет такой способ оплаты проезда, который минимизирует количество потраченных евро. Для станции \(v\) обозначим это число за \(f(v)\).

К сожалению, турист не знает, чему равны текущие \(pass_i\) и \(fine_i\) для разных зон, а также не помнит, около какой станции находится аэропорт прибытия. Он будут делать разные предположения, а Вам предстоит обработать запросы \(3\) видов:

  • \(1\) \(i\) \(c\) — запрос изменения стоимости билета в зоне \(i\). Теперь \(pass_i\) равно \(c\).
  • \(2\) \(i\) \(c\) — запрос изменения штрафа в зоне \(i\). Теперь \(fine_i\) равно \(c\).
  • \(3\) \(u\) — решите следующую задачу для текущих значений \(pass\) и \(fine\):
    • Дана станция \(u\). Рассмотрим множество станций \(v\), удовлетворяющих двум следующим условиям:
      • \(z_v = z_u\).
      • Станция \(u\) находится на пути от станции \(v\) до станции \(1\).
      Найдите значение \(\min(f(v))\) по всем станциям \(v\) из этого множества, в предположении, что у туриста есть билет в зоне \(z_u\).
Входные данные

В первой строке дано число \(n\) (\(2 \leq n \leq 2 \cdot 10^5\)) — количество станций в транспортной сети.

Следующие \(n - 1\) строка содержат по три числа \(v_i\), \(u_i\), \(t_i\) (\(1 \leq v_i, u_i \leq n, 1 \leq t_i \leq 10^9\)) — концы \(i\) перегона и время, за которое его преодолевают поезда. Гарантируется, что данные перегоны образуют дерево.

Следующая строка содержит число \(k\) (\(1 \leq k \leq 26\)) — количество зон транспортной сети.

Следующая строка содержит \(n\) символов \(z_1z_2 \ldots z_n\) — где \(z_i\) это обозначение зоны, в которой находится \(i\) станция. Гарантируется, что условия из второго абзаца выполняются.

Следующая строка содержит \(k\) чисел \(pass_1\), \(pass_2\), \(\ldots\), \(pass_k\) (\(1 \leq pass_i \leq 10^9\)) — изначальные стоимости билетов.

Следующая строка содержит \(k\) чисел \(fine_1\), \(fine_2\), \(\ldots\), \(fine_k\) (\(1 \leq fine_i \leq 10^9\)) — изначальные размеры штрафов.

Следующая строка содержит число \(T\) (\(1 \leq T \leq 10^9\)) — частоту сканирования туриста системой контроля безбилетного проезда.

Следующая строка содержит число \(q\) (\(1 \leq q \leq 2 \cdot 10^5\)) — количество запросов.

Следующие \(q\) строк содержат запросы в описанном в условии формате. Гарантируется, что в запросах первого и второго вида \(i\) является корректным обозначением зоны (одной из первых \(k\) заглавных латинских букв) и \(1 \leq c \leq 10^9\), а в запросах третьего вида \(1 \leq u \leq n\).

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

Для каждого запроса третьего вида выведите ответ на него в отдельной строке.

Примечание

Обратите внимание, что штраф может быть дешевле билета.

Транспортная сеть из примера. Зелёным обозначены станции и перегоны, находящиеся в зоне A, синим — в зоне B, красным — в зоне D. Около каждого перегона указано время, за которое его преодолевают поезда.

В первом запросе аэропорт может быть расположен около станции \(2\) или около станции \(4\). Во время поездки, турист всегда будет в зоне A. У него уже есть билет для этой зоны, поэтому ответ \(0\).

После второго запроса стоимость билета в зоне A стала равна \(10\).

В третьем запросе аэропорт может быть расположен только около станции \(3\). Оптимальным решением будет купить билет для зоны A. В течении первых \(3\) секунд поездки турист будет в зоне B. Потом он попадёт в зону A и будет сканирован там на \(4\)-й и \(8\)-й секундах поездки. Так как у него есть билет для этой зоны, он не будет платить штраф.

После четвёртого запроса штраф в зоне A стал равен \(3\).

В пятом запросе аэропорт может быть расположен только около станции \(7\) и \(f(7) = 6\).

В шестом запросе аэропорт может быть расположен около станции \(6\) или около станции \(8\). Так как \(f(6)=9\) и \(f(8)=6\) ответ равен \(6\).

B. Игра на отрезках

Перебор поиск в глубину и подобное реализация сортировки *1100

Алиса и Боб играют в следующую игру. У Алисы есть набор непересекающихся отрезков целых чисел \(S\), изначально содержащий только один отрезок \([1, n]\). За один ход Алиса выбирает некоторый отрезок \([l, r]\) из набора \(S\), а Боб выбирает некоторое число \(d\) из этого отрезка (\(l \le d \le r\)). Затем Алиса убирает \([l, r]\) из \(S\), и добавляет в \(S\) отрезки \([l, d - 1]\) (если \(l \le d - 1\)) и \([d + 1, r]\) (если \(d + 1 \le r\)). Игра заканчивается, когда \(S\) становится пустым. Можно показать, что количество шагов в такой игре всегда ровно \(n\).

После того, как игра была сыграна, Алиса запомнила все отрезки \([l, r]\), которые она доставала из набора \(S\), но Боб не запомнил ни одного числа, которые он выбирал. Но Боб умный и понимает, что числа \(d\) можно восстановить, используя отрезки, которые помнит Алиса, и просит вас помочь запрограммировать это.

По данному списку отрезков, которые Алиса доставала (\([l, r]\)) восстановите для каждого отрезка число \(d\), которое выбирал Боб.

Можно показать, что по данному списку отрезков всегда существует ровно один способ восстановить числа Боба.

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

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 1000\)).

Каждая из следующих \(n\) строк содержит два целых числа \(l\) и \(r\) (\(1 \le l \le r \le n\)), обозначающих, что Алиса в какой-то момент игры выбрала отрезок \([l, r]\).

Обратите внимание, что отрезки даны в произвольном порядке.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(1000\), а отрезки в каждом наборе входных данных соответствуют корректной игре.

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

Для каждого набора входных данных выведите \(n\) строк. Каждая строка должна содержать три целых числа \(l\), \(r\) и \(d\), обозначающих, что для отрезка Алисы \([l, r]\) Боб выбрал число \(d\).

Вы можете выводить эти строки в любом порядке. Можно показать, что ответ единственный.

Не обязательно выводить пустую строку между различными входными данными. В примере эти пустые строки сделаны только для удобства.

Примечание

В первом примере есть только один отрезок \([1, 1]\). Алиса выбирала только один отрезок \([1, 1]\), и Боб мог выбрать только число \(1\).

Во втором примере \(n = 3\). Изначально в наборе находится один отрезок \([1, 3]\).

  • Алиса выбирает отрезок \([1, 3]\). Боб выбирает число \(1\). Алиса добавляет в набор отрезок \([2, 3]\), и после этого хода это единственный отрезок в наборе.
  • Алиса выбирает отрезок \([2, 3]\). Боб выбирает число \(3\). Алиса добавляет в набор отрезок \([2, 2]\).
  • Алиса выбирает отрезок \([2, 2]\). Боб выбирает число \(2\). Игра заканчивается.

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

Номер ходаОтрезок, выбранный АлисойЧисло, выбранное БобомНабор отрезков после хода
Перед началом\( \{ [1, 5] \} \)
1\([1, 5]\)\(3\)\( \{ [1, 2], [4, 5] \}\)
2\([1, 2]\)\(1\)\( \{ [2, 2], [4, 5] \} \)
3\([4, 5]\)\(5\)\( \{ [2, 2], [4, 4] \} \)
4\([2, 2]\)\(2\)\( \{ [4, 4] \} \)
5\([4, 4]\)\(4\)\( \{ \} \) (пустой набор)

E. Дублирование среднего

Деревья жадные алгоритмы поиск в глубину и подобное Строки Структуры данных *2500

Дано бинарное дерево из \(n\) вершин. Вершины дерева пронумерованы от \(1\) до \(n\), корень дерева имеет номер \(1\). Каждая вершина может не иметь детей, иметь только правого или только левого ребенка, или иметь двух детей. Для удобства обозначим за \(l_u\) и \(r_u\) левого и правого ребенка вершины \(u\) соответственно, при этом \(l_u = 0\), если у \(u\) нет левого ребенка, и \(r_u = 0\), если у \(u\) нет правого ребенка.

В каждой вершине дерева записана некоторая строка, изначально состоящая из одного символа \(c_u\). Определим строковое представление дерева как конкатенацию всех строк, записанных в вершинах, в порядке центрированного обхода. Формально, пусть \(f(u)\) — строковое представление поддерева с корнем в вершине \(u\). \(f(u)\) определена так: \(\) f(u) = \begin{cases} \texttt{<пустая строка>,} & \text{если }u = 0; \\ f(l_u) + c_u + f(r_u) & \text{иначе}, \end{cases} \(\) где \(+\) обозначает строковую конкатенацию.

Представление всего дерева это \(f(1)\).

Для каждой вершины мы можем продублировать строку, записанную в ней, не более одного раза, а именно, заменить \(c_u\) на \(c_u + c_u\). Эта операция возможна только если \(u\) — корень дерева, или строка, записанная в родителе этой вершины уже продублирована.

Вам дано дерево и целое число \(k\). Какое лексикографически минимальное строковое представление дерево может иметь, если мы можем продублировать строку в не более чем \(k\) вершинах?

Строка \(a\) лексикографически меньше строки \(b\), если и только если выполняется один из следующих пунктов:

  • \(a\) — префикс \(b\), но \(a \ne b\);
  • в первой позиции, где \(a\) и \(b\) различны, в строке \(a\) находится буква, которая встречается в алфавите раньше, чем соответствующая буква в \(b\).
Входные данные

Первая строка содержит два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 2 \cdot 10^5\)).

Вторая строка содержит строку \(c\), состоящую из \(n\) маленьких букв латинского алфавита, где \(c_i\) — строка, записанная в вершине \(i\) изначально, \(1 \le i \le n\). Обратите внимание, что данная строка \(c\) не является начальным строковым представлением дерева.

\(i\)-я из следующих \(n\) строк содержит два целых числа \(l_i\) и \(r_i\) (\(0 \le l_i, r_i \le n\)). Если у \(i\)-й вершины нет левого ребенка, \(l_i = 0\), и если у \(i\)-й вершины нет правого ребенка, \(r_i = 0\).

Гарантируется, что данные значения описывают корректное бинарное дерево с корнем в \(1\).

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

Выведите одну строку, содержащую лексикографически минимальное строковое представление, которое может иметь дерево после не более чем в \(k\) вершинах строка будет продублирована.

Примечание

Рисунке ниже иллюстрируют примеры. Число в вершине обозначает номер вершины, а строка в нижнем индексе — строку, написанную в вершине. Справа находится строковое представление дерева, где каждая буква имеет цвет соответствующей вершине дерева.

Ниже находится дерево для первого примера. Мы продублировали строки в вершинах \(1\) и \(3\). Строку в вершине \(2\) не нужно дублировать, так как в таком случае представление будет «bbaaab», что лексикографически больше, чем «baaaab».

Во втором примере можно продублировать строки в вершинах \(1\) и \(2\). Обратите внимание, что если продублировать только строку в корне, то представление будет хуже, чем у изначального дерева.

В третьем примере не нужно ничего дублировать. Даже если мы продублируем строку в вершине \(3\), мы будем обязаны также продублировать строку в вершине \(2\), что сделает результат хуже.

Нет способа получить строку «darkkcyan» из дерева с начальным представлением «darkcyan» :(.

G. Дерево минимального ора

битмаски графы жадные алгоритмы поиск в глубину и подобное снм *1900

В последнее время Влад увлёкся остовными деревьями, так что его друзья не долго думая подарили ему на день рождения связный взвешенный неориентированный граф из \(n\) вершин и \(m\) рёбер.

Влад определил орность остовного дерева как побитовое ИЛИ всех его весов и теперь его интересует, какова минимальная возможная орность, которой можно добиться, выбрав некоторое остовное дерево. Остовное дерево — связный подграф данного графа, не содержащий циклов.

Иными словами вы хотите оставить \(n-1\) ребро, так чтобы граф остался связным и побитовое ИЛИ весов рёбер было как можно меньше. Вы должны найти само побитовое ИЛИ.

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

В первой строке входных данных записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Перед каждым набором в тесте записана пустая строка.

Далее следуют два числа \(n\) и \(m\) (\(3 \le n \le 2 \cdot 10^5, n - 1 \le m \le 2 \cdot 10^5\)) — количество вершин и рёбер графа, соответственно.

Следующие \(m\) строк содержат описание рёбер. Строка \(i\) содержит три числа \(v_i\), \(u_i\) и \(w_i\) (\(1 \le v_i, u_i \le n\), \(1 \le w_i \le 10^9\), \(v_i \neq u_i\)) — вершины, которые соединяет ребро, и его вес.

Гарантируется, что сумма \(m\) и сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\) и каждый тест содержит связный граф.

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

Выведите \(t\) строк, каждая из которых содержит ответ на соответствующий набор входных данных — минимальную возможную орность остовного дерева.

Примечание
Изначальный граф из первого примера.
Орность такого дерева равна 2 or 2 = 2 и является оптимальной.
Оставив ребро веса \(1\) мы получим орность 1 or 2 = 3.

E1. Обновление котов (простая версия)

графы Деревья дп Перебор поиск в глубину и подобное разделяй и властвуй Структуры данных *2500

Это простая версия задачи. Единственным различием между простой и сложной версиями задачи является наличие запросов удаления: они присутствуют лишь в сложной версии.

Компания «Interplanetary Software, Inc.» вместе с компанией «Robots of Cydonia, Ltd.» разработала и выпустила роботов-котов. Эти электронные питомцы умеют мяукать, ловить мышей и всячески развлекать хозяина.

Недавно разработчики из «Interplanetary Software, Inc.» решили выпустить обновление программного обеспечения для этих роботов. После обновления коты должны уметь решать задачи, связанные со скобочными последовательностями. Одна из таких задач приведена ниже.

Сначала немного погрузимся в теорию скобочных последовательностей. Будем рассматривать строки, состоящие из символов «(», «)» и «.». Назовем строку правильной скобочной последовательностью (ПСП), если из нее можно получить пустую строку путем операций удаления одиночных символов «.» либо подряд идущих символов «()». Например, строка «(()(.))» является ПСП, т. к. с ней можно проделать следующую цепочку удалений:

«(()(.))» \(\rightarrow\) «(()())» \(\rightarrow\) «(())» \(\rightarrow\) «()» \(\rightarrow\) «».

Мы получили пустую строку, а это значит, что исходная строка является ПСП. В то же время, строка «)(» не является ПСП, поскольку к ней нельзя применить описанные выше операции удаления.

Будем называть ПСП простой, если эта ПСП непуста, не начинается на «.» и не заканчивается на «.».

Также будем считать, что подстрока строки \(s\) — это ее последовательный подотрезок. В частности, \(s[l\dots r] = s_ls_{l+1}\dots s_r\), где \(s_i\) — \(i\)-й символ строки \(s\).

Теперь перейдем к формулировке задачи. Вам дана строка \(s\), изначально состоящая из символов «(» и «)». Необходимо отвечать на запросы следующего вида.

Даны индексы \(l\) и \(r\) (\(1 \le l < r \le n\)), причем гарантируется, что подстрока \(s[l\dots r]\) — простая ПСП. Требуется найти количество подстрок в \(s[l\dots r]\), которые являются простыми ПСП. Иными словами, необходимо найти количество пар индексов \(i\), \(j\) таких, что \(l \le i < j \le r\) и \(s[i\dots j]\) является простой ПСП.

Вы работаете в «Interplanetary Software, Inc.» и Вам поручили непростое задание: научить котов после обновления решать описанную выше задачу.

Обратите внимание, что в данной версии задачи в строке не может появиться символ «.». Он нужен лишь для сложной версии задачи.

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

В первой строке входных данных находится два целых числа \(n\) и \(q\) (\(2 \le n \le 3\cdot10^5\), \(1 \le q \le 3\cdot10^5\)) — длина строки и количество запросов.

Во второй строке находится строка \(s\), состоящая из \(n\) символов «(» и «)».

В каждой из следующих \(q\) строк находится по три целых числа \(t\), \(l\) и \(r\) (\(t = 2\), \(1 \le l < r \le n\)) — запросы, которые требуется обработать. Гарантируется, что все запросы корректны и удовлетворяют условию задачи. Обратите внимание, что в данной задаче число \(t\) не используется и всегда равно двум. Оно необходимо для сложной версии задачи.

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

Для каждого запроса выведите по одному целому числу в отдельной строке — количество подстрок, которые являются простыми ПСП. Ответы требуется выводить в том же, порядке, в котором приведены сами запросы.

Примечание

Рассмотрим пример из условия.

Ответ на первый запрос равен \(3\), поскольку существует всего три требуемых подстроки: \(s[3\dots6]\), \(s[3\dots4]\) и \(s[5\dots6]\).

Ответ на второй запрос равен \(4\). Подходящие подстроки — \(s[3\dots6]\), \(s[3\dots4]\), \(s[5\dots6]\) и \(s[2\dots7]\).

Ответ на третий запрос равен \(1\). Подходящая подстрока — \(s[8\dots9]\).

Ответ на четвертый запрос равен \(6\). Подходящие подстроки — \(s[3\dots6]\), \(s[3\dots4]\), \(s[5\dots6]\), \(s[2\dots7]\), \(s[8\dots9]\) и \(s[2\dots9]\).

E2. Обновление котов (сложная версия)

Бинарный поиск графы Деревья поиск в глубину и подобное Структуры данных *2800

Это сложная версия задачи. Единственным различием между простой и сложной версиями задачи является наличие запросов удаления: они присутствуют лишь в сложной версии.

Компания «Interplanetary Software, Inc.» вместе с компанией «Robots of Cydonia, Ltd.» разработала и выпустила роботов-котов. Эти электронные питомцы умеют мяукать, ловить мышей и всячески развлекать хозяина.

Недавно разработчики из «Interplanetary Software, Inc.» решили выпустить обновление программного обеспечения для этих роботов. После обновления коты должны уметь решать задачи, связанные со скобочными последовательностями. Одна из таких задач приведена ниже.

Сначала немного погрузимся в теорию скобочных последовательностей. Будем рассматривать строки, состоящие из символов «(», «)» и «.». Назовем строку правильной скобочной последовательностью (ПСП), если из нее можно получить пустую строку путем операций удаления одиночных символов «.» либо подряд идущих символов «()». Например, строка «(()(.))» является ПСП, т. к. с ней можно проделать следующую цепочку удалений:

«(()(.))» \(\rightarrow\) «(()())» \(\rightarrow\) «(())» \(\rightarrow\) «()» \(\rightarrow\) «».

Мы получили пустую строку, а это значит, что исходная строка является ПСП. В то же время, строка «)(» не является ПСП, поскольку к ней нельзя применить описанные выше операции удаления.

Будем называть ПСП простой, если эта ПСП непуста, не начинается на «.» и не заканчивается на «.».

Также будем считать, что подстрока строки \(s\) — это ее последовательный подотрезок. В частности, \(s[l\dots r] = s_ls_{l+1}\dots s_r\), где \(s_i\) — \(i\)-й символ строки \(s\).

Теперь перейдем к формулировке задачи. Вам дана строка \(s\), изначально состоящая из символов «(» и «)». Необходимо отвечать на следующие запросы:

  1. Даны индексы \(l\) и \(r\) (\(1 \le l < r \le n\)). Гарантируется, что \(l\)-й символ строки равен «(», \(r\)-й символ строки равен «)», а символы между ними равны «.». Тогда требуется сделать \(l\)-й и \(r\)-й символ равными «.».
  2. Даны индексы \(l\) и \(r\) (\(1 \le l < r \le n\)), причем гарантируется, что подстрока \(s[l\dots r]\) — простая ПСП. Требуется найти количество подстрок в \(s[l\dots r]\), которые являются простыми ПСП. Иными словами, необходимо найти количество пар индексов \(i\), \(j\) таких, что \(l \le i < j \le r\) и \(s[i\dots j]\) является простой ПСП.

Вы работаете в «Interplanetary Software, Inc.» и Вам поручили непростое задание: научить котов после обновления решать описанную выше задачу.

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

В первой строке входных данных находится два целых числа \(n\) и \(q\) (\(2 \le n \le 3\cdot10^5\), \(1 \le q \le 3\cdot10^5\)) — длина строки и количество запросов.

Во второй строке находится строка \(s\), состоящая из \(n\) символов «(» и «)».

В каждой из следующих \(q\) строк находится по три числа \(t\), \(l\) и \(r\) (\(t \in \{1, 2\}\), \(1 \le l < r \le n\)) — запросы, которые требуется обработать. Гарантируется, что все запросы корректны и удовлетворяют условию задачи.

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

Для каждого запроса второго типа выведите по одному целому числу в отдельной строке — количество подстрок, которые являются простыми ПСП. Ответы требуется выводить в том же, порядке, в котором приведены сами запросы.

Примечание

Рассмотрим пример из условия.

Ответ на первый запрос равен \(3\), поскольку существует всего три требуемых подстроки: \(s[3\dots6]\), \(s[3\dots4]\) и \(s[5\dots6]\).

Ответ на второй запрос равен \(4\). Подходящие подстроки — \(s[3\dots6]\), \(s[3\dots4]\), \(s[5\dots6]\) и \(s[2\dots7]\).

После третьего запроса строка станет равной «)(..())()».

Ответ на четвертый запрос равен \(2\). Подходящие подстроки — \(s[5\dots6]\) и \(s[2\dots7]\). Обратите внимание, что \(s[3\dots6]\) больше не является простой ПСП, т. к. начинается с «.».

Ответ на пятый запрос равен \(4\). Подходящие подстроки — \(s[5\dots6]\), \(s[2\dots7]\), \(s[8\dots9]\) и \(s[2\dots9]\).

После шестого запроса строка станет равной «)(....)()».

После седьмого запроса строка станет равной «)......()».

Ответ на восьмой запрос равен \(1\). Подходящая подстрока — \(s[8\dots9]\).

E. Черно-белое дерево

Деревья жадные алгоритмы поиск в глубину и подобное *2400

Дано дерево из \(n\) вершин. Некоторые вершины дерева (хотя бы две) — черные, остальные — белые.

Вы ставите фишку в какую-то из вершин дерева и после этого проводите следующие операции:

  • пусть фишка сейчас находится в вершине \(x\). Вы выбираете черную вершину \(y\), а затем перемещаете фишку по первому ребру в простом пути из \(x\) в \(y\).

Вы не можете выбирать одну и ту же вершину \(y\) в двух операциях подряд (то есть для любых двух последовательных операций выбранные черные вершины должны быть различны).

Вы заканчиваете операции, когда фишка оказывается в черной вершине (если она изначально в черной вершине — вы не выполняете операции вообще), или когда количество выполненных операций становится больше \(100^{500}\).

Для каждой вершины \(i\) вы должны определить, существует ли (не обязательно непустая) последовательность операций, в результате которой фишка окажется в черной вершине, если изначально фишка расположена в вершине \(i\).

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

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

Во второй строке заданы \(n\) целых чисел \(c_1, c_2, \dots, c_n\) (\(0 \le c_i \le 1\)), где \(c_i = 0\) означает, что \(i\)-я вершина — белая, а \(c_i = 1\) означает, что \(i\)-я вершина — черная. Хотя бы два значения \(c_i\) равны \(1\).

Затем следует \(n-1\) строка, каждая из которых содержит два целых числа \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\); \(u_i \ne v_i\)) — концы некоторого ребра. Эти ребра задают дерево.

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

Выведите \(n\) целых чисел. \(i\)-е из них должно быть равно \(1\), если существует (возможно, пустая) последовательность операций, которая перемещает фишку в черную вершину, если изначально расположить ее в вершине \(i\), или \(0\), если такой последовательности операций не существует.

C. Не назначать

Деревья Конструктив поиск в глубину и подобное теория чисел *1400

Вам дано дерево из \(n\) вершин, пронумерованных от \(1\) до \(n\), ребра которого пронумерованы от \(1\) до \(n-1\). Деревом называется связный неориентированный граф без циклов. Вам нужно назначить целочисленный вес каждому ребру дереву так, чтобы в результате получилось простое дерево.

Дерево называется простым, если вес каждого пути, состоящего из одного или двух ребер, является простым числом. Рассматриваются только пути, не посещающие никакую вершину дважды. Весом пути называется сумма весов ребер на пути.

Рассмотрим граф ниже. Он является простым деревом, так как вес любого пути из не более чем двух ребер простой. Например, путь из двух ребер \(2 \to 1 \to 3\) имеет вес \(11 + 2 = 13\), который является простым числом. Другой пример, путь из одного ребра \(4 \to 3\) имеет вес \(5\), который является простым числом.

Назначьте веса ребрам любым возможным способом таким, что получившееся дерево будет простым. Если такого способа нет, выведите \(-1\). Можно показать, что если существуют способы сделать дерево простым, то существуют и способ, использующий только веса от \(1\) до \(10^5\).

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

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(2 \leq n \leq 10^5\)) — количество вершин в дереве.

Далее следует \(n-1\) строка. \(i\)-я из этих строк содержит два целых числа \(u\) и \(v\) (\(1 \leq u, v \leq n\)), обозначающие, что \(i\)-е ребро соединяет вершины \(u\) и \(v\). Гарантируется, что данные ребра образуют дерево.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^5\).

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

Для каждого набора входных данных, если существует способ корректно назначить веса, выведите \(n-1\) целое число \(a_1, a_2, \dots, a_{n-1}\) (\(1 \leq a_i \le 10^5\)), где \(a_i\) обозначает вес, назначенный ребру \(i\). В противном случае выведите \(-1\).

Если существует несколько решений, выведите любое.

Примечание

В первом примере есть только два пути по одному ребру: \(1 \to 2\) и \(2 \to 1\), оба пути имеют вес \(17\) — простое число.

Второй пример описан в условии задачи.

Можно показать, что для третьего примера не существует корректного способа назначить веса.

E. Электронное правительство

Деревья дп поиск в глубину и подобное Строки Структуры данных *2800

В рамках проекта «Электронное правительство» лучшим программистам страны Распиляндии поручили создание системы автоматизации сбора статистики и анализа прессы.

Известно, что членами правительства Распиляндии может стать любой из k граждан. Их фамилии — a1, a2, ..., ak. Все фамилии различны. Изначально в правительство входят все k граждан из этого списка. Система должна поддерживать следующие возможности:

  • Включить гражданина ai в состав правительства.
  • Исключить гражданина ai из состава правительства.
  • По заданному тексту статьи определить, насколько она политизирована. Для этого, для каждого действующего члена правительства, вычисляется количество раз, которое его фамилия встречается в тексте как подстрока. Считаются все вхождения, в том числе и пересекающиеся. Степень политизированности текста определяется как сумма этих количеств по всем действующим членам правительства.

Реализуйте эту систему.

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

В первой строке через пробел записаны числа n и k (1 ≤ n, k ≤ 105) — количество запросов к системе и количество потенциальных членов правительства.

В следующих k строках заданы фамилии a1, a2, ..., ak, по одной на строку. Все фамилии попарно различны.

В следующих n строках заданы запросы к системе, по одному на строку. Каждый запрос состоит из символа, определяющего операцию, и аргумента операции, записанных подряд без пробела.

Операции «включить в правительство» соответствует символ «+», операции «исключить» — «-». Аргументом этих операций является целое число от 1 до k — номер гражданина, которого она затрагивает. Любой гражданин может быть включен и исключен из правительства произвольное количество раз в любом порядке. Включение в правительство гражданина, который в него уже входит, или исключение гражданина, который и так не входил, ничего не меняет.

Операции «подсчитать политизированность» соответствует символ «?». Её аргументом является текст.

Все строки, как фамилии, так и тексты, являются непустыми последовательностями строчных букв латинского алфавита. Суммарная длина всех фамилий не превышает 106, суммарная длина всех текстов не превышает 106.

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

Для каждой операции «подсчитать политизированность» выведите на отдельной строке степень политизированности заданного в ней текста. Для остальных операций ничего выводить не нужно.

E1. Дистанционное дерево (простая версия)

Бинарный поиск графы Деревья кратчайшие пути поиск в глубину и подобное Структуры данных *2400

Эта версия задачи отличается от следующей только ограничением на \(n\).

Дерево — это связный неориентированный граф без циклов. Взвешенное дерево — это такое дерево, в котором у каждого ребра есть некоторый вес. Расстояние между вершинами — минимальная сумма весов на пути между ними.

Дано взвешенное дерево c \(n\) вершинами, у каждого ребра вес \(1\). Введём \(d(v)\) как расстояние между вершиной \(1\) и вершиной \(v\).

Пусть \(f(x)\) равно минимально возможному значению \(\max\limits_{1 \leq v \leq n} \ {d(v)}\), если можно временно добавить одно ребро веса \(x\) между любыми двумя вершинами \(a\) и \(b\) \((1 \le a, b \le n)\). Обратите внимание, что после этой операции граф уже не является деревом.

Для каждого целого числа \(x\) от \(1\) до \(n\) найдите \(f(x)\).

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

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 3000\)).

Каждая из следующих \(n−1\) строк содержит два целых числа \(u\) и \(v\) (\(1 \le u,v \le n\)), указывающих на наличие ребра между вершинами \(u\) и \(v\). Гарантируется, что заданные ребра образуют дерево.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(3000\).

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

Для каждого набора входных данных выведите в одной строке \(n\) целых чисел, \(x\)-е из которых равно \(f(x)\) для всех \(x\) от \(1\) до \(n\).

Примечание
В первом наборе входных данных:
  • Для \(x = 1\) мы можем добавить ребро между вершинами \(1\) и \(3\), после чего \(d(1) = 0\) и \(d(2) = d(3) = d(4) = 1\), поэтому \(f(1) = 1\).
  • Для \(x \ge 2\), вне зависимости от того, какое ребро мы добавим, \(d(1) = 0\), \(d(2) = d(4) = 1\) и \(d(3) = 2\), поэтому \(f(x) = 2\).

E2. Дистанционное дерево (сложная версия)

Бинарный поиск Деревья кратчайшие пути поиск в глубину и подобное *2700

Эта версия задачи отличается от предыдущей только ограничением на \(n\).

Дерево — это связный неориентированный граф без циклов. Взвешенное дерево — это такое дерево, в котором у каждого ребра есть некоторый вес. Расстояние между вершинами — минимальная сумма весов на пути между ними.

Дано взвешенное дерево c \(n\) вершинами, у каждого ребра вес \(1\). Введём \(d(v)\) как расстояние между вершиной \(1\) и вершиной \(v\).

Пусть \(f(x)\) равно минимально возможному значению \(\max\limits_{1 \leq v \leq n} \ {d(v)}\), если можно временно добавить одно ребро веса \(x\) между любыми двумя вершинами \(a\) и \(b\) \((1 \le a, b \le n)\). Обратите внимание, что после этой операции граф уже не является деревом.

Для каждого целого числа \(x\) от \(1\) до \(n\) найдите \(f(x)\).

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

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 3 \cdot 10^5\))

Каждая из следующих \(n−1\) строк содержит два целых числа \(u\) и \(v\) (\(1 \le u,v \le n\)), указывающих на наличие ребра между вершинами \(u\) и \(v\). Гарантируется, что заданные ребра образуют дерево.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(3 \cdot 10^5\).

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

Для каждого набора входных данных выведите в одной строке \(n\) целых чисел, \(x\)-е из которых равно \(f(x)\) для всех \(x\) от \(1\) до \(n\).

Примечание
В первом наборе входных данных:
  • Для \(x = 1\) мы можем добавить ребро между вершинами \(1\) и \(3\), после чего \(d(1) = 0\) и \(d(2) = d(3) = d(4) = 1\), поэтому \(f(1) = 1\).
  • Для \(x \ge 2\), вне зависимости от того, какое ребро мы добавим, \(d(1) = 0\), \(d(2) = d(4) = 1\) и \(d(3) = 2\), поэтому \(f(x) = 2\).

E. Запросы об остовном дереве

Бинарный поиск графы Деревья жадные алгоритмы математика поиск в глубину и подобное снм сортировки Структуры данных *2400

Задан связный взвешенный неориентированный граф, состоящий из \(n\) вершин и \(m\) ребер.

К нему задаются \(k\) запросов. Каждый запрос состоит из одного целого числа \(x\). На каждый запрос вы должны выбрать остовное дерево в графе. Пусть веса его ребер будут \(w_1, w_2, \dots, w_{n-1}\). Стоимость остовного дерева равна \(\sum \limits_{i=1}^{n-1} |w_i - x|\) (сумма абсолютных разностей между весами и \(x\)). Ответ на запрос — это минимальная стоимость остовного дерева.

Запросы даны в сжатом формате. Первые \(p\) \((1 \le p \le k)\) запросов \(q_1, q_2, \dots, q_p\) даны явно. Для запросов с \(p+1\) по \(k\) выполняется \(q_j = (q_{j-1} \cdot a + b) \mod c\).

Выведите исключающее или ответов на все запросы.

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

В первой строке записаны два целых числа \(n\) и \(m\) (\(2 \le n \le 50\); \(n - 1 \le m \le 300\)) — количество вершин и количество ребер в графе.

В каждой из следующих \(m\) строк содержится описание неориентированного ребра: три целых числа \(v\), \(u\) и \(w\) (\(1 \le v, u \le n\); \(v \neq u\); \(0 \le w \le 10^8\)) — вершины, которые соединяет ребро, и его вес. Обратите внимание, что между парой вершин может быть несколько ребер. Ребра образуют связный граф.

В следующей строке записаны пять целых чисел \(p, k, a, b\) и \(c\) (\(1 \le p \le 10^5\); \(p \le k \le 10^7\); \(0 \le a, b \le 10^8\); \(1 \le c \le 10^8\)) — количество запросов, заданных явно, общее количество запросов и параметры для генерации запросов.

В следующей строке записаны \(p\) целых чисел \(q_1, q_2, \dots, q_p\) (\(0 \le q_j < c\)) — первые \(p\) запросов.

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

Выведите одно целое число — исключающее или ответов на все запросы.

Примечание

Запросы в первом примере: \(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0\). Ответы: \(11, 9, 7, 3, 1, 5, 8, 7, 5, 7, 11\).

Запросы во втором примере: \(3, 0, 2, 1, 6, 0, 3, 5, 4, 1\). Ответы: \(14, 19, 15, 16, 11, 19, 14, 12, 13, 16\).

Запросы в третьем примере: \(75, 0, 0, \dots\). Ответы: \(50, 150, 150, \dots\).

E. Честный делёж

графы Конструктив Паросочетания поиск в глубину и подобное Структуры данных *2400

Even a cat has things it can do that AI cannot.
— Fei-Fei Li

Вам дано \(m\) массивов целых положительных чисел, длина каждого массива чётна.

От вас требуется составить два равных мультимножества \(L\) и \(R\) так, чтобы каждый элемент каждого массива попал ровно в одно мультимножество. Кроме того, для каждого из \(m\) массивов ровно половина его элементов должна попасть в \(L\), а остальные — в \(R\).

Приведите пример такого разбиения или определите, что такого разбиения не существует.

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

В первой строке записано целое число \(m\) (\(1 \le m \le 10 ^ 5\)) — количество массивов.

В следующих \(2 \cdot m\) строках даны описания массивов.

В описании каждого массива первая строка содержит чётное число \(n\) (\(2 \le n \le 2 \cdot 10 ^ 5\)) — длина массива. Во второй строке через пробел перечислены \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10 ^ 9\)) — элементы массива.

Гарантируется, что сумма \(n\) по всем массивам не превосходит \(2 \cdot 10^5\).

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

В случае если ответ существует выведите «YES», а затем выведите \(m\) строк.

В каждой строке для каждого элемента выведите букву «L» или «R» (обязательно заглавную, без пробелов) — в какое мультимножество должен попасть данный элемент.

Если ответа не существует, в единственной строке выведите «NO».

Примечание

В первом массиве первый элемент мы добавляем в \(R\), а второй в \(L\). Сейчас \(L = \{2\}\), а \(R = \{1\}\).

Во втором массиве первый и третий элемент мы добавляем в \(L\), а остальные в \(R\). Сейчас \(L = \{1, 2, 3\}\) и \(R = \{1, 2, 3\}\).

В третьем массиве элементы 2, 3 и 6 мы добавляем в \(L\), а на остальных — в \(R\). В итоге \(L = R = \{1, 1, 2, 2, 3, 3\}\).

E. Автомобили

2-sat графы жадные алгоритмы Конструктив поиск в глубину и подобное снм сортировки *2200

На координатной оси \(OX\) стоят \(n\) автомобилей. Каждая машина изначально находится в целочисленной точке, и никакие две машины не находятся в одной и той же точке. Кроме того, каждая машина ориентирована либо влево, либо вправо, и в любой момент они могут двигаться с любой постоянной положительной скоростью в этом направлении.

Более формально мы можем описать \(i\)-й автомобиль буквой и целым числом: его ориентацию \(ori_i\) и его местоположение \(x_i\). Если \(ori_i = L\), то \(x_i\) убывает со временем. Точно так же, если \(ori_i = R\), то \(x_i\) увеличивается со временем.

Мы называем две машины нерелевантными, если они никогда не оказываются в одной и той же точке независимо от их скорости. Другими словами, они не будут иметь одну и ту же координату в любой момент.

Мы называем два автомобиля предназначенными, если они когда-нибудь окажутся в одной и той же точке независимо от их скорости.

К сожалению, мы потеряли всю информацию о наших машинах, но мы помним \(m\) отношений между ними. Существует два типа отношений:

\(1\) \(i\) \(j\)\(i\)-й автомобиль и \(j\)-й автомобиль нерелевантные.

\(2\) \(i\) \(j\)\(i\)-й автомобиль и \(j\)-й автомобиль предназначенные.

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

Обратите внимание на то, что если два автомобиля окажутся в одной точке, то они продолжат свое движение.

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

Первая строка содержит два целых числа: \(n\) и \(m\) \((2 \leq n \leq 2 \cdot 10^5; 1 \leq m \leq min(2 \cdot 10^5, \frac{n(n-1)}{2})\) — количество автомобилей и количество отношений соответственно.

Каждая из следующих \(m\) строк содержит три целых числа: \(type\), \(i\) и \(j\) \((1 \leq type \leq 2; 1 \leq i,j \leq n; i≠j)\).

Если \(type\) = \(1\), то \(i\)-й автомобиль и \(j\)-й автомобиль являются нерелевантными. В противном случае \(i\)-й автомобиль и \(j\)-й автомобиль являются предназначенными.

Гарантируется, что для каждой пары автомобилей существует не более \(1\)-го отношения между ними.

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

В первой строке выведите «YES», если можно восстановить ориентации и положения автомобилей, удовлетворяющих отношениям, и «NO» в противном случае.

Если ответ «YES», выведите \(n\) строк, каждая из которых содержит символ и целое число: \(ori_i\) и \(x_i\) \((ori_i \in \{L, R\}; -10^9 \leq x_i \leq 10^9)\) — представляет информацию о \(i\)-м автомобиле.

Если ориентация налево, то \(ori_i\) = \(L\). В противном случае \(ori_i\) = \(R\).

\(x_i\) — координата, где находится \(i\)-й автомобиль. Обратите внимание, что все \(x_i\) должны быть различными.

Мы можем доказать, что если существует решение, то должно быть и решение, удовлетворяющее ограничениям на \(x_i\).

F. Вышки

Деревья дп жадные алгоритмы Конструктив поиск в глубину и подобное *2500

Дано дерево с \(n\) вершинами, пронумерованными от \(1\) до \(n\). Для вершины с номером \(i\) известна её высота \(h_i\). Вы можете установить любое количество вышек в вершины, для каждой вышки вы можете выбрать, в какую вершину её поставить, а также выбрать её эффективность. Установка вышки с эффективностью \(e\) стоит \(e\) монет, где \(e > 0\).

Считается, что в вершине \(x\) ловит связь, если для какой-то пары вышек в вершинах \(u\) и \(v\) (\(u \neq v\), но может быть, что \(x = u\) или \(x = v\)) с эффективностями соответственно \(e_u\) и \(e_v\) выполняется, что \(\min(e_u, e_v) \geq h_x\) и \(x\) лежит на пути между \(u\) и \(v\).

Найдите минимальное количество монет, необходимое для установки вышек, чтобы во всех вершинах ловила связь.

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

В первой строке вводится целое число \(n\) (\(2 \le n \le 200\,000\)) — количество вершин в дереве.

Во второй строке вводятся \(n\) целых чисел \(h_i\) (\(1 \le h_i \le 10^9\)) — высоты вершин.

В следующих \(n - 1\) строках вводятся пары чисел \(v_i, u_i\) (\(1 \le v_i, u_i \le n\)) — ребра в дереве. Гарантируется, что данные ребра образуют дерево.

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

Выведите одно целое число — минимальное необходимое количество монет, чтобы во всех вершинах ловила связь.

Примечание

В первом тесте оптимально установить две вышки с эффективностью \(2\) в \(1\) и \(3\) вершины.

Во втором тесте оптимально установить вышку с эффективностью \(1\) в вершину \(1\) и две вышки с эффективностью \(3\) во \(2\) и \(5\) вершины.

В третьем тесте оптимально установить две вышки с эффективностью \(6\) в \(1\) и \(2\) вершины.

A. Переменная, или Туда и обратно

графы поиск в глубину и подобное *1700

Непроста жизнь самой обычной переменной по имени Вася. Куда бы она ни отправилась, ей то присваивают значение, то просто игнорируют, то вообще используют!

Жизнь Васи проходит в состояниях программы, в которой ей случилось быть объявленной. В каждом состоянии Васю могут либо использовать (например, для вычисления значения другой переменной), либо присваивать ей значение, либо игнорировать. Между некоторыми состояниями есть ориентированные переходы.

Путь — это последовательность состояний v1, v2, ..., vx, где для каждого 1 ≤ i < x существует переход из vi в vi + 1.

Значение Васи в состоянии v интересует окружающий мир, если существует путь p1, p2, ..., pk такой, что pi = v для некоторого i (1 ≤ i ≤ k), в состоянии p1 Васе присваивают значение, в состоянии pk Васю используют и ни в каких состояниях pi, кроме p1, Васе не присваивают значение.

Помогите Васе: найдите состояния, в которых значение Васи интересует окружающий мир.

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

В первой строке через пробел записаны два целых числа n и m (1 ≤ n, m ≤ 105) — количества состояний и переходов, соответственно.

Во второй строке через пробел записаны n целых чисел f1, f2, ..., fn (0 ≤ fi ≤ 2), fi описывает действия над Васей в состоянии номер i: 0 соответствует игнорированию, 1 — присваиванию значения, 2 — использованию.

В следующих m строках через пробел записаны пары целых чисел ai, bi (1 ≤ ai, bi ≤ n, ai ≠ bi), каждая пара задает переход из состояния с номером ai в состояние с номером bi. Между двумя состояниями может быть любое количество переходов.

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

Выведите n целых чисел r1, r2, ..., rn, разделенных пробелами или переводами строк. Число ri должно быть равно 1, если значение Васи в состоянии номер i интересует окружающий мир, и равно 0 в противном случае. Состояния нумеруются от 1 до n в том же порядке, в котором заданы их описания во входных данных.

Примечание

В первом примере из состояний программы можно составить единственный путь, в котором значение Васи интересует окружающий мир, 1 2 3 4; в него входят все состояния, поэтому во всех них значение Васи интересует окружающий мир.

Во втором примере единственный путь, в котором значение Васи интересует окружающий мир, — 1 3; состояние 2 в него не входит.

В третьем примере из состояний нельзя составить ни одного пути, в котором значение Васи интересует окружающий мир, поэтому значение Васи никогда не интересует окружающий мир.

D. Взвесьте дерево

Деревья дп Конструктив поиск в глубину и подобное реализация *2000

Вам дано дерево из \(n\) вершин, пронумерованных от \(1\) до \(n\). Деревом называется связный неориентированный граф без циклов.

Для всех \(i=1,2, \ldots, n\) обозначим за \(w_i\) вес \(i\)-й вершины. Вершина называется хорошей, если ее вес равен сумме весов всех ее соседей.

Изначально веса в вершинах не определены. Выберете для каждой вершины положительный целочисленный вес так, чтобы количество хороших вершин в дереве было максимально возможным. Если есть несколько способов сделать это, вам нужно найти такой, который минимизирует сумму весов всех вершин в дереве.

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

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

Далее следует \(n−1\) строка. Каждая из этих строк содержит два целых числа \(u\) и \(v\) (\(1\le u,v\le n\)), обозначающие ребро между вершинами \(u\) и \(v\). Гарантируется, что ребра образуют дерево.

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

В первой строке выведите два целых числа: максимальное количество хороших вершин и минимально возможный суммарный вес вершин при этом.

Во второй строке выведите \(n\) целых чисел \(w_1, w_2, \ldots, w_n\) (\(1\le w_i\le 10^9\)) — веса вершин. Можно показать, что существует оптимальное решение, удовлетворяющее данным ограничениям.

Если существует несколько решений, выведите любое из них.

Примечание

Ниже изображено дерево из первого примера:

В этом случае, если вы выберете для каждый вершины вес \(1\), то хорошими вершинами будут вершины (покрашены черным) \(1\), \(3\) и \(4\). Невозможно выбрать такие веса, чтобы все вершины были хорошими. Минимально возможная сумма весов равна \(1+1+1+1=4\), меньшая сумма недостижима, так как вершины обязаны иметь положительный вес.

Ниже изображено дерево из второго примера:

В этом случае, если вы выберете для каждой вершины вес \(1\), то хорошими вершинами будут вершины (покрашены черным) \(2\) и \(3\). Можно показать, что это оптимальное решение.

E. Мадока и шестиклассики

жадные алгоритмы поиск в глубину и подобное Структуры данных *2500

После ошеломительного успеха у пятого класса, Мадоке решили доверить преподавать уже шестиклассникам.

Всего в её классе есть \(n\) одноместных парт. Изначально Мадока за \(i\)-ю парту посадила ученика под номером \(b_i\) (\(1 \le b_i \le n\)), а за дверью образовалась бесконечная очередь учеников с номерами \(n + 1, n + 2, n + 3, \ldots\) в надежде оказаться на её уроке. Обратите внимание, что все ученики имеют различные номера.

После каждого урока происходит следующие события по порядку.

  1. Ученик, сидевший за партой \(i\), перемещается за парту \(p_i\). Все ученики перемещаются одновременно.
  2. Если за какой-то партой оказалось больше одного ученика, то за ней остается ученик с наименьшим номером, а все остальные навсегда покидают класс.
  3. Затем на каждую пустую парту в порядке возрастания номеров садится ученик с наименьшим номером из очереди снаружи.

Обратите внимание, что в итоге за каждой партой снова находится ровно один ученик. Гарантируется, что числа \(p\) таковы, что как минимум один ученик покидает класс после каждого урока. Обратите внимание на пояснение к первому примеру для лучшего понимания.

После нескольких (возможно нуля) уроков за партой \(i\) сидит ученик \(a_i\). По данным значениям \(a_1, a_2, \ldots, a_n\) и \(p_1, p_2, \ldots, p_n\), найдите лексикографически наименьшую подходящую перестановку \(b_1, b_2, \ldots, b_n\), описывающую возможную начальную рассадку.

Перестановкой называется массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) является перестановкой, но \([1,2,2]\) не является перестановкой (\(2\) встречается дважды в массиве) и \([1,3,4]\) тоже не является перестановкой (\(n=3\), но \(4\) присутствует в массиве).

Для двух различных перестановок равной длины \(a\) и \(b\), \(a\) лексикографически меньше \(b\), если в первой позиции, где \(a\) и \(b\) различны, в \(a\) элемент меньше, чем соответствующий элемент в \(b\).

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

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

Вторая строка содержит \(n\) целых чисел \(p_1, p_2, \ldots, p_n\) (\(1 \leq p_i \leq n\)) — места, куда пересаживаются ученики. Гарантируется, что \(p\) содержит хотя бы два равных элемента.

Третья строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 10^9\)) — конечная рассадка учеников. Гарантируется, что существует изначальная перестановка, из которой получилась рассадка \(a\).

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

В единственной строке выведите \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) (\(1 \le b_i \le n\)) — лексикографически минимальную перестановку, описывающую начальную рассадку учеников, из которой могла получится конечная рассадка \(a\).

Примечание

Описание первого теста находится ниже:

На первой картинке показана стартовая рассадка, являющаяся ответом. Затем ученики, сидящие за партами \(1, 2\) пересаживаются за \(5\) парту. Также за \(1\) парту пересел ученик с парты \(5\), а за парту под номером \(3\) пересаживается ученик с \(4\) парты.

Таким образом, после всех этих пересадок, получается рассадка, показаная на втором изображении. Затем за партой под номером \(5\) выгоняют ученика с номером \(3\), а за партой под номером \(3\) выгоняют ученика с номером \(5\). (Поскольку их номера не самые маленькие) Затем за парты под номерами \(2, 4\) садятся новые ученики с номерами \(6, 7\). И эта рассадка (после конца первого урока) показана на третьем изображении.

На \(4\) изображении показана рассадка, после второго урока до того, как всех лишних выгнали. А на пятой показана финальная рассадка после \(2\) урока.

E. Авиареформа

графы Деревья поиск в глубину и подобное разделяй и властвуй реализация снм Структуры данных *3200

Берляндия — большая страна с развитой системой авиасообщения. Всего в стране есть \(n\) городов, которые исторически обслуживаются авиакомпанией Берляфлот. Авиакомпания выполняет двухсторонние рейсы между \(m\) парами городов, \(i\)-й из них соединяет города с номерами \(a_i\) и \(b_i\) и имеет цену \(c_i\) на перелёт в каждую из сторон.

Известно, что с помощью рейсов Берляфлота можно добраться от любого города до любого другого (возможно, с пересадками), а стоимость любого маршрута из нескольких стыковочных рейсов Берляфлота равна стоимости самого дорогого из них. Более формально, стоимость маршрута из города \(t_1\) в город \(t_k\) с \((k-2)\)-мя пересадками в городах \(t_2,\ t_3,\ t_4,\ \ldots,\ t_{k - 1}\) равна максимуму из стоимостей рейсов из города \(t_1\) в \(t_2\), из \(t_2\) в \(t_3\), из \(t_3\) в \(t_4\) и так далее до рейса из \(t_{k - 1}\) в \(t_k\). Разумеется, все эти рейсы должны выполняться авиакомпанией Берляфлот.

Недавно в Берляндии начала работать новая авиакомпания S8 Airlines. Эта авиакомпания совершает двусторонние рейсы между всеми парами городов, между которыми нет рейсов Берляфлота. Таким образом, между каждой парой городов есть рейс либо Берляфлота, либо S8 Airlines.

Стоимости рейсов авиакомпании S8 Airlines рассчитываются следующим образом: для каждой пары городов \(x\) и \(y\), между которыми выполняется рейс S8 Airlines, стоимость этого рейса равняется минимальной стоимости маршрута между городами \(x\) и \(y\) у Берляфлота в соответствии с описанным ранее ценообразованием.

Известно, что с помощью рейсов S8 Airlines можно добраться от любого города до любого другого с возможными пересадками, и, аналогично Берляфлоту, стоимость маршрута между любыми двумя городами стыковочными рейсами S8 Airlines равна стоимости самого дорогого рейса в этом маршруте.

Из-за увеличившейся конкуренции с S8 Airlines Берляфлот решил провести авиареформу и изменить стоимости своих рейсов. А именно, для \(i\)-го своего рейса между городами \(a_i\) и \(b_i\) Берляфлот хочет сделать стоимость этого рейса равной минимальной стоимости маршрута между городами \(a_i\) и \(b_i\) у авиакомпании S8 Airlines. Помогите менеджерам Берляфлота рассчитать новые стоимости рейсов.

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

Каждый тест состоит из нескольких наборов входных данных. В первой строке вводятся одно целое число \(t\) (\(1 \le t \le 10\,000\)) — число наборов входных данных. Далее следуют описания наборов входных данных.

В первой строке каждого набора входных данных водятся два целых числа \(n\) и \(m\) (\(4 \le n \le 200\,000\), \(n - 1 \le m \le 200\,000\), \(m \le \frac{(n - 1) (n - 2)}{2}\)) — число городов в Берляндии и число рейсов у Берляфлота.

В следующих \(m\) строках описываются рейсы Берляфлота. В \(i\)-й строке даны три целых числа \(a_i\), \(b_i\) и \(c_i\) (\(1 \le a_i, b_i \le n\), \(1 \le c_i \le 10^9\)) — номера городов, которые соединены \(i\)-м рейсом Берляфлота, и стоимость \(i\)-го рейса Берляфлота.

Гарантируется, что никакой рейс не соединяет город сам с собой, а никакие 2 рейса не соединяют одну и ту же пару городов. Гарантируется, что рейсами Берляфлота можно добраться от любого города до любого другого и что рейсами S8 Airlines можно добраться от любого города до любого другого.

Обозначим за \(N\) сумму значений \(n\) по всем наборам входных данных, и за \(M\) — сумму значений \(m\) по всем наборам входных данных. Гарантируется, что \(N, M \le 200\,000\).

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

Для каждого набора входных данных в отдельной строке выведите \(m\) целых чисел, \(i\)-е из которых должно быть равно стоимости \(i\)-го рейса Берляфлота после авиареформы.

Примечание

В примере в первом наборе входных данных авиакомпания S8 Airlines будет выполнять рейсы между парами городов: \((1, 3)\), \((1, 4)\) и \((2, 4)\).

Стоимость рейса между городами \(1\) и \(3\) будет равна \(2\), так как минимальная стоимость маршрута Берляфлота равна \(2\) — маршрут состоит из рейса между городами \(1\) и \(2\) стоимостью \(1\) и рейса между городами \(2\) и \(3\) стоимостью \(2\), максимум из стоимостей равен \(2\).

Стоимость рейса между городами \(1\) и \(4\) будет равна \(3\), так как минимальная стоимость маршрута Берляфлота составляет \(3\) — маршрут состоит из рейса между городами \(1\) и \(2\) стоимостью \(1\), рейса между городами \(2\) и \(3\) стоимостью \(2\) и рейса между городами \(3\) и \(4\) стоимостью \(3\), максимум из стоимостей равен \(3\).

Стоимость рейса между городами \(2\) и \(4\) будет равна \(3\), так как минимальная стоимость маршрута Берляфлота составляет \(3\) — маршрут состоит из рейса между городами \(2\) и \(3\) стоимостью \(2\) и рейса между городами \(3\) и \(4\) стоимостью \(3\), максимум из стоимостей равен \(3\).

После авиареформы стоимость рейса Берляфлота между городами \(1\) и \(2\) будет составлять \(3\), так как минимальная стоимость маршрута S8 Airlines между этими городами составляет \(3\) — маршрут состоит из рейса между городами \(1\) и \(4\) стоимостью \(3\) и рейса между городами \(2\) и \(4\) стоимостью \(3\), максимум равен \(3\).

Стоимость рейса Берляфлота между городами \(2\) и \(3\) будет составлять \(3\), так как минимальная стоимость маршрута S8 Airlines между этими городами составляет \(3\) — маршрут состоит из рейса между городами \(2\) и \(4\) стоимостью \(3\), рейса между городами \(1\) и \(4\) стоимостью \(3\) и рейса между \(1\) и \(3\) стоимостью \(2\), максимум равен \(3\).

Стоимость рейса Берляфлота между городами \(3\) и \(4\) будет составлять \(3\), так как минимальная стоимость маршрута S8 Airlines между этими городами составляет \(3\) — маршрут состоит из рейса между городами \(1\) и \(3\) стоимостью \(2\) и рейса между городами \(1\) и \(4\) стоимостью \(3\), максимум равен \(3\).

Во втором наборе входных данных у авиакомпании S8 Airlines будут следующие рейсы: между городами \(1\) и \(4\) стоимостью \(1\), между городами \(2\) и \(3\) стоимостью \(1\), между городами \(2\) и \(5\) стоимостью \(2\), между городами \(3\) и \(4\) стоимостью \(1\) и между городами \(3\) и \(5\) стоимостью \(2\).

F. Два проспекта

графы поиск в глубину и подобное Структуры данных *3500

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

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

Чтобы снизить поток обычных горожан, перемещающихся по великим проспектам, было решено ввести платный проезд по каждому их них в обе стороны. Теперь за один проезд по проспекту нужно заплатить \(1\) тугрик. За проезд по остальным улицам платить не нужно.

Аналитики собрали выборку из \(k\) горожан, \(i\)-му из них надо ездить на работу от перекрестка \(a_i\) к перекрестку \(b_i\). После выбора двух проспектов каждый горожанин будет добираться на работу вдоль пути, стоимость которого будет минимальна.

Для того чтобы заработать как можно больше денег, было решено выбрать в качестве двух проспектов две такие улицы, что суммарное количество тугриков, которые заплатят эти \(k\) горожан, будет максимально возможным. Помогите королю: по заданной схеме города и выборке горожан найдите, какие две улицы нужно сделать проспектами, и сколько тугриков заплатят горожане при таком выборе.

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

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 10^5\)) — количество наборов входных данных.

В первой строке описания каждого набора входных данных находятся два целых числа \(n\) и \(m\) (\(3 \leq n \leq 500\,000\), \(n - 1 \leq m \leq 500\,000\), \(m \le \frac{n (n - 1)}{2}\)) — количество перекрестков и улиц города.

В следующих \(m\) строках содержатся описания улиц, в \(i\)-й строке находятся два целых числа \(s_i\) и \(f_i\) (\(1 \leq s_i, f_i \leq n\), \(s_i \neq f_i\)) — номера перекрестков, которые соединяет \(i\)-я улица. Гарантируется, что никакие две улицы не соединяют одну и ту же пару перекрестков, и что от любого перекрестка можно добраться до любого другого, перемещаясь только по улицам.

В следующей строке находится единственное целое число \(k\) (\(1 \leq k \leq 500\,000\)) — количество горожан в выборке.

В следующих \(k\) строках содержатся описания горожан, в \(i\)-й строке находятся два целых числа \(a_i\) и \(b_i\) (\(1 \leq a_i, b_i \leq n\), \(a_i \neq b_i\)) — \(i\)-й горожанин едет на работу от перекрестка \(a_i\) до перекрестка \(b_i\).

Пусть \(M\) обозначает сумму значений \(m\) по всем наборам входных данных, а \(K\) означает сумму значений \(k\) по всем наборам входных данных. Гарантируется, что \(M, K \le 500\,000\).

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

Для каждого набора входных данных в выведите ответ на задачу.

В первой строке ответа данных выведите суммарное количество тугриков, которое заплатят горожане.

Во второй строке ответа выведите два целых числа \(x_1\) и \(y_1\) — номера перекрёстков, дорогу между которыми нужно сделать первым проспектом.

В третей строке ответа выведите два целых числа \(x_2\) и \(y_2\) — номера перекрёстков, дорогу между которыми нужно сделать вторым проспектом.

Номера перекрестков, соединенных улицей, можно выводить в произвольном порядке, каждая из двух выведенных улиц должна встречаться среди \(m\) улиц города, выбранные улицы должны быть различными.

E. Совместимые числа

битмаски дп Перебор поиск в глубину и подобное *2200

Два целых числа x и y называются совместимыми, если результат их побитового «И» равен нулю, то есть a & b = 0. Например, числа 90 (10110102) и 36 (1001002) совместимы, так как 10110102 & 1001002 = 02, а числа 3 (112) и 6 (1102) несовместимы, так как 112 & 1102 = 102.

Вам дан массив целых чисел a1, a2, ..., an. Требуется определить для каждого элемента массива, совместим ли этот элемент с каким-либо другим элементом из данного массива. В случае положительного ответа также требуется найти любой подходящей элемент.

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

В первой строке записано целое число n (1 ≤ n ≤ 106) — количество элементов в данном массиве. Во второй строке через пробел записаны n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 4·106) — элементы данного массива. Числа в массиве могут повторяться.

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

Выведите n целых чисел ansi. Если ai не совместимо ни с каким другим элементом данного массива a1, a2, ..., an, то ansi должно быть равно -1. Иначе ansi — любое такое число, что ai & ansi = 0, и при этом ansi содержится в массиве a1, a2, ..., an.

G. Подсчёт коротких путей

графы дп кратчайшие пути поиск в глубину и подобное Структуры данных *2100

Задан неориентированный связный граф, состоящий из \(n\) вершин и \(m\) ребер. Граф не содержит петель (рёбер из вершины в себя же) и кратных ребер (то есть между каждой парой вершин не более одного ребра). Вершины графа пронумерованы от \(1\) до \(n\).

Найдите количество путей из вершины \(s\) в \(t\), длина которых отличается от длины кратчайшего пути из \(s\) в \(t\) не более, чем на \(1\). Необходимо учесть все подходящие пути, даже если они проходят по одной и той же вершине или ребру более одного раза (то есть, не являются простыми).

Граф, состоящий из \(6\) вершин и \(8\) ребер.

Например, пусть \(n = 6\), \(m = 8\), \(s = 6\) и \(t = 1\), а граф выглядит как на рисунке выше. Тогда длина кратчайшего пути из \(s\) в \(t\) равна \(1\). Рассмотрим все пути, длина которых не более \(1 + 1 = 2\).

  • \(6 \rightarrow 1\). Длина пути равна \(1\).
  • \(6 \rightarrow 4 \rightarrow 1\). Длина пути равна \(2\).
  • \(6 \rightarrow 2 \rightarrow 1\). Длина пути равна \(2\).
  • \(6 \rightarrow 5 \rightarrow 1\). Длина пути равна \(2\).

Всего существует \(4\) подходящих пути.

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

В первой строке входных данных задано число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Перед каждым набором входных данных записана пустая строка.

Первая строка набора содержит два числа \(n, m\) (\(2 \le n \le 2 \cdot 10^5\), \(1 \le m \le 2 \cdot 10^5\)) — количество вершин и ребер в графе.

Вторая строка содержит два числа \(s\) и \(t\) (\(1 \le s, t \le n\), \(s \neq t\)) — номера начальной и конечной вершины пути.

В следующих \(m\) строках содержатся описания ребер: в \(i\)-й строке заданы два целых числа \(u_i\), \(v_i\) (\(1 \le u_i,v_i \le n\)) — номера вершин, которые соединяют \(i\)-е ребро. Гарантируется, что граф является связным и не содержит петель и кратных рёбер.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных теста не превосходит \(2 \cdot 10^5\). Аналогично, гарантируется, что сумма значений \(m\) по всем наборам входных данных теста не превосходит \(2 \cdot 10^5\).

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

Для каждого тестового случая выведите единственное число — количество путей из \(s\) в \(t\) таких, что их длина отличается от длины кратчайшего пути не более, чем на \(1\).

Так как это число может быть слишком большим, выведите его по модулю \(10^9 + 7\).

D. Ближайшие точки

Бинарный поиск графы кратчайшие пути поиск в глубину и подобное Структуры данных *1900

Вам даны \(n\) различных точек на плоскости. Координаты \(i\)-й из них — \((x_i, y_i)\).

Для каждой точки \(i\) вам необходимо найти ближайшую (по Манхэттенскому расстоянию) точку с целочисленными координатами, которая не принадлежит множеству заданных \(n\) точек. Если существует несколько таких точек, вы можете выбрать любую из них.

Манхэттенское расстояние между двумя точками \((x_1, y_1)\) и \((x_2, y_2)\) равно \(|x_1 - x_2| + |y_1 - y_2|\).

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

Первая строка входных данных содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество точек в множестве.

Следующие \(n\) строк описывают точки. В \(i\)-й из них находится два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le 2 \cdot 10^5\)) — координаты \(i\)-й точки.

Гарантируется, что все точки во входных данных различны.

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

Выведите \(n\) строк. В \(i\)-й из них выведите точку с целочисленными координатами, не принадлежащую заданным \(n\) точкам, и являющуюся ближайшей (по Манхэттенскому расстоянию) к \(i\)-й точке из входных данных.

Выводимые координаты должны находиться в отрезке \([-10^6; 10^6]\). Можно показать, что любой оптимальный ответ удовлетворяет заданным ограничениям.

Если существует несколько возможных ответов, вы можете вывести любой из них.

E. Сумма паросочетаний

жадные алгоритмы Комбинаторика Конструктив математика Паросочетания Перебор поиск в глубину и подобное *2600

Обозначим размер максимального паросочетания в графе \(G\) как \(\mathit{MM}(G)\).

Задан двудольный граф. Вершины первой доли пронумерованы от \(1\) до \(n\). Вершины второй доли пронумерованы от \(n+1\) до \(2n\). Степень каждой вершины равна \(2\).

Для четверки целых чисел \((l, r, L, R)\), где \(1 \le l \le r \le n\) и \(n+1 \le L \le R \le 2n\), определим \(G'(l, r, L, R)\) как граф, который состоит из всех вершин заданного графа, которые находятся либо в отрезке \([l, r]\), либо в отрезке \([L, R]\), и всех ребер заданного графа таких, что вершины их концов принадлежат одному из этих отрезков. Другими словами, чтобы получить граф \(G'(l, r, L, R)\) из изначального графа, надо удалить все вершины \(i\) такие, что \(i \notin [l, r]\) и \(i \notin [L, R]\), и все инцидентные им ребра.

Посчитайте сумму \(\mathit{MM}(G(l, r, L, R))\) по всем наборам целых чисел \((l, r, L, R)\) таких, что \(1 \le l \le r \le n\) and \(n+1 \le L \le R \le 2n\).

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

В первой строке записано одно целое число \(n\) (\(2 \le n \le 1500\)) — количество вершин в каждой доле.

Затем следует \(2n\) строке, в каждой записано ребро графа. В \(i\)-й строке записано два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i \le n\); \(n + 1 \le y_i \le 2n\)) — концы \(i\)-го ребра.

В графе нет кратных ребер, и у каждой вершины ровно два инцидентных ребра.

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

Выведите одно целое число — сумму \(\mathit{MM}(G(l, r, L, R))\) по всем наборам целых чисел \((l, r, L, R)\), у которых \(1 \le l \le r \le n\) и \(n+1 \le L \le R \le 2n\).

E. Одинаковые суммы деревьев

Деревья Конструктив математика поиск в глубину и подобное *2200

Вам дано неориентированное некорневое дерево — связный неориентированный граф без циклов.

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

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

Входные данные состоят из нескольких наборов входных данных. В первой строке записано единственное целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следуют описания наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(3 \leq n \leq 10^5\)) — количество вершин дерева.

Следующие \(n-1\) строк каждого случая содержат по два целых числа \(u, v\) (\(1 \leq u,v \leq n\)), обозначающих наличие ребра между вершинами \(u\) и \(v\). Гарантируется, что заданные ребра образуют дерево.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^5\).

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

Для каждого набора входных данных необходимо вывести одну строку с \(n\) целыми числами \(a_1, a_2, \ldots, a_n\), разделенными пробелами, где \(a_i\) — вес, присвоенный вершине \(i\). Веса должны удовлетворять \(-10^5 \leq a_i \leq 10^5\) и \(a_i \neq 0\).

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

Примечание

В первом случае при удалении вершины \(1\) все оставшиеся компоненты связности имеют сумму весов \(5\), а при удалении вершины \(3\) все оставшиеся компоненты связности имеют сумму весов \(2\). При удалении других вершин остается только одна компонента связности, поэтому все оставшиеся компоненты связности имеют одинаковую сумму весов.

F. Слова на дереве

2-sat графы Деревья поиск в глубину и подобное снм *2600

Дано дерево из \(n\) вершин, а также \(q\) троек \((x_i, y_i, s_i)\), где \(x_i\) и \(y_i\) — целые числа от \(1\) до \(n\), а \(s_i\) — строка, длина которой равна количеству вершин на простом пути от \(x_i\) до \(y_i\).

Вы должны написать на каждой вершине строчную латинскую букву таким образом, что для каждой из \(q\) троек выполняется хотя бы одно из условий:

  • если выписать буквы на пути от \(x_i\) до \(y_i\) в том порядке, в котором они встречаются на пути, вы получите строку \(s_i\);
  • если выписать буквы на пути от \(y_i\) до \(x_i\) в том порядке, в котором они встречаются на пути, вы получите строку \(s_i\).

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

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

В первой строке заданы два целых числа \(n\) и \(q\) (\(2 \le n \le 4 \cdot 10^5\); \(1 \le q \le 4 \cdot 10^5\)) — количество вершин в дереве и троек, соответственно.

Затем следуют \(n - 1\) строк; в \(i\)-й из них заданы два целых числа \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\); \(u_i \ne v_i\)) — концы \(i\)-го ребра. Эти ребра задают дерево.

Затем следуют \(q\) строк; в \(j\)-й из них заданы два целых числа \(x_j\) и \(y_j\), а также строка \(s_j\), состоящая из строчных латинских букв. Длина \(s_j\) равна количеству вершин на простом пути между \(x_j\) и \(y_j\).

Дополнительное ограничение на входные данные: \(\sum \limits_{j=1}^{q} |s_j| \le 4 \cdot 10^5\).

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

Если нет способа удовлетворить ограничения задачи, выведите NO. Иначе выведите YES в первой строке и \(n\) строчных латинских букв во второй строке; \(i\)-я буква должна соответствовать той букве, которую вы пишете на \(i\)-й вершине. Если ответов несколько, выведите любой из них.

E. AND-MEX-прогулка

битмаски графы Конструктив Перебор поиск в глубину и подобное снм *2200

Вам дан неориентированный связный граф из \(n\) вершин и \(m\) взвешенных ребер. Прогулкой от вершины \(u\) до вершины \(v\) называется последовательность вершин \(p_1,p_2,\ldots,p_k\) (не обязательно различных), начинающаяся в вершине \(u\) и заканчивающаяся в вершине \(v\), такая что \(p_i\) и \(p_{i+1}\) соединены ребром для всех \(1 \leq i < k\).

Определим длину прогулки следующим образом: выпишем веса ребер в порядке следования в массив. Затем выпишем побитовое И каждого непустого префикса этого массива. Длиной прогулки называется MEX этих значений.

Более формально, пусть веса ребер это \([w_1,w_2,\ldots,w_{k-1}]\), где \(w_i\) — вес ребра между \(p_i\) и \(p_{i+1}\). Тогда длина прогулки равна \(\mathrm{MEX}(\{w_1,\,w_1\& w_2,\,\ldots,\,w_1\& w_2\& \ldots\& w_{k-1}\})\), где \(\&\) обозначает операцию побитового И.

Вы должны обработать \(q\) запросов вида u v. Для каждого запроса найдите минимально возможную длину пути из \(u\) в \(v\).

MEX (минимальное отсутствующее) множества чисел — наименьшее неотрицательное число, отсутствующее в этом множестве. Например:

  • MEX множества \(\{2,1\}\) равен \(0\), т. к. \(0\) отсутствует в множестве.
  • MEX множества \(\{3,1,0\}\) равен \(2\), т. к. \(0\) и \(1\) присутствуют в множестве, а \(2\) — нет.
  • MEX множества \(\{0,3,1,2\}\) равен \(4\), т. к. \(0\), \(1\), \(2\) и \(3\) присутствуют в множестве, а \(4\) отсутствует.
Входные данные

Первая строка содержит два целых числа \(n\) и \(m\) (\(2 \leq n \leq 10^5\); \(n-1 \leq m \leq \min{\left(\frac{n(n-1)}{2},10^5\right)}\)).

Каждая из следующих \(m\) строк содержит три целых числа \(a\), \(b\) и \(w\) (\(1 \leq a, b \leq n\), \(a \neq b\); \(0 \leq w < 2^{30}\)), обозначающих неориентированное ребро между вершинами \(a\) и \(b\) веса \(w\). Гарантируется, что не существует петель и кратных ребер, а также что граф связный.

Следующая строка содержит одно целое число \(q\) (\(1 \leq q \leq 10^5\)).

Каждая из следующих \(q\) строк содержит два целых числа \(u\) и \(v\) (\(1 \leq u, v \leq n\), \(u \neq v\)) — описание запроса.

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

Для каждого запроса выведите одно целое число — ответ на запрос.

Примечание

Ниже находится пояснение к первому примеру.

Граф из первого примера.

Идна из возможных прогулок в первом запросе:

\(\)1 \overset{5}{\rightarrow} 3 \overset{3}{\rightarrow} 2 \overset{1}{\rightarrow} 1 \overset{5}{\rightarrow} 3 \overset{1}{\rightarrow} 4 \overset{2}{\rightarrow} 5.\(\)

Массив весов равен \(w=[5,3,1,5,1,2]\). Если мы возьмем побитовое И для всех префиксов, мы получим множество \(\{5,1,0\}\). MEX этого множества равен \(2\). Нельзя получить прогулку меньшей длины.

F. Игра с деревом и перестановкой

графы Деревья игры поиск в глубину и подобное *3000

Есть дерево из \(n\) вершин и перестановка \(p\) из \(n\) чисел. В вершине \(x\) дерева находится фишка.

Алиса и Боб играют в игру. Алиса управляет перестановкой \(p\), а Bob управляет фишкой на дереве. В свой ход Алиса обязана выбрать два различных числа \(u\) и \(v\) (не индексы; \(u \neq v\)) такие, что фишка не находится ни в вершине \(u\), ни в вершине \(v\) дерева, и поменять их местами в перестановке \(p\). В свой ход Боб обязан передвинуть фишку в соседнюю с текущей вершину.

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

По данному дереву, перестановке \(p\) и вершине \(x\), в которой изначально находится фишка, определите победителя игры.

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

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следуют описания наборов входных данных.

Первая строка содержит два целых числа \(n\) и \(x\) (\(3 \leq n \leq 2 \cdot 10^5\); \(1 \leq x \leq n\)).

Каждая из следующих \(n-1\) строк содержит два целых числа \(a\) и \(b\) (\(1 \le a, b \le n\), \(a \neq b\)), обозначающих неориентированное ребро между вершинами \(a\) и \(b\). Гарантируется, что данные ребра образуют дерево.

Следующая строка содержит \(n\) целых чисел \(p_1, p_2, \ldots, p_n\) (\(1 \le p_i \le n\)) — перестановка \(p\).

Сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

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

Для каждого набора входных данных выведите одну строку, содержащую слово Alice или Bob — победителя игры. В ответе важен регистр букв.

Примечание

Ниже находится объяснение первого примера.

В первом наборе входных данных Алиса может выиграть. Например, возможна такая последовательность ходов:

  1. Алиса меняет местами \(5\) и \(6\), получается \([2,1,3,5,4,6]\).
  2. Боб передвигает фишку в вершину \(5\).
  3. Алиса меняет местами \(1\) и \(2\), получается \([1,2,3,5,4,6]\).
  4. Боб передвигает фишку в вершину \(3\).
  5. Алиса меняет местами \(4\) и \(5\), получается \([1,2,3,4,5,6]\) и выигрывает.

Во втором наборе входных данных Алиса не может выиграть, так как Боб может бесконечно долго затягивать игру. Например, возможна такая последовательность ходов:

  1. Алиса меняет местами \(1\) и \(3\), получается \([3,1,2]\).
  2. Боб передвигает фишку в вершину \(1\).
  3. Алиса меняет местами \(2\) и \(3\), получается \([2,1,3]\).
  4. Боб передвигает фишку в вершину \(2\).
  5. Алиса меняет местами \(1\) и \(3\), получается \([2,3,1]\).
  6. Боб передвигает фишку в вершину \(3\).
  7. Алиса меняет местами \(1\) и \(2\), получается \([1,3,2]\).
  8. Боб передвигает фишку в вершину \(2\).
И далее последовательность бесконечно повторяется.

В третьем наборе Алиса выигрывает сразу, так перестановка уже отсортирована.

B. Получение нуля

битмаски графы дп жадные алгоритмы кратчайшие пути Перебор поиск в глубину и подобное *1300

Предположим, у вас есть целое число \(v\). За одну операцию вы можете:

  • либо присвоить \(v = (v + 1) \bmod 32768\)
  • либо присвоить \(v = (2 \cdot v) \bmod 32768\).

Вам заданы \(n\) целых чисел \(a_1, a_2, \dots, a_n\). Какое минимальное количество операций необходимо, чтобы сделать каждое \(a_i\) равным \(0\)?

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

В первой строке задано одно целое число \(n\) (\(1 \le n \le 32768\)) — количество чисел.

Во второй строке заданы \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i < 32768\)).

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

Выведите \(n\) чисел: \(i\)-е число должно равняться минимальному количеству операций, чтобы сделать \(a_i\) равным \(0\).

Примечание

Рассмотрим каждый \(a_i\):

  • \(a_1 = 19\). Вы можете, сначала, увеличить его на единицу и получить \(20\), а потом умножить его на два \(13\) раз. Вы получите \(0\) за \(1 + 13 = 14\) шагов.
  • \(a_2 = 32764\). Вы можете увеличить число на единицу \(4\) раза: \(32764 \rightarrow 32765 \rightarrow 32766 \rightarrow 32767 \rightarrow 0\).
  • \(a_3 = 10240\). Вы можете умножить его на два \(4\) раза: \(10240 \rightarrow 20480 \rightarrow 8192 \rightarrow 16384 \rightarrow 0\).
  • \(a_4 = 49\). Вы можете умножить его на два \(15\) раз.

F. Antennas

графы графы кратчайшие пути кратчайшие пути поиск в глубину и подобное реализация реализация Структуры данных

There are \(n\) equidistant antennas on a line, numbered from \(1\) to \(n\). Each antenna has a power rating, the power of the \(i\)-th antenna is \(p_i\).

The \(i\)-th and the \(j\)-th antenna can communicate directly if and only if their distance is at most the minimum of their powers, i.e., \(|i-j| \leq \min(p_i, p_j)\). Sending a message directly between two such antennas takes \(1\) second.

What is the minimum amount of time necessary to send a message from antenna \(a\) to antenna \(b\), possibly using other antennas as relays?

Input

Each test contains multiple test cases. The first line contains an integer \(t\) (\(1\le t\le 100\,000\)) — the number of test cases. The descriptions of the \(t\) test cases follow.

The first line of each test case contains three integers \(n\), \(a\), \(b\) (\(1 \leq a, b \leq n \leq 200\,000\)) — the number of antennas, and the origin and target antenna.

The second line contains \(n\) integers \(p_1, p_2, \dots, p_n\) (\(1 \leq p_i \leq n\)) — the powers of the antennas.

The sum of the values of \(n\) over all test cases does not exceed \(200\,000\).

Output

For each test case, print the number of seconds needed to trasmit a message from \(a\) to \(b\). It can be shown that under the problem constraints, it is always possible to send such a message.

Note

In the first test case, we must send a message from antenna \(2\) to antenna \(9\). A sequence of communications requiring \(4\) seconds, which is the minimum possible amount of time, is the following:

  • In \(1\) second we send the message from antenna \(2\) to antenna \(1\). This is possible since \(|2-1|\le \min(1, 4) = \min(p_2, p_1)\).
  • In \(1\) second we send the message from antenna \(1\) to antenna \(5\). This is possible since \(|1-5|\le \min(4, 5) = \min(p_1, p_5)\).
  • In \(1\) second we send the message from antenna \(5\) to antenna \(10\). This is possible since \(|5-10|\le \min(5, 5) = \min(p_5, p_{10})\).
  • In \(1\) second we send the message from antenna \(10\) to antenna \(9\). This is possible since \(|10-9|\le \min(5, 1) = \min(p_{10}, p_9)\).

O. Circular Maze

графы Перебор поиск в глубину и подобное реализация

You are given a circular maze such as the ones shown in the figures.

Determine if it can be solved, i.e., if there is a path which goes from the center to the outside of the maze which does not touch any wall. The maze is described by \(n\) walls. Each wall can be either circular or straight.
  • Circular walls are described by a radius \(r\), the distance from the center, and two angles \(\theta_1, \theta_2\) describing the beginning and the end of the wall in the clockwise direction. Notice that swapping the two angles changes the wall.
  • Straight walls are described by an angle \(\theta\), the direction of the wall, and two radii \(r_1 < r_2\) describing the beginning and the end of the wall.

Angles are measured in degrees; the angle \(0\) corresponds to the upward pointing direction; and angles increase clockwise (hence the east direction corresponds to the angle \(90\)).

Input

Each test contains multiple test cases. The first line contains an integer \(t\) (\(1\le t\le 20\)) — the number of test cases. The descriptions of the \(t\) test cases follow.

The first line of each test case contains an integer \(n\) (\(1 \leq n \leq 5000\)) — the number of walls.

Each of the following \(n\) lines each contains a character (C for circular, and S for straight) and three integers:

  • either \(r, \theta_1, \theta_2\) (\(1 \leq r \leq 20\) and \(0 \leq \theta_1,\theta_2 < 360\) with \(\theta_1 \neq \theta_2\)) if the wall is circular,
  • or \(r_1\), \(r_2\) and \(\theta\) (\(1 \leq r_1 < r_2 \leq 20\) and \(0 \leq \theta < 360\)) if the wall is straight.

It is guaranteed that circular walls do not overlap (but two circular walls may intersect at one or two points), and that straight walls do not overlap (but two straight walls may intersect at one point). However, circular and straight walls can intersect arbitrarily.

Output

For each test case, print YES if the maze can be solved and NO otherwise.

Note

The two sample test cases correspond to the two mazes in the picture.

D. Удаление рёбер

Деревья дп Конструктив поиск в глубину и подобное *2900

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

Удалите все ребра или установите, что это невозможно. Если существует несколько решений, выведите любое из них.

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

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следует их описание.

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

Далее следуют \(n-1\) строка. \(i\)-я из них содержит два целых числа \(u_i\), \(v_i\) (\(1 \le u_i,v_i \le n\)) — концы \(i\)-го ребра. Гарантируется, что описанный граф является деревом.

Также гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

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

Для каждого набора входных данных выведите «NO», если невозможно удалить все ребра.

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

Примечание

Пример \(1\): можно удалить данное ребро, поскольку оно не смежно никакому ребру.

Пример \(2\): оба ребра смежны ровно одному ребру, поэтому невозможно удалить ни одно из них. Таким образом, ответ «NO».

Пример \(3\): ребро \(2-3\) смежно двум другим ребрам, поэтому его можно удалить. После этого также становится возможным удалить оставшиеся ребра.

G. Падение

поиск в глубину и подобное реализация *1200

Дана матрица из \(n\) строк и \(m\) столбцов, каждая ячейка которой имеет один из трех типов:

  • Пустая ячейка (обозначается как «.»).
  • Камень (обозначается как «*»).
  • Препятствие (обозначается как строчная буква латинского алфавита «o»).

Каждый камень начинает падать, пока не окажется на полу (в нижней строке матрицы), в ячейке над препятствием, или в ячейке над другим камнем, который уже закончил падение. (Другими словами, все камни начинают падать и падают, пока под ними пустые ячейки.)

Просимулируйте процесс и выведите состояние матрицы после того, как все камни закончат падать.

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

В первой строке задано целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Далее следуют сами наборы входных данных.

В первой строке каждого набора входных данных заданы два целых числа \(n\) и \(m\) (\(1 \leq n, m \leq 50\)) — количество строк и столбцов в матрице.

Затем следуют \(n\) строк, каждая из которых содержит \(m\) символов. Каждый из этих символов — «.», «*» или «o» (пустая клетка, камень и препятствие соответственно).

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

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

Не обязательно выводить новую строку после каждого набора входных данных; в примерах из условия она выводится для наглядности.

E. Волшебники и пари

графы математика матрицы поиск в глубину и подобное *2900

В некоторой стране живут волшебники. Они любят заключать странные пари.

Два волшебника нарисовали ациклический ориентированный граф с n вершинами и m ребрами (вершины графа пронумерованы от 1 до n). Назовем истоком вершину, в которую не входит ни одного ребра, а стоком — вершину, из которой не выходит ни одного ребра. Заметим, что вершина может быть стоком и истоком одновременно. В графе волшебников количество стоков и истоков совпадает.

Волшебники занумеровали истоки в порядке увеличения номера вершины от 1 до k. Cтоки занумерованы от 1 до k аналогичным способом.

Для заключения пари, они, как настоящие волшебники, применяют заклинание, которое выбирает набор из k путей из всех истоков в стоки, причем так, что никакие два пути не пересекаются по вершинам. В таком случае в каждый сток ведет путь из ровно одного истока. Пусть в i-ый сток ведет путь из ai истока. Тогда назовем пару (i, j) инверсией, если i < j и ai > aj. Если количество инверсий среди всевозможных пар (i, j), таких что (1 ≤ i < j ≤ k), четно, то выиграл первый волшебник (второй отдает ему 1 волшебную монету). Иначе выиграл второй волшебник (он получает 1 волшебную монету от первого).

Наших волшебников охватил безумный азарт, поэтому они выбирали новые пути снова и снова так долго, что в итоге получили ровно по одному разу все возможные наборы путей. Наборы непересекающихся по вершинам путей считаются различными, если существует ребро, принадлежащее какому-то пути одного набора и не принадлежащее никакому пути другого набора. Для проверки своих записей они просят вас посчитать суммарный выигрыш первого игрока на этих наборах путей по модулю простого числа p.

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

В первой строке входного файла записано через пробел три целых числа n, m, p (1 ≤ n ≤ 600, 0 ≤ m ≤ 105, 2 ≤ p ≤ 109 + 7). Гарантируется, что p — простое.

В следующих m строках заданы ребра графа. В каждой строке находится пара целых чисел, разделенных пробелом, ai bi — ребро из вершины ai в вершину bi. Гарантируется, что граф ациклический и что в графе одинаковое число стоков и истоков. Обратите внимание, в графе могут быть кратные ребра.

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

Выведите ответ на задачу — суммарный выигрыш первого игрока по модулю простого числа p. Обратите внимание, что выигрыш может быть отрицательным, но остаток по модулю должен быть неотрицательным (см. пример).

Примечание

В первом примере существует ровно 1 набор путей — . Число инверсий — 0, что является четным числом. Поэтому первый волшебник получает 1 монету.

Во втором примере существует ровно 1 набор путей — . Существует ровно одна инверсия. Поэтому первый получает -1 монету. .

В третьем примере существует два набора путей, которые учитываются с разными знаками.

В четвертом примере наборов путей вообще не существует.

В пятом примере есть три истока — вершины с номерами (2, 3, 5) и три стока — вершины с номерами (1, 2, 4). Для единственного набора путей существует 2 инверсии, то есть их число четно.

C. Где пицца?

графы математика поиск в глубину и подобное реализация снм Структуры данных *1400

Хоссам в попытках найти пиццу наткнулся на две перестановки \(a\) и \(b\) длины \(n\).

Вспомним, что перестановкой называется массив из \(n\) различных чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, а \([1,2,2]\) — не перестановка (\(2\) встречается дважды), и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве есть число \(4\)).

Хоссам позабыл про пиццу и начал играть с этими перестановками. В процессе игры некоторые элементы первой перестановки смешались с элементами второй, но к удивлению Хоссама в итоге получилась тоже перестановка длины \(n\).

Более конкретно, он смешал перестановки, получив массив \(c\) следующим образом.

  • Для всех \(i\) (\(1\le i\le n\)), он сделал \(c_i=a_i\) или \(c_i=b_i\).
  • Массив \(c\) является перестановкой.

Вы знаете две перестановки \(a\) и \(b\) и значения на некоторых позициях в \(c\). Пожалуйста, посчитайте количество различных перестановок \(c\), не противоречащих описанному процессу и известным значениям. Так как ответ может быть большим, выведите его по модулю \(10^9+7\).

Гарантируется, что существует хотя бы одна перестановка \(c\), удовлетворяющая всем ограничениям.

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

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1\le n\le 10^5\)) — длину перестановок.

Следующая строка содержит \(n\) различных чисел \(a_1,a_2,\ldots,a_n\) (\(1\le a_i\le n\)) — первую перестановку.

Следующая строка содержит \(n\) различных чисел \(b_1,b_2,\ldots,b_n\) (\(1\le b_i\le n\)) — вторую перестановку.

Следующая строка содержит \(n\) целых чисел \(d_1,d_2,\ldots,d_n\) (\(d_i\) равно \(0\), \(a_i\), или \(b_i\)) — описание известных значений \(c\). Если \(d_i=0\), то про значение \(c_i\) ничего не известно. Иначе \(c_i=d_i\).

Гарантируется, что существует хотя бы одна перестановка \(c\), удовлетворяющая всем ограничениям.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(5 \cdot 10^5\).

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

Для каждого набора входных данных выведите количество различных перестановок \(c\) по модулю \(10^9+7\).

Примечание

В первом наборе входных данных подходят \(4\) перестановки: \([2,3,1,4,5,6,7]\), \([2,3,1,7,6,5,4]\), \([2,3,1,4,6,5,7]\), \([2,3,1,7,5,6,4]\).

Во втором наборе входных данных подходит только одна перестановка: \([1]\).

В третьем наборе входных данных подходят \(2\) перестановки: \([6,5,2,1,4,3]\), \([6,5,3,1,4,2]\).

В четвертом наборе входных данных подходят \(2\) перестановки: \([1,2,8,7,4,3,6,5]\), \([1,6,4,7,2,3,8,5]\).

В пятом наборе входных данных подходит только одна перестановка: \([1,9,2,3,4,10,8,6,7,5]\).

E. Хемос на дереве

битмаски Деревья Конструктив поиск в глубину и подобное *2200

В последнем региональном соревновании Хемос со своей командой наконец-то отобрались на Финал ICPC, поэтому в честь этого достижения, а также из-за любви к деревьям он предлагает вам эту задачу, одноименную его команде «Hemose 3al shagra» (Хемос на дереве).

Вам дано дерево из \(n\) вершин, где \(n\) — степень \(2\). Вам нужно назначить каждой вершине и каждому ребру целое число из диапазона \([1,2n -1]\) (включительно) так, чтобы все значения были различны.

После назначения вы должны выбрать одну из вершин дерева в качестве корня так, чтобы максимальная стоимость среди всех простых путей от корня до всех вершин или ребер была минимально возможная.

Стоимость пути между двумя вершинами \(u\) и \(v\) или между вершиной \(u\) и ребром \(e\) определяется как побитовое исключающее ИЛИ всех значений вершин и ребер на пути между ними, включая концы (обратите внимание, что в дереве есть только один простой путь между парой вершин или вершиной и ребром).

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

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 5\cdot 10^4\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

Первая строка каждого набора содержит одно целое число \(p\) (\(1 \le p \le 17\)), где \(n\) (количество вершин в дереве) равно \(2^p\).

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

Гарантируется, что данный граф образует дерево.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(3\cdot 10^5\).

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

Для каждого набора входных данных выведите в первой строке выбранный корень.

Во второй строке выведите \(n\) целых чисел, где \(i\)-е число обозначает значение, выбранное для \(i\)-й вершине.

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

Если существует несколько решений, выведите любое из них.

Примечание

Дерево в первом наборе входных данных показано ниже.

Стоимости путей следующие:

  • \(3\);
  • \(3\oplus 7=4\);
  • \(3\oplus 7\oplus 6=2\);
  • \(3\oplus 2=1\);
  • \(3\oplus 2\oplus 1=0\);
  • \(3\oplus 2\oplus 1\oplus 4=4\);
  • \(3\oplus 2\oplus 1\oplus 4\oplus 5=1\).

Максимальная стоимость равна \(4\). Можно показать, что не существует способа расставить числа и выбрать корень так, чтобы получилась меньшая максимальная стоимость.

Дерево для второго набора показано ниже:

F2. Чекер для Перемешивания массива

графы Конструктив поиск в глубину и подобное *2800

У oolimry есть массив \(a\) длины \(n\), который ему очень нравится. Сегодня вы изменили его массив на \(b\), перестановку \(a\), чтобы он расстроился.

Поскольку oolimry всего лишь утка, он может выполнять только следующую операцию для восстановления своего массива:

  • Выбрать два целых числа \(i,j\) таких, что \(1 \leq i,j \leq n\).
  • Поменять местами \(b_i\) и \(b_j\).

Печаль массива \(b\)  — это минимальное количество операций, необходимое для преобразования \(b\) в \(a\).

Для данных массивов \(a\) и \(b\), где \(b\)  — перестановка \(a\), определите, имеет ли \(b\) максимальную печаль среди всех перестановок \(a\).

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

Каждый тест содержит несколько наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\))  — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\))  — длину массива.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq n\))  — элементы массива \(a\).

Третья строка каждого набора входных данных содержит \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) (\(1 \leq b_i \leq n\))  — элементы массива \(b\).

Гарантируется, что \(b\) является перестановкой \(a\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

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

Для каждого набора входных данных выведите «AC» (без кавычек), если \(b\) имеет максимальную печаль среди всех перестановок \(a\), и «WA» (без кавычек) в противном случае.

Примечание

В первом наборе входных данных массив \([1,2]\) имеет печаль \(1\). Мы можем преобразовать \([1,2]\) в \([2,1]\) с помощью одной операции с \((i,j)=(1,2)\).

Во втором наборе входных данных массив \([3,3,2,1]\) имеет печаль \(2\). Мы можем преобразовать \([3,3,2,1]\) в \([1,2,3,3]\) с помощью двух операций с \((i,j)=(1,4)\) и \((i,j)=(2,3)\) соответственно.

В третьем наборе входных данных массив \([2,1]\) имеет печаль \(0\).

В четвертом наборе входных данных массив \([3,2,3,1]\) имеет печаль \(1\).

G. Удали ориентированные ребра

графы дп поиск в глубину и подобное *2000

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

Пусть \(\mathit{in}_v\) будет количеством входящих ребер (степень входа), а \(\mathit{out}_v\) будет количеством исходящих ребер (степень исхода) вершины \(v\).

Требуется удалить некоторые ребра из графа. Пусть новые степени будут \(\mathit{in'}_v\) и \(\mathit{out'}_v\).

Разрешается удалять ребра, только если выполняются следующие условия для каждой вершины \(v\):

  • \(\mathit{in'}_v < \mathit{in}_v\) or \(\mathit{in'}_v = \mathit{in}_v = 0\);
  • \(\mathit{out'}_v < \mathit{out}_v\) or \(\mathit{out'}_v = \mathit{out}_v = 0\).

Назовем множество вершин \(S\) красивым, если для каждой пары вершин \(v\) и \(u\) (\(v \neq u\)), таких, что \(v \in S\) и \(u \in S\), существует путь либо из \(v\) в \(u\), либо из \(u\) в \(v\) по неудаленным ребрам.

Какой максимальный возможный размер красивого множества \(S\) после того, как вы удалите некоторые ребра из графа, а степени входа и исхода всех вершин либо уменьшатся, либо останутся равны \(0\)?

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

В первой строке записаны два целых числа \(n\) и \(m\) (\(1 \le n \le 2 \cdot 10^5\); \(0 \le m \le 2 \cdot 10^5\)) — количество вершин и количество ребер графа.

В каждой из следующих \(m\) строк записаны два целых числа \(v\) и \(u\) (\(1 \le v, u \le n\); \(v \neq u\)) — описание ребра.

Данные ребра образуют корректный ориентированный ацикличный граф. Кратные ребра отсутствуют.

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

Выведите одно целое число — максимальный возможный размер красивого множества \(S\) после того, как вы удалите некоторые ребра из графа, а степени входа и исхода всех вершин либо уменьшатся, либо останутся равны \(0\).

Примечание

В первом примере можно удалить ребра \((1, 2)\) и \((2, 3)\). \(\mathit{in} = [0, 1, 2]\), \(\mathit{out} = [2, 1, 0]\). \(\mathit{in'} = [0, 0, 1]\), \(\mathit{out'} = [1, 0, 0]\). Можно видеть, что для всех \(v\) условия выполняются. Максимальное красивое множество \(S\) образовано вершинами \(1\) и \(3\). Они все еще соединены ребром напрямую, поэтому между ними есть путь.

Во втором примере нет ребер. Так как все \(\mathit{in}_v\) и \(\mathit{out}_v\) равны \(0\), оставить граф с нулем ребер разрешено. Есть \(5\) красивых множеств, в каждом содержится одна вершина. Поэтому максимальный размер множества равен \(1\).

В третьем примере можно удалить ребра \((7, 1)\), \((2, 4)\), \((1, 3)\) и \((6, 2)\). Максимальное красивое множество \(S = \{7, 3, 2\}\). Можно еще удалить ребро \((7, 3)\), и ответ не изменится.

Изображение графа с третьего примера:

F. Влад и отложенные дела

Деревья дп жадные алгоритмы поиск в глубину и подобное *1800

Влад и Настя живут в городе, состоящем из \(n\) домов и \(n-1\) дороги. Из каждого дома можно добраться до другого передвигаясь только по дорогам. То есть город представляет собой дерево.

Влад живёт в доме с номером \(x\), а Настя в доме с номером \(y\). Влад решил пойти к Насте в гости. Однако он вспомнил, что отложил на потом \(k\) дел, которые он должен сделать прежде чем прийти к Насте. Чтобы сделать \(i\)-е дело ему необходимо прийти в \(a_i\)-й дом, дела можно делать в любом порядке. За \(1\) минуту он может пройти от одного дома до другого, если их соединяет дорога.

Влад не очень любит пешие прогулки, поэтому его интересует, какое минимальное количество минут он должен потратить на дорогу, чтобы сделать все дела и после этого прийти к Насте. Дома \(a_1, a_2, \dots, a_k\) он может посетить в любом порядке. Любые Дома он может посещать многократно (если захочет).

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

В первой строке входных данных записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте. Перед каждым набором входных данных в тесте содержится пустая строка.

Первая строка набора входных данных содержит два числа \(n\) и \(k\) (\(1 \le k \le n \le 2\cdot 10^5\)) — количество домов и дел соответственно.

Вторая строка набора входных данных содержит два числа \(x\) и \(y\) (\(1 \le x, y \le n\)) — номера домов, в которых живут Влад и Настя, соответственно.

Третья строка набора входных данных содержит \(k\) целых чисел \(a_1, a_2, \dots, a_k\) (\(1 \le a_i \le n\)) — номера домов, в которые нужно зайти по дороге.

Следующие \(n-1\) строк содержат описание города, по два числа на строку \(v_j\) и \(u_j\) (\(1 \le u_j, v_j \le n\)) — номера домов, которые соединяет дорога \(j\).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных в тесте не превосходит \(2\cdot10^5\).

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

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

Примечание

Дерево и оптимальный путь для первого теста:

\(1 \rightarrow 2 \rightarrow 1 \rightarrow 3\)

Дерево и оптимальный путь для второго теста:

\(3 \rightarrow 1 \rightarrow 3 \rightarrow 5 \rightarrow 2 \rightarrow 5 \rightarrow 6 \rightarrow 5\)

Дерево и оптимальный путь для третьего теста:

\(3 \rightarrow 5 \rightarrow 2\)

G. Чёрно-белые сбалансированные поддеревья

графы Деревья дп поиск в глубину и подобное *1300

Вам дано подвешенное дерево из \(n\) вершин, пронумерованных от \(1\) до \(n\). Корнем является вершина \(1\). Также есть строка \(s\), задающая цвета всех вершин: если \(s_i = \texttt{B}\), то вершина \(i\) чёрная, а если \(s_i = \texttt{W}\), то вершина \(i\) белая.

Поддерево дерева называется сбалансированным, если количество белых вершин поддерева равняется количеству чёрных вершин поддерева. Посчитайте количество сбалансированных поддеревьев.

На картинке дерево при \(n=7\), \(a=[1,1,2,3,3,5]\) и \(s=\texttt{WBBWWBW}\). Поддерево вершины \(3\) сбалансированно.

Дерево — это связный граф без циклов. Подвешенное дерево — это дерево с выбранной вершиной, которую называют корнем. В этой задаче корнем каждого дерева является вершина \(1\).

Дерево описано массивом предков \(a_2, \dots, a_n\), содержащим \(n-1\) число: \(a_i\) — предок вершины с номером \(i\) для всех \(i = 2, \dots, n\). Предок вершины \(u\) это следующая вершина на простом пути от \(u\) к корню. Поддерево вершины \(u\) — это множество всех вершин, которые содержат \(u\) в пути к корню. Например на картинке выше, \(7\) в поддереве у \(3\), потому что простой путь \(7 \to 5 \to 3 \to 1\) проходит через \(3\). Обратите внимание, что сама вершина входит в своё поддерево, и поддеревом корня является всё дерево.

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

Первая строка входных данных содержит число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит число \(n\) (\(2 \le n \le 4000\)) — количество вершин в дереве.

Вторая строка каждого набора содержит \(n-1\) число \(a_2, \dots, a_n\) (\(1 \le a_i < i\)) — родители вершин \(2, \dots, n\).

Третья строка каждого набора содержит строку \(s\) длины \(n\), состоящую из символов \(\texttt{B}\) и \(\texttt{W}\) — раскраска дерева.

Гарантируется, что сумма \(n\) по всем наборам не превосходит \(2 \cdot 10^5\).

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

Для каждого набора входных данных выведите одно число — количество сбалансированных поддеревьев.

Примечание

Первый пример изображён в условии. Только поддеревья вершин \(2\) и \(3\) сбалансированны.

Во втором примере только поддерево вершины \(1\) сбалансированно.

в третьем примере сбалансированны поддеревья вершин \(1\), \(3\), \(5\) и \(7\).

C. Tokitsukaze и две красочные ленты

графы жадные алгоритмы Конструктив поиск в глубину и подобное *1900

У Tokitsukaze есть две красочные ленты. Существует \(n\) различных цветов, пронумерованных от \(1\) до \(n\), и каждый цвет появляется ровно один раз на каждой из двух лент. Обозначим цвет \(i\)-й позиции первой ленты как \(ca_i\), а цвет \(i\)-й позиции второй ленты как \(cb_i\).

Теперь Tokitsukaze хочет выбрать для каждого цвета некоторое целочисленное значение от \(1\) до \(n\), различные для всех цветов. После этого она запишет во все позиции на каждой ленте значение соответствующего цвета. Обозначим число, записанное в \(i\)-й позиции первой ленты как \(numa_i\), а число в \(i\)-й позиции второй ленты как \(numb_i\).

В примере на рисунке выше, если предположить, что красный цвет получит значение \(x\) (\(1 \leq x \leq n\)), то так как он появляется на \(1\)-й позиции первой ленты и на \(3\)-й позиции второй ленты, то \(numa_1=numb_3=x\).

Обратите внимание, что все цвета \(i\) от \(1\) до \(n\) будут иметь различные значения, и один и тот же цвет, встречающийся в обеих лентах, будет иметь одинаковое значение.

После выбора значений цветов красота двух лент рассчитывается как \(\)\sum_{i=1}^{n}|numa_i-numb_i|.\(\)

Пожалуйста, помогите Tokitsukaze найти самую высокую возможную красоту лент.

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

Первая строка содержит единственное положительное целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Дальше следует описание наборов входных данных:

Первая строка содержит единственное целое число \(n\) (\(1\leq n \leq 10^5\)) — количество цветов.

Вторая строка содержит \(n\) целых чисел \(ca_1, ca_2, \ldots, ca_n\) (\(1 \leq ca_i \leq n\)) — цвет каждой позиции первой ленты. Гарантируется, что \(ca\) является перестановкой.

Третья строка содержит \(n\) целых чисел \(cb_1, cb_2, \ldots, cb_n\) (\(1 \leq cb_i \leq n\)) — цвет каждой позиции второй ленты. Гарантируется, что \(cb\) является перестановкой.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^{5}\).

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

Для каждого набора входных данных выведите одно целое число — наибольшую возможную красоту.

Примечание

Оптимальное решение для первого набора входных данных показано на следующем рисунке:

Красота равна \(\left|4-3 \right|+\left|3-5 \right|+\left|2-4 \right|+\left|5-2 \right|+\left|1-6 \right|+\left|6-1 \right|=18\).

Оптимальное решение для второго набора входных данных показано на следующем рисунке:

Красота равна \(\left|2-2 \right|+\left|1-6 \right|+\left|3-3 \right|+\left|6-1 \right|+\left|4-4 \right|+\left|5-5 \right|=10\).

D. Граф? А... А я думал, барон...

Бинарный поиск графы дп поиск в глубину и подобное *1900

Однажды Маша прогуливалась по парку и нашла под деревом граф... Удивлены? Вы думали, что в этой задаче будет логичная обоснованная история? Не дождетесь! Так вот...

У Маши есть ориентированный граф, в \(i\)-й вершине которого записано некоторое целое положительное число \(a_i\). Изначально Маша может положить в некоторую вершину графа монетку. За один ход разрешается переместить монетку, которая сейчас находится в некоторой вершине \(u\), в любую вершину \(v\), такую что в графе существует ориентированное ребро \(u \to v\). Каждый раз, когда монетка оказывается в какой-либо вершине \(i\), Маша записывает в блокнот число \(a_i\) (в частности, когда Маша изначально кладет монетку в некоторую вершину графа, она пишет в блокнот число, записанное в этой вершине). Маша хочет сделать ровно \(k - 1\) ходов таким образом, чтобы максимальное число, записанное ей в блокноте, было как можно меньше.

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

Первая строка содержит три целых числа \(n\), \(m\) и \(k\) (\(1 \le n \le 2 \cdot 10^5\), \(0 \le m \le 2 \cdot 10^5\), \(1 \le k \le 10^{18}\)) — количество вершин и ребер в графе, а также количество ходов, которое хочет сделать Маша, соответственно.

Вторая строка содержит \(n\) целых чисел \(a_i\) (\(1 \le a_i \le 10^9\)) — числа, записанные в вершинах графа.

Каждая из следующих \(m\) строк содержит два целых числа \(u\) и \(v\) (\(1 \le u \ne v \le n\)) — это означает, что в графе существует ребро \(u \to v\).

Гарантируется, что граф не содержит петель и кратных ребер.

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

Выведите одно целое число — минимальное значение максимального числа, которое Маша выписала в блокнот, при оптимальном перемещении монетки.

В случае, если Маше не удастся переместить монетку \(k - 1\) раз, в качестве ответа выведите число \(-1\).

Примечание

На изображении ниже приведен граф, описанный в первых двух примерах.

В первом примере можно выбрать в качестве изначальной вершину \(1\). После этого можно выполнить три хода: \(1 \to 3\), \(3 \to 4\) и \(4 \to 5\). В итоге в блокнот будут записаны числа \(1, 2, 3\) и \(4\).

Во втором примере можно выбрать в качестве изначальной вершину \(2\). После этого можно выполнить \(99\) ходов: \(2 \to 5\), \(5 \to 6\), \(6 \to 2\), \(2 \to 5\), и так далее. В итоге в блокнот будут записаны числа \(10, 4, 5, 10, 4, 5, \ldots, 10, 4, 5, 10\).

В третьем примере на имеющемся графе не удастся выполнить \(4\) хода.

F. Свободное вершинное покрытие

графы Деревья поиск в глубину и подобное разделяй и властвуй снм *2600

Дан простой связный неориентированный граф, состоящий из \(n\) вершин и \(m\) ребер. Вершины пронумерованы от \(1\) до \(n\).

Вершинное покрытие графа — это такой набор вершин, что у каждого ребра есть хотя бы один конец в наборе.

Назовем свободным вершинным покрытием такое вершинное покрытие, что не более одного ребра имеет оба конца в наборе.

Найдите свободное вершинное покрытие графа или сообщите, что его нет. Если существует несколько ответов, то выведите любой из них.

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

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записаны два целых числа \(n\) и \(m\) (\(2 \le n \le 10^6\); \(n - 1 \le m \le \min(10^6, \frac{n \cdot (n - 1)}{2})\)) — количество вершин и количество ребер графа.

В каждой из следующих \(m\) строк записаны два целых числа \(v\) и \(u\) (\(1 \le v, u \le n\); \(v \neq u\)) — описания ребер.

В каждом наборе входных данных граф связный и не содержит кратных ребер. Сумма \(n\) по всем наборам не превосходит \(10^6\). Сумма \(m\) по всем наборам не превосходит \(10^6\).

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

На каждый набор входных данных в первой строке выведите YES, если свободное вершинное покрытие существует и NO, если нет. Если оно существует, то во второй строке выведите бинарную строку \(s\) длины \(n\), где \(s_i = 1\) означает, что \(i\)-я вершина в вершинном покрытии, а \(s_i = 0\) означает, что \(i\)-я вершина не в нем.

Если существует несколько ответов, то выведите любой из них.

Примечание

Здесь изображены графы из первого примера. Вершины в свободном вершинном покрытии помечены красным.

D. Требуемая длина

дп кратчайшие пути Перебор поиск в глубину и подобное хэши *1700

Даны два целых числа, \(n\) и \(x\). Вы можете провести несколько операций с числом \(x\).

Каждая операция заключается в следующем: выбрать любую цифру \(y\), которая встречается в десятичной записи \(x\) хотя бы один раз, и заменить значение \(x\) на \(x \cdot y\).

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

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

В единственной строке заданы два целых числа \(n\) и \(x\) (\(2 \le n \le 19\); \(1 \le x < 10^{n-1}\)).

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

Выведите одно целое число — минимальное количество операций, необходимое, чтобы сделать длину десятичной записи \(x\) (без ведущих нулей) равной \(n\), или \(-1\), если это невозможно.

Примечание

Во втором примере следующая последовательность операций позволяет достичь цели:

  1. умножить \(x\) на \(2\), тогда \(x = 2 \cdot 2 = 4\);
  2. умножить \(x\) на \(4\), тогда \(x = 4 \cdot 4 = 16\);
  3. умножить \(x\) на \(6\), тогда \(x = 16 \cdot 6 = 96\);
  4. умножить \(x\) на \(9\), тогда \(x = 96 \cdot 9 = 864\).

F. Уникальные вхождения

Деревья дп поиск в глубину и подобное разделяй и властвуй снм Структуры данных *2300

Задано дерево, состоящее из \(n\) вершин. На каждом ребре написано целое число.

Пусть \(f(v, u)\) будет равно количеству значений, которые встречаются ровно один раз на ребрах на простом пути между \(v\) и \(u\).

Посчитайте сумму \(f(v, u)\) по всем парам вершин \(v\) и \(u\), для которых \(1 \le v < u \le n\).

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

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

В каждой из следующих \(n-1\) строк записаны три целых числа \(v, u\) и \(x\) (\(1 \le v, u, x \le n\)) — описание ребра: вершины, которое оно соединяет, и значение, написанное на нем.

Заданные ребра образуют дерево.

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

Выведите одно целое число — сумму \(f(v, u)\) по всем парам вершин \(v\) и \(u\) таким, что \(v < u\).

E. Неупорядоченные обмены

графы Деревья жадные алгоритмы Конструктив математика поиск в глубину и подобное сортировки *2700

У Алисы есть перестановка \(p\) чисел от \(1\) до \(n\). Алиса может поменять местами пару \((x, y)\), что означает поменять местами элементы в позициях \(x\) и \(y\) в \(p\) (то есть поменять местами \(p_x\) и \(p_y\)). Алиса недавно изучила свой первый алгоритм сортировки, поэтому она решила отсортировать свою перестановку за минимальное количество возможных обменов. Она записала на листе бумаги все обмены в том порядке, в котором она их выполняла для сортировки перестановки.

Например,

  • \([(2, 3), (1, 3)]\) является правильной последовательностью обменов Алисы для перестановки \(p = [3, 1, 2]\), в то время как \([(1, 3), (2, 3)]\) не является, потому что не сортирует перестановку. Обратите внимание, что мы не можем отсортировать перестановку менее чем за \(2\) обмена.
  • \([(1, 2), (2, 3), (2, 4), (2, 3)]\) не может быть последовательностью обменов Алисы для \(p = [2, 1, 4, 3]\), даже если она сортирует перестановку, потому что \(p\) можно отсортировать за \(2\) обмена, например, используя последовательность \([(4, 3), (1, 2)]\).

К сожалению, Боб переставил местами обмены в последовательности, выписанной Алисой.

Вам дана перестановка Алисы \(p\) и обмены, сделанные Алисой в произвольном порядке. Можете ли вы восстановить правильную последовательность обменов, которая сортирует перестановку \(p\)? Поскольку Алиса написала правильные обмены до того, как Боб их перемешал, гарантируется, что существует некоторый порядок обменов, который сортирует перестановку.

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

Первая строка содержит \(2\) целых числа \(n\) и \(m\) \((2 \le n \le 2 \cdot 10^5, 1 \le m \le n - 1)\)  — размер перестановки и минимальное количество обменов, необходимое для сортировки перестановки.

Следующая строка содержит \(n\) целых чисел \(p_1, p_2, ..., p_n\) (\(1 \le p_i \le n\), все \(p_i\) различны)  — элементы \(p\). Гарантируется, что \(p\) образует перестановку.

Далее следуют \(m\) строк. В \(i\)-й из следующих \(m\) строк содержатся два целых числа \(x_i\) и \(y_i\)  — обозначающих \(i\)-й обмен \((x_i, y_i)\).

Гарантируется, что можно отсортировать \(p\) с этими \(m\) обменами и что нет способа отсортировать \(p\) с менее чем \(m\) обменами.

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

Выведите перестановку \(m\) целых чисел  — правильный порядок обменов, выписанный Алисой, который сортирует перестановку \(p\). Для лучшего понимания обратитесь к объяснению примера.

В случае нескольких возможных ответов выведите любой.

Примечание

В первом примере \(p = [2, 3, 4, 1]\), \(m = 3\) и заданы обмены \([(1, 4), (2, 1), (1, 3)]\).

Существует только один правильный порядок обмена, а именно \([2, 3, 1]\).

  1. Сначала мы выполняем обмен \(2\) из входных данных, т.е. \((2, 1)\), \(p\) становится \([3, 2, 4, 1]\).
  2. Затем мы выполняем обмен \(3\) из входных данных, т.е. \((1, 3)\), \(p\) становится \([4, 2, 3, 1]\).
  3. Наконец, мы выполняем обмен \(1\) из входных данных, т.е. \((1, 4)\) и \(p\) становится \([1, 2, 3, 4]\), что является отсортированным.

Во втором примере \(p = [6, 5, 1, 3, 2, 4]\), \(m = 4\) и заданные обмены \([(3, 1), (2, 5), (6, 3), (6, 4)]\).

Один из возможных правильных порядков обмена  — \([4, 2, 1, 3]\).

  1. Выполните обмен \(4\) из входных данных, т.е. \((6, 4)\), \(p\) становится \([6, 5, 1, 4, 2, 3]\).
  2. Выполните обмен \(2\) из входных данных, т.е. \((2, 5)\), \(p\) становится \([6, 2, 1, 4, 5, 3]\).
  3. Выполните обмен \(1\) из входных данных, т.е. \((3, 1)\), \(p\) становится \([1, 2, 6, 4, 5, 3]\).
  4. Выполните обмен \(3\) из входных данных, т.е. \((6, 3)\) и \(p\) становится \([1, 2, 3, 4, 5, 6]\), что является отсортированным.

Возможны и другие ответы, например, \([1, 2, 4, 3]\).

H. Сложный разрез

Конструктив математика поиск в глубину и подобное разделяй и властвуй *3400

Главный секрет киноиндустрии заключается в том, что известный фильм «Люси» основан на реальных событиях, а в главных ролях была именно Тётя Люсине. Спойлер: в конце фильма Люси(не) превращается в компьютер. Причём компьютер необычный, в нём есть информация про все секреты вселенной, но в виде бинарной строки. Эту бинарную строку вам и нужно расшифровать самым-самым естественным образом.

Дана бинарная строка \(s\). Необходимо разбить её на произвольное количество непересекающихся подстрок так, чтобы сумма двоичных чисел, образованных этими подстроками, была точной степенью двойки, либо сказать, что это невозможно. Каждый символ \(s\) должен принадлежать ровно одной подстроке из разбиения.

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

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

В единственной строке каждого набора входных данных вводится бинарная строка \(s\) (\(1 \le |s| \le 10^6\)).

Гарантируется, что сумма \(|s|\) по всем наборам входных данных не превосходит \(10^6\).

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

Для каждого набора входных данных выведите ответ на задачу следующим образом:

  • Если ответа не существует, выведите \(-1\).
  • Если ответ существует, то сначала выведите число \(k\) — количество подстрок в разбиении. После этого выведите \(k\) непересекающихся подстрок, для \(i\)-й подстроки выведите два целых числа \(l_i, r_i\) (\(1 \le l_i, r_i \le |s|\)) — описание \(i\)-й подстроки.
Если существует несколько возможных разбиений, выведите любое.
Примечание

В первом наборе входных данных невозможно разбить строку так, чтобы получить степень двойки.

Во втором наборе входных данных возможно следующее разбиение:

  • \(011_2 = 3_{10}\),
  • \(0_2 = 0_{10}\),
  • \(1_2 = 1_{10}\),
\(3 + 0 + 1 = 4\), \(4\) является степенью двойки.

D1. Вес перестановки (простая версия)

Конструктив поиск в глубину и подобное снм *2800

Это простая версия задачи. Разница между простой и сложной версиями в том, что в этой версии вы можете вывести любую перестановку с наименьшим весом.

Вам дана перестановка \(p_1, p_2, \ldots, p_n\) целых чисел от \(1\) до \(n\).

Определим вес перестановки \(q_1, q_2, \ldots, q_n\) целых чисел от \(1\) до \(n\) как \(\)|q_1 - p_{q_{2}}| + |q_2 - p_{q_{3}}| + \ldots + |q_{n-1} - p_{q_{n}}| + |q_n - p_{q_{1}}|\(\)

Вы хотите, чтобы ваша перестановка была настолько легкой, насколько это возможно. Найдите любую перестановку \(q\) с наименьшим возможным весом.

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

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 100\))  — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 200\))  — размер перестановки.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(p_1, p_2, \ldots, p_n\) (\(1 \le p_i \le n\), все \(p_i\) различны)  — элементы перестановки.

Сумма \(n\) по всем наборам входных данных не превышает \(400\).

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

Для каждого набора входных данных выведите \(n\) целых чисел \(q_1, q_2, \ldots, q_n\) (\(1 \le q_i \le n\), все \(q_i\) различны)  — одну из перестановок с наименьшим весом.

Примечание

В первом наборе входных данных есть две перестановки длины \(2\): \((1, 2)\) и \((2, 1)\). Перестановка \((1, 2)\) имеет вес \(|1 - p_2| + |2 - p_1| = 0\), а перестановка \((2, 1)\) имеет тот же вес: \(|2 - p_1| + |1 - p_2| = 0\). В этой версии мы можем вывести любую из этих перестановок.

Во втором наборе входных данных вес перестановки \((1, 3, 4, 2)\) равен \(|1 - p_3| + |3 - p_4| + |4 - p_2| + |2 - p_1| = |1 - 1| + |3 - 4| + |4 - 3| + |2 - 2| = 2\). Перестановок с меньшими весами не существует.

В третьем наборе входных данных вес перестановки \((1, 4, 2, 3, 5)\) равен \(|1 - p_4| + |4 - p_2| + |2 - p_3| + |3 - p_5| + |5 - p_1| = |1 - 2| + |4 - 4| + |2 - 3| + |3 - 1| + |5 - 5| = 4\). Перестановок с меньшими весами не существует.

C. Зараженное дерево

Деревья дп поиск в глубину и подобное *1600

Байтландия — прекрасная земля, известная своими красивыми деревьями.

Миша нашел бинарное дерево с \(n\) вершинами, пронумерованными от \(1\) до \(n\). Бинарное дерево — это ациклический связный неориентированный граф, содержащий \(n\) вершин и \(n - 1\) ребер. Каждая вершина имеет степень не больше \(3\), а корнем является вершина с номером \(1\) и имеет степень не больше \(2\).

К сожалению, корень дерева был заражен. Следующий процесс происходит \(n\) раз:

  • Миша либо выбирает еще не зараженную (и не удаленную) вершину и удаляет ее со всеми ребрами, имеющими конец в этой вершине, либо ничего не делает.
  • Затем заражение распространяется на каждую вершину, соединенную ребром с уже зараженной вершиной (все уже зараженные вершины остаются зараженными).

Так как Мише некогда думать, скажите ему, какое максимальное количество вершин он может спасти от заражения (обратите внимание, что удаленные вершины не считаются спасенными).

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

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1\leq t\leq 5000\)) — количество наборов входных данных. Далее следуют наборы входных данных.

В первой строке каждого набора задано одно целое число \(n\) (\(2\leq n\leq 3\cdot 10^5\)) — количество вершин дерева.

В \(i\)-й из следующих \(n-1\) строк набора входных данных задано два числа \(u_i\) и \(v_i\) (\(1 \leq u_i, v_i \leq n\)), обозначающих очередное ребро дерева.

Гарантируется, что граф является бинарным деревом с корнем в вершине \(1\). Также гарантируется, что сумма \(n\) по всем наборам не превышает \(3\cdot 10^5\).

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

Для каждого набора входных данных выведите единственное целое число — ответ на задачу.

Примечание

В первом наборе входных данных единственным возможным действием является удаление вершины \(2\), после чего мы спасли \(0\) вершин.

Во втором наборе входных данных, если мы удалим вершину \(2\), мы сможем спасти вершины \(3\) и \(4\).

E. Бесконечность

битмаски графы Конструктив Перебор поиск в глубину и подобное снм *2500

После окончания университета Влад получил массив \(a_1,a_2,\ldots,a_n\) из \(n\) целых неотрицательных чисел. Он сразу же захотел построить граф, состоящий из \(n\) вершин, пронумерованных \(1, 2,\ldots, n\). Он решил добавлять ребро между \(i\) и \(j\) тогда и только тогда, когда \(a_i \& a_j > 0\), где \(\&\) обозначает операцию побитового И.

Влад также хочет, чтобы такой граф был связным, что, к сожалению, может быть не так. Чтобы удовлетворить свое желание, он может выполнять следующие два типа операций над массивом:

  • Выбрать некоторый элемент \(a_i\) и увеличить его на \(1\).
  • Выбрать некоторый элемент \(a_i\) и уменьшить его на \(1\) (разрешено, только если \(a_i > 0\)).

Можно доказать, что существует конечная последовательность таких операций, при которой граф станет связным. Не могли бы вы помочь Владу найти минимально возможное количество операций для этого, а также предоставить способ, как это сделать?

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

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных. Далее следуют наборы входных данных.

В первой строке каждого набора задано одно целое число \(n\) (\(2\leq n \leq 2000\)).

Во второй строке каждого набора задано \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0\leq a_i < 2^{30}\)) — элементы массива.

Гарантируется, что сумма \(n\) по всем наборам не превышает \(2000\).

Выходные данные

Для каждого набора входных данных выведите в первой строке единственное целое число \(m\)  — минимальное количество операций. Во второй строке выведите массив после допустимой последовательности операций, которые были выполнены так, что граф из задачи стал связным.

Если решений несколько, выведите любое.

Примечание

В первом наборе входных данных граф уже связен.

Во втором наборе входных данных мы можем дважды увеличить \(0\) и получить массив \([2,2]\). Поскольку \(2 \& 2 = 2 > 0\), граф связен. Можно показать, что одной операции недостаточно.

В третьем наборе входных данных мы можем один раз уменьшить \(12\) и получить массив \([3,11]\). \(3 \& 11 = 3 > 0\), следовательно, граф связен. Необходимо выполнить одну операцию, так как граф вначале не связен.

E. Число групп отрезков

графы жадные алгоритмы поиск в глубину и подобное снм сортировки Структуры данных *2300

Вам дано \(n\) цветных отрезков на числовой оси. Каждый отрезок либо красный, либо синий. Отрезок \(i\) описывается тройкой чисел \((c_i, l_i, r_i)\). Отрезок содержит все точки на отрезке \([l_i, r_i]\), включая концы, а его цвет описывается значением \(c_i\):

  • если \(c_i = 0\), то это красный отрезок;
  • если \(c_i = 1\), то это синий отрезок.

Скажем, что два отрезка различных цветов соединены, если они имеют хотя бы одну общую точку. Два отрезка принадлежат одной группе отрезков, если они соединены непосредственно или через цепочку соединенных непосредственно отрезок. Найдите число различных групп отрезков.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq 10^5\)) — количество отрезков.

Каждая из следующих \(n\) строк содержит три целых числа \(c_i, l_i, r_i\) (\(0 \leq c_i \leq 1, 0 \leq l_i \leq r_i \leq 10^9\)), описывающие \(i\)-й отрезок.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число \(k\) — количество групп отрезков.

Примечание

В первом примере \(5\) отрезков. Отрезки \(1\) и \(2\) соединены, так как они различных цветов и имеют общую точку. Также отрезки \(2\) и \(3\) соединены, и отрезки \(4\) и \(5\) соединены. Таким образом, есть две группы: одна содержит отрезки \(\{1, 2, 3\}\), другая содержит отрезки \(\{4, 5\}\).

F. Дерево и k-подмножества

Деревья дп Комбинаторика математика поиск в глубину и подобное *2500

Вам дано дерево \(G\) из \(n\) вершин, а также целое число \(k\). Вершины дерева пронумерованы от \(1\) до \(n\).

Для некоторой вершины \(r\) и подмножества \(S\) вершин дерева \(G\) такого, что \(|S| = k\), определим \(f(r, S)\) как размер наименьшего корневого поддерева, содержащего все вершины \(S\) при условии, что корнем дерева является вершина \(r\). Множество вершин \(T\) называется корневым поддеревом, если все вершины в \(T\) связны и для любой вершины в \(T\) все ее потомки тоже принадлежат \(T\).

Вам нужно вычислить сумму \(f(r, S)\) по всем различным комбинациям вершины \(r\) и подмножества \(S\), где \(|S| = k\). Формально, вычислите следующее: \(\)\sum_{r \in V} \sum_{S \subseteq V, |S| = k} f(r, S),\(\) где \(V\) — множество вершин дерева \(G\).

Выведите ответ по модулю \(10^9 + 7\).

Входные данные

Первая строка содержит два целых числа \(n\) и \(k\) (\(3 \le n \le 2 \cdot 10^5\), \(1 \le k \le n\)).

Каждая из следующих \(n - 1\) строк содержит два целых числа \(x\) и \(y\) (\(1 \le x, y \le n\)), обозначающих ребро между вершинами \(x\) и \(y\).

Гарантируется, что данные ребра образуют дерево.

Выходные данные

Выведите ответ по модулю \(10^9 + 7\).

Примечание

Дерево во втором примере показано ниже:

Всего в этом дереве \(21\) подмножество вершин размера \(2\). А именно, \(\)S \in \left\{\{1, 2\}, \{1, 3\}, \{1, 4\}, \{1, 5\}, \{1, 6\}, \{1, 7\}, \{2, 3\}, \{2, 4\}, \{2, 5\}, \{2, 6\}, \{2, 7\}, \{3, 4\}, \{3, 5\}, \{3, 6\}, \{3, 7\}, \{4, 5\}, \{4, 6\}, \{4, 7\}, \{5, 6\}, \{5, 7\}, \{6, 7\} \right\}.\(\) Так как в дереве \(7\) вершин, \(1 \le r \le 7\). Нужно найти сумму \(f(r, S)\) по всем парам \(r\) и \(S\).

Ниже перечислены значения \(f(r, S)\) для некоторых комбинаций \(r\) и \(S\).

  • \(r = 1\), \(S = \{3, 7\}\). Значение \(f(r, S)\) равно \(5\), а соответствующее поддерево равно \(\{2, 3, 4, 6, 7\}\).
  • \(r = 1\), \(S = \{5, 4\}\). Значение \(f(r, S)\) равно \(7\), а соответствующее поддерево равно \(\{1, 2, 3, 4, 5, 6, 7\}\).
  • \(r = 1\), \(S = \{4, 6\}\). Значение \(f(r, S)\) равно \(3\), а соответствующее поддерево равно \(\{4, 6, 7\}\).

B. Фейковые пластиковые деревья

Деревья дп жадные алгоритмы поиск в глубину и подобное *1700

Нам дано корневое дерево, состоящее из \(n\) вершин, пронумерованных от \(1\) до \(n\). Корнем дерева является вершина \(1\), а родителем вершины \(v\) является \(p_v\).

В каждой вершине записано число, изначально все числа равны \(0\). Обозначим число, записанное в вершине \(v\), как \(a_v\).

Для каждой \(v\) мы хотим, чтобы \(a_v\) находилось между \(l_v\) и \(r_v\) \((l_v \leq a_v \leq r_v)\).

За одну операцию мы делаем следующее:

  • Выбираем некоторую вершину \(v\). Пусть \(b_1, b_2, \ldots, b_k\)  — вершины на пути от вершины \(1\) до вершины \(v\) (то есть \(b_1 = 1\), \(b_k = v\) и \(b_i = p_{b_{i + 1}}\)).
  • Выберем неубывающий массив \(c\) длины \(k\) из неотрицательных целых чисел: \(0 \leq c_1 \leq c_2 \leq \ldots \leq c_k\).
  • Для каждого \(i\) \((1 \leq i \leq k)\), увеличим \(a_{b_i}\) на \(c_i\).

Какое минимальное количество операций необходимо для достижения нашей цели?

Входные данные

Первая строка содержит целое число \(t\) \((1\le t\le 1000)\)  — количество наборов входных данных. Далее следует описание наборов входных данныхв.

Первая строка каждого набора входных данных содержит одно целое число \(n\) \((2\le n\le 2 \cdot 10^5)\)  — количество вершин в дереве.

Вторая строка каждого набора входных данных содержит \(n - 1\) целых чисел, \(p_2, p_3, \ldots, p_n\) \((1 \leq p_i < i)\), где \(p_i\) обозначает родителя вершины \(i\).

В \(i\)-й из следующих \(n\) строк содержится два целых числа \(l_i\) и \(r_i\) \((1 \le l_i \le r_i \le 10^9)\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите минимально необходимое количество операций.

Примечание

В первом наборе входных данных мы можем достичь цели с помощью одной операции: выбрать \(v = 2\) и \(c = [1, 2]\), в результате чего \(a_1 = 1, a_2 = 2\).

Во втором наборе входных данных мы можем достичь цели с помощью двух операций: сначала выбираем \(v = 2\) и \(c = [3, 3]\), в результате чего \(a_1 = 3, a_2 = 3, a_3 = 0\). Затем выбираем \(v = 3, c = [2, 7]\), в результате \(a_1 = 5, a_2 = 3, a_3 = 7\).

D1. Запросы в дереве (простая версия)

Деревья дп жадные алгоритмы Конструктив Перебор поиск в глубину и подобное *2200

Единственное отличие этой задачи от D2  — ограничение на размер дерева.

Вам дано некорневое дерево с \(n\) вершинами. В этом дереве есть некоторая скрытая вершина \(x\), которую вы пытаетесь найти.

Для этого вы можете задать \(k\) запросов \(v_1, v_2, \ldots, v_k\), где \(v_i\)  — вершины дерева. После того, как вы закончили задавать все запросы, вам дается \(k\) чисел \(d_1, d_2, \ldots, d_k\), где \(d_i\)  — количество ребер на кратчайшем пути между \(v_i\) и \(x\). Обратите внимание, что вы знаете, какое расстояние соответствует какому запросу.

Найдите минимальное \(k\), при котором существуют некоторые запросы \(v_1, v_2, \ldots, v_k\), позволяющие всегда однозначно определить \(x\) (независимо от того, какой \(x\) выбран).

Обратите внимание, что выводить эти запросы не нужно.

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит количество наборов входных данных \(t\) (\(1 \le t \le 100\)). Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 2000\))  — количество вершин в дереве.

Каждая из следующих \(n-1\) строк содержит два целых числа \(x\) и \(y\) (\(1 \le x, y \le n\)), означающие, что между вершинами \(x\) и \(y\) в дереве есть ребро.

Гарантируется, что заданные ребра образуют дерево.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2000\).

Выходные данные

Для каждого набора входных данных выведите в отдельной строке одно целое неотрицательное число  — минимальное количество запросов, которое вам необходимо.

Примечание

В первом наборе входных данных есть только одна вершина, поэтому никаких запросов не требуется.

Во втором наборе входных данных достаточно задать единственный запрос о вершине \(1\). Тогда, если \(x = 1\), вы получите \(0\), в противном случае  — \(1\).

D2. Запросы в дереве (сложная версия)

Деревья дп жадные алгоритмы Конструктив поиск в глубину и подобное *2300

Единственное отличие этой задачи от D1  — ограничение на размер дерева.

Вам дано некорневое дерево с \(n\) вершинами. В этом дереве есть некоторая скрытая вершина \(x\), которую вы пытаетесь найти.

Для этого вы можете задать \(k\) запросов \(v_1, v_2, \ldots, v_k\), где \(v_i\)  — вершины дерева. После того, как вы закончили задавать все запросы, вам дается \(k\) чисел \(d_1, d_2, \ldots, d_k\), где \(d_i\)  — количество ребер на кратчайшем пути между \(v_i\) и \(x\). Обратите внимание, что вы знаете, какое расстояние соответствует какому запросу.

Найдите минимальное \(k\), при котором существуют некоторые запросы \(v_1, v_2, \ldots, v_k\), позволяющие всегда однозначно определить \(x\) (независимо от того, какой \(x\) выбран).

Обратите внимание, что выводить эти запросы не нужно.

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит количество наборов входных данных \(t\) (\(1 \le t \le 10^4\)). Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 2\cdot10^5\))  — количество вершин в дереве.

Каждая из следующих \(n-1\) строк содержит два целых числа \(x\) и \(y\) (\(1 \le x, y \le n\)), означающие, что между вершинами \(x\) и \(y\) в дереве есть ребро.

Гарантируется, что заданные ребра образуют дерево.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2\cdot10^5\).

Выходные данные

Для каждого набора входных данных выведите в отдельной строке одно целое неотрицательное число  — минимальное количество запросов, которое вам необходимо.

Примечание

В первом наборе входных данных есть только одна вершина, поэтому никаких запросов не требуется.

Во втором наборе входных данных достаточно задать единственный запрос о вершине \(1\). Тогда, если \(x = 1\), вы получите \(0\), в противном случае  — \(1\).

E. Неоднозначное домино

графы Конструктив поиск в глубину и подобное *2700

Поликарп и Монокарп решают одну и ту же головоломку с домино. Им дан одинаковый набор из \(n\) доминошек, \(i\)-я из которых содержит два числа \(x_i\) и \(y_i\). Также им обоим дана одинаковая таблица \(m\) на \(k\) с числами \(a_{ij}\) такая, что \(m\cdot k = 2n\).

Задача состоит в том, чтобы разместить \(n\) доминошек на таблице таким образом, чтобы никакие две из них не пересекались, а значения на каждой доминошке совпадали со значениями \(a_{ij}\), которые покрывает доминошка. Домино можно произвольно поворачивать перед размещением на таблице, поэтому домино \((x_i, y_i)\) эквивалентно домино \((y_i, x_i)\).

Они оба решили головоломку и сравнили свои ответы, но заметили, что их решения не только не совпадают, но ни одна из \(n\) доминошек не находится в одном и том же месте в обоих решениях! Формально, если в решении Поликарпа две ячейки были покрыты одной и той же доминошкой, то в решении Монокарпа они были покрыты разными доминошками. На изображении ниже показана одна потенциальная таблица \(a\), а также решения двух игроков.

Поликарп и Монокарп помнят набор домино, с которого они начинали, но они потеряли таблицу \(a\). Помогите им восстановить одну из возможных таблиц \(a\), а также оба их решения, или определите, что такой таблицы не существует.

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 3\cdot 10^5\)).

В \(i\)-й из следующих \(n\) строк содержится два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le 2n\)).

Выходные данные

Если решения нет, выведите одно целое число \(-1\).

В противном случае выведите \(m\) и \(k\), высоту и ширину сетки головоломки, в первой строке вывода. Они должны удовлетворять условию \(m\cdot k = 2n\).

В \(i\)-й из следующих \(m\) строк должно быть \(k\) целых чисел, \(j\)-е из которых \(a_{ij}\).

Следующие \(m\) строк описывают решение Поликарпа. Выведите \(m\) строк по \(k\) символов в каждой. Для каждой ячейки, если она покрыт верхней половиной домино в решении Поликарпа, в ней должна стоять буква «U». Аналогично, если она покрыта нижней, левой или правой половиной домино, она должна содержать «D», «L» или «R», соответственно.

Следующие \(m\) строк должны описывать решение Монокарпа в том же формате, что и решение Поликарпа.

Если ответов несколько, выведите любой из них

Примечание

Дополнительные пустые строки добавляются в вывод для наглядности, но не являются обязательными.

Третий пример соответствует изображению из условия.

F. Восстановление дерева

графы Деревья Конструктив Перебор поиск в глубину и подобное снм *2600

Fishingprince любит деревья. Дерево — это связный неориентированный граф без циклов.

У Fishingprince'а есть дерево на \(n\) вершинах. Его вершины пронумерованы числами от \(1\) до \(n\). Пусть \(d(x,y)\) равно длине кратчайшего расстояния между вершинами \(x\) и \(y\), если считать длину каждого ребра равной \(1\).

К сожалению, Fishingprince потерял своё дерево. Тем не менее какая-то информация о нём сохранилась. А именно, для каждой тройки чисел \(x,y,z\) (\(1\le x<y\le n\), \(1\le z\le n\)) известно, выполнено ли равенство \(d(x,z)=d(y,z)\).

Помогите ему восстановить структуру дерева или сообщите, что дерева, удовлетворяющего всем ограничениям, не существует.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 200\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка набора входных данных содержит целое число \(n\) (\(2\le n\le 100\)) — количество вершин в дереве.

Далее следует \(n-1\) строк. Из этих \(n-1\) строк \(i\)-я строка содержит \(n-i\) последовательностей символов длины \(n\), состоящих из 0 и 1. Если \(k\)-й символ в \(j\)-й последовательности \(i\)-й строки равен 0, то \(d(i,k)\ne d(i+j,k)\); если же \(k\)-й символ в \(j\)-й последовательности \(i\)-й строки равен 1, то \(d(i,k)=d(i+j,k)\).

Гарантируется, что в каждом тесте:

  • есть не более \(2\) наборов входных данных с \(n>50\);
  • есть не более \(5\) наборов входных данных с \(n>20\).
Выходные данные

Для каждого набора входных данных:

  • выведите No, если искомого дерева не существует;
  • иначе в первой строке выведите Yes. Затем выведите \(n-1\) строк. Каждая из них должна содержать два целых числа \(x,y\) (\(1\le x,y\le n\)), означающих ребро между вершинами \(x\) и \(y\) в дереве. Если существуют несколько решений, выведите любое из них.

При выводе Yes и No вы можете выводить каждый символ в любом регистре (верхнем или нижнем).

B. Иерархия

жадные алгоритмы кратчайшие пути поиск в глубину и подобное снм *1500

В фирму Никиты набрали n человек. Теперь ему нужно построить древовидную иерархию отношений «начальник-подчинённый» в этой фирме (то есть у каждого человека, кроме одного, должен быть ровно один начальник). Дано m заявлений вида «человек ai готов стать начальником человека bi за дополнительную плату ci». Для каждого человека известно его значение квалификации qj, и для каждого заявления выполняется условие qai > qbi.

Помогите Никите определить минимальную стоимость создания иерархии, либо выяснить, что это невозможно.

Входные данные

В первой строке входных данных содержится целое число n (1 ≤ n ≤ 1000) — число сотрудников компании. В следующей строке содержится n чисел qj (0 ≤ qj ≤ 106) записанных через пробел — значения квалификации сотрудников. В следующей строке содержится число m (0 ≤ m ≤ 10000) — количество поданных заявлений. Следующие m строк содержат сами заявления, каждое из которых задаётся тремя числами, записанными через пробел: ai, bi и ci (1 ≤ ai, bi ≤ n, 0 ≤ ci ≤ 106). Заявления могут повторяться, то есть один и тот же сотрудник мог предложить стать начальником другому сотруднику за разные цены. Для каждого заявления qai > qbi.

Выходные данные

В единственной строке выходных данных выведите минимальную стоимость создания иерархии или -1, если создать иерархию невозможно.

Примечание

В первом примере один из возможных вариантов составления иерархии — взять заявления под номерами 1, 2 и 4, которые в сумме дадут стоимость 11. Во втором примере составить иерархию невозможно, поэтому ответ -1.

E. Раздели на два набора

графы поиск в глубину и подобное снм *1600

Поликарпу недавно подарили набор из \(n\) (число \(n\) — чётное) костяшек домино. На каждой костяшке написаны два целых числа от \(1\) до \(n\).

Сможет ли он разделить все костяшки на два набора так, чтобы все числа на костяшках каждого набора были различны? Каждая костяшка должна войти ровно в один из двух наборов.

Например, если у него есть \(4\) костяшки: \(\{1, 4\}\), \(\{1, 3\}\), \(\{3, 2\}\) и \(\{4, 2\}\), то Поликарп сможет разделить их на два набора требуемым образом. В первый набор может войти первая и третья костяшка (\(\{1, 4\}\) и \(\{3, 2\}\)), а во второй — вторая и четвёртая (\(\{1, 3\}\) и \(\{4, 2\}\)).

Входные данные

В первой строке записано единственное число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов входных данных.

В первой строке каждого набора входных данных содержится единственное целое чётное число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество костяшек.

В следующих \(n\) строках содержатся пары чисел \(a_i\) и \(b_i\) (\(1 \le a_i, b_i \le n\)), описывающие числа на \(i\)-й костяшке.

Гарантируется, что сумма \(n\) по всем наборам входных данных в тесте не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите:

  • YES, если возможно разделить \(n\) костяшек на два набора так, что числа на костяшках каждого набора различны;
  • NO, если сделать это невозможно.

Вы можете выводить YES и NO в любом регистре (например, строки yEs, yes, Yes и YES будут распознаны как положительный ответ).

Примечание

В первом наборе входных данных костяшки можно разделить так:

  • Первый набор: \([\{1, 2\}, \{4, 3\}]\)
  • Второй набор: \([\{2, 1\}, \{3, 4\}]\)
Иными словами в первый набор берём костяшки с номерами \(1\) и \(2\), а во второй набор берём костяшки с номерами \(3\) и \(4\).

Во втором наборе входных данных как костяшки не раздели на \(2\) набора, хотя бы в одном будут повторяющиеся числа.

G1. Проходимые пути (простая версия)

Деревья поиск в глубину и подобное *1900

Это простая версия задачи. Единственное различие простой и сложной версии в количестве запросов.

Поликарп вырастил дерево из \(n\) вершин. Напоминаем, что деревом из \(n\) вершин называется неориентированный связный граф из \(n\) вершин и \(n-1\) ребра, не содержащий циклов.

Он называет множество вершин проходимым, если существует такой путь в дереве, который проходит через каждую вершину этого множества, не проходя по какому-либо ребру дважды. Путь может посещать другие вершины (не из этого множества).

Иными словами, множество вершин называется проходимым, если существует простой путь, который проходит по всем вершинам этого множества (и, возможно, каким-то другим).

Например для дерева ниже множества \(\{3, 2, 5\}\), \(\{1, 5, 4\}\), \(\{1, 4\}\) проходимы, а \(\{1, 3, 5\}\), \(\{1, 2, 3, 4, 5\}\) — нет.

Поликарп просит вас ответить на \(q\) запросов. Каждый запрос является множеством вершин. Для каждого запроса вам необходимо определить проходимо ли соответствующее множество вершин.

Входные данные

Первая строка входных данных содержит единственное целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество вершин дерева.

Следующие \(n - 1\) строк содержат описание дерева.

Каждая строка содержит два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \ne v\)) — индексы вершин, соединённых ребром.

Далее следует строка с единственным целым числом \(q\) (\(1 \le q \le 5\)) — количество запросов.

Следующие \(2 \cdot q\) строк содержат описания множеств.

Первая строка описания содержит целое число \(k\) (\(1 \le k \le n\)) — размер множества.

Вторая строка описания содержит \(k\) различных целых чисел \(p_1, p_2, \dots, p_k\) (\(1 \le p_i \le n\)) — индексы вершин множества.

Гарантируется, что сумма значений \(k\) по всем запросам не превосходит \(2 \cdot 10^5\).

Выходные данные

Выведите \(q\) строк, каждая из которых содержит ответ на соответствующий запрос. В качестве ответа выведите «YES», если множество проходимо, и «NO» в противном случае.

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

G2. Проходимые пути (сложная версия)

Деревья поиск в глубину и подобное Структуры данных *2000

Это сложная версия задачи. Единственное различие простой и сложной версии в количестве запросов.

Поликарп вырастил дерево из \(n\) вершин. Напоминаем, что деревом из \(n\) вершин называется неориентированный связный граф из \(n\) вершин и \(n-1\) ребра, не содержащий циклов.

Он называет множество вершин проходимым, если существует такой путь в дереве, который проходит через каждую вершину этого множества, не проходя по какому-либо ребру дважды. Путь может посещать другие вершины (не из этого множества).

Иными словами, множество вершин называется проходимым, если существует простой путь, который проходит по всем вершинам этого множества (и, возможно, каким-то другим).

Например для дерева ниже множества \(\{3, 2, 5\}\), \(\{1, 5, 4\}\), \(\{1, 4\}\) проходимы, а \(\{1, 3, 5\}\), \(\{1, 2, 3, 4, 5\}\) — нет.

Поликарп просит вас ответить на \(q\) запросов. Каждый запрос является множеством вершин. Для каждого запроса вам необходимо определить проходимо ли соответствующее множество вершин.

Входные данные

Первая строка входных данных содержит единственное целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество вершин дерева.

Следующие \(n - 1\) строк содержат описание дерева.

Каждая строка содержит два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \ne v\)) — индексы вершин, соединённых ребром.

Далее следует строка с единственным целым числом \(q\) (\(1 \le q \le 10^5\)) — количество запросов.

Следующие \(2 \cdot q\) строк содержат описания множеств.

Первая строка описания содержит целое число \(k\) (\(1 \le k \le n\)) — размер множества.

Вторая строка описания содержит \(k\) различных целых чисел \(p_1, p_2, \dots, p_k\) (\(1 \le p_i \le n\)) — индексы вершин множества.

Гарантируется, что сумма значений \(k\) по всем запросам не превосходит \(2 \cdot 10^5\).

Выходные данные

Выведите \(q\) строк, каждая из которых содержит ответ на соответствующий запрос. В качестве ответа выведите «YES», если множество проходимо, и «NO» в противном случае.

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

E. Qpwoeirut и вершины

Бинарный поиск Деревья жадные алгоритмы поиск в глубину и подобное разделяй и властвуй снм Структуры данных *2300

Вам дан связный неориентированный граф из \(n\) вершин и \(m\) рёбер. Вершины графа пронумерованы целыми числами от \(1\) до \(n\), а рёбра графа пронумерованы целыми числами от \(1\) до \(m\).

Вам предстоит ответить на \(q\) запросов, каждый из которых состоит из двух чисел \(l\) и \(r\). Ответом на запрос является наименьшее неотрицательное число \(k\), для которого выполняется следующее условие:

  • для всех пар чисел \((a, b)\) таких, что \(l\le a\le b\le r\), вершины \(a\) и \(b\) достижимы друг из друга по пути, проходящему только по первым \(k\) рёбрам (то есть в пути могут встречаться только рёбра \(1, 2, \ldots, k\)).
Входные данные

В первой строке задано одно целое число \(t\) (\(1\le t\le 1000\)) — количество наборов входных данных. Далее следуют описания этих наборов.

В первой строке даны три числа \(n\), \(m\) и \(q\) (\(2\le n\le 10^5\), \(1\le m, q\le 2\cdot 10^5\)) — количество вершин, рёбер и запросов соответственно.

В каждой из следующих \(m\) строк дано по два числа \(u_i\) и \(v_i\) (\(1\le u_i, v_i\le n\)) — концы \(i\)-го ребра.

Гарантируется, что заданный граф связный и в нём нет кратных рёбер и петель.

В каждой из следующих \(q\) строк дано по два числа \(l\) и \(r\) (\(1\le l\le r\le n\)) — описания запросов.

Гарантируется, что сумма \(n\) во всем наборам входных данных не превосходит \(10^5\), сумма \(m\) во всем наборам входных данных не превосходит \(2\cdot 10^5\), сумма \(q\) во всем наборам входных данных не превосходит \(2\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(q\) чисел — ответы на запросы.

Примечание
Граф из первого набора входных данных. Около ребра записан его номер.

В первом наборе входных данных граф состоит из \(2\) вершин и одного ребра между вершинами \(1\) и \(2\).

В первом запросе \(l=1\) и \(r=1\). Вершина достижима сама из себя без использования рёбер, поэтому ответ на этот запрос равен \(0\).

Во втором запросе \(l=1\) и \(r=2\). Вершины \(1\) и \(2\) достижимы друг из друга по пути \(1 \longleftrightarrow 2\), состоящему только из первого ребра. В то же время невозможно добраться из вершины \(1\) до вершины \(2\), используя только первые \(0\) рёбер. Поэтому ответ на запрос равен \(1\).

Граф из второго набора входных данных. Около рёбер записаны их номера.

Во втором наборе входных данных граф состоит из \(5\) вершин и \(5\) рёбер.

В первом запросе \(l=1\) и \(r=4\). Чтобы выполнить требуемое условие, достаточно использовать первые \(3\) ребра:

  • Вершины \(1\) и \(2\) достижимы друг из друга по пути \(1 \longleftrightarrow 2\) (состоящему из ребра \(1\)).
  • Вершины \(1\) и \(3\) достижимы друг из друга по пути \(1 \longleftrightarrow 3\) (состоящему из ребра \(2\)).
  • Вершины \(1\) и \(4\) достижимы друг из друга по пути \(1 \longleftrightarrow 2 \longleftrightarrow 4\) (состоящему из рёбер \(1\) и \(3\)).
  • Вершины \(2\) и \(3\) достижимы друг из друга по пути \(2 \longleftrightarrow 1 \longleftrightarrow 3\) (состоящему из рёбер \(1\) и \(2\)).
  • Вершины \(2\) и \(4\) достижимы друг из друга по пути \(2 \longleftrightarrow 4\) (состоящему из ребра \(3\)).
  • Вершины \(3\) и \(4\) достижимы друг из друга по пути \(3 \longleftrightarrow 1 \longleftrightarrow 2 \longleftrightarrow 4\) (состоящему из рёбер \(2\), \(1\) и \(3\)).

Невозможно выполнить требуемое условие, используя меньше \(3\) первых рёбер. Например, при использовании \(2\) рёбер, невозможно добраться из вершины \(1\) в вершину \(4\). Поэтому ответ на запрос равен \(3\).

Во втором запросе \(l=3\) и \(r=4\). Вершины \(3\) и \(4\) достижимы друг из друга по пути \(3 \longleftrightarrow 1 \longleftrightarrow 2 \longleftrightarrow 4\) (состоящему из рёбер \(2\), \(1\) и \(3\)). При использовании меньшего числа первых рёбер вершины \(3\) и \(4\) не будут достижимы друг из друга.

C. Деревья поиска в глубину

графы Деревья жадные алгоритмы поиск в глубину и подобное снм сортировки *2400

Вам дан связный неориентированный граф из \(n\) вершин и \(m\) рёбер. Вес \(i\)-го ребра равен \(i\).

Ниже представлен некорректный алгоритм поиска минимального остовного дерева:


vis := массив длины n
s := множество рёбер

function dfs(u):
vis[u] := true
пройтись по каждому ребру (u, v) в порядке увеличения весов
if vis[v] = false
добавить ребро (u, v) в множество (s)
dfs(v)

function findMST(u):
установить все элементы (vis) в false
очистить множество (s)
dfs(u)
return множество (s)

Любой из вызовов функций findMST(1), findMST(2), ..., findMST(n) возвращает вам остовное дерево графа. Определите, какие из этих деревьев являются минимальными остовными деревьями.

Входные данные

Первая строка входных данных содержит два целых числа \(n\), \(m\) (\(2\le n\le 10^5\), \(n-1\le m\le 2\cdot 10^5\)) — количество вершин и ребер в графе.

Каждая из следующих \(m\) строк содержит два целых числа \(u_i\) и \(v_i\) (\(1\le u_i, v_i\le n\), \(u_i\ne v_i\)), описывающих неориентированное ребро \((u_i,v_i)\) в графе, \(i\)-е ребро во входных данных имеет вес \(i\).

Гарантируется, что граф связный и между любой парой вершин существует не более одного ребра.

Выходные данные

Выведите строку \(s\), состоящую из нулей и единиц, где \(s_i=1\), если findMST(i) возвращает минимальное остовное дерево, и \(s_i = 0\) иначе.

Примечание

Ниже показан граф из первого примера:

В этом графе существует только одно минимальное остовное дерево, состоящее из ребер \((1,2),(3,5),(1,3),(2,4)\), имеющих суммарный вес \(1+2+3+5=11\).

Ниже описана часть вычислений при вызове findMST(1):

  • реинициализируем массив vis и множество ребер s;
  • вызываем dfs(1);
  • vis[1] := true;
  • итерируемся по ребрам \((1,2),(1,3)\);
  • добавляем ребро \((1,2)\) во множество s, вызываем dfs(2):
    • vis[2] := true;
    • итерируемся по ребрам \((2,1),(2,3),(2,4)\);
    • так как vis[1] = true, игнорируем ребро \((2,1)\);
    • добавляем ребро \((2,3)\) во множество s, вызываем dfs(3):
      • ...

В конце алгоритма будут выбраны ребра \((1,2),(2,3),(3,5),(2,4)\) с суммарным весом \(1+4+2+5=12>11\), поэтому findMST(1) находит не минимальное остовное дерево.

Можно показать, что остальные остовные деревья являются минимальными, поэтому ответ 01111.

D. Частичные виртуальные деревья

Деревья дп Комбинаторика математика поиск в глубину и подобное *3000

Каваширо Нитори — девушка, которой нравится спортивное программирование. Однажды она нашла корневое дерево из \(n\) вершин. Корень дерева был в вершине с номером \(1\). Как продвинутый автор, она сразу придумала задачу.

У Каваширо Нитори есть множество вершин \(U=\{1,2,\ldots,n\}\). За одну операцию она будет выбирать множество вершин \(T\), где \(T\) является частичным виртуальным деревом множества \(U\), и заменять множество \(U\) на \(T\).

Множество вершин \(S_1\) называется частичным виртуальным деревом множества вершин \(S_2\), если \(S_1\) — подмножество \(S_2\), \(S_1 \neq S_2\) и для любых пар вершин \(i\) и \(j\) из \(S_1\) \(\operatorname{LCA}(i,j)\) лежит внутри \(S_1\), где \(\operatorname{LCA}(x,y)\) обозначает наименьшего общего предка вершин \(x\) и \(y\) в дереве. Обратите внимание, что множество вершин может иметь много различных частичных виртуальных деревьев.

Каваширо Нитори хочет узнать для каждого возможного \(k\), если применить операцию строго \(k\) раз, сколькими способами она может получить \(U=\{1\}\) в конце? Два способа считаются различными, если существует целое число \(z\) (\(1 \le z \le k\)) такое, что после \(z\) операций множества \(U\) различаются.

Так как ответ может быть большим, найдите его по модулю \(p\). Гарантируется, что \(p\) — простое число.

Входные данные

Первая строка содержит два целых числа \(n\) и \(p\) (\(2 \le n \le 2000\), \(10^8 + 7 \le p \le 10^9+9\)). Гарантируется, что \(p\) — простое число.

Каждая из следующих \(n-1\) строк содержит два целых числа \(u_i\), \(v_i\) (\(1 \leq u_i, v_i \leq n\)), обозначающих ребро между \(u_i\) и \(v_i\).

Гарантируется, что данные ребра образуют дерево.

Выходные данные

Выведите единственную строку, состоящую из \(n-1\) целых чисел — ответ по модулю \(p\) для всех \(k=1,2,\ldots,n-1\).

Примечание

В первом примере при \(k=1\) единственный возможный способ следующий:

  1. \(\{1,2,3,4\} \to \{1\}\).

При \(k=2\) существуют \(6\) способов:

  1. \(\{1,2,3,4\} \to \{1,2\} \to \{1\}\);
  2. \(\{1,2,3,4\} \to \{1,2,3\} \to \{1\}\);
  3. \(\{1,2,3,4\} \to \{1,2,4\} \to \{1\}\);
  4. \(\{1,2,3,4\} \to \{1,3\} \to \{1\}\);
  5. \(\{1,2,3,4\} \to \{1,3,4\} \to \{1\}\);
  6. \(\{1,2,3,4\} \to \{1,4\} \to \{1\}\).

При \(k=3\) существуют \(6\) возможных способов:

  1. \(\{1,2,3,4\} \to \{1,2,3\} \to \{1,2\} \to \{1\}\);
  2. \(\{1,2,3,4\} \to \{1,2,3\} \to \{1,3\} \to \{1\}\);
  3. \(\{1,2,3,4\} \to \{1,2,4\} \to \{1,2\} \to \{1\}\);
  4. \(\{1,2,3,4\} \to \{1,2,4\} \to \{1,4\} \to \{1\}\);
  5. \(\{1,2,3,4\} \to \{1,3,4\} \to \{1,3\} \to \{1\}\);
  6. \(\{1,2,3,4\} \to \{1,3,4\} \to \{1,4\} \to \{1\}\).

E. XOR дерево

битмаски Деревья жадные алгоритмы поиск в глубину и подобное снм Структуры данных *2400

Дано дерево из \(n\) вершин. На каждой вершине дерева записано число; на \(i\)-й вершине записано число \(a_i\).

Напомним, что простой путь — это путь, посещающий каждую вершину не более одного раза. Назовем весом пути побитовое исключающее ИЛИ значений записанных на его вершинах. Скажем, что дерево хорошее, если в нем не существует ни одного простого пути с весом \(0\).

Вы можете применить следующую операцию произвольное количество раз (возможно, ноль): выбрать вершину дерева и заменить значение записанное на ней на произвольное положительное целое число. Какое минимальное количество раз необходимо применить данную операцию, чтобы дерево стало хорошим?

Входные данные

В первой строке задано целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество вершин.

Во второй строке задано \(n\) целых чисел \(a_1\), \(a_2\), ..., \(a_n\) (\(1 \le a_i < 2^{30}\)) — числа, записанные на вершинах дерева.

Затем следует \(n - 1\) строка, каждая из которых содержит два числа \(x\) и \(y\) (\(1 \le x, y \le n; x \ne y\)), обозначающие ребро между вершиной \(x\) и вершиной \(y\). Гарантируется, что эти ребра задают дерево.

Выходные данные

Выведите одно целое число — минимальное количество раз, которое необходимо применить операцию, чтобы дерево стало хорошим.

Примечание

В первом примере можно заменить значение на вершине \(1\) на \(13\), а значение на вершине \(4\) — на \(42\).

F. Триаметр

Бинарный поиск Деревья поиск в глубину и подобное Структуры данных *3200

 — What is my mission?
 — To count graph diameters.
You and Your Submission

Дерево — это неориентированный связный граф без циклов. Взвешенное дерево — это дерево, каждому ребру которого назначен некоторый вес. Степень вершины — это количество ребер, прилегающих к данной вершине.

Вам дано взвешенное дерево с \(n\) вершинами, каждое ребро которого имеет вес \(1\). Определим множество вершин \(L\) следующим образом: все вершины, степень которых равна \(1\), входят в это множество, остальные вершины в это множество не входят.

Вам необходимо ответить на \(q\) независимых запросов. В \(i\)-м запросе:

  1. Вам дано целое положительное число \(x_i\).
  2. Для всех \(u,v \in L\) таких, что \(u < v\), добавьте ребро \((u, v)\) с весом \(x_i\) в граф (который изначально является данным вам деревом).
  3. Найдите диаметр итогового графа.

Диаметр графа равен \(\max\limits_{1 \le u < v \le n}{\operatorname{d}(u, v)}\), где \(\operatorname{d}(u, v)\) — это длина кратчайшего пути между вершинами \(u\) и \(v\).

Входные данные

В первой строке находится единственное целое число \(n\) (\(3 \le n \le 10^6\)).

Во второй строке находится \(n - 1\) целое число \(p_2,p_3,\ldots,p_n\) (\(1 \le p_i < i\)), каждое из которых означает, что в графе есть ребро между вершинами \(i\) и \(p_i\). Гарантируется, что данные ребра образуют дерево.

В третьей строке находится единственное целое число \(q\) (\(1 \le q \le 10\)).

В четвертой строке находится \(q\) целых чисел \(x_1,x_2,\ldots,x_q\) (\(1 \le x_i \le n\)). Все \(x_i\) попарно различны.

Выходные данные

В единственной строке выведите \(q\) целых чисел, которые являются ответами на запросы.

Примечание

Граф в первом тесте после добавления ребер:

G. Префиксы путей

Бинарный поиск Деревья поиск в глубину и подобное Структуры данных *1700

Вам задано корневое дерево. Оно содержит \(n\) вершин, которые пронумерованы от \(1\) до \(n\). Корнем является вершина \(1\).

У каждого ребра есть две положительных целых стоимости. Таким образом, для каждого ребра заданы два положительных целых числа \(a_j\) и \(b_j\).

Выведите \(n-1\) число \(r_2, r_3, \dots, r_n\), где \(r_i\) определяется следующим образом.

Рассмотрим путь из корня (вершины \(1\)) в \(i\) (\(2 \le i \le n\)). Пусть сумма стоимостей \(a_j\) вдоль этого пути равна \(A_i\). Тогда \(r_i\) равно длине максимального такого префикса этого пути, что сумма \(b_j\) вдоль этого префикса не превосходит \(A_i\).

Пример для \(n=9\). Синим цветом изображены стоимости \(a_j\), а красным изображены стоимости \(b_j\).

Рассмотрим пример. В этом случае:

  • \(r_2=0\), так как путь до \(2\) имеет сумму по \(a_j\) равную \(5\), только префикс этого пути длины \(0\) имеет меньшую или равную сумму по \(b_j\);
  • \(r_3=3\), так как путь до \(3\) имеет сумму по \(a_j\) равную \(5+9+5=19\), префикс длины \(3\) этого пути имеет сумму по \(b_j\) равную \(6+10+1=17\) (число \(17 \le 19\));
  • \(r_4=1\), так как путь до \(4\) имеет сумму по \(a_j\) равную \(5+9=14\), префикс длины \(1\) этого пути имеет сумму по \(b_j\) равную \(6\) (это самый длинный подходящий префикс, так как префикс длины \(2\) уже имеет сумму по \(b_j\) равную \(6+10=16\), что больше \(14\));
  • \(r_5=2\), так как путь до \(5\) имеет сумму по \(a_j\) равную \(5+9+2=16\), префикс длины \(2\) этого пути имеет сумму по \(b_j\) равную \(6+10=16\) (это самый длинный подходящий префикс, так как префикс длины \(3\) уже имеет сумму по \(b_j\) равную \(6+10+1=17\), что больше \(16\));
  • \(r_6=1\), так как путь до \(6\) имеет сумму по \(a_j\) равную \(2\), префикс длины \(1\) этого пути имеет сумму по \(b_j\) равную \(1\);
  • \(r_7=1\), так как путь до \(7\) имеет сумму по \(a_j\) равную \(5+3=8\), префикс длины \(1\) этого пути имеет сумму по \(b_j\) равную \(6\) (это самый длинный подходящий префикс, так как префикс длины \(2\) уже имеет сумму по \(b_j\) равную \(6+3=9\), что больше \(8\));
  • \(r_8=2\), так как путь до \(8\) имеет сумму по \(a_j\) равную \(2+4=6\), префикс длины \(2\) этого пути имеет сумму по \(b_j\) равную \(1+3=4\);
  • \(r_9=3\), так как путь до \(9\) имеет сумму по \(a_j\) равную \(2+4+1=7\), префикс длины \(3\) этого пути имеет сумму по \(b_j\) равную \(1+3+3=7\).
Входные данные

В первой строке записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов входных данных.

Каждое описание начинается строкой, которая содержит целое число \(n\) (\(2 \le n \le 2\cdot10^5\)) — количество вершин в дереве.

Далее следует \(n-1\) строка, каждая из которых содержит три числа \(p_j, a_j, b_j\) (\(1 \le p_j \le n\); \(1 \le a_j,b_j \le 10^9\)) — предок вершины \(j\), первая и вторая стоимости ребра, которое ведёт из \(p_j\) в \(j\). Величина \(j\) пробегает все значения от \(2\) до \(n\) включительно. Гарантируется, что в каждом наборе входных данных задано корректное подвешенное дерево с корнем в вершине \(1\).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2\cdot10^5\).

Выходные данные

Для каждого набора входных данных выведите \(n-1\) целое число в одной строке: \(r_2, r_3, \dots, r_n\).

Примечание

Первый пример разобран в условии.

Во втором примере:

  • \(r_2=0\), так как путь до \(2\) имеет сумму по \(a_j\) равную \(1\), только префикс этого пути длины \(0\) имеет меньшую или равную сумму по \(b_j\);
  • \(r_3=0\), так как путь до \(3\) имеет сумму по \(a_j\) равную \(1+1=2\), префикс длины \(1\) этого пути имеет сумму по \(b_j\) равную \(100\) (\(100 > 2\));
  • \(r_4=3\), так как путь до \(4\) имеет сумму по \(a_j\) равную \(1+1+101=103\), префикс длины \(3\) этого пути имеет сумму по \(b_j\) равную \(102\), .

E. Обмен и максимальный отрезок

битмаски дп поиск в глубину и подобное разделяй и властвуй Структуры данных *2500

Задан массив длины \(2^n\). Элементы массива пронумерованы от \(1\) до \(2^n\).

Надо обработать \(q\) запросов к массиву. В \(i\)-м запросе будет дано целое число \(k\) (\(0 \le k \le n-1\)). Чтобы обработать запрос, надо сделать следующее:

  • для каждого \(i \in [1, 2^n-2^k]\) в возрастающем порядке сделайте следующее: если \(i\)-й элемент уже менялся местами с каким-либо другим элементов в текущем запросе, пропустите его; иначе поменяйте местами \(a_i\) и \(a_{i+2^k}\);
  • после этого выведите наибольшую сумму среди всех непрерывных подотрезков массива (включая пустой подотрезок).

Например, если массив \(a\) равен \([-3, 5, -3, 2, 8, -20, 6, -1]\), а \(k = 1\), то запрос обрабатывается так:

  • \(1\)-й элемент еще не менялся ни с кем местами, поэтому поменяем его местами с \(3\)-м элементом;
  • \(2\)-й элемент еще не менялся ни с кем местами, поэтому поменяем его местами с \(4\)-м элементом;
  • \(3\)-й элемент уже менялся местами;
  • \(4\)-й элемент уже менялся местами;
  • \(5\)-й элемент еще не менялся ни с кем местами, поэтому поменяем его местами с \(7\)-м элементом;
  • \(6\)-й элемент еще не менялся ни с кем местами, поэтому поменяем его местами с \(8\)-м элементом.

Тогда массив становится равен \([-3, 2, -3, 5, 6, -1, 8, -20]\). Подотрезок с максимальной суммой — это \([5, 6, -1, 8]\), и ответ на запрос равен \(18\).

Обратите внимание, что запросы изменяют массив, т. е. после выполнения запроса массив не возвращается в изначальное состояние, и следующий запрос будет применен к измененному массиву.

Входные данные

В первой строке записано одно целое число \(n\) (\(1 \le n \le 18\)).

Во второй строке записаны \(2^n\) целых чисел \(a_1, a_2, \dots, a_{2^n}\) (\(-10^9 \le a_i \le 10^9\)).

В третьей строке записано одно целое число \(q\) (\(1 \le q \le 2 \cdot 10^5\)).

Затем следуют \(q\) строк, в \(i\)-й из них записано одно целое число \(k\) (\(0 \le k \le n-1\)), описывающее \(i\)-й запрос.

Выходные данные

На каждый запрос выведите одно целое число — наибольшую сумму среди всех непрерывных подотрезков массива (включая пустой подотрезок) после обработки запроса.

Примечание

Преобразование массива в примере: \([-3, 5, -3, 2, 8, -20, 6, -1] \rightarrow [-3, 2, -3, 5, 6, -1, 8, -20] \rightarrow [2, -3, 5, -3, -1, 6, -20, 8] \rightarrow [5, -3, 2, -3, -20, 8, -1, 6]\).

E. BHTML+BCSS

*особая задача поиск в глубину и подобное Разбор выражений *2200

В этой задаче речь пойдет о вымышленных языках BHTML и BCSS, которые слегка напоминают HTML и CSS. Внимательно ознакомьтесь с условием задачи, так как схожесть лишь отдаленная, а в задаче используются крайне упрощенные аналоги.

Задан BHTML-документ, который похож на HTML, но значительно проще. Записывается он как последовательность открывающих и закрывающих тегов. Тег вида «<имятега>» называется открывающим, а тег вида «</имятега>» — закрывающим. Кроме того, есть самозакрывающиеся теги, которые записываются в виде «<имятега/>» и в этой задаче полностью эквивалентны «<имятега></имятега>». Все имена тегов в этой задаче — строки из строчных латинских букв, имеющие длину от 1 до 10 символов. Некоторые теги могут иметь одинаковые имена.

Теги в документе образуют правильную скобочную последовательность, то есть из заданной последовательности можно получить пустую с помощью операций:

  • удалить любой самозакрывающийся тег «<имятега/>»,
  • удалить пару открывающий-закрывающий тег, которые идут подряд (в таком порядке) и имеют одинаковые имена, то есть подстроку «<имятега></имятега>».

Например, вам может быть задан документ «<header><p><a/><b></b></p></header><footer></footer>», но не могут быть заданы документы «<a>», «<a></b>», «</a><a>» или «<a><b></a></b>».

Очевидно, для каждого открывающего тега существует единственный парный закрывающий — каждая такая пара называется элементом. Самозакрывающийся тег — тоже элемент. Говорят, что один элемент вложен в другой, если теги первого находятся между тегами второго. Считается, что никакой элемент не вложен сам в себя. Например, в примере выше элемент «b» вложен в «header» и в «p», но не вложен в «a» и «footer», а также не вложен в самого себя («b»). Элемент «header» имеет три вложенных в него элемента, а «footer» — ноль.

Правила BCSS нужны для назначения стилей при выводе элементов документов BHTML. Каждое правило записывается в виде последовательностей слов «x1 x2 ... xn». Под это правило попадают все такие элементы t, которые удовлетворяют пунктам из списка:

  • существует последовательность вложенных элементов с именами тегов «x1», «x2», ..., «xn» (то есть второй элемент вложен в первый, третий во второй и так далее),
  • эта последовательность заканчивается элементом t.

Например, правилу «a b» удовлетворяют все такие элементы «b» для которых существует элемент «a», в который они вложены. Правилу «a b b c» удовлетворяют все такие элементы «c» для которых существует три элемента «a», «b», «b», что в цепочке «a»-«b»-«b»-«c» каждый очередной элемент вложен в предыдущий.

Напишите программу, которая по заданному BHTML-документу и набору BCSS-правил определяет количество элементов, которые удовлетворяют каждому из правил.

Входные данные

В первой строке входных данных записан BHTML-документ. Документ имеет длину от 4 до 106 символов. Документ имеет правильную структуру, не содержит пробелов или каких-либо других лишних символов. Имена тегов состоят из строчных латинских букв, их длины — от 1 до 10 символов.

Вторая строка содержит целое число m (1 ≤ m ≤ 200) — количество запросов. Далее в m строках записаны сами запросы по одному в строке. Каждый запрос — это последовательность x1, x2, ..., xn, где xii-ый элемент запроса, а n (1 ≤ n ≤ 200) — количество элементов в запросе. Элементы записаны через единичные пробелы, запись правила не начинается и не заканчивается пробелом. Каждый элемент запроса — последовательность строчных латинских букв длины от 1 до 10.

Выходные данные

Выведите m строк, j-ая строка должна содержать количество элементов документа, которые соответствуют j-ому BCSS-правилу. Если таких элементов вообще нет, то выведите в строку 0.

D. Максимальное И

битмаски жадные алгоритмы поиск в глубину и подобное разделяй и властвуй сортировки *1800

Вам даны два массива \(a\) и \(b\), состоящие из \(n\) целых чисел каждый.

Определим функцию \(f(a, b)\) следующим образом:

  • определим массив \(c\) размера \(n\), где \(c_i = a_i \oplus b_i\) (\(\oplus\) обозначает операцию побитового исключающего ИЛИ);
  • значением функции является \(c_1 \mathbin{\&} c_2 \mathbin{\&} \cdots \mathbin{\&} c_n\) (т.е. побитовое И всех элементов массива \(c\)).

Найдите максимальное значение функции \(f(a, b)\), если вы можете переупорядочить элементы массива \(b\) произвольным образом (также можно оставить первоначальный порядок).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(1 \le n \le 10^5\)) — размеры массивов \(a\) и \(b\).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i < 2^{30}\)).

Третья строка содержит \(n\) целых чисел \(b_1, b_2, \dots, b_n\) (\(0 \le b_i < 2^{30}\)).

Сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимальное значение функции \(f(a, b)\), если вы можете переупорядочить элементы массива \(b\) произвольным образом.

E. Запросы про префикс функцию

Деревья дп поиск в глубину и подобное Строки строковые суфф. структуры хэши *2200

Задана строка \(s\), состоящая из строчных латинских букв.

К ней приходят \(q\) запросов: дана другая строка \(t\), состоящая из строчных латинских букв; проделайте следующие шаги:

  1. склеить \(s\) и \(t\);
  2. посчитать префикс-функцию полученной строки \(s+t\);
  3. выведите значения префикс-функции на позициях \(|s|+1, |s|+2, \dots, |s|+|t|\) (\(|s|\) и \(|t|\) — это длины строк \(s\) и \(t\), соответственно);
  4. вернуть строку обратно к \(s\).

Префикс-функция строки \(a\) — это последовательность \(p_1, p_2, \dots, p_{|a|}\), где \(p_i\) — это наибольшее значение \(k\) такое, что \(k < i\) и \(a[1..k]=a[i-k+1..i]\) (\(a[l..r]\) обозначает непрерывную подстроку строку \(a\) с позиции \(l\) до позиции \(r\) включительно). Другими словами, это наибольший собственный префикс строки \(a[1..i]\), который равен ее суффиксу такой же длины.

Входные данные

В первой строке записана непустая строка \(s\) (\(1 \le |s| \le 10^6\)), состоящая из строчных латинских букв.

Во второй строке записано одно целое число \(q\) (\(1 \le q \le 10^5\)) — количество запросов.

В каждой из следующих \(q\) строк записан запрос: непустая строка \(t\) (\(1 \le |t| \le 10\)), состоящая из строчных латинских букв.

Выходные данные

На каждый запрос выведите значения префикс-функции строки \(s+t\) на позициях \(|s|+1, |s|+2, \dots, |s|+|t|\).

F. Уменьшение паросочетания

графы интерактив Конструктив Паросочетания Перебор поиск в глубину и подобное Потоки *2800

Дан двудольный граф с \(n_1\) вершинами в первой доле, \(n_2\) вершинами во второй доле и \(m\) ребрами. Максимальное паросочетание в таком графе — максимальный по размеру набор ребер, такой, что ни одна вершина не инцидентна более чем одному выбранному ребру.

Вам нужно обрабатывать запросы двух видов к этому графу:

  • \(1\) — удалить минимально возможное количество вершин так, чтобы размер максимального паросочетания уменьшился ровно на \(1\), и вывести список удаленных вершин. Затем найти любое максимальное паросочетание в полученном графе и вывести сумму номеров ребер, входящих в это паросочетание;
  • \(2\) — запрос этого типа может быть задан только после запроса типа \(1\). В качестве ответа на этот запрос вы должны вывести список номеров ребер, входящих в выбранное в предыдущем запросе паросочетание.

Обратите внимание, что вы должны решить эту задачу в режиме online. Это означает, что вы не можете считать все входные данные сразу. Вы можете считать каждый запрос только после вывода ответа на последний запрос. Используйте функции fflush в C++ и BufferedWriter.flush в Java после каждого вывода в вашей программе.

Входные данные

В первой строке заданы четыре целых числа \(n_1\), \(n_2\), \(m\) и \(q\) (\(1 \le n_1, n_2 \le 2 \cdot 10^5\); \(1 \le m \le \min(n_1 \cdot n_2, 2 \cdot 10^5)\); \(1 \le q \le 2 \cdot 10^5\)).

Затем следуют \(m\) строк. В \(i\)-й из них заданы два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i \le n_1\); \(1 \le y_i \le n_2\)), обозначающих, что \(i\)-е ребро соединяет вершину \(x_i\) в первой доле с вершиной \(y_i\) во второй доле. Ни одна пара вершин не соединена более чем одним ребром.

Затем следуют \(q\) строк. В \(i\)-й из них задано одно целое число — \(1\) или \(2\) — обозначающее \(i\)-й запрос. Дополнительные ограничения на запросы:

  • количество запросов типа \(1\) не превысит размер максимального паросочетания в исходном графе;
  • количество запросов типа \(2\) не превысит \(3\);
  • каждому запросу типа \(2\) предшествует запрос типа \(1\);
  • ваше решение может считать \(i\)-й запрос только после того, как выведет ответ на запрос \((i-1)\) и сбросит буфер вывода.
Выходные данные

Для запроса типа \(1\) выведите три строки:

  • в первой строке выведите количество удаляемых вершин;
  • во второй строке выведите список вершин, которые вы удаляете, следующим образом: если вы удаляете вершину \(x\) из первой доли, выведите \(x\); если вы удаляете вершину \(y\) из второй доли, выведите \(-y\) (номер со знаком минус);
  • в третьей строке выведите сумму номеров ребер, которые принадлежат некоторому максимальному паросочетанию. Ребра нумеруются от \(1\) до \(m\).

Для запроса типа \(2\) выведите две строки:

  • в первой строке выведите одно число — размер максимального паросочетания;
  • во второй строке выведите номера ребер, формирующих максимальное паросочетание. Обратите внимание, что сумма этих номеров должна быть равна числу, которое вы вывели в конце предыдущего запроса типа \(1\);

После вывода ответа на запрос не забудьте сбросить буфер вывода.

Протокол взаимодействия

В этой задаче вы можете получить вердикт «Решение зависло», так как ее нужно решать в режиме online. Если это случилось, то либо вы не следуете формату вывода, либо нарушаете какое-то из ограничений задачи. Вы можете считать, что это эквивалентно вердикту «Неправильный ответ».

Для вашего удобства в примере из условия вывод для запросов разделен строкой ===. Ваше решение не должно выводить эту строку; она добавлена только для того, чтобы было проще понять, где ответ на какой запрос.

F. L-фигуры

поиск в глубину и подобное реализация *1700

L-фигура это фигура на клетчатой бумаге, выглядящая как одна из четырех первых фигур на картинке ниже. L-фигура содержит ровно три закрашенных клетки (обозначаемых как *), которые могут быть повернуты в любую сторону.

Вам дана прямоугольная сетка из клеток. Определите, содержит ли она только L-фигуры, которые не соприкасаются друг с другом ни одним углом и ни одной стороной. Более формально:

  • Каждая закрашенная клетка в сетке является частью ровно одной L-фигуры и
  • нет двух L-фигур, которые бы соприкасались углом или стороной.

Например, последние две сетки на картинке выше не удовлетворяют требованиям, потому что есть две L-фигуры, соприкасающихся углами и стороной соответственно.

Входные данные

Входные данные состоят из множества тестовых случаев. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество тестовых случаев. Затем следуют описания тестовых случаев.

Первая строка каждого тестового случая содержит два целых числа \(n\) и \(m\) (\(1 \leq n, m \leq 50\)) — количество строк и столбцов в сетке соответственно.

Затем следуют \(n\) строк, содержащих \(m\) символов. Каждый символ это либо «.», либо «*» — пустая или закрашенная клетка соответственно.

Выходные данные

Для каждого тестового случая выведите «YES» если сетка состоит только из L-фигур, не касающихся друг друга углами или сторонами, иначе «NO».

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» and «YES» будут считаться за положительный ответ).

D. Разделение рёбер

графы Деревья Конструктив Перебор поиск в глубину и подобное снм Теория вероятностей *2000

Вам дан связный, неориентированный и невзвешенный граф с \(n\) вершинами и \(m\) рёбрами. Обратите внимание на ограничение на количество рёбер: \(m \le n + 2\).

Давайте скажем, что мы красим некоторые рёбра в красный и оставшиеся рёбра в синий. Теперь рассмотрим только красные рёбра и посчитаем количество компонент связности в графе. Пусть это значение равно \(c_1\). Аналогично, рассмотрим только синие рёбра и посчитаем количество компонент связности в графе. Пусть это значение равно \(c_2\).

Найдите распределение цветов по рёбрам такое, что величина \(c_1+c_2\) минимальна.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит единственное целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(2 \le n \le 2 \cdot 10^5\); \(n-1 \leq m \leq \min{\left(n+2,\frac{n \cdot (n-1)}{2}\right)}\)) — количество вершин и рёбер в графе соответственно.

Затем следуют \(m\) строк. \(i\)-я строка содержит два целых числа \(u_i\) и \(v_i\) (\(1 \le u_i,v_i \le n\), \(u_i \ne v_i\)) обозначающая, что \(i\)-е ребро соединяет вершины \(u_i\) и \(v_i\). Гарантируется, что в графе нет петель и кратных рёбер. Также гарантируется, что граф связен.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^6\). Гарантируется, что сумма \(m\) по всем наборам входных данных не превосходит \(2 \cdot 10^6\).

Выходные данные

Для каждого набора входных данных выведите бинарную строку длины \(m\). \(i\)-й символ строки должен быть 1, если \(i\)-е ребро должно иметь красный цвет, и 0, если оно должно иметь синий цвет. Если существует несколько способов распределить цвета, чтобы получить минимальную величину, вы можете вывести любой.

Примечание
  • Граф в первом наборе входных данных следующий:

    \(c_1 + c_2 = 1 + 2 = 3\)

  • Граф во втором наборе входных данных следующий:

    \(c_1 + c_2 = 2 + 2 = 4\)

B. Тайная комната

кратчайшие пути поиск в глубину и подобное *1800

«Тайная комната снова открыта» — эта новость распространилась по всему Хогвартсу. Дамблдор был уволен и теперь Гарри пытается попасть в тайную комнату. Лорд Волдеморт не доволен таким развитием событий, он хочет помешать Гарри.

Тайная комната представляет собой прямоугольное поле n × m, в некоторых клетках которого стоят колонны. Колонны обладают необычным свойством: луч света может беспрепятственно проходить сквозь них, не меняя своего направления. Используя магию, можно превратить некоторые колонны в магические. Магические колонны отличаются от обычных тем, что луч света, проходящий через магическую колонну, отражается в четыре стороны как показано на рисунке.

Слева свет проходит через обычную колонну, справа — через магическую.

Василиск находится на правой стороне правой нижней клетки поля и смотрит налево (в сторону левой нижней клетки). Как гласит легенда, тот, кто посмотрит прямо в глаза Василиску, сразу умирает. А тот, кто посмотрит в глаза Василиску через колонну, окаменеет. Мы знаем, что дверь в тайную комнату находится на левой стороне левой верхней клетки поля, а также что любой заходящий в комнату человек обязательно будет смотреть по направлению своего движения (то есть в сторону правой верхней клетки).

На рисунке изображен первый тестовый пример.

Вам заданы размеры тайной комнаты и позиции колонн. Лорд Волдеморт попросил вас найти минимальное количество колонн, которое нужно сделать магическими, чтобы любой, кто вошел в тайную комнату, немедленно окаменел, или сказать, что задуманное сделать невозможно.

Входные данные

В первой строке записано два целых числа n и m (2 ≤ n, m ≤ 1000) — размеры тайной комнаты. Следующие n строк содержат по m символов. Каждый символ равен «.» или «#» и описывает соответствующую клетку тайной комнаты. Символ равен «.» — если соответствующая клетка комнаты пустая, «#» — если соответствующая клетка содержит обычную колонну.

Выходные данные

Выведите единственное число — минимальное количество колонн, которое нужно сделать магическими, для защиты тайной комнаты или -1, если защитить тайную комнату невозможно.

Примечание

На картинке выше показан первый тестовый пример. Обе колонны в первом примере нужно сделать магическими. Значком дракона обозначен Василиск, значком бинокля обозначен наблюдатель, который войдет в тайную комнату. Черная звездочка обозначает место, где должно произойти окаменение. Желтыми линиями обозначается движение света через колонны.

C. Сдвиг по фазе

графы жадные алгоритмы поиск в глубину и подобное реализация снм Строки *1400

Была строка \(s\), которую захотели зашифровать. Для этого взяли все \(26\) строчных латинских букв, расположили их в некотором порядке по кругу, после чего заменили каждую букву в \(s\) на ту, что является следующей по часовой стрелке, получив таким образом строку \(t\).

Вам дали строку \(t\). Определите лексикографически минимальную строку \(s\), из которой могла быть получена данная строка \(t\).

Строка \(a\) лексикографически меньше строки \(b\) такой же длины, если и только если:

  • в первой позиции, где \(a\) и \(b\) различны, в строке \(a\) находится буква, которая встречается в алфавите раньше, чем соответствующая буква в \(b\).
Входные данные

Первая строка входных данных содержит единственное целое число \(t\) (\(1 \le t \le 3 \cdot 10^4\)) — количество наборов входных данных. Описание наборов входных данных следует ниже.

Первая строка каждого набора содержит одно целое число \(n\) (\(1 \le n \le 10^5\)) — длину строки \(t\).

Следующая строка содержит строку \(t\) длины \(n\), состоящую из строчных букв латинского алфавита.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одну строку — лексикографически минимальную строку \(s\), из которой могла получиться \(t\).

Примечание

В первом наборе входных данных мы не могли иметь строку «a», поскольку тогда буква a переходила бы сама в себя, что невозможно. В качестве ответа нам подходит лексикографически вторая строка «b».

Во втором наборе нам не подходит «aa», поскольку a переходила бы в себя, и не подходит «ab», поскольку круг переходов замкнулся бы на \(2\) буквах, а он должен состоять из всех \(26\). Следующая строка «ac» нам подходит.

Ниже приведены схемы для первых трех наборов входных данных. В круге пропущены неучаствующие буквы, их можно расставить произвольно в пропуски.

D. Упоротые перестановки

графы Деревья Конструктив поиск в глубину и подобное снм Структуры данных *1900

Дана перестановка \(a_1, a_2, \dots, a_n\) целых чисел от \(1\) до \(n\), и пороговое значение \(k\) такое, что \(0 \leq k \leq n\), по ним вычисляется последовательность \(b_1, b_2, \dots, b_n\) следующим образом.

Для всех \(1 \leq i \leq n\) в порядке возрастания положим \(x = a_i\).

  • Если \(x \leq k\), приравняем \(b_{x}\) последнему элементу \(a_j\) (\(1 \leq j < i\)) такому, что \(a_j > k\). Если такого элемента \(a_j\) не существует, положим \(b_{x} = n+1\).
  • Если \(x > k\), приравняем \(b_{x}\) последнему элементу \(a_j\) (\(1 \leq j < i\)) такому, что \(a_j \leq k\). Если такого элемента \(a_j\) не существует, положим \(b_{x} = 0\).

К сожалению, после построения последовательности \(b_1, b_2, \dots, b_n\), перестановка \(a_1, a_2, \dots, a_n\) и пороговое значение \(k\) потерялись.

Теперь у вас есть только последовательность \(b_1, b_2, \dots, b_n\). Ваша задача найти любую подходящую перестановку \(a_1, a_2, \dots, a_n\) и пороговое значение \(k\) которые порождают последовательность \(b_1, b_2, \dots, b_n\). Гарантируется, что существует хотя бы одна пара перестановки \(a_1, a_2, \dots, a_n\) и порогового значения \(k\), что порождают \(b_1, b_2, \dots, b_n\).

Перестановкой чисел от \(1\) до \(n\) называется последовательность длины \(n\) которая содержит все целые числа от \(1\) до \(n\) ровно один раз.

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \leq t \leq 10^5\)) — количество наборов входных данных. Затем следуют описания наборов входных данных.

В первой строке набора входных данных содержится целое число \(n\) (\(1 \leq n \leq 10^5\)), означающее длину перестановки \(a\).

Во второй строке содержится \(n\) целых чисел \(b_1, b_2, \dots, b_n\) (\(0 \leq b_i \leq n+1\)), означающие элементы последовательности \(b\).

Гарантируется, что существует хотя бы одна пара перестановки \(a_1, a_2, \dots, a_n\) и порогового значения \(k\), что порождают \(b_1, b_2, \dots, b_n\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите пороговое значение \(k\) (\(0 \leq k \leq n\)) в первой строке, и затем выведите перестановку \(a_1, a_2, \dots, a_n\) (\(1 \leq a_i \leq n\)) во второй строке так, что перестановку \(a_1, a_2, \dots, a_n\) и пороговое значение \(k\) порождают последовательность \(b_1, b_2, \dots, b_n\). Если существуют несколько решений, выведите любое из них.

Примечание

В первом примере перестановка \(a = [1,3,2,4]\) и пороговое значение \(k = 2\) породят \(b\) следующим образом.

  • Когда \(i = 1\), \(x = a_i = 1 \leq k\), нет такого \(a_j\) (\(1 \leq j < i\)) что \(a_j > k\). Значит, \(b_1 = n + 1 = 5\).
  • Когда \(i = 2\), \(x = a_i = 3 > k\), последний элемент \(a_j\) такой, что \(a_j \leq k\) это \(a_1\). Значит, \(b_3 = a_1 = 1\).
  • Когда \(i = 3\), \(x = a_i = 2 \leq k\), последний элемент \(a_j\) такой, что \(a_j > k\) это \(a_2\). Значит, \(b_2 = a_2 = 3\).
  • Когда \(i = 4\), \(x = a_i = 4 > k\), последний элемент \(a_j\) такой, что \(a_j \leq k\) это \(a_3\). Значит, \(b_4 = a_3 = 2\).
Получается последовательность \(b = [5,3,1,2]\).

Для второго примера перестановка \(a = [1,2,3,4,5,6]\) и пороговое значение \(k = 3\) породят \(b\) следующим образом.

  • Когда \(i = 1, 2, 3\), \(a_i \leq k\), нет такого \(a_j\) (\(1 \leq j < i\)) что \(a_j > k\). Значит, \(b_1 = b_2 = b_3 = n + 1 = 7\).
  • Когда \(i = 4, 5, 6\), \(a_i > k\), последний элемент \(a_j\) такой, что \(a_j \leq k\) это \(a_3\). Значит, \(b_4 = b_5 = b_6 = a_3 = 3\).
Получается последовательность \(b = [7,7,7,3,3,3]\).

Для третьего примера перестановка \(a = [6,5,4,3,2,1]\) и пороговое значение \(k = 3\) породят \(b\) следующим образом.

  • Когда \(i = 1, 2, 3\), \(a_i > k\), нет такого \(a_j\) (\(1 \leq j < i\)) что \(a_j \leq k\). Значит, \(b_4 = b_5 = b_6 = 0\).
  • Когда \(i = 4, 5, 6\), \(a_i \leq k\), последний элемент \(a_j\) такой, что \(a_j > k\) это \(a_3\). Значит, \(b_1 = b_2 = b_3 = a_3 = 4\).
Получается последовательность \(b = [4,4,4,0,0,0]\).

D. Сбросить k ребер

Бинарный поиск графы Деревья жадные алгоритмы поиск в глубину и подобное Структуры данных *1900

Задано корневое дерево, состоящее из \(n\) вершин. Вершины пронумерованы от \(1\) до \(n\), корень — это вершина \(1\).

Вы можете совершить следующую операцию не более \(k\) раз:

  • выбрать ребро \((v, u)\) дерева такое, что \(v\) является родителем \(u\);
  • удалить ребро \((v, u)\);
  • добавить ребро \((1, u)\) (т. е. сделать \(u\) с его поддеревом ребенком корня).

Высотой дерева называют максимальную глубину среди всех его вершин, а глубина вершины — это количество ребер на пути от корня до нее. Например, глубина вершины \(1\) равна \(0\), так как она — корень, а глубина всех ее детей равна \(1\).

Какую минимальную высоту дерева можно получить?

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записаны два целых числа \(n\) и \(k\) (\(2 \le n \le 2 \cdot 10^5\); \(0 \le k \le n - 1\)) — количество вершин в дереве и наибольшее количество операций, которые вы можете совершить.

Во второй строке записаны \(n-1\) целых чисел \(p_2, p_3, \dots, p_n\) (\(1 \le p_i < i\)) — родитель \(i\)-й вершины. Вершина \(1\) — корень.

Сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

На каждый набор входных данных выведите одно число — наименьшая высота дерева, которую можно получить, совершив не более \(k\) операций.

E. Подвешенные сердца

Деревья дп жадные алгоритмы Конструктив поиск в глубину и подобное Структуры данных *1800

У Пака Чанека есть \(n\) пустых карточек в форме сердца. Карточка \(1\) прикреплена непосредственно к стене, остальные же карточки подвешены ровно к одной другой карточке верёвочкой. А именно, карточка \(i\) (\(i > 1\)) подвешена к карточке \(p_i\) (\(p_i < i\)).

Пак Чанек должен написать на каждой карточке одно целое число. Для этого он выберет произвольную перестановку \(a\) чисел \([1, 2, \dots, n]\), и на карточке \(i\) запишет число \(a_i\).

После этого Пак Чанек должен выполнить следующую операцию \(n\) раз, поддерживая при этом последовательность \(s\) (изначально пустую):

  1. Выбрать такую карточку \(x\), что к ней не подвешена ни одна другая карточка.
  2. Добавить число, записанное на карте \(x\), в конец последовательности \(s\).
  3. Если \(x \neq 1\) и число на карточке \(p_x\) больше, чем число на карточке \(x\), заменить число на карточке \(p_x\) на число на карточке \(x\).
  4. Удалить карточку \(x\).

После этого у Пака Чанека будет последовательность \(s\) из \(n\) элементов. Какова максимальная длина наибольшей неубывающей подпоследовательности\(^\dagger\) \(s\) в конце, если Пак Чанек выполняет все шаги оптимально?

\(^\dagger\) Последовательность \(b\) называется подпоследовательностью последовательности \(c\) если \(b\) может быть получена из \(c\) удалением некоторого (возможно нулевого) количества элементов. Например, \([3,1]\) — подпоследовательность \([3,2,1]\), \([4,3,1]\) и \([3,1]\), но не \([1,3,3,7]\) и не \([3,10,4]\).

Входные данные

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 10^5\)) — количество карточек.

Вторая строка содержит \(n - 1\) целое число \(p_2, p_3, \dots, p_n\) (\(1 \le p_i < i\)) описывающая, к какой карточке подвешена каждая карточка.

Выходные данные

Выведите одно целое число — максимальную длину наибольшей неубывающей подпоследовательности \(s\) в конце, если Пак Чанек сделает все шаги оптимально.

Примечание

Ниже представлена структура карточек в первом примере.

Пак Чанек может выбрать перестановку \(a = [1, 5, 4, 3, 2, 6]\).

Пусть \(w_i\) — число на карточке \(i\). Изначально \(w_i = a_i\).

Пак Чанек может выполнять следующие операции по порядку:

  1. Выбрать карточку \(5\). Добавить \(w_5 = 2\) в конец \(s\). Так как \(w_4 > w_5\), значение \(w_4\) становится равным \(2\). Удаляем карточку \(5\). После этой операции \(s = [2]\).
  2. Выбрать карточку \(6\). Добавить \(w_6 = 6\) в конец \(s\). Так как \(w_2 \leq w_6\), значение \(w_2\) остается неизменным. Удаляем карточку \(6\). После этой операции \(s = [2, 6]\).
  3. Выбрать карточку \(4\). Добавить \(w_4 = 2\) в конец \(s\). Так как \(w_1 \leq w_4\), значение \(w_1\) остается неизменным. Удаляем карточку \(4\). После этой операции \(s = [2, 6, 2]\).
  4. Выбрать карточку \(3\). Добавить \(w_3 = 4\) в конец \(s\). Так как \(w_2 > w_3\), значение \(w_2\) становится равным \(4\). Удаляем карточку \(3\). После этой операции \(s = [2, 6, 2, 4]\).
  5. Выбрать карточку \(2\). Добавить \(w_2 = 4\) в конец \(s\). Так как \(w_1 \leq w_2\), значение \(w_1\) is left unchanged. Удаляем карточку \(2\). После этой операции \(s = [2, 6, 2, 4, 4]\).
  6. Выбрать карточку \(1\). Добавить \(w_1 = 1\) в конец \(s\). Удаляем карточку \(1\). После этой операции \(s = [2, 6, 2, 4, 4, 1]\).

Одна из наибольших неубывающих подпоследовательностей \(s = [2, 6, 2, 4, 4, 1]\) это \([2, 2, 4, 4]\). Таким образом, длина наибольшей неубывающей подпоследовательности \(s\) равна \(4\). Можно доказать, что это действительно максимально возможная длина.

D. Маша и красивое дерево

графы Деревья поиск в глубину и подобное разделяй и властвуй сортировки *1300

Девочка Маша гуляла в лесу и нашла полное бинарное дерево высоты \(n\) и перестановку \(p\) длины \(m=2^n\).

Полное бинарное дерево высоты \(n\) — это такое корневое дерево, что каждая вершина кроме листьев имеет ровно двух сыновей, а длина пути от корня до любого из листьев равна \(n\). Ниже на картинке изображено полное бинарное дерево для \(n=2\).

Перестановкой называется массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\). Например, [\(2,3,1,5,4\)] является перестановкой, а [\(1,2,2\)] не является (\(2\) встречается дважды), и [\(1,3,4\)] тоже не является перестановкой (\(n=3\), но в массиве есть \(4\)).

Пронумеруем \(m\) листьев этого дерева слева направо. В листе с номером \(i\) записано значение \(p_i\) (\(1 \le i \le m\)).

Например, если \(n = 2\), \(p = [3, 1, 4, 2]\), дерево будет выглядеть так:

Маша считает дерево красивым, если значения в его листьях упорядочены слева направо по возрастанию.

За одну операцию Маша может выбрать произвольную не являющуюся листом вершину дерева и поменять местами ее левого и правого сына (вместе с их поддеревьями).

Например, если Маша применит эту операцию к корню рассмотренного выше дерева, оно приобретет следующий вид:

Помогите Маше понять, сможет ли она за некоторое количество операций сделать дерево красивым. Если сможет, то выведите минимальное количество операций, чтобы сделать дерево красивым.

Входные данные

В первой строке дано число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В каждом наборе входных данных в первой строке дано целое число \(m\) (\(1 \le m \le 262144\)), являющееся степенью двойки  — размер перестановки \(p\).

Во второй строке даны \(m\) целых чисел: \(p_1, p_2, \dots, p_m\) (\(1 \le p_i \le m\)) — перестановка \(p\).

Гарантируется, что сумма значений \(m\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных в отдельной строке выведите минимальное возможное количество операций, за которое Маша сможет сделать дерево красивым или -1, если это невозможно.

Примечание

Рассмотрим первый тест.

В первом наборе входных данных можно действовать так (фиолетовым цветом выделена вершина, к которой на текущем шаге применяется операция):

Можно показать, что нельзя сделать дерево красивым за меньшее число операций.

Во втором наборе входных данных можно показать, что нельзя сделать дерево красивым.

В третьем наборе входных данных дерево сразу является красивым.

G. Кирилл и компания

битмаски графы дп кратчайшие пути Перебор поиск в глубину и подобное Потоки *2200

Кирилл живёт на связном неориентированном графе из \(n\) вершин и \(m\) рёбер в вершине с номером \(1\). В один прекрасный вечер он собрал у себя \(f\) друзей, \(i\)-й друг живёт в вершине \(h_i\). Таким образом, в настоящий момент все друзья находятся в вершине \(1\), каждый должен добраться домой — \(i\)-й друг должен попасть в вершину \(h_i\).

Вечер подошёл к концу и настала пора расходиться. Оказалось, что у \(k\) (\(k \le 6\)) из его друзей нет машин и им придётся идти пешком, если их никто не подвезёт. Один друг с машиной может подвезти любое количество друзей без машин, но только если он может подвезти их, проехав по одному из кратчайших путей до своего дома.

Например, в графе ниже, друг из вершины \(h_i=5\) может подвезти друзей из следующих наборов вершин: \([2, 3]\), \([2, 4]\), \([2]\), \([3]\), \([4]\), но не может подвезти друга из вершины \(6\) или набор \([3, 4]\).

Вершины в которых живут друзья без машин выделены зелёным, а с машинами — красным.

Кирилл хочет, чтобы как можно меньшему числу друзей пришлось идти пешком. Помогите ему найти минимально возможное количество.

Входные данные

Первая строка входных данных содержит целое число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных в тесте.

Первая строка набора содержит два целых числа \(n\) и \(m\) (\(2 \le n \le 10^4\), \(n-1 \le m \le min (10^4, \)\( \frac{n \cdot (n - 1)}{2} \)\()\)) — количество вершин и рёбер соответственно.

Следующие \(m\) строк набора содержат описание рёбер, по два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \ne v\)) — номера вершин, соединённых ребром. Гарантируется, что в графе нет петель и кратных рёбер.

Дальше следует строка набора, содержащая число \(f\) (\(1 \le f \le 10^4\)) — количество друзей Кирилла.

Следующая строка набора содержит \(f\) целых чисел: \(h_1, h_2, \dots, h_f\) (\(2 \le h_i \le n\)) — вершины, в которых они живут. Некоторые вершины могут повторяться.

Следующая строка набора содержит число \(k\) (\(1 \le k \le min(6, f)\)) — количество друзей без машин.

Последняя строка каждого набора содержит \(k\) целых чисел: \(p_1, p_2, \dots, p_k\) (\(1 \le p_i \le f\), \(p_i < p_{i+1}\)) — номера друзей без машин.

Гарантируется, что сумма \(n\) по всем наборам не превосходит \(10^4\), как и суммы \(m\) и \(f\).

Выходные данные

Выведите \(t\) строк, каждая из которых содержит ответ на соответствующий набор входных данных. В качестве ответа выведите единственное число — минимально возможное количество друзей, которым придётся идти пешком.

Примечание

Первый набор входных данных первого примера разобран в условии.

Во втором наборе входных данных первого примера в вершине \(5\) живут два друга с машинами, один может подвезти друзей из вершин \(2\) и \(3\), а второй из вершины \(4\), не подвезут только друга из вершины \(6\).

D. Пути на дереве

Деревья дп жадные алгоритмы поиск в глубину и подобное сортировки *1900

Вам дано корневое дерево, состоящее из \(n\) вершин. Вершины пронумерованы от \(1\) до \(n\), а корнем является вершина \(1\). Также вам дан массив коэффициентов \(s_1, s_2, \ldots, s_n\).

Мультимножество из \(k\) простых путей называется допустимым, если выполняются следующие два условия:

  • Каждый путь начинается в вершине \(1\).
  • Пусть \(c_i\) — количество путей, покрывающих вершину \(i\). Для каждой пары вершин \((u,v)\) (\(2\le u,v\le n\)), имеющих общего родителя, верно \(|c_u-c_v|\le 1\).
Значение мультимножества путей определяется как \(\sum\limits_{i=1}^n c_i s_i\).

Можно показать, что всегда можно найти хотя бы одно допустимое мультимножество. Найдите максимальное значение среди всех допустимых мультимножеств.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит единственное целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует их описание.

Первая строка каждого набора входных данных содержит два целых числа через пробел \(n\) (\(2 \le n \le 2 \cdot 10^5\)) и \(k\) (\(1 \le k \le 10^9\)) — размер дерева и требуемое количество путей.

Вторая строка содержит \(n - 1\) целое число через пробел \(p_2,p_3,\ldots,p_n\) (\(1\le p_i\le n\)), где \(p_i\) — родитель \(i\)-й вершины. Гарантируется, что данные значения корректно задают дерево с корнем в \(1\).

В третьей строке через пробел записаны \(n\) целых чисел \(s_1,s_2,\ldots,s_n\) (\(0 \le s_i \le 10^4\)) — коэффициенты вершин.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10 ^ 5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимальное значение мультимножества.

Примечание

В первом наборе входных данных одно из оптимальных решений — четыре пути \(1 \to 2 \to 3 \to 5\), \(1 \to 2 \to 3 \to 5\), \(1 \to 4\), \(1 \to 4\), при этом \(c=[4,2,2,2,2]\). Значение будет равно \(4\cdot 6+ 2\cdot 2+2\cdot 1+2\cdot 5+2\cdot 7=54\).

Во втором наборе входных данных одно из оптимальных решений — три пути \(1 \to 2 \to 3 \to 5\), \(1 \to 2 \to 3 \to 5\), \(1 \to 4\), при этом \(c=[3,2,2,1,2]\). Значение будет равно \(3\cdot 6+ 2\cdot 6+2\cdot 1+1\cdot 4+2\cdot 10=56\).

E. Кактусовая стена

графы Конструктив кратчайшие пути поиск в глубину и подобное *2400

Монокарп играет в Minecraft и хочет построить стену из кактусов. Он хочет построить ее на поле из песка размера \(n \times m\) клеток. Изначально в некоторых ячейках поля есть кактусы. Обратите внимание, что в Minecraft кактусы не могут расти на соседних по стороне клетках; и начальное поле соответствует этому ограничению. Монокарп может сажать новые кактусы (они также должны соответствовать вышеупомянутому условию). Он не может срубить ни один из кактусов, которые уже растут на поле — у него нет топора, а кактусы слишком колючие для его рук.

Монокарп считает, что стена завершена, если нет пути от верхнего ряда поля к нижнему ряду, такого, что:

  • каждые две последовательные клетки в пути соседние по стороне;
  • ни одна ячейка, принадлежащая пути, не содержит кактуса.

Ваша задача — посадить минимальное количество кактусов, чтобы построить стену (или сообщить, что это невозможно).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(m\) (\(2 \le n, m \le 2 \cdot 10^5\); \(n \times m \le 4 \cdot 10^5\)) — количество строк и столбцов, соответственно.

Затем следуют \(n\) строк, \(i\)-я строка содержит строку \(s_i\) длины \(m\), где \(s_{i, j}\) равно '#', если на пересечении \(i\)-й строки и \(j\)-го столбца растет кактус, и \(s_{i, j}\) равно '.' в противном случае.

Сумма \(n \times m\) по всем наборам входных данных не превосходит \(4 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных, в первой строку выведите NO, если невозможно построить стену кактусов не нарушая правил. В противном случае в первой строке выведите YES, затем выведите \(n\) строк по \(m\) символов — поле с кактусами, где \(j\)-й символ \(i\)-й строки равен '#', если на если на пересечении \(i\)-й строки и \(j\)-го столбца поля есть кактус, в противном случае символ равен '.'. Если существует несколько оптимальных решений, выведите любое из них.

F. Расстояние до пути

Деревья поиск в глубину и подобное Структуры данных *2800

Вам задано дерево, состоящее из \(n\) вершин. Первоначально в каждой вершине записано число \(0\).

Вам нужно обработать \(m\) запросов двух видов:

  1. Вам задан номер вершины \(v\). Выведите значение в данной вершине \(v\).
  2. Вам заданы номера вершин \(u\) и \(v\), и значения \(k\) и \(d\) (\(d \le 20\)). Вам нужно прибавить \(k\) к значению каждой вершины, расстояние от которой до пути из \(u\) в \(v\) не превосходит \(d\).

Расстояние между двумя вершинами \(x\) и \(y\) равно количеству ребер на пути из \(x\) в \(y\). Например, расстояние от \(x\) до самой \(x\) равно \(0\).

Расстояние от вершины \(v\) до некоторого пути из \(x\) в \(y\) равно минимуму из расстояний от \(v\) до любой вершины на пути из \(x\) в \(y\).

Входные данные

В первой строке задано одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество вершин в дереве.

В следующих \(n - 1\) строках заданы ребра дерева — по одному в строке. В каждой строке заданы два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\); \(u \neq v\)) — соответствующее ребро дерева. Гарантируется, что заданные ребра образуют дерево.

В следующей строке задано одно целое число \(m\) (\(1 \le m \le 2 \cdot 10^5\)) — количество запросов.

В следующих \(m\) строках заданы сами запросы — по одному в строке. Каждый запрос имеет один из следующих типов:

  • \(1\) \(v\) (\(1 \le v \le n\)) — запрос первого типа;
  • \(2\) \(u\) \(v\) \(k\) \(d\) (\(1 \le u, v \le n\); \(1 \le k \le 1000\); \(0 \le d \le 20\)) — запрос второго типа.

Дополнительное ограничение на входные данные: среди запросов есть хотя бы один запрос первого типа.

Выходные данные

Для каждого запроса первого типа выведите текущее значение в заданной вершине.

Примечание

Дерево из первого примера:

Описания некоторых запросов:
  • «\(2\) \(4\) \(5\) \(10\) \(2\)»: попадающие под прибавление вершины — это \(\{4, 2, 5, 1, 3\}\);
  • «\(2\) \(1\) \(1\) \(10\) \(20\)» и «\(2\) \(6\) \(6\) \(10\) \(20\)»: все вершины попадают под прибавление, так как расстояние до \(1\) (\(6\)) меньше \(20\) у любой вершины;
  • «\(2\) \(3\) \(2\) \(10\) \(0\)»: попадающие под прибавление вершины — это \(\{3, 1, 2\}\);
  • «\(2\) \(5\) \(2\) \(10\) \(1\)»: попадающие под прибавление вершины — это \(\{5, 2, 4, 1\}\).

D. Пляж

графы Конструктив кратчайшие пути поиск в глубину и подобное *2400

Андрей обожает море. Именно поэтому в разгар летнего сезона он решил отправиться на пляж, взяв с собой лежак, чтобы позагорать.

Пляж представляет собой прямоугольное поле, состоящее из \(n\) строк и \(m\) столбцов. Некоторые клетки этого поля свободны, на некоторых расположены дорожки, камни, ларьки и другие несдвигаемые объекты, а так же на двух соседних по стороне клетках могут стоять лежаки, расположенные как горизонтально, так и вертикально.

Андрей надеется поставить где-то свой лежак, но вот незадача, свободных мест для него может уже не быть! Именно поэтому Андрей просит вас помочь найти ему свободное место для лежака. Лежак Андрея тоже должен занимать две соседние по стороне клетки.

Если двух соседних свободных клеток нет, то для того, чтобы освободить место для лежака, придется потревожить других туристов. Для этого вы можете делать следующие действия:

  • Подойти к любому лежаку, и доставив \(p\) единиц дискомфорта его хозяину, поднять лежак за одну из сторон и повернуть на \(90\) градусов. Одна из половин лежака должна остаться в той же клетке, а вторая переместиться в свободную клетку. При этом во время поворота на пути лежака может быть что угодно.
    Поворот лежака на \(90\) градусов вокруг клетки \((1, 2)\).
  • Подойти к любому лежаку, и доставив \(q\) единиц дискомфорта его хозяину, подвинуть лежак вдоль его длинной стороны на одну клетку. Одна сторона лежака должна переместиться на место другой, а другая — в свободную клетку.
    Сдвиг лежака на одну клетку вправо.

В любой момент времени каждый лежак занимает две соседние клетки, не содержащие ничего другого. Вы можете двигать одновременно максимум один лежак.

Помогите Андрею освободить место для еще одного лежака, доставив минимальное количество дискомфорта окружающим, или скажите, что сделать это не получится.

Входные данные

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 300\,000\), \(1 \le n \cdot m \le 300\,000\)) — количество строк и столбцов на поле.

Вторая строка содержит два целых числа \(p\) и \(q\) (\(1 \le p, q \le 10^9\)) — количество единиц дискомфорта, которые приносят поворот и сдвиг лежака, соответственно.

Каждая из следующих \(n\) строк содержит \(m\) символов, описывающие клетки поля. Все строки состоят из символов «L», «R», «D», «U», «.» и «#», задающих тип клетки. Символы «L», «R», «D» и «U» обозначают половину лежака, находящегося в этой клетке — левая, правая, нижняя или верхняя половина, соответственно. Символ «.» обозначает свободную клетку, а символ «#» — клетку, занятую несдвигаемым объектом.

Выходные данные

Выведите одно число — минимальное количество дискомфорта, которое возникнет при освобождении места для лежака. Если освободить место для лежака невозможно, выведите число \(-1\).

Примечание

В первом примере, передвинув верхний лежак налево, а нижний лежак направо, Андрей сможет вертикально поставить лежак посередине пляжа. Таким образом, мы доставим \(2 + 2 = 4\) единицы дискомфорта. Можно показать, что доставить меньшее количество дискомфорта не получится.

Оптимальные действия в первом примере (лежак Андрея обозначен белым цветом).
Во втором примере из условия невозможно освободить место для лежака Андрея. Всевозможные состояния пляжа после поворотов и сдвигов показаны в условии задачи.

E. Тик-так

графы Комбинаторика поиск в глубину и подобное снм *2500

Танхаус, часовщик в городе Винден, делает необычные часы, измеряющие время в \(h\) часах, пронумерованных от \(0\) до \(h-1\). Однажды он решил сделать из таких часов загадку.

Загадка состоит из таблицы размера \(n \times m\) с часами, где каждые часы показывают какой-то час ровно (то есть время не лежит между двумя ровными часами). За один ход он может выбрать строку или столбец и перевести все часы в строке или столбце на час вперед\(^\dagger\).

Таблица с часами называется решаемой, если можно сделать так, чтобы все часы показывали одно и то же время.

При создании закагки Танхаус вдруг забеспокоился, что, возможно, его загадка не получится решаемой. В некоторых клетках таблицы уже находятся часы, которые показывают определенное время, а некоторые клетки еще пустые.

Вам дана частично заполненная таблица с часами, найдите количество способов\(^\ddagger\) заполнить пустые клетки часами так, чтобы таблица была решаемой. Так как ответ может быть большим, выведите его по модулю \(10^9 + 7\).

\(^\dagger\) Если часы показывают \(t\) часов, и их переводят на час вперед, они будут показывать \((t+1) \bmod h\) часов.

\(^\ddagger\) Два способа считаются различными, если существует клетка с часами, в двух способах показывающими различное время.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 5 \cdot 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(n\), \(m\) и \(h\) (\(1 \leq n, m \leq 2 \cdot 10^5\); \(1 \leq h \leq 10^9\)) — количество строк и столбцов в таблице, а также количество часов на каждых часах.

Каждая из следующих \(n\) строк содержит \(m\) целых чисел, описывающих часы в таблице. Число \(x\) (\(-1 \leq x < h\)) в \(i\)-м ряду в \(j\)-м столбце показывает изначальное время на соответствующих часах, а если \(x = -1\), то эта клетка пуста.

Гарантируется, что сумма значений \(n \cdot m\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите число способов заполнить пустые клетки таблицы так, чтобы загадка была решаемой. Так как ответ может быть большим, выведите его по модулю \(10^9 + 7\).

Примечание

В первом примере например подходит следующая конфигурация часов:

103
032

Она решаемая, например, так:

  1. Перевести часы в среднем столбце на час.
  2. Перевести часы в третьем столбце на час.
  3. Перевести часы в третьем столбце на час.
  4. Перевести часы во второй строке на час.
После этого все часы показывают один час.

Во втором примере можно показать, что нет решаемых конфигураций.

E. Археология

Деревья поиск в глубину и подобное Структуры данных *3100

На этот раз вам нужно помочь группе ученых-исследователей на одном острове в Тихом Океане. Они изучают культуру древних племен, живших на этом острове много лет назад.

Всего было раскопано n деревень. Некоторые пары деревень были соединены дорогами. По дорогам можно было двигаться в обоих направлениях. Всего было ровно n - 1 дорог, и из любой деревни можно было добраться в любую другую.

Племена были неспокойны и часто воевали. В результате войн некоторые деревни полностью уничтожались. В более спокойные годы некоторые из деревень возрождались заново.

В каждый момент времени использовались только те дороги, которые принадлежали какому-либо кратчайшему пути между двумя существующими в данный момент деревнями. Другими словами, использовалось наименьшее подмножество дорог так, чтобы из любой существующей деревни можно было добраться до любой другой существующей. Обратите внимание, что за всю историю острова существовало ровно n - 1 дорог, найденных исследователями, а других дорог никогда не было.

Исследователи полагают, что наблюдения за суммарной длиной используемых дорог в разные моменты времени помогут им лучше понять культуру племен и ответить на ряд исторических вопросов.

Вам будет предоставлена вся история существования племен. Ваша задача — определить суммарную длину используемых дорог в некоторые из моментов времени.

Входные данные

В первой строке дано целое число n (1 ≤ n ≤ 105) — количество деревень. В последующих n - 1 строках описаны дороги. i-я из этих строк содержит три целых числа ai, bi и ci (1 ≤ ai, bi ≤ n, ai ≠ bi, 1 ≤ ci ≤ 109, 1 ≤ i < n) — номера деревень, которые соединяет i-я дорога и ее длина. Числа в строках записаны через пробел.

В следующей строке дано целое число q (1 ≤ q ≤ 105) — количество запросов. Далее идут q запросов по одному в строке, упорядоченные по времени. Каждый запрос имеет один из трех типов:

  • «+ x» — деревня с номером x возрождается (1 ≤ x ≤ n).
  • «- x» — деревня с номером x уничтожается (1 ≤ x ≤ n).
  • «?» — в этот момент времени археологи хотят знать суммарную длину используемых дорог.

Гарантируется, что запросы не противоречат друг другу, то есть не будет запросов на уничтожение несуществующих деревень или возрождение уже существующих. Гарантируется, что имеется хотя бы один запрос типа «?». Также гарантируется, что по заданным дорогам из любой деревни можно добраться в любую другую.

Считается, что в начальный момент времени ни одной деревни не существует.

Выходные данные

На каждый запрос типа «?» выведите суммарную длину используемых дорог в отдельной строке. Ответы за запросы должны быть выведены в том порядке, в котором запросы перечислены во входных данных.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

G. Любимая задача SlavicG-а

битмаски графы поиск в глубину и подобное *1700

Вам задано взвешенное дерево с \(n\) вершинами. Деревом называется неориентированный связный граф без циклов. Дерево является взвешенным, если каждому его ребру сопоставлено число — его вес. Дерево неориентировано, не содержит корня.

Так как деревья слишком скучны, вы решили повеселить себя игрой на дереве.

За один ход вы можете переместиться из вершины в любого его соседа (такую вершину, в которую есть ребро из текущей).

Вы начинаете игру, имея значение переменной \(x\) равное \(0\). Когда вы перемещаетесь по ребру \(i\), то \(x\) изменяет своё значение на \(x ~\mathsf{XOR}~ w_i\) (где — \(w_i\) вес \(i\)-го ребра).

Ваша задача пройти от вершины \(a\) до вершины \(b\), но вы имеете право входить в вершину \(b\) только если \(x\) после этого станет равно \(0\). Другими словами, вы можете пройти по ребру \(i\), которое ведёт в \(b\) тогда и только тогда, когда \(x ~\mathsf{XOR}~ w_i = 0\). Как только вы попадаете \(b\), то игра заканчивается вашей победой.

Есть дополнительное правило — не более одного раза за игру вы можете воспользоваться телепортом. Он перемещает вас мгновенно в любую вершину (отличную от \(b\)). Вы можете использовать телепорт из любой вершины (даже из \(a\)).

Выведите «YES», если вы можете попасть в \(b\) из \(a\). Выведите «NO» в противном случае.

Операция \(\mathsf{XOR}\) обозначает битовое исключающее ИЛИ.

Входные данные

Первая строка содержит единственное целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных в тесте.

Первая строка каждого набора входных данных содержит три целых числа \(n\), \(a\) и \(b\) (\(2 \leq n \leq 10^5\)), (\(1 \leq a, b \leq n; a \ne b\)) — количество вершин, а также начальную и конечную вершина, соответственно.

Каждая из следующих \(n-1\) строк задает ребро дерева. Ребро \(i\) задано тремя целыми числами \(u_i\), \(v_i\) и \(w_i\)  — метками вершин, которые оно соединяет (\(1 \leq u_i, v_i \leq n; u_i \ne v_i; 1 \leq w_i \leq 10^9\)) и своим весом.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите «YES», если вы можете достичь вершины \(b\), и «NO» в противном случае.

Примечание

Для первого набора входных данных мы можем перейти от вершины \(1\) в вершину \(3\), при этом \(x\) изменится с \(0\) на \(1\). Затем мы перейдем из \(3\) в \(2\), при этом \(x\) станет равным \(3\). Теперь мы можем телепортироваться в узел \(3\) и переместиться из узла \(3\) в узел \(4\), достигнув узла \(b\), так как в итоге \(x\) стало равно \(0\). Поэтому ответ равен «YES».

Во втором наборе входных данных пример у нас нет ходов, так как мы не можем телепортироваться к узлу \(b\), а единственный ход, который у нас есть — это добраться до узла \(2\), что невозможно, поскольку \(x\) не будет равно \(0\). Таким образом, ответ равен «NO».

C. Построение множеств

графы жадные алгоритмы Конструктив поиск в глубину и подобное *1400

Вам дана бинарная матрица \(b\) (все элементы матрицы равны \(0\) или \(1\)) из \(n\) строк и \(n\) столбцов.

Вам нужно построить \(n\) множеств \(A_1, A_2, \ldots, A_n\), для которых выполняются следующие условия:

  • Каждое множество непустое и состоит из различных целых чисел от \(1\) до \(n\) включительно.
  • Все множества попарно различны.
  • Для всех пар \((i,j)\), удовлетворяющих условиям \(1\leq i, j\leq n\), \(b_{i,j}=1\) тогда и только тогда, когда \(A_i\subsetneq A_j\). Другими словами, \(b_{i, j}\) равно \(1\), если \(A_i\) является собственным подмножеством \(A_j\) и \(0\) в противном случае.

Множество \(X\) является собственным подмножеством множества \(Y\), если \(X\) является непустым подмножеством \(Y\), и \(X \neq Y\).

Гарантируется, что для всех наборов входных данных в этой задаче, такие \(n\) множеств существуют. Заметим, что это не означает, что такие \(n\) множеств существуют для всех возможных наборов входных данных.

Если существует несколько решений, то можно вывести любое из них.

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1\le t\le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка содержит целое число \(n\) (\(1\le n\le 100\)).

Следующие \(n\) строк содержат бинарную матрицу \(b\), \(j\)-е символ \(i\)-й строки обозначает \(b_{i,j}\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(1000\).

Гарантируется, что для всех наборов входных данных в данной задаче такие \(n\) множеств существуют.

Выходные данные

Для каждого набора входных данных выведите \(n\) строк.

В \(i\)-й строке сначала выведите \(s_i\) \((1 \le s_i \le n)\)  — размер множества \(A_i\). Затем выведите \(s_i\) попарно различных целых чисел от \(1\) до \(n\)  — элементы множества \(A_i\).

Если существует несколько решений, то можно вывести любое из них.

Гарантируется, что для всех наборов входных данных в данной задаче такие \(n\) множеств существуют.

Примечание

В первом наборе входных данных имеем \(A_1 = \{1, 2, 3\}, A_2 = \{1, 3\}, A_3 = \{2, 4\}, A_4 = \{1, 2, 3, 4\}\). Множества \(A_1, A_2, A_3\) являются собственными подмножествами \(A_4\), а также множество \(A_2\) является собственным подмножеством \(A_1\). Никакое другое множество не является собственным подмножеством никакого другого множества.

Во втором наборе входных данных имеем \(A_1 = \{1\}, A_2 = \{1, 2\}, A_3 = \{1, 2, 3\}\). \(A_1\) является собственным подмножеством \(A_2\) и \(A_3\), а \(A_2\) является собственным подмножеством \(A_3\).

F. Запросы к ребрам

графы Деревья дп поиск в глубину и подобное снм Структуры данных *3000

Вам дан неориентированных, связный граф из \(n\) вершин и \(m\) ребер. Все вершины \(u\) графа удовлетворяют следующему условию:

  • Пусть \(S_u\) это множество вершин принадлежащих длиннейшему простому циклу начинающемуся и заканчивающемуся в \(u\).
  • Пусть \(C_u\) это объединение множеств вершин всех простых циклов начинающихся и заканчивающихся в \(u\).
  • \(S_u = C_u\).

Вы должны ответить на \(q\) запросов.

Для каждого запроса вам будет дана вершина \(a\) и вершина \(b\). Для всех ребер принадлежащих любому простому пути из \(a\) в \(b\), посчитайте число ребер таких, что если вы удалите их, \(a\) и \(b\) останутся достижимы друг из друга.

Входные данные

Первая строка содержит два целых числа \(n\) и \(m\) (\(2 \le n \le 2 \cdot 10^5\), \(1 \le m \le \min\)(\(2 \cdot 10^5\), \((n \cdot (n-1))/2\))) — число вершин и ребер графа, соответственно.

Следующие \(m\) строк содержат пары целых чисел \(u\) и \(v\) (\(1 \le\) (\(u\), \(v\)) \(\le n\), \(u \neq v\)) — описывающие ребра, означающие \(u\) что \(v\) соединены друг с другом.

Гарантируется, что между одной парой вершин проведено не более одного ребра и данный граф связен.

В следующей строке содержится одно целое число \(q\) (\(1 \le q \le 2 \cdot 10^5\)) — количество запросов.

Затем \(q\) следующих строк содержат запросы. Каждая из них содержит два целых числа \(a\) и \(b\) (\(1 \le\) \(a\), \(b\) \(\le n\)).

Выходные данные

Для каждого запроса выведите одно целое число — ответ на запрос.

Примечание

Граф в первом примере:

Первый запрос это \((1, 4)\). Тут всего \(5\) ребер принадлежат любому простому пути из \(1\) в \(4\). Ребра \((3, 4), (4, 5), (5, 3)\) будут посчитаны как ответ на запрос.

Четвертый запрос \((2, 8)\). Тут только один простой путь из \(2\) в \(8\), причем ни одно ребро не будет посчитано в ответ.

Пятый запрос \((7, 10)\). Тут всего \(4\) ребра принадлежат любому простому пути из \(7\) в \(10\), все они будут посчитаны в ответе.

F. Дореми и экспериментальное дерево

Деревья Конструктив Перебор поиск в глубину и подобное снм сортировки *2500

У Дореми есть реберно-взвешенное дерево из \(n\) вершин, веса являются целыми числами от \(1\) до \(10^9\). Дореми провела \(\frac{n(n+1)}{2}\) экспериментов с деревом.

В каждом эксперименте Дореми выбирает две вершины \(i\) и \(j\) такие, что \(j \leq i\), и соединяет их дополнительным ребром веса \(1\). После этого в графе образовывается один цикл (или петля, если \(i=j\)). Дореми определяет \(f(i,j)\) как сумму длин кратчайших путей от каждой вершины до цикла.

Формально, пусть \(\mathrm{dis}_{i,j}(x,y)\) — длина кратчайшего пути между вершинами \(x\) и \(y\), когда в дерево добавлено одно ребро \((i,j)\) веса \(1\), а \(S_{i,j}\) — множество вершин на цикле, когда добавлено ребро \((i,j)\). Тогда \(\) f(i,j)=\sum_{x=1}^{n}\left(\min_{y\in S_{i,j}}\mathrm{dis}_{i,j}(x,y)\right). \(\)

Дореми записала все значения \(f(i,j)\) для \(1 \leq j \leq i \leq n\), потом пошла спать. Однако проснувшись, она обнаружила, что дерево пропало. К счастью, значения \(f(i,j)\) все еще в ее тетради, и она значит, каким \(i\) и \(j\) они соответствуют. Вам даны значения \(f(i,j)\), можете ли вы помочь Дореми восстановить дерево?

Гарантируется, что хотя бы одно подходящее дерево существует.

Входные данные

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 2000\)) — количество вершин в дереве.

Следующие \(n\) строк содержат нижне-треугольную матрицу с \(i\) целыми числами в \(i\)-й строке; \(j\)-е число в \(i\)-й строке равно \(f(i,j)\) (\(0 \le f(i,j) \le 2\cdot 10^{15}\)).

Гарантируется, что существует дерево, веса ребер которого являются целыми числами в пределах от \(1\) до \(10^9\) такое, что все значения \(f(i,j)\) для этого дерева совпадают с данными.

Выходные данные

Выведите \(n-1\) строку, описывающую дерево. В \(i\)-й строке выведите три целых числа \(u_i\), \(v_i\), \(w_i\) (\(1 \le u_i,v_i \le n\), \(1 \le w_i \le 10^9\)), обозначающих ребро \((u_i,v_i)\) веса \(w_i\).

Если существуют несколько решений, выведите любое из них.

Ребра должны образовывать дерево, а все значения \(f(i,j)\) должны совпадать с данными.

Примечание

Для первого примере рисунок ниже слева направо сверху вниз показывает графы, получающиеся при добавлении ребер \((1,1)\), \((1,2)\), \((1,3)\), \((2,2)\), \((2,3)\), \((3,3)\) соответственно. Вершины на цикле выделены желтым.

D. Удачная перестановка

графы жадные алгоритмы Конструктив поиск в глубину и подобное *1800

Вам дана перестановка\(^\dagger\) \(p\) длины \(n\).

За одну операцию вы можете выбрать два индекса \(1 \le i < j \le n\) и поменять местами \(p_i\) и \(p_j\).

Найдите минимальное количество операций, которое необходимо сделать, чтобы в итоговой перестановке была ровно одна инверсия\(^\ddagger\).

\(^\dagger\) Перестановкой называется массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) является перестановкой, но \([1,2,2]\) не является перестановкой (\(2\) встречается дважды в массиве) и \([1,3,4]\) тоже не является перестановкой (\(n=3\), но \(4\) присутствует в массиве).

\(^\ddagger\) Количеством инверсий в перестановке \(p\) называется количество пар индексов \((i, j)\) таких, что \(1 \le i < j \le n\) и \(p_i > p_j\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

В первой строке каждого набора входных данных содержится одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — длина перестановки.

Вторая строка каждого набора содержит \(n\) чисел \(p_1,p_2,\ldots, p_n\) (\(1 \le p_i \le n\)). Гарантируется, что \(p\) — перестановка.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно число — минимальное количество операций, которое необходимо сделать, чтобы в итоговом массиве была ровно одна инверсия. Можно показать, что это всегда возможно.

Примечание

В первом наборе входных перестановка уже удовлетворяет условию.

Во втором наборе вы можете выполнить операцию с \((i,j)=(1,2)\), после этого в перестановке \([2,1]\) будет ровно одна инверсия.

В третьем наборе нельзя выполнить условие меньше чем за \(3\) операции. А за \(3\) операции можно добиться выполнения условия так: \((i,j)\) должны равняться \((1,3)\), \((2,4)\), \((3,4)\) в соответствующих операциях. Итоговой перестановкой будет \([1, 2, 4, 3]\), в ней ровно одна инверсия.

В четвёртом наборе нужно сделать обмен, в котором \((i,j)=(2,4)\), в результате чего перестановка будет равняться \([2,1,3,4]\).

C1. Вечеринка

графы поиск в глубину и подобное снм *1500

В честь проведения второго турнира ABBYY Cup Умный Бобер решил устроить вечеринку. У Бобра много знакомых, и некоторые из них дружат друг с другом, а некоторые друг другу не нравятся. Чтобы вечеринка удалась на славу, Умный Бобер хочет пригласить только тех своих знакомых, которые дружат, и не приглашать тех, кто не нравится друг другу. Отношения дружбы и антипатии симметричны.

Более формально, для каждого приглашенного человека должны выполняться следующие условия:

  • все его друзья должны быть также приглашены на вечеринку;
  • среди приглашенных не должно быть людей, которые ему не нравятся;
  • все приглашенные на вечеринку должны быть связаны с ним дружбой напрямую или через цепь общих друзей произвольной длины. Будем говорить, что люди a1 и ap связаны цепью общих друзей, если существует последовательность людей a2, a3, ..., ap - 1 такая, что все пары людей ai и ai + 1 (1 ≤ i < p) — друзья.

Помогите Бобру определить максимальное количество знакомых, которых он сможет пригласить.

Входные данные

В первой строке входных данных записано целое число n — количество знакомых Бобра.

Во второй строке записано целое число k — количество пар друзей. В следующих k строках через пробел записаны пары чисел ui, vi — номера людей, которые входят в i-ую пару друзей.

В следующей строке записано число m — количество пар людей, которые друг другу не нравятся. В следующих m строках перечислены пары таких людей в том же формате, что и пары друзей.

Каждая пара людей упоминается во входных данных не более одного раза . В частности, два человека не могут быть друзьями и одновременно не нравиться друг другу.

Ограничения на входные данные для получения 30 баллов:

  • 2 ≤ n ≤ 14

Ограничения на входные данные для получения 100 баллов:

  • 2 ≤ n ≤ 2000
Выходные данные

Выведите единственное число — максимальное количество людей, которых Бобер сможет пригласить на вечеринку. Если группу людей, удовлетворяющую всем требованиям, выбрать невозможно, выведите 0.

Примечание

Рассмотрим пример.

Под условия задачи подходят две группы людей: {1, 2, 3} и {4, 5}, при этом ответом будет размер наибольшей из этих групп. Группа {6, 7, 8, 9} не подходит, так как в ней есть люди 7 и 9, которые не нравятся друг другу. Группа {1, 2, 3, 4, 5} также не подходит, так как не все ее члены связаны цепью общих друзей (например, люди 2 и 5 не связаны).

D. Косия и игра

графы игры Конструктив Паросочетания поиск в глубину и подобное Потоки реализация снм Структуры данных *2000

Косия и Махиру играют в игру с тремя массивами \(a\), \(b\) и \(c\) длины \(n\). Каждый элемент \(a\), \(b\) и \(c\) — целое число от \(1\) до \(n\) включительно.

Игра состоит из \(n\) раундов. В \(i\)-м раунде они делают следующие ходы:

  • Пусть \(S\) — мультимножество \(\{a_i, b_i, c_i\}\).
  • Косия удаляет один из элементов \(S\) по своему выбору.
  • Затем Махиру выбирает одно из двух оставшихся в \(S\) чисел.

Пусть \(d_i\) — число, выбранное Махиру в \(i\)-м раунде. Если \(d\) является перестановкой\(^\dagger\), Косия выигрывает. Иначе выигрывает Махиру.

Сейчас выбраны только массивы \(a\) и \(b\). Являясь ярым поклонником Косии, вы хотите выбрать массив \(c\) так, чтобы Косия выиграла. Вычислите количество таких \(c\) по модулю \(998\,244\,353\).

Обратите внимание, что Косия и Махиру играют оптимально.

\(^\dagger\) Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 2 \cdot 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq {10}^5\)) — размеры массивов.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \leq a_i \leq n\)).

Третья строка содержит \(n\) целых чисел \(b_1, b_2, \dots, b_n\) (\(1 \leq b_i \leq n\)).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \({10}^5\).

Выходные данные

Выведите одно целое число — количество массивов \(c\), при которых выигрывает Косия, по модулю \(998\,244\,353\).

Примечание

В первом примере есть \(6\) массивов \(c\), при которых выигрывает Косия: \([1, 2, 3]\), \([1, 3, 2]\), \([2, 2, 3]\), \([2, 3, 2]\), \([3, 2, 3]\), \([3, 3, 2]\).

Во втором примере можно показать, что нет массивов \(c\), при которых выигрывает Косия.

E. Косия и дерево

Деревья дп Комбинаторика математика поиск в глубину и подобное снм Теория вероятностей *2400

У Ими есть неориентированное дерево из \(n\) вершин, ребра которого пронумерованы от \(1\) до \(n-1\). \(i\)-е ребро соединят вершины \(u_i\) и \(v_i\). Также на дереве находятся \(k\) бабочек. Изначально \(i\)-я бабочка находится в вершине \(a_i\). Все значения \(a\) попарно различны.

Косия играет в игру следующим образом.

  • Для \(i = 1, 2, \dots, n - 1\) Косия выбирает одно из направлений \(i\)-го ребра (\(u_i \rightarrow v_i\) или \(v_i \rightarrow u_i\)) с одинаковой вероятностью.
  • Для \(i = 1, 2, \dots, n - 1\), если в начальной вершине \(i\)-го ребра есть бабочка, а в конечной вершине нет бабочки, то эта бабочка перелетает в конечную вершину. Обратите внимание, что операции выполняются для ребер \(1, 2, \dots, n - 1\) по порядку, а не одновременно.
  • Косия выбирает две бабочки из \(k\) бабочек с равной вероятностью для всех \(\frac{k(k-1)}{2}\) способов выбрать две бабочки, затем она вычисляет расстояние\(^\dagger\) между двумя вершинами, и объявляет это своим счетом.

Косия хочет, чтобы вы вычислили математическое ожидание ее счета по модулю \(998\,244\,353^\ddagger\).

\(^\dagger\) Расстоянием между двумя вершинами в дереве называется количество ребер на (единственном) простом пути между ними.

\(^\ddagger\) Формально, пусть \(M = 998\,244\,353\). Можно показать, что ответ может быть представлен в виде несократимой дроби \(\frac{p}{q}\), где \(p\) и \(q\) — целые числа, и \(q \not \equiv 0 \pmod{M}\). Выведите целое число, равное \(p \cdot q^{-1} \bmod M\). Другими словами, выведите такое целое число \(x\), что \(0 \le x < M\) и \(x \cdot q \equiv p \pmod{M}\).

Входные данные

Первая строка содержит два целых числа \(n\) и \(k\) (\(2 \leq k \leq n \leq 3 \cdot {10}^5\)) — размер дерева и количество бабочек.

Вторая строка содержит \(k\) целых чисел \(a_1, a_2, \dots, a_k\) (\(1 \leq a_i \leq n\)) — начальные позиции бабочек. Гарантируется, что все позиции попарно различны.

\(i\)-я из следующих \(n − 1\) строк содержит два целых числа \(u_i\), \(v_i\) (\(1 \leq u_i, v_i \leq n\), \(u_i \neq v_i\)) — вершины, которые соединяет \(i\)-е ребро.

Гарантируется, что заданные ребра образуют дерево.

Выходные данные

Выведите одно целое число — математическое ожидание счета Косии по модулю \(998\,244\,353\).

Примечание

Дерево из первого примера показано ниже. Вершины с бабочками отмечены жирным.

Существуют только \(2\) бабочки, поэтому выбор бабочек фиксирован. Рассмотрим следующие \(4\) случая:

  • Ориентация ребер \(1 \rightarrow 2\) и \(2 \rightarrow 3\): бабочка из вершины \(1\) перемещается в вершину \(2\), а бабочка в вершине \(3\) не двигается. Расстояние между вершинами \(2\) и \(3\) равно \(1\).
  • Ориентация ребер \(1 \rightarrow 2\) и \(3 \rightarrow 2\): бабочка из вершины \(1\) перемещается в вершину \(2\), а бабочка в вершине \(3\) не двигается, потому что вершина \(2\) занята. Расстояние между вершинами \(2\) и \(3\) равно \(1\).
  • Ориентация ребер \(2 \rightarrow 1\) и \(2 \rightarrow 3\): бабочки в вершинах \(1\) и \(3\) не двигаются. Расстояние между вершинами \(1\) и \(3\) равно \(2\).
  • Ориентация ребер \(2 \rightarrow 1\) и \(3 \rightarrow 2\): бабочка в вершине \(1\) не двигается, а бабочка из вершины \(3\) перемещается в вершину \(2\). Расстояние между вершинами \(1\) и \(2\) равно \(1\).

Таким образом, математическое ожидание счета Косии равно \(\frac {1+1+2+1} {4} = \frac {5} {4}\), что есть \(748\,683\,266\) по модулю \(998\,244\,353\).

Дерево из второго примера показано ниже. Вершины с бабочками отмечены жирным. Математическое ожидание счета Косии равно \(\frac {11} {6}\), что есть \(831\,870\,296\) по модулю \(998\,244\,353\).

D. Хоссам и дерево (под-)палиндромов

Деревья дп Перебор поиск в глубину и подобное Строки Структуры данных *2100

У Хоссама есть невзвешенное дерево \(G\), в вершинах которого записаны буквы.

Через \(s(v, \, u)\) Хоссам обозначает строку, которая получается при написании всех букв на единственном простом пути из вершины \(v\) в вершину \(u\) в дереве \(G\).

Строка \(a\) является подпоследовательностью строки \(s\), если \(a\) может быть получена из \(s\) путем удаления нескольких символов (возможно, ни одного). Например, «dores», «cf» и «for» являются подпоследовательностями «codeforces», а «decor» и «fork» не являются.

Палиндромом называется строка, читающаяся одинаково слева направо и справа налево. Например, «abacaba» — палиндром, а «abac» — нет.

Под-палиндромом строки \(s\) Хоссам называет подпоследовательность \(s\), являющуюся палиндромом. Например, «k», «abba» и «abhba» являются под-палиндромом строки «abhbka», а «abka» и «cat» — нет.

Максимальным под-палиндромом строки \(s\) Хоссам называет под-палиндром \(s\), имеющий максимальную длину среди всех под-палиндромов \(s\). Например, у строки «abhbka» есть только один максимальный под-палиндром — «abhba». Но может быть и так, что у строки несколько максимальных под-палиндромов: у строки «abcd» целых \(4\) максимальных под-палиндрома.

Хоссам просит вас найти длину самого длинного максимального под-палиндрома среди всех \(s(v, \, u)\) в заданном дереве \(G\).

Еще раз обращаем Ваше внимание на то, что под-палиндром — это подпоследовательность, а не подстрока.

Входные данные

В первой строке входного файла задано одно целое число \(t\) (\(1 \le t \le 200\)) — количество наборов входных данных.

В первой строке каждого набора входных данных задано одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^3\)) — количество вершин в дереве.

Во второй строке задана строка \(s\) длины \(n\), \(i\)-й символ которой задает букву, которая записана в вершине дерева с номером \(i\). Гарантируется, что все символы этой строке — маленькие буквы латинского алфавита.

Далее идут \(n - 1\) строк, описывающие ребра в дереве. Каждое ребро задаётся двумя целыми числами \(v\) и \(u\) (\(1 \le v, \, u \le n\), \(v \neq u\)). Эти два числа означают, что в дереве есть ребро \((v, \, u)\). Гарантируется, что заданные ребра образуют дерево.

Гарантируется, что сумма по всем \(n\) не превышает \(2 \cdot 10^3\).

Выходные данные

Для каждого набора входных данных выведите одно число — длину самого длинного максимального под-палиндрома среди всех \(s(v, \, u)\).

Примечание

В первом примере искомым подпалиндромом может быть «aaa», символы которого расположены в вершинах \(1, \, 3, \, 5\) или «aca», символы которого расположены в вершинах \(1, \, 4, \, 5\).

Дерево из первого примера.

Во втором примере единственным искомым палиндромом является «bacab», символы которого расположены в вершинах \(4, \, 2, \, 1, \, 5, \, 9\).

Дерево из второго примера.

F. Копия копии копии

графы Конструктив поиск в глубину и подобное реализация сортировки *2000

Все началось с черно-белой картинки, которую можно представить как матрицу \(n \times m\) такую, что все ее элементы равны \(0\) или \(1\). Строки пронумерованы от \(1\) до \(n\), столбцы пронумерованы от \(1\) до \(m\).

Над картинкой проделали несколько операций (возможно, ноль), каждая — одного из двух типов:

  • выбрать ячейку такую, что она не находится на границе (строка не \(1\) и не \(n\), столбец не \(1\) и не \(m\)) и она окружена четырьмя ячейками противоположного цвета (четырьмя нулями, если она единица, и наоборот), и перекрасить ее саму в противоположный цвет;
  • сделать копию текущей картинки.

Обратите внимание, что порядок операций мог быть произвольным, они могут не чередоваться.

Вам сообщили результат: все \(k\) копий, которые были сделаны. Кроме того, вам сообщили первоначальную картинку. Однако, все эти \(k+1\) картинки были перемешаны.

Восстановите последовательность операций. Если существует несколько ответов, то выведите любой из них. Тесты построены из реальной последовательности операций, т. е. хотя бы один ответ всегда существует.

Входные данные

В первой строке записаны три целых числа \(n, m\) и \(k\) (\(3 \le n, m \le 30\); \(0 \le k \le 100\)) — количество строк, количество столбцов и количество сделанных копий, соответственно.

Затем следуют \(k+1\) картинок — \(k\) копий и первоначальная. Их порядок произвольный.

Каждая картинка состоит из \(n\) строк, в каждой по \(m\) символов, каждый символ — это \(0\) или \(1\). Перед каждой картинкой идет пустая строка.

Выходные данные

В первой строке выведите одно целое число — номер первоначальной картинки. Картинки пронумерованы от \(1\) до \(k+1\) в порядке, в котором они заданы во входных данных.

Во второй строке выведите одно целое число \(q\) — количество операций.

В каждой из следующих \(q\) строк должна быть записана одна операция. Операции должны быть перечислены в том порядке, в котором они применялись. Каждая операция может быть одного из двух типов:

  • \(1\) \(x\) \(y\) — перекрасить ячейку \((x, y)\) (\(y\)-я ячейка в \(x\)-й строке, она не должна лежать на границу и должна быть окружена четырьмя клетками противоположного от себя цвета);
  • \(2\) \(i\) — сделать копию текущей картинки и присвоить ей номер \(i\) (картинка под номером \(i\) должна совпадать с текущей картинкой).

Каждый номер от \(1\) до \(k+1\) должен встречаться в выводе ровно один раз — один из них — это номер первоначальной картинки, остальные \(k\) — аргументы операций второго типа.

Если существует несколько ответов, то выведите любой из них. Тесты построены из реальной последовательности операций, т. е. хотя бы один ответ всегда существует.

E. Две шахматные фигуры

Деревья дп жадные алгоритмы поиск в глубину и подобное *1900

У Cirno_9baka есть дерево с \(n\) вершинами. Он готов поделиться им с вами, что означает, что вы можете на нем оперировать.

Изначально в вершине \(1\) дерева стоят две шахматные фигуры. За один шаг вы можете выбрать любую фигуру и переместить ее в соседнюю вершину. Вам также дано целое число \(d\). Вам нужно выполнить следующее условие: расстояние между двумя фигурами всегда должно не превышать \(d\).

У каждой из этих двух фигур есть последовательность вершин, которые они должны пройти в любом порядке, и, в конце концов, они должны вернуться в корень. Как любознательный мальчик, он хочет узнать минимальное количество шагов, которое для этого необходимо сделать.

Входные данные

Первая строка содержит два целых числа \(n\) и \(d\) (\(2 \le d \le n \le 2\cdot 10^5\)).

В \(i\)-й из следующих \(n - 1\) строк содержится два целых числа \(u_i, v_i\) \((1 \le u_i, v_i \le n)\), обозначающих ребро между вершинами \(u_i, v_i\) дерева.

Гарантируется, что эти ребра образуют дерево.

Следующая строка содержит целое число \(m_1\) (\(1 \le m_1 \le n\)) и \(m_1\) целых чисел \(a_1, a_2, \ldots, a_{m_1}\) (\(1 \le a_i \le n\), все \(a_i\) попарно различны)  — последовательность вершин, которые должна пройти первая фигура.

Вторая строка содержит целое число \(m_2\) (\(1 \le m_2 \le n\)) и \(m_2\) целых чисел \(b_1, b_2, \ldots, b_{m_2}\) (\(1 \le b_i \le n\), все \(b_i\) попарно различны)  — последовательность вершин, которые должна пройти вторая фигура.

Выходные данные

Выведите одно целое число  — минимальное количество шагов, которые необходимо сделать.

Примечание

В первом примере, вот одна возможная последовательность шагов длиной \(6\).

  • Вторая фигура перемещается по маршруту \(1 \to 2 \to 4 \to 2 \to 1\).

  • Затем, первая фигура перемещается по маршруту \(1 \to 3 \to 1\).

Во втором примере, вот одна возможная последовательность шагов длиной \(8\):

  • Первая фигура перемещается по маршруту \(1 \to 2 \to 3\).

  • Затем, вторая фигура перемещается по маршруту \(1 \to 2\).

  • Затем, первая фигура перемещается по маршруту \(3 \to 4 \to 3 \to 2 \to 1\).

  • Затем, вторая фигура перемещается по маршруту \(2 \to 1\).

D. Дружелюбные пауки

графы кратчайшие пути математика поиск в глубину и подобное теория чисел *1800

На Марсе обитает необычный вид пауков — двоичные пауки.

Прямо сейчас марсианские ученые наблюдают за колонией из \(n\) пауков, \(i\)-й из которых имеет \(a_i\) лапок.

Некоторые пауки дружат между собой. А именно, \(i\)-й и \(j\)-й пауки являются друзьями, если \(\gcd(a_i, a_j) \ne 1\), т. е. существует некоторое число \(k \ge 2\) такое, что \(a_i\) и \(a_j\) одновременно делятся на \(k\) без остатка. Здесь \(\gcd(x, y)\) обозначает наибольший общий делитель (НОД) чисел \(x\) и \(y\).

Ученые обнаружили, что пауки могут передавать сообщения. Если два паука являются друзьями, то тогда они могут передать сообщение напрямую за одну секунду. Иначе паук должен передать сообщение своему другу, тот, в свою очередь, должен передать сообщение своему другу, и так далее, пока сообщение не дойдет до адресата.

Рассмотрим пример.

Пусть паук с восемью лапками хочет передать сообщение пауку с \(15\)-ю лапками. Напрямую он этого сделать не может, потому что \(\gcd(8, 15) = 1\). Зато он может передать сообщение через паука с шестью лапками, поскольку \(\gcd(8, 6) = 2\) и \(\gcd(6, 15) = 3\). Таким образом, сообщение дойдет за две секунды.

Прямо сейчас ученые наблюдают, как \(s\)-й паук хочет передать сообщение \(t\)-му пауку. У исследователей есть гипотеза, что пауки всегда передают сообщения оптимально. По этой причине ученым потребуется программа, которая смогла бы вычислить минимальное время передачи сообщения, а также вывести один из оптимальных маршрутов.

Входные данные

В первой строке входных данных находится целое число \(n\) (\(2 \le n \le 3\cdot10^5\)) — количество пауков в колонии.

Во второй строке входных данных находится \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 3\cdot10^5\)) — количество лапок у пауков.

В третьей строке входных данных находится два целых числа \(s\) и \(t\) (\(1 \le s, t \le n\)) — пауки, между которыми необходимо передать сообщение.

Выходные данные

Если передать сообщение между заданной парой пауков невозможно, выведите \(-1\).

Иначе в первой строке выходных данных выведите целое число \(t\) (\(t \ge 1\)) — количество пауков, которые участвуют в передаче сообщения (т. е. минимальное время доставки сообщения в секундах плюс один). Во второй строке выведите \(t\) различных целых чисел \(b_1, b_2, \ldots, b_t\) (\(1 \le b_i \le n\)) — номера пауков, через которых должно следовать сообщение, в порядке его следования от отправителя к получателю.

Если вариантов построения оптимального маршрута для сообщения несколько, то выведите любой из них.

Примечание

Первый пример разобран выше. В нем видно, что сообщение от паука номер \(5\) (с восемью лапками) к пауку номер \(6\)\(15\)-ю лапками) оптимально передать через паука номер \(4\) (с шестью лапками).

Во втором примере паук номер \(7\)\(11\) лапками) ни с кем не дружит, поэтому ему невозможно передать сообщение.

D. Цена дерева

битмаски Деревья дп Комбинаторика математика поиск в глубину и подобное Теория вероятностей *1900

Дано дерево на \(n\) вершинах, корень дерева — вершина \(1\). В каждой вершине написано значение, изначально (в момент \(t=0\)) равное \(0\) или \(1\).

В каждый целочисленный момент времени \(t>0\) значение вершины становится равно побитовому исключающему ИЛИ значений ее детей в момент времени \(t - 1\); значения листьев становятся равными \(0\), поскольку у них детей нет.

Через \(S(t)\) обозначим сумму значений всех вершин в момент \(t\).

Через \(F(A)\) обозначим сумму \(S(t)\) по всем значениям \(t\) в диапазоне \(0 \le t \le 10^{100}\), где \(A\) — некоторая изначальная расстановка \(0\) и \(1\) в дереве.

Ваша задача — найти сумму \(F(A)\) по всем \(2^n\) изначальным расстановкам \(0\) и \(1\) в дереве. Выведите ответ по модулю \(10^9+7\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество вершин в дереве.

Следующие \(n-1\) строк каждого набора входных данных содержат по два числа — \(u\), \(v\), задающие ребро между \(u\) и \(v\) (\(1 \le u, v \le n\)).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите сумму по модулю \(10^9+7\).

Примечание

Найдём \(F(A)\) для расстановки \(A = [0,1,0,0,1,1]\) (\(A[i]\) означает значение вершины \(i\)). Состояние дерева в момент времени \(t = 0\) изображено ниже. В каждой вершине записаны два числа: ее номер, затем ее значение. \(S(0)\) в такой конфигурации равно \(3\).

В момент \(t = 1\) конфигурация меняется на \([1,0,0,0,0,0]\). Дерево будет выглядеть так, как показано на рисунке ниже. Имеем \(S(1) = 1\).

В момент \(t = 2\) конфигурация меняется на \([0,0,0,0,0,0]\). Дерево будет выглядеть так, как показано на рисунке ниже. Имеем \(S(2) = 0\).

Для всех \(t>2\) граф остаётся неизменным, то есть \(S(t)=0\) для всех \(t > 2\). Поэтому изначальная расстановка \(A = [0,1,0,0,1,1]\) имеет значение \(F(A) = 3 + 1 = 4\).

Выполнив аналогичный процесс для всех \(2^{6}\) возможных стартовых расстановок, получим ответ \(\textbf{288}\).

E. Разворот ребер

Бинарный поиск графы Деревья поиск в глубину и подобное *2200

Задан ориентированный взвешенный граф на \(n\) вершинах и \(m\) ориентированных ребрах, вес \(i\)-го ребра равен \(w_i\) (\(1 \le i \le m\)).

Нужно развернуть несколько ребер (изменить их ориентацию на противоположную) в этом графе таким образом, чтобы все вершины графа стали достижимы из какой-то одной. Стоимость таких разворотов равна максимальному весу среди всех развернутых ребер. Если можно обойтись без разворота ребер, стоимость считается равной \(0\).

Гарантируется, что в графе нет петель и кратных ребер.

Найдите наименьшую стоимость, необходимую для достижения цели. Если решения нет, выведите \(-1\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два числа: \(n\) и \(m\) (\(2 \le n \le 2 \cdot 10^5\), \(1 \le m \le 2 \cdot 10^5\)) — количество вершин в графе и количество ребер в графе.

Следующие \(m\) строк каждого набора входных данных содержат по \(3\) числа \(u\), \(v\), \(w\) (\(1 \le u, v \le n\), \(1 \le w \le 10^9\)), которые задают ребро из \(u\) в \(v\) с весом \(w\). Гарантируется, что никакое ребро не соединяет вершину саму с собой, а также никакая пара ребер не имеют одновременно общее начало и общий конец.

Гарантируется, что сумма значений \(n\), а также сумма значений \(m\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите наименьшую необходимую стоимость. Если решения нет, выведите \(-1\).

Примечание

В первом наборе входных данных существует ребро из \(1\) в \(2\), так что все вершины уже достижимы из \(1\).

Во втором наборе входных данных невозможно добиться того, чтобы все вершины были достижимы из какой-то одной, как бы ни были развернуты ребра. Поэтому в качестве ответа нужно вывести \(-1\).

В третьем наборе входных данных можно развернуть \(4\)-е или \(5\)-е ребро. После этого все вершины станут достижимы из вершины \(1\). Для ответа выбирается \(5\)-е ребро, поскольку его вес меньше.

E. Дерево упало!

битмаски Деревья математика поиск в глубину и подобное *2500

Недавно на голову Боба с неба упало дерево. В дереве \(n\) вершин. В каждой вершине \(u\) дерева записано целое число \(a_u\). В дереве нет фиксированного корня, так как оно упало с неба.

В настоящее время Боб изучает дерево. Чтобы внести некоторую изюминку, Алиса предлагает игру. Сначала Боб выбирает некоторую вершину \(r\) корнем дерева. После этого Алиса выберет вершину \(v\) и сообщит ее Бобу. Затем Боб выберет одну или несколько вершин из поддерева вершины \(v\). Его результат будет равен побитовому исключающему ИЛИ всех значений, записанных в выбранных им вершинах. Боб должен сказать, какой максимальный результат он может получить для заданных \(r\) и \(v\).

Поскольку Боб не умеет решать задачи, он просит вас помочь ему найти ответ. Сможете ли вы ему помочь? Вам нужно найти ответ для нескольких комбинаций \(r\) и \(v\) для одного дерева.

Напомним, что дерево — это связный неориентированный граф без циклов. Поддерево вершины \(u\) — это множество всех вершин \(y\) таких, что простой путь от \(y\) до корня проходит через \(u\). Обратите внимание, что вершина \(u\) входит в поддерево вершины \(u\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка содержит целое число \(n\) (\(2\leq n\leq 2 \cdot 10^5\)) — количество вершин дерева.

Следующая строка содержит \(n\) разделенных пробелами целых чисел \(a_1, a_2, \dots, a_n\) (\(1\leq a_i\leq 10^9\)) — значения, записанные на вершинах.

Каждая из следующих \(n-1\) строк содержит два целых числа \(u\) и \(v\) (\(1\leq u, v\leq n\); \(u\neq v\)), обозначающих наличие неориентированного ребра между вершиной \(u\) и вершиной \(v\). Гарантируется, что данные ребра образуют дерево.

Следующая строка содержит целое число \(q\) (\(1\leq q\leq 2 \cdot 10^5\)) — количество запросов.

Каждая из следующих \(q\) строк содержит два целых числа \(r\) и \(v\) (\(1\leq r, v\leq n\)) — корневую вершину, которую определит Боб, и вершину, которую выберет Алиса.

Гарантируется, что сумма \(n\) и сумма \(q\) по всем наборам входных данных не превышают \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных для каждого запроса выведите строку, содержащую целое число, обозначающее максимальный результат, который может получить Боб.

Примечание

На каждом из приведенных ниже рисунков вершина, окрашенная в зеленый цвет — это вершина, выбранная Бобом, а вершина, окрашенный в красный цвет — это вершина, выбранная Алисой. Значения вершин помещены в синие ячейки рядом с вершинами.

Рассмотрим первый пример. В первом запросе, если мы примем вершину \(4\) за корень, дерево будет выглядеть так, как показано на рисунке ниже:

Дерево с корнем \(4\) в первом запросе.
Вершинами в поддереве \(2\) являются: \([2,1,5,6,3]\). Среди них Боб может выбрать вершину \(3\), \(5\) и \(6\). Его результат будет следующим: \(a_3 \oplus a_5 \oplus a_6 = 8 \oplus 6 \oplus 1 = 15\). Он не может набрать больше этого значения.

Во втором запросе, если сделать корнем \(3\), то дерево будет выглядеть так:

Дерево с корнем \(3\) во втором запросе.
Единственной вершиной в поддереве \(5\) является \(5\). Боб может выбрать только вершину \(5\). Его результатом будет \(a_5 = 6\).

В третьем запросе, если корень — \(1\), то дерево выглядит следующим образом:

Дерево с корнем \(1\) в третьем запросе.
Вершинами в поддереве \(2\) являются: \([2,3,6,4]\). Среди них Боб может выбрать вершину \(2\), \(3\) и \(4\). Его результат будет следующим: \(a_2 \oplus a_3 \oplus a_4 = 12 \oplus 8 \oplus 25 = 29\). Он не может набрать больше этой суммы.

F. Максимизируем корень

графы Деревья дп математика поиск в глубину и подобное теория чисел *2600

Вам дано корневое дерево, состоящее из \(n\) вершин, пронумерованных от \(1\) до \(n\). Вершина \(1\) является корнем дерева. Каждая вершина имеет целочисленное значение. Значение \(i\)-й вершины равно \(a_i\). Следующую операцию можно выполнить не более \(k\) раз:

  • Выберите вершину \(v\), которая не была выбрана ранее, и целое число \(x\) такое, что \(x\) является общим делителем значений всех вершин поддерева \(v\). Умножьте значение каждой вершины поддерева \(v\) на \(x\).

Какое максимально возможное значение корневой вершины \(1\) можно получить после не более чем \(k\) операций? Формально, вы должны максимизировать значение \(a_1\).

Дерево — это связный неориентированный граф без циклов. Корневое дерево — это дерево с выбранной вершиной, которая называется корнем. Поддерево вершины \(u\) — это множество всех вершин \(y\) таких, что простой путь от \(y\) до корня проходит через \(u\). Обратите внимание, что вершина \(u\) входит в поддерево вершины \(u\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 50\,000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(k\) (\(2 \leq n \leq 10^5\), \(0 \leq k \leq n\)) — количество вершин в дереве и количество операций.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 1000\)), где \(a_i\) обозначает значение в вершине \(i\).

Каждая из следующих \(n - 1\) строк содержит два целых числа \(u_i\) и \(v_i\) (\(1 \leq u_i, v_i \leq n\), \(u_i \neq v_i\)), обозначающих ребро дерева между вершинами \(u_i\) и \(v_i\). Гарантируется, что заданные ребра образуют дерево.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора выведите максимальное значение корня после выполнения не более чем \(k\) операций.

Примечание

Оба примера имеют одно и то же дерево:

Для первого набора вы можете выполнить две операции следующим образом:

  • Выберите поддерево с вершиной \(4\) и \(x = 2\).
    После этой операции значения вершин станут \(\{24, 12, 24, 12, 12\}.\)
  • Выберите поддерево с вершиной \(1\) и \(x = 12\).
    После этой операции значения вершин станут \(\{288, 144, 288, 144, 144\}.\)
Значение корня равно \(288\) и является максимальным.

Для второго тестового примера можно выполнить три операции следующим образом:

  • Выберите поддерево с вершиной \(4\) и \(x = 2\).
    После этой операции значения вершин станут \(\{24, 12, 24, 12, 12\}.\)
  • Выберите поддерево с вершиной \(2\) и \(x = 4\).
    После этой операции значения вершин станут \(\{24, 48, 24, 48, 48\}.\)
  • Выберите поддерево с вершиной \(1\) и \(x = 24\).
    После этой операции значения вершин станут \(\{576, 1152, 576, 1152, 1152\}.\)
Значение корня равно \(576\) и является максимальным.

F. Двойная сортировка II

графы Паросочетания поиск в глубину и подобное Потоки *2500

Даны две перестановки \(a\) и \(b\), обе размера \(n\). Перестановка размера \(n\) — это массив из \(n\) элементов, в который каждое целое число от \(1\) до \(n\) входит ровно один раз. Элементы в каждой перестановке пронумерованы от \(1\) до \(n\).

Вы можете выполнять следующую операцию любое количество раз:

  • выбрать целое число \(i\) от \(1\) до \(n\);
  • обозначим за \(x\) такое целое число, что \(a_x = i\). Поменять местами \(a_i\) и \(a_x\);
  • обозначим за \(y\) такое целое число, что \(b_y = i\). Поменять местами \(b_i\) и \(b_y\).

Вы должны отсортировать обе перестановки в порядке возрастания (то есть должны выполняться условия \(a_1 < a_2 < \dots < a_n\) и \(b_1 < b_2 < \dots < b_n\)) за минимальное количество операций. Обратите внимание, что обе перестановки должны быть отсортированы после того, как вы выполните выбранную вами последовательность операций.

Входные данные

В первой строке задано одно целое число \(n\) (\(2 \le n \le 3000\)).

Во второй строке заданы \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\); все \(a_i\) различны).

В третьей строке заданы \(n\) целых чисел \(b_1, b_2, \dots, b_n\) (\(1 \le b_i \le n\); все \(b_i\) различны).

Выходные данные

Сначала выведите одно целое число \(k\) (\(0 \le k \le 2n\)) — минимальное количество операций, за которое можно отсортировать обе перестановки. Обратите внимание: можно показать, что \(2n\) операций всегда достаточно.

Затем выведите \(k\) целых чисел \(op_1, op_2, \dots, op_k\) (\(1 \le op_j \le n\)), где \(op_j\) — значение \(i\), выбранное для \(j\)-й операции.

Если ответов несколько, выведите любой из них.

D. Игра на оси

графы Комбинаторика поиск в глубину и подобное реализация снм *1900

Есть \(n\) точек \(1,2,\ldots,n\), у каждой точки \(i\) написано число \(a_i\). Вы играете в игру на этих точках. Изначально вы находитесь в точке \(1\). Когда вы находитесь в точке \(i\), выполните следующий шаг:

  • Если \(1\le i\le n\), перейдите к точке \(i+a_i\);
  • В противном случае игра заканчивается.

Перед началом игры вы можете выбрать два целых числа \(x\) и \(y\), удовлетворяющих \(1\le x\le n\), \(-n \le y \le n\), и заменить число \(a_x\) на \(y\) (сделать \(a_x := y\)). Найдите количество различных пар \((x,y)\), при которых игра, которую вы начнете после замены, закончится за конечное число шагов.

Обратите внимание, что вам не нужно удовлетворять условию \(a_x\not=y\).

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит целое число \(t\) (\(1\le t\le 10^4)\) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1\le n\le 2\cdot 10^5\)) — количество точек.

Вторая строка содержит \(n\) целых чисел \(a_1,a_2,\ldots,a_n\) (\(-n \le a_i \le n\)) — числа на оси.

Гарантируется, что сумма \(n\) не превосходит \(2\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите строку, содержащую одно целое число — количество различных пар \((x,y)\), игра с которыми конечна.

Примечание

В первом наборе входных данных парами \((x,y)\), с которыми игра конечна, являются \((1,-1)\) и \((1,1)\), соответствующие маршрутам \(1\rightarrow 0\) и \(1\rightarrow 2\). Обратите внимание, что пара \((1,2)\) не подходит, так как при \(n=1\) равенство \(y=2\) нарушает \(-n\le y\le n\). \((1,0)\) также не подходит, так как вы всегда переходите от \(1\) к \(1\), и игра не заканчивается.

Во втором наборе входных данных подходящие пары равны \((1,-2),(1,-1),(1,2),(2,-2),(2,-1),(2,0),(2,1),(2,2)\).

В четвертом наборе входных данных подходящие пары \((1,-2),(1,-1),(1,1),(1,2),(2,-2),(2,1),(2,2)\).

E. Сумма больше нуля

дп поиск в глубину и подобное Структуры данных *2200

Вам дан массив \(a_1, a_2, \ldots, a_n\) из \(n\) целых чисел. Рассмотрим набор отрезков \(S\), удовлетворяющий следующим условиям.

  • Каждый элемент \(S\) должен иметь вид \([x, y]\), где \(x\) и \(y\) — целые числа от \(1\) до \(n\) включительно, и \(x \leq y\).
  • Никакие два отрезка в \(S\) не пересекаются друг с другом. Два отрезка \([a, b]\) и \([c, d]\) пересекаются тогда и только тогда, когда существует такое целое число \(x\), что \(a \leq x \leq b\) и \(c \leq x \leq d\).
  • Для каждого \([x, y]\) в \(S\) выполняется \(a_x+a_{x+1}+ \ldots +a_y \geq 0\).

Длина отрезка \([x, y]\) определяется как \(y-x+1\). \(f(S)\) определяется как сумма длин всех отрезков в \(S\). Формально, \(f(S) = \sum_{[x, y] \in S} (y - x + 1)\). Обратите внимание, что если \(S\) пусто, то \(f(S)\) равно \(0\).

Каково максимальное значение \(f(S)\) среди всех возможных \(S\)?

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)).

Во второй строке содержится \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(-10^9 \leq a_i \leq 10^9\)).

Выходные данные

Выведите одно целое число — максимальное \(f(S)\) среди всех возможных \(S\).

Примечание

В первом примере \(S=\{[1, 2], [4, 5]\}\) может являться \(S\), так как \(a_1+a_2=0\) и \(a_4+a_5=1\). \(S=\{[1, 4]\}\) также допустимо.

Поскольку не существует ни одного \(S\), удовлетворяющего условию \(f(S) > 4\), ответ — \(4\).

Во втором примере \(S=\{[1, 9]\}\) — единственное множество, которое удовлетворяет \(f(S)=9\). Поскольку все возможные \(S\) удовлетворяют \(f(S) \leq 9\), ответ — \(9\).

В третьем примере \(S\) может быть только пустым множеством, поэтому ответ — \(0\).

F. XOR, деревья и запросы

битмаски графы Деревья жадные алгоритмы Конструктив поиск в глубину и подобное реализация снм *2500

Вам дано дерево с \(n\) вершинами. Вершины пронумерованы от \(1\) до \(n\).

Вам нужно будет назначить каждому ребру вес. Пусть вес \(i\)-го ребра будет \(a_i\) (\(1 \leq i \leq n-1\)). Вес каждого ребра должен быть целым числом от \(0\) до \(2^{30}-1\), включительно.

Вам дано \(q\) условий. Каждое условие состоит из трех целых чисел \(u\), \(v\) и \(x\). Это означает, что побитовое исключающее ИЛИ всех ребер на кратчайшем пути от \(u\) до \(v\) должно быть равно \(x\).

Выясните, существуют ли числа \(a_1, a_2, \ldots, a_{n-1}\), удовлетворяющие заданным условиям. Если существуют, выведите такое решение, при котором \(a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1}\) будет наименьшим. Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ.

Если существует несколько решений таких, что \(a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1}\) является наименьшим, выведите любое из них.

Входные данные

Первая строка содержит два целых числа \(n\) и \(q\) (\(2 \le n \le 2.5 \cdot 10^5\), \(0 \le q \le 2.5 \cdot 10^5\)). В \(i\)-й из следующих \(n-1\) строк содержится два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\), \(x_i \neq y_i\)), то есть \(i\)-е ребро соединяет вершины \(x_i\) и \(y_i\) в дереве.

Гарантируется, что заданные ребра образуют дерево.

Следующие \(q\) строк содержат информацию об условиях.

Каждая строка содержит три целых числа \(u\), \(v\), \(x\) (\(1 \le u, v \le n\), \(u \neq v\), \(0 \le x \le 2^{30}-1\)), означающие, что побитовое исключающее ИЛИ всех ребер на кратчайшем пути от \(u\) до \(v\) должно быть \(x\).

Выходные данные

Если не существует \(a_1\), \(a_2\), ..., \(a_{n-1}\), которые удовлетворяют заданным условиям, выведите «No».

В противном случае в первой строке выведите «Yes».

Затем в следующей строке выведите \(n-1\) целых чисел, где \(i\)-е целое число — это вес \(i\)-го ребра. Если существует несколько решений, то выведите такое решение, при котором \(a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1}\) будет наименьшим.

Если существует несколько решений, при которых \(a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1}\) принимает наименьшее значение, выведите любое.

При выводе «Yes» или «No» вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

Для первого примера не существует набора весов ребер, удовлетворяющего заданному условию.

Для второго примера два условия означают, что \(a_1 \oplus a_2 \oplus a_3=2\) и \(a_4 \oplus a_5=7\). Может существовать несколько решений, например, \((a_1, a_2, a_3, a_4, a_5)=(1, 2, 1, 4, 3)\).

Для третьего примера два условия означают, что \(a_1 \oplus a_2 \oplus a_3=3\) и \(a_1 \oplus a_4 \oplus a_5=5\). Существует множество решений, удовлетворяющих данному условию.

\((a_1, a_2, a_3, a_4, a_5)=(1, 1, 3, 4, 0)\) удовлетворяет заданным условиям, но побитовое исключающее ИЛИ весов всех ребер равно \(7\), что не является наименьшим возможным значением \(a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1}\), поэтому это не является верным решением.

F. Тимофей и черно-белое дерево

графы Деревья жадные алгоритмы кратчайшие пути математика Перебор поиск в глубину и подобное разделяй и властвуй *2100

Тимофей приехал в известную летнюю школу и нашел там дерево на \(n\) вершинах. Дерево — это связный неориентированный граф без циклов.

Каждая вершина этого дерева, кроме \(c_0\), покрашена в белый цвет. Вершина \(c_0\) покрашена в черный цвет.

Тимофей хочет покрасить все вершины этого дерева в черный цвет. Для этого он выполняет \(n - 1\) операцию. Во время \(i\)-й операции он выбирает белую вершину \(c_i\) и красит ее в черный цвет.

Назовем позитивностью дерева минимальное расстояние между всеми парами различных черных вершин в нем. Расстоянием между вершинами \(v\) и \(u\) называется количество ребер на пути от \(v\) до \(u\).

После каждой очередной покраски Тимофей хочет знать позитивность текущего дерева.

Входные данные

В первой строке записано число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записаны числа \(n, c_0\) (\(2 \le n \le 2 \cdot 10^5\), \(1 \le c_0 \le n\)) — количество вершин в дереве и номер начальной черной вершины.

Во второй строке каждого набора входных данных записано \(n - 1\) различных чисел \(c_1, c_2, \dots, c_{n-1}\) (\(1 \le c_i \le n\), \(c_i \ne c_0\)), где \(c_i\) это вершина, покрашенная в черный цвет во время \(i\)-й операции.

В следующей \(n - 1\) строке каждого набора входных данных записаны числа \(v_i, u_i\) (\(1 \le v_i, u_i \le n\)) — ребра в дереве.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите в отдельной строке \(n - 1\) число.

Число с номером \(i\) должно быть равно позитивности дерева, полученного первыми \(i\) покрасками.

Примечание

В первом наборе входных данных, после второй покраски, дерево выглядит так:

Расстояние между вершинами \(1\) и \(6\) равно \(3\), расстояние между вершинами \(4\) и \(6\) равно \(3\), расстояние между вершинами \(1\) и \(4\) равно \(2\). Позитивность такого дерева равна минимуму из этих расстояний, то есть \(2\).

В третьем наборе входных данных, после четвертой покраски, дерево выглядит так:

Позитивность такого дерева равна \(2\).

G. Фишки на графе

графы Конструктив кратчайшие пути поиск в глубину и подобное *2300

Вам дан неориентированный связный граф, в некоторых вершинах которого находятся фишки и/или бонусы. Рассмотрим игру, в которой участвует один игрок  — вы.

Вы можете передвигать фишки согласно следующим правилам:

  • В начале игры вы можете совершить ровно один ход: подвинуть любую фишку на любую соседнюю вершину.
  • Если перемещение фишки завершилось на бонусе, то разрешается совершить ещё один ход любой другой фишкой.

Можно использовать разные бонусы в любом порядке, один и тот же бонус может быть использован несколько раз. Бонусы в ходе игры не перемещаются.

В одной вершине может одновременно находиться несколько фишек, но изначально в каждой вершине находится не более одной фишки.

Вершина с номером \(1\) является финишной, и ваша задача — определить, можно ли попасть в неё какой-либо фишкой, совершая ходы фишками по описанным выше правилам. Если какая-то фишка изначально находится в вершине \(1\), то игра считается уже выигранной.

Финиш обозначен чёрным цветом, бонусы красным, фишки — серым.
Например, для данного графа можно дойти до финиша фишкой из \(8\)-й вершины, совершив следующую последовательность ходов:
  1. Перейти из \(8\)-й вершины в \(6\)-ю.
  2. Перейти из \(7\)-й вершины в \(5\)-ю.
  3. Перейти из \(6\)-й вершины в \(4\)-ю.
  4. Перейти из \(5\)-й вершины в \(6\)-ю.
  5. Перейти из \(4\)-й вершины в \(2\)-ю.
  6. Перейти из \(6\)-й вершины в \(4\)-ю.
  7. Перейти из \(2\)-й вершины в \(1\)-ю, которая является финишной.
Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют описания наборов входных данных.

Первая строка описания каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1 \le n \le 2 \cdot 10^5\), \(0 \le m \le 2 \cdot 10^5\)) — число вершин и рёбер в графе, соответственно.

Вторая строка описания каждого набора входных данных содержит два целых числа \(p\) и \(b\) (\(1 \le p \le n, 0 \le b \le n\)) — число фишек и бонусов, соответственно.

Третья строка описания каждого набора входных данных содержит \(p\) различных целых чисел от \(1\) до \(n\) — номера вершин, в которых находятся фишки.

Четвёртая строка описания каждого набора входных данных содержит \(b\) различных целых чисел от \(1\) до \(n\) — номера вершин, в которых находятся бонусы. Обратите внимание, что значение \(b\) может быть равно \(0\). В этом случае эта строка является пустой.

В одной вершине могут одновременно находиться и фишка и бонус.

Следующие \(m\) строк описания каждого набора входных данных содержат по два целых числа \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\), \(u_i \ne v_i\)) — вершины, соединяемые \(i\)-м ребром. Между каждой парой вершин существует не более одного ребра. Заданный граф является связным, то есть из любой вершины можно попасть в любую, двигаясь по рёбрам.

Наборы входных данных разделены пустой строкой.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\). Аналогично, гарантируется, что сумма \(m\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных в отдельной строке выведите YES, если можно дойти до финиша какой-нибудь фишкой, и NO в противном случае.

Вы можете выводить YES и NO в любом регистре (например, строки yEs, yes, Yes и YES будут распознаны как положительный ответ).

Примечание
  • Первый набор входных данных разобран в условии.
  • Во втором наборе входных данных есть только одна фишка, она может походить только один раз, и не может дойти до финиша.
  • В третьем наборе входных данных фишка может дойти до финиша за \(1\) ход.
  • В четвёртом наборе входных данных нужно просто походить от вершины \(2\) к вершине \(1\).
  • В шестом наборе входных данных фишка изначально находится в вершине номер \(1\), поэтому мы побеждаем сразу.

E. Таблица и делители

дп Перебор поиск в глубину и подобное теория чисел *2400

Вам задана таблица умножения \(n \times n\) и положительное целое число \(m = m_1 \cdot m_2\). Таблица умножения \(n \times n\) — это таблица из \(n\) строк и \(n\) столбцов, пронумерованных от \(1\) по \(n\), где \(a_{i, j} = i \cdot j\).

Для каждого делителя \(d\) числа \(m\) определите: встречается ли \(d\) в таблице хотя бы раз, и если встречается, то какой наименьший номер строки, которая содержит \(d\).

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 10\)) — количество наборов входных данных.

В первой и единственной строке каждого набора заданы три целых числа \(n\), \(m_1\) и \(m_2\) (\(1 \le n \le 10^9\); \(1 \le m_1, m_2 \le 10^9\)) — размер таблицы умножения и число \(m\), представленное как \(m_1 \cdot m_2\).

Выходные данные

Для каждого набора входных данный, пусть \(d_1, d_2, \dots, d_k\) – это все делители \(m\), отсортированные в порядке возрастания. А также, пусть \(a_1, a_2, \dots, a_k\) — это массив ответов, где \(a_i\) равно наименьшему номеру строки, в которой встречается \(d_i\), либо \(0\), если такой строки в таблице нет.

Так как массив \(a\) может быть длинным, выведите сначала число \(s\) — количество делителей \(m\), которые встречаются в таблице умножения \(n \times n\). Далее выведите одно число \(X = a_1 \oplus a_2 \oplus \dots \oplus a_k\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ.

Примечание

В первом наборе входных данных, \(m = 72 \cdot 1 = 72\) и имеет \(12\) делителей \([1, 2, 3, 4, 6, 8, 9, 12, 18, 24, 36, 72]\). Таблица умножения \(3 \times 3\) выглядит следующим образом:

123
1123
2246
3369

Для каждого делителя \(m\), что присутствует в таблице, выделена позиция с наименьшим номером строки. Соответственно, массив ответов \(a\) равен \([1, 1, 1, 2, 2, 0, 3, 0, 0, 0, 0, 0]\). В нем только \(6\) ненулевых значений, а исключающее ИЛИ \(a\) равен \(2\).

Во втором наборе, \(m = 10 \cdot 15 = 150\) и имеет \(12\) делителей \([1, 2, 3, 5, 6, 10, 15, 25, 30, 50, 75, 150]\). Все делители кроме \(75\) и \(150\) присутствуют в таблице \(10 \times 10\). Массив \(a\) \(=\) \([1, 1, 1, 1, 1, 1, 3, 5, 3, 5, 0, 0]\). В нем \(10\) ненулевых значений и исключающее ИЛИ \(a\) равно \(0\).

В третьем наборе, \(m = 1 \cdot 210 = 210\) и имеет \(16\) делителей \([1, 2, 3, 5, 6, 7, 10, 14, 15, 21, 30, 35, 42, 70, 105, 210]\). Таблица умножения \(6 \times 6\) с выделенными делителями изображена ниже:

123456
1123456
224681012
3369121518
44812162024
551015202530
661218243036

Массив \(a\) \(=\) \([1, 1, 1, 1, 1, 0, 2, 0, 3, 0, 5, 0, 0, 0, 0, 0]\). В нем \(8\) ненулевых значений и исключающее ИЛИ \(a\) равно \(5\).

F. Блокирующие фишки

Бинарный поиск Деревья жадные алгоритмы Конструктив поиск в глубину и подобное *2400

Задано дерево, состоящее из \(n\) вершин. На нем есть \(k\) фишек, расположенных в вершинах \(a_1, a_2, \dots, a_k\). Все \(a_i\) различны. Вершины \(a_1, a_2, \dots, a_k\) изначально покрашены в черный цвет. Остальные вершины белые.

Вы сыграете в игру, в ходе которой сделаете какое-то количество ходов (возможно, ноль). На \(i\)-м ходе (в \(1\)-индексации) вы подвинете фишку номер \(((i - 1) \bmod k + 1)\) из ее текущей вершины в соседнюю белую вершину и покрасите эту вершину в черный. То есть, если \(k=3\), то вы двигаете фишку \(1\) на ходе \(1\), фишку \(2\) на ходе \(2\), фишку \(3\) на ходе \(3\), фишку \(1\) на ходе \(4\), фишку \(2\) на ходе \(5\), и так далее. Если нет соседней белой вершины, то игра заканчивается.

Какое наибольшее количество ходов вы можете совершить?

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество вершин дерева.

В каждой из следующих \(n - 1\) строк записаны два целых числа \(v\) и \(u\) (\(1 \le v, u \le n\)) — описания ребер. Данные ребра задают дерево.

В следующей строке записано одно целое число \(k\) (\(1 \le k \le n\)) — количество фишек.

В следующей строке записаны \(k\) целых чисел \(a_1, a_2, \dots, a_k\) (\(1 \le a_i \le n\)) — вершины с фишками. Все \(a_i\) различны.

Сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

На каждый набор входных данных выведите одно целое число — наибольшее количество ходов, которые вы можете совершить.

G. Последовательные удаления

битмаски графы поиск в глубину и подобное *2700

Задан простой неориентированный граф, состоящий из \(n\) вершин и \(m\) ребер. Вершины пронумерованы от \(1\) до \(n\). На \(i\)-й вершине написано значение \(a_i\).

Вы будете удалять вершины из этого графа. Вершину \(i\) разрешается удалить только если ее степень равна \(a_i\). Когда вершина удаляется, все инцидентные ребра также удаляются, соответственно, уменьшая степени соседних неудаленных вершин.

Корректная последовательность удалений — это такая перестановка \(p_1, p_2, \dots, p_n\) \((1 \le p_i \le n)\), что вершина \(p_i\) удаляется \(i\)-й по очереди, и каждое удаление разрешено.

Пара вершин \((x, y)\) называется красивой, если существуют две корректные последовательности удалений таких, что в одной \(x\) удаляется раньше \(y\), а в другой \(y\) удаляется раньше \(x\).

Посчитайте количество красивых пар \((x, y)\) таких, что \(x < y\).

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записаны два целых числа \(n\) и \(m\) (\(1 \le n \le 10^5\); \(0 \le m \le \min(10^5, \frac{n \cdot (n - 1)}{2})\)) — количество вершин и количество ребер графа.

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le n - 1\)) — необходимые для удалений степени.

В каждой из следующих \(m\) строк записаны два целых числа \(v\) и \(u\) (\(1 \le v, u \le n\); \(v \neq u\)) — описание ребра.

Граф не содержит петель и кратных ребер.

Сумма \(n\) по всем наборам входных данных не превосходит \(10^5\). Сумма \(m\) по всем наборам входных данных не превосходит \(10^5\).

Дополнительное ограничение на входные данные: всегда существует хотя бы одна корректная последовательность удалений.

Выходные данные

На каждый набор входных данных выведите одно целое число — количество красивых пар вершин.

E. Красивые подграфы

Деревья дп жадные алгоритмы игры поиск в глубину и подобное *2500

У Монокарпа есть дерево, состоящее из \(n\) вершин.

Он планирует выбрать некоторую вершину \(r\) и проделать следующие операции над каждой вершиной \(v\) от \(1\) до \(n\):

  • присвоить \(d_v\) равным расстоянию от \(v\) до \(r\) (количество ребер на кратчайшем пути);
  • раскрасить \(v\) в какой-нибудь цвет.

Раскраска называется красивой, если она удовлетворяет двум условиям:

  • для каждой пары вершин одного цвета \((v, u)\) существует путь из \(v\) в \(u\), который посещает только вершины того же цвета;
  • для каждой пары вершины одного цвета \((v, u)\), \(d_v \neq d_u\).

Обратите внимание, что Монокарп может выбирать любое количество различных цветов, которые он хочет использовать.

Для каждого использованного цвета он затем считает количество вершин этого цвета. Стоимость дерева — это минимум из этих значений.

Какая может быть наибольшая стоимость дерева?

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке записано одно целое число \(n\) (\(3 \le n \le 2 \cdot 10^5\)) — количество вершин в дереве.

В каждой из следующих \(n-1\) строк записаны два целых числа \(v\) и \(u\) (\(1 \le v, u \le n\)) — описание ребра.

Заданные ребра образуют дерево. Сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

На каждый набор входных данных выведите одно целое число — наибольшая возможная стоимость дерева.

D. Li Hua и дерево

Деревья дп Перебор поиск в глубину и подобное реализация Структуры данных *1900

У Li Hua есть дерево с \(n\) вершинами и \(n-1\) ребром. Корнем дерева является вершина \(1\). Каждая вершина \(i\) имеет важность \(a_i\). Обозначим размер поддерева как количество вершин в нем, а важность как сумму важности вершин в нем. Обозначим тяжелым сыном нелистовой вершины сына с наибольшим размером поддерева. Если таких вершин несколько, то тяжёлым сыном будет та, у которой индекс минимален.

Li Hua хочет выполнить \(m\) операций:

  • «1 \(x\)» (\(1\leq x \leq n\)) — вычислить важность поддерева, корнем которого является \(x\).
  • «2 \(x\)» (\(2\leq x \leq n\)) — повернуть тяжёлого сына поддерева \(x\) вверх. Формально, обозначим как \(son_x\) тяжелого сына \(x\), \(fa_x\) как отца \(x\). Он хочет удалить ребро между \(x\) и \(fa_x\) и добавить ребро между \(son_x\) и \(fa_x\). Гарантируется, что \(x\) не является корнем, но не гарантируется, что \(x\) не является листом. Если \(x\) является листом, проигнорируйте эту операцию.

Предположим, что вы Li Hua. Пожалуйста, решите эту задачу.

Входные данные

Первая строка содержит 2 целых числа \(n,m\) (\(2\le n\le 10^{5},1\le m\le 10^{5}\)) — количество вершин в дереве и количество операций.

Вторая строка содержит \(n\) целых чисел \(a_{1},a_{2},\ldots ,a_{n}\) (\(-10^{9}\le a_{i}\le 10^{9}\)) — важность каждой вершины.

Следующие \(n-1\) строк содержат рёбра дерева. В \(i\)-й строке записаны два целых числа \(u_i\) и \(v_i\) (\(1\le u_i,v_i\le n\), \(u_i\ne v_i\)) — соответствующее ребро. Данные рёбра образуют дерево.

Следующие \(m\) строк содержат операции — по одной операции в строке. \(j\)-я операция содержит два целых числа \(t_{j},x_{j}\) (\(t_{j}\in \{1,2\}\), \(1 \leq x_{j} \leq n\), \(x_{j}\neq 1\) если \(t_j = 2\)) — \(j\)-я операция.

Выходные данные

Для каждого запроса вида «1 \(x\)» выведите ответ в отдельной строке.

Примечание

В первом примере:

Начальное дерево показано на следующем рисунке:

Важность поддерева \(6\) равна \(a_6+a_7=2\).

После поворота тяжелого сына вершины \(3\) (которым является \(6\)) вверх, дерево будет выглядеть следующим образом:

Важность поддерева \(6\) равна \(a_6+a_3+a_7=3\).

Важность поддерева \(2\) - \(a_2+a_4+a_5=3\).

F. Li Hua и путь

Деревья поиск в глубину и подобное разделяй и властвуй снм Структуры данных *3000

У Li Hua есть дерево из \(n\) вершин и \(n-1\) рёбер. Вершины пронумерованы от \(1\) до \(n\).

Пара вершин \((u,v)\) (\(u < v\)) считается милой, если ровно одно из следующих двух утверждений истинно:

  • \(u\) является вершиной с минимальным индексом среди всех вершин на пути \((u,v)\).
  • \(v\) — вершина с максимальным индексом среди всех вершин на пути \((u,v)\).

Будет выполнено \(m\) операций. В каждой операции Li Hua выбирает целое число \(k_j\), затем вставляет в дерево вершину с номером \(n+j\), соединяющуюся с вершиной номер \(k_j\).

Он хочет подсчитать количество милых пар вершин до операций и после каждой операции.

Предположим, что вы Li Hua. Пожалуйста, решите эту задачу.

Входные данные

Первая строка содержит одно целое число \(n\) (\(2\le n\le 2\cdot 10^5\)) — количество вершин в дереве.

Следующие \(n-1\) строк содержат ребра дерева. В \(i\)-й строке записаны два целых числа \(u_i\) и \(v_i\) (\(1\le u_i,v_i\le n\); \(u_i\ne v_i\)) — соответствующее ребро. Данные рёбра образуют дерево.

Следующая строка содержит одно целое число \(m\) (\(1\le m\le 2\cdot 10^5\)) — количество операций.

Следующие \(m\) строк содержат операции — по одной операции в строке. В \(j\)-й операции содержится одно целое число \(k_j\) (\(1\le k_j < n+j\)) — вершина.

Выходные данные

Выведите \(m+1\) целых чисел — количество милых пар вершин до операций и после каждой операции.

Примечание

Начальное дерево показано на следующем рисунке:

Существует \(11\) милых пар — \((1,5),(2,3),(2,4),(2,6),(2,7),(3,4),(3,6),(3,7),(4,5),(5,7),(6,7)\).

Аналогично, мы можем посчитать милые пары после каждой операции, и результатами будут \(15\) и \(19\).

E. Объединение городов

геометрия жадные алгоритмы Конструктив математика поиск в глубину и подобное реализация снм *2300

Вам дана таблица \(n \times m\). Некоторые клетки заполнены, некоторые пустые.

Город — это максимальное (по включению) множество заполненных клеток, такое что можно дойти из любой клетки города до любой другой клетки города, перемещаясь в соседние по стороне клетки, только по клеткам города. Другими словами, город — это компонента связности заполненных клеток, где ребро проводится между соседними по стороне заполненными клетками.

Изначально в таблице находятся два города. Вы хотите поменять некоторые пустые клетки на заполненные, так что выполняются два условия:

  • В таблице находится один город.
  • Кратчайший путь между любыми двумя заполненными клетками, если можно перемещаться только по заполненным клеткам, равно манхеттенскому расстоянию между клетками.

Манхеттенское расстояние между двумя клетками \((a, b)\) и \((c, d)\) равняется \(|a - c| + |b - d|\).

Найдите способ заполнить некоторые клетки, чтобы все условия выполнялись и общее количество заполненных клеток было минимально.

Входные данные

В первой строке находится единственное целое число \(t\) (\(1 \le t \le 5000\)) — количество наборов входных данных. Описания наборов входных данных следуют.

В первой строке описания каждого набора входных данных находится два целых числа \(n\), \(m\) (\(1 \le n, m \le 50\), \(nm \geq 3\)).

Следующие \(n\) строк описывают таблицу. В \(i\)-й строке находится строка \(s_i\) длины \(m\). Символ \(s_{i,j}\) равен '#', если клетка \((i, j)\) заполнена, и '.', если клетка пустая.

Гарантируется, что изначально в таблице ровно два города.

Гарантируется, что сумма \(n\cdot m\) по всем наборам входных данных не превосходит \(25\,000\).

Выходные данные

Для каждого набора входных данных выведите \(n\) строк, каждая содержит строку длины \(m\) — описание таблицы, которую вы сделали в том же формате, что во входных данных.

Если существует несколько возможных способов заполнить некоторые пустые клетки, чтобы общее количество заполненных клеток было минимально, выведите любой.

Примечание

В первом наборе входных данных мы добавляем одну заполненную клетку между двумя городами, чтобы соединить их. Можно убедиться, что второе условие также выполняется.

Во втором наборе входных данных мы также соединяем города одной заполненной клеткой, также выполняя второе условие.

В третьем наборе входных данных, обратите внимание, что если мы заполним 3 клетки слева сверху, города будут соединены, однако второе условие не будет выполняться для пары клеток \((4, 2)\) и \((2, 4)\).

H. Обрезание дерева

битмаски дп поиск в глубину и подобное *3200

Вам дано дерево с \(n\) вершинами.

Герой \(k\) раз делает следующую операцию:

  • Выбрать некоторое ребро.
  • Удалить его.
  • Выбрать одну из двух оставшихся частей и удалить ее.
  • Записать количество вершин в оставшейся части.

Вам дано изначальное дерево и последовательность выписанных чисел. Найдите количество способов сделать операции так, что выписанные числа совпадут с данными числами. Поскольку ответ может быть очень большим, найдите его по модулю \(998\,244\,353\). Два способа считаются различными, если в какой-то операции выбранное ребро или остающаяся часть различаются.

Входные данные

В первой строке находится единственное целое число \(n\) (\(2 \leq n \leq 5000\)) — количество вершин.

Каждая из следующих \(n-1\) строк содержит два целых числа \(s\), \(f\) (\(1 \leq s, f \leq n\), \(s \neq f\)) — описание ребра \((s, f)\).

Следующая строка содержит единственное целое число \(k\) (\(1 \leq k \leq \min{(6, n - 1)}\)) — количество операций.

В следующей строке находится \(k\) целых чисел \(s_1, s_2, \ldots, s_k\) (\(n > s_1 > s_2 > \ldots > s_k \geq 1\)) — выписанные числа.

Выходные данные

Выведите единственное целое число — ответы на задачу по модулю \(998\,244\,353\).

Примечание

В первом тесте есть четыре возможных способа сделать операции:

  • Удалить ребро \((1, 2)\) и удалить вершину \(1\). Удалить ребро \((2, 3)\) и удалить вершину \(2\).
  • Удалить ребро \((1, 2)\) и удалить вершину \(1\). Удалить ребро \((3, 2)\) и удалить вершину \(3\).
  • Удалить ребро \((3, 2)\) и удалить вершину \(3\). Удалить ребро \((1, 2)\) и удалить вершину \(1\).
  • Удалить ребро \((3, 2)\) и удалить вершину \(3\). Удалить ребро \((2, 1)\) и удалить вершину \(2\).

Во втором тесте есть два возможных способа сделать операции:

  • Удалить ребро \((4, 1)\) и удалить часть с вершиной \(4\). Удалить ребро \((2, 3)\) и удалить часть с вершиной \(2\).
  • Удалить ребро \((4, 1)\) и удалить часть с вершиной \(4\). Удалить ребро \((3, 2)\) и удалить часть с вершиной \(3\).

E2. Непростительное заклятие (сложная версия)

графы жадные алгоритмы Конструктив Перебор поиск в глубину и подобное снм Строки *1500

Это сложная версия задачи. В этой версии нет дополнительных ограничений на число \(k\).

Верховный чародей Визенгамота однажды поймал злого волшебника Drahyrt, но злой волшебник вернулся и хочет отомстить верховному чародею. Поэтому он украл у его ученика Гарри заклинание \(s\).

Заклинание — это строка длины \(n\), состоящая из строчных латинских букв.

Drahyrt хочет заменить заклинание на непростительное заклятие — строку \(t\).

Drahyrt с помощью древней магии может менять местами буквы на расстоянии \(k\) или \(k+1\) в заклинании сколько угодно раз. Другими словами, Drahyrt может поменять буквы на позициях \(i\) и \(j\) в заклинании \(s\) если \(|i-j|=k\) или \(|i-j|=k+1\).

Например, если \(k = 3, s = \) «talant» и \(t = \) «atltna», то Drahyrt может действовать следующим образом:

  • поменять местами буквы на позициях \(1\) и \(4\), получив заклинание «aaltnt».
  • поменять местами буквы на позициях \(2\) и \(6\), получив заклинание «atltna».

Вам даны заклинания \(s\) и \(t\). Может ли Drahyrt изменить заклинание \(s\) на \(t\)?

Входные данные

В первой строке входных данных дано единственное целое число \(T\) (\(1 \le T \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов входных данных.

В первой строке содержится два целых числа \(n, k\) (\(1 \le n \le 2 \cdot 10^5\), \(1 \le k \le 2 \cdot 10^5\)) — длина заклинаний и число \(k\) такое, что Drahyrt может менять буквы в заклинании на расстоянии \(k\) или \(k+1\).

Во второй строке дано заклинание \(s\) — строка длины \(n\), состоящая из строчных латинских букв.

В третьей строке дано заклинание \(t\) — строка длины \(n\), состоящая из строчных латинских букв.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\). Обратите внимание, что ограничений на сумму значений \(k\) по всем наборам входных данных нет.

Выходные данные

Для каждого набора входных данных выведите в отдельной строке «YES» если Drahyrt может изменить заклинание \(s\) на \(t\) и «NO» иначе.

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

Примечание

Первый пример разобран в условии.

Во втором примере можно менять соседние буквы местами, так что можем отсортировать строку например с помощью сортировки пузырьком.

Во третьем примере можно показать, что из строки \(s\) невозможно получить строку \(t\) меняя местами буквы на расстоянии \(6\) или \(7\).

В четвертом примере подходит например следующая последовательность преобразований:

  • «accio» \(\rightarrow\) «aocic» \(\rightarrow\) «cocia» \(\rightarrow\) «iocca» \(\rightarrow\) «aocci» \(\rightarrow\) «aicco» \(\rightarrow\) «cicao».

В пятом примере можно показать, что невозможно получить из строки \(s\) строку \(t\).

В шестом примере достаточно поменять местами две крайние буквы.

G. Симмеtreeя

Деревья поиск в глубину и подобное реализация хэши *2200

Киду подарили дерево из \(n\) вершин с корнем в вершине \(1\). Так как он очень любит симметричные объекты, Кид хочет узнать симметрично ли это дерево.

Например, деревья на картинке выше симметричны.
А деревья на этой картинке не симметричны.

Более формально, дерево является симметричным, если существует такой порядок детей, что:

  • Поддерево самого левого ребёнка корня является зеркальным отражением поддерева самого правого ребёнка;
  • поддерево второго слева ребёнка корня является зеркальным отражением поддерева второго справа ребёнка корня;
  • ...
  • если число детей корня нечётно, то поддерево среднего ребёнка должно быть симметрично.
Входные данные

Первая строка входных данных содержит единственное число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Первая строка каждого набора содержит целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество вершин в дереве.

Следующие \(n-1\) строк содержат по два числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \neq v\)) — номера вершин, соединённых ребром.

Гарантируется, что сумма \(n\) по всем наборам не превосходит \(2 \cdot 10^5\).

Выходные данные

Выведите \(t\) строк, каждая из которых является ответом на соответствующий набор входных данных. В качестве ответа выведите «YES», если данное дерево симметрично, и «NO» в противном случае.

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

E. Маршрутизация

битмаски графы дп Перебор поиск в глубину и подобное *2400

Ада управляет сетью, состоящей из \(n\) серверов и \(m\) прямых соединений между ними. Каждое прямое соединение между парой различных серверов позволяет осуществлять двустороннюю передачу информации между этими двумя серверами. Ада знает, что с помощью этих \(m\) прямых соединений возможна передача информации между любыми двумя серверами в этой сети (напрямую или через промежуточные серверы). Будем называть сервер \(v\) соседом сервера \(u\), если существует прямое соединение между этими двумя серверами.

Аде нужно настроить в своей сети WRP (Weird Routing Protocol — Странный протокол маршрутизации). Для каждого сервера \(u\) ей нужно выбрать ровно одного соседа и назначить его вспомогательным сервером \(a(u)\). Рассмотрим процесс того, как будет работать маршрутизация после определения всех \(a(u)\). Предположим, сервер \(u\) хочет найти путь до сервера \(v\), отличного от \(u\).

  • Сервер \(u\) смотрит на все свои прямые соединения с другими серверами. Если он видит прямое соединение с сервером \(v\), он знает путь и процесс завершается.
  • Если путь не был найден на первом шаге, сервер \(u\) запрашивает поиск пути у своего вспомогательного сервера \(a(u)\).
  • Вспомогательный сервер \(a(u)\) следует этому процессу, начиная с первого шага.
  • После того, как \(a(u)\) находит путь, он возвращает его \(u\). Затем сервер \(u\) строит результирующий путь как объединение прямого соединения между \(u\) и \(a(u)\) и пути от \(a(u)\) до \(v\).

Как видите, эта процедура либо создает правильный путь и завершается, либо работает вечно. Таким образом, для Ады крайне важно правильно настроить WRP своей сети.

Ваша цель — назначить вспомогательный сервер \(a(u)\) для каждого сервера \(u\) в данной сети таким образом, чтобы WRP мог построить путь от любого сервера \(u\) к любому другому серверу \(v\), используя вышеупомянутую процедуру. Или же требуется определить, что такое назначение вспомогательных серверов невозможно.

Входные данные

Первая строка входных данных содержит два целых числа \(n\) и \(m\) (\(2 \leq n \leq 20\), \(n - 1 \leq m \leq \frac{n \cdot (n - 1)}{2}\)) — количество серверов и количество прямых соединений в данной сети.

Далее следуют \(m\) строк, содержащих по два целых числа \(u_i\) и \(v_i\) (\(1 \leq u_i, v_i \leq n\), \(u_i \ne v_i\)), \(i\)-я строка описывает \(i\)-е прямое соединение.

Гарантируется, что между любыми двумя серверами существует не более одного прямого соединения. Гарантируется, что существует прямой или непрямой маршрут (состоящий только из заданных прямых соединений) между любыми двумя серверами.

Выходные данные

Если нет возможности назначить вспомогательный сервер \(a(u)\) для каждого сервера \(u\) таким образом, чтобы WRP смог найти путь от любого сервера \(u\) к любому другому серверу \(v\), выведите «No» в единственной строке вывода.

В противном случае выведите «Yes» в первой строке вывода. Во второй строке выведите \(n\) целых чисел, \(i\)-е из которых должно быть равно \(a(i)\) – номеру вспомогательного сервера для сервера \(i\). Не забывайте, что должно быть прямое соединение между сервером \(i\) и сервером \(a(i)\).

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

D. Широкий-преширокий граф

графы Деревья дп жадные алгоритмы поиск в глубину и подобное *1800

Дано дерево (связный граф без циклов) на \(n\) вершинах.

Зафиксируем число \(k\). Назовем графом \(G_k\) граф на \(n\) вершинах, в котором между вершинами \(u\) и \(v\) есть ребро тогда и только тогда, когда расстояние между вершинами \(u\) и \(v\) в данном дереве не меньше \(k\).

Для каждого \(k\) от \(1\) до \(n\) выведите количество компонент связности в графе \(G_k\).

Входные данные

В первой строке дано целое число \(n\) (\(2 \le n \le 10^5\)) — количество вершин в графе.

В каждой из следующих \(n-1\) строк содержатся два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\)), обозначающие ребро между вершинами \(u\) и \(v\) в дереве. Гарантируется, что данные ребра задают корректное дерево.

Выходные данные

Выведите \(n\) целых чисел — количество компонент связности в графе \(G_k\) для каждого \(k\) от \(1\) до \(n\).

Примечание

В первом примере: При \(k=1\) в графе будет ребро между каждой парой вершин, поэтому в нём будет одна компонента. При \(k=4\) в графе будут только рёбра \(4 \leftrightarrow 6\) и \(5 \leftrightarrow 6\), поэтому в графе будет \(4\) компоненты.

Во втором примере: при \(k=1\) и \(k=2\) в графе одна компонента. При \(k=3\) граф \(G_k\) разбивается на \(3\) компоненты: в одной компоненте вершины \(1\), \(4\) и \(5\), а ещё две компоненты содержат по одной вершине. При \(k=4\) и \(k=5\) каждая вершина является отдельной компонентой.

E. Максимумов должно быть много

Деревья дп Перебор поиск в глубину и подобное Структуры данных *2300

Дано дерево (связный граф без циклов). В каждой вершине дерева записано число. Назовём характеристикой \(\mathrm{MAD}\) (maximum double) дерева максимальное число, которое встречается в вершинах этого дерева хотя бы \(2\) раза. Если же никакое число не встречается в дереве больше одного раза, то положим \(\mathrm{MAD}=0\).

Заметим, что если удалить ребро из дерева, то оно распадётся на два дерева. Вычислим \(\mathrm{MAD}\) в каждом из деревьев и возьмем максимум из этих двух значений. Полученный результат назовем значением удаленного ребра.

Для каждого ребра найдите его значение. Обратите внимание, что мы в действительности не удаляем ребра из дерева, и каждое значение должно быть вычислено независимо.

Входные данные

В первой строке находится одно целое число \(n\) (\(2 \le n \le 10^5\)) — количество вершин в дереве.

Далее в \(n - 1\) строке находятся по два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\)) — концы рёбер дерева. Гарантируется, что данные ребра образуют дерево.

В последней строке находятся \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)) — числа, записанные в вершинах.

Выходные данные

Для каждого ребра в порядке ввода выведите одно число — максимум из \(\mathrm{MAD}\) двух деревьев, получающихся после удаления из начального дерева данного ребра.

Примечание

В первом примере после удаления ребра \((1, 2)\) ни в одном из получившихся поддеревьев никакое число не будет повторяться \(2\) раза, поэтому ответ равен \(\max(0, 0)=0\).

После удаления ребра \((2, 3)\) в бо́льшем поддереве будет два раза повторяться \(1\) и два раза повторяться \(2\), поэтому \(\mathrm{MAD}\) этого дерева будет равен \(2\).

После удаления ребра \((2, 4)\) в бо́льшем поддереве будет повторяться только число \(1\), а во втором будет только одно число, поэтому ответом будет \(1\).

Во втором примере, если ребро \(1 \leftrightarrow 4\) не удалено, то в одном из поддеревьев будет две \(1\), поэтому ответ — \(1\). А если удалено ребро \(1 \leftrightarrow 4\), то в обоих поддеревьях нет повторяющихся значений, поэтому ответом будет \(0\).

E. Мастер деревьев

Деревья Перебор поиск в глубину и подобное Структуры данных *2200

Вам дано дерево с \(n\) взвешенными вершинами, пронумерованными от \(1\) до \(n\). Корнем дерева является \(1\). Родитель вершины \(i\) — вершина \(p_i\), а вес вершины \(i\) — число \(a_i\). Для удобства определим \(p_1=0\).

Для двух вершин \(x\) и \(y\) одинаковой глубины\(^\dagger\), определим \(f(x,y)\) следующим образом:

  • Инициализируем \(\mathrm{ans}=0\).
  • Пока \(x\) и \(y\) не \(0\):
    • \(\mathrm{ans}\leftarrow \mathrm{ans}+a_x\cdot a_y\);
    • \(x\leftarrow p_x\);
    • \(y\leftarrow p_y\).
  • \(f(x,y)\) равно значению \(\mathrm{ans}\).

Вам предстоит обработать \(q\) запросов. В \(i\)-м запросе вам даны два целых числа \(x_i\) и \(y_i\), и вам нужно вычислить \(f(x_i,y_i)\).

\(^\dagger\) Глубина вершины \(v\) — это количество ребер на единственном простом пути от корня дерева до вершины \(v\).

Входные данные

Первая строка содержит два целых числа \(n\) и \(q\) (\(2 \le n \le 10^5\); \(1 \le q \le 10^5\)).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^5\)).

Третья строка содержит \(n-1\) целое число \(p_2, \ldots, p_n\) (\(1 \le p_i < i\)).

Каждая из следующих \(q\) строк содержит два целых числа \(x_i\) и \(y_i\) (\(1\le x_i,y_i\le n\)). Гарантируется, что \(x_i\) и \(y_i\) имеют одинаковую глубину.

Выходные данные

Выведите \(q\) строк, \(i\)-я строка содержит одно целое число — значение \(f(x_i,y_i)\).

Примечание

Рассмотрим первый пример.

В первом запросе ответ – \(a_4\cdot a_5+a_3\cdot a_3+a_2\cdot a_2+a_1\cdot a_1=3+4+25+1=33\).

Во втором запросе ответ – \(a_6\cdot a_6+a_2\cdot a_2+a_1\cdot a_1=1+25+1=27\).

F. Мяч-попрыгунчик

Перебор поиск в глубину и подобное реализация *1700

Вам дана комната, которую можно представить в виде сетки из \(n \times m\). В позиции \((i_1, j_1)\) (пересечение строки \(i_1\) и столбца \(j_1\)) находится шар, который начинает двигаться по диагонали в одном из четырех направлений:

  • Шарик движется вниз и вправо, обозначается \(\texttt{DR}\); это означает, что после шага местоположение шарика изменяется с \((i, j)\) на \((i+1, j+1)\).
  • Мяч движется вниз и влево, обозначается \(\texttt{DL}\); это означает, что после шага местоположение мяча изменяется с \((i, j)\) на \((i+1, j-1)\).
  • Мяч движется вверх и вправо, обозначается \(\texttt{UR}\); это означает, что после шага местоположение мяча изменяется с \((i, j)\) на \((i-1, j+1)\).
  • Мяч движется вверх и влево, обозначается \(\texttt{UL}\); это означает, что после шага местоположение мяча изменяется с \((i, j)\) на \((i-1, j-1)\).

После каждого шага мяч сохраняет свое направление, если только он не ударится о стену (то есть направление выведет его за пределы комнаты на следующем шаге). В этом случае направление мяча изменяется вдоль оси стены; если мяч попадает в угол, то изменяются оба направления. Любой такой случай называется отскоком. Мяч никогда не перестает двигаться.

В приведенном примере мяч стартует с точки \((1, 7)\) и движется в направлении \(\texttt{DL}\), пока не достигнет нижней стены, затем он подпрыгивает и продолжает движение в направлении \(\texttt{UL}\). Достигнув левой стены, мяч подпрыгивает и продолжает двигаться в направлении \(\texttt{UR}\). Когда мяч достигает верхней стены, он подпрыгивает и продолжает движение в направлении \(\texttt{DR}\). Достигнув правого нижнего угла, он отскакивает один раз и продолжает движение в направлении \(\texttt{UL}\), и так далее.

Ваша задача - найти, сколько отскоков произойдёт, пока мяч не достигнет клетки \((i_2, j_2)\) в комнате, или сообщить, что он никогда не достигнет клетки \((i_2, j_2)\), выведя \(-1\).

Обратите внимание, что мяч сначала попадает в клетку и только после этого отскакивает, если это происходит.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит шесть целых чисел и строку \(n, m, i_1, j_1, i_2, j_2, d\) (\(2 \leq n, m \leq 25000\); \(1 \leq i_1, i_2 \leq n\); \(1 \leq j_1, j_2 \leq m\); \(d \in\{ \texttt{DR}, \texttt{DL}, \texttt{UR}, \texttt{UL}\}\)) — размеры сетки, начальные координаты шарика, координаты конечной клетки и начальное направление шарика.

Гарантируется, что сумма \(n \cdot m\) по всем наборам входных данных не превосходит \(5 \cdot 10^4\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — количество отскоков мяча, пока он не достигнет клетки \((i_2, j_2)\) в первый раз, или \(-1\), если мяч никогда не достигнет данной клетки.

E. Монстры

графы жадные алгоритмы Перебор поиск в глубину и подобное снм Структуры данных *2100

Вам дан неориентированный граф с \(n\) вершинами и \(m\) ребрами. Изначально для каждой вершины \(i\) существует монстр с опасностью \(a_{i}\) в этой вершине. Вы можете победить монстра с опасностью \(a_{i}\) тогда и только тогда, когда вы уже победили как минимум \(a_{i}\) других монстров.

Вы хотите победить всех монстров. Сначала вы выбираете некоторую вершину \(s\) и побеждаете монстра в этой вершине (поскольку вы еще не побеждали монстров, \(a_{s}\) должно быть равно \(0\)). Затем вы можете перемещаться в соседние вершины. Если вы хотите переместиться из вершины \(u\) в вершину \(v\), то должно выполняться следующее: либо монстр в вершине \(v\) уже побежден ранее, либо вы можете победить его сейчас. Во втором случае вы побеждаете монстра в вершине \(v\) и достигаете вершины \(v\). Вы можете проходить вершины и ребра любое количество раз.

Определите, сможете ли вы победить всех монстров или нет.

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит количество наборов входных данных \(t\) (\(1 \le t \le 10^4\)). Далее следует их описание.

Первая строка каждого набора входных данных содержит два целых числа \(n\), \(m\) (\(1 \le n, m \le 2 \cdot 10^5\)).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_{1}, a_{2}, \ldots, a_{n}\) (\(0 \le a_{i} \le n\)).

Следующие \(m\) строк содержат по два целых числа \(u\), \(v\) (\(1 \le u, v \le n\)), описывающих ребро между вершинами \(u\) и \(v\). Гарантируется, что в графе нет кратных ребер и петель.

Гарантируется, что сумма \(n\) и сумма \(m\) по всем наборам входных данных не превосходят \(2 \cdot 10^5\).

Выходные данные

Для каждого наборов входных данных выведите «YES», если вы можете победить всех монстров, и «NO» иначе.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

В первом наборе входных данных мы можем начать с вершины \(3\), победить монстра в ней, затем перейти в вершины \(2\), \(1\) в этом порядке, победив монстров в них. Затем вернуться к вершине \(3\) и пойти к вершине \(4\), победив в ней монстра.

В третьем наборе входных данных нет пути к вершине \(4\), если мы начинаем с вершины \(1\). Также нет пути к вершинам \(1\), \(2\), \(3\), если мы начнем с вершины \(4\).

F. Это цветок?

графы поиск в глубину и подобное реализация *2100

Влад обнаружил у себя во дворе клумбу с графами и решил взять один себе. Позже он узнал, что на той клумбе помимо обычных графов росли также \(k\)-цветки. Граф называется \(k\)-цветком если он состоит из простого цикла длины \(k\), через каждую вершину которого проходит свой простой цикл длины \(k\) и эти циклы не пересекаются по вершинам. Например \(3\)-цветок выглядит так:

Обратите внимание, что \(1\)-цветок и \(2\)-цветок не существуют, поскольку для формирования цикла нужно хотя бы \(3\) вершины.

Владу очень понравилась структура \(k\)-цветков и теперь он хочет узнать повезло ли ему взять с клумбы один из них.

Входные данные

Первая строка входных данных содержит единственное число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов. Перед каждым набором в тесте записана пустая строка.

Первая строка каждого набора содержит два целых числа \(n\) и \(m\) (\(2 \le n \le 2 \cdot 10^5\), \(1 \le m \le \min(2 \cdot 10^5, \frac{n \cdot (n-1)}{2})\)) — количество вершин и рёбер в графе, соответственно.

Следующие \(m\) строк содержат по два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \ne v\)) — номера вершин, соединённых ребром. Гарантируется, что граф не содержит кратных рёбер и петель.

Гарантируется, что сумма \(n\) по всем наборам не превосходит \(2 \cdot 10^5\). Также это гарантируется для суммы \(m\).

Выходные данные

Выведите \(t\) строк, каждая из которых является ответом на соответствующий набор входных данных. В качестве ответа выведите «YES», если граф Влада является \(k\)-цветком для некоторого \(k\), и «NO» в противном случае.

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

C. Между

графы жадные алгоритмы Конструктив поиск в глубину и подобное *2200

Вам дано целое число \(n\), а также \(m\) пар целых чисел \((a_i,b_i)\), где \(1\leq a_i , b_i \leq n\), \(a_i \ne b_i\).

Вы хотите построить последовательность, удовлетворяющую следующим требованиям:

  • Все элементы последовательности являются целыми числами между \(1\) и \(n\).
  • Есть ровно один элемент со значением \(1\) в последовательности.
  • Для каждого \(i\) (\(1 \le i \le m\)), между любыми двумя элементами (на различных позициях) в последовательности со значениями \(a_i\), есть хотя бы один элемент со значением \(b_i\).
  • Построенная последовательность имеет максимальную длину среди всех последовательностей, удовлетворяющий вышеуказанным свойствам.

Иногда возможно, что такая последовательность может быть сколь угодно длинной, в таком случае вам нужно вывести «INFINITE». Иначе, вам нужно вывести «FINITE» и саму последовательность. Если существует несколько возможных последовательностей с максимальной длиной, выведите любую из них.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит единственное целое число \(t\) (\(1 \le t \le 300\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1 \le n \le 1500\), \(0 \le m \le 5000\)) — максимально возможное значение элемента последовательности и количество пар.

\(i\)-я из следующих \(m\) строк содержит два целых числа \(a_i\) и \(b_i\) (\(1 \le a_i , b_i \le n\), \(a_i \ne b_i\)).

\((a_i, b_i) \ne (a_j, b_j)\) для всех \(1 \le i < j \le m\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(1500\) и сумма \(m\) по всем наборам входных данных не превосходит \(5000\).

Выходные данные

Для каждого набора входных данных на первой строке выведите «INFINITE», если последовательность может быть сколь угодно длинной, и «FINITE» иначе.

Если вы вывели «FINITE», то ваш вывод должен содержать ещё \(2\) строки.

Первая строка содержит целое число \(s\) — максимальную длину последовательности.

Вторая строка содержит \(s\) целых чисел, каждое со значением от \(1\) до \(n\) включительно, обозначающие элементы последовательности.

Если существует несколько последовательностей с максимальной длиной, выведите любую из них.

Можно доказать, что во всех наборах входных данных с ответом «FINITE», при данных ограничениях, максимально возможная сумма длин последовательностей в этих наборах входных данных не превосходит \(2\cdot10^6\).

Примечание

В первом наборе входных данных есть элемент \(1\) между двумя элементами со значением \(3\), и элемент \(1\) между двумя элементами со значением \(2\). Можно доказать, что не существует подходящих последовательностей длины более \(5\).

Во втором наборе входных данных \([1]\) является единственной возможной последовательностью, потому что должен быть ровно один элемент со значением \(1\) в последовательности.

В третьем наборе входных данных мы можем получить сколь угодно длинную последовательность вида \(1, 2, 2, 2, \ldots\).

B. Граф-рыба

графы Конструктив Перебор поиск в глубину и подобное *1900

Дан простой неориентированный граф с \(n\) вершинами и \(m\) ребрами. Граф может не быть связным. Вершины графа пронумерованы от \(1\) до \(n\).

Граф-рыба — это граф, содержащий простой цикл с особой вершиной \(u\), принадлежащей циклу. Помимо ребер цикла, у графа должно быть ровно \(2\) дополнительных ребра. Оба ребра должны быть соединены с вершиной \(u\), но не должны быть соединены с любой другой вершиной цикла.

Определите, содержит ли данный граф подграф-рыбу, и если да, найдите любой такой подграф.

В этой задаче подграф определяется как граф, полученный путем выбора любого подмножества ребер исходного графа.

Визуализация примера 1. Красные ребра образуют один из возможных подграфов, который является графом-рыбой.
Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа, \(n\) и \(m\) (\(1 \le n, m \le 2\,000\)) — количество вершин и количество ребер.

Каждая из следующих \(m\) строк содержит описание ребра. Каждая строка содержит два целых числа \(u_i\) и \(v_i\) (\(1 \leq u_i, v_i \leq n\), \(u_i\neq v_i\)) — ребро соединяет вершину \(u_i\) с вершиной \(v_i\).

Гарантируется, что никакие два ребра не соединяют одну и ту же неупорядоченную пару вершин.

Кроме того, гарантируется, что сумма \(n\) и сумма \(m\) для всех наборов входных данных не превышает \(2\,000\).

Выходные данные

Для каждого набора входных данных выведите «YES», если граф содержит подграф-рыбу, в противном случае выведите «NO». Если ответ «YES», на следующих строках выведите описание подграфа.

Первая строка описания содержит одно целое число \(k\) — количество ребер подграфа.

В следующих \(k\) строках выведите ребра выбранного подграфа. Каждая из \(k\) строк должна содержать два целых числа \(u\) и \(v\) (\(1\le u, v\le n\), \(u\neq v\)) — ребро между \(u\) и \(v\) принадлежит подграфу. Порядок, в котором выводятся \(u\) и \(v\), не имеет значения, если эти две вершины соединены ребром в исходном графе. Порядок вывода ребер не имеет значения, если полученный подграф является графом-рыбой.

Если есть несколько решений, выведите любое.

Примечание

В первом примере возможный допустимый подграф содержит цикл \(1 \rightarrow 2 \rightarrow 3 \rightarrow 4 \rightarrow 1\). Особой вершиной этого цикла является вершина \(4\). Два дополнительных ребра \(4 - 5\) и \(4 - 6\) оба соединены с \(4\), образуя граф-рыбу.

Во втором примере возможный допустимый подграф содержит цикл \(1 \rightarrow 3 \rightarrow 4 \rightarrow 1\). Особой вершиной этого цикла является вершина \(3\). Два дополнительных ребра \(3 - 2\) и \(3 - 5\) оба соединены с \(3\), образуя граф-рыбу.

В последнем примере можно доказать, что у графа нет подграфа-рыбы.

F. Подружки-садоводы

графы Деревья дп Перебор поиск в глубину и подобное *1700

Две подруги, Алиса и Юки, посадили в своем саду дерево из \(n\) вершин. Дерево — это неориентированный граф без циклов, петель и кратных ребер. Каждое ребро в этом дереве имеет длину \(k\). Изначально вершина \(1\) — корень дерева.

Алиса и Юки выращивают дерево не просто так, они хотят продать его. Стоимостью дерева назовем максимальное расстояние от корня до вершины по всем вершинам дерева. Расстоянием между двумя вершинами \(u\) и \(v\) является сумма длин ребер на пути от \(u\) до \(v\).

Девочки проходили курс юных садоводов, поэтому они умеют модифицировать дерево. За \(c\) монет Алиса и Юки могут поменять корень дерева, выбрав одного из соседей текущего корня и сделав его корнем дерева. Эту операцию можно применять любое количество раз (в том числе и ноль). Обратите внимание, что операция не затрагивает структуру дерева; единственное изменение заключается в том, что корнем дерева становится другая вершина.

Подруги хотят продать дерево с максимальной выгодой. Выгода — это разность стоимости дерева и затрат на все операции.

Помогите девочкам и найдите максимальную выгоду, которую они могут получить, применив к дереву операции произвольное число раз (возможно, ноль).

Входные данные

В первой строке входных данных содержится число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов.

В первой строке набора содержатся три целых числа \(n\), \(k\), \(c\) (\(2 \le n \le 2 \cdot 10^5\), \(1 \le k, c \le 10^9\)) — количество вершин в дереве, длина каждого ребра и стоимость операции.

В каждой из следующих \(n - 1\) строк набора содержится по паре целых чисел \(u_i\), \(v_i\) (\(1 \le u_i, v_i \le n\)) — описания ребер. Эти ребра задают дерево.

Сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите единственное число — максимальную выгоду, которую могут получить Юки и Алиса.

B2. LuoTianyi и летающие острова (сложная версия)

Деревья Комбинаторика математика поиск в глубину и подобное Теория вероятностей *2300

Это сложная версия задачи. Единственное отличие в том, что в этой версии \(k\le n\). Вы можете делать взломы, только если обе версии задачи сданы.

Chtholly и летающие острова.

LuoTianyi сейчас живёт в мире с \(n\) летающими островами. Летающие острова соединены \(n-1\) ненаправленной воздушной дорогой, и из любого из двух летающих островов можно добраться до другого, путешествуя по воздушным дорогам. Это означает, что \(n\) летающих островов образуют дерево.

Однажды, LuoTianyi захотела встретиться со своими друзьями: Chtholly, Nephren, William, .... Всего она хочет встретиться с \(k\) людьми. Она не знает их точного расположения, но она знает, что они находятся на попарно различных островах. Она называет остров хорошим тогда и только тогда, когда сумма расстояний\(^{\dagger}\) от него до островов с \(k\) людьми минимально возможная среди всех \(n\) островов.

Сейчас LuoTianyi хочет узнать, если \(k\) человек случайным образом находятся в \(k\) различных из \(n\) островов, чему равно математическое ожидание количества хороших островов? Вам нужно сказать ей математическое ожидание по модулю \(10^9+7\).

\(^{\dagger}\)Расстоянием между двумя островами называется минимальное количество воздушных дорог, по которым нужно пройти, чтобы перейти с одного острова на другой.

Входные данные

Первая строка содержит два целых числа \(n\) и \(k\) (\(1\le k \le n \le 2\cdot 10^5\)) — количество островов и людей соответственно.

Следующие \(n−1\) строка описывают воздушные дороги. \(i\)-я из них содержит два целых числа \(u_i\) и \(v_i\) (\(1 \le u_i,v_i \le n, u_i \neq v_i\)) — острова, соединённые \(i\)-й воздушной дорогой.

Гарантируется, что воздушные дороги образуют дерево.

Выходные данные

Выведите единственное целое число — математическое ожидание количества хороших островов по модулю \(10^9 + 7\).

Формально, пусть \(M = 10^9 + 7\). Можно показать, что ответ может быть представлен в виде несократимой дроби \(\frac{p}{q}\), где \(p\) и \(q\) — целые числа, и \(q \not \equiv 0\) (\(\operatorname{mod} M\)). Выведите целое число, равное \(p \cdot q^{-1}\) \(\operatorname{mod} M\). Другими словами, выведите такое целое число \(x\), что \(0 \le x < M\) и \(x \cdot q \equiv p\) (\(\operatorname{mod} M\)).

Примечание

В первом примере дороги образуют следующее дерево:

Если люди находятся на островах \(1\) и \(2\), тогда острова \(1\) и \(2\) являются хорошими.

Сумма расстояний от острова \(1\) или \(2\) до всех людей равна \(1+0=1\), что минимально. В это время сумма расстояний от острова \(3\) до всех людей равна \(2+1=3\), что больше \(1\).

Таким же образом, когда люди находятся на островах \(1\) и \(3\), тогда острова \(1,2\) и \(3\) являются хорошими.

Когда люди находятся на островах \(1\) и \(4\), тогда острова \(1,2,3\) и \(4\) являются хорошими.

Когда люди находятся на островах \(2\) и \(3\), тогда острова \(2\) и \(3\) являются хорошими.

Когда люди находятся на островах \(2\) и \(4\), тогда острова \(2,3\) и \(4\) являются хорошими.

Когда люди находятся на островах \(3\) и \(4\), тогда острова \(3\) и \(4\) являются хорошими.

Поэтому математическое ожидание количества хороших островов равно \(\frac{16}{6}\), что равняется \(666666674\) по модулю \(10^9+7\).

Во втором примере дороги образуют следующее дерево:

Мы можем заметить, что так как есть один человек на каждом острове, то только остров \(3\) является хорошим. Поэтому математическое ожидание количества хороших островов равно \(1\).

C. LuoTianyi и XOR-дерево

Деревья дп жадные алгоритмы поиск в глубину и подобное снм Структуры данных *2500

LuoTianyi дала вам дерево со значениями в вершинах, корнем этого дерева является вершина \(1\).

За одну операцию вы можете изменить значение в любой вершине на любое неотрицательное целое число.

Вам нужно найти минимальное количество операций, которые нужно сделать, чтобы побитовое исключающее ИЛИ на любом пути от корня до листа\(^{\dagger}\) было равно нулю.

\(^{\dagger}\)Листом в корневом дереве называется вершина, которая имеет ровно одного соседа, и при этом не является корнем.

Входные данные

Первая строка содержит единственное целое число \(n\) (\(2 \le n \le 10^5\)) — количество вершин в дереве.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)), где \(i\)-е число равно значению в \(i\)-й вершине.

Следующие \(n−1\) строка описывают рёбра дерева. \(i\)-я строка содержит два целых числа \(u_i\) и \(v_i\) (\(1 \le u_i,v_i \le n, u_i \neq v_i\)) — вершины, соединённые ребром дерева. Гарантируется, что данные рёбра образуют дерево.

Выходные данные

Выведите единственное целое число — минимальное количество операций.

Примечание

Дерево из первого примера:

Если мы поменяем значение в вершине \(2\) на \(3\), значение в вершине \(5\) на \(4\), значение в вершине \(6\) на \(6\), то дерево станет подходящим.

Побитовое исключающее ИЛИ от корня до листа \(2\) будет равно \(3 \oplus 3=0\).

Побитовое исключающее ИЛИ от корня до листа \(5\) будет равно \(4 \oplus 7 \oplus 3=0\).

Побитовое исключающее ИЛИ от корня до листа \(6\) будет равно \(6 \oplus 5 \oplus 3=0\).

Дерево из второго примера:

Если мы поменяем значение в вершине \(2\) на \(4\), значение в вершине \(3\) на \(27\), значение в вершине \(6\) на \(20\), то дерево станет подходящим.

Побитовое исключающее ИЛИ от корня до листа \(6\) будет равно \(20 \oplus 19 \oplus 7=0\).

Побитовое исключающее ИЛИ от корня до листа \(8\) будет равно \(11 \oplus 27 \oplus 4 \oplus 19 \oplus 7=0\).

Побитовое исключающее ИЛИ от корня до листа \(4\) будет равно \(16 \oplus 4 \oplus 19 \oplus 7=0\).

Побитовое исключающее ИЛИ от корня до листа \(7\) будет равно \(16 \oplus 4 \oplus 19 \oplus 7=0\).

В третьем примере единственным листом является вершина \(4\), и побитовое исключающее ИЛИ на пути до неё равно \(1 \oplus 2 \oplus 1 \oplus 2 = 0\), поэтому нам не нужно изменять значения.

В четвёртом примере мы можем изменить значение в вершине \(1\) на \(5\), а значение в вершине \(4\) на \(0\).

Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ.

D. Два центроида

Деревья жадные алгоритмы поиск в глубину и подобное Структуры данных *2800

Вам задано дерево (неориентированный связный ациклический граф), изначально содержащее только вершину \(1\). Будет несколько запросов к данному дереву. В \(i\)-м запросе появится вершина \(i + 1\), соединенная с вершиной \(p_i\) (\(1 \le p_i \le i\)).

После каждого запроса найдите наименьшее количество операций, необходимых для того, чтобы текущее дерево имело два центроида. За одну операцию вы можете добавить одну вершину и одно ребро к дереву так, чтобы оно осталось деревом.

Вершина называется центроидом, если ее удаление разбивает дерево на поддеревья с не более чем \(\lfloor \frac{n}{2} \rfloor\) вершин в каждом, где \(n\) — число вершин дерева. Например, центроид следующего дерева равен \(3\), потому что самое большое поддерево после удаления центроида имеет \(2\) вершины.

В следующем дереве вершины \(1\) и \(2\) являются центроидами.

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит количество наборов входных данных \(t\) (\(1 \le t \le 10^4\)). Далее следует их описание.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 5 \cdot 10^{5}\)) — количество вершин конечного дерева.

Вторая строка каждого набора входных данных содержит \(n - 1\) целое число \(p_1, p_2, \ldots, p_{n - 1}\) (\(1 \le p_i \le i\)) — индекс вершины, которая связана с вершиной \(i + 1\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(5 \cdot 10^{5}\).

Выходные данные

Для каждого набора входных данных выведите \(n - 1\) целое число. \(i\)-е число является ответом на \(i\)-й запрос — наименьшее количество операций, необходимых для того, чтобы текущее дерево имело два центроида.

Мы можем показать, что ответ всегда существует.

Примечание

На картинках ниже показан четвертый набор входных данных.

После третьего запроса:

В дереве уже есть вершины \(2\) и \(3\) в качестве центроидов, поэтому никаких операций не требуется.

После четвертого запроса:

Добавление вершины \(x\) к дереву делает вершины \(2\) и \(3\) центроидами. Нужна только одна операция.

После пятого запроса:

Добавление к дереву вершин \(x\) и \(y\) делает вершины \(5\) и \(2\) центроидами. Нужны две операции.

После шестого запроса:

Добавление к дереву вершин \(x\), \(y\) и \(z\) делает вершины \(5\) и \(2\) центроидами. Необходимо три операции.

E. Автобусные маршруты

Бинарный поиск Деревья жадные алгоритмы Конструктив поиск в глубину и подобное *3400

Существует страна, состоящая из \(n\) городов и соединяющих их \(n - 1\) двунаправленных дорог, так что мы можем путешествовать между любыми двумя городами по этим дорогам. Другими словами, эти города и дороги образуют дерево.

Есть \(m\) автобусных маршрутов, соединяющих города между собой. Автобусный маршрут между городами \(x\) и \(y\) позволяет вам путешествовать между любыми двумя городами по простому пути между \(x\) и \(y\) по этому маршруту.

Определите, можно ли из каждой пары городов \(u\) и \(v\) проехать из \(u\) в \(v\), используя не более двух автобусных маршрутов.

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит количество наборов входных данных \(t\) (\(1 \le t \le 10^4\)). Далее следует их описание.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(2 \le n \le 5 \cdot 10^5, 0 \le m \le 5 \cdot 10^5\)) — количество городов и количество автобусных маршрутов.

Затем следует \(n - 1\) строка. Каждая строка содержит два целых числа \(u\) и \(v\), обозначающие дорогу, соединяющую города \(u\) и \(v\) (\(1 \le u, v \le n, u \neq v\)). Гарантируется, что эти города и дороги образуют дерево.

Далее следуют \(m\) строк. Каждая строка содержит два целых числа \(x\) и \(y\), обозначающие маршрут автобуса между городами \(x\) и \(y\) (\(1 \le x, y \le n\)).

Гарантируется, что сумма \(n\) по всем наборам тестов не превосходит \(5 \cdot 10^5\), а сумма \(m\) по всем наборам входных данных не превышает \(5 \cdot 10^5\).

Выходные данные

Для каждого теста выведите «YES», если вы можете путешествовать между любой парой городов, используя не более двух автобусных маршрутов.

В противном случае выведите «NO». В следующей строке выведите два города \(x\) и \(y\) (\(1 \le x, y \le n\)) такие, что до города \(y\) из города \(x\) невозможно добраться не более чем двумя автобусными маршрутами.

Вы можете вывести ответ в любом регистре (верхнем или нижнем). Например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительные. ответы.

Примечание

Ниже приведены иллюстрации к \(1\), \(2\) и \(4\) наборам входных данных:

D. Золотая лихорадка

дп Перебор поиск в глубину и подобное реализация *1000

Изначально у вас есть одна куча золотых самородков, содержащая \(n\) самородков. За одну операцию вы можете сделать следующее:

  • Разделить любую кучу на две кучи так, чтобы одна из полученных куч содержала в два раза больше золотых самородков, чем другая. (Все кучи должны содержать целое число самородков.)

Одно из возможных действий - взять кучу размера \(6\) и разделить ее на кучи размеров \(2\) и \(4\), что является допустимым, так как \(4\) в два раза больше, чем \(2\).

Можете ли вы сделать кучу с ровно \(m\) золотых самородков, используя ноль или более операций?
Входные данные

Первая строка входных данных содержит целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных в тесте.

Единственная строка каждого набора содержит два целых числа \(n\) и \(m\) (\(1 \leq n, m \leq 10^7\)) — начальный и целевой размер кучи соответственно.

Выходные данные

Для каждого теста выведите «YES», если вы можете создать кучу размером ровно \(m\), и «NO» в противном случае.

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

Примечание

Первый тест изображен в условии. Мы можем создать кучу размером \(4\).

Во втором тесте мы можем выполнить следующие операции: \(\{\color{red}{9}\} \to \{\color{red}{6},3\} \to \{4,2,3\}\). Куча, которая разделяется, выделена красным цветом перед каждой операцией.

В третьем тесте мы не можем выполнить ни одной операции.

В четвертом тесте мы не можем получить кучу большего размера, чем у нас изначально.

E. Озера

графы поиск в глубину и подобное реализация снм *1100

Дана сетка \(a\) размера \(n \times m\) из неотрицательных целых чисел, где \(a_{i,j}\) представляет глубину воды в \(i\)-й строке и \(j\)-м столбце.

Озеро — это набор ячеек, таких что:

  • Каждая ячейка в наборе имеет \(a_{i,j} > 0\)
  • Существует путь между любой парой ячеек в озере, двигаясь вверх, вниз, влево или вправо, несколько раз и не наступая на ячейку с \(a_{i,j} = 0\).

Объем озера — это сумма глубин всех ячеек в озере.

Найдите наибольший объем озера в сетке.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных в тесте.

Первая строка каждого набора содержит два целых числа \(n, m\) (\(1 \leq n, m \leq 1000\)) — размеры сетки.

Затем следуют \(n\) строк, каждая из которых содержит \(m\) целых чисел \(a_{i,j}\) (\(0 \leq a_{i,j} \leq 1000\)) — глубина воды в каждой ячейке.

Гарантируется, что сумма \(n \cdot m\) по всем наборам не превышает \(10^6\).

Выходные данные

Для каждого теста выведите одно целое число — наибольший объем озера в сетке.

F. Вечная зима

графы математика поиск в глубину и подобное *1300

Граф-снежинка генерируется из двух целых чисел \(x\) и \(y\), которые больше \(1\), следующим образом:

  • Начните с одной центральной вершины.
  • Подключите \(x\) новых вершин к этой центральной вершине.
  • Подключите \(y\) новых вершин к каждой из этих \(x\) вершин.
Например, ниже приведен граф-снежинка для \(x=5\) и \(y=3\).

Граф-снежинка выше имеет центральную вершину \(15\), затем \(x=5\) вершин, подключенных к ней (\(3\), \(6\), \(7\), \(8\) и \(20\)), а затем \(y=3\) вершины, подключенные к каждой из них.

Для заданного графа-снежинки определите значения \(x\) и \(y\).
Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных в тесте.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(2 \leq n \leq 200\); \(1 \leq m \leq \min\left(1000, \frac{n(n-1)}{2}\right)\)) — количество вершин и ребер в графе соответственно.

Следующие \(m\) строк содержат по два целых числа \(u\) и \(v\) (\(1 \leq u, v \leq n\), \(u \neq v\)) — номера вершин, соединенных ребром. Граф не содержит кратных ребер и петель.

Гарантируется, что этот граф является графом снежинки для некоторых целых чисел \(x\) и \(y\), которые больше \(1\).

Выходные данные

Для каждого набора входных данных на отдельной строке выведите значения \(x\) и \(y\), в этом порядке, разделенные пробелом.

Примечание

Первый набор входных данных изображен в условии. Обратите внимание, что вывод 3 5 является неправильным, так как сначала должно быть выведено \(x\), а затем \(y\).

C. Циклическая покраска

поиск в глубину и подобное *2200

Задан ориентированный граф G с n вершинами и m дугами (кратные дуги и петли разрешаются). Требуется покрасить каждую вершину этого графа в один из k (k ≤ n) цветов таким образом, что для любой дуги графа ведущей из вершины u в вершину v верно, что вершина v покрашена в следующий цвет по сравнению с цветом вершины u.

Считайте, что цвета пронумерованы по циклу от 1 до k. Это означает, что для каждого цвета i (i < k) следующим является цвет i + 1, следующим для цвета k является цвет 1. Обратите внимание, что если k = 1, то цвет 1 следующий для самого себя.

Ваша задача — найти и вывести максимальное число k (k ≤ n) такое, что орграф G можно покрасить в k цветов описанным выше способом. Обратите внимание, что вы не обязаны использовать все k цветов для покраски вершин (то есть, для каждого цвета i не обязательно должна существовать вершина покрашенная в цвет i).

Входные данные

Первая строка входных данных содержит два целых числа n и m (1 ≤ n, m ≤ 105), разделенных пробелом — количество вершин и дуг орграфа G, соответственно.

Следующие m строк содержат по два целых числа ai и bi (1 ≤ ai, bi ≤ n), разделенных пробелом, которые означают, что дуга номер i ведет из вершины номер ai в вершину номер bi.

Допустимы кратные дуги и петли.

Выходные данные

Выведите единственное целое число — максимальное возможное количество цветов в покраске (то есть, значение k, описанное в условии). Обратите внимание, что искомое значение k должно удовлетворять неравенству 1 ≤ k ≤ n.

Примечание

Для первого примера, k = 2, картинка ниже изображает два цвета (стрелочки показывают какой цвет, для какого следующий).

С k = 2 один из возможных способов раскрасить граф изображен ниже.

Можно доказать, что большее значение k выбрать невозможно.

Для второго примера, ниже приведена картинка для k = 5 цветов.

Возможная раскраска графа изображена ниже:

Для третьего примера, ниже приведена картинка для k = 3 цветов.

Возможная раскраска графа изображена ниже:

A. Copil Copac рисует деревья

графы Деревья дп поиск в глубину и подобное *1400

Copil Copac получил список из \(n-1\) ребра, описывающих дерево на \(n\) вершинах. Он решил нарисовать его, используя следующий алгоритм:

  • Шаг \(0\): Рисует первую вершину (вершину \(1\)). Переходит к шагу \(1\).
  • Шаг \(1\): Для каждого ребра из входных данных в порядке ввода: если ребро соединяет уже нарисованную вершину \(u\) с не нарисованной вершиной \(v\), он рисует \(v\) и ребро. После прохода по всем рёбрам он переходит к шагу \(2\).
  • Шаг \(2\): Если все вершины нарисованы, завершает алгоритм. Иначе переходит к шагу \(1\).

Количество проходов определяется как количество раз, которое Copil Copac выполняет шаг \(1\).

Найдите количество проходов, необходимых Copil Copac для рисования дерева.

Входные данные

Каждый тест содержит несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Затем следует описание наборов.

Первая строка каждого набора содержит одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество вершин дерева.

Следующие \(n - 1\) строк каждого набора содержат по два целых числа \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\), \(u_i \neq v_i\)) — концы ребра \((u_i,v_i)\), которое является \(i\)-м ребром в списке. Гарантируется, что заданные ребра образуют дерево.

Гарантируется, что сумма \(n\) по всем наборам входных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите количество проходов, необходимых Copil Copac для рисования дерева.

Примечание

В первом наборе входных данных:

После первого прохода дерево будет выглядеть так:

После второго прохода:

Таким образом, Copil Copac нужно \(2\) прохода, чтобы нарисовать дерево.

E. Хороводы

графы кратчайшие пути поиск в глубину и подобное снм *1600

\(n\) людей пришли на праздник и решили станцевать несколько хороводов. В хороводе не менее \(2\)-х людей и у каждого человека есть ровно два соседа, если в хороводе \(2\) человека, с обоих сторон один и тот же сосед.

Вы решили узнать, сколько именно было хороводов. Но каждый участник праздника запомнил ровно одного соседа. Ваша задача — определить, какое минимальное и максимальное число хороводов могло быть.

Например, если на празднике было \(6\) человек, и номера соседей, которых они запомнили, равны \([2, 1, 4, 3, 6, 5]\) соответственно, то хороводов могло быть минимум \(1\):

  • \(1 - 2 - 3 - 4 - 5 - 6 - 1\)
и максимум \(3\):
  • \(1 - 2 - 1\)
  • \(3 - 4 - 3\)
  • \(5 - 6 - 5\)
Входные данные

Первая строка содержит положительное число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка описания каждого набора входных данных содержит положительное число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество людей на празднике.

Вторая строка описания каждого набора входных данных содержит \(n\) целых чисел \(a_i\) (\(1 \le a_i \le n, a_i \neq i\)) — номер соседа, которого запомнил \(i\)-й человек.

Гарантируется, что входные данные корректны и соответствуют хотя бы одному разбиению людей на хороводы.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите два целых числа — минимальное и максимальное количество хороводов, которое могло быть.

G. Ксюша и шиншилла

Деревья дп жадные алгоритмы Конструктив поиск в глубину и подобное реализация снм *1800

У Ксюши есть домашняя шиншилла, дерево на \(n\) вершинах и огромные ножницы. Деревом называется связный граф без циклов. Сейчас Ксюша сидит на скучном уроке физики и думает над тем, как развлечь своего питомца.

Шиншиллам нравится играть с веточками. Веточкой называется дерево из \(3\) вершин.

Веточка выглядит так.

Разрезом называется удаление некоторого (ещё не отрезанного) ребра в дереве. У Ксюши полно свободного времени, поэтому она может себе позволить сделать достаточно разрезов, чтобы дерево распалось на веточки. Другими словами, после нескольких (возможно нуля) разрезов, каждая вершина должна принадлежать ровно одной веточке.

Помогите Ксюше выбрать отрезаемые рёбра или сообщите, что сделать это невозможно.

Входные данные

В первой строке дано единственное целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных дано единственное целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество вершин в дереве.

Следующие \(n - 1\) строк каждого набора входных данных содержат целые числа \(v_i\) и \(u_i\) (\(1 \le v_i, u_i \le n\)) — номера вершин, которые соединяет \(i\)-е ребро.

Гарантируется, что данный набор рёбер образует дерево. Также гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Выведите ответ для каждого набора входных данных.

Если искомого способа разрезать дерево не существует, выведите \(-1\).

В противном случае выведите целое число \(k\) — количество отрезаемых рёбер. В следующей строке выведите \(k\) различных целых чисел \(e_i\) (\(1 \le e_i < n\)) — номера отрезаемых рёбер. Если \(k = 0\), выведите вместо этого пустую строку.

Если решений несколько, вы можете вывести любое.

Примечание
Первый набор входных данных в первом тесте.

D. Гипотеза доктора Брауна

графы математика поиск в глубину и подобное теория чисел *2900

Повстанцы потерпели поражение в последней битве с имперскими войсками, но появился луч новой надежды.

Тем временем на одной из завоеванных планет Люк готовился к нелегальным уличным гонкам (что не должно удивлять, учитывая историю его семьи). Люк прибыл к финишу с 88 милями в час на спидометре. Выйдя из машины, он был встречен новой реальностью. Оказалось, что битва еще не произошла и начнется ровно через \(k\) часов.

Повстанцы разместили по одному линкору на каждой из \(n\) планет. \(m\) однонаправленных червоточин соединяют планеты. Прохождение каждой червоточины занимает ровно один час. Генералы Империума точно спланировали битву, но их войска не могут быстро адаптироваться к изменяющимся обстоятельствам. Поэтому повстанцам достаточно переместить несколько кораблей перед битвой, чтобы запутать противника, обеспечить победу и изменить судьбу галактики.

В силу многочисленных стратегических соображений, которые мы сейчас опустим, повстанцы хотели бы выбрать два корабля, которые поменяются местами так, чтобы оба они были в движении все время (ровно \(k\) часов). Другими словами, повстанцы ищут две планеты \(x\) и \(y\) такие, что существуют пути длиной \(k\) от \(x\) до \(y\) и от \(y\) до \(x\).

Из-за ограниченного запаса топлива выбор одного корабля также будет приемлемым. Этот корабль должен лететь через червоточины в течение \(k\) часов, а затем вернется на исходную планету.

Сколько существует способов выбора кораблей для выполнения задания?

Входные данные

В первой строке ввода находятся три целых числа \(n\), \(m\) и \(k\) (\(1 \leq n \leq 10^5\), \(0 \leq m \leq 2 \cdot 10^5\), \(n^3 \leq k \leq 10^{18}\)), обозначающие соответственно количество планет, червоточин и часов, оставшихся до начала битвы.

Следующие \(m\) строк содержат по два целых числа \(x\) и \(y\) (\(1 \leq x, y \leq n\), \(x \ne y\)), означающих, что существует однонаправленная червоточина от планеты \(x\) до планеты \(y\). Гарантируется, что не существует двух одинаковых червоточин, т. е. для любых двух червоточин либо \(x_1 \neq x_2\), либо \(y_1 \neq y_2\).

Выходные данные

В первой и единственной строке ваша программа должна вывести количество возможных вариантов выбора пары или одного военного корабля для миссии.

Примечание

В первом наборе входных данных можно выбрать пары кораблей со следующих планет: \(2\) и \(5\), \(3\) и \(5\), \(1\) и \(4\). Также можно было выбрать отдельные корабли с планет \(6\) и \(7\).

Во втором наборе входных данных можно выбрать пару кораблей из следующих планет: \(2\) и \(3\). Также можно было выбрать отдельные корабли с планет \(1\), \(2\), \(3\), \(4\) и \(5\).

В третьем наборе входных данных нет пар кораблей, которые мы можем выбрать. Также можно было выбрать отдельные корабли с планет \(2\) и \(3\).

F. Хороший граф

битмаски графы Паросочетания поиск в глубину и подобное реализация *3500

Вам дан двудольный граф \(G\) с множеством вершин в левой доле \(L\), в правой доле \(R\) и \(m\) ребрами, соединяющими эти два множества. Мы знаем, что \(|L| = |R| = n\).

Для любого подмножества \(S \subseteq L\), пусть \(N(S)\) обозначает множество всех соседей вершин в \(S\). Мы говорим, что подмножество \(S \subseteq L\) в графе \(G\) является строгим, если \(|S| = |N(S)|\). Мы говорим, что граф \(G\) является хорошим, если \(\forall_{S \subseteq L}, |S| \leq |N(S)|\).

Ваша задача — проверить, является ли граф хорошим, и, если да, то оптимизировать его. Если граф не является хорошим, найдите подмножество \(S \subseteq L\) такое, что \(|S| > |N(S)|\). Однако, если граф хороший, ваша задача — найти хороший двудольный граф \(G'\) с тем же набором вершин \(L \cup R\), в котором \(\forall_{S \subseteq L}\) множество \(S\) является строгим в \(G\) тогда и только тогда, когда \(S\) строго в \(G'\). Если таких графов несколько, выберите один с наименьшим возможным числом ребер. Если таких графов по-прежнему несколько, выведите любой из них.

Входные данные

Первая строка входных данных содержит два целых числа \(n\) и \(m\) (\(1 \leq n \leq 10^3\), \(0 \leq m \leq n^2\)), разделенных пробелом. Число \(n\) обозначает количество вершин в каждом из множеств \(L\) и \(R\), а число \(m\) — количество ребер между ними.

Следующие \(m\) строк описывают ребра. Каждая из них содержит два целых числа \(l\) и \(r\) (\(1 \leq l \leq n\), \(n+1 \leq r \leq 2 \cdot n\)), разделенных пробелом, что указывает на наличие ребра из вершины \(l \in L\) в вершину \(r \in R\).

Выходные данные

Если граф \(G\), заданный на входе, не является хорошим, выведите в первой строке вывода одно слово «NO». Во второй строке вывода выведите число \(k\), а в третьей строке выведите \(k\) чисел \(l_1, l_2, \dots, l_k\), разделенные пробелами. Эти числа должны показать, что для множества \(S = \{l_1, l_2, \dots, l_k\}\) выполняется \(|S| > |N(S)|\).

Однако, если граф \(G\), заданный на входе, хороший, выведите одно слово «YES» в первой строке вывода. Во второй строке вывода выведите число \(m'\), обозначающее количество ребер в новом, также хорошем графе \(G'\). Затем, в следующих \(m'\) строках, выведите ребра графа \(G'\) в том же формате, что и во входных данных.

Примечание

В первом тестовом примере граф \(G\) хороший; таким образом, мы ищем эквивалентный граф с такими же строгими множествами. Единственный строгий набор — это \(\{ 1, 2, 3 \}\), который остается строгим в результирующем графе. Более того, никакое другое множество не является строгим в полученном графе. Можно доказать, что не существует графа с менее чем \(6\) ребрами и такими же строгимимножествами.

Во втором тестовом примере граф \(G\) не является хорошим. Множество \(\{ 2, 3 \}\) имеет только одного соседа — вершину \(6\). Таким образом, \(|\{ 2, 3 \}| > |\{ 6 \}|\), что доказывает, что входной граф не является хорошим.

E. Игра в уменьшения

дп жадные алгоритмы интерактив Конструктив поиск в глубину и подобное *2400

Это интерактивная задача.

Рассмотрим следующую игру для двух игроков:

  • Изначально на доску выписывается массив целых чисел \(a_1, a_2, \ldots, a_n\) длины \(n\).
  • Игра состоит из раундов. На каждом раунде происходит следующее:
    • Первый игрок выбирает любое \(i\), такое, что \(a_i \gt 0\). Если такого \(i\) не существует, первый игрок проигрывает (второй игрок выигрывает) и игра заканчивается.
    • Второй игрок выбирает любое \(j \neq i\), такое, что \(a_j \gt 0\). Если такого \(j\) не существует, второй игрок проигрывает (первый игрок выигрывает) и игра заканчивается.
    • Вычисляется \(d = \min(a_i, a_j)\). Значения \(a_i\) и \(a_j\) одновременно уменьшаются на \(d\), после чего начинается следующий раунд.

Можно показать, что игра всегда заканчивается после конечного числа раундов.

Выберите, за кого вы хотите сыграть (за первого игрока или за второго) в эту игру, и выиграйте за него.

Входные данные

В первой строке задано целое число \(n\) (\(1 \le n \le 300\)) — длина массива \(a\).

Во второй строке заданы \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 300\)) — массив \(a\).

Протокол взаимодействия

Взаимодействие начинается после считывания \(n\) и массива \(a\).

Вы должны начать взаимодействие с вывода одной строки «First» или «Second», обозначающей игрока, за которого вы будете играть.

На каждом раунде происходит следующее:

  • Если вы выбрали первого игрока, то вы должны вывести одно целое число \(i\) (\(1 \le i \le n\)) в отдельной строке. После этого вы должны считать одно целое число \(j\) (\(-1 \le j \le n\)), выведенное в отдельной строке.

    Если \(j = -1\), то это значит, что вы сделали некорректный ход. В таком случае вы должны немедленно завершить вашу программу.

    Если \(j = 0\), то это значит, что второй игрок не может сделать корректный ход, и, соответственно, вы выигрываете игру. В этом случае вы также должны завершить вашу программу.

    Иначе \(j\) равняется индексу, выбранному вторым игроком, и вы должны перейти к следующему раунду.

  • Если вы выбрали второго игрока, то вы должны считать одно целое число \(i\) (\(-1 \le i \le n\)), выведенное в отдельной строке.

    Если \(i = -1\), то это значит, что вы сделали некорректный ход на предыдущем раунде. В этом случае вы должны немедленно завершить вашу программу.

    Если \(i = 0\), то это значит, что первый игрок не может сделать корректный ход и вы выигрываете игру. В этом случае вы также должны завершить вашу программу.

    Иначе \(i\) равняется индексу, выбранному первым игроком. В таком случае вы должны вывести одно целое число \(j\) (\(1 \le j \le n\)) в отдельной строке и перейти к следующему раунду.

После вывода \(i\) или \(j\) не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Взломы

В этой задаче отключены взломы.

Примечание

В первом примере \(n = 4\) и массив \(a\) равен \([\, 10, 4, 6, 3 \,]\). Ход игры будет следующим:

  • После считывания массива \(a\) программа участника выбирает первого игрока и выводит «First».
  • Первый раунд: первый игрок выбирает \(i = 1\), второй игрок выбирает \(j = 3\). Считается \(d = \min(a_1, a_3) = \min(10, 6) = 6\). Элементы \(a_1\) и \(a_3\) уменьшаются на \(6\). Массив \(a\) становится равен \([\, 4, 4, 0, 3 \,]\).
  • Второй раунд: первый игрок выбирает \(i = 2\), второй игрок выбирает \(j = 1\). Считается \(d = \min(a_2, a_1) = \min(4, 4) = 4\). Элементы \(a_2\) и \(a_1\) уменюшаются на \(4\). Массив \(a\) становится равен \([\, 0, 0, 0, 3 \,]\).
  • Третий раунд: первый игрок выбирает \(i = 4\). Не существует \(j \neq 4\), такого, что \(a_j > 0\), поэтому второй игрок не может сделать ход и первый игрок выигрывает. Интерактор выводит \(j = 0\), после считывания которого программа участника завершается.

Во втором примере \(n = 6\) и массив \(a\) равен \([\, 4, 5, 5, 11, 3, 2 \,]\). Ход игры будет следующим:

  • Программа участника выбирает второго игрока и выводит «Second».
  • Первый раунд: \(i = 2\), \(j = 4\), \(a = [\, 4, 0, 5, 6, 3, 2 \,]\).
  • Второй раунд: \(i = 5\), \(j = 4\), \(a = [\, 4, 0, 5, 3, 0, 2 \,]\).
  • Третий раунд: \(i = 4\), \(j = 3\), \(a = [\, 4, 0, 2, 0, 0, 2 \,]\).
  • Четвертый раунд: \(i = 6\), \(j = 1\), \(a = [\, 2, 0, 2, 0, 0, 0 \,]\).
  • Пятый раунд: \(i = 1\), \(j = 3\), \(a = [\, 0, 0, 0, 0, 0, 0 \,]\).
  • Шестой раунд: первый игрок не может сделать ход и второй игрок выигрывает. Интерактор выводит \(i = 0\), после считывания которого программа участника завершается.

Обратите внимание, что лишние переводы строки в примерах приведены только для удобства и в действительности вам не нужно их выводить. Программа жюри также не будет выводить лишних переводов строки.

F. Рельсотроны

графы дп Перебор поиск в глубину и подобное *2200

Тёма играет в одну очень интересную компьютерную игру.

Во время прохождения очередной миссии, персонаж Тёмы оказался на незнакомой планете. В отличие от Земли эта планета плоская и представима в виде прямоугольника \(n \times m\).

Персонаж Тёмы находится в точке с координатами \((0, 0)\), чтобы успешно завершить миссию ему необходимо живым добраться до точки с координатами \((n, m)\).

Пусть персонаж компьютерной игры находится в координате \((i, j)\). Каждую секунду, начиная с первой, Тёма может:

  • либо воспользоваться технологией гиперпрыжка по вертикали, после чего его персонаж попадёт в координату \((i + 1, j)\) в конце секунды,
  • либо воспользоваться технологией гиперпрыжка по горизонтали, после чего его персонаж попадёт в координату \((i, j + 1)\) в конце секунды,
  • либо Тёма может не совершать гиперпрыжок, тогда его персонаж не будет перемещаться в течение этой секунды.

Пришельцы, что обитают на этой планете очень опасны и настроены враждебно. Поэтому они будут стрелять из своих рельсотронов \(r\) раз.

Каждый выстрел полностью простреливает одну координату по вертикали или горизонтали. Если в момент выстрела (в конце секунды) персонаж находится в зоне его поражения, то он умирает.

Так как Тёма посмотрел исходный код игры, он знает полную информацию о каждом выстреле — время, простреливаемую координату, а также направление выстрела.

За какое минимальное время персонаж может добраться до нужной точки? Если он обречён на смерть и не сможет добраться до точки с координатами \((n, m)\), выведите \(-1\).

Входные данные

В первой строке входных данных содержится одно целое число \(T\) (\(1 \le T \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов.

В первой строке набора содержатся два целых числа \(n\) и \(m\) (\(1 \le n \cdot m \le 10^4\)) — размеры планеты, её высота и ширина.

Во второй набора данных содержится единственное целое число \(r\) (\(1 \le r \le 100\)) — количество выстрелов.

Далее следует \(r\) строк, каждая из которых описывает один выстрел.

Выстрел описывается тремя целыми числами \(t\), \(d\), \(coord\). Где \(t\) — секунда, в которую будет произведён данный выстрел (\(1 \le t \le 10^9\)). \(d\) — обозначение направления выстрела (\(d = 1\) обозначает выстрел вдоль горизонтали, \(d = 2\) обозначает выстрел вдоль вертикали). \(coord\) — величина простреливаемой координаты (\(0 \le coord \le n\) при \(d = 1\), \(0 \le coord \le m\) при \(d = 2\)).

Cумма произведений \(n \cdot m\) по всем наборам входных данных не превосходит \(10^4\).

Выходные данные

Для каждого набора входных данных выведите единственное число — минимальное время, за которое персонаж сможет добраться до координаты \((n, m)\), либо же \(-1\), если ему суждено погибнуть.

Примечание

В первом наборе входных данных персонаж может перемещаться следующим образом: \((0, 0) \rightarrow (0, 1) \rightarrow (0, 2) \rightarrow (0, 3) \rightarrow (0, 3) \rightarrow (1, 3)\).

Во втором примере входных данных персонаж не сможет выйти за пределы прямоугольника, который будет полностью простреливаться выстрелами на \(2\) секунде.

F. Тенцинг и дерево

Деревья жадные алгоритмы кратчайшие пути поиск в глубину и подобное сортировки *2500

У Тенцинга есть неориентированное дерево из \(n\) вершин.

Определим ценность дерева с черными и белыми вершинами следующим образом: значение ребра — это абсолютная разница между количеством черных вершин в двух компонентах дерева после удаления ребра. Ценность дерева — это сумма значений по всем ребрам.

Для всех \(k\) таких, что \(0 \leq k \leq n\), Тенцинг хочет знать максимальную ценность дерева, когда \(k\) вершин окрашены в черный цвет, а \(n-k\) вершин — в белый.

Входные данные

Первая строка ввода содержит одно целое число \(n\) (\(1\leq n\leq 5000\)) — количество вершин.

Следующие \(n-1\) строк ввода содержат \(2\) целых числа \(u_i\) и \(v_i\) (\(1 \leq u_i, v_i \leq n, u_i \neq v_i\)), обозначающих ребро между вершинами \(u_i\) и \(v_i\). Гарантируется, что заданные ребра образуют дерево.

Выходные данные

Выведите \(n+1\) число. Число \(i\) является ответом на вопрос \(k=i-1\).

Примечание

Рассмотрим первый пример. Когда \(k=2\), Тенцинг может покрасить вершины \(1\) и \(2\) в черный цвет, тогда значение ребра \((1,2)\) равно 0, а значения остальных ребер все равны \(2\). Таким образом, ценность этого дерева равна \(4\).

D. Яблоня

Деревья дп Комбинаторика математика поиск в глубину и подобное *1200

У Тимофея в саду растёт яблоня, она представляет собой корневое дерево из \(n\) вершин с корнем в вершине \(1\) (вершины пронумерованы от \(1\) от \(n\)). Деревом называется связный граф без циклов, петель и кратных ребер.

Это дерево очень необычное — оно растёт корнем вверх. Впрочем, в этом нет ничего необычного для деревьев в программировании.

Яблоня достаточно молодая, поэтому на ней вырастет всего два яблока. Яблоки вырастут в определённых вершинах (эти вершины могу совпадать). После того как яблоки вырастут, Тимофей начнёт трясти яблоню, пока яблоки не упадут. Каждый раз, когда Тимофей трясёт яблоню, с каждым из яблок происходит следующее:

Пусть яблоко сейчас находится в вершине \(u\).

  • Если у вершины \(u\) есть ребёнок, то яблоко перемещается в него (если таких вершин несколько, то яблоко может переместиться в любую из них).
  • Иначе яблоко падает с дерева.

Можно показать, что через конечное время оба яблока упадут с дерева.

У Тимофея есть \(q\) предположений, в каких вершинах могут вырасти яблоки. Он предполагает, что яблоки могут вырасти в вершинах \(x\) и \(y\), и хочет узнать количество пар вершин (\(a\), \(b\)), с которых яблоки могут упасть с дерева, где \(a\) — вершина, с которой упадёт яблоко из вершины \(x\), \(b\) — вершина, с которой упадёт яблоко из вершины \(y\). Помогите ему это сделать.

Входные данные

В первой строке дано число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных даны числа \(n\) (\(2 \leq n \leq 2 \cdot 10^5\)) — количество вершин в яблоне.

Далее следует \(n - 1\) строка, описывающая дерево. В \(i\)-й из них даны числа \(u_i\) и \(v_i\) (\(1 \leq u_i, v_i \leq n\), \(u_i \ne v_i\)) — ребро в дереве.

В следующей строке дано единственное целое число \(q\) (\(1 \leq q \leq 2 \cdot 10^5\)) — количество предположений Тимофея.

Далее следует \(q\) строк, описывающих предположения Тимофея. В \(i\)-й строке даны числа \(x_i\) и \(y_i\) (\(1 \leq x_i, y_i \leq n\)) — предполагаемые вершины, на которых вырастут яблоки.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\). Аналогично, сумма \(q\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого запроса Тимофея выведите количество упорядоченных пар вершин, с которых яблоки могут упасть с дерева, если предположение окажется верным, в отдельной строке.

Примечание

В первом примере:

  • Для первого запроса существует две возможные пары вершин, с которых яблоки могут упасть: \((4, 4), (5, 4)\).
  • Для второго запроса также существует две пары: \((5, 4), (5, 5)\).
  • Для третьего запроса есть всего одна пара: \((4, 4)\).
  • Для четвертого запроса существует \(4\) пары: \((4, 4), (4, 5), (5, 4), (5, 5)\).
Дерево из первого примера.

Во втором примере для первого предположения есть \(4\) возможных пар вершин, с которых могут упасть яблоки: \((2, 3), (2, 2), (3, 2), (3, 3)\). Для второго запроса есть всего одна возможная пара: \((2, 3)\). Для третьего запроса есть две пары: \((3, 2), (3, 3)\).

F1. Метрополитен в Омске (простая версия)

графы Деревья дп жадные алгоритмы математика поиск в глубину и подобное Структуры данных *1800

Это простая версия задачи. Единственное отличие между простой и сложной версией состоит в том, что в этой версии для всех вопросов \(u = 1\).

Как известно, Омск — столица Берляндии. Как и в любой столице, в Омске есть хорошо развитая система метрополитена. Метрополитен Омска представляет из себя некоторое количество станций, соединённых туннелями, причём между любыми двумя станциями есть ровно один путь, проходящий по каждому из туннелей не более одного раза. Иными словами, метрополитен представляет собой дерево.

Для развития метрополитена и привлечения жителей в Омске используется следующая система. Каждая станция имеет свой вес \(x \in \{-1, 1\}\). Если станция имеет вес \(-1\), то при посещении станции с жителя Омска взимается плата в \(1\) бурль. Если же вес станции равен \(1\), то житель Омска вознаграждается \(1\)-м бурлем.

Пока что есть только одна станция с номером \(1\) и весом \(x = 1\). Каждый день происходит одно из следующих событий:

  • К станции с номером \(v_i\) присоединяется новая станция с весом \(x\), и ей присваивается номер, на единицу больший количества уже существующих станций.
  • Лёша, живущий в Омске, задаётся вопросом: существует ли подотрезок\(\dagger\) (возможно, пустой) пути между вершинами \(u\) и \(v\) такой, что, проехав по нему, можно заработать ровно \(k\) бурлей (если \(k < 0\), то это означает, что на проезд придётся потратить \(k\) бурлей). Иначе говоря, Лёшу интересует, существует ли такой подотрезок пути, что сумма весов вершин в нем равна \(k\). Обратите внимание, что подотрезок может быть пустым, и тогда сумма равна \(0\).

Вы являетесь другом Лёши, поэтому Ваша задача — ответить на вопросы Лёши.

\(\dagger\)Подотрезок — непрерывная последовательность элементов.

Входные данные

В первой строке находится число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных дано число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)) — количество событий.

Далее следует \(n\) строк, описывающих события. В \(i\)-й строке возможен один из вариантов:

  • Сначала идёт символ «+» (без кавычек), затем два числа \(v_i\) и \(x_i\) (\(x_i \in \{-1, 1\}\), также гарантируется, что вершина с номером \(v_i\) существует). В этом случае к станции с номером \(v_i\) присоединяется новая станция с весом \(x_i\).
  • Сначала идёт символ «?» (без кавычек), а затем три числа \(u_i\), \(v_i\) и \(k_i\) (\(-n \le k_i \le n\)). Гарантируется, что вершины с номерами \(u_i\) и \(v_i\) существуют. В этом случае необходимо определить, существует ли подотрезок (возможно, пустой) пути между станциями \(u_i\) и \(v_i\) с суммой весов ровно \(k_i\). В этой версии задачи гарантируется, что \(u_i = 1\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого вопроса Лёши выведите «Yes» (без кавычек), если описанный в условии подотрезок существует, иначе выведите «No» (без кавычек).

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

Примечание

Пояснение к первому примеру.

Ответ на второй вопрос «Yes», так как существует путь \(1\).

В четвертом вопросе мы можем снова выбрать путь \(1\).

В пятом запросе ответ «Yes», так как есть путь \(1-3\).

В шестом запросе мы можем выбрать пустой путь, так как сумма весов на нем равна \(0\).

Нетрудно показать, что нет путей, удовлетворяющих первому и третьему запросу.

F2. Метрополитен в Омске (сложная версия)

Деревья дп математика поиск в глубину и подобное разделяй и властвуй Структуры данных *2300

Это сложная версия задачи. Единственное отличие между простой и сложной версией состоит в том, что в этой версии \(u\) может принимать любые возможные значения.

Как известно, Омск — столица Берляндии. Как и в любой столице, в Омске есть хорошо развитая система метрополитена. Метрополитен Омска представляет из себя некоторое количество станций, соединённых туннелями, причём между любыми двумя станциями есть ровно один путь, проходящий по каждому из туннелей не более одного раза. Иными словами, метрополитен представляет собой дерево.

Для развития метрополитена и привлечения жителей в Омске используется следующая система. Каждая станция имеет свой вес \(x \in \{-1, 1\}\). Если станция имеет вес \(-1\), то при посещении станции с жителя Омска взимается плата в \(1\) бурль. Если же вес станции равен \(1\), то житель Омска вознаграждается \(1\)-м бурлем.

Пока что есть только одна станция с номером \(1\) и весом \(x = 1\). Каждый день происходит одно из следующих событий:

  • К станции с номером \(v_i\) присоединяется новая станция с весом \(x\), и ей присваивается номер, на единицу больший количества уже существующих станций.
  • Лёша, живущий в Омске, задаётся вопросом: существует ли подотрезок\(\dagger\) (возможно, пустой) пути между вершинами \(u\) и \(v\) такой, что, проехав по нему, можно заработать ровно \(k\) бурлей (если \(k < 0\), то это означает, что на проезд придётся потратить \(k\) бурлей). Иначе говоря, Лёшу интересует, существует ли такой подотрезок пути, что сумма весов вершин в нем равна \(k\). Обратите внимание, что подотрезок может быть пустым, и тогда сумма равна \(0\).

Вы являетесь другом Лёши, поэтому Ваша задача — ответить на вопросы Лёши.

\(\dagger\)Подотрезок — непрерывная последовательность элементов.

Входные данные

В первой строке находится число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных дано число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)) — количество событий.

Далее следует \(n\) строк, описывающих события. В \(i\)-й строке возможен один из вариантов:

  • Сначала идёт символ «+» (без кавычек), затем два числа \(v_i\) и \(x_i\) (\(x_i \in \{-1, 1\}\), также гарантируется, что вершина с номером \(v_i\) существует). В этом случае к станции с номером \(v_i\) присоединяется новая станция с весом \(x_i\).
  • Сначала идёт символ «?» (без кавычек), а затем три числа \(u_i\), \(v_i\) и \(k_i\) (\(-n \le k_i \le n\)). Гарантируется, что вершины с номерами \(u_i\) и \(v_i\) существуют. В этом случае необходимо определить, существует ли подотрезок (возможно, пустой) пути между станциями \(u_i\) и \(v_i\) с суммой весов ровно \(k_i\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого вопроса Лёши выведите «Yes» (без кавычек), если описанный в условии подотрезок существует, иначе выведите «No» (без кавычек).

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

Примечание

Пояснение к первому примеру.

Ответ на второй вопрос «Yes», так как существует путь \(1\).

В четвертом вопросе мы можем снова выбрать путь \(1\).

В пятом запросе ответ «Yes», так как есть путь \(1-3\).

В шестом запросе мы можем выбрать пустой путь, так как сумма весов на нем равна \(0\).

Нетрудно показать, что нет путей, удовлетворяющих первому и третьему запросу.

E. Прекрасные таблицы

2-sat графы Конструктив поиск в глубину и подобное снм *2400

Таблицу размерами \(n \times m\), состоящую из символов, назовём прекрасной, если она удовлетворяет следующим трём условиям:

  • Каждый символ — это 'A', 'B' или 'C'.
  • В любой непрерывной подтаблице размерами \(2 \times 2\) каждая из трёх букв встречается хотя бы один раз.
  • В любых двух клетках, имеющих общую сторону, записаны разные буквы.

Через \((x,y)\) обозначим клетку на пересечении \(x\)-й сверху строки и \(y\)-го слева столбца.

Вы хотите построить прекрасную таблицу, которая бы также удовлетворяла \(k\) ограничениям. Каждое ограничение задаёт условие на две клетки — \((x_{i,1},y_{i,1})\) и \((x_{i,2},y_{i,2})\), которые имеют ровно один общий угол. Вы хотите, чтобы в вашей таблице в клетках \((x_{i,1},y_{i,1})\) и \((x_{i,2},y_{i,2})\) были записаны одинаковые буквы.

Определите, существует ли прекрасная таблица, удовлетворяющая всем ограничениям.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа: \(n\), \(m\) и \(k\) (\(2 \le n,m \le 2 \cdot 10^3\), \(1 \le k \le 4 \cdot 10^3\)).

Каждая из следующих \(k\) строк содержит по четыре целых числа: \(x_{i,1}\), \(y_{i,1}\), \(x_{i,2}\) и \(y_{i,2}\) (\(1 \le x_{i,1} < x_{i,2} \le n\), \(1 \le y_{i,1},y_{i,2} \le m\)). Гарантируется, что \((x_{i,2},y_{i,2}) = (x_{i,1}+1,y_{i,1}+1)\) или \((x_{i,2},y_{i,2}) = (x_{i,1}+1,y_{i,1}-1)\).

Пары клеток попарно различны, т. е. для всех \(1 \le i < j \le k\) неверно, что \(x_{i,1} = x_{j,1}\), \(y_{i,1} = y_{j,1}\), \(x_{i,2} = x_{j,2}\) и \(y_{i,2} = y_{j,2}\) одновременно.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^3\).

Гарантируется, что сумма значений \(m\) по всем наборам входных данных не превосходит \(2 \cdot 10^3\).

Гарантируется, что сумма значений \(k\) по всем наборам входных данных не превосходит \(4 \cdot 10^3\).

Выходные данные

Для каждого набора входных данных выведите «YES», если существует прекрасная таблица, удовлетворяющая всем ограничениям. Иначе выведите «NO».

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

В первом наборе входных данных следующая прекрасная таблица удовлетворяет всем ограничениям:

BABC
CBCA
ACAB

Во втором наборе входных данных два ограничения означают, что в клетках \((1,1)\) и \((2,2)\) записаны одинаковые буквы, а также в клетках \((1,2)\) и \((2,1)\) записаны одинаковые буквы. Поэтому невозможно сделать так, чтобы единственная подтаблица \(2 \times 2\) содержала бы все три буквы хотя бы по разу.

G. Дерево с весами

битмаски Деревья Конструктив математика матрицы поиск в глубину и подобное реализация Структуры данных теория чисел *3000

Дано дерево на \(n\) вершинах, пронумерованных числами \(1,2,\dots,n\). \(i\)-е ребро соединяет вершины \(u_i\) и \(v_i\) и имеет некоторый неизвестный целый положительный вес \(w_i\). Вам также известны расстояния \(d_i\) между вершинами \(i\) и \(i+1\) для всех \(1 \le i \le n-1\) (это расстояние равно сумме весов рёбер на простом пути между вершинами дерева \(i\) и \(i+1\)).

Найдите вес каждого ребра. Если существует несколько решений, выведите любое из них. Если не существует весов \(w_i\), согласующихся со всеми данными, выведите одно целое число \(-1\).

Входные данные

Первая строка содержит целое число \(n\) (\(2 \le n \le 10^5\)).

В \(i\)-й из следующих \(n-1\) строк содержатся по два числа: \(u_i\) и \(v_i\) (\(1 \le u_i,v_i \le n\), \(u_i \ne v_i\)).

В последней строке содержится \(n-1\) целых чисел \(d_1,\dots,d_{n-1}\) (\(1 \le d_i \le 10^{12}\)).

Гарантируется, что заданные ребра образуют дерево.

Выходные данные

Если решения не существует, выведите одно целое число \(-1\). В противном случае выведите \(n-1\) строку, содержащую веса \(w_1,\dots,w_{n-1}\).

Если существует несколько решений, выведите любое из них.

Примечание

В первом примере дерево выглядит следующим образом:

Во втором примере вес \(w_2\) не может быть равен \(0\), поскольку должен быть целым положительным числом. Поэтому решения нет.

В третьем примере дерево выглядит следующим образом:

F. Личность босса

Бинарный поиск битмаски жадные алгоритмы математика поиск в глубину и подобное сортировки Структуры данных *2500

Во время расследования происхождения Диаволо, Джорно получает от Полнареффа секретный код. Код можно представить в виде бесконечной последовательности целых положительных чисел: \(a_1, a_2, \dots \). Джорно сразу видит закономерность, лежащую в основе кода. Первые \(n\) чисел \(a_1, a_2, \dots, a_n\) являются известными. Для \(i > n\) значение \(a_i\) равно \((a_{i-n}\ |\ a_{i-n+1})\), где \(|\) обозначает операцию побитового ИЛИ.

Части информации о Диаволо скрыты в \(q\) вопросах. Каждый вопрос связан с положительным целым числом \(v\), а ответом на него является наименьший индекс \(i\), такой, что \(a_i > v\). Если такого \(i\) не существует, то ответом будет \(-1\). Помогите Джорно ответить на вопросы!

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит количество наборов входных данных \(t\) (\(1 \le t \le 10\,000\)). Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(q\) (\(2 \leq n \leq 2 \cdot 10^5\) , \(1 \leq q \leq 2 \cdot 10^5\)).

Вторая строка каждого набора входных данных содержит \(n\) целых \(a_1,a_2,\ldots,a_n\) (\(0 \leq a_i \leq 10^9\)) — части кода, которые определяют шаблон.

В \(i\)-й из следующих \(q\) строк содержится одно целое число \(v_i\) (\(0 \leq v_i \leq 10^9\)) — вопрос, который задает Джорно.

Сумма \(n\) и \(q\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Выведите \(q\) чисел. Число \(i\) является ответом на \(i\)-й вопрос, заданный Джорно.

Примечание

В первом примере \(a = [2,1,3,3,\ldots]\).

  • Для первого вопроса, \(a_1=2\) – элемент с наименьшим индексом, больший чем \(1\).
  • Для второго вопроса, \(a_3=3\) – элемент с наименьшим индексом, больший чем \(2\).
  • Для третьего вопроса, нет индекса \(i\), такого что \(a_i > 3\).
.

H. Третья буква

графы жадные алгоритмы поиск в глубину и подобное реализация снм *1700

Чтобы выиграть свою самую трудную битву, Мирча придумал отличную стратегию для своей армии. У него есть \(n\) солдат, и он решил расположить их определенным образом в лагерях. Каждый солдат должен принадлежать ровно одному лагерю, и на каждой целочисленной точке оси \(x\) находится один лагерь (на точках \(\cdots, -2, -1, 0, 1, 2, \cdots\)).

Стратегия состоит из \(m\) условий. Условие \(i\) гласит, что солдат \(a_i\) должен принадлежать лагерю, который находится в \(d_i\) метрах перед лагерем, к которому принадлежит человек \(b_i\). (Если \(d_i < 0\), то лагерь \(a_i\) должен быть в \(-d_i\) метрах позади лагеря \(b_i\).)

Теперь Мирча задается вопросом, существует ли разбиение солдат, которое удовлетворяет условию, и просит вашей помощи! Ответьте «YES», если существует разбиение из \(n\) солдат, которое удовлетворяет всем \(m\) условиям, и «NO» в противном случае.

Обратите внимание, что два разных солдата могут быть размещены в одном лагере.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных.

Первая строка каждого набора содержит два положительных целых числа \(n\) и \(m\) (\(2 \leq n \leq 2 \cdot 10^5\); \(1 \leq m \leq n\)) — количество солдат и количество условий соответственно.

Затем следуют \(m\) строк, каждая из которых содержит \(3\) целых числа: \(a_i\), \(b_i\), \(d_i\) (\(a_i \neq b_i\); \(1 \leq a_i, b_i \leq n\); \(-10^9 \leq d_i \leq 10^9\)) — описывающие условия, объясненные в условии. Обратите внимание, что если \(d_i\) положительно, то \(a_i\) должен быть в \(d_i\) метрах перед \(b_i\), а если отрицательно, то \(a_i\) должен быть в \(-d_i\) метрах позади \(b_i\).

Обратите внимание, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите «YES», если существует такое расположение \(n\) солдат, которое удовлетворяет всем \(m\) условиям, и «NO» в противном случае.

Примечание

В первом примере мы можем разделить солдат на лагеря следующим образом:

  • Солдат \(1\) в лагере с координатой \(x = 3\).
  • Солдат \(2\) в лагере с координатой \(x = 5\).
  • Солдат \(3\) в лагере с координатой \(x = 9\).
  • Солдат \(4\) в лагере с координатой \(x = 11\).

Для второго примера не существует разбиения, которое может удовлетворить все ограничения одновременно.

Для третьего примера не существует разбиения, которое удовлетворяет всем условиям, так как мы получаем противоречивую информацию о той же паре.

Одно из возможных разбиений, удовлетворяющих условиям в четвёртом примере:

  • Солдат \(1\) в лагере с координатой \(x = 10\).
  • Солдат \(2\) в лагере с координатой \(x = 13\).
  • Солдат \(3\) в лагере с координатой \(x = -2023\).
  • Солдат \(4\) в лагере с координатой \(x = -2023\).

E. Настя и зелья

графы дп поиск в глубину и подобное сортировки *1500

Алхимик Настя очень любит смешивать зелья. Всего алхимии известно \(n\) видов зелий, одно зелье вида \(i\) можно купить за \(c_i\) монет.

Любой вид зелий можно получить не более чем одним способом, путём смешивания из нескольких других. Зелья, которые используются в смешивании при этом потратятся. Причём ни одно зелье нельзя получить из самого себя путём одного или нескольких смешиваний.

Как опытный алхимик, Настя имеет зелья \(k\) видов \(p_1, p_2, \dots, p_k\) в неограниченных количествах, но не знает какое захочет получить следующим. Чтобы определиться, она просит вас для всех \(1 \le i \le n\) узнать, какое минимальное число монет нужно потратить, чтобы следующим получить зелье вида \(i\).

Входные данные

В первой строке входных данных содержится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов.

В первой строке набора содержится два целых числа \(n\) и \(k\) (\(1 \le k < n \le 2 \cdot 10^5\)) — количество видов зелий всего и количество видов зелий, которые есть у Насти.

Во второй строке набора содержатся \(n\) чисел \(c_1, c_2, \dots, c_n\) (\(1 \le c_i \le 10^9\)) – стоимости покупки зелий.

В третьей строке набора содержатся \(k\) различных целых чисел \(p_1, p_2, \dots, p_k\) (\(1 \le p_i \le n\)) — номера зелий, которые уже есть у Насти в неограниченных количествах.

Далее следуют \(n\) строк, описывающих способы получения зелий смешиванием.

Каждая строка начинается с числа \(m_i\) (\(0 \le m_i < n\)) — количество зелий, необходимое для смешивания зелья вида \(i\) (\(1 \le i \le n\)).

Дальше строка содержит \(m_i\) различных целых чисел \(e_1, e_2, \dots, e_{m_i}\) (\(1 \le e_j \le n\), \(e_j \ne i\)) — номера зелий необходимых для смешивания зелья вида \(i\). Если этот список пуст, то зелье вида \(i\) можно только купить.

Гарантируется, что ни одно зелье нельзя получить из самого себя путём одного или нескольких смешиваний.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\). Аналогично гарантируется, что сумма значений \(m_i\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(n\) чисел — минимальное число монет, которое нужно потратить, чтобы получить зелье каждого вида.

Примечание

В первом наборе первого примера оптимально:

  • Получить зелье первого типа купив и смешав \(2\), \(4\) и \(5\);
  • зелье второго типа можно получить только купив его;
  • у Насти уже есть неограниченное число зелий третьего типа;
  • зелье четвертого типа выгоднее купить, чем купить и смешать другие зелья;
  • зелье пятого типа можно получить только купив его;

E1. ПерестановДерево (простая версия)

Деревья дп поиск в глубину и подобное *1800

Это простая версия задачи. Различия между двумя версиями заключаются в ограничении на \(n\) и ограничении по времени. Делать взломы можно только в том случае, если решены обе версии задачи.

Дано дерево с \(n\) вершинами с корнем в вершине \(1\).

Для некоторой перестановки\(^\dagger\) \(a\) длины \(n\) пусть \(f(a)\) — количество пар вершин \((u, v)\) таких, что \(a_u < a_{\operatorname{lca}(u, v)} < a_v\). Здесь \(\operatorname{lca}(u,v)\) обозначает наименьшего общего предка вершин \(u\) и \(v\).

Найдите максимально возможное значение \(f(a)\) по всем перестановкам \(a\) длины \(n\).

\(^\dagger\) Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)).

Входные данные

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 5000\)) — количество вершин в дереве.

Вторая строка содержит \(n - 1\) целых чисел \(p_2,p_3,\ldots,p_n\) (\(1 \le p_i < i\)), указывающих на наличие ребра между вершинами \(i\) и \(p_i\).

Выходные данные

Выведите максимальное значение \(f(a)\).

Примечание

Дерево в первом примере:

Одной возможной оптимальной перестановкой \(a\) является \([2, 1, 4, 5, 3]\) с \(4\)-мя подходящими парами вершин:

  • \((2, 3)\), так как \(\operatorname{lca}(2, 3) = 1\) и \(1 < 2 < 4\),
  • \((2, 4)\), так как \(\operatorname{lca}(2, 4) = 1\) и \(1 < 2 < 5\),
  • \((2, 5)\), так как \(\operatorname{lca}(2, 5) = 1\) и \(1 < 2 < 3\),
  • \((5, 4)\), так как \(\operatorname{lca}(5, 4) = 3\) и \(3 < 4 < 5\).

Дерево в третьем примере:

Дерево в четвёртом примере:

E2. ПерестановДерево (сложная версия)

битмаски бпф Деревья дп жадные алгоритмы математика поиск в глубину и подобное реализация *2700

Это сложная версия задачи. Различия между двумя версиями заключаются в ограничении на \(n\) и ограничении по времени. Делать взломы можно только в том случае, если решены обе версии задачи.

Дано дерево с \(n\) вершинами с корнем в вершине \(1\).

Для некоторой перестановки\(^\dagger\) \(a\) длины \(n\) пусть \(f(a)\) — количество пар вершин \((u, v)\) таких, что \(a_u < a_{\operatorname{lca}(u, v)} < a_v\). Здесь \(\operatorname{lca}(u,v)\) обозначает наименьшего общего предка вершин \(u\) и \(v\).

Найдите максимально возможное значение \(f(a)\) по всем перестановкам \(a\) длины \(n\).

\(^\dagger\) Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)).

Входные данные

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 10^6\)) — количество вершин в дереве.

Вторая строка содержит \(n - 1\) целых чисел \(p_2,p_3,\ldots,p_n\) (\(1 \le p_i < i\)), указывающих на наличие ребра между вершинами \(i\) и \(p_i\).

Выходные данные

Выведите максимальное значение \(f(a)\).

Примечание

Дерево в первом примере:

Одной возможной оптимальной перестановкой \(a\) является \([2, 1, 4, 5, 3]\) с \(4\)-мя подходящими парами вершин:

  • \((2, 3)\), так как \(\operatorname{lca}(2, 3) = 1\) и \(1 < 2 < 4\),
  • \((2, 4)\), так как \(\operatorname{lca}(2, 4) = 1\) и \(1 < 2 < 5\),
  • \((2, 5)\), так как \(\operatorname{lca}(2, 5) = 1\) и \(1 < 2 < 3\),
  • \((5, 4)\), так как \(\operatorname{lca}(5, 4) = 3\) и \(3 < 4 < 5\).

Дерево в третьем примере:

Дерево в четвёртом примере:

E1. Откаты (простая версия)

Деревья Перебор поиск в глубину и подобное Структуры данных *2500

Это простая версия задачи. Единственное отличие между простой и сложной версиями в том, что в сложной версии вы должны отвечать на запросы в режиме онлайн. Вы можете делать взломы, только если обе версии задачи решены.

У вас есть массив \(a\), изначально пустой. Вам нужно обрабатывать запросы следующих типов:

  • + \(x\) — добавить число \(x\) в конец массива \(a\).
  • - \(k\) — удалить \(k\) последних чисел из массива \(a\).
  • ! — откатить последнее действующее изменение (т. е. сделать массив \(a\) таким, каким он был до изменения). В данной задаче изменениями считаются только запросы первых двух типов (+ и -).
  • ? — найти количество различных чисел в массиве \(a\).
Входные данные

В первой строке задано одно целое число \(q\) (\(1 \leq q \leq 10^6\)) — количество запросов.

В следующих \(q\) строках даны запросы в формате, описанном выше.

Гарантируется, что

  • в запросах первого типа \(1 \le x \le 10^6\);
  • в запросах второго типа \(k \ge 1\) и \(k\) не превосходит текущей длины массива \(a\);
  • в момент запроса третьего типа есть хотя бы один запрос первого или второго типа, который можно откатить.

Также гарантируется, что количество запросов четвёртого типа не превосходит \(10^5\).

Выходные данные

Для каждого запроса четвёртого типа выведите одно целое число: количество различных элементов в массиве \(a\) в момент запроса.

Примечание

В первом тесте из условия массив \(a\) изменяется следующим образом:

  1. После первого запроса \(a=[1]\).
  2. После второго запроса \(a=[1,2]\).
  3. После третьего запроса \(a=[1,2,2]\).
  4. В момент четвёртого запроса в массиве \(a\) встречаются \(2\) различных числа: \(1\) и \(2\).
  5. После пятого запроса \(a=[1,2]\) (откатили изменение + 2).
  6. После шестого запроса \(a=[1,2,3]\).
  7. После седьмого запроса \(a=[1]\).
  8. В момент восьмого запроса массиве \(a\) состоит только из одной \(1\).
  9. После девятого запроса \(a=[1,1]\).
  10. В момент десятого запроса массиве \(a\) состоит только из двух \(1\).

Во втором тесте из условия массив \(a\) изменяется следующим образом:

  1. После первого запроса \(a=[1]\).
  2. После второго запроса \(a=[1,1\,000\,000]\).
  3. В момент третьего запроса в массиве \(a\) встречаются \(2\) различных числа: \(1\) и \(1\,000\,000\).
  4. После четвёртого запроса \(a=[1]\) (откатили изменение + 1000000).
  5. После пятого запроса \(a=[]\) (откатили изменение + 1).
  6. В момент шестого запроса в массиве \(a\) нет чисел, поэтому ответ на этот запрос равен \(0\).

F. Телепортация в Байтландии

графы Деревья кратчайшие пути поиск в глубину и подобное разделяй и властвуй Структуры данных *3200

В Байтландии есть \(n\) городов, некоторые пары которых соединены дорогами, по которым можно ездить в обе стороны. \(i\)-я дорога характеризуется сложностью проезда по ней \(w_i\). Время проезда по дороге со сложностью \(w_i\) равняется \(\lceil\frac{w_i}{c}\rceil\) часов, где \(c\) — навык вождения водителя.

Транспортная система Байтландии представляет собой дерево. Иными словами, между любой парой городов существует ровно один путь, который проходит по каждому городу не более одного раза.

В некоторых городах можно посетить курсы вождения. Если провести в таком городе, изучая курсы, \(T\) часов, то навык вождения \(c\) увеличивается в \(2\) раза. Заметьте, что значение \(T\) одинаково во всех городах, и курсы можно посещать в одном и том же городе несколько раз.

Вам нужно ответить на \(q\) запросов: за какое минимальное время можно добраться из города \(a\) в город \(b\), если начать путь с навыком вождения \(c = 1\)?

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка входных данных содержит единственное целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(T\) (\(1 \le n \le 10^5, 1 \le T \le 10^6\)) - количество городов в Байтландии и время, которое занимает прохождение одного курса.

Каждая из следующих \(n - 1\) строк содержит три целых числа \(u_i\), \(v_i\) и \(w_i\) (\(1 \le u_i, v_i \le n, 1 \le w_i \le 10^6, u_i \neq v_i\)), которые описывают дорогу между городами \(u_i\) и \(v_i\) со сложностью \(w_i\).

Следующая строка содержит бинарную строку \(s\) длины \(n\), состоящую из символов \(0\) и \(1\). Если \(s_i = 1\) (\(1 \le i \le n\)), то в \(i\)-м городе можно пройти курсы. Если \(s_i = 0\) (\(1 \le i \le n\)), то в \(i\)-м городе нельзя пройти курсы.

Следующая строка содержит одно целое число \(q\) (\(1 \le q \le 10^5\)) — количество запросов, на которые вам нужно ответить.

Каждая из следующих \(q\) строк содержит по два числа \(a_j\) и \(b_j\) (\(1 \le a_j, b_j \le n, 1 \le j \le q\)) — вершины, между которыми нужно найти минимальное время поездки в \(j\)-м запросе.

Гарантируется, что система дорог образует дерево. Гарантируется, что сумма \(n\) и сумма \(q\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого запроса выведите одно целое число в отдельной строке — минимальное время, за которое можно добраться в соответствующем запросе.

Примечание

В первом наборе входных данных в первом запросе оптимально не проходить курсы вождения. Тогда минимальное время равно сложности дороги между городами \(1\) и \(2\), которое равно \(1\).

Во втором наборе входных данных в первом запросе оптимально вначале пройти курсы вождения за \(3\) часа в городе \(1\) один раз, а потом поехать в город \(5\). Тогда всего путь займёт \(3 + \lceil\frac{5}{2}\rceil + \lceil\frac{10}{2}\rceil = 11\) часов.

E. Редактор с быстрым перемещением

графы кратчайшие пути поиск в глубину и подобное Структуры данных *2400

Задана строка \(s\), состоящая из строчных латинских букв.

Курсор изначально находится между двумя соседними буквами строки. Курсор не может стоять до первой или после последней буквы.

Вы можете совершить любое количество действий с курсором (возможно, ноль). Каждое действие должно быть одного из трех типов:

  • подвинуть курсор на одну позицию влево (если это не поместит его до первой буквы);
  • подвинуть курсор на одну позицию вправо (если это не поместит его после последней буквы);
  • пусть \(x\) — буква сразу слева от курсора, а \(y\) — буква сразу справа. Вы можете выбрать любую пару соседних букв в строке, такую, что левая буква в паре тоже \(x\), а правая тоже \(y\), и переместить курсор в позицию между этими двумя буквами.

Вы должны обработать \(m\) запросов. В каждом запросе задаются два целых числа \(f\) и \(t\), описывающих корректные позиции курсора в строке; в качестве ответа на запрос вы должны вывести минимальное количество действий, требуемое, чтобы переместить курсор из позиции \(f\) в позицию \(t\).

Входные данные

В первой строке записана строка \(s\) (\(2 \le |s| \le 5 \cdot 10^4\)), состоящая из строчных латинских букв.

Во второй строке записано одно целое число \(m\) (\(1 \le m \le 5 \cdot 10^4\)) — количество запросов.

В \(i\)-й из следующих \(m\) строк записаны два целых числа \(f\) и \(t\) (\(1 \le f, t \le |s| - 1\)) — начальная и конечная позиции курсора в \(i\)-м запросе. Позиция \(x\) означает, что курсор находится между \(x\)-й и \((x+1)\)-й буквами строки (в \(1\)-индексации).

Выходные данные

На каждый запрос выведите одно целое число — минимальное количество действий, необходимое, чтобы передвинуть курсор из позиции \(f\) в позицию \(t\).

C. Запросы к массиву

Деревья поиск в глубину и подобное реализация Строки Структуры данных *1600

У Монокарпа был массив \(a\), состоящий из целых чисел. Изначально массив был пустым.

Монокарп выполнял три типа запросов к этому массиву:

  • выбрать число и добавить его в конец массива. Каждый раз, когда Монокарп выполнял этот запрос, он выписывал символ +;
  • удалить последний элемент из массива. Каждый раз, когда Монокарп выполнял этот запрос, он выписывал символ -. Монокарп не выполнял этот запрос, если массив был пуст;
  • проверить, отсортирован ли массив в порядке неубывания, т. е. выполняется ли \(a_1 \le a_2 \le \dots \le a_k\), где \(k\) — количество элементов в массиве на данный момент. Любой массив, содержащий меньше \(2\) элементов, считается отсортированным. Если массив отсортирован в момент запроса, Монокарп выписывал символ 1. Иначе он выписывал символ 0.

Вам задана строка \(s\), состоящая из \(q\) символов 0, 1, + и/или -. Это символы, выписанные Монокарпом, строго в том порядке, в каком он их выписывал.

Вам нужно выяснить, является ли эта строка непротиворечивой, т. е. мог ли Монокарп выполнять такие запросы, что выписанная после них строка равна строке \(s\).

Входные данные

Первая строка входных данных содержит одно число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Единственная строка каждого набора входных данных содержит строку \(s\) (\(1 \le |s| \le 2 \cdot 10^5\)). Это строка состоит из символов 0, 1, + и/или -. Это символы, выписанные Монокарпом, строго в том порядке, в каком он их выписывал.

Дополнительные ограничения на входные данные:

  • для любого префикса \(s\) количество символов + не меньше количества символов -. Другими словами, если бы Монокарп выполнял описанные в условии запросы, он никогда не пытался бы удалить элемент из пустого массива;
  • сумма \(|s|\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).
Выходные данные

Для каждого набора входных данных выведите YES, если Монокарп мог выполнить такие запросы, в результате которых будет выписана строка \(s\). Иначе выведите NO.

Вы можете выводить символы в ответе в любом регистре.

Примечание

В первом наборе входных данных Монокарп мог выполнить следующие запросы:

  • добавить число \(13\);
  • добавить число \(37\);
  • проверить, что массив \([13, 37]\) отсортирован в порядке неубывания (и он действительно отсортирован).

В пятом наборе входных данных Монокарп мог выполнить следующие запросы:

  • добавить число \(3\);
  • добавить число \(2\);
  • проверить, что массив \([3, 2]\) отсортирован (он не отсортирован);
  • удалить последний элемент;
  • добавить число \(3\);
  • проверить, что массив \([3, 3]\) отсортирован (он отсортирован);
  • удалить последний элемент;
  • добавить число \(-5\);
  • проверить, что массив \([3, -5]\) отсортирован (он не отсортирован);

В остальных наборах входных данных Монокарп не мог выписать строку \(s\), выполняя свои запросы.

E. Спидран

графы дп жадные алгоритмы математика Перебор поиск в глубину и подобное сортировки *2100

Вы играете в компьютерную игру, в которой есть \(n\) заданий, которые вам нужно выполнить. Однако \(j\)-е задание можно выполнить только в начале \(h_j\)-го часа игрового дня. Каждый игровой день длится ровно \(k\) часов. Часы каждого игрового дня пронумерованы числами \(0, 1, \ldots, k - 1\). После конца первого дня начинается следующий, и так далее.

Между заданиями есть зависимости: для некоторых пар \((a_i, b_i)\) задание с номером \(b_i\) может быть выполнено только после выполнения задания с номером \(a_i\). Гарантируется, что циклических зависимостей нет, поскольку иначе игру пройти было бы невозможно и никто не стал бы в неё играть.

Вы очень хорошо умеете играть в эту игру, поэтому вы можете выполнить любое число заданий за пренебрежимо малое время (т. е. вы можете выполнить любое число заданий в начале одного и того же часа, даже если между ними есть зависимости). Вам нужно выполнить все задания как можно быстрее. Вы можете выполнять их в любом доступном порядке. Время прохождения игры равно разнице между временем завершения последнего задания и временем завершения первого задания в этом порядке.

Найдите наименьшее время, за которое можно пройти игру.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1\le t\le 100\,000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(n\), \(m\) и \(k\) (\(1\le n\le 200\,000\), \(0\le m\le 200\,000\), \(1\le k\le 10^9\)) — количество заданий, количество зависимостей между ними, а также длительность игрового дня в часах.

Следующая строка содержит \(n\) целых чисел \(h_1, h_2, \ldots, h_n\) (\(0\le h_i < k\)).

Следующие \(m\) строк описывают зависимости. В \(i\)-й из них содержатся два целых числа \(a_i\) и \(b_i\) (\(1\le a_i < b_i\le n\)): это означает, что задание с номером \(b_i\) может быть выполнено только после выполнения задания \(a_i\). Гарантируется, что все зависимости попарно различны.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(200\,000\).

Гарантируется, что сумма значений \(m\) по всем наборам входных данных не превосходит \(200\,000\).

Выходные данные

Для каждого набора входных данных выведите одно число — наименьшее время, необходимое для прохождения игры.

Примечание

В первом наборе входных данных задания \(1\) и \(4\) нужно выполнить в начале \(12\)-го часа дня, но они не могут быть выполнены в течение одного часа, поскольку между ними нужно выполнить задания \(2\) и \(3\). Однако всё это можно сделать за \(24\) часа. Для этого можно начать в \(12\) часов первого игрового дня, выполнив первое задание. В \(16\) часов можно выполнить задание \(2\). В \(18\) часов можно выполнить задание \(3\). Наконец, в \(12\) часов следующего дня можно выполнить задание \(4\). С момента выполнения первого задания до момента выполнения последнего прошло \(24\) часа.

В третьем наборе входных данных можно выполнить первое задание, а затем сразу же выполнить второе. Можно начать в \(5\) часов первого дня, выполнив первое задание. Сразу после этого становится доступным второе задание, его можно выполнять немедленно. Суммарное прошедшее время равно \(0\).

В четвёртом наборе входных данных можно начать с третьего задания. Можно начать в \(555\) часов первого дня и закончить в \(35\) часов второго дня. Суммарное прошедшее время равно \(1035-555=480\).

C. Completely Searching for Inversions

графы дп поиск в глубину и подобное *1900

Pak Chanek has a directed acyclic graph (a directed graph that does not have any cycles) containing \(N\) vertices. Vertex \(i\) has \(S_i\) edges directed away from that vertex. The \(j\)-th edge of vertex \(i\) that is directed away from it, is directed towards vertex \(L_{i,j}\) and has an integer \(W_{i,j}\) (\(0\leq W_{i,j}\leq1\)). Another information about the graph is that the graph is shaped in such a way such that each vertex can be reached from vertex \(1\) via zero or more directed edges.

Pak Chanek has an array \(Z\) that is initially empty.

Pak Chanek defines the function dfs as follows:

// dfs from vertex i
void dfs(int i) {
// iterate each edge of vertex i that is directed away from it
for(int j = 1; j <= S[i]; j++) {
Z.push_back(W[i][j]); // add the integer in the edge to the end of Z
dfs(L[i][j]); // recurse to the next vertex
}
}

Note that the function does not keep track of which vertices have been visited, so each vertex can be processed more than once.

Let's say Pak Chanek does dfs(1) once. After that, Pak Chanek will get an array \(Z\) containing some elements \(0\) or \(1\). Define an inversion in array \(Z\) as a pair of indices \((x, y)\) (\(x < y\)) such that \(Z_x > Z_y\). How many different inversions in \(Z\) are there if Pak Chanek does dfs(1) once? Since the answer can be very big, output the answer modulo \(998\,244\,353\).

Input

The first line contains a single integer \(N\) (\(2 \leq N \leq 10^5\)) — the number of vertices in the graph. The following lines contain the description of each vertex from vertex \(1\) to vertex \(N\).

The first line of each vertex \(i\) contains a single integer \(S_i\) (\(0 \leq S_i \leq N-1\)) — the number of edges directed away from vertex \(i\).

The \(j\)-th of the next \(S_i\) lines of each vertex \(i\) contains two integers \(L_{i,j}\) and \(W_{i,j}\) (\(1 \leq L_{i,j} \leq N\); \(0 \leq W_{i,j} \leq 1\)) — an edge directed away from vertex \(i\) that is directed towards vertex \(L_{i,j}\) and has an integer \(W_{i,j}\). For each \(i\), the values of \(L_{i,1}\), \(L_{i,2}\), ..., \(L_{i,S_i}\) are pairwise distinct.

It is guaranteed that the sum of \(S_i\) over all vertices does not exceed \(2 \cdot 10^5\). There are no cycles in the graph. Each vertex can be reached from vertex \(1\) via zero or more directed edges.

Output

An integer representing the number of inversions in \(Z\) if Pak Chanek does dfs(1) once. Since the answer can be very big, output the answer modulo \(998\,244\,353\).

Note

The following is the dfs(1) process on the graph.

In the end, \(Z=[0,1,0,1,1,0]\). All of its inversions are \((2,3)\), \((2,6)\), \((4,6)\), and \((5,6)\).

D. Циклические операции

графы жадные алгоритмы Конструктив Перебор поиск в глубину и подобное реализация *1800

У Егора был массив \(a\) длины \(n\), изначально состоящий из нулей. Однако он захотел сделать из него другой массив \(b\) длины \(n\).

Поскольку Егор не ищет легких путей, разрешено использовать только такую операцию (возможно ноль или несколько раз):

  • выбрать массив \(l\) длины \(k\) (\(1 \leq l_i \leq n\), все \(l_i\) различны) и поменять каждый элемент \(a_{l_i}\) на \(l_{(i\%k)+1}\) (\(1 \leq i \leq k\)).

Ему стало интересно, а можно ли вообще получить массив \(b\) с помощью таких операций. Поскольку Егор еще только начинающий программист, он попросил Вас помочь ему решить эту задачу.

Операция \(\%\) означает взятие по модулю, то есть \(a\%b\) равно остатку от деления числа \(a\) на число \(b\).

Входные данные

В первой строке входных данных дано целое число \(t\) (\(1 \leq t \leq 10^5\)) - количество наборов входных данных.

Каждый набор состоит из двух строк. В первой строке даны целые числа \(n\) и \(k\) (\(1 \leq k \leq n \leq 10^5\)).

Во второй строке вводится массив \(b_1, b_2, \ldots, b_n\) (\(1 \leq b_i \leq n\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если существует способ получить массив \(b\), используя только заданную операцию. Иначе выведите «NO» (без кавычек). Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

Рассмотрим первый пример:

  • Применим операцию с \(l\) = \([1,2,3]\). Теперь \(a\) = \([2,3,1,0,0]\).
  • Применим операцию с \(l\) = \([3,5,4]\). Теперь \(a\) = \([2,3,5,3,4]\) = \(b\).
Мы видим, что получить массив \(b\) можно. Следовательно ответ YES.

Во втором примере можно доказать, что массив \(b\) получить нельзя, следовательно ответ NO.

F. Максимально не похожее дерево

жадные алгоритмы Конструктив Перебор поиск в глубину и подобное хэши *2700

Дано дерево с \(n\) вершинами с корнем в вершине \(1\), обозначим его за \(G\). Также обозначим за \(P(G)\) мультимножество поддеревьев всех вершин дерева \(G\). Вам надо найти дерево \(G'\) размера \(n\) с корнем в вершине \(1\) такое, что количество поддеревьев в \(P(G')\) к которым есть изоморфные в \(P(G)\) было минимально.

Поддерево вершины \(v\) - это граф, который содержит все вершины, для которых вершина \(v\) лежит на пути от корня дерева до нее самой, а так же все ребра между этими вершинами.

Два корневых дерева считаются изоморфными если можно так перенумеровать вершины одного из них, чтобы оно стало равно второму, при этом корень первого дерева должен получить номер корня второго дерева.

Входные данные

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 10^6\)) - количество вершин в дереве \(G\). Каждая из следующих \(n-1\) строк содержит два целых числа \(a\) и \(b\) \((1 \leq a,b \leq n)\), означающие, что между вершинами \(a\) и \(b\) в дереве есть ребро.

Выходные данные

Выведите \(n-1\) строку, каждая строка содержит два числа \(a\), \(b\) \((1 \leq a,b \leq n)\) - рёбра дерева \(G'\). Если существует несколько оптимальных ответов, выведите любой.

C. Скверная Память

поиск в глубину и подобное снм *2000

Zart PMP вышел в финал мирового чемпионата ICPC World Finals, который проводится в китайском городе Харбине. Сходив на групповую экскурсию в Sun Island Park и насладившись выставкой снежных скульптур, PMP должен вернуться к автобусам до того, как они уедут. Но парк очень большой, и он не знает, как найти стоянку.

В парке есть n перекрестков, пронумерованных от 1 до n. Есть m двунаправленных дорог, соединяющих некоторые пары из этих перекрестков. На k перекрестках волонтеры ICPC помогают командам и показывают им путь к месту назначения. Волонтеры стоят в фиксированных точках и не двигаются, никакие два волонтера не стоят на одном перекрестке.

Когда PMP просит волонтера указать путь до стоянки, тот/та может описать ему весь путь. Но парк полностью покрыт льдом и снегом и все выглядит почти одинаково. Из-за этого PMP может запомнить не более q перекрестков после каждого вопроса (не считая перекрестка, на котором он стоит в данный момент). Он всегда рассказывает волонтерам о своей слабой памяти и если нет прямого пути длиной не более q (в количестве дорог), ведущему к стоянке, то волонтер направит PMP к другому волонтеру (расстояние до которого в количестве дорог, разумеется, не должно превышать q). Волонтеры ICPC прекрасно знают парк и всегда указывают PMP самый лучший путь. Таким образом, если существует путь до стоянки, PMP безусловно найдет его.

Изначально PMP находится на перекрестке s, а автобусы стоят на перекрестке t. На перекрестке s всегда есть волонтер. Ваша задача — найти, при каком минимальном значении q PMP сможет найти автобусы.

Входные данные

В первой строке записаны через пробел три целых числа n, m, k (2 ≤ n ≤ 105, 0 ≤ m ≤ 2·105, 1 ≤ k ≤ n) — количество перекрестков, дорог и волонтеров соответственно. В следующей строке записано через пробел k различных целых чисел от 1 до n включительно — номера перекрестков, на которых стоят волонтеры.

Следующие m строк описывают дороги. В i-ой строке записаны через пробел два целых числа ui, vi (1 ≤ ui, vi ≤ n, ui ≠ vi) — два перекрестка, соединенные i-ой дорогой. Между любыми двумя перекрестками есть не более одной дороги.

Последняя строка входного файла содержит через пробел два целых числа s, t (1 ≤ s, t ≤ n, s ≠ t) — исходная позиция PMP, расположение автобусов. Не гарантируется, что автобусная станция достижима по дорогам парка из перекрестка с номером s.

Гарантируется, что на перекрестке s всегда стоит волонтер.

Выходные данные

Выведите на единственной строке ответ к задаче: минимальное значении q, при котором PMP сможет найти автобусы. Если PMP не сможет найти автобусы ни при каком значении q выведите -1.

Примечание

Первый пример проиллюстрирован ниже. Синим отмечены перекрестки, в которых находятся волонтеры. Пунктирная линия показывает возможный путь, для такого пути ответ q = 3:

Во втором примере, при q = 3 PMP может дойти до перекрестка номер 6, а потом дойти до автобусной остановки.

F. Продажа зверинца

графы математика поиск в глубину и подобное реализация снм *1800

Вы владелец зверинца, состоящего из \(n\) животных пронумерованных от \(1\) до \(n\). Однако содержать зверинец достаточно затратно, поэтому вы решили его продать!

Известно, что каждое животное боится ровно одного другого животного. А точнее, животное \(i\) боится животного \(a_i\) (\(a_i \neq i\)). Также для каждого животного известна его стоимость, для животного \(i\) она равняется \(c_i\).

Вы будете продавать всех своих животных в каком-то зафиксированном порядке. Формально, вам надо будет выбрать некоторую перестановку\(^\dagger\) \(p_1, p_2, \ldots, p_n\), и продать сначала животное \(p_1\), потом животное \(p_2\), и так далее, последним продав животное \(p_n\).

Когда вы продаёте животное \(i\), есть два варианта развития событий:

  • Если животное \(a_i\) было продано раньше чем животное \(i\), вы получаете \(c_i\) денег за продажу животного \(i\).
  • Если животное \(a_i\) не было продано раньше чем животное \(i\), вы получаете \(2 \cdot c_i\) денег за продажу животного \(i\). (Удивительно, но животные, которые боятся в текущий момент имеют большую ценность).

Ваша задача — выбрать порядок продажи животных так, чтобы максимизировать суммарную прибыль.

Например, если \(a = [3, 4, 4, 1, 3]\), \(c = [3, 4, 5, 6, 7]\) и выбранная вами перестановка равна \([4, 2, 5, 1, 3]\), то:

  • Первым продаётся животное \(4\). Животное \(a_4 = 1\) не было продано ранее, а значит, вы получаете \(2 \cdot c_4 = 12\) денег за продажу.
  • Вторым продаётся животное \(2\). Животное \(a_2 = 4\) было продано ранее, а значит, вы получаете \(c_2 = 4\) денег за продажу.
  • Третьим продаётся животное \(5\). Животное \(a_5 = 3\) не было продано ранее, а значит, вы получаете \(2 \cdot c_5 = 14\) денег за продажу.
  • Четвёртым продаётся животное \(1\). Животное \(a_1 = 3\) не было продано ранее, а значит, вы получаете \(2 \cdot c_1 = 6\) денег за продажу.
  • Пятым продаётся животное \(3\). Животное \(a_3 = 4\) было продано ранее, а значит, вы получаете \(c_3 = 5\) денег за продажу.

Ваша суммарная прибыль при таком выборе перестановки, равна \(12 + 4 + 14 + 6 + 5 = 41\). Обратите внимание, что \(41\) — не максимально возможная прибыль в этом примере.

\(^\dagger\) Перестановкой длины \(n\) называется массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) является перестановкой, но \([1,2,2]\) не является перестановкой (\(2\) встречается дважды в массиве) и \([1,3,4]\) тоже не является перестановкой (\(n=3\), но в массиве присутствует \(4\)).

Входные данные

Первая строка входных данных содержит целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов входных данных.

Первая строка описания каждого набора входных данных содержит целое число \(n\) (\(2 \le n \le 10^5\)) — количество животных.

Вторая строка набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\), \(a_i \neq i\)) — \(a_i\) означает номер животного, которого боится животное \(i\).

Третья строка набора входных данных содержит \(n\) целых чисел \(c_1, c_2, \dots, c_n\) (\(1 \le c_i \le 10^9\)) — стоимости животных.

Гарантируется, что сумма \(n\) по всем наборам не превышает \(10^5\).

Выходные данные

Выведите \(t\) строк, каждая из которых содержит ответ на соответствующий набор входных данных. В качестве ответа выведите \(n\) целых чисел — перестановку \(p_1, p_2, \ldots, p_n\), обозначающую, в каком порядке нужно продавать животных, чтобы максимизировать прибыль. Если есть несколько возможных ответов, можно вывести любой из них.

H. Безумный город

графы Деревья игры кратчайшие пути поиск в глубину и подобное снм *1700

Марсель и Валериу находятся в безумном городе, который представляет собой \(n\) зданий с \(n\) двусторонними дорогами между ними.

Марсель и Валериу начинают в зданиях \(a\) и \(b\) соответственно. Марсель хочет поймать Валериу, то есть оказаться в том же здании, что и он, или встретиться на одной дороге.

Во время каждого хода они выбирают, пойти в соседнее здание от текущего или остаться в том же здании. Поскольку Валериу хорошо знает Марселя, Валериу может предсказать, куда Марсель пойдет в следующем ходу. Валериу может использовать эту информацию, чтобы сделать свой ход. Они начинают и заканчивают ход одновременно.

Гарантируется, что любая пара зданий соединена некоторым путем, и между любой парой зданий есть не более одной дороги.

Предполагая, что оба игрока играют оптимально, ответьте, есть ли у Валериу стратегия, чтобы бесконечно уходить от Марселя.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Первая строка каждого набора содержит три целых числа, разделенных пробелом: \(n\), \(a\), \(b\) (\(3 \leq n \leq 2 \cdot 10^5\); \(1 \leq a, b \leq n\)) — количество зданий (которое равно количеству дорог) и начальные здания Марселя и Валериу.

Следующие \(n\) строк содержат по два целых числа \(u_i\), \(v_i\) (\(1 \le u_i, v_i \le n\), \(u_i \neq v_i\)) — между зданиями \(u_i\) и \(v_i\) есть дорога. Между любой неупорядоченной парой зданий может быть не более одной дороги.

Сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Дороги заданы таким образом, что можно добраться из любого здания в любое другое, двигаясь по дорогам.

Выходные данные

Для каждого набора входных данных выведите «YES», если Валериу может бесконечно уходить от Марселя, и «NO» в противном случае.

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

Примечание

В первом примере граф выглядит следующим образом:

Марсель начинает в здании \(2\), а Валериу начинает в здании \(1\). Валериу знает, каким путем Марсель будет двигаться вокруг треугольника, и он может просто всегда двигаться так же, чтобы всегда избегать Марселя.

Во втором примере граф выглядит следующим образом:

Марсель начинает в здании \(1\), а Валериу начинает в здании \(4\). Марсель может пойти в здание \(4\) на своем первом ходу и победить, так как Валериу должен либо пойти в здание \(1\) (тогда они встретятся на дороге от \(1\) до \(4\)), либо остаться в здании \(4\) (тогда они встретятся в здании \(4\)). Таким образом, у Валериу нет стратегии для победы.

B. Медуза и математика

битмаски графы дп кратчайшие пути Перебор поиск в глубину и подобное *2400

Медузе даны целые неотрицательные числа \(a\), \(b\), \(c\), \(d\) и \(m\). Первоначально \((x,y)=(a,b)\). Медуза хочет выполнить несколько операций так, чтобы получилось \((x,y)=(c,d)\).

Одна операция заключается в выполенении одного из следующих действий:

  • \(x := x\,\&\,y\),
  • \(x := x\,|\,y\),
  • \(y := x \oplus y\),
  • \(y := y \oplus m\).

Здесь \(\&\) обозначает побитовую операцию И, \(|\) обозначает побитовую операцию ИЛИ, \(\oplus\) обозначает побитовое исключающее ИЛИ.

Медуза хочет узнать минимальное количество операций, после которого можно получить \((x,y)=(c,d)\).

Входные данные

Каждый тест содержит несколько наборов входных данных. В первой строке указывается количество наборов входных данных \(t\) (\(1 \leq t \leq 10^5\)). Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит пять целых чисел \(a\), \(b\), \(c\), \(d\) и \(m\) (\(0 \leq a, b, c, d, m < 2^{30}\)).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество операций. Если требуемые значения не достижимы, то вместо этого выведите \(-1\).

Примечание

В первом наборе входных данных мы можем выполнить операцию \(y = x \oplus y\).

Во втором наборе входных данных получить \((x,y)=(1,2)\) с помощью какой-либо последовательности операций невозможно.

В третьем наборе входных данных можно выполнить операцию \(x = x\,\&\,y\), а после \(y = y \oplus m\).

C. Автосинтез

графы жадные алгоритмы Конструктив поиск в глубину и подобное сортировки *2100

Ханека написала массив \(a\) из \(n\) целых положительных чисел. Изначально ни один элемент не обведён. За одну операцию Ханека может обвести один элемент. Один и тот же элемент можно обвести несколько раз.

После выполнения всех операций Ханека составляет последовательность \(r\), состоящую из всех не обведенных элементов \(a\) в порядке возрастания их индексов.

Также Ханека составляет другую последовательность \(p\), длина которой равна количеству выполненных операций, а \(p_i\) — индекс элемента, обведенного в кружок при выполнении \(i\)-й операции.

Ханека хочет выполнить несколько операций так, чтобы последовательность \(r\) была равна последовательности \(p\). Помогите ей добиться этого или сообщите, если это невозможно! Обратите внимание, что если решений несколько, то можно вывести любое из них.

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \leq n \leq 2\cdot10^5\)) — размер массива \(a\).

Вторая строка содержит \(n\) целых чисел \(a_1,a_2,a_3,\ldots,a_n\) (\(1\leq a_i\leq n\)).

Выходные данные

Выведите одно число \(-1\), если это невозможно.

В противном случае вывод состоит из двух строк. Первая строка содержит целое число \(z\), равное количеству выполненных операций. Вторая строка содержит \(z\) целых чисел, причем \(i\)-е целое число представляет собой индекс элемента, обведенного кружком в \(i\)-й операции. Если решений несколько, то можно вывести любое из них.

Примечание

В первом примере выполнение операций, аналогичных приведенным в примере, дает следующие результаты:

  • Элемент \(a_2\) обводится \(1\) раз.
  • Элемент \(a_3\) обводится \(2\) раза.
  • Необведёнными элементами (упорядоченными по индексам) являются \(a_1\), \(a_4\) и \(a_5\). Таким образом, \(r=[3,2,3]\).
  • \(p=[3,2,3]\)

Следовательно, \(r=p\).

Во втором примере это невозможно.

D. Лексихроматография

графы Комбинаторика поиск в глубину и подобное снм *2500

Пак Чанек любит свой факультет — факультет компьютерных наук Университета Индонезии (Fasilkom). Он хочет поиграть с цветами эмблемы факультета - синим и красным.

Имеется массив \(a\), состоящий из \(n\) элементов, элемент \(i\) имеет значение \(a_i\). Пак Чанек хочет окрасить каждый элемент массива в синий или красный цвет так, чтобы выполнялись следующие условия:

  • Если все синие элементы складываются в подпоследовательность\(^\dagger\) и все красные элементы тоже, то синяя подпоследовательность строго меньше красной подпоследовательности лексикографически\(^\ddagger\).
  • Массив \(a\) не имеет ни одного несбалансированного подмассива. Подмассив называется несбалансированным тогда и только тогда, когда существует такое значение \(k\), что количество красных элементов на этом подмассиве со значением \(k\) и количество синих элементов со значением \(k\) отличается хотя бы на \(2\).
  • Заметим, что можно покрасить все элементы массива в один и тот же цвет.

Сколько различных раскрасок удовлетворяют всем этим условиям? Поскольку ответ может быть очень большим, выведите ответ по модулю \(998\,244\,353\). Две раскраски различны тогда и только тогда, когда существует хотя бы один элемент, который в одной раскраске является синим, а в другой - красным.

\(^\dagger\) Подпоследовательность массива - это последовательность, которая может быть получена из массива путем удаления некоторых элементов (возможно, ни одного), без изменения порядка оставшихся элементов.

\(^\ddagger\) Пусть \(p\) и \(q\) - две различные последовательности. Считается, что последовательность \(p\) лексикографически меньше последовательности \(q\) тогда и только тогда, когда \(p\) является префиксом \(q\) или существует индекс \(i\) такой, что \(p_j=q_j\) для всех \(1\leq j<i\), и \(p_i<q_i\). В частности, пустая последовательность всегда лексикографически меньше любой непустой последовательности.

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \leq n \leq 2\cdot10^5\)) — размер массива \(a\).

Вторая строка содержит \(n\) целых чисел \(a_1,a_2,a_3,\ldots,a_n\) (\(1\leq a_i\leq2\cdot10^5\)).

Выходные данные

Выведите одно целое число — количество различных раскрасок, удовлетворяющих всем условиям задачи, по модулю \(998\,244\,353\).

Примечание

В первом примере \(3\) способа раскраски всех элементов с индекса \(1\) по индекс \(8\):

  • Синий, красный, красный, синий, синий, красный, красный, синий.
  • Синий, красный, красный, красный, синий, синий, красный, синий.
  • Красный, красный, синий, голубой, синий, красный, красный, синий.

Например, если мы раскрасим элементы с индекса \(1\) по индекс \(8\) в красный, красный, синий, красный, красный, красный, синий, синий, синий, то это не будет корректной раскраской, так как для подмассива \(a[2..6]\) существует \(0\) синих элементов со значением \(3\) и \(2\) красных элемента со значением \(3\), что делает подмассив \(a[2..6]\) несбалансированным подмассивом.

G. Дерево wxhtzdy ORO

Бинарный поиск битмаски Деревья Перебор поиск в глубину и подобное реализация Структуры данных *2300

После (наконец-то) прохождения отбора на IOI 2023, wxhtzdy был очень счастлив и решил сделать то, что делают многие люди: попытаться угадать задачи, которые будут на IOI. В процессе этого он случайно создал задачу, которая, по его мнению, была очень крутой.

Дано дерево (связный ациклический граф) с \(n\) вершинами и \(n-1\) ребром. Вершине \(i\) (\(1 \le i \le n\)) соответствует значение \(a_i\). Пусть \(g(u, v)\) - это побитовое ИЛИ значений всех вершин на кратчайшем пути от \(u\) до \(v\). Например, если мы хотим вычислить \(g(3, 4)\) на дереве из первого набора данных примера. На пути от \(3\) до \(4\) находятся вершины \(3\), \(1\), \(4\). Тогда \(g(3, 4) = a_3 \ | \ a_1 \ | \ a_4\) (здесь \(|\) обозначает побитовое ИЛИ).

Также дано \(q\) запросов, и каждый запрос выглядит следующим образом:

Вам даны \(x\) и \(y\). Рассмотрим все вершины \(z\) такие, что \(z\) находится на кратчайшем пути от \(x\) до \(y\) (включительно).

Определим красоту вершины \(z\) как сумму количества ненулевых битов в \(g(x, z)\) и количества ненулевых битов в \(g(y, z)\). Вам нужно найти максимальную красоту среди всех вершин \(z\) на кратчайшем пути от \(x\) до \(y\).

Так как его мозг очень устал после решения output only задачи на SIO (он должен был это сделать, чтобы пройти отбор на IOI), он хочет вашей помощи в этой задаче.

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество вершин.

Вторая строка каждого набора содержит \(n\) положительных целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_v \le 10^9\)) — значение каждой вершины, \(i\)-е число в этой строке соответствует вершине \(i\).

Следующие \(n - 1\) строк описывают дерево.

Каждая строка содержит два целых числа \(u\) и \(v\) (\(1 \le u, v \le n, u \ne v\)) указывающие, что вершины \(u\) и \(v\) соединены ребром.

Следующая строка содержит одно целое число \(q\) (\(1 \le q \le 10^5\)) — количество запросов.

Следующие \(q\) строк содержат 2 целых числа \(x, y\) (\(1 \le x, y \le n\)) — вершины \(x\) и \(y\) для каждого запроса.

Гарантируется, что сумма \(n\) по всем наборам не превышает \(2 \cdot 10^5\).

Гарантируется, что сумма \(q\) по всем наборам не превышает \(10^5\).

Выходные данные

Для каждого набора входных данных выведите \(q\) целых чисел, каждое из которых является ответом на соответствующий запрос.

Примечание

На изображении ниже показано дерево из первого набора входных данных второго примера.

Дерево из первого набора входных данных второго примера.

В первом запросе \(x=7\), \(y=5\). Самый короткий путь от \(7\) до \(5\) это \(7-4-2-1-5\).

Давайте вычислим красоту вершины \(7\) на этом пути. У нас есть \(g(7,7)=a_7=10=(1010)_2\) и \(g(5,7)=a_5 \ | \ a_1 \ | \ a_2 \ | \ a_4 \ | \ a_7=10 \ | \ 4 \ | \ 7 \ | \ 4 \ | \ 10=15=(1111)_2\), поэтому ее красота равна \(2 + 4 = 6\).

Теперь давайте вычислим красоту вершины \(4\) на этом пути. У нас есть \(g(7,4)=a_7 \ | \ a_4=10 \ | \ 4=14=(1110)_2\) и \(g(5,4)=a_5 \ | \ a_1 \ | \ a_2 \ | \ a_4=10 \ | \ 4 \ | \ 7 \ | \ 4=15=(1111)_2\), поэтому ее красота равна \(3 + 4 = 7\).

Теперь давайте вычислим красоту вершины \(2\) на этом пути. У нас есть \(g(7,2)=a_7 \ | \ a_4 \ | \ a_2=10 \ | \ 4 \ | \ 7=15=(1111)_2\) и \(g(5,2)=a_5 \ | \ a_1 \ | \ a_2=10 \ | \ 4 \ | \ 7=15=(1111)_2\), поэтому ее красота равна \(4 + 4 = 8\).

Теперь давайте вычислим красоту вершины \(1\) на этом пути. У нас есть \(g(7,1)=a_7 \ | \ a_4 \ | \ a_2 \ | \ a_1=10 \ | \ 4 \ | \ 7 \ | \ 4=15=(1111)_2\) и \(g(5,1)=a_5 \ | \ a_1=10 \ | \ 4=14=(1110)_2\), поэтому ее красота равна \(4 + 3 = 7\).

Наконец, давайте вычислим красоту вершины \(5\) на этом пути. У нас есть \(g(7,5)=a_7 \ | \ a_4 \ | \ a_2 \ | \ a_1 \ | \ a_5=10 \ | \ 4 \ | \ 7 \ | \ 4 \ | \ 10=15=(1111)_2\) и \(g(5,5)=a_5=10=(1010)_2\), поэтому ее красота равна \(4 + 2 = 6\).

Максимальная красота на этом пути у вершины \(2\), и она равна \(8\).

E. Интерактивная игра с раскраской

графы Деревья интерактив Конструктив Перебор поиск в глубину и подобное реализация *2400

Это интерактивная задача. Не забывайте о том, что ваша программа должна каждый раз после вывода запроса сбрасывать буфер вывода. Для сброса буфера вывода можно использовать fflush(stdout) в C++, system.out.flush() в Java, stdout.flush() в Python или flush(output) в Pascal. Если вы используете другой язык программирования, посмотрите в его документации, как выполняется эта операция. Также рекомендуем вам прочесть руководство по интерактивным задачам: https://cf.m27.workers.dev/blog/entry/45307.

Дано дерево с \(n\) вершинами; вершина \(1\) является корнем дерева. Для каждого \(i \in [2, n]\) вам дан родитель \(i\)-й вершины \(p_i\); для каждой вершины соблюдается \(p_i < i\).

Вам предстоит раскрасить все ребра дерева, используя минимально возможное количество цветов, таким образом, чтобы выиграть в игру на этом дереве (каждое ребро должно быть окрашено в ровно один цвет).

Игра, в которую мы собираемся играть, будет проходить следующим образом. После того как вы раскрасите ребра и выведите их цвета, жюри поместит фишку в одну из вершин дерева (кроме корня). Ваша цель — переместить эту фишку в корень ровно за \(d\) ходов, где \(d\) — расстояние от вершины до корня (расстояние равно количеству ребер на пути). Если фишка достигает корня за \(d\) ходов, вы выигрываете. В противном случае вы проигрываете.

Жюри не сообщит вам, где находится фишка. Вы даже не будете знать значение \(d\) заранее. Однако в начале каждого хода вам будет сообщено, сколько ребер каждого цвета инцидентно текущей вершине (это включает как ребро, ведущее вверх по дереву, так и ребра, ведущие вниз). Вы должны выбрать один из этих цветов, и фишка будет перемещена вдоль ребра выбранного цвета (если есть несколько ребер с этим цветом, жюри выбирает одно из них). После перемещения фишки вам снова будет сообщена та же информация о текущей вершине, и игра продолжается, пока вы не достигнете корня или не сделаете \(d\) ходов, не достигнув корня.

Интерактор для этой задачи является адаптивным. Это означает, что начальная вершина и текущая вершина не фиксированы и могут изменяться «на ходу» в зависимости от вывода вашей программы. Однако состояние игры всегда будет согласовано с информацией, которую вы получаете: всегда будет как минимум одна начальная вершина и как минимум один путь вашей фишки из этой вершины, согласующийся как с информацией о цветах, которую вы получаете, так и с цветами, которые вы выбирали во время ходов.

Входные данные

Первая строка содержит одно целое число \(n\) (\(3 \le n \le 100\)) — количество вершин в дереве.

Вторая строка содержит \(n-1\) целых чисел \(p_2, p_3, \dots, p_n\) (\(1 \le p_i < i\)), где \(p_i\) — родитель \(i\)-й вершины в дереве.

Протокол взаимодействия

Сначала вы должны вывести выбранную вами раскраску ребер следующим образом:

  • в первой строке выведите одно целое число \(k\) (\(1 \le k \le n - 1\)) — количество используемых вами цветов;
  • во второй строке выведите \(n-1\) целых чисел \(c_2, c_3, \dots, c_n\) (\(1 \le c_i \le k\)), где \(c_i\) — цвет ребра, соединяющего вершины \(p_i\) и \(i\).

Затем начинается игра. В начале каждого хода программа жюри выводит что-то одно из следующего:

  • целое число \(1\) на отдельной строке, указывающее, что фишка достигла корня, и вы выиграли;
  • целое число \(-1\) на отдельной строке, указывающее, что вы не достигли корня за \(d\) ходов и проиграли, или вы сделали что-то неправильно (либо раскраска, которую вы предоставили, не соответствует ограничениям, либо ваш предыдущий ход невозможен);
  • или целое число \(0\) на отдельной строке, за которым следует строка, содержащая \(k\) целых чисел \(e_1, e_2, \dots, e_k\), где \(e_i\) — количество ребер с цветом \(i\), инцидентных текущей вершине.

Если вы получаете \(1\) или \(-1\), ваша программа должна немедленно завершиться, в противном случае вердикт для вашей посылки может быть неопределенным. Если вы получаете \(0\), за которым следуют \(k\) целых чисел \(e_1, e_2, \dots, e_k\), вы должны вывести одно целое число, указывающее цвет, который вы выбираете во время хода (конечно, \(e_i\) для этого цвета не должно быть равно \(0\)).

Не забывайте сбрасывать буфер вывода каждый раз, когда что-то выводите!

Примечание

В первом примере каждая вершина от \(2\) до \(n\) соединена с корнем. Поэтому мы можем покрасить все ребра в один цвет \(1\), и когда игра начнется, будет только одно ребро, инцидентное текущей вершине (и оно будет вести к корню).

Во втором примере дерево представляет собой путь из \(4\) вершин. Мы должны покрасить его ребра в разные цвета, потому что можно показать, что у нас нет выигрышной стратегии с двумя цветами.

F. Минимальное максимальное расстояние

графы Деревья дп кратчайшие пути поиск в глубину и подобное *1700

У вас есть дерево из \(n\) вершин, некоторые вершины которого помечены. Дерево — это связный неориентированный граф без циклов.

Обозначим за \(f_i\) максимальное расстояние от вершины с номером \(i\) до какой-то из помеченных вершин.

Ваша задача — найти минимальное значение \(f_i\) среди всех вершин.

Например, в дереве из примера раскрашены вершины с номерами \(2\), \(6\) и \(7\). Тогда массив \(f(i) = [2, 3, 2, 4, 4, 3, 3]\). \(f_i\) минимальна для вершин с номерами \(1\) и \(3\).

Входные данные

В первой строке записано число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записаны два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 2 \cdot 10^5\)) — количество вершин в дереве и количество помеченных вершин соответственно.

Во второй строке каждого набора входных данных записаны \(k\) целых чисел \(a_i\) (\(1 \le a_i \le n, a_{i-1} < a_i\)) — номера помеченных вершин.

Следующие \(n - 1\) строк содержат по два челых числа \(u_i\) и \(v_i\) — номера вершин, соединяемых \(i\)-м ребром.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное значение \(f_i\) по всем вершинам.

D. XOR на дереве

битмаски Деревья дп жадные алгоритмы поиск в глубину и подобное *1900

Дано дерево с \(n\) вершинами, пронумерованными от \(1\) до \(n\). В вершине \(i\) записано целое число \(a_{i}\) для каждого \(i = 1, 2, \ldots, n\). Ваша цель — сделать все \(a_{i}\) одинаковыми, выполнив несколько заклинаний (возможно, ни одного).

Предположим, что корнем дерева выбрана некоторая вершина. Чтобы выполнить заклинание, можно выбрать произвольную вершину \(v\) и произвольное неотрицательное целое число \(c\). Затем для каждой вершины \(i\) в поддереве\(^{\dagger}\) \(v\) нужно заменить \(a_{i}\) на \(a_{i} \oplus c\). Стоимость такого заклинания равна \(s \cdot c\), где \(s\) — число вершин в поддереве. Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ.

Пусть \(m_r\) — минимально возможная суммарная стоимость, за которую можно сделать все \(a_i\) равными, в случае если вершина \(r\) выбрана корнем дерева. Найдите \(m_{1}, m_{2}, \ldots, m_{n}\).

\(^{\dagger}\) Пусть вершина \(r\) выбрана корнем дерева. Тогда вершина \(i\) принадлежит поддереву \(v\), если простой путь от \(i\) до \(r\) содержит \(v\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^{4}\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^{5}\)).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i < 2^{20}\)).

Каждая из следующих \(n-1\) строк содержит два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\)), означающих наличие ребра между вершинами \(u\) и \(v\).

Гарантируется, что заданные ребра образуют дерево.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^{5}\).

Выходные данные

Для каждого набора входных данных выведите \(m_1, m_2, \ldots, m_n\) на отдельной строке.

Примечание

В первом наборе входных данных, чтобы найти \(m_1\), подвесим дерево за вершину \(1\).

  1. На первом заклинании выберем \(v=2\) и \(c=1\). После выполнения этого заклинания \(a\) станет равным \([3, 3, 0, 1]\). Стоимость этого заклинания равна \(3\).
  2. На втором заклинании выберем \(v=3\) и \(c=3\). После выполнения этого заклинания \(a\) станет равным \([3, 3, 3, 1]\). Стоимость этого заклинания равна \(3\).
  3. На третьем заклинании выберем \(v=4\) и \(c=2\). После выполнения этого заклинания \(a\) станет равным \([3, 3, 3, 3]\). Стоимость этого заклинания равна \(2\).

Теперь все значения в массиве \(a\) одинаковы, а суммарная стоимость равна \(3 + 3 + 2 = 8\).

Значения \(m_2\), \(m_3\), \(m_4\) находятся аналогично.

Во втором наборе входных данных цель уже достигнута, поскольку в дереве всего одна вершина.

D. Игра со стеками

графы Деревья Перебор поиск в глубину и подобное реализация *3000

У вас есть \(n\) стеков \(r_1,r_2,\ldots,r_n\). Каждый стек содержит некоторое количество целых положительных чисел в диапазоне от \(1\) до \(n\).

Определим следующие функции:

function init(pos):
stacks := массив, содержащий n стеков r[1], r[2], ..., r[n].
return get(stacks, pos)

function get(stacks, pos):
if stacks[pos] пуст:
return pos
else:
new_pos := верхний элемент stacks[pos]
удалить верхний элемент stacks[pos]
return get(stacks, new_pos)

Вы хотите узнать значения, возвращаемые \(\texttt{init(1)}, \texttt{init(2)}, \ldots, \texttt{init(n)}\).

Заметим, что во время этих вызовов стеки \(r_1,r_2,\ldots,r_n\) не изменяются, поэтому вызовы \(\texttt{init(1)}, \texttt{init(2)}, \ldots, \texttt{init(n)}\) являются независимыми.

Входные данные

Первая строка ввода содержит одно целое число \(n\) (\(1\le n\le 10^5\)) — длина массива \(r\).

Каждая из последующих \(n\) строк содержит несколько целых чисел. Первое целое число \(k_i\) (\(0\le k_i\le 10^5\)) представляет собой количество элементов в \(i\)-м стеке, а следующие \(k_i\) положительных целых чисел \(c_{i,1},c_{i,2},\ldots,c_{i,k_i}\) (\(1\le c_{i,j}\le n\)) представляют элементы в \(i\)-м стеке. \(c_{i,1}\) - нижний элемент.

В каждом тесте \(\sum k_i\le 10^6\).

Выходные данные

Необходимо вывести \(n\) значений, \(i\)-м из которых является значение, возвращаемое \(\texttt{init(i)}\).

Примечание

В первом примере:

  • При вызове \(\texttt{init(1)}\) присваивается \(\texttt{stacks := [[1,2,2],[3,1,2],[1,2,1]]}\), а затем вызывается \(\texttt{get(stacks, 1)}\).
    • \(\texttt{stacks[1]}\) не пуст, присваивается \(\texttt{new_pos := 2}\) и удаляется верхний элемент \(\texttt{stacks[1]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2],[3,1,2],[1,2,1]]\), а затем вызывается \(\texttt{get(stacks, 2)}\).
    • \(\texttt{stacks[2]}\) не пуст, присваивается \(\texttt{new_pos := 2}\) и удаляется верхний элемент \(\texttt{stacks[2]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2],[3,1],[1,2,1]]\), а затем вызывается \(\texttt{get(stacks, 2)}\).
    • \(\texttt{stacks[2]}\) не пуст, присваивается \(\texttt{new_pos := 1}\) и удаляется верхний элемент \(\texttt{stacks[2]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2],[3],[1,2,1]]\), а затем вызывается \(\texttt{get(stacks, 1)}\).
    • \(\texttt{stacks[1]}\) не пуст, присваивается \(\texttt{new_pos := 2}\) и удаляется верхний элемент \(\texttt{stacks[1]}\), в результате чего \(\texttt{stacks}\) станет \([[1],[3],[1,2,1]]\), а затем вызывается \(\texttt{get(stacks, 2)}\).
    • \(\texttt{stacks[2]}\) не пуст, присваивается \(\texttt{new_pos := 3}\) и удаляется верхний элемент \(\texttt{stacks[2]}\), в результате чего \(\texttt{stacks}\) станет \([[1],[],[1,2,1]]\), а затем вызывается \(\texttt{get(stacks, 3)}\).
    • \(\texttt{stacks[3]}\) не пуст, присваивается \(\texttt{new_pos := 1}\) и удаляется верхний элемент \(\texttt{stacks[3]}\), в результате чего \(\texttt{stacks}\) станет \([[1],[],[1,2]]\), а затем вызывается \(\texttt{get(stacks, 1)}\).
    • \(\texttt{stacks[1]}\) не пуст, присваивается \(\texttt{new_pos := 1}\) и удаляется верхний элемент \(\texttt{stacks[1]}\), в результате чего \(\texttt{stacks}\) станет \([[],[],[1,2]]\), а затем вызывается \(\texttt{get(stacks, 1)}\).
    • \(\texttt{stacks[1]}\) пуст, возвращается \(1\).
  • При вызове \(\texttt{init(2)}\) присваивается \(\texttt{stacks := [[1,2,2],[3,1,2],[1,2,1]]}\), а затем вызывается \(\texttt{get(stacks, 2)}\).
    • \(\texttt{stacks[2]}\) не пуст, присваивается \(\texttt{new_pos := 2}\) и удаляется верхний элемент \(\texttt{stacks[2]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2,2],[3,1],[1,2,1]]\), а затем вызывается \(\texttt{get(stacks, 2)}\).
    • \(\texttt{stacks[2]}\) не пуст, присваивается \(\texttt{new_pos := 1}\) и удаляется верхний элемент \(\texttt{stacks[2]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2,2],[3],[1,2,1]]\), а затем вызывается \(\texttt{get(stacks, 1)}\).
    • \(\texttt{stacks[1]}\) не пуст, присваивается \(\texttt{new_pos := 2}\) и удаляется верхний элемент \(\texttt{stacks[1]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2],[3],[1,2,1]]\), а затем вызывается \(\texttt{get(stacks, 2)}\).
    • \(\texttt{stacks[2]}\) не пуст, присваивается \(\texttt{new_pos := 3}\) и удаляется верхний элемент \(\texttt{stacks[2]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2],[],[1,2,1]]\), а затем вызывается \(\texttt{get(stacks, 3)}\).
    • \(\texttt{stacks[3]}\) не пуст, присваивается \(\texttt{new_pos := 1}\) и удаляется верхний элемент \(\texttt{stacks[3]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2],[],[1,2]]\), а затем вызывается \(\texttt{get(stacks, 1)}\).
    • \(\texttt{stacks[1]}\) не пуст, присваивается \(\texttt{new_pos := 2}\) и удаляется верхний элемент \(\texttt{stacks[1]}\), в результате чего \(\texttt{stacks}\) станет \([[1],[],[1,2]]\), а затем вызывается \(\texttt{get(stacks, 2)}\).
    • \(\texttt{stacks[2]}\) пуст, возвращается \(2\).
  • При вызове \(\texttt{init(3)}\) присваивается \(\texttt{stacks := [[1,2,2],[3,1,2],[1,2,1]]}\), а затем вызывается \(\texttt{get(stacks, 3)}\).
    • \(\texttt{stacks[3]}\) не пуст, присваивается \(\texttt{new_pos := 1}\) и удаляется верхний элемент \(\texttt{stacks[3]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2,2],[3,1,2],[1,2]]\), а затем вызывается \(\texttt{get(stacks, 1)}\).
    • \(\texttt{stacks[1]}\) не пуст, присваивается \(\texttt{new_pos := 2}\) и удаляется верхний элемент \(\texttt{stacks[1]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2],[3,1,2],[1,2]]\), а затем вызывается \(\texttt{get(stacks, 2)}\).
    • \(\texttt{stacks[2]}\) не пуст, присваивается \(\texttt{new_pos := 2}\) и удаляется верхний элемент \(\texttt{stacks[2]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2],[3,1],[1,2]]\), а затем вызывается \(\texttt{get(stacks, 2)}\).
    • \(\texttt{stacks[2]}\) не пуст, присваивается \(\texttt{new_pos := 1}\) и удаляется верхний элемент \(\texttt{stacks[2]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2],[3],[1,2]]\), а затем вызывается \(\texttt{get(stacks, 1)}\).
    • \(\texttt{stacks[1]}\) не пуст, присваивается \(\texttt{new_pos := 2}\) и удаляется верхний элемент \(\texttt{stacks[1]}\), в результате чего \(\texttt{stacks}\) станет \([[1],[3],[1,2]]\), а затем вызывается \(\texttt{get(stacks, 2)}\).
    • \(\texttt{stacks[2]}\) не пуст, присваивается \(\texttt{new_pos := 3}\) и удаляется верхний элемент \(\texttt{stacks[2]}\), в результате чего \(\texttt{stacks}\) станет \([[1],[],[1,2]]\), а затем вызывается \(\texttt{get(stacks, 3)}\).
    • \(\texttt{stacks[3]}\) не пуст, присваивается \(\texttt{new_pos := 2}\) и удаляется верхний элемент \(\texttt{stacks[3]}\), в результате чего \(\texttt{stacks}\) станет \([[1],[],[1]]\), а затем вызывается \(\texttt{get(stacks, 2)}\).
    • \(\texttt{stacks[2]}\) пуст, возвращается \(2\).

E. Обменные деревья Дореми

графы Деревья поиск в глубину и подобное *3500

Рассмотрим два неориентированных графа \(G_1\) и \(G_2\). Каждая вершина в \(G_1\) и в \(G_2\) имеет номер. Дореми называет \(G_1\) и \(G_2\) подобными тогда и только тогда, когда:

  • Все номера в \(G_1\) различны, и все номера в \(G_2\) различны.
  • Множество \(S\) номеров в \(G_1\) совпадает с множеством номеров в \(G_2\).
  • Для каждой пары двух различных номеров \(u\) и \(v\) в \(S\) соответствующие вершины находятся в одной и той же компоненте связности в \(G_1\) тогда и только тогда, когда они находятся в одной и той же компоненте связности в \(G_2\).

Теперь Дореми дает вам два дерева \(T_1\) и \(T_2\) с \(n\) вершинами, пронумерованными от \(1\) до \(n\). Вы можете выполнить следующую операцию любое количество раз:

  • Выбрать множество ребер \(E_1\) из \(T_1\) и множество ребер \(E_2\) из \(T_2\), такие, что \(\overline{E_1}\) и \(\overline{E_2}\) подобны. Здесь \(\overline{E}\) представляет собой граф, который задается набором рёбер \(E\) из дерева \(T\) и концами этих рёбер (т.е. подграф, индуцированный ребрами). Иными словами, \(\overline{E}\) получается из \(T\) удалением всех рёбер, не входящих в \(E\), а также последующего удаления всех изолированных вершин.
  • Поменяйте местами множество ребер \(E_1\) в \(T_1\) с множеством ребер \(E_2\) в \(T_2\).

Теперь Дореми интересно, сколько различных \(T_1\) можно получить после любого количества операций. Можете ли вы помочь ей найти ответ? Выведите ответ по модулю \(10^9+7\).

Входные данные

Входные данные состоят из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1\le t\le 2\cdot 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка содержит целое число \(n\) (\(2\le n\le 10^5\)) — количество вершин в деревьях \(T_1\) и \(T_2\).

Каждая из следующих \(n-1\) строк содержит два целых числа \(u,v\) (\(1\le u,v\le n\)), представляющих собой неориентированное ребро в \(T_1\). Гарантируется, что эти ребра образуют дерево.

Каждая из следующих \(n-1\) строк содержит два целых числа \(u,v\) (\(1\le u,v\le n\)), представляющих собой ненаправленное ребро в \(T_2\). Гарантируется, что эти ребра образуют дерево.

Гарантируется, что сумма \(n\) не превышает \(2\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одну строку с целым числом, представляющим собой количество отличий \(T_1\) после любого количества операций по модулю \(10^9+7\).

Примечание

В первом наборе входных данных существует не более одного множества \(T_1\), имеющего единственное ребро \((1,2)\).

Во втором наборе входных данных можно выбрать множество ребер \(\{(1,3),(2,3)\}\) в \(T_1\), множество ребер \(\{(1,2),(2,3)\}\) в \(T_2\) и поменять их местами. Таким образом, \(T_1\) может быть \(1-3-2\) или \(1-2-3\).

В третьем наборе входных данных существует \(4\) различных \(T_1\), как показано на следующих рисунках.

F. Растущее дерево

Деревья поиск в глубину и подобное Структуры данных *2000

Дано корневое дерево с корнем в вершине \(1\), изначально состоящее из одной вершины. У каждой вершины есть числовое значение, изначально равное \(0\). Так же есть \(q\) запросов двух типов:

  • Первый тип запроса: добавить ребёнка с номером \(sz + 1\) к вершине \(v\), где \(sz\) — текущий размер дерева. Числовое значение новой вершины также равно \(0\).
  • Второй тип запроса: Прибавить \(x\) ко всем числовым значений вершин в поддереве вершины \(v\).

После всех запросов нужно для каждой вершины вывести его итоговое числовое значение.

Входные данные

В первой строке содержится единственное число \(T\) (\(1 \leq T \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(q\) (\(1 \leq q \leq 5 \cdot 10^5\)) — Изначальное количество запросов.

Далее следует \(q\) строк. Далее возможно два случая:

  • Первый тип запроса. В \(i\)-й строке дано два целых числа \(t_i\) (\(t_i = 1\)), \(v_i\). Нужно добавить ребёнка с номером \(sz + 1\) к вершине \(v_i\), где \(sz\) — текущий размер дерева. Гарантируется, что \(1 \leq v_i \leq sz\).
  • Второй тип запроса. В \(i\)-й строке дано три целых числа \(t_i\) (\(t_i = 2\)), \(v_i\), \(x_i\) (\(-10^9 \leq x_i \leq 10^9\)). Нужно прибавить \(x_i\) ко всем числовым значениям вершин в поддереве вершины \(v_i\). Гарантируется, что \(1 \leq v_i \leq sz\), где \(sz\) — текущий размер дерева.

Гарантируется что сумма \(q\) по всем тестовым наборам не превосходит \(5 \cdot 10^5\).

Выходные данные

После всех запросов выведите числовые значения каждой вершины конечного дерева.

Примечание

В первом примере итоговое дерево с числовыми значениями будет выглядеть так:

Итоговое дерево с числовыми значениями

A. Анонимный информатор

графы Перебор поиск в глубину и подобное реализация *1400

Вам дан массив \(b_1, b_2, \ldots, b_n\).

Некий анонимный информатор сообщил вам, что массив \(b\) был получен следующим образом: изначально существовал некоторый массив \(a_1, a_2, \ldots, a_n\), после чего \(k\) раз была произведена следующая двухкомпонентная операция:

  1. Была выбрана некоторая фиксированная точка\(^{\dagger}\) массива \(a\), пусть \(x\).
  2. После чего ровно \(x\) раз массив \(a\) был заменён на свой циклический сдвиг влево\(^{\ddagger}\).

И в результате \(k\) таких операций был получен массив \(b_1, b_2, \ldots, b_n\). Вы хотите проверить, могут ли слова анонимного информатора быть правдивы, или же он гарантированно лжёт.

\(^{\dagger}\)Число \(x\) называется фиксированной точкой массива \(a_1, a_2, \ldots, a_n\), если \(1 \leq x \leq n\) и \(a_x = x\).

\(^{\ddagger}\)Циклический сдвиг влево от массива \(a_1, a_2, \ldots, a_n\) это массив \(a_2, \ldots, a_n, a_1\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит целые числа \(n, k\) (\(1 \le n \le 2 \cdot 10^5\), \(1 \le k \le 10^9\)) — длину массива \(b\) и количество проведённых операций.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) (\(1 \le b_i \le 10^9\)) — элементы массива \(b\).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите «Yes», если слова анонимного информатора могут быть правдой, и «No», если он гарантированно лжёт.

Примечание

В первом наборе входных данных массив \(a\) мог быть равен \([3, 2, 3, 4, 3]\). В первой операции была выбрана фиксированная точка \(x = 2\), и после \(2\) сдвигов влево массив принял вид \([3, 4, 3, 3, 2]\). Во второй операции была выбрана фиксированная точка \(x = 3\), и после \(3\) сдвигов влево массив принял вид \([3, 2, 3, 4, 3]\). В третьей же операции была выбрана фиксированная точка \(x = 3\), и после \(3\) сдвигов влево массив принял вид \([4, 3, 3, 2, 3]\), чему и равняется массив \(b\).

Во втором наборе входных данных массив \(a\) мог быть равен \([7, 2, 1]\). После операции с фиксированной точкой \(x = 2\) массив принял вид \([1, 7, 2]\). Далее после операции с фиксированной точкой \(x = 1\) массив снова принял изначальный вид \([7, 2, 1]\). Далее эти же \(2\) операции (с \(x = 2\) и \(x = 1\)) были повторены \(49\) раз. И итого после \(100\) операций массив снова принял вид \([7, 2, 1]\).

В третьем наборе входных данных нетрудно показать, что ответа нет.

E. Симфония кактусов

графы дп Комбинаторика поиск в глубину и подобное *3500

Вам дан связный неориентированный граф, в котором любые два различных простых цикла не имеют общих вершин. Так как граф может быть очень большим, он дан вам в сжатом виде: для каждого ребра вам также дано некое число \(d\), обозначающее, что на этом ребре дополнительно находится \(d\) вершин.

Требуется назначить каждой вершине и каждому ребру графа вес — целое число от \(1\) до \(3\).

Ребро графа назовём хорошим, если побитовый XOR весов смежных ему вершин не равен \(0\) и не равен весу этого ребра.

Аналогично вершину графа назовём хорошей, если побитовый XOR весов смежных ей рёбер не равен \(0\) и не равен весу этой вершины.

Вам нужно определить, сколько существует способов назначить веса вершинам и рёбрам графа, чтобы все вершины и все рёбра были хорошими. Так как ответ может быть достаточно большим, нужно вычислить остаток от деления ответа на \(998\,244\,353\).

Входные данные

Первая строка содержит два целых числа \(n\) и \(m\) — количество вершин и количество рёбер в графе (\(2 \le n \le 5 \cdot 10^5\), \(n - 1 \le m \le 10^6\)).

Каждая из следующих \(m\) строк содержит три целых числа \(a_i, b_i\) и \(d_i\) (\(1 \le a_i, b_i \le n\), \(a_i \ne b_i\), \(0 \le d_i \le 10^9\)), означающих, что в графе существует ребро, соединяющее вершины \(a_i\) и \(b_i\). Также, на этом ребре, дополнительно находятся \(d_i\) вершин. Гарантируется, что заданный граф является связным, в нем нет кратных рёбер, петель, а также любые два различных простых цикла графа не имеют общих вершин.

Выходные данные

Выведите единственное целое число — ответ на задачу по модулю \(998\,244\,353\).

Примечание

В первом тесте граф имеет вид простого цикла из \(3\) вершин. Можно показать, что есть ровно \(12\) способов назначить веса вершинам и рёбрам, чтобы все они были хорошими.

Во втором тесте граф имеет вид двух простых циклов из \(3\) вершин, соединённых ребром. Можно показать, что для такого графа нет ни одного способа расставить веса, чтобы все вершины и рёбра были хорошими.

E. Бесконечная карточная игра

Бинарный поиск графы дп жадные алгоритмы игры Перебор поиск в глубину и подобное снм сортировки Структуры данных *2300

Монокарп и Бикарп играют в карточную игру. Каждая карта имеет два параметра: значение атаки и значение защиты. Карта \(s\) бьет карту \(t\), если значение атаки карты \(s\) строго больше значения защиты карты \(t\).

У Монокарпа есть \(n\) карт, \(i\)-я из которых имеет значение атаки \(\mathit{ax}_i\) и значение защиты \(\mathit{ay}_i\). У Бикарпа есть \(m\) карт, \(j\)-я из которых имеет значение атаки \(\mathit{bx}_j\) и значение защиты \(\mathit{by}_j\).

На первом ходе Монокарп выбирает одну из своих карт и кладет ее на стол. Бикарп должен побить эту карту своей картой. Затем Монокарп должен побить карту Бикарпа. Затем ход переходит к Бикарпу, и так далее.

После того, как карта побита, она возвращается в руку игрока, который ее сыграл. Это подразумевает, что у игрока, который сейчас ходит, всегда на руках те же карты, что и в начале игры. Игра заканчивается, когда у текущего игрока нет карт, которые побеждают карту, которую только что сыграл его оппонент, и текущий игрок проигрывает.

Если игра длится \(100^{500}\) ходов, объявляется ничья.

И Монокарп, и Бикарп играют оптимально. То есть, если у игрока есть выигрышная стратегия независимо от ходов его оппонента, он играет на победу. В противном случае, если у него есть стратегия для ничьи, он играет на ничью.

Вам нужно вычислить три значения:

  • количество начальных ходов Монокарпа, которые приводят к победе Монокарпа;
  • количество начальных ходов Монокарпа, которые приводят к ничьей;
  • количество начальных ходов Монокарпа, которые приводят к победе Бикарпа.
Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит целое число \(n\) (\(1 \le n \le 3 \cdot 10^5\)) — количество карт у Монокарпа.

Вторая строка содержит \(n\) целых чисел \(\mathit{ax}_1, \mathit{ax}_2, \dots, \mathit{ax}_n\) (\(1 \le \mathit{ax}_i \le 10^6\)) — значения атаки карт Монокарпа.

Третья строка содержит \(n\) целых чисел \(\mathit{ay}_1, \mathit{ay}_2, \dots, \mathit{ay}_n\) (\(1 \le \mathit{ay}_i \le 10^6\)) — значения защиты карт Монокарпа.

Четвертая строка содержит одно целое число \(m\) (\(1 \le m \le 3 \cdot 10^5\)) — количество карт у Бикарпа.

Пятая строка содержит \(m\) целых чисел \(\mathit{bx}_1, \mathit{bx}_2, \dots, \mathit{bx}_m\) (\(1 \le \mathit{bx}_j \le 10^6\)) — значения атаки карт Бикарпа.

Шестая строка содержит \(m\) целых чисел \(\mathit{by}_1, \mathit{by}_2, \dots, \mathit{by}_m\) (\(1 \le \mathit{by}_j \le 10^6\)) — значения защиты карт Бикарпа.

Дополнительные ограничения на входные данные: сумма \(n\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\), сумма \(m\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите три целых числа:

  • количество начальных ходов Монокарпа, которые приводят к победе Монокарпа;
  • количество начальных ходов Монокарпа, которые приводят к ничьей;
  • количество начальных ходов Монокарпа, которые приводят к победе Бикарпа.

F. Вова и побег из матрицы

кратчайшие пути Перебор поиск в глубину и подобное разделяй и властвуй *2600

Вова находится в матрице \(n \times m\). Строки этой матрицы пронумерованы числами от \(1\) до \(n\) сверху вниз, а столбцы пронумерованы числами от \(1\) до \(m\) слева направо. Клетка \((i, j)\) — это клетка на пересечении строки \(i\) и столбца \(j\) для \(1 \leq i \leq n\) и \(1 \leq j \leq m\).

Часть клеток матрицы заблокирована препятствиями (все остальные клетки свободны). Вова находится в одной из свободных клеток. Гарантируется, что клетки \((1, 1)\), \((1, m)\), \((n, 1)\), \((n, m)\) (то есть углы матрицы) заблокированы.

Вова может перейти из одной свободной клетки в другую свободную клетку, если у них есть общая сторона. Вова может выйти из матрицы из любой свободной клетки на границе матрицы, такие клетки называются выходами.

Тип матрицы зависит от количества выходов, которые Вова может использовать, чтобы выйти из матрицы. Существуют матрицы трёх типов:

  • \(1\)-го типа: матрицы без выходов, которые Вова может использовать.
  • \(2\)-го типа: матрицы ровно с одним выходом, который Вова может использовать, чтобы покинуть матрицу.
  • \(3\)-го типа: матрицы с несколькими (двумя или более) выходами, которые Вова может использовать, чтобы покинуть матрицу.

До того как Вова начнёт перемещаться, Миша может создать больше препятствий и заблокировать часть свободных клеток. При этом Миша не может менять тип матрицы. Какое максимальное количество клеток может заблокировать Миша, не изменяя тип матрицы? Миша не может заблокировать клетку, в которой сейчас находится Вова.

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \leq t \leq 10\,000\)) — количество наборов входных данных. Далее следуют описания этих наборов.

В первой строке дано два целых числа \(n\) и \(m\) (\(3 \leq n,m \leq 1000\)) — размеры матрицы.

В следующих \(n\) строках дано описание матрицы: в \(i\)-й (\(1 \le i \le n\)) из них дана строка длины \(m\), состоящая из символов «.», «#» и «V». \(j\)-й символ \(i\)-й строки описывает клетку \((i, j)\) матрицы. Точкой «.» обозначена свободная клетка, решёткой «#» обозначена заблокированная клетка, буквой «V» обозначена свободная клетка, в которой находится Вова.

Гарантируется, что углы матрицы заблокированы (первый и последний символы первой и последней строк описания матрицы равны «#»). Гарантируется, что символ «V» встречается в матрице ровно один раз.

Гарантируется, что сумма \(n \cdot m\) по всем наборам входных данных не превосходит \(1\,000\,000\).

Выходные данные

Для каждого набора входных данных выведите одно число: максимальное количество клеток, которые может заблокировать Миша.

Примечание

В первом наборе входных данных дана матрица \(3\)-го типа. Миша может заблокировать все клетки, кроме клеток \((1, 3)\), \((2, 3)\), \((2, 4)\). Существует \(9\) таких клеток и их блокировка не меняет тип матрицы.

Во втором наборе входных данных дана матрица \(3\)-го типа. Блокировка любой клетки меняет тип матрицы на \(2\)-й: один из двух выходов становится недостижимым для Вовы. Поэтому, ответ \(0\).

В третьем наборе входных данных дана матрица \(1\)-го типа. В ней нет свободных клеток (кроме клетки Вовы), поэтому Миша не может заблокировать ни одну клетку.

В четвёртом наборе входных данных дана матрица \(2\)-го типа. Миша может заблокировать \(3\) клетки \((5, 2)\), \((6, 3)\), \((6, 4)\), не изменяя тип матрицы.

В пятом наборе входных данных дана матрица \(3\)-го типа. Миша может заблокировать \(4\) клетки \((2, 2)\), \((3, 2)\), \((4, 2)\), \((5, 2)\) либо \(4\) клетки \((2, 4)\), \((3, 4)\), \((4, 4)\), \((5, 4)\), не изменяя тип матрицы.

G. Необычное развлечение

Деревья кратчайшие пути поиск в глубину и подобное снм сортировки Структуры данных *1900

Дерево — связный граф без циклов.

Перестановка — массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([5, 1, 3, 2, 4]\) является перестановкой, но \([2, 1, 1]\) не является перестановкой (\(1\) встречается в массиве дважды) и \([1, 3, 2, 5]\) тоже не является перестановкой (\(n = 4\), но в массиве присутствует \(5\)).

После неудачной съёмки в ролике BrMeast у Лёши началась депрессия. Даже день рождения не радовал его. Однако после подарка Тимофея настроение Лёши резко поднялось. Теперь он днями напролёт игрался с подаренным конструктором. Недавно он придумал себе необычное развлечение.

Лёша строит из своего конструктора дерево, состоящее из \(n\) вершин, пронумерованных от \(1\) до \(n\), с корнем в вершине \(1\). Затем он в произвольном порядке выписывает каждое число от \(1\) до \(n\) ровно по одному разу и получает перестановку \(p\). После этого Лёша придумывает \(q\) троек чисел \(l, r, x\). Для каждой тройки он пытается понять, есть ли среди вершин с номерами \(p_l, p_{l+1}, \ldots, p_r\) хотя бы один потомок вершины \(x\).

Вершина \(u\) является потомком вершины \(v\) тогда и только тогда, когда \(\mathrm{dist}(1, v) + \mathrm{dist}(v, u) = \mathrm{dist}(1, u)\), где \(\mathrm{dist}(a, b)\) — расстояние между вершинами \(a\) и \(b\). Иначе говоря, вершина \(v\) должна находиться на пути от корня до вершины \(u\).

Лёша рассказал об этом развлечении Захару. Теперь Лёша говорит своему другу \(q\) троек, описанных выше, надеясь, что Захар сможет проверить наличие потомка. Захар очень сильно хочет спать, поэтому обратился за помощью к вам. Помогите Захару ответить на все вопросы Лёши и наконец-то пойти спать.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных дано два целых числа \(n, q\) (\(1 \le n, q \le 10^5\)) — количество вершин в дереве и количество вопросов, соответственно.

Каждая из следующих \(n - 1\) строк содержит числа \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\)), которые обозначают, что существует ребро между вершинами \(u_i\) и \(v_i\) (гарантируется, что полученный граф является деревом).

В следующей строке даны \(n\) целых чисел \(p_1, p_2, \dots, p_n\) (\(1 \le p_i \le n\)) — перестановка \(p\) (гарантируется, что каждое число от \(1\) до \(n\) встречается ровно один раз).

Далее следуют \(q\) строк, описывающие вопросы Лёши. В \(i\)-й строке написаны числа \(l, r, x\) (\(1 \le l \le r \le n\), \(1 \le x \le n\)), описанные в условии.

Гарантируется, что сумма \(n\) и сумма \(q\) по всем наборам входных данных не превышают \(10^5\).

Выходные данные

Для каждого вопроса Лёши выведите «Yes» (без кавычек), если описанный в условии потомок существует, иначе выведите «No» (без кавычек).

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

E. Фея

поиск в глубину и подобное разделяй и властвуй снм *2900

В давние-давние времена жила добрая фея А. Однажды пришел к ней добрый молодец Б и попросил предсказать ему будущее. Посмотрев в магический шар, А сказала, что скоро молодец встретит самую красивую принцессу на свете и женится на ней. Затем она нарисовала на бумаге n точек и соединила некоторые из них отрезками, каждый из которых начинается в некоторой точке и заканчивается в некоторой другой точке. Нарисовав этот рисунок, она попросила молодца стереть с бумаги ровно один отрезок. Затем она попытается окрасить каждую точку в красный или синий цвет так, чтобы не существовало отрезка, оба конца которого окрашены в одинаковый цвет. Если у нее получится это сделать, то гадание сбудется. Б очень хочет, чтобы это случилось, и поэтому он просит Вас помочь ему. Найдите все отрезки, которые помогут ему встретить принцессу.

Входные данные

В первой строке входных данных заданы два целых числа: n — количество нарисованных точек и m — количество нарисованных отрезков (1 ≤ n ≤ 104, 0 ≤ m ≤ 104). Далее в m строках даны описания отрезков. Каждое описание представляет собой два целых различных числа v, u (1 ≤ v ≤ n, 1 ≤ u ≤ n) — номера точек, которые соединяет данный отрезок, записанные через один пробел. Никакой отрезок не встречается в описании дважды.

Выходные данные

В первую строку ответа выведите число k — количество отрезков в ответе. Во второй строке выведите k чисел, разделенные одним пробелом — номера этих отрезков в возрастающем порядке. Каждый номер нужно выводить ровно один раз. Отрезки нумеруются с 1 в том порядке, в котором они заданы во входных данных.

C. STL

поиск в глубину и подобное *1500

До войны Вася был бухгалтером, он один из немногих, кто умеет пользоваться компьютером, и поэтому программистом назначили именно его.

Все мы знаем, что в программах часто приходится хранить наборы целых чисел. Например, ребро в задаче про взвешенный ориентированный граф может характеризоваться тремя числами: номер вершины-начала, номер вершины-конца и вес ребра. Вот и Вася столкнулся с такой проблемой, пытаясь представить в своей программе характеристки недавно разработанного робота.

Вася — не программист, поэтому он спросил у своего друга Гены, как удобнее хранить n целых чисел. Раньше Гена писал на языке X-- и поэтому умеет пользоваться только типами из этого языка. Определим понятие типа в языке X--:

  • Во-первых, типом является строка «int».
  • Во-вторых, типом является строка начинающаяся с «pair», после которой в треугольных скобках через запятую указаны ровно два других типа языка X--. В этой записи нет пробелов.
  • Никакие другие строки типом не являются.

Более формально: type := int | pair<type,type>. Например, для ребер графа Гена использует тип pair<int,pair<int,int>>.

Гена с радостью помог Васе, он продиктовал ему тип языка X--, который хранит n целых чисел. К сожалению, Гена торопился и не произносил знаков препинания. Теперь Гена уже ушел, а Вася все никак не может расставить знаки препинания, чтобы получить тип языка X--.

Помогите Васе, расставьте знаки препинания так, чтобы получился корректный тип языка X--, или сообщите, что сделать это невозможно.

Входные данные

В первой строке записано единственное целое число n (1 ≤ n ≤ 105) — количество чисел, которое хранит тип продиктованный Геной.

Во второй строке через пробел записаны слова, сказанные Геной. Каждое из них — «pair» или «int» (без кавычек).

Гарантируется, что общее количество слов не превосходит 105 и что среди произнесенных слов будет ровно n слов «int».

Выходные данные

Если можно расставить знаки препинания так, чтобы получился корректный тип языка X--, выведите единственную строку обозначающую полученный тип. Иначе выведите «Error occurred» (без кавычек). Запись типа не должна содержать внутри себя лишних пробелов и других символов.

Гарантируется, что если такой тип существует, то он единственен.

Обратите внимание, что нужно вывести тип, произнесенный Геной (если такой существует), а не любой, в котором помещается n значений.

C. Аньи и двоичное дерево

Деревья дп поиск в глубину и подобное *1300

Аньи продолжает игнорировать сообщения Кексика. Через общего друга Кексик выяснил, что Аньи очень любит бинарные деревья, и захотел решить ее задачу, чтобы привлечь ее внимание.

Аньи задала Кексику двоичное дерево с \(n\) вершинами. Вершина \(1\) является корнем и не имеет родителя. Все остальные вершины имеют ровно одного родителя. Каждая вершина может иметь до \(2\) детей — левого и правого. Для каждой вершины Аньи сообщает Кексику индекс ее левого и правого ребенка или говорит, что их не существует.

Кроме того, на каждой из вершин написана буква \(s_i\), которая является либо «U», либо «L», либо «R».

Кексик начинает свой путь с корня и на каждом ходу делает следующее:

  • Если он находится в вершине, на которой написана буква «U», то он переходит к ее родителю. Если он не существует, то Кексик ничего не делает.
  • Если он находится в вершине, на которой написана буква «L», то он переходит к ее левому ребенку. Если его не существует, то он ничего не делает.
  • Если он находится в вершине, на которой написана буква «R», то он переходит к ее правому ребенку. Если его не существует, то он ничего не делает.

Перед тем, как отправиться в путь, он может выполнять следующие операции: выбрать любую вершину и заменить написанную на ней букву на другую.

Вас интересует минимальное количество операций, которые он должен выполнить перед путешествием, чтобы, начав путешествие, он в какой-то момент оказался в листе. Лист — это вершина, у которой нет детей. Не имеет значения, какого листа он достигнет. Заметим, что не имеет значения, останется ли он в листе — ему нужно только переместиться в лист. Кроме того, неважно, сколько раз он должен переместиться, прежде чем достигнет листа.

Помогите Кексику решить задачу Аньи, чтобы он смог завоевать ее сердце, и Анья приехала в Чачак.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 5 \cdot 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 3 \cdot 10^5\)) — количество вершин в дереве.

Вторая строка каждого набора входных данных содержит строку \(s\) длины \(n\) — буквы, написанные на вершинах. Гарантируется, что \(s\) состоит только из букв «U», «L» и «R».

В \(i\)-й из следующих \(n\) строк содержатся два целых числа \(l_i\) и \(r_i\) (\(0 \le l_i, r_i \le n\)) — индексы левого и правого детей вершины \(i\). Если \(l_i = 0\), то это означает, что вершина \(i\) не имеет левого ребенка. Если \(r_i = 0\), то вершина \(i\) не имеет правого ребенка. Гарантируется, что данные значения задают корректное бинарное дерево с корнем в \(1\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество операций, которое необходимо выполнить Кексику, чтобы он смог достичь листа.

Примечание

В первом наборе входных данных вершина \(1\) имеет левого ребенка \(2\) и правого — \(3\). Вершины \(2\) и \(3\) не имеют детей и поэтому являются листьями. Поскольку в вершине \(1\) написана буква «L», то Кексик перейдет в вершину \(2\), поэтому ему не нужно выполнять никаких операций.

Во втором наборе входных данных вершина \(1\) имеет левого ребенка \(3\) и правого — \(2\). Вершины \(2\) и \(3\) являются листьями. Поскольку в вершине \(1\) написана буква «U», то для того, чтобы добраться до листа, Кексику необходимо изменить эту букву на «L» или «R».

В третьем наборе вершина \(1\) имеет только правого ребенка, которым является вершина \(2\). Поскольку на корневой вершине написана буква «L», Кексик должен изменить букву на «R», иначе он застрянет в вершине \(1\).

В четвертом наборе он может изменить \(3\) буквы так, чтобы буквы на вершинах были «LURL», что позволит ему достичь вершины \(2\).

В пятом наборе имеется \(3\) листа: \(3\), \(6\) и \(7\). Чтобы добраться до листа \(6\) или листа \(7\), ему нужно поменять \(2\) буквы. Однако, если он поменяет букву на вершине \(1\) на «R», то достигнет листа \(3\), поэтому ответ — \(1\).

Изначальное дерево в пятом наборе входных данных.

E. Транзитивный граф

графы дп поиск в глубину и подобное реализация снм *2100

Дан ориентированный граф \(G\) с \(n\) вершинами и \(m\) ребрами.

Изначально граф \(H\) совпадает с графом \(G\). Затем вы решили выполнить следующие действия:

  • Если в графе \(H\) существует тройка вершин \(a\), \(b\), \(c\) такая, что есть ребро из \(a\) в \(b\) и ребро из \(b\) в \(c\), но нет ребра из \(a\) в \(c\), то добавить ребро из \(a\) в \(c\).
  • Повторять предыдущий шаг до тех пор, пока существуют такие тройки.

Заметим, что после выполнения этих действий количество ребер в \(H\) может достигать \(n^2\).

Вы также записали некоторые значения на вершинах графа \(H\): на вершине \(i\) записано значение \(a_i\).

Рассмотрим простой путь, состоящий из \(k\) различных вершин с номерами \(v_1, v_2, \ldots, v_k\). Длина такого пути равняется \(k\). Значение этого пути определим как \(\sum_{i = 1}^k a_{v_i}\).

Простой путь считается самым длинным, если в графе нет другого простого пути с большей длиной.

Среди всех самых длинных простых путей в \(H\) найдите тот, который имеет наименьшее значение.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1 \le n,m \le 2 \cdot 10^5\)) — количество вершин и количество ребер.

Вторая строка каждого набора содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le 10^9\)) — числа, записанные на вершинах графа \(H\).

В \(i\)-й из следующих \(m\) строк записаны два целых числа \(v_i\) и \(u_i\) (\(1 \le v_i, u_i \le n\)) — в графе \(G\) есть ребро, идущее от вершины \(v_i\) к вершине \(u_i\). Заметим, что ребра являются ориентированными. Также заметим, что в графе могут быть петли и кратные рёбра.

Гарантируется, сумма \(n\) и сумма \(m\) по всем наборам входных данных не превышают \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите два числа — длину самого длинного простого пути в \(H\) и минимально возможное значение такого пути.

Примечание

В первом наборе входных данных самый длинный путь в обоих графах равен \(1 \to 3 \to 4 \to 5 \to 2\). Поскольку путь включает все вершины, то минимально возможное значение самого длинного пути равно сумме значений по всем вершинам, которое равняется \(12\).

Во втором наборе входных данных самый длинный путь равен \(1 \to 2 \to 3 \to 4 \to 6 \to 7\). Поскольку самых длинных путей с вершиной \(5\) не существует, то такой путь имеет минимально возможное значение \(5\,999\,999\,995\).

В третьем наборе входных данных можно доказать, что не существует пути длиннее \(11\) и что значение самого длинного пути не может быть меньше \(37\). Также заметим, что данный граф содержит петли и кратные ребра.

E. Сжатие дерева

графы Деревья дп жадные алгоритмы поиск в глубину и подобное сортировки *2200

Вам дано дерево, состоящее из \(n\) вершин. На каждой вершине записано число; число на вершине \(i\) равно \(a_i\).

Вы можете выполнить следующую операцию любое количество раз (возможно, ноль):

  • выбрать вершину, имеющую не более \(1\) инцидентного ребра, и удалить ее из дерева.

Обратите внимание, что вы можете удалить все вершины.

После выполнения всех операций происходит сжатие дерева. Процесс сжатия выполняется следующим образом. Пока в дереве есть вершина, имеющая ровно \(2\) инцидентных ребра, выполняется следующую операцию:

  • удалить эту вершину, а ее соседей соединить ребром.

Можно показать, что если существует несколько способов выбрать вершину для удаления в процессе сжатия, итоговое дерево остается тем же самым.

Ваша задача — вычислить максимально возможную сумму чисел, записанных на вершинах, после применения вышеописанной операции любое количество раз, а затем сжатия дерева.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(2 \le n \le 5 \cdot 10^5\)) — количество вершин.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(-10^9 \le a_i \le 10^9\)).

Каждая из следующих \(n - 1\) строк описывает ребра дерева. Ребро \(i\) описывается двумя целыми числами \(v_i\) и \(u_i\), номерами вершин, которые оно соединяет (\(1 \le v_i, u_i \le n\), \(v_i \ne u_i\)). Данные ребра образуют дерево.

Дополнительное ограничение на входные данные: сумма \(n\) по всем наборам входных данных не превосходит \(5 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных, выведите одно целое число — максимально возможную сумму чисел, записанных на вершинах, после применения вышеописанной операции любое количество раз, а затем сжатия дерева.

F. Снова деревья и XOR-запросы

графы Деревья математика поиск в глубину и подобное разделяй и властвуй реализация Структуры данных *2400

Вам дано дерево, состоящее из \(n\) вершин. На каждой вершине написано целое число; на \(i\)-й вершине написано число \(a_i\).

Вам необходимо обработать \(q\) запросов. \(i\)-й запрос состоит из трех целых чисел \(x_i\), \(y_i\) и \(k_i\). Для этого запроса вы должны ответить, возможно ли выбрать набор вершин \(v_1, v_2, \dots, v_m\) (возможно, пустой) так, чтобы:

  • каждая вершина \(v_j\) находилась на простом пути между \(x_i\) и \(y_i\) (в том числе можно использовать концы пути);
  • \(a_{v_1} \oplus a_{v_2} \oplus \dots \oplus a_{v_m} = k_i\), где \(\oplus\) обозначает оператор побитового исключающего ИЛИ.
Входные данные

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 2^{20} - 1\)).

Затем следуют \(n-1\) строк. Каждая из них содержит два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\); \(u \ne v\)), обозначающие ребро дерева.

Следующая строка содержит одно целое число \(q\) (\(1 \le q \le 2 \cdot 10^5\)) — количество запросов.

Затем следуют \(q\) строк. В \(i\)-й из них содержатся три целых числа \(x_i\), \(y_i\) и \(k_i\) (\(1 \le x_i, y_i \le n\); \(0 \le k_i \le 2^{20} - 1\)).

Выходные данные

Для каждого запроса выведите YES, если возможно сформировать набор вершин, удовлетворяющий ограничениям. В противном случае выведите NO.

Каждую букву можно выводить в любом регистре.

E. Запросы на дереве

графы Деревья поиск в глубину и подобное реализация Структуры данных *2500

Кто не работает, тот не ест. Получи то, что ты хочешь своими силами. Поверь, искренние и серьёзные люди всегда смеются последними. Но я всё равно не дам тебе подарка.
—Санта, Hayate no Gotoku!

Поскольку Хаяте не получил никаких рождественских подарков от Санты, его вместо этого ожидает решение задачи на запросы на дереве.

У Хаяте есть дерево с \(n\) вершинами.

Теперь Хаяте хочет, чтобы вы ответили на \(q\) запросов. Каждый запрос состоит из вершины \(x\) и \(k\) других дополнительных вершин \(a_1,a_2,\ldots,a_k\). Эти \(k+1\) вершина гарантированно различны.

Для каждого запроса необходимо найти длину самого длинного простого пути, начинающегося в вершине \(x^\dagger\) после удаления вершин \(a_1,a_2,\ldots,a_k\) вместе со всеми ребрами, соединенными хотя бы с одной из вершин \(a_1,a_2,\ldots,a_k\).

\(^\dagger\) Простой путь длины \(k\), начинающийся в вершине \(x\) — это последовательность различных вершин \(x=u_0,u_1,\ldots,u_k\) таких, что существует ребро между вершинами \(u_{i-1}\) и \(u_i\) для всех \(1 \leq i \leq k\).

Входные данные

Первая строка содержит два целых числа \(n\) и \(q\) (\(1 \le n, q \le 2 \cdot 10^5\)) — количество вершин дерева и количество запросов.

Следующие \(n - 1\) строк содержат по два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \ne v\)) — в дереве есть ребро между вершинами \(u\) и \(v\). Гарантируется, что заданные ребра образуют дерево.

Следующие \(q\) строк описывают запросы. Каждая строка содержит целые числа \(x\), \(k\) и \(a_1,a_2,\ldots,a_k\) (\(1 \leq x \leq n\), \(0 \leq k < n\), \(1 \leq a_i \leq n\)) — начальная вершина, количество удаленных вершин и удаленные вершины.

Гарантируется, что в запросе все вершины \(x,a_1,a_2,\ldots,a_k\) различны.

Гарантируется, что сумма \(k\) по всем запросам не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого запроса выведите одно целое число, являющееся ответом на этот запрос.

Примечание

В первом примере дерево выглядит следующим образом:

В первом запросе ни одна вершина не пропущена. Самый длинный простой путь, начинающийся в вершине \(2\), это \(2 \to 1 \to 3 \to 4\). Таким образом, ответ — \(3\).

Во третьем запросе отсутствуют вершины \(1\) и \(6\), и дерево показано ниже. Самый длинный простой путь из вершины \(2\) — это \(2 \to 5\). Таким образом, ответ — \(1\).

F. Прекрасное дерево

графы Деревья поиск в глубину и подобное реализация Структуры данных *2800

У Ланчбокса есть дерево размера \(n\) с корнем в вершине \(1\). Каждой вершине присваивается значение. Ланчбокс считает дерево прекрасным, если каждое значение является уникальным и находится в диапазоне от \(1\) до \(n\). Кроме того, прекрасное дерево должно удовлетворять \(m\) требованиям \(2\) типов:

  • «1 a b c» — Вершина с наименьшим значением на пути между вершинами \(a\) и \(b\) должна быть \(c\).
  • «2 a b c» — Вершина с наибольшим значением на пути между вершинами \(a\) и \(b\) должна быть \(c\).

Теперь вы должны присвоить значения каждой вершине так, чтобы получившееся дерево было прекрасным. Если это невозможно, выведите \(-1\).

Входные данные

Первая строка содержит два целых числа \(n\) и \(m\) (\(2 \le n, m \le 2 \cdot 10^5\)).

Следующие \(n - 1\) строк содержат по два целых числа \(u\) и \(v\) (\(1 \le u, v \le n, u \ne v\)) — в дереве есть ребро между вершинами \(u\) и \(v\). Гарантируется, что заданные ребра образуют дерево.

Следующие \(m\) строк содержат по четыре целых числа \(t\), \(a\), \(b\) и \(c\) (\(t \in \{1,2\}\), \(1 \le a, b, c \le n\)). Гарантируется, что вершина \(c\) находится на пути между вершинами \(a\) и \(b\).

Выходные данные

Если невозможно присвоить значения так, чтобы дерево было прекрасным, выведите \(-1\). В противном случае выведите \(n\) целых чисел, \(i\)-е из которых обозначает значение вершины \(i\).

E. One-X

Деревья дп Комбинаторика математика поиск в глубину и подобное *2400

В этом грустном мире, полном недостатков, существуют уродливые деревья отрезков.

Дерево отрезков — это дерево, где каждая вершина соответствует некоторому отрезку и имеет свой номер. Дерево отрезков для массива из \(n\) элементов можно построить рекурсивно. Пусть функция \(\operatorname{build}(v,l,r)\) строит дерево отрезков, корневая вершина которого имеет номер \(v\) и соответствует отрезку \([l,r]\).

Теперь давайте определим \(\operatorname{build}(v,l,r)\):

  • Если \(l=r\), то вершина \(v\) является листом, поэтому мы прекращаем добавление новых рёбер;
  • Иначе, мы добавляем рёбра \((v, 2v)\) и \((v, 2v+1)\). Пусть \(m=\lfloor \frac{l+r}{2} \rfloor\). Затем мы вызываем \(\operatorname{build}(2v,l,m)\) и \(\operatorname{build}(2v+1,m+1,r)\).

Таким образом, всё дерево строится путём вызова \(\operatorname{build}(1,1,n)\).

Теперь Ибти построит дерево отрезков для массива из \(n\) элементов. Он хочет найти сумму всех \(\operatorname{lca}^\dagger(S)\), где \(S\) — непустое подмножество листьев. Обратите внимание, что существует ровно \(2^n - 1\) возможных подмножеств. Поскольку эта сумма может быть очень большой, выведите её по модулю \(998\,244\,353\).

\(^\dagger\operatorname{lca}(S)\) — номер наименьшего общего предка для вершин, находящихся в \(S\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 10^{18}\)) — длина массива, для которого строится дерево отрезков.

Выходные данные

Для каждого набора входных данных выведите одно целое число — требуемую сумму по модулю \(998\,244\,353\).

Примечание

В первом наборе входных данных:

Давайте рассмотрим все подмножества листьев.

  • \(\operatorname{lca}(\{2\})=2\);
  • \(\operatorname{lca}(\{3\})=3\);
  • \(\operatorname{lca}(\{2,3\})=1\).

Таким образом, ответ равен \(2+3+1=6\).

Во втором наборе входных данных:

Давайте рассмотрим все подмножества листьев.

  • \(\operatorname{lca}(\{4\})=4\);
  • \(\operatorname{lca}(\{5\})=5\);
  • \(\operatorname{lca}(\{3\})=3\);
  • \(\operatorname{lca}(\{4,5\})=2\);
  • \(\operatorname{lca}(\{4,3\})=1\);
  • \(\operatorname{lca}(\{5,3\})=1\);
  • \(\operatorname{lca}(\{4,5,3\})=1\);

Таким образом, ответ равен \(4+5+3+2+1+1+1=17\).

G. Освещение

графы жадные алгоритмы Конструктив Перебор поиск в глубину и подобное реализация *2200

В конце дня Анне нужно выключить свет в офисе. Есть \(n\) ламп и \(n\) выключателей, но схема их работы довольно странная. Выключатель \(i\) меняет состояние лампы \(i\), но также меняет состояние другой лампы \(a_i\) (изменение состояния означает, что если лампа была включена, она выключается, и наоборот).

Помогите Анне выключить все лампы, используя минимальное количество выключателей, или скажите, что это невозможно.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют описания наборов.

Первая строка каждого набора содержит целое число \(n\) (\(2 \le n \le 10^5\)) — количество ламп.

Вторая строка каждого набора содержит строку из \(n\) символов — начальное состояние ламп. Символ «0» означает, что соответствующая лампа выключена, а «1» означает, что она включена.

Третья строка каждого набора содержит \(n\) целых чисел \(a_i\) (\(1 \le a_i \le n\), \(a_i \neq i\)) — выключатель \(i\) меняет состояние лампы \(i\) и лампы \(a_i\).

Гарантируется, что сумма \(n\) по всем наборам не превышает \(2 \cdot 10^5\)

Выходные данные

Для каждого набора входных данных выведите целое число \(k\) — минимальное количество выключателей, которое нужно использовать, затем в отдельной строке выведите список из \(k\) выключателей.

Если невозможно выключить все лампы, выведите одно целое число \(-1\).

C. Дураки и дороги

Деревья поиск в глубину и подобное Структуры данных *1900

Как известно, в Берляндии ровно две проблемы — дураки и дороги. Кроме того, в Берляндии есть n городов, в которых эти дураки живут, а дороги, соответственно, эти города соединяют. Все берляндские дороги двунаправленные. Так как в Берляндии дураков много, то для каждой пары городов есть путь между ними (иначе дураки расстроятся), а также между каждой парой городов есть не более одного простого пути (иначе дураки заблудятся).

Но это еще не все особенности Берляндии. В этой стране дураки иногда ходят друг к другу в гости, и от этого дороги портятся. Дураки не очень умны, поэтому всегда ходят только по простым путям.

Простой путь — это путь, который проходит через каждый город Берляндии не более одного раза.

Правительству Берляндии известны пути, по которым ходят дураки. Помогите правительству для каждой дороги посчитать, сколько различных дураков может по ней проходить.

Обратите внимание на то, как заданы пути дураков во входных данных.

Входные данные

В первой строке записано единственное целое число n (2 ≤ n ≤ 105) — количество городов.

В следующих n - 1 строках записаны по два целых числа через пробел ui, vi (1 ≤ ui, vi ≤ n, ui ≠ vi), означающих, что есть дорога, соединяющая города ui и vi.

В следующей строке записано целое число k (0 ≤ k ≤ 105) — количество пар дураков, которые ходят друг к другу в гости.

В следующих k строках заданы по два целых числа через пробел. В i-й строке (i > 0) записаны числа ai, bi (1 ≤ ai, bi ≤ n). Это означает, что дурак под номером 2i - 1 живет в городе ai и ходит в гости к дураку под номером 2i, который живет в городе bi. Заданные пары городов описывают простые пути, так как между любой парой городов существует ровно один простой путь.

Выходные данные

Выведите n - 1 целое число. Числа должны быть разделены пробелами. i-e число должно быть равно количеству дураков, которые могут проходить по i-той дороге. Дороги нумеруются с единицы в порядке их следования во входных данных.

Примечание

В первом примере дурак номер 1 пройдет через первую и третью дорогу, а дурак номер 3 — через вторую, первую и четвертую.

Во втором примере через первую дорогу пройдут дураки под номерами 1, 3 и 5, через вторую — дурак номер 5, через третью — дурак номер 3, через четвертую — дурак номер 1.

F. Соревнование по программированию

Деревья дп жадные алгоритмы Паросочетания поиск в глубину и подобное *1900

BerSoft — крупнейшая IT-корпорация в Берляндии. В компании BerSoft работает \(n\) сотрудников, пронумерованных от \(1\) до \(n\).

Первый сотрудник является руководителем компании и у него нет начальника. У каждого другого сотрудника \(i\) есть ровно один непосредственный начальник \(p_i\).

Сотрудник \(x\) считается начальником (непосредственным или косвенным) сотрудника \(y\), если выполняется одно из следующих условий:

  • сотрудник \(x\) является непосредственным начальником сотрудника \(y\);
  • сотрудник \(x\) является начальником непосредственного начальника сотрудника \(y\).

Структура BerSoft организована таким образом, что руководитель компании является начальником для каждого сотрудника.

Скоро будет проведено соревнование по программированию. Для этой цели будут созданы команды из двух человек. Однако, если в команде один сотрудник является начальником другого, им будет некомфортно вместе. Поэтому команды из двух человек должны быть созданы таким образом, что никто не был начальником для другого. Обратите внимание, что никакой сотрудник не может участвовать более чем в одной команде.

Ваша задача — посчитать максимально возможное количество команд в соответствии с вышеописанными правилами.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество сотрудников.

Вторая строка содержит \(n-1\) целых чисел \(p_2, p_3, \dots, p_n\) (\(1 \le p_i \le n\)), где \(p_i\) — номер непосредственного начальника \(i\)-го сотрудника.

Сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимально возможное количество команд в соответствии с вышеописанными правилами.

Примечание

В первом примере можно создать команду \((3, 4)\).

Во втором примере команда не может быть создана, потому что здесь всего \(2\) сотрудника и один является начальником другого.

В третьем примере можно создать команду \((2, 3)\).

В четвертом примере можно создать команды \((2, 4)\), \((3, 5)\) и \((6, 7)\).

В пятом примере можно создать команды \((2, 3)\), \((6, 4)\) и \((5, 7)\).

G1. Лампочки (простая версия)

графы Деревья дп Комбинаторика математика Перебор поиск в глубину и подобное снм *2100

Простая и сложная версии этой задачи отличаются друг от друга только ограничениями на \(n\). В простой версии сумма значений \(n^2\) по всем наборам входных данных не превосходит \(10^6\). Кроме того, \(n\) не превосходит \(1000\) в каждом наборе входных данных.

В ряд расположены \(2n\) лампочек. У каждой лампочки есть цвет от \(1\) до \(n\) (ровно по две лампочки каждого цвета).

Изначально все лампочки выключены. Вы выбираете некоторое множество лампочек \(S\), которое вы изначально включите. После этого вы можете выполнять следующие операции в любом порядке любое количество раз:

  • выбрать две лампочки \(i\) и \(j\) одинакового цвета, ровно одна из которых включена, и включить вторую из них;
  • выбрать три лампочки \(i, j, k\), такие, что обе лампочки \(i\) и \(k\) включены и имеют одинаковый цвет, а лампочка \(j\) находится между ними (\(i < j < k\)), и включить лампочку \(j\).

Вы хотите выбрать такое множество лампочек \(S\), которые вы изначально включаете, чтобы путем выполнения описанных операций можно было добиться того, чтобы все лампочки оказались включены.

Посчитайте два числа:

  • минимальный размер множества \(S\), которое вы изначально включаете;
  • количество множеств \(S\) минимального размера (по модулю \(998244353\)).
Входные данные

В первой строке входных данных содержится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют описания наборов.

В первой строке каждого набора задано одно целое число \(n\) (\(2 \le n \le 1000\)) — количество пар лампочек.

Во второй строке каждого набора заданы \(2n\) целых чисел \(c_1, c_2, \dots, c_{2n}\) (\(1 \le c_i \le n\)), где \(c_i\) — цвет \(i\)-й лампочки. Для каждого цвета от \(1\) до \(n\) ровно две лампочки имеют этот цвет.

Дополнительное ограничение на входные данные: сумма значений \(n^2\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

Для каждого набора входных данных выведите два целых числа:

  • минимальный размер множества \(S\), которое вы изначально включаете;
  • количество множеств \(S\) минимального размера (по модулю \(998244353\)).

G2. Лампочки (сложная версия)

графы дп Комбинаторика поиск в глубину и подобное Структуры данных хэши *2300

Простая и сложная версии этой задачи отличаются друг от друга только ограничениями на \(n\). В сложной версии сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\). Кроме того, никаких дополнительных ограничений на значение \(n\) в одиночном наборе входных данных нет.

В ряд расположены \(2n\) лампочек. У каждой лампочки есть цвет от \(1\) до \(n\) (ровно по две лампочки каждого цвета).

Изначально все лампочки выключены. Вы выбираете некоторое множество лампочек \(S\), которое вы изначально включите. После этого вы можете выполнять следующие операции в любом порядке любое количество раз:

  • выбрать две лампочки \(i\) и \(j\) одинакового цвета, ровно одна из которых включена, и включить вторую из них;
  • выбрать три лампочки \(i, j, k\), такие, что обе лампочки \(i\) и \(k\) включены и имеют одинаковый цвет, а лампочка \(j\) находится между ними (\(i < j < k\)), и включить лампочку \(j\).

Вы хотите выбрать такое множество лампочек \(S\), которые вы изначально включаете, чтобы путем выполнения описанных операций можно было добиться того, чтобы все лампочки оказались включены.

Посчитайте два числа:

  • минимальный размер множества \(S\), которое вы изначально включаете;
  • количество множеств \(S\) минимального размера (по модулю \(998244353\)).
Входные данные

В первой строке входных данных содержится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют описания наборов.

В первой строке каждого набора задано одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество пар лампочек.

Во второй строке каждого набора заданы \(2n\) целых чисел \(c_1, c_2, \dots, c_{2n}\) (\(1 \le c_i \le n\)), где \(c_i\) — цвет \(i\)-й лампочки. Для каждого цвета от \(1\) до \(n\) ровно две лампочки имеют этот цвет.

Дополнительное ограничение на входные данные: сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите два целых числа:

  • минимальный размер множества \(S\), которое вы изначально включаете;
  • количество множеств \(S\) минимального размера (по модулю \(998244353\)).

E. Весёлая жизнь в университете

Деревья жадные алгоритмы поиск в глубину и подобное Структуры данных *2300

Егор и его друг Арсений в этом году заканчивают учиться в школе и уже скоро поступят университет. И так как они очень ответственные ребята, они начали готовиться к поступлению уже сейчас.

Прежде всего они решили позаботиться о том, где будут жить долгие четыре года обучения, и зайдя на сайт университета, выяснили, что общежитие университета можно представить в виде корневого дерева из \(n\) вершин с корнем в вершине \(1\). В дереве каждая вершина представляет собой рекреацию с некоторым видом активности \(a_i\). Друзьям нужно выбрать \(2\) рекреации (не обязательно различные), в которых они поселятся. Ребята убеждены, что тем будет веселее их жизнь, чем больше значение следующей функции \(f(u, v) = diff(u, lca(u, v)) \cdot diff(v, lca(u, v))\). Помогите Егору и Арсению и найдите максимальное значение \(f(u, v)\) среди всех пар рекреаций!

\(^{\dagger} diff(u, v)\) — количество различных активностей, выписанных на простом пути от вершины \(u\) до вершины \(v\).

\(^{\dagger} lca(u, v)\) — такая вершина \(p\), что она находится на максимальном расстоянии от корня и является предком и вершины \(u\), и вершины \(v\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 3 \cdot 10^{5}\)).

Вторая строка каждого набора входных данных содержит \({n - 1}\) целых чисел \(p_2, p_3, \ldots,p_n\) (\(1 \le p_i \le i - 1\)), где \(p_i\) — предок вершины \(i\).

Третья строка каждого набора входных данных содержит \({n}\) целых чисел \(a_1, a_2, \ldots,a_n\) (\(1 \le a_i \le n\)), где \(a_i\) — номер активности, которая находится в вершине \(i\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите максимальное значение \(f(u, v)\), по всем парам рекреаций \((u, v)\).

Примечание

Рассмотрим четвертый набор входных данных. Дерево имеет такой вид:

Все рекреации раскрашены в цвета. Одинаковые цвета означает что активности в рекреациях совпадают. Рассмотрим пару вершин \((11, 12)\), \(lca(11, 12) = 1\). Выпишем все активности на пути от \(11\) до \(1\) — \([11, 5, 1, 11]\), среди них различных активностей \(3\), то есть \(diff(11, 1) = 3\). Также выпишем все активности на пути от \(12\) до \(1\) — \([7, 8, 2, 11]\), среди них различных активностей \(4\), то есть \(diff(12, 1) = 4\). Получаем что \(f(11, 12) = diff(12, 1) \cdot diff(11, 1) = 4 \cdot 3 = 12\), что и является ответом для данного дерева. Можно показать, что ответ лучше получить невозможно.

F. Разделение на группы

графы жадные алгоритмы Конструктив поиск в глубину и подобное *2900

В \(31\) лицее существовало две группы олимпиадников: информатики и математики. Численность информатиков составляла \(n_1\), математиков — \(n_2\). Точно неизвестно кто какой именно группе принадлежал, но известно, что между некоторыми парами людей существовали дружественные связи (причем они могли образовываться как между парой людей одной группы, так и двух различных).

Связи были настолько крепкими, что даже если убрать одного человека, а вместе с ним убрать все его дружественные связи, то любая пара людей всё равно оставалась знакома либо напрямую, либо через общих приятелей.

\(^{\dagger}\) Более формально, два человека \((x, y)\) знакомы в следующем случае: найдутся такие люди \(a_1, a_2, \ldots,a_n\) (\(1 \le a_i \le n_1 + n_2\)), что одновременно выполняются следующие условия:

\(\bullet\) Человек \(x\) напрямую знаком с \(a_1\).

\(\bullet\) Человек \(a_n\) напрямую знаком с \(y\).

\(\bullet\) Человек \(a_i\) напрямую знаком с \(a_{i + 1}\) для любого (\(1 \le i \le n - 1\)).

Преподаватели были недовольны тем, что информатики дружат с математиками и наоборот, и поэтому они решили разделить школьников на две группы таким образом, чтобы выполнялось два условия:

\(\bullet\) В группе информатиков было \(n_1\) человек, а в группе математиков — \(n_2\) человек.

\(\bullet\) Любая пара информатиков должна быть знакома (допускается знакомство при участии общих знакомых, которые обязаны быть из той же группы, что и люди из этой пары), тоже самое должно выполняться и для математиков.

Помогите им разрешить эту задачу и найдите, кто к какой группе относится.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(n_1\), \(n_2\) и \(m\) (\(1 \le n_1, n_2 \le 2000\), \(1 \le m \le 5000\)). \(n_1\), \(n_2\) являются размерами двух групп, описанных в задаче, \(m\) — количество дружественных связей изначально.

В следующих \(m\) строках дано описание дружественных связей: в \(i\)-й (\(1 \le i \le m\)) из них дана пара чисел \((a, b)\), которая означает, что человек с номером \(a\) дружит с человеком с номером \(b\) (и обратно).

Гарантируется, что для каждого набора входных данных все дружественные связи различные.

Гарантируется, что сумма \(n_1 + n_2\) по всем наборам входных данных не превосходит \(2000\), а сумма \(m\) по всем наборам входных данных не превосходит \(5000\).

Также гарантируется, что для каждого набора входных данных ответ существует.

Выходные данные

Для каждого набора входных данных выведите две строки.

В первой строке выведите \(n_1\) различных чисел \(a_i\) (\(1 \le a_i \le n_1 + n_2\)) — люди, принадлежащие первой группе.

Во второй строке выведите \(n_2\) различных чисел \(b_i\) (\(1 \le b_i \le n_1 + n_2\)) — люди, принадлежащие второй группе.

Все числа должны быть различные.

Если существует несколько вариантов ответа, выведите любой.

Примечание

Рассмотрим третий набор входных данных. Разделение на группы выглядит следующим образом:

В зелёный цвет покрашены школьники, которые были выбраны информатиками, в синий же цвет покрашены те, кто были выбраны математиками.

Рассмотрим все пары информатиков и то, как они знакомы:

Пары \((4, 5), (4, 6)\) знакомы напрямую.

Пара \((5, 6)\) знакома через информатика с номером \(4\).

Рассмотрим все пары математиков и то, как они знакомы:

Пары \((1, 2), (2, 3)\) знакомы напрямую.

Пара \((1, 3)\) знакома через математика с номером \(2\).

Получаем, что любая пара людей, принадлежащих одной группе, знакомы друг с другом, а значит разбиение на две группы верное.

F. Гусеница на дереве

графы Деревья жадные алгоритмы поиск в глубину и подобное реализация сортировки *2500

Гусеница решила побывать в каждой вершине дерева. Изначально она сидит в корне.

Дерево представлено как корневое дерево с корнем в вершине \(1\). Каждое переползание в соседнюю вершину у неё занимает \(1\) минуту.

А под деревом стоит батут. Если гусеница отцепится от дерева и упадёт на батут, то за \(0\) секунд окажется в корне дерева. Но батут старый и выдержит не более \(k\) падений гусеницы.

За какое минимальное время гусеница сможет обойти дерево?

Более формально — надо найти минимальное время, нужное, чтобы посетить все вершины дерева, если гусеница начинает в корне (вершине \(1\)) и двигается с помощью двух способов.

  1. Перейти по ребру в одну из соседних вершин: тратит \(1\) минуту.
  2. Телепортироваться в корень: не тратит времени, никакие новые вершины не становятся посещёнными.

Второй способ (телепортацию) можно применить не более \(k\) раз. Гусеница может закончить путешествие в любой вершине.

Входные данные

В первой строке входных данных находятся два целых числа: \(n\) (\(2 \le n \le 2\cdot 10^5\)) — количество вершин в дереве, и \(k\) (\(0 \le k \le 10^9\)) — максимальное число телепортаций в корень.

Во второй строке записаны \(n-1\) целых чисел \(p_2\), \(p_3\), ..., \(p_n\) (\(1 \le p_i \le n\)) — предки в дереве для вершин \(2, 3, \ldots, n\); вершина \(1\) — корень.

Выходные данные

В единственной строке выведите одно число — минимальное число минут, за которое можно побывать во всех вершинах дерева.

Примечание

На картинке показан один из способов обойти дерево из первого теста за 9 минут.

F1. Спокойное плавание (простая версия)

Бинарный поиск графы кратчайшие пути Перебор поиск в глубину и подобное снм Структуры данных *2500

Единственное отличие двух версий этой задачи состоит в ограничении на \(q\). Вы можете делать взломы, только если обе версии задачи решены.

Томас плавает вокруг острова, окружённого океаном. Океан и остров можно представить в виде таблицы с \(n\) строками и \(m\) столбцами. Строки пронумерованы от \(1\) до \(n\) сверху вниз, а столбцы пронумерованы от \(1\) до \(m\) слева направо. Позицию клетки в строке \(r\) и в столбце \(c\) обозначим как \((r, c)\). Ниже приведен пример допустимой таблицы.

Пример допустимой таблицы

Существует три типа клеток: остров, океан и подводный вулкан. Клетки, представляющие остров, отмечены символом '#', клетки, представляющие океан, отмечены символом '.', а клетки, представляющие подводный вулкан, отмечены символом 'v'. Гарантируется, что есть хотя бы одна клетка острова и хотя бы одна клетка подводного вулкана. Также гарантируется, что множество всех клеток острова образует единую связную компоненту\(^{\dagger}\), и множество всех клеток океана и подводных вулканов также образует единую связную компоненту. Кроме того, гарантируется, что на краю таблицы (то есть, в строке \(1\), в строке \(n\), в столбце \(1\) и в столбце \(m\)) нет клеток острова.

Определим круговой маршрут, проходимый Томасом, начинающийся в клетке \((x, y)\), как путь, который удовлетворяет следующим условиям:

  • Путь начинается и заканчивается в клетке \((x, y)\).
  • Если Томас находится в клетке \((i, j)\), то он может перейти в клетки \((i+1, j)\), \((i-1, j)\), \((i, j-1)\) и \((i, j+1)\), при условии, что клетка, в которую он переходит, является клеткой океана или подводного вулкана и находится внутри таблицы. Обратите внимание, что Томасу разрешается посещать одну и ту же клетку несколько раз за один круговой маршрут.
  • Путь должен обойти остров и полностью его окружить. Некоторый путь \(p\) полностью окружает остров, если невозможно добраться от клетки острова до клетки на границе таблицы, перемещаясь только в соседние по стороне или диагонали клетки, не посещая при этом клетку на пути \(p\). На изображении ниже путь, начинающийся в \((2, 2)\), приходящий в \((1, 3)\) и возвращающийся в \((2, 2)\) в обратную сторону, не полностью окружает остров и не считается круговым маршрутом.
Пример пути, который не полностью окружает остров

Безопасность кругового маршрута — это минимальное манхэттенское расстояние\(^{\ddagger}\) от клетки на круговом маршруте до подводного вулкана (обратите внимание, что наличие клеток острова не влияет на это расстояние).

У вас есть \(q\) запросов. Запрос можно представить как \((x, y)\), и для каждого запроса вы хотите найти максимальную безопасность кругового маршрута, начинающегося в \((x, y)\). Гарантируется, что \((x, y)\) является клеткой океана или подводного вулкана.

\(^{\dagger}\)Множество клеток образует единую связную компоненту, если из любой клетки этого множества можно добраться до любой другой клетки этого множества, перемещаясь только по клеткам этого множества, каждый раз переходя в клетку с общей стороной.

\(^{\ddagger}\)Манхэттенское расстояние между клетками \((r_1, c_1)\) и \((r_2, c_2)\) равно \(|r_1 - r_2| + |c_1 - c_2|\).

Входные данные

Первая строка содержит три целых числа \(n\), \(m\) и \(q\) (\(3 \leq n, m \leq 10^5\), \(9 \leq n \cdot m \leq 3 \cdot 10^5\), \(1 \leq q \leq 5\)) — количество строк и столбцов таблицы и количество запросов.

Каждая из следующих \(n\) строк содержит \(m\) символов, описывающих клетки таблицы. Символ '#' обозначает клетку острова, '.' обозначает клетку океана, и 'v' обозначает клетку подводного вулкана.

Гарантируется, что есть хотя бы одна клетка острова и хотя бы одна клетка подводного вулкана. Гарантируется, что множество всех клеток острова образует единую связную компоненту, и множество всех клеток океана и подводных вулканов также образует единую связную компоненту. Также гарантируется, что нет клеток острова на краю таблицы (то есть, в строке \(1\), в строке \(n\), в столбце \(1\) и в столбце \(m\)).

Следующие \(q\) строк описывают запросы. Каждая из этих строк содержит два целых числа \(x\) и \(y\) (\(1 \leq x \leq n\), \(1 \leq y \leq m\)), обозначающие круговой маршрут, начинающийся в \((x, y)\).

Гарантируется, что \((x, y)\) является клеткой океана или подводного вулкана.

Выходные данные

Для каждого запроса выведите одно целое число — максимальную безопасность кругового маршрута, начинающегося в указанной клетке.

Примечание

Для первого примера на изображении ниже показан оптимальный круговой маршрут, начинающийся в \((1, 1)\). Безопасность кругового маршрута равна \(3\), так как минимальное манхэттенское расстояние от клетки на круговом маршруте до подводного вулкана равно \(3\).

Пример оптимального кругового маршрута

В четвёртом примере помните, что Томасу разрешается посещать одну и ту же клетку несколько раз за один круговой маршрут. Например, это необходимо для кругового маршрута, начинающегося в \((7, 6)\).

E. Посчитай пути

графы Деревья дп поиск в глубину и подобное снм Структуры данных *2000

Вам дано дерево, состоящее из \(n\) вершин, пронумерованных от \(1\) до \(n\). Каждая вершина окрашена в некоторый цвет, обозначенный целым числом от \(1\) до \(n\).

Простой путь в дереве называется красивым, если:

  • он состоит хотя бы из \(2\) вершин;
  • первая и последняя вершины пути имеют одинаковый цвет;
  • ни одна другая вершина на пути не имеет такой же цвет, как и первая вершина.

Посчитайте количество красивых простых путей в дереве. Обратите внимание, что пути считаются ненаправленными (то есть путь из \(x\) в \(y\) — это то же самое, что и путь из \(y\) в \(x\)).

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого теста записано одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество вершин в дереве.

Во второй строке записаны \(n\) целых чисел \(c_1, c_2, \dots, c_n\) (\(1 \le c_i \le n\)) — цвет каждой вершины.

В \(i\)-й из следующих \(n - 1\) строк записаны два целых числа \(v_i\) и \(u_i\) (\(1 \le v_i, u_i \le n\); \(v_i \neq u_i\)) — \(i\)-е ребро дерева.

Данные ребра образуют валидное дерево. Сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — количество красивых простых путей в дереве.

F. Влад и избегание X

битмаски дп Перебор поиск в глубину и подобное реализация *2200

У Владислава есть квадратное клетчатое поле размером \(7 \times 7\), где каждая клетка окрашена в черный или белый цвет. За одну операцию можно выбрать любую клетку и изменить её цвет (черный \(\leftrightarrow\) белый).

Найдите минимальное количество операций, необходимых для того, чтобы гарантировать, что нет черных клеток, у которых все четыре диагональных соседа также черные.

На левом изображении показано, что изначально есть две черные клетки, нарушающие условие. Переворачивая одну клетку, поле будет соответствовать требованию.

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1 \leq t \leq 200\)) — количество наборов входных данных. Затем следует описание наборов.

Каждый набор состоит из \(7\) строк, каждая содержит \(7\) символов. Каждый из этих символов либо \(\texttt{W}\), либо \(\texttt{B}\), обозначая белую или черную клетку соответственно.

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество операций, необходимых для того, чтобы гарантировать, что нет черных клеток, у которых все четыре диагональных соседа также черные.

Примечание

Первый набор входных данных изображен в условии.

Второй набор входных данных изображен ниже:

В третьем наборе входных данных поле уже удовлетворяет условию.

G. Влад и проблемы в МИТ

графы Деревья дп жадные алгоритмы поиск в глубину и подобное Потоки реализация *1900

У Владислава есть сын, который очень хотел поступить в МИТ. Общежитие колледжа в МИТ (Молдавский институт технологий) можно представить в виде дерева с \(n\) вершинами, где каждая вершина представляет собой комнату с ровно одним студентом. Дерево — это связный неориентированный граф с \(n\) вершинами и \(n-1\) ребром.

Сегодня ночью есть три типа студентов:

  • студенты, которые хотят веселиться и слушать музыку (обозначены \(\texttt{P}\)),
  • студенты, которые хотят спать и наслаждаться тишиной (обозначены \(\texttt{S}\)), и
  • студенты, которым не важно, что делать ночью (обозначены \(\texttt{C}\)).

Изначально все рёбра представляют собой тонкие стены, которые позволяют музыке проходить через них, поэтому когда веселящийся студент включает музыку, её можно услышать в каждой комнате. Однако мы можем установить толстые стены на любые рёбра — толстые стены не позволяют музыке проходить через них.

Университет хочет установить несколько толстых стен, чтобы каждый веселящийся студент мог слушать музыку, и ни один спящий студент не мог её услышать.

Поскольку университет потерял много денег в судебном процессе о правах на наименование, они просят вас найти минимальное количество толстых стен, которые им придется использовать.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Первая строка каждого набора содержит целое число \(n\) (\(2 \leq n \leq 10^5\)) — количество вершин в дереве.

Вторая строка каждого набора входных данных содержит \(n-1\) целых чисел \(a_2, \dots , a_n\) (\(1 \leq a_i < i\)) — это означает, что есть ребро между \(i\) и \(a_i\) в дереве.

Третья строка каждого набора входных данных содержит строку \(s\) длиной \(n\), состоящую из символов \(\texttt{P}\), \(\texttt{S}\) и \(\texttt{C}\), обозначающих, что студент \(i\) относится к типу \(s_i\).

Сумма \(n\) по всем наборам входных данных не превышает \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — искомое минимальное количество толстых стен.

Примечание

В первом случае мы можем установить одну толстую стену между комнатами \(1\) и \(2\), как показано ниже. Мы не можем установить \(0\) стен, так как тогда музыка из комнаты 3 дойдет до комнаты 2, где студент хочет спать, поэтому ответ равен \(1\). Существуют и другие допустимые решения.

F. Микроцикл

графы Деревья жадные алгоритмы поиск в глубину и подобное реализация снм сортировки Структуры данных *1900

Дан неориентированный взвешенный граф из \(n\) вершин и \(m\) рёбер. Между каждой парой вершин в графе существует не более одного ребра, граф не содержит петель (рёбер из вершины в себя же). Граф не обязательно связный.

Цикл в графе называется простым, если он не проходит через одну и ту же вершину дважды и не содержит одно и то же ребро дважды.

Найдите любой простой цикл этого графа, в котором вес самого лёгкого ребра минимален.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют описания наборов.

Первая строка каждого набора содержит два целых числа \(n\) и \(m\) (\(3 \le n \le m \le \min(\frac{n\cdot(n - 1)}{2}, 2 \cdot 10^5)\)) — размер графа и количество рёбер.

Следующие \(m\) строк набора содержат по три целых числа \(u\), \(v\) и \(w\) (\(1 \le u, v \le n\), \(u \ne v\), \(1 \le w \le 10^6\)) — вершины \(u\) и \(v\) соединены ребром веса \(w\).

Гарантируется, что между каждой парой вершин существует не более одного ребра. Обратите внимание, что при заданных ограничениях в графе всегда есть хотя бы один простой цикл.

Гарантируется, что сумма значений \(m\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите пару чисел \(b\) и \(k\), где:

  • \(b\) — минимальный вес ребра в найденном цикле,
  • \(k\) — количество вершин в найденном цикле.

В следующей строке выведите \(k\) чисел от \(1\) до \(n\)  — вершины цикла в порядке обхода.

Обратите внимание, что ответ всегда существует, так как при заданных ограничениях в графе всегда есть хотя бы один простой цикл.

E. Саша и веселая нарезка дерева

битмаски графы Деревья дп жадные алгоритмы математика Перебор поиск в глубину и подобное *2300

Саше за победу на очередной олимпиаде подарили дерево\(^{\dagger}\) из \(n\) вершин. Но, вернувшись домой после празднования очередной победы, он заметил его потерю. Саша помнит, что он покрасил некоторые рёбра этого дерева. При этом он точно знает, что для любой из \(k\) пар вершин \((a_1, b_1), \ldots, (a_k, b_k)\) он покрасил хотя бы одно ребро на простом пути\(^{\ddagger}\) между вершинами \(a_i\) и \(b_i\).

Саша не помнит, сколько рёбер он точно покрасил, так что он просит вас сказать, какое минимальное количество рёбер он мог покрасить, чтобы выполнялось описанное выше условие.

\(^{\dagger}\)Деревом называется неориентированный связный граф без циклов.

\(^{\ddagger}\)Простой путь — это путь, проходящий через каждую вершину не более одного раза.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \leq n \leq 10^5\)) — количество вершин в дереве.

Следующие \((n - 1)\) строка описывают рёбра дерева. \(i\)-я из них содержит два целых числа \(u_i\) и \(v_i\) (\(1 \leq u_i, v_i \leq n\), \(u_i \ne v_i\)) — номера вершин, которые соединяет \(i\)-е ребро.

Следующая строка содержит одно целое число \(k\) (\(1 \leq k \leq 20\)) — количество пар вершин, на простом пути между которыми Саша покрасил хотя бы одно ребро.

Следующие \(k\) строк описывают пары. \(j\)-я из них содержит два целых числа \(a_j\) и \(b_j\) (\(1 \leq a_j, b_j \leq n, a_j \neq b_j\)) — вершины в \(j\)-й паре.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\). Гарантируется, что сумма \(2^k\) по всем наборам входных данных не превосходит \(2^{20}\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество рёбер, которое мог покрасить Саша.

Примечание

В первом наборе входных данных Саша мог покрасить только одно ребро \((1, 2)\). Тогда на простом пути между вершинами \(1\) и \(3\) и вершинами \(4\) и \(1\) будет хотя бы одно покрашенное ребро.

Во втором наборе входных данных Саша мог покрасить рёбра \((1, 6)\) и \((1, 3)\).

F. Саша и свадебное бинарное дерево поиска

Деревья Комбинаторика математика Перебор поиск в глубину и подобное Структуры данных *2300

Пройдя все трудности и невзгоды, Саша наконец решил жениться на своей девушке. Для этого нужно подарить ей обручальное кольцо. Однако его девушке не нравятся подобные романтические жесты, но нравятся бинарные деревья поиска\(^{\dagger}\). Поэтому Саша решил ей подарить такое дерево.

Проведя немало времени на свадебных сайтах для программистов, он нашел идеальное бинарное дерево поиска с корнем в вершине \(1\). В нём значение в вершине \(v\) равно \(val_v\).

Но спустя некоторое время он забыл значения в некоторых вершинах. Пытаясь вспомнить найденное дерево, Саша задался вопросом — сколько существует бинарных деревьев поиска, которые он мог найти на сайте, если известно, что значения во всех вершинах являются целыми числами и принадлежат отрезку \([1, C]\). Поскольку это число может быть очень большим, выведите его по модулю \(998\,244\,353\).

\(^{\dagger}\)Бинарным деревом поиска называется корневое бинарное дерево, у которого для любой вершины \(x\) выполняется свойство: значения всех вершин в левом поддереве вершины \(x\) (если оно существует) меньше или равны значению в вершине \(x\) и значения всех вершин в правом поддереве вершины \(x\) (если оно существует) больше или равны значению в вершине \(x\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(C\) (\(2 \leq n \leq 5 \cdot 10^5\), \(1 \leq C \leq 10^9\)) — количество вершин в дереве и максимально допустимое значение в вершине.

Следующие \(n\) строк описывают вершины дерева. \(i\)-я из них содержит три целых числа \(L_i, R_i\) и \(val_i\) (\(-1 \le L_i, R_i \le n\), \(-1 \le val_i \le C\), \(L_i, R_i, val_i \ne 0\)) — номер левого сына, правого сына и значение в \(i\)-й вершине, соответственно. Если \(L_i = -1\), то у \(i\)-й вершины нет левого сына. Если \(R_i = -1\), то у \(i\)-й вершины нет правого сына. Если \(val_i = -1\), то значение в \(i\)-й вершине неизвестно.

Гарантируется, что существует хотя бы одно подходящее бинарное дерево поиска.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(5 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите единственное целое число — количество подходящих бинарных деревьев поиска по модулю \(998\,244\,353\).

Примечание

В первом наборе входных данных, бинарное дерево поиска имеет следующий вид:

Тогда возможными значениями в вершинах являются: \([2, 2, 3, 2, 2]\), \([2, 2, 3, 2, 3]\), \([2, 2, 3, 3, 3]\) и \([3, 2, 3, 3, 3]\).

Во втором наборе входных данных значения во всех вершинах известны, поэтому существует единственное подходящее бинарное дерево поиска.

F. Максимизируйте разницу

битмаски Перебор поиск в глубину и подобное *2700

Для массива \(b\) из \(m\) целых неотрицательных чисел определим \(f(b)\) как максимальное значение \(\max\limits_{i = 1}^{m} (b_i | x) - \min\limits_{i = 1}^{m} (b_i | x)\) среди всех неотрицательных целых чисел \(x\), где \(|\) обозначает операцию побитового ИЛИ.

Вам даны целые числа \(n\) и \(q\). Вы начинаете с пустого массива \(a\). Выполните следующие \(q\) запросов:

  • \(v\): добавить \(v\) в конец \(a\) и вывести \(f(a)\). Гарантируется, что \(0 \leq v < n\).

Запросы даны в измененном виде.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 2 \cdot 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(q\) (\(1 \leq n \leq 2^{22}\), \(1 \leq q \leq 10^6\)) — количество запросов.

Вторая строка каждого набора входных данных содержит \(q\) разделенных пробелами целых чисел \(e_1,e_2,\ldots,e_q\) (\(0 \leq e_i < n\)) — зашифрованные значения \(v\).

Пусть \(\mathrm{last}_i\) равно результату \((i-1)\)-го запроса для \(i\geq 2\) и \(\mathrm{last}_i=0\) для \(i=1\). Тогда значение \(v\) для \(i\)-го запроса равно (\(e_i + \mathrm{last}_i\)) по модулю \(n\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2^{22}\), а сумма \(q\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

Для каждого набора входных данных выведите \(q\) целых чисел, разделенных пробелами. \(i\)-е число должно равняться результату выполнения \(i\)-го запроса.

Примечание

В первом наборе входных данных в конце \(a=[1,2]\). Для \(i=1\) ответ всегда \(0\), независимо от \(x\). Для \(i=2\) мы можем выбрать \(x=5\).

Во втором наборе входных данных итоговое значение \(a=[3,1,0,5]\).

H. Интерактивное дерево мексов

Деревья интерактив Конструктив поиск в глубину и подобное *3300

Это интерактивная задача.

У Алисы есть дерево \(T\), состоящее из \(n\) вершин, пронумерованных от \(1\) до \(n\). Алиса покажет дерево \(T\) Бобу. После того как Боб увидит \(T\), он должен назвать Алисе две перестановки \(p_1\) и \(p_2\) чисел \([1, 2, \ldots, n]\).

Затем Алиса сыграет \(q\) раундов следующей игры:

  • Алиса создаст массив \(a\), который является перестановкой чисел \([0,1,\ldots,n-1]\). Значение вершины \(v\) будет равно \(a_v\).
  • Алиса выберет две вершины \(u\) и \(v\) (\(1 \leq u, v \leq n\), \(u \neq v\)) из \(T\) и сообщит их Бобу. Бобу нужно будет найти \(\operatorname{MEX}^\dagger\) значений на единственном простом пути между вершинами \(u\) и \(v\).
  • Чтобы найти это значение, Боб может задать Алисе не более \(5\) запросов. В каждом запросе Боб должен дать Алисе три целых числа \(t\), \(l\) и \(r\), таких, что \(t\) равно \(1\) или \(2\), и \(1 \leq l \leq r \leq n\). После этого Алиса сообщит Бобу величину, равную \(\)\min_{i=l}^{r} a[p_{t,i}].\(\)

Обратите внимание, что все раунды независимы друг от друга. В частности, значения \(a\), \(u\) и \(v\) могут быть разными в разных раундах.

Боб озадачен, поскольку он знает только решение с HLD, которое требует \(O(\log(n))\) запросов в каждом раунде. Поэтому ему нужна ваша помощь, чтобы выиграть игру.

\(^\dagger\) \(\operatorname{MEX}\) набора чисел \(c_1, c_2, \ldots, c_k\) определяется как наименьшее неотрицательное целое число \(x\), которое не встречается в наборе чисел \(c\).

Протокол взаимодействия

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует взаимодействие по каждому набору входных данных.

Первая строка каждого набора входных данных содержит два положительных целых числа \(n\) и \(q\) (\(2 \leq n \leq 10^5\), \(1 \leq q \leq 10^4\)) — количество вершин в \(T\) и количество раундов соответственно.

Следующие \(n-1\) строк содержат по два целых числа \(u\) и \(v\) (\(1 \leq u, v \leq n\), \(u \neq v\)), обозначающие ребро между вершинами \(u\) и \(v\). Гарантируется, что заданные ребра образуют дерево.

Гарантируется, что суммы \(n\) и \(q\) по всем наборам входных данных не превосходит \(10^5\) и \(10^4\) соответственно.

Также гарантируется, что сумма значений \(n \cdot q\) не превосходит \(3 \cdot 10^6\).

После завершения чтения ребер дерева необходимо вывести две перестановки \(p_1\) и \(p_2\) чисел \([1, 2, \ldots, n]\).

Для этого в отдельной строке выведите \(n\) целых чисел — перестановку \(p_1\).

В следующей строке выведите \(n\) целых чисел — перестановку \(p_2\).

Алиса начнет играть в игру.

Для каждого раунда необходимо считать два целых числа \(u\) и \(v\) (\(1 \leq u, v \leq n\), \(u \neq v\)). Вам нужно найти \(\operatorname{MEX}\) значений вершин на пути из \(u\) в \(v\).

Чтобы сделать запрос, выведите «? \(t\) \(l\) \(r\)» без кавычек, где \(t\) равно \(1\) или \(2\) и \(1 \leq l \leq r \leq n\). После этого вы должны прочитать одно целое число — ответ на ваш запрос \(\min_{i=l}^{r} a_{p_{t,i}}\). В каждом раунде можно сделать не более \(5\) таких запросов для каждого раунда.

Когда вы хотите вывести ответ, выведите «! \(x\)» (\(1 \leq x, y \leq n\)) без кавычек. После этого считайте одно целое число, которое в нормальной ситуации будет равно \(1\).

Если вместо корректного ответа вы получаете целое число \(-1\), это означает, что ваша программа сделала некорректный запрос, превысила лимит запросов или дала неправильный ответ на предыдущем наборе входных данных. Чтобы получить вердикт Неправильный ответ, ваша программа должна немедленно завершиться. В противном случае вы можете получить произвольный вердикт, поскольку ваше решение будет продолжать читать из закрытого потока.

После вывода запроса или ответа не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Взломы

Чтобы сделать взлом, используйте следующий формат.

Первая строка должна содержать целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных должна содержать два целых числа \(n\) и \(q\) (\(2 \leq n \leq 10^5\); \(1 \leq q \leq 10^4\)) — количество вершин в \(T\) и количество раундов, соответственно.

Следующие \(n-1\) строк должны содержать по два целых числа \(u\) и \(v\) (\(1 \leq u, v \leq n\), \(u \neq v\)), означающие ребро между вершинами \(u\) и \(v\). Данные ребра должны образовывать дерево.

Для каждого из \(q\) раундов сначала выведите в отдельной строке перестановку чисел \([0, 1, 2, \ldots, n-1]\) — массив \(a\), который выберет Алиса в начале раунда.

В следующей строке выведите два различных целых числе \(u\) и \(v\) (\(1 \leq u, v \leq v\), \(u \neq v\)) — вершины, являющиеся концам пути, про который спросит Алиса.

Сумма значений \(n\) и сумма значений \(q\) по всем наборам входных данных не должны превышать \(10^5\) и \(10^4\) соответственно.

Сумма значений \(n \cdot q\) не должна превышать \(3 \cdot 10^6\).

Примечание

В первом примере взаимодействие происходит следующим образом.

Решениежюриобъяснение
1Имеется 1 набор входных данных.
3 1Дерево \(T\) состоит из \(3\) вершин, и Алиса будет играть только один раунд.
1 2Первое ребро \(T\)
2 3Второе ребро \(T\)
1 2 3Перестановка \(p_1\)
2 1 3Перестановка \(p_2\)
Алиса переставляет элементы \(a\) и получает \(a=[0,2,1]\), прежде чем выдать вершины для единственного раунда.
2 3Вершины для раунда
? 1 2 31\(\min(a_{p_{1,2}},a_{p_{1,3}})=\min(a_2,a_3)=1\)
? 2 1 30\(\min(a_{p_{2,1}},a_{p_{2,2}},a_{p_{2,3}})=\min(a_2,a_1,a_3)=0\)
! 01Учитывая ответы на запросы, очевидно, что \(\operatorname{MEX}\) равен \(0\). Поскольку вывод верен, жюри отвечает \(1\).

После каждого набора входных данных обязательно считывайте \(1\) или \(-1\).

F. Скриншоты чата

графы Комбинаторика поиск в глубину и подобное *1700

В чате контестов по программированию состоит \(n\) человек. Участники чата упорядочены по активности, однако каждый человек видит самого себя в начале списка.

Например, в чате \(4\) участника, и их порядок равен \([2, 3, 1, 4]\). Тогда

  • \(1\)-й пользователь видит порядок \([1, 2, 3, 4]\);
  • \(2\)-й пользователь видит порядок \([2, 3, 1, 4]\);
  • \(3\)-й пользователь видит порядок \([3, 2, 1, 4]\);
  • \(4\)-й пользователь видит порядок \([4, 2, 3, 1]\).

\(k\) человек выложили в чат скриншоты, на которых виден порядок участников, показываемый данному пользователю. Скриншоты были сделаны в течение короткого промежутка времени, и порядок участников не изменился.

Ваша задача — определить, существует ли некоторый порядок, которому соответствуют все скриншоты.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют описания наборов входных данных.

Первая строка описания каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 2 \cdot 10^5, n \cdot k \le 2 \cdot 10^5\)) — количество участников чата и количество участников, выложивших скриншоты.

Следующие \(k\) строк содержат описания скриншотов, выложенных участниками.

\(i\)-я строка содержит \(n\) целых чисел \(a_{ij}\) каждая (\(1 \le a_{ij} \le n\), все \(a_{ij}\) различны) — порядок участников, показываемый участнику \(a_{i0}\), где \(a_{i0}\) — автор скриншота. Можно показать, что в описании скриншота он всегда будет в начале списка.

Гарантируется, что сумма \(n \cdot k\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\). Также гарантируется, что все авторы скриншотов различны.

Выходные данные

Выведите \(t\) строк, каждая из которых является ответом на соответствующий набор входных данных. В качестве ответа выведите «YES», если существует хотя бы один порядок участников, при котором могли быть получены все \(k\) скриншотов. Иначе выведите «NO».

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

F. Робот и подземные толчки

графы дп кратчайшие пути поиск в глубину и подобное *2100

Мир представляет собой прямоугольную таблицу с \(n\) строками и \(m\) столбцами. Строки нумеруются \(0, 1, \ldots, n-1\), а столбцы нумеруются \(0, 1, \ldots, m-1\). В этом мире столбцы циклические (т.е. верхние и нижние ячейки в каждом столбце смежны). Ячейка в \(i\)-й строке и \(j\)-м столбце (\(0 \le i < n, 0 \le j < m\)) обозначается как \((i,j)\).

В момент времени \(0\) ячейка \((i,j)\) (где \(0 \le i < n, 0 \le j < m\)) содержит либо камень, либо ничего. Состояние ячейки \((i,j)\) можно описать с помощью целого числа \(a_{i,j}\):

  • Если \(a_{i,j} = 1\), в \((i,j)\) есть камень.
  • Если \(a_{i,j} = 0\), в \((i,j)\) ничего нет.

В результате подземных толчков от землетрясения, столбцы следуют за движениями тектонических плит: каждый столбец циклически двигается вверх со скоростью \(1\) ячейка за единицу времени. Формально, для некоторых \(0 \le i < n, 0 \le j < m\), если в данный момент времени в \((i,j)\) есть камень, он переместится из \((i, j)\) в \((i - 1, j)\) (или в \((n - 1, j)\), если \(i=0\)).

Робот по имени RT изначально находится в позиции \((0,0)\). Ему нужно добраться до \((n-1,m-1)\) для проведения операции спасения от землетрясения (в правый нижний угол поля). Подземные толчки не изменяют положения робота, они только изменяют положение камней в мире.

Пусть текущее положение RT имеет координаты \((x,y)\) (\(0 \le x < n, 0 \le y < m\)), он может выполнить следующие операции:

  • Перейти на одну ячейку циклически вверх, т.е. из \((x,y)\) в \(((x+n-1) \bmod n, y)\) за \(1\) единицу времени.
  • Перейти на одну ячейку циклически вниз, т.е. из \((x,y)\) в \(((x+1) \bmod n, y)\) за \(1\) единицу времени.
  • Перейти на одну ячейку вправо, т.е. из \((x,y)\) в \((x, y+1)\) за \(1\) единицу времени. (RT может выполнить эту операцию только если \(y < m-1\).)

Обратите внимание, что RT не может ни двигаться влево с помощью этих операций, ни оставаться на месте.

К сожалению, RT взорвется при столкновении с камнем. Поэтому, когда RT находится в \((x,y)\) и есть камень в \(((x+1) \bmod n, y)\) или \(((x+2) \bmod n, y)\), RT не может двигаться вниз, иначе он столкнется с камнем.

Аналогично, если \(y+1 < m\) и есть камень в \(((x+1) \bmod n, y+1)\), RT не может двигаться вправо, иначе он столкнется с камнем.

Стоит отметить, что если на клетках \((x \bmod n, y+1)\) и \(((x+1) \bmod n, y)\) находится камень, RT всё равно может безопасно перейти вправо.

Найдите минимальное количество времени, которое RT нужно, чтобы добраться до \((n-1,m-1)\) без столкновения с камнями. Если это невозможно, выведите \(-1\).

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В каждом наборе первая строка содержит два целых числа \(n\), \(m\) (\(3 \le n, m \le 10^3\)) — размеры планеты.

Каждая из следующих \(n\) строк содержит \(m\) целых чисел. \((j+1)\)-е целое число в \((i+1)\)-й строке (\(0 \le i < n, 0 \le j < m\)) — это \(a_{i,j}\) (\(0 \le a_{i,j} \le 1\)), которое обозначает, есть ли камень в \((i,j)\) в момент времени \(0\).

Кроме того, гарантируется, что \(a_{0,0} = 0\), и \(a_{i, m-1} = 0\) для \(0 \le i < n\). Другими словами, в начальной позиции RT также нет камня, а в столбце \(m-1\) его также нет.

Сумма \(n \cdot m\) по всем наборам входных данных не превышает \(10^6\).

Выходные данные

Для каждого набора входных данных:

  • Если конечная точка может быть достигнута без столкновения с камнями, выведите одно целое число — минимальное количество времени, которое RT нужно, чтобы добраться до \((n-1,m-1)\).
  • В противном случае выведите \(-1\).
Примечание

Визуальное объяснение первого теста в примере:

G. Магический рисунок королевской черепахи

битмаски Комбинаторика Конструктив математика Перебор поиск в глубину и подобное *2300

Черепаха Алиса в настоящее время разрабатывает коробку для печенья с предсказаниями, и она хотела бы включить в нее теорию Лоушу.

Коробку можно рассматривать как таблицу размера \(n \times m\) (\(n, m \ge 5\)), где строки нумеруются \(1, 2, \dots, n\), а столбцы нумеруются \(1, 2, \dots, m\). Каждая клетка может быть либо пустой, либо содержать одно печенье с предсказанием одной из следующих форм: круг или квадрат. Клетка на пересечении \(a\)-й строки \(b\)-го столбца обозначается как \((a, b)\).

Изначально вся таблица пуста. Затем Алиса выполняет \(q\) операций с коробкой для печенья. \(i\)-я операция (\(1 \le i \le q\)) выполняется следующим образом: указывается в настоящее время пустая клетка \((r_i,c_i)\) и форма (круг или квадрат), затем ставится печенье с предсказанием указанной формы в клетку \((r_i,c_i)\). Обратите внимание, что после \(i\)-й операции клетка \((r_i,c_i)\) больше не является пустой.

Перед всеми операциями и после каждой из \(q\) операций Алиса задается вопросом, сколько существует способов разместить печенья с предсказанием во всех оставшихся пустых клетках, так чтобы было удовлетворено следующее требование:

Не существует трёх последовательных клеток с печеньем одинаковой формы в одной строке, одном столбце или на одной диагонали. Формально:

  • Не существует \((i,j)\), удовлетворяющих \(1 \le i \le n, 1 \le j \le m-2\), таких, что в клетках \((i,j), (i,j+1), (i,j+2)\) есть печенье одинаковой формы.
  • Не существует \((i,j)\), удовлетворяющих \(1 \le i \le n-2, 1 \le j \le m\), таких, что в клетках \((i,j), (i+1,j), (i+2,j)\) есть печенье одинаковой формы.
  • Не существует \((i,j)\), удовлетворяющих \(1 \le i \le n-2, 1 \le j \le m-2\), таких, что в клетках \((i,j), (i+1,j+1), (i+2,j+2)\) есть печенье одинаковой формы.
  • Не существует \((i,j)\), удовлетворяющих \(1 \le i \le n-2, 1 \le j \le m-2\), таких, что в клетках \((i,j+2), (i+1,j+1), (i+2,j)\) есть печенье одинаковой формы.

Все ответы должны быть выведены по модулю \(998\,244\,353\). Также обратите внимание, что после некоторых операций требование уже может не быть удовлетворено с уже размещенными печеньями, в этом случае, вы должны выводить \(0\).

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных.

Первая строка каждого набора содержит три целых числа \(n\), \(m\), \(q\) (\(5 \le n, m \le 10^9, 0 \le q \le \min(n \times m, 10^5)\)).

\(i\)-я из следующих \(q\) строк содержит два целых числа \(r_i\), \(c_i\) и одну строку \(\text{shape}_i\) (\(1 \le r_i \le n, 1 \le c_i \le m\), \(\text{shape}_i=\) «circle» или «square»), представляющих операции. Гарантируется, что клетка в \(r_i\)-й строке и \(c_i\)-м столбце изначально пуста. Это означает, что каждая \((r_i,c_i)\) появится не более одного раза в обновлениях.

Сумма \(q\) по всем наборам входных данных теста не превышает \(10^5\).

Выходные данные

Для каждого набора входных данных выведите \(q+1\) строк. Первая строка вывода должна содержать ответ до операций, \(i\)-я строка (\(2 \le i \le q+1\)) должна содержать ответ после первых \(i-1\) операций. Все ответы должны быть взяты по модулю \(998\,244\,353\).

Примечание

Во втором примере, после размещения печенья в форме круга в клетках \((1,1)\), \((1,2)\) и \((1,3)\), Требование уже не удовлетворено. Поэтому вы должны вывести \(0\).

F. Дерево Андрея

Бинарный поиск Деревья жадные алгоритмы Конструктив поиск в глубину и подобное реализация снм Структуры данных *2800

Магистр Андрей очень любит деревья\(^{\dagger}\), поэтому у него есть дерево, состоящее из \(n\) вершин.

Но не все так просто. Магистр Тимофей решил украсть одну вершину из дерева. Если Тимофей украл вершину \(v\) из дерева, то вершина \(v\) и все ребра с концом в вершине \(v\) удаляются из дерева, при этом номера других вершин не меняются. Чтобы Андрей не расстраивался, Тимофей решил сделать получившийся граф снова деревом. Для этого он может добавлять ребра между произвольными вершинами \(a\) и \(b\), однако при добавлении такого ребра он должен заплатить \(|a - b|\) монет в Центр Помощи Магистрам.

Обратите внимание, что получившееся дерево не содержит вершину \(v\).

Тимофей не определился, какую вершину \(v\) он удалит из дерева, поэтому он хочет знать для каждой вершины \(1 \leq v \leq n\), какое минимальное количество монет нужно потратить, чтобы после удаления вершины \(v\) сделать граф снова деревом, а также какие ребра при этом нужно добавить.

\(^{\dagger}\)Деревом называется неориентированный связный граф без циклов.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(5 \le n \le 2\cdot10^5\)) — количество вершин в дереве Андрея.

В следующих \(n - 1\) строках содержится описание ребер дерева. \(i\)-я из этих строк содержит два целых числа \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\)) — номера вершин, соединённых \(i\)-м ребром.

Гарантируется, что данные рёбра образуют дерево.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2\cdot10^5\).

Выходные данные

Для каждого набора входных данных выведите ответ в следующем формате:

Для каждой вершины \(v\) (в порядке от \(1\) до \(n\)) в первой строке выведите два целых числа \(w\) и \(m\) — минимальное количество монет, которое нужно потратить, чтобы граф после удаления вершины \(v\) снова стал деревом, и количество добавленных ребер.

Далее выведите \(m\) строк, каждая из которых содержит два целых числа \(a\) и \(b\) (\(1 \le a, b \le n, a \ne v, b \ne v\), \(a \ne b\)) — концы добавленного ребра.

Если существует несколько способов добавить ребра, вы можете вывести любое решение с минимальной стоимостью.

Примечание

В первом наборе входных данных:

Рассмотрим удаление вершины \(4\):

Оптимальным решением будет провести ребро из вершины \(5\) в вершину \(3\). Тогда мы потратим \(|5 - 3| = 2\) монеты.

В третьем наборе входных данных:

Рассмотрим удаление вершины \(1\):

Оптимальным решением будет:

  • Провести ребро из вершины \(2\) в вершину \(3\), потратив \(|2 - 3| = 1\) монету.
  • Провести ребро из вершины \(3\) в вершину \(4\), потратив \(|3 - 4| = 1\) монету.
  • Провести ребро из вершины \(4\) в вершину \(5\), потратив \(|4 - 5| = 1\) монету.

Тогда сумарно мы потратим \(1 + 1 + 1 = 3\) монеты.

Рассмотрим удаление вершины \(2\):

Ребра проводить не нужно, так как после удаления вершины граф останется деревом.

D. Рудольф и игра с мячом

дп поиск в глубину и подобное реализация *1200

Рудольф и Бернард решили сыграть с друзьями в игру. В круг встают \(n\) человек и начинают бросать друг другу мяч. Они пронумерованы от \(1\) до \(n\) по часовой стрелке.

Назовём переходом в игре перемещение мяча от некоторого игрока к его соседу. Переход может быть выполнен по часовой стрелке или против часовой стрелки.

Назовём расстоянием по часовой стрелке (против часовой стрелки) от игрока \(y_1\) до игрока \(y_2\) число переходов по часовой стрелке (против часовой стрелки), которые нужно выполнить, чтобы переместить мяч от игрока \(y_1\) к игроку \(y_2\). Например, если \(n=7\), тогда расстояние по часовой стрелке от \(2\) до \(5\) равно \(3\), а расстояние против часовой стрелки от \(2\) до \(5\) равно \(4\).

Изначально мяч находится у игрока номер \(x\) (нумерация игроков осуществляется по часовой стрелке). Во время \(i\)-го хода тот, у кого мяч, бросает его на расстояние \(r_i\) (\(1 \le r_i \le n - 1\)) по или против часовой стрелки. Например, если играет \(7\) человек, и \(2\)-й игрок, получив мяч, бросает его на расстояние \(5\), то мяч получит либо \(7\)-й игрок (бросок по часовой стрелке), либо \(4\)-й игрок (бросок против часовой стрелки). Иллюстрация этого примера приведена ниже.

Игра прервалась после \(m\) бросков из-за неожиданного дождя. Когда дождь закончился, ребята вновь собрались, чтобы продолжить. Однако никто не мог вспомнить, у кого остался мяч. Как оказалось, Бернард запомнил расстояния каждого из бросков и направление для некоторых бросков (по часовой стрелке или против часовой стрелки).

Рудольф просит вас помочь ему и на основе информации от Бернарда вычислить номера игроков, у которых мог оказаться мяч после \(m\) бросков.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют описания наборов.

Первая строка каждого набора содержит три целых числа \(n, m, x\) (\(2 \le n \le 1000\), \(1 \le m \le 1000\), \(1 \le x \le n\)) — количество игроков, число совершённых бросков и номер игрока, который бросил мяч первым, соответственно.

Следующие \(m\) строк содержат информацию о каждом броске по порядку. Каждая из них содержит целое число \(r_i\) (\(1 \le r_i \le n - 1\)) — расстояние, на которое был совершен \(i\)-й бросок, и символ \(c_i\), равный «0», «1» или «?»:

  • если \(c_i\)='0', то \(i\)-й бросок был совершен по часовой стрелке,
  • если \(c_i\)='1', то \(i\)-й бросок был совершен против часовой стрелки,
  • если \(c_i\)='?', то Бернард не помнит направление, и \(i\)-й бросок мог быть совершен как по часовой стрелке так и против часовой стрелки.

Гарантируется, что сумма \(n \cdot m\) (\(n\) умноженное на \(m\)) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите по две строки.

В первой строке выведите количество игроков \(k\) (\(1 \le k \le n\)), у которых в конце игры мог оказаться мяч.

В следующей строке выведите \(k\) чисел \(b_i\) (\(1 \le b_i \le n\)) — номера игроков в возрастающем порядке. Все номера должны быть различными.

Примечание

Ниже приведена иллюстрация трёх бросков для первого набора входных данных примера. Стрелки обозначают возможные направления броска. Серым цветом обозначены игроки, у которых мог оказаться мяч после броска.

G. Рудольф и метро

графы Конструктив кратчайшие пути поиск в глубину и подобное *2000

Бернарду не помогло строительство мостов, и он все равно продолжил везде опаздывать. Тогда Рудольф решил научить его оптимально пользоваться метро.

Рудольф изобразил карту метро как неориентированный связный граф, не имеющий петель, в котором вершины представляют собой станции метро. Любая пара вершин соединяется не более чем одним ребром.

Две вершины соединяются ребром, если между соответствующими станциями метро можно переместиться на поезде напрямую, минуя другие станции. Метро в городе, в котором живут Рудольф и Бернард, имеет цветовую нотацию. Это значит, что любое ребро между какими-либо станциями имеет определенный цвет. Ребра определенного цвета в совокупности образуют ветку метро. Ветка метро не может содержать не связанные между собой ребра, то есть образует связный подграф заданного графа метро.

Пример карты метро приведен на рисунке.

Рудольф утверждает, что маршрут будет максимально оптимальным, если он будет проходить через минимальное количество веток.

Помогите Бернарду определить это минимальное количество для заданных станций отправления и назначения.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Далее следуют описания наборов.

Первая строка набора содержит целые числа \(n\) и \(m\) (\(2 \le n \le 2 \cdot 10^5, 1 \le m \le 2 \cdot 10^5\)) — количество станций метро и количество прямых маршрутов между станциями (то есть ребер графа).

Далее следует \(m\) строк — описание ребер. Каждая строка описания содержит три целых числа \(u\), \(v\) и \(c\) (\(1 \le u, v \le n, u \ne v, 1 \le c \le 2 \cdot 10^5\)) — номера вершин, между которыми есть ребро, и цвет этого ребра. Гарантируется, что ребра одного цвета образуют связный подграф заданного графа метро. Между каждой парой вершин не более одного ребра.

Далее следует два целых числа \(b\) и \(e\) (\(1 \le b, e \le n\)) — станции отправления и назначения.

Сумма всех \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\). Аналогично, сумма всех \(m\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите единственное целое число — минимальное количество веток, через которое может пройти маршрут от станции \(b\) до станции \(e\).

Примечание

Граф метро для первого примера приведен на рисунке в условии.

В первом наборе тестовых данных из вершины \(1\) в вершину \(3\) можно добраться по пути \(1 \rightarrow 2 \rightarrow 3\), воспользовавшись только зеленой веткой.

Во втором наборе тестовых данных из вершины \(1\) в вершину \(6\) можно добраться по пути \(1 \rightarrow 2 \rightarrow 3 \rightarrow 6\), воспользовавшись зеленой и синей веткой.

В третьем наборе тестовых данных из вершины \(6\) в ту же самую вершину не нужно ехать, поэтому количество веток равно \(0\).

В четвертом наборе тестовых данных все ребра графа принадлежат одной ветке, поэтому ответ \(1\).

D. Учимся рисовать

Бинарный поиск дп жадные алгоритмы поиск в глубину и подобное реализация сортировки Структуры данных *2100

Элси учится рисовать. У нее есть холст из \(n\) клеток, пронумерованных от \(1\) до \(n\), и она может раскрасить любое (возможно, пустое) подмножество клеток.

У Элси есть двумерный массив \(a\), который она будет использовать для оценки картин. Пусть максимальные непрерывные отрезки закрашенных клеток в картине равны \([l_1,r_1],[l_2,r_2],\ldots,[l_x,r_x]\). Красота картины — это сумма \(a_{l_i,r_i}\) по всем \(1 \le i \le x\). На изображении выше максимальные непрерывные отрезки закрашенных клеток равны \([2,4],[6,6],[8,9]\), а красота картины равна \(a_{2,4}+a_{6,6}+a_{8,9}\).

Всего есть \(2^n\) различных способов раскрасить холст. Помогите Элси найти \(k\) наибольших значений красоты картины, которые она может получить, среди всех способов. Обратите внимание, что эти \(k\) значений не обязательно должны быть различными. Гарантируется, что существует не менее \(k\) различных способов раскрасить холст.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 10^3\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит \(2\) целых числа \(n\) и \(k\) (\(1 \leq n \leq 10^3\), \(1 \leq k \leq \min(2^n, 5 \cdot 10^3)\)) — количество клеток и количество наибольших значений красоты картины, которые вы должны найти.

Следующие \(n\) строк каждого набора входных данных описывают двумерный массив \(a\), \(i\)-я строка содержит \(n-i+1\) целых чисел \(a_{i,i},a_{i,i+1},\ldots,a_{i,n}\) (\(-10^6 \leq a_{i,j} \leq 10^6\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^3\), а сумма \(k\) по всем наборам входных данных не превосходит \(5 \cdot 10^3\).

Выходные данные

Для каждого набора входных данных выведите в отдельной строке \(k\) целых чисел: \(i\)-е из них должно равняться \(i\)-му наибольшему значение красоты картины, которое может получить Элси.

Примечание

В первом наборе входных данных Элси может либо закрасить единственную клетку, либо не закрашивать ее. Если она раскрасит единственную клетку, красота картины составит \(-5\). Если она решит не раскрашивать ее, красота картины составит \(0\). Таким образом, наибольшая красота, которую она может получить, равна \(0\), а вторая по величине красота, которую она может получить, равна \(-5\).

Ниже приведена иллюстрация третьего набора входных данных.

C. Циркуль для дерева

Деревья жадные алгоритмы Конструктив поиск в глубину и подобное *2300

Вам дано дерево с \(n\) вершинами, пронумерованными \(1, 2, \ldots, n\). Изначально все вершины окрашены в белый цвет.

Вы можете выполнить следующую двухэтапную операцию:

  1. Выбрать вершину \(v\) (\(1 \leq v \leq n\)) и расстояние \(d\) (\(0 \leq d \leq n-1\)).
  2. Для всех вершин \(u\) (\(1 \leq u \leq n\)) таких, что \(\text{dist}^\dagger(u,v)=d\), покрасить \(u\) в черный цвет.

Постройте последовательность операций для перекрашивания всех вершин дерева в черный цвет, используя минимально возможное количество операций. Можно показать, что это всегда можно сделать, используя не более \(n\) операций.

\(^\dagger\) \(\text{dist}(x, y)\) обозначает количество ребер на (единственном) простом пути между вершинами \(x\) и \(y\) на дереве.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 200\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

В первой строке каждого набора входных данных находится одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^3\)) — количество вершин дерева.

Следующие \(n - 1\) строк каждого набора входных данных описывают ребра дерева. В \(i\)-й из этих строк содержатся два целых числа \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\), \(u_i \neq v_i\)) — индексы вершин, соединенных \(i\)-м ребром.

Гарантируется, что заданные ребра образуют дерево.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^3\).

Выходные данные

Для каждого набора входных данных сначала выведите одно целое число \(op\) \((1 \le op \le n)\) — минимальное количество операций, необходимых для перекрашивания всех вершин дерева в черный цвет.

Затем выведите \(op\) строк, каждая из которых содержит \(2\) целых числа. В \(i\)-й строке должны содержаться значения \(v\) и \(d\), выбранные для \(i\)-й операции (\(1 \le v \le n\), \(0 \le d \le n - 1\)).

Необходимо, чтобы в результате \(op\) операций все вершины были покрашены в черный цвет.

Если существует несколько решений, вы можете вывести любое из них.

Примечание

В первом наборе входных данных существует только одна возможная операция, и ее выполнение дает правильный ответ.

Во втором наборе входных данных первая операция перекрашивает вершину \(2\) в черный цвет, а вторая операция перекрашивает вершину \(1\) в черный цвет. Можно показать, что за одну операцию невозможно перекрасить обе вершины в черный цвет, поэтому минимальное количество необходимых операций равно \(2\). Другим возможным решением является использование \(2\) операций: \((u, r) = (1, 0)\) и \((u, r) = (2, 0)\).

В третьем наборе входных данных первая операция перекрашивает вершины \(2\), \(3\) и \(4\) в черный цвет, а вторая операция перекрашивает вершину \(1\) в черный цвет. Опять же, можно показать, что за \(1\) операцию невозможно перекрасить все вершины в черный цвет, поэтому минимальное количество необходимых операций равно \(2\).

В четвертом наборе входных данных первая операция перекрашивает вершины \(4\), \(1\) и \(7\) в черный цвет, вторая операция перекрашивает вершины \(2\), \(5\) и \(6\) в черный цвет, а третья операция перекрашивает вершины \(3\) и \(7\) в черный цвет. Обратите внимание, что вершину \(7\) разрешено перекрашивать в черный цвет дважды.

Таким образом, каждая вершина была перекрашена хотя бы один раз, причем вершина \(7\) была перекрашена дважды. Можно показать, что невозможно перекрасить все вершины в черный цвет менее чем за \(3\) хода.

F. Никто не нужен

2-sat дп поиск в глубину и подобное Структуры данных *2500

Олег в подарок на день рождения получил перестановку \(a\) длины \(n\).

Друг Олега Нечипор задает Олегу \(q\) вопросов, каждый вопрос характеризуется двумя числами \(l\) и \(r\), в ответ на вопрос Олег должен сказать количество наборов индексов \((t_1, t_2, \ldots, t_k)\) произвольной длины \(k \ge 1\) таких, что:

  • \(l \le t_i \le r\) для каждого \(i\) от \(1\) до \(k\).
  • \(t_i < t_{i+1}\) для каждого \(i\) от \(1\) до \(k-1\).
  • \(a_{t_{i+1}}\) делится на \(a_{t_i}\) для каждого \(i\) от \(1\) до \(k-1\).

Помогите Олегу и ответьте на все вопросы Нечипора.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(q\) (\(1 \le n, q \le 10^6\)) — длина перестановки и количество вопросов Нечипора.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le n\)) — сама перестановка \(a\).

В каждой из следующих \(q\) строк каждого набора входных данных содержатся два целых числа \(l\) и \(r\) (\(1 \le l \le r \le n\)) — очередной вопрос Нечипора.

Гарантируется, что сумма значений \(n\) и сумма значений \(q\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

Для каждого набора входных данных выведите ответы на все вопросы Нечипора.

Примечание

Все подходящие массивы в первом наборе входных данных: (\(1\)), (\(2\)), (\(3\)), (\(4\)), (\(5\)), (\(6\)), (\(7\)), (\(8\)), (\(1, 3\)), (\(1, 6\)), (\(1, 7\)), (\(1, 6, 7\)), (\(2, 3\)), (\(2, 4\)), (\(2, 5\)), (\(2, 6\)), (\(2, 7\)), (\(2, 8\)), (\(2, 6, 7\)), (\(6, 7\)).

Все подходящие массивы в четвертом наборе входных данных: (\(1\)), (\(2\)), (\(3\)), (\(4\)), (\(5\)), (\(6\)), (\(7\)), (\(8\)), (\(1, 2\)), (\(1, 3\)), (\(1, 4\)), (\(1, 5\)), (\(1, 6\)), (\(1, 7\)), (\(1, 8\)), (\(1, 2, 4\)), (\(1, 2, 6\)), (\(1, 2, 8\)), (\(1, 2, 4, 8\)), (\(1, 3, 6\)), (\(1, 4, 8\)), (\(2, 4\)), (\(2, 6\)), (\(2, 8\)), (\(2, 4, 8\)), (\(3, 6\)), (\(4, 8\)).

C. Стрелочный путь

графы дп Конструктив кратчайшие пути Перебор поиск в глубину и подобное *1300

Задано поле, состоящее из \(2\) строк и \(n\) столбцов. Строки нумеруются от \(1\) до \(2\) сверху вниз. Столбцы нумеруются от \(1\) до \(n\) слева направо. Каждая клетка поля содержит стрелку, указывающую либо влево, либо вправо. Ни одна стрелка не указывает за пределы поля.

Есть робот, который начинает в клетке \((1, 1)\). Каждую секунду происходят следующие два действия одно за другим:

  1. сначала робот двигается влево, вправо, вниз или вверх (он не может попытаться выйти за пределы поля и не может пропустить ход);
  2. затем он двигается по направлению стрелки, которая находится в текущей ячейке (в ячейке, в которой он окажется после своего хода).

Ваша задача — определить, может ли робот достичь клетки \((2, n)\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число (\(2 \le n \le 2 \cdot 10^5\)).

Вторая строка содержит строку, состоящую ровно из \(n\) символов < и/или > — первая строка поля.

Третья строка содержит строку, состоящую ровно из \(n\) символов < и/или > — вторая строка поля.

Дополнительные ограничения на входные данные:

  • \(n\) — четное число;
  • нет стрелок, указывающих за пределы поля;
  • сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).
Выходные данные

Для каждого набора входных данных выведите YES, если робот может достичь клетки \((2, n)\); в противном случае выведите NO.

Вы можете печатать каждую букву в любом регистре. Например, yes, Yes, YeS будут распознаны как положительный ответ.

Примечание

В первом примере один из возможных путей выглядит следующим образом: \((1, 1) \rightarrow (1, 2) \rightarrow (1, 3) \rightarrow (2, 3) \rightarrow (2, 4)\).

Во втором примере один из возможных путей выглядит следующим образом: \((1, 1) \rightarrow (2, 1) \rightarrow (2, 2)\).

В третьем примере нет способа достичь клетки \((2, 4)\).

В четвертом примере один из возможных путей выглядит следующим образом: \((1, 1) \rightarrow (2, 1) \rightarrow (2, 2) \rightarrow (1, 2) \rightarrow (1, 3) \rightarrow (2, 3) \rightarrow (2, 4) \rightarrow (2, 5) \rightarrow (2, 6)\).

A. Grove

геометрия дп Перебор поиск в глубину и подобное Теория вероятностей *3300

You want to plant trees in a square lawn of size \(n \times n\) whose corners have Cartesian coordinates \((0, 0)\), \((n, 0)\), \((0, n)\), and \((n, n)\). Trees can only be planted at locations with integer coordinates. Every tree will grow roots within a disk of radius \(r\) centered at the location where the tree was planted; such disks must be fully contained in the lawn (possibly touching the boundary of the lawn) and can only intersect each other on their boundaries.

Find a configuration that maximizes the number of trees.

Input

The first and only line contains an integer \(n\) (\(1 \leq n \leq 20\)) and a real number \(r\) (\(0 < r \leq n/2\)) — the length of the sides of the lawn, and the radius of the disks where each tree will grow roots. The real number \(r\) is given in decimal notation with at least \(1\) and at most \(3\) digits after the decimal point.

Output

In the first line, print the maximum number \(m\) of trees that can be planted.

In the next \(m\) lines, print a configuration that maximizes the number of trees. Specifically, in the \((i+1)\)-th line, print two integers \(x\) and \(y\) — the coordinates of the location where the \(i\)-th tree should be planted. You can print the trees in any order.

If there are multiple solutions, print any of them.

Note

For the first sample, the sample output is shown in the following figure. Note that this is not the only configuration that maximizes the number of trees.

For the second sample, the sample output is shown in the following figure. Note that this is not the only configuration that maximizes the number of trees.

C. Annual Ants' Gathering

Деревья дп жадные алгоритмы поиск в глубину и подобное *1900

Deep within a forest lies an ancient tree, home to \(n\) ants living in \(n\) tiny houses, indexed from \(1\) to \(n\), connected by the branches of the tree.

Once a year, all the ants need to gather to watch the EUC. For this, all ants move along the \(n-1\) branches of the tree they live on to meet at the home of one ant.

However, this year the ants could not agree on where to meet and need your help to gather up. You can tell all the ants currently at house \(u\) to move to house \(v\) if there is a branch directly connecting those two houses. However, the ants ignore your command if there are fewer ants gathered in house \(v\) than in house \(u\), i.e., if it would be easier for the ants from house \(v\) to move. This even holds true if no ant at all is currently in house \(v\). You can give this kind of commands as many times as you want.

Is it possible for you to gather all the ants in a single house?

Input

The first line contains one integer \(n\) (\(1\leq n\leq 200\,000\)) — the number of ant homes.

Each of the following \(n-1\) lines contains two integers \(u\) and \(v\) (\(1\leq u, v\leq n\)) — there is a branch directly connecting the house \(u\) and house \(v\). It is guaranteed that every ant can reach the house of any other ant just by following the branches of the tree.

Output

Print \(\texttt{YES}\) if it is possible to gather all the ants in a single house. Otherwise, print \(\texttt{NO}\).

Note

In the first sample, you can gather all the ants at house \(3\) as follows:

  • You tell to the ant at house \(4\) to move to house \(6\).
  • You tell to the ant at house \(2\) to move to house \(3\).
  • You tell to the two ants at house \(6\) to move to house \(3\) (which already contains two ants).
  • You tell to the ant at house \(5\) to move to house \(1\).
  • You tell to the ant at house \(7\) to move to house \(1\) (which already contains two ants).
  • You tell to the three ants at house \(1\) to move to house \(3\) (which already contains four ants).

In the second sample, it is impossible to gather all the ants in a single house.

I. Disks

геометрия графы Паросочетания поиск в глубину и подобное *1800

You are given \(n\) disks in the plane. The center of each disk has integer coordinates, and the radius of each disk is a positive integer. No two disks overlap in a region of positive area, but it is possible for disks to be tangent to each other.

Your task is to determine whether it is possible to change the radii of the disks in such a way that:

  • Disks that were tangent to each other remain tangent to each other.
  • No two disks overlap in a region of positive area.
  • The sum of all radii strictly decreases.
The new radii are allowed to be arbitrary positive real numbers. The centers of the disks cannot be changed.
Input

The first line contains an integer \(n\) (\(1\le n \le 1000\)) — the number of disks.

The next \(n\) lines contain three integers each. The \(i\)-th of such lines contains \(x_i\), \(y_i\) (\(-10^9 \leq x_i, y_i \leq 10^9\)), and \(r_i\) (\(1 \leq r_i \leq 10^9\)) — the coordinates of the center, and the radius, of the \(i\)-th disk.

Output

Print \(\texttt{YES}\) if it is possible to change the radii in the desired manner. Otherwise, print \(\texttt{NO}\).

Note

In the first sample, one can decrease the radii of the first and third disk by \(0.5\), and increase the radius of the second disk by \(0.5\). This way, the sum of all radii decreases by \(0.5\). The situation before and after changing the radii is depicted below.

First sample (left) and a valid way to change the radii of the disks (right).

In the second sample, depicted below, there is no way to change the radii of the disks in the desired manner.

Second sample.

G. Перемешивание песен

битмаски графы дп поиск в глубину и подобное реализация Строки хэши *1900

У Владислава есть плейлист, состоящий из \(n\) песен, пронумерованных от \(1\) до \(n\). Песня \(i\) имеет жанр \(g_i\) и автора \(w_i\). Он хочет составить плейлист таким образом, чтобы каждая пара соседних песен либо имела одного и того же автора, либо была из того же жанра (или и то, и другое). Он называет такой плейлист захватывающим. И \(g_i\), и \(w_i\) являются строками, длины не более \(10^4\).

Не всегда возможно составить захватывающий плейлист, используя все песни, поэтому процесс перемешивания происходит в два этапа. Сначала удаляются некоторое количество (возможно, нулевое) песен, а затем оставшиеся песни в плейлисте переставляются, чтобы сделать его захватывающим.

Поскольку Владислав не любит, когда песни удаляются из его плейлиста, он хочет, чтобы составление плейлиста выполнялось с минимальным количеством удалений. Помогите ему найти минимальное количество удалений, которые необходимо выполнить, чтобы можно было переставить оставшиеся песни, чтобы сделать плейлист захватывающим.

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество тестов. Затем следует описание тестов.

Первая строка каждого теста содержит одно целое число \(n\) (\(1 \le n \le 16\)) — количество песен в исходном плейлисте.

Затем следуют \(n\) строк, \(i\)-я из которых содержит две строки строчных букв \(g_i\) и \(w_i\) (\(1 \leq |g_i|, |w_i| \leq 10^4\)) — жанр и автор \(i\)-й песни. Где \(|g_i|\) и \(|w_i|\) — длины строк.

Сумма \(2^n\) по всем тестам не превышает \(2^{16}\).

Сумма \(|g_i| + |w_i|\) по всем наборам входных данных не превышает \(4 \cdot 10^5\).

Выходные данные

Для каждого теста выведите одно целое число — минимальное количество удалений, необходимых для того, чтобы получившийся плейлист можно было сделать захватывающим.

Примечание

В первом тесте плейлист уже захватывающий.

Во втором тесте, если у вас есть песни в порядке \(4, 3, 1, 2\), это захватывающий плейлист, поэтому вам не нужно удалять никакие песни.

В третьем тесте вы можете удалить песни \(4, 5, 6, 7\). Тогда плейлист с песнями в порядке \(1, 2, 3\) будет захватывающим.

G. Захват математиков

*особая задача Бинарный поиск математика поиск в глубину и подобное

Математик захватил мой компьютер, когда я готовил эту задачу, удалил условие и изменил примеры по своему усмотрению. Основное решение и формат ввода/вывода все еще верны, но примеры неверны.

Я частично исправил задачу, поэтому при отправке вашего решения оно будет тестироваться на правильной версии задачи. Однако я не могу исправить примеры ниже. Как computer scientist, можете ли вы решить правильную задачу?

Входные данные

Единственная строка ввода содержит вещественное число \(x\) (\(1 \leq x \leq 100\)), заданное с точностью до трех десятичных знаков.

Выходные данные

Выведите одно вещественное число — ответ. Ваш ответ считается правильным, если его абсолютная или относительная ошибка не превышает \(10^{-4}\). Формально, пусть ваш ответ будет \(a\), а ответ жюри будет \(b\). Ваш ответ принимается, если и только если \(\frac{|a-b|}{\max(1,|b|)} \le 10^{-4}\).

G. НОД на клетчатом поле

дп математика Перебор поиск в глубину и подобное реализация теория чисел *1900

Совсем недавно Егор узнал про алгоритм Евклида нахождения наибольшего общего делителя двух чисел. Наибольшим общим делителем двух чисел \(a\) и \(b\) называется наибольшее число, на которое \(a\) и \(b\) делятся без остатка. С помощью этих знаний Егор может решить задачу, которую он когда-то не решил.

У Василия есть клетчатое поле \(n\) строк на \(m\) столбцов, на пересечении \(i\)-й строки и \(j\)-го столбца находится число \({a_i}_j\). Егор хочет попасть из левого верхнего угла (на пересечении первой строки и первого столбца) в правый нижний угол (на пересечении последней строки и последнего столбца) и узнать, какой НОД у всех чисел на пути. Разрешается двигаться только вниз и вправо. Егор выписал несколько путей и получил разные значения НОД, ему стало интересно, какой максимальный НОД можно получить.

К сожалению, Егор устал считать НОД чисел и поэтому просит Вас помочь ему найти максимальный НОД чисел на пути из левого верхнего угла в правый нижний угол клетчатого поля.

Входные данные

В первой строке задано целое число \(t\) (\(1 \le t \le {10}^{4}\)) — количество наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 100\)) — количество строк и столбцов клетчатого поля.

Далее следует \(n\) строк, \(i\)-я строка содержит \(m\) целых чисел \((1 \le a_{i,j} \le {10}^{6}\)) — числа, записанные в \(i\)-й строке и \(j\)-м столбце клетчатого поля.

Гарантируется, что сумма \(n \cdot m\) не превосходит \(2 \cdot {10}^{5}\) по всем тестовым случаям.

Выходные данные

Для каждого набора входных данных в отдельной строке выведите максимальное возможный НОД на пути из клетки левой верхней клетки в правую нижнюю клетку.

F2. Несоответствие частот (сложная версия)

Бинарный поиск Деревья поиск в глубину и подобное Структуры данных Теория вероятностей хэши *2700

Это сложная версия задачи. Единственное отличие между версиями — ограничение на \(k\). Вы можете делать взломы, только если обе версии задачи решены.

Вам дано неориентированное дерево из \(n\) вершин. На каждой вершине \(v\) записано значение \(a_v\). Вы должны ответить на запросы, связанные с деревом.

Вам дано \(q\) запросов. В каждом запросе дается \(5\) целых чисел, \(u_1, v_1, u_2, v_2, k\). Обозначим количество вершин со значением \(c\) на пути \(u_1 \rightarrow v_1\) как \(x_c\), а количество вершин со значением \(c\) на пути \(u_2 \rightarrow v_2\) как \(y_c\). Пусть существует \(z\) таких значений \(c\), что \(x_c \neq y_c\). Тогда выведите любые \(\min(z, k)\) таких значений в любом порядке.

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \leq n \leq 10^5\)) — количество вершин в дереве.

Следующая строка содержит \(n\) целых чисел, \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 10^5\)) — значения, записанные на каждой вершине дерева.

Затем следует \(n - 1\) строка. Каждая строка содержит два целых числа \(u\) и \(v\) (\(1 \leq u, v \leq n, u \neq v\)), обозначающие ребро дерева. Гарантируется, что заданные ребра образуют дерево.

Следующая строка содержит одно целое число \(q\) (\(1 \leq q \leq 10^5\)) — количество запросов.

Затем следуют \(q\) строк. Каждая строка содержит пять целых чисел \(u_1, v_1, u_2, v_2, k\) (\(1 \leq u_1, v_1, u_2, v_2 \leq n\), \(1 \leq k \leq 10\)).

Выходные данные

Для каждого запроса выведите ответ на отдельной строке. Для каждого запроса сначала выведите \(\min(z, k)\), а затем в той же строке выведите любые \(\min(z, k)\) значений, которые встречаются разное количество раз на путях, в любом порядке.

Примечание

Для \(1\) запроса первый путь: \(1 \rightarrow 2 \rightarrow 4\), на котором встречается мультинабор значений \(\{5, 2, 4\}\). На втором пути \(4 \rightarrow 2 \rightarrow 5\) мы имеем мультинабор \(\{4, 2, 3\}\). Два числа — \(3\) и \(5\) встречаются разное количество раз, поэтому мы выводим оба числа.

Во \(2\) запросе пути совпадают, поэтому выводим \(0\).

В \(3\) запросе у нас те же пути, что и в запросе \(1\), но нам нужно вывести только \(1\) значение, поэтому мы выводим \(5\).

В \(4\) запросе первый путь — только вершина \(5\), что приводит к мультинабору \(\{3\}\), а второй путь — \(4 \rightarrow 2 \rightarrow 1 \rightarrow 3\) дает \(\{4, 2, 5, 3\}\). Числа \(5\), \(2\) и \(4\) встречаются разное количество раз.

B. Бесконечный лабиринт

графы поиск в глубину и подобное *2000

Имеется прямоугольный лабиринт размером n × m клеток, каждая из которых либо проходима, либо является стеной (непроходима). Маленький мальчик нашел этот лабиринт и циклически замостил им плоскость таким образом, что плоскость стала бесконечным лабиринтом. Теперь клетка (x, y) этой плоскости является стеной тогда и только тогда, когда клетка является стеной.

Под в этой задаче понимается остаток от деления числа a на число b.

Маленький мальчик встал в некоторую клетку плоскости и интересуется, может ли он удалиться от своего стартового расположения на бесконечно большое расстояние. Из клетки (x, y) он может перемещаться в одну из клеток (x, y - 1), (x, y + 1), (x - 1, y) и (x + 1, y), если эта клетка не является стеной.

Входные данные

В первой строке записаны через пробел два целых числа n и m (1 ≤ n, m ≤ 1500) — высота и ширина лабиринта, которым маленький мальчик циклически замостил плоскость.

В следующих n строках записано по m символов — описание лабиринта. Каждый символ равен либо «#», что означает стену, либо «.», что означает проходимый участок, либо «S», что означает стартовую позицию маленького мальчика.

Стартовая позиция является проходимым участком. Гарантируется, что символ «S» присутствует во входных данных ровно один раз.

Выходные данные

Выведите «Yes» (без кавычек), если маленький мальчик сможет удалиться от своего первоначального расположения на бесконечно большое расстояние, и «No» (без кавычек) иначе.

Примечание

В первом примере маленький мальчик может бесконечно долго идти вверх, так как существует «сквозной» проход снизу вверх. Для этого надо бесконечно повторять последовательность шагов «вверх, вверх, влево, вверх, вверх, вправо, вверх».

Во втором примере проход снизу вверх закрыт. Выйти за пределы лабиринта влево тоже не получается — в следующей «копии» лабиринта маленький мальчик попадает в тупик.

D. Длинный путь к неубыванию

Бинарный поиск графы кратчайшие пути поиск в глубину и подобное реализация *2800

Малышка R — волшебница, которая любит неубывающие массивы. У нее есть массив длины \(n\), изначально равный \(a_1, \ldots, a_n\), в котором каждый элемент — целое число в диапазоне \([1, m]\). Она хочет, чтобы он стал неубывающим, то есть выполнялось \(a_1 \leq a_2 \leq \ldots \leq a_n\).

Для этого она может проделать несколько фокусов. У малышки R есть фиксированный массив \(b_1\ldots b_m\) длины \(m\). Формально определим фокус как процедуру, которая выполняет следующие действия по порядку:

  • Выбрать множество \(S \subseteq \{1, 2, \ldots, n\}\).
  • Для каждого \(u \in S\) присвоить \(a_u\) значение \(b_{a_u}\).

Малышка R задается вопросом, сколько нужно сделать фокусов, чтобы исходный массив стал неубывающим. Если это невозможно ни при каком количестве фокусов, выведите вместо этого \(-1\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1\le t\le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1\leq n \leq 10^6\), \(1 \leq m \leq 10^6\)) — длину исходного массива и диапазон элементов в массиве.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, \ldots, a_n\) (\(1 \leq a_i \leq m\)) — изначальный массив.

Третья строка каждого набора входных данных содержит \(m\) целых чисел \(b_1, \ldots, b_m\) (\(1 \leq b_i \leq m\)) — фиксированный магический массив.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^6\), и сумма \(m\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

Для каждого набора входных данных выведите одно целое число: минимально необходимое количество фокусов или \(-1\), если невозможно сделать \(a_1, \ldots, a_n\) неубывающим.

Примечание

В первом наборе входных данных изначальный массив \(a_1, \ldots, a_n\) равен \([1, 6, 3, 7, 1]\). Вы можете выбрать \(S\) следующим образом:

  • первый фокус: \(S = [2, 4, 5]\), \(a = [1, 1, 3, 5, 2]\);
  • второй фокус: \(S = [5]\), \(a = [1, 1, 3, 5, 3]\);
  • третий фокус: \(S = [5]\), \(a = [1, 1, 3, 5, 5]\).
Таким образом, с помощью \(3\) фокусов можно сделать \(a_1, \ldots, a_n\) неубывающим. Можно показать, что это минимально возможное количество фокусов.

Во втором наборе входных данных невозможно сделать \(a_1, \ldots, a_n\) неубывающим.

D. Игра в перестановке

графы жадные алгоритмы игры математика Перебор поиск в глубину и подобное *1300

Бодя и Саша нашли перестановку \(p_1,\dots,p_n\) и массив \(a_1,\dots,a_n\). Они решили сыграть в известную игру в перестановке.

Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)).

Каждый из них выбрал стартовую позицию в перестановке.

Игра длится \(k\) ходов. Игроки делают ходы одновременно. На каждом ходу с каждым игроком происходит две вещи:

  • Если текущая позиция игрока \(x\), его счет увеличивается на \(a_x\).
  • Затем игрок либо остается на своей текущей позиции \(x\), либо перемещается с \(x\) на \(p_x\).
Победителем игры становится игрок с более высоким счетом после ровно \(k\) ходов.

Зная стартовую позицию Боди \(P_B\) и стартовую позицию Саши \(P_S\), определите, кто выигрывает в игре, если оба игрока пытаются победить.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1\le t\le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит целые числа \(n\), \(k\), \(P_B\), \(P_S\) (\(1\le P_B,P_S\le n\le 2\cdot 10^5\), \(1\le k\le 10^9\)) — длина перестановки, продолжительность игры, стартовые позиции соответственно.

Следующая строка содержит \(n\) целых чисел \(p_1,\dots,p_n\) (\(1 \le p_i \le n\)) — элементы перестановки \(p\).

Следующая строка содержит \(n\) целых чисел \(a_1,\dots,a_n\) (\(1\le a_i\le 10^9\)) — элементы массива \(a\).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите:

  • «Bodya», если Бодя выигрывает игру.
  • «Sasha», если Саша выигрывает игру.
  • «Draw», если у игроков одинаковый счет.
Примечание

Ниже вы можете найти объяснение для первого набора входных данных, где игра состоит из \(k=2\) ходов.

ХодПозиция БодиОчки БодиХод БодиПозиция СашиОчки СашиХод Саши
первый\(3\)\(0 + a_3 = 0 + 5 = 5\)остаётся в текущей позиции\(2\)\(0 + a_2 = 0 + 2 = 2\)переходит в \(p_2=1\)
второй\(3\)\(5 + a_3 = 5 + 5 = 10\)остаётся в текущей позиции\(1\)\(2 + a_1 = 2 + 7 = 9\)остаётся в текущей позиции
конечный результат\(3\)\(10\)\(1\)\(9\)

Как мы видим, счет Боди больше, поэтому он выигрывает игру. Можно показать, что Бодя всегда может выиграть эту игру.

C2. Game on Tree (Medium)

Деревья дп игры поиск в глубину и подобное *1700

This is the medium version of the problem. The difference in this version is that \(t=1\) and we work on trees.

Ron and Hermione are playing a game on a tree of \(n\) nodes that are initially inactive. The game consists of \(t\) rounds, each of which starts with a stone on exactly one node, which is considered as activated. A move consists of picking an inactive neighbor of the node with a stone on it and moving the stone there (thus activating this neighbor). Ron makes the first move, after which he alternates with Hermione until no valid move is available. The player that cannot make a move loses the round. If both players play optimally, who wins each round of this game?

Note that all the rounds are played with the same tree; only the starting node changes. Moreover, after each round, all active nodes are considered inactive again.

Input

The first line contains integers \(n\) (\(2 \leq n \leq 2\times 10^5\)), \(t\) (\(t=1\)), the number of nodes in the tree and the number of rounds, respectively.

The next \(n-1\) lines contain two integers \(1 \leq u, v \leq n\) each, corresponding to an edge of the tree.

The next line contains \(t\) integers \(1 \leq u_1 , \dots, u_t \leq n\), corresponding to the node where the stone is initially put.

Output

The output consists of \(t=1\) line which is either "Ron" or "Hermione".

C3. Game on Tree (Hard)

Деревья дп игры поиск в глубину и подобное *1900

This is the hard version of the problem. The only difference in this version is the constraint on \(t\).

Ron and Hermione are playing a game on a tree of \(n\) nodes that are initially inactive. The game consists of \(t\) rounds, each of which starts with a stone on exactly one node, which is considered as activated. A move consists of picking an inactive neighbor of the node with a stone on it and moving the stone there (thus activating this neighbor). Ron makes the first move, after which he alternates with Hermione until no valid move is available. The player that cannot make a move loses the round. If both players play optimally, who wins each round of this game?

Note that all the rounds are played with the same tree; only the starting node changes. Moreover, after each round, all active nodes are considered inactive again.

Input

The first line contains integers \(n\) (\(2 \leq n \leq 2\times 10^5\)), \(t\) (\(1 \leq t \leq n\)), the number of nodes in the tree and the number of rounds, respectively.

The next \(n-1\) lines contain two integers \(1 \leq u, v \leq n\) each, corresponding to an edge of the tree.

The next line contains \(t\) integers \(1 \leq u_1 , \dots , u_t \leq n\), corresponding to the node where the stone is initially put.

Output

The output consists of \(t\) lines, each line being either "Ron" or "Hermione".

G1. Min-Fund Prison (Easy)

Деревья поиск в глубину и подобное *1900

In the easy version, \(m = n-1\) and there exists a path between \(u\) and \(v\) for all \(u, v\) (\(1 \leq u, v \leq n\)).

After a worker's strike organized by the Dementors asking for equal rights, the prison of Azkaban has suffered some damage. After settling the spirits, the Ministry of Magic is looking to renovate the prison to ensure that the Dementors are kept in check. The prison consists of \(n\) prison cells and \(m\) bi-directional corridors. The \(i^{th}\) corridor is from cells \(u_i\) to \(v_i\). A subset of these cells \(S\) is called a complex if any cell in \(S\) is reachable from any other cell in \(S\). Formally, a subset of cells \(S\) is a complex if \(x\) and \(y\) are reachable from each other for all \(x, y \in S\), using only cells from \(S\) on the way. The funding required for a complex \(S\) consisting of \(k\) cells is defined as \(k^2\).

As part of your Intro to Magical Interior Design course at Hogwarts, you have been tasked with designing the prison. The Ministry of Magic has asked that you divide the prison into \(2\) complexes with \(\textbf{exactly one corridor}\) connecting them, so that the Dementors can't organize union meetings. For this purpose, you are allowed to build bi-directional corridors. The funding required to build a corridor between any \(2\) cells is \(c\).

Due to budget cuts and the ongoing fight against the Death Eaters, you must find the \(\textbf{minimum total funding}\) required to divide the prison as per the Ministry's requirements or \(-1\) if no division is possible.

Note: The total funding is the sum of the funding required for the \(2\) complexes and the corridors built. If after the division, the two complexes have \(x\) and \(y\) cells respectively and you have built a total of \(a\) corridors, the total funding will be \(x^2 + y^2 + c \times a\). Note that \(x+y=n\).

Input

The first line contains one integer \(t\) (\(1 \leq t \leq 10^5\)) — the number of test cases. Then \(t\) test cases follow.

The first line of each test case consists of three integers \(n, m\) and \(c\) (\(2 \leq n \leq 10^5\), \(m = n - 1\), \(1 \leq c \leq 10^9\))

\(m\) lines follow, each consisting of 2 integers — \(u_i, v_i\) indicating a corridor is present between cells \(u_i\) and \(v_i\) (\(1 \leq u_i, v_i \leq n\), \(u_i \neq v_i\))

It is guaranteed that the sum of \(n\) over all test cases does not exceed \(10^5\).

It is guaranteed that the sum of \(m\) over all test cases does not exceed \(5 \times 10^5\).

It is guaranteed that there exists at most one corridor between any two cells.

Output

Print the \(\textbf{minimum funding}\) required to divide the prison as per the Ministry's requirements or \(-1\) if no division is possible.

G2. Min-Fund Prison (Medium)

графы Деревья дп Перебор поиск в глубину и подобное *2200

In the medium version, \(2 \leq \sum n \leq 300\) and \(1 \leq \sum m \leq 300\)

After a worker's strike organized by the Dementors asking for equal rights, the prison of Azkaban has suffered some damage. After settling the spirits, the Ministry of Magic is looking to renovate the prison to ensure that the Dementors are kept in check. The prison consists of \(n\) prison cells and \(m\) bi-directional corridors. The \(i^{th}\) corridor is from cells \(u_i\) to \(v_i\). A subset of these cells \(S\) is called a complex if any cell in \(S\) is reachable from any other cell in \(S\). Formally, a subset of cells \(S\) is a complex if \(x\) and \(y\) are reachable from each other for all \(x, y \in S\), using only cells from \(S\) on the way. The funding required for a complex \(S\) consisting of \(k\) cells is defined as \(k^2\).

As part of your Intro to Magical Interior Design course at Hogwarts, you have been tasked with designing the prison. The Ministry of Magic has asked that you divide the prison into \(2\) complexes with \(\textbf{exactly one corridor}\) connecting them, so that the Dementors can't organize union meetings. For this purpose, you are allowed to build bi-directional corridors. The funding required to build a corridor between any \(2\) cells is \(c\).

Due to budget cuts and the ongoing fight against the Death Eaters, you must find the \(\textbf{minimum total funding}\) required to divide the prison as per the Ministry's requirements or \(-1\) if no division is possible.

Note: The total funding is the sum of the funding required for the \(2\) complexes and the corridors built. If after the division, the two complexes have \(x\) and \(y\) cells respectively and you have built a total of \(a\) corridors, the total funding will be \(x^2 + y^2 + c \times a\). Note that \(x+y=n\).

Input

The first line contains one integer \(t\) (\(1 \leq t \leq 300\)) — the number of test cases. Then \(t\) test cases follow.

The first line of each test case consists of three integers \(n, m\) and \(c\) (\(2 \leq n \leq 300\), \(1 \leq m \leq 300\), \(1 \leq c \leq 10^9\))

\(m\) lines follow, each consisting of 2 integers — \(u_i, v_i\) indicating a corridor is present between cells \(u_i\) and \(v_i\) (\(1 \leq u_i, v_i \leq n\), \(u_i \neq v_i\))

It is guaranteed that the sum of \(n\) over all test cases does not exceed \(300\).

It is guaranteed that the sum of \(m\) over all test cases does not exceed \(300\).

It is guaranteed that there exists at most one corridor between any two cells.

Output

Print the \(\textbf{minimum funding}\) required to divide the prison as per the Ministry's requirements or \(-1\) if no division is possible.

Note

In the first test case of the sample input, there is no way to divide the prison according to the Ministry's requirements.

In the second test case, consider the corridor between cells \(1\) and \(5\) as the connection between the \(2\) complexes consisting of \(\{2, 3, 5, 6\}\) and \(\{1, 4\}\) cells respectively. There are no new corridors built. The total funding is \(4^2 + 2^2 = 20\). You can verify this is the minimum funding required.

In the third test case, build a corridor between \(2\) and \(4\). Consider the corridor between cells \(1\) and \(5\) as the connection between the \(2\) complexes consisting of \(\{3, 5, 6\}\) and \(\{1, 2, 4\}\) cells respectively. The total funding is \(3^2 + 3^2 + 7 \times 1 = 25\). You can verify this is the minimum funding required.

In the fourth test case, build a corridor between \(2\) and \(4\) and between \(5\) and \(7\). Consider the corridor between cells \(5\) and \(7\) as the connection between the \(2\) complexes consisting of \(\{1, 2, 4, 7\}\) and \(\{3, 5, 6\}\) cells respectively. The total funding is \(4^2 + 3^2 + 4 \times 2 = 33\). You can verify this is the minimum funding required.

Note for all test cases that there may be multiple ways to get the same funding but there is no other division which will have a more optimal minimum funding.

G3. Min-Fund Prison (Hard)

битмаски графы Деревья дп поиск в глубину и подобное *2400

In the hard version, \(2 \leq \sum n \leq 10^5\) and \(1 \leq \sum m \leq 5 \times 10^{5}\)

After a worker's strike organized by the Dementors asking for equal rights, the prison of Azkaban has suffered some damage. After settling the spirits, the Ministry of Magic is looking to renovate the prison to ensure that the Dementors are kept in check. The prison consists of \(n\) prison cells and \(m\) bi-directional corridors. The \(i^{th}\) corridor is from cells \(u_i\) to \(v_i\). A subset of these cells \(S\) is called a complex if any cell in \(S\) is reachable from any other cell in \(S\). Formally, a subset of cells \(S\) is a complex if \(x\) and \(y\) are reachable from each other for all \(x, y \in S\), using only cells from \(S\) on the way. The funding required for a complex \(S\) consisting of \(k\) cells is defined as \(k^2\).

As part of your Intro to Magical Interior Design course at Hogwarts, you have been tasked with designing the prison. The Ministry of Magic has asked that you divide the prison into \(2\) complexes with \(\textbf{exactly one corridor}\) connecting them, so that the Dementors can't organize union meetings. For this purpose, you are allowed to build bi-directional corridors. The funding required to build a corridor between any \(2\) cells is \(c\).

Due to budget cuts and the ongoing fight against the Death Eaters, you must find the \(\textbf{minimum total funding}\) required to divide the prison as per the Ministry's requirements or \(-1\) if no division is possible.

Note: The total funding is the sum of the funding required for the \(2\) complexes and the corridors built. If after the division, the two complexes have \(x\) and \(y\) cells respectively and you have built a total of \(a\) corridors, the total funding will be \(x^2 + y^2 + c \times a\). Note that \(x+y=n\).

Input

The first line contains one integer \(t\) (\(1 \leq t \leq 10^5\)) — the number of test cases. Then \(t\) test cases follow.

The first line of each test case consists of three integers \(n, m\) and \(c\) (\(2 \leq n \leq 10^5\), \(1 \leq m \leq 5 \times 10^{5}\), \(1 \leq c \leq 10^9\))

\(m\) lines follow, each consisting of 2 integers — \(u_i, v_i\) indicating a corridor is present between cells \(u_i\) and \(v_i\) (\(1 \leq u_i, v_i \leq n\), \(u_i \neq v_i\))

It is guaranteed that the sum of \(n\) over all test cases does not exceed \(10^5\).

It is guaranteed that the sum of \(m\) over all test cases does not exceed \(5 \times 10^5\).

It is guaranteed that there exists at most one corridor between any two cells.

Output

Print the \(\textbf{minimum funding}\) required to divide the prison as per the Ministry's requirements or \(-1\) if no division is possible.

Note

In the first test case of the sample input, there is no way to divide the prison according to the Ministry's requirements.

In the second test case, consider the corridor between cells \(1\) and \(5\) as the connection between the \(2\) complexes consisting of \(\{2, 3, 5, 6\}\) and \(\{1, 4\}\) cells respectively. There are no new corridors built. The total funding is \(4^2 + 2^2 = 20\). You can verify this is the minimum funding required.

In the third test case, build a corridor between \(2\) and \(4\). Consider the corridor between cells \(1\) and \(5\) as the connection between the \(2\) complexes consisting of \(\{3, 5, 6\}\) and \(\{1, 2, 4\}\) cells respectively. The total funding is \(3^2 + 3^2 + 7 \times 1 = 25\). You can verify this is the minimum funding required.

In the fourth test case, build a corridor between \(2\) and \(4\) and between \(5\) and \(7\). Consider the corridor between cells \(5\) and \(7\) as the connection between the \(2\) complexes consisting of \(\{1, 2, 4, 7\}\) and \(\{3, 5, 6\}\) cells respectively. The total funding is \(4^2 + 3^2 + 4 \times 2 = 33\). You can verify this is the minimum funding required.

Note for all test cases that there may be multiple ways to get the same funding but there is no other division which will have a more optimal minimum funding.

F. Периметр круга

Бинарный поиск геометрия математика Перебор поиск в глубину и подобное реализация *1600

Дано целое число \(r\), найдите количество решетчатых точек, Евклидово расстояние от которых до \((0, 0)\) больше или равно \(r\), но строго меньше \(r+1\).

Решетчатая точка — это точка с целыми координатами. Евклидово расстояние от \((0, 0)\) до точки \((x,y)\) равно \(\sqrt{x^2 + y^2}\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Единственная строка каждого набора входных данных содержит одно целое число \(r\) (\(1 \leq r \leq 10^5\)).

Сумма \(r\) по всем наборам входных данных не превышает \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — количество решетчатых точек, расстояние от которых до \((0, 0)\) равно \(d\), где \(r \leq d < r+1\).

Примечание

Точки для первых трех наборов входных данных показаны ниже.

H. ±1

2-sat графы поиск в глубину и подобное *2100

У Боба есть таблица с \(3\) строками и \(n\) столбцами, в каждом из которых находится либо \(a_i\), либо \(-a_i\) для некоторого целого числа \(1 \leq i \leq n\). Например, одна из возможных сеток для \(n=4\) показана ниже:

\(\)\begin{bmatrix} a_1 & -a_2 & -a_3 & -a_2 \\ -a_4 & a_4 & -a_1 & -a_3 \\ a_1 & a_2 & -a_2 & a_4 \end{bmatrix}\(\)

Алиса и Боб играют в игру следующим образом:

  • Боб показывает Алисе свою сетку.
  • Алиса дает Бобу массив \(a_1, a_2, \dots, a_n\), который она выбирает, элементы которого либо \(\mathbf{-1}\), либо \(\mathbf{1}\).
  • Боб подставляет эти значения в свою сетку, чтобы получить сетку из \(-1\) и \(1\).
  • Боб сортирует элементы каждого столбца в неубывающем порядке.
  • Алиса выигрывает, если все элементы в средней строке равны \(1\); в противном случае выигрывает Боб.

Например, предположим, что Алиса дает Бобу массив \([1, -1, -1, 1]\) для приведенной выше сетки. Тогда произойдет следующее (цвета добавлены для ясности):

\(\)\begin{bmatrix} \color{red}{a_1} & \color{green}{-a_2} & \color{blue}{-a_3} & \color{green}{-a_2} \\ -a_4 & a_4 & \color{red}{-a_1} & \color{blue}{-a_3} \\ \color{red}{a_1} & \color{green}{a_2} & \color{green}{-a_2} & a_4 \end{bmatrix} \xrightarrow{[\color{red}{1},\color{green}{-1},\color{blue}{-1},1]} \begin{bmatrix} \color{red}{1} & \color{green}{1} & \color{blue}{1} & \color{green}{1} \\ -1 & 1 & \color{red}{-1} & \color{blue}{1} \\ \color{red}{1} & \color{green}{-1} & \color{green}{1} & 1 \end{bmatrix} \xrightarrow{\text{сортировка каждого столбца}} \begin{bmatrix} -1 & -1 & -1 & 1 \\ \mathbf{1} & \mathbf{1} & \mathbf{1} & \mathbf{1} \\ 1 & 1 & 1 & 1 \\ \end{bmatrix}\,. \(\) Поскольку средняя строка состоит только из \(1\), Алиса выигрывает.

Учитывая сетку Боба, определите, может ли Алиса выбрать массив \(a\) и выиграть игру.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(2 \leq n \leq 500\)) — количество столбцов сетки Боба.

Следующие три строки содержат по \(n\) целых чисел, \(i\)-я из которых содержит \(g_{i,1}, g_{i,2}, \dots, g_{i,n}\) (\(-n \leq g_{i,j} \leq n\), \(g_{i,j} \neq 0\)), представляющих сетку Боба.

Если ячейка \(x > 0\) присутствует во входных данных, то эта ячейка в сетке Боба должна содержать \(a_x\); если \(x < 0\) присутствует во входных данных, то эта ячейка в сетке Боба должна содержать \(-a_{-x}\). Для лучшего понимания смотрите пример ввода и примечание.

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если Алиса может выиграть, и «NO» (без кавычек) в противном случае.

Вы можете выводить «YES» и «NO» в любом регистре (например, строки «yEs», «yes», и «Yes» будут распознаны как положительный ответ).

Примечание

Первый пример описан в условии.

Во втором примере сетка Боба выглядит следующим образом:

\(\)\begin{bmatrix} a_1 & a_2 \\ -a_1 & -a_2 \\ a_2 & -a_2 \end{bmatrix}\(\)

Чтобы в последнем столбце была \(1\) в средней строке после сортировки, Алиса должна выбрать \(a_2 = -1\). Однако тогда невозможно выбрать \(a_1\) так, чтобы первый столбец имел \(1\) в средней строке после сортировки. Таким образом, Алиса не может выиграть.

В третьем примере Алиса может выбрать \(a = [1,1,1,1,1]\).

D. Раскрасьте дерево

Деревья дп жадные алгоритмы кратчайшие пути Перебор поиск в глубину и подобное *1700

У 378QAQ есть дерево с \(n\) вершинами. Изначально все вершины белые.

На дереве есть две шахматные фигуры с названиями \(P_A\) и \(P_B\). \(P_A\) и \(P_B\) изначально расположены на вершинах \(a\) и \(b\) соответственно. За один шаг 378QAQ выполняет следующие действия по порядку:

  1. Переместить \(P_A\) в соседнюю вершину. Если вершина, в которую переместилась фигура, белая, то перекрасить эту вершину в красный цвет.
  2. Переместить \(P_B\) в соседнюю вершину. Если вершина, в которую переместилась фигура, красная, то перекрасить эту вершину в синий цвет.

Изначально вершина \(a\) окрашена в красный цвет. Если \(a=b\), то вместо этого вершина \(a\) окрашена в синий цвет. Обратите внимание, что на каждом шаге обе шахматные фигуры должны быть перемещены. Две фигуры могут находиться в одной вершине в любой момент времени.

378QAQ хочет узнать минимальное количество шагов, которое требуется, чтобы покрасить все вершины в синий цвет.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1\leq t\leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1\leq n\leq 2\cdot 10^5\)).

Вторая строка каждого набора входных данных содержит два целых числа \(a\) и \(b\) (\(1\leq a,b\leq n\)).

Затем следует \(n - 1\) строка, каждая из которых содержит два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i,y_i \le n\)), обозначающие ребро между вершинами \(x_i\) и \(y_i\). Гарантируется, что данные ребра образуют дерево.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите минимальное количество шагов, которое требуется, чтобы покрасить все вершины в синий цвет.

Примечание

В первом наборе входных данных 378QAQ может покрасить все вершины в синий цвет следующим образом:

  • Изначально \(P_A\) находится в вершине \(1\), а \(P_B\) — в вершине \(2\). Вершина \(1\) окрашена в красный цвет, а вершина \(2\) — в белый.
  • 378QAQ перемещает \(P_A\) в вершину \(2\) и красит ее в красный цвет. Затем 378QAQ перемещает \(P_B\) в вершину \(1\) и красит её в синий цвет.
  • 378QAQ перемещает \(P_A\) в вершину \(1\). Затем 378QAQ перемещает \(P_B\) в вершину \(2\) и закрашивает её синим цветом.

E. Цепные запросы

Бинарный поиск Деревья поиск в глубину и подобное реализация Структуры данных *2100

Вам дано дерево из \(n\) вершин, пронумерованных от \(1\) до \(n\). Изначально все вершины окрашены в белый или черный цвет.

Вам предлагается выполнить \(q\) запросов:

  • «u» — поменять цвет вершины \(u\) (если она была белой, то поменять на черную и наоборот).

После каждого запроса вы должны ответить, образуют ли все черные вершины цепочку. То есть существуют ли две черные вершины такие, что простой путь между ними проходит через все черные вершины и только через черные вершины. В частности, если существует только одна черная вершина, то она образует цепочку. Если черных вершин нет, то они не образуют цепочку.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1\leq t\leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(q\) (\(1\leq n,q\leq 2\cdot 10^5\)).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(c_1,c_2,\ldots,c_n\) (\(c_i \in \{ \mathtt{0}, \mathtt{1} \}\)) — изначальные цвета вершин. \(c_i\) обозначает цвет вершины \(i\), где \(\mathtt{0}\) обозначает белый цвет, а \(\mathtt{1}\) — черный.

Далее следует \(n - 1\) строка, каждая из которых содержит по два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i,y_i \le n\)), обозначающих ребро между вершинами \(x_i\) и \(y_i\). Гарантируется, что эти ребра образуют дерево.

Следующие \(q\) строк содержат по одному целому числу \(u_i\) (\(1 \le u_i \le n\)), указывающему на то, что цвет вершины \(u_i\) необходимо поменять.

Гарантируется, что и сумма \(n\), и сумма \(q\) по всем наборам входных данных не превосходят \(2\cdot 10^5\).

Выходные данные

Для каждого запроса выведите «Yes», если черные вершины образуют цепочку, и «No» в противном случае.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

Во втором наборе входных данных цвета вершин следующие:

Исходное дерево:

Первый запрос меняет цвет вершины \(4\):

Второй запрос меняет цвет вершины \(3\):

Третий запрос меняет цвет вершины \(2\):

Четвертый запрос меняет цвет вершины \(5\):

F. Множество

битмаски дп Комбинаторика математика Перебор поиск в глубину и подобное разделяй и властвуй *2600

Определим бинарное кодирование конечного множества целых неотрицательных чисел \(T \subseteq \{0,1,2,\ldots\}\) как \(f(T) = \sum\limits_{i \in T} 2^i\). Например, \(f(\{0,2\}) = 2^0 + 2^2 = 5\) и \(f(\{\}) = 0\). Обратите внимание, что \(f\) — это биекция от всех таких множеств ко всем неотрицательным целым числам. Таким образом, \(f^{-1}\) также определено.

Дано целое число \(n\) и \(2^n-1\) множество \(V_1,V_2,\ldots,V_{2^n-1}\).

Найдите все множества \(S\), которые удовлетворяют следующим ограничениям:

  • \(S \subseteq \{0,1,\ldots,n-1\}\). Заметим, что \(S\) может быть пустым.
  • Для всех непустых \(T \subseteq \{0,1,\ldots,n-1\}\) выполнено \(|S \cap T| \in V_{f(T)}\).

Для экономии входные и выходные данные будут заданы в терминах двоичных кодировок множеств.

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \leq n \leq 20\)).

Вторая строка содержит \(2^n-1\) целое число \(v_1,v_2,\ldots,v_{2^n-1}\) (\(0 \leq v_i < 2^{n+1}\)) — множества \(V_i\), заданные их двоичными кодированиями, где \(V_i = f^{-1}(v_i)\).

Выходные данные

Первая строка вывода должна содержать целое число \(k\), обозначающее количество подходящих \(S\).

В следующих \(k\) строках вы должны вывести \(f(S)\) для всех подходящих \(S\) в порядке возрастания.

Примечание

В первом примере одним из возможных \(S\) является \(f^{-1}(3) = \{0,1\}\). Все непустые подмножества \(T \subseteq \{0,1,2\}\) и соответствующие им \(|S \cap T|\), \(f(T)\) и \(V_f(T)\) имеют следующий вид:

\(T\)\(|S\cap T|\)\(f(T)\)\(V_{f(T)}\)
\(\{0\}\)\(1\)\(1\)\(\{0,1,2,3\}\)
\(\{1\}\)\(1\)\(2\)\(\{0,1,2,3\}\)
\(\{2\}\)\(0\)\(4\)\(\{0,1,2,3\}\)
\(\{0,1\}\)\(2\)\(3\)\(\{0,1,2,3\}\)
\(\{0,2\}\)\(1\)\(5\)\(\{0,1,2,3\}\)
\(\{1,2\}\)\(1\)\(6\)\(\{0,1,2,3\}\)
\(\{0,1,2\}\)\(2\)\(7\)\(\{2,3\}\)

E. Разделяемые перестановки

Деревья жадные алгоритмы Комбинаторика математика поиск в глубину и подобное Структуры данных *2500

Изначально у нас был один массив — перестановка размера \(n\) (массив размера \(n\), где каждое целое число от \(1\) до \(n\) встречается ровно один раз).

Мы провели \(q\) операций. В ходе \(i\)-й операции мы сделали следующее:

  • выбрали любой из имеющихся у нас массивов размера хотя бы \(2\);
  • разделили его на две непустых части (префикс и суффикс);
  • записали два числа \(l_i\) и \(r_i\), где \(l_i\) — максимум в левой из полученных частей, а \(r_i\) — максимум в правой из полученных частей;
  • удалили массив, который мы разделили, из набора массивов, которые мы можем использовать, а вместо него добавили две полученных части массива.

Например, пусть изначально у нас был массив \([6, 3, 4, 1, 2, 5]\), и мы провели следующие операции:

  1. выбрали массив \([6, 3, 4, 1, 2, 5]\) и разделили его на \([6, 3]\) и \([4, 1, 2, 5]\). Затем мы записали \(l_1 = 6\) и \(r_1 = 5\), и в следующих операциях нам доступны массивы \([6, 3]\) и \([4, 1, 2, 5]\);
  2. выбрали массив \([4, 1, 2, 5]\) и разделили его на \([4, 1, 2]\) и \([5]\). Затем мы записали \(l_2 = 4\) и \(r_2 = 5\), и в следующих операциях нам доступны массивы \([6, 3]\), \([4, 1, 2]\) и \([5]\);
  3. выбрали массив \([4, 1, 2]\) и разделили его на \([4]\) и \([1, 2]\). Затем мы записали \(l_3 = 4\) и \(r_3 = 2\), и в следующих операциях нам доступны массивы \([6, 3]\), \([4]\), \([1, 2]\) и \([5]\).

Даны два целых числа \(n\) и \(q\), а также две последовательности \([l_1, l_2, \dots, l_q]\) и \([r_1, r_2, \dots, r_q]\). Перестановку размера \(n\) назовем подходящей, если можно провести на ней \(q\) операций и получить заданные последовательности \([l_1, l_2, \dots, l_q]\) и \([r_1, r_2, \dots, r_q]\).

Посчитайте количество подходящих перестановок.

Входные данные

В первой строке заданы два целых числа \(n\) и \(q\) (\(1 \le q < n \le 3 \cdot 10^5\)).

Во второй строке заданы \(q\) целых чисел \(l_1, l_2, \dots, l_q\) (\(1 \le l_i \le n\)).

В третьей строке заданы \(q\) целых чисел \(r_1, r_2, \dots, r_q\) (\(1 \le r_i \le n\)).

Дополнительное ограничение на входные данные: существует хотя бы одна перестановка, по которой можно получить заданные последовательности \([l_1, l_2, \dots, l_q]\) и \([r_1, r_2, \dots, r_q]\).

Выходные данные

Выведите одно целое число — количество подходящих перестановок, взятое по модулю \(998244353\).

F. Удаление мостов

Деревья дп жадные алгоритмы поиск в глубину и подобное сортировки Структуры данных *2800

Вам дано корневое дерево, состоящее из \(n\) вершин, пронумерованных от \(1\) до \(n\). Вершина \(1\) является корнем. Кроме того, у корня есть только один ребенок.

Требуется добавить ровно \(k\) рёбер в дерево (возможно, кратные рёбра и/или рёбра, уже существующие в дереве).

Напомним, что мост — это такое ребро, что после его удаления количество компонент связности в графе увеличивается. Таким образом, изначально все рёбра дерева являются мостами.

После добавления \(k\) рёбер некоторые изначальные рёбра дерева остаются мостами, а некоторые перестают ими быть. Необходимо удовлетворить два условия:

  • для каждого моста все рёбра дерева в поддереве нижней вершины этого моста также должны быть мостами;
  • количество мостов должно быть как можно меньше.

Решите задачу для всех значений \(k\) от \(1\) до \(n - 1\) и выведите наименьшее количество мостов.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(n\) (\(2 \le n \le 3 \cdot 10^5\)) — количество вершин дерева.

В каждой из следующих \(n - 1\) строк записаны два целых числа \(v\) и \(u\) (\(1 \le v, u \le n\)) — описание рёбер дерева. Гарантируется, что заданные рёбра образуют валидное дерево.

Дополнительное ограничение на входные данные: корень (вершина \(1\)) имеет ровно одного ребенка.

Сумма \(n\) по всем наборам входных данных не превышает \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(n - 1\) целое число. Для каждого \(k\) от \(1\) до \(n - 1\) выведите наименьшее количество мостов, которые могут остаться после добавления \(k\) рёбер в дерево.

F. Большой граф

графы поиск в глубину и подобное снм Структуры данных теория чисел *2400

Дан массив \(a\) длины \(n\). Построим квадратную матрицу \(b\) размера \(n \times n\), где в \(i\)-й строке записан массив \(a\), циклически сдвинутый на \((i - 1)\) вправо. Например, для массива \(a = [3, 4, 5]\) получается матрица

\(\)b = \begin{bmatrix} 3 & 4 & 5 \\ 5 & 3 & 4 \\ 4 & 5 & 3 \end{bmatrix}\(\)

Построим следующий граф:

  • Граф содержит \(n^2\) вершин, каждая из которых соответствует одному из элементов матрицы. Обозначим вершину, соответствующую элементу \(b_{i, j}\), как \((i, j)\).
  • Между вершинами \((i_1, j_1)\) и \((i_2, j_2)\) проведём ребро, если \(|i_1 - i_2| + |j_1 - j_2| \le k\) и \(\gcd(b_{i_1, j_1}, b_{i_2, j_2}) > 1\), где \(\gcd(x, y)\) обозначает наибольший общий делитель чисел \(x\) и \(y\).

Ваша задача — посчитать количество компонент связности\(^{\dagger}\) в полученном графе.

\(^{\dagger}\)Компонента связности графа — это множество некоторых вершин графа, в котором любая вершина достижима из любой по рёбрам, и добавление любой другой вершины в множество нарушает это правило.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(2 \le n \le 10^6\), \(2 \le k \le 2 \cdot 10^6\)) — длина массива и параметр \(k\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^6\)) — элементы массива \(a\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — количество компонент связности в полученном графе.

Примечание

В первом наборе входных данных матрица \(b\) приведена в условии. Первая компонента связности содержит вершины \((1, 1)\), \((2, 2)\) и \((3, 3)\). Вторая компонента связности содержит вершины \((1, 2)\), \((2, 3)\) и \((3, 1)\). Третья компонента связности содержит вершины \((1, 3)\), \((2, 1)\) и \((3, 2)\). Таким образом, в графе есть \(3\) компоненты связности.

Во втором наборе входных данных получается следующая матрица:

\(\)b = \begin{bmatrix} 3 & 4 & 9 \\ 9 & 3 & 4 \\ 4 & 9 & 3 \end{bmatrix}\(\)

Первая компонента связности содержит все вершины, соответствующие элементам со значениями \(3\) и \(9\). Вторая компонента связности содержит все вершины, соответствующие элементам со значением \(4\).

В четвёртом наборе входных данных все вершины находятся в одной компоненте связности.

G. Яся и таинственное дерево

битмаски графы Деревья жадные алгоритмы поиск в глубину и подобное Строки Структуры данных *2300

Яся гуляла по лесу и совершенно случайно нашла дерево на \(n\) вершинах. Дерево — это связный неориентированный граф, в котором отсутствуют циклы.

Рядом с деревом девочка нашла древний манускрипт, на котором записаны \(m\) запросов. Запросы бывают двух видов.

Первый вид запросов описывается числом \(y\). Вес каждого ребра в дереве заменяется на побитовое исключающее «ИЛИ» веса этого ребра и числа \(y\).

Второй вид описывается вершиной \(v\) и числом \(x\). Яся выбирает вершину \(u\) (\(1 \le u \le n\), \(u \neq v\)) и мысленно проводит в дереве двунаправленное ребро веса \(x\) из \(v\) в \(u\).

Затем Яся находит простой цикл в получившемся графе и считает побитовое исключающее «ИЛИ» от всех рёбер на нём. Она хочет выбрать такую вершину \(u\), чтобы посчитанное значение было максимально. Это посчитанное значение и будет ответом на запрос. Можно показать существование и единственность такого цикла в указанных ограничениях (независимо от выбора \(u\)). Если ребро между \(v\) и \(u\) уже существовало, простым циклом будет путь \(v \to u \to v\).

Обратите внимание, что запрос второго типа выполняется мысленно, то есть дерево после него никак не меняется.

Помогите Ясе ответить на все запросы.

Входные данные

В первой строке дано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Далее следуют описания наборов.

В первой строке каждого набора даны целые числа \(n\), \(m\) (\(2 \le n \le 2 \cdot 10^5\), \(1 \le m \le 2 \cdot 10^5\)) — количество вершин в дереве и количество запросов.

В следующих \(n - 1\) строках каждого набора даны целые числа \(v\), \(u\), \(w\) (\(1 \le v, u \le n\), \(1 \le w \le 10^9\)) — концы некоторого ребра в дереве и его вес.

Гарантируется, что заданный набор рёбер образует дерево.

В следующих \(m\) строках каждого набора описаны запросы:

  • ^ \(y\) (\(1 \le y \le 10^9\)) — параметр запроса первого типа;
  • ? \(v\) \(x\) (\(1 \le v \le n\), \(1 \le x \le 10^9\)) — параметры запроса второго типа.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\). То же самое гарантируется для \(m\).

Выходные данные

Для каждого набора входных данных выведите ответы на запросы второго типа.

D. Черепаха и умножение

графы Конструктив поиск в глубину и подобное теория чисел *2400

Черепаха только что научилась умножать два целых числа на уроке математики и была очень взволнована.

Затем Свинка дала ей целое число \(n\) и попросила построить последовательность \(a_1, a_2, \ldots, a_n\), состоящую из целых чисел, которые удовлетворяли бы следующим условиям:

  • Для всех \(1 \le i \le n\), \(1 \le a_i \le 3 \cdot 10^5\).
  • Для всех \(1 \le i < j \le n - 1\), \(a_i \cdot a_{i + 1} \ne a_j \cdot a_{j + 1}\).

Из всех таких последовательностей Пятачок попросил Черепаху найти ту, в которой будет минимальное количество различных элементов.

Черепаха определенно не смогла бы решить задачу, поэтому пожалуйста, помогите ей!

Входные данные

Каждый тест содержит несколько тестовых случаев. Первая строка содержит количество тестов \(t\) (\(1 \le t \le 10^4\)). Затем следует описание тестов.

Первая строка каждого теста содержит одно целое число \(n\) (\(2 \le n \le 10^6\)) — длина последовательности \(a\).

Гарантируется, что сумма \(n\) по всем тестовым случаям не превышает \(10^6\).

Выходные данные

Для каждого тестового случая выведите \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) — элементы последовательности \(a\).

Если существует несколько ответов, выведите любой из них.

Примечание

В третьем тестовом случае \(a = [3, 4, 2, 6]\) нарушает второе условие, так как \(a_1 \cdot a_2 = a_3 \cdot a_4\). \(a = [2, 3, 4, 4]\) удовлетворяет условиям, но количество различных элементов в нем не минимально.

H1. Максимизация наибольшей компоненты (простая версия)

графы Перебор поиск в глубину и подобное реализация снм Структуры данных *1700

Простая и сложная версии фактически представляют собой разные задачи, поэтому внимательно прочитайте условия обеих задач. Единственное различие между двумя версиями — это применяемая операция.

У Алекса есть матрица из \(n\) строк и \(m\) столбцов, состоящая из символов '.' и '#'. Набор '#' ячеек формирует компоненту связности, если из любой ячейки в этом наборе можно достичь любую другую ячейку в этом наборе, перемещаясь только в другую ячейку набора, которая имеет общую сторону. Размер компоненты связности — это количество ячеек в наборе.

За одну операцию Алекс выбирает любую строку \(r\) (\(1 \le r \le n\)) или любой столбец \(c\) (\(1 \le c \le m\)), затем устанавливает каждую ячейку в строке \(r\) или столбце \(c\) равной '#'. Помогите Алексу найти максимально возможный размер наибольшей компоненты связности из ячеек '#', который он может достичь после выполнения операции не более одного раза.

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(m\) (\(1 \le n \cdot m \le 10^6\)) — количество строк и столбцов матрицы.

Следующие \(n\) строк содержат по \(m\) символов. Каждый символ может быть '.' или '#'.

Гарантируется, что сумма \(n \cdot m\) по всем наборам не превышает \(10^6\).

Выходные данные

Для каждого теста выведите одно целое число — максимально возможный размер компоненты связности из ячеек '#', который может достичь Алекс.

Примечание

Во втором примере для Алекса оптимально установить все ячейки в столбце \(2\) равными '#'. Это приведет к тому, что наибольшая компонента связности из '#' будет иметь размер \(6\).

В третьем примере для Алекса оптимально установить все ячейки в строке \(2\) равными '#'. Это приведет к тому, что наибольшая компонента связности из '#' будет иметь размер \(9\).

В четвертом примере для Алекса оптимально установить все ячейки в строке \(4\) равными '#'. Это приведет к тому, что наибольшая компонента связности из '#' будет иметь размер \(11\).

H2. Максимизация наибольшей компоненты (сложная версия)

дп поиск в глубину и подобное реализация снм Структуры данных *2200

Простая и сложная версии фактически представляют собой разные задачи, поэтому внимательно прочитайте условия обеих задач. Единственное различие между двумя версиями — это применяемая операция.

У Алекса есть матрица из \(n\) строк и \(m\) столбцов, состоящая из символов '.' и '#'. Набор '#' ячеек формирует компоненту связности, если из любой ячейки в этом наборе можно достичь любую другую ячейку в этом наборе, перемещаясь только в другую ячейку набора, которая имеет общую сторону. Размер компоненты связности — это количество ячеек в наборе.

За одну операцию Алекс выбирает любую строку \(r\) (\(1 \le r \le n\)) и любой столбец \(c\) (\(1 \le c \le m\)), затем устанавливает каждую ячейку в строке \(r\) и столбце \(c\) равной '#'. Помогите Алексу найти максимально возможный размер наибольшей компоненты связности из ячеек '#', который он может достичь после выполнения операции не более одного раза.

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(m\) (\(1 \le n \cdot m \le 10^6\)) — количество строк и столбцов матрицы.

Следующие \(n\) строк содержат по \(m\) символов. Каждый символ может быть '.' или '#'.

Гарантируется, что сумма \(n \cdot m\) по всем наборам не превышает \(10^6\).

Выходные данные

Для каждого теста выведите одно целое число — максимально возможный размер связного компонента из ячеек '#', который может достичь Алекс.

Примечание

В четвертом тесте для Алекса оптимально установить все ячейки в строке \(4\) и столбце \(2\) равными '#'. Это приведет к наибольшей компоненте связности из ячеек '#' размером \(16\).

В пятом тесте для Алекса оптимально установить все ячейки в строке \(2\) и столбце \(4\) равными '#'. Это приведет к наибольшей компоненте связности из ячеек '#' размером \(22\).

F. Внеучебная задача

графы Деревья поиск в глубину и подобное *1900

Вам дан связный неориентированный граф, вершины которого пронумерованы целыми числами от \(1\) до \(n\). Ваша задача минимизировать количество пар вершин \(1 \leq u < v \leq n\), между которыми существует путь в этом графе. Для этого вы можете удалить ровно одно любое ребро из графа.

Найдите это наименьшее количество пар вершин!

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит единственное целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует их описание.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(2 \leq n \leq 10^5\), \(n - 1 \leq m \leq \min(10^5, \frac{n \cdot (n - 1)}{2})\)) — количество вершин в графе и количество ребер.

Каждая из следующих \(m\) строк содержит два целых числа \(u\) и \(v\) (\(1 \leq u, v \leq n, u \neq v\)), означающих, что в графе есть неориентированное ребро между вершинами \(u\) и \(v\).

Гарантируется, что данный граф связный и без кратных ребер.

Гарантируется, что сумма \(n\) и сумма \(m\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите наименьшее количество пар достижимых друг из друга вершин, если можно удалить ровно одно ребро.

Примечание

В первом наборе входных данных мы удалим единственное ребро \((1, 2)\) и единственная пара вершин \((1, 2)\) станет не достижима друг из друга.

Во втором наборе входных данных какое бы ребро мы не удалили, все вершины будут достижимы друг из друга.

В четвертом наборе входных данных так выглядит граф изначально.

Мы удалим ребро \((3, 4)\) и тогда достижимы друг из друга будут только пары вершин \((1, 2)\), \((1, 3)\), \((2, 3)\), \((4, 5)\), \((4, 6)\), \((5, 6)\).

В шестом наборе входных данных так выглядит граф изначально.

После удаления ребра \((2, 4)\) граф будет выглядеть следующим образом. Таким образом, будет \(21\) пара достижимых друг из друга вершин.

E. Прекрасное дерево!

Деревья жадные алгоритмы Перебор поиск в глубину и подобное снм Структуры данных *2000

Да благословят боги этот прекрасный ArrayForces!
Случайная галька

Дано дерево с \(n\) вершинами с корнем в вершине \(1\), в \(i\)-й вершине записано целое число \(a_i\).

Пусть \(L\) — это множество всех прямых сыновей\(^{\text{∗}}\) вершины \(v\). Назовём дерево прекрасным, если для всех вершин \(v\) с непустым \(L\) верно \(\)a_v \le \sum_{u \in L}{a_u}.\(\)

За одну операцию вы можете выбрать любую вершину \(v\) и увеличить значение \(a_v\) на \(1\).

Найдите минимальное количество операций, необходимых для того, чтобы сделать данное дерево прекрасным!

\(^{\text{∗}}\) Вершина \(u\) называется прямым сыном \(v\), если:

  • \(u\) и \(v\) соединены ребром, и
  • \(v\) лежит на (единственном) пути от \(u\) до корня дерева.
Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 5000\)) — количество вершин в дереве.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le 10^9\)) — значения, написанные на вершинах дерева.

Третья строка каждого набора входных данных содержит \(n - 1\) целых чисел \(p_2, p_3 , \ldots, p_n\) (\(1 \le p_i < i\)), каждое из которых означает, что в графе есть ребро между вершинами \(i\) и \(p_i\). Гарантируется, что данные ребра образуют дерево.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(5000\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество операций, необходимых для того, чтобы сделать данное дерево прекрасным!

Примечание

Дерево в первом наборе входных данных:

Вы можете применить операцию к вершине \(5\) и дважды к вершине \(2\), чтобы получить прекрасное дерево.

Во втором наборе входных данных вы можете два раза применить операцию к вершине \(2\), чтобы получить прекрасное дерево.

В третьих и четвёртых наборах входных данных дерево уже прекрасно, поэтому применять операций не надо.

D. Универсальный убийца монстров

Деревья дп Перебор поиск в глубину и подобное *2000

Вы, убийца монстров, хотите убить группу монстров. Монстры находятся в дереве с \(n\) вершинами. В вершине с номером \(i\) (\(1\le i\le n\)) находится монстр с \(a_i\) очками атаки. Вы хотите сражаться с монстрами в течение \(10^{100}\) раундов.

В каждом раунде происходит следующее по порядку:

  1. Все живые монстры атакуют вас. Ваше здоровье уменьшается на сумму очков атаки всех живых монстров.
  2. Вы выбираете некоторых (возможно, всех или ни одного) монстров и убиваете их. После убийства монстр больше не сможет совершать атаки в будущем.

Также есть следующее ограничение: за один раунд вы не можете убить двух монстров, находящихся в соединенных ребром вершинах.

Если вы оптимально выбираете, каких монстров атаковать на каждом шагу, на какую минимальную величину может уменьшиться ваше здоровье за все раунды?

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит количество тестов \(t\) (\(1 \le t \le 10^4\)). Затем следует описание наборов входных данных.

Первая строка каждого набора содержит целое число \(n\) (\(1\le n\le 3\cdot 10^5\)).

Вторая строка каждого набора содержит \(n\) целых чисел \(a_1,\ldots,a_n\) (\(1\le a_i\le 10^{12}\)).

Следующие \(n-1\) строк каждого набора содержат по два целых числа \(x,y\) (\(1\le x,y\le n\)), обозначающих ребро в дереве, соединяющее вершину \(x\) и \(y\).

Гарантируется, что сумма \(n\) по всем тестовым случаям не превышает \(3\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимально возможное уменьшение здоровья.

Примечание

В первом наборе оптимальная последовательность операций следующая:

  • В первом раунде: сначала получите атаку от монстра в вершине \(1\), поэтому ваше здоровье уменьшается на \(10^{12}\). Затем убейте монстра в вершине \(1\).
  • Во втором раунде до \(10^{100}\)-го раунда: все монстры были убиты, поэтому ничего не происходит.

Общее уменьшение здоровья составляет \(10^{12}\).

Во втором наборе оптимальная последовательность операций следующая:

  • В первом раунде: сначала получите атаку от монстров в вершинах \(1,2,3,4,5\), поэтому ваше здоровье уменьшается на \(47+15+32+29+23=146\). Затем убейте монстров в вершинах \(1,4,5\).
  • Во втором раунде: сначала получите атаку от монстров в вершинах \(2,3\), поэтому ваше здоровье уменьшается на \(15+32=47\). Затем убейте монстров в вершинах \(2,3\).
  • В третьем раунде до \(10^{100}\)-го раунда: все монстры были убиты, поэтому ничего не происходит.

Общее уменьшение здоровья составляет \(193\).

В третьем наборе оптимальная последовательность операций следующая:

  • В первом раунде: сначала получите атаку от монстров в вершинах \(1,2,3,4,5,6,7\), поэтому ваше здоровье уменьшается на \(8+10+2+3+5+7+4=39\). Затем убейте монстров в вершинах \(1,3,6,7\).
  • Во втором раунде: сначала получите атаку от монстров на вершинах \(2,4,5\), поэтому ваше здоровье уменьшается на \(10+3+5=18\). Затем убейте монстров на вершинах \(2,4,5\).
  • В третьем раунде до \(10^{100}\)-го раунда: все монстры были убиты, поэтому ничего не происходит.

Общее уменьшение здоровья составляет \(57\).

F. Раскрась одновременно

графы поиск в глубину и подобное разделяй и властвуй *3000

Задана матрица, состоящая из \(n\) строк и \(m\) столбцов.

Вы можете выполнять над ней два типа действий:

  • покрасить весь столбец в синий;
  • покрасить всю строку в красный.

Обратите внимание, что вы не можете выбирать, в какой цвет красить строку или столбец.

За одну секунду можно выполнить как одно действие, так и несколько одновременно. Если сделать одно действие, то это будет бесплатно. Если же сделать \(k > 1\) действий одновременно, то на это придется потратить \(k^2\) монет. Когда несколько действий выполняются одновременно, для каждой клетки, которая затрагивается действиями обоих типов, цвет можно выбрать независимо.

Требуется обработать \(q\) запросов. Перед каждым запросом все ячейки становятся бесцветными. Изначально ограничений на итоговый цвет клеток нет. В \(i\)-м запросе добавляется ограничение вида:

  • \(x_i~y_i~c_i\) — клетка в строке \(x_i\) в столбце \(y_i\) должна быть покрашена в цвет \(c_i\).

Таким образом, после \(i\) запросов существует \(i\) ограничений на необходимые цвета клеток матрицы. После каждого запроса выведите минимальную стоимость покраски в соответствии с ограничениями.

Входные данные

В первой строке записано три целых числа \(n, m\) и \(q\) (\(1 \le n, m, q \le 2 \cdot 10^5\)) — размер матрицы и количество запросов.

В \(i\)-й из следующих \(q\) строк записаны два целых числа \(x_i, y_i\) и символ \(c_i\) (\(1 \le x_i \le n\); \(1 \le y_i \le m\); \(c_i \in\) {'R', 'B'}, где 'R' значит красный, а 'B' значит синий) — описание \(i\)-го ограничения. Клетки во всех ограничениях попарно различные.

Выходные данные

Выведите \(q\) целых чисел — После каждого запроса выведите минимальную стоимость покраски в соответствии с ограничениями.

E1. Поймай крота (легкая версия)

Бинарный поиск Деревья интерактив поиск в глубину и подобное Структуры данных *2500

Это легкая версия задачи. Единственное отличие — это ограничение на количество запросов.

Это интерактивная задача.

Вам дано дерево из \(n\) вершин с вершиной \(1\) в качестве корневой.

В одной из вершин спрятан крот. Чтобы найти его положение, вы можете выбрать вершину \(x\) (\(1 \le x \le n\)) и сделать запрос к жюри. После этого жюри вернет \(1\), если крот находится в поддереве вершины \(x\). В противном случае жюри вернет \(0\). Если жюри возвращает \(0\) и крот не находится в корневой вершине \(1\), крот переместится в вершину-родителя той вершины, в которой он находится в данный момент.

Используя не более \(300\) операций, найдите текущую вершину, в которой находится крот.

Входные данные

Первая строка входных данных содержит единственное целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Описание наборов входных данных следует ниже.

Протокол взаимодействия

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 5000\)).

Следующая \(n-1\) строка описывает ребра дерева. Каждая строка содержит два целых числа, разделенные пробелом, \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\)), обозначающие ребро между вершинами \(u_i\) и \(v_i\).

Гарантируется, что входные данные представляют собой дерево.

Интерактор в этой задаче не является адаптивным. Другими словами, вершина, где изначально находится крот, зафиксирована в каждом наборе входных данных и не меняется во время взаимодействия.

Чтобы сделать запрос, вам нужно выбрать вершину \(x\) (\(1 \le x \le n\)) и вывести строку следующего вида:

  • «? x»

После этого вы получите:

  • \(0\), если крот не находится в поддереве \(x\);
  • \(1\), если крот находится в поддереве \(x\).

Вы можете сделать не более \(300\) запросов такого вида для каждого набора входных данных.

Затем, если вы определили текущую вершину, где находится крот, выведите строку следующего вида:

  • «! x»

Обратите внимание, что эта строка не считается запросом и не учитывается при подсчете количества заданных запросов.

После этого переходите к следующему набору входных данных.

Если вы сделаете более \(300\) запросов во время взаимодействия, ваша программа должна немедленно завершиться, и вы получите вердикт Неправильный ответ. В противном случае вы можете получить произвольный вердикт, потому что ваше решение будет продолжать читать из закрытого потока.

После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Взломы

Чтобы сделать взлом, используйте следующий формат:

Первая строка содержит количество наборов входных данных \(t\) (\(1 \le t \le 100\)). Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(x\) (\(2 \le n \le 5000\), \(1 \le x \le n\)), описывающие размер дерева и начальное положение крота.

Следующая \(n-1\) строка описывает ребра дерева. Каждая строка содержит два целых числа, разделенные пробелом, \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\)), обозначающие ребро между вершинами \(u_i\) и \(v_i\).

Входные данные обязаны представлять собой дерево.

Примечание

В первом наборе входных данных крот изначально находится в вершине \(2\).

Для запроса «? 2», жюри возвращает \(1\), потому что крот находится в поддереве вершины \(2\). После этого запроса крот не перемещается.

Ответ \(2\) — это текущая вершина, где находится крот, поэтому ответ считается правильным.

Во втором наборе входных данных крот изначально находится в вершине \(6\).

Для запроса «? 2», жюри возвращает \(0\), потому что крот не находится в поддереве вершины \(2\). После этого запроса крот перемещается из вершины \(6\) в вершину \(5\).

Для запроса «? 6», жюри возвращает \(0\), потому что крот не находится в поддереве вершины \(6\). После этого запроса крот перемещается из вершины \(5\) в вершину \(4\).

Для запроса «? 4», жюри возвращает \(1\), потому что крот находится в поддереве вершины \(4\). После этого запроса крот не перемещается.

Ответ \(4\) — это текущая вершина, где находится крот, поэтому ответ считается правильным.

Обратите внимание, что приведенный пример предназначен только для понимания условия, и запросы в примере не гарантируют определение уникального положения крота.

E2. Поймай крота (сложная версия)

Бинарный поиск Деревья интерактив поиск в глубину и подобное разделяй и властвуй Структуры данных *2600

Это сложная версия задачи. Единственное отличие — это ограничение на количество запросов.

Это интерактивная задача.

Вам дано дерево из \(n\) вершин с вершиной \(1\) в качестве корневой.

В одной из вершин спрятан крот. Чтобы найти его положение, вы можете выбрать вершину \(x\) (\(1 \le x \le n\)) и сделать запрос к жюри. После этого жюри вернет \(1\), если крот находится в поддереве вершины \(x\). В противном случае жюри вернет \(0\). Если жюри возвращает \(0\) и крот не находится в корневой вершине \(1\), крот переместится в вершину-родителя той вершины, в которой он находится в данный момент.

Используя не более \(160\) операций, найдите текущую вершину, в которой находится крот.

Входные данные

Первая строка входных данных содержит единственное целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Описание наборов входных данных следует ниже.

Протокол взаимодействия

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 5000\)).

Следующая \(n-1\) строка описывает ребра дерева. Каждая строка содержит два целых числа, разделенные пробелом, \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\)), обозначающие ребро между вершинами \(u_i\) и \(v_i\).

Гарантируется, что входные данные представляют собой дерево.

Интерактор в этой задаче не является адаптивным. Другими словами, вершина, где изначально находится крот, зафиксирована в каждом наборе входных данных и не меняется во время взаимодействия.

Чтобы сделать запрос, вам нужно выбрать вершину \(x\) (\(1 \le x \le n\)) и вывести строку следующего вида:

  • «? x»

После этого вы получите:

  • \(0\), если крот не находится в поддереве \(x\);
  • \(1\), если крот находится в поддереве \(x\).

Вы можете сделать не более \(160\) запросов такого вида для каждого набора входных данных.

Затем, если вы определили текущую вершину, где находится крот, выведите строку следующего вида:

  • «! x»

Обратите внимание, что эта строка не считается запросом и не учитывается при подсчете количества заданных запросов.

После этого переходите к следующему набору входных данных.

Если вы сделаете более \(160\) запросов во время взаимодействия, ваша программа должна немедленно завершиться, и вы получите вердикт Неправильный ответ. В противном случае вы можете получить произвольный вердикт, потому что ваше решение будет продолжать читать из закрытого потока.

После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Взломы

Чтобы сделать взлом, используйте следующий формат:

Первая строка содержит количество наборов входных данных \(t\) (\(1 \le t \le 100\)). Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(x\) (\(2 \le n \le 5000\), \(1 \le x \le n\)), описывающие размер дерева и начальное положение крота.

Следующая \(n-1\) строка описывает ребра дерева. Каждая строка содержит два целых числа, разделенные пробелом, \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\)), обозначающие ребро между вершинами \(u_i\) и \(v_i\).

Входные данные обязаны представлять собой дерево.

Примечание

В первом наборе входных данных крот изначально находится в вершине \(2\).

Для запроса «? 2», жюри возвращает \(1\), потому что крот находится в поддереве вершины \(2\). После этого запроса крот не перемещается.

Ответ \(2\) — это текущая вершина, где находится крот, поэтому ответ считается правильным.

Во втором наборе входных данных крот изначально находится в вершине \(6\).

Для запроса «? 2», жюри возвращает \(0\), потому что крот не находится в поддереве вершины \(2\). После этого запроса крот перемещается из вершины \(6\) в вершину \(5\).

Для запроса «? 6», жюри возвращает \(0\), потому что крот не находится в поддереве вершины \(6\). После этого запроса крот перемещается из вершины \(5\) в вершину \(4\).

Для запроса «? 4», жюри возвращает \(1\), потому что крот находится в поддереве вершины \(4\). После этого запроса крот не перемещается.

Ответ \(4\) — это текущая вершина, где находится крот, поэтому ответ считается правильным.

Обратите внимание, что приведенный пример предназначен только для понимания условия, и запросы в примере не гарантируют определение уникального положения крота.

E. Игра с раскрасками

графы жадные алгоритмы игры интерактив Конструктив поиск в глубину и подобное *1900

Это интерактивная задача.

Рассмотрим связный неориентированный граф, состоящий из \(n\) вершин и \(m\) ребер. Каждая вершина может быть окрашена в один из трех цветов: \(1\), \(2\) или \(3\). Изначально все вершины не окрашены.

Алиса и Боб играют в игру, состоящую из \(n\) раундов. В каждом раунде происходит следующий двухэтапный процесс:

  1. Алиса выбирает два различных цвета.
  2. Боб выбирает непокрашенную вершину и красит ее в один из двух цветов, выбранных Алисой.

Алиса выигрывает, если существует ребро, соединяющее две вершины одного цвета. В противном случае побеждает Боб.

Вам дан граф. Ваша задача — решить, за кого из игроков вы хотите играть, и выиграть игру.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\), \(m\) (\(1 \le n \le 10^4\), \(n - 1 \le m \le \min(\frac{n \cdot (n - 1)}{2}, 10^4)\)) — количество вершин и количество ребер в графе соответственно.

Каждая из следующих \(m\) строк каждого набора входных данных содержит по два целых числа \(u_i\), \(v_i\) (\(1 \le u_i, v_i \le n\)) — ребра графа. Гарантируется, что граф связен, и что в нем нет петель и кратных ребер.

Гарантируется, что сумма \(n\) и сумма \(m\) по всем наборам входных данных не превосходят \(10^4\).

Протокол взаимодействия

Для каждого набора входных данных необходимо вывести одну строку, содержащую либо «Alice», либо «Bob» — игрока, за которого вы хотите играть.

Затем происходит \(n\) раундов, в каждом из которых происходит данный двухэтапный процесс:

  1. Алиса (либо вы, либо собеседник) выводит два целых числа \(a\) и \(b\) (\(1 \le a, b \le 3\), \(a \neq b\)) — цвета, выбранные Алисой.
  2. Боб (либо вы, либо собеседник) выводит два целых числа \(i\) и \(c\) (\(1 \le i \le n\), \(c = a\) или \(c = b\)) — вершина и цвет, выбранные Бобом. Вершина \(i\) должна быть неокрашенной.

Если любой из ваших выводов недействителен, жюри выведет «-1» и вы получите вердикт Неправильный ответ.

В конце \(n\) раундов, если ваше решение проиграло, жюри выведет «-1» и вы получите вердикт Неправильный ответ.

Если вы получили число \(-1\) вместо корректного значения, ваша программа должна немедленно завершиться. В противном случае вы можете получить любой вердикт, так как программа продолжит чтение из закрытого потока.

Обратите внимание, что если вы играете за Алису, и уже есть ребро, соединяющее вершины одного цвета, интерактор не завершит игру досрочно, и будут сыграны все \(n\) раундов.

После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Взломы в этой задаче отключены.

Примечание

Обратите внимание, что приведенные наборы входных данных являются примерами игр и не обязательно представляют собой оптимальную стратегию для обоих игроков.

В первом наборе входных данных вы решили играть за Алису.

  1. Алиса выбирает два цвета: \(3\) и \(1\). Боб выбирает вершину \(3\) и окрашивает ее в цвет \(1\).
  2. Алиса выбирает два цвета: \(1\) и \(2\). Боб выбирает вершину \(2\) и окрашивает ее в цвет \(2\).
  3. Алиса выбирает два цвета: \(2\) и \(1\). Боб выбирает вершину \(1\) и окрашивает ее в цвет \(1\).

Алиса выигрывает, потому что ребро \((3, 1)\) соединяет две вершины одного цвета.

Во втором наборе входных данных вы решили играть за Боба.

  1. Алиса выбирает два цвета: \(2\) и \(3\). Боб выбирает вершину \(1\) и окрашивает ее в цвет \(2\).
  2. Алиса выбирает два цвета: \(1\) и \(2\). Боб выбирает вершину \(2\) и окрашивает ее в цвет \(1\).
  3. Алиса выбирает два цвета: \(2\) и \(1\). Боб выбирает вершину \(4\) и окрашивает ее в цвет \(1\).
  4. Алиса выбирает два цвета: \(3\) и \(1\). Боб выбирает вершину \(3\) и окрашивает ее в цвет \(3\).

Боб выигрывает, потому что нет ребер, соединяющих вершины одного цвета.

F. Stardew Valley

графы Деревья Конструктив поиск в глубину и подобное *2500

Пеликан-таун представляет из себя \(n\) домов, соединенных \(m\) двунаправленными дорогами. На некоторых дорогах стоят NPC. Фермеру Бубе очень важно пройти по каждой дороге с NPC и поговорить с ними.

Помогите фермеру найти маршрут, для которого выполняются следующие условия:

  • Маршрут начинается у некоторого дома, проходит по некоторым дорогам, и заканчивается в том же доме.
  • Маршрут не проходит ни по какой дороге более одного раза (в обоих направлениях вместе).
  • Маршрут проходит по каждой дороге с NPC ровно один раз.
Обратите внимание, фермер может ходить по дорогам без NPC, также, вам не нужно минимизировать длину маршрута.

Гарантируется, что если в Пеликан-тауне оставить только дороги с NPC, то можно будет добраться от любого дома до любого другого.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит целое число \(t\) (\(1 \le t \le 10^{4}\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

В первой строке каждого набора входных данных даны два целых числа \(n\) и \(m\) (\(2 \leq n \leq 5 \cdot 10^5, 1 \leq m \leq 5 \cdot 10^5\)) — количество домов и дорог в Pelican town соответственно.

В каждой из следующих \(m\) строк даны три целых числа \(u\), \(v\) и \(c\) (\(1 \leq u, v \leq n, c = 0/1\)) — концы дороги и находятся ли NPC на этой дороге. Если \(c = 1\), то на дороге стоят NPC. Если \(c = 0\), то на дороге нет NPC.

В графе могут быть кратные ребра и петли, причем, если есть кратные ребра, на которых стоят NPC, то маршрут должен проходить по всем таким дорогам.

Гарантируется, что если в Пеликан-тауне оставить только дороги с NPC, то можно будет добраться от любого дома до любого другого.

Гарантируется, что сумма \(n\) и \(m\) по всем наборам входных данных не превосходит \(5 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных, если решения не существует, то выведите «No» (без кавычек).

Иначе выведите «Yes» (без кавычек), после этого выведите \(k\) — количество дорог в маршруте. В следующей строке выведите \(k + 1\) число — дома маршрута в порядке обхода. Обратите внимание, что первый дом должен совпадать с последним, поскольку маршрут циклический.

Если существуют несколько решений, вы можете вывести любое из них.

Вы можете вывести каждую букву в любом регистре (например, «YES», «Yes», «yes», «yEs» будут распознаны как положительный ответ).

Примечание

Обратите внимание, что в третьем наборе входных данных присутствуют кратные ребра \((5, 2)\). Вам обязательно нужно пройти по двум из них.

D. Максимизация корня

Бинарный поиск Деревья дп жадные алгоритмы поиск в глубину и подобное *1500

Задано корневое дерево, состоящее из \(n\) вершин. Вершины в дереве пронумерованы от \(1\) до \(n\), вершина \(1\) — корень. Значение \(a_i\) записано в \(i\)-й вершине.

Вы можете выполнять следующую операцию любое количество раз (возможно, ноль): выбрать вершину \(v\), у которой есть хотя бы один сын; увеличить \(a_v\) на \(1\); и уменьшить \(a_u\) на \(1\) для всех вершин \(u\), которые находятся в поддереве \(v\) (за исключением самой \(v\)). Но после каждой операции значения на всех вершинах должны быть неотрицательными.

Ваша задача — посчитать максимальное возможное значение в корне, используя вышеописанную операцию.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество вершин в дереве.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 10^9\)) — начальные значения, записанные в вершинах.

Третья строка содержит \(n-1\) целых чисел \(p_2, p_3, \dots, p_n\) (\(1 \le p_i \le n\)), где \(p_i\) — родитель \(i\)-й вершины в дереве. Вершина \(1\) является корнем.

Дополнительное ограничение на входные данные: сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимальное возможное значение в корне, используя вышеописанную операцию.

Примечание

В первом наборе входных данных возможна следующая последовательность операций:

  • провести операцию на \(v=3\), тогда значения на вершинах станут \([0, 1, 1, 1]\);
  • провести операцию на \(v=1\), тогда значения на вершинах станут \([1, 0, 0, 0]\).

C. Угадайте дерево

Бинарный поиск Деревья жадные алгоритмы интерактив Перебор поиск в глубину и подобное разделяй и властвуй снм *1500

Это интерактивная задача.

Мизуки выбрала секретное дерево с \(n\) вершинами, пронумерованными от \(1\) до \(n\), и попросила вас отгадать его с помощью запросов следующего типа:

  • «? a b» — Мизуки скажет вам, какая вершина \(x\) минимизирует \(|d(a,x) - d(b,x)|\), где \(d(x,y)\) — расстояние между вершинами \(x\) и \(y\). Если таких вершин несколько, Мизуки укажет вам ту, которая минимизирует \(d(a,x)\).

Выясните структуру секретного дерева Мизуки, используя не более \(15n\) запросов!

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 200\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Каждый набор входных данных состоит из одной строки с целым числом \(n\) (\(2 \le n \le 1000\)) — количество вершин в дереве.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(1000\).

Протокол взаимодействия

Взаимодействие начинается с чтения целого числа \(n\).

Затем вы можете сделать до \(15n\) запросов.

Чтобы сделать запрос, выведите строку в формате «? a b» (без кавычек) (\(1 \le a,b \le n\)). После каждого запроса считайте целое число — ответ на ваш запрос.

Чтобы сообщить ответ, выведите строку в формате «! \(a_1\) \(b_1\) \(a_2\) \(b_2\) ... \(a_{n-1}\) \(b_{n-1}\)» (без кавычек), что означает, что между вершинами \(a_i\) и \(b_i\) существует ребро для каждого \(1 \le i \le n-1\). Вы можете выводить ребра в любом порядке.

После того как будет сделано \(15n\) запросов, ответ на любой другой запрос будет равен \(-1\). Получив такой ответ, завершите программу, чтобы получить вердикт Неправильный ответ.

После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Взломы

Для взломов используйте следующий формат: Первая строка содержит целое число \(t\) (\(1 \le t \le 200\)) — количество наборов входных данных.

Первая строка каждого набора входных данных держит целое число \(n\) — количество вершин в скрытом дереве.

Затем следует \(n-1\) строка. В \(i\)-й из них содержатся два целых числа \(a_i\) и \(b_i\) (\(1 \le a_i, b_i \le n\)), что означает, что между \(a_i\) и \(b_i\) в скрытом дереве есть ребро.

Сумма \(n\) по всем наборам входных данных не должна превосходить \(1000\).

Примечание

Дерево — это связный неориентированный граф без циклов. Дерево с \(n\) вершинами всегда будет иметь \(n-1\) ребро.

В примере ответ на «? 1 2» равен \(1\). Это означает, что между вершинами \(1\) и \(2\) есть ребро.

Ответ на запрос «? 1 3» равен \(1\). Это означает, что между вершинами \(1\) и \(3\) есть ребро.

Ответ на запрос «? 1 4» равен \(3\). Можно доказать, что это возможно только в том случае, если вершина \(3\) соединена с вершинами \(1\) и \(4\).

Следовательно, ребра дерева — это \((1,2)\), \((1,3)\) и \((3,4)\).

D1. Проверка DFS (лёгкая версия)

графы Деревья Перебор поиск в глубину и подобное Структуры данных хэши *1900

Это лёгкая версия задачи. В этой версии заданное дерево является полным бинарным деревом, а ограничения на \(n\) и \(q\) ниже. Вы можете совершать взломы только в том случае, если решены обе версии задачи.

Вам дано полное бинарное дерево\(^\dagger\), состоящее из \(n\) вершин. Вершины пронумерованы от \(1\) до \(n\), вершина \(1\) — корень. Вам также дана перестановка \(p_1, p_2, \ldots, p_n\) чисел \([1,2,\ldots,n]\).

Вам нужно ответить на \(q\) запросов. В каждом запросе вам даются два целых числа \(x\), \(y\); вам нужно поменять местами \(p_x\) и \(p_y\) и определить, является ли \(p_1, p_2, \ldots, p_n\) возможным порядком обхода в глубину\(^\ddagger\) заданного дерева.

Обратите внимание, что перестановки элементов сохраняются между запросами.

\(^\dagger\) Полное бинарное дерево — это дерево с корнем в вершине \(1\), имеющее размер \(n=2^k-1\) для некоторого целого положительного числа \(k\), и где родитель каждой вершины \(i\) (\(1<i\le n\)) — это \(\left\lfloor\frac{i}{2}\right\rfloor\). Таким образом, все листья этого дерева находятся на расстоянии \(k - 1\) от корня.

\(^\ddagger\) Порядок обхода в глубину получается вызовом следующей функции \(\texttt{dfs}\) на заданном дереве.

dfs_order = []

function dfs(v):
добавить v в конец dfs_order
выбрать произвольную перестановку s детей v
for child in s:
dfs(child)

dfs(1)

Обратите внимание, что порядок обхода DFS определён не однозначно.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1\le t\le10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

В первой строке каждого набора входных данных содержатся два целых числа \(n\), \(q\) (\(3\le n\le 65\,535\), \(2\le q\le 5 \cdot 10^4\)) — количество вершин в дереве и количество запросов. Гарантируется, что \(n=2^k-1\) для некоторого целого положительного числа \(k\).

В следующей строке содержатся \(n-1\) целое число \(a_2,a_3,\ldots,a_n\) (\(1\le a_i<i\)) — родитель каждой вершины в заданном дереве. Гарантируется, что \(a_i=\left\lfloor\frac{i}{2}\right\rfloor\).

В следующей строке содержатся \(n\) целых чисел \(p_1,p_2,\ldots,p_n\) (\(1\le p_i\le n\), все \(p_i\) различны) — начальная перестановка \(p\).

В следующих \(q\) строках содержится по два целых числа \(x\), \(y\) (\(1\le x,y\le n,x\neq y\)) — позиции элементов, которые нужно поменять местами в перестановке.

Гарантируется, что сумма всех \(n\) не превышает \(65\,535\), а сумма всех \(q\) не превышает \(5 \cdot 10^4\).

Выходные данные

Для каждого набора входных данных выведите \(q\) строк, соответствующих \(q\) запросам. Для каждого запроса выведите \(\texttt{YES}\), если есть порядок обхода в глубину, который точно равен текущей перестановке, и выведите \(\texttt{NO}\) в противном случае.

Вы можете вывести \(\texttt{Yes}\) и \(\texttt{No}\) в любом регистре (например, строки \(\texttt{yEs}\), \(\texttt{yes}\), \(\texttt{Yes}\) и \(\texttt{YES}\) будут распознаны как положительный ответ).

Примечание

В первом наборе входных данных перестановка \(p_1, p_2, \ldots, p_n\) после каждой модификации равна \([1,3,2],[1,2,3],[3,2,1]\) соответственно. Первые две перестановки — это возможные порядки обхода в глубину; третья — не порядок обхода в глубину.

Во втором наборе входных данных перестановка \(p_1, p_2, \ldots, p_n\) после каждой модификации равна \([1,2,3,4,5,6,7],[1,2,5,4,3,6,7],[1,3,5,4,2,6,7],[1,3,7,4,2,6,5],[1,3,7,6,2,4,5]\) соответственно.

D2. Проверка DFS (сложная версия)

Бинарный поиск графы Деревья поиск в глубину и подобное Структуры данных хэши *2300

Это сложная версия задачи. В этой версии на заданное дерево нет дополнительных ограничений, а ограничения на \(n\) и \(q\) выше. Вы можете совершать взломы только в том случае, если решены обе версии задачи.

Вам дано корневое дерево, состоящее из \(n\) вершин. Вершины пронумерованы от \(1\) до \(n\), вершина \(1\) — корень. Вам также дана перестановка \(p_1, p_2, \ldots, p_n\) чисел \([1,2,\ldots,n]\).

Вам нужно ответить на \(q\) запросов. В каждом запросе вам даются два целых числа \(x\), \(y\); вам нужно поменять местами \(p_x\) и \(p_y\) и определить, является ли \(p_1, p_2, \ldots, p_n\) возможным порядком обхода в глубину\(^\dagger\) заданного дерева.

Обратите внимание, что перестановки элементов сохраняются между запросами.

\(^\dagger\) Порядок обхода в глубину получается вызовом следующей функции \(\texttt{dfs}\) на заданном дереве.

dfs_order = []

function dfs(v):
добавить v в конец dfs_order
выбрать произвольную перестановку s детей v
for child in s:
dfs(child)

dfs(1)

Обратите внимание, что порядок обхода DFS определён не однозначно.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1\le t\le10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

В первой строке каждого набора входных данных содержатся два целых числа \(n\),\(q\) (\(2\le n\le 3\cdot 10^5\), \(2\le q\le 10^5\)) — количество вершин в дереве и количество запросов.

В следующей строке содержатся \(n-1\) целых чисел \(a_2,a_3,\ldots,a_n\) (\(1\le a_i<i\)) — родитель каждой вершины в заданном дереве.

В следующей строке содержатся \(n\) целых чисел \(p_1,p_2,\ldots,p_n\) (\(1\le p_i\le n\), все \(p_i\) различны) — начальная перестановка \(p\).

В следующих \(q\) строках каждая строка содержит два целых числа \(x\), \(y\) (\(1\le x,y\le n,x\neq y\)) — позиции элементов, которые нужно поменять местами в перестановке.

Гарантируется, что сумма всех \(n\) не превышает \(3\cdot 10^5\), а сумма всех \(q\) не превышает \(10^5\).

Выходные данные

Для каждого набора входных данных выведите \(q\) строк, соответствующих \(q\) запросам. Для каждого запроса выведите \(\texttt{YES}\), если есть порядок обхода в глубину, который точно равен текущей перестановке, и выведите \(\texttt{NO}\) в противном случае.

Вы можете вывести \(\texttt{Yes}\) и \(\texttt{No}\) в любом регистре (например, строки \(\texttt{yEs}\), \(\texttt{yes}\), \(\texttt{Yes}\) и \(\texttt{YES}\) будут распознаны как положительный ответ).

Примечание

В первом наборе входных данных перестановка \(p_1, p_2, \ldots, p_n\) после каждой модификации равна \([1,3,2],[1,2,3],[3,2,1]\) соответственно. Первые две перестановки — это возможные порядки обхода в глубину; третья — не порядок обхода в глубину.

Во втором наборе входных данных перестановка \(p_1, p_2, \ldots, p_n\) после каждой модификации равна \([1,2,3,4,5,6,7],[1,2,5,4,3,6,7],[1,3,5,4,2,6,7],[1,3,7,4,2,6,5],[1,3,7,6,2,4,5]\) соответственно.

F1. Синий двор (простая версия)

дп математика Перебор поиск в глубину и подобное теория чисел *2600

Это простая версия задачи. В этой версии \(n=m\) и ограничение по времени меньше. Вы можете совершать взломы только в том случае, если решены обе версии задачи.

Во дворе Синего короля Лелль и Фламм устраивают матч. Матч состоит из нескольких раундов. В каждом раунде побеждает либо Лелль, либо Фламм.

Пусть \(W_L\) и \(W_F\) обозначают количество побед Лелли и Фламма, соответственно. Синий король считает матч успешным тогда и только тогда, когда:

  • после каждого раунда, \(\gcd(W_L,W_F)\le 1\);
  • в конце матча \(W_L\le n, W_F\le m\).

Обратите внимание, что \(\gcd(0,x)=\gcd(x,0)=x\) для каждого целого неотрицательного числа \(x\).

Лелль и Фламм могут прекратить матч, когда захотят, а итоговый счет матча будет следующим: \(l \cdot W_L + f \cdot W_F\).

Пожалуйста, помогите Лелле и Фламму скоординировать свои победы и поражения так, чтобы матч был успешным, а итоговый счет за матч был максимальным.

Входные данные

В первой строке содержится одно целое число \(t\) (\(1\leq t \leq 10^3\)) — количество наборов входных данных.

Единственная строка каждого набора входных данных содержит 4 целых числа \(n\), \(m\), \(l\), \(f\) (\(2\leq n\leq m \leq 2\cdot 10^7\), \(1\leq l,f \leq 10^9\), \(\bf{n=m}\)): \(n\), \(m\) обозначают верхнюю границу числа побед Лелли и Фламма соответственно, \(l\) и \(f\) определяют финальный счет матча.

Необычное дополнительное ограничение: гарантируется, что для каждого теста не существует двух наборов входных данных с одинаковой парой \(n\), \(m\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимальный итоговый счет успешного матча.

Примечание

В первом наборе входных данных возможный матч выглядит так:

  • Фламм выигрывает, \(\gcd(0,1)=1\).
  • Лелль выигрывает, \(\gcd(1,1)=1\).
  • Фламм выигрывает, \(\gcd(1,2)=1\).
  • Фламм выигрывает, \(\gcd(1,3)=1\).
  • Лелль выигрывает, \(\gcd(2,3)=1\).
  • Лелль и Фламм соглашаются прекратить матч.

Итоговый счет: \(2\cdot2+3\cdot5=19\).

В четвертом наборе входных данных возможный матч выглядит так:

  • Фламм выигрывает, \(\gcd(0,1)=1\).
  • Лелль выигрывает, \(\gcd(1,1)=1\).
  • Лелль выигрывает, \(\gcd(2,1)=1\).
  • Лелль выигрывает, \(\gcd(3,1)=1\).
  • Лелль выигрывает, \(\gcd(4,1)=1\).
  • Лелль выигрывает, \(\gcd(5,1)=1\).
  • Фламм выигрывает, \(\gcd(5,2)=1\).
  • Фламм выигрывает, \(\gcd(5,3)=1\).
  • Фламм выигрывает, \(\gcd(5,4)=1\).
  • Лелль и Фламм соглашаются прекратить матч.

Итоговый счет: \(5\cdot2+4\cdot2=18\). Обратите внимание, что Лелль и Фламм могут прекратить матч, даже если ни у одного из них нет \(n\) выигрышей.

D2. Черепаха и задача MEX (сложная версия)

графы дп жадные алгоритмы математика поиск в глубину и подобное реализация *2100

Две версии — это разные задачи. В этой версии задачи нельзя выбирать одно и то же целое число дважды или более. Можно делать взломы только в том случае, если обе версии решены.

Однажды Черепаха играла с \(n\) последовательностями. Пусть длина \(i\)-й последовательности равна \(l_i\). Тогда \(i\)-я последовательность была \(a_{i, 1}, a_{i, 2}, \ldots, a_{i, l_i}\).

Свинка дала Черепахе задачу, когда Черепаха играла. Условие задачи было следующим:

  • Сначала было неотрицательное целое число \(x\). Черепаха могла выполнять произвольное количество (возможно, ноль) операций с этим числом.
  • В каждой операции Черепаха могла выбрать целое число \(i\), такое что \(1 \le i \le n\) и \(i\) не было выбрано ранее, и сделать \(x\) равным \(\text{mex}^{\dagger}(x, a_{i, 1}, a_{i, 2}, \ldots, a_{i, l_i})\).
  • Черепаха должна была найти ответ, который был максимальным значением \(x\) после выполнения произвольного количества операций.

Черепаха без труда решила вышеуказанную задачу. Она определила \(f(k)\) как ответ на вышеуказанную задачу, когда начальное значение \(x\) было \(k\).

Затем Свинка дала Черепахе неотрицательное целое число \(m\) и попросил Черепаху найти значение \(\sum\limits_{i = 0}^m f(i)\) (т.е. значение \(f(0) + f(1) + \ldots + f(m)\)). К сожалению, она не смогла решить эту задачу. Пожалуйста, помогите ей!

\(^{\dagger}\text{mex}(c_1, c_2, \ldots, c_k)\) определяется как наименьшее неотрицательное целое число \(x\), которое не встречается в последовательности \(c\). Например, \(\text{mex}(2, 2, 0, 3)\) равно \(1\), \(\text{mex}(1, 2)\) равно \(0\).

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит количество наборов входных данных \(t\) (\(1 \le t \le 10^4\)). Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n, m\) (\(1 \le n \le 2 \cdot 10^5, 0 \le m \le 10^9\)).

Каждая из следующих \(n\) строк содержит несколько целых чисел. Первое целое число \(l_i\) (\(1 \le l_i \le 2 \cdot 10^5\)) представляет длину \(i\)-й последовательности, а следующие \(l_i\) целых числа \(a_{i, 1}, a_{i, 2}, \ldots, a_{i, l_i}\) (\(0 \le a_{i, j} \le 10^9\)) представляют элементы \(i\)-й последовательности.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\), а сумма \(\sum l_i\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — значение \(\sum\limits_{i = 0}^m f(i)\).

Примечание

В первом наборе входных данных, когда \(x\) изначально равен \(2\), Черепаха может выбрать \(i = 3\) и сделать \(x\) равным \(\text{mex}(x, a_{3, 1}, a_{3, 2}, a_{3, 3}, a_{3, 4}) = \text{mex}(2, 7, 0, 1, 5) = 3\). Можно доказать, что Черепаха не может сделать значение \(x\) больше \(3\), поэтому \(f(2) = 3\).

Можно увидеть, что \(f(0) = 3\), \(f(1) = 3\), \(f(2) = 3\), \(f(3) = 3\), и \(f(4) = 4\). Таким образом, \(f(0) + f(1) + f(2) + f(3) + f(4) = 3 + 3 + 3 + 3 + 4 = 16\).

Во втором наборе входных данных, когда \(x\) изначально равен \(1\), Черепаха может выбрать \(i = 1\) и сделать \(x\) равным \(\text{mex}(x, a_{1, 1}, a_{1, 2}, a_{1, 3}, a_{1, 4}, a_{1, 5}) = \text{mex}(1, 0, 2, 0, 4, 11) = 3\). Можно доказать, что Черепаха не может сделать значение \(x\) больше \(3\), поэтому \(f(1) = 3\).

Можно увидеть, что \(f(0) = 4\), \(f(1) = 3\), \(f(2) = 4\), \(f(3) = 3\), и \(f(4) = 4\). Таким образом, \(f(0) + f(1) + f(2) + f(3) + f(4) = 4 + 3 + 4 + 3 + 4 = 18\).

В четвертом наборе входных данных можно увидеть, что \(f(0) = 3\) и \(f(1) = 1\). Таким образом, \(f(0) + f(1) = 3 + 1 = 4\).

A. Ирис и игра на дереве

графы Деревья жадные алгоритмы игры Конструктив поиск в глубину и подобное *1700

У Ирис есть дерево, корень которого находится в вершине \(1\). Каждая вершина имеет значение \(\mathtt 0\) или \(\mathtt 1\).

Рассмотрим лист дерева (вершина \(1\) никогда не считается листом) и определим его вес. Построим строку, сформированную значениями вершин на пути от корня до этого листа. Тогда вес листа — это разность количества вхождений подстроки \(\mathtt{10}\) и количества вхождений подстроки \(\mathtt{01}\) в этой строке.

Возьмем следующее дерево в качестве примера. Зеленые вершины имеют значение \(\mathtt 1\), в то время как белые вершины имеют значение \(\mathtt 0\).

  • Посчитаем вес листа \(5\): сформированная строка равна \(\mathtt{10110}\). Количество вхождений подстроки \(\mathtt{10}\) равно \(2\), количество вхождений подстроки \(\mathtt{01}\) равно \(1\), так что разность равна \(2 - 1 = 1\).
  • Посчитаем вес листа \(6\): сформированная строка равна \(\mathtt{101}\). Количество вхождений подстроки \(\mathtt{10}\) равно \(1\), количество вхождений подстроки \(\mathtt{01}\) равно \(1\), так что разность равна \(1 - 1 = 0\).

Оценкой дерева назовём количество листьев с ненулевым весом в дереве.

Однако значения некоторых вершин ещё не определены и будут даны вам как \(\texttt{?}\). Заполнение пропусков было бы слишком скучным, поэтому Ирис собирается пригласить Дору поиграть в игру. На каждом ходу одна из девочек выбирает любую из оставшихся вершин со значением \(\texttt{?}\) и изменяет её значение на \(\mathtt{0}\) или \(\mathtt{1}\), при этом Ирис ходит первой. Игра продолжается до тех пор, пока в дереве не останется вершин со значением \(\mathtt{?}\). Ирис стремится максимизировать оценку дерева, в то время как Дора стремится минимизировать её.

Предполагая, что обе девочки играют оптимально, определите итоговую оценку дерева.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 5\cdot 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \leq n \leq 10^5\)) — количество вершин в дереве.

Каждая из следующих \(n - 1\) строк содержит два целых числа \(u\) и \(v\) (\(1 \leq u, v \leq n\)) — обозначающие ребро между вершинами \(u\) и \(v\).

Гарантируется, что данные рёбра образуют дерево.

Последняя строка содержит строку \(s\) длины \(n\). \(i\)-й символ строки \(s\) представляет значение вершины \(i\). Гарантируется, что \(s\) содержит только символы \(\mathtt{0}\), \(\mathtt{1}\) и \(\mathtt{?}\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — итоговую оценку дерева.

Примечание

В первом наборе входных данных значения во всех вершинах уже определены. Существует три различных пути от корня до листа:

  • От вершины \(1\) до вершины \(2\). Сформированная строка равна \(\mathtt{01}\), так что вес листа равен \(0-1=-1\).
  • От вершины \(1\) до вершины \(3\). Сформированная строка равна \(\mathtt{00}\), так что вес листа равен \(0-0=0\).
  • От вершины \(1\) до вершины \(4\). Сформированная строка равна \(\mathtt{01}\), так что вес листа равен \(0-1=-1\).

Таким образом, есть два листа с ненулевым весом, так что оценка дерева равна \(2\).

Во втором наборе входных данных одна из последовательностей оптимальных ходов для двух игроков может быть следующей:

  • Ирис выбирает изменить значение вершины \(3\) на \(\mathtt 1\).
  • Дора выбирает изменить значение вершины \(1\) на \(\mathtt 0\).
  • Ирис выбирает изменить значение вершины \(2\) на \(\mathtt 0\).

Итоговое дерево выглядит следующим образом:

Единственный лист с ненулевым весом — это \(3\), так что оценка дерева равна \(1\). Обратите внимание, что это может быть не единственная последовательность оптимальных ходов для Ирис и Доры.

B. Ирис и дерево

Деревья математика Перебор поиск в глубину и подобное снм Структуры данных *1800

Дано корневое дерево с корнем в вершине \(1\). Для любой вершины \(i\) (\(1 < i \leq n\)) в дереве есть ребро, соединяющее вершины \(i\) и \(p_i\) (\(1 \leq p_i < i\)), вес которого равен \(t_i\).

Ирис не знает значений \(t_i\), но она знает, что \(\displaystyle\sum_{i=2}^n t_i = w\) и любое из \(t_i\) является неотрицательным целым числом.

Вершины дерева пронумерованы особым образом: номера вершин в каждом поддереве представляют собой последовательные целые числа. Другими словами, вершины дерева пронумерованы в порядке обхода в глубину.

Дерево на этой картинке удовлетворяет условию. Например, в поддереве вершины \(2\) номера вершин равны \(2, 3, 4, 5\), то есть являются последовательными целыми числами.
Дерево на этой картинке не удовлетворяет условию, так как в поддереве вершины \(2\) номера вершин \(2\) и \(4\) не являются последовательными целыми числами.

Определим \(\operatorname{dist}(u, v)\) как длину простого пути между вершинами \(u\) и \(v\) в дереве.

Далее произойдёт \(n - 1\) событие:

  • Ирис сообщают целые числа \(x\) и \(y\), обозначающие, что \(t_x = y\).

После каждого события Ирис хочет знать максимальное возможное значение \(\operatorname{dist}(i, i \bmod n + 1)\) независимо для всех \(i\) (\(1\le i\le n\)). Ей достаточно узнать только сумму этих \(n\) значений. Пожалуйста, помогите Ирис быстро получить ответы.

Обратите внимание, что при вычислении максимально возможных значений \(\operatorname{dist}(i, i \bmod n + 1)\) и \(\operatorname{dist}(j, j \bmod n + 1)\) для \(i \ne j\) неизвестные веса рёбер могут быть разными.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(w\) (\(2 \le n \le 2 \cdot 10^5\), \(0 \leq w \leq 10^{12}\)) — количество вершин в дереве и сумма весов рёбер.

Вторая строка каждого набора входных данных содержит \(n - 1\) целых чисел \(p_2, p_3, \ldots, p_n\) (\(1 \leq p_i < i\)) — описание рёбер дерева.

Затем следуют \(n-1\) строк, обозначающих события. Каждая строка содержит два целых числа \(x\) и \(y\) (\(2 \leq x \leq n\), \(0 \leq y \leq w\)), обозначающие, что \(t_x = y\).

Гарантируется, что все \(x\) в событиях различны. Также гарантируется, что сумма всех \(y\) равна \(w\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одну строку, содержащую \(n-1\) целых числа, каждое из которых представляет ответ после каждого события.

Примечание

В первом наборе входных данных \(\operatorname{dist}(1, 2) = \operatorname{dist}(2, 1) = t_2 = w = 10^{12}\), поэтому \(\operatorname{dist}(1, 2) + \operatorname{dist}(2, 1) = 2 \cdot 10^{12}\)

Во втором наборе входных данных дерево после того, как Ирис узнала все \(t_x\), показано ниже:

\(\operatorname{dist}(1, 2) = t_2\), \(\operatorname{dist}(2, 3) = t_2 + t_3\), \(\operatorname{dist}(3, 4) = t_3 + t_4\), \(\operatorname{dist}(4, 1) = t_4\). После первого события мы узнали, что \(t_2 = 2\), поэтому \(\operatorname{dist}(1, 2) = 2\). В то же время:

  • \(\operatorname{dist}(2, 3)\) максимально, если \(t_3 = 7\), \(t_4 = 0\). Тогда \(\operatorname{dist}(2, 3) = 9\).
  • \(\operatorname{dist}(3, 4)\) и \(\operatorname{dist}(4, 1)\) максимальны, если \(t_3 = 0\), \(t_4 = 7\). Тогда \(\operatorname{dist}(3, 4) = \operatorname{dist}(4, 1) = 7\).

Таким образом, ответ равен \(2 + 9 + 7 + 7 = 25\).

После второго события мы узнали, что \(t_4 = 4\), тогда \(t_3 = w - t_2 - t_4 = 4\). \(\operatorname{dist}(1, 2) = 2\), \(\operatorname{dist}(2, 3) = 2 + 3 = 5\), \(\operatorname{dist}(3, 4) = 3 + 4 = 7\), \(\operatorname{dist}(4, 1) = 4\). Таким образом, ответ равен \(2 + 5 + 7 + 4 = 18\).

E. Полное бинарное дерево Ирис

Деревья Перебор поиск в глубину и подобное Структуры данных *3100

Ирис любит полные бинарные деревья.

Определим глубину корневого дерева как максимальное количество вершин на простых путях от некоторой вершины до корня. Полное бинарное дерево глубины \(d\) — это бинарное дерево глубины \(d\) с ровно \(2^d - 1\) вершинами.

Ирис называет дерево \(d\)-бинарным, если к нему можно добавить некоторые вершины и рёбра, чтобы оно стало полным бинарным деревом глубины \(d\). Обратите внимание, что любая вершина может быть выбрана в качестве корня полного бинарного дерева.

Поскольку выполнение операций над большими деревьями затруднительно, она определяет бинарную глубину дерева как минимальное \(d\), удовлетворяющее условию, что дерево является \(d\)-бинарным. В частности, если не существует целого числа \(d \ge 1\), такого что дерево является \(d\)-бинарным, то бинарная глубина дерева равна \(-1\).

У Ирис сейчас есть дерево, состоящее только из вершины \(1\). Она хочет добавить ещё \(n - 1\) вершин, чтобы сформировать большее дерево. Она будет добавлять вершины по одной. Когда она добавляет вершину \(i\) (\(2 \leq i \leq n\)), она сообщит вам целое число \(p_i\) (\(1 \leq p_i < i\)) и добавит новое ребро, соединяющее вершины \(i\) и \(p_i\).

Ирис хочет спросить вас о бинарной глубине дерева, образованного первыми \(i\) вершинами для всех \(1 \le i \le n\). Можете ли вы сказать ей ответ?

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \leq n \leq 5 \cdot 10^5\)) — итоговый размер дерева.

Вторая строка каждого набора входных данных содержит \(n - 1\) целых числа \(p_2, p_3, \ldots, p_n\) (\(1 \leq p_i < i\)) — описания всех рёбер дерева.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(5 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(n\) целых чисел, \(i\)-е из которых представляет бинарную глубину дерева, образованного первыми \(i\) вершинами.

Примечание

В первом наборе входных данных итоговое дерево показано ниже:

  • Дерево, состоящее из вершины \(1\), имеет бинарную глубину \(1\) (само дерево является полным бинарным деревом глубины \(1\)).
  • Дерево, состоящее из вершин \(1\) и \(2\), имеет бинарную глубину \(2\) (мы можем добавить вершину \(3\), чтобы сделать его полным бинарным деревом глубины \(2\)).
  • Дерево, состоящее из вершин \(1\), \(2\) и \(3\), имеет бинарную глубину \(2\) (само дерево является полным бинарным деревом глубины \(2\)).

Во втором наборе входных данных полное бинарное дерево, образованное после добавления некоторых вершин к дереву, состоящему из \(n\) вершин, показано ниже (добавленные вершины выделены жирным):

Глубина образованного полного бинарного дерева равна \(4\).

В пятом наборе входных данных итоговое дерево показано ниже:

Можно доказать, что Ирис не может сформировать никакое полное бинарное дерево, добавляя вершины и рёбра, поэтому бинарная глубина равна \(-1\).

E. Встреча Мариан и Робина

графы кратчайшие пути поиск в глубину и подобное *1800

В скромном акте встречи радость раскрывается, как цветок в цветении.

Отсутствие заставляет сердце тосковать. Мариан продала свой последний товар на рынке в то же время, когда Робин закончил тренировку у Великого Дуба. Они не могли дождаться встречи, поэтому оба отправились в путь без промедления.

Сеть путешествий представлена как \(n\) вершин, пронумерованных от \(1\) до \(n\), и \(m\) рёбер. \(i\)-е ребро соединяет вершины \(v_i\) и \(u_i\) и занимает \(w_i\) секунд на преодоление (все \(w_i\) четные). Мариан начинает с вершины \(1\) (Рынок), а Робин начинает с вершины \(n\) (Великий Дуб).

Кроме того, у \(h\) из \(n\) вершин есть по одному доступному коню. И Мариан, и Робин являются опытными всадниками и могут оседлать лошадей в считанные секунды (т.е. за \(0\) секунд). Время в пути сокращается вдвое при езде на лошади. Как только они сядут на лошадь, она будет служить им на протяжении всего оставшегося пути. Встреча должна происходить на вершине (т.е. не на ребре). Каждый из них также может останавливаться в вершинах.

Выведите самое раннее время, когда Робин и Мариан могут встретиться. Если вершины \(1\) и \(n\) не соединены, выведите \(-1\), так как встреча отменяется.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1\leq t \leq 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(n\), \(m\), \(h\) (\(2 \le n \le 2 \cdot 10^5, \;1 \le m \le 2 \cdot 10^5, \; 1 \le h \le n\)) — количество вершин, количество рёбер и количество вершин, в которых есть по одному коню.

Вторая строка каждого набора входных данных содержит \(h\) различных целых чисел \(a_1, a_2, \ldots, a_h\) (\(1 \le a_i \le n\)) — вершины, у которых есть по одному доступному коню.

Затем следуют \(m\), каждая содержит по три целых числа \(u_i\), \(v_i\), \(w_i\) (\(1\le u_i,v_i \le n, \; 2\le w_i \le 10^6\)) — что означает, что существует ребро между вершинами \(u_i\) и \(v_i\) с затратами на путешествие \(w_i\) секунд без лошади.

Гарантируется, что суммы как \(n\), так и \(m\) по всем наборам входных данных не превышают \(2 \cdot 10^5\).

В графе нет петель и кратных рёбер, все \(w_i\) являются четными целыми числами.

Выходные данные

Для каждого набора входных данных выведите одно целое число — самое раннее время, когда Робин и Мариан могут встретиться. Если встреча невозможна, выведите \(-1\).

Примечание

В первом наборе входных данных Мариан едет от вершины \(1\) к вершине \(2\), Робин ждет.

Во втором наборе входных данных вершины \(1\) и \(3\) не соединены.

В третьем наборе входных данных и Мариан, и Робин едут к вершине \(2\), чтобы встретиться.

В четвертом наборе входных данных Мариан едет к вершине \(2\) без лошади, оседлает лошадь на вершине \(2\) и едет к вершине \(3\), чтобы встретиться с Робином.

В пятом наборе входных данных Мариан едет к вершине \(2\) без лошади, оседлает лошадь на вершине \(2\) и возвращается к вершине \(1\), а затем к вершине \(3\).

F. Защита шерифа

Деревья дп жадные алгоритмы поиск в глубину и подобное *2000

"Почему, мастер," сказал Маленький Джон, беря мешки и взвешивая их в руке, "вот блеск золота."

Народный герой Робин Гуд сильно беспокоит шерифа Ноттингема. Шериф знает, что Робин Гуд собирается атаковать его лагеря, и он хочет быть готовым.

Шериф Ноттингема построил лагеря с учетом стратегии, и поэтому есть ровно \(n\) лагерей, пронумерованных от \(1\) до \(n\), и \(n-1\) троп, каждая из которых соединяет два лагеря. Любой лагерь можно достичь из любого другого лагеря. Каждый лагерь \(i\) изначально имеет \(a_i\) золота.

Шериф может укрепить лагерь, вычитая ровно \(c\) золота из каждого из его соседних лагерей и использовать это для строительства лучших защит для этого лагеря. Укрепление лагеря не изменяет его золото, только золото его соседей. Лагерь может иметь отрицательное количество золота.

После атаки Робина Гуда все лагеря, которые не были укреплены, будут уничтожены.

Какое максимальное количество золота шериф может сохранить в своих лагерях после атаки Робина Гуда, если он оптимально укрепляет свои лагеря?

Лагерь \(a\) является соседним лагерем \(b\), если и только если существует тропа, соединяющая \(a\) и \(b\). Только укрепленные лагеря учитываются в ответе, так как остальные будут уничтожены.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Каждый набор входных данных начинается с двух целых чисел \(n\), \(c\) (\(1 \le n \le 2\cdot10^5, 1 \le c \le 10^9\)) — количество лагерей и золота, взимаемого с каждого соседнего лагеря для укрепления.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1,a_2,\dots,a_n\) (\(-10^9 \le a_i \le 10^9\)) — начальное золото каждого лагеря.

Затем следуют \(n-1\) строк, каждая с целыми числами \(u\), \(v\) (\(1 \le u, v \le n\), \(u \ne v\)) — что означает, что существует тропа между \(u\) и \(v\).

Сумма \(n\) по всем наборам входных данных не превышает \(2\cdot10^5\).

Гарантируется, что любой лагерь достижим из любого другого лагеря.

Выходные данные

Выведите одно целое число, максимальное золото, которое шериф Ноттингема может сохранить в своих выживших лагерях после атаки Робина Гуда.

Примечание

В первом наборе входных данных оптимально укрепить второй лагерь. Конечное золото в каждом лагере составляет \([1,3,0]\).

Во втором наборе входных данных оптимально укрепить все лагеря. Конечное золото в каждом лагере составляет \([2,4,2]\).

В третьем наборе входных данных оптимально не укреплять ни один лагерь.

C. Стрижка деревьев

Деревья жадные алгоритмы Перебор поиск в глубину и подобное сортировки *1700

Вам дано дерево с \(n\) вершинами, корень которого находится в вершине \(1\). В этой задаче лист — это некорневая вершина со степенью \(1\).

За одну операцию можно удалить лист и смежное с ним ребро (возможно, появятся новые листья). Какое минимальное количество операций нужно выполнить, чтобы получилось дерево, также с корнем в вершине \(1\), в котором все листья находятся на одинаковом расстоянии от корня?

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(3 \leq n \leq 5 \cdot 10^5\)) — количество вершин.

Каждая из следующих \(n-1\) строк содержит два целых числа \(u\), \(v\) (\(1 \leq u, v \leq n\), \(u \neq v\)), описывающих ребро, соединяющее \(u\) и \(v\). Гарантируется, что заданные ребра образуют дерево.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(5 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число: минимальное количество операций, необходимое для достижения цели.

Примечание

В первых двух наборах входных данных деревья выглядят так:

В первом наборе входных данных, удалив ребра \((1, 3)\) и \((2, 5)\), вы получите дерево, у которого все листья (вершины \(6\) и \(7\)) находятся на одинаковом расстоянии от корня (вершины \(1\)), которое равняется \(3\). Ответ — \(2\), так как это минимальное количество ребер, которое нужно удалить для достижения цели.

Во втором наборе входных данных удаление ребер \((1, 4)\) и \((5, 7)\) приводит к дереву, в котором все листья (вершины \(4\) и \(5\)) находятся на одинаковом расстоянии от корня (вершины \(1\)), которое равняется \(2\).

E1. Цифровая деревня (простая версия)

бпф графы Деревья дп жадные алгоритмы математика Перебор поиск в глубину и подобное реализация снм Структуры данных *2300

Это простая версия задачи. В трех версиях отличаются ограничения на \(n\) и \(m\). Вы можете совершать взломы только в том случае, если решены все версии задачи.

Пак Чанек устанавливает интернет-связь в деревне Кхунтиен. Деревню можно представить как связный простой граф с \(n\) домами и \(m\) интернет-кабелями, соединяющими дом \(u_i\) и дом \(v_i\), каждый с задержкой \(w_i\).

Существует \(p\) домов, которым требуется интернет. Пак Чанек может установить серверы не более чем в \(k\) домов. Дома, которым нужен интернет, будут подключены к одному из серверов. Однако, поскольку каждый кабель имеет свою задержку, задержка, которую испытывает дом \(s_i\), нуждающийся в интернете, будет равна максимальной задержке кабелей между этим домом и сервером, к которому он подключен.

Для каждого \(k = 1,2,\ldots,n\), помогите Пак Чанеку определить минимальную суммарную задержку, которая может быть достигнута для всех домов, требующих интернет.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(n\), \(m\), \(p\) (\(2 \le n \le 400\); \(n-1 \le m \le 400\); \(1 \le p \le n\)) — количество домов, количество кабелей и количество домов, которым нужен интернет.

Вторая строка каждого набора входных данных содержит \(p\) целых чисел \(s_1, s_2, \ldots, s_p\) (\(1 \le s_i \le n\)) — номера домов, которым нужен интернет. Гарантируется, что все элементы \(s\) различны.

В \(i\)-й из следующих \(m\) строк каждого набора входных данных содержатся три целых числа \(u_i\), \(v_i\) и \(w_i\) (\(1 \le u_i < v_i \le n\); \(1 \le w_i \le 10^9\)) — интернет-кабель, соединяющий дом \(u_i\) и дом \(v_i\) с задержкой \(w_i\). Гарантируется, что заданные ребра образуют простой связный граф.

Гарантируется, что сумма \(n^3\) и сумма \(m^3\) не превосходят \(10^8\).

Выходные данные

Для каждого набора входных данных выведите \(n\) целых чисел: минимальное общее время ожидания, которое может быть достигнуто для всех домов, нуждающихся в интернете для каждого \(k = 1,2,\ldots,n\).

Примечание

В первом наборе входных данных для \(k=3\) одним из лучших решений является установка серверов в вершинах \(2\), \(6\) и \(8\) и получение следующей задержки:

  • задержка\((2) = 0\)
  • задержка\((5) = \max(3, 5) = 5\)
  • задержка\((6) = 0\)
  • задержка\((8) = 0\)
  • задержка\((9) = \max(2, 4) = 4\)

Таким образом, общая задержка составит \(9\).

E3. Цифровая деревня (экстремальная версия)

графы Деревья дп жадные алгоритмы математика поиск в глубину и подобное снм Структуры данных *2800

Это экстремальная версия задачи. В трех версиях отличаются ограничения на \(n\) и \(m\). Вы можете совершать взломы только в том случае, если решены все версии задачи.

Пак Чанек устанавливает интернет-связь в деревне Кхунтиен. Деревню можно представить как связный простой граф с \(n\) домами и \(m\) интернет-кабелями, соединяющими дом \(u_i\) и дом \(v_i\), каждый с задержкой \(w_i\).

Существует \(p\) домов, которым требуется интернет. Пак Чанек может установить серверы не более чем в \(k\) домов. Дома, которым нужен интернет, будут подключены к одному из серверов. Однако, поскольку каждый кабель имеет свою задержку, задержка, которую испытывает дом \(s_i\), нуждающийся в интернете, будет равна максимальной задержке кабелей между этим домом и сервером, к которому он подключен.

Для каждого \(k = 1,2,\ldots,n\), помогите Пак Чанеку определить минимальную суммарную задержку, которая может быть достигнута для всех домов, требующих интернет.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(n\), \(m\), \(p\) (\(2 \le n \le 2 \cdot 10^5\); \(n-1 \le m \le 2 \cdot 10^5\); \(1 \le p \le n\)) — количество домов, количество кабелей и количество домов, которым нужен интернет.

Вторая строка каждого набора входных данных содержит \(p\) целых чисел \(s_1, s_2, \ldots, s_p\) (\(1 \le s_i \le n\)) — номера домов, которым нужен интернет. Гарантируется, что все элементы \(s\) различны.

В \(i\)-й из следующих \(m\) строк каждого набора входных данных содержатся три целых числа \(u_i\), \(v_i\) и \(w_i\) (\(1 \le u_i < v_i \le n\); \(1 \le w_i \le 10^9\)) — интернет-кабель, соединяющий дом \(u_i\) и дом \(v_i\) с задержкой \(w_i\). Гарантируется, что заданные ребра образуют простой связный граф.

Гарантируется, что сумма \(n\) и сумма \(m\) не превосходят \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(n\) целых чисел: минимальное общее время ожидания, которое может быть достигнуто для всех домов, нуждающихся в интернете для каждого \(k = 1,2,\ldots,n\).

Примечание

В первом наборе входных данных для \(k=3\) одним из лучших решений является установка серверов в вершинах \(2\), \(6\) и \(8\) и получение следующей задержки:

  • задержка\((2) = 0\)
  • задержка\((5) = \max(3, 5) = 5\)
  • задержка\((6) = 0\)
  • задержка\((8) = 0\)
  • задержка\((9) = \max(2, 4) = 4\)

Таким образом, общая задержка составит \(9\).

E1. Billetes MX (простая версия)

2-sat Бинарный поиск графы Комбинаторика Конструктив поиск в глубину и подобное снм *2500

Это простая версия задачи. В этой версии гарантируется, что \(q = 0\). Вы можете совершать взломы только в том случае, если решены обе версии задачи.

Целочисленная сетка \(A\) с \(p\) строками и \(q\) столбцами называется красивой, если:

  • Все элементы сетки являются целыми числами от \(0\) до \(2^{30}-1\), и
  • Для любой подсетки XOR значений в углах равен \(0\). Формально, для любых четырех целых чисел \(i_1\), \(i_2\), \(j_1\), \(j_2\) (\(1 \le i_1 < i_2 \le p\); \(1 \le j_1 < j_2 \le q\)) должно выполняться \(A_{i_1, j_1} \oplus A_{i_1, j_2} \oplus A_{i_2, j_1} \oplus A_{i_2, j_2} = 0\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ.

Имеется частично заполненная целочисленная сетка \(G\) с \(n\) строками и \(m\) столбцами, в которой заполнены только \(k\) ячеек. Поликарп хочет узнать, сколькими способами он может распределить целые числа по незаполненным ячейкам, чтобы сетка стала красивой.

Однако Монокарп считает, что эта задача слишком проста. Поэтому он выполнит \(q\) обновлений сетки. В каждом обновлении он будет выбирать незаполненную ячейку и присваивать ей целое число. Заметим, что эти обновления перманентны. То есть изменения, внесенные в сетку, будут применяться при обработке будущих обновлений.

Для каждого из \(q + 1\) состояния сетки (начального состояния и после каждого из \(q\) запросов) определите количество способов, которыми Поликарп может присвоить целые числа незаполненным ячейкам, чтобы сетка стала красивой. Поскольку это число может быть очень большим, от вас требуется только вывести их значения по модулю \(10^9+7\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит четыре целых числа \(n\), \(m\), \(k\) и \(q\) (\(2 \le n, m \le 10^5\); \(0 \le k \le 10^5\); \(q = 0\)) — количество строк, количество столбцов, количество фиксированных ячеек и количество обновлений.

Следующие \(k\) строк содержат по три целых числа \(r\), \(c\) и \(v\) (\(1 \le r \le n, 1 \le c \le m\); \(0 \le v < 2^{30}\)) — изначально элементу \(G_{r, c}\) присвоено целое число \(v\).

Следующие \(q\) строк содержат по три целых числа \(r\), \(c\) и \(v\) (\(1 \le r \le n, 1 \le c \le m\); \(0 \le v < 2^{30}\)) — данное обновление присваивает элементу \(G_{r, c}\) целое число \(v\).

Гарантируется, что пары \((r,c)\) во всех присваиваниях различны.

Гарантируется, что суммы \(n\), \(m\), \(k\) и \(q\) по всем наборам входных данных не превосходят \(10^5\) соответственно.

Выходные данные

Для каждого набора входных данных выведите \(q + 1\) строку. В \(i\)-й строке вывода должен содержаться ответ для \(i\)-го состояния решетки по модулю \(10^9 + 7\).

Примечание

В первом наборе входных данных мы имеем следующую сетку:

\(0\)\(6\)\(10\)
\(6\)\(0\)\(12\)
\(10\)\(12\)\(?\)

Можно доказать, что единственным допустимым значением для ячейки \((3, 3)\) является \(0\).

C. Ч+К+С

графы жадные алгоритмы Конструктив поиск в глубину и подобное реализация Строки хэши *2400

Вам даны два сильно связных\(^{\dagger}\) ориентированных графа, в каждом из которых ровно \(n\) вершин, но может быть разное количество рёбер. Посмотрев на них внимательно, вы заметили важную особенность — длина любого цикла в этих графах делится на \(k\).

Каждая из \(2n\) вершин относится ровно к одному из двух типов: входящая или исходящая. Для каждой вершины вам известен её тип.

Вам нужно определить, можно ли провести ровно \(n\) ориентированных рёбер между исходными графами так, чтобы выполнялись следующие четыре условия:

  • Концы любого добавленного ребра лежат в разных графах.
  • Из каждой исходящей вершины исходит ровно одно добавленное ребро.
  • В каждую входящую вершину входит ровно одно добавленное ребро.
  • В получившемся графе длина любого цикла делится на \(k\).

\(^{\dagger}\)Сильно связный граф — это граф, в котором из каждой вершины существует путь до любой другой вершины.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит единственное целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(2 \le k \le n \le 2 \cdot 10^5\)) — количество вершин в каждом из графов и значение, на которое делится длина каждого цикла.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(a_i \in \{0, 1\}\)). Если \(a_i = 0\), то вершина \(i\) первого графа является входящей. Если \(a_i = 1\), то вершина \(i\) первого графа является исходящей.

Третья строка каждого набора входных данных содержит одно целое число \(m_1\) (\(1 \le m_1 \le 5 \cdot 10^5\)) — количество рёбер в первом графе.

Следующие \(m_1\) строк содержат описания рёбер первого графа. \(i\)-я из них содержит два целых числа \(v_i\) и \(u_i\) (\(1 \le v_i, u_i \le n\)) — ребро в первом графе, ведущее из вершины \(v_i\) в вершину \(u_i\).

Далее в таком же формате следует описание второго графа.

Следующая строка содержит \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) (\(b_i \in \{0, 1\}\)). Если \(b_i = 0\), то вершина \(i\) второго графа является входящей. Если \(b_i = 1\), то вершина \(i\) второго графа является исходящей.

Следующая строка содержит одно целое число \(m_2\) (\(1 \le m_2 \le 5 \cdot 10^5\)) — количество рёбер во втором графе.

Следующие \(m_2\) строк содержат описания рёбер второго графа. \(i\)-я из них содержит два целых числа \(v_i\) и \(u_i\) (\(1 \le v_i, u_i \le n\)) — ребро во втором графе, ведущее из вершины \(v_i\) в вершину \(u_i\).

Гарантируется, что оба графа являются сильно связными, а также длины всех циклов кратны \(k\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\). Гарантируется, что сумма \(m_1\) и сумма \(m_2\) по всем наборам входных данных не превосходят \(5 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если можно провести \(n\) новых рёбер так, чтобы выполнялись все условия, и «NO» (без кавычек) иначе.

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

Примечание

В первом наборе входных данных можно провести из первого графа во второй граф рёбра \((1, 3)\) и \((4, 2)\) (первое число в паре — номер вершины в первом графе, второе число в паре — номер вершины во втором графе), а из второго графа в первый граф провести рёбра \((1, 2)\), \((4, 3)\) (первое число в паре — номер вершины во втором графе, второе число в паре — номер вершины в первом графе).

Во втором наборе входных данных всего есть \(4\) входящих вершины и \(2\) исходящих, поэтому нельзя провести \(3\) рёбер.

F. Выбери свои запросы

графы Деревья дп жадные алгоритмы Конструктив поиск в глубину и подобное *2700

Дан массив \(a\), состоящий из \(n\) целых чисел (нумеруемых от \(1\) до \(n\)). Изначально все они равны нулю.

Необходимо обработать \(q\) запросов \(i\)-й запрос состоит из двух различных целых чисел \(x_i\) и \(y_i\). В ходе \(i\)-го запроса нужно выбрать целое число \(p\) (которое равно либо \(x_i\), либо \(y_i\)) и целое число \(d\) (которое равно либо \(1\), либо \(-1\)), и присвоить \(a_p = a_p + d\).

После каждого запроса каждый элемент массива \(a\) должен быть неотрицательным целым числом.

Необходимо обработать все запросы таким образом, чтобы сумма всех элементов массива \(a\) после последнего запроса была минимально возможной.

Входные данные

Первая строка содержит два целых числа \(n\) и \(q\) (\(2 \le n \le 3 \cdot 10^5\); \(1 \le q \le 3 \cdot 10^5\)) — количество элементов в массиве \(a\) и количество запросов соответственно.

Затем следуют \(q\) строк. \(i\)-я из этих строк содержит два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\); \(x_i \ne y_i\)) — описание \(i\)-го запроса.

Выходные данные

Для каждого запроса выведите строку, содержащую два символа:

  • первый символ должен быть x, если вы выбрали \(p=x_i\), или y, если вы выбрали \(p=y_i\);
  • второй символ должен быть +, если вы выбрали \(d=1\), или -, если вы выбрали \(d=-1\).

Если существует несколько ответов, выведите любой из них.

E. Лучшая подпоследовательность

битмаски графы Паросочетания поиск в глубину и подобное Потоки *2500

Задан целочисленный массив \(a\) размера \(n\).

Скажем, что ценность массива равна его размеру минус количество единичных бит в побитовом ИЛИ всех элементов массива.

Например, для массива \([1, 0, 1, 2]\) побитовое ИЛИ равно \(3\) (содержит \(2\) единичных бита), а ценность массива равна \(4-2=2\).

Ваша задача — вычислить максимально возможную ценность некоторой подпоследовательности заданного массива.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(1 \le n \le 100\)).

Вторая строка набора содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i < 2^{60}\)).

Выходные данные

Для каждого набора входных данных выведите максимально возможную ценность некоторой подпоследовательности заданного массива.

F. Мороженое в Бермарте

Деревья дп поиск в глубину и подобное разделяй и властвуй реализация Структуры данных *2700

В сети магазинов Бермарт продается мороженое. У каждого сорта мороженого есть два параметра: цена и вкусность.

Изначально есть один магазин с номером \(1\), в котором ничего не продаётся. Требуется обработать \(q\) запросов следующих типов:

  • \(1~x\) — открывается новый магазин, в котором продаются те же сорта мороженого, что и в магазине \(x\). Он получает первый свободный порядковый номер. Порядок появления сортов мороженого в новом магазине тот же, что и в магазине \(x\).
  • \(2~x~p~t\) — в магазине \(x\) в продаже появляется сорт мороженого с ценой \(p\) и вкусностью \(t\).
  • \(3~x\) — в магазине \(x\) исчезает из продажи сорт мороженого, который там появился раньше всего.
  • \(4~x~p\) — для магазина \(x\) надо найти максимальную суммарную вкусность поднабора сортов, которые там продаются, так, чтобы суммарная цена не превышала \(p\) (каждый сорт можно использовать в поднаборе не более одного раз).
Входные данные

В первой строке записано одно целое число \(q\) (\(1 \le q \le 3 \cdot 10^4\)) — количество запросов.

В каждой из \(q\) следующих строк записан очередной запрос в формате, описанном в условии:

  • \(1~x\);
  • \(2~x~p~t\) (\(1 \le p, t \le 2000\));
  • \(3~x\);
  • \(4~x~p\) (\(1 \le p \le 2000\)).

Дополнительные ограничения на входные данные:

  • \(x\) в каждом запросе не превышает текущего количества магазинов (то есть, \(1\) плюс количество запросов типа \(1\));
  • запрос типа \(3\) не применяется к магазину, в котором нет ни одного типа мороженого;
  • есть хотя бы один запрос типа \(4\).
Выходные данные

На каждый запрос типа \(4\) выведите одно целое число — для магазина \(x\) найдите максимальную суммарную вкусность поднабора сортов, которые там продаются, так, чтобы суммарная цена не превышала \(p\) (каждый сорт можно использовать в поднаборе не более одного раз).

C. Добавьте нули

графы дп жадные алгоритмы Перебор поиск в глубину и подобное Структуры данных *1500

Вам дан массив \(a\), изначально содержащий \(n\) целых чисел. За одну операцию вы можете сделать следующее:

  • Выбрать позицию \(i\) такую, что \(1 < i \le |a|\) и \(a_i = |a| + 1 - i\), где \(|a|\) — текущая длина массива.
  • Добавить \(i - 1\) нулей в конец \(a\).

Какова максимально возможная длина массива \(a\) после выполнения данной операции некоторое количество раз (возможно, нулевое)?

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно число \(n\) (\(1 \le n \le 3 \cdot 10^5\)) — длину массива \(a\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^{12}\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимально возможную длину \(a\) после выполнения некоторой последовательности операций.

Примечание

В первом наборе входных данных мы можем сначала выбрать \(i = 4\), так как \(a_4 = 5 + 1 - 4 = 2\). После этого массив станет равен \([2, 4, 6, 2, 5, 0, 0, 0]\). Затем мы можем выбрать \(i = 3\), так как \(a_3 = 8 + 1 - 3 = 6\). После этого массив станет равен \([2, 4, 6, 2, 5, 0, 0, 0, 0, 0]\), то есть будет иметь длину \(10\). Можно показать, что нельзя получить более длинный массив.

Во втором наборе входных данных мы можем выбрать \(i=2\), затем \(i=3\), затем \(i=4\). Итоговый массив будет равен \([5, 4, 4, 5, 1, 0, 0, 0, 0, 0, 0]\), и его длина будет равняться \(11\).

E. Приключения Алисы в кроличьей норе

Деревья дп жадные алгоритмы игры Комбинаторика математика поиск в глубину и подобное Теория вероятностей *2300

Алиса находится на дне кроличьей норы! Кроличья нора может быть смоделирована как дерево\(^{\text{∗}}\), у которого выход находится на вершине \(1\), а Алиса начинает с некоторой вершины \(v\). Она хочет выбраться из норы, но, к сожалению, Дама Червей приказала её казнить.

Каждую минуту подбрасывается обычная монета. Если выпадает орёл, Алиса может переместиться в любую вершину, смежную со своим текущим положением, а если решка, Дама Червей может перетащить Алису на смежную вершину по своему выбору. Если Алиса когда-либо окажется на любом из некорневых листьев\(^{\text{†}}\) дерева, Алиса проигрывает.

Предполагая, что они обе действуют оптимально, для каждой начальной вершины \(1\le v\le n\) вычислите вероятность того, что Алиса сможет убежать. Поскольку эти вероятности могут быть очень малыми, выведите их по модулю \(998\,244\,353\).

Формально, пусть \(M = 998\,244\,353\). Можно показать, что точный ответ может быть представлен в виде несократимой дроби \(\frac{p}{q}\), где \(p\) и \(q\) — целые числа, и \(q \not \equiv 0 \pmod{M}\). Выведите целое число, равное \(p \cdot q^{-1} \bmod M\). Другими словами, выведите такое целое число \(x\), что \(0 \le x < M\) и \(x \cdot q \equiv p \pmod{M}\).

\(^{\text{∗}}\)Дерево — это связный простой граф, который имеет \(n\) вершин и \(n-1\) рёбер.

\(^{\text{†}}\)Лист — это вершина, соединённая ровно с одним ребром.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2\le n\le 2\cdot 10^5\)) — количество вершин в дереве.

\(i\)-я из следующих \(n - 1\) строк содержит два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\) и \(x_i \neq y_i\)) — рёбра дерева. Гарантируется, что заданные ребра образуют дерево.

Сумма значений \(n\) по всем наборам входных данных не превосходит \(2\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(n\) целых чисел в одной строке — вероятности того, что Алиса убежит, начиная с вершины \(1, 2, \ldots, n\). Поскольку эти вероятности могут быть очень малыми, выведите их по модулю \(998\,244\,353\).

Примечание

Для первого набора входных данных:

  1. Алиса убегает из корня (вершина \(1\)) по определению с вероятностью \(1\).
  2. Алиса немедленно проигрывает из вершин \(4\) и \(5\), так как они являются листьями.
  3. Из других двух вершин Алиса убегает с вероятностью \(\frac 12\), так как Дама перетащит её к листьям.

D. Классный граф

графы Деревья жадные алгоритмы Конструктив поиск в глубину и подобное снм Структуры данных *1900

Вам дан неориентированный граф с \(n\) вершинами и \(m\) рёбрами.

Вы можете выполнить следующую операцию не более чем \(2\cdot \max(n,m)\) раз:

  • Выберите три различные вершины \(a\), \(b\) и \(c\). Затем для каждого из рёбер \((a,b)\), \((b,c)\) и \((c,a)\) выполните следующее:
    • Если ребро не существует, добавьте его. В противном случае, если оно существует, удалите его.

Граф называется классным, если и только если выполняется одно из следующих условий:

  • Граф не имеет рёбер, или
  • Граф является деревом.

Вам нужно сделать граф классным, выполняя указанные выше операции. Обратите внимание, что вы можете использовать не более чем \(2\cdot \max(n,m)\) операций.

Можно показать, что всегда существует хотя бы одно решение.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1\le t\le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(3\le n\le 10^5\), \(0\le m\le \min\left(\frac{n(n-1)}{2},2\cdot 10^5\right)\)) — количество вершин и количество рёбер.

Затем следуют \(m\) строк, \(i\)-я строка содержит два целых числа \(u_i\) и \(v_i\) (\(1\le u_i,v_i\le n\)) — две вершины, которые соединяет \(i\)-е ребро.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(10^5\), а сумма \(m\) по всем наборам входных данных не превышает \(2\cdot 10^5\).

Гарантируется, что в данном графе нет петель или кратных рёбер.

Выходные данные

Для каждого набора входных данных в первой строке выведите целое число \(k\) (\(0\le k\le 2\cdot \max(n, m)\)) — количество операций.

Затем выведите \(k\) строк, \(i\)-я строка содержит три различных целых числа \(a\), \(b\) и \(c\) (\(1\le a,b,c\le n\)) — три целых числа, которые вы выбрали в \(i\)-й операции.

Если существует несколько решений, вы можете вывести любое из них.

Примечание

В первом наборе входных данных граф уже классный, потому что рёбер нет.

Во втором наборе входных данных, после выполнения единственной операции, граф становится деревом, поэтому он классный.

В третьем наборе входных данных граф уже классный, потому что он является деревом.

В четвёртом наборе входных данных, после выполнения единственной операции, граф не имеет рёбер, поэтому он классный.

В пятом наборе входных данных:

ОперацияГраф до операцииГраф после операции
\(1\)
\(2\)
\(3\)

Обратите внимание, что после первой операции граф уже стал классным, и есть две лишние операции. Поскольку граф по-прежнему классный после двух лишних операций, это является допустимым ответом.

D. Пенчик и пустынный кролик

Бинарный поиск дп жадные алгоритмы поиск в глубину и подобное реализация снм Структуры данных *1700

Пенчик бросил себе вызов — выжить под полуденным солнцем в Аравийской пустыне!

На линейном оазисе в ряд растёт \(n\) пальм, обозначим их высоты \(a_i\). Во время прогулки Пенчик заметил пустынного кролика, который готовится прыгнуть вдоль линии пальм.

Кролик может перепрыгнуть с \(i\)-го дерева на \(j\)-е, если верно ровно одно из следующих условий:

  • \(j < i\) и \(a_j > a_i\): кролик может прыгнуть назад на более высокое дерево.
  • \(j > i\) и \(a_j < a_i\): кролик может прыгнуть вперёд на более низкое дерево.

Для каждого \(i\) от \(1\) до \(n\) определите максимальную высоту среди всех деревьев, которые может достичь кролик, если он начнёт с \(i\)-го дерева.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 5 \cdot 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq 5 \cdot 10^5\)) — количество деревьев.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le n\)) — высоты деревьев.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(5 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(n\) целых чисел. \(i\)-е число должно равняться максимальной высоте среди всех деревьев, которые может достичь кролик, если он начнёт с дерева \(i\).

Примечание

В первом наборе входных данных высоты деревьев равны \(a = [2, 3, 1, 4]\).

  • Если кролик стартует с первого дерева, то он может перепрыгнуть на третье дерево, так как \(3 > 1\) и \(1 < 2\). Затем кролик может перепрыгнуть на второе дерево, так как \(2 < 3\) и \(3 > 1\). Можно доказать, что кролик не может допрыгнуть до четвёртого дерева; следовательно, максимальная высота дерева, до которого может допрыгнуть кролик, равна \(a_2 = 3\).
  • Если кролик стартует с четвёртого дерева, ему не нужно никуда прыгать, так как он уже находится на самом высоком дереве.

Во втором наборе входных данных кролик может прыгнуть на первое дерево независимо от того, с какого дерева он стартует.

В пятом наборе входных данных, если кролик начинает с пятого дерева, он может прыгнуть на четвёртое дерево. Затем кролик может перепрыгнуть на седьмое дерево и, наконец, достичь шестого дерева. Таким образом, максимальная высота дерева, до которого может добраться кролик, равна \(8\).

E. Деревья Пенчика и Хлои

Деревья дп жадные алгоритмы математика поиск в глубину и подобное реализация сортировки Структуры данных *2100

До отъезда Пенчика и Хлои в Сингапур оставалось всего несколько часов, и им не терпелось увидеть высоченные деревья в Сингапурском ботаническом саду! Пытаясь сдержать свое волнение, Пенчик смастерил дерево с корнями, чтобы занять Хлою и себя.

У Пенчика есть корневое дерево\(^{\text{∗}}\), состоящее из \(n\) вершин, пронумерованных от \(1\) до \(n\), с вершиной \(1\) в качестве корня. Хлоя может выбрать целое неотрицательное число \(d\), чтобы создать совершенное бинарное дерево\(^{\text{†}}\) глубины \(d\).

Поскольку Пенчик и Хлоя — хорошие друзья, Хлоя хочет, чтобы ее дерево было изоморфно\(^{\text{‡}}\) дереву Пенчика. Чтобы достичь этого, Хлоя может выполнить следующую операцию над своим деревом любое количество раз:

  • Выбрать ребро \((u,v)\), где \(u\) является родителем \(v\).
  • Удалить вершину \(v\) и все ребра, связанные с \(v\), а затем соединить всех бывших детей \(v\) непосредственно с \(u\).

В частности, операция над ребром \((u, v)\), где \(v\) — лист, удалит вершину \(v\) без добавления новых ребер.

Поскольку построение совершенного бинарного дерева может занять много времени, Хлоя хочет выбрать минимальное \(d\), такое, чтобы совершенное бинарное дерево глубины \(d\) можно было сделать изоморфным дереву Пенчика с помощью вышеописанной операции. Обратите внимание, что Хлоя не может менять корни деревьев.

\(^{\text{∗}}\)Деревом называется связный граф без циклов. Корневым деревом называется дерево, в котором одна из вершин специальная и называется корнем. Родителем вершины \(v\) называется первая вершина на простом пути от \(v\) до корня. У корня нет родителя. Ребенком вершины \(v\) называется любая вершина \(u\), для которой \(v\) является родителем. Листом называется любая вершина, у которой нет детей.

\(^{\text{†}}\)Полным бинарным деревом называется корневое дерево, в котором у каждой вершины \(0\) или \(2\) детей. Совершенное бинарное дерево — это полное бинарное дерево, в котором каждый лист находится на одинаковом расстоянии от корня. Глубина такого дерева равна расстоянию от корня до листа.

\(^{\text{‡}}\)Два дерева с корнями, равными \(r_1\) и \(r_2\) соответственно, считаются изоморфными, если существует такая перестановка вершин \(p\), что ребро \((u, v)\) существует в первом дереве тогда и только тогда, когда ребро \((p_u, p_v)\) существует во втором дереве, и \(p_{r_1} = r_2\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 10^6\)) — количество вершин в дереве Пенчика.

Вторая строка каждого набора входных данных содержит \(n-1\) целых чисел \(p_2, p_3, \ldots, p_n\) (\(1 \leq p_i \leq i-1\)) — родитель вершины \(i\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

Для каждого набора входных данных выведите в отдельной строке одно целое число: минимальную глубину совершенного бинарного дерева Хлои.

Примечание

В первом наборе входных данных можно создать совершенное бинарное дерево глубины \(2\).

Рассмотрим выполнение операции на ребре \(AC\). Рёбра \(AC\), \(CF\) и \(CG\) удаляются, а рёбра \(AF\) и \(AG\) добавляются.

Полученное дерево изоморфно дереву, заданному на входе. Можно доказать, что никакая последовательность операций над бинарным деревом глубины менее \(2\) не может привести к дереву, изоморфному дереву, заданному на входе.

Во втором наборе входных данных дерево уже изоморфно совершенному бинарному дереву глубины \(3\).

E. Сакурако, Косукэ и перестановка

графы жадные алгоритмы математика Перебор поиск в глубину и подобное снм Структуры данных *1400

Экзамены Сакурако закончились, она справилась на отлично. В награду она получила перестановку \(p\). Косукэ был не совсем доволен, потому что он провалил один экзамен и не получил подарок. Он решил пробраться в её комнату (спасибо за код от её замка) и испортить перестановку так, чтобы она стала простой.

Перестановка \(p\) считается простой, если для каждого \(i\) \((1\le i \le n)\) выполняется одно из условий:

  • \(p_i=i\)
  • \(p_{p_i}=i\)

Например, перестановки \([1, 2, 3, 4]\), \([5, 2, 4, 3, 1]\) и \([2, 1]\) являются простыми, а \([2, 3, 1]\) и \([5, 2, 1, 4, 3]\) — нет.

За одну операцию Косукэ может выбрать индексы \(i,j\) \((1\le i,j\le n)\) и поменять местами элементы \(p_i\) и \(p_j\).

Сакурако вот-вот вернется домой. Ваша задача — вычислить минимальное количество операций, которые необходимо выполнить Косукэ, чтобы сделать перестановку простой.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1\le t\le 10^4\)) — количество наборов входных данных.

Каждый набор входных данных описывается двумя строками.

  • Первая строка содержит одно целое число \(n\) (\(1\le n \le 10^6\)) — длину перестановки \(p\).
  • Вторая строка содержит \(n\) целых чисел \(p_i\) (\(1\le p_i\le n\)) — элементы перестановки \(p\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(10^6\).

Гарантируется, что \(p\) является перестановкой.

Выходные данные

Для каждого набора входных данных выведите минимальное количество операций, которые необходимо выполнить Косукэ, чтобы перестановка стала простой.

Примечание

В первом и втором примерах перестановки уже простые.

В четвёртом примере достаточно поменять местами \(p_2\) и \(p_4\). Таким образом перестановка станет равна \([2, 1, 4, 3]\) за \(1\) операцию.

G. Сакурако и Чефир

Деревья дп жадные алгоритмы поиск в глубину и подобное Структуры данных *2200

Дано дерево из \(n\) вершин с корнем в вершине \(1\). Гуляя по нему со своим котом Чефиром, Сакурако отвлеклась, и Чефир убежал.

Чтобы помочь Сакурако, Косукэ записал свои \(q\) предположений. В \(i\)-м предположении он считает, что Чефир потерялся в вершине \(v_i\) и имел \(k_i\) выносливости.

Также для каждого предположения Косукэ считает, что Чефир мог переместиться по рёбрам произвольное число раз:

  • из вершины \(a\) в вершину \(b\), если \(a\) является предком\(^{\text{∗}}\) \(b\), выносливость от этого не изменится;
  • из вершины \(a\) в вершину \(b\), если \(a\) не является предком \(b\), тогда выносливость Чефира понизится на \(1\).

Если выносливость Чефира равна \(0\), то он не сможет сделать перемещение второго типа.

Для каждого предположения ваша задача — вычислить расстояние до самой дальней вершины, в которую Чефир мог уйти от вершины \(v_i\), имея \(k_i\) выносливости.

\(^{\text{∗}}\)Вершина \(a\) является предком вершины \(b\), если кратчайший путь от \(b\) к корню проходит через \(a\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1\le t\le 10^4\)) — количество наборов входных данных.

Каждый набор входных данных описывается следующим образом:

  • Первая строка содержит одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество вершин в дереве.
  • Следующие \(n-1\) строки содержат ребра дерева. Гарантируется, что заданные ребра образуют дерево.
  • Следующая строка состоит из одного целого числа \(q\) \((1\le q\le 2 \cdot 10^5)\), которое обозначает количество предположений Косукэ.
  • Следующие \(q\) строк описывают предположения, которые сделал Косукэ, двумя целыми числами \(v_i\), \(k_i\) \((1\le v_i \le n, 0 \le k_i\le n)\).

Гарантируется, что сумма \(n\) и сумма \(q\) по всем наборам входных данных не превышает \(2\cdot 10^5\).

Выходные данные

Для каждого теста и для каждого предположения выведите расстояние до самой дальней вершины, в которую Чефир мог пройти от начальной точки \(v_i\) имея \(k_i\) выносливости.

Примечание

В первом примере:

  • В первом запросе можно пройти из вершины \(5\) в вершину \(3\) (после этого выносливость уменьшится на \(1\) и станет равна \(0\)), после этого можно пройти в вершину \(4\);
  • Во втором запросе из вершины \(3\) имея \(1\) выносливости можно добраться только до вершин \(2\), \(3\), \(4\) и \(5\);
  • В третьем запросе из вершины \(2\) имея \(0\) выносливости можно добраться только до вершин \(2\), \(3\), \(4\) и \(5\);

C. Заперт в лабиринте ведьмы

графы Конструктив поиск в глубину и подобное реализация *1400

В четвёртом подвиге Рустама, легендарного героя из Шахнаме, старая ведьма создала волшебный лабиринт, чтобы заманить его в ловушку. Лабиринт представляет собой прямоугольную сетку, состоящую из \(n\) строк и \(m\) столбцов. Каждая клетка в лабиринте указывает в определенном направлении: вверх, вниз, влево или вправо. Ведьма заколдовала Рустама так, что всякий раз, когда он находится в клетке, он перемещается в следующую клетку в направлении, указанном этой клеткой.

Если Рустам в конце концов выйдет из лабиринта, он освободится от чар ведьмы и победит ее. Однако, если он будет вечно блуждать по лабиринту, то он останется там навсегда.

Ведьма еще не определила направления для всех клеток. Она хочет назначить направления для неуказанных клеток таким образом, чтобы количество клеток, начав из которых Рустам будет пойман навсегда, было максимальным. Ваша задача — найти это количество.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Для каждого набора входных данных:

  • Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \leq n, m \leq 1000\)), представляющих количество строк и столбцов в лабиринте.
  • Каждая из следующих \(n\) строк содержит строку из \(m\) символов, представляющих направления в лабиринте. Каждый символ является одним из следующих:
    • U (вверх)
    • D (вниз)
    • L (влево)
    • R (вправо)
    • ? (неуказанное направление)

Гарантируется, что сумма \(n \cdot m\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимальное количество клеток, начиная из которых Рустам будет заперт навсегда, после оптимального назначения направлений неопределенным ячейкам.

Примечание

Назовём плохими клетки, начиная в которых Рустам не сможет выбраться. Остальные клетки назовём хорошими.

В первом наборе входных данных все клетки будут хорошими, независимо от ваших действий.

Во втором наборе входных данных, если вы назначите ? значения, как показано на рисунке ниже, все клетки будут плохими:

В третьем наборе входных данных, если вы назначите ? значения, как показано на рисунке ниже, у вас будет \(5\) плохих клеток (клетки, закрашенные красным):

H. Райан против Райанех

дп Перебор поиск в глубину и подобное теория чисел *3300

Райан прилагает последние усилия, чтобы завоевать сердце Рейхане, утверждая, что он сильнее Райанех (то есть компьютера на персидском). Чтобы проверить это, Рейхане обращается за помощью к Хорезми. Хорезми объясняет, что множество является целочисленно линейно независимым, если ни один элемент в наборе не может быть получен как целочисленная линейная комбинация остальных. Райану задается набор целых чисел, и он должен найти одно из максимально возможных целочисленных линейно независимых подмножеств.

Обратите внимание, что один элемент всегда является целочисленным линейно независимым подмножеством.

Целочисленная линейная комбинация чисел \(a_1, \ldots, a_k\) — это любая сумма вида \(c_1 \cdot a_1 + c_2 \cdot a_2 + \ldots + c_k \cdot a_k\) где \(c_1, c_2, \ldots, c_k\) — целые числа (которые могут быть нулевыми, положительными или отрицательными).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \leq n \leq 10^5\)) — размер множества. Вторая строка содержит \(n\) различных целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 10^5\)).

Сумма \(n\) по всем наборам входных данных не превосходит \(3 \cdot 10^6\).

Выходные данные

В первой строке каждого набора входных данных выведите размер наибольшего целочисленного линейно независимого подмножества.

В следующей строке выведите одно такое подмножество. Если существует несколько ответов, выведите любой из них.

Примечание

В 1 наборе входных данных: \(\{4, 6\}\) — это целочисленное линейно независимое подмножество. Можно доказать, что не существует целочисленного линейно независимого подмножества, состоящего по крайней мере \(3\) из элементов.

Во 2 наборе входных данных: \(\{35, 21, 30\}\) — это целочисленное линейно независимое подмножество, поскольку никакая целочисленная линейная комбинация любых двух элементов не может создать третий. Не существует целочисленного линейно независимого подмножества, содержащего по крайней мере \(4\) элемента.

В 3 наборе входных данных: \(\{2, 3, 6\}\) не является целочисленным линейно независимым подмножеством, поскольку \(6\) может быть записано как \(6 \cdot 2 + (-2) \cdot 3\), что является целочисленной линейной комбинацией из \(\{2, 3\}\).

F. Операции с деревом

Бинарный поиск Деревья дп Перебор поиск в глубину и подобное *2500

Это многое говорит об обществе.

Однажды черепаха подарила вам дерево с \(n\) вершинами и корнем в вершине \(x\). Вершина \(i\) имеет начальное целое неотрицательное значение \(a_i\).

Вы хотите сделать так, чтобы значения всех вершин стали равны \(0\). Для этого вы выполните ряд операций над деревом, где каждая операция будет выполняться над определенной вершиной. Определим операцию над вершиной \(u\) как выбор одной вершины в поддереве\(^{\text{∗}}\) \(u\), и увеличение или уменьшение ее значения на \(1\). Порядок выполнения операций над вершинами следующий:

  • Для \(1 \le i \le n\), \(i\)-я операция будет выполнена над вершиной \(i\).
  • Для \(i > n\), \(i\)-я операция будет выполнена над той же вершиной, что и операция \(i - n\).

Более формально, \(i\)-я операция будет выполнена над \((((i - 1) \bmod n) + 1)\)-й вершиной.\(^{\text{†}}\)

Обратите внимание, что нельзя пропускать операции; то есть нельзя выполнить \(i\)-ю операцию, не выполнив сначала операции \(1, 2, \ldots, i - 1\).

Найдите минимальное количество операций, которое необходимо выполнить, чтобы значения всех вершин стали равны \(0\), при условии, что вы выполняете операции оптимально. Если после конечного числа операций невозможно сделать значения всех вершин равными \(0\), выведите \(-1\).

\(^{\text{∗}}\)Поддерево вершины \(u\) — это множество вершин, для которых \(u\) лежит на кратчайшем пути от этой вершины до корня, включая саму \(u\)

\(^{\text{†}}\)Здесь \(a \bmod b\) обозначает остаток от деления \(a\) на \(b\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1\le t\le 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(x\) (\(1 \le n \le 2000\), \(1 \le x \le n\)) — количество вершин и корень дерева.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le 10^9\)) — начальное значение каждой вершины.

В следующих \(n - 1\) строках каждого набора входных данных содержится по два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \neq v\)), представляющих собой ненаправленное ребро из \(u\) в \(v\). Гарантируется, что заданные ребра образуют дерево.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2000\).

Выходные данные

Для каждого набора входных данных выведите одно целое число, обозначающее минимальное количество операций, необходимое для того, чтобы сделать значения всех вершин равными \(0\). Если невозможно сделать значения всех вершин равными \(0\), выведите \(-1\).

Примечание

В первом наборе входных данных вы можете выполнить следующую последовательность операций:

  • На \(1\) операции уменьшите значение вершины \(1\). Эта операция корректна, потому что \((((1 - 1) \bmod n) + 1) = 1\), и вершина \(1\) находится в поддереве вершины \(1\).
  • На \(2\) операции уменьшите значение вершины \(2\). Эта операция корректна, потому что \((((2 - 1) \bmod n) + 1) = 2\), и вершина \(2\) находится в поддереве вершины \(2\).
  • На \(3\) операции уменьшите значение вершины \(2\). Эта операция корректна, потому что \((((3 - 1) \bmod n) + 1) = 1\), а вершина \(2\) находится в поддереве вершины \(1\).

D. Непростое дерево

Деревья жадные алгоритмы Конструктив Перебор поиск в глубину и подобное теория чисел *1900

Дано дерево с \(n\) вершинами.

Вам необходимо создать массив \(a_1, a_2, \ldots, a_n\) длины \(n\), состоящий из различных целых чисел от \(1\) до \(2 \cdot n\). При этом для каждого ребра \(u_i \leftrightarrow v_i\) дерева значение \(|a_{u_i} - a_{v_i}|\) не должно быть простым числом.

Найдите любой массив, удовлетворяющий этим условиям, либо сообщите, что такого массива нет.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество вершин в дереве.

В следующих \(n - 1\) строках каждого набора входных данных заданы ребра дерева: по одному в строке. В \(i\)-й строке заданы два целых числа \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\); \(u_i \neq v_i\)), обозначающих ребро между вершинами \(u_i\) и \(v_i\).

Гарантируется, что заданные ребра образуют дерево.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10 ^ 5\).

Выходные данные

Для каждого набора входных данных, если массив, удовлетворяющий условиям, существует, выведите его элементы \(a_1, a_2, \ldots, a_n\). Иначе, выведите единственное число \(-1\).

Примечание

Ниже представлены возможные ответы. Вместо номеров вершин в них записаны соответствующие элементы массива \(a\).

Изображение дерева в первом наборе
Изображение дерева во втором наборе

E. Контроль случайности

графы Деревья дп жадные алгоритмы Комбинаторика математика поиск в глубину и подобное Теория вероятностей *2100

Дано дерево с \(n\) вершинами.

В некоторую вершину \(v \ne 1\) посадят робота. Пусть у вас изначально есть \(p\) монет. Рассмотрим следующий процесс, где в \(i\)-й шаг (начиная с \(i = 1\)):

  • Если \(i\) нечётное, робот передвинется в соседнюю вершину в сторону вершины \(1\);
  • Иначе, \(i\) чётное. Можно либо заплатить одну монету (если остались), после чего робот передвинется в соседнюю вершину в сторону вершины \(1\), либо ничего не платить, после чего робот передвинется в равновероятно выбранную соседнюю вершину.

Процесс останавливается, как только робот попадает в вершину \(1\). Определим \(f(v, p)\) как минимально возможное математическое ожидание количества шагов процесса выше (количество использованных монет минимизировать не надо).

Необходимо ответить на \(q\) запросов, в \(i\)-м из которых надо найти значение \(f(v_i, p_i)\) по модулю\(^{\text{∗}}\) \(998\,244\,353\).

\(^{\text{∗}}\) Формально, пусть \(M = 998\,244\,353\). Можно показать, что ответ может быть представлен в виде несократимой дроби \(\frac{p}{q}\), где \(p\) и \(q\) — целые числа, и \(q \not \equiv 0 \pmod{M}\). Выведите целое число, равное \(p \cdot q^{-1} \bmod M\). Другими словами, выведите такое целое число \(x\), что \(0 \le x < M\) и \(x \cdot q \equiv p \pmod{M}\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа: \(n\) и \(q\) (\(2 \le n \le 2 \cdot 10^3\); \(1 \le q \le 2 \cdot 10^3\)) — количество вершин в дереве и количество запросов.

В следующих \(n - 1\) строках каждого набора входных данных заданы ребра дерева: по одному в строке. В \(i\)-й строке заданы два целых числа \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\); \(u_i \neq v_i\)), обозначающих ребро между вершинами \(u_i\) и \(v_i\).

В следующих \(q\) строках каждого набора входных данных заданы два целых числа: \(v_i\) и \(p_i\) (\(2 \le v_i \le n\); \(0 \le p_i \le n\)).

Гарантируется, что заданные ребра образуют дерево.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10 ^ 3\).

Гарантируется, что сумма значений \(q\) по всем наборам входных данных не превосходит \(2 \cdot 10 ^ 3\).

Выходные данные

Для каждого набора входных данных выведите \(q\) целых чисел: значения \(f(v_i, p_i)\) по модулю \(998\,244\,353\).

Формально, пусть \(M = 998\,244\,353\). Можно показать, что ответ может быть представлен в виде несократимой дроби \(\frac{p}{q}\), где \(p\) и \(q\) — целые числа, и \(q \not \equiv 0 \pmod{M}\). Выведите целое число, равное \(p \cdot q^{-1} \bmod M\). Другими словами, выведите такое целое число \(x\), что \(0 \le x < M\) и \(x \cdot q \equiv p \pmod{M}\).

Примечание

Дерево из первого набора показано ниже:

Для первого запроса значение математического ожидания равно \(1\), так как робот начинает движение с вершины \(2\) и первым ходом попадает в вершину \(1\) и завершает перемещение.

Посчитаем значение математического ожидания для второго запроса (\(x\) это количество шагов в процессе):

  • \(P(x < 2) = 0\), расстояние до вершины \(1\) равно \(2\) и робот не может дойти до него за меньшее количество шагов.
  • \(P(x = 2) = \frac{1}{3}\), так как есть только одна последовательность шагов, приводящая к \(x = 2\). Это \(3 \rightarrow_{1} 2 \rightarrow_{0.33} 1\) с вероятностью \(1 \cdot \frac{1}{3}\).
  • \(P(x \bmod 2 = 1) = 0\), так как робот может достичь вершину \(1\) сделав только чётное количество шагов.
  • \(P(x = 4) = \frac{2}{9}\): возможные пути \(3 \rightarrow_{1} 2 \rightarrow_{0.67} [3, 4] \rightarrow_{1} 2 \rightarrow_{0.33} 1\).
  • \(P(x = 6) = \frac{4}{27}\): возможные пути \(3 \rightarrow_{1} 2 \rightarrow_{0.67} [3, 4] \rightarrow_{1} 2 \rightarrow_{0.67} [3, 4] \rightarrow_{1} 2 \rightarrow_{0.33} 1\).
  • \(P(x = i \cdot 2) = \frac{2^{i - 1}}{3^i}\) в общем случае.

В результате \(f(v, p) = \sum\limits_{i=1}^{\infty}{i \cdot 2 \cdot \frac{2^{i - 1}}{3^i}} = 6\).

Дерево из второго набора показано ниже:

C. Cube

битмаски дп поиск в глубину и подобное *2000

You are given an \(n\times n\times n\) big three-dimensional cube that contains \(n^3\) numbers. You have to choose \(n\) of those numbers so that their sum is as small as possible. It is, however, forbidden to choose two numbers that are located in the same plane. That is, if we identify the positions in the cube by three Cartesian coordinates, then choosing two numbers from positions \((x,y,z)\) and \((x',y',z')\) is forbidden if \(x=x'\), \(y=y'\), or \(z=z'\).

Input

The input consists of the number \(n\) followed by \(n^3\) numbers in the cube. The numbers are presented as \(n\) two-dimensional matrices, one for each layer of the cube. More precisely, there will be \(n^2\) lines follow, each having \(n\) numbers. For each \(x, y, z\) (\(1\le x, y, z\le n\)), the number at the position \((x, y, z)\) is listed as the \(z\)-th number in the \(((x-1)\times n+y)\)-th line.

  • \(2 \leq n \leq 12\)
  • All numbers in the cube are integers between \(0\) and \(2\times 10^7\).
Output

The output consists of a single number. It is the minimum sum of \(n\) numbers chosen from the cube according to the above rules.

D. Drunken Maze

графы кратчайшие пути Перебор поиск в глубину и подобное *1700

Image generated by ChatGPT 4o.

You are given a two-dimensional maze with a start and end position. Your task is to find the fastest way to get from the start to the end position. The fastest way is to make the minimum number of steps where one step is going left, right, up, or down. Of course, you cannot walk through walls.

There is, however, a catch: If you make more than three steps in the same direction, you lose balance and fall down. Therefore, it is forbidden to make more than three consecutive steps in the same direction. It is okay to walk three times to the right, then one step to the left, and then again three steps to the right. This has the same effect as taking five steps to the right, but is slower.

Input

The first line contains two numbers \(n\) and \(m\), which are the height and width of the maze. This is followed by an ASCII-representation of the maze where \(\tt{\#}\) is a wall, \(\tt{.}\) is an empty space, and \(\tt S\) and \(\tt T\) are the start and end positions.

  • \(12 \leq n\times m \leq 200000\).
  • \(3\leq n,m \leq 10000\).
  • Characters are only \(\tt{.\#ST}\) and there is exactly one \(\tt{S}\) and one \(\tt{T}\).
  • The outer borders are only \(\tt{\#}\) (walls).
Output

The minimum number of steps to reach the end position from the start position or -1 if that is impossible.

F. Segmentation Folds

Перебор поиск в глубину и подобное теория чисел *2400

Peter loves folding segments. There is a segment on a number line occupying the interval \([\ell, r]\). Since it is the prime time for folding the segments, Peter decides to fold the segment carefully. In each step, he chooses one of the two following operations whenever possible:

  1. Operation \(\tt{LTR}\): he folds the segment from left to right, where \(\ell\) coincides with a point \(x\) (\(\ell < x \le r\)) such that \(\ell+x\) is a prime number\(^{\text{∗}}\). When Peter chooses this operation, he always chooses the largest possible value \(x\). Note that the segment occupies the interval \([\frac{1}{2}(\ell+x), r]\) afterwards.
  2. Operation \(\tt{RTL}\): he folds the segment from right to left, where \(r\) coincides with a point \(x\) (\(\ell \le x < r\)) such that \(r+x\) is a prime number. When Peter chooses this operation, he always chooses the smallest possible value \(x\). Note that the segment occupies the interval \([\ell, \frac{1}{2}(r+x)]\) afterwards.

A folding sequence refers to a sequence of operations specified above. Peter wants to fold the segment several times, resulting in the shortest possible interval whose length that cannot be further reduced. The length of an interval \([\ell, r]\) is defined naturally to be \(r-\ell\). Let's consider the following example. Suppose that we are folding a segment initially occupying the interval \([1, 30]\). There are three folding sequences that lead to the shortest possible resulting interval, as shown in the following figure.

Please help Peter determine the number of folding sequences such that the resulting interval has a shortest possible length. Output the number modulo \(998244353\).

\(^{\text{∗}}\)Recall that an integer \(p>1\) is a prime number if there do not exist integers \(a, b>1\) such that \(p=ab\).

Input

The first line contains an integer \(t\), denoting the number of test cases. In each of the following \(t\) lines, there are two integers \(\ell\) and \(r\).

  • \(1 \le t \le 10\)
  • \(1 \le \ell < r \le 10^{12}\)
  • \(r - \ell \le 10^5\)
Output

For each test case, please output a line denoting the number of ways to fold the given segment such that the resulting segment has the shortest possible length, modulo \(998244353\).

K. Trophic Balance Species

Бинарный поиск графы Перебор поиск в глубину и подобное *3100

Image generated by ChatGPT 4o.

In an interdisciplinary collaboration, an ecosystem scientist and a computer scientist join forces to analyze the structure of a complex ecosystem using computational methods. The ecosystem scientist models the ecosystem as a directed graph \(D = (V, A)\), where each species is represented by a node \(v \in V\), and each feeding relationship is represented as a directed edge \((x, y) \in A\) from prey \(x\) to predator \(y\). This graph structure allows them to simulate the flow of energy throughout the ecosystem from one species to another.

Two essential features of the ecosystem are defined:

  • Independent Trophic Group: A set \(S\) of animal species is classified as an independent trophic group if no species \(x \in S\) can reach another species \(y \in S\) (for some \(y \ne x\)) through a series of directed feeding relationships, meaning there is no directed path in \(D\) from \(x\) to \(y\).

  • Trophic Balance Species: A species is termed a trophic balance species if it has a nearly equal number of species that affect it as directly or indirectly predators (species it can reach via a directed path in \(D\), excluding itself) and species that affect it as directly or indirectly prey (species that can reach it via a directed path in \(D\), excluding itself). Specifically, trophic balance species are those for which the absolute difference between the above two numbers is minimum among all species in the ecosystem.

Consider an ecosystem with \(n = 4\) species and \(m = 3\) feeding relationships:

  • Species 1: Grass (Node 1)
  • Species 2: Rabbits (Node 2)
  • Species 3: Foxes (Node 3)
  • Species 4: Hawks (Node 4)

The directed edges representing the feeding relationships are as follows:

  • \((1, 2)\): Grass is eaten by Rabbits.
  • \((2, 3)\): Rabbits are eaten by Foxes.
  • \((2, 4)\): Rabbits are also eaten by Hawks.

Now, consider the set \(S=\{3,4\}\) (Foxes and Hawks). There are no directed paths between Foxes (Node 3) and Hawks (Node 4); Foxes cannot reach Hawks, and Hawks cannot reach Foxes through any directed paths. Therefore, this set qualifies as an independent trophic group.

Examination of Species

  • Species 1 (Grass):
    • Can reach: 3 (Rabbits, Foxes, and Hawks)
    • Can be reached by: 0 (None)
    • Absolute difference: \(|3 - 0| = 3\)

  • Species 2 (Rabbits):

    • Can reach: 2 (Foxes and Hawks)
    • Can be reached by: 1 (Grass)
    • Absolute difference: \(|2 - 1| = 1\)
  • Species 3 (Foxes):

    • Can reach: 0 (None)
    • Can be reached by: 2 (Grass and Rabbits)
    • Absolute difference: \(|0-2| = 2\)
  • Species 4 (Hawks):

    • Can reach: 0 (None)
    • Can be reached by: 2 (Grass and Rabbits)
    • Absolute difference: \(|0-2| = 2\)

Among these species, Rabbits have the smallest absolute difference of \(1\), indicating that they are a trophic balance species within the ecosystem.

It is known that any independent trophic group in the ecosystem has a size of at most \(k\). The task is to find the set of all trophic balance species in the ecosystem.

Input

The first line contains exactly two integers \(n\) and \(m\), where \(n\) (resp. \(m\)) denotes the number of nodes (resp. edges) in the directed graph \(D\) induced by the investigated ecosystem. The nodes are numbered as \(1, 2, \ldots, n\). Then, \(m\) lines follow. The \(i\)-th line contains two integers \(x_i\) and \(y_i\) indicating a directed edge from node \(x_i\) to node \(y_i\).

  • \(1 \le n \le 2 \times 10^5\)
  • \(0 \le m \le \min\{ n(n-1), 4 \times 10^5\}\)
  • \(k\) is not an input value, and it is guaranteed that \(1 \le k \le 16\) for each investigated ecosystem.
  • For all \(i\) (\(1\le i\le m\)), \(1\le x_i, y_i\le n\) and \(x_i\neq y_i\).
  • Each ordered pair \((x_i, y_i)\) appears at most once in the input.
Output

Output on a single line the node identidiers of all trophic balance species in ascending order. For any two consecutive node identifiers, separate them by a space.

E. Пары вершин

Бинарный поиск Деревья жадные алгоритмы Перебор поиск в глубину и подобное разделяй и властвуй реализация Структуры данных *2900

Дано дерево, состоящее из \(2n\) вершин. Напомним, что деревом называется связный неориентированный граф, в котором нет циклов. На каждой вершине написано одно целое число от \(1\) до \(n\). Каждое число от \(1\) до \(n\) написано ровно на двух различных вершинах. У каждой вершины также есть стоимость — вершина \(i\) стоит \(2^i\).

Требуется выбрать в дереве такое подмножество вершин, что:

  • подмножество связно; то есть, из каждой вершины подмножества можно добраться до любой другой вершины подмножества, проходя только через вершины подмножества;
  • каждое число от \(1\) до \(n\) написано хотя бы на одной вершине подмножества.

Среди всех таких подмножеств требуется найти такое, что суммарная стоимость вершин в нем минимальна. Обратите внимание, что не требуется минимизировать количество вершин в подмножестве.

Входные данные

В первой строке записано одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)).

Во второй строке записаны \(2n\) целых чисел \(a_1, a_2, \dots, a_{2n}\) (\(1 \le a_i \le n\)). Каждое число от \(1\) до \(n\) встречается ровно два раза.

В каждой из следующих \(2n-1\) строк записаны два целых числа \(v\) и \(u\) (\(1 \le v, u \le 2n\)) — ребра дерева. Данные ребра образуют валидное дерево.

Выходные данные

В первой строке выведите одно целое число \(k\) — количество вершин в подмножестве.

Во второй строке выведите \(k\) различных целых чисел от \(1\) до \(2n\) — номера вершин в выбранном подмножестве. Вершины можно выводить в произвольном порядке.

Примечание

На данных изображениях нарисованы ответы на первые два примера. В скобках около номеров вершин подписаны числа, написанные на них.

В первом примере есть такие валидные подмножества: \([2, 4, 5]\) (стоимость равна \(2^2 + 2^4 + 2^5 = 52\)), \([2, 4, 5, 6]\) (стоимость равна \(116\)), \([1, 6, 3]\) (стоимость равна \(74\)), \([2, 6, 3]\) (стоимость равна \(76\)) и многие другие.

Во втором примере стоимость подмножества \([4, 6, 3, 1]\) равна \(90\).

E. Преобразование матриц

битмаски графы жадные алгоритмы Перебор поиск в глубину и подобное реализация Структуры данных *2300

Даны две матрицы \(A\) и \(B\) размером \(n \times m\), заполненные целыми числами от \(0\) до \(10^9\). Вы можете выполнять следующие операции над матрицей \(A\) в любом порядке любое количество раз:

  • &=: выбрать два целых числа \(i\) и \(x\) (\(1 \le i \le n\), \(x \ge 0\)) и заменить каждый элемент в строке \(i\) на результат побитового И между числом \(x\) и этим элементом. Формально, для каждого \(j \in [1, m]\) элемент \(A_{i,j}\) заменяется на \(A_{i,j} \text{ & } x\);
  • |=: выбрать два целых числа \(j\) и \(x\) (\(1 \le j \le m\), \(x \ge 0\)) и заменить каждый элемент в столбце \(j\) на результат побитового ИЛИ между числом \(x\) и этим элементом. Формально, для каждого \(i \in [1, n]\) элемент \(A_{i,j}\) заменяется на \(A_{i,j} \text{ | } x\);

В разных операциях можно выбирать разные значения \(x\).

Определите, возможно ли преобразовать матрицу \(A\) в матрицу \(B\) с помощью нескольких (возможно, нуля) указанных операций.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

Каждый набор входных данных задается следующим образом:

  • первая строка содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 10^3\); \(n \cdot m \le 10^3\)) — размеры матриц \(A\) и \(B\);
  • в следующих \(n\) строках содержится описание матрицы \(A\), где \(i\)-я строка содержит \(m\) целых чисел \(A_{i,1}, A_{i,2}, \dots, A_{i,m}\) (\(0 \le A_{i,j} \le 10^9\));
  • в следующих \(n\) строках содержится описание матрицы \(B\), где \(i\)-я строка содержит \(m\) целых чисел \(B_{i,1}, B_{i,2}, \dots, B_{i,m}\) (\(0 \le B_{i,j} \le 10^9\)).
Выходные данные

Для каждого набора входных данных выведите Yes, если можно преобразовать \(A\) в \(B\), или No в противном случае. Каждую букву можно выводить в любом регистре.

Примечание

Рассмотрим второй набор входных данных и приведем последовательность операций, позволяющих получить из матрицы \(A\) матрицу \(B\):

Изначально матрица выглядит так:

\(\begin{bmatrix} 10&10\\ 42&42\\ \end{bmatrix}\)

Применим операцию первого типа с параметрами \(i = 1\) и \(x = 0\). В результате получим матрицу:

\(\begin{bmatrix} 0&0\\ 42&42\\ \end{bmatrix}\)

Применим операцию первого типа с параметрами \(i = 2\) и \(x = 0\). В результате получим матрицу:

\(\begin{bmatrix} 0&0\\ 0&0\\ \end{bmatrix}\)

Применим операцию второго типа с параметрами \(j = 1\) и \(x = 21\). В результате получим матрицу:

\(\begin{bmatrix} 21&0\\ 21&0\\ \end{bmatrix}\)

Применим операцию второго типа с параметрами \(j = 2\) и \(x = 21\). В результате получим матрицу:

\(\begin{bmatrix} 21&21\\ 21&21\\ \end{bmatrix}\)

Таким образом, мы преобразовали матрицу \(A\) в матрицу \(B\).

G1. Средняя демоническая задача (легкая версия)

графы Деревья Паросочетания поиск в глубину и подобное реализация *1700

Это легкая версия задачи. Ключевое отличие между двумя версиями выделено жирным шрифтом.

Группа из \(n\) пауков собралась, чтобы обменяться плюшевыми игрушками. Изначально у каждого паука есть \(1\) плюшевая игрушка. Каждый год, если паук \(i\) имеет хотя бы одну плюшевую игрушку, он отдаст ровно одну плюшевую игрушку пауку \(r_i\). В противном случае он ничего не сделает. Обратите внимание, что все передачи плюшевых игрушек происходят одновременно. В этой версии, если у любого паука в любой момент времени больше \(1\) плюшевой игрушки, он выбросит все, кроме \(1\).

Процесс считается стабильным в текущем году, если у каждого паука количество плюшевых игрушек (до обмена в текущем году) совпадает с количеством плюшевых игрушек, которое у него было в предыдущем году (до обмена в предыдущем году). Обратите внимание, что год \(1\) никогда не может быть стабильным.

Найдите первый год, в котором процесс становится стабильным.

Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(2 \leq n \leq 2 \cdot 10^5\)) — количество пауков.

Следующая строка содержит \(n\) целых чисел \(r_1, r_2, \ldots, r_n\) (\(1 \leq r_i \leq n, r_i \neq i\)) — получатель плюшевой игрушки от каждого паука.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите целое число в новой строке, первый год, в котором процесс становится стабильным.

Примечание

Для второго набора входных данных:

  • В год \(1\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 1, 1, 1]\). Затем происходит обмен в год \(1\).
  • В год \(2\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 1, 1, 1]\). Поскольку этот массив такой же, как в предыдущем году, этот год является стабильным.

Для третьего набора входных данных:

  • В год \(1\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 1, 1, 1]\). Затем происходит обмен в год \(1\).
  • В год \(2\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 1, 1, 0]\). Затем происходит обмен в год \(2\). Обратите внимание, что, хотя два паука отдали пауку \(2\) плюшевые игрушки, паук \(2\) может оставить только одну плюшевую игрушку.
  • В год \(3\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 0, 1, 0]\). Затем происходит обмен в год \(3\).
  • В год \(4\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 0, 0, 0]\). Затем происходит обмен в год \(4\).
  • В год \(5\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 0, 0, 0]\). Поскольку этот массив такой же, как в предыдущем году, этот год является стабильным.

G2. Средняя демоническая задача (сложная версия)

графы Деревья дп поиск в глубину и подобное реализация снм *1900

Это сложная версия задачи. Ключевое отличие между двумя версиями выделено жирным шрифтом.

Группа из \(n\) пауков собралась, чтобы обменяться плюшевыми игрушками. Изначально у каждого паука есть \(1\) плюшевая игрушка. Каждый год, если паук \(i\) имеет хотя бы одну плюшевую игрушку, он отдаст ровно одну плюшевую игрушку пауку \(r_i\). В противном случае он ничего не сделает. Обратите внимание, что все передачи плюшевых игрушек происходят одновременно. В этой версии каждому пауку разрешено иметь более 1 плюшевой игрушки в любой момент времени.

Процесс считается стабильным в текущем году, если у каждого паука такое же количество плюшевых игрушек (до обмена в текущем году), как и в предыдущем году (до обмена в предыдущем году). Обратите внимание, что год \(1\) никогда не может быть стабильным.

Найдите первый год, в котором процесс становится стабильным.

Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(2 \leq n \leq 2 \cdot 10^5\)) — количество пауков.

Следующая строка содержит \(n\) целых чисел \(r_1, r_2, \ldots, r_n\) (\(1 \leq r_i \leq n, r_i \neq i\)) — получатель плюшевой игрушки от каждого паука.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите целое число в новой строке, первый год, в котором процесс становится стабильным.

Примечание

Для второго набора входных данных:

  • В год \(1\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 1, 1, 1]\). Затем происходит обмен в год \(1\).
  • В год \(2\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 1, 1, 1]\). Поскольку этот массив такой же, как в предыдущем году, этот год является стабильным.

Для третьего набора входных данных:

  • В год \(1\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 1, 1, 1]\). Затем происходит обмен в год \(1\).
  • В год \(2\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 2, 1, 1, 0]\). Затем происходит обмен в год \(2\).
  • В год \(3\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 3, 0, 1, 0]\). Затем происходит обмен в год \(3\).
  • В год \(4\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 4, 0, 0, 0]\). Затем происходит обмен в год \(4\).
  • В год \(5\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 4, 0, 0, 0]\). Поскольку этот массив такой же, как в предыдущем году, этот год является стабильным.

M. Mirror Maze

графы Перебор поиск в глубину и подобное реализация *1800

You are given a grid of \(R\) rows (numbered from \(1\) to \(R\) from north to south) and \(C\) columns (numbered from \(1\) to \(C\) from west to east). Every cell in this grid is a square of the same size. The cell located at row \(r\) and column \(c\) is denoted as \((r, c)\). Each cell can either be empty or have a mirror in one of the cell's diagonals. Each mirror is represented by a line segment. The mirror is type \(1\) if it is positioned diagonally from the southwest corner to the northeast corner of the cell, or type \(2\) for the other diagonal.

These mirrors follow the law of reflection, that is, the angle of reflection equals the angle of incidence. Formally, for type \(1\) mirror, if a beam of light comes from the north, south, west, or east of the cell, then it will be reflected to the west, east, north, and south of the cell, respectively. Similarly, for type \(2\) mirror, if a beam of light comes from the north, south, west, or east of the cell, then it will be reflected to the east, west, south, and north of the cell, respectively.

You want to put a laser from outside the grid such that all mirrors are hit by the laser beam. There are \(2 \cdot (R+C)\) possible locations to put the laser:

  • from the north side of the grid at column \(c\), for \(1 \leq c \leq C\), shooting a laser beam to the south;
  • from the south side of the grid at column \(c\), for \(1 \leq c \leq C\), shooting a laser beam to the north;
  • from the east side of the grid at row \(r\), for \(1 \leq r \leq R\), shooting a laser beam to the west; and
  • from the west side of the grid at row \(r\), for \(1 \leq r \leq R\), shooting a laser beam to the east.

Determine all possible locations for the laser such that all mirrors are hit by the laser beam.

Input

The first line consists of two integers \(R\) \(C\) (\(1 \leq R, C \leq 200\)).

Each of the next \(R\) lines consists of a string \(S_r\) of length \(C\). The \(c\)-th character of string \(S_r\) represents cell \((r, c)\). Each character can either be . if the cell is empty, / if the cell has type \(1\) mirror, or \ if the cell has type \(2\) mirror. There is at least one mirror in the grid.

Output

Output a single integer representing the number of possible locations for the laser such that all mirrors are hit by the laser beam. Denote this number as \(k\).

If \(k > 0\), then output \(k\) space-separated strings representing the location of the laser. Each string consists of a character followed without any space by an integer. The character represents the side of the grid, which could be N, S, E, or W if you put the laser on the north, south, east, or west side of the grid, respectively. The integer represents the row/column number. You can output the strings in any order.

Note

Explanation for the sample input/output #1

The following illustration shows one of the solutions of this sample.

Explanation for the sample input/output #2

The following illustration shows one of the solutions of this sample.

G. Развал дерева

Деревья дп поиск в глубину и подобное *1900

Дано дерево\(^{\text{∗}}\) из \(n\) вершин. Вы можете один раз выбрать две вершины \(a\) и \(b\) и удалить все вершины на пути из \(a\) в \(b\), включая сами вершины. Если вы выберете \(a=b\), то будет удалена только одна вершина.

Ваша задача — найти максимальное количество компонент связности\(^{\text{†}}\), которое может образоваться после удаления пути из дерева.

\(^{\text{∗}}\)Деревом называется связный граф без циклов.

\(^{\text{†}}\)Компонента связности это такое множество вершин, в котором из каждой вершины можно попасть по рёбрам в любую другую (и нельзя попасть в вершины, не принадлежащие этому множеству)

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — размер дерева.

Следующие \(n-1\) строк содержат по два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \ne v\)) — вершины, соединённые ребром. Гарантируется, что рёбра образуют дерево.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимальное число компонент связности, которого можно добиться с помощью описанной операции.

E. Находчивая гусеничная последовательность

графы Деревья дп жадные алгоритмы игры поиск в глубину и подобное *1900

Endless Repeating 7 Days
— r-906, Panopticon

Дано дерево, состоящее из \(n\) вершин. Гусеница обозначается парой целых чисел \((p, q)\) (\(1 \leq p, q \leq n\), \(p \neq q\)): её голова находится в вершине \(p\), её хвост находится в вершине \(q\), и она доминирует над всеми вершинами на простом пути от \(p\) до \(q\) (включая \(p\) и \(q\)). Гусеничная последовательность пары \((p, q)\) определяется как последовательность, состоящая только из вершин на простом пути, отсортированных в порядке возрастания расстояния до \(p\).

Нора и Арон по очереди двигают гусеницу, причем Нора ходит первой. Оба игрока будут использовать свою собственную оптимальную стратегию:

  • Они будут играть, чтобы выиграть;
  • Однако, если это невозможно, они будут играть, чтобы помешать другому человеку победить (таким образом, игра закончится ничьёй).

В свой ход Нора может выбрать вершину \(u\), смежную с вершиной \(p\), над которой не доминирует гусеница, и переместить все вершины в ней на одно ребро по направлению к вершине \(u\)\(^{\text{∗}}\). В свою очередь, Арон может выбрать вершину \(v\), смежную с вершиной \(q\), над которой не доминирует гусеница, и переместить все вершины в ней на одно ребро по направлению к вершине \(v\). Обратите внимание, что ходы, разрешенные двум игрокам, различны.

Если \(p\) — лист\(^{\text{†}}\), то Нора выигрывает\(^{\text{‡}}\). Если \(q\) — лист, то Арон выигрывает. Если либо изначально оба \(p\) и \(q\) являются листьями, либо после \(10^{100}\) ходов игра не закончится, результатом будет ничья.

Пожалуйста, посчитайте количество целочисленных пар \((p, q)\) с \(1 \leq p, q \leq n\) и \(p \neq q\) таких, что если изначально гусеница находится на \((p, q)\), то Арон выиграет.

\(^{\text{∗}}\)Другими словами: Пусть текущая гусеничная последовательность равна \(c_1, c_2, \ldots, c_k\). Тогда после перемещения новая гусеничная последовательность становится \(d(u, c_1), d(u, c_2), \ldots, d(u, c_k)\). Здесь \(d(x, y)\) обозначает следующую вершину на простом пути от \(y\) до \(x\).

\(^{\text{†}}\)В дереве вершина называется листом тогда и только тогда, когда её степень равна \(1\).

\(^{\text{‡}}\)Поэтому Нора всегда может выбрать вершину \(u\), если игра ещё не закончилась. То же самое относится и к Арону.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 2\cdot 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \leq n \leq 2\cdot 10^5\)) — количество вершин в дереве.

Каждая из следующих \(n - 1\) строк содержит по два целых числа \(u\) и \(v\) (\(1 \leq u, v \leq n\)), обозначающих ребро между вершинами \(u\) и \(v\). Гарантируется, что заданные ребра образуют дерево.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(4\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одну строку, содержащую целое число: количество целых пар \((p, q)\), для которых Арон выиграет.

Примечание

В первом наборе входных данных всеми возможными гусеницами являются \((1, 2)\) и \((2, 1)\), что приводит к ничьей с самого начала, поскольку оба \(p\) и \(q\) являются листьями.

Во втором наборе входных данных, гусеницы, которые позволяют Арону выиграть, следующие: \((1, 3)\), \((1, 4)\), \((1, 5)\), \((2, 3)\), \((2, 4)\), \((2, 5)\). Давайте рассмотрим некоторых гусениц.

  • Для гусеницы \((1, 5)\): вершина \(p = 1\) — это не лист, но вершина \(q = 5\) — лист, так что Арон выигрывает в самом начале.
  • Для гусеницы \((2, 1)\): вершина \(p = 2\) не является листом, и \(q = 1\) не является листом. На первом ходу Нора может переместить гусеницу в направлении вершины \(5\). Следовательно, гусеница становится \((5, 2)\), а вершина \(p = 5\) — лист, так что Нора выиграет.

B. Найдите перестановку

графы Перебор поиск в глубину и подобное реализация сортировки *1300

Вам дан неориентированный граф с \(n\) вершинами, пронумерованными от \(1\) до \(n\). Этот граф кодирует секретную перестановку\(^{\text{∗}}\) \(p\) длины \(n\). Граф строится следующим образом:

  • Для каждой пары целых чисел \(1 \le i < j \le n\), между вершиной \(p_i\) и вершиной \(p_j\) добавляется неориентированное ребро тогда и только тогда, когда \(p_i < p_j\). Обратите внимание, что ребро добавляется не между вершинами \(i\) и \(j\), а между вершинами соответствующих им элементов. Обратитесь к примечаниям для лучшего понимания.

Ваша задача состоит в том, чтобы восстановить и вывести перестановку \(p\). Можно доказать, что перестановка \(p\) может быть определена однозначно.

\(^{\text{∗}}\)Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \le n \le 1000\)).

В \(i\)-й из следующих \(n\) строк содержится \(n\) символов \(g_{i, 1}g_{i, 2}\ldots g_{i, n}\) (\(g_{i, j} = \mathtt{0}\) или \(g_{i, j} = \mathtt{1}\)) — матрица смежности. \(g_{i, j} = \mathtt{1}\) тогда и только тогда, когда существует ребро между вершинами \(i\) и \(j\).

Гарантируется, что существует перестановка \(p\), которая генерирует данный граф. Также гарантируется, что граф неориентирован и не имеет петель, то есть выполняется \(g_{i, j} = g_{j, i}\) и \(g_{i, i} = \mathtt{0}\).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(1000\).

Выходные данные

Для каждого набора входных данных выведите \(n\) целых чисел \(p_1, p_2, \ldots, p_n\) — восстановленную перестановку.

Примечание

В первом наборе входных данных \(p = [1]\). Поскольку нет пар \(1 \le i < j \le n\), в графе нет рёбер.

Граф для второго набора входных данных показан ниже. Например, когда мы выбираем \(i = 3\) и \(j = 4\), мы добавляем ребро между вершинами \(p_i = 1\) и \(p_j = 3\), потому что \(p_i < p_j\). Однако, когда мы выбираем \(i = 2\) и \(j = 3\), то \(p_i = 2\) и \(p_j = 1\), так что \(p_i < p_j\) не выполняется. Поэтому мы не добавляем ребро между \(2\) и \(1\).

В третьем наборе входных данных в графе нет рёбер, поэтому нет пар целых чисел \(1 \le i < j \le n\) таких, что \(p_i < p_j\). Следовательно, \(p = [6, 5, 4, 3, 2, 1]\).

E. Вложенные отрезки

дп Комбинаторика математика поиск в глубину и подобное снм *2500

Множество \(A\), состоящее из попарно различных отрезков \([l, r]\) с целочисленными концами, называется хорошим, если \(1\le l\le r\le n\), и для любой пары различных отрезков \([l_i, r_i], [l_j, r_j]\) из \(A\) выполняется ровно одно из следующих условий:

  • \(r_i < l_j\) или \(r_j < l_i\) (отрезки не пересекаются)
  • \(l_i \le l_j \le r_j \le r_i\) или \(l_j \le l_i \le r_i \le r_j\) (один отрезок полностью содержится внутри другого)

Вам дано хорошее множество \(S\), состоящее из \(m\) попарно различных отрезков \([l_i, r_i]\) с целочисленными концами. Вы хотите добавить как можно больше дополнительных отрезков к набору \(S\), так, чтобы набор \(S\) остался хорошим.

Поскольку эта задача слишком проста, вам нужно определить количество различных способов добавления максимального числа дополнительных отрезков к \(S\), так, чтобы набор остался хорошим. Два способа считаются разными, если существует отрезок, который добавляется одним из способов, но не другим.

Формально, вам нужно найти количество хороших наборов различных отрезков \(T\), таких, чтобы \(S\) было подмножеством \(T\), и \(T\) имело максимально возможный размер. Поскольку ответ может быть очень большим, вычислите его по модулю \(998\,244\,353\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1 \le n \le 2 \cdot 10^5\), \(0 \le m \le 2 \cdot 10^5\)) — максимальный правый конец отрезка и размер \(S\).

\(i\)-я из следующих \(m\) строк содержит два целых числа \(l_i\) и \(r_i\) (\(1 \le l_i \le r_i \le n\)) — границы отрезков в наборе \(S\)

Гарантируется, что данное множество \(S\) является хорошим, и отрезки в множестве \(S\) попарно различны.

Гарантируется, что как сумма \(n\), так и сумма \(m\) по всем наборам входных данных не превосходят \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — количество различных способов, которыми вы можете добавить максимальное количество дополнительных отрезков к набору \(S\), гарантируя при этом, что набор \(S\) останется хорошим, по модулю \(998\,244\,353\)

Примечание

В первом наборе входных данных единственным возможным отрезком является \([1, 1]\), поэтому \(T = \{[1, 1]\}\) имеет максимальный размер, и это единственное решение.

Во втором наборе входных данных невозможно добавить какие-либо дополнительные отрезки к набору \(S\). Следовательно, единственный способ добавить отрезки к \(S\) — это ничего не добавлять.

В третьем наборе входных данных можно добавить \(7\) дополнительных отрезков к \(S\), гарантируя, что набор останется хорошим. Можно доказать, что добавление более \(7\) дополнительных отрезков к \(S\) невозможно. Существует ровно \(2\) различных способа добавить эти \(7\) отрезков к \(S\), и соответствующие наборы \(T\) показаны ниже:

  • \(\{[1, 1], [1, 3], [1, 4], [1, 5], [2, 2], [2, 3], [3, 3], [4, 4], [5, 5]\}\)
  • \(\{[1, 1], [1, 3], [1, 5], [2, 2], [2, 3], [3, 3], [4, 4], [4, 5], [5, 5]\}\).

В четвертом наборе входных данных существует ровно \(5\) различных способов добавить максимум \(6\) дополнительных отрезков к \(S\), соответствующие наборы \(T\) показаны ниже:

  • \(\{[1, 1], [1, 2], [1, 3], [1, 4], [2, 2], [3, 3], [4, 4]\}\)
  • \(\{[1, 1], [1, 2], [1, 4], [2, 2], [3, 3], [3, 4], [4, 4]\}\)
  • \(\{[1, 1], [1, 3], [1, 4], [2, 2], [2, 3], [3, 3], [4, 4]\}\)
  • \(\{[1, 1], [1, 4], [2, 2], [2, 3], [2, 4], [3, 3], [4, 4]\}\)
  • \(\{[1, 1], [1, 4], [2, 2], [2, 4], [3, 3], [3, 4], [4, 4]\}\)

E2. Очередное упражнение на графы (сложная версия)

Бинарный поиск графы дп кратчайшие пути поиск в глубину и подобное снм сортировки *2500

Это сложная версия задачи. Отличие между версиями заключается в том, что в этой версии Дополнительные ограничения на \(m\) отсутствуют. Вы можете делать взломы только в том случае, если решили все версии этой задачи.

Недавно преподавателям «Т-поколения» нужно было сделать учебный контест. Им не хватает одной задачи, и в контесте как раз нет ни одной задачи на графы, поэтому они придумали следующую задачу.

Вам дан связный взвешенный неориентированный граф из \(n\) вершин и \(m\) ребер, который не содержит петель и кратных ребер.

Есть \(q\) вопросов вида \((a, b, k)\): среди всех путей от вершины \(a\) до вершины \(b\) найти наименьший \(k\)-й максимум весов ребер на пути\(^{\dagger}\).

Преподавателям показалось, что задача звучит очень интересно, но есть одно но... они не умеют ее решать. Помогите им и решите задачу, ведь до начала контеста осталось всего пару часов.

\(^{\dagger}\) Пусть \(w_1 \ge w_2 \ge \ldots \ge w_{h}\) — веса всех ребер на пути в порядке невозрастания. Тогда \(k\)-й максимум весов ребер на этом пути равен \(w_{k}\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(n, m\) и \(q\) (\(2 \le n \le 400\), \(n - 1 \le m \le \frac{n \cdot (n - 1)}{2}\), \(1 \le q \le 3 \cdot 10^5\)) — количество вершин, количество ребер и количество вопросов соответственно.

Каждая из следующих \(m\) строк каждого набора входных данных содержит три целых числа \(v, u\) и \(w\) (\(1 \le v, u \le n\), \(1 \le w \le 10^9\)) — концы очередного ребра графа и его вес соответственно. Гарантируется, что граф не содержит петель и кратных ребер.

Каждая из следующих \(q\) строк каждого набора входных данных содержит три целых числа \(a, b\) и \(k\) (\(1 \le a, b \le n\), \(k \ge 1\)) — очередной вопрос. Гарантируется, что любой путь из вершины \(a\) в вершину \(b\) содержит не менее \(k\) ребер.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(400\).

Гарантируется, что сумма значений \(q\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите ответы на все вопросы.

Примечание

В первом наборе входных данных одним из оптимальных путей в первом запросе является путь \(1 \rightarrow 3 \rightarrow 4\), \(2\)-й максимум весов ребер на этом пути это \(1\). Во втором запросе одними из оптимальных путей являются путь \(2 \rightarrow 4 \rightarrow 3\), \(1\)-й максимум весов ребер это \(2\).

Во втором наборе входных данных одним из оптимальных путей в первом запросе является путь \(1 \rightarrow 2 \rightarrow 4 \rightarrow 5 \rightarrow 6\), \(3\)-й максимум весов ребер на этом пути это \(2\).

G. Секретное сообщение

Конструктив математика поиск в глубину и подобное *3000

Каждую субботу Александр Б., преподаватель параллели X, вечером пишет Александру Г., преподавателю параллели B, секретное сообщение. Так как Александр Г. в это время проводит лекцию, а сообщение очень важное, то Александру Б. приходится писать это сообщение на интерактивной онлайн-доске.

Интерактивная онлайн-доска представляет собой клетчатое поле, состоящее из \(n\) строк и \(m\) столбцов, где каждая клетка имеет размер \(1 \times 1\). Некоторые клетки этой доски уже расписаны, и в них невозможно написать сообщение; такие клетки обозначены символом «.», остальные клетки называются свободными и обозначаются символом «#».

Введем две характеристики онлайн-доски:

  • \(s\) — количество свободных клеток.
  • \(p\) — периметр клетчатой фигуры, которая образована объединением свободных клеток.

Пусть \(A\) — множество свободных клеток. Ваша цель состоит в том, чтобы найти множество клеток \(S \subseteq A\), удовлетворяющее следующим свойствам:

  • \(|S| \le \frac{1}{5} \cdot (s+p)\).
  • Любая клетка из \(A\) либо лежит в \(S\), либо имеет общую сторону с некоторой клеткой из \(S\).

Можно показать, что хотя бы одно множество \(S\), удовлетворяющее этим свойствам, существует; вам требуется отыскать любое подходящее.

Входные данные

В первой строке указано число \(t\) (\(1 \le t \le 80\,000\)) — количество наборов входных данных.

В первой строке каждого набора входных данных указаны числа \(n\) и \(m\) (\(1 \le n, m \le 2 \cdot 10^6\)) — размеры поля.

В последующих \(n\) строках содержится описание поля.

Гарантируется, что сумма \(n \cdot m\) по всем наборам входных данных не превосходит \(2 \cdot 10^6\).

Выходные данные

Для каждого набора выходных данных по \(n\) строк, состоящих из \(m\) символов, где каждый символ кодирует состояние клетки:

  • «#» — клетка содержится в \(A\), но не содержится в \(S\);
  • «S» — клетка содержится и в \(A\), и в \(S\);
  • «.» — клетка не содержится в \(A\) и не содержится в \(S\).
Примечание

В первом примере \(s=5\) и \(p=12\), таким образом, количество клеток в \(S\) не должно превышать \(\frac{1}{5} \cdot (5+12) = 3.4\), то есть \(|S| \le 3\). Заметим, что предъявленное множество \(S\) состоит из \(1\) клетки и, очевидно, удовлетворяет всем ограничениям.

Во втором примере \(s=12\) и \(p=16\), таким образом, количество клеток в \(S\) не должно превышать \(\frac{1}{5} \cdot (12+16)= 5.6\), то есть \(|S| \le 5\). Заметим, что предъявленное множество \(S\) состоит из \(4\) клеток и, очевидно, удовлетворяет всем ограничениям.

На третьем примере мы объясним, что такое периметр, так как это может быть не очевидно. Любая клетчатая фигура имеет границу, которая представляется в виде объединения отрезков, которые не пересекаются по внутренним точкам. Таким образом, на картинке ниже толстой черной линией обозначена граница фигуры, которая получается путем объединения свободных клеток. Суммарная длина этих отрезков равна \(p=24\).

При этом значение \(s=11\) и верхнее ограничение равно \(|S| \le 7\), предъявленное множество имеет размер \(6\) и, очевидно, удовлетворяет всем ограничениям.

E. Составление графа

графы жадные алгоритмы поиск в глубину и подобное снм *1500

Даны два простых неориентированных графа \(F\) и \(G\) с \(n\) узлами. У графа \(F\) есть \(m_1\) рёбер, а у графа \(G\)\(m_2\) рёбер. Вы можете выполнять одну из следующих двух операций любое количество раз:

  • Выберите два целых числа \(u\) и \(v\) (\(1 \leq u,v \leq n\)), такие что между \(u\) и \(v\) в графе \(F\) есть ребро. Затем удалите это ребро из \(F\).
  • Выберите два целых числа \(u\) и \(v\) (\(1 \leq u,v \leq n\)), такие что между \(u\) и \(v\) в графе \(F\) нет ребра. Затем добавьте ребро между \(u\) и \(v\) в \(F\).

Определите минимальное количество операций, необходимых для того, чтобы для всех целых чисел \(u\) и \(v\) (\(1 \leq u,v \leq n\)) существовал путь от \(u\) до \(v\) в \(F\) если и только если существует путь от \(u\) до \(v\) в \(G\).

Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество независимых наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(n\), \(m_1\) и \(m_2\) (\(1 \leq n \leq 2\cdot 10^5\), \(0 \leq m_1,m_2 \leq 2\cdot 10^5\)) — количество узлов, количество рёбер в \(F\) и количество рёбер в \(G\).

Следующие \(m_1\) строк содержат по два целых числа \(u\) и \(v\) (\(1 \leq u, v\leq n\)) — между \(u\) и \(v\) в графе \(F\) есть ребро. Гарантируется, что нет повторяющихся рёбер и петель.

Следующие \(m_2\) строк содержат по два целых числа \(u\) и \(v\) (\(1 \leq u,v\leq n\)) — между \(u\) и \(v\) в графе \(G\) есть ребро. Гарантируется, что нет повторяющихся рёбер и петель.

Гарантируется, что сумма \(n\), сумма \(m_1\) и сумма \(m_2\) по всем наборам входных данных не превышают \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число, обозначающее минимальное количество операций, необходимых на новой строке.

Примечание

В первом наборе входных данных вы можете выполнить следующие три операции:

  1. Добавить ребро между вершиной \(1\) и вершиной \(3\).
  2. Удалить ребро между вершиной \(1\) и вершиной \(2\).
  3. Удалить ребро между вершиной \(2\) и вершиной \(3\).
Можно показать, что меньшее количество операций невозможно достичь.

Во втором наборе входных данных графы \(F\) и \(G\) уже изначально удовлетворяют условию.

В пятом наборе входных данных рёбра от \(1\) до \(3\) и от \(2\) до \(3\) должны быть оба удалены.

D. Сбалансированное дерево

графы Деревья дп жадные алгоритмы поиск в глубину и подобное *2200

Дано дерево\(^{\text{∗}}\) с \(n\) вершинами и значениями \(l_i, r_i\) для каждой вершины. Вы можете выбрать начальные значения \(a_i\), удовлетворяющие условию \(l_i\le a_i\le r_i\) для \(i\)-й вершины. Дерево считается сбалансированным, если все значения в вершинах равны, а значение сбалансированного дерева определяется как значение любой вершины.

За одну операцию вы можете выбрать две вершины \(u\) и \(v\) и увеличить значения всех вершин в поддереве\(^{\text{†}}\) вершины \(v\) на \(1\), рассматривая \(u\) как корень всего дерева. Обратите внимание, что \(u\) может быть равен \(v\).

Ваша цель — выполнить последовательность операций так, чтобы дерево стало сбалансированным. Найдите минимально возможное значение дерева после выполнения этих операций. Обратите внимание, что вам не нужно минимизировать количество операций.

\(^{\text{∗}}\)Деревом называется связный граф без циклов.

\(^{\text{†}}\)Вершина \(w\) принадлежит поддереву вершины \(v\), если любой путь от корня \(u\) до \(w\) проходит через \(v\).

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \leq t \leq 10^5\)) — количество входных наборов данных.

Первая строка каждого набора данных содержит одно целое число \(n\) (\(1 \le n \le 2\cdot 10^5\)) — количество вершин в дереве.

Затем следуют \(n\) строк. \(i\)-я строка содержит два целых числа \(l_i,r_i\) (\(0\le l_i \le r_i\le 10^9\)) — ограничения на значение \(i\)-й вершины.

Следующие \(n-1\) строк содержат ребра дерева. \(i\)-я строка содержит два целых числа \(u_i,v_i\) (\(1\le u_i,v_i \le n\), \(u_i \neq v_i\)) — ребро, соединяющее \(u_i\) и \(v_i\). Гарантируется, что заданные ребра образуют дерево.

Гарантируется, что сумма \(n\) по всем наборам данных не превосходит \(2\cdot 10^5\).

Выходные данные

Для каждого набора данных выведите одно целое число — минимально возможное значение, к которому могут быть приведены все \(a_i\) после выполнения операций. Можно доказать, что ответ всегда существует.

Примечание

В первом наборе данных вы можете выбрать \(a=[6,6,0,5]\).

Вы можете выполнить следующие операции, чтобы сделать все \(a_i\) равными:

  1. Выберите \(u=4\), \(v=3\) и выполните операцию \(5\) раз.
  2. Выберите \(u=1\), \(v=3\) и выполните операцию \(6\) раз.

Полный процесс показан ниже (числа в скобках — значения \(a\)):

Можно доказать, что это оптимальное решение.

E1. Игра (простая версия)

графы Деревья жадные алгоритмы игры поиск в глубину и подобное Структуры данных *2000

Это простая версия задачи. Отличие между версиями заключается в том, что в этой версии вам нужно только найти только одну из возможных вершин, которую может выбрать Чирно. Вы можете делать взломы только в том случае, если решили все версии этой задачи.

Чирно и Дайёсей играют в игру с деревом\(^{\text{∗}}\) из \(n\) вершин, корнем которого является вершина \(1\). Значение \(i\)-й вершины равно \(w_i\). Они по очереди делают ходы; первым ходит Чирно.

На каждом ходу, предполагая, что противник выбрал \(j\) на последнем ходу, игрок может выбрать любую оставшуюся вершину \(i\), удовлетворяющую условию \(w_i>w_j\), и удалить поддерево\(^{\text{†}}\) вершины \(i\). В частности, Чирно может выбрать любую вершину и удалить её поддерево на первом ходу.

Первый игрок, который не может сделать ход, выигрывает, и они оба надеются победить. Найдите одну из возможных вершин, которую может выбрать Чирно на первом ходу, чтобы выиграть, если оба игрока будут играть оптимально.

\(^{\text{∗}}\)Деревом называется связный граф без циклов.

\(^{\text{†}}\)Вершина \(u\) принадлежит поддереву вершины \(i\), если любой путь от \(1\) до \(u\) проходит через \(i\).

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1 \leq t \leq 10^5\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 4\cdot 10^5\)) — количество вершин в дереве.

Вторая строка содержит \(n\) целых чисел \(w_1,w_2,\ldots,w_n\) (\(1 \le w_i \le n\)) — значения вершин.

Следующие \(n-1\) строк содержат ребра дерева. \(i\)-я строка содержит два целых числа \(u_i,v_i\) (\(1\le u_i,v_i \le n\), \(u_i \neq v_i\)) — ребро, соединяющее \(u_i\) и \(v_i\). Гарантируется, что заданные ребра образуют дерево.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(4\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одну строку.

Если Чирно может выиграть, выведите любую вершину, которую она может выбрать на первом ходу.

В противном случае выведите «0» (без кавычек).

Примечание

В первом наборе входных данных:

  1. Если Чирно выберет \(1\) или \(3\) на первом ходу, Дайёсей не сможет сделать ход, поэтому Дайёсей выигрывает.
  2. Если Чирно выберет \(2\) или \(4\) на первом ходу, Дайёсей сможет выбрать только \(3\), но после этого Чирно не сможет сделать ход, поэтому Чирно выигрывает.

Таким образом, все возможные вершины, которые может выбрать Чирно — это \(2\) и \(4\).

Во втором наборе входных данных, независимо от того, какую вершину выберет Чирно, Дайёсей не сможет сделать ход, поэтому Дайёсей выигрывает.

В третьем и четвертом наборах входных данных единственной возможной вершиной, которую может выбрать Чирно на первом ходу, является \(2\).

В пятом наборе входных данных все возможные вершины, которые может выбрать Чирно на первом ходу — это \(3,4,6,7\) и \(10\).

E2. Игра (сложная версия)

графы Деревья игры поиск в глубину и подобное реализация Структуры данных *3000

Это сложная версия задачи. Отличие между версиями заключается в том, что в этой версии вам нужно найти все возможные вершины, которые может выбрать Чирно. Вы можете делать взломы только в том случае, если решили все версии этой задачи.

Чирно и Дайёсей играют в игру с деревом\(^{\text{∗}}\) из \(n\) вершин, корнем которого является вершина \(1\). Значение \(i\)-й вершины равно \(w_i\). Они по очереди делают ходы; первым ходит Чирно.

На каждом ходу, предполагая, что противник выбрал \(j\) на последнем ходу, игрок может выбрать любую оставшуюся вершину \(i\), удовлетворяющую условию \(w_i>w_j\), и удалить поддерево\(^{\text{†}}\) вершины \(i\). В частности, Чирно может выбрать любую вершину и удалить её поддерево на первом ходу.

Первый игрок, который не может сделать ход, выигрывает, и они оба надеются победить. Найдите все возможные вершины, которые может выбрать Чирно на первом ходу, чтобы выиграть, если оба игрока будут играть оптимально.

\(^{\text{∗}}\)Деревом называется связный граф без циклов.

\(^{\text{†}}\)Вершина \(u\) принадлежит поддереву вершины \(i\), если любой путь от \(1\) до \(u\) проходит через \(i\).

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1 \leq t \leq 10^5\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 4\cdot 10^5\)) — количество вершин в дереве.

Вторая строка содержит \(n\) целых чисел \(w_1,w_2,\ldots,w_n\) (\(1 \le w_i \le n\)) — значения вершин.

Следующие \(n-1\) строк содержат ребра дерева. \(i\)-я строка содержит два целых числа \(u_i,v_i\) (\(1\le u_i,v_i \le n\), \(u_i \neq v_i\)) — ребро, соединяющее \(u_i\) и \(v_i\). Гарантируется, что заданные ребра образуют дерево.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(4\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одну строку.

Если Чирно может выиграть, выведите несколько чисел. Первое число \(k\) обозначает количество возможных вершин, которые она может выбрать на первом ходу. Следующие \(k\) чисел обозначают данные вершины в порядке возрастания.

В противном случае выведите «0» (без кавычек).

Примечание

В первом наборе входных данных:

  1. Если Чирно выберет \(1\) или \(3\) на первом ходу, Дайёсей не сможет сделать ход, поэтому Дайёсей выигрывает.
  2. Если Чирно выберет \(2\) или \(4\) на первом ходу, Дайёсей сможет выбрать только \(3\), но после этого Чирно не сможет сделать ход, поэтому Чирно выигрывает.

Таким образом, все возможные вершины, которые может выбрать Чирно — это \(2\) и \(4\).

Во втором наборе входных данных, независимо от того, какую вершину выберет Чирно, Дайёсей не сможет сделать ход, поэтому Дайёсей выигрывает.

В третьем и четвертом наборах входных данных единственной возможной вершиной, которую может выбрать Чирно на первом ходу, является \(2\).

В пятом наборе входных данных все возможные вершины, которые может выбрать Чирно на первом ходу — это \(3,4,6,7\) и \(10\).

C. Удалить ровно две

графы Деревья дп жадные алгоритмы Перебор поиск в глубину и подобное сортировки Структуры данных *1600

Недавно Маленький Джон получил дерево от своей тёти, чтобы украсить свой дом. Но, как кажется, одного дерева недостаточно, чтобы украсить весь дом. У Маленького Джона появилась идея. Может быть, он сможет удалить несколько вершин из дерева. Это превратит его в большее количество деревьев! Верно?

Вам дано дерево\(^{\text{∗}}\), состоящее из \(n\) вершин. Вы должны выполнить следующую операцию ровно дважды.

  • Выберите вершину \(v\);
  • Удалите все рёбра, соединённые с вершиной \(v\), а также саму вершину \(v\).

Вам необходимо найти максимальное количество компонент связности после выполнения операции ровно дважды.

Две вершины \(x\) и \(y\) находятся в одной компоненте связности тогда и только тогда, когда существует путь от \(x\) до \(y\). Граф с \(0\) вершинами имеет \(0\) компонент связности по определению.\(^{\text{†}}\)

\(^{\text{∗}}\)Деревом называется связный граф без циклов.

\(^{\text{†}}\)Но считается ли такой граф связным?..

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)).

Каждая из следующих \(n-1\) строк содержит два целых числа \(u_i\) и \(v_i\), обозначающие две вершины, соединённые ребром (\(1 \le u_i,v_i \le n\), \(u_i \neq v_i\)). Гарантируется, что данные рёбра образуют дерево.

Гарантируется, что сумма \(n\) по всем тестам не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого теста выведите максимальное количество компонент связности в отдельной строке.

Примечание

В первом примере удаление вершины дважды сделает граф пустым. По определению количество компонент связности в графе с \(0\) вершинами равно \(0\). Поэтому ответ равен \(0\).

Во втором примере удаление двух вершин \(1\) и \(2\) оставляет \(2\) компоненты связности. Поскольку невозможно создать \(3\) компоненты связности с \(2\) вершинами, ответ равен \(2\).

В третьем примере удаление двух вершин \(1\) и \(5\) оставляет \(4\) компоненты связности, которые являются \(\left\{ 2,4\right\}\), \(\left\{ 3\right\}\), \(\left\{ 6\right\}\) и \(\left\{ 7\right\}\). Можно показать, что невозможно получить \(5\) компонент связности. Поэтому ответ равен \(4\).

E. Треугольное дерево

Деревья дп жадные алгоритмы поиск в глубину и подобное Структуры данных *2300

Однажды в деревне выросло гигантское дерево. Маленький Джон, со своим детским орлом, решил сделать его своим домом. Маленький Джон построит конструкцию на дереве из оцинкованной квадратной стали. Однако он не знал, что не сможет построить то, что физически невозможно.

Вам дано корневое дерево\(^{\text{∗}}\), содержащее \(n\) вершин, с корнем в вершине \(1\). Пара вершин \((u,v)\) называется хорошей парой, если \(u\) не является предком\(^{\text{†}}\) \(v\), и \(v\) не является предком \(u\). Для любых двух вершин \(\text{dist}(u,v)\) определяется как количество рёбер на уникальном простом пути от \(u\) до \(v\), а \(\text{lca}(u,v)\) определяется как их наименьший общий предок.

Функция \(f(u,v)\) определяется следующим образом.

  • Если \((u,v)\) — это хорошая пара, то \(f(u,v)\) — это количество различных целых значений \(x\), таких что существует невырожденный треугольник\(^{\text{‡}}\) с длинами сторон \(\text{dist}(u,\text{lca}(u,v))\), \(\text{dist}(v,\text{lca}(u,v))\) и \(x\).
  • В противном случае \(f(u,v)\) равно \(0\).

Вам необходимо посчитать следующее значение: \(\)\sum_{i = 1}^{n-1} \sum_{j = i+1}^n f(i,j).\(\)

\(^{\text{∗}}\)Деревом называется связный граф без циклов. Корневым деревом называется дерево, в котором одна из вершин специальная и называется корнем.

\(^{\text{†}}\)Предком вершины \(v\) называется любая вершина на пути от \(v\) до корня, включая корень, но не включая \(v\). У корня нет предков.

\(^{\text{‡}}\)Треугольник с длинами сторон \(a\), \(b\), \(c\) является невырожденным, если \(a+b > c\), \(a+c > b\), \(b+c > a\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 3 \cdot 10^5\)).

Каждая из следующих \(n-1\) строк содержит два целых числа \(u_i\) и \(v_i\), обозначающие две вершины, соединенные ребром (\(1 \le u_i,v_i \le n\), \(u_i \neq v_i\)). Гарантируется, что заданные рёбра образуют дерево.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите ответ на новой строке.

Примечание

В первом наборе входных данных единственной хорошей парой \((i,j)\), удовлетворяющей \(i<j\), является \((2,3)\). Здесь \(\text{lca}(2,3)\) равен \(1\), а два расстояния равны \(1\) и \(1\).

Существует только одно значение \(x\) для двух длин сторон \(1\) и \(1\), а именно \(1\). Поэтому ответ для первого набора входных данных равен \(1\).

Во втором примере нет хорошей пары. Поэтому ответ для второго теста равен \(0\).

В третьем примере хорошими парами \((i,j)\), удовлетворяющими \(i<j\), являются следующие:

  • \((2,5)\): \(\text{lca}(2,5)\) равен \(1\), расстояния равны \(1\) и \(1\). Существует только одно возможное значение \(x\), а именно \(1\).
  • \((3,4)\): \(\text{lca}(3,4)\) равен \(2\), расстояния равны \(1\) и \(1\). Существует только одно возможное значение \(x\), а именно \(1\).
  • \((3,5)\): \(\text{lca}(3,5)\) равен \(1\), расстояния равны \(2\) и \(1\). Существует только одно возможное значение \(x\), а именно \(2\).
  • \((4,5)\): \(\text{lca}(4,5)\) равен \(1\), расстояния равны \(2\) и \(1\). Существует только одно возможное значение \(x\), а именно \(2\).

Поэтому ответ для третьего примера равен \(1+1+1+1=4\).

F1. Считать не весело (Простая версия)

графы Деревья дп Комбинаторика математика поиск в глубину и подобное реализация снм Структуры данных хэши *2400

Это простая версия задачи. Отличие между версиями заключается в том, что в этой версии ограничения на \(t\) и \(n\) меньше. Вы можете делать взломы только в том случае, если решили все версии этой задачи.

Теперь Маленький Джон богат, и поэтому он наконец-то покупает дом, достаточно большой, чтобы вместить его и его любимую скобочную последовательность. Но каким-то образом он оказался с большим количеством скобок! Разочарованный, он пробивает потолок с помощью «ладони Будды».

Скобочная последовательность называется правильной, если она может быть построена по следующей формальной грамматике:

  1. Пустая последовательность \(\varnothing\) сбалансирована.
  2. Если скобочная последовательность \(A\) правильная, то \(\mathtt{(}A\mathtt{)}\) также является правильной.
  3. Если скобочные последовательности \(A\) и \(B\) правильные, то и их конкатенированная последовательность \(A B\) также правильная.

Например, последовательности «(())()», «()», «(()(()))» и пустая последовательность являются правильными, в то время как «(()» и «(()))(» — нет.

Дана правильная скобочная последовательность \(s\), пара индексов \((i,j)\) (\(i<j\)) называется хорошей, если \(s_i\) — это «(», а \(s_j\) — это «)», и две скобки добавляются одновременно в соответствии с правилом 2 при построении последовательности \(s\). Например, последовательность «(())()» имеет три разные хорошие пары: \((1,4)\), \((2,3)\) и \((5,6)\). Можно показать, что любая правильная скобочная последовательность из \(2n\) скобок содержит ровно \(n\) различных пар скобок, и использование любого порядка правил для построения одной и той же последовательности скобок приведет к одному и тому же набору пар скобок.

Эмили будет играть в игру по угадыванию скобок с Джоном. Игра проходит следующим образом.

Изначально у Джона есть правильная скобочная последовательность \(s\), содержащая \(n\) различных пар скобок, которая не известна Эмили. Джон говорит Эмили значение \(n\) и просит Эмили угадать последовательность.

На протяжении \(n\) ходов Джон дает Эмили следующие подсказки на каждом ходе:

  • \(l\;r\): Последовательность \(s\) содержит пару скобок \((l,r)\).

Гарантируется, что подсказки, которые Джон дает Эмили, попарно различны и не противоречат друг другу.

В какой-то момент Эмили может быть уверена, что правильная скобочная последовательность, удовлетворяющая подсказкам, данным до сих пор, уникальна. Например, предположим, что Эмили знает, что \(s\) имеет \(3\) хорошие пары, и она содержит пару скобок \((2,5)\). Из \(5\) правильных скобочных последовательностей с \(3\) хорошими парами существует только одна такая последовательность «((()))» с парой скобок \((2,5)\). Следовательно, можно увидеть, что Эмили не всегда нужно \(n\) ходов, чтобы угадать \(s\).

Чтобы как можно раньше узнать содержимое \(s\), Эмили хочет знать количество различных правильных скобочных последовательностей, которые соответствуют подсказкам после каждого хода. Конечно, это не легкая задача для Эмили, особенно когда ей дано настолько много хороших пар. Теперь ваша очередь помочь Эмили. Учитывая подсказки, вы должны найти ответ до всех ходов и после каждого хода. Поскольку ответы могут быть огромными, вам нужно найти их по модулю \(998\,244\,353\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(2 \le n \le 5000\)) — количество хороших пар.

Затем каждая из следующих \(n\) строк содержит два целых числа \(l_i\) и \(r_i\), представляющих \(i\)-ю подсказку (\(1 \le l_i < r_i \le 2n\)).

Подсказки в одном наборе входных данных попарно различны и не противоречат друг другу.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(5000\).

Выходные данные

Для каждого набора выведите \(n+1\) целых числа в одной строке:

  • Первое целое число — это ответ до всех подсказок, по модулю \(998\,244\,353\).
  • Для всех \(i \ge 1\), \(i+1\)-е целое число — это ответ после \(i\)-й подсказки, по модулю \(998\,244\,353\).
Примечание

Первый пример из примера объясняется в описании задачи.

Третий пример из примера объясняется следующим образом.

Можно показать, что существует \(132\) сбалансированных последовательностей скобок с \(6\) парами скобок. Ответы после каждой подсказки следующие:

  1. Вам дана хорошая пара \((2,3)\). Существует \(42\) правильных скобочных последовательностей, имеющих хорошую пару \((2,3)\).
  2. Вам дана хорошая пара \((1,6)\). Существует \(5\) правильных скобочных последовательностей, имеющих хорошие пары \((2,3)\), \((1,6)\).
  3. Вам дана хорошая пара \((7,8)\). Существуют \(2\) правильных скобочных последовательностей, имеющих три хорошие пары. Это строки «(()())()(())» и «(()())()()()», соответственно.
  4. Вам дана хорошая пара \((9,12)\). Существует только одна правильная скобочная последовательность, содержащая четыре хорошие пары. Таким образом, содержимое \(s\) имеет вид «(()())()(())».

Тогда количество правильных скобочных последовательностей после пятой и шестой подсказки равно \(1\), поскольку вы уже знаете содержимое \(s\).

F2. Считать не весело (Сложная версия)

графы Деревья Комбинаторика поиск в глубину и подобное реализация снм Структуры данных *2700

Это сложная версия задачи. Отличие между версиями заключается в том, что в этой версии ограничения на \(t\) и \(n\) больше. Вы можете делать взломы только в том случае, если решили все версии этой задачи.

Теперь Маленький Джон богат, и поэтому он наконец-то покупает дом, достаточно большой, чтобы вместить его и его любимую скобочную последовательность. Но каким-то образом он оказался с большим количеством скобок! Разочарованный, он пробивает потолок с помощью «ладони Будды».

Скобочная последовательность называется правильной, если она может быть построена по следующей формальной грамматике:

  1. Пустая последовательность \(\varnothing\) сбалансирована.
  2. Если скобочная последовательность \(A\) правильная, то \(\mathtt{(}A\mathtt{)}\) также является правильной.
  3. Если скобочные последовательности \(A\) и \(B\) правильные, то и их конкатенированная последовательность \(A B\) также правильная.

Например, последовательности «(())()», «()», «(()(()))» и пустая последовательность являются правильными, в то время как «(()» и «(()))(» — нет.

Дана правильная скобочная последовательность \(s\), пара индексов \((i,j)\) (\(i<j\)) называется хорошей, если \(s_i\) — это «(», а \(s_j\) — это «)», и две скобки добавляются одновременно в соответствии с правилом 2 при построении последовательности \(s\). Например, последовательность «(())()» имеет три разные хорошие пары: \((1,4)\), \((2,3)\) и \((5,6)\). Можно показать, что любая правильная скобочная последовательность из \(2n\) скобок содержит ровно \(n\) различных пар скобок, и использование любого порядка правил для построения одной и той же последовательности скобок приведет к одному и тому же набору пар скобок.

Эмили будет играть в игру по угадыванию скобок с Джоном. Игра проходит следующим образом.

Изначально у Джона есть правильная скобочная последовательность \(s\), содержащая \(n\) различных пар скобок, которая не известна Эмили. Джон говорит Эмили значение \(n\) и просит Эмили угадать последовательность.

На протяжении \(n\) ходов Джон дает Эмили следующие подсказки на каждом ходе:

  • \(l\;r\): Последовательность \(s\) содержит пару скобок \((l,r)\).

Гарантируется, что подсказки, которые Джон дает Эмили, попарно различны и не противоречат друг другу.

В какой-то момент Эмили может быть уверена, что правильная скобочная последовательность, удовлетворяющая подсказкам, данным до сих пор, уникальна. Например, предположим, что Эмили знает, что \(s\) имеет \(3\) хорошие пары, и она содержит пару скобок \((2,5)\). Из \(5\) правильных скобочных последовательностей с \(3\) хорошими парами существует только одна такая последовательность «((()))» с парой скобок \((2,5)\). Следовательно, можно увидеть, что Эмили не всегда нужно \(n\) ходов, чтобы угадать \(s\).

Чтобы как можно раньше узнать содержимое \(s\), Эмили хочет знать количество различных правильных скобочных последовательностей, которые соответствуют подсказкам после каждого хода. Конечно, это не легкая задача для Эмили, особенно когда ей дано настолько много хороших пар. Теперь ваша очередь помочь Эмили. Учитывая подсказки, вы должны найти ответ до всех ходов и после каждого хода. Поскольку ответы могут быть огромными, вам нужно найти их по модулю \(998\,244\,353\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 3 \cdot 10^5\)) — количество хороших пар.

Затем каждая из следующих \(n\) строк содержит два целых числа \(l_i\) и \(r_i\), представляющих \(i\)-ю подсказку (\(1 \le l_i < r_i \le 2n\)).

Подсказки в одном наборе входных данных попарно различны и не противоречат друг другу.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(3 \cdot 10^5\).

Выходные данные

Для каждого набора выведите \(n+1\) целых числа в одной строке:

  • Первое целое число — это ответ до всех подсказок, по модулю \(998\,244\,353\).
  • Для всех \(i \ge 1\), \(i+1\)-е целое число — это ответ после \(i\)-й подсказки, по модулю \(998\,244\,353\).
Примечание

Первый пример из примера объясняется в описании задачи.

Третий пример из примера объясняется следующим образом.

Можно показать, что существует \(132\) сбалансированных последовательностей скобок с \(6\) парами скобок. Ответы после каждой подсказки следующие:

  1. Вам дана хорошая пара \((2,3)\). Существует \(42\) правильных скобочных последовательностей, имеющих хорошую пару \((2,3)\).
  2. Вам дана хорошая пара \((1,6)\). Существует \(5\) правильных скобочных последовательностей, имеющих хорошие пары \((2,3)\), \((1,6)\).
  3. Вам дана хорошая пара \((7,8)\). Существуют \(2\) правильных скобочных последовательностей, имеющих три хорошие пары. Это строки «(()())()(())» и «(()())()()()», соответственно.
  4. Вам дана хорошая пара \((9,12)\). Существует только одна правильная скобочная последовательность, содержащая четыре хорошие пары. Таким образом, содержимое \(s\) имеет вид «(()())()(())».

Тогда количество правильных скобочных последовательностей после пятой и шестой подсказки равно \(1\), поскольку вы уже знаете содержимое \(s\).

F. Скибидус и slay

графы Деревья жадные алгоритмы поиск в глубину и подобное Структуры данных *1700

Определим мажорирующий элемент последовательности из \(k\) элементов как уникальное значение, которое появляется строго более чем \(\left \lfloor {\frac{k}{2}} \right \rfloor\) раз. Если такое значение не существует, то последовательность не имеет мажорирующего элемента. Например, последовательность \([1,3,2,3,3]\) имеет мажорирующий элемент \(3\), потому что оно появляется \(3 > \left \lfloor {\frac{5}{2}} \right \rfloor = 2\) раза, но \([1,2,3,4,5]\) и \([1,3,2,3,4]\) не имеют мажорирующего элемента.

Скибидус нашел дерево\(^{\text{∗}}\) из \(n\) вершин и массив \(a\) длиной \(n\). Вершина \(i\) имеет значение \(a_i\), написанное на ней, где \(a_i\) — это целое число в диапазоне \([1, n]\).

Для каждого \(i\) от \(1\) до \(n\) определите, существует ли нетривиальный простой путь\(^{\text{†}}\) такой, что \(i\) является мажорирующим элементом последовательности целых чисел, написанных на вершинах, которые образуют путь.

\(^{\text{∗}}\)Деревом называется связный граф без циклов.

\(^{\text{†}}\)Последовательность вершин \(v_1, v_2, ..., v_m\) (\(m \geq 2\)) образует нетривиальный простой путь, если \(v_i\) и \(v_{i+1}\) соединены ребром для всех \(1 \leq i \leq m - 1\) и все \(v_i\) попарно различны. Обратите внимание, что путь должен состоять как минимум из \(2\) вершин.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(2 \le n \le 5 \cdot 10^5\))  — количество вершин.

Вторая строка каждого набора содержит \(a_1,a_2,\ldots,a_n\) (\(1 \le a_i \le n\))  — целые числа, написанные на вершинах.

Каждая из следующих \(n-1\) строк содержит два целых числа \(u_i\) и \(v_i\), обозначающих две вершины, соединенные ребром (\(1 \le u_i,v_i \le n\), \(u_i \neq v_i\)).

Гарантируется, что данные ребра образуют дерево.

Гарантируется, что сумма \(n\) по всем тестам не превышает \(5 \cdot 10^5\).

Выходные данные

Для каждого теста выведите двоичную строку \(s\) длиной \(n\) на отдельной строке. \(s_i\) должно вычисляться следующим образом:

  • Если существует нетривиальный путь, содержащий \(i\) как мажорирующий элемент, то \(s_i\) равно '1';
  • В противном случае \(s_i\) равно '0'.
Примечание

В первом примере нет нетривиального пути с \(1\), \(2\) или \(3\) в качестве мажорирующего элемента, поэтому выводимая двоичная строка — «000».

Во втором примере \(1\rightarrow 2\rightarrow 4\) — это нетривиальный путь с \(3\) в качестве мажорирующего элемента.

C. Девяткино

жадные алгоритмы математика Перебор поиск в глубину и подобное *1500

Вам дано положительное целое число \(n\). За одну операцию можно прибавить к \(n\) любое целое положительное число, десятичная запись которого содержит только цифру \(9\), возможно, повторённую несколько раз.

Какое минимальное количество операций необходимо проделать, чтобы число \(n\) содержало хотя бы одну цифру \(7\) в своей десятичной записи?

Например, если \(n = 80\), достаточно одной операции: можно прибавить \(99\) к \(n\), после операции \(n = 179\), содержит цифру \(7\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит целое число \(n\) (\(10 \leq n \leq 10^9\)).

Выходные данные

Для каждого набора входных данных выведите минимальное количество операций, необходимое, чтобы число \(n\) содержало цифру \(7\).

Примечание

В первом наборе входных данных достаточно трёх операций: \(51 + 9 + 9 + 9 = 78\), содержит цифру \(7\). Можно показать, что за одну или две операции невозможно добиться цели.

Во втором наборе входных данных достаточно двух операций: \(60 + 9 + 9 = 78\).

В третьем наборе входных данных достаточно одной операции: \(61 + 9 = 70\).

В четвёртом наборе входных данных \(n\) уже содержит цифру \(7\), поэтому никаких операций проводить не требуется.

В пятом наборе входных данных можно прибавить \(99\) к \(n\) и получить число, содержащее цифру \(7\).

B. Пасьянс

дп поиск в глубину и подобное *1900

Мальчик Вася хочет разложить древнерусский пасьянс под названием «Боян». Пасьянс раскладывается по следующим правилам:

  • Колода из n карт тщательно перемешивается, после чего все n карт выкладываются на стол в ряд слева направо;
  • Перед каждым ходом на столе лежат в ряд несколько стопок карт (изначально n стопок, в каждой стопке по одной карте). Пронумеруем эти стопки слева направо от 1 до x. За один ход разрешается целиком переместить стопку с наибольшим номером x (то есть самую правую из оставшихся) на стопку x - 1 (если такая существует) или на стопку x - 3 (если такая существует). При этом одну стопку можно переместить на другую, только если верхние карты этих стопок имеют одинаковые масти или достоинства. Заметим, что если стопка x перемещается на стопку y, верхняя карта стопки x становится верхней картой результирующей стопки. Также заметим, что после каждого хода общее количество стопок уменьшается на 1;
  • Пасьянс считается разложенным, если все карты находятся в одной стопке.

Вася уже перемешал карты и выложил их на стол, помогите ему понять, можно разложить пасьянс из этих карт или нет.

Входные данные

В первой строке входных данных записано единственное целое число n (1 ≤ n ≤ 52) — количество карт в колоде Васи. В следующей строке записано n строк через пробел c1, c2, ..., cn, где строка ci описывает i-ую выложенную на стол карту колоды. Каждая строка ci состоит ровно из двух символов, первый символ обозначает достоинство карты, второй — масть. Карты на столе пронумерованы слева направо.

Достоинство карты описывается одним из символов: «2», «3», «4», «5», «6», «7», «8», «9», «T», «J», «Q», «K», «A». Масть карты описывается одним из символов: «S», «D», «H», «C».

Не гарантируются, что в колоде присутствуют все возможные карты. Также карты в колоде Васи могут повторяться.

Выходные данные

Выведите в единственной строке ответ на задачу: строку «YES» (без кавычек), если разложить пасьянс возможно, строку «NO» (без кавычек) в противном случае.

Примечание

В первом примере можно действовать так:

  • переложить 4-ую стопку на 1-ую;
  • переложить 3-ую стопку на 2-ую;
  • переложить 2-ую стопку на 1-ую.

Во втором примере разложить пасьянс никак нельзя.

E. Братья по крови

Бинарный поиск Деревья поиск в глубину и подобное Структуры данных *2100

Поликарп раздобыл дерево родственных связей. Найденное дерево описывает родственные связи n человек, пронумерованных от 1 до n. Каждый человек в этом дереве имеет не более одного непосредственного предка.

Назовем человека a 1-прародителем человека b, если a является непосредственным предком b.

Назовем человека a k-прародителем (k > 1) человека b, если у человека b есть 1-прародитель, и a является (k - 1)-прародителем 1-прародителя b.

В найденном дереве родственные связи не образуют циклов. Другими словами не существует человека, который непосредственно или косвенно является собственным прародителем (то есть является x-прародителем самого себя, для некоторого x, x > 0).

Назовем двух людей x и y (x ≠ y) p-юродными братьями (p > 0), если существует человек z, который является p-прародителем x и p-прародителем y.

Поликарп очень сильно интересуется сколько у кого и каких братьев. Он записал на листочке m пар чисел vi, pi. Помогите ему для каждой пары vi, pi узнать, сколько у человека vi pi-юродных братьев.

Входные данные

В первой строке входных данных записано единственное целое число n (1 ≤ n ≤ 105) — количество людей в дереве. В следующей строке записано n целых чисел через пробел r1, r2, ..., rn, где ri (1 ≤ ri ≤ n) — номер непосредственного предка человека номер i или 0 если у человека номер i нет непосредственного предка. Гарантируется, что родственные связи не образуют циклов.

В третьей строке записано единственное целое число m (1 ≤ m ≤ 105) — количество записей Поликарпа. В m следующих строках записаны пары целых чисел через пробел. В i-ой строке записаны числа vi, pi (1 ≤ vi, pi ≤ n).

Выходные данные

Выведите m целых чисел, разделенных пробельными символами, — ответы на записи Поликарпа. Ответы для записей выводите в том порядке, в котором записи встречаются во входных данных.

A. Игра

жадные алгоритмы поиск в глубину и подобное *1700

Фурик и Рубик любят играть в компьютерные игры. Недавно Фурик нашел новую игру, которая очень заинтересовала Рубика. Игра состоит из n частей, причем для прохождения каждой части, возможно, требуется пройти некоторые другие. Известно, что игру можно пройти полностью, то есть нет циклических зависимостей между частями игры.

У Рубика есть 3 компьютера, на которых он может играть в эту игру. Все компьютеры находятся в разных домах и, как оказалось, каждую часть игры можно пройти только на одном из этих компьютеров. Пронумеруем компьютеры целыми числами от 1 до 3. Рубик может выполнять следующие действия:

  • Пройти какую-то часть игры на каком-то компьютере. Рубик тратит на прохождение любой части на любом компьютере ровно 1 час.
  • Переместиться от 1-го компьютера ко 2-му. На это действие Рубик тратит ровно 1 час.
  • Переместиться от 1-го компьютера к 3-му. На это действие Рубик тратит ровно 2 часа.
  • Переместиться от 2-го компьютера к 1-му. На это действие Рубик тратит ровно 2 часа.
  • Переместиться от 2-го компьютера к 3-му. На это действие Рубик тратит ровно 1 час.
  • Переместиться от 3-го компьютера к 1-му. На это действие Рубик тратит ровно 1 час.
  • Переместиться от 3-го компьютера ко 2-му. На это действие Рубик тратит ровно 2 часа.

Помогите Рубику найти минимальное количество часов, которое ему понадобится для прохождения всех частей игры. Изначально Рубик может находиться у компьютера, который он считает нужным.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 200) — количество частей игры. В следующей строке заданы n целых чисел, i-е число — ci (1 ≤ ci ≤ 3) обозначает номер компьютера, на котором нужно пройти часть игры номер i.

В следующих n строках задано описание частей игры. В i-й из них сначала содержится целое число ki (0 ≤ ki ≤ n - 1), далее ki различных целых чисел ai, j (1 ≤ ai, j ≤ nai, j ≠ i) — номера частей, которые требуется пройти до части номер i.

Числа во всех строках разделены единичными пробелами. Можете считать, что части игры некоторым образом пронумерованы от 1 до n. Гарантируется, что между частями игры нет циклических зависимостей.

Выходные данные

В единственной строке выведите ответ на задачу.

Примечание

Пояснение ко второму примеру: перед началом игры выгоднее всего находиться у 3-го компьютера. Сначала пройдем часть номер 5. Далее перейдем к 1-му компьютеру и пройдем 3-ю и 4-ю часть. Далее перейдем ко 2-му компьютеру и пройдем 1-ю и 2-ю часть. В сумме получаем 1+1+2+1+2, что равно 7 часам.

A. Игра

жадные алгоритмы поиск в глубину и подобное *1700

Фурик и Рубик любят играть в компьютерные игры. Недавно Фурик нашел новую игру, которая очень заинтересовала Рубика. Игра состоит из n частей, причем для прохождения каждой части, возможно, требуется пройти некоторые другие. Известно, что игру можно пройти полностью, то есть нет циклических зависимостей между частями игры.

У Рубика есть 3 компьютера, на которых он может играть в эту игру. Все компьютеры находятся в разных домах и, как оказалось, каждую часть игры можно пройти только на одном из этих компьютеров. Пронумеруем компьютеры целыми числами от 1 до 3. Рубик может выполнять следующие действия:

  • Пройти какую-то часть игры на каком-то компьютере. Рубик тратит на прохождение любой части на любом компьютере ровно 1 час.
  • Переместиться от 1-го компьютера ко 2-му. На это действие Рубик тратит ровно 1 час.
  • Переместиться от 1-го компьютера к 3-му. На это действие Рубик тратит ровно 2 часа.
  • Переместиться от 2-го компьютера к 1-му. На это действие Рубик тратит ровно 2 часа.
  • Переместиться от 2-го компьютера к 3-му. На это действие Рубик тратит ровно 1 час.
  • Переместиться от 3-го компьютера к 1-му. На это действие Рубик тратит ровно 1 час.
  • Переместиться от 3-го компьютера ко 2-му. На это действие Рубик тратит ровно 2 часа.

Помогите Рубику найти минимальное количество часов, которое ему понадобится для прохождения всех частей игры. Изначально Рубик может находиться у компьютера, который он считает нужным.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 200) — количество частей игры. В следующей строке заданы n целых чисел, i-е число — ci (1 ≤ ci ≤ 3) обозначает номер компьютера, на котором нужно пройти часть игры номер i.

В следующих n строках задано описание частей игры. В i-й из них сначала содержится целое число ki (0 ≤ ki ≤ n - 1), далее ki различных целых чисел ai, j (1 ≤ ai, j ≤ nai, j ≠ i) — номера частей, которые требуется пройти до части номер i.

Числа во всех строках разделены единичными пробелами. Можете считать, что части игры некоторым образом пронумерованы от 1 до n. Гарантируется, что между частями игры нет циклических зависимостей.

Выходные данные

В единственной строке выведите ответ на задачу.

Примечание

Пояснение ко второму примеру: перед началом игры выгоднее всего находиться у 3-го компьютера. Сначала пройдем часть номер 5. Далее перейдем к 1-му компьютеру и пройдем 3-ю и 4-ю часть. Далее перейдем ко 2-му компьютеру и пройдем 1-ю и 2-ю часть. В сумме получаем 1+1+2+1+2, что равно 7 часам.

A. Игра

жадные алгоритмы поиск в глубину и подобное *1700

Фурик и Рубик любят играть в компьютерные игры. Недавно Фурик нашел новую игру, которая очень заинтересовала Рубика. Игра состоит из n частей, причем для прохождения каждой части, возможно, требуется пройти некоторые другие. Известно, что игру можно пройти полностью, то есть нет циклических зависимостей между частями игры.

У Рубика есть 3 компьютера, на которых он может играть в эту игру. Все компьютеры находятся в разных домах и, как оказалось, каждую часть игры можно пройти только на одном из этих компьютеров. Пронумеруем компьютеры целыми числами от 1 до 3. Рубик может выполнять следующие действия:

  • Пройти какую-то часть игры на каком-то компьютере. Рубик тратит на прохождение любой части на любом компьютере ровно 1 час.
  • Переместиться от 1-го компьютера ко 2-му. На это действие Рубик тратит ровно 1 час.
  • Переместиться от 1-го компьютера к 3-му. На это действие Рубик тратит ровно 2 часа.
  • Переместиться от 2-го компьютера к 1-му. На это действие Рубик тратит ровно 2 часа.
  • Переместиться от 2-го компьютера к 3-му. На это действие Рубик тратит ровно 1 час.
  • Переместиться от 3-го компьютера к 1-му. На это действие Рубик тратит ровно 1 час.
  • Переместиться от 3-го компьютера ко 2-му. На это действие Рубик тратит ровно 2 часа.

Помогите Рубику найти минимальное количество часов, которое ему понадобится для прохождения всех частей игры. Изначально Рубик может находиться у компьютера, который он считает нужным.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 200) — количество частей игры. В следующей строке заданы n целых чисел, i-е число — ci (1 ≤ ci ≤ 3) обозначает номер компьютера, на котором нужно пройти часть игры номер i.

В следующих n строках задано описание частей игры. В i-й из них сначала содержится целое число ki (0 ≤ ki ≤ n - 1), далее ki различных целых чисел ai, j (1 ≤ ai, j ≤ nai, j ≠ i) — номера частей, которые требуется пройти до части номер i.

Числа во всех строках разделены единичными пробелами. Можете считать, что части игры некоторым образом пронумерованы от 1 до n. Гарантируется, что между частями игры нет циклических зависимостей.

Выходные данные

В единственной строке выведите ответ на задачу.

Примечание

Пояснение ко второму примеру: перед началом игры выгоднее всего находиться у 3-го компьютера. Сначала пройдем часть номер 5. Далее перейдем к 1-му компьютеру и пройдем 3-ю и 4-ю часть. Далее перейдем ко 2-му компьютеру и пройдем 1-ю и 2-ю часть. В сумме получаем 1+1+2+1+2, что равно 7 часам.

A. Игра

жадные алгоритмы поиск в глубину и подобное *1700

Фурик и Рубик любят играть в компьютерные игры. Недавно Фурик нашел новую игру, которая очень заинтересовала Рубика. Игра состоит из n частей, причем для прохождения каждой части, возможно, требуется пройти некоторые другие. Известно, что игру можно пройти полностью, то есть нет циклических зависимостей между частями игры.

У Рубика есть 3 компьютера, на которых он может играть в эту игру. Все компьютеры находятся в разных домах и, как оказалось, каждую часть игры можно пройти только на одном из этих компьютеров. Пронумеруем компьютеры целыми числами от 1 до 3. Рубик может выполнять следующие действия:

  • Пройти какую-то часть игры на каком-то компьютере. Рубик тратит на прохождение любой части на любом компьютере ровно 1 час.
  • Переместиться от 1-го компьютера ко 2-му. На это действие Рубик тратит ровно 1 час.
  • Переместиться от 1-го компьютера к 3-му. На это действие Рубик тратит ровно 2 часа.
  • Переместиться от 2-го компьютера к 1-му. На это действие Рубик тратит ровно 2 часа.
  • Переместиться от 2-го компьютера к 3-му. На это действие Рубик тратит ровно 1 час.
  • Переместиться от 3-го компьютера к 1-му. На это действие Рубик тратит ровно 1 час.
  • Переместиться от 3-го компьютера ко 2-му. На это действие Рубик тратит ровно 2 часа.

Помогите Рубику найти минимальное количество часов, которое ему понадобится для прохождения всех частей игры. Изначально Рубик может находиться у компьютера, который он считает нужным.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 200) — количество частей игры. В следующей строке заданы n целых чисел, i-е число — ci (1 ≤ ci ≤ 3) обозначает номер компьютера, на котором нужно пройти часть игры номер i.

В следующих n строках задано описание частей игры. В i-й из них сначала содержится целое число ki (0 ≤ ki ≤ n - 1), далее ki различных целых чисел ai, j (1 ≤ ai, j ≤ nai, j ≠ i) — номера частей, которые требуется пройти до части номер i.

Числа во всех строках разделены единичными пробелами. Можете считать, что части игры некоторым образом пронумерованы от 1 до n. Гарантируется, что между частями игры нет циклических зависимостей.

Выходные данные

В единственной строке выведите ответ на задачу.

Примечание

Пояснение ко второму примеру: перед началом игры выгоднее всего находиться у 3-го компьютера. Сначала пройдем часть номер 5. Далее перейдем к 1-му компьютеру и пройдем 3-ю и 4-ю часть. Далее перейдем ко 2-му компьютеру и пройдем 1-ю и 2-ю часть. В сумме получаем 1+1+2+1+2, что равно 7 часам.

A. Игра

жадные алгоритмы поиск в глубину и подобное *1700

Фурик и Рубик любят играть в компьютерные игры. Недавно Фурик нашел новую игру, которая очень заинтересовала Рубика. Игра состоит из n частей, причем для прохождения каждой части, возможно, требуется пройти некоторые другие. Известно, что игру можно пройти полностью, то есть нет циклических зависимостей между частями игры.

У Рубика есть 3 компьютера, на которых он может играть в эту игру. Все компьютеры находятся в разных домах и, как оказалось, каждую часть игры можно пройти только на одном из этих компьютеров. Пронумеруем компьютеры целыми числами от 1 до 3. Рубик может выполнять следующие действия:

  • Пройти какую-то часть игры на каком-то компьютере. Рубик тратит на прохождение любой части на любом компьютере ровно 1 час.
  • Переместиться от 1-го компьютера ко 2-му. На это действие Рубик тратит ровно 1 час.
  • Переместиться от 1-го компьютера к 3-му. На это действие Рубик тратит ровно 2 часа.
  • Переместиться от 2-го компьютера к 1-му. На это действие Рубик тратит ровно 2 часа.
  • Переместиться от 2-го компьютера к 3-му. На это действие Рубик тратит ровно 1 час.
  • Переместиться от 3-го компьютера к 1-му. На это действие Рубик тратит ровно 1 час.
  • Переместиться от 3-го компьютера ко 2-му. На это действие Рубик тратит ровно 2 часа.

Помогите Рубику найти минимальное количество часов, которое ему понадобится для прохождения всех частей игры. Изначально Рубик может находиться у компьютера, который он считает нужным.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 200) — количество частей игры. В следующей строке заданы n целых чисел, i-е число — ci (1 ≤ ci ≤ 3) обозначает номер компьютера, на котором нужно пройти часть игры номер i.

В следующих n строках задано описание частей игры. В i-й из них сначала содержится целое число ki (0 ≤ ki ≤ n - 1), далее ki различных целых чисел ai, j (1 ≤ ai, j ≤ nai, j ≠ i) — номера частей, которые требуется пройти до части номер i.

Числа во всех строках разделены единичными пробелами. Можете считать, что части игры некоторым образом пронумерованы от 1 до n. Гарантируется, что между частями игры нет циклических зависимостей.

Выходные данные

В единственной строке выведите ответ на задачу.

Примечание

Пояснение ко второму примеру: перед началом игры выгоднее всего находиться у 3-го компьютера. Сначала пройдем часть номер 5. Далее перейдем к 1-му компьютеру и пройдем 3-ю и 4-ю часть. Далее перейдем ко 2-му компьютеру и пройдем 1-ю и 2-ю часть. В сумме получаем 1+1+2+1+2, что равно 7 часам.

A. Игра

жадные алгоритмы поиск в глубину и подобное *1700

Фурик и Рубик любят играть в компьютерные игры. Недавно Фурик нашел новую игру, которая очень заинтересовала Рубика. Игра состоит из n частей, причем для прохождения каждой части, возможно, требуется пройти некоторые другие. Известно, что игру можно пройти полностью, то есть нет циклических зависимостей между частями игры.

У Рубика есть 3 компьютера, на которых он может играть в эту игру. Все компьютеры находятся в разных домах и, как оказалось, каждую часть игры можно пройти только на одном из этих компьютеров. Пронумеруем компьютеры целыми числами от 1 до 3. Рубик может выполнять следующие действия:

  • Пройти какую-то часть игры на каком-то компьютере. Рубик тратит на прохождение любой части на любом компьютере ровно 1 час.
  • Переместиться от 1-го компьютера ко 2-му. На это действие Рубик тратит ровно 1 час.
  • Переместиться от 1-го компьютера к 3-му. На это действие Рубик тратит ровно 2 часа.
  • Переместиться от 2-го компьютера к 1-му. На это действие Рубик тратит ровно 2 часа.
  • Переместиться от 2-го компьютера к 3-му. На это действие Рубик тратит ровно 1 час.
  • Переместиться от 3-го компьютера к 1-му. На это действие Рубик тратит ровно 1 час.
  • Переместиться от 3-го компьютера ко 2-му. На это действие Рубик тратит ровно 2 часа.

Помогите Рубику найти минимальное количество часов, которое ему понадобится для прохождения всех частей игры. Изначально Рубик может находиться у компьютера, который он считает нужным.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 200) — количество частей игры. В следующей строке заданы n целых чисел, i-е число — ci (1 ≤ ci ≤ 3) обозначает номер компьютера, на котором нужно пройти часть игры номер i.

В следующих n строках задано описание частей игры. В i-й из них сначала содержится целое число ki (0 ≤ ki ≤ n - 1), далее ki различных целых чисел ai, j (1 ≤ ai, j ≤ nai, j ≠ i) — номера частей, которые требуется пройти до части номер i.

Числа во всех строках разделены единичными пробелами. Можете считать, что части игры некоторым образом пронумерованы от 1 до n. Гарантируется, что между частями игры нет циклических зависимостей.

Выходные данные

В единственной строке выведите ответ на задачу.

Примечание

Пояснение ко второму примеру: перед началом игры выгоднее всего находиться у 3-го компьютера. Сначала пройдем часть номер 5. Далее перейдем к 1-му компьютеру и пройдем 3-ю и 4-ю часть. Далее перейдем ко 2-му компьютеру и пройдем 1-ю и 2-ю часть. В сумме получаем 1+1+2+1+2, что равно 7 часам.

B. Формирование команд

поиск в глубину и подобное реализация *1700

На стадион пришли n студентов. Они хотят сыграть в футбол, а для этого нужно разделиться на две команды с одинаковым количеством человек в каждой.

Известно, что в собравшейся компании имеются заклятые враги. У каждого студента имеется не более двух заклятых врагов. Причем, если студент A заклятый враг студента B, то студент B заклятый враг студента A.

Студенты хотят разделиться так, чтобы никакие два заклятых врага не оказались в одной команде. В случае, если нужным способом разделиться нельзя, некоторым студентам придется посидеть на скамейке запасных.

Определите какое наименьшее количество студентов придется отправить на скамейку запасных, чтобы можно было сформировать две команды описанным способом и матч наконец-то начался.

Входные данные

В первой строке записаны два целых числа n и m (2 ≤ n ≤ 100, 1 ≤ m ≤ 100) — количество студентов и количество пар заклятых врагов соответственно.

В следующих m строках описаны отношения вражды между студентами. Каждое отношение вражды описывается двумя числами ai и bi (1 ≤ ai, bi ≤ n, ai ≠ bi) — номера враждующих студентов. Каждое из отношений вражды приведено в списке ровно один раз. Гарантируется, что у каждого студента не более двух заклятых врагов.

Можете считать, что студенты некоторым образом пронумерованы различными целыми числами от 1 до n.

Выходные данные

Выведите единственное целое число — наименьшее количество студентов, которое нужно отправить на скамейку запасных, чтобы начать матч.

A. Катание на Коньках

графы Перебор поиск в глубину и подобное снм *1200

Байтек учится кататься на льду. Он новичок, и поэтому он передвигается следующим образом: сначала отталкивается от сугроба на север, восток, юг или запад — и катится до тех пор, пока не повстречает очередной сугроб. Байтек заметил, что таким образом он не сможет добраться от некоторых сугробов до некоторых других, какой бы ни была последовательность его движений. Теперь он хочет соорудить несколько дополнительных сугробов так, чтобы он мог добраться от любого сугроба до любого другого. Байтек попросил Вас найти наименьшее количество сугробов, которые ему потребуется соорудить.

Мы предполагаем, что Байтек может сооружать сугробы только в точках с целочисленными координатами.

Входные данные

В первой строке входного файла записано единственное целое число n (1 ≤ n ≤ 100) — количество сугробов. Каждая из следующих n строк содержит по два целых числа xi и yi (1 ≤ xi, yi ≤ 1000) — координаты i-ого сугроба.

Обратите внимание, что направление на север совпадает с направлением оси Oy, таким образом, направление на восток совпадает с направлением оси Ox. Все сугробы расположены в различных точках.

Выходные данные

Выведите наименьшее количество сугробов, которые надо соорудить Байтеку для того, чтобы он мог добраться от любого сугроба до любого другого.

D. Патруль Битоникса

битмаски Комбинаторика математика Перебор поиск в глубину и подобное *2900

Байтляндия пытается отправить космическую миссию на планету Bit-X. Их задачу усложняет то, что орбита планеты регулярно патрулируется Капитаном Битониксом, возглавляющим космические подразделения планеты Bit-X.

Вокруг Bit-X есть n станций пронумерованных по часовой стрелке от 1 до n. Станции равномерно расположены по круговой орбите, то есть станции с номерами i и i + 1 (1 ≤ i < n), а также станции с номерами 1 и n, являются соседними. Расстояние между любой парой соседних станций равняется m космическим милям. Патрулирование Капитана Битоникса заключается в том, что от запрыгивает в свою ракету на одной из станций и летает по кругу, пролетая по меньшей мере одну космическую милю перед тем, как приземлится на некоторой станции (возможно, той, с которой он взлетал).

Ракета Битоникса движется на энергии, получаемой от сжигания баков с топливом. После того, как Битоникс использует x-литровый бак с топливом и выбирает направление (по или против часовой стрелки), ракета пролетает ровно x космических миль по круговой орбите в выбранном направлении. Обратите внимание, что у ракеты нет тормозов; ракета не может остановиться, пока не опустошится бак с топливом.

Например, предположим, что n = 3, m = 60, а у Битоникса есть баки с топливом на 10, 60, 90 и 100 литров. Если Битоникс стартует со станции номер 1 и использует 100-литровый бак, чтобы лететь по часовой стрелке, затем использует 90-литровый бак, чтобы лететь по часовой стрелке, а затем использует 10-литровый бак, чтобы лететь против часовой стрелки, то он приземлится на станции номер 1, совершив корректный патруль. Обратите внимание, что Битоникс не обязан использовать все доступные баки с топливом. В данном примере Битоникс также может просто использовать 60-литровый бак, чтобы долететь до станции 2 или 3.

Однако, если бы n равнялось 3, m равнялось бы 60, а Битониксу были доступны только один бак на 10 литров и один бак на 100 литров, то он никак не смог бы совершить корректный патруль (он бы не смог приземлиться ровно на странции).

Космическое агентство Байтляндии хочет уничтожить некоторые топливные баки Капитана Битоникса таким образом, чтобы он не мог совершить ни одного корректного патруля. Сколькими способами можно уничтожить некоторое подмножество топливных баков Капитана Битоникса таким образом, чтобы он не мог совершить ни одного корректного патруля? Найдите описанное количество способов и выведите остаток от его деления на 1000000007 (109 + 7).

Входные данные

В первой строке записано три целых числа n (2 ≤ n ≤ 1000) — количество станций, m (1 ≤ m ≤ 120) — расстояние между соседними станциями и t (1 ≤ t ≤ 10000) — количество баков с топливом Капитана Битоникса.

Во второй строке записано через пробел t целых чисел от 1 до 109, включительно, — объемы баков с топливом Битоникса.

Выходные данные

Выведите единственное число — количество различных подмножеств топливных баков Капитана Битоникса таких, что их уничтожение не позвонит ему совершать корректные патрули, по модулю 1000000007 (109 + 7).

Примечание

Все топливные баки различны, даже если объемы некоторых из них совпадают.

D. Выбор столицы Древляндии

графы Деревья дп поиск в глубину и подобное *1700

Страна Древляндия состоит из n городов, некоторые пары из которых соединены односторонними дорогами. Всего в этой стране n - 1 дорога. Известно, что если не обращать внимание на направление дорог, то из любого города можно добраться до любого другого.

Недавно советом старейшин было решено выбрать столицу Древляндии. Конечно, это должен быть один из городов страны. Предполагается, что совет будет заседать в столице и регулярно перемещаться из столицы в другие города (об обратном перемещении пока никто не думает). По этой причине, если город a будет выбран столицей, то все дороги должны быть ориентированы так, что, двигаясь по ним, можно из города a добраться до любого другого города. Для этого, возможно, некоторые дороги придется переориентировать.

Помогите старейшинам выбрать столицу так, что необходимо переориентировать минимальное количество дорог в стране.

Входные данные

В первой строке входных данных записано целое число n (2 ≤ n ≤ 2·105) — количество городов в Древляндии. Следующие n - 1 строк содержат описания дорог, по одной дороге в строке. Дорога описывается парой целых чисел si, ti (1 ≤ si, ti ≤ nsi ≠ ti) — номерами соединяемых дорогой городов, i-ая дорога ориентирована из города si в город ti. Считайте, что города в Древляндии пронумерованы от 1 до n.

Выходные данные

В первую строку выведите минимальное количество переориентируемых дорог при оптимальном выборе столицы. Во вторую строку выведите все возможные способы выбрать столицу — последовательность номеров городов в порядке возрастания.

E. Схема

графы Деревья поиск в глубину и подобное *2300

Чтобы как можно быстрее узнавать последние новости о своей любимой принципиально новой операционной системе, BolgenOS community Нижнего Тагила решило разработать схему, согласно которой первый член community, узнавший какую-либо новость, звонит кому-то другому, тот звонит третьему и так далее. То есть человеку с номером i был назначен человек с номером fi, которому он должен звонить, как только сам узнает новость. Со временем участники BolgenOS community поняли, что их схема не всегда срабатывает — некоторые могут так и не узнать новость. Теперь они хотят дополнить ее: в схему добавляется несколько указаний вида (xi, yi), означающих, что человек xi должен позвонить еще и человеку yi. Какое наименьшее число указаний нужно добавить, чтобы, независимо от того, кто первый узнал новость, в итоге новость узнали все?

Входные данные

В первой строке входных данных записано число n (2 ≤ n ≤ 105) — количество участников BolgenOS community Нижнего Тагила. Во второй строке через пробел записано n целых чисел fi (1 ≤ fi ≤ n, i ≠ fi) — номер человека, которому звонит человек с номером i.

Выходные данные

В первую строку выходных данных выведите одно число — какое наименьшее число указаний нужно добавить. Далее выведите один из возможных вариантов добавления этих указаний в схему, по одному указанию в строке. Если решений несколько, выведите любое.

D. Змейка

битмаски графы поиск в глубину и подобное реализация *2200

Напомним правила одной очень популярной игры, которая называется «Змейка» (эта игра также известна как «Удав», «Питон» или «Червяк»).

Игровое поле представляет собой прямоугольную таблицу размера n × m. Некоторые клетки поля считаются непроходимыми (стены), все остальные клетки поля проходимы.

Вы управляете змейкой, которая состоит из сегментов. Каждый сегмент занимает ровно одну проходимую клетку поля, причем в любой проходимой клетке находится не более одного сегмента. Все сегменты пронумерованы целыми числами от 1 до k, где k — длина змейки. Сегмент с номером 1 называется головой, а с номером k — хвостом. Для любого i (1 ≤ i < k) клетки поля, в которых находятся сегменты с номерами i и i + 1, являются соседними, то есть имеют общую сторону.

В одной из проходимых клеток поля находится яблоко. Цель змейки — достичь яблока и съесть его (то есть сделать так, чтобы голова оказалась в той же клетке, где и яблоко).

В процессе игры змейка двигается. За один ход змейка может переместить голову в одну из соседних клеток поля. При этом все остальные сегменты подтягиваются за головой. То есть каждый сегмент с номером i (1 < i ≤ k) перемещается в клетку, где только что находился сегмент с номером i - 1. Считайте, что перемещение всех сегментов, включая голову, происходит одновременно (смотри второй тестовый пример). Если после хода голова змейки оказывается в непроходимой клетке или в клетке, в которой находится другой сегмент, то змейка умирает. Поэтому такие ходы мы будем считать недопустимыми.

Ваша задача — определить наименьшее количество допустимых ходов, необходимых для того, чтобы змейка достигла яблока.

Входные данные

В первой строке записаны два целых числа через пробел n и m (1 ≤ n, m ≤ 15) — количество строк и столбцов игрового поля.

В следующих n строках описано игровое поле. В каждой из этих строк записано по m символов. Символ «#» обозначает стену, «.» обозначает проходимую клетку, «@» обозначает яблоко. Сегмент змейки номер один обозначается символом «1», сегмент номер два — символом «2» и так далее.

Описание игрового поля не содержит никаких символов кроме «#», «.», «@» и цифр (кроме цифры 0). Гарантируется, что описанное поле корректно. Гарантируется, что на описанном поле находится ровно одно яблоко и ровно одна змейка, длина которой не меньше 3 и не больше 9.

Выходные данные

В выходной файл выведите единственное целое число — наименьшее количество ходов, необходимое для достижения яблока. Если яблока достичь невозможно, выведите -1.

E. Как два пальца об асфальт

2-sat графы поиск в глубину и подобное снм *1900

В Берляндии n городов, некоторые из которых соединены двунаправленными дорогами. Про каждую дорогу известно, заасфальтирована она, или нет.

Король Берляндии Валера II хочет заасфальтировать все дороги Берляндии, для этого он собрал бригаду рабочих. Каждый день Валера выбирает ровно один из городов и отдает приказ бригаде асфальтировать все дороги, исходящие из этого города. Доблестная бригада за день выполняет приказ короля, после чего работяги отправляются по домам.

К сожалению, не все так гладко, как хотелось бы Валере II. Основная часть бригады — гастарбайтеры. Поэтому, получив приказ заасфальтировать все дороги, исходящие из некоторого города, бригада асфальтировала все не асфальтированные дороги, исходящие из этого города, и, наоборот, снимала асфальт с тех дорог, где он был.

Узнав о таком ходе работ, Валера II был сильно расстроен, но так как менять что-либо было поздно, он попросил вас составить программу, которая бы определяла, можно ли хоть каким-то образом не более чем за n дней заасфальтировать все дороги Берляндии. Помогите королю.

Входные данные

В первой строке через пробел записаны два целых числа n, m — количество городов и дорог в Берляндии соответственно. В следующих m строках заданы описания дорог Берляндии: в i-й строке записаны три целых числа через пробел ai, bi, ci (1 ≤ ai, bi ≤ nai ≠ bi; 0 ≤ ci ≤ 1). Первые два числа (ai, bi) — номера городов, которые соединяет i-я дорога, третье число (ci) равно 1, если изначально дорога асфальтирована, и 0 в противном случае.

Считайте, что города в Берляндии пронумерованы от 1 до n, а дороги от 1 до m. Гарантируется, что между двумя городами Берляндии существует не более одной дороги.

Выходные данные

В первой строке выведите единственное целое число x (0 ≤ x ≤ n) — количество дней, требуемое для ремонта всех дорог. Во второй строке через пробел выведите x целых чисел номера городов, в которые нужно посылать бригады, в том порядке, в котором Валера посылает их ремонтировать дороги. В случае, если решений несколько выведите любое.

Если заасфальтировать все дороги никак не получится, выведите «Impossible» (без кавычек).

E. Кактус

графы Деревья дп поиск в глубину и подобное Структуры данных *2100

Связный неориентированный граф называется вершинным кактусом, если каждая вершина этого графа принадлежит не более чем одному простому циклу.

Простым циклом в неориентированном графе назовем последовательность различных вершин v1, v2, ..., vt (t > 2) такую, что для любого i (1 ≤ i < t) существует ребро между вершинами vi и vi + 1, а также существует ребро между вершинами v1 и vt.

Простым путем в неориентированном графе назовем последовательность не обязательно различных вершин v1, v2, ..., vt (t > 0) такую, что для любого i (1 ≤ i < t) существует ребро между вершинами vi и vi + 1, причем каждое ребро встречается не более одного раза. Будем говорить, что простой путь v1, v2, ..., vt начинается в вершине v1 и заканчивается в вершине vt.

Вам задан граф, состоящий из n вершин и m ребер, который является вершинным кактусом. Также есть список из k пар интересных вершин xi, yi, для которых Вы захотели узнать следующую информацию — сколько различных простых путей начинается в вершине xi и заканчивается в вершине yi. Два простых пути будем считать различными, если различаются множества ребер, которые в них входят.

Для каждой пары интересных вершин посчитайте количество различных простых путей между ними. Поскольку это количество может быть достаточно большим, требуется посчитать остаток от деления этого числа на 1000000007 (109 + 7).

Входные данные

В первой строке через пробел записаны два целых числа n, m (2 ≤ n ≤ 105; 1 ≤ m ≤ 105) — количество вершин и ребер в графе соответственно. В следующих m строках задано описание ребер: в i-той строке через пробел записаны два целых числа ai, bi (1 ≤ ai, bi ≤ n) — номера вершин, которые соединяет i-тое ребро.

Во следующей строке записано единственное целое число k (1 ≤ k ≤ 105) — количество пар интересных вершин. В следующих k строках задан список пар интересных вершин: в i-ой строке через пробел записаны два целых числа xi, yi (1 ≤ xi, yi ≤ nxi ≠ yi) — номера интересных вершин в i-ой паре.

Гарантируется, что заданный граф является вершинным кактусом. Гарантируется, что в графе отсутствуют петли и кратные ребра. Считайте, что вершины графа некоторым образом пронумерованы от 1 до n.

Выходные данные

Выведите k строк: в i-ой строке выведите единственное число — остаток от деления количества различных простых путей, начинающихся в xi и заканчивающихся в yi, на 1000000007 (109 + 7).

D. Д-Декомпозиция

графы Деревья жадные алгоритмы поиск в глубину и подобное *2000

Вам задано неориентированное дерево s, состоящее из n вершин. Необходимо построить для него оптимальную Д-декомпозицию. Определим Д-декомпозицию следующим образом.

Обозначим за v множество всех вершин s. Рассмотрим неориентированное дерево t, вершинами которого являются некоторые непустые подмножества v, которые обозначим через xi . Дерево t является Д-декомпозицией s, если выполняются следующие условия:

  1. объединение всех xi равно v;
  2. для любого ребра (a, b) дерева s существует вершина дерева t, содержащая как a, так и b;
  3. если вершины дерева t xi и xj, содержат вершину a дерева s, то все вершины дерева t, лежащие на пути из xi в xj также содержат вершину a, то есть это условие эквивалентно тому, что все вершины дерева t, которые содержат вершину a дерева s, образуют связное поддерево дерева t.

Очевидно, что существует много различных деревьев t, являющихся Д-декомпозициями дерева s. Например, Д-декомпозицией является дерево, состоящее из одной вершины, представляющей собой все множество v.

Назовем мощностью вершины xi количество вершин дерева s, которые в ней содержатся. Выберем в дереве t вершину с максимальной мощностью. Пусть ее мощность равна w. Тогда весом Д-декомпозиции t назовем величину w. Оптимальной назовем Д-декомпозицию, у которой вес минимален.

Вам необходимо найти оптимальную Д-декомпозицию, заданного дерева s имеющую наименьшее количество вершин.

Входные данные

В первой строке задано единственное целое число n (2 ≤ n ≤ 105), обозначающее количество вершин в дереве s.

В каждой из следующих n - 1 строк через пробел заданы два целых числа ai, bi (1 ≤ ai, bi ≤ nai ≠ bi), обозначающие, что вершины дерева s с номерами ai и bi соединены ребром.

Считайте, что вершины дерева s пронумерованы от 1 до n. Гарантируется, что s является деревом.

Выходные данные

В первой строке выведите единственное целое число m, обозначающее количество вершин в искомой Д-декомпозиции.

Далее выведите m строк, содержащих описания вершин Д-декомпозиции. В i-той (1 ≤ i ≤ m) из них выведите описание вершины xi Д-декомпозиции. Описание каждой из вершин xi должно начинаться с целого числа ki, обозначающего количество вершин исходного дерева s, которые содержатся в вершине xi. Далее через пробел нужно вывести ki различных целых чисел — номера вершин из s, содержащихся в xi, в любом порядке.

Далее выведите m - 1 строк, содержащих по два целых числа pi, qi (1 ≤ pi, qi ≤ mpi ≠ qi). Пара чисел pi, qi обозначает наличие ребра между вершинами xpi и xqi Д-декомпозиции.

Выведенная Д-декомпозиция должна быть оптимальной Д-декомпозицией для заданного дерева s и содержать минимально возможное количество вершин среди оптимальных. Если существует несколько оптимальных Д-декомпозиций с минимальным количеством вершин, выведите любую из них.

C. Братья-Пожиратели Мира

Деревья дп жадные алгоритмы поиск в глубину и подобное *2100

Вы, наверное, слышали о двух братьях, мечтающих править миром. Коль скоро все их предыдущие планы провалились, на этот раз они решили сотрудничать друг с другом для того, чтобы править миром.

Как вы знаете, в мире существует n стран. Эти страны связаны n - 1 направленными дорогами. Если не учитывать направлений дорог, то между каждой парой стран в мире существует уникальный путь, проходящий по каждой дороге не более одного раза.

Каждый из братьев хочет установить свое правление в какой-то стране, сделав это, он сможет контролировать страны, до которых можно добраться из его страны по направленным дорогам.

Братья смогут править миром, если найдется не более двух стран, которые они могут выбрать (и установить свои правления в этих странах), таких, что любая другая страна находится под контролем по крайней мере одной из них. Для того, чтобы сделать это возможным, братья хотят, изменить направление минимального количества дорог. Ваша задача — вычислить это минимальное количество дорог.

Входные данные

Первая строка входных данных содержит целое число n (1 ≤ n ≤ 3000). Каждая из последующих n - 1 строк содержит два целых числа, разделенных пробелом, ai и bi (1 ≤ ai, bi ≤ nai ≠ bi), которые означают, что есть дорога из страны ai в страну bi.

Вы можете считать страны пронумерованными от 1 до n. Гарантируется, что если не учитывать направление дорог, то есть уникальный путь между каждой парой стран в мире, проходящий по каждой дороге не более одного раза.

Выходные данные

В единственной строке выходных данных выведите минимальное количество дорог, которым надо поменять направление для того, чтобы братья смогли управлять миром.

E. Ремонт дорог

графы жадные алгоритмы поиск в глубину и подобное *2800

В стране Берляндии n городов. Они пронумерованы целыми числами от 1 до n. Город номер 1 является столицей государства. Между некоторыми парами городов проложены дороги с односторонним движением, однако не все из них находятся в хорошем состоянии. Про каждую дорогу известно, нуждается ли она в ремонте. Если дорога нуждается в ремонте, то проезд по ней запрещен. Однако правительство Берляндии может отремонтировать дорогу и возобновить проезд по ней.

Сейчас над Берляндией нависла угроза войны с соседним государством, поэтому в столице было принято решение отправить в каждый город по одному военному отряду. Отряды могут передвигаться только по существующим дорогам, потому что на создание новых нет ни времени, ни средств. Однако для того, чтобы добраться до некоторых городов, возможно, придется отремонтировать какие-то дороги.

Конечно же, чтобы победить противника нужно много сил, поэтому силы надо экономить. С этой целью правительство Берляндии хочет отремонтировать минимальное число дорог, чтобы после этого военные отряды смогли добраться из столицы в любой другой город по отремонтированным дорогам или дорогам, уже находящимся в хорошем состоянии. Вам необходимо помочь правительству Берляндии и найти, какие дороги следует отремонтировать.

Входные данные

В первой строке через пробел заданы два целых числа n и m (1 ≤ n, m ≤ 105) — количество городов и количество дорог в Берляндии.

В следующих m строках через пробел заданы три целых числа ai, bi, ci (1 ≤ ai, bi ≤ n, ai ≠ bi, 0 ≤ ci ≤ 1), обозначающие дорогу из города ai в город bi. Если ci равно 0, то данная дорога находится в хорошем состоянии, если ci равно 1, то она нуждается в ремонте.

Гарантируется, что между городами существует не более одной дороги в каждом из направлений.

Выходные данные

Если даже после ремонта всех дорог из столицы нельзя добраться до какого-нибудь из городов, то выведите -1. В противном случае в первую строку выведите минимальное количество дорог, которые нужно отремонтировать, а во вторую строку выведите номера этих дорог через одиночные пробелы.

Дороги нумеруются, начиная с 1, в том порядке, в котором они заданы во входном файле.

Если существует несколько наборов, состоящих из минимального числа дорог, после ремонта которых все города станут достижимы из столицы, выведите любой из них.

Если в любой из городов можно добраться по дорогам, уже находящимся в хорошем состоянии, выведите 0 в единственную строку выходного файла.

C. Путь короля

графы кратчайшие пути поиск в глубину и подобное хэши *1800

Черный король находится на шахматном поле, состоящем из 109 строк и 109 столбцов. Будем считать, что строки этого шахматного поля пронумерованы целыми числами от 1 до 109 сверху вниз. Аналогично, столбцы пронумерованы целыми числами от 1 до 109 слева направо. Клетку поля, находящуюся в i-ой строке и j-ом столбце, будем обозначать (i, j).

Известно, что некоторые клетки заданного шахматного поля являются разрешенными. Все разрешенные клетки шахматного поля заданы в виде n отрезков. Каждый отрезок описывается тремя целыми числами ri, ai, bi (ai ≤ bi), обозначающими, что в ri-ой строке клетки с номерами столбцов с ai по bi включительно являются разрешенными.

Ваша задача — найти минимальное количество ходов, за которое шахматный король сможет добраться из клетки поля (x0, y0) в клетку поля (x1, y1), двигаясь только по разрешенным клеткам поля. Другими словами, во время своего пути шахматный король может находиться только лишь на разрешенных клетках поля.

Напомним, что шахматный король за один ход может переместиться в любую из (в общем случае восьми) соседних клеток. Две клетки шахматного поля считаются соседними, если они имеют хотя бы одну общую точку.

Входные данные

В первой строке через пробел записаны четыре целых числа x0, y0, x1, y1 (1 ≤ x0, y0, x1, y1 ≤ 109), обозначающие начальную и конечную позиции короля.

Во второй строке записано целое число n (1 ≤ n ≤ 105), обозначающее количество отрезков разрешенных клеток. В следующих n строках заданы описания этих отрезков. В i-той из этих строк через пробел записаны три целых числа ri, ai, bi (1 ≤ ri, ai, bi ≤ 109, ai ≤ bi), обозначающие, что в ri-ой строке клетки с номерами столбцов с ai по bi включительно, являются разрешенными. Обратите внимание, что отрезки разрешенных клеток могут произвольным образом пересекаться и вкладываться друг в друга.

Гарантируется, что начальная позиция и конечная позиция короля являются разрешенными клетками. Гарантируется, что начальная позиция не совпадает с конечной позицией короля. Гарантируется, что суммарная длина всех разрешенных отрезков не превосходит 105.

Выходные данные

Если пути между начальной и конечной позициями, состоящего из разрешенных клеток, не существует, выведите -1.

В противном случае выведите единственное целое число — минимальное количество ходов, за которое король сможет добраться из начальной позиции в конечную.

D. Спор

графы жадные алгоритмы поиск в глубину и подобное *2100

У Валеры имеется n счетчиков, пронумерованных от 1 до n. Некоторые из них соединены проводами, также на каждом из счетчиков имеется специальная кнопка.

Изначально, во всех счетчиках записано число 0. При нажатии кнопки, расположенной на некотором счетчике, записанное в нем значение увеличивается на единицу. Также значения, записанные во всех счетчиках, непосредственно соединенных с ним проводом, увеличиваются на единицу.

Валера и Игнат затеяли небольшой спор, заключающийся в следующем. Игнат загадал последовательность из n целых чисел a1, a2, ..., an. Валере нужно выбрать некоторый набор различных счетчиков и нажать кнопки на каждом из них ровно по одному разу (на остальных счетчиках кнопки останутся не нажатыми). Если после этого найдется счетчик с номером i, в котором записано значение равное ai, то Валера проигрывает спор, иначе он побеждает в споре.

Помогите Валере определить, на каких счетчиках нужно нажать кнопки, чтобы выиграть спор.

Входные данные

В первой строке через пробел записаны два целых числа n и m (1 ≤ n, m ≤ 105), обозначающие количество счетчиков у Валеры и количество пар счетчиков, соединенных проводами, соответственно.

В каждой из следующих m строк через пробел записаны два целых числа ui и vi (1 ≤ ui, vi ≤ n, ui ≠ vi), которые обозначают, что счетчики с номерами ui и vi соединены проводом. Гарантируется, что каждая пара соединенных счетчиков встречается во входных данных ровно один раз.

В последней строке через пробел записаны n целых чисел a1, a2, ..., an (0 ≤ ai ≤ 105), где ai — значение, которое загадал Игнат для i-го счетчика.

Выходные данные

Если Валера не сможет победить в споре, выведите в первой строке -1.

В противном случае в первой строке выведите целое число k (0 ≤ k ≤ n). Во второй строке выведите через пробел k различных целых чисел — номера счетчиков, на которых Валере нужно нажать кнопки, чтобы выиграть спор, в любом порядке.

Если существует несколько ответов, выведите любой.

C. Колорадский жук

поиск в глубину и подобное реализация *2200

У дяди Вани в огороде большое поле картошки размером (1010 + 1) × (1010 + 1) квадратных метров. Поле разделено на квадратные грядки, каждая грядка занимает один квадратный метр.

Дядя Ваня знает, что скоро начнется нашествие колорадских жуков, которые могут уничтожить весь урожай. Для борьбы с насекомыми, дядя Ваня хочет опрыскать некоторые грядки инсектицидами.

И вот дядя Ваня вышел на поле, встал в самый центр центральной грядки поля и опрыскал эту грядку инсектицидами. Теперь он собирается сделать серию перемещений и обработать еще несколько грядок. В ходе каждого из перемещений дядя Ваня двигается влево, вправо, вверх или вниз по полю на некоторое целое количество метров. По пути дядя Ваня обрабатывает все грядки, на которые наступает. Другими словами грядки, которые имеют хоть какое-то пересечение с траекторией дяди Вани, оказываются обработанными инсектицидами.

Когда дядя Ваня закончил работу, он записал на листочек все свои перемещения. Теперь он хочет узнать количество грядок, которые не будут заражены после нашествия колорадских жуков.

Известно, что нашествие колорадских жуков происходит по следующей схеме. Сначала заражается некоторая грядка на границе поля. После этого любая грядка, которая не заражена и не обработана химикатами, имеющая общую сторону с некоторой зараженной грядкой, оказывается зараженной. Помогите дяде Ване, определите количество грядок, которые не будут заражены колорадским жуком.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 1000) — количество перемещений дяди Вани.

В следующих n строках задано описание перемещений дяди Вани. В i-ой из этих строк описывается i-ое по счету перемещение. Каждое перемещение задано в формате «di xi», где di — символ, определяющий направление перемещения («L», «R», «U» или «D» для направлений «влево», «вправо», «вверх» и «вниз» соответственно), а xi (1 ≤ xi ≤ 106) — целое число, определяющее количество метров, на которое происходит перемещение.

Выходные данные

Выведите единственное целое число — количество грядок, которые не будут заражены колорадским жуком.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

B. Безусловно счастливые числа

битмаски Перебор поиск в глубину и подобное *1600

Поликарп любит счастливые числа. Всем известно, что счастливыми являются положительные целые числа, в десятичной записи (без лидирующих нулей) которых содержатся только счастливые цифры x и y. Например, если x = 4, а y = 7, то числа 47, 744, 4 являются счастливыми.

Назовем целое положительное число a безусловно счастливым, если существуют такие цифры x и y (0 ≤ x, y ≤ 9), что в десятичной записи числа a (без лидирующих нулей) содержатся только цифры x и y.

У Поликарпа есть целое число n. Он хочет узнать, сколько целых положительных чисел не превышающих n являются безусловно счастливыми. Помогите ему, посчитайте это количество.

Входные данные

В первой строке записано единственное целое число n (1 ≤ n ≤ 109) — число Поликарпа.

Выходные данные

Выведите единственное целое число — сколько целых положительных чисел не превышающих n являются безусловно счастливыми.

Примечание

В первом тестовом примере все числа не превышающие 10 являются безусловно счастливыми.

Во втором примере числа 102, 103, 104, 105, 106, 107, 108, 109, 120, 123 не являются безусловно счастливыми.

D. Цветной граф

графы Перебор поиск в глубину и подобное *1600

Вам задан неориентированный граф, состоящий из n вершин и m ребер. Будем считать, что вершины графа пронумерованы целыми числами от 1 до n. Каждая вершина графа имеет цвет. Цветом i-ой вершины назовем целое число ci.

Рассмотрим все вершины графа, которые покрашены в некоторый цвет k. Обозначим множество таких вершин через V(k). Определим величину разноцветность соседей для цвета k как мощность множества Q(k) = {cu :  cu ≠ k и существует вершина v принадлежащая множеству V(k) такая, что вершины v и u соединены ребром графа}.

От Вас требуется найти такой цвет k, для которого мощность множества Q(k) максимальна. Другими словами, вы хотите найти такой цвет, у которого соседи наиболее разноцветны. Обратите внимание, что вы хотите найти такой цвет k, что в графе существует хотя бы одна вершина с таким цветом.

Входные данные

В первой строке через пробел заданы два целых числа n, m (1 ≤ n, m ≤ 105) — количество вершин и ребер графа соответственно. Во второй строке задана последовательность целых чисел c1, c2, ..., cn (1 ≤ ci ≤ 105) — цвета вершин графа. Числа в строке разделяются пробелами.

В следующих m строках содержится описание ребер: в i-ой строке заданы два целых числа через пробел ai, bi (1 ≤ ai, bi ≤ nai ≠ bi) — номера вершин, которые соединяет i-ое ребро.

Гарантируется, что в заданном графе нет петель и кратных ребер.

Выходные данные

Выведите номер цвета, множество цветов соседей которого имеет максимальную мощность. Если оптимальных цветов несколько, выведите цвет с минимальным номером. Обратите внимание, что вы хотите найти такой цвет, что в графе существует хотя бы одна вершина с таким цветом.

E. Братья по крови возвращаются

Бинарный поиск дп поиск в глубину и подобное сортировки Структуры данных *2400

Поликарп раздобыл дерево родственных связей. Найденное дерево описывает родственные связи n человек, пронумерованных от 1 до n. Каждый человек в этом дереве имеет не более одного непосредственного предка. Также каждый человек в дереве имеет имя, имена не обязательно уникальные.

Назовем человека с номером a 1-прародителем человека с номером b, если человек с номером a является непосредственным предком человека с номером b.

Назовем человека с номером a k-прародителем (k > 1) человека с номером b, если у человека с номером b есть 1-прародитель, и человек с номером a является (k - 1)-прародителем 1-прародителя человека с номером b.

В найденном дереве родственные связи не образуют циклов. Другими словами не существует человека, который непосредственно или косвенно является собственным прародителем (то есть является x-прародителем самого себя, для некоторого x, x > 0).

Назовем человека с номером a k-сыном человека с номером b, если человек с номером b является k-предком человека с номером a.

Поликарп очень сильно интересуется сколько у кого и каких сыновей. Он записал на листочке m пар чисел vi, ki. Помогите ему для каждой пары vi, ki узнать, сколько существует различных имен, среди всех имен ki-сыновей человека с номером vi.

Входные данные

В первой строке входных данных записано единственное целое число n (1 ≤ n ≤ 105) — количество людей в дереве. В следующих n строках записано описание людей в дереве. В i-той из этих строк записаны через пробел строка si и целое число ri (0 ≤ ri ≤ n), где si — имя человека с номером i, а ri — номер непосредственного предка человека с номером i или 0 если у человека с номером i нет непосредственного предка.

В следующей строке записано единственное целое число m (1 ≤ m ≤ 105) — количество записей Поликарпа. В m следующих строках записаны пары целых чисел через пробел. В i-ой строке записаны числа vi, ki (1 ≤ vi, ki ≤ n).

Гарантируется, что родственные связи не образуют циклов. Имена всех людей непустые строки, состоящие из не более чем 20 строчных латинских букв.

Выходные данные

Выведите m целых чисел, разделенных пробельными символами, — ответы на записи Поликарпа. Ответы для записей выводите в том порядке, в котором записи встречаются во входных данных.

E. Дерево и таблица

Деревья дп поиск в глубину и подобное реализация *3000

Маленький Петя очень любит деревья. Недавно мама подарила ему дерево с 2n вершинами. Петя сразу же решил расположить это дерево на прямоугольной таблице, состоящей из 2 строк и n столбцов так, чтобы выполнялись следующие условия:

  1. Каждой клетке таблицы соответствует ровно одна вершина дерева и наоборот, каждой вершине дерева соответствует ровно одна клетка таблицы.
  2. Если две вершины дерева соединены ребром, то соответствующие им клетки имеют общую сторону.

Сейчас Пете интересно, сколько существует способов расположить его дерево на таблице. Он называет два расположения различными, если существует вершина дерева, которой соответствуют разные клетки таблицы в этих двух расположениях. Поскольку большие числа очень пугают Петю, выведите остаток от деления ответа на 1000000007 (109 + 7).

Входные данные

Первая строка содержит единственное целое число n (1 ≤ n ≤ 105). Следующие (2n - 1) строк содержат по два целых числа ai и bi (1 ≤ ai, bi ≤ 2nai ≠ bi), которые обозначают номера вершин, соединенных соответствующим ребром.

Считайте, что вершины дерева пронумерованы целыми числами от 1 до 2n. Гарантируется, что заданный во входных данных граф является деревом, то есть связным ациклическим неориентированным графом.

Выходные данные

Выведите единственное целое число — искомое количество способов расположить дерево на таблице, взятое по модулю 1000000007 (109 + 7).

Примечание

Пояснение к примеру 1 (ниже представлены все 12 вариантов расположения дерева на таблице):


1-3-2 2-3-1 5 4 6 6 4 5
| | | | | | | | | | | |
5 4 6 6 4 5 1-3-2 2-3-1

4-3-2 2-3-4 5-1 6 6 1-5
| | | | | | | |
5-1 6 6 1-5 4-3-2 2-3-4

1-3-4 4-3-1 5 2-6 6-2 5
| | | | | | | |
5 2-6 6-2 5 1-3-4 4-3-1

C. Текстовый редактор

графы жадные алгоритмы кратчайшие пути поиск в глубину и подобное Структуры данных *1600

Нехотя, тыкая пальцами в кнопки на клавиатуре, Вася выдавливает из себя скудные мысли по поводу того, о чем же думал Андрей Болконский, глядя на небо Аустерлица... Ну как объяснить учительнице по литературе, что Вася не собирается становиться писателем, а хочет стать программистом. Поэтому программу он напишет с удовольствием, а вот сочинение дается ему с трудом.

Пока Вася думал о том, как выудить из себя очередное предложение, ему в голову пришел неожиданный вопрос: а какое наименьшее количество нажатий на кнопки ему нужно сделать, чтобы переместить курсор из одной позиции в другую?

Опишем его вопрос более формально: для набора текста Вася использует текстовый редактор. Он уже написал n строчек, в i-й строке написано ai символов (включая пробелы). Если в некоторой строке записано k символов, то всего в этой строке существует (k + 1) позиция, в которой может находиться курсор: перед каким-то символом или после всех символов (в конце строки). Таким образом, положение курсора задается парой чисел (r, c), где r — номер строки, а c — позиция курсора в ней (позиции нумеруются с единицы от начала строки).

Для перемещения курсора Вася не использует мышь. Он использует клавиши «Вверх», «Вниз», «Вправо» и «Влево». При нажатии на каждую из этих клавиш курсор перемещается следующим образом. Пусть до нажатия соответствующей клавиши курсор находился в позиции (r, c), тогда после нажатия клавиши:

  • «Вверх»: если курсор находился в первой строке (r = 1), то он не перемещается. Иначе он перемещается на предыдущую строку (с номером r - 1) в ту же позицию. При этом, если предыдущая строка короткая, то есть курсор не может находиться в ней в позиции c, то курсор перемещается на последнюю позицию строки с номером r - 1;
  • «Вниз»: если курсор находился в последней строке (r = n), то он не перемещается. Иначе он перемещается на следующую строку (с номером r + 1) в ту же позицию. При этом, если следующая строка короткая, то есть курсор не может находиться в ней в позиции c, то курсор перемещается на последнюю позицию строки с номером r + 1;
  • «Вправо»: если курсор может переместиться вправо в текущей строке (c < ar + 1), то он перемещается вправо (в позицию c + 1). Иначе он находится в конце строки и, при нажатии клавиши «Вправо», никуда не перемещается;
  • «Влево»: если курсор может переместиться влево в текущей строке (c > 1), то он перемещается влево (в позицию c - 1). Иначе он находится в начале строки и, при нажатии клавиши «Влево», никуда не перемещается.

Вам задано количество строк в текстовом файле и количество символов, записанное в каждой строке этого файла. Найдите наименьшее количество нажатий описанных выше клавиш, требуемое для того, чтобы переместить курсор из положения (r1, c1) в положение (r2, c2).

Входные данные

В первой строке входных данных записано целое число n (1 ≤ n ≤ 100) — количество строк в файле. Во второй строке записано n целых чисел a1, a2, ..., an (0 ≤ ai ≤ 105), разделенных одиночными пробелами. В третьей строке записано четыре целых числа r1, c1, r2, c2 (1 ≤ r1, r2 ≤ n, 1 ≤ c1 ≤ ar1 + 1, 1 ≤ c2 ≤ ar2 + 1).

Выходные данные

Выведите единственное число — наименьшее количество нажатий, требуемое для того, чтобы переместить курсор из положения (r1, c1) в положение (r2, c2).

Примечание

В первом примере в редакторе записаны четыре строки. Обозначим цифрами возможные позиции курсора в строке. Буквой s обозначим начальную позицию курсора, буквой t — конечную. Тогда все возможные положения курсора в текстовом редакторе описываются следующей таблицей.

123

12

123s567

1t345

Один из возможных ответов в данном примере: «Влево», «Вниз», «Влево».

D. Крысы

графы кратчайшие пути Перебор поиск в глубину и подобное реализация *2300

В подвале магазина, которым владеет Василий Петрович, расплодились крысы. Василий Петрович, возможно, и не замечал бы их присутствия, но они повадились пробираться на склад и красть оттуда продукты. Василий Петрович не может с этим больше мириться: он должен уничтожить крыс в подвале. Поскольку мышеловки уже изжили себя и совсем не помогают, а крысиным ядом потом можно отравиться и самому, он избрал радикальный способ: взорвать в подвале две гранаты (больше у него нет).

В данной задаче мы будем представлять подвал магазина в виде прямоугольной таблицы из n × m клеток. Некоторые клетки заняты стенами, а остальные — свободны. Василий Петрович понаблюдал за крысами и выяснил, что в определенный момент времени они ложатся спать, причем все время в одни и те же места. В этот удобный момент он и хочет взорвать гранаты. На плане своего подвала он отметил те клетки, в которых спят крысы. Эти клетки, разумеется, не заняты стенами.

Гранату можно взорвать только в клетке, не занятой стеной. Взрывная волна от гранаты распространяется следующим образом. Будем считать, что подрыв гранаты происходит в момент времени 0. В этот начальный момент времени взорвана только клетка, где подорвали гранату. Если в момент времени t взорвана некоторая клетка, то в момент времени t + 1 будут взорваны те соседние по стороне клетки, которые не заняты стенами (некоторые из них могли быть взорваны и до этого). Взрывная волна распространяется ровно d секунд, после чего мгновенно угасает.

Пример распространения взрывной волны: на первой картинке ситуация до взрыва, а на последующих картинках показаны взорванные клетки на моменты времени 0,1,2,3 и 4. Таким образом взрывная волна на картинке распространяется d = 4 секунды.

Василий Петрович интересуется, можно ли выбрать две клетки для подрыва гранат таким образом, чтобы все клетки, в которых спят крысы, оказались взорваны. Напишите программу, которая это выясняет.

Входные данные

В первой строке записаны три целых числа n, m и d, разделенных одиночными пробелами (4 ≤ n, m ≤ 1000, 1 ≤ d ≤ 8). В следующих n строках записана таблица, задающая план подвала. Каждая строка таблицы состоит из m символов. Символ «X» означает, что соответствующая клетка занята стеной, символ «.» означает свободную клетку, символ «R» — свободную клетку, в которой спят крысы.

Гарантируется, что первая и последняя строки, а также первый и последний столбцы состоят из символов «X». На плане есть хотя бы две клетки, не занятые стенами. Имеется хотя бы одна клетка, в которой спят крысы.

Выходные данные

Если невозможно взорвать все клетки, в которых спят крысы, выведите единственное целое число -1. Иначе выведите через пробел четыре целых числа r1, c1, r2, c2, означающих, что одну из гранат следует взорвать в клетке (r1, c1), а другую — в клетке (r2, c2).

Считайте, что строки таблицы пронумерованы сверху вниз от 1 до n, а столбцы слева направо от 1 до m. Поскольку r1 и r2 задают номера строк, а c1 и c2 — номера столбцов в таблице, то должны выполняться ограничения: 1 ≤ r1, r2 ≤ n, 1 ≤ c1, c2 ≤ m. В одной и той же клетке дважды взрывать гранату нельзя. Взрывные волны гранат могут пересекаться. Возможно, взрыв одной из гранат не уничтожит ни одной крысы, а взрыв другой уничтожит всех.

E. Маленький Слоник и дерево

Деревья поиск в глубину и подобное Структуры данных *2400

Маленький Слоник очень любит деревья, а особенно корневые.

У него есть дерево, состоящее из n вершин (вершины пронумерованы от 1 до n), с корнем в вершине с номером 1. В каждой вершине дерева хранится некоторый список чисел, который изначально пуст.

Маленький Слоник хочет выполнить m операций. На i-той операции (1 ≤ i ≤ m) он сначала добавляет число i в списки всех вершин поддерева с корнем в вершине с номером ai, а потом добавляет число i в списки всех вершин поддерева с корнем в вершине bi.

После выполнения всех операций, Маленький Слоник для каждой вершины i хочет посчитать число ci — количество целых чисел j (1 ≤ j ≤ nj ≠ i) таких, что в списках i-той и j-той вершины есть хотя бы одно общее число.

Помогите Маленькому Слонику, посчитайте числа ci за него.

Входные данные

В первой строке заданы два целых числа n и m (1 ≤ n, m ≤ 105) — количество вершин дерева и количество операций.

Каждая из следующих n - 1 строк содержит два целых числа, разделенных пробелом, ui и vi (1 ≤ ui, vi ≤ n, ui ≠ vi), которые обозначают, что существует ребро между вершинами с номерами ui и vi.

Каждая из следующих m строк содержит два целых числа, разделенных пробелом, ai и bi (1 ≤ ai, bi ≤ n, ai ≠ bi), которые обозначают номера вершин в i-той операции.

Гарантируется, что заданный граф являет неориентированным деревом.

Выходные данные

В единственной строке выведите n целых чисел через пробел — c1, c2, ..., cn.

C. Круг чисел

Перебор поиск в глубину и подобное реализация *2000

Вася написал на доске по кругу в некотором порядке n различных целых чисел от 1 до n. Затем он соединил дугами пары чисел (a, b) (a ≠ b), которые либо являются непосредственными соседями друг друга в круге, либо существует число c, такое что a и с являются непосредственными соседями, а также b и c являются непосредственными соседями. Нетрудно догадаться, что в итоге Вася нарисовал n дуг.

Например, если числа по кругу написаны в порядке 1, 2, 3, 4, 5 (по часовой стрелке), то дугами будут соединены пары чисел (1, 2), (2, 3), (3, 4), (4, 5), (5, 1), (1, 3), (2, 4), (3, 5), (4, 1) и (5, 2).

С тех пор прошло немало времени, числа с доски были давно стерты, но не так давно Вася нашел у себя листочек с выписанными n парами чисел, которые были соединены дугами на доске. Вася просит вас найти порядок чисел в круге по этим парам.

Входные данные

В первой строке входных данных записано единственное целое число n (5 ≤ n ≤ 105) — количество чисел в круге. Далее в n строках даны пары целых чисел ai, bi (1 ≤ ai, bi ≤ n, ai ≠ bi) — числа, соединенные дугами.

Гарантируется, что никакая пара чисел, соединенных дугой, не задана во входных данных более одного раза. Пары и числа в парах заданы в произвольном порядке.

Выходные данные

Если Вася где-то ошибся, и не существует ни одного способа расположить числа от 1 до n на круге согласно условию, то выведите единственное число «-1» (без кавычек). Иначе выведите любую подходящую последовательность из n различных целых чисел от 1 до n.

Если существует несколько решений, то разрешается вывести любое. В частности, не имеет значения от какого числа начинать последовательность, описывающую порядок, также неважно по часовой стрелке выписывать числа или против.

D. Цикл в графе

графы поиск в глубину и подобное *1800

Вам задан неориентированный граф G, состоящий из n вершин. Будем считать, что вершины этого графа пронумерованы целыми числами от 1 до n. Известно, что каждая вершина графа G соединена ребрами не менее чем с k другими вершинами этого графа. Ваша задача — найти в описанном графе простой цикл длины не менее k + 1.

Простым циклом длины d (d > 1) в графе G называется последовательность различных вершин графа v1, v2, ..., vd такая, что вершины v1 и vd соединены ребром графа, а также для любого целого i (1 ≤ i < d) вершины vi и vi + 1 соединены ребром графа.

Входные данные

В первой строке записаны три целых числа n, m, k (3 ≤ n, m ≤ 105; 2 ≤ k ≤ n - 1) — количество вершин в графе, ребер в графе и ограничение снизу на степень вершины графа. В следующих m строках записаны пары целых чисел. В i-той строке записаны числа ai, bi (1 ≤ ai, bi ≤ nai ≠ bi) — номера вершин графа, которые соединяет i-тое ребро.

Гарантируется, что заданный граф не содержит кратных ребер и петель. Гарантируется, что каждая вершина графа соединена ребрами не менее чем с k другими вершинами этого графа.

Выходные данные

В первой строке выведите целое число r (r ≥ k + 1) — длина найденного цикла. В следующей строке выведите r различных целых чисел v1, v2, ..., vr (1 ≤ vi ≤ n) — найденный простой цикл.

Гарантируется, что ответ существует. Если существует несколько правильных ответов, разрешается вывести любой из них.

B. Домино

графы поиск в глубину и подобное *2000

Дан набор костяшек домино. Можно ли выложить все доминошки в цепочку друг за другом так, что бы любые две соприкасались сторонами с одинаковым числом очков? В наборе может встречаться две и более костяшек одного вида. Костяшки можно переворачивать, меняя левую и правую сторону (костяшка «1-4» превращается в «4-1»).

Входные данные

В первой строке содержится число n (1 ≤ n ≤ 100). Далее в n строках описаны доминошки. В каждой из этих строк содержится два числа — количество очков на левой и правой половине соответственно. Количества очков — неотрицательные целые числа от 0 до 6. В заданном наборе могут быть дубликаты (одинаковые костяшки).

Выходные данные

Выведите «No solution», если костяшки выложить требуемым образом невозможно. Если решение существует, то опишите любой из способов укладки. Доминошки выкладываются справа налево. В каждой из n строк запишите номер костяшки, которая кладётся в соответствующей позиции, а затем (через пробел) знак «+» (в случае, если доминошку не следует переворачивать) или «» (если её надо перевернуть).

B. Турнир

битмаски жадные алгоритмы Перебор поиск в глубину и подобное *1300

Совсем недавно в Берляндии завершился турнир по скоростному засыпанию «Соня-2010». В турнире приняло участие n сильнейших участников со всей страны. Турнир состоит из игр, каждая из которых является противостоянием двух участников. Таким образом, в процессе турнира было проведено n·(n - 1) / 2 игр, то есть каждый из участников встретился с каждым.

Правила игры очень просты — кто первый засыпает, тот и победил. Ответственный секретарь должен был записать каждую игру в виде пары чисел «xi yi», где xi и yi — это порядковые номера участников игры, причем тот, кто записан первым является победителем игры (т.е. xi — победитель, а yi — проигравший). Ничьих в этой игре не бывает.

Совсем недавно «Институт Изучения Сна» выяснил, что на самом деле каждый человек характеризуется величиной pj — скоростью засыпания в экстремальных условиях. Таким образом, при игре двух игроков побеждает тот, у кого эта величина меньше. Величина pj у каждого человека своя и не изменяется в течении жизни.

Известно, что у всех участников турнира их pj различны. Также известно, что секретарь сделал записи результатов всех игр, кроме одной.

Ваша задача написать программу, которая по заданным записям результатов игр определяет недостающую.

Входные данные

В первой строке записано целое число n (3 ≤ n ≤ 50) — количество участников. Следующие n·(n - 1) / 2 - 1 строк содержат результаты всех игр. Каждая игра записана в отдельной строке в виде пары чисел xi, yi (1 ≤ xi, yi ≤ n, xi ≠ yi), где xi и yi — номера участников встречи. Известно, что в процессе турнира каждый из n участников принял участие в n - 1 игре, встретившись со всеми соперниками.

Выходные данные

Выведите пару чисел x y — недостающую запись. Если решений несколько, то выведите любое.

D. Кольцевая 2

2-sat графы поиск в глубину и подобное снм *2200

Всем известно, что в Берляндии есть n городов, образующих Серебряное кольцо — пары городов с номерами i и i + 1 (1 ≤ i < n), а так же n и 1 соединены дорогами. Правительство Берляндии решило построить m новых дорог. Уже подготовлен план постройки — список пар городов, которые нужно соединить дорогами. Каждая дорога будет представлять собой непрерывную линию, находящуюся внутри, либо снаружи кольца. Дороги не будут иметь общих точек с кольцом (кроме двух ее концов).

Теперь разработчикам плана интересно, можно ли построить дороги так, чтобы они не пересекались (заметим, что дороги могут пересекаться своими концами). Если это возможно сделать, то какие дороги должны находиться внутри кольца, а какие снаружи?

Входные данные

В первой строке записаны два целых числа n и m (4 ≤ n ≤ 100, 1 ≤ m ≤ 100). Далее следует m строк по два целых числа ai и bi (1 ≤ ai, bi ≤ n, ai ≠ bi). Между парой городов не может быть больше одной дороги. План не содержит тех дорог, которые уже существуют в Серебряном кольце.

Выходные данные

Если невозможно построить дороги так, чтобы они пересекались только в концах, выведите Impossible. Иначе выведите m символов. i-ый символ должен быть i, если дорогу нужно проводить внутри кольца, или o — если дорогу нужно проводить снаружи кольца. Если решений несколько, выведите любое.

B. Нулевое дерево

Деревья дп жадные алгоритмы поиск в глубину и подобное *1800

Дерево — это граф, состоящий из n вершин и ровно n - 1 ребер; этот граф должен удовлетворять следующему условию: существует ровно один кратчайший (по количеству ребер) путь между любой парой его вершин.

Поддерево дерева T — это дерево, где как вершины, так и ребра являются подмножествами вершин и ребер T.

Вам дано дерево с n вершинами. Вы можете считать, что его вершины пронумерованы целыми числами от 1 до n. Дополнительно в каждой вершине дерева записано целое число. Изначально целое число, записанное в i-ой вершине, равняется vi. За один ход Вы можете применить следующую операцию:

  1. Выбрать поддерево данного дерева, которое включает вершину с номером 1.
  2. Увеличить (или уменьшить) на один все целые числа, записанные в вершинах этого поддерева.

Вычислите минимальное количество ходов, необходимое для того, чтобы сделать все целые числа, записанные в вершинах данного дерева, равными нулю.

Входные данные

Первая строка входных данных содержит n (1 ≤ n ≤ 105). Каждая из следующих n - 1 строк содержит два целых числа ai и bi (1 ≤ ai, bi ≤ nai ≠ bi), обозначающих, что существует ребро между вершинами ai и bi. Гарантируется, что граф, представленный во входных данных, является деревом.

Последняя строка входных данных содержит список из n целых чисел, записанных через пробел, v1, v2, ..., vn (|vi| ≤ 109).

Выходные данные

Выведите минимальное количество операций, необходимое для решения задачи.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

D. Прекрасная матрица

графы жадные алгоритмы поиск в глубину и подобное сортировки *2200

У Ленни была матрица размера n × m, состоящая из целых чисел. Он обожал эту матрицу, поскольку числа в каждой строке матрицы были отсортированы в порядке неубывания. Матрицы, которые обладают таким свойством, Ленни называет прекрасными.

Однажды, когда Ленни был в школе, его младший брат играл с матрицей Ленни в своей комнате. Он стер некоторые записи в матрице и изменил порядок некоторых ее столбцов. Придя домой, Ленни очень опечалился и теперь хочет восстановить свою матрицу.

Помогите ему найти порядок столбцов матрицы так, чтобы было возможно заполнить стертые записи и снова получить прекрасную матрицу. Обратите внимание, что стертые записи можно заполнять любыми целыми числами.

Входные данные

Первая строка входных данных содержит два положительных целых числа n и m (1 ≤ n·m ≤ 105). Каждая из следующих n строк содержит m целых чисел через пробел — матрица Ленни. Число -1 обозначает стертую запись в матрице. Все остальные целые числа (каждое из которых между 0 и 109, включительно) представляют заполненные записи.

Выходные данные

Если не существует возможных способов переупорядочить столбцы, выведите -1. В противном случае, выходные данные должны содержать m целых чисел p1, p2, ..., pm, обозначающих искомую перестановку столбцов. Таким образом, первый столбец прекрасной матрицы будет p1-ым столбцом изначальной матрицы. Второй столбец прекрасной матрицы будет p2-ым столбцом изначальной матрицы и так далее.

A. Изучение языков

поиск в глубину и подобное снм *1400

В компании «BerCorp» работает n сотрудников. Для официальной переписки утверждено m языков, пронумерованных целыми числами от 1 до m. Для каждого сотрудника известно, какие языки он знает. Возможно даже, что человек не знает ни одного официального языка. Но работники готовы выучить любое количество языков, если только компания оплатит им обучение. Стоимость курса изучения одного языка для одного сотрудника составляет 1 бердоллар.

Определите, какую минимальную сумму денег придется затратить компании, чтобы любой сотрудник мог обратиться к любому другому, возможно, не напрямую (то есть, привлекая других сотрудников для перевода).

Входные данные

В первой строке записано два целых числа n и m (2 ≤ n, m ≤ 100) — количество сотрудников и количество языков.

Далее следует n строк — списки языков для каждого работника. В начале i-ой строки записано целое число ki (0 ≤ ki ≤ m) — количество языков, которые знает i-ый сотрудник. Далее в i-ой строке записано ki целых чисел — aij (1 ≤ aij ≤ m) — номера языков, которые знает i-ый сотрудник. Гарантируется, что все номера в одном списке различны. Обратите внимание, что сотрудник может не знать ни одного языка.

Числа в строках разделяются одиночными пробелами.

Выходные данные

Выведите единственное целое число — наименьшее количество денег, которое придется заплатить, чтобы каждый мог написать письмо каждому (возможно, привлекая других для перевода).

Примечание

Во втором примере сотрудник с номером 1 может выучить язык с номером 2, а сотрудник с номером 8 — язык с номером 4.

В третьем примере сотруднику с номером 2 нужно выучить язык с номером 2.

B. pSort

графы поиск в глубину и подобное снм *1600

Однажды n ячеек одного массива решили поиграть в некоторую игру. Сначала каждая ячейка записала в себя свой порядковый номер (считая с 1), а затем каждая ячейка назвала свое любимое число. На своем ходе i-ая ячейка могла поменять местами свое содержимое и содержимое j-ой ячейки, если |i - j| = di, где di — любимое число i-ой ячейки. «Игроки» ходят в любом порядке, в каком захотят. Количество ходов не ограничено.

Вам дана перестановка чисел от 1 до n и любимые числа ячеек. Ваша задача ответить: может ли игра зайти в такое положение.

Входные данные

В первой строке дано натуральное число n (1 ≤ n ≤ 100) — количество ячеек в массиве. Во второй строке задано n различных целых чисел от 1 до n — заданная перестановка. В третьей строке задано n целых чисел от 1 до n — любимые числа ячеек.

Выходные данные

Если игра могла зайти в заданное положение выведите YES, иначе выведите NO.

B. Коровки программируют

графы дп поиск в глубину и подобное *1700

Фермер Джон только что дал коровкам поиграться с программой! Программа содержит две целочисленные переменные x и y. Ей подается на вход последовательность положительных целых чисел a1, a2, ..., an, в зависимости от которой она выполняет следующие операции:

  1. Изначально x = 1 и y = 0. Если после какого-то шага x ≤ 0 или x > n, то программа немедленно завершается.
  2. Программа одновременно увеличивает x и y на ax.
  3. Затем программа увеличивает y на ax, уменьшая x на ax.
  4. Программа попеременно выполняет шаги 2 и 3 (сначала 2, затем 3), пока не завершится (она может никогда не завершиться). Таким образом, последовательность шагов может начаться так: шаг 2, шаг 3, шаг 2, шаг 3, шаг 2 и так далее.

Коровки все же не очень хорошо считают, и поэтому они хотят разобраться, как работает программа. Пожалуйста, помоги им!

Дана последовательность a2, a3, ..., an. Предположим, что для каждого i (1 ≤ i ≤ n - 1) мы запускаем программу на последовательности i, a2, a3, ..., an. Для каждого такого запуска выведите итоговое значение y, если программа завершится, или -1, если программа не завершится.

Входные данные

Первая строка содержит единственное целое число, n (2 ≤ n ≤ 2·105). Следующая строка содержит n - 1 целых чисел через пробел, a2, a3, ..., an (1 ≤ ai ≤ 109).

Выходные данные

Выведите n - 1 строк. В i-ой строке выведите требуемое значение, когда программа запускается на последовательности i, a2, a3, ...an.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Примечание

В первом примере

  1. Для i = 1,  x изменяется следующим образом: , y становится 1 + 2 = 3.
  2. Для i = 2,  x изменяется следующим образом: , y становится 2 + 4 = 6.
  3. Для i = 3,  x изменяется следующим образом: , y становится 3 + 1 + 4 = 8.

D. Пингвин Поло и дерево

Деревья Комбинаторика поиск в глубину и подобное *2400

У маленького пингвина Поло есть дерево — неориентированный связанный ациклический граф, в котором n вершин и n - 1 ребро. Будем считать, что вершины дерева пронумерованы целыми числами от 1 до n.

Сегодня Поло интересует следующая задача: найти количество пар путей, у которых нет ни одной общей вершины. Более формально, нужно найти количество четверок целых чисел a, b, c и d таких, что:

  • 1 ≤ a < b ≤ n;
  • 1 ≤ c < d ≤ n;
  • не существует такой вершины, которая одновременно лежит на кратчайшем пути от вершины a до вершины b и от вершины c до вершины d.

Под кратчайшим путем между двумя вершинами подразумевается путь, кратчайший по количеству ребер.

Помогите Поло, решите эту задачу.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 80000) — количество вершин дерева. В каждой из следующих n - 1 строк задана пара целых чисел ui и vi (1 ≤ ui, vi ≤ nui ≠ vi)i-тое ребро дерева.

Гарантируется, что заданный граф является деревом.

Выходные данные

В единственной строке выведите целое число — ответ на задачу.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

C. Почтовые штампы

графы поиск в глубину и подобное реализация Структуры данных *1700

Однажды Васе в руки попалось бумажное письмо в конверте. Вася знает, что когда работники Берляндской почты пересылают письмо напрямую из города «A» в город «B» они ставят на него либо штамп «A B», либо «B A». К сожалению, часто невозможно напрямую переслать письмо из города отправителя в город получателя, поэтому письмо пересылается через некоторые промежуточные города. Работники почты никогда не пересылают письмо по циклу, то есть письмо не может побывать в одном городе дважды. Вася уверен, что при каждой пересылке они исправно ставят штампы.

На конверте Васиного письма n почтовых штампов. Он понимает, что возможных маршрута следования письма всего два. Но штампов очень много, и Вася не может сам определить ни один из этих маршрутов. Поэтому он просит вас помочь ему. Найдите один из возможных маршрутов следования письма.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105) — числа почтовых штампов на конверте. Далее следует n строк по два целых числа — описания штампов. Каждый штамп описывается номерами городов, между которыми письмо пересылалось. Номера городов — целые числа от 1 до 109. Номера всех городов различны. Каждой пересылке письма соответствует ровно один почтовый штамп. Гарантируется, что описанные штампы соответствуют корректному маршруту следования письма из одного города в некоторый другой.

Выходные данные

Выведите n + 1 число — номера городов в одном из двух возможных маршрутов в порядке следования письма.

D. Муравей на дереве

Деревья Конструктив поиск в глубину и подобное *2000

Дерево — это связный неориентированный граф без циклов. Деревья представляют собой широкий класс графов, интересный не только людям, но и муравьям.

В корне одного дерева стоит муравей. Он видит, что в дереве n вершин, и они соединены n - 1 ребрами так, что от любой вершины можно дойти до любой другой. Лист в дереве — это отличная от корня вершина, которая соединена ровно с одной другой вершиной.

Муравей хочет обойти все вершины дерева и вернуться назад к корню, пройдя по каждому ребру ровно два раза. При этом он хочет обойти все листья в заданном порядке. Ваша задача найти любой возможный путь муравья.

Входные данные

В первой строке записано целое число n (3 ≤ n ≤ 300) — количество вершин в дереве. Далее следует n - 1 строк — описания ребер. Каждое ребро описывается двумя числами — номерами вершин, которые оно соединяет. По каждому ребру можно идти в любом направлении. Вершины нумеруются с 1. Корень дерева имеет номер 1.

На следующей строке задан порядок обхода всех листьев дерева — k целых чисел, где k — количество листьев в дереве. Гарантируется, что этот порядок обхода содержит все листья дерева и только их ровно один раз.

Выходные данные

Если искомого порядка обхода всех n вершин не существует, выведите -1. Иначе выведите 2n - 1 чисел — сам обход. Каждый раз, когда муравей приходит в вершину, выводите номер этой вершины.

F. Жадный Петя

*особая задача графы жадные алгоритмы поиск в глубину и подобное *2800

Петя — неопытный спортивный программист. Недавно ему попалась следующая задача:

Дан неориентированный граф, состоящий из n вершин и m ребер. Определите, есть ли в этом графе Гамильтонов путь.

Петя быстренько и без багов написал программу, которая (по его мнению) решает эту задачу. После чего Петя решил дать эту задачу на первоапрельский контест. К сожалению, Петя мог ошибиться и придумать неправильный алгоритм решения задачи. Но это же не повод уйти с контеста с несданной задачей, правда?

Входные данные

В первой строке записаны два целых числа n, m (1 ≤ n ≤ 20; 0 ≤ m ≤ 400). В следующих m строках записаны пары целых чисел vi, ui (1 ≤ vi, ui ≤ n).

Выходные данные

Следуйте формату вывода программы Пети.

E. Древесно-строковая задача

*особая задача поиск в глубину и подобное Строки хэши *2000

Корневым деревом называется неориентированный связный граф без циклов с выделенной вершиной, которая называется корнем дерева. Будем считать, что вершины корневого дерева из n вершин пронумерованы от 1 до n. В этой задаче корнем дерева будет вершина с номером 1.

Обозначим через d(v, u) длину кратчайшего по количеству ребер пути в дереве между вершинами v и u.

Родителем вершины v в корневом дереве с корнем в вершине r (v ≠ r) называется вершина pv, такая, что d(r, pv) + 1 = d(r, v) и d(pv, v) = 1. Например, на рисунке родителем вершины v = 5 является вершина p5 = 2.

Как-то раз Поликарп раздобыл корневое дерево из n вершин. Дерево было не совсем обычное — на его ребрах были написаны строки. Поликарп расположил дерево на плоскости так, что все ребра ведут сверху вниз при прохождении от родителя вершины к вершине (см. рисунок). Для каждого ребра, ведущего из вершины pv в вершину v (1 < v ≤ n), известна строка sv, которая на нем написана. Все строки записаны на ребрах сверху вниз. Например, на рисунке s7ba». Символы в строках пронумерованы от 0.

Пример дерева Поликарпа (соответствует примеру из условия)

Позицией в этом дереве Поликарп называет конкретную букву конкретной строки. Позиция записывается как пара целых чисел (v, x), которая обозначает, что позицией является x-ая буква строки sv (1 < v ≤ n, 0 ≤ x < |sv|), где |sv| — длина строки sv. Например, выделенные буквы — это позиции (2, 1) и (3, 1).

Рассмотрим пару позиций (v, x) и (u, y) в дереве Поликарпа, такую, что путь от первой позиции ко второй идет сверху вниз в дереве Поликарпа, нарисованном на плоскости. Будем считать, что пара этих позиций определяет строку z. Строка z состоит из всех букв на пути от (v, x) к (u, y), записанных в порядке прохождения этого пути. Например, на рисунке выделенные позиции определяют строку «bacaba».

У Поликарпа есть строка t, он хочет узнать, сколько существует пар позиций, которые определяют строку t. Обратите внимание, что путь от первой позиции ко второй в паре должен всюду вести вниз. Помогите ему с этой нелегкой древесно-строковой задачей!

Входные данные

В первой строке задано целое число n (2 ≤ n ≤ 105) — количество вершин дерева Поликарпа. В следующих n - 1 строках заданы ребра дерева. В i-ой из них записаны число pi + 1 и строка si + 1 (1 ≤ pi + 1 ≤ npi + 1 ≠ (i + 1)). Строка si + 1 — непустая и состоит из строчных букв латинского алфавита. В последней строке записана строка t. Строка t состоит из строчных букв латинского алфавита, ее длина не менее 2.

Гарантируется, что входные данные содержат не более 3·105 букв латинского алфавита.

Выходные данные

Выведите единственное целое число — искомое количество.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d

Примечание

В первом тестовом примере строку «aba» определяют пары позиций: (2, 0) и (5, 0); (5, 2) и (6, 1); (5, 2) и (3, 1); (4, 0) и (4, 2); (4, 4) и (4, 6); (3, 3) и (3, 5).

Обратите внимание, что эту строку не определяет пара позиций (7, 1) и (5, 0), потому как путь между ними не всегда идет вниз.

D. Компоненты связности

дп поиск в глубину и подобное снм Структуры данных *1900

В уже известной нам некоторой большой корпорации, в которой работает системный администратор Поликарп, компьютерная сеть состоит n компьютеров и m кабелей, которые соединяют некоторые пары компьютеров. Другими словами, компьютерная сеть может быть представлена некоторым неориентированным графом из n вершин и m ребер. Пронумеруем компьютеры целыми числами от 1 до n, пронумеруем кабели целыми числами от 1 до m.

Поликарпу поручили ответственное задание — проверить надежность компьютерной сети его корпорации. Для этого Поликарп решил провести серию из k экспериментов с компьютерной сетью, где i-ый эксперимент заключается в следующем:

  1. Временно отсоединить кабели с номерами от li до ri, включительно (остальные кабели остаются подсоединенными).
  2. Посчитать количество компонент связности в графе, который определяет компьютерную сеть в настоящий момент.
  3. Подсоединить отключенные кабели с номерами от li до ri (то есть восстановить исходную сеть).

Помогите Поликарпу провести все эксперименты и для каждого из них выведите количество компонент связности в графе, который определяет компьютерную сеть во время данного эксперимента. Изолированную вершину нужно считать отдельной компонентой.

Входные данные

В первой строке через пробел заданы два целых числа n, m (2 ≤ n ≤ 500; 1 ≤ m ≤ 104) — количество компьютеров и количество кабелей соответственно.

Далее в m строках задано описание кабелей. В i-ой строке через пробел задана пара целых чисел xi, yi (1 ≤ xi, yi ≤ nxi ≠ yi) — номера компьютеров, которые соединяет i-ый кабель. Обратите внимание, что пара компьютеров может быть соединена несколькими кабелями.

В следующей строке задано единственное целое число k (1 ≤ k ≤ 2·104) — количество экспериментов. Далее в k строках задано описание экспериментов. В i-ой строке через пробелы заданы числа li, ri (1 ≤ li ≤ ri ≤ m) — номера кабелей, которые Поликарп отсоединяет во время i-го эксперимента.

Выходные данные

Выведите k чисел, в которых i-ое число обозначает количество компонент связности графа, который определяет компьютерную сеть во время i-го эксперимента.

B. Тренер

графы Перебор поиск в глубину и подобное *1500

У тренера по программированию есть n обучающихся у него студентов, причем известно, что n делится на 3. Пускай все студенты пронумерованы от 1 до n, включительно.

Тренер хочет перед чемпионатом университета по программированию разделить всех студентов на команды из трех человек. Для некоторых пар студентов известно, что они хотят быть в одной команде. Причем, если i-ый студент хочет быть в команде с j-ым, то и j-ый хочет быть в команде с i-ым. Тренер заинтересован в том, чтобы команды показали хороший результат, поэтому он хочет, чтобы было выполнено условие: если i-ый студент хочет быть в одной команде с j-ым, то i-ый и j-ый студенты должны быть в одной команде. Также, очевидно, каждый студент должен быть ровно в одной команде.

Помогите тренеру, разделите команды так, как он хочет.

Входные данные

В первой строке входных данных записаны целые числа n и m (3 ≤ n ≤ 48, . Далее следует m строк, в каждой из них записана пара целых чисел ai, bi (1 ≤ ai < bi ≤ n) — пара ai, bi означает, что студенты с номерами ai и bi хотят быть в одной команде.

Гарантируется, что n делится на 3. Гарантируется, что каждая пара ai, bi упоминается во входных данных не более одного раза.

Выходные данные

Если искомого разбиения на команды не существует, выведите число -1. Иначе выведите строки. В каждой строке выведите три целых числа xi, yi, zi (1 ≤ xi, yi, zi ≤ n) — i-ая команда.

Если существует несколько ответов, разрешается вывести любой.

D. Шоколадка

поиск в глубину и подобное реализация *2000

У Васи есть прямоугольная плитка шоколада W × H долек. Он определил декартову систему координат так, что точка (0, 0) соответствует левому нижнему углу шоколадки, а точка (W, H) — правому верхнему. Одна долька шоколадки соответствует квадрату 1 × 1 с целочисленными координатами. Вася решил разделить шоколадку на куски разломами. Каждый разлом представляет собой параллельный одной из осей координат отрезок, проходящий от одной стороны куска до другой. То есть каждый разлом проходит вдоль линии x = xc или y = yc, где xc и yc — некоторые целые числа. Каждый разлом делит один кусок шоколадки на два непустых куска. После того как Вася разломил один кусок на два, получившиеся куски он разламывает отдельно и независимо друг от друга. При этом он не перемещает куски шоколадки. Вася сделал n разломов и записал их в блокнот в произвольном порядке. В результате у него получилось n + 1 кусков. Теперь он хочет посчитать их площади. Вася человек ленивый, и поэтому он просит вас сделать это за него.

Входные данные

В первой строке записано три целых числа W, H и n (1 ≤ W, H, n ≤ 100) — ширина шоколадки, высота шоколадки и число разломов соответственно. Далее следует n строк по 4 целых числа xi, 1, yi, 1, xi, 2, yi, 2 — координаты концов отрезка i-ого разлома (0 ≤ xi, 1 ≤ xi, 2 ≤ W, 0 ≤ yi, 1 ≤ yi, 2 ≤ H, либо xi, 1 = xi, 2, либо yi, 1 = yi, 2). Разломы записаны в произвольном порядке.

Гарантируется, что множество разломов корректно, то есть существует такой порядок проведения заданных разломов, что очередной разлом разделяет ровно один кусок ровно на две части.

Выходные данные

Выведите n + 1 чисел — площади получившихся кусков в порядке возрастания.

B. Сережа и периоды

Бинарный поиск поиск в глубину и подобное Строки *2000

Введем обозначение, , где x — строка, n — целое положительное число, а операция « + » обозначает конкатенацию строк. Например, [abc, 2] = abcabc.

Будем говорить, что строку s можно получить из строки t, если можно удалить некоторые символы строки t и получить строку s. Например, строки ab и aсba можно получить из строки xacbac, а строки bx и aaa — нет.

У Сережи есть две строки w = [a, b] и q = [c, d]. Он хочет найти такое максимальное целое число p (p > 0), что [q, p] можно получить из строки w.

Входные данные

В первой строке заданы два целых числа b, d (1 ≤ b, d ≤ 107). Во второй строке содержится строка a. В третьей строке содержится строка c. Заданные строки не пусты и состоят из маленьких латинских букв. Их длины не превосходят 100.

Выходные данные

В единственную строку выведите целое число — наибольшее число p. Если не существует искомого значения p, выведите 0.

B1. ЭКГ

Перебор поиск в глубину и подобное *1500

В суматохе современной жизни люди часто забывают насколько прекрасен мир. Времени насладиться окружающим у них настолько мало, что некоторые даже занимают очередь в поликлинике сразу в несколько кабинетов одновременно, бегая из одной очереди в другую.

Наверняка многие из вас сталкивались с тем, когда незнакомец спрашивает у вас, кто последний в очереди, высказывает мнение, что он будет крайним, после чего скрывается в неизвестном направлении — это именно те представители современного мира, у которых коэффициент нехватки времени настолько велик, что они даже не смотрят зарубежные рейтинговые сериалы. Такие люди часто создают проблемы в очередях, ведь вновь пришедший человек не видит последнего в очереди и занимает место за «виртуальным» звеном этой цепочки, недоумевая, куда же делась легендарная личность.

Умный Бобер после длительной болезни записался на прием к терапевту. Кратко и лаконично терапевт сообщил Умному Бобру печальное известие: необходимо сделать ЭКГ. На следующий день Умный Бобер встал пораньше, поставил на скачивание известный сериал (до полной загрузки необходимо около трех часов) и, стиснув зубы, мужественно пошел занимать очередь в кабинет электрокардиограммы, который славится самыми большими очередями в поликлинике.

Отстояв около трех часов в очереди, Умный Бобер понял, что многие не видели, за кем занимали очередь, из-за чего получилась неразбериха. Он спросил у каждого бобра, имеющего желание посетить кабинет ЭКГ, за кем тот занимал. Если бобр не знал за кем он, то, возможно, сейчас его очередь на прием, а может ему еще стоять и стоять...

Как Вы догадались, Умный Бобер очень спешил домой, поэтому он дал Вам все необходимые данные, чтобы Вы помогли ему определить, каким же по номеру в очереди он может следовать.

Входные данные

В первой строке записаны два целых числа n (1 ≤ n ≤ 103) и x (1 ≤ x ≤ n) — количество бобров, стоявших в очереди, и номер Умного Бобра соответственно. Все желающие попасть на прием к врачу пронумерованы от 1 до n.

Во второй строке содержится n целых чисел a1, a2, ..., an (0 ≤ ai ≤ n) — номер бобра, за которым следует i-ый бобер. Если ai = 0, то i-ый бобер не знает, за кем он занимал. Гарантируется, что значения ai соответствуют корректной очереди. Другими словами нет циклических зависимостей в очереди, а также за любым бобром в очереди может следовать не более одного бобра.

Ограничения на входные данные для получения 30 баллов (подзадача B1):

  • Гарантируется, что количество нулевых элементов ai не превзойдет 20.

Ограничения на входные данные для получения 100 баллов (подзадачи B1+B2):

  • Количество нулевых элементов ai произвольно.
Выходные данные

Выведите все возможные позиции Умного Бобра в очереди в порядке возрастания.

Примечание
Картинка для 4-го теста.

F1. Солнышки и лучики

поиск в глубину и подобное реализация *2200

Умный Бобер увлекся рисованием. Он рисует солнышки. Однако, в какой-то момент Умный Бобер понял, что просто рисовать солнышки ему скучно. И он решил разработать программу, которая будет обрабатывать его рисунки. Вам дано изображение, нарисованное Бобром. Оно будет иметь два цвета: один для фона, второй для солнышек на изображении. Ваша задача будет заключаться в том, чтобы посчитать число солнышек на изображении и для каждого из них посчитать число лучиков.

Солнышко представляет собой произвольно повернутый эллипс с лучиками. Под лучиком будем понимать отрезок соединяющий границу эллипса с некоторой точкой вне эллипса.

Изображение, на котором все солнышки являются кругами.
Изображение, на котором все солнышки являются эллипсами, оси которых параллельны координатным осям.
Изображение, на котором все солнышки являются эллипсами с поворотом.

Гарантируется, что:

  • Никакие два солнышка не имеют общих точек.
  • Толщина лучиков будет составлять 3 пикселя.
  • Длины осей эллипсов, соответствующих солнышкам, будут лежать в пределах от 40 до 200 пикселей.
  • Никакие два лучика не пересекаются.
  • Длины всех лучиков будет лежать в пределах от 10 до 30 пикселей.
Входные данные

Первая строка содержит два целых числа h и w — высота и ширина изображения (1 ≤ h, w ≤ 1600). Следующие h строк будут содержать по w целых чисел, разделенных пробелами. Они описывают рисунок Умного Бобра. Каждое из этих чисел будет равно либо 0 (фон изображения), либо 1 (цвет солнышка).

Ограничения на входные данные для получения 30 баллов (подзадача F1):

  • Все солнышки на изображении имеют форму кругов.

Ограничения на входные данные для получения 70 баллов (подзадачи F1+F2):

  • Все солнышки на изображении имеют форму эллипсов, оси которых параллельны координатным осям.

Ограничения на входные данные для получения 100 баллов (подзадачи F1+F2+F3):

  • Все солнышки на изображении имеют форму эллипсов, которые могут быть произвольным образом повернуты.
Выходные данные

Первая строка должна содержать ровно одно целое число k — количество солнышек на рисунке Бобра. Вторая строка должна содержать ровно k целых чисел, разделенных пробелами. Эти числа будут соответствовать количеству лучиков на каждом из солнышек. Числа во второй строке должны быть отсортированы по возрастанию.

Примечание

Для каждого уровня сложности Вам предлагается пример исходных данных. Скачать примеры можно на http://www.abbyy.ru/sun.zip.

C. Баланс

графы Деревья Конструктив поиск в глубину и подобное *2500

Имеется система из n сосудов с водой, некоторые пары которых соединены трубками с клапанами и механизмами для переливания. Через трубки, соединяющие сосуды, можно переливать целое число литров из одного сосуда в другой (в любом направлении). Два сосуда могут быть соединены более чем одной трубкой. Общее количество трубок равно e. Объемы всех сосудов одинаковы и равны v, и объем воды в сосудах, разумеется, не должен превышать объема сосуда в процессе переливаний.

Известны начальные объемы ai воды в сосудах и объемы bi, которые требуется получить. Найдите последовательность переливаний, которая выполняет эту задачу. Число переливаний не должно превышать n2.

Входные данные

Первая строка содержит целые числа n, v, e (1 ≤ n ≤ 300, 1 ≤ v ≤ 109, 0 ≤ e ≤ 50000).

Следующие две строки содержат по n неотрицательных целых чисел каждая — изначальные ai и требуемые объемы bi соответствующих сосудов (0 ≤ ai, bi ≤ v).

В следующих e строках содержится описание всех трубок в формате x y (1 ≤ x, y ≤ n, x ≠ y) для трубки, соединяющей сосуды с номерами x и y. Два сосуда могут быть соединены более чем одной трубкой. Считайте, что сосуды пронумерованы некоторым образом от 1 до n.

Выходные данные

Выведите «NO» (без кавычек), если такой последовательности переливаний не существует.

Иначе выведите любую подходящую последовательность переливаний в следующем формате. В первой строчке выведите число переливаний k (k не должно превышать n2). В последующих строчках выведите переливания по одному на строке в формате x y d (переливание d литров из сосуда номер x в сосуд номер y, x и y должны быть различны). Для всех операций число d должно быть целым неотрицательным.

B. Пинг-Понг (упрощенная версия)

графы поиск в глубину и подобное *1500

В этой задаче в каждый момент времени у Вас есть набор интервалов. Вам разрешено перейти от интервала (a, b) из набора к интервалу (c, d) из набора тогда и только тогда, когда c < a < d или c < b < d. Считается, что путь от интервала I1 к интервалу I2 существует, если есть последовательность переходов, начинающихся с I1, таких, что можно добраться до I2.

Ваша программа должна обрабатывать запросы двух следующих типов:

  1. «1 x y» (x < y) — добавьте новый интервал (x, y) в набор интервалов. Длина нового интервала гарантированно строго больше длин всех предыдущих интервалов.
  2. «2 a b» (a ≠ b) — ответьте на вопрос: есть ли путь от a-го (один-индексация) добавленного интервала до b-го (один-индексация) добавленного интервала?

Выполните все запросы. Считайте, что изначально в вашем наборе нет ни одного интервала.

Входные данные

Первая строка содержит целое число n (1 ≤ n ≤ 100), обозначающее количество запросов. Каждая из следующих строк содержит запрос в формате, описанном выше. Все числа во входных данных целые и не превосходят по модулю 109.

Гарантируется, что все запросы корректные.

Выходные данные

Для каждого запроса второго типа выведите «YES» или «NO» в отдельной строке в зависимости от ответа на вопрос.

C. Командир Ciel

Деревья жадные алгоритмы Конструктив поиск в глубину и подобное разделяй и властвуй *2100

Лиса Ciel становится командиром Древоземелья. В Древоземелье, как это следует из названия, есть n городов, соединенных n - 1 ненаправленными дорогами, а между любыми двумя городами существует путь по дорогам Древоземелья.

Лиса Ciel должна назначить каждому городу офицера. У каждого офицера есть ранг — буква от 'A' до 'Z'. Таким образом, имеется 26 различных рангов, самый высокий — 'A', самый низкий — 'Z'.

У Ciel имеется достаточно офицеров каждого ранга. Но не все так просто, должно быть выполнено особое условие: если x, y — два различных города и у их офицеров одинаковые ранги, то на простом пути между x и y должен быть город z, имеющий офицера более высокого ранга. Таким образом, общение между офицерами одного ранга будет гарантированно проходить под присмотром офицера более высокого ранга.

Помогите Ciel составить подходящий план назначения офицеров городам. Если это невозможно, выведите «Impossible!».

Входные данные

В первой строке записано целое число n (2 ≤ n ≤ 105) — количество городов в Древоземелье.

В каждой из следующих n - 1 строк записано два целых числа a и b (1 ≤ a, b ≤ n, a ≠ b) — это значит, что существует дорога между городами a и b. Считайте, что города пронумерованы от 1 до n некоторым образом.

Гарантируется, что заданный граф будет деревом.

Выходные данные

Если подходящий план существует, выведите n символов, разделенных пробелами — i-ый символ обозначает ранг офицера в городе i.

В противном случае, выведите «Impossible!».

Примечание

В первом примере для любых двух офицеров ранга 'B', офицер с рангом 'А' будет на пути между ними. То есть, такое решение подходит.

C. Монстры и бриллианты

графы кратчайшие пути поиск в глубину и подобное *2600

Красная Шапочка нашла одного монстра и книгу о монстрах. В книге она нашла информацию о том, что всего существует n типов монстров, и каждый тип монстра имеет номер (целое число от 1 до n). А также, что если монстра накормить пирожком, то он превратится в несколько (возможно, ноль) других или таких же монстров, и несколько (не менее одного) бриллиантов. Известно, что монстр определенного типа может превращаться несколькими способами.

Красная Шапочка взяла монстра и посадила его на полянке. Затем она накормила его пирожком. Покуда на полянке есть хотя бы один монстр, Красная Шапочка продолжает кормить их пирожками. В конце, когда монстров больше не осталось, она собирает все бриллианты, которые получились в процессе превращений монстров.

Вам дана информация о всех возможных превращениях: для каждого превращения определенного типа монстра, во что он превратится. Известно, что для каждого типа монстра имеется хотя бы одно превращение. Некоторые типы монстров могут иметь больше одного варианта превращения, тогда в тот момент, когда такой монстр превращается, Красная Шапочка выбирает, какое именно превращение будет иметь место в этот раз.

Для каждого типа монстра определите, каково наименьшее и наибольшее количество бриллиантов, которое Красная Шапочка может собрать к моменту, когда на полянке не останется монстров, если изначально у нее будет один монстр этого типа. Учтите, Красная Шапочка имеет бесконечно большой запас пирожков.

Входные данные

В первой строке содержится два целых числа: m и n (1 ≤ m, n ≤ 105), количество возможных превращений и количество различных типов монстров. В последующих m строках перечислены превращения по одному в строке. Описание каждого превращения начинается с целого числа (типа монстра) mi (1 ≤ mi ≤ n), а затем положительного целого числа li, обозначающего количество монстров и бриллиантов, в которые может превратиться текущий монстр. Далее в строке следуют li целых чисел — во что превращается текущий монстр: положительное число обозначает монстра соответствующего типа, -1 обозначает бриллиант.

Для каждого типа монстра существует хотя бы одно превращение. Каждое превращение содержит хотя бы один бриллиант. Сумма всех li не превышает 105.

Выходные данные

Для каждого типа монстра, в порядке их номеров, выведите одну строку с двумя целыми числами: минимальное и максимальное количество бриллиантов, которое можно получить к моменту, когда на полянке не останется ни одного монстра, если начать с одним монстром этого типа. Если, начав с этого монстра, Красная Шапочка не имеет никакого шанса остаться без монстров на полянке, выведите -1 вместо минимального и -1 вместо максимального значения. Если, начав с этим монстром, Красная Шапочка может получить произвольно большое количество бриллиантов, выведите -2 вместо максимального значения.

Если любое значение в выходных данных превышает 314000000 (но является конечным), выведите 314000000 вместо этого значения.

E. Тропинки и полянки

графы жадные алгоритмы Комбинаторика поиск в глубину и подобное снм *2800

Красная Шапочка и Иван Дурак гуляют по лесу. Гуляя по лесу, они обнаружили, что в лесу есть тропинки и полянки. Всего в лесу n полянок, которым Иван Дурак назначил номера от 0 до n - 1. Иван Дурак заметил, что для каждой полянки i, из нее есть ровно две тропинки: одна ведет в полянку номер (2·imod n, вторая — в полянку ((2·i) + 1) mod n.

Красная Шапочка, в свою очередь, заметила, что все тропинки однонаправленные (Красная Шапочка не может объяснить природу этого явления). Теперь, стоя в полянке с номером 0, Красная Шапочка задалась вопросом — если она начнет гулять по тропинкам, может ли она обойти все полянки ровно по одному разу и в конце вернуться на полянку с номером 0 опять (тем самым посетив ее дважды)?

Запись x mod y обозначает операцию взятия остатка от деления числа x на число y.

Входные данные

Единственная строка содержит целое число n (2 ≤ n ≤ 105) — количество полянок.

Выходные данные

Выведите порядок, в котором следует обойти полянки. Каждая полянка должна быть выведена ровно один раз, кроме полянки 0, которая должна быть выведена ровно дважды: первой и последней в списке. Если решения не существует, выведите -1. Если решений несколько, выведите любое из них.

D. Башни из кирпичей

графы Конструктив поиск в глубину и подобное *1900

Наигравшись на бумаге, Яхуб перешел на компьютерные игры. Он играет в игру под названием «Башни из кирпичей». Играется она на прямоугольной таблице, состоящей из n строк и m столбцов (таблица содержит n × m ячеек). Цель игры — построить свой собственный город. Некоторые ячейки таблицы — это огромные дыры, и там Яхуб никакого здания построить не может. Остальные ячейки — пустые. В некоторой пустой ячейке можно построить ровно одну башню одного из двух следующих видов:

  1. Синие башни. Лимит населения каждой равен 100.
  2. Красные башни. Лимит населения каждой равен 200. Однако, красную башню можно построить в некоторой ячейке только тогда, когда на момент постройки хотя бы одна из соседних ячеек имеет синюю башню. Две ячейки являются соседними, если они имеют общую сторону.

Яхубу также разрешено уничтожить здание в любой ячейке. Он может выполнять эту операцию какое угодно количество раз. Уничтожение одного здания не влияет на остальные здания, а ячейка, в которой уничтожили здание, становится пустой (таким образом, Яхуб может, если это нужно, построить башню в этой ячейке — такой случай показан во втором примере).

Яхуб может привезти в свой город столько населения, сколько хочет. Итак, ему нужно построить свой город так, чтобы в нем помещалось как можно больше людей. То есть нужно найти оптимальную последовательность застройки, такую, что итоговый суммарный лимит населения как можно больше.

Яхуб говорит, что в этой игре он лучший, и все же, у него нет оптимального решения. Напишите программу, которая высчитывает оптимальное решение и покажите зазнайке, что он не так уж и крут!

Входные данные

В первой строке содержатся два целых числа n и m (1 ≤ n, m ≤ 500). В каждой из следующих n строк содержится m символов, описывающих таблицу. Если j-ой символ в i-ой строке равен «.», значит, в ячейке с координатами (i, j) разрешается строить башню (пустая ячейка). А если символ равен «#», значит, в ячейке огромная дыра.

Выходные данные

В первой строке выведите целое число k (0 ≤ k ≤ 106) — количество операций, которое должен совершить Яхуб, чтобы застроить город оптимально.

Каждая из следующих k строк должна содержать одну из трех описанных операций в формате:

  1. «B x y» (1 ≤ x ≤ n, 1 ≤ y ≤ m) — операция постройки синей башни в клетке (x, y);
  2. «R x y» (1 ≤ x ≤ n, 1 ≤ y ≤ m) — операция постройки красной башни в клетке (x, y);
  3. «D x y» (1 ≤ x ≤ n, 1 ≤ y ≤ m) — операция разрушения башни в клетке (x, y).

Если существует несколько решений, разрешается вывести любое. Обратите внимание, минимизировать количество операций не требуется.

B. Биридианский лес

кратчайшие пути поиск в глубину и подобное *1500

Вы — разводчик микемонов. Вы на полпути к званию повелителя микемонов, но вот, Вы сталкиваетесь с проблемой: надо пройти через печально известный Биридианский лес.

Биридианский лес

Биридианский лес представляет собой двухмерную таблицу, состоящую из r строк и c столбцов. Каждая ячейка Биридианского леса может либо быть пустой, либо содержать дерево. В пустой ячейке могут распологаться ноль или больше разводчиков микемонов (кроме вас в лесу могут быть и другие разводчики). Разводчики микемонов (включая Вас) не могут заходить в ячейки с деревьями. Одна из ячеек служит ячейкой выхода.

Вам даны исходная таблица с Вашим начальным положением, ячейка выхода и начальные положения всех остальных разводчиков. Вот пример такой таблицы (из первого тестового примера):

Передвижение

Разводчики (включая Вас) могут двигаться по лесу. За один ход разводчики могут выполнить одно из следующих действий:

  • Ничего не делать.
  • Перейти из текущей ячейки в одну из четырех соседних ячеек (две ячейки называются соседними тогда, когда они имеют общую сторону). Обратите внимание, что разводчики не могут заходить в ячейки с деревьями.
  • Если Вы стоите в ячейке выхода, то можете выходить из леса. Этот ход доступен только Вам — все остальные разводчики микемонов никогда не воспользуются этим шагом для выхода из леса.

После каждого Вашего шага все остальные разводчики одновременно делают ход (каждый из них выбирает ход независимо от других).

Битва микемонов

Если Вы и t (t > 0) разводчиков микемонов оказались в одной ячейке, тут же разгорится ровно t битв микемонов (так как вы будете сражаться с каждым из разводчиков в этой клетке). После сражения, все t разводчиков покинут лес.

Обратите внимание, что после того, как Вы покинете лес, битв микемонов больше быть не может, даже если сразу за Вами в клетку выхода заходит другой разводчик микемонов. Также обратите внимание на то, что битвы проводятся только между Вами и другими разводчиками — между собой остальные разводчики не дерутся (в одной клетке могут находится несколько разводчиков одновременно).

Ваша задача

Вы хотели бы выбраться из леса. Для этого надо совершить некоторую последовательность шагов, завершающуюся шагом финального типа. Однако перед тем, как совершить этот грандиозный поход, вам надо опубликовать всю последовательность в своем виртуальном блоге Идол. Затем можно верно следовать этой последовательности движений.

Задачи других разводчиков

Вы публикуете Вашу последовательность в личном блоге, поэтому остальные разводчики будут в курсе всех Ваших передвижений еще до первого Вашего шага. Каждый из них будет двигаться так, чтобы гарантированно устроить с Вами битву микемонов, если это возможно. Если кто-то из разводчиков не сможет гарантированно устроить с Вами битву микемонов, он не будет ничего делать.

Ваше задание

Выведите минимальное количество битв микемонов, в которых Вам придется поучаствовать, предполагая, что Вы выбираете последовательность движений, минимизирующих это количество. Обратите внимание на то, что Вам необязательно минимизировать количество шагов.

Входные данные

В первой строке записано два целых числа: r и c (1 ≤ r, c ≤ 1000), обозначающих количества строк и столбцов в Биридианском лесу. В следующих r строках записано по строке карты, где каждый символ представляет содержимое соответствующей ячейки:

  • 'T': Ячейка, содержащая дерево.
  • 'S': Пустая ячейка и Ваша начальная позиция. Эта ячейка встретится на карте ровно один раз.
  • 'E': Пустая ячейка, содержащая выход. Эта ячейка встретится на карте ровно один раз.
  • Цифра (0-9): Ячейка, содержащая цифру X обозначает, что ячейка пустая и в ней стоят X разводчиков (если X равняется нулю, это значит, что ячейка не занята ни одним разводчиком).

Гарантируется, что Вы можете дойти от начальной позиции до ячейки выхода.

Выходные данные

В единственной строке выведите минимально возможное количество битв микемонов, в которых Вам придется принять участие, если Вы выберете стратегию минимизации количества битв микемонов.

Примечание

Следующий рисунок иллюстрирует первый пример. Возможная последовательность движений, которую надо опубликовать в блоге, такова:

С Вами смогут сразиться три разводчика с левой стороны карты — одинокий разводчик может просто стоять на месте, пока Вы не подойдете, а два других разводчика могут двигаться к одинокому и стоять с ним, поджидая Вас. У трех разводчиков справа не будет возможности сразиться с Вами, и они будут стоять на месте.

Для второго примера надо опубликовать следующую последовательность в блоге:

Случается вот что. Сначала надо шагнуть на ячейку вправо.

Затем, два разводчика правее Вас одновременно шагнут навстречу Вам. Остальные три разводчика не могу с Вами сразиться, поэтому не делают ничего.

Вы находитесь в одной клетке с 2 разводчиками, а значит тут же случится 2 битвы микемонов. После этих битв Ваши противники покинут лес.

И наконец, надо сделать еще один шаг и выйти из леса.

D. Книга Зла

Деревья дп поиск в глубину и подобное разделяй и властвуй *2000

Паладин Манао напал на след древней Книги Зла в одной болотистой местности. Всего в этой местности расположено n населенных пунктов, пронумерованных числами от 1 до n. Из-за того, что передвигаться по местности очень сложно, люди вытоптали ровно n - 1 тропинок, каждая из которых соединяет некоторую пару населенных пунктов. По каждой из этих тропинок можно передвигаться в обоих направлениях. Из любого населенного пункта можно попасть в любой другой, перейдя по одной или нескольким тропинкам.

Назовем расстоянием между двумя населенными пунктами наименьшее количество тропинок, которые надо пересечь, чтобы попасть из одного пункта в другой. Манао известно, что у искомой им Книги Зла радиус действия d. Это означает, что если Книга Зла находится в некотором населенном пункте, то ее пагубное влияние (например, явление привидений и оборотней) распространяется в населенных пунктах на расстоянии d или меньше от него.

Манао услышал, что влияние Книги Зла было замечено в m населенных пунктах с номерами p1, p2, ..., pm. Заметим, что Книга возможно влияет и на другие населенные пункты, просто этого еще никто не заметил. Он хочет определить, в каких из населенных пунктов может находиться эта Книга. Помогите ему в этой непростой задаче.

Входные данные

В первой строке через пробел записано три целых числа n, m и d (1 ≤ m ≤ n ≤ 100000; 0 ≤ d ≤ n - 1). Во второй строке через пробел записано m различных целых чисел p1, p2, ..., pm (1 ≤ pi ≤ n). Далее следует n - 1 строка, каждая из которых описывает одну из тропинок, проложенных в рассматриваемой местности. Тропинка описывается парой разделенных пробелом чисел ai и bi, представляющих собой концы этой тропинки.

Выходные данные

Выведите единственное число — количество населенных пунктов, в которых может находиться Книга Зла. Возможно, что информация, дошедшая до Манао, противоречива и не существует такого населенного пункта, где может находиться Книга. В таком случае выведите 0.

Примечание

Пример 1. Радиус действия Книги Зла равен 3-ем, а ее воздействие было замечено в населенных пунктах 1 и 2. Таким образом, она может находиться в населенных пунктах под номерами 3, 4 и 5.

C. Ксюша и гири

графы дп жадные алгоритмы Конструктив кратчайшие пути поиск в глубину и подобное *1700

У Ксюши есть набор из гирек, а также чашечные весы. Каждая гирька имеет целочисленный вес от 1 до 10 килограмм. Ксюша собирается поиграть с весами и гирьками. Для этого она последовательно кладет гирьки на весы. Первую гирьку на левую чашу весов, вторую гирьку — на правую чашу весов, третью — на левую чашу весов, четвертую — на правую чашу весов и так далее. Всего Ксюша хочет положить на весы m гирек.

Просто так класть гирьки на весы не интересно, поэтому Ксюша установила несколько правил. Во-первых, она не кладет на весы подряд две гирьки одинакового веса. То есть i-я положенная гирька, должна отличаться от (i + 1)-й по весу для любого i (1 ≤ i < m). Во-вторых, Ксюше хочется, чтобы каждый раз, когда она кладет гирьку на некоторую чашу весов, эта чаша весов перевешивала противоположную. То есть сумма весов гирек на соответствующей чаше должна быть строго больше, чем на противоположной.

Вам заданы все типы гирек, которые имеются у Ксюши. Можете считать, что у Ксюши имеется бесконечное количество гирек каждого заданного типа. Ваша задача, помочь Ксюше выложить m гирек на весы или сказать, что это сделать невозможно.

Входные данные

В первой строке записана строка, состоящая из ровно десяти нулей и единиц: i-тый (i ≥ 1) символ в этой строке равен «1», если у Ксюши имеются гирьки, которые весят i килограмм, и равен «0» иначе. Во второй строке записано целое число m (1 ≤ m ≤ 1000).

Выходные данные

В первой строке выведите «YES», если существует способ выложить m гирек на весы, соблюдая все правила, иначе в первой строке выведите «NO». Если выложить m гирек на весы возможно, то в следующей строке выведите m целых чисел — веса гирек в порядке их выкладывания на весы.

Если существует несколько решений, разрешается вывести любое.

E. Три переворота

жадные алгоритмы Конструктив поиск в глубину и подобное *2700

У коневода Ксении есть n (n > 1) коней, которые стоят в ряд. У каждого коня есть свой уникальный номер. Изначально, i-ый слева конь имеет номер i. То есть последовательность номеров коней в ряду выглядит следующим образом (слева направо): 1, 2, 3, ..., n.

Ксения тренирует коней перед выступлением. Она последовательно дает им команды. Каждая команда имеет вид пары чисел l, r (1 ≤ l < r ≤ n). Команда l, r означает, что кони, которые стоят на l-ом, (l + 1)-ом, (l + 2)-ом, ..., r-ом местах должны поменяться местами. Кони, которые стоят до выполнения команды на l-ом и r-ом местах, должны поменяться местами. Аналогично, кони на (l + 1)-ом и (r - 1)-ом местах должны поменяться местами. Кони на (l + 2)-ом на (r - 2)-ом местах должны поменяться местами. И так далее. Другими словами, кони на отрезке [l, r] в ряду поменяют свой порядок на обратный.

Например, если Ксения скомандовала l = 2, r = 5, а последовательность номеров коней до переворота имела вид (2, 1, 3, 4, 5, 6), то после переворота последовательность будет иметь вид (2, 5, 4, 3, 1, 6).

Известно, что на тренировке Ксения выдала не более трех команд описанного вида. Вам дана последовательность номеров коней, которая получилась в результате тренировки. Найдите, какие команды отдала Ксения. Обратите внимание, что Вам не требуется минимизировать количество команд в ответе, требуется найти любой корректный набор из не более чем трех команд.

Входные данные

В первой строке записано целое число n (2 ≤ n ≤ 1000) — количество коней в ряду. Во второй строке записано n различных целых чисел a1, a2, ..., an (1 ≤ ai ≤ n), где ai — это номер i-го слева коня в ряду после тренировки.

Выходные данные

В первой строке выведите целое число k (0 ≤ k ≤ 3) — количество команд, которые Ксения отдала на тренировке. В каждой из следующих k строк выведите два целых числа. В i-той из них выведите числа li, ri (1 ≤ li < ri ≤ n) — команда, которую Ксения отдала i-ой на тренировке.

Гарантируется, что решение существует. Если существует несколько решений, разрешается вывести любое.

D. Карта дорог

графы поиск в глубину и подобное *1600

В Берляндии n городов. Каждый город имеет номер — целое число от 1 до n, причем столица имеет номер r1. Все дороги в Берляндии двусторонние, причем карта дорог устроена так, что есть ровно один путь от столицы до каждого города, то есть карта представляет собой дерево. В летописях Берляндии карта хранится в следующем виде: для каждого отличного от столицы города i хранится число pi — номер последнего города на пути из столицы в i.

Однажды король Берляндии Берл XXXIV решил перенести столицу из города r1 в город r2. Естественно, после этого старое представление карты в летописях перестало быть верным. Помогите королю — найдите новое представление карты дорог в описанном выше виде.

Входные данные

В первой строке через пробел записано три целых числа n, r1, r2 (2 ≤ n ≤ 5·104, 1 ≤ r1 ≠ r2 ≤ n) — количество городов в Берляндии, номер исходной столицы и номер новой столицы соответственно.

На следующей строке через пробел записано n - 1 целых чисел — старое представление карты дорог. Для всех городов за исключением r1 задано целое число pi — номер последнего города на пути из столицы в город i. Все города описаны в порядке увеличения номеров.

Выходные данные

Выведите n - 1 чисел — новое представление карты дорог в том же формате.

D. Ксюша и доминошки

битмаски дп поиск в глубину и подобное *2100

Ксюша очень любит пазлы, особенно ей нравятся пазлы, состоящие из доминошек. Посмотрите на рисунок, изображающий один из таких пазлов.

Пазл представляет собой таблицу размера 3 × n клеток с запрещенными клетками (черные квадраты), на которой лежат доминошки (цветные прямоугольники на рисунке). Пазл считается корректным, если выполняются следующие условия:

  • каждая доминошка занимает ровно две не запрещенные клетки таблицы;
  • никакие две доминошки не занимают одну и ту же клетку таблицы;
  • ровно одна не запрещенная клетка таблицы не занята никакой доминошкой (на рисунке отмечена кружочком).

Чтобы решить пазл нужно за несколько ходов переместить пустую клетку из начального положения в некоторое заданное. Ходом считается перемещение доминошки на пустую клетку, так чтобы пазл оставался корректным. Горизонтальные доминошки могут быть перемещены только по горизонтали, а вертикальные только по вертикали. Поворачивать доминошки не разрешается. На рисунке изображен возможный ход.

У Ксюши есть таблица размера 3 × n клеток с запрещенными клетками и помеченной кружочком клеткой. Также у Ксюши есть очень много одинаковых доминошек. Теперь Ксюша интересуется, сколько различных корректных пазлов она сможет составить, размещая доминошки на имеющейся таблице. Дополнительно Ксюша хочет, чтобы помеченная кружочком клетка была пустой в полученном пазле и чтобы в пазле существовал хотя бы один ход.

Помогите Ксюше, посчитайте описанное количество пазлов. Так как описанное количество может быть достаточно большим, выведите его остаток от деления на число 1000000007 (109 + 7).

Входные данные

В первой строке записано целое число n (3 ≤ n ≤ 104) — размер пазла. В каждой из следующих трех строк записаны по n символов — описание имеющейся таблицы. Символ номер j строки номер i равен «X», если соответствующая клетка запрещенная; равен «.», если соответствующая клетка не запрещенная, равен «O», если соответствующая клетка помечена кружочком.

Гарантируется, что в таблице ровно одна клетка помечена кружочком. Гарантируется, что все клетки заданной таблицы, имеющие хотя бы одну общую точку с помеченной клеткой не заблокированы.

Выходные данные

Выведите единственное целое число — ответ на задачу по модулю 1000000007 (109 + 7).

Примечание

Два пазла считаются различными, если существует пара клеток, занятых в одном из них одной доминошкой, а в другом — нет.

D. Водяное дерево

графы Деревья поиск в глубину и подобное Структуры данных *2100

Безумный ученый Майк построил корневое дерево, которое состоит из n вершин. Каждая вершина представляет собой резервуар, который может быть либо пуст, либо заполнен водой.

Вершины дерева пронумерованы числами от 1 до n. Корень дерева находится в вершине 1. Резервуары детей каждой вершины расположены ниже резервуара этой вершины, при этом вершина соединена с каждым из детей трубой, по которой вниз может стекать вода.

Майк хочет выполнять с деревом следующие операции:

  1. Заполнить водой вершину v. Тогда v и все ее потомки (дети, дети детей, и так далее) заполняются водой.
  2. Опустошить вершину v. Тогда v и все ее предки становятся пустыми.
  3. Определить, заполнена ли вершина v водой в данный момент.

Изначально все вершины дерева пусты.

Майк уже составил полный список операций, которые он хочет выполнить по порядку. Перед испытанием дерева Майк решил провести симуляцию этих действий. Помогите Майку определить, какие результаты он получит в результате выполнения всех операций.

Входные данные

В первой строке входных данных записано целое число n (1 ≤ n ≤ 500000) — количество вершин в дереве. В каждой из следующих n - 1 строк через пробел записаны по два целых числа ai, bi (1 ≤ ai, bi ≤ n, ai ≠ bi) — ребра дерева.

В следующей строке дано целое число q (1 ≤ q ≤ 500000) — количество операций. В каждой из следующих q строк через пробел записано по два целых числа ci (1 ≤ ci ≤ 3), vi (1 ≤ vi ≤ n), где ci обозначает номер типа операции (согласно нумерации в условии), а vi обозначает вершину, над которой проводится операция.

Гарантируется, что данный граф является деревом.

Выходные данные

Для каждой операции типа 3 выведите на отдельной строке 1, если вершина заполнена, и 0, если вершина пуста. Ответы на запросы выводите в том порядке, в котором запросы даны во входных данных.

E. Насосные станции

графы Деревья жадные алгоритмы Перебор поиск в глубину и подобное Потоки разделяй и властвуй *2900

Безумный ученый Майк устроился на работу. Его задача — управлять системой насосных станций для перекачки воды.

Система состоит из n насосных станций, которые пронумерованы целыми числами от 1 до n. Некоторые пары станций соединены двунаправленными трубами, по которым может течь вода в том или другом направлении (но одновременно только в одном). Для каждой трубы задана пропускная способность — наибольшее количество литров воды, которое может через нее протекать в течение одного часа. Каждая насосная станция может перекачивать входящую воду из одних станций в другие станции по трубам при условии, что за один час общее входящее в эту станцию количество литров воды равняется общему исходящему из этой станции количеству литров воды.

В обязанности Майка входит перекачивание воды между станциями. Из станции a в станцию b по трубам (возможно, через другие станции) в течение одного часа можно пустить какое-то количество литров воды согласно правилам, описанным выше. В течение этого времени вода из других станций не может втекать в станцию a, и не может вытекать из станции b, при том из станции a может вытекать любое количество воды, и в станцию b может втекать любое количество воды. Если из станции a за час в общем было выкачано x литров воды, то Майк получает к зарплате x бублей.

Чтобы получить зарплату, Майк по контракту должен работать n - 1 дней. В первый день он выбирает две станции v1 и v2, и в течение одного часа перекачивает определённое количество воды из v1 в v2. Далее в i-тый день Майк выбирает до этого ни разу не выбранную станцию vi + 1, и в течение одного часа перекачивает определенное количество воды из станции vi в станцию vi + 1. При этом количество перекачиваемой воды в i-тый день не зависит от количества перекачиваемой воды в (i - 1)-ый день.

Для своих проектов Майку нужно заработать как можно больше бублей. Помогите Майку найти такую перестановку номеров станций v1, v2, ..., vn, при которой Майк может заработать наибольшую возможную зарплату.

Входные данные

В первой строке входных данных через пробел записаны два целых числа n и m (2 ≤ n ≤ 200, 1 ≤ m ≤ 1000) — количество станций и количество труб в системе, соответственно. В i-той из следующих m строк через пробелы записаны три числа ai, bi и ci (1 ≤ ai, bi ≤ n, ai ≠ bi, 1 ≤ ci ≤ 100) — номера станций, которое соединяет i-тая труба и пропускная способность трубы, соответственно. Гарантируется, что любые две станции соединяет не более чем одна труба и между любыми двумя станциями существует путь по трубам.

Выходные данные

В первой строке выведите одно целое число — наибольшее значение зарплаты, которую может получить Майк. В второй строке через пробелы выведите перестановку из n чисел от 1 до n — номера станций последовательности v1, v2, ..., vn. Если существует несколько ответов, выведите любой.

D. Письмо счастья

*особая задача графы поиск в глубину и подобное *2200

Письма счастья — сообщения, которые требуют от получателя переслать их копии как можно большему количеству людей, обычно с неким мистическим объяснением. Конечно, это всего лишь суеверие, и вы игнорируете такие письма — чего нельзя сказать о ваших друзьях. Известно, что сегодня такое письмо будет циркулировать среди ваших друзей, и вы хотите знать заранее, сколько его копий вы получите — конечно, пересылать его дальше вы не собираетесь!

Связи между вами и n - 1 вашими друзьями заданы массивом строк f из n элементов: j-ый символ i-ой строки (f[i][j]) — «1», если люди номер i и j будут обмениваться сообщениями (есть в контактах друг у друга), и «0» в противном случае. Человек номер 1 начинает рассылать сообщения всем своим контактам; каждый человек, получая письмо впервые, пересылает его всем своим контактам. Вы — человек номер n, и вы не пересылаете полученные письма.

Сколько копий этого письма вы получите?

Входные данные

Первая строка входных данных содержит целое число n (2 ≤ n ≤ 50) — количество задействованных людей. Следующие n строк содержат элементы массива f — строки длины n, состоящие из символов «0» и «1». Гарантируется, что выполняются равенства: f[i][j] = f[j][i], f[i][i] = 0, для всех i, j (1 ≤ i, j ≤ n).

Выходные данные

Выведите целое число — количество копий письма, которые вы получите со временем.

Примечание

В первом случае все посылают письма друг другу, так что вы получите копии от всех троих друзей.

Во втором случае вы не знаете никого из этих людей.

В третьем случае двое друзей посылают вам письма, но третий не знает ни одного из них и не получает письмо.

B. Яблоня

Деревья поиск в глубину и подобное теория чисел *2100

Дано корневое дерево, состоящее из n вершин. В каждом листе дерева записано ровно одно число — количество яблок в этом листе.

Весом поддерева назовем сумму чисел в листьях этого поддерева. В частности, вес поддерева, соответствующего некоторому листу — это число, которое записано в этом листе.

Дерево называется сбалансированным, если для каждой вершины дерева v все поддеревья, соответствующие сыновьям вершины v, имеют одинаковый вес.

Какое минимальное количество яблок нужно удалить из дерева (точнее из некоторых его листьев), чтобы сделать дерево сбалансированным? Обратите внимание, что цель всегда можно достигнуть, удалив все яблоки.

Входные данные

В первой строке записано целое число n (2 ≤ n ≤ 105) — количество вершин в дереве. В следующей строке записаны n целых чисел a1, a2, ..., an (0 ≤ ai ≤ 108), где ai обозначает количество яблок в вершине с номером i. Гарантируется, что количество яблок в вершинах, не являющихся листьями, равно нулю.

Затем следует n - 1 строк, описывающих ребра дерева. В каждой строке записана пара целых чисел xi, yi (1 ≤ xi, yi ≤ n, xi ≠ yi) — номера вершин, соединенных ребром дерева.

Вершины дерева пронумерованы от 1 до n, а вершина с номером 1 является корнем дерева.

Выходные данные

Выведите единственное целое число — минимальное количество яблок, которое нужно удалить, чтобы сбалансировать дерево.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

E. Пилигримы

Деревья дп поиск в глубину и подобное *2800

Долгое время назад жили-были люди в стране Dudeland. Эта страна состояла из n городов, соединенных n - 1 двунаправленными дорогами. Города пронумерованы от 1 до n, и известно, что из любого города можно попасть в любой другой, двигаясь по дорогам страны. В Dudeland есть m монастырей, расположенных в m различных городах. В каждом монастыре живет пилигрим.

В начале года, каждый пилигрим записывает, какой монастырь находится дальше всего от того монастыря, в котором он живет. Если существует более одного такого монастыря, то он записывает все подходящие монастыри. В день Большого Лебовски каждый пилигрим выбирает наугад город из своего списка и начинает туда идти.

Уолтер ненавидит пилигримов и поэтому хочет прервать путь как можно большего числа пилигримов. Он планирует уничтожить ровно один город, в котором нет монастыря. Пилигрим огорчается, если все монастыри из его списка становятся недостижимыми из его монастыря.

Найдите максимальное количество пилигримов, которых Уолтер может огорчить. Также найдите количество способов, которым Уолтер может этого достигнуть — количество городов, которые он может удалить.

Входные данные

Первая строка содержит два целых числа n (3 ≤ n ≤ 105) и m (2 ≤ m < n). В следующей строке записано m различных целых чисел, обозначающих номера городов с монастырями.

Каждая из следующих n - 1 строк содержит три целых числа ai, bi, ci, обозначающих, что между городами ai и bi существует дорога длины ci (1 ≤ ai, bi ≤ n, 1 ≤ ci ≤ 1000, ai ≠ bi).

Выходные данные

Выведите два целых числа: максимальное количество пилигримов, которых Уолтер может огорчить, и количество способов, которыми он может осуществить свой план.

C. Опять пожар

кратчайшие пути Перебор поиск в глубину и подобное *1500

После ужасающего лесного пожара в Берляндии была реализована программа восстановления леса, по которой были посажены N рядов по M деревьев в каждом, причем настолько ровно, что можно ввести систему координат, в которой j-тое дерево в i-м ряду будет иметь координаты (i, j). Но случилось ужасное, и едва окрепший лес загорелся. И теперь для составления плана эвакуации необходимо найти координаты дерева, которое загорится позже всех.

Возгорание произошло в K точках одновременно, т.е. в начальный момент времени загорелось K деревьев. Каждую минуту огонь перекидывается со всех горящих деревьев на те деревья, которые еще не горят и расстояние от которых до ближайшего горящего дерева равно 1.

Найдите дерево, которое загорится позже всех. Если таких деревьев несколько, выведите любое.

Входные данные

В первой строке входного файла заданы два целых числа N, M (1 ≤ N, M ≤ 2000) — размеры леса. Деревья были посажены во всех точках вида (x, y) (1 ≤ x ≤ N, 1 ≤ y ≤ M), x и y — целые числа.

Во второй строке задано одно целое число K (1 ≤ K ≤ 10) — количество деревьев, горящих в начальный момент времени.

В третьей строке задано K пар целых чисел: x1, y1, x2, y2, ..., xk, yk (1 ≤ xi ≤ N, 1 ≤ yi ≤ M) — координаты точек возгорания. Гарантируется, что все точки возгорания различны.

Выходные данные

Выведите одну строку, содержащую два целых числа x и y, записанные через пробел, — координаты дерева, которое загорится последним. Если таких деревьев несколько, выведите любое из них.

E. Неверный Флойд

графы Конструктив Перебор поиск в глубину и подобное *2200

Валера проводит эксперименты с алгоритмами поиска кратчайших путей. Недавно он изучил алгоритм Флойда, сегодня Валера решил поэкспериментировать именно с ним.

Валера уже написал код, который посчитает ему кратчайшие расстояния между всеми парами вершин в неориентированном связном графе из n вершин и m ребер, не содержащем петли и кратные ребра. Также Валера решил часть вершин пометить, а именно он пометил ровно k вершин a1, a2, ..., ak.

Ниже приведена реализация его алгоритма.


ans[i][j] // кратчайшее расстояние для пары вершин i, j
a[i] // помеченные Валерой вершины

for(i = 1; i <= n; i++) {
for(j = 1; j <= n; j++) {
if (i == j)
ans[i][j] = 0;
else
ans[i][j] = INF; //INF — очень большое число
}
}

for(i = 1; i <= m; i++) {
считать пару вершин u, v, между которыми есть неориентированное ребро;
ans[u][v] = 1;
ans[v][u] = 1;
}

for (i = 1; i <= k; i++) {
v = a[i];
for(j = 1; j <= n; j++)
for(r = 1; r <= n; r++)
ans[j][r] = min(ans[j][r], ans[j][v] + ans[v][r]);
}

Валера понял, что его код неверный. Помогите Валере, найдите для заданного набора помеченных вершин a1, a2, ..., ak такой неориентированный связный граф, состоящий из n вершин и m ребер, для которого код Валеры хотя бы для одной из пар вершин (i, j) посчитает неверное кратчайшее расстояние. Валера очень хочет, чтобы найденный граф не содержал петли и кратные ребра. Если же такого графа не существует, выведите -1.

Входные данные

В первой строке входных данных записаны три целых числа n, m, k (3 ≤ n ≤ 300, 2 ≤ k ≤ n , ) — количество вершин, количество ребер, и количество помеченных вершин.

Во второй строке входных данных записаны k целых чисел через пробел a1, a2, ... ak (1 ≤ ai ≤ n) — номера помеченных вершин. Гарантируется, все числа ai различны.

Выходные данные

Если требуемого графа не существует выведите в единственной строке -1. Иначе выведите m строк по два целых числа u, v — описание ребер искомого Валерой графа.

E. Счастливое представление числа

дп Конструктив поиск в глубину и подобное *2200

Как известно счастливыми цифрами являются 4 и 7, однако, у Васи есть еще одна любимая цифра — 0, и он ее тоже считает счастливой! Счастливыми числами называют те неотрицательные числа, десятичная запись которых состоит только из счастливых цифр. К примеру, числа 0, 47, 7074 — счастливые, а 1, 7377, 895,  -7 — нет.

У Васи есть t важных целых положительных чисел, которые ему необходимо запомнить. Вася очень суеверен и хочет запоминать только счастливые числа, поэтому просит вас для каждого важного числа представить его как сумму ровно шести счастливых чисел (больше Вася просто не сможет запомнить). Тогда Вася сможет спокойно запомнить эти шесть чисел и в любой момент вычислить важное число.

Для каждого из t важных чисел выразите его, как сумму шести счастливых чисел или определите, что это невозможно.

Входные данные

В первой строке задано целое число t (1 ≤ t ≤ 5000).

Следующие t строк содержат по одному целому положительному числу ni (1 ≤ ni ≤ 1018) — список важных чисел.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64 битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Выходные данные

Выведите t строк; i-тая строка должна содержать ответ для i-того важного числа: если решение существует — строка должна содержать ровно шесть счастливых чисел, сумма которых равна ni, если решения не существует — строка должна содержать одно число -1.

Если решений несколько разрешается вывести любое.

E. Порядок

Конструктив поиск в глубину и подобное *2400

Семен любит порядок. Поэтому, перед тем, как лечь спать, Семен хочет завершить все дела в доме.

Дом Семена сверху выглядит как прямоугольная таблица, состоящая из n строк и n столбцов. Строки таблицы пронумерованы от 1 до n сверху вниз, а столбцы — от 1 до n слева направо. Каждая ячейка этой таблицы — это комната. Парой (i, j) будем обозначать комнату, расположенную на пересечении i-ой строки и j-ого столбца. Про каждую комнату известно, включен ли в ней свет, или нет.

Изначально Семен находится в комнате (x0, y0). Он хочет выключить свет во всех комнатах в доме и после этого вернуться в комнату (x0, y0). Обозначим комнату, в которой на данный момент находится Семен, (x, y). Чтобы выполнить желаемое, Семен может выполнять следующие действия:

  • Формат действия — «1». Во время выполнения этого действия, Семен включает свет в комнате (x, y). Запрещается выполнять действие, если в комнате уже включен свет.
  • Формат действия — «2». Во время выполнения этого действия, Семен выключает свет в комнате (x, y). Запрещается выполнять действие, если в комнате уже выключен свет.
  • Формат действия — «dir» (dir это символ). Во время выполнения этого действия, Семен перемещается в соседнюю по стороне комнату в направлении dir. Всего Семен может двигаться только в 4-х направлениях: влево, вправо, вверх и вниз (соответственно, dir равен L, R, U, D). Кроме того, Семен может перейти только в комнату, по направлению которой где-то горит свет. Более формально, если обозначить за (nx, ny) комнату, в которую Семен хочет перейти, то должно существовать такое целое число k (k > 0), что существует комната со включенным светом в ячейке (x + (nx - x)k, y + (ny - y)k). Конечно, Семену запрещается выходить за пределы дома.

Помогите Семену, найдите такую последовательность действий, что Семен выполнит желаемое.

Входные данные

В первой строке заданы три целых положительных числа n, x0, y0 (2 ≤ n ≤ 500, 1 ≤ x0, y0 ≤ n).

Далее в n строках задано описание комнат дома. В i-ой строке записано n целых чисел через пробел ai1, ai2, ..., ain. Если число aij равно нулю, то в комнате (i, j) свет выключен, если же число aij равно единице, то в комнате (i, j) свет включен. Гарантируется, что хотя бы в одной комнате свет включен.

Выходные данные

Если не существует требуемой последовательности действий, выведите «NO» (без кавычек). Иначе выведите «YES» (без кавычек) и описание требуемой последовательности действий в виде строки. Обратите внимание, что от Вас не требуется минимизировать длину последовательности действий, но тем не менее последовательность должна состоять из не более чем 3·106 действий.

D. Дураки и дороги

графы жадные алгоритмы поиск в глубину и подобное снм Структуры данных *2100

На уроках географии в школе Вам наверняка рассказывали о Стране Дураков. В частности, Вы должны знать, что внутреннее устройство Страны Дураков не менялось на протяжении многих столетий. Страна состоит из n городов, некоторые пары которых соединены двусторонними дорогами, причем каждая из дорог характеризуется величиной li — своей длиной.

Так и жили бы дураки, но недавно в результате государственного переворота в стране поменялся король — им стал медведь Василий. Василий разделил города страны на области таким образом, что между любыми двумя городами из одной области существует путь по дорогам страны, а между двумя городами из разных областей такого пути нет. После этого Василий решил провести дорожную реформу: построить в стране ровно p новых дорог. Строительство одной дороги происходит следующим образом:

  1. Выбирается пара различных городов u, v, которые будет соединять новая дорога (при этом возможно, что между этими городами уже существует дорога).
  2. Определяется длина новой дороги: если города u, v относятся к различным областям, то длина вычисляется как min(109, S + 1) (S — суммарная длина всех дорог, существующих в соединяемых областях), иначе длина полагается равной 1000.
  3. Между выбранными городами строится дорога указанной длины. Если новая дорога соединяла различные области, то после ее строительства эти две области будут объединены в одну.

Василий хочет, чтобы после проведения дорожной реформы страна состояла ровно из q областей. Ваша задача — разработать для медведя Василия такой план строительства дорог, удовлетворяющий этому требованию, чтобы суммарная длина построенных дорог была минимально возможной.

Входные данные

В первой строке записано четыре целых числа n (1 ≤ n ≤ 105), m (0 ≤ m ≤ 105), p (0 ≤ p ≤ 105), q (1 ≤ q ≤ n) — количество городов в Стране Дураков, количество существующих дорог, количество дорог, которые планируется построить, и требуемое количество областей.

В следующих m строках описываются дороги, существующие на момент начала реформы. Каждая из этих строк содержит три целых числа xi, yi, li: xi, yi — номера городов, которые соединяет дорога (1 ≤ xi, yi ≤ n, xi ≠ yi), li — ее длина (1 ≤ li ≤ 109). Обратите внимание, что одна и та же пара городов может быть соединена несколькими дорогами.

Выходные данные

Если невозможно требуемым образом построить дороги, выведите единственную строку «NO» (без кавычек). В противном случае выведите в первую строку слово «YES» (без кавычек), а в следующих p строках приведите план строительства дорог. Каждая строка плана должна состоять из двух различных целых чисел, задающих номера городов, которые соединяет очередная дорога. Дороги в плане должны следовать в том порядке, в котором их нужно строить. Если существует несколько оптимальных решений, можно вывести любое.

Примечание

Рассмотрим первый пример. До начала реформы Страна Дураков состоит из четырех областей. Первая область включает в себя города 1, 2, 3, вторая — города 4 и 6, третья — города 5, 7, 8, четвертая — город 9. Суммарная длина дорог, существующих в этих областях, составляет 11, 20, 5 и 0 соответственно. Согласно плану, первой строится дорога длины 6 между городами 5 и 9, а второй — дорога длины 23 между городами 1 и 9. Таким образом, суммарная длина построенных дорог составляет 29.

D. Дима и граф-ловушка

Бинарный поиск кратчайшие пути поиск в глубину и подобное снм Структуры данных *2000

Дима и Инна обожают проводить время вместе. Только Сережа почему-то не обожает уходить из собственной комнаты. Но Дима и Инна так любят друг друга, что решили пойти на криминал...

Дима сконструировал граф-ловушку и под предлогом: «Сереж, смотри какой у меня граф классный!», — толкнул соседа в первую вершину.

Граф-ловушка — это неориентированный граф, состоящий из n вершин и m ребер. Ребру с номером k Дима сопоставил диапазон целых чисел от lk до rk (lk ≤ rk). Чтобы выйти из графа ловушки, Сережа первоначально (перед началом пути) должен выбрать некоторое целое число (обозначим его x), после этого Сережа должен пройти путь от стартовой вершины с номером 1 до конечной вершины с номером n. При этом Сережа может пройти по ребру k только в том случае, если lk ≤ x ≤ rk.

Сережа — математик. Он определил лояльность какого-то пути из 1-ой вершины в n-ую, как количество целых чисел x, выбрав которые первоначально, можно пройти этот путь. Помогите Сереже найти путь, обладающий максимальной лояльностью, и поскорее вернуться в комнату!

Входные данные

Первая строка входных данных содержит два целых числа n и m (2 ≤ n ≤ 103, 0 ≤ m ≤ 3·103). Далее следует m строк, описывающих ребра. Каждая строка содержит четыре целых числа ak, bk, lk и rk (1 ≤ ak, bk ≤ n, 1 ≤ lk ≤ rk ≤ 106). Числа обозначают, что в графе-ловушке k-ое ребро соединяет вершины ak и bk, этому ребру сопоставлен диапазон целых чисел от lk до rk.

Обратите внимание, заданный граф может иметь петли и кратные ребра.

Выходные данные

В единственной строке выходных данных выведите целое положительное число — максимальную лояльность, среди всех путей из первой вершины в n-ую. Если таких путей не существует, или максимальная лояльность равна 0, то в единственной строке выведите «Nice work, Dima!» без кавычек.

Примечание

Пояснение к примеру 1

У нас есть всего 2 способа попасть из вершины 1 в вершину 4: сперва нужно обязательно пройти по ребру 1-2 с диапазоном [1-10], затем, по одному из двух ребер 2-4.

Одно из них содержит диапазон [3-5], то есть мы можем пройти с числами 3, 4, 5. Лояльность такого пути — 3.

Если же идти по ребру 2-4 с диапазоном [2-7], то мы сможем пройти с числами 2, 3, 4, 5, 6, 7. Лояльность — 6. Это и есть ответ.

Ребро 1-2 не влияет на лояльность пути, так как его диапазон содержит в себе диапазоны следующих в пути ребер.

D. Сережа и множества

битмаски поиск в глубину и подобное *2400

У Сережи есть m непустых множеств целых чисел A1, A2, ..., Am. По счастливой случайности оказалось, что данные множества являются разбиением множества всех целых чисел от 1 до n. Другими словами, для любого целого v (1 ≤ v ≤ n) существует ровно одно множество At такое, что . Кроме того у него есть целое число d.

Сережа решил выбрать несколько множеств из имеющихся. Предположим, что i1, i2, ..., ik (1 ≤ i1 < i2 < ... < ik ≤ m) — это индексы выбранных множеств. Тогда определим массив целых чисел b равный объединению выбранных множеств, то есть . Будем считать, что массив b отсортирован по возрастанию. Элемент с номером j в этом массиве (j-ый по возрастанию) будем обозначать bj. Сережа считает, что его выбор множеств правильный, если выполняются условия:

b1 ≤ dbi + 1 - bi ≤ d (1 ≤ i < |b|); n - d + 1 ≤ b|b|.

Сережа хочет найти k — минимальное количество выбранных множеств, чтобы его выбор был правильным. Помогите ему в этом.

Входные данные

В первой строке содержатся целые числа n, m, d (1 ≤ d ≤ n ≤ 105, 1 ≤ m ≤ 20). В следующих m строках содержатся множества, первое число в i-ой строке si (1 ≤ si ≤ n) означает размер i-го множества, далее в строке содержатся si различных целых чисел от 1 до n — множество Ai.

Гарантируется, что множества образуют разбиение всех целых чисел от 1 до n.

Выходные данные

В единственной строке выведите ответ на задачу — минимальное значение k при правильном выборе.

C. Валера и выборы

графы Деревья поиск в глубину и подобное *1600

В городе, где живет Валера, скоро состоятся выборы в Городскую Думу.

Всего в городе есть n районов и n - 1 двусторонняя дорога. При этом известно, что из любого района существует путь по дорогам в любой другой район. Пронумеруем все районы в городе некоторым образом целыми числами от 1 до n включительно. Для каждой дороги жители определили, является ли она проблемной или нет. Проблемная дорога — это дорога, которая нуждается в ремонте.

На выборы баллотируются n кандидатов. Пронумеруем всех кандидатов некоторым образом целыми числами от 1 до n включительно. Если кандидат с номером i будет избран в Городскую Думу, то он выполнит ровно одно обещание — отремонтировать все проблемные дороги на пути от района с номером i до района с номером 1, в котором расположена Городская Дума.

Помогите Валере и найдите множество кандидатов, после избрания которых в Городскую Думу все проблемные дороги в городе будут отремонтированы. Если же существует несколько таких множеств, следует выбрать множество, состоящее из минимального количества кандидатов.

Входные данные

В первой строке задано одно целое число n (2 ≤ n ≤ 105) — количество районов в городе.

Далее следует n - 1 строка. Каждая строка содержит описание дороги в виде трех целых положительных чисел xi, yi, ti (1 ≤ xi, yi ≤ n, 1 ≤ ti ≤ 2) — районы, которые соединяет i-я двусторонняя дорога, и тип дороги. Если ti равно единице, то i-я дорога не является проблемной; если ti равно двум, то i-я дорога является проблемной.

Гарантируется, что если представить город в виде графа дорог, граф будет являться деревом.

Выходные данные

В первой строке выведите одно целое неотрицательное число k — минимальный возможный размер искомого множества.

Во второй строке выведите k целых чисел a1, a2, ... ak — номера кандидатов, которые образуют искомое множество. Если существует несколько решений, то разрешается вывести любое.

D. Валера и дураки

графы дп кратчайшие пути поиск в глубину и подобное *2200

Одним прекрасным утром n дураков выстроились в ряд. После этого они пронумеровали друг друга номерами от 1 до n включительно. Каждый дурак получил уникальный номер. Дураки решили не менять своих номеров до конца веселья.

У каждого дурака есть ровно k патронов и пистолет. Вероятность того, что дурак с номером i убьет дурака, в которого совершит выстрел, равна pi процентов.

Дураки решили провести несколько раундов веселья. Каждый раунд веселья состоит в следующем: каждый еще живой дурак совершает выстрел в другого живого дурака с наименьшим номером (дураки не настолько глупы, чтобы стрелять в самих себя). Все выстрелы совершаются одновременно. Если остался ровно один живой дурак, то он не совершает выстрелов.

Назовем ситуацией множество номеров всех живых дураков на некоторый момент времени. Будем говорить, что ситуация возможна, если для некоторого целого числа j (0 ≤ j ≤ k) существует ненулевая вероятность, что через j раундов веселья будет иметь место именно такая ситуация.

Валера знает числа p1, p2, ..., pn и k. Помогите Валере определить количество различных возможных ситуаций.

Входные данные

В первой строке заданы два целых числа n, k (1 ≤ n, k ≤ 3000) — изначальное количество дураков и количество патронов у каждого дурака.

Во второй строке задано n целых чисел p1, p2, ..., pn (0 ≤ pi ≤ 100) — указанные вероятности (в процентах).

Выходные данные

Выведите единственное число — ответ на задачу.

Примечание

В первом примере любая ситуация возможна, кроме ситуации {1, 2}.

Во втором примере ровно один дурак, поэтому он не совершает выстрелов.

В третьем примере возможны ситуации {1, 2} (после нуля раундов) и «пустая» ситуация {} (после одного раунда).

В четвертом примере возможна только ситуация {1, 2, 3}.

D. Весело выбирать поддерево

Бинарный поиск Деревья поиск в глубину и подобное Структуры данных *2600

Дано дерево, состоящее из n вершин. Вершины пронумерованы от 1 до n.

Определим длину отрезка [l, r] величиной r - l + 1. Счет поддерева данного дерева равняется максимальной длине такого отрезка [l, r], что вершины с номерами l, l + 1, ..., r принадлежат поддереву.

Рассмотрим все поддеревья данного дерева размером не больше k, выведите максимальный счет поддерева среди рассматриваемых. Обратите внимание, что в данной задаче дерево не корневое, поэтому поддерево — это любой связный подграф дерева.

Входные данные

В первой строке дано два целых числа n и k (1 ≤ k ≤ n ≤ 105). Каждая из следующих n - 1 строк содержит целые числа ai и bi (1 ≤ ai, bi ≤ n, ai ≠ bi). Это означает, что ai и bi соединены ребром дерева.

Гарантируется, что входные данные представляют дерево.

Выходные данные

Выведите единственное целое число — максимальный возможный счет.

Примечание

В первом примере имеется поддерево размера не больше 6, включающее тройку последовательных номеров вершин. Например, поддерево, состоящее из {1, 3, 4, 5, 7, 8} или из {1, 4, 6, 7, 8, 10}, включает тройку последовательных номеров вершин. Однако не существует поддерева, размер которого не больше 6, включающего 4 или более последовательных номеров вершин.

C. Инна и Дима

графы дп поиск в глубину и подобное реализация *1900

Инна и Дима купили в магазине табличку размера n × m. В каждой ячейке этой таблички записана одна из букв: «D», «I», «M», «A».

Инна любит Диму, поэтому она хочет, двигаясь по табличке, собрать его имя как можно больше раз. Для этого Инна действует следующим образом:

  1. изначально Инна выбирает некоторую ячейку таблицы, в которой записана буква «D»;
  2. затем Инна может перейти в одну из соседних по стороне ячеек таблицы, в которой записана буква «I»; затем из этой ячейки она может перейти в одну из соседних по стороне ячеек таблицы, в которой записана буква «M»; затем в одну из соседних по стороне ячеек таблицы, в которой записана буква «A», после чего Инна считает, что собрала целиком имя своего возлюбленного;
  3. следующим ходом Инна может перейти в одну из соседних по стороне ячеек таблицы, в которой записана буква «D», и далее аналогичным образом продолжить набор имени DIMA. Инна никогда не пропускает буквы, то есть из буквы «D» она всегда переходит в букву «I», из буквы «I» — в букву «M», из буквы «M» — в букву «A», а из буквы «A» — в букву «D» для начала набора имени еще раз.

В зависимости от выбора первоначальной ячейки таблицы Инна может собрать слово DIMA либо бесконечное количество раз, либо некоторое положительное конечное количество раз, либо вообще не может собрать слово DIMA ни разу. Помогите Инне определить, какое максимальное количество раз она может собрать слово DIMA.

Входные данные

Первая строка входных данных содержит два целых числа n и m (1 ≤ n, m ≤ 103).

Далее следует n строк, описывающих таблицу Инны и Димы. Каждая строка содержит m символов. Каждый символ — это один из символов: «D», «I», «M», «A».

Обратите внимание, не гарантируется, что таблица содержит хотя бы одну букву «D».

Выходные данные

Если Инна не может собрать ни одного слова DIMA, в единственной строке выведите «Poor Dima!» без кавычек. Если Инна может собрать бесконечное количество слов DIMA, выведите «Poor Inna!» без кавычек. Иначе выведите целое число — какое максимальное количество раз Инна сможет собрать слово DIMA.

Примечание

Пояснения к примерам:

В первом тестовом примере, Инна не может собрать слово DIMA ни разу.

Во втором тестовом примере, Инна может собрать бесконечное количество слов DIMA. Для этого она должна двигаться по часовой стрелке, начиная от правого нижнего угла.

В третьем тестовом примере, выгоднее всего изначально выбрать ячейку в левом верхнем углу таблицы. Начиная от этой ячейки, можно собрать слово DIMA 4 раза.

D. Дерево и запросы

Деревья поиск в глубину и подобное Структуры данных *2400

Задано корневое дерево, состоящее из n вершин. Каждая вершина дерева имеет определенный цвет. Будем считать, что вершины дерева пронумерованы целыми числами от 1 до n. Тогда цвет вершины v будем обозначать cv. Корнем дерева является вершина с номером 1.

В задаче вам требуется ответить на m запросов. Каждый запрос характеризуется двумя целыми числами vj, kj. Ответ на запрос vj, kj — это количество таких цветов вершин x, что в поддереве вершины vj содержится как минимум kj вершин цвета x.

Определение корневого дерева можно прочитать по ссылке: http://ru.wikipedia.org/wiki/Дерево_(теория_графов).

Входные данные

В первой строке записаны два целых числа n и m (2 ≤ n ≤ 105; 1 ≤ m ≤ 105). В следующей строке записана последовательность целых чисел c1, c2, ..., cn (1 ≤ ci ≤ 105). В следующих n - 1 строках записаны ребра дерева. В i-ой строке записаны числа ai, bi (1 ≤ ai, bi ≤ nai ≠ bi) — вершины, соединенные ребром дерева.

Далее в m строках записаны запросы. В j-той строке записаны два целых числа vj, kj (1 ≤ vj ≤ n; 1 ≤ kj ≤ 105).

Выходные данные

Выведите m целых чисел — ответы на запросы в порядке появления запросов во входных данных.

Примечание

Поддерево вершины v в корневом дереве с корнем r — это множество вершин дерева {u : dist(r, v) + dist(v, u) = dist(r, u)}. Где dist(x, y) — это длина кратчайшего по количеству ребер пути между вершинами x и y.

A. Лабиринт

поиск в глубину и подобное *1600

Павел обожает клетчатые лабиринты. Клетчатый лабиринт — это прямоугольный лабиринт размера n × m, где каждая клетка либо свободна, либо является стеной, а перемещаться из одной клетки в другую можно только в том случае, если они обе свободные и имеют общую сторону.

Павел нарисовал клетчатый лабиринт, все свободные клетки которого образуют связную область, то есть из любой свободной клетки можно добраться до любой другой. Павлу не нравится, что в его лабиринте слишком мало стен. Он хочет превратить ровно k свободных клеток в стены таким образом, чтобы все оставшиеся свободные клетки по прежнему образовывали бы связную область. Помогите ему.

Входные данные

В первой строке находятся три целых числа n, m, k (1 ≤ n, m ≤ 500, 0 ≤ k < s), где n и m — соответственно высота и ширина лабиринта, k — количество стен, которое Павел хочет добавить в лабиринт, а буквой s обозначено количество свободных клеток в исходном лабиринте.

Далее следуют n строк по m символов каждая, задающие исходный лабиринт. Если символ в строке равен «.», то соответствующая клетка свободная, а если он равен «#», то эта клетка является стеной.

Выходные данные

Выведите n строк по m символов каждая: новый лабиринт, удовлетворяющий всем требованиям Павла. Пустые клетки, которые после преобразования стали стенами, обозначайте «X», а остальные клетки оставляйте без изменения (то есть «.» и «#»).

Гарантируется, что решение существует. Если существует несколько решений, разрешается вывести любое.

D. Ксюша и пешки

графы Деревья поиск в глубину и подобное реализация *2200

У Ксюши есть шахматная доска размером n × m. На каждой клетке этой шахматной доски нарисован один из символов: «<», «>», «^», «v», «#». Клетки, на которых нарисован символ «#», Ксюша называет заблокированными. Известно, что все клетки шахматной доски, которые касаются ее границы, являются заблокированными.

Ксюша играет с двумя пешками на этой шахматной доске. Изначально она ставит пешки на шахматную доску. Причем в одной клетке шахматной доски в один момент времени могут стоять две пешки тогда и только тогда, когда эта клетка заблокированная. В других случаях две пешки не могут находиться в одной клетке. Игра начинается, когда Ксюша поставила пешки на доску. За один ход Ксюша перемещает каждую из пешек на соседнюю по стороне клетку в направлении стрелки, нарисованной на клетке, на которой стоит соответствующая пешка (если пешка стоит на «#», она не двигается). Считайте, что Ксюша двигает пешки одновременно (смотрите второй тестовый пример).

Конечно, Ксюша играет на очки. Как же посчитать очки за игру? Очень просто! Давайте посчитаем сколько перемещений совершила первая пешка и сколько вторая, просуммируем эти два числа — это и будет являться результирующим количеством очков игры.

Ксюше очень интересно, какое максимальное количество очков она может заработать (для этого одна должна оптимально разместить пешки в самом начале игры). Помогите ей, найдите это число.

Входные данные

В первой строке записаны два целых числа n и m (1 ≤ n, m ≤ 2000) — размеры доски. В каждой из следующих n строк записано по m символов — описание доски. Каждый символ — это один из символов: «<», «>», «^», «v», «#».

Гарантируется, что граничные клетки доски — это заблокированные клетки (с символом «#»).

Выходные данные

Если Ксюша может заработать бесконечно большое количество очков, выведите -1. Иначе выведите максимальное количество очков, которое она может заработать.

C. Дерево подвижных сумм

Деревья поиск в глубину и подобное Структуры данных *2000

Яхуб очень любит деревья. Недавно он обнаружил интересное дерево под названием «дерево подвижных сумм». Дерево состоит из n вершин, пронумерованных от 1 до n, каждая вершина i содержит начальное значение ai. Корень дерева — вершина 1.

Это дерево имеет особое свойство: когда значение val добавляется к значению вершины i, значение -val добавляется ко всем значениям детей вершины i. Обратите внимание, что когда вы добавляете значение -val ребенку вершины i, вы также добавляете -(-val) ко всем детям этого ребенка вершины i и так далее. Для того, чтобы лучше понять описанное свойство, обратите внимание на пояснение к первому тесту.

Дерево поддерживает два типа запросов:

  • «1 x val» — добавить значение val к значению вершины x;
  • «2 x» — вывести текущее значение вершины x.

Чтобы помочь Яхубу лучше понять дерево, надо ответить на m запросов описанных типов.

Входные данные

В первой строке содержатся два целых числа n и m (1 ≤ n, m ≤ 200000). Во второй строке содержится n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 1000). В каждой из следующих n–1 строк содержится по два целых числа, ui и vi (1 ≤ ui, vi ≤ n), означающих, что существует ребро между вершинами ui и vi.

Каждая из следующих m строк содержит запрос в описанном выше формате. Гарантируется, что для всех запросов выполняется: 1 ≤ x ≤ n, 1 ≤ val ≤ 1000.

Выходные данные

Для каждого запроса второго типа (вывод текущего значения вершины) надо вывести ответ на запрос на отдельной строке. Ответы на запросы выводите в порядке следования запросов во входных данных.

Примечание

Изначально значения в вершинах равны [1, 2, 1, 1, 2].

Затем значение 3 добавляется к вершине 2. Вершина 2 передает значение -3 своим сыновьям, и далее значение -3 добавляется к вершинам 4 и 5. Дальше значение никуда не передается. После этого запроса значения в вершинах равны [1, 5, 1,  - 2,  - 1].

Затем значение 2 добавляется к вершине 1. Вершина 1 передает значение -2 своим сыновьям: вершине 2 и вершине 3. Из вершины 2 значение 2 передается вершинам 4 и 5. Вершина 3 не имеет сыновей, следовательно из нее значение не передается. После этого запроса значения в вершинах становятся равны [3, 3,  - 1, 0, 1].

С основными определениями, связанными с корневыми деревьями, можно ознакомиться по ссылке: http://ru.wikipedia.org/wiki/Дерево_(теория_графов)

C. Восстановите граф

графы поиск в глубину и подобное сортировки *1800

У Валеры был неориентированный связный граф без петель и кратных ребер, состоящий из n вершин. Граф обладал интересным свойством: из каждой его вершины исходило не более k ребер. Для удобства будем считать, что вершины графа пронумерованы целыми числами от 1 до n.

Как-то раз Валера посчитал кратчайшие расстояния от одной из вершин графа до всех остальных и выписал их в массив d. Таким образом, элемент d[i] массива обозначает кратчайшее расстояние от выбранной Валерой вершины до вершины с номером i.

Вскоре произошло неисправимое. Валера потерял исходный граф. Однако, у него остался массив d. Помогите ему восстановить утерянный граф.

Входные данные

В первой строке через пробел записаны два целых числа n и k (1 ≤ k < n ≤ 105). Число n обозначает количество вершин в искомом графе. Число k обозначает, что из каждой вершины искомого графа исходит не более k ребер.

Во второй строке через пробел записаны целые числа d[1], d[2], ..., d[n] (0 ≤ d[i] < n). Число d[i] обозначает кратчайшее расстояние от выбранной Валерой вершины до вершины с номером i.

Выходные данные

Если Валера ошибся в записях и требуемого графа не существует, выведите в первой строке число -1. Иначе, в первой строке выведите целое число m (0 ≤ m ≤ 106) — количество ребер в найденном графе.

В каждой из следующих m строк выведите через пробел два целых числа ai и bi (1 ≤ ai, bi ≤ nai ≠ bi), обозначающих ребро, соединяющее вершины с номерами ai и bi. Граф не должен содержать петель и кратных ребер. Если возможных ответов несколько, выведите любой.

E. Разрез графа

графы поиск в глубину и подобное *2300

Маленький Крис принимает участие в соревновании по нарезке графов. В этом он профессионал. Настал час устроить серьезную проверку его способностям.

Крису дан простой неориентированный связный граф, который состоит из n вершин (пронумерованных от 1 до n) и m ребер. Задача Криса состоит в том, чтобы разрезать заданный граф на пути длины 2. Формально, Крису надо разбить все ребра графа на пары так, чтобы в каждой паре ребра были смежные (инцидентны некоторой общей вершине) и каждое ребро содержалось ровно в одной паре.

Например, ниже приведен рисунок, который показывает, как Крис может разрезать граф. Первый тестовый пример содержит описание этого графа.

Вам дана возможность посоревноваться с Крисом. Найдите способ разрезать данный граф или же определите, что это невозможно!

Входные данные

В первой строке входных данных даны два целых числа через пробел, n и m (1 ≤ n, m ≤ 105), количество вершин и ребер в графе, соответственно. Следующие m строк содержат описание ребер графа. В i-й строке записаны два целых числа через пробел ai и bi (1 ≤ ai, bi ≤ n; ai ≠ bi), номера вершин, соединенных i-м ребром.

Гарантируется, что данный граф простой (не содержит петель и мультиребер) и связный.

Обратите внимание: входные и выходные данные имеют очень большой размер, не стоит использовать медленные методы ввода и вывода данных вашего языка программирования. Например, в языке C++ не стоит использовать потоки ввода и вывода (cin, cout).

Выходные данные

Если данный граф возможно разрезать на пути длины 2, выведите строк. В i-й строке выведите три целых числа через пробел, xi, yi и zi, описание i-го пути. Граф должен содержать этот путь, то есть в графе должны быть ребра (xi, yi) и (yi, zi). Каждое ребро должно присутствовать ровно в одном пути длины 2. Если есть несколько вариантов решения, выведите любой из них.

Если данный граф разрезать невозможно, выведите "No solution" (без кавычек).

D. Скалолазание

геометрия Деревья поиск в глубину и подобное *2200

Эта задача никак не связана с маленьким Крисом. Здесь надо лазать по скалам (это в круг интересов Криса уж точно не входит).

В ряд расположены n гор, каждая из которых имеет форму вертикального отрезка, один конец которого находится на земле. Горы пронумерованы слева направо целыми числами от 1 до n. Гора под номером i находится в точке xi, а ее вершина — на высоте yi. Для каждых двух гор a и b, если вершину горы a можно видеть с вершины горы b, их вершины связаны веревкой. Формально, вершины двух гор соединены, если отрезки, соединяющие вершины, не пересекаются или не соприкасаются с любыми другими отрезками гор. С помощью этих веревок скалолазы могут взбираться на горы.

Есть m команд, в каждой ровно по два скалолаза. Первый и второй скалолаз из i-й команды стоят на вершинах ai-й и bi-й скалы, соответственно. Они хотят встретиться на вершине некоторой горы. Теперь каждый из двух скалолазов двигается согласно следующему алгоритму:

  1. если один скалолаз находится на вершине горы, где его партнер уже находится сам, либо рано или поздно придет туда, то первый скалолаз остается ждать на этой горе;
  2. в противном случае, скалолаз выбирает самую правую скалу справа от его текущей скалы, до которой он может добраться по веревке; взбирается на эту скалу и продолжает процесс (скалолаз может взобраться и на гору, которая ниже его текущей).

Для каждой команды определите номер скалы, где участники этой команды встретятся!

Входные данные

В первой строке содержится единственное целое число n (1 ≤ n ≤ 105) — количество скал. Следующие n строк описывают скалы: i-я из них содержит два целых числа через пробел xi, yi (1 ≤ xi ≤ 107; 1 ≤ yi ≤ 1011) — позиция и высота i-й скалы. Скалы даны в порядке увеличения xi, то есть, xi < xj для i < j.

В следующей строке записано единственное целое число m (1 ≤ m ≤ 105) — количество команд. Следующие m строк описывают команды: i-я строка содержит два целых числа через пробел ai, bi (1 ≤ ai, bi ≤ n) — номера скал, где расположены участники i-й команды. Числа ai и bi могут быть равны.

Выходные данные

В единственной строке выведите m целых чисел через пробел, где i-е число — номер скалы, на которой встретятся скалолазы из i-й команды.

D. Выдача премий

поиск в глубину и подобное *2000

Сотрудники компании R1 частенько проводят время вместе: смотрят футбол, отдыхают на природе, решают контесты. Поэтому нет ничего особенного в том, что иногда кто-то платит за кого-то.

Сегодня день выдачи премий. Глава компании R1 будет приглашать сотрудников в свой кабинет по одному, награждая каждого за усердную работу в этом месяце. Глава компании хорошо знает, кто кому должен. А также он понимает, что если пригласить человека x в кабинет за премией, а затем сразу же пригласить человека y, которому человек x должен, то они могут встретиться. Конечно, в такой ситуации радость человека x от только что полученной премии будет намного меньше. Поэтому глава R1 решил приглашать сотрудников в таком порядке, что описанная ситуация не будет происходить ни для какой пары сотрудников, приглашенных один за другим.

Однако сотрудников в компании много, а времени у главы компании — нет. Поэтому задачу поручили вам. По заданным отношениям долга между всеми сотрудниками определите, в каком порядке следует приглашать их в кабинет главы R1, либо определите, что описанного порядка не существует.

Входные данные

В первой строке записаны через пробел целые числа n и m — количество сотрудников в R1 и количество отношений долга. В каждой из следующих m строк записано два целых числа через пробел ai, bi (1 ≤ ai, bi ≤ nai ≠ bi), эти числа обозначают, что человек с номером ai должен человеку с номером bi. Считайте, что все сотрудники пронумерованы от 1 до n.

Гарантируется, что каждая пара людей p, q упоминается во входных данных не более одного раза. В частности, входные данные не будут содержать пар p, q и q, p одновременно.

Выходные данные

Выведите -1, если описанного порядка не существует. Иначе, выведите перестановку из n различных целых чисел. Первое число должно обозначать номер человека, которого надо позвать первым в кабинет главы R1, второе — номер второго человека, и так далее.

Если существует несколько правильных порядков, разрешается вывести любой.

E. Военные и Володя

графы Деревья поиск в глубину и подобное *2700

Володя — мастер искажений. Он обладает уникальной способностью — строить портальчики! Имея два местоположения в пространстве, Володя может построить портальчик, позволяющий перемещаться между ними в любом из двух направлений. К сожалению, такое действие не обходится Володе даром, и при каждом строительстве редеет на несколько волос его и так, скажем откровенно, не очень-то густая шевелюра.

Из-за своих экстраординарных способностей, Володя привлек внимание военных. Ему поручено особо важное задание. Но обо всем по порядку.

Военная база представляет собой несколько подземных объектов, некоторые из которых соединены между собой двусторонними тоннелями, причем так, что между любыми двумя объектами есть путь по тоннелям. Ровно два объекта имеют выходы на поверхность. Для охраны тоннелей действует патрульный, который каждый день спускается в любой из объектов, имеющих выход, обходит все тоннели и выходит на поверхность через любой из объектов, имеющих выход. Он может входить и выходить через один и тот же объект, а может через разные. Руководство военной базы заметило, что патрульный проходит через некоторые тоннели по несколько раз, и решило оптимизировать схему патрулирования. Перед военными встала задача: построить систему портальчиков между объектами так, чтобы патрульный мог совершать свой обход, проходя по каждому тоннелю ровно один раз. При этом через портальчики патрульный может проходить неограниченное число раз.

Здесь-то и вступает в дело Володя: планирование и постройку системы порталов решили поручить именно ему. К несчастью для Володи, из-за строгой секретности ему не сообщили расположения тоннелей, но потребовали, чтобы система порталов выполняла задачу в любом случае. Тем не менее, некоторой информацией Володя располагает: ему известно, между какими парами объектов он может построить порталы и во сколько волос они обойдутся. Более того, завтра Володе обещают сообщить, какие два объекта имеют выходы на поверхность. Конечно же, Володя решил не терять времени и посчитать минимальные стоимости постройки для нескольких вероятных, по его мнению, пар объектов. Помогите ему!

Входные данные

В первой строке входных данных задано натуральное число n (2 ≤ n ≤ 100000) — количество объектов на секретной базе. Во второй строке — число m (1 ≤ m ≤ 200000) — количество портальчиков, которые потенциально могут быть построены Володей. Каждая из последующих m строк содержит описание портальчика — три целых числа a, b, c (1 ≤ a, b ≤ n, 1 ≤ c ≤ 100000) — номера объектов, которые могут быть соединены, и число волос, которыми Володе придется пожертвовать.

Следующая строка содержит одно натуральное число q (1 ≤ q ≤ 100000) — число запросов. Наконец, последние q строк содержат описания запросов — пары различных номеров объектов ai, bi (1 ≤ ai, bi ≤ n, ai ≠ bi)

Среди портальчиков, которые может построить Володя, могут быть соединяющие одни и те же пары объектов.

Выходные данные

Выведите q строк, по одной для каждого запроса. В i-ой строке должно содержаться одно число — ответ на i-ый (в порядке перечисления во входных данных) запрос: минимальная стоимость (в волосах) системы порталов, позволяющей совершать обход для любой системы тоннелей, удовлетворяющей условиям, когда ai-ый и bi-ый объекты имеют выходы на поверхность, или "-1", если построить такую систему порталов нельзя.

E. Цветная Jenga

дп поиск в глубину и подобное Теория вероятностей *2500

Холодными зимними вечерами в Томске очень скучно — оказаться на улице в такую пору не хочется никому. Жители Томска, чтобы коротать время, сидя в теплых квартирах, придумывают себе много различных игр. Одной из таких игр является «Цветная Jenga».

Для этой игры используются деревянные блоки трех цветов: красного, зеленого и синего. Из них составляется башня из n уровней. Каждый из уровней состоит из трех деревянных блоков. Блоки на каждом из уровней могут быть произвольных цветов, но всегда расположены вплотную и параллельно друг другу. Пример такой башни можно увидеть на изображении.

В эту игру играет ровно один человек. Раз в минуту игрок бросает специальную игральную кость, которая имеет шесть граней. Две грани этой кости — зеленые, две — синие, одна — красная и одна — черная. Выпадение каждой из граней равновероятно.

Если выпадает грань красного, зеленого или синего цвета, то игрок в эту минуту обязан достать из башни любой блок такого цвета так, чтобы башня не упала. Если сделать это невозможно, то игрок ждет до конца минуты, не трогая башню. Так же следует ждать до конца минуты, не трогая башню, если выпала черная грань игральной кости. Доставать блоки из самого верхнего уровня башни (независимо от того достроен он или нет) запрещается.

После того, как игрок достал блок, он обязан положить его на верх башни так, чтобы образовать новый уровень или достроить верхний уровень, состоящий из ранее помещенных туда блоков. Вновь построенные уровни должны обладать всеми теми же свойствами, что и начальные уровни. Если верхний уровень не достроен, то новый уровень начинать запрещается.

Чтобы башня не упала, в каждом из уровней, кроме верхнего, должен оставаться хотя бы один блок. При этом если на каком-то из этих уровней остался ровно один блок и он не является средним, то башня падает.

Игра заканчивается в тот момент, когда в башне больше нет ни одного блока, который можно достать так, чтобы башня не упала.

Вот какую замечательную игру могут придумать жители города Томска. Интересно сколько минут может продлиться такая игра, если игрок будет действовать оптимально? Если игрок действует оптимально, то он в любой момент старается выбрать доставаемый блок так, чтобы минимизировать математическое ожидание продолжительности игры.

Ваша задача — написать программу, которая определит математическое ожидание искомого количества минут.

Входные данные

В первой строке входных данных задано единственное целое число n — количество уровней в башне (2 ≤ n ≤ 6).

Далее следует n строк, описывающих уровни башни снизу вверх (первая строка — самый нижний уровень). Каждый из уровней описывается тремя символами, первый и третий из которых задают крайние блоки уровня, а второй — средний блок. Символ, описывающий блок, может принимать значения «R» (красный блок), «G» (зеленый блок) и «B» (синий блок).

Выходные данные

В единственной строке выходных данных требуется вывести искомое значение математического ожидания. Ответ будет считаться правильным, если его относительная или абсолютная погрешность не превысит 10 - 6.

C. КПП

графы поиск в глубину и подобное *1700

В вашем городе n перекрестков. Между этими перекрестками расположены m односторонних дорог. Вы — мэр города, и вы должны обеспечивать безопасность на всех перекрестках.

Для обеспечения безопасности перекрестков нужно построить пункты КПП. КПП можно построить только на перекрестке. КПП на перекрестке i может обезопасить перекресток j, либо если i = j, либо если полицейская машина может доехать до j от i и затем вернуться в i.

Постройка КПП стоит денег. Так как некоторые районы города дороже других, то на некоторых перекрестках строить КПП дороже, чем на других. Какую минимальную сумму денег необходимо потратить для обеспечения безопасности всех перекрестков? Сколько существует оптимальных способов постройки КПП (в дополнение к минимальной стоимости подстройки, вы должны построить как можно меньше КПП)? Два способа считаются различными, если в одном из них некоторый перекресток имеет КПП, а в другом — нет.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105) — количество перекрестков. В следующей строке записано через пробел n целых чисел: i-е число равняется цене постройки КПП на i-м перекрестке (цена неотрицательная и не превышает 109).

В следующей строке записано целое число m (0 ≤ m ≤ 3·105) — количество дорог. В каждой из следующих m строк записано по два целых числа, ui и vi (1 ≤ ui, vi ≤ nu ≠ v). Пара ui, vi означает, что в городе есть дорога, ведущая из перекрестка ui в перекресток vi. Гарантируется, что во входных данных между двумя перекрестками не может быть более одной дороги в одном направлении.

Считайте, что все перекрестки пронумерованы целыми числами от 1 до n.

Выходные данные

Выведите два целых числа через пробел. Первое число — минимально возможная сумма денег, необходимая для того, чтобы обеспечить безопасность всех перекрестков. Второе число — количество способов обеспечения безопасности. Так как количество способов может быть достаточно большим, выведите его по модулю 1000000007 (109 + 7).

A. Дерево XOR

Деревья поиск в глубину и подобное *1300

Сегодня Яхуб изобрел новое дерево под названием дерево XOR. После этого революционного открытия юноша изобрел игру для детей на деревьях XOR.

Игра проходит на корневом дереве с n вершинами, пронумерованными от 1 до n. Каждая вершина i имеет начальное значение initi, равное 0 или 1. Корень дерева — вершина с номером 1.

Во время игры нужно выполнить несколько (возможно, ноль) операций с деревом. Единственный доступный тип операции — выбрать вершину x. Как только вершина x выбрана, значение в ней меняется на противоположное (с 1 на 0, а с 0 на 1), значения сыновей вершины x не меняются, значения сыновей сыновей вершины x меняются на противоположные, значения сыновей сыновей сыновей вершины x остаются прежними и так далее.

Цель игры — присвоить каждой вершине i значение goali. Вам же надо достигнуть цели игры за минимальное количество операций.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105). В каждой из следующих n - 1 строк записано по два целых числа, ui и vi (1 ≤ ui, vi ≤ n; ui ≠ vi), обозначающих ребро между вершинами ui и vi.

В следующей строке записано n целых чисел, i-е из них соответствует числу initi (initi может быть равно 0 или 1). В следующей строке также записано n целых чисел, i-е число обозначает goali (goali может быть равно 0 или 1).

Выходные данные

В первой строке выведите целое cnt, которое обозначает минимальное количество операций. В каждой из следующих cnt строк надо вывести целое число xi, обозначающее, что на i-м ходу вы выбрали вершину xi.

C. Валера и трубы

Конструктив поиск в глубину и подобное реализация *1500

У Валеры есть прямоугольная таблица, состоящая из n строк и m столбцов. Валера пронумеровал строки таблицы, начиная от единицы, сверху вниз, а столбцы — начиная от единицы, слева направо. Ячейку, расположенную на пересечении строки x и столбца y, будем обозначать парой чисел (x, y).

Валера хочет разместить ровно k труб на своей прямоугольной таблице. Трубой будем называть такую последовательность ячеек таблицы (x1, y1), (x2, y2), ..., (xr, yr), что:

  • r ≥ 2;
  • для любого целого i (1 ≤ i ≤ r - 1) выполняется равенство |xi - xi + 1| + |yi - yi + 1| = 1;
  • каждая ячейка, принадлежащая трубе, встречается в последовательности ячеек ровно один раз.

Валера считает, что трубы размещены красиво, если выполнены условия:

  • никакая пара труб не имеет общих ячеек;
  • каждая ячейка таблицы принадлежит некоторой трубе.

Помогите Валере красиво разместить k труб на его прямоугольной таблице.

Входные данные

В первой строке задано три целых числа через пробел n, m, k (2 ≤ n, m ≤ 300; 2 ≤ 2k ≤ n·m) — количество строк, количество столбцов и количество труб, соответственно.

Выходные данные

Выведите k строк. В i-й строке выведите описание i-й трубы: сначала выведите целое число ri (количество ячеек трубы), затем выведите 2ri целых чисел xi1, yi1, xi2, yi2, ..., xiri, yiri (последовательность ячеек таблицы).

Если существует несколько решений, разрешается вывести любое. Гарантируется, что хотя бы одно решение существует.

Примечание

Иллюстрация к первому примеру:

Иллюстрация ко второму примеру:

A. DZY любит шахматную доску

поиск в глубину и подобное реализация *1200

DZY любит шахматную доску и всякие игры с ней.

У него есть шахматная доска, состоящая из n строк и m столбцов. Некоторые ячейки шахматной доски плохие, остальные хорошие. На каждую хорошую ячейку DZY хочет поставить одну фигурку. Каждая фигурка белая или черная. DZY хочет, чтобы после расстановки всех фигурок никакие две фигурки одного цвета не находились в соседних ячейках. Две ячейки доски считаются соседними тогда и только тогда, когда у них есть общая сторона.

Ваша задача — найти любое подходящее расположение фигурок на данной доске.

Входные данные

В первой строке записано два целых числа через пробел, n и m (1 ≤ n, m ≤ 100).

В каждой из следующих n строк записано m символов: j-й символ i-й строки — это либо «.», либо «-». Символ «.» обозначает, что соответствующая ячейка (в i-й строке и j-м столбце) хорошая, в то время как «-» обозначает, что ячейка плохая.

Выходные данные

Выведите n строк, в каждой строке выведите m символов. При этом, j-й символ i-й строки должен равняться либо «W», либо «B», либо «-». Символ «W» означает, что фигурка в ячейке белая, «B» означает, что фигурка черная, «-» означает, что ячейка плохая.

Если существует несколько ответов, выведите любой из них. Гарантируется, что хотя бы один ответ существует.

Примечание

В первом примере DZY ставит в единственную хорошую ячейку черную фигурку. Конечно, фигурка могла бы быть и белой.

Во втором примере все 4 ячейки хорошие. В ответе на этот тестовый пример никакие две фигурки одного цвета не стоят в соседних ячейках.

В третьем примере никакие две хорошие ячейки не являются соседними. Таким образом, можно поставить на доску 3 фигурки любого цвета.

B. DZY любит химию

жадные алгоритмы поиск в глубину и подобное снм *1400

DZY любит химию, он обожает смешивать химикаты.

У DZY есть n химических веществ, m пар из них реагируют друг с другом. Он хочет вылить все эти вещества в пробирку одно за другим в некотором порядке.

Определим величину опасности вещества в пробирке. Опасность пустой пробирки равна 1. Каждый раз, когда DZY подливает в пробирку вещество, которое реагирует хотя бы с одним веществом, уже находящимся в данный момент в пробирке, опасность вещества пробирки умножается на 2. В противном случае опасность не изменяется.

Какую максимально возможную опасность вещества можно получить в итоге, после выливания в пробирку всех n веществ в оптимальном порядке?

Входные данные

В первой строке записано два целых числа через пробел, n и m .

В каждой из следующих m строк записано два целых числа через пробел, xi и yi (1 ≤ xi < yi ≤ n). Эти числа обозначают, что вещество xi вступит в реакцию с веществом yi. Любая пара реагирующих веществ встречается во входных данных не более одного раза.

Считайте, что все вещества пронумерованы от 1 до n в некотором порядке.

Выходные данные

Выведите единственное целое число — максимальную возможную опасность.

Примечание

В первом примере существует один способ смешать вещества, опасность при нем не возрастет.

Во втором примере порядок не имеет значения. В обоих случаях опасность будет равняться 2.

В третьем примере есть четыре способа достичь максимально возможной опасности: 2-1-3, 2-3-1, 1-2-3 и 3-2-1 (номера веществ в порядке наливания в пробирку).

E. Про делители

Перебор поиск в глубину и подобное реализация теория чисел *2200

Бизон-Чемпион не только дружелюбный, но и любит программировать.

Определим функцию f(a), где a последовательность целых положительных чисел. Функция f(a) возвращает следующую последовательность: сначала идут все делители a1 в порядке возрастания, затем идут все делители a2 в порядке возрастания, и так далее до последнего элемента последовательности a. Например f([2, 9, 1]) = [1, 2, 1, 3, 9, 1].

Определим последовательность Xi, для целых i (i ≥ 0): X0 = [X] ([X] — это последовательность, состоящая из одного числа X), Xi = f(Xi - 1) (i > 0). Например, при X = 6 получится X0 = [6], X1 = [1, 2, 3, 6], X2 = [1, 1, 2, 1, 3, 1, 2, 3, 6].

Для заданных чисел X и k найдите последовательность Xk. Так как ответ может быть слишком большим, найдите только первые 105 элементов этой последовательности.

Входные данные

В единственной строке содержатся два целых числа, разделенных пробелом — X (1 ≤ X ≤ 1012) и k (0 ≤ k ≤ 1018).

Выходные данные

Выведите элементы последовательности Xk в одной строке через пробел. Если количество элементов превосходит 105, то выведите только первые 105 элементов.

C. Маленькая пони и торжество летнего солнца

графы Конструктив поиск в глубину и подобное *2200

Twilight Sparkle узнала, что злая Nightmare Moon вернется во время предстоящего торжества летнего солнца после тысячелетнего заточения на луне. Она попыталась предупредить свою наставницу, принцессу Celestia, но принцесса проигнорировала ее и отправила в Ponyville, проверить как идет подготовка к торжеству.

Twilight Sparkle хочет выследить Nightmare Moon. К сожалению, она не знает, каким именно путем пойдет Nightmare Moon. К счастью, для каждого места в Ponyville Twilight Sparkle знает: четное или нечетное количество раз посетит его Nightmare Moon. Можете ли вы помочь Twilight Sparkle найти любой путь, который будет удовлетворять этим данным?

Ponyville может быть представлен как неориентированный граф без петлей и мульти-ребер (вершины — это места в Ponyville, ребра — это дороги, соединяющие места). Разрешается начать и закончить путь в любых местах (также, возможно, путь будет пустой). Одно место можно посетить несколько раз. Путь не должен посетить больше, чем 4n мест Ponyville.

Входные данные

Первая строка содержит два целых числа, n и m (2 ≤ n ≤ 105; 0 ≤ m ≤ 105) — количество мест и дорог в Ponyville. Каждая из следующих m строк содержит два целых числа: ui, vi (1 ≤ ui, vi ≤ nui ≠ vi), эти числа обозначают дорогу между местами ui и vi.

Следующая строка содержит n целых чисел: x1, x2, ..., xn (0 ≤ xi ≤ 1) — четность количества посещений для каждого места. Если xi = 0, то i-е место нужно посетить четное число раз, иначе — нечетное число раз.

Выходные данные

Выведите число посещенных мест k в первой строке (0 ≤ k ≤ 4n). Затем выведите k целых чисел — номера мест в порядке посещения их путем. Если xi = 0, то в данном пути место i должно встретиться четное число раз, иначе i-е место должно встретиться в нем нечетное число раз. Обратите внимание, что система дорог Ponyville не содержит петель, поэтому в выведенном пути любые два соседних места должны быть различны.

Если требуемого пути не существует, выведите -1. Если существует несколько правильных путей, можете вывести любой из них.

B. Много игр

Деревья дп игры поиск в глубину и подобное реализация Строки *1900

Андрей, Федя и Леша — очень изобретательные ребята. В очередной раз они придумали игру для двоих игроков со строками.

Задан набор, состоящий из n непустых строк. Во время игры два игрока вместе строят слово, изначально это слово пустое. Игроки ходят по очереди. За свой ход игрок должен дописать в конец слова одну букву так, чтобы полученное слово было префиксом хотя бы одной строки из заданного набора. Проигрывает тот, кто не может сделать ход.

Андрей и Леша решили сыграть в эту игру k раз. Причем, игрок, проигравший в i-й игре, делает первый ход в (i + 1)-й игре. Ребята решили, что победителем по сумме всех игр будет считаться тот, кто победил в последней (k-й) игре. Андрей и Леша уже начали играть, а Федя в это время решил посчитать: кто будет победителем, если оба игрока будут играть оптимально. Помогите ему.

Входные данные

Первая строка содержит два целых числа, n и k (1 ≤ n ≤ 105; 1 ≤ k ≤ 109).

Каждая из n следующих строк содержит непустую строку из заданного набора. Суммарная длина всех строк из набора не превышает 105. Все строки из набора состоят только из строчных латинских букв.

Выходные данные

Если победит игрок, который ходит первым, то выведите «First», иначе выведите «Second» (кавычки выводить не нужно).

C. Цивилизация

Деревья дп поиск в глубину и подобное снм Тернарный поиск *2100

Андрей играет в игру «Цивилизация». Дима помогает ему.

В игре «Цивилизация» n городов и m двусторонних дорог. Города пронумерованы целыми числами от 1 до n. Между любой парой городов либо существует единственный путь, либо не существует никакого пути. Путем называется последовательность различных городов v1, v2, ..., vk, в которой между любыми двумя соседними городами vi и vi + 1 (1 ≤ i < k) есть дорога. Длина такого пути равна (k - 1). Давайте говорить, что два города лежат в одной области тогда и только тогда, когда существует путь между этими двумя городами.

В процессе игры происходят события двух типов:

  1. Андрей спрашивает у Димы длину самого длинного пути в области, в которой лежит город x.
  2. Андрей просит Диму объединить область, в которой лежит город x, с областью, в которой лежит город y. Если города лежат в одной области, то объединять области не нужно. Иначе нужно объединить области следующим образом: выбрать город в первой области, город во второй области и связать их дорогой так, чтобы минимизировать длину самого длинного пути в полученной области. Если существует несколько оптимальных способов соединить области, то разрешается выбрать любой.

Диме очень сложно выполнять просьбы Андрея, поэтому он обращается к вам за помощью. Помогите Диме.

Входные данные

В первой строке содержатся три целых числа n, m, q (1 ≤ n ≤ 3·105; 0 ≤ m < n; 1 ≤ q ≤ 3·105) — количество городов, количество уже имеющихся дорог и количество событий соответственно.

Каждая из следующих m строк содержит два целых числа ai и bi (ai ≠ bi; 1 ≤ ai, bi ≤ n). Эти числа обозначают дорогу между городами ai и bi. Между двумя городами не может быть более одной дороги.

Каждая из следующих q строк содержит одно из двух событий в следующем формате:

  • 1 xi. Запрос Андрея к Диме на нахождение длины максимального пути в области, содержащей город xi (1 ≤ xi ≤ n).
  • 2 xi yi. Запрос Андрея к Диме на объединение области, содержащей город xi, и области, содержащей город yi (1 ≤ xi, yi ≤ n). Обратите внимание, что xi может быть равно yi.
Выходные данные

Для каждого события первого типа выведите ответ на него в отдельной строке.

B. Яблов и дерево

Деревья дп поиск в глубину и подобное *2000

У Яблова есть дерево, состоящее из n вершин. Некоторые вершины (по крайней мере одна) покрашены в черный цвет, остальные вершины покрашены в белый цвет.

Рассмотрим множество, состоящее из k (0 ≤ k < n) ребер этого дерева. Если Яблов удалит эти ребра из дерева, то дерево распадется на (k + 1) частей. Каждая часть также будет представлять из себя дерево с покрашенными вершинами.

Теперь Яблову интересно, сколько существует множеств, в результате удаления ребер которых в каждой получившейся части будет ровно одна черная вершина? Выведите это количество по модулю 1000000007 (109 + 7).

Входные данные

В первой строке записано целое число n (2  ≤ n ≤ 105) — количество вершин дерева.

Во второй строке содержится описание дерева: n - 1 целых чисел p0, p1, ..., pn - 2 (0 ≤ pi ≤ i). Где pi означает, что существует ребро, соединяющее вершину (i + 1) и вершину pi дерева. Считайте, что вершины дерева пронумерованы от 0 до n - 1.

В третьей строке записано описание раскраски вершин дерева: n целых чисел x0, x1, ..., xn - 1 (xi равняется либо 0, либо 1). Если xi равняется 1, вершина i покрашена в черный цвет. В противном случае, вершина i покрашена в белый цвет.

Выходные данные

Выведите единственное целое число — количество требуемых множеств по модулю 1000000007 (109 + 7).

D. Gargari и перестановки

графы дп поиск в глубину и подобное реализация *1900

Gargari надоело играть со слонами на шахматной доске из предыдущей задачи, теперь он собирается сделать домашнюю работу по математике. В его учебнике по математике записаны k перестановок. Каждая перестановка — это последовательность чисел 1, 2, ..., n, записанных в некотором порядке. Gargari должен найти длину наибольшей общей подпоследовательности этих k перестановок. Сможете ли вы ему помочь?

Определение задачи о наибольшей общей подпоследовательности можно найти по ссылке: https://ru.wikipedia.org/wiki/Наибольшая_общая_подпоследовательность

Входные данные

В первой строке записаны два целых числа n и k (1 ≤ n ≤ 1000; 2 ≤ k ≤ 5). В каждой из следующих k строк записаны целые числа 1, 2, ..., n в некотором порядке — описание текущей перестановки.

Выходные данные

Выведите длину наибольшей общей подпоследовательности.

Примечание

В первом тестовом примере наибольшая общая подпоследовательность: [1, 2, 3].

E. Caisa и дерево

Деревья математика Перебор поиск в глубину и подобное теория чисел *2100

Caisa сейчас дома и его сын придумал для него простую задачку.

Задано корневое дерево, состоящее из n вершин, пронумерованных от 1 до n (вершина 1 — корень дерева). В каждой вершине записано некоторое значение. Требуется ответить на q запросов. Каждый запрос является одним из следующих:

  • Формат запроса «1 v». Выпишем последовательность вершин вдоль пути от корня до вершины v: u1, u2, ..., uk (u1 = 1; uk = v). Выведите такую вершину ui, что gcd(значение вершины ui, значение вершины v) > 1 и i < k. Если существует несколько таких вершин, выведите вершину с максимальным значением i. Если таких вершин вовсе нет, выведите -1.
  • Формат запроса «2 v w». Нужно изменить значение, записанное в вершине v, на w.

Вам заданы все запросы, помогите Caisa справиться с этой задачей.

Входные данные

В первой строке записаны два целых числа n, q (1 ≤ n, q ≤ 105).

Вторая строка содержит n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 2·106), где ai обозначает значение, записанное в вершине i изначально.

В каждой из следующих n - 1 строк записаны два целых числа xi и yi (1 ≤ xi, yi ≤ nxi ≠ yi), обозначающие, что в дереве есть ребро между вершинами xi и yi.

В каждой из следующих q строк задан запрос в формате, описанном выше. Для каждого запроса выполняются следующие неравенства: 1 ≤ v ≤ n и 1 ≤ w ≤ 2·106. Обратите внимание: не более 50 запросов из всех меняют значение в вершине.

Выходные данные

Для каждого запроса первого типа выведите ответ на него.

Примечание

Запись gcd(x, y) обозначает наибольший общий делитель целых чисел x и y.

E. Граф информаций

графы Деревья поиск в глубину и подобное снм *2100

В компании «X» работает n сотрудников (для удобства пронумеруем их от 1 до n). Изначально, не было никаких отношений между сотрудниками. В каждый из m следующих дней происходило одно из событий:

  • либо сотрудник y стал начальником сотрудника x (при этом у сотрудника x не было начальника до этого события);
  • либо сотруднику x передают пакет документов и он подписывает их; затем передает их своему начальнику, затем начальник подписывает документы и передает их своему начальнику и так далее (последний человек, подписавший документы, отправляет их в архив);
  • либо приходит запрос вида «определить, подписывался ли сотрудник x на определенных документах».

Ваша задача написать программу, которая по заданным событиям будет отвечать на запросы, описанного вида. При этом гарантируется, что на протяжении всего времени работы компании не было циклических зависимостей.

Входные данные

Первая строка содержит два целых числа n и m (1 ≤ n, m ≤ 105) — количество сотрудников в компании и количество событий.

Каждая из следующих m строк содержит описание одного события (события заданы в хронологическом порядке). Первое число строки обозначает тип события t (1 ≤ t ≤ 3).

  • Если t = 1, далее следуют два целых числа x и y (1 ≤ x, y ≤ n) — номера сотрудников компании, между которыми появились отношения вида подчиненный-начальник. Гарантируется, что сотрудник x на данный момент не имеет начальника.
  • Если t = 2, далее следует целое число x (1 ≤ x ≤ n) — номер сотрудника, который получил очередной пакет документов.
  • Если t = 3, далее следуют два целых числа x и i (1 ≤ x ≤ n; 1 ≤ i ≤ [количество уже переданных пакетов]) — сотрудник и номер пакета документов, про который требуется узнать информацию. Пакеты документов нумеруются, начиная от 1, в хронологическом порядке.

Гарантируется, что во входных данных встречается хотя бы один запрос третьего типа.

Выходные данные

Для каждого запроса третьего типа выведите «YES», если сотрудник подписывал пакет документов, и «NO» в ином случае. Все слова выводите без кавычек.

D. Федя и реферат

графы дп поиск в глубину и подобное Строки хэши *2400

После того, как вы помогли Феде найти друзей в игре «Call of Soldiers 3», он совсем перестал учиться. Сегодня преподаватель английского в качестве домашнего задания попросил Федю подготовить реферат. Федя не хотел готовить реферат, поэтому он попросил Лешу о помощи. Леша написал реферат за Федю, но Феде он совсем не понравился. Теперь Федя собирается немного изменить реферат, используя словарь синонимов английского языка.

Федя не хочет менять смысл реферата, поэтому единственное изменение, которое он будет делать: менять слово на один из его синонимов, используя правило замены из словаря. Эту операцию Федя может выполнять любое количество раз.

В итоге Федя хочет получить реферат, который, во-первых, содержит как можно меньше букв «R» (регистр не важен), а во-вторых, из всех рефератов с минимальным количеством букв «R» имеет минимальную длину (длина реферата — это сумма длин всех слов в нем). Помогите Феде получить требуемый реферат.

Обратите внимание, что в этой задаче регистр букв не имеет значения. Например, если в словаре синонимов записано, что слово cat можно заметить на слово DOG, то разрешается заменить слово Cat на слово doG.

Входные данные

В первой строке содержится целое число m (1 ≤ m ≤ 105) — количество слов в тексте реферата. Во второй строке записаны слова реферата. Слова разделяются в строке одним пробелом. Гарантируется, что суммарная длина слов не превысит 105.

В следующей строке содержится единственное целое число n (0 ≤ n ≤ 105) — количество пар синонимов в словаре синонимов. В последующих n строках содержатся пары синонимов. В i-й строке записаны две непустые строки xi и yi, которые обозначают, что слово xi можно заменить на слово yi (но не наоборот). Гарантируется, что суммарная длина всех пар синонимов не превысит 5·105.

Все слова во входных данных могут состоять только из строчных и прописных букв английского алфавита.

Выходные данные

Выведите два целых числа — минимальное количество букв «R» в полученном реферате и минимальная длина полученного реферата.

B. Два множества

2-sat жадные алгоритмы Паросочетания поиск в глубину и подобное снм *2000

У Little X есть n различных целых чисел: p1, p2, ..., pn. Он хочет так разделить все числа на два множества, A и B, чтобы выполнялись условия:

  • Если число x принадлежит множеству A, то число a - x также должно принадлежать множеству A.
  • Если число x принадлежит множеству B, то число b - x также должно принадлежать множеству B.

Помогите Little X разделить числа на два множества или определите, что это невозможно.

Входные данные

В первой строке записано три целых числа через пробел n, a, b (1 ≤ n ≤ 105; 1 ≤ a, b ≤ 109). В следующей строке записано n различных целых чисел через пробел p1, p2, ..., pn (1 ≤ pi ≤ 109).

Выходные данные

Если способ разделения чисел на два множества существует, то выведите "YES" в первой строке. Затем выведите n целых чисел: b1, b2, ..., bn (bi равняется либо 0, либо 1), описывающих разделение. Если bi равняется 0, то pi принадлежит множеству A, в противном случае оно принадлежит множеству B.

Если это невозможно, выведите "NO" (без кавычек).

Примечание

Допустимо следующее разбиение: все числа содержатся в одном множестве, а второе множество пустое.

D. Уроки дизайна задач: обратные задачи

Деревья кратчайшие пути поиск в глубину и подобное снм *1900

Помимо прочего, можно придумывать новые задачи, решая обратные задачи к старым задачам. Обратная задача — это когда в качестве входных данных даются выходные данные исходной задачи и нужно сгенерировать в качестве выходных данных такие входное данные, что решение исходной задачи на них выдавало бы заданные входные данные. Самая сложная задача Topcoder Open 2014 раунда 2C, InverseRMQ, является хорошим примером такого подхода.

Попробуем придумать новую задачу таким способом. В качестве основы используем следующую задачу: задано дерево; подсчитайте расстояние между всеми парами его вершин. Да, это просто. Но обратная версия этой задачи куда сложнее: задана матрица расстояний размера n × n. Определите, может ли данная матрица быть матрицей всех попарных расстояний между вершинами взвешенного дерева (все веса должны быть целыми положительными числами).

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 2000) — размер матрицы (и количество вершин соответствующего дерева).

В следующих n строках содержится по n целых чисел di, j (0 ≤ di, j ≤ 109) — расстояние между вершиной i и вершиной j дерева.

Выходные данные

Если такое дерево существует, выведите «YES», в противном случае выведите «NO».

Примечание

В первом примере необходимое дерево существует. Оно состоит из ребра между вершинами 1 и 2 с весом 2 и ребра между вершинами 1 и 3 с весом 7.

Во втором примере дерево не существует, потому что d1, 1 должно равняться 0, а оно равняется 1.

В третьем примере дерево не существует, потому что d1, 2 должно равняться d2, 1.

B. Сильно связный город

графы Перебор поиск в глубину и подобное реализация *1400

Рассмотрим город, в котором есть n горизонтальных улиц пересекаются с m вертикальными, формируя сетку размера (n - 1) × (m - 1). Чтобы снизить количество заторов, мэр города решил сделать каждую улицу односторонней. Это значит, что по каждой горизонтальной улице машины будут ехать либо только с запада на восток, либо только с востока на запад. Аналогично, по каждой вертикальной улице машины будут ехать либо только с севера на юг, либо только с юга на север. На любом перекрестке можно свернуть с вертикальной улицы на горизонтальную и наоборот.

Мэр города получил несколько вариантов направления улиц. Ваша задача — проверить можно ли в данном варианте добраться от любого перекрестка до любого другого перекрестка, двигаясь по дорогам в указанном для них направлении.

Входные данные

В первой строке записано два целых числа n, m, (2 ≤ n, m ≤ 20), обозначающие соответственно количество горизонтальных и вертикальных улиц.

Во второй строке записана строка длины n из символов '<' и '>' — направления горизонтальных улиц. Если очередной символ этой строки равняется '<', то соответствующая улица направлена с востока на запад, в противном случае улица направлена с запада на восток. Улицы приводятся в порядке с севера на юг.

В третьей строке записана строка длины m из символов '^' и 'v' — направления вертикальных улиц. Если очередной символ равняется '^', то улица направлена с юга на север, в противном случае улица направлена с севера на юг. Улицы приводятся в порядке с запада на восток.

Выходные данные

Если указанная схема удовлетворяет требованиям, выведите в единственной строке "YES", в противном случае выведите в единственной строке "NO".

Примечание

Рисунок в условии соответствует второму примеру.

E. Сильно связный город 2

поиск в глубину и подобное *2700

Представим город из n перекрестков и m улиц. Перекрестки пронумерованы от 1 до n.

Чтобы снизить количество заторов, мэр города решил сделать каждую улицу односторонней. Это значит, что на улице между перекрестками u и v машины могут ехать либо только от u до v, либо только от v до u.

Требуется так распределить направление дорожного движения на улицах, чтобы максимизировать количество пар (u, v), где 1 ≤ u, v ≤ n и можно достичь перекрёстка v, двигаясь из u, и проезжая по улицам в указанном направлении. Ваша задача — найти максимальное возможное количество таких пар.

Входные данные

В первой строке записаны числа n и m, (), — количество перекрестков и улиц в городе соответственно.

В каждой из следующих m строк записано по два целых числа u и v, (u ≠ v), — конечные точки очередной улицы города.

Между каждой парой перекрестков проходит не больше одной улицы. Гарантируется, что до решения мэра (когда все улицы ещё были двусторонними) было возможно добраться от любого перекрестка до любого другого.

Выходные данные

Выведите максимальное количество пар (u, v), таких, что можно достичь перекрестка v из u после распределения направления на улицах.

Примечание

В первом примере если мэр сделает первую и вторую улицу односторонними в сторону перекрестка 1, а третью и четвертую улицы — в противоположную сторону, то будет 13 пар достижимых перекрестков: {(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (2, 1), (3, 1), (1, 4), (1, 5), (2, 4), (2, 5), (3, 4), (3, 5)}

E. Волнистые числа

meet-in-the-middle Перебор поиск в глубину и подобное сортировки *2900

Волнистым числом называется такое целое положительное число, что для каждой цифры десятичного представления, не являющейся первой или последней, она либо строго больше обеих соседних с ней цифр, либо строго меньше обеих соседних с ней цифр. Например, числа 35270, 102, 747, 20 и 3 являются волнистыми, а числа 123, 1000 и 2212 — нет.

Для двух заданных целых чисел n и k требуется найти k-е по величине волнистое число r, которое делится нацело на n.

Ваша задача — написать программу для нахождения искомого числа r в случае, если оно не превосходит 1014.

Входные данные

В единственной строке содержатся два целых числа n и k, разделенных одним пробелом (1 ≤ n, k ≤ 1014).

Выходные данные

Требуется вывести единственное целое число r — ответ на задачу. Если такого числа не существует или оно больше 1014, то требуется вывести «-1» (минус единицу без кавычек).

Примечание

Значения первых четырех волнистых чисел кратных n для первого примера входных данных: 492, 615, 738 и 1845.

D. Допустимые множества

Деревья дп математика поиск в глубину и подобное *2100

Как вы, наверное, знаете, неориентированный связный граф с n вершинами и n - 1 ребрами называется деревом. Вам дано целое число d и дерево, состоящее из n вершин. С каждой вершиной i связано её значение ai.

Назовем множество S вершин дерева допустимым, если выполняются следующие условия:

  1. S является непустым множеством.
  2. S является связным множеством. Иными словами, если вершины u и v содержатся во множестве S, то все вершины, лежащие на простом пути между u и v должны также лежать в S.
  3. .

Ваша задача — посчитать количество допустимых множеств. Так как результат может быть очень большим, выведите его остаток по модулю 1000000007 (109 + 7).

Входные данные

В первой строке содержатся два целых числа через пробел, d (0 ≤ d ≤ 2000) и n (1 ≤ n ≤ 2000).

Во второй строке записано n целых положительных чисел, разделённых пробелами, a1, a2, ..., an(1 ≤ ai ≤ 2000).

В следующих n - 1 строках записано по паре целых чисел u и v (1 ≤ u, v ≤ n), обозначающих наличие ребра между u и v. Гарантируется, что данный граф является деревом.

Выходные данные

Выведите количество допустимых множеств по модулю 1000000007.

Примечание

В первом примере можно найти ровно 8 допустимых множеств: {1}, {2}, {3}, {4}, {1, 2}, {1, 3}, {3, 4} и {1, 3, 4}. Множество {1, 2, 3, 4} не является допустимым, поскольку оно не отвечает третьему условию. Множество {1, 4} отвечает третьему условию, но противоречит второму условию.

E. Туристы

графы Деревья поиск в глубину и подобное Структуры данных *3200

В Киберленде n городов, пронумерованных от 1 до n и соединенных m двунаправленных дорогами. j-я дорога соединяет города aj и bj.

В каждом городе Киберленда продаются сувениры для туристов. В частности, город i продает сувениры по цене wi.

Вам надо обработать q запросов. Запросы бывают двух типов:

  • "C a w": Цена в городе a меняется на w.
  • "A a b": Турист едет из города a в город b. Для этого он выбирает путь, при этом, турист не хочет посетить никакой город дважды. Он собирается купить сувениры в том городе, где сувениры самые дешевые (возможно, прямо в городе a или b). Вам следует вывести наименьшую возможную цену, по которой он может купить сувениры, путешествуя по некоторому простому пути.
Более формально, можно определить пути следующим образом:
  • Путь — это последовательность городов [x1, x2, ..., xk], где k — некоторое положительное число.
  • Для любых 1 ≤ i < j ≤ k, xi ≠ xj.
  • Для любого 1 ≤ i < k есть дорога, соединяющая xi и xi + 1.
  • Наименьшая стоимость на пути равна min(wx1, wx2, ..., wxk).
  • Искомый ответ — это наименьшее значение наименьших стоимостей на всех корректных путях из a в b.
Входные данные

В первой строке входного файла записано три разделённых пробелами целых числа n, m, q (1 ≤ n, m, q ≤ 105).

В следующих n строках записаны целые числа wi (1 ≤ wi ≤ 109).

В следующих m строках записано по два разделённых пробелами целых числа, aj и bj (1 ≤ aj, bj ≤ n, aj ≠ bj).

Одна и та же пара городов соединяется не более чем одной дорогой. Между любыми двумя городами всегда есть по крайней мере один корректный путь.

Далее следует q строк, в каждой из которых записано по запросу. Формат строки: "C a w" или "A a b" (1 ≤ a, b ≤ n, 1 ≤ w ≤ 109).

Выходные данные

Для каждого запроса типа "A" выведите соответствующий ответ.

Примечание

Во втором примере оптимальные пути таковы:

Из 2 в 3[2, 3].

Из 6 в 4[6, 5, 1, 2, 4].

Из 6 в 7[6, 5, 7].

Из 3 в 3[3].

B. Бал в БерлГУ

дп жадные алгоритмы Паросочетания поиск в глубину и подобное сортировки *1200

По случаю 100500-летия Берляндского государственного университета совсем скоро состоится бал! Уже n юношей и m девушек во всю репетируют вальс, менуэт, полонез и кадриль.

Известно, что на бал будут приглашены несколько пар юноша-девушка, причем уровень умений танцевать партнеров в каждой паре должен отличаться не более чем на единицу.

Для каждого юноши известен уровень его умения танцевать. Аналогично, для каждой девушки известен уровень ее умения танцевать. Напишите программу, которая определит наибольшее количество пар, которое можно образовать из n юношей и m девушек.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 100) — количество юношей. Вторая строка содержит последовательность a1, a2, ..., an (1 ≤ ai ≤ 100), где ai — умение танцевать i-го юноши.

Аналогично, третья строка содержит целое m (1 ≤ m ≤ 100) – количество девушек. В четвертой строке содержится последовательность b1, b2, ..., bm (1 ≤ bj ≤ 100), где bj — умение танцевать j-й девушки.

Выходные данные

Выведите единственное число — искомое максимальное возможное количество пар.

D. Невыносимая запутанность бытия

графы Комбинаторика Перебор поиск в глубину и подобное *1700

Томаш постоянно плутает и теряется, гуляя по улицам столицы Берляндии. Еще бы, ведь он привык, что в его родном городе для любой пары перекрестков существует ровно один способ пройти от одного к другому. В столице Берляндии это совсем не так!

Томаш подметил, что даже простые случаи неоднозначности перемещения его путают. Так, четверку различных перекрестков a, b, c и d таких, что существует два пути из a в c — один через b, а другой через d, он называет «чёртов ромб». Обратите внимание, пары перекрёстков (a, b), (b, c), (a, d), (d, c) должны быть непосредственно соединены дорогами. Схематично «чёртов ромб» изображен на рисунке ниже:

Наличие других дорог между любыми из перекрестков не делают ромб более привлекательным для Томаша, поэтому четверка перекрестков остается для него «чёртовым ромбом».

Принимая во внимание, что в столице Берляндии n перекрестков и m дорог, все из которых являются односторонними и известны наперед, найдите количество «чёртовых ромбов» в городе.

При сравнении ромбов порядок перекрестков b и d значения не имеет.

Входные данные

В первой строке входных данных записана пара целых чисел n, m (1 ≤ n ≤ 3000, 0 ≤ m ≤ 30000) — количество перекрестков и дорог соответственно. Далее в m строках перечислены дороги по одной в строке. Каждая из дорог задана парой целых чисел ai, bi (1 ≤ ai, bi ≤ n;ai ≠ bi) — номером перекрестка откуда она ведет и номером перекрестка куда она ведет. Между парой перекрестков существует не более одной дороги в каждом из двух направлений.

Не гарантируется, что из любого перекрестка можно добрать до любого другого.

Выходные данные

Выведите искомое количество «чёртовых ромбов».

D. Шоколадки

meet-in-the-middle математика Перебор поиск в глубину и подобное теория чисел *1900

Поликарпу нравится делать подарки Прасковье. Вот и сейчас он купил две плитки шоколада, каждая из них имеет форму прямоугольника из долек. Первая плитка имеет размеры a1 × b1 долек, а вторая — a2 × b2 долек.

Поликарп хочет угостить на большой перемене Прасковью одной плиткой, а вторую съесть сам. Кроме того, он хочет подчеркнуть одинаковую значимость ума Поликарпа и красоты Прасковьи, поэтому плитки должны содержать одинаковое количество долек.

Чтобы сделать плитки равными по количеству долек, Поликарп каждую минуту съедает немного шоколада. Каждую минуту он:

  • либо разламывает одну плитку ровно пополам (вертикально или горизонтально) и съедает ровно половину шоколадки,
  • либо отламывает от плитки ровно одну треть (вертикально или горизонтально) и съедает ровно треть шоколадки.

В первом случае от плитки останется половина, а во втором — две трети.

Не всегда возможны оба развития событий, а иногда бывает, что Поликарп вообще не может отломить половину или треть. Например, если плитка имеет размер 16 × 23, то от нее можно отломить половину, но нельзя одну треть. Если плитка имеет размер 20 × 18, то от нее можно отломить как половину, так и треть. Если плитка имеет размер 5 × 7, то отломить как половину так и треть невозможно.

Какое минимальное количество минут понадобится Поликарпу, чтобы сделать обе плитки одинаковыми по количеству долек в них? Найдите не только искомое минимальное количество минут, но и возможные размеры плиток после их вынужденного «уравнивания».

Входные данные

В первой строке входных данных записаны целые числа a1, b1 (1 ≤ a1, b1 ≤ 109) — первоначальные размеры первой шоколадки. Во второй строке входных данных записаны целые числа a2, b2 (1 ≤ a2, b2 ≤ 109) — первоначальные размеры второй шоколадки.

Вы можете использовать типы данных int64 (в Паскале), long long (в С++), long (в Java) для работы с большими целыми числами (превосходящими 231 - 1).

Выходные данные

В первую строку выведите m — искомое минимальное количество минут. Во вторую и третью строки выведите возможные размеры плиток после их уравнивания за m минут. Выводите размеры, используя формат, аналогичный формату входных данных. Размеры (числа в выводимых парах) выводите в любом порядке. Вторая строка должна соответствовать первой шоколадке, а третья — второй. Если решений несколько, выведите любое из них.

Если решения не существует, то выведите единственную строку с числом -1.

F. Турне по Древляндии

Деревья дп поиск в глубину и подобное Структуры данных *2200

Группа ДТП планирует беспрецедентное турне по Древляндии. Фанаты ДТП предвкушают событие и делают ставки, как много концертов даст любимая группа.

Древляндия состоит из n городов, некоторые пары из которых соединены двусторонними дорогами. Всего в этой стране n - 1 дорога. Известно, что из любого города можно добраться до любого другого. Города пронумерованы от целыми числами 1 до n. Про каждый город известна величина ri — количество жителей в нем.

Достоверно известно, что музыканты проедут по некоторому пути, давая концерты в некоторых городах вдоль этого пути. Путь музыкантов не будет проходить по одному городу дважды, каждый раз они будут переезжать в ранее не посещенный город. Таким образом музыканты проедут по некоторому пути (не посещая никакой город дважды) и в каких-то (необязательно всех) городах вдоль пути дадут концерты.

По мере турне группа планирует собирать все большие стадионы и концертные площадки, поэтому каждый раз они будут выступать в городе с большим количеством жителей, чем в городе предыдущего выступления. Иными словами, последовательность численностей населения в городах, где будут концерты, будет строго возрастающей.

В недавнем интервью лидер группы ДТП пообещал фанатам, что группа даст концерты в максимальном возможном количестве городов! Таким образом группа проедет по некоторой цепочке городов Древляндии и даст концерты в некоторых из этих городов так, что численности будут возрастать, а количество концертов будет максимально возможным.

Фанаты Древляндии судорожно пытаются понять, сколько концертов даст «ДТП» в Древляндии. Кажется, без помощи настоящего программиста не обойтись! Помогите фанатам найти искомое количество концертов.

Входные данные

В первой строке входных данных записано целое число n (2 ≤ n ≤ 6000) — количество городов в Древляндии. Следующая строка содержит n целых чисел r1, r2, ..., rn (1 ≤ ri ≤ 106), где ri — численность населения i-го города. Следующая n - 1 строка содержит описания дорог, по одной дороге в строке. Каждая из дорог задается парой целых чисел aj, bj (1 ≤ aj, bj ≤ n) — парой номеров городов, которые соединены j-й дорогой. Все числа в строках разделяются пробелами.

Выходные данные

Выведите количество городов, в которых «ДТП» даст концерты.

D. День рождения

Деревья дп поиск в глубину и подобное Структуры данных *2700

Али — младший брат Хамеда, у него завтра день рождения. Хамед хочет подарить брату подарок. Для этого он дал ему задачу по программированию и сказал, что если Али её решит, то он получит новенький ноутбук. Али ещё не такой талантливый программист как Хамед, и, хотя он обычно не жульничает, этот случай — исключение. Всё-таки на кону новенький ноутбук. Поэтому он решил в тайне от него попросить вас помочь ему. Пожалуйста, решите для Али следующую.

Вам дано взвешенное корневое дерево из n вершин. Вершина номер 1 является корнем дерева. Определим d(u, v) как сумму длин рёбер на кратчайшем пути между вершинами u и v. В частности, определим d(u, u) = 0. Также, определим S(v) для каждой вершины v как множество, содержащее все вершины u, такие, что d(1, u) = d(1, v) + d(v, u). Затем определим функцию f(u, v) по следующей формуле:

Ваша задача — вычислить f(u, v) для каждой из q данных пар вершин. Так как ответ может быть довольно большим, выведите его по модулю 109 + 7.

Входные данные

В первой строке входных данных дано целое число n (1 ≤ n ≤ 105), количество вершин дерева.

В каждой из следующих n - 1 строк записаны три целых числа через пробел — ai, bi, ci (1 ≤ ai, bi ≤ n, 1 ≤ ci ≤ 109), обозначающие, что между вершинами ai и bi есть ребро весом ci.

В следующей строке записано целое число q (1 ≤ q ≤ 105) — количество пар вершин.

В каждой из следующих q строк даны по два целых числа через пробел — ui, vi (1 ≤ ui, vi ≤ n), обозначающие, что вам требуется посчитать f(ui, vi).

Гарантируется, что данные ребра образуют дерево.

Выходные данные

Выведите q строк. В i-й строке выведите значение f(ui, vi) по модулю 109 + 7.

A. Транспорт на Новый год

графы поиск в глубину и подобное реализация *1000

Новый год приходит в Линейный мир! В этом мире есть n ячеек, пронумерованных целыми числами от 1 до n, уложенных в виде доски размером 1 × n. В ячейках живут люди. Однако, передвигаться между различными ячейками сложно, ведь выйти из ячейки — дело непростое. В то же время, люди хотят знакомиться с людьми, живущими в других ячейках.

И вот, tncks0121 придумал систему транспорта для передвижения между ячейками, чтобы люди могли отпраздновать Новый год. Сперва он задумал n - 1 положительных целых чисел a1, a2, ..., an - 1. Для каждого целого числа i, где 1 ≤ i ≤ n - 1, выполняется условие 1 ≤ ai ≤ n - i. Затем он создал n - 1 порталов, пронумерованных целыми числами от 1 до n - 1. Из них i-й (1 ≤ i ≤ n - 1) портал соединяет ячейку номер i и ячейку номер (i + ai), т. е. с его помощью можно путешествовать из ячейки i в ячейку (i + ai). К сожалению, портал не работает в обратную сторону, то есть нельзя пройти из ячейки (i + ai) в ячейку i по i-му порталу. Легко заметить, что из-за условия 1 ≤ ai ≤ n - i нельзя покинуть Линейный мир, пользуясь порталами.

Я нахожусь в ячейке 1 и хочу пройти в ячейку t. Однако я не знаю, могу ли я там оказаться. Пожалуйста, определите, могу ли я пройти в ячейку t, пользуясь только построенной системой транспорта.

Входные данные

В первой строке записано два целых числа через пробел, n (3 ≤ n ≤ 3 × 104) и t (2 ≤ t ≤ n) — количество ячеек и номер ячейки, в которую я хочу попасть.

Во второй строке записано n - 1 целых чисел через пробел a1, a2, ..., an - 1 (1 ≤ ai ≤ n - i). Гарантируется, что пользуясь данной транспортной системой, покинуть Линейный мир нельзя.

Выходные данные

Если я могу дойти до ячейки t по данной транспортной системе, выведите "YES". В противном случае, выведите "NO".

Примечание

В первом примере можно дойти до t, посетив следующие ячейки: 1, 2, 4.

Во втором примере можно посетить лишь ячейки 1, 2, 4, 6, 7, 8; значит, мы не можем попасть в требуемую ячейку 5.

B. Новогодняя перестановка

графы жадные алгоритмы математика поиск в глубину и подобное снм сортировки *1600

У пользователя ainta есть перестановка p1, p2, ..., pn. Приближается Новый год, и юноша хочет как можно лучше украсить свою перестановку.

Перестановка a1, a2, ..., an красивее перестановки b1, b2, ..., bn тогда и только тогда, когда существует целое число k (1 ≤ k ≤ n), для которого верно a1 = b1, a2 = b2, ..., ak - 1 = bk - 1 и ak < bk.

Как известно, перестановка p — очень чувствительная натура, так что её можно изменять только путем перестановки двух различных элементов. Но переставлять элементы сложнее, чем вы думаете. Вам дана матрица A размера n × n, такая что пользователь ainta может переставить значения pi и pj (1 ≤ i, j ≤ n, i ≠ j) тогда и только тогда, когда Ai, j = 1.

Дана перестановка p и матрица A. Пользователь ainta хочет знать, какая из достижимых перестановок самая красивая.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 300) — размер перестановки p.

Во второй строке записано n целых чисел через пробел p1, p2, ..., pn — перестановка p, имеющаяся у пользователя ainta. Каждое целое число от 1 до n встречается ровно один раз в данной перестановке.

Следующие n строк описывают матрицу A. При этом, i-я из них содержит n символов '0' или '1' и описывает i-ю строку A. j-й символ i-ой строки Ai, j — это элемент, находящийся на пересечении i-й строки и j-го столбца A. Гарантируется, что для всех целых чисел i, j, для которых 1 ≤ i < j ≤ n, выполняется условие Ai, j = Aj, i. Также, для всех целых чисел i, для которых 1 ≤ i ≤ n, выполняется условие Ai, i = 0.

Выходные данные

В первой и единственной строке выведите n целых чисел через пробел, описывающих самую красивую достижимую перестановку.

Примечание

В первом примере для достижения самой красивой перестановки необходимо переставить элементы (p1, p7).

Во втором примере для достижения самой красивой перестановки необходимо переставить (p1, p3), (p4, p5), (p3, p4).

Перестановка p — это последовательность целых чисел p1, p2, ..., pn, состоящая из n различных положительных целых чисел, каждое из которых не превышает n. i-й элемент перестановки p обозначается как pi. Размер перестановки p обозначается как n.

D. Новогоднее взаимодействие Санта-Клаусов

графы Деревья Комбинаторика поиск в глубину и подобное *1900

В Древесном мире наступает Новый год! В этом мире, как понятно из названия, есть n городов, соединенных n - 1 дорогой, и между каждыми двумя различными городами всегда существует путь. Города пронумерованы целыми числами от 1 до n. Дороги пронумерованы целыми числами от 1 до n - 1. Определим d(u, v) как суммарную длину дорог на пути между городом u и городом v.

Отдавая дань традиции, народ в Древесном мире ремонтирует ровно по дороге в год. В результате длина этой дороги уменьшается. Известно, что в i-м году длина ri-й дороги станет wi, что короче прежней длины этой же дороги. Предположим, что текущий год — это год 1.

Три Санта-Клауса планируют раздавать подарки всем детям Древесного мира ежегодно. Для этого им надо подготовиться, в целях чего они выберут три различных города c1, c2, c3, и создадут в каждом из этих городов по одному складу: k-й (1 ≤ k ≤ 3) Санта-Клаус будет отвечать за склад в городе ck.

Трем Санта-Клаусам очень скучно сидеть на складах поодиночке. Поэтому они решили построить сеть сообщения, предназначенную только для Сант! Затраты, необходимые для того, чтобы построить подобную сеть, равны d(c1, c2) + d(c2, c3) + d(c3, c1) долларам. Санты слишком заняты, чтобы искать лучшее место, так что они решили выбрать c1, c2, c3 случайно равновероятно среди всех троек различных чисел от 1 до n. Санты хотели бы знать математическое ожидание цены, необходимой для построения сети.

Однако, как мы сказали, каждый год длина ровно одной дороги уменьшается. Таким образом, Санты хотят просчитать математическое ожидание после каждого изменения длины. Помогите им посчитать требуемые значения.

Входные данные

В первой строке записано целое число n (3 ≤ n ≤ 105) — количество городов в Древесном мире.

В следующих n - 1 строках описаны дороги. В i-ой из этих строк (1 ≤ i ≤ n - 1) записаны три целых числа через пробел ai, bi, li (1 ≤ ai, bi ≤ n, ai ≠ bi, 1 ≤ li ≤ 103), обозначающих, что i-я дорога соединяет города ai и bi, а длина i-й дороги равна li.

В следующей строке записано целое число q (1 ≤ q ≤ 105) — количество изменений длин дорог.

Следующие q строк описывают изменения длин. В j-й из них (1 ≤ j ≤ q) записано два целых числа через пробел — rj, wj (1 ≤ rj ≤ n - 1, 1 ≤ wj ≤ 103). Это означает, что после j-го ремонта длина rj-й дороги равняется wj. Гарантируется, что wj меньше длины rj-й дороги на тот год. Одну и ту же дорогу можно ремонтировать несколько раз.

Выходные данные

Выведите q чисел. После каждого из изменений выведите строку с математическим ожиданием цены, необходимой для постройки сети сообщения в Древесном мире. Ответ будет считаться корректным, если его абсолютная или относительная погрешность не превышают 10 - 6.

Примечание

Рассмотрим первый пример. Есть 6 троек: (1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1). Так как n = 3, затраты на построение сети всегда равны d(1, 2) + d(2, 3) + d(3, 1) для всех троек. Таким образом, матожидание стоимости равняется d(1, 2) + d(2, 3) + d(3, 1).

E. Миша и LCP на дереве

Бинарный поиск Деревья поиск в глубину и подобное строковые суфф. структуры хэши *3000

У Миши есть дерево с написанными на вершинах символами. Он может выбрать две вершины s и t этого дерева и записать символы, соответствующие вершинам дерева, лежащим на пути из s в t. Будем говорить, что такая строка соответствует паре (s, t).

У Миши есть m запросов вида: дано 4 вершины a, b, c, d; необходимо найти наибольший общий префикс строк, соответствующих парам (a, b) и (c, d). Ваша задача — помочь ему.

Входные данные

В первой строке дано целое число n (1 ≤ n ≤ 300 000) — количество вершин в дереве.

Далее следует строка, состоящая из n маленьких латинских букв. i-й символ строки соответствует символу, написанному на i-й вершине.

В последующих n - 1 строках находится информация о ребрах. Ребро задается парой чисел u, v (1 ≤ u, v ≤ n, u ≠ v), разделенных пробелом.

В следующей строке дано целое число m (1 ≤ m ≤ 1 000 000) — количество запросов.

В последующих m строках находится информация о запросах. Запрос задается четырьмя числами a, b, c, d (1 ≤ a, b, c, d ≤ n), разделенными пробелами.

Выходные данные

На каждый запрос выведите длину наибольшего общего префикса в отдельной строке.

B. Цветной граф мистера Китаюта

графы дп поиск в глубину и подобное снм *1400

Мистер Китаюта недавно приобрёл неориентированный граф, состоящий из n вершин и m ребер. Вершины графа пронумерованы от 1 до n. Ребро i окрашено в цвет ci и соединяет вершины ai и bi.

Мистер Китаюта хочет, чтобы вы обработали q запросов следующего вида.

В i-м запросе он дает вам два целых числа — ui и vi. Вам требуется найти количество цветов, таких, что ребра этого цвета непосредственно или косвенно соединяют вершины ui и vi (т. е. по рёбрам только этого цвета можно добраться от вершины ui до вершины vi).

Входные данные

В первой строке следуют два целых числа через пробел — n и m (2 ≤ n ≤ 100, 1 ≤ m ≤ 100), обозначающие количество вершин и количество ребер, соответственно.

В следующих m строках следуют три целых числа через пробел — ai, bi (1 ≤ ai < bi ≤ n) и ci (1 ≤ ci ≤ m). Обратите внимание, что между двумя вершинами может быть несколько ребер. Однако между двумя вершинами не может быть нескольких ребер одного цвета, таким образом, если i ≠ j, то (ai, bi, ci) ≠ (aj, bj, cj).

В следующей строке записано целое число — q (1 ≤ q ≤ 100), обозначающее количество запросов.

Затем следует q строк по два целых числа через пробел — ui и vi (1 ≤ ui, vi ≤ n). Гарантируется, что ui ≠ vi.

Выходные данные

Для каждого запроса выведите ответ в отдельной строке.

Примечание

Рассмотрим первый пример.

Рисунок выше иллюстрирует первый пример.
  • Вершина 1 и вершина 2 соединены цветами 1 и 2.
  • Вершина 3 и вершина 4 соединены цветом 3.
  • Вершина 1 и вершина 4 не соединены никаким цветом.

C. Мистер Китаюта, охотник за сокровищами

дп поиск в глубину и подобное *1900

Острова Шусеки — это архипелаг из 30001 маленького острова в море Ютампо. Острова располагаются на одной прямой через равные интервалы и пронумерованы от 0 до 30000 с запада на восток. Известно, что на этих островах зарыто много сокровищ. Всего на островах Шусеки находится n драгоценных камней, i-й камень расположен на острове pi.

Мистер Китаюта только что прибыл на остров 0. Будучи отличным прыгуном, он совершит несколько прыжков между островами на восток согласно следующему процессу:

  • Сначала он перепрыгнет с острова 0 на остров d.
  • Затем он продолжит прыжки следующим образом. Пусть длина предыдущего прыжка равняется l, т. е., если его предыдущий прыжок был с острова prev на остров cur, пусть l = cur - prev. Следующим шагом он совершит прыжок длины l - 1, l или l + 1 к востоку. Таким образом, он прыгнет на остров (cur + l - 1), (cur + l) или (cur + l + 1) (конечно, в случае, если соответствующего острова не существует, прыгнуть нельзя). Длины прыжков должны быть положительными, то есть, нельзя совершить прыжок длины 0, если сейчас l = 1. Если корректного пункта назначения нет, то прыжки прекращаются.

Мистер Китаюта собирает камни на островах, которые он посещает в процессе. Найдите максимальное количество камней, которые он может собрать.

Входные данные

В первой следуют два целых числа через пробел, n и d (1 ≤ n, d ≤ 30 000), обозначающих количество драгоценных камней на островах Шусеки и длину первого прыжка мистера Китаюта, соответственно.

В следующих n строках следуют расположения драгоценных камней. В i-й из них (1 ≤ i ≤ n) записано целое число pi (d ≤ p1 ≤ p2 ≤ ... ≤ pn ≤ 30 000), обозначающее номер острова, содержащего i-й драгоценный камень.

Выходные данные

Выведите максимальное количество драгоценных камней, которые может собрать мистер Китаюта.

Примечание

В первом примере оптимальный маршрут: 0  →  10 (+1 камень)  →  19  →  27 (+2 камня)  → ...

Во втором примере оптимальный маршрут: 0  →  8  →  15  →  21 →  28 (+1 камень)  →  36 (+1 камень)  →  45 (+1 камень)  →  55 (+1 камень)  →  66 (+1 камень)  →  78 (+1 камень)  → ....

В третьем примере оптимальный маршрут: 0  →  7  →  13  →  18 (+1 камень)  →  24 (+2 камня)  →  30 (+1 камень)  → ...

D. Технология мистера Китаюта

поиск в глубину и подобное *2200

Королевство Шусеки — ведущая мировая нация в области инноваций и технологий. В королевстве есть n городов, пронумерованных от 1 до n.

Благодаря исследованию мистера Китаюты, наконец-то стало возможно сооружать телепортационные туннели между двумя городами. Телепортационный туннель соединяет два города в одном направлении, то есть, телепортационный туннель из города x в город y не может доставить из города y в город x. Можно последовательно путешествовать по нескольким туннелям, например, если построить туннель из города x в город y, а также туннель из города y в город z, то можно мгновенно путешествовать из города x в город z.

Мистер Китаюта также занимается национальной политикой. Он считает, что наличие транспорта между m парами городов (ai, bi) (1 ≤ i ≤ m) очень важно. Он планирует соорудить телепортационные туннели так, чтобы для каждой важной пары (ai, bi) было возможно пропутешествовать из города ai в город bi по одному или более телепортационным туннелям (при этом необязательно, чтобы из города bi можно было добраться в город ai). Найдите минимальное количество телепортационных туннелей, которые необходимо построить. Пока что между городами не построили ни одного телепортационного туннеля, а другого эффективного междугороднего транспорта нет.

Входные данные

В первой строке записано два целых числа через пробел, n и m (2 ≤ n ≤ 105, 1 ≤ m ≤ 105), обозначающих количество городов в королевстве Шусеки и количество важных пар, соответственно.

В следующих m строках описаны важные пары. В i-й из них (1 ≤ i ≤ m) записано два целых числа через пробел, ai и bi (1 ≤ ai, bi ≤ n, ai ≠ bi), обозначающих, что должно быть возможно путешествовать из города ai в город bi через один или более телепортационных туннелей. Гарантируется, что все пары (ai, bi) различны.

Выходные данные

Выведите минимальное требуемое количество телепортационных туннелей для выполнения цели мистера Китаюты.

Примечание

В первом примере один из оптимальных способов построить туннели показан на рисунке ниже:

Для второго примера один из оптимальных способов указан ниже:

D. Цветной граф мистера Китаюта

графы Перебор поиск в глубину и подобное снм *2400

Мистер Китаюта только что приобрёл неориентированный граф, состоящий из n вершин и m ребер. Вершины графа пронумерованы от 1 до n. i-е ребро, соединяющее вершины ai и bi, окрашено в цвет ci.

Мистер Китаюта хочет, чтобы вы обработали следующие q запросов.

i-й запрос состоит из двух целых чисел — ui и vi.

Найдите количество цветов, таких, что ребра этого цвета непосредственно или косвенно соединяют вершину ui и вершину vi (т. е. по рёбрам только этого цвета можно добраться от вершины ui до вершины vi).

Входные данные

В первой строке следуют два целых числа через пробел — n и m (2 ≤ n ≤ 105, 1 ≤ m ≤ 105), обозначающих количество вершин и количество ребер, соответственно.

В следующих m строках следуют три целых числа через пробел — ai, bi (1 ≤ ai < bi ≤ n) и ci (1 ≤ ci ≤ m). Обратите внимание, что между двумя вершинами может быть несколько ребер. Однако между двумя вершинами не может быть нескольких ребер одного цвета, то есть, если i ≠ j, то (ai, bi, ci) ≠ (aj, bj, cj).

В следующей строке записано целое число — q (1 ≤ q ≤ 105), обозначающее количество запросов.

Затем следуют q строк, содержащих по два целых числа через пробел — ui и vi (1 ≤ ui, vi ≤ n). Гарантируется, что ui ≠ vi.

Выходные данные

Для каждого запроса выведите ответ на отдельной строке.

Примечание

Рассмотрим первый пример.

Рисунок выше иллюстрирует первый пример.
  • Вершина 1 и вершина 2 соединены цветами 1 и 2.
  • Вершина 3 и вершина 4 соединены цветом 3.
  • Вершина 1 и вершина 4 не соединены никаким цветом.

E. Во все лёгкие

графы дп кратчайшие пути поиск в глубину и подобное *2100

Во все лёгкие — это новая компьютерная игра, о которой мечтает много геймеров. В этой игре есть один уровень, сложный даже для опытного игрока.

Уолтер Вильям, главный персонаж игры, хочет вступить в банду под названием Los Hermanos (Братья). Эта банда держит под контролем всю страну, состоящую из n городов, соединенных m двусторонними дорогами. Никакая дорога не соединяет город с самим собой, и для любых двух городов их соединяет не более одной дороги. Страна связная, иными словами, по дорогам можно из любого города добраться до любого другого.

Не по всем дорогам можно проехать. Некоторым дорогам для полной функциональности необходим ремонт.

Банда собирается ограбить банк! Банк находится в городе 1. Как обычно, самое сложное — это вернуться в свою штаб-квартиру, где полиция их не достанет. Штаб-квартира банды находится в городе n. Чтобы завоевать доверие банды, Уолтер взял операцию на себя и придумал хитроумный план.

Во-первых, путь, по которому надо возвращаться из города 1 в их штаб-квартиру n, должен быть как можно короче, так как очень важно завершить операцию как можно быстрее.

Затем, в качестве подготовки к операции банда должна взорвать все остальные дороги в стране, не лежащие на их пути, чтобы полиция не могла послать подкрепления. Если дорога к моменту операции не работает, взрывать её не нужно, так как по ней и так не проехать.

Если на выбранном пути находится несколько неработающих дорог, их надо отремонтировать перед операцией.

Уолтер обнаружил, что может быть несколько возможных путей минимальной длины, так что он решил выбрать среди них такой путь, который минимизирует общее количество дорог, над которыми банде придётся потрудиться (т. е. взорвать или отремонтировать).

Помогите Уолтеру завершить задание и завоевать доверие банды.

Входные данные

В первой строке входа записано два целых числа n, m (2 ≤ n ≤ 105, ), количество городов и количество дорог, соответственно.

В следующих m строках даны описания дорог. Каждое описание состоит из трех целых чисел x, y, z (1 ≤ x, y ≤ n, ), обозначающих, что между городами x и y есть дорога, работающая, если z = 1, или неисправная, если z = 0.

Выходные данные

В первой строке выведите единственное целое число k, минимальное возможное количество дорог, над которые банде придётся затронуть.

В следующих k строках выведите по три целых числа, описывающих дорогу, которую придётся затронуть. В каждой строке должно быть записано три целых числа, x, y, z (1 ≤ x, y ≤ n, ), номера городов, соединенных дорогой, и новое состояние дороги. z = 1 означает, что дорогу между городами x и y надо отремонтировать, а z = 0 означает, что дорогу надо взорвать.

Дороги можно выводить в любом порядке. Каждую затронутую дорогу следует вывести ровно один раз. Города, соединяемые дорогой, разрешается выводить в любом порядке. Если вы выводите дорогу, то её исходное состояние должно отличаться от z.

После исполнения вашего плана в стране должны остаться только рёбра, лежащие на одном кратчайшем пути из 1 в n.

Если есть несколько оптимальных вариантов ответа, выведите любой из них.

Примечание

В первом тесте единственный путь — 1 - 2

Во втором тесте единственный кратчайший путь — 1 - 3 - 4

В третьем тесте есть несколько кратчайших путей, но оптимальный из них — 1 - 4 - 6 - 8

D. Таня и пароль

графы поиск в глубину и подобное *2500

Пока папа был на работе, маленькая девочка Таня решила поиграть с папиным паролем к секретной базе данных. Папин пароль представляет собой строку, состоящую из n + 2 символов. Она выписала все возможные n трёхбуквенных подстрок пароля на бумажки, по одной на каждую бумажку, а сам пароль выкинула. Каждая трёхбуквенная подстрока была выписана на бумажки столько раз, сколько она встречалась в пароле. Таким образом, в итоге у Тани оказалось n бумажек.

Потом Таня поняла, что папа расстроится, если узнает о ее игре, и решила восстановить пароль или, по крайней мере, хотя бы какую-то строку, соответствующую получившемуся набору трёхбуквенных строк. Вам предстоит помочь ей в этой непростой задаче. Известно, что папин пароль состоял из строчных и заглавных букв латинского алфавита, а также из цифр. Строчные и заглавные буквы латинского алфавита считаются различными.

Входные данные

В первой строке следует целое число n (1 ≤ n ≤ 2·105), количество трёхбуквенных подстрок, которые получились у Тани.

Следующие n строк каждая содержат по три буквы, образующие подстроку пароля папы. Каждый символ во вводе — строчная или заглавная буква латинского алфавита или цифра.

Выходные данные

Если во время игры Таня что-то напутала, и строк, соответствующих данному набору подстрок, не существует, то выведите «NO».

Если же возможно восстановить строку, соответствующую данному набору подстрок, то выведите «YES», а затем любой подходящий вариант пароля.

F. Гусеница

графы Деревья дп поиск в глубину и подобное *2800

Неориентированный граф называется гусеницей, если он является связным графом без циклов, и в нем существует такой путь, что любая вершина находится на расстоянии не более 1 от него. Гусеница может содержать петли, но не может содержать кратных ребер.

На рисунке изображен пример гусеницы:

Вам задан неориентированный граф G с которым можно производить операцию сжатия двух вершин в одну. Для этого выбираются любые две вершины графа a и b (a ≠ b). Из графа удаляются обе эти вершины вместе с их ребрами (инцидентными хотя бы одной из вершин a или b), но добавляется новая вершина w вместе с ребрами вида (x, w) для каждого ребра (a, w) и (b, w). Если в графе существовало ребро (a, b), то оно преобразуется в петлю (w, w). В результате операции слияния могут появляться кратные ребра и петли. Заметим, что эта операция уменьшает количество вершин графа на 1, но оставляет неизменным количество ребер в графе.

Операция сжатия двух вершин может быть неформально описана как объединение двух вершин графа в одну, с естественным преобразованием ребер графа.

С помощью последовательного применения описанной операции можно любой заданный неориентированный граф сделать гусеницей. Напишите программу, которая выведет наименьшее количество операций сжатия, чтобы заданный граф сделать гусеницей.

Входные данные

В первой строке содержится пара целых чисел n, m (1 ≤ n ≤ 2000;0 ≤ m ≤ 105), n — количество вершин в графе, а m — количество ребер в нем. Далее в m строках заданы ребра графа, по одному ребру в строке. Каждая строка содержит пару целых чисел ai, bi (1 ≤ ai, bi ≤ n;ai ≠ bi), ai, bi — номера соединяемых ребром вершин. Вершины пронумерованы от 1 до n. Между каждой парой вершин может быть не более одного ребра. Заданный граф не обязательно является связным.

Выходные данные

Выведите искомое наименьшее число операций.

B. Лиса и две точки

поиск в глубину и подобное *1500

Лиса Ciel играет в мобильную игру-головоломку под названием «Две точки». Простейшие уровни играются на доске размера n × m ячеек, выглядящей примерно вот так:

В каждой клетке нарисована точка, обозначенная некоторым цветом. Обозначим различные цвета различными заглавными буквами латинского алфавита.

Задача игрока — найти цикл, состоящий из точек одного цвета. В качестве примера можно рассмотреть обведённые четыре синих точки на картинке. Формально говоря, мы называем последовательность точек d1, d2, ..., dk циклом тогда и только тогда, когда выполняются следующие условия:

  1. Это k различных точек: если i ≠ j, то di отличается от dj.
  2. k не менее 4.
  3. Все точки окрашены в один цвет.
  4. Для всех 1 ≤ i ≤ k - 1: di и di + 1 смежные. Также, dk и d1 тоже должны быть смежные. Ячейки x и y называются смежными, если у них есть общая сторона.

Определите, есть ли на поле цикл.

Входные данные

В первой строке записано два целых числа, n и m (2 ≤ n, m ≤ 50), количество строк и столбцов доски.

Затем следуют n строк, в каждой строке записана последовательность из m символов, обозначающих цвета точек в этой строке. Каждый символ является заглавной буквой латинского алфавита.

Выходные данные

Выведите «Yes», если существует цикл, и «No» в противном случае.

Примечание

В первом примере буквы 'A' формируют цикл.

Во втором примере цикла не существует.

Третий пример изображён на картинке выше ('Y' обозначает жёлтый, 'B' — синий, 'R' — красный).

C. Лиса и имена

графы поиск в глубину и подобное сортировки *1600

Лиса Ciel собирается опубликовать статью по ЛИС (Лисооперируемым Интеллектуальным Системам). Она слышала, что список авторов научной статьи всегда сортируется в лексикографическом порядке.

После изучения примеров оформления, лиса обнаружила, что иногда это утверждение не верно. В некоторых статьях имена авторов не сортируются в лексикографическом порядке в обычном понимании. Но, оказывается, верно то, что после некоторого изменения порядка букв в алфавите, порядок авторов становится лексикографическим!

Лиса хочет знать, существует ли такой порядок букв латинского алфавита, что имена авторов предлагаемой ею статьи следуют в лексикографическом порядке. Если да, то требуется также найти любой такой порядок.

Лексикографический порядок определяется следующим образом. Мы сравниваем s и t, сперва находя крайнюю левую позицию с различающимися символами: si ≠ ti. Если такой позиции нет (то есть, s — это префикс t или наоборот), то более короткая строка меньше. В противном случае мы сравниваем символы si и ti согласно их порядку в алфавите.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 100), количество имен.

В каждой из следующих n строк записано по одному слову namei (1 ≤ |namei| ≤ 100), обозначающему i-е имя. Каждое имя содержит только строчные буквы латинского алфавита. Все имена различны.

Выходные данные

Если существует такой порядок букв, при котором имена в данном списке следуют в лексикографическом порядке, выведите любой такой порядок в виде перестановки символов 'a'–'z' (иными словами, выведите сначала первую букву модифицированного алфавита, затем вторую, и так далее).

В противном случае выведите единственное слово «Impossible» (без кавычек).

D1. Дерево с ограничениями

поиск в глубину и подобное *2400

Требуется построить бинарное дерево из n вершин, удовлетворяющее данным c ограничениям. Пусть вершины искомого бинарного дерева пронумерованы в порядке прямого обхода, начиная с 1. i-е ограничение задано в виде двух номеров ai и bi и направления — влево или вправо. В случае направления влево, bi является вершиной из поддерева с корнем в левом ребенке вершины ai. Аналогично в случае с правым направлением — тогда bi является вершиной из поддерева с корнем в правом ребёнке ai.

Входные данные

В первой строке записаны два целых числа n и c. Каждая из следующих c строк содержит 2 целых числа ai, bi (1 ≤ ai, bi ≤ n) и слово "LEFT" или "RIGHT", определяющее, в каком из поддеревьев вершины ai находится вершина bi.

Задача состоит из двух подзадач, которые отличаются друг от друга ограничениями на входные данные. За решение каждой подзадачи вы получите определенное количество баллов. Описание подзадач следует ниже.

  • В подзадаче D1 (9 баллов) будут выполняться следующие ограничения на входные данные: 1 ≤ n ≤ 100, 1 ≤ c ≤ 50.
  • В подзадаче D2 (8 баллов) будут выполняться следующие ограничения на входные данные: 1 ≤ n ≤ 1000000, 1 ≤ c ≤ 100000.
Выходные данные

Ответ должен быть выведен в единственной строке. Принимается любое бинарное дерево, удовлетворяющее данным ограничениям. Вершины дерева должны быть выведены в порядке симметричного обхода с использованием номеров, полученных при прямом обходе дерева.

Если деревьев, удовлетворяющих данным ограничениям, не существует, выведите "IMPOSSIBLE" (без кавычек).

Примечание

Рассмотрим первый пример. Требуется найти дерево из 3 вершин, удовлетворяющее следующим двум ограничениям. Вершина, получившая номер 2 при прямом обходе дерева должна находиться в левом поддереве вершины, получившей номер 1 при прямом обходе. Вершина, получившая номер 3 при прямом обходе дерева должна находиться в правом поддереве вершины, получившей номер 1. Существует единственное дерево с тремя вершинами, удовлетворяющее этим ограничениям, и его симметричный обход выглядит как (2, 1, 3).

Прямой обход — это обход всех вершин дерева в порядке «корень – левое поддерево – правое поддерево». Симметричный обход — это обход всех вершин дерева в порядке «левое поддерево – корень – правое поддерево». За более подробным описанием можно обратиться к следующему ресурсу: http://algolist.manual.ru/ds/walk.php.

G1. Инверсии

meet-in-the-middle дп Перебор поиск в глубину и подобное *1800

Вам дана перестановка из n чисел p1, p2, ..., pn. Мы совершаем k операций следующего типа: выбираем равновероятно случайным образом два индекса l и r (l ≤ r) и меняем порядок элементов pl, pl + 1, ..., pr на обратный. Ваша задача — определить математическое ожидание количества инверсий в итоговой перестановке.

Входные данные

Первая строка входных данных содержит два целых числа n и k (1 ≤ n ≤ 100, 1 ≤ k ≤ 109). Следующая строка содержит n целых чисел p1, p2, ..., pn — данную перестановку. Все pi различны и находятся в интервале от 1 до n.

Задача состоит из трех подзадач, которые отличаются друг от друга ограничениями на входные данные. За решение каждой подзадачи вы получите определенное количество баллов. Описание подзадач следует ниже.

  • В подзадаче G1 (3 балла) выполняется 1 ≤ n ≤ 6, 1 ≤ k ≤ 4.
  • В подзадаче G2 (5 баллов) выполняется 1 ≤ n ≤ 30, 1 ≤ k ≤ 200.
  • В подзадаче G3 (16 баллов) выполняется 1 ≤ n ≤ 100, 1 ≤ k ≤ 109.
Выходные данные

Выведите ответ на задачу с абсолютной или относительной погрешностью не более чем 1e - 9.

Примечание

Рассмотрим первый пример. В перестановке (1, 2, 3) (которая изначально не содержит инверсий) будет выбран один интервал и порядок его элементов будет изменен на обратный. С вероятностью , интервал будет состоять из одного элемента и перестановка не изменится. С вероятностью мы поменяем местами первые два элемента и получим перестановку (2, 1, 3) с одной инверсией. С такой же вероятностью мы можем выбрать интервал, состоящий из последних двух элементов, что приведет к перестановке (1, 3, 2), в которой тоже одна инверсия. Наконец, с вероятностью выбранный случайным образом интервал будет содержать все элементы, что приведет к перестановке (3, 2, 1) с тремя инверсиями. Таким образом, мат.ожидание количества инверсий равно .

D. Drazil и утренняя зарядка

Деревья дп поиск в глубину и подобное снм *2800

Drazil и Varda — дождевые черви. Они хотят подыскать хорошее местечко, чтобы растить детей. И вот нашли они подходящую почву с хорошей природной норой. Нора состоит из множества комнат, некоторые пары которых соединены маленькими туннелями, по которым могут перемещаться черви.

Рассмотрим комнаты и туннели как вершины и ребра в графе. Этот граф представляет собой дерево. Иными словами, между любой парой вершин существует единственный простой путь.

Каждая комната, являющаяся листом этого дерева, соединена с поверхностью вертикальным туннелем. Здесь, под листом мы подразумеваем вершину, смежную ровно с одним ребром в дереве.

В каждой комнате хватает места для проживания не более одного червя. Дождевой червь не может жить в туннеле.

Drazil и Varda подумывают воспитывать своих деток по следующему плану. Им хочется, чтобы все их дети сразу после подъема делали утреннюю зарядку!

Когда наступает утро, все червячки просыпаются в одно и то же время, затем каждый из них выбирает самый длинный путь к поверхности на собрание (как и любые дети, они ленятся делать зарядку, поэтому им всем хочется приступить к упражнениям как можно позже).

Drazil и Varda хотят, чтобы разница между моментами появления на поверхности первого и последнего червячка не превышала l (в противном случае детишки расползутся по земле и их будет сложно собрать на зарядку).

Есть дополнительное условие — комнаты, которые занимают детки, должны формировать связное множество. Иными словами, для любых двух комнат, которые занимают червячки, все комнаты, лежащие на пути из одной комнаты в другую, тоже должны быть заняты червячками.

Какое максимальное количество детей может быть у Drazil и Varda, чтобы удовлетворить всем вышеприведенным условиям? Drazil и Varda хотят знать ответ для многих различных вариантов l.

(Drazil и Varda не живут в одной норке со своими детьми)

Входные данные

В первой строке следует единственное целое число n, обозначающее количество комнат в норе (2 ≤ n ≤ 105).

Далее следуют n - 1 строка. Каждая из этих строк содержит три целых числа x, y, v (1 ≤ x, y ≤ n, 1 ≤ v ≤ 106), обозначающих туннель между комнатами x и y, на прохождение которого требуется v времени.

Считайте, что время, необходимое червяку, чтобы выползти на поверхность по вертикальному туннелю, одинаково для всех листов.

В следующей строке следует целое число q (1 ≤ q ≤ 50), обозначающее количество различных значений l, которые надо обработать.

В последней строке следуют q чисел, каждое из которых обозначает очередное значение l (1 ≤ l ≤ 1011).

Выходные данные

Выведите q строк, каждая из которых содержит единственное целое число, обозначающее ответ для очередного значения l.

Примечание

В первом примере нора выглядит следующим образом. Комнаты 1 и 5 представляют из себя листы, так что в них содержится по вертикальному туннелю, связывающему их с поверхностью. Длины наидлиннейшего пути из комнат 1 – 5 наружу равняются 12, 9, 7, 9, 12, соответственно.

При l = 1 мы можем выбрать любую одну комнату.

При l = 2..4 мы можем выбрать в качестве ответа комнаты 2, 3, и 4.

При l = 5 мы можем выбрать все комнаты.

E. A и B и аудитории

Бинарный поиск Деревья дп поиск в глубину и подобное Структуры данных *2100

A и B готовятся к олимпиадам про программированию.

Университет, в котором учатся A и B, представляет собой множество аудиторий, соединенных между собой переходами. Всего в университете n аудиторий, соединённых n - 1 переходом таким образом, что из любой аудитории можно дойти до любой по переходам. Аудитории пронумерованы от 1 до n.

Каждый день А и B пишут контесты в некоторых аудиториях своего университета, и после каждого контеста они собираются вместе в одной аудитории и обсуждают задачи. A и B хотят, чтобы расстояния от аудитории, где они будут обсуждать задачи, до аудиторий, где они пишут контесты, были равны. Расстоянием между двумя аудиториями является количество ребер на кратчайшем пути между ними.

Так как каждый день они пишут контесты в новых аудиториях, то они попросили вас помочь им найти количество возможных аудиторий для обсуждения задач на каждый из ближайших m дней.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 105) — количество аудиторий в университете.

В следующих n - 1 строках описаны переходы. В i-й из этих строк (1 ≤ i ≤ n - 1) записаны два целых числа ai и bi (1 ≤ ai, bi ≤ n), обозначающих, что i-й переход соединяет аудитории с номерами ai и bi.

В следующей строке записано целое число m (1 ≤ m ≤ 105) — количество запросов.

Следующие m строк описывают сами запросы. В j-й из этих строк (1 ≤ j ≤ m) записаны два целых числа xj и yj (1 ≤ xj, yj ≤ n), обозначающих, что в j-й день A будет писать контест в аудитории с номером xj, B — в аудитории с номером yj.

Выходные данные

В i-й (1 ≤ i ≤ m) строке выведите количество аудиторий, равноудаленных от аудиторий, в которых A и B пишут контест в i-й день.

Примечание

В первом примере из условия на одинаковом расстоянии от аудиторий с номерами 2 и 3 находится только одна аудитория — аудитория с номером 1.

B. Две кнопки

графы жадные алгоритмы кратчайшие пути математика поиск в глубину и подобное реализация *1400

Вася нашел странное устройство. На передней панели устройства расположен дисплей, отображающий некоторое целое положительное число, а также красная и синяя кнопки. При нажатии на красную кнопку число на дисплее увеличивается в два раза. При нажатии на синюю кнопку число на дисплее уменьшается на единицу. Если в какой-то момент число перестает быть положительным, устройство ломается. Дисплей может отображать сколь угодно большие числа. Изначально на дисплее отображается число n.

Вася хочет получить на дисплее число m. Какое минимальное количество нажатий ему придется совершить?

Входные данные

Первая и единственная строка ввода содержит два различных целых числа n и m, разделенных пробелом (1 ≤ n, m ≤ 104).

Выходные данные

Выведите одно число — минимальное количество нажатий на кнопки, необходимое, чтобы получить число m из числа n.

Примечание

В первом примере нужно один раз нажать на синюю кнопку, и затем раз один раз на красную кнопку.

Во втором примере удваивать число невыгодно, поэтому надо девять раз нажать на синюю кнопку.

E. Cycling City

графы поиск в глубину и подобное *3100

Вы организуете велосипедную гонку на улицах города. В городе присутствует n перекрестков, некоторые пары из которых соединены дорогами; по каждой из дорог можно перемещаться в любую сторону. Никакие две дороги не соединяют одну и ту же пару перекрестков, и никакая дорога не соединяет перекресток с самим собой.

Вы хотите, чтобы в гонке могли принять участие как профессиональные спортсмены, так и начинающие велосипедисты, и для этого вы проведете гонку в трех номинациях: легкая, средняя и сложная; каждый участник выберет себе сложность по силам. Для каждой номинации необходимо выбрать свой маршрут — цепочку перекрестков, последовательно соединенных дорогами. Маршруты должны удовлетворять следующим условиям:

  • все три маршрута должны стартовать на одном и том же перекрестке, а также финишировать на одном и том же перекрестке (места старта и финиша не могут совпадать);
  • во избежание столкновений никакие два маршрута не могут иметь общих перекрестков (за исключением общих старта и финиша), а также не могут проходить по одной и той же дороге (независимо от направления прохождения по этой дороге);
  • ни один маршрут не должен дважды проходить через один и тот же перекресток либо дважды проходить по одной и той же дороге (независимо от направления прохождения по этой дороге).

Подготовка к соревнованиям скоро начнется, и вам нужно как можно быстрее определиться с маршрутами гонки. Длина маршрутов не играет роли, важно лишь, чтобы все перечисленные требования были удовлетворены.

Входные данные

В первой строке записано два целых числа n и m (1 ≤ n, m ≤ 2·105) — количество перекрестков и дорог соответственно.

В следующих m строках через пробел записано по два целых числа — номера перекрестков, соединенных очередной дорогой (перекрестки нумеруются, начиная с 1). Гарантируется, что каждая пара перекрестков соединена не более, чем одной дорогой, и никакая дорога не соединяет перекресток сам с собой.

Обратите внимание, что возможность добраться от любого перекрестка до любого другого по дорогам не гарантируется.

Выходные данные

Если проложить маршруты возможно, в первой строке выведите «YES». В следующих трех строках выведите описания каждого из трёх маршрутов в формате «l p1 ... pl», гле l — количество перекрёстков в маршруте, а p1, ..., pl — их номера в порядке следования. Маршруты должны удовлетворять всем приведенным в условии требованиям.

Если же проложить маршруты в соответствии с указанными требованиями невозможно, выведите NO.

A. Репосты

*особая задача графы Деревья дп поиск в глубину и подобное *1200

Однажды Поликарп опубликовал в социальной сети смешную картинку с опросом про цвет своего хэндла. Многие из его друзей стали репостить шутку Поликарпа себе в ленту. Некоторые из них репостили репосты и так далее.

Эти события заданы в виде последовательности строк «name1 reposted name2» где name1 — это имя того, кто репостнул, а name2 — имя того, с чей ленты репостнули шутку. Гарантируется, что для каждой строки «name1 reposted name2» пользователь «name1» еще не имел эту шутку в свой ленте, а «name2» уже имел ее в своей ленте к моменту репоста. Поликарп зарегистрирован под именем «Polycarp», и изначально шутка есть только в его ленте.

Поликарп измеряет успешность шутки как длину наибольшей цепочки репостов. Выведите успешность шутки Поликарпа.

Входные данные

В первой строке входных данных записано целое число n (1 ≤ n ≤ 200) — количество репостов. Далее записаны сами репосты в порядке их совершения. Каждый из них записан в отдельной строке и имеет вид «name1 reposted name2». Все имена во входных данных состоят из прописных или строчных латинских букв и/или цифр и имеют длины от 2 до 24 символов включительно.

Известно, что имена пользователей регистронезависимы, то есть два имени, отличающиеся исключительно регистром букв, соответствуют одному и тому же пользователю соцсети.

Выходные данные

Выведите единственное целое число — максимальную длину цепочки репостов.

B. Ам Ням и тёмный парк

жадные алгоритмы поиск в глубину и подобное реализация *1400

Ам Ням — главный герой игры Cut the Rope. Он — смышлёный маленький монстрик, который любит ходить в гости к друзьям, живущим по другую сторону парка. Однако старые тёмные парки могут напугать даже такое жизнерадостное существо как Ам Ням, поэтому он хочет обратиться к вам за помощью.

Парк представляет собой 2n + 1 - 1 площадок, соединённых между собой дорожками так, что схема парка представляет собой полное бинарное дерево глубины n. Более формально, вход в парк ведёт в площадку 1. Выходы из парка расположены на площадках 2n, 2n + 1, ..., 2n + 1 - 1, и эти выходы ведут прямо к домам друзей Ам Няма. От каждой площадки i (2 ≤ i < 2n + 1) отходит двусторонняя дорожка в площадку . Таким образом, от входа в парк можно добраться до любого из выходов, пройдя ровно по n дорожкам.

Чтобы осветить дорожки парка вечером, смотритель парка установил фонари вдоль каждой дорожки. Вдоль дорожки, ведущей из i и в поставлено ai фонарей.

Ам Ням любит считать фонари по пути к своему другу. Ам Ням побаивается пауков, которые живут в парке, поэтому он не любит ходить по мало освещённым маршрутам. Он хочет, чтобы на пути к любому из его друзей суммарно находилось одинаковое количество фонарей, тогда он будет чувствовать себя в безопасности.

Он обратился к вам за помощью в установке дополнительных фонарей. Определите, какое минимальное количество фонарей нужно дополнительно поставить на дорожки парка так, чтобы на пути от входа в парк до любого выхода из парка было одинаковое количество фонарей. На каждую дорожку можно добавить произовольное количество фонарей.

Входные данные

В первой строке следует целое число n (1 ≤ n ≤ 10) — количество дорожек на пути от входа до любого выхода.

В следующей строке следуют 2n + 1 - 2 числа a2, a3, ... a2n + 1 - 1 — исходное количество фонарей на каждой из дорожек в парке. Число ai обозначает количество фонарей на дорожке между площадками i и . Все числа ai — целые положительные, не превосходящие 100.

Выходные данные

Выведите минимальное количество фонарей, которое нужно добавить на дорожки парка, чтобы Ам Ням чувствовал себя в безопасности.

Примечание

Изображение к тесту из условия. Зелёными отмечены дополнительные фонари.

E. Страсти в дата-центре

графы поиск в глубину и подобное *2600

Проектируемый дата-центр одной Большой Софтверной Компании состоит из n компьютеров, соединённых m проводами. Упрощённо каждый компьютер можно считать коробкой, из которой торчит несколько проводов. По каждому проводу в одном из двух направлений может течь Очень Важная Информация. Так как план дата-центра ещё не утверждён, для каждого провода пока не определено, в каком направлении по нему будет идти информация. Провода проложены таким образом, что каждый компьютер был связан с каждым, возможно, через некоторые другие компьютеры.

За порядок в дата-центре будет отвечать уборщица Клавдия Ивановна, которая любит собирать провода в пучки с помощью стяжек. По известным ей одной причинам, она группирует провода, торчащие из компьютера, по два, а если вдруг этого не получается, то она в ярости заливает компьютер водой из ведра.

Следует также отметить, что из-за специфических физических характеристик Очень Важной Информации, категорически запрещается связывать в пучок два провода, по которым информация течёт в разные стороны.

Руководство дата-центра хочет определить, как следует направить информацию по каждому проводу таким образом, чтобы Клавдия Ивановна имела возможность сгруппировать по два все провода, исходящие из каждого компьютера, соблюдая условие выше. Так как это может быть невозможно с имеющимся планом соединений, вам разрешается добавить минимально возможное количество проводов в схему, после чего требуется определить направление потока информации по каждому проводу (да, иногда дата-центры проектируются, исходя из удобства уборщиц...)

Входные данные

В первой строке следуют два числа n и m (1 ≤ n ≤ 100 000, 1 ≤ m ≤ 200 000) — количество компьютеров и количество имеющихся проводов соответственно.

В каждой из последующих строк следует по два числа ai, bi (1 ≤ ai, bi ≤ n) — номера компьютеров, соединённых i-м проводом. Дата-центры частенько бывают очень сложно устроены, поэтому между парой компьютеров может быть больше одной пары проводов, а некоторые провода могут соединять компьютер с самим собой.

Выходные данные

В первой строке выведите единственное число p (p ≥ m) — минимальное количество проводов в итоговой схеме.

В каждой из последующих p строк выведите по паре чисел ci, di (1 ≤ ci, di ≤ n), описывающей очередной провод. Подобная запись означает, что информация будет течь по очередному проводу в направлении от ci к di.

Среди выведенных вами проводов должны фигурировать все имеющиеся в плане провода в том или ином направлении. Гарантируется, что существует решение, в котором p не превосходит 500 000.

Если возможных ответов с минимальным значением p несколько, выведите любой.

Примечание

Иллюстрация к первому тесту из условия. Объединённые пары проводов изображены исходящими из одной точки.

Иллюстрация ко второму тесту из условия. Добавленные провода отмечены жирным.

Альтернативный вариант ответа на второй тест из условия:

C. Ледяная пещера

поиск в глубину и подобное *2000

Вы играете в компьютерную игру. Ваш персонаж находится на одном из уровней многоуровневой ледяной пещеры. Чтобы продолжить двигаться дальше, необходимо спуститься на уровень ниже, и единственный способ это сделать — провалиться под лед.

Уровень пещеры, где вы находитесь, представляет собой прямоугольную клетчатую сетку из n строк и m столбцов. Каждая клетка состоит либо из цельного, либо из треснувшего льда. Из каждой клетки можно передвигаться в клетки, имеющие с текущей общую сторону (из-за ограничений движка игры нельзя «прыгать на месте», т.е. переходить из клетки в саму себя). Если перейти на клетку с треснувшим льдом, то ваш персонаж провалится под нее, а если перейти на клетку с цельным льдом, лед на этой клетке станет треснувшим.

Пронумеруем строки числами от 1 до n сверху вниз, а столбцы — числами от 1 до m слева направо. Будем обозначать за (r, c) клетку на пересечении r-й строки и c-го столбца.

Вы находитесь на клетке (r1, c1), причем она треснувшая, так как вы сюда только что упали, провалившись с более высокого уровня. Вам надо провалиться под клетку (r2, c2), под которой расположен выход на следующий уровень. Можете ли вы это сделать?

Входные данные

В первой строке записаны два целых числа n и m (1 ≤ n, m ≤ 500) — количество строк и столбцов в описании пещеры.

Каждая из следующих n строк описывает начальное состояние уровня пещеры, где находится ваш персонаж, и состоит из m символов «.» (что означает цельный лед) и «X» (треснувший лед).

В следующей строке записаны два целых числа r1 и c1 (1 ≤ r1 ≤ n, 1 ≤ c1 ≤ m) — ваши начальные координаты. Гарантируется, что в описании пещеры в клетке (r1, c1) стоит символ «X», то есть, лёд на стартовой клетке — треснувший.

В следующей строке записаны два целых числа r2 и c2 (1 ≤ r2 ≤ n, 1 ≤ c2 ≤ m) — координаты клетки, под которую вам надо провалиться. Конечная клетка может совпадать со стартовой.

Выходные данные

Если вы можете достигнуть цели, выведите «YES», иначе выведите «NO».

Примечание

В первом тестовом примере существует, например, такой маршрут:

После первого посещения клетки (2, 2) лед на ней треснет, а, наступив туда во второй раз, ваш персонаж провалится под нее, что и было нужно.

C. Солдат и карты

игры Перебор поиск в глубину и подобное *1400

Два скучающих солдата играют в карточную войну (эквивалент карточной игры «пьяница» в англоязычных странах). Их колода состоит ровно из n карт, пронумерованных различными числами от 1 до n. Исходно они делят между собой картны некоторым образом, возможно, не равным образом.

Правила игры следующие. На каждом ходу происходит сражение. Каждый игрок берет карту с вершины своей стопки и кладет на стол. Тот, у кого значение карты больше, выигрывает в этом сражении, берет обе карты со стола и кладет в низ своей стопки. Точнее говоря, сперва он берет карту противника и кладет в низ своей стопки, затем кладет свою карту в низ своей стопки. Если после какого-то хода стопка одного игрока становится пустой, то он проигрывает, а другой игрок побеждает.

Вам надо подсчитать, после сколько будет сражений и кто победит, в противном случае надо сказать, что игра не прекратится.

Входные данные

В первой строке записано единственное целое число n (2 ≤ n ≤ 10), количество карт.

Во второй строке записано целое число k1 (1 ≤ k1 ≤ n - 1), количество карт у первого солдата. Затем следует k1 целых чисел — значения карт первого солдата в порядке сверху вниз.

В третьей строке записано целое число k2 (k1 + k2 = n), количество карт у второго солдата. Затем следует k2 целых чисел — значения карт второго солдата сверху вниз.

Все значения карт различны.

Выходные данные

Если кто-то победит в этой игре, выведите 2 целых чисел, где первое число обозначает количество сражений в игре, а второе — 1 или 2, обозначающее, какой игрок победил.

Если игра не закончится, а будет продолжаться вечно, выведите  - 1.

Примечание

Первый пример:

Второй пример:

D. Майк и рыба

графы Конструктив поиск в глубину и подобное *2600

Как известно, мишки любят рыбу. Но Майк — медведь необычный; он ненавидит рыбу! При этом как ни странно, у него есть бесконечное количество синей и красной рыбы.

Майк отметил n различных точек на плоскости. Координаты точки номер i это (xi, yi). Он хочет положить ровно одну рыбу на каждую из этих точек так, чтобы разница между количеством красной и синей рыбы на каждой горизонтальной и вертикальной прямой была не более 1.

Майк никак не может справиться с этим! Пожалуйста, помогите ему.

Входные данные

В первой строке ввода записано целое число n (1 ≤ n ≤ 2 × 105).

В следующих n строках записана инфомация о точках, в i-й строке записано два целых числа, xi и yi (1 ≤ xi, yi ≤ 2 × 105) — координаты i-й точки.

Гарантируется, что существует не менее одного корректного ответа.

Выходные данные

Выведите ответ как строку длины n из символов 'r' (красный) и 'b' (синий), i-й символ которой должен обозначать цвет рыбы в i-й точке.

B. Вечеринка в Looksery

графы жадные алгоритмы Конструктив поиск в глубину и подобное *2300

В компании Looksery, состоящей из n сотрудников, намечается очередная большая вечеринка. У каждого сотрудника в телефонной книге записан свой номер и номера друзей. Каждый, кто приходит на вечеринку, рассылает сообщения своим контактам о том, как там классно. При этом все стараются как можно больше времени потратить на веселье, поэтому рассылают сообщения всем, без разбора, и даже себе.

Игорь и Макс — разработчики Looksery — затеяли спор, кому сколько придёт сообщений. Игорь указывает n чисел, i-е из которых обозначает, сколько, по его мнению, сообщений придет i-му сотруднику. Если Игорь угадает правильно хотя бы одно из этих чисел, то он выиграет, в противном случае выиграет Макс.

Вы поддерживаете Макса в этом споре, поэтому вам требуется по заданным спискам контактов сотрудников определить, существует ли расклад, при котором Игорь проиграет. Точнее, Вам нужно определить, кто из сотрудников должен прийти на вечеринку, а кто — нет, так чтобы после того, как все пришедшие разошлют сообщения своим контактам, каждый сотрудник получил число сообщений отличное от того, что указал Игорь.

Входные данные

В первой строке задано одно целое число n (1 ≤ n ≤ 100) — количество сотрудников компании Looksery.

В следующих n строках задано описание списков контактов сотрудников. В i-й из этих строк записана строка длины n, состоящая из нулей и единиц, задающая список контактов i-го сотрудника. Если j-й символ i-й строки равен 1, то j-ый сотрудник находится в списке контактов i-го, в противном случае — не находится. Гарантируется, что i-й символ i-й строки всегда равен 1.

В последней строке задано n целых чисел, разделенных пробелами: a1, a2, ..., an (0 ≤ ai ≤ n), где ai обозначает число сообщений, которое должен получить i-й сотрудник по мнению Игоря.

Выходные данные

В первой строке выведите одно целое число m — количество сотрудников, которые должны прийти на вечеринку, чтобы Игорь проиграл спор.

Во второй строке через пробел выведите m целых чисел — номера этих сотрудников в произвольном порядке.

Если же Игорь в любом случае выиграет спор, выведите -1.

Если возможных ответов несколько, выведите любой из них.

Примечание

В первом примере по мнению Игоря первый сотрудник получит 0 сообщений. Т.к. его нет в списке контактов других сотрудников, то он должен прийти на вечеринку, чтобы получить сообщение от самого себя. Если на вечеринку придет только первый сотрудник, то он получит 1 сообщение, второй — 0 сообщений, и третий также 1 сообщение. В итоге Игорь не угадает ни одного числа.

Во втором примере, если единственный сотрудник придет на вечеринку, то он получит 1 сообщение и Игорь победит в споре, следовательно ему не стоит этого делать.

В третьем примере первый сотрудник компании получит 2 сообщения, второй — 3, третий — 2, четвертый — 3.

C. Любовные треугольники

графы поиск в глубину и подобное снм *2200

Во многих аниме фигурируют любовные треугольники: Алиса любит Боба, Чарли тоже любит Боба, но Алиса ненавидит Чарли. Вы задумали аниме с n персонажами. Персонажи обозначены числами от 1 от n. Каждая пара персонажей может либо взаимно любить, либо взаимно ненавидеть друг друга (нейтрального состояния нет).

Вы ненавидите любовные треугольники (А и B любят друг друга и B и C любят друг друга, но А и C ненавидят друг друга), а также вы терпеть не можете, когда никто никого не любит. Итак, рассматривая любых трёх человек, вы будете довольны, если ровно одна пара из них любит друг друга (А и B любят друг друга, а C ненавидит и А, и B), либо если все три пары любят друг друга (А любит B, B любит C, C любит А).

Вам дан список из m известных отношений в аниме. Вы точно знаете, что некоторые пары любят друг друга, а некоторые пары ненавидят друг друга. Вам интересно, сколько есть способов доопределить оставшиеся отношения так, чтобы вы были довольны каждым из треугольников. Два способа считаются различными, если два персонажа любят друг друга в одном способе и ненавидят друг друга в другом способе. Выведите это количество по модулю 1 000 000 007.

Входные данные

В первой строке входа записано два целых числа n, m (3 ≤ n ≤ 100 000, 0 ≤ m ≤ 100 000).

В следующих m строках записано описание известных отношений. В i-й строке записано три целых числа ai, bi, ci. Если ci равно 1, тогда ai и bi любят друг друга, в противном случае, они ненавидят друг друга (1 ≤ ai, bi ≤ n, ai ≠ bi, ).

Каждая пара людей описана не более, чем один раз.

Выходные данные

Выведите единственное целое число, равное остатку от деления на 1 000 000 007 количества способов заполнения оставшихся пар так, чтобы вы были довольны каждым треугольником.

Примечание

В первом примере четыре способа таковы:

  • Все любят друг друга;
  • 1 и 2 любят друг друга, а 3 ненавидит 1 и 2 (а также два симметричных способа).

Во втором примере единственный возможный способ — заставить 1 и 3 любить друг друга, а 2 и 4 — ненавидеть друг друга.

E. Дело о компьютерной сети

графы Деревья поиск в глубину и подобное *2800

Андроид Андреид — известный на всю галактику детектив. Сейчас он занимается подготовкой защиты от возможной атаки хакеров на важную компьютерную сеть.

В этой сети n узлов, некоторые пары узлов связаны m двусторонними каналами связи. По этой сети планируется передать q важных сообщений, i-е из которых должно быть отправлено из узла si в узел di с помощью одного или нескольких каналов связи, возможно через некоторые промежуточные узлы.

Для защиты от нападения был разработан специальный алгоритм. К сожалению его можно применить только к сети, состоящей из односторонних каналов связи. Поэтому, так как новые каналы связи создавать нельзя, было принято решение для каждого из существующих двусторонних каналов оставить возможность передавать данные только в одном из двух существующих направлений.

Перед Вами стоит задача определить, возможно ли так задать направление для каждого канала связи, чтобы каждое из q сообщений можно было успешно передать.

Входные данные

В первой строке заданы три целых числа n, m и q (1 ≤ n, m, q ≤ 2·105) — количество узлов, каналов связи и важных сообщений.

В следующих m строках заданы по два целых числа vi и ui (1 ≤ vi, ui ≤ n, vi ≠ ui), означающих что между узлами vi и ui есть канал связи. Между парой узлов может существовать более одного канала связи.

В следующих q строках заданы по два целых числа si и di (1 ≤ si, di ≤ n, si ≠ di) — номера узлов источника и назначения соответствующего сообщения.

Не гарантируется, что исходно возможно передать все сообщения.

Выходные данные

Если решение существует, выведите в единственной строке "Yes" (без кавычек). Иначе выведите "No" (без кавычек).

Примечание

В первом тесте из условия каналам можно задать направление, например, следующим образом: 1 → 2, 1 → 3, 3 → 2, 4 → 3. Тогда для первого сообщения будет путь 1 → 3, а для второго — 4 → 3 → 2.

В третьем тесте из условия каналам можно задать направление, например, следующим образом: 1 → 2, 2 → 1, 2 → 3. Тогда для первого сообщения будет путь 1 → 2 → 3, а для второго — 2 → 1.

D. Виталий и цикл

графы Комбинаторика математика поиск в глубину и подобное *2000

После того, как Виталий был отчислен из университета, он увлекся теорией графов.

Особенно Виталию нравились циклы нечетной длины, в которых каждая вершина встречается не более одного раза.

Виталию стало интересно, как решать следующую задачу. Задан неориентированный граф из n вершин и m ребер, необязательно связный, без кратных ребер и петель. Нужно найти t — минимальное количество ребер, которые нужно добавить в заданный граф таким образом, чтобы образовался простой цикл нечетной длины, состоящий из более чем одной вершины. Кроме того, ему надо найти w — количество способов добавить t ребер так, чтобы образовался цикл нечетной длины (состоящий из более чем одной вершины). Запрещается добавлять петли или кратные рёбра.

Два способа добавить ребра в граф считаются одинаковыми, если в них совпадают множества добавляемых рёбер.

Так как Виталий уже не учится в университете, он обратился к вам за помощью в решении этой задачи.

Входные данные

В первой строке входных данных следуют два целых числа n и m ( — количество вершин в графе и количество ребер в графе.

Следующие m строк содержат описания ребер графа, по одному ребру в строке. Каждое из ребер задается парой целых чисел ai, bi (1 ≤ ai, bi ≤ n) — номерами вершин, которые соединены i-м ребром. Все числа в строках разделены одним пробелом.

Гарантируется, что заданный граф не содержит петель и кратных ребер. Граф не обязательно является связным.

Выходные данные

Выведите в первую строку выходных данных через пробел два целых числа t и w — минимальное количество ребер, которое необходимо добавить в граф, чтобы образовался простой цикл нечетной длины, состоящий из более чем одной вершины, в котором каждая вершина встречается не более одного раза, и количество способов сделать это.

Примечание

Простой цикл это цикл, не проходящий дважды ни по какой вершине.

E. Президент и дороги

графы кратчайшие пути поиск в глубину и подобное хэши *2200

В Берляндии n городов, столица находится в городе s, а историческая родина Президента — в городе t (s ≠ t). Города соединены односторонними дорогами, время проезда по каждой из дорог — целое положительное число.

Раз в год Президент посещает свою историческую родину t, для чего его кортеж проезжает по некоторому пути из s в t (обратно он всегда возвращается на личном самолете). Так как Президент — очень занятой человек, то он всегда выбирает путь из s в t, по которому он проедет быстрее всего.

Министерство дорог и путей сообщения хочет узнать для каждой дороги: обязательно ли проедет по ней Президент во время своего путешествия, и если нет, то возможно ли её починить так, чтобы она в любом случае входила в кратчайший путь из столицы в историческую родину Президента. Очевидно, что дорогу невозможно починить так, чтобы время проезда по ней стало меньше единицы. Министерство Берляндии, как и любое другое, заинтересовано в сохранении бюджета, поэтому оно хочет узнать минимальную стоимость починки дороги. Также оно очень любит точность, поэтому ремонтирует дороги так, что время проезда по ним всегда остаётся целым числом.

Входные данные

В первой строке записаны четыре целых числа n, m, s и t (2 ≤ n ≤ 105; 1 ≤ m ≤ 105; 1 ≤ s, t ≤ n) — количество городов и дорог в Берляндии, номера столицы и исторической родины Президента (s ≠ t).

Далее в m строках перечислены дороги. Каждая из дорог задается тройкой целых чисел ai, bi, li (1 ≤ ai, bi ≤ nai ≠ bi; 1 ≤ li ≤ 106) — городами, которые соединяет i-я дорога, и временем проезда по ней. Дорога направлена от города ai к городу bi.

Города пронумерованы от 1 до n. Между парой городов может быть несколько дорог. Гарантируется, что существует путь из s в t по дорогам.

Выходные данные

Выведите m строк. В i-й строке должна содержаться информация об i-й дороге (дороги нумеруются с единицы в порядке следования во входных данных).

Если президент в любом случае проедет по ней во время своего путешествия, строка должна содержать единственное слово «YES» (без кавычек).

Иначе если i-ю дорогу возможно починить так, чтобы время проезда по ней осталось положительным, и президент в любом случае выбрал бы её для своего путешествия, выведите через пробел слово «CAN» (без кавычек) и минимальную стоимость ремонта.

Если же нельзя починить дорогу так, чтобы по ней в обязательном порядке проехал президент, выведите «NO» (без кавычек).

Примечание

Стоимостью починки дороги называется разность между временем проезда по ней до и после починки.

В первом тесте из условия президент исходно может выбрать один из двух маршрутов для своей поездки: 1 → 2 → 4 → 5 → 6 либо 1 → 2 → 3 → 5 → 6.

A. Квадратная Земля?

жадные алгоритмы поиск в глубину и подобное реализация *1300

Кролиха Мэг решила заняться прекрасным, а именно вычислить кратчайшее расстояние между двумя точками на поверхности нашей планеты. Но Мэг... что сказать... ей все нужно попроще... Итак, она уже рассматривает нашу планету как двухмерную окружность. Хотя нет, даже хуже — как квадрат, со стороной n. Таким образом, задача свелась к нахождению кратчайшего пути между двумя точками на квадрате (путь должен проходить по сторонам квадрата). Для простоты будем считать, что вершины квадрата находятся в точках с координатами: (0, 0), (n, 0), (0, n) и (n, n).

Входные данные

Единственная строка содержит 5 целых чисел, разделенных пробелами: n, x1, y1, x2, y2 (1 ≤ n ≤ 1000, 0 ≤ x1, y1, x2, y2 ≤ n) соответственно сторона квадрата, координаты первой точки и координаты второй точки. Гарантируется, что точки лежат на сторонах квадрата.

Выходные данные

В единственной строке нужно вывести кратчайшее расстояние между точками.

D. Деревянные запросы

Бинарный поиск битмаски графы Деревья Конструктив поиск в глубину и подобное *2200

Роман посадил дерево из n вершин. В каждой вершине записана строчная английская буква. Вершина 1 является корнем дерева, у каждой из n - 1 оставшихся вершин есть предок в дереве, с которым вершина соединена ребром. Предком вершины i является вершина pi, причём номер предка всегда меньше, чем номер вершины (то есть, pi < i).

Глубина вершины — это количество вершин на пути по рёбрам от корня до v. В частности, глубина корня равна 1.

Скажем, что вершина u лежит в поддереве вершины v, если мы можем попасть из u в v, переходя из вершины в предка. В частности, вершина v лежит в своём поддереве.

Рома даёт вам m запросов, i-й из которых задаётся двумя числами vi, hi. Рассмотрим вершины, лежащие в поддереве vi, и находящиеся на глубине hi. Определите, можно ли из букв, записанных в этих вершинах, составить строку, являющуюся палиндромом? Буквы, записанные в вершинах, можно переставить в произвольном порядке для составления палиндрома.

Входные данные

В первой строке находятся два целых числа n, m (1 ≤ n, m ≤ 500 000) — количество вершин в дереве и запросов соответственно.

В следующей строке находятся n - 1 целых чисел p2, p3, ..., pn — предки вершин со второй по n-ю вершин (1 ≤ pi < i).

В следующей строке находятся n строчных английских букв, i-я из этих букв написана на вершине i.

В последующих m строках описаны запросы, в i-й строке находятся два числа vi, hi (1 ≤ vi, hi ≤ n) — вершина и глубина, фигурирующие в i-м запросе.

Выходные данные

Выведите m строк. В i-й строке выведите «Yes» (без кавычек), если в i-м запросе возможно составить палиндром из букв, написанных на вершинах, иначе выведите «No» (без кавычек).

Примечание

Строка s является палиндромом, если она одинаково читается слева направо и справа налево. В частности, пустая строка является палиндромом.

Пояснение к тесту из условия.

В первом запросе существует единственная вершина 1, подходящая под все условия, мы можем составить палиндром "z".

Во втором запросе вершины 5 и 6 удовлетворяют условиям, на этих вершинах написаны буквы "с" и "d". Составить палиндром невозможно.

В третьем запросе не существует ни одной вершины на глубине 1 в поддереве вершины 4. Мы можем составить пустой палиндром.

В четвертом запросе не существует вершин в поддереве 6 на глубине 1. Мы можем составить пустой палиндром.

В пятом запросе вершины 2, 3 и 4 удовлетворяют условиям, на этих вершинах написаны буквы a, с и с. Мы можем составить палиндром "cac"

C. КНФ-2

графы жадные алгоритмы Конструктив поиск в глубину и подобное *2500

«Конъюнкти́вная норма́льная фо́рма (КНФ) в булевой логике — нормальная форма, в которой булева формула имеет вид конъюнкции дизъюнкций литералов» (взято с https://ru.wikipedia.org/wiki/КНФ).

Иными словами, КНФ — это формула вида , где & обозначает логическое "И" (конъюнкцию), обозначает логическое "ИЛИ" (дизъюнкцию), а vij — это некоторые логические переменные или их отрицания. Каждое выражение в скобках называется дизъюнктом, а vij называются литералами.

Дана КНФ, в которой фигурируют переменные x1, ..., xm и их отрицания. Известно, что каждая переменная входит не более, чем в два дизъюнкта (суммарно как с отрицанием, так и без). Требуется определить выполнима ли эта КНФ, то есть, существуют ли такие значения переменных, при которых значение КНФ истинно. Если КНФ выполнима, то также требуется привести значения переменных, при которых КНФ истинна.

Гарантируется, что каждая переменная входит в каждый дизъюнкт не более одного раза.

Входные данные

В первой строчке заданы целые числа n и m (1 ≤ n, m ≤ 2·105) — количество дизъюнктов и количество переменных соответственно.

Далее в n строках заданы описания каждого из дизъюнктов. В i-й строке находится сначала число ki (ki ≥ 1) – количество литералов в i-м дизъюнкте, затем через пробел перечислены литералы vij (1 ≤ |vij| ≤ m). Литерал, соответствующий vij, это x|vij| либо с отрицанием, если vij отрицательно, либо без отрицания в противном случае.

Выходные данные

Если КНФ не выполнима, выведите единственную строку "NO" (без кавычек), в противном случае выведите две строки: строку "YES" (без кавычек), а затем строку из m нулей или единиц — значения переменных в выполняющем наборе в порядке от x1 до xm.

Примечание

В первом тестовом примере задана формула . Один из возможных ответов — x1 = ИСТИНА, x2 = ИСТИНА.

C. Мишка и рисование

Деревья Конструктив поиск в глубину и подобное *2300

Лимак — маленький мишка, который учится рисовать. Люди обычно начинают с домиков, заборов и цветов, ну а мишкам с чего бы так делать? Лимак живет в лесу и решает нарисовать дерево.

Напомним, что деревом называется связный граф, состоящий из n вершин и n - 1 ребра (n ≥ 1).

Лимак выбрал дерево, состоящее из n вершин. У него есть бесконечная полоска бумаги с двумя параллельными рядами точек. Маленький мишка хочет сопоставить вершины дерева некоторым n различным точкам так, чтобы рёбра могли пересекаться только в своих конечных точках — иными словами, должно получиться планарное изображение дерева. Ниже приведен один из корректных рисунков к первому тесту.

Сможет ли Лимак нарисовать выбранное дерево?

Входные данные

В первой строке записано единственное целое число n (1 ≤ n ≤ 105) — количество вершин в дереве.

В следующих n - 1 строках содержится описание рёбер дерева. i-я из них содержит два целых числа через пробел, ai и bi (1 ≤ ai, bi ≤ n, ai ≠ bi), обозначающих ребро между вершинами ai и bi. Гарантируется, что данное описание задаёт дерево.

Выходные данные

Выведите "Yes" (без кавычек), если Лимак может нарисовать выбранное дерево. В противном случае, выведите "No" (без кавычек).

B. Мишка и три мушкетера

графы Перебор поиск в глубину и подобное хэши *1500

Знаете ли вы историю про трех мушкетеров? Сейчас вы узнаете её происхождение.

Ришелимакье — кардинал в городе Берисе. Он устал в одиночку бороться с преступностью, поэтому ему нужны три храбрых воина, чтобы помочь бороться с плохишами.

Дано n воинов. Ришелимакье хочет выбрать троих из них на должность мушкетеров, но это не так-то просто. Самое важное условие заключается в том, что мушкетеры в целях кооперации должны знать друг друга. Но они не должны быть слишком известными, ведь старые друзья могут предать их. Для каждого мушкетера, его узнаваемость — это количество известных ему воинов, не считая двух других мушкетеров.

Помогите Ришелимакье! Узнайте, можно ли выбрать трех мушкетеров, знающих друг друга, и какова может быть минимальная сумма их узнаваемостей.

Входные данные

В первой строке записано два целых числа через пробел, n и m (3 ≤ n ≤ 4000, 0 ≤ m ≤ 4000) — количество воинов и количество пар воинов, которые знают друг друга.

В i-й из последующих m строк находятся по два целых числа через пробел, ai и bi (1 ≤ ai, bi ≤ n, ai ≠ bi), означающих, что воины ai и bi знают друг друга. Каждая пара воинов будет указана не более одного раза.

Выходные данные

Если Ришелимакье может выбрать трех мушкетеров, выведите минимальную возможную сумму их узнаваемостей.

В противном случае выведите "-1" (без кавычек).

Примечание

В первом примере Ришелимакье стоит выбрать тройку 1, 2, 3. Первый мушкетер не знает никого, кроме двух других мушкетеров, так что его узнаваемость равняется 0. Узнаваемость второго мушкетера равняется 1, потому что он знает воина номер 4. Узнаваемость третьего мушкетера также равна 1, потому что он знает воина номер 4. Сумма узнаваемостей равна 0 + 1 + 1 = 2.

Другая возможная тройка: 2, 3, 4, но у неё больше сумма узнаваемостей, равная 1 + 1 + 1 = 3.

Во втором примере нет тройки воинов, знающих друг друга.

B. Взятки

графы Деревья поиск в глубину и подобное *2200

В стране Руритании дорожная сеть организована из рук вон плохо, это не радует дальнобойщиков, которым постоянно надо что-то перевозить. Некоторые дороги являются односторонними, некоторые — двусторонними. Оказывается, что иногда невозможно добраться из одного города до другого законно — однако взятка, данная правильному человеку, может помочь добраться куда угодно!

К счастью для нас, полицейские позволят дальнобойщику нарушить правила и проехать в запрещённом направлении при условии, что машине ДПС будет предоставлено соответствующее вознаграждение. На каждой дороге расположено по одной машине ДПС и они просят 1000 рирутанских динаров за проезд в запрещенном направлении. Но патрульные — жадные ребята, и каждый раз, когда они замечают, что один и тот же дальнобойщик нарушает правила, они запрашивают вдвое большую сумму, чем которую они запрашивали в прошлый раз на этой конкретной дороге.

Борна — дальнобойщик, сумевший раскусить всю эту схему. Ему надо сделать K остановок в некоторых городах по всей Руритании, и ему надо совершить эти остановки в некотором порядке. Дано N городов (пронумерованных от 1 до N) в Руритании и известно, что изначально Борна находится в столице, то есть городе 1. Так получилось, что он знает, какие дороги из N - 1 Руританских дорог на данный момент односторонние, но он не может подсчитать минимальное количество денег, которое надо подготовить на взятки ДПС. Помогите Борне, предоставьте ему ответ и вас щедро вознаградят.

Входные данные

В первой строке записано число N, количество городов в Руритании. В следующих N - 1 строках записана информация, обозначающая отдельные дороги между городами. Дорога представлена тройкой целых чисел (a,b,x), разделенных пробелами. Числа a и b представляют города, соединенные этой конкретной дорогой, а x равняется либо 0, либо 1: 0 означает, что дорога двунаправленная, 1 означает, что разрешено только направление a → b. В следующей строке записано K, количество остановок, которые надо сделать Борне. В последней строке записано K целых чисел s1, …, sK: города, которые надо посетить Борне.

  • 1 ≤ N ≤ 105
  • 1 ≤ K ≤ 106
  • 1 ≤ a, b ≤ N для всех дорог
  • для всех дорог
  • 1 ≤ si ≤ N для всех 1 ≤ i ≤ K
Выходные данные

Выведите единственное целое число: наименьшее количество тысяч Руританских динаров, необходимое Борне для взяток, по модулю 109 + 7.

Примечание

Борна сперва идет по пути 1 → 5 и должен оплатить 1000 динаров. Затем он идет по пути 5 → 1 → 2 → 3 → 4 и в этот раз ничего не платит. Однако когда ему придется вернуться через 4 → 3 → 2 → 1 → 5, ему нужно подготовить 3000 (1000+2000) динаров. Затем дорога до 2 через 5 → 1 → 2 ничего не будет ему стоить. Наконец, ему не даже надо выезжать из города 2, чтобы добраться до 2, так что дополнительную взятку готовить не надо. Таким образом, всего он подготовит 4000 динаров.

G. Пивной путь

кратчайшие пути поиск в глубину и подобное *2200

Народ в Пиволенде любит пить пиво. Знаете ли вы, что пиво здесь такое хорошее и сильное, что каждый раз, когда вы пьете его, ваша скорость снижается в десять раз по сравнению с вашей скоростью до его употребления?

Бирко живет в городе Пивграде, но хочет отправиться в город Пивбург. Вам дана дорожная карта Пиволенда и Вам надо найти для него самую быструю дорогу. Когда он начнет свое путешествие в Пивграде, его скорость будет равна 1. Придя в новый город, он всегда пробует стакан местного пива, что делит его скорость на 10.

Вопрос таков: за какое минимальное время он доберется до Пивбурга? Если есть несколько маршрутов с минимальным временем, выберите тот, что содержит наименьшее количество дорог. Если всё равно остается более одного маршрута, выберите любой из них.

Гарантируется, что из Пивграда в Пивбург будет вести не менее одного маршрута.

Входные данные

В первой строке входа содержится целое число N — количество городов в Пиволенде и целое число M — количество дорог в этой стране. Города пронумерованы от 0 до N - 1, где город 0— это Пивград, а город N - 1— это Пивбург. Каждая из следующих M строк содержит три целы числа, a, b (a ≠ b) и len. Эти числа обозначают, что есть двунаправленная дорога между городами a и b длины len.

  • 2 ≤ N ≤ 105
  • 1 ≤ M ≤ 105
  • 0 ≤ len ≤ 9
  • Между двумя городами не более одной дороги
Выходные данные

В первой строке должно быть записано наименьшее время, необходимое на то, чтобы перейти из Пивграда в Пивбург.

Во второй строке дожны быть записаны номера городов по дороге из Пивграда в Пивбург, занимающей наименьшее время.

В третьей строке выхода должны быть записаны номера городов на этом маршруте в порядке посещения, разделенные пробелами.

B. Инвариантность дерева

Деревья жадные алгоритмы Конструктив поиск в глубину и подобное *2100

Деревом размера n называется неориентированный связный граф из n вершин без циклов.

Рассмотрим некоторое дерево из n вершин. Назовем дерево инвариантным относительно перестановки p = p1p2... pn, если для любых двух вершин дерева u и v выполняется утверждение: «Вершины u и v соединены ребром тогда и только тогда, когда вершины pu и pv соединены ребром».

Вам дана перестановка p размера n. Найдите какое-нибудь дерево размера n, инвариантное относительно данной перестановки.

Входные данные

В первой строке дано число n (1 ≤ n ≤ 105) — размер перестановки (совпадающий с размером искомого дерева).

Во второй строке дана сама перестановка pi (1 ≤ pi ≤ n).

Выходные данные

Если искомого дерева не существует, то выведите «NO» (без кавычек).

Иначе выведите «YES», а затем выведите n - 1 строку, в каждой из которых находится по два целых числа — концы очередного ребра искомого дерева. Вершины нумеруются с единицы, порядок следования рёбер и порядок следования вершин внутри ребра не имеет значения.

Если решений несколько, выведите любое из них.

Примечание

В первом тесте из условия, при применении к ребру перестановки, ребро (4, 1) перейдет в ребро (1, 4), ребро (4, 2) перейдет в ребро (1, 3), а ребро (1, 3) перейдет в ребро (4, 2). Все эти ребра есть в ответе.

Можно заметить, что во втором тесте из условия, ни одно дерево не подходит под ограничения.

C. Кефа и парк

графы Деревья поиск в глубину и подобное *1500

Кефа решил отпраздновать свой первый крупный заработок походом в ресторан.

Он живет возле необычного парка. Парк представляет из себя подвешенное дерево из n вершин c корнем в вершине 1. В вершине 1 также находится дом Кефы. К сожалению для нашего героя, в парке также находятся коты. Кефа уже выяснил номера вершин, в которых находятся коты.

В листовых вершинах парка находятся рестораны. Кефа хочет выбрать ресторан, в который он пойдет, но, к сожалению, он очень боится котов, поэтому он ни за что не пойдёт в ресторан, на пути к которому от его дома найдётся более m подряд идущих вершин с котами.

Ваша задача — помочь Кефе посчитать количество ресторанов, в которые он может сходить.

Входные данные

В первой строке записаны два целых числа n и m (2 ≤ n ≤ 105, 1 ≤ m ≤ n) — количество вершин дерева и максимальное количество подряд идущих вершин с котами, которое способен перенести Кефа.

Во второй строке содержится n целых чисел a1, a2, ..., an, где каждое ai либо равняется 0 (тогда в вершине i нет кота), либо равняется 1 (тогда в вершине i есть кот).

В следующих n - 1 строках записаны ребра дерева в формате «xi yi»(без кавычек) (1 ≤ xi, yi ≤ n, xi ≠ yi), где xi и yi — вершины дерева, соединенные очередным ребром.

Гарантируется, что данный набор рёбер задаёт дерево.

Выходные данные

Одно целое число — количество различных листьев дерева, на пути от дома Кефы до которых не больше m подряд идущих вершин с котами.

Примечание

Напомним, что дерево — это связный граф на n вершинах, состоящий из n - 1 ребра. Подвешенное дерево — это дерево с особой выделенной вершиной, корнем. В подвешенном дереве из любых двух вершин, соединённых ребром, одна называется предком (та из них, что ближе к корню), а оставшаяся — ребёнком. Вершина называется листом, если у неё нет детей.

Пояснение к первому тесту из условия: Красным цветом отмечены вершины в которых находятся коты. Рестораны находятся в вершинах 2, 3, 4. Кефа не может сходить только в ресторан, находящийся в вершине 2.

Пояснение ко второму тесту из условия: Рестораны находятся в вершинах 4, 5, 6, 7. Кефа не может попасть в рестораны 6, 7.

B. Филипп и поезда

графы кратчайшие пути поиск в глубину и подобное *1700

В магазине мобильных приложений появилась новая игра «Subway Roller».

Главный герой игры Филипп находится в одном конце туннеля и хочет выйти из другого. Туннель представляет собой клетчатое прямоугольное поле, состоящее из трех строк и n столбцов. В начале игры герой находится в некоторой клетке самого левого столбца. Навстречу герою едет некоторое количество поездов. Каждый поезд представляет собой две или более клетки, находящиеся непосредственно друг за другом в некоторой строке поля.

Все поезда двигаются справа налево со скоростью две клетки в секунду, а герой бежит слева направо со скоростью одна клетка в секунду. Для простоты игра реализована так, что герой и поезда двигаются по очереди. Сначала герой двигается на одну клетку вправо, затем на одну клетку вверх или вниз или остается на месте, затем все поезда дважды одновременно перемещаются на одну клетку влево. Таким образом, за один ход Филипп обязательно делает перемещение вправо и может переместиться вверх или вниз. Если в какой-то момент Филипп оказывается в одной клетке с некоторым поездом, то он проигрывает. Если поезд доезжает до левого столбца, то он продолжает двигаться как и ранее, выезжая из туннеля.

Ваша задача ответить на вопрос, существует ли такая последовательность передвижений Филиппа, что он сможет дойти до самого правого столбца.

Входные данные

Каждый тест содержит от одного до десяти наборов входных данных. В первой строке теста находится одно целое число t (1 ≤ t ≤ 10 для претестов и тестов, t = 1 для взломов; смотрите в секцию Notes для пояснения) — количество наборов.

Далее следует описание t наборов входных данных.

В первой строке описания каждого набора находятся два целых числа n, k (2 ≤ n ≤ 100, 1 ≤ k ≤ 26) — количество столбцов на поле и количество поездов. В каждой из следующих трех строк находится последовательность из n символов, представляющих собой строку поля, на котором проходит игра. Начальное положение Филиппа обозначено символом 's' и находится в самом левом столбце. Каждый из k поездов обозначен некоторой последовательностью подряд идущих одинаковых прописных букв английского алфавита, находящихся в одной строке. Различные поезда обозначены различными буквами. Символ '.' обозначает пустую клетку, то есть клетку без Филиппа и поездов.

Выходные данные

Для каждого набора входных данных выведите в отдельной строке слово YES, если пройти игру возможно и слово NO в противном случае.

Примечание

В первом наборе входных данных первого примера Филиппу нужно сначала пройти вперед и спуститься вниз на третью строку поля, затем пройти вперед, затем пройти вперед и подняться на вторую строку, снова пройти вперед и подняться на первую строку. После этого пути Филиппа не преграждает ни один поезд, поэтому он может идти прямо до конца туннеля.

Обратите внимание, что в этой задаче во взломах разрешается использовать только тесты, содержащий один набор входных данных.

C. Три государства

графы кратчайшие пути поиск в глубину и подобное *2200

Опасаясь приближения мирового экономического кризиса, государства Бермания, Беранция и Берталия заключили союз и разрешили жителям всех входящих в него государств беспрепятственный проход по территории любого из них. Дополнительно было решено построить дороги между государствами так, чтобы из любой точки любого государства можно было добраться до любой точки любого другого государства.

Так как дороги всегда обходятся недёшево, правительства государств новообразованного союза попросили вас помочь им оценить затраты. Для этого вам была выдана карта, которая представляет собой клетчатый прямоугольник из n строк по m клеток в каждой. Любая клетка карты либо принадлежит одному из трёх государств, либо является областью, на которой можно построить дорогу, либо является областью, на которой дорогу построить нельзя. Проходимыми являются все клетки, принадлежащие государствам, а также все клетки, в которых построены дороги. Из любой проходимой клетки можно перемещаться вверх, вниз, вправо и влево, если соответствующая такому перемещению клетка существует и является проходимой.

Требуется построить дороги в минимальном количестве клеток так, чтобы стало возможным добраться из любой клетки любого государства до любой клетки любого другого государства.

Гарантируется, что изначально из любой клетки любого государства можно добраться до любой клетки этого же государства, перемещаясь только по его клеткам. Также гарантируется, что на карте присутствует хотя бы одна клетка каждого государства.

Входные данные

В первой строке ввода записаны размеры карты n и m (1 ≤ n, m ≤ 1000) — количество строк и столбцов соответственно.

Следующие n строк содержат по m символов каждая и описывают строки карты. Цифры от 1 до 3 означают принадлежность соответствующему государству. Символ '.' соответствует клетке, на которой можно построить дорогу, а символ '#' соответствует клетке, на которой дорогу построить нельзя.

Выходные данные

Выведите единственное целое число — минимальное количество клеток, в которых необходимо построить дороги, чтобы соединить все клетки всех государств. Если это сделать невозможно, то выведите -1.

D. Супер М

графы Деревья дп поиск в глубину и подобное *2200

На самом деле Ари — не совсем обычное чудовище. Она представляет собой скрытую личность Супер М, одного из главных супергероев Байтфорсес. Байтфорсес — это страна, состоящая из n городов, соединенных n - 1 дорогами. Каждая дорога соединяет ровно два различных города, и вся дорожная система разработана так, что можно добраться от любого города до любого другого города, используя только данные дороги.

На m городов напали злые люди. И вот, Ари... то есть, Супер М должен немедленно направиться в каждый из атакуемых городов, чтобы прогнать злых людей. Супер М может перемещаться между городами только используя данные дороги. Более того, перемещение по любой из дорог занимает у неё ровно один крон (единица времени, используемая в Байтфорсес).

Однако, сейчас Супер М не в Байтфорсес — она посещает тренировочный лагерь, расположенный в близлежащей стране Кодфорсес. К счастью, в Кодфорсес есть особый прибор, позволяющий мгновенно телепортировать девушку из Кодфорсес в любой город Байтфорсес. Обратный путь слишком долог, так что в рамках данной задачи телепортация используется ровно один раз.

Вам следует помочь Супер М и вычислить город, в который она должна телепортироваться в начале, чтобы завершить свою работу за минимальное время (измеряемое в кронах). Также сообщите ей это время, чтобы она могла распланировать дорогу обратно в Кодфорсес.

Входные данные

В первой строке входных данных записаны два целых числа n и m (1 ≤ m ≤ n ≤ 123456) — количество городов в Байтфорсес, и количество атакуемых городов, соответственно.

Далее следует n - 1 строка, описывающая систему дорог. Каждая строка состоит из двух номеров городов ui и vi (1 ≤ ui, vi ≤ n) — концы очередной дороги.

Последняя строка содержит m различных целых чисел — номера атакуемых городов. Эти числа даны в произвольном порядке.

Выходные данные

Сперва выведите номер города, куда надо телепортироваться Супер М. Если оптимальных ответов несколько, выведите город с наименьшим номером.

Затем выведите наименьшее возможное время, необходимое для того, чтобы распугать всех людей в атакуемых городах, измеренное в кронах.

Обратите внимание, что правильный ответ всегда единственен.

Примечание

В первом примере есть две возможности завершить работу Супер М за 3 крона:

and .

Однако вам следует выбрать первый вариант, так как он начинается в городе с меньшим номером.

D. Деревянный День Рождения

графы Деревья математика поиск в глубину и подобное Структуры данных *2400

У Богдана сегодня День Рождения и мама подарила ему дерево, состоящее из n вершин. На ребре i было написано число xi. Напомним, что деревом называется связный неориентированный граф без циклов. После этого на вечеринку к Богдану последовательно приходят m гостей. Когда приходит i-й гость, он делает ровно одну из двух операций:

  1. Выбирает некоторое число yi, а так же две вершины ai и bi. После этого двигаясь по рёбрам дерева проходит от вершины ai до вершины bi кратчайшим путём (такой путь в дереве, конечно, единственный). Каждый раз проходясь по какому-то ребру j, он заменяет своё текущее число yi на , то есть на целую часть деления yi на xj.
  2. Выбирает некоторое ребро pi, и заменяет написанное на нём значение xpi на целое положительное число ci < xpi.

Богдан заботится о своих гостях и решил автоматизировать данный процесс. Напишите программу, которая проделает все применяемые гостями операции, и каждому гостю выбравшему операцию первого типа сообщит результирующее значение yi.

Входные данные

В первой строке входных данных содержатся два числа n и m (2 ≤ n ≤ 200 000, 1 ≤ m ≤ 200 000) — количество вершин в дереве, подаренном Богдану, и количесвто гостей на вечеринке соответственно. В следующей n - 1 строке содержится описание рёбер, i-я из этих строк содержит три целых числа ui, vi, xi (1 ≤ ui, vi ≤ n, ui ≠ vi, 1 ≤ xi ≤ 1018), обозначающих ребро между вершинами ui и vi, на котором написано число xi. Далее следуют m строк, которые описывают гостей Богдана. Каждое описание содержит три или четыре целых числа и имеет вид:

  • 1 ai bi yi — соответствует гостям, выбравшим операцию первого типа.
  • 2 pi ci — соответствует гостям, выбравшим операцию второго типа.
Гарантируется, что все запросы корректны, а именно 1 ≤ ai, bi ≤ n, 1 ≤ pi ≤ n - 1, 1 ≤ yi ≤ 1018 и 1 ≤ ci < xpi, где xpi означает число, записанное на ребре pi в этот момент времени, что необязательно равно значению xpi в начале, так как к ребру уже могли применяться операции уменьшения значения. Рёбра нумеруются от 1 до n - 1 в порядке из записи во входных данных.
Выходные данные

Для каждого гостя, выбравшего операцию первого типа, выведите результирующее значение для выбранного им yi.

Примечание

Изначально дерево выглядит так:

На первый запрос ответом будет = 2

После изменения третьего ребра дерево выглядит так:

На второй запрос ответом будет = 4

В третьем запросе начальная и конечная вершина совпадает, то есть ответом будет исходное число 20.

После изменения четвертого ребра дерево выглядит так:

В последнем запросе ответом будет = 3

E. Вилбур и строки

графы дп поиск в глубину и подобное Строки *2500

Теперь поросёнок Вилбур хочет поиграть со строками. Он нашёл таблицу размера n на m, состоящую только из цифр от 0 до 9. Ряды нумеруются от 1 до n, а столбцы от 1 до m. Вилбур начинает в какой-то клетке (x, y) и делает следующие ходы. Пусть в клетке (x, y) написана цифра d (0 ≤ d ≤ 9), тогда Вилбур должен сделать ход в ячейку (x + ad, y + bd), если эта ячейка находится внутри таблицы, и остаться на месте в противном случае. Перед совершением очередного хода Вилбур может, если сочтёт нужным, выписать на доску цифру, написанную в текущей клетке. Все выписанные цифры образую строчку, каждая новая цифра приписывает в конец текущей строки.

У Вилбура есть q интересных ему строк. Для каждой строки si, Вилбур хочет узнать, можно ли так выбрать начальную позицию (x, y), что за конечное число ходов Вилбур может в итоге написать на доске строку si.

Входные данные

В первой строке входных данных записано три целых числа n, m, и q (1 ≤ n, m, q ≤ 200) — размеры таблицы и количество строк, которые надо обработать, соответственно.

В следующих n строках содержится по m цифр от 0 до 9 — сама таблица.

Затем следуют 10 строк. В i-й из них содержатся значения ai - 1 и bi - 1 ( - 200 ≤ ai, bi ≤ 200), то есть вектор, на который необходимо сдвинуться, если цифра в текущей ячейке равна i - 1.

Далее следуют q строк. В i-й из них содержится строка si, состоящая только из цифр от 0 до 9. Гарантируется, что суммарная длина данных q строк не превысит 1 000 000.

Выходные данные

Для каждой из q строк выведите "YES", если Вилбур может так выбрать начальную позицию (x, y), чтобы через какое-то конечно число ходов выписать на доску строку si. Если это невозможно, то выведите "NO".

Примечание

В первом примере дана таблица размера 1 на 1, в которой записана единственная цифра 0. Каждым ходом Вилбур будет оставаться в клетке (1, 1). Первую строку можно написать на доске, записывая друг за другом 0. Вторую строку нельзя записать, так как на в таблице нет 2.

D. Игорь в музее

графы кратчайшие пути поиск в глубину и подобное *1700

Игорь пришёл в музей и хочет посмотреть на как можно большее количество картин.

Музей представляет собой прямоугольное клетчатое поле размером n × m. Каждая клетка либо является пустой и обозначена символом '.', либо является непроходимой и обозначена символом '*'. Любую пару соседних по стороне клеток, одна из которых пустая, а другая непроходимая, разделяет стена, на которой висит картина.

Игорь всегда начинает в некоторой пустой клетке. В любой момент времени Игорь может переместиться в любую из четырёх соседних по стороне клеток, если она является пустой.

Ваша задача для нескольких начальных положений Игоря определить максимальное количество картин, которые он сможет посмотреть. Игорь может посмотреть на картину, если находится в клетке, одной из сторон которой является стена с данной картиной. Можно считать, что Игорю всегда хватит времени, чтобы сколь угодно долго перемещаться по музею и смотреть на картины.

Входные данные

В первой строке входных данных записаны три числа n, m и k (3 ≤ n, m ≤ 1000, 1 ≤ k ≤ min(n·m, 100 000)) — размеры музея и количество начальных положений, для которых нужно определить требуемую величину.

В следующих n строках находится по m символов '.', '*', описывающих музей. Гарантируется, что все граничные клетки непроходимы, то есть Игорь никогда не сможет выйти из музей.

Далее в k строках находится по два целых положительных числа x и y (1 ≤ x ≤ n, 1 ≤ y ≤ m) — номер строки и номер столбца для одного из начальных положений Игоря. Строки нумеруются с единицы сверху вниз, а столбцы — слева направо. Гарантируется, что все начальные положения находятся в пустых клетках.

Выходные данные

Выведите k целых чисел — максимальное количество картин, которые сможет посмотреть Игорь, для каждого начального положения.

B. Время сериала!

поиск в глубину и подобное снм *1400

Друг Сereal Guy, Serial Guy, любит смотреть сериалы. У него вот-вот начнётся сериал, а он не помыл свою тарелку. Но он решил хотя бы поставить набираться в нее воду. Тарелка представляет собой параллелепипед k × n × m, то есть имеет k слоёв (первый слой — верхний), каждый из которых является прямоугольником n × m со свободными ('.') и занятыми клетками ('#'). Вода может находиться только в свободных клетках. Кран находится над клеткой (x, y) первого слоя, гарантируется, что эта клетка свободна. Каждую минуту в тарелку попадает одна кубическая единица воды. Выясните, через сколько минут Serial Guy должен оторваться от сериала и выключить воду, чтобы вода не переполнила тарелку. То есть нужно найти момент времени, когда тарелка будет заполнена доверху и в следующий момент переполнится.

Примечание: вода заполняет всё свободное достижимое пространство (см. пример 4). Вода течет во всех 6 направлениях, через грани кубиков 1 × 1 × 1.

Входные данные

В первой строке находится три числа k, n, m (1 ≤ k, n, m ≤ 10) — размеры тарелки. Далее содержатся k прямоугольников из n строк по m символов '.' или '#' — «слои» тарелки в порядке сверху вниз. Прямоугольники отделены пустой строкой (см. примеры). В последней строке содержатся x и y (1 ≤ x ≤ n, 1 ≤ y ≤ m) — координаты крана. x — номер строки, y — номер столбца. Строки каждого слоя нумеруются сверху вниз с 1 до n, столбцы каждого слоя нумеруются слева направо с 1 до m.

Выходные данные

В ответе должно содержаться одно число — через сколько минут тарелка наполнится.

C. Грибная вражда

Перебор поиск в глубину и подобное *2100

Паша и Аким составляли карту леса — полянки были вершинами графа, а дорожки, соединяющие полянки, были рёбрами. Они решили зашифровать количество смешливых грибов на каждой полянке следующим образом — на каждом ребре между двумя полянками они написали два числа — наибольший общий делитель (НОД) и наименьшее общее кратное (НОК) количества грибов на этих полянках. Но однажды Паша и Аким поссорились из-за смешливых грибов и порвали карту. У Паши осталась лишь какая-то часть, на которой было всего лишь m тропинок. Ваша задача — помочь Паше восстановить по карте, которая у него есть, сколько грибов было на каждой полянке. Так как ответ не обязательно однозначный, восстановите любой, либо сообщите, что такого расположения грибов не существует. Гарантируется, что на изначальной карте числа на дорожках были не меньше 1 и не больше 106.

Входные данные

В первой строке содержится два числа n и m () — количество полянок и количество дорожек, про которые мы знаем. В каждой из следующих m строк содержится четыре числа — номера полянок, которые тропинка соединяет, НОД и НОК количества грибов на этих полянках (1 ≤ НОД, НОК ≤ 106). Гарантируется, что никакая дорожка не соединяет полянку саму с собой, а между любой парой полянок существует не более одной дорожки.

Выходные данные

Выведите в первой строке "NO" если расставить числа невозможно. Иначе выведите "YES", а в следующей строчке выведите n чисел — количество грибов на соответствующей полянке.

E. Lomsat gelral

Деревья поиск в глубину и подобное снм Структуры данных *2300

Задано корневое дерево с корнем в вершине 1. Каждая вершина покрашена в некоторый цвет.

Будем говорить, что цвет c доминирует в поддереве вершины v, если нет другого цвета, который встречается в поддереве вершины v большее количество раз, чем цвет c. Таким образом, возможно два или более цвета одновременно доминируют в одном поддереве.

Поддерево вершины v — это сама вершина v и все такие вершины, путь от которых до корня обязательно проходит через вершину v.

Вам нужно для каждой вершины v определить сумму доминирующих цветов в поддереве вершины v.

Входные данные

В первой строке находится целое число n (1 ≤ n ≤ 105) — количество вершин в дереве.

В второй строке находятся n целых чисел ci (1 ≤ ci ≤ n), ci — цвет i-й вершины.

В каждой из следующей n - 1 строке находится пара целых чисел xj, yj (1 ≤ xj, yj ≤ n) — ребро дерева. Корнем дерева является вершина номер 1.

Выходные данные

Выведите n целых чисел — суммы доминирующих цветов, для каждой вершины.

D. Ациклические органические составляющие

Деревья поиск в глубину и подобное снм Строки Структуры данных хэши *2400

Дано дерево T состоящее из n вершин (пронумерованных целыми числами от 1 до n). В каждой вершине записана некоторая буква. Корень дерева расположен в вершине 1.

Рассмотрим поддерево дерево Tv некоторой вершины v. Вдоль любого просто пути, начинающегося в v и заканчивающегося в некоторой вершине (возможно, в самой v), можно прочитать некоторую строку. Обозначим количество различных строк, которые можно прочитать таким способом как .

Дополнительно: для каждой вершины v дано целое число cv. Нас интересуют вершины, в которых значение как можно больше.

Вы должны вычислить две величины — максимальное значение и количество вершин v с максимальным .

Входные данные

В первой строке входных данных записано единственное целое число n (1 ≤ n ≤ 300 000) — количество вершин в дереве T.

Во второй строке записано n целых чисел ci (0 ≤ ci ≤ 109).

В третьей строке записана строка s, состоящая из n строчных букв английского алфавита, — i-й символ этой строки соответствует букве, записанной в вершине i.

Далее следует n - 1 строка с описанием рёбер дерева T. Каждая из них содержит два целых числа u и v (1 ≤ u, v ≤ n), обозначающих ребро, которое соединяет вершины u и v.

Гарантируется, что входные данные описывают дерево.

Выходные данные

Выведите два числа — значение для всех 1 ≤ i ≤ n и количество вершин v, для которых .

Примечание

В первом примере дерево выглядит следующим образом:

Наборы строк, которые могут быть прочитаны из вершин:

Наконец, значения таковы:

Во втором примере значения таковы: (5, 4, 2, 1, 1, 1).Различные строки, которые можно прочитать из вершины 2 таковы: ; обратите внимание, что может быть прочитано как на пути до вершины 3, так и на пути до вершины 4.

B. Муудулярная Арифметика

Комбинаторика математика поиск в глубину и подобное снм теория чисел *1800

Как подобает любому порядочному школьнику, Кевин Сан изучает коровометрию, коровоматику и криптобычество в Буреновском государственном университете (БГУ) под руководством Фермера Ивана. На последнем занятии по математическому упрощению уравнений (МУУ) Кевин столкнулся со странным функциональным уравнением, для решения которого он нуждается в вашей помощи. Даны два целых числа k и p, при этом p — нечётное простое число и функциональное уравнение:

для некоторой функции . (Равенство должно выполняться для любого целого x от 0 до p - 1 включительно).

Кевин просит вас посчитать количество различных функций f, удовлетворяющих этому уравнению. Поскольку ответ может быть достаточно большим, вы должны вывести остаток от деления этого числа на 109 + 7.

Входные данные

Входные данные состоят из двух целых чисел p и k (3 ≤ p ≤ 1 000 000, 0 ≤ k ≤ p - 1). Гарантируется, что р — нечётное простое число.

Выходные данные

Выведите единственное целое число — количество различных функций f, удовлетворяющих уравнению, по модулю 109 + 7.

Примечание

В первом примере p = 3 и k = 2. Подходят следующие функции:

  1. f(0) = 0, f(1) = 1, f(2) = 2.
  2. f(0) = 0, f(1) = 2, f(2) = 1.
  3. f(0) = f(1) = f(2) = 0.

D. Настольная игра

поиск в глубину и подобное Структуры данных *2500

Вы играете в настольную карточную игру. В этой игре у игрока есть две характеристики x и y — мастерство владения светлой и тёмной магией соответственно. На столе лежат n карт заклинаний, каждая из которых имеет четыре характеристики ai, bi, ci, di. За один ход игрок может сыграть одну из карт и прочитать написанное на ней заклинание, но только в том случае, если её две первых характеристики удовлетворяют соотношениям ai ≤ x и bi ≤ y, то есть если игрок обладает достаточным мастерством владения магией для прочтения этого заклинания. Сразу после прочтения заклинания i характеристики игрока меняются и становятся равными x = ci и y = di.

В начале игры обе характеристики игрока равны нулю. Цель игры состоит в том, чтобы прочитать n-е заклинание. Ваша задача — сделать это за как можно меньшее число ходов. Заклинания можно читать в произвольном порядке и произвольное число раз (в том числе и вовсе не использовать какие-то заклинания).

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 100 000) — количество карт на столе.

В каждой из последующих n строк записано четыре целых числа ai, bi, ci, di (0 ≤ ai, bi, ci, di ≤ 109) — характеристики соответствующей карты.

Выходные данные

В первой строке выведите единственное число k — минимальное количество ходов, необходимое для прочтения n-го заклинания, а во второй строке выведите k чисел — номера карт, в том порядке, в котором их надо разыгрывать. Если правильных ответов несколько, то разрешается вывести любой.

Если прочитать n-е заклинание невозможно, то выведите  - 1.

E. Минимальное остовное дерево по каждому ребру

графы Деревья поиск в глубину и подобное снм Структуры данных *2100

Дан связный неориентированный взвешенный граф без петель и кратных ребер, состоящий из n вершин и m ребер.

Для каждого ребра графа (u, v) найдите вес такого остовного дерева, что это ребро (u, v) входит в него, и при этом вес этого остовного дерева минимален.

Весом остовного дерева называется сумма весов ребер, входящих в остовное дерево.

Входные данные

В первой строке записаны два целых числа n и m (1 ≤ n ≤ 2·105, n - 1 ≤ m ≤ 2·105) — количество вершин и ребер в графе.

В каждой из следующих m строк записаны три целых числа ui, vi, wi (1 ≤ ui, vi ≤ n, ui ≠ vi, 1 ≤ wi ≤ 109) — вершины графа, соединенные i-м ребром, и вес этого ребра.

Выходные данные

Выведите m строк: i-я строка должна содержать минимальный вес такого остовного дерева, содержащего i-ое ребро.

Ребра нумеруются от 1 до m в порядке их появления во входных данных.

D. Великая победа

графы Деревья жадные алгоритмы кратчайшие пути поиск в глубину и подобное *1800

Шапур победил Валериана. Эта победа была так важна, что Шапур решил вырезать на скале сцену поражения Валериана. Теперь ему нужно было найти наилучшее место и увековечить там свою победу!

Он решил посетить все n городов Персии чтобы найти наиболее подходящую скалу. Но недавняя война утомила его, и он не хотел много путешествовать. Поэтому он хотел посетить каждый из этих n городов хотя бы один раз. При этом пройденное расстояние должно быть как можно меньше. Персидские города соединены двусторонними дорогами. Из каждого города можно дойти до любого другого, причем единственным способом.

Все города пронумерованы от 1 до n. Шапур сейчас в городе 1, и он хочет посетить все остальные города, пройдя как можно меньше. Шапур может закончить свое путешествие в любом городе.

Найдите расстояние, которое Шапур пройдет.

Входные данные

Первая строка содержит одно целое число n (1 ≤ n ≤ 105) — количество городов.

Следующие n - 1 строк содержат по 3 целых числа xi, yi и wi (1 ≤ xi, yi ≤ n, 0 ≤ wi ≤ 2 × 104). xi и yi — номера двух городов, соединенных дорогой, а wi — длина дороги.

Выходные данные

Выведите одно число — минимальную длину пути Шапура.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать поток cout (также вы можете использовать спецификатор %I64d).

E. Корень квадратный из перестановки

графы Комбинаторика Конструктив математика поиск в глубину и подобное *2200

Перестановка длины n — это такой массив длины n, который содержит каждое из чисел от 1 до n ровно по одному разу. Например, q = [4, 5, 1, 2, 3] — это перестановка. Для перестановки q ее квадратом называется такая перестановка p что p[i] = q[q[i]] для всех i = 1... n. Например, квадрат перестановки q = [4, 5, 1, 2, 3] равен p = q2 = [2, 3, 4, 5, 1].

Эта задача об обратном понятии — квадратном корне. Вам задана перестановка p ваша задача найти такую перестановку q, что q2 = p. Если искомых перестановок q несколько, найдите любую из них.

Входные данные

В первой строке находится целое число n (1 ≤ n ≤ 106) — количество элементов в перестановке p.

Во второй строке находятся n различных чисел pi (1 ≤ pi ≤ n) — элементы перестановки p.

Выходные данные

Если перестановки q такой, что q2 = p не существует, выведите число "-1".

Если же ответ существует, то нужно вывести его. Единственная строка должна содержать n различных чисел qi (1 ≤ qi ≤ n) — элементы перестановки q. Если существует несколько перестановок q, удовлетворяющих условию q·q = p, то разрешается вывести любую из них.

D. Королевство и его города

графы Деревья дп поиск в глубину и подобное разделяй и властвуй сортировки *2800

В королевстве К готовились к свадьбе дочери Короля. Однако, чтобы не ударить в грязь лицом перед будущими родственниками, Королю сперва необходимо провести реформу королевства. Так как Королю не терпится выдать свою дочь замуж, этот вопрос ему нужно решить как можно скорее.

Королевство в данный момент состоит из n городов. Города соединены с помощью n - 1 двунаправленной дороги, причём из каждого города можно добраться до любого другого города. Поскольку в былые времена Королю приходилось много экономить, между любыми двумя городами есть ровно один простой путь.

В чём же суть реформы? Выяснилось, что для максимально эффективного управления ключевые функции государственного аппарата необходимо вынести в различные города (назовем такие города важными). Однако из-за того, что существует риск атаки со стороны варваров, это необходимо сделать осторожно. Король составил несколько планов, каждый из которых описывается набором важных городов, и теперь интересуется, какой же план лучше.

Варвары могут захватывать некоторые города, не являющиеся важными (уж те-то, разумеется, будут достаточно укреплены), после этого через захваченный город становится невозможно проехать. В частности, интересной характеристикой плана является минимальное количество городов, которое необходимо захватить варварам, чтобы все важные города оказались попарно изолированы друг от друга, то есть ни из какого важного города нельзя было доехать ни до какого другого важного города.

Помогите Королю посчитать эту характеристику для каждого своего плана.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 100 000) — число городов в королевстве.

В следующих n - 1 строках записаны по два различных числа ui, vi (1 ≤ ui, vi ≤ n) — номера городов, соединенных очередной дорогой. Гарантируется, что от каждого города можно добраться до любого другого по существующим дорогам.

В следующей строчке задано целое число q (1 ≤ q ≤ 100 000) — количество планов Короля.

Каждая из следующих q строк выглядит следующем образом: в начале записано число ki — количество важных городов в очередном плане Короля (1 ≤ ki ≤ n), затем через пробел записано ровно ki попарно различных целых чисел от 1 до n — номера важных городов в этом плане.

Сумма всех ki не превосходит 100 000.

Выходные данные

Для каждого плана выведите единственное число — минимальное количество городов, которое потребуется захватить варварам, или  - 1, если все попытки варваров изолировать важные города обречены на провал.

Примечание

В первом тесте в первом и третьем плане варварам достаточно захватить город 3. Во втором и четвёртом плане все попытки будут обречены на провал.

Во втором тесте варварам достаточно захватить города 3 и 5.

C. Лабиринт

поиск в глубину и подобное *1600

Вам задано прямоугольное клетчатое поле размером n × m. Каждая клетка либо является пустой и обозначена символом ".", либо является непроходимой (содержит препятствие) и обозначена символом "*". Пустые клетки будем называть соседними, если они имеют общую сторону.

Компонентой связности будем называть наибольшее по включению множество свободных клеток причём между любой парой клеток в компоненте существует путь из свободных клеток такой, что любые две подряд идущие клетки в пути являются соседними. Это стандартное определение компоненты связности.

Вам нужно для каждой непроходимой клетки определить размер компоненты связности (количество клеток в компоненте), включающей эту клетку, если бы клетка была свободной. Заметим, что при определении этой величины свободной считается только та непроходимая клетка, для которой считается величина, остальные непроходимые клетки остаются таковыми.

Ответ нужно вывести в виде матрицы из n строк и m столбцов. В i-й строке j-м столбце должен находиться символ ".", если клетка изначально была свободной и ответ в противном случае. Для удобства ответы нужно посчитать по модулю 10 (то есть найти остаток при делении на число 10). Матрицу нужно вывести без пробелов. Для ускорения вывода рекомендуется записать каждую строку ответа в одну строку и вывести её.

Рекомендуется для ввода и вывода данных использовать функции scanf, printf в языке C++, поскольку они работают значительно быстрее потоков cin, cout. Аналогично, рекомендуется использовать классы BufferedReader, PrintWriter вместо Scanner, System.out в языке Java.

Входные данные

В первой строке находится пара целых чисел n, m (1 ≤ n, m ≤ 1000) — количество строк и столбцов.

В каждой из следующих n строк находится по m символов: "." обозначает пустую клетку, "*" обозначает непроходимую клетку.

Выходные данные

Выведите ответ в виде матрицы как описано в условии задачи. Для уточнения формата вывода смотрите примеры.

Примечание

В первом примере, если бы центральная клетка была свободной, то она вошла бы в компоненту связности из пяти клеток (крестик). Угловые клетки, если бы были свободными образовывали бы компоненты из трёх клеток (уголки).

D. Гамильтоново остовное дерево

Деревья дп жадные алгоритмы Паросочетания поиск в глубину и подобное *2200

Группа из n городов связана сетью дорог. Первоначально между любой парой городов есть двунаправленная дорога, таким образом суммарное количество дорог равно . Чтобы проехать по любой из этих дорог, требуется ровно y секунд.

Остовным деревом называется такое подмножество дорог размера n - 1, что между любой парой городов можно проехать, используя только эти дороги.

Было выбрано некоторое остовное дерево. После этого время проезда по каждой дороге остовного дерева было изменено с y на x. Обратите внимание, не гарантируется, что x меньше y.

Вы хотели бы посетить все города по одному разу, используя кратчайший путь. Вам даны числа n, x, y и описание выбранного остовного дерева. Определите минимальное время, необходимое, чтобы посетить каждый город ровно один раз, если разрешается начать маршрут в любом городе и закончить также в любом городе.

Входные данные

В первой строке входных данных записаны три целых числа n, x и y (2 ≤ n ≤ 200 000, 1 ≤ x, y ≤ 109).

Каждая из следующих n - 1 строк содержит описание одной дороги остовного дерева. В i-й из этих строк записаны два целых числа ui и vi (1 ≤ ui, vi ≤ n) — индексы городов, соединённых i-й дорогой. Гарантируется, что эти дороги образуют остовное дерево.

Выходные данные

Выведите единственное целое число — минимальное количество секунд, которое придётся потратить на путь, проходящий через каждый город ровно один раз.

Примечание

В первом примере дороги в остовном дереве требуют 2 секунд, в то время как на другие дороги уходит 3 секунды. Один из примеров оптимального пути: .

Во втором примере нам дано такое же остовное дерево, но дороги в нём требуют 3 секунд, в то время как остальные дороги требуют 2 секунд. Один из примеров оптимального пути: .

D. Дом для червя

графы поиск в глубину и подобное *2300

Червь по имени Арни уже в который раз догрыз свой дом-яблоко и решил переехать. Он уже давно для себя определил план расположения комнат и коридоров, их соединяющих; пронумеровал все комнаты от 1 до n. Все коридоры двусторонние.

Арни хочет, чтобы новый дом выглядел абсолютно также как и предыдущий, то есть в нём должно быть ровно n комнат и, если в старом доме существовал коридор из комнаты i в комнату j, то этот коридор обязательно должен быть построен и в новом доме.

Известно, что во время постройки своего дома Арни начинает грызть яблоко из некоторой комнаты и остановится лишь тогда, когда прогрызёт все коридоры и вернётся в начальную комнату. Также известно, Арни грызёт, не прерываясь, то есть пока он не закончит строительство, в каждый момент времени он занят прогрызанием нового коридора, по уже построенным коридорам Арни не ходит.

Однако прогрызать коридоры в одном и том же порядке при каждом переезде — занятие скучное. Поэтому он, зная порядок построения коридоров в предыдущем доме, хочет прогрызть коридоры в другом порядке. Этот порядок представляет собой список комнат в процессе их посещения. Новый список должен быть лексикографически наименьший, но строго больше предыдущего. Помогите червю.

Входные данные

В первой строке дано два целых числа n и m (3 ≤ n ≤ 100, 3 ≤ m ≤ 2000) — количество комнат и коридоров в доме Арни соответственно. В следующей строке записано m + 1 натуральных чисел, не превышающих n: описание старого маршрута Арни в виде списка комнат, которые он посещал во время прогрызания. Гарантируется, что последнее число в этом списке совпадает с первым.

Первая комната, описанная во второй строке входного файла — это главный вход, поэтому Арни всегда должен начинать грызть именно с неё.

Вы можете предполагать, что ни одна комната не соединена сама с собой коридором, и если существует коридор между некоторой парой комнат, то только один. В то же время, могут существовать изолированные комнаты, не соединённые коридорами вообще.

Выходные данные

Выведите m + 1 натуральных чисел, не превышающих n: описание нового маршрута Арни, в соответствии с которым он должен прогрызать свой новый дом. Если такого маршрута не существует, выведите No solution. В вашем ответе первое число должно совпадать с m + 1-ым и являться главным входом.

E. Муравьи в листьях

Деревья жадные алгоритмы поиск в глубину и подобное сортировки *2200

Связный граф без циклов называется деревом. Листом дерева называется любая вершина, которая связана ровно с одной другой вершиной.

Задано дерево из n вершин с корнем в вершине 1. В каждом листе дерева находится один муравей. За одну секунду несколько муравьёв могут одновременно перейти в предка вершины в которой они находятся. Два муравья не могут находиться одновременно в одной вершине, за исключением корня дерева.

Определите наименьшее время за которое все муравьи смогут попасть в корень дерева. Обратите внимание, что исходно муравьи находятся только в листьях дерева.

Входные данные

В первой строкее находится целое число n (2 ≤ n ≤ 5·105) — количество вершин в дереве.

Каждая из следующих n - 1 строк содержит пару целых чисел xi, yi (1 ≤ xi, yi ≤ n) — ребра дерева. Гарантируется, что вам задано корректное дерево.

Выходные данные

Выведите целое число t — наименьшее время, необходимое, чтобы все муравьи попали в корень дерева.

D. Тестирование дерева

Бинарный поиск графы Деревья дп жадные алгоритмы поиск в глубину и подобное *2600

На уроке информатики Якоб построил модель дерева из шариков и палочек. Модель соответствует некоторому дереву, состоящему из n вершин. На создание i-го шарика Якоб потратил ai минут.

Учительница будет оценивать качество модели по количеству усилий, потраченных Якобом на создание шариков. У неё нет времени рассматривать их все, поэтому она посмотрит только на k первых шариков в порядке DFS-обхода дерева. Оценкой Якоба будет минимальное ai среди k рассмотренных шаров.

У Якоба уже не хватит времени переделать модель, но он может сам выбрать корневую вершину, из которой учительница начнёт обход. Более того, для каждой вершины Якоб может переупорядочить список её соседей как захочет. Помогите Якобу определить, какую максимальную оценку он может получить.

Порядок DFS-обхода — это последовательность номеров вершин, выписанная рекурсивной процедурой DFS. Будучи вызванной от вершины v, процедура делает следующее:

  1. Напечатать v.
  2. Пройтись по списку соседей вершины v и вызвать процедуру DFS от всех из них по очереди. Не вызывать процедуру DFS от вершины u, если мы пришли в вершину v непосредственно из u.
Входные данные

В первой строке входных данных записаны два положительных целых числа n и k (2 ≤ n ≤ 200 000, 1 ≤ k ≤ n) — количество шариков в составленном Якобом дереве и количество шариков, на которые посмотрит учительница, соответственно.

Во второй строке записаны n целых чисел ai (1 ≤ ai ≤ 1 000 000), i-е из которых соответствует количеству времени, потраченному Якобом на i-ю вершину.

Далее следует n - 1 строка, описывающая дерево. В каждой из них записаны два целых числа ui и vi (1 ≤ ui, vi ≤ n) — индексы вершин, соединённых i-м ребром.

Выходные данные

Выведите одно целое число — максимальную оценку, которую может получить Якоб, если правильно выберет корневую вершину и переупорядочит списки соседей.

Примечание

В первом примере Якоб может назначить корнем вершину 2 и переупорядочить список её соседей следующим образом: 4, 1, 5. В результате этого порядок DFS-обхода станет 2, 4, 1, 3, 5, минимальное значение ai среди первых трёх вершин равняется 3.

Во втором примере любой порядок обхода будет содержать вершину 1 на первом или втором месте, поэтому Якоб не может получить оценку больше чем 1.

F. Островной пазл

графы Деревья поиск в глубину и подобное снм *3400

В далёком островном государстве насчитывается n островов, соединённых мостами с двухсторонним движением. Текущая система мостов образует дерево. Другими словами, всего мостов n - 1, каждый мост соединяет одну пару различных островов, и от любого острова можно дойти до любого другого, используя только эти мосты.

В центре каждого острова расположен пьедестал. На всех пьедесталах всех островов, кроме одного, находится очень хрупкая статуя, причём все статуи различны. У оставшегося острова пьедестал пуст.

Жители островов договорились переупорядочить статуи определённым образом. Единственная доступная им операция — это выбрать какой-то остров, непосредственно соединённый мостом с островом с пустым пьедесталом, и аккуратно перенести статую с одного пьедестала на свободный пьедестал.

Разумеется, очень часто статуи невозможно переупорядочить требуемым образом, используя только описанную выше операцию переноса. Островитяне хотят построить ещё один дополнительный мост, такой что после этого станет возможным перенести все статуи. При этом они, конечно, хотели бы выполнить как можно меньше переносов. Помогите им определить, какой мост необходимо построить и какое минимальное количество действий выполнить, чтобы добиться желаемого расположения статуй.

Входные данные

В первой строке входных данных записано число n (2 ≤ n ≤ 200 000) — количество островов.

Во второй строке записаны n целых чисел ai (0 ≤ ai ≤ n - 1) — номер статуи, расположенной на i-м острове. Если ai = 0, то пьедестал острова пуст. Гарантируется, что все ai различны.

В третьей строке записаны n целых чисел bi (0 ≤ bi ≤ n - 1) — номер статуи, которую жители хотят поместить на i-й остров. Как и до этого, bi = 0 означает, что жители острова не хотят иметь у себя на пьедестале никакой статуи. Гарантируется, что все bi различны.

Далее следует n - 1 строка, описывающая дерево. В каждой из них записаны два целых числа ui и vi (1 ≤ ui, vi ≤ n) — индексы вершин, соединённых i-м ребром.

Выходные данные

Возможные варианты вывода:

Если переупорядочить статуи требуемым образом можно и без постройки дополнительно моста, то выведите 0 t, где t равняется минимальному требуемому количеству действий.

В противном случае выведите u, v и t (1 ≤ u < v ≤ n) — концы нового моста и минимальное количество действий, необходимое, чтобы добиться желаемого расположения статуй.

Если переставить статуи невозможно, даже построив новый мост, выведите  - 1.

Примечание

В первом примере островитяне могут соединить мостом острова 1 и 3, после чего выполнить следующую последовательность действий: передвинуть статую 1 с острова 1 на остров 2, передвинуть статую 2 с острова 3 на остров 1, передвинуть статую 1 с острова 2 на остров 3. Желаемое расположение статуй будет достигнуто за 3 действия.

Во втором примере можно просто передвинуть статую 1 с острова 1 на остров 2. Строить новых мостов не требуется.

В третьем примере переставить статуи желаемым образом невозможно, даже построив новый мост.

E. Фома Дор и дороги

Деревья дп Комбинаторика поиск в глубину и подобное Структуры данных Теория вероятностей *2300

Карта города, в котором живёт Фома Дор, представляет собой дерево (неориентированный связный граф без простых циклов), поэтому гости зовут его Древоградом. В городе n перекрёстков, соединённых n - 1 дорогой. По всем дорогам можно перемещаться в обоих направлениях.

В городе живёт m друзей Фомы Дора, i-й из них живёт рядом с перекрёстком ui, а работает рядом с перекрёстком vi. Все жители города несчастны, потому что между из домом и работой существует ровно один простой путь.

Фома Дор хочет построить ровно одну новую дорогу, которую он выберет случайно среди всех n·(n - 1) / 2 возможных дорог. Обратите внимание, что он вполне может построить новую дорогу между какой-то парой перекрёстков, уже соединённых друг с другом дорогой.

Фома знает, что каждый из его друзей будет счастлив, если после построения новой дороги будет путь из его дома до работы и обратно, который не проходит по одной дороге дважды. Формально, в графе будет существовать простой цикл, на котором лежат ui и vi.

Более того, если какой-то друг становится счастлив, то уровень его радости определяется как длина этого пути (несложно заметить, что эта длина определяется однозначно). Для каждого своего друга Фома хочет вычислить математическое ожидание значения уровня радости, то есть математическое ожидание длины цикла, если этот цикл содержит ui и vi.

Входные данные

В первой строке входных данных записаны числа n и m (2 ≤ n,  m ≤ 100 000) — количество перекрёстков в Древограде и друзей Фомы соответственно.

Далее следует n - 1 строка с описанием дорог. Каждая строка содержит два числа ai и bi (1 ≤ ai, bi ≤ n) — индексы перекрёстков, соединённых i-й дорогой.

В последних m строках описываются друзья Фомы Дора. В i-й из этих строк записаны два числа ui и vi (1 ≤ ui, vi ≤ n, ui ≠ vi) — номер перекрёстка, где живёт i друг, и номер перекрёстка, где он работает.

Выходные данные

Для каждого друга Фомы Дора вычислите математическое ожидание его уровня радости, при условии, что он будет счастлив. Ваш ответ будет считаться правильным, если его абсолютная или относительная ошибка не будет превосходить 10 - 6.

А именно: пусть ваш ответ равен a, а ответ жюри — b. Проверяющая программа будет считать ваш ответ правильным, если .

Примечание

Рассмотрим второй пример.

  1. Подходят дороги (1, 2) и (2, 3), поэтому математическое ожидание равняется
  2. Построение дорог (1, 3) и (2, 3) сделает второго друга счастливым. Как и для друга 1, ответ равен 2.5
  3. Единственный способ сделать третьего друга счастливым — это построить дорогу (2, 3), поэтому ответ равен 3

E. Игра с конфетами

битмаски дп игры поиск в глубину и подобное реализация *2000

Карлсон опять прилетел в гости к Малышу. Дома у Малыша они нашли коробку конфет и большой торт со взбитыми сливками. Карлсон сразу же предложил Малышу честно поделить найденное. А именно — сыграть с ним в игру с конфетами, которую он придумал только что. Победитель в качестве приза получит торт.

Коробка конфет имеет форму шестиугольника, внутри нее имеется 19 ячеек для конфет, в некоторых из них находятся конфеты. Игроки ходят по очереди. За ход разрешается съесть одну или несколько конфет, лежащих в соседних ячейках на одной линии, параллельной одной из сторон коробки. На картинке ниже показаны примеры допустимых и недопустимого ходов. Проигрывает игрок, который не может сделать ход.

Карлсон ходит первым — ведь это он в гостях у Малыша, а не наоборот. Игроки играют оптимальным образом. Определите, кому достанется торт.

Входные данные

Входные данные содержат 5 строк, которые содержат 19 слов, состоящих из одного символа. Слово «O» означает, что в данной ячейке находится конфета, «.» — что данная ячейка пуста. Гарантируется, что в коробке имеется хотя бы одна конфета. Смотрите примеры для более точного понимания.

Выходные данные

Если торт достанется Карлсону — выведите «Karlsson» (без кавычек), иначе выведите «Lillebror» (опять же без кавычек).

F. Шоколадное веселье

графы Деревья дп поиск в глубину и подобное *2600

У Алисы и Боба есть дерево (неориентированный связный ацикличный граф). В i-й вершине дерева лежит ai шоколадок. Сперва ребята выбирают себе стартовые вершины (Алиса выбирает первой) и забирают себе все шоколадки, которые там лежат.

Затем Алиса и Боб ходят по очереди, на каждом ходу выбирая одну вершину и забирая все лежащие там шоколадки. Чтобы разнообразить процесс, они договорились, что каждый из них может выбирать только среди вершин, которые являются соседними по отношению к выбранной этим игроком вершиной на предыдущем ходу. Более того, можно выбирать только вершины, не выбранные до этого никем другим.

Если в какой-то момент времени один из игроков не может сделать ход, он просто ожидает, пока другой игрок сделает все свои ходы. Процесс заканчивается, когда ни Алиса, ни Боб не могут больше сделать ни одного хода.

Поскольку Алиса и Боб — большие сладкоежки, они хотят собрать как можно больше шоколадок. Однако они ещё и друзья, поэтому их волнует только суммарное количество шоколадок, которое они соберут вместе. Найдите это значение, если ребята действуют оптимально.

Входные данные

В первой строке входных данных записано число n (2 ≤ n ≤ 100 000) — количество вершин в дереве.

Во второй строке записаны n целых чисел ai (1 ≤ ai ≤ 109), i-е из которых определяет количество шоколадок в вершине с номером i.

Далее следует n - 1 строка, описывающая дерево. В каждой из них записаны два целых числа ui и vi (1 ≤ ui, vi ≤ n) — индексы вершин, соединённых i-м ребром.

Выходные данные

Выведите, сколько шоколадок смогут собрать Алиса и Боб, если они будут действовать оптимально.

Примечание

В первом примере Алиса начнёт в вершине 9, а Боб в вершине 8. Затем Алиса сделает ход в вершину 1, и Боб будет вынужден остаться на месте. Алиса сделает ход в вершину 7, и игра закончится.

Во втором примере они сразу выберут две вершины и заберут их них все шоколадки.

G. Яш и деревья

битмаски математика поиск в глубину и подобное Структуры данных теория чисел *2800

Яш любит играть с деревьями, особенно если в этой игре замешаны простые числа. На его 20-й день рождения ему подарили корневое дерево, состоящее из n вершин, на котором он должен теперь отвечать на запросы. Услышав про деревья и простые числа, Яш так переполнился восхищением, что отвечать на запросы придётся теперь вам. Корнем дерева является вершина с номером 1. В каждой вершине записано некоторое целое число ai. Дополнительно нам дано целое число m.

Поступают запросы двух типов:

  1. Для данной вершины v и целого числа x — увеличить все ai в поддереве v на x.
  2. Для данной вершины v — найти количество таких простых чисел p, меньших m, что найдётся вершина u в поддереве вершины v и целое число k, такие что au = p + m·k.
Входные данные

В первой строке входных данных записаны целые числа n и m (1 ≤ n ≤ 100 000, 1 ≤ m ≤ 1000) — количество вершин в дереве и значение m, используемое в запросах, соответственно.

Во второй строке записаны n целых чисел ai (0 ≤ ai ≤ 109) — изначальные значения, записанные в вершинах дерева.

Далее следует n - 1 строка, описывающая дерево. В каждой из них записаны два целых числа ui и vi (1 ≤ ui, vi ≤ n) — индексы вершин, соединённых i-м ребром.

В следующей строке записано число q (1 ≤ q ≤ 100 000) — количество запросов к дереву, которые требуется обработать.

В каждой из последних q строк записано 1 v x или 2 v (1 ≤ v ≤ n, 0 ≤ x ≤ 109), которые определяют запрос первого или второго типа соответственно. Гарантируется, что будет хотя бы один запрос второго типа.

Выходные данные

Для каждого запроса второго типа выведите количество подходящих простых чисел.

B. Сборка генома в Берляндии

*особая задача поиск в глубину и подобное Строки *1500

Перед берляндскими учёными встала важнейшая задача — восстановить по имеющимся частям коротких фрагментов ДНК геном динозавра! У берляндского динозавра геном совсем не похож на привычный нам: в нём могут встречаться 26 различных типов нуклеотидов, причём нуклеотид каждого типа может встречаться не более одного раза. Если присвоить всем нуклеотидам различные буквы английского алфавита, то геном берляндского динозавра будет представлять собой непустую строку, состоящую из строчных букв английского алфавита, такую что каждая буква встречается в ней не более одного раза.

У учёных есть n фрагментов генома, которые представляют собой подстроки (непустые последовательности подряд идущих нуклеотидов) искомого генома.

Перед вами стоит задача: помочь учёным восстановить геном динозавра. Гарантируется, что входные данные непротиворечивы и хотя бы одна подходящая строка всегда существует. Узнав, что вы сильный программист, учёные дополнительно попросили вас из подходящих строк выбрать ту, длина которой минимальна. Если и таких строк несколько, то их устроит любая.

Входные данные

В первой строке входных данных следует целое положительное число n (1 ≤ n ≤ 100) — количество фрагментов генома.

В каждой из следующих строк следует по одному описанию фрагмента. Каждый фрагмент — это непустая строка, состоящая из различных строчных букв английского алфавита. Не гарантируется, что заданные фрагменты различны. Фрагменты могли перекрываться произвольным образом, и один фрагмент мог быть подстрокой другого.

Гарантируется, что найдется такая строка из различных букв, которая содержит все заданные фрагменты в качестве подстрок.

Выходные данные

В единственной строке выходных данных выведите геном минимальной длины, который содержит все заданные части. Все нуклеотиды в геноме должны быть различными. Если подходящих строк несколько, выведите строку минимальной длины. Если подходящих строк минимальной длины также несколько, то разрешается вывести любую из них.

C. Ремонт дорог

*особая задача графы Деревья жадные алгоритмы поиск в глубину и подобное *1800

В Берляндии есть n городов и n - 1 дорога с двусторонним движением. Каждая дорога соединяет какую-то пару городов, при этом от любого города можно доехать до любого другого, используя только данные дороги.

В каждом городе есть ровно одна ремонтная бригада. Чтобы отремонтировать какую-то дорогу, необходима одновременная работа в течение одного дня двух бригад, базирующихся в городах, которые эта дорога соединяет. Обе бригады занимаются ремонтом одной дороги весь день и не могут в этот день участвовать в ремонте других дорог, а вот ничего не делать в течение дня ремонтная бригада вполне может.

Определите минимальное количество дней, в течение которых можно отремонтировать все дороги. Бригады не могут менять города, в которых расположены изначально.

Входные данные

В первой строке входных данных содержится целое положительное число n (2 ≤ n ≤ 200 000) — количество городов в Берляндии.

В каждой из следующих n - 1 строк записаны два числа ui, vi, означающих что i-я дорога соединяет город ui с городом vi (1 ≤ ui, vi ≤ n, ui ≠ vi).

Выходные данные

Сначала выведите число k — минимальное количество дней, за которое возможно отремонтировать все дороги Берляндии.

В следующих k строках выведите описание дорог, которые должны быть отремонтированы в каждый из k дней. В i-й строке выведите сначала число di — количество дорог, которые должны быть отремонтированы в i-й день, а затем через пробел выведите di целых чисел — номера дорог, которые должны быть отремонтированы в i-й день. Дороги нумеруются согласно порядку во входных данных, начиная с единицы.

Если вариантов ответа несколько, разрешается вывести любой из них.

Примечание

В первом примере отремонтировать все дороги можно за два дня, например, отремонтировать дороги 1 и 2 в первый день, а дорогу 3 — во второй.

D. Трёхмерный черепаший суперкомпьютер

графы Перебор поиск в глубину и подобное *1800

В Черепашьей Академии Наук построили суперкомпьютер, состоящий из n·m·k процессоров. В качестве архитектуры был выбран параллелепипед размера n × m × k, разбитый на ячейки размером 1 × 1 × 1, в каждой из которых находится ровно один процессор. Таким образом, каждый процессор можно однозначно идентифицировать тройкой из номера слоя от 1 до n, номера строки от 1 до m и номера столбца от 1 до k.

В ходе работы суперкомпьютера процессоры могут отправлять друг другу сообщения по знаменитой черепашьей схеме: процессор (x, y, z) может отправлять сообщения процессорам (x + 1, y, z), (x, y + 1, z) и (x, y, z + 1) (если, конечно, такие существуют), при этом обратная связь отсутствует, то есть процессоры (x + 1, y, z), (x, y + 1, z) и (x, y, z + 1) не могут отправлять сообщения процессору (x, y, z).

Со временем некоторые процессоры вышли из строя и перестали работать. Такие процессоры не могут отправлять сообщения, принимать сообщения или служить промежуточными звеньями в пересылке сообщений. Будем говорить, что процессор (a, b, c) управляет процессором (d, e, f) , если существует цепочка из процессоров (xi, yi, zi), такая что (x1 = a, y1 = b, z1 = c), (xp = d, yp = e, zp = f) (здесь и далее p — длина цепочки), а процессор в цепочке с номером i (i < p) может отправлять сообщения процессору i + 1.

Черепахи очень беспокоятся об отказоустойчивости системы связи между оставшимися процессорами. Для этого они хотят знать количество критических процессоров. Процессор (x, y, z) называется критическим, если его отключение нарушит какое-нибудь управление, то есть если существуют два отличных от (x, y, z) процессора (a, b, c) и (d, e, f), таких что (a, b, c) управлял (d, e, f) до отключения (x, y, z) и перестал управлять им после отключения.

Входные данные

В первой строке содержатся три целых числа n, m и k (1 ≤ n, m, k ≤ 100) — размерности суперкомпьютера.

Далее следуют n блоков, описывающих текущее состояние процессоров. Блоки соответствуют слоям суперкомпьютера в порядке от 1 до n. Каждый блок состоит из m строк по k символов в каждой — описание очередного слоя в формате таблички m × k. Таким образом, состоянию процессора (x, y, z) соответствует z-й символ y-й строки блока номер x. Символ «1» соответствует работающему процессору, а символ «0» —вышедшему из строя. Блоки разделяются ровно одной пустой строкой.

Выходные данные

Выведите единственное целое число — количество критических процессоров, то есть таких, что отключение только этого процессора нарушит какое-то управление.

Примечание

В первом примере не работает весь первый слой процессоров. Во втором слое при отключении процессора (2, 1, 2) нарушится управление процессора (2, 1, 3) процессором (2, 1, 1), а при отключении процессора (2, 2, 2) нарушится управление процессора (2, 2, 3) процессором (2, 2, 1).

Во втором примере критическими являются все процессоры, кроме угловых.

В третьем примере нет ни одного процессора, управляющего другим процессором, поэтому ответ 0.

F. Медведь и химия

графы Деревья поиск в глубину и подобное Структуры данных *3300

Умный бурый мишка Лимак обожает химию, особенно ему нравятся химические реакции превращения элементов друг в друга.

В Беарляндии (родине Лимака) есть n химических элементов, пронумерованных от 1 до n. Также там существуют специальные машины, которые превращают элементы друг в друга. Каждая машина описывается парой чисел ai и bi (не обязательно различных), означающей что машина может превратить элемент ai в bi и наоборот, превратить элемент bi в ai. Машины в Беарляндии очень ненадёжные и каждая из них может быть использована не более одного раза. Допустимо, что ai = bi или несколько машин преобразуют одну и ту же пару ai и bi.

Радевуш — главный соперник Лимака, и он решил проверить его знание химии. Завтра они встретятся, и каждый принесёт с собой все имеющиеся у него машины. У Лимака есть m машин, но о машинах Радевуша он ничего не знает. Оно договорились, что Радевуш выберет два различных элемента x и y. Лимак начинает с элемента x и должен перевести его в элемент y используя имеющиеся машины, а затем перевести элемент обратно в x. Для выполнения задачи Лимак может использовать как свои машины, так и машины Радевуша, но каждую машину можно применить не более одного раза.

Известно, что у Радевуша есть непустое множество любимых элементов, и он обязательно выберет x и y из этого множества. Лимак не знает ни элементов в этом множестве, ни какие машины есть у Радевуша, но до него дошли q слухов, каждый из которых содержит описание машин Радевуша и его любимого множества.

Теперь для каждого слуха Лимак хочет знать, правда ли, что используя свои машины и машины Радевуша (согласно слуху) он сможет успешно выполнить преобразование для любой пары различных элементов x и y из множества любимых элементов Радевуша (опять же, согласно слуху).

Входные данные

В первой строке входных данных записаны три числа n, m и q (1 ≤ n, q ≤ 300 000, 0 ≤ m ≤ 300 000) — количество элементов, количество машин Лимака и количество слухов соответственно.

В каждой из последующих m строк записаны два числа ai и bi (1 ≤ ai, bi ≤ n), описывающие i-ю машину Лимака.

Затем следует q описаний слухов.

В первой строке каждого описания i-го слуха записаны два числа ni и mi (1 ≤ ni ≤ 300 000, 0 ≤ mi ≤ 300 000). Во второй строке описания записы ni различных чисел xi, 1, xi, 2, ..., xi, ni (1 ≤ xi, j ≤ n) — любимые элементы Радевуша согласно данному слуху. Обратите внимание, что если ni = 1, то Лимак автоматически выигрывает, поскольку нельзя выбрать ни одной пары различных x и y (и ответ «YES»). В следующих mi строках записаны по два числа ai, j, bi, j (1 ≤ ai, j, bi, j), описывающие Машины Радевуша в i-м слухе.

Гарантируется, что сумма всех ni не превосходит 300 000. Аналогично, сумма всех mi тоже не превосходит 300 000.

Важно! Поскольку мы хотели бы, чтобы вы обрабатывали слухи один за другим, получить очередной запрос можно только узнав ответ на предыдущий. Для этого необходимо ко всем числам, описывающим множество любимых элементов Радевуша и его машины применить следующую функцию:

int rotate(int element)
{
element=(element+R)%n;

if (element==0) {
element=n;
}

return element;
}

Здесь R изначально равняется 0 и увеличивается на порядковый номер запроса каждый раз, когда ответом является «YES». Запросы нумеруются начиная с 1 в порядке, в котором они встречаются во входных данных.

Выходные данные

Выведите q строк, для i-го запроса выведите «YES» (без кавычек), если для i-го слуха Лимак сумеет успешно перевести друг в друга любую пару элементов x и y из множества xi, 1, xi, 2, ..., xi, ni. В противном случае выведите «NO».

Примечание

Рассмотрим первый пример.

В первом слухе любимым множеством Радевуша является {4, 2} и у него нет машин. Лимак может преобразовать элемент 4 в элемент 2, а затем 2 в 3 и 3 в 4. Таким образом, ответ «YES» и R увеличивается на 1.

Во втором слухе задач набор {6, 2} и машина (3, 4), но поскольку R = 1, то реально требуется рассмотреть множество {1, 3} и машину (4, 5). Ответ «NO» и значение R не меняется.

В третьем слухе множество {6, 4, 3} и машины (2, 5) и (4, 6) переводятся в {1, 5, 4}, (3, 6) и (5, 1)

Рассмотрим возможный выбор Радевуша:

  • Если выбрать элементы 1 и 5, то Лимак может перевести 1 в 5, затем 6 в 3, 3 в 2 и, наконец, 2 в 1.
  • Если он выберет элементы 5 и 4, то Лимак может перевести 5 в 6, 6 в 3, 3 в 4, а затем 4 в 2, 2 в 1, 1 в 5.
  • Наконец, если выбрать элементы 1 и 4, то Лимак может превратить 1 в 2, потом 2 в 4, 4 в 3, 3 в 6, 6 в 5 и 5 в 1.

Таким образом Лимак может выполнить задачу для любой пары x и y и ответ «YES», а значение R увеличивается на 3 и становится равно 4.

В последнем слухе {1, 2} и (1, 2) переводятся в {5, 6} и (5, 6). Имеются две машины (5, 6) и Лимак легко справляется с заданием.

C. Путь Робота

графы Конструктив поиск в глубину и подобное *1100

Вам задано прямоугольное клетчатое поле, состоящее из n строк и m столбцов. Поле содержит цикл из символов «*», такой что:

  • цикл можно обойти, посетив каждую его клетку ровно один раз, перемещаясь каждый раз вверх/вниз/вправо/влево на одну клетку;
  • цикл не содержит самопересечений и самокасаний, то есть две клетки цикла соседствуют по стороне тогда и только тогда, когда они соседние при перемещении вдоль цикла (самокасание по углу тоже запрещено).

Ниже изображены несколько примеров допустимых циклов:

Все клетки поля, отличные от цикла, содержат символ «.». Цикл на поле ровно один. Посещать клетки, отличные от цикла, Роботу нельзя.

В одной из клеток цикла находится Робот. Эта клетка помечена символом «S». Найдите последовательность команд для Робота, чтобы обойти цикл. Каждая из четырёх возможных команд кодируется буквой и обозначает перемещение Робота на одну клетку:

  • «U» — сдвинуться на клетку вверх,
  • «R» — сдвинуться на клетку вправо,
  • «D» — сдвинуться на клетку вниз,
  • «L» — сдвинуться на клетку влево.

Робот должен обойти цикл, побывав в каждой его клетке ровно один раз (кроме стартовой точки — в ней он начинает и заканчивает свой путь).

Найдите искомую последовательность команд, допускается любое направление обхода цикла.

Входные данные

В первой строке входных данных записаны два целых числа n и m (3 ≤ n, m ≤ 100) — количество строк и столбцов прямоугольного клетчатого поля соответственно.

В следующих n строках записаны по m символов, каждый из которых — «.», «*» или «S». Гарантируется, что отличные от «.» символы образуют цикл без самопересечений и самокасаний. Также гарантируется, что на поле ровно одна клетка содержит «S» и что она принадлежит циклу. Робот не может посещать клетки, помеченные символом «.».

Выходные данные

В первую строку выходных данных выведите искомую последовательность команд для Робота. Направление обхода цикла Роботом может быть любым.

Примечание

В первом тестовом примере для обхода по часовой стрелке последовательность посещенных роботом клеток выглядит следующим образом:

  1. клетка (3, 2);
  2. клетка (3, 1);
  3. клетка (2, 1);
  4. клетка (1, 1);
  5. клетка (1, 2);
  6. клетка (1, 3);
  7. клетка (2, 3);
  8. клетка (3, 3);
  9. клетка (3, 2).

D. Гарри Поттер и Распределяющая Шляпа

Перебор поиск в глубину и подобное хэши *2200

Как известно, в Хогвартсе четыре факультета: Гриффиндор, Пуффендуй, Когтевран и Слизерин (Gryffindor, Hufflepuff, Ravenclaw, Slytherin). Распределение первокурсников по факультетам происходит с помощью Распределяющей Шляпы. Ученики вызываются по очереди, в алфавитном порядке, каждый из них должен надеть на голову Шляпу и, после некоторых размышлений, Шляпа торжественно объявляет название факультета, на который следует поступить этому ученику.

Считается, что при этом Шляпа исходит из личных качеств ученика: храбрых и благородных она отправляет в Гриффиндор, умных и сметливых — в Когтевран, упорных и честных — в Пуффендуй, а хитрых и изворотливых — в Слизерин. Однако очень обеспокоенная предстоящим распределением первокурсница Гермиона Грейнджер изучила всю литературу, касающуюся Распределяющей Шляпы, и пришла к выводу, что дело обстоит гораздо проще. В случае если родственники первокурсника уже учились в Хогвартсе, то Шляпа определяет ученика на тот же факультет, где учились его родственники. В спорных ситуациях, когда родственники учились на разных факультетах или когда они все были маглами, как у Гермионы, Шляпа определяет ученика на факультет, на который в данный момент отправлено меньше всего первокурсников. Если таких факультетов несколько, то выбор предоставляется самому ученику. Тогда ученик может выбрать любой из факультетов, на которых пока отправлено наименьшее количество первокурсников.

Гермиона уже опросила всех предшествующих ей по списку учеников об их родственниках. Теперь она и ее новые друзья Гарри Поттер и Рон Уизли хотят узнать, на какой факультет Шляпа определит Гермиону.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 10000) — количество учеников, идущих в списке раньше Гермионы. Следующая строка содержит n символов. Если все родственники ученика учились на одном и том же факультете, то i-й символ в строке совпадает с первой буквой названия этого факультета. Иначе i-й символ равен «?».

Выходные данные

Выведите все возможные факультеты, на которые может быть отправлена Гермиона. Названия факультетов следует выводить в алфавитном порядке, по одному в строке.

Примечание

Рассмотрим второй пример. Раньше Гермионы только два ученика. Первый ученик отправляется на Пуффендуй (Hufflepuff). Второму ученику предоставляется выбор между факультетами, на которые было отправлено наименьшее количество учеников, т.е. Гриффиндором, Когтевраном и Слизерином. Если он выберет Гриффиндор, то Гермионе придется выбирать между Когтевраном и Слизерином, если Когтевран — между Гриффиндором и Слизерином, если Слизерин — между Гриффиндором и Когтевраном. В итоге возможно такое стечение обстоятельств (зависящее от выбора второго ученика и самой Гермионы), что Гермиона окажется 1) на Гриффиндоре, 2) на Когтеврание, 3) на Слизерине. Отметим, что несмотря на то, что ни в одном случае Гермионе не будет предоставлен выбор между всеми тремя вариантами, они все возможны и их все нужно выводить в ответ. На Пуффендуй в данном примере Гермиона не попадет ни при каких обстоятельствах.

E. Гарри Поттер и движущиеся лестницы

поиск в глубину и подобное реализация *2900

Спасаясь от школьного завхоза Филча, Гарри Поттер потерял мантию-невидимку. Отыскать невидимый предмет — задача не из легких. К счастью, у Гарри есть друзья, готовые помочь. Гермиона Грейнджер, которая проштудировала «Мантии-невидимки и все о них», а также шесть томов «Энциклопедии по быстрому поиску кратчайших путей в графах, потоков в сетях, наибольших возрастающих подпоследовательностей и других магических объектов», уже разработала алгоритм поиска мантии-невидимки в сложных динамических системах (каковой и является Хогвартс).

Хогвартс состоит из n этажей, пронумерованных целыми числами от 1 до n. Некоторые пары этажей соединены лестницами. Лестницы могут менять свое положение, перемещая ровно один из концов. Формально: если лестница соединяет этажи a и b, то за одно перемещение она может изменить свое положение так, чтобы соединять этажи a и c или b и c, где c — любой этаж, отличный от a и b. Ни при каких обстоятельствах лестница не может соединять этаж сам с собой. В то же время между парой этажей может быть несколько лестниц.

Изначально Гарри находится на этаже с номером 1. Он не помнит, на каком этаже потерял мантию, и хочет провести поиски на каждом из этажей. Поэтому его цель — посетить каждый из n этажей не менее чем по одному разу. Гарри может посещать этажи в любом порядке и закончить поиски на любом этаже.

В последние годы лестницы перемещаются достаточно редко. Однако Рон и Гермиона готовы наложить заклятие на любую из них, чтобы помочь Гарри в поисках мантии. Чтобы вызывать поменьше подозрений, друзья планируют перемещать лестницы по одной, причем каждую лестницу не более одного раза. В промежутках между перемещением лестниц Гарри сможет передвигаться по этажам, достижимым в данный момент по лестницам, и искать свою мантию-невидимку. Предполагается, что все это время самопроизвольно перемещаться лестницы не будут.

Помогите друзьям разработать план поисков. В случае если вариантов решения несколько, допустим любой корректный вариант (не обязательно оптимальный).

Входные данные

В первой строке заданы целые числа n и m (1 ≤ n ≤ 100000, 0 ≤ m ≤ 200000) — количество этажей и количество лестниц в Хогвартсе соответственно. Следующие m строк содержат пары этажей, соединяемых лестницами в начальный момент времени.

Выходные данные

В первой строке выведите «YES» (без кавычек), если Гарри сможет обыскать все этажи, и «NO» в противном случае. В случае положительного ответа во второй строке выведите количество лестниц, которые Рон и Гермиона должны будут переместить. Дальнейший вывод должен иметь вид:

перемещения Гарри

перемещение лестницы

перемещения Гарри

перемещение лестницы

...

перемещение лестницы

перемещения Гарри

Каждый блок «перемещения Гарри» должен представлять собой список этажей в порядке их посещения. Суммарное число элементов в списках перемещений Гарри не должно превосходить 106. При выводе каждого списка сначала выводится количество элементов в нем, затем в той же строке — сами элементы через пробел. Первым числом в первом списке должен быть номер 1 (этаж, с которого Гарри начинает поиски). Любой список, кроме первого, может содержать нулевое количество элементов. Обратите внимание, что Гарри может посещать некоторые этажи повторно, но обязательно должен посетить все n этажей хотя бы по одному разу. Два последовательно посещаемых этажа должны быть непосредственно соединены лестницей (в момент перехода между ними). Никакие два этажа, посещенные последовательно, не должны совпадать.

При описании «перемещения лестницы» указывается номер лестницы (лестницы нумеруются целыми числами от 1 до m в порядке их задания во входных данных) и ее новое положение (два номера соединяемых этажей в произвольном порядке).

Одну лестницу можно переместить не более одного раза. Если решений несколько, выведите любое.

C. Сжатие таблицы

графы дп жадные алгоритмы поиск в глубину и подобное снм *2200

Петя увлёкся алгоритмами сжатия данных. Он уже изучил форматы gz, bz, zip и несколько других. Воодушевившись новыми знаниями, Петя собрался разработать свой формат сжатия и назвать его dis.

Петя решил сжимать таблицы. У него есть таблица, состоящая из n строк и m столбцов, заполненная целыми положительными числами. Он хочет заменить значения элементов таблицы на целые положительные числа так, чтобы отношение элементов в каждой строке и каждом столбце не изменилось. То есть, если в некоторой строке исходной таблицы ai, j < ai, k, то и в сжатой таблице a'i, j < a'i, k, и если ai, j = ai, k, то a'i, j = a'i, k. Аналогично, если в некотором столбце исходной таблицы ai, j < ap, j, то и в сжатой таблице a'i, j < a'p, j, и если ai, j = ap, j, то a'i, j = a'p, j.

Поскольку большие значения требуют больше места для хранения, максимальное значение элемента получившейся матрицы должно быть как можно меньше.

В теории Петя мастер, но вот писать код он не любит. Помогите ему реализовать формат сжатия dis.

Входные данные

В первой строке входных данных содержатся два числа n и m ( — количество строк и столбцов таблицы соответственно.

В следующих n строках содержится по m целых чисел ai, j (1 ≤ ai, j ≤ 109) — значения элементов таблицы.

Выходные данные

Выведите сжатую таблицу: n строк, содержащих по m чисел.

Если существует несколько ответов, минимизирующих максимальное число, то разрешается вывести любой из них.

Примечание

В первом примере a1, 2 ≠ a2, 1, но, поскольку они не располагаются в одной строке или в одном столбце, при сжатии их можно сделать равными.

E. Часовой механизм

Деревья жадные алгоритмы поиск в глубину и подобное снм Структуры данных *3200

Меня зовут Джим ди Гриз, я самый ловкий мошенник и авантюрист во всей галактике. По мотивам моих похождений написано множество книг, а ограблениям, совершённым мною, нет числа. Однако вы смогли застать меня в весьма неприятной ситуации.

Не обнаружив себя перед камерами, перехитрив десяток охранников и обойдя множество ловушек, я смог добраться до желанного ящика с сокровищами. Отворив его крышку, я активировал бомбу с часовым механизмом, который уже отсчитывает секунды до неминуемого взрыва! К счастью, мне уже приходилось сталкиваться с бомбами подобной модели, и я знаю, что часовой механизм можно остановить, если правильно соединить проводами контакты на панели управления.

Передо мной n контактов, соединённых n - 1 проводами. Контакты пронумерованы целыми числами от 1 до n. Бомба устроена таким образом, что если некоторый набор из k ≥ 2 контактов c1, c2, ..., ck соединён по циклу, то есть между парами контактов c1 и c2, c2 и c3, ..., ck и c1 есть k различных проводов, то срабатывает проверка безопасности, и заряд мгновенно детонирует, не оставляя от неудачливого взломщика и следа. В том числе, если два контакта соединены более чем одним проводом, то на них образуется цикл длины 2, и бомба также взрывается. Соединять контакт с самим собой запрещается.

С другой стороны, если я отсоединю одновременно более чем один провод (иными словами, в какой-то момент времени будет подключено менее n - 2 проводов), то сработает другая проверка безопасности, которая приведёт к такому же плачевному результату. Таким образом, всё, что мне остаётся, это последовательно вытаскивать провод и вставлять его в новое место, следя, чтобы не образовалось цикла, связывающего контакты.

Я знаю, как надо расположить провода, чтобы остановить часовой механизм. Но у меня остаётся всё меньше и меньше времени на это! Помогите мне выбраться из передряги: найдите кратчайшую последовательность безопасных операций, каждая из которых представляет собой отключение определённого провода и его подключение в новое место, а также выстраивает провода требуемым образом.

Входные данные

В первой строке входных данных находится число n (2 ≤ n ≤ 500 000) — количество контактов.

В каждой из последующих n - 1 строках записана пара целых чисел xi, yi (1 ≤ xi, yi ≤ n, xi ≠ yi), обозначающих номера контактов, соединённых очередным проводом в данный момент времени.

В последних n - 1 строках в аналогичном формате задаётся схема подключения проводов, останавливающая часовой механизм.

Гарантируется, что обе заданных схемы корректны (то есть, не содержат циклов и проводов, соединяющих контакт с самим собой).

Выходные данные

В первой строке выведите число k (k ≥ 0) — минимальное количество проводов, которые потребуется переподключить.

В последующих k строках выведите четвёрки чисел ai, bi, ci, di, означающих, что на i-м шаге нужно отсоединить провод, соединяющий контакты ai и bi, и соединить им контакты ci и di. Разумеется, к этому моменту времени провод между контактами ai и bi должен присутствовать на схеме.

Если оптимальных последовательностей несколько, то выведите любую из них.

Если требуемой последовательности операций не существует, выведите одно число -1.

Примечание

Картинка с пояснением к тестам из условия:

E. В погоне за артефактами

графы Деревья поиск в глубину и подобное снм *2300

Павел снова играет в одну известную компьютерную игру. Игроку предоставлена в распоряжение целая страна, где можно свободно путешествовать, выполнять квесты и набирать опыт.

В этой стране n островов и m мостов, расположенных между островами так, что от каждого острова можно добраться до каждого. В середине некоторых мостов лежат древние могущественные артефакты. Павлу сами по себе артефакты не нужны, зато он может неплохо заработать, продав хотя бы один такой артефакт.

В начале игры Павел находится на острове a, а торговец артефактами — на острове b (возможно, на том же самом, что и Павел). Павел хочет найти артефакт, прийти к торговцу и продать его. Проблема осложняется тем, что мосты между островами очень старые и разрушаются сразу после того, как по ним пройти. Так как персонаж Павла не умеет плавать, летать и телепортироваться, задача становится не такой и простой!

Обратите внимание, что Павел не может пройти половину моста, забрать артефакт и вернуться на тот же остров.

Определите, сможет ли Павел найти артефакт и принести его к торговцу.

Входные данные

В первой строке находятся два целых числа n и m (1 ≤ n ≤ 3·105, 0 ≤ m ≤ 3·105) — количество островов и мостов в игре.

В каждой из следующих m строк находится описание моста — три целых числа xi, yi, zi, записанные через пробел (1 ≤ xi, yi ≤ n, xi ≠ yi, 0 ≤ zi ≤ 1), где xi и yi — номера островов, соединенных i-ым мостом, а zi равно единице, если на этом мосту находится артефакт, и нулю — иначе. Между любыми двумя островами проложено не более одного моста. Гарантируется, что из любого города можно попасть в любой другой двигаясь по мостам.

В последней строке находятся два целых числа a и b (1 ≤ a, b ≤ n) — номера островов, на которых находятся Павел и торговец артефактами соответственно.

Выходные данные

Если Павел сможет добыть артефакт и продать его торговцу, выведите «YES» (без кавычек). Иначе выведите «NO» (без кавычек).

B. Медвежонок и сжатие

дп Перебор поиск в глубину и подобное Строки *1300

Полярный медвежонок Лимак терпеть не может длинные строки, поэтому предпочитает сжимать их. К тому же он ещё маленький и знает только первые шесть букв английского алфавита: 'a', 'b', 'c', 'd', 'e' и 'f'.

Имеется q операций сжатия строк. Операции можно применять в любом порядке и каждую можно применить произвольное количество раз. Операция с номером i задаётся строкой ai длины два и строкой bi длины один. Все строки ai различны.

Если у Лимака есть строка s, то он может применить к ней i-ю операцию, только если первые два символа этой строки совпадают со строкой ai. Применение операции заключается в отбрасывании этих двух символов и приписывании в начало строки bi. Для пояснения посмотрите примечание.

Несложно заметить, что применение любой операции уменьшает длину строки s ровно на 1. Также для некоторых наборов операций возможно существование строки, сжатие которой невозможно, потому что первые две буквы не совпадают ни с одной из строк ai.

Лимак хочет начать со строки длины n и применить n - 1 операцию, чтобы в итоге получить строку «a». Сколько существует подходящих строк, из которых можно получить «a»? Не забывайте, что Лимак может использовать только те буквы, которые ему знакомы.

Входные данные

В первой строке записаны два числа n и q (2 ≤ n ≤ 6, 1 ≤ q ≤ 36) — начальная длина строки и количество доступных операций соответственно.

В следующих q строках даны описания операций. В i-й из них записаны строки ai и bi (|ai| = 2, |bi| = 1). Гарантируется, что ai ≠ aj для всех i ≠ j и что все ai и bi состоят только из первых шести строчных букв английского алфавита.

Выходные данные

Выведите количество строк длины n, таких что Лимак сможет перевести в строку «a», используя только имеющиеся q операций.

Примечание

В первом примере существует 4 строки длины 3, из которых Лимак сможет получить строку «a»: "abb", "cab", "cca", "eea".

Для сжатия первой строки Лимаку достаточно два раза применить первую операций (замена «ab» на «a»). Первое применение превратит строку «abb» в «ab», а второе превратит «ab» в «a».

Остальные строки можно превратить в «a» следующим образом:

  • "cab" "ab" "a"
  • "cca" "ca" "a"
  • "eea" "ca" "a"

Во втором примере единственной подходящей строкой является «eb».

E. Медвежонок и забытое дерево 2

графы Деревья поиск в глубину и подобное снм *2400

Деревом называется связный неориентированный граф, состоящий из n вершин и n - 1 ребра. Вершины пронумерованы целыми числами от 1 до n.

У полярного медвежонка Лимака было дерево, но он его потерял. Однако он всё ещё помнит о нём некоторые факты.

Вам даны m пар вершин (a1, b1), (a2, b2), ..., (am, bm). Лимак точно помнит, что между вершинами ai и bi не было ребра. Помимо этого, он помнит, что в дереве было ровно k рёбер инцидентных вершин 1 (степень вершины 1 равнялась k).

Проверьте, существует ли хотя бы одно дерево, подходящее под описание Лимака.

Входные данные

В первой строке входных данных записаны три числа n, m и k () — количество вершин в дереве Лимака, количество запрещённых пар вершин и степень вершины 1 соответственно.

В i-й из следующих m строк записаны два различных числа ai и bi (1 ≤ ai, bi ≤ n, ai ≠ bi) — iзапрещённая пара. Гарантируется, что каждая пара вершин встречается во входных данных не более одного раза.

Выходные данные

Если существует хотя бы одно дерево, подходящее под описание Лимака, то выведите «possible» (без кавычек). В противном случае выведите «impossible» (без кавычек).

Примечание

В первом примере дерево состоит из 5 вершин. Степень вершины 1 должна быть равна 2. Все условия будут выполнены для дерева, состоящего из рёбер 1 - 5, 5 - 2, 1 - 3 и 3 - 4.

Во втором примере Лимак помнит, что не существовало рёбер 1 - 2, 1 - 3, 1 - 4, 1 - 5 и 1 - 6. Таким образом, вершина 1 не могла быть соединена ни с одной другой вершиной, и подходящего дерева не существует.

E. Новая реформа

графы жадные алгоритмы поиск в глубину и подобное снм Структуры данных *1600

В Берляндии есть n городов, соединённых m двусторонними дорогами. Дороги не могут соединять город с самим собой, и каждая пара городов соединяется не более чем одной дорогой. Не гарантируется, что из любого города можно доехать до любого другого, используя только имеющиеся дороги.

Президент Берляндии решил внести изменения в систему дорожных путей и дал указание министерству транспорта заняться данной реформой. Теперь каждая дорога должна стать односторонней (вести только из одного города в другой).

Чтобы не вызвать большого недовольства у жителей, необходимо провести реформу так, чтобы оставалось как можно меньше обособленных городов. Город считается обособленным, если в него не входит ни одна дорога, при этом выходящие из этого города дороги допустимы.

Помогите министерству транспорта найти минимальное количество обособленных городов после проведения реформы.

Входные данные

В первой строке входных данных следуют два целых положительных числа n и m — количество городов и дорог в Берляндии (2 ≤ n ≤ 100 000, 1 ≤ m ≤ 100 000).

В следующих m строках содержатся описания дорог: i-я дорога задаётся двумя различными целыми числами xi, yi (1 ≤ xi, yi ≤ n, xi ≠ yi), где xi и yi равны номерам городов, которые соединяет i-я дорога.

Гарантируется, что между каждой парой городов не может быть более одной дороги, но не гарантируется, что из любого города можно доехать до любого другого, используя только дороги.

Выходные данные

Выведите единственное число — минимальное количество обособленных городов после проведения реформы.

Примечание

В первом примере допустима следующая ориентация дорог: , , .

Во втором примере: , , , , .

В третьем примере: , , , , .

F. Поликарп и сено

графы жадные алгоритмы поиск в глубину и подобное снм сортировки *2000

У фермера Поликарпа есть склад с сеном, который можно представить как прямоугольную таблицу n × m, где n — количество строк, а m — количество столбцов в таблице. В каждой клетке таблицы содержится стог сена. Высота в метрах стога, расположенного в i-й строке и j-м столбце, равна целому числу ai, j и совпадает с количеством кубометров сена в данном стоге, поскольку все клетки имеют размер основания 1 × 1.

Поликарп решил навести на складе порядок, сняв некоторое целое количество кубометров сена с верхушки каждого стога. С разных стогов разрешается снимать различный объем сена. В том числе стог разрешается не трогать совсем или, наоборот, убирать полностью. Если стог убран полностью, то соответствующая клетка становится пустой и стога более не содержит.

Поликарп хочет, чтобы после реорганизации выполнялись следующие требования:

  • суммарный объём сена на складе должен быть в точности равен k,
  • высоты всех стогов (то есть клеток, содержащих ненулевое количество сена) должны быть одинаковыми,
  • высота хотя бы одного стога должна остаться такой же, как была,
  • для устойчивости оставшейся конструкции все стога должны представлять собой одну связную область.

Два стога считаются соседними, если они имеют общую сторону в таблице. Область называется связной, если от любого стога этой области можно добраться до любого другого стога этой области, двигаясь только по соседним стогам. При этом два соседних стога обязательно принадлежат одной области.

Помогите Поликарпу выполнить это нелёгкое задание или сообщите, что это невозможно.

Входные данные

В первой строке входных данных находятся три целых числа n, m (1 ≤ n, m ≤ 1000) и k (1 ≤ k ≤ 1018) — количество строк и столбцов прямоугольной таблицы, в которую уложены стога с сеном, и требуемое суммарное количество кубометров сена после реорганизации.

Далее следует n строк по m целых положительных чисел ai, j (1 ≤ ai, j ≤ 109), где ai, j равно количеству кубометров сена, из которых состоит стог, который находится в i-й строке и j-м столбце таблицы.

Выходные данные

В первой строке выведите «YES», если Поликарп сможет совершить реорганизацию, и «NO» в противном случае. Если ответ «YES», то в следующих n строках выведите по m чисел — высоты оставшихся стогов. Все оставшиеся ненулевые значения должны быть равны, представлять собой связанную область, и хотя бы одно из этих значений не должно быть изменено.

Если существует несколько ответов, разрешается вывести любой из них.

Примечание

В первом примере ненулевые значения составляют связную область, значения не превосходят начальных высот стогов. Все ненулевые значения равны 7, а их количество равно 5, значит суммарный объём оставшегося сена равен требуемому значению k = 7·5 = 35. При этом стог, находящийся во второй строке и третьем столбце, остался нетронутым.

B. Покраска графа

графы поиск в глубину и подобное *2200

Дан неориентированный граф из n вершин и m рёбер. Каждое из рёбер графа изначально покрашено либо в красный, либо в синий цвет. За один ход разрешается выбрать произвольную вершину, и изменить цвета всех инцидентных ей рёбер, то есть все красные рёбра, заканчивающиеся в этой вершине, становятся синими, и наоборот, все синие становятся красными.

Найдите кратчайшую последовательность ходов, после выполнения которой все рёбра графа будут покрашены в один цвет.

Входные данные

В первой строке входных данных записаны два числа n и m (1 ≤ n, m ≤ 100 000) — количество вершин и количество рёбер в графе соответственно.

Следующие m строк задают ребра графа, i-я из них содержит два числа ui и vi ci (1 ≤ ui, vi ≤ n, ui ≠ vi) — номера вершин, соединённых i-м ребром, и символ ci (), определяющий цвет данного ребра. Если ci равняется 'R', то данное ребро изначально красное, а если 'B', то синее. Гарантируется, что граф не содержит петель и кратных рёбер.

Выходные данные

Если не существует способа сделать цвета всех рёбер одинаковыми, то выведите  - 1 в единственной строке выходных данных. В противном случае сначала выведите k — минимальное необходимое число ходов, а затем выведите k чисел a1, a2, ..., ak, где ai равняется номеру вершины, выбираемой на i-м ходу.

Если подходящих оптимальных последовательностей несколько, то разрешается вывести любую из них.

C. Медвежонок и клетчатое поле

поиск в глубину и подобное реализация снм *2400

Вам дано клетчатое поле из n строк и n столбцов. Каждая клетка либо пуста (обозначается символом «.»), либо занята (обозначается символом «X»).

Две пустые клетки соединены напрямую, если у них есть общая сторона. Две клетки (r1, c1) (то есть клетка, расположенная в ряду r1 и столбце c1) и (r2, c2) соединены путём, если существует последовательность пустых клеток, начинающаяся с (r1, c1) и заканчивающаяся на (r2, c2), такая что любые две соседние клетки последовательности соединены напрямую. Компонентой связности называется множество пустых клеток, такое что любые две клетки множества соединены путём, и при этом никакая клетка множества не соединена путём ни с какой пустой клеткой не из этого множества.

Ваш друг Лимак — большой медведь гризли, способный разрушать препятствия в некоторой области. Точнее, вы можете попросить Лимака разрушить все препятствия в некотором квадрате k × k, то есть превратить все занятые клетки в свободные. Однако попросить помощи у Лимака можно только один раз.

Выбранный квадрат должен находиться строго внутри сетки. Возможно, что все клетки уже пусты и помощь Лимака вам никак не поможет.

Вы любите большие компоненты связности. Какую самую большую компоненту связности можно получить, попросив Лимака о помощи не более одного раза?

Входные данные

В первой строке входных данных записаны два целых числа n и k (1 ≤ k ≤ n ≤ 500) — размер сетки и размер помощи Лимака соответственно.

В каждой из последующих n строк записаны n символов, определяющих i-ю строку поля. Каждый символ — это либо «.», либо «X», обозначающие соответственно пустую или занятую клетку.

Выходные данные

Выведите максимально возможный размер (количество клеток) одной компоненты связности после помощи Лимака.

Примечание

В первом примере Лимак может сделать пустыми все клетки в каком-нибудь квадрате размером 2 × 2. Оптимальный способ выбрать квадрат показан красным на левом рисунке ниже. Таким образом, можно получить компоненту связности размером 10 клеток, отмеченную синим на правом рисунке ниже.

D. Медведь и преследование

графы математика Перебор поиск в глубину и подобное реализация Теория вероятностей *2900

В Беарляндии n городов, пронумерованных целыми числами от 1 до n. Они соединены m двунаправленными дорогами. Дорога номер i соединяет два различных города ai и bi, и никакие две дороги не соединяют одну и ту же пару городов. От любого города можно добраться до любого другого, используя только данные дороги.

Расстоянием между городами a и b называется минимальное количество дорог, которыми придётся воспользоваться, чтобы попасть из a в b.

Лимак — медведь гризли. Он преступник, и ваша задача его поймать, или, по крайней мере, попытаться. У вас осталось только два дня (сегодня и завтра), а затем он улизнёт навсегда.

Ваше главное оружие — БВД (Беарляндский Высокоточный Детектор). Когда вы используете БВД, находясь при этом в каком-нибудь городе, он сообщает вам расстояние между городом, где вы находитесь, и городом, где сейчас находится Лимак. К сожалению, БВД может быть использован только один раз в день.

Вам мало что известно о местоположении Лимака, поэтому вы предполагаете, что он находится в одном из n городов страны, выбранном случайно и с равной вероятностью (то есть Лимак изначально находится в каждом городе с вероятностью ). Вы разработали следующий план:

  1. Выбрать один из городов и применить там БВД.
    • Сразу после применения БВД можно попытаться поймать Лимака (но это может быть плохой идеей). В этом случае вы выбираете какой-то город и ищете Лимака там. Если Лимак действительно в этом городе, то вы выигрываете, в противном случае Лимак становится осторожнее, и его уже никогда не поймать (вы проигрываете).
  2. Подождать 24 часа и снова применить БВД. Вы знаете, что за это время Лимак обязательно изменит своё местоположение, а именно, он выберет случайно и равновероятно одну дорогу ведущую из его текущего города и пройдёт по ней в соседний город.
  3. На следующий день вы можете снова выбрать любой город и применить БВД там.
  4. Теперь уже обязательно попробовать поймать Лимака. Для этого вы выбираете какой-то город и ищете в нём Лимака. Если он там, то вы побеждаете, если нет — проигрываете.

Каждый раз, когда вам требуется выбрать город, вы можете выбирать любой из n городов, то есть мгновенное перемещение не является для вас проблемой.

Чему равна вероятность поймать Лимака, если вы будете действовать оптимально?

Входные данные

В первой строке входных данных записаны два числа n и m (2 ≤ n ≤ 400, ) — количество городов и количество дорог соответственно.

Затем следуют m строк, описывающих дороги. В i-й из этих строк записаны два числа ai и bi (1 ≤ ai, bi ≤ n, ai ≠ bi) — номера городов, соединённых i-й дорогой.

Гарантируется, что никакая пара городов не соединена более чем одной дорогой и что от любого города можно добраться до любого другого, используя только данные дороги.

Выходные данные

Выведите одно вещественное число — вероятность обнаружить Лимака, если действовать оптимально. Ваш ответ будет считаться правильным, если его абсолютная ошибка не будет превосходить 10 - 6.

А именно: пусть ваш ответ равен a, а ответ жюри — b. Проверяющая программа будет считать ваш ответ правильным, если |a - b| ≤ 10 - 6.

Примечание

В первом примере Беарляндия состоит из трёх городов, и между каждой парой этих городов есть дорога. Рассмотрим один из оптимальных сценариев.

  1. Использовать БВД в городе 1.
    • С вероятностью Лимак окажется в этом городе, и БВД выдаст расстояние 0. В таком случае нужно сразу хватать Лимака — мы точно не ошибёмся.
    • С вероятностью расстояние равно 1, потому что Лимак находится в городе 2 или городе 3. В этом случае оптимально будет дождаться следующего дня.
  2. Вы ждёте, а Лимак переходит в соседний город.
    • С вероятностью Лимак находился в городе 2 и перешёл в город 3.
    • он перешёл из 2 в 1.
    • он перешёл из 3 в 2.
    • он перешёл из 3 в 1.
  3. Снова использовать БВД в городе 1 (хотя разрешено сделать это и в любом другом городе).
    • Если расстояние 0, то Лимак находится в городе 1 (вы побеждаете).
    • Если расстояние 1, то Лимак либо в городе 2, либо в городе 3. Тогда попробуем поискать его в городе 2 (или 3, не имеет значения).

Пользуясь такой стратегией, вы проиграете, только если Лимак был изначально в городе 2 и перешёл в город 3. Вероятность проигрыша равна . Ответ равен .

D. Подарки по списку

графы Деревья Конструктив поиск в глубину и подобное *2000

Саша живет в большой дружной семье. В Мужской День мужчины из этой семьи собираются вместе и празднуют его, следуя своей особой традиции. В семье Саши n мужчин, поэтому для простоты будем нумеровать их от 1 до n.

Каждый мужчина имеет не более одного отца, но может иметь произвольное количество сыновей.

Мужчина с номером A является предком мужчины с номером B, если выполняется хотя бы одно из утверждений:

  • A = B;
  • мужчина с номером A — отец мужчины с номером B;
  • существует такой номер C, что мужчина с номером A — предок мужчины с номером C, а мужчина с номером C — отец мужчины с номером B.

Конечно же, если мужчина с номером A является предком мужчины с номером B, причём A ≠ B, то мужчина с номером B не может являться предком мужчины с номером A.

На Мужской День в семье Саши принято дарить подарки. Просто так дарить подарки скучно, поэтому в этой семье процесс дарения каждый год выглядит следующим образом.

  1. Определяется список кандидатов, в котором перечислены некоторые из n мужчин в определённом порядке.
  2. Каждый из n мужчин решает сделать подарок.
  3. Чтобы сделать кому-нибудь подарок, мужчина выбирает из составленного списка первого члена семьи, который является его предком, и делает ему подарок. В частности, он может сделать подарок сам себе.
  4. Если в списке нет ни одного предка какого-нибудь мужчины, то он расстраивается и покидает праздник, так и не подарив никому подарок.

В этом году вы решили помочь с организацией праздника и узнали у каждого из n мужчин, кому из своих предков он хочет сделать подарок. Сможете ли вы построить список кандидатов таким образом, чтобы удовлетворить желание каждого?

Входные данные

В первой строке входных данных записаны два числа n и m (0 ≤ m < n ≤ 100 000) — число мужчин в семье и число родственных связей.

В следующих m строках описываются родственные связи: в (i + 1)-й строке содержится пара чисел pi и qi (1 ≤ pi, qi ≤ n, pi ≠ qi), означающая, что мужчина с номером pi является отцом мужчины с номером qi. Гарантируется, что никакая пара чисел не встречается более одного раза, что для любых двух различных членов семьи хотя бы один из них не является предком другого и что никакой член семьи не имеет более одного отца.

В следующей строке дана последовательность n целых чисел a1, a2, ..., an (1 ≤ ai ≤ n), i-е число в которой обозначает, что мужчина с номером i хочет сделать подарок мужчине с номером ai. Гарантируется, что для всех 1 ≤ i ≤ n мужчина с номером ai является предком мужчины с номером i.

Выходные данные

В первой строке выведите целое число k (1 ≤ k ≤ n) — количество мужчин в списке кандидатов.

Затем выведите k различных неотрицательных целых чисел — номера мужчин в списке кандидатов в порядке, определяющем необходимый выбор каждого из n мужчин, — по одному в строке.

Если подходящих списков несколько, выведите любой из них. Если подходящего списка не существует, выведите  - 1 в единственной строке выходных данных.

Примечание

Пояснение к первому примеру:

  • если в списке не будет 1, то желания первого и третьего мужчины не сбудутся (a1 = a3 = 1);
  • если в списке не будет 2, то желание второго мужчины не сбудется (a2 = 2);
  • если разместить в ответе 1 перед 2, то второму мужчине придется дарить подарок первому мужчине, а не себе (a2 = 2);
  • если же разместить мужчину с номером 2 перед мужчиной с номером 1, то третьему мужчине придется дарить подарок второму мужчине, а не первому (a3 = 1).

C. Алёна и дерево

графы Деревья дп поиск в глубину и подобное *1600

Алёна решила сесть на диету и пошла в лес за яблоками. Внезапно она обнаружила волшебное корневое дерево с корнем в вершине 1, на каждом ребре и в каждой вершине которого записаны некоторые числа.

Девочка заметила, что некоторые вершины дерева грустят, поэтому она решила с ними поиграть. Назовем вершину v грустной, если в ее поддереве найдется вершина u, такая что dist(v, u) > au, где au — число, записанное в вершине u, а dist(v, u) — сумма чисел на ребрах на пути от v до u.

Листьями дерева называются вершины, соединенные ребром ровно с одной вершиной, а корень дерева является листом тогда и только тогда, когда дерево состоит из единственной вершины-корня.

Алёна решила удалять листья дерева до тех пор, пока все вершины не перестанут грустить. Какое минимальное количество листьев нужно удалить Алёне?

Входные данные

В первой строке входных данных записано целое число n (1 ≤ n ≤ 105) — количество вершин в дереве.

Во второй строке входных данных заданы n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 109), где ai — число, записанное в вершине i.

В следующих n - 1 строках описываются ребра дерева: в i-й из этих строк записана пара чисел pi и ci (1 ≤ pi ≤ n,  - 109 ≤ ci ≤ 109), означающих, что вершины i + 1 и pi дерева соединены ребром, на котором записано число ci.

Выходные данные

Выведите минимальное количество листьев, которое требуется удалить Алёне, чтобы не осталось ни одной грустной вершины.

Примечание

Процесс удаления листьев дерева из первого примера может выглядеть так:

B. Кай и снежинки

Деревья дп поиск в глубину и подобное Структуры данных *1900

После того как Каю в глаз попал осколок дьявольского зеркала, его уже не трогала красота роз. Зато он начал любоваться снежинками.

Однажды в сад прилетела большая снежинка, имеющая форму корневого дерева (связного графа без циклов) на n вершинах. Корнем дерева является вершина номер 1. Кай очень заинтересовался его структурой.

После долгого изучения Каю стали интересны ответы на некоторые запросы про q вершин. А именно: для i-го запроса ему интересно, какой номер имеет центроид поддерева vi-й вершины.

Ваша задача — ответить на все запросы Кая.

Поддеревом вершины называется часть дерева, состояющая из этой вершины, а также всех её потомков. Другими словами, поддерево вершины v состоит из таких вершин u, что v обязательно присутствует на пути от u до корня дерева.

Центроидом дерева называется вершина, при удалении которой дерево развалится на компоненты связности, каждая из которых не превосходит по количеству вершин половину числа вершин исходного дерева.

Входные данные

В первой строке входных данных записаны два числа n и q (2 ≤ n ≤ 300 000, 1 ≤ q ≤ 300 000) — размер исходного дерева и количество запросов соответственно.

Во второй строке записаны n - 1 число p2, p3, ..., pn (1 ≤ pi ≤ n) — номера предков вершин с номерами от 2 до n. Вершина 1 является корнем дерева. Гарантируется, что значения pi определяют корректное дерево.

В каждой из последующих q строк записано одно целое число vi (1 ≤ vi ≤ n)  — номер вершины, в поддереве которой надо найти центроид.

Выходные данные

На каждый запрос выведите номер центроида соответствующего поддерева в отдельной строке. Если центроидов в поддереве несколько, выведите любой. Гарантируется, что у каждого поддерева заданного дерева есть хотя бы один центроид.

Примечание

Первый вопрос спрашивает о центроиде всего дерева — это вершина 3, её удаление оставит четыре компоненты связности, две размера 1 и две размера 2.

Поддерево второй вершины состоит только из неё самой, поэтому ответ 2.

Вершина 3 также является центроидом собственного поддерева.

Центроидами поддерева 5 являются вершины 5 и 6 — оба этих ответа являются корректными.

A. NP-трудная задача

графы поиск в глубину и подобное *1500

Недавно Пари и Арий узнали про NP-трудные задачи, особенно им понравилась задача о минимальном вершинном покрытии.

Пусть нам дан некоторый граф G. Подмножество A его вершин называется вершинным покрытием, если для любого ребра uv хотя бы один его конец лежит в множестве, то есть выполнено или (или оба условия).

Пари и Арий выиграли на командной олимпиаде чудесный неориентированный граф, и теперь каждый хочет забрать себе множество его вершин, являющееся вершинным покрытием.

Они отдали свой граф вам и попросили выбрать два непересекающихся множества вершин A и B, таких что и A и B являются вершинным покрытием, или определить, что сделать это невозможно. Каждая вершина может быть отдана только одному из друзей (а некоторые и вовсе можно не отдавать никому).

Входные данные

В первой строке входных данных записаны два числа n и m (2 ≤ n ≤ 100 000, 1 ≤ n, m ≤ 100 000) — количество вершин и количество рёбер в выигранном друзьями графе.

В каждой из следующих m строк записана пара чисел ui и vi (1  ≤  ui,  vi  ≤  n), означающая ненаправленное ребро между вершинами ui и vi. Гарантируется, что в графе отсутствуют петли и кратные рёбра.

Выходные данные

Если невозможно поделить граф между Пари и Арием, как они этого хотят, то выведите «-1» (без кавычек).

Если же существуют два непересекающихся вершинных покрытия, то выведите их описания. Каждое описание состоит из двух строк. Первая строка должна содержать единственное число k — количество вершин в данном вершинном покрытии, а вторая строка должна содержать k чисел — индексы вершин в покрытии. Обратите внимание, что поскольку m ≥ 1, никакое вершинное покрытие не может быть пустым.

Примечание

В первом примере можно отдать Арию вершину номер 2, а Пари вершины с номерами 1 и 3. Вершину 4 можно оставить себе (а можно тоже кому-нибудь отдать).

Во втором примере не существует способа раздать вершины так, чтобы удовлетворить и Пари, и Ария.

E. TOF

графы поиск в глубину и подобное *2900

Сегодня Пари задала Арию интересную графовую задачу. Арий написал неоптимальное решение, потому что верит, что может протолкнуть неоптимальное решение в любой задаче. Но его решение не только не оптимальное, оно ещё и содержит ошибки, а поскольку Арий долго пытался его оптимизировать, то код стал совсем «грязным». Арий продолжал получать вердикт Time Limit Exceeded и совсем уже расстроился, когда ему в голову пришла прекрасная идея!

Вот так выглядит сейчас его код:


dfs(v)
{
set count[v] = count[v] + 1
if(count[v] < 1000)
{
foreach u in neighbors[v]
{
if(visited[u] is equal to false)
{
dfs(u)
}
break
}
}
set visited[v] = true
}

main()
{
input the digraph()
TOF()
foreach 1<=i<=n
{
set count[i] = 0 , visited[i] = false
}
foreach 1 <= v <= n
{
if(visited[v] is equal to false)
{
dfs(v)
}
}
... // And do something cool and magical but we can't tell you what!
}

Арий просит вас написать функцию TOF, которая будет уменьшать количество вызовов функции dfs. На вход подаётся ориентированный граф, и функция TOF должна переставить каким-то образом рёбра графа, то есть изменить порядок вершин в списке смежности neighbors каждой вершины. Количество вызовов функции dfs, разумеется, зависит от того, какой порядок для вершин в neighbors выбрать.

Входные данные

В первой строке входных данных записаны два целых числа n и m (1 ≤ n, m ≤ 5000) — количество вершин и количество ориентированных рёбер во входном графе.

В каждой из последующих m строк записана пара целых чисел ui и vi (1  ≤  ui,  vi  ≤  n), означающая, что во входном графе существует ориентированное ребро .

Гарантируется, что в графе нет петель и что каждая неупорядоченная пара вершин соединена не более чем одним ориентированным ребром.

Выходные данные

Выведите единственное целое число — минимальное возможно количество вызовов функции dfs, которого можно достигнуть, переставив правильно рёбра.

B. Майк и переулки

графы жадные алгоритмы кратчайшие пути поиск в глубину и подобное *1600

Только что Майк был очень занят подготовкой к экзаменам и контестам, теперь же, чтобы проветриться, он решил прогуляться мимо городских достопримечательностей.

Город состоит из n перекрестков с номерами от 1 до n. Майк начинает прогулку от своего дома и идет вдоль определенной последовательности перекрестков. Чтобы дойти от перекрестка i до перекрестка j, Майку нужно потратить |i - j| единиц энергии. Суммарное количество энергии, потраченное Майком при прогулке вдоль последовательности перекрестков p1 = 1, p2, ..., pk равно единицам энергии.

Конечно, прогулки были бы скучными без переулков. Переулком называется специальный путь, позволяющий Майку идти от одного перекрестка к другому, используя лишь 1 единицу энергии. Всего в городе Майка ровно n переулков, i-й из них позволяет пройти от перекрестка с номером i к перекрестку с номером ai (i ≤ ai ≤ ai + 1) (но не в противоположном направлении), то есть для каждого перекрестка существует ровно один исходящий переулок. Формально, если Майк выберет последовательность p1 = 1, p2, ..., pk, то для каждого 1 ≤ i < k удовлетворяющего pi + 1 = api and api ≠ pi Майк потратит всего 1 единицу энергии вместо |pi - pi + 1| единиц, прогуливаясь от перекрестка pi к перекрестку pi + 1. К примеру, если Майк решит выбрать последовательность p1 = 1, p2 = ap1, p3 = ap2, ..., pk = apk - 1, то потратит суммарно k - 1 единицу энергии на прогулку вдоль перекрестков.

Перед тем как отправиться в путь, Майк просит вас для каждого перекрестка посчитать минимальное количество энергии, необходимое, чтобы дойти до него от дома Майка. Формально, для каждого 1 ≤ i ≤ n Майка интересует минимально возможное суммарное количество энергии некоторой последовательности p1 = 1, p2, ..., pk = i.

Входные данные

В первой строке содержится целое число n (1 ≤ n ≤ 200 000) — количество перекрестков в городе Майка.

Во второй строке содержатся n чисел a1, a2, ..., an (i ≤ ai ≤ n , , описывающие переулки города. i-й из них позволяет Майку дойти от переулка i до переулка ai за одну единицу энергии. Заметьте, что переулки не позволяют проход в обратном направлении (от ai к i).

Выходные данные

В единственной строке выведите n чисел m1, m2, ..., mn, где mi означает наименьшее количество единиц энергии, которое Майку нужно потратить, чтобы добраться от перекрестка 1 до перекрестка i.

Примечание

В первом примере подходящими являются следующие последовательности:

1: 1; m1 = 0;

2: 1, 2; m2 = 1;

3: 1, 3; m3 = |3 - 1| = 2.

Во втором примере последовательность для любого перекрестка 1 < i всегда имеет вид 1, i, а mi = |1 - i|.

В третьем примере входных данных можно рассматривать следующие последовательности:

1: 1; m1 = 0;

2: 1, 2; m2 = |2 - 1| = 1;

3: 1, 4, 3; m3 = 1 + |4 - 3| = 2;

4: 1, 4; m4 = 1;

5: 1, 4, 5; m5 = 1 + |4 - 5| = 2;

6: 1, 4, 6; m6 = 1 + |4 - 6| = 3;

7: 1, 4, 5, 7; m7 = 1 + |4 - 5| + 1 = 3.

C2. Мозговая сеть (средняя)

графы Деревья поиск в глубину и подобное *1500

Дальнейшие исследования мыслительных процессов зомби дали интересные результаты. Как мы знаем из предыдущей задачи, нервная система зомби состоит из n мозгов и m мозговых соединений, связывающих их воедино. Было замечено, что интеллектуальные способности зомби сильно зависят от топологии нервной системы. Точнее, определим как расстояние между двумя мозгами u и v (1 ≤ u, v ≤ n) как минимальное количество мозговых соединений, которые потребуется использовать, чтобы передать мысль между этими двумя мозгами. Мозговая задержка зомби определяется как максимальное расстояние между какой-нибудь парой мозгов. Ученые подозревают, что мозговая задержка является ключевым параметром определяющим, насколько умён данный зомби. Помогите им протестировать их гипотезу, написав программу для вычисления мозговой задержки данной нервной системы.

В данной задаче вы можете считать, что данная вам во входных данных мозговая система является правильной, то есть удовлетворяет пунктам (1) и (2) из лёгкой версии данной задачи.

Входные данные

В первой строке входных данных записаны два целых числа n и m (1 ≤ n, m ≤ 100000), определяющих количество мозгов (пронумерованных от 1 до n) и количество мозговых связей в нервной системе, соответственно. В следующих m строках содержатся описания мозговых связей. Каждая связь задаётся как пара мозгов ab, которую она соединяет (1 ≤ a, b ≤ n, a ≠ b).

Выходные данные

Выведите одно число — мозговую задержку данной нервной системы.

D. Свопы в перестановке

математика поиск в глубину и подобное снм *1700

Вам задана перестановка чисел 1, 2, ..., n, а также m пар позиций (aj, bj).

На каждом шагу вы можете выбрать некоторую пару из заданного набора и поменять местами числа на этих позициях. Найдите лексикографически максимальную перестановку, которую можно получить такими операциями.

Пусть p и q — это две перестановки чисел 1, 2, ..., n. Перестановка p считается лексикографически меньше перестановки q, если существует число 1 ≤ i ≤ n такое, что pk = qk для всех 1 ≤ k < i и pi < qi.

Входные данные

В первой строке находится пара целых чисел n и m (1 ≤ n, m ≤ 106) — длина перестановки p и количество пар позиций.

Во второй строке находятся n различных целых чисел pi (1 ≤ pi ≤ n) — элементы перестановки p.

В следующих m строках находятся пары чисел (aj, bj) (1 ≤ aj, bj ≤ n) — пары позиций для обмена местами чисел. Обратите внимание, что вам заданы позиции обменов, а не значения.

Выходные данные

Выведите строку с n различными целыми числами p'i (1 ≤ p'i ≤ n) — лексикографически максимальную перестановку, которую можно получить.

B. Puzzles

Деревья математика поиск в глубину и подобное Теория вероятностей *1700

Барни живет в USC (United States of Charzeh). USC состоит из n городов с номерами от 1 до n и n - 1 дорог между ними. Города и дороги в USC формируют корневое дерево (и Барни понятия не имеет, почему оно корневое). Корню дерева соответствует город номер 1. Таким образом, начиная в городе 1, по дорогам можно добраться до любого другого города.

Незнакомка завладела сердцем Барни, и теперь он хочет ее найти. Он начинает поиски в городе номер 1, и, (так как он Барни Стинсон, а не кто-то еще), и для поисков использует случайный поиск в глубину. Этот алгоритм можно описать с помощью следующего псевдокода:


let starting_time be an array of length n
current_time = 0
dfs(v):
current_time = current_time + 1
starting_time[v] = current_time
shuffle children[v] randomly (each permutation with equal possibility)
// children[v] is vector of children cities of city v
for u in children[v]:
dfs(u)

Как было сказано ранее, Барни начинает свое путешествие в корне дерева (что эквивалентно вызову dfs(1)).

Теперь Барни нужно собрать рюкзак, и поэтому он хочет знать больше о предстоящем путешествии: для каждого города i Барни хочет знать математическое ожидание величины starting_time[i]. Барни — друг Джона Сноу, и поэтому ничего не знает, в связи с чем просит вас ему помочь.

Входные данные

В первой строке содержится единственное целое число n (1 ≤ n ≤ 105) — число городов в USC.

Во второй строке содержится n - 1 число p2, p3, ..., pn (1 ≤ pi < i), где pi — номер города, являющегося предком города i в дереве, другими словами, в USC есть дорога между городами pi и i.

Выходные данные

В единственной строке выведите n чисел, значение i-го из которых равно математическому ожиданию величины starting_time[i].

Ответ для каждого города будет засчитан, если его абсолютная или относительная погрешность не превосходит 10 - 6.

B. Исправление дерева

графы Деревья Конструктив поиск в глубину и подобное снм *1700

Дерево — это неориентированный связный граф без циклов.

Рассмотрим корневое неориентированное дерево, состоящее из n вершин, пронумерованных от 1 до n. Существует несколько способов представлять такие деревья. Одним из наиболее популярных является массив предков, состоящий из n чисел p1, p2, ..., pn, где pi означает предка вершины i (в рамках данной задачи корень дерева считается предком самого себя).

Для данного корневого дерева массив p равен [2, 3, 3, 2].

По данной последовательности p1, p2, ..., pn легко восстановить дерево:

  1. Существует ровно один индекс r, такой что pr = r. Вершина r является корнем дерева.
  2. Для всех остальных n - 1 вершины i существует ребро между вершинами i и pi.

Последовательность p1, p2, ..., pn является корректной, если описанная выше процедура определяет некоторое (произвольное) корневое дерево. Например, для n = 3 последовательности (1,2,2), (2,3,1) и (2,1,3) не являются корректными.

Вам дана последовательность a1, a2, ..., an, не обязательно являющаяся корректной. Вам требуется изменить минимальное количество элементов, чтобы последовательность стала корректной. Выведите минимальное необходимое количество изменений и пример любого ответа, который можно получить с их помощью. Если существует несколько корректных последовательностей, достижимых за минимальное количество изменений, то разрешается вывести любую.

Входные данные

В первой строке входных данных записано число n (2 ≤ n ≤ 200 000) — количество вершин в дереве (а значит, и в последовательности).

Во второй строке записаны n целых чисел a1, a2, ..., an (1 ≤ ai ≤ n).

Выходные данные

В первой строке выведите минимальное количество изменений, которое надо сделать, чтобы получить корректную последовательность.

Во второй строке выведите любую корректную последовательность, которая может быть получена из (a1, a2, ..., an) за минимальное количество изменений. Если существует несколько таких последовательностей, то выведите любую.

Примечание

В первом примере достаточно изменить один элемент. В приведённом примере вывода последовательность представляет корневое дерево с корнем в вершине 4 (потому что p4 = 4), которое можно увидеть на левом рисунке. Одним из корректных решений будет являться последовательность 2 3 3 2, определяющая дерево с корнем в вершине 3 (правый рисунок). На обоих рисунках корни выделены красным.

Во втором примере данная во входных данных последовательность уже является корректной.

B. Соединяя университеты

графы Деревья дп поиск в глубину и подобное *1800

Древляндия — это страна в которой n городов, соединенных n - 1 двусторонней дорогой так, что из любого города можно проехать в любой другой по дорогам.

В Древляндии 2k университетов, расположенных в разных городах.

Недавно Президент подписал указ о соединении университетов высокоскоростной сетью. Министерство образования по своему поняло этот указ, решив что для экономии усилий достаточно каждый университет соединить кабелем с некоторым другим. Формально, указ окажется выполнен!

Для того, чтобы в бюджет заложили максимальную сумму в министерстве решили так разбить университеты на пары, что суммарная длина потраченного кабеля будет максимальна. Иными словами, сумма расстояний между университетами в k парах должна быть как можно больше.

Помогите министерству найти искомую максимальную сумму расстояний. Конечно, каждый университет должен попасть ровно в одну пару. Считайте, что все дороги равны по длине между собой и имеют длины равные 1.

Входные данные

В первой строке входных данных записаны два целых числа n и k (2 ≤ n ≤ 200 000, 1 ≤ k ≤ n / 2) — количество городов в Древляндии и количество пар университетов. Считайте, что города пронумерованы от 1 до n.

Вторая строка содержит 2k различных чисел u1, u2, ..., u2k (1 ≤ ui ≤ n) — номера городов, в которых содержатся университеты.

Следующая n - 1 строка содержит описания дорог. В каждой из этих строк записана пара целых чисел xj, yj (1 ≤ xj, yj ≤ n), которая обозначает, что j-я дорога соединяет города xj и yj. Все дороги двунаправлены. Из любого города можно проехать до любого другого, двигаясь вдоль дорог.

Выходные данные

Выведите искомую максимальную сумму расстояний при делении университетов на пары.

Примечание

На рисунке ниже представлено одно из возможных оптимальных разбиений на пары для первого тестового примера. Если соединить кабелем университеты номер 1 и 6 (отмечены красным цветом) и университеты номер 2 и 5 (отмечены синим цветом), то суммарное расстояние будет равно 6, что является максимальной суммой для данного примера.

D. Персистентный шкаф

битмаски поиск в глубину и подобное реализация Структуры данных *2200

Недавно в школе Алина узнала о том, что такое персистентные структуры данных: это структуры данных, которые при внесении в них каких-то изменений сохраняют все свои предыдущие состояния и доступ к этим состояниям.

По приходу домой Алина решила придумать свою персистентную структуру данных. Долго раздумывать не пришлось: прямо перед ее кроватью располагается книжный шкаф. Он, по мнению Алины, весьма подходит в качестве персистентной структуры данных.

Шкаф состоит из n полок, на каждой из которых есть ровно m позиций для книг. Полки в шкафу Алина нумерует от 1 до n, а позиции на полках — от 1 до m. Изначально шкаф пуст, то есть на каждой позиции на каждой полке книга отсутствует.

Алина выписала подряд q операций, которые будут друг за другом производиться со шкафом. Каждая из операций может быть одного из четырех типов:

  • 1 i j — Поставить книгу в шкаф на позицию j на полке i, если ее там нет.
  • 2 i j — Убрать книгу из шкафа с позиции j на полке i, если она там есть.
  • 3 i — Поменять расположение книг на полке i на противоположное. Это означает, что со всех позиций на полке i, где книга присутствует, книгу следует убрать, а на все позиции на полке i, где книга отсутствует, книгу следует поставить.
  • 4 k — Вернуть все книги в шкафу в то состояние, в котором они находились после выполнения k-й операции. В частности, k = 0 означает, что шкаф следует привести в изначальное состояние, то есть убрать книгу с каждой позиции на каждой полке.

После выполнения каждой операции Алину интересует количество книг в шкафу. Алина учится на отлично, поэтому она без труда нашла искомые количества. Интересно, а у вас получится?

Входные данные

В первой строке содержится три натуральных числа n, m и q (1 ≤ n, m ≤ 103, 1 ≤ q ≤ 105) — размеры шкафа и количество операций соответственно.

В следующих q строках содержится описание операций в порядке их выполнения — в i-й из них содержится описание i-й операции в одном из четырех форматов, описанных в условии.

Гарантируется, что номера полок и номера позиций заданы корректно, а во всех операциях четвертого типа число k соответствует одной из операций, выполненных ранее, либо равно 0.

Выходные данные

Для каждой операции выведите в отдельной строке количество книг в шкафу после её выполнения. Ответы выводите в хронологическом порядке.

Примечание

Иллюстрация ко второму примеру из условия.

C. Центроиды

графы Деревья дп жадные алгоритмы поиск в глубину и подобное Структуры данных *2300

Деревом называется связный неориентированный граф без циклов. Вам дано дерево, состоящее из n вершин, тогда центроидом дерева называется любая вершина, такая что при её удалении размер любой компоненты связности не будет превосходить .

Вам дано дерево размера n и разрешается выполнить не более одной операции перестановки ребра. Перестановкой ребра называется удаление одного ребра из дерева (без удаления инцидентных вершин) и добавление одного нового ребра (без добавления новых вершин) таким образом, что граф остаётся деревом. Требуется для каждой вершины дерева определить, правда ли, что её можно сделать центроидом, выполнив не более одной перестановки ребра.

Входные данные

В первой строке входных данных записано целое число n (2 ≤ n ≤ 400 000) — количество вершин в дереве. Каждая из последующих n - 1 строк содержит пару номеров вершин ui и vi (1 ≤ ui, vi ≤ n), являющихся концами одного из рёбер дерева.

Выходные данные

Выведите n чисел, i-е из которых равно 1, если i-ю вершину можно сделать центроидом, выполнив не более одной перестановки ребра, и 0 в противном случае.

Примечание

В первом тестовом примере любую вершину можно сделать центроидом. Например, чтобы сделать центроидом вершину 1, нужно заменить ребро (2, 3) на ребро (1, 3).

E. Генерация строки

дп поиск в глубину и подобное *2000

zscoder хочет сгенерировать файл входных данных для задачи соревнования по программированию.

Входные данные должны состоять из n букв 'a'. zscoder слишком ленив, чтобы писать генератор, поэтому он сгенерирует файл руками в текстовом редакторе.

Вначале текстовый редактор пуст. zscoder тратит x секунд, чтобы вставить или удалить букву 'a', и y секунд, чтобы скопировать и вставить содержимое всего файла (при этом количество букв 'a' в файле удваивается).

zscoder хочет найти наименьшее количество времени необходимое для создания входного файла из ровно n букв 'a'. Помогите ему определить количество времени необходимое для генерации входных данных.

Входные данные

В единственной строке находятся три целых числа n, x и y (1 ≤ n ≤ 107, 1 ≤ x, y ≤ 109) — количество букв 'a' во входном файле и параметры, описанные в условии задачи.

Выходные данные

Выведите одно целое число t — наименьшее количество времени, необходимое для генерации входных данных.

D. Направленные дороги

графы Комбинаторика математика поиск в глубину и подобное *1900

Кодер ZS и Бабуин Крис довольно долго путешествовали по Удайлэнду. Они узнали, что он состоит из n городов, пронумерованных от 1 до n.

В Удайлэнде существует ровно n направленных дорог. i-ая из них выходит из города с номером i и ведет в другой город с номером ai (ai ≠ i). Кодер ZS может поменять направление любой из дорог в Удайлэнде, то есть, если дорога вела от города A к городу B до смены направления, она будет вести от города B к городу A после него.

Кодер ZS считает дороги в Удайлэнде запутанными, если существует последовательность различных городов A1, A2, ..., Ak (k > 1), таких, что для каждого 1 ≤ i < k существует дорога, ведущая из города Ai в город Ai + 1 и еще одна из города Ak в город A1. Другими словами, дороги запутанные, если некоторые из них образуют направленный цикл из каких-то городов.

Теперь Кодеру ZS'у интересно, сколько наборов дорог изначальной конфигурации (всего их 2n) он может выбрать, таких, что после смены направления каждой из дорог в наборе ровно по одному разу, результирующая сеть дорог не будет запутанной.

Заметьте, что после смены направления позволяется существовать городу, из которого выходит несколько дорог, или городу, из которого не выходит ни одной дороги, или нескольким дорогам между одной и той же парой городов.

Входные данные

Первая строка содержит единственное целое число n (2 ≤ n ≤ 2·105) — количество городов в Удайлэнде.

Следующая строка содержит n целых чисел a1, a2, ..., an (1 ≤ ai ≤ n, ai ≠ i), ai означает, что существует дорога, ведущая из города i в город ai.

Выходные данные

Выведите единственное целое число — количество способов поменять направление какого-нибудь набора дорог так, что весь набор дорог станет не запутанным. Так как ответ может быть очень большим, выведите остаток от его деления на 109 + 7.

Примечание

Рассмотрим первый пример из условия. Существует 3 города и 3 дороги. Города пронумерованы от 1 до 3, а дороги изначально имеют вид , , . Пронумеруем дороги от 1 до 3 в соответствующем порядке.

Наборы дорог, для которых Кодер ZS может сменить направление (чтобы сделать дороги не запутанными), это наборы {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}. Заметьте, что пустой набор дорог не подходит, поскольку, если не менять направление ни одной дороги, то города 1, 2, 3 образуют направленный цикл, так что дороги будут запутанными. Аналогично, смена направления каждой дороги приводит к запутанной конфигурации. Таким образом, всего существует 6 возможных наборов, для которых Кодер ZS может поменять направление.

Следующий рисунок изображает всевозможные способы ориентации дорог из первого примера так, что сеть дорог не является запутанной:

C. Цифровое дерево

Деревья поиск в глубину и подобное разделяй и властвуй снм *2700

У Кодера ZS'а есть большое дерево. Его можно представить как неориентированный связный граф из n вершин, пронумерованных от 0 до n - 1, и n - 1 ребер между ними. На каждом ребре записана одна ненулевая цифра.

Однажды, Кодер ZS заскучал и решил исследовать некоторые параметры дерева. Он выбрал целое положительное M, которое является взаимно простым с 10, т.е. .

ZS считает упорядоченную пару различных вершин (u, v) интересной, когда если бы он проследовал по кратчайшему пути от вершины u до вершины v и выписывал цифры, которые он встречает на своем пути, в том же порядке, он получил бы десятичную запись целого числа, делящегося на M.

Формально, ZS считает упорядоченную пару различных вершин (u, v) интересной, если верно следующее:

  • Пусть a1 = u, a2, ..., ak = v — последовательность вершин на кратчайшем пути от u до v в порядке их встречи;
  • Пусть di (1 ≤ i < k) — цифра, записанная на ребре между вершинами ai и ai + 1;
  • Целое число делится на M.

Помогите Кодеру ZS'у найти количество интересных пар!

Входные данные

Первая строка входных данных содержит два целых числа n и M (2 ≤ n ≤ 100 000, 1 ≤ M ≤ 109, ) — количество вершин и число, которое выбрал ZS, соответственно.

Следующие n - 1 строк содержат по три целых числа. i-ая из них содержит ui, vi и wi, означающих ребро между вершинами ui и vi, на котором записана цифра wi (0 ≤ ui, vi < n,  1 ≤ wi ≤ 9).

Выходные данные

Выведите единственное целое число — количество интересных (по мнению Кодера ZS'а) пар.

Примечание

В первом примере из условия интересными являются пары (0, 4), (1, 2), (1, 5), (3, 2), (2, 5), (5, 2), (3, 5). Числа, образуемые этими парами — 14, 21, 217, 91, 7, 7, 917 соответственно, все они кратны 7. Заметьте, что (2, 5) и (5, 2) считаются различными.

Во втором примере из условия интересными являются пары (4, 0), (0, 4), (3, 2), (2, 3), (0, 1), (1, 0), (4, 1), (1, 4), и 6 из этих пар дают число 33, а 2 из них дают число 3333, и все они кратны 11.

E. Покрасить в тёмно-тёмно серый

поиск в глубину и подобное *1900

Я вижу розового борова и хочу покрасить его в чёрный. Чёрные боровы выглядят гораздо круче и брутальнее, чем розовые. Поскольку Джагги теперь правитель леса, он хочет улучшить дипломатические отношения с соседними регионами.

Однако, некоторые правители запросили слишком много, чтобы между их регионом и лесом снова настал мир, поэтому Джагги решил прибегнуть к запугиванию. Когда дипломатическая миссия из другого региона приходит в лес, если они вдруг увидят толпу чёрных боровов, они могут и изменить своё мнение. Черные боровы реально страшные!

Лес Джагги можно представить в виде дерева (связного графа без циклов) с n вершинами. Каждая вершина представляет собой борова и покрашена в чёрный или розовый цвет. Джагги отправил в лес белку, чтобы она покрасила всех боровов в чёрный. Однако, белка не очень сообразительная, поэтому каждый раз когда она приходит в вершину, она просто меняет её цвет: розовая вершина становится чёрной, а чёрная розовой.

Джагги слишком занят, чтобы запланировать путь белки, поэтому ему требуется ваша помощь. Постройте такой маршрут белки по дереву, начинающийся в вершине 1, что после его выполнения все вершины покрашены в чёрный цвет. Маршрутом называется последовательность вершин, такая что между любой парой соседних вершин в маршруте есть ребро в дереве.

Входные данные

В первой строке входных данных записано целое число n (2 ≤ n ≤ 200 000), определяющее количество вершин в дереве. Далее следуют n строк содержащие по одному целому числу — цвета вершин, i-е из них равно 1, если вершина номер i покрашена в чёрный и  - 1, если в розовый.

В каждой из последующих n - 1 строк записаны два целых числа, означающие индексы вершин, соединённых ребром. Вершины нумеруются начиная с 1.

Выходные данные

Выведите путь белки как последовательность индексов вершин в порядке посещения. Если все вершины изначально чёрные, то выведите 1. Гарантируется, что решение всегда существует. Если существует несколько решений, выведите любое из них длиной не более 107.

Примечание

Рассмотрим пример из условия. Изначально белка находится в вершине 1, и цвет этой вершины чёрный. Далее следует такая последовательность действий:

  • Из вершины 1 мы идём в вершину 4 и меняем её цвет на розовый.
  • Из вершины 4 мы идём в вершину 2 и меняем её цвет на розовый.
  • Из вершины 2 мы идём в вершину 5 и меняем её цвет на чёрный.
  • Из вершины 5 мы возвращаемся в вершину 2 и меняем её цвет на чёрный.
  • Из вершины 2 мы идём в вершину 4 и меняем её цвет на чёрный.
  • Наконец, мы идём в вершину 3 и меняем её цвет на чёрный.
  • Наконец, мы идём в вершину 4 и меняем её цвет на розовый.
  • Наконец, мы идём в вершину 1 и меняем её цвет на розовый.
  • Наконец, мы идём в вершину 4 и меняем её цвет на чёрный.
  • Наконец, мы идём в вершину 1 и меняем её цвет на чёрный.

B. Кактусофобия

поиск в глубину и подобное Потоки *2400

Дерево — это связный неориентированный граф без циклов. Реберный кактус — связный неориентированный граф без петель и кратных ребер, в котором каждое ребро лежит не более чем на одном простом цикле.

У Васи есть реберный кактус, в котором каждое ребро покрашено в какой-то цвет.

Вася хочет убрать из кактуса минимальное число ребер так, чтобы получилось дерево. При этом Вася хочет, чтобы количество различных цветов среди оставшихся ребер было максимально. Помогите ему узнать, сколько различных цветов может остаться в графе.

Входные данные

В первой строке дано два целых числа n, m (2 ≤ n ≤ 10 000) — количество вершин и ребер в графе Васи соответственно.

В следующих m строках дано по три целых числа u, v, c (1 ≤ u, v ≤ n, u ≠ v, 1 ≤ c ≤ m) — вершины, которые соединяет очередное ребро, и его цвет. Гарантируется, что описанный граф является реберным кактусом.

Выходные данные

Выведите одно целое число — максимальное количество различных цветов, которое можно оставить в графе.

D. Генерация наборов

Бинарный поиск Деревья жадные алгоритмы поиск в глубину и подобное Строки Структуры данных *1900

Вам задан набор Y из n различных целых положительных чисел y1, y2, ..., yn.

Назовём набор X из n различных целых положительных чисел x1, x2, ..., xn генератором для Y, если из набора X можно получить набор Y, применяя к элементам набора X следующие две операции:

  1. Умножить произвольное число xi на два, то есть заменить xi на xi.
  2. Умножить произвольное число xi на два и прибавить единицу, то есть заменить xi на xi + 1.

Обратите внимание, не требуется, чтобы все числа в наборе X были различны после выполнения каждой операции.

Наборы в данной задаче сравниваются как множества чисел. Другими словами, два набора различных чисел X и Y совпадают, если, выписав оба набора в отсортированном порядке, мы получим одинаковые массивы.

Заметьте, что любой набор чисел (или его перестановка) сам является одним из своих генераторов.

По заданному набору Y найдите его генератор, в котором максимальное число минимально.

Входные данные

В первой строке входных данных записано число n (1 ≤ n ≤ 50 000) — количество чисел в наборе Y.

Во второй строке записаны n чисел y1, ..., yn (1 ≤ yi ≤ 109). Гарантируется, что все числа в наборе различны.

Выходные данные

Выведите n чисел — генератор для заданного набора Y, в котором максимальное число как можно меньше. Если подходящих наборов несколько, разрешается вывести любой из них.

D. Озёра в Берляндии

графы жадные алгоритмы поиск в глубину и подобное реализация снм *1600

Карта Берляндии представляет собой прямоугольник размера n × m, состоящий из клеток размера 1 × 1. Каждая из клеток карты является либо сушей, либо водой. Со всех краёв Берляндия омывается океаном.

Озёрами называются такие связные по сторонам максимальные по включению области из клеток с водой, которые не имеют общих границ с океаном. Другими словами, озеро — это область клеток с водой, такая что из любой клетки можно добраться до любой другой, не покидая озера, двигаясь только между соседними по стороне клетками, никакая из клеток не расположена на границе прямоугольника и нельзя добавить ещё одну клетку с водой, так что по-прежнему можно будет добраться от любой клетки до любой другой.

Перед вами стоит задача засыпать землей минимальное количество клеток таким образом, чтобы в Берляндии стало ровно k озёр. Изначально на карте находятся не менее k озер.

Входные данные

В первой строке входных данных записаны три целых положительных числа n, m и k (1 ≤ n, m ≤ 50, 0 ≤ k ≤ 50) — размеры карты и количество озёр, которые должны остаться на карте.

В следующих n строках следует по m символов — описание карты. Каждый из символов — либо «.» (означает, что соответствующая клетка это участок с водой), либо «*» (означает, что соответствующая клетка — это участок суши).

Гарантируется, что на данной карте не менее k озер.

Выходные данные

В первую строку выведите минимальное количество клеток, которые из воды нужно превратить в сушу.

В следующие n строк выведите m символов — карта после внесения в неё изменений. Формат должен строго соответствовать формату карты из входных данных (размеры карты выводить не нужно). Если решений несколько, выведите любое из них.

Гарантируется, что ответ всегда существует.

Примечание

В первом примере всего содержится два озера — первое состоит из клеток (2, 2) и (2, 3), а второе состоит из клетки (4, 3). Выгодно засыпать второе озеро, так как оно наименьшее по размеру. Обратите внимание, что участок воды в нижнем левом углу поля не является озером, так как этот участок граничит с океаном.

E. Односторонняя реформа

графы жадные алгоритмы Конструктив поиск в глубину и подобное Потоки *2200

В Берляндии есть n городов и m двунаправленных дорог, которыми соединены некоторые пары городов. Известно, что между каждой парой городов существует не более одной дороги, а также никакая дорога не соединяет город сам с собой. Допустимо, что между некоторыми парами городов не существует пути по дорогам от одного до другого.

Дорожный министр решил провести в Берляндии реформу и заориентировать все дороги в стране, то есть сделать каждую дорогу односторонней. При этом министр хочет максимизировать количество таких городов, чтобы количество дорог, начинающихся в этих городах, было равно количеству дорог, которые в них заканчиваются.

Входные данные

В первой строке следует целое положительное число t (1 ≤ t ≤ 200) — количество наборов входных данных.

Каждый из наборов входных данных задаётся следующим образом. В первой строке следует два целых числа n и m (1 ≤ n ≤ 200, 0 ≤ m ≤ n·(n - 1) / 2) — количество городов и количество дорог в Берляндии.

В следующих m строках следует описание дорог в Берляндии. В каждой строке находятся по два целых числа u и v (1 ≤ u, v ≤ n) — номера городов, которые соединяет очередная дорога. Гарантируется, что никакая дорога не соединяет город с самим самой и между любой парой городов существует не более одной дороги. Допустимо, что между некоторыми парами городов не существует пути по дорогам от одного до другого.

Гарантируется, что суммарное количество городов во всех наборах входных данных не превосходит 200.

Обратите внимание, что для взломов вы можете использовать только тесты, состоящие из одного набора входных данных, то есть t должно быть равно единице.

Выходные данные

Для каждого набора входных данных выведите сначала искомое максимальное количество таких городов, что количество дорог, начинающихся в этих городах, было равно количеству дорог, которые в них заканчиваются.

В следующих m строках выведите заориентированные дороги. Сначала выводите номер города, в котором дорога начинается, а затем номер города, в котором дорога заканчивается. Если ответов несколько, выведите любой из них. Дороги в каждом наборе входных данных разрешается выводить в любом порядке. Каждая дорога должна быть выведена ровно один раз.

A. Превращение: из A в B

математика Перебор поиск в глубину и подобное *1000

У Василия есть число a, которое он хочет превратить в число b. Для этого он может производить два типа операций:

  • умножить имеющееся у него число на 2 (то есть заменить число x числом x);
  • приписать к имеющемуся у него числу цифру 1 справа (то есть заменить число x числом 10·x + 1).

Вам надо помочь Василию получить из числа a число b с помощью описанных операций, либо сообщить, что это невозможно.

Обратите внимание, что в этой задаче не требуется минимизировать количество операций. Достаточно найти любой из способов получить из числа a число b.

Входные данные

В первой строке записаны два целых положительных числа a и b (1 ≤ a < b ≤ 109) — число, которое есть у Василия, и число, которое он хочет получить.

Выходные данные

Если получить число b из числа a невозможно, выведите «NO» (без кавычек).

В противном случае в первую строку выведите «YES» (без кавычек). Во вторую строку выведите число k — количество чисел в последовательности превращений. В третьей строке выведите последовательность превращений x1, x2, ..., xk, причём:

  • x1 должно быть равно a,
  • xk должно быть равно b,
  • число xi должно быть получено с помощью одной из двух операций из числа xi - 1 (1 < i ≤ k).

Если ответов несколько, разрешается вывести любой из них.

D. FreeDiv

графы жадные алгоритмы поиск в глубину и подобное *2200

Вася играет во FreeDiv. В этой игре он управляет огромным государством, в котором имеется n городов и m двусторонних дорог между ними. К сожалению, не из каждого города можно добраться до любого другого по этим дорогам. Поэтому Вася решил разделить государство на провинции так, что в каждой провинции из каждого города можно добраться до всех городов этой провинции, но между провинциями дорог нет.

В отличие от других пошаговых стратегий, во FreeDiv у игрока имеется возможность строить туннели между городами - двусторонние дороги, по которым можно перемещать войска незаметно для противника. Однако, в каждый город может вести не более одного туннеля. Сам Вася хочет построить сеть туннелей так, чтобы между любой парой городов его государства был путь по дорогам или туннелям, но при этом в каждую провинцию шло не более k туннелей (иначе, эту провинцию будет сложно удержать в случае захвата остальных провинций вражескими войсками).

Вася обнаружил, что, возможно, ему не удастся построить такую сеть при текущем состоянии государства. Возможно, ему придется предварительно построить несколько дорог между городами различных провинций для объединения этих провинций. Ваша задача определить, какое наименьшее количество дорог нужно построить Васе, чтобы в полученном государстве можно было построить требуемую сеть туннелей.

Входные данные

В первой строке заданы три целых числа n, m и k (1 ≤ n, k ≤ 106, 0 ≤ m ≤ 106). В каждой из следующих m строк содержатся два целых числа — номера городов, соединенных соответствующей дорогой. Никакая дорога не соединяет город с самим собой, между каждой парой городов есть не более одной дороги.

Выходные данные

Необходимо вывести единственное число — наименьшее количество дополнительных дорог.

Примечание

В первом примере в государстве всего одна провинция, поэтому туннелей и дополнительных дорог не требуется.

Во втором примере в государстве две провинции. Их можно соединить, например, туннелем между городами 1 и 3.

В третьем примере необходимо построить минимум одну дополнительную дорогу. Например, можно построить дорогу между городами 1 и 2, после чего соединить город 1 с городом 3, а город 2 с городом 4 туннелями.

C. Delivery

Бинарный поиск поиск в глубину и подобное *2100

C. Носки

графы жадные алгоритмы поиск в глубину и подобное снм *1600

Арсений уже совсем взрослый и самостоятельный. Мама решила оставить его на m дней в одиночестве и уехать отдыхать в тёплые страны. Перед этим она наготовила ему много еды, оставила достаточное количество карманных денег и постирала всю одежду.

Однако за десять минут до отъезда в тёплые страны ей пришла в голову мысль, что Арсению надо оставить точную инструкцию, какую одежду надевать в какой из дней её отсутствия. Арсений живёт в очень необычной семье, в которой вся одежда пронумерована: например, n носков Арсения имеют различными целые номера от 1 до n. Поэтому всё, что потребовалось его маме, это указать для каждого дня два числа li и ri — номера носков, которые надо надеть в i-й день на левую и правую ногу соответственно (разумеется, li не совпадает с ri). Каждый носок покрашен в один из k цветов.

Уже после отъезда матери Арсений заметил, что в некоторые дни в соответствии с инструкцией ему придётся надеть носки разных цветов, что, конечно, является досадной оплошностью, вызванной спешкой перед отъездом при составлении инструкции. Но Арсений находчивый мальчик, и, по счастливому совпадению, он нашёл у себя дома банки с красками всех k цветов, которые встречаются среди его носков.

Арсений собирается перекрасить некоторые носки таким образом, чтобы, следуя инструкции, оставленной его мамой, на протяжении каждого из m дней носить одноцветные носки. Арсений уже запланировал деловые встречи в каждый день отсутствия мамы, в течение которых у него не будет возможности заниматься перекраской носков, поэтому он должен определиться с цветами и провести всю работу именно сейчас.

Он хочет как можно быстрее расправиться с этой задачей, чтобы отправиться играть в недавно вышедшую суперпопулярную игру Bota-3, поэтому он просит вас помочь определить минимальное количество носков, которое ему придётся перекрасить, чтобы в каждый день надевать два одноцветных носка.

Входные данные

В первой строке находится три целых числа n, m и k (2 ≤ n ≤ 200 000, 0 ≤ m ≤ 200 000, 1 ≤ k ≤ 200 000) — количество носков, количество дней отсутствия мамы и количество доступных цветов соответственно.

Во второй строке находится n разделённых пробелами целых чисел c1, c2, ..., cn (1 ≤ ci ≤ k) — цвета носков Арсения.

В каждой из последующих m строк находится по два целых числа li, ri (1 ≤ li, ri ≤ n, li ≠ ri) — номера носков, которые Арсений должен надеть в i-й день на левую и правую ногу соответственно.

Выходные данные

Выведите единственное целое число — минимальное количество носков, которые Арсений должен перекрасить, чтобы не насмешить людей разноцветными носками ни в один из дней отсутствия мамы.

Примечание

В первом примере Арсений может, например, перекрасить первый и третий носки во второй цвет.

Во втором примере ничего перекрашивать не придётся.

F. Туристическая реформа

графы поиск в глубину и подобное *2300

Берляндия — туристическая страна! Во всяком случае, она такой может стать — уверено правительство Берляндии.

Берляндия состоит из n городов, некоторые пары которых соединены двусторонними дорогами. Каждая дорога соединяет два различных города. В Берляндии нет дорог, соединяющих одинаковую пару городов. Из любого города можно добраться до любого другого по заданным двусторонним дорогам.

В соответствии с новой реформой каждая дорога будет превращена в одностороннюю — ориентирована в одну из двух сторон.

Чтобы максимизировать туристическую привлекательность Берляндии для каждого города i после реформы будет подсчитана величина ri — количество таких городов x, что из города i существует ориентированный путь до города x. Иными словами, ri равно количеству городов, в которые можно добраться из города i, следуя по дорогам.

Правительство уверено, что внимание туристов будет сконцентрировано на минимальном из ri.

Помогите правительству Берляндии провести реформу так, чтобы максимизировать минимальное из ri.

Входные данные

Первая строка содержит два целых числа n, m (2 ≤ n ≤ 400 000, 1 ≤ m ≤ 400 000) — количество городов и количество дорог соответственно.

Далее следуют m строк, описывающие дороги в Берляндии: j-я из них содержит два целых числа uj и vj (1 ≤ uj, vj ≤ n, uj ≠ vj), где uj и vj — номера городов, которые соединены j-й дорогой.

Считайте, что города пронумерованы от 1 до n. Гарантируется, что из любого города можно добраться до любого другого по заданным двусторонним дорогам. В Берляндии нет дорог, соединяющих одинаковую пару городов.

Выходные данные

Первая строка должна содержать одно целое число — максимальное возможное значение min1 ≤ i ≤ n{ri} после ориентации всех дорог.

Следующие m строк должны содержать описание дорог после ориентации: j-я из них должна содержать два целых числа uj, vj, означающих, что j-я дорога ведет из города uj в город vj. Дороги следует выводить в том же порядке, в котором они заданы во входных данных.

E. Антон и дерево

Деревья дп поиск в глубину и подобное *2100

Антон посадил в своём саду дерево. Напоминаем, что дерево — это связный неориентированный граф, не содержащий циклов.

Вскоре дерево выросло. Каждая из его n вершин оказалась покрашена либо в чёрный, либо в белый цвет. Однако, Антону не нравятся разноцветные деревья, и поэтому он решил покрасить дерево так, чтобы оно было либо полностью белым, либо полностью чёрным.

Для изменения цвета вершин дерева Антону доступна только одна операция, обозначим её как paint(v), где v — некоторая вершина дерева. Эта операция перекрашивает в противоположный цвет все такие вершины u, что на кратчайшем пути от u до v все вершины покрашены в один цвет (при этом сами вершины u и v также учитываются). Например, дерево

после применения операции paint(3) станет следующим:

Антону стало интересно, за какое минимальное количество операций покраски ему удастся сделать так, чтобы дерево стало покрашено в один цвет. Помогите ему найти это число!

Входные данные

В первой строке входных данных находится одно целое число n (1 ≤ n ≤ 200 000) — количество вершин в дереве.

Во второй строке входных данных находятся n целых чисел colori (0 ≤ colori ≤ 1) — цвета вершин. Если colori = 0, это значит, что i-я вершина покрашена в белый цвет, если colori = 1, это значит, что i-я вершина покрашена в чёрный цвет.

В каждой из следующих n - 1 строк входных данных находится пара целых чисел ui и vi (1 ≤ ui, vi ≤ n, ui ≠ vi) — рёбра дерева. Гарантируется, что все пары (ui, vi) различны, то есть граф не содержит кратных рёбер.

Выходные данные

В единственной строке выходных данных выведите единственное число — минимальное количество операций покраски, которое необходимо Антону, чтобы дерево стало либо полностью белым, либо полностью черным.

Примечание

В первом примере дерево такое же, как и на рисунке в условии. Если применить к нему сначала операцию paint(3), потом операцию paint(6), то оно будет полностью покрашено в черный цвет, поэтому ответ — 2.

Во втором примере дерево уже и так полностью покрашено в белый цвет, и к нему не придется применять ни одной операции покраски, поэтому ответ — 0.

B. Алёна и дерево

Бинарный поиск графы Деревья поиск в глубину и подобное Структуры данных *1900

У Алёны есть дерево из n вершин. Корень дерева — вершина с номером 1. В вершину с номером i Алёна записала положительное целое число ai. Также, девочка записала на каждом ребре дерева какое-то положительное целое число (возможно, различные числа на различных ребрах).

Определим dist(v, u) как сумму чисел, записанных на ребрах, которые лежат на кратчайшем пути из v в u.

Вершина дерева v контролирует вершину u (v ≠ u), если u лежит в поддереве v и dist(v, u) ≤ au.

Девочка хочет поселиться в некоторой вершине дерева. Для этого она хотела бы знать для каждой вершины v, сколько в дереве есть вершин u таких, что вершина v контролирует вершину u.

Входные данные

В первой строке находится одно число n (1 ≤ n ≤ 2·105).

Во второй строке находится n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 109) — числа, записанные в вершинах.

В следующих (n - 1)-й строке находятся по 2 числа. В i-й из этих строк находятся целые числа pi и wi (1 ≤ pi ≤ n, 1 ≤ wi ≤ 109) — предок вершины (i + 1) и число, написанное на ребре от pi к (i + 1).

Гарантируется, что заданный граф — дерево.

Выходные данные

Выведите в одной строке n чисел — i-е из этих чисел должно равняться количеству вершин, которое контролируется вершиной с номером i.

Примечание

В тесте из условия вершина 1 контролирует вершину 3, также вершина 3 контролирует вершину 5 (обратите внимание, отсюда не следует, что вершина 1 контролирует вершину 5).

C. Бильярд на шахматной доске

графы поиск в глубину и подобное снм теория чисел *2100

Ход шахматной фигуры бильярдный шар похож на ход шахматной фигуры слон, с тем лишь различием, что при столкновении с границей доски бильярдный шар может от нее отразиться и продолжить движение.

Более формально — сначала выбирается одно из четырех диагональных направлений и бильярдный шар движется в этом направлении. Попав на клетку, находящуюся на границе доски, бильярдный шар отражается от нее — изменяет направление своего движения на 90 градусов — и продолжает свое движение. В частности, попав в угловую клетку, бильярдный шар делает сразу 2 отражения и начинает двигаться в обратную сторону. В ходе своего движения бильярдный шар может сделать неограниченное число отражений. В любой клетке своей траектории шар может остановиться и на этом ход считается законченным.

Считается, что один бильярдный шар a бьет другой бильярдный шар b если a может сходить в ту клетку, где находится b.

Вам предлагается найти максимальное количество попарно не бьющих друг друга бильярдных шаров, которые можно разместить на шахматной доске размера n × m.

Входные данные

В первой строке находятся два целых числа — n и m (2 ≤ n, m ≤ 106).

Выходные данные

Выведите одно число — максимальное возможное количество попарно не бьющих друг друга бильярдных шаров.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать поток cin (также вы можете использовать спецификатор %I64d).

A. Громкий Owf Arpa и дьявольский план Mehrdad

математика поиск в глубину и подобное *1600

Как вы заметили, в стране Arpa живут милые девушки.

Все люди в стране Arpa пронумерованы от 1 до n. Каждый из них любит ровно одного человека, i-й человек любит человека с номером crushi.

Однажды Arpa громко крикнул Owf с верхушки дворца и в стране Arpa началась веселая игра по следующим правилам.

Игра состоит из раундов. Пусть человек с номером x начинает раунд: он звонит человеку crushx, говорит: «Oww...wwf» (буква w повторяется t раз) и немедленно бросает трубку. Если t > 1, то человек с номером crushx звонит человеку с номером crushcrushx и говорит: «Oww...wwf» (буква w повторяется t - 1 раз) и немедленно бросает трубку. Раунд продолжается до тех пор, пока кто-то не получает «Owf» (t = 1). Этот человек объявляется проигравшим в этом раунде и раунд заканчивается. Два раунда не могут происходить одновременно.

У Mehrdad есть ужасный план чтобы сделать игру еще смешнее. Он хочет найти такое минимальное t (t ≥ 1), что для каждого человека x, если x начинает раунд и y — проигравший в этом раунде, то если раунд начнет y, то x будет проигравшим. Найдите такое t, если это возможно.

Заметим, что в стране Arpa возможно такое, что человек любит самого себя (т. е. crushi = i).

Входные данные

Первая строка входных данных содержит целое число n (1 ≤ n ≤ 100) — количество людей в стране Arpa.

Вторая строка содержит n целых чисел, i-е из которых равняется crushi (1 ≤ crushi ≤ n) — номеру человека, которого любит i-й человек.

Выходные данные

Если не существует t удовлетворяющего условию, выведите -1. Иначе выведите минимальное из таких t.

Примечание

Предположим, в первом тесте из условия t = 3.

Если первый человек начинает раунд, то:

Первый человек звонит второму и говорит «Owwwf», затем второй человек звонит третьему и говорит «Owwf», затем третий человек звонит первому и говорит «Owf», поэтому первый человек становится проигравшим в этом раунде. Поэтому условие удовлетворено, если x равно 1.

Процесс аналогичен, если начинает второй или третий человек.

Если четвертый человек начинает раунд, то:

Четвертый человек звонит самому себе и говорит «Owwwf», затем он звонит себе еще раз и говорит «Owwf», затем он звонит себе опять и говорит «Owf», поэтому он сам и становится проигравшим в этом раунде. Поэтому условие удовлетворено, если x равно 4.

В последнем тесте из условия если начинает первый человек, то проигравшим становится второй, и наоборот.

B. Хрупкий амфитеатр Arpa и ценные девушки Mehrdad

дп поиск в глубину и подобное снм *1600

Просто напоминаю, некоторые девушки в стране Arpa по-настоящему красивы.

Mehrdad хочет пригласить некоторых девушек во дворец на танцы. У каждой девушки есть некоторый вес wi и некоторая красота bi. Также, у каждой девушки могут быть друзья среди других девушек. Девушек можно разделить на группы по дружбе. Две девушки x и y находятся в одной группе по дружбе, если и только если существует последовательность девушек a1, a2, ..., ak такая, что ai дружит с ai + 1 для каждого 1 ≤ i < k, а a1 = x и ak = y.

Arpa предоставил амфитеатр для вечеринки Mehrdad. Амфитеатр может выдержать суммарный вес не более w.

Mehrdad настолько жадный, что хочет пригласить некоторых девушек так, чтобы их суммарный вес не превышал w, а их суммарная красота была максимальна. При этом, из каждой группы по дружбе он может пригласить либо всех девушек, либо не более одной, иначе кто-нибудь обидится. Найдите для Mehrdad наибольшую суммарную красоту девушек, которых он может пригласить так, чтобы никто не обиделся, а суммарный вес не превысил w.

Входные данные

Первая строка содержит три целых числа n, m и w (1  ≤  n  ≤  1000, , 1 ≤ w ≤ 1000) — количество девушек, количество пар друзей среди них и максимальный суммарный вес приглашенных.

Вторая строка содержит n целых чисел w1, w2, ..., wn (1 ≤ wi ≤ 1000) — веса девушек.

Третья строка содержит n целых чисел b1, b2, ..., bn (1 ≤ bi ≤ 106) — красоты девушек.

Следующие m строк содержат пары друзей, i-я из этих строк содержит два целых числа xi и yi (1 ≤ xi, yi ≤ n, xi ≠ yi), означающих, что девушка xi дружит с девушкой yi. Заметьте, что дружба обоюдная. Все пары (xi, yi) различны.

Выходные данные

Выведите наибольшую суммарную красоту девушек, которых Mehrdad может пригласить так, чтобы никто не обиделся, а суммарный вес не превысил w.

Примечание

В первом тесте из условия две группы по дружбе: девушки {1, 2}, а также девушка {3}. Лучший способ — пригласить всех девушек из первой группы, их суммарный вес будет равен 5, а суммарная красота — 6.

Во втором тесте из условия также две группы по дружбе: девушки {1, 2, 3}, и девушка {4}. Mehrdad не может пригласить всех девушек из первой группы, т. к. их суммарный вес 12 > 11, поэтому лучше всего пригласить первую девушку из первой группы, и единственную девушку из второй. Суммарный вес будет равен 8, а суммарная красота — 7.

C. Ночная вечеринка Arpa и бесшумное появление Mehrdad

графы Конструктив поиск в глубину и подобное *2600

Заметьте, что девушки в стране Arpa действительно привлекательные.

Arpa любит ночные вечеринки. В середине одной из них неожинанно пришел Mehrdad. Он увидел n пар друзей сидящих вокруг стола. i-я пара состояла из молодого человека, сидящего на ai-м стуле, и его девушки, сидящей на bi-м стуле. Стулья пронумерованы от 1 до 2n по часовой стрелке. На каждом стуле сидел ровно один человек.

На вечеринке было два вида еды: Kooft и Zahre-mar. Сейчас Mehrdad задумался, можно ли было подать еду для гостей таким образом, что:

  • Каждый человек получил бы ровно один вид еды,
  • Ни один молодой человек не получил бы тот же вид еды, что и его девушка,
  • Среди каждых трех гостей, сидящих на последовательных стульях, нашлись бы два, получившие разный вид еды. Заметим, что стулья 2n и 1 также считаются последовательными.

Найдите ответ на вопрос Mehrdad. Если такое было возможно, то найдите распределение видов еды, удовлетворяющее всем условиям.

Входные данные

Первая строка содержит целое число n (1  ≤  n  ≤  105) — количество пар гостей.

Далее следуют n строк. i-я из них содержит два целых числа ai и bi (1  ≤ ai, bi ≤  2n) — номер стула, на котором сидел молодой человек в i-й паре и номер стула, на котором сидела его девушка. Гарантируется, что на каждом стуле сидит ровно один человек.

Выходные данные

Если решения не существует, выведите -1.

Иначе выведите n строк, i-я из них должна содержать два целых числа, описывающие виды еды, поданной для i-й пары. Первое число в этой строке это вид еды, поданной молодому человеку, а второе — тип еды, поданной его девушке. Если человеку подали Kooft, выведите 1, иначе выведите 2.

Если существует несколько решений, выведите любое из них.

D. Помеченное буквами дерево Arpa и забавные пути Mehrdad

Деревья поиск в глубину и подобное Структуры данных *2900

Если вдруг кто-то пропустил, у нас в стране Arpa чудесные девушки.

У Arpa есть подвешенное дерево (связный ациклический граф), состоящее из n вершин. Вершины пронумерованы от 1 до n, вершина 1 является корнем. На каждом ребре дерева написана некоторая буква. Mehrdad — фанат самовлюбленных вещей. Он называет строку самовлюбленной, если возможно переставить местами символы строки так, чтобы она стала палиндромом.

Он спросил Arpa про каждую вершину v, какая наибольшая длина среди простых путей в поддереве вершины v таких, что буквы на пути образуют самовлюбленную строку.

Входные данные

Первая строка содержит целое число n (1  ≤  n  ≤  5·105) — количество вершин в дереве.

Далее следует (n  -  1) строка, i-я из них содержит целое число pi + 1 и букву ci + 1 (1  ≤  pi + 1  ≤  i, ci + 1 — строчная буква латинского алфавита, между a и v включительно), которые означают, что между вершинами pi + 1 и i + 1 есть ребро и на нем написана буква ci + 1.

Выходные данные

Выведите n чисел. i-е из них должно быть равно наибольшей длине среди простых путей в поддереве вершины i таких, что буквы на пути образуют самовлюбленную строку.

D. Хлоя и приятные подарки

графы Деревья дп поиск в глубину и подобное *1800

Щедрые спонсоры олимпиады, в которой участвуют Хлоя и Владик, разрешили всем участникам выбрать себе приз самостоятельно. Так как близится Новый год, спонсоры решили нарядить новогоднюю елку своими призами.

Они взяли n подарков для участников и на каждом подарке написали его уникальный номер (целое число от 1 до n). Подарок с номером i характеризуется целым числом ai — приятностью подарка. Приятность подарка может быть как положительным, так и отрицательным числом, а так же нулем. Подарок с номером 1 отправился на вершину елки. Все остальные подарки привязываются веревкой к одному из других подарков так, что каждый подарок в итоге оказывается подвешенным к первому подарку, возможно цепочкой из веревок и других подарков. Более формально, подарки формируют корневое дерево из n вершин.

Раздача подарков происходит таким образом: очередной участник подходит к елке, выбирает любой подарок из оставшихся и отрезает веревку, которой был привязан этот подарок. Обратите внимание, что все веревки, которыми другие подарки были привязаны к подарку, выбранному участником, не отрезаются. Таким образом, участник забирает выбранный подарок, а так же все множество подарков, подвешенное к нему, возможно цепочкой из веревок и других подарков.

Наши герои, Хлоя и Владик, поделили между собой на олимпиаде первое место и они, вопреки правилам раздачи подарков, будут выходить за подарком вместе! Чтобы не поссориться, они решили выбрать себе два таких различных подарка, что множества подарков, подвешенное к ним цепочкой из веревок и других подарков, не имеют пересечения. Иначе говоря, не должно быть подарка, который был бы подвешен к подарку Хлои и подарку Владика одновременно. Из всех возможных вариантов они выберут такую пару подарков, что сумма приятностей всех подарков, которые достанутся им после того, как они отрежут веревки, максимальна.

Найдите максимальную сумму приятностей, которую могут забрать себе Хлоя и Владик. Если это по каким-то причинам невозможно, выведите Impossible.

Входные данные

В первой строке входного файла записано одно целое число n (1 ≤ n ≤ 2·105) — количество подарков.

В следующей строке записано n целых чисел a1, a2, ..., an ( - 109 ≤ ai ≤ 109) — приятности подарков.

В следующих (n - 1) строке находятся по два числа. В i-й из этих строк находятся целые числа ui и vi (1 ≤ ui, vi ≤ n, ui ≠ vi) — описание ребра дерева. Это означает, что подарки с номерами ui и vi привязаны друг к другу веревкой. Эти подарки могут идти в любом порядке: либо ui привязан к vi, либо vi привязан к ui. Гарантируется, что все подарки подвешены к первому подарку, возможно цепочкой из веревок и других подарков.

Выходные данные

Если Хлоя и Владик смогут выбрать себе подарки, не поссорившись, выведите одно число — максимальную сумму приятностей, которую они смогут забрать в таком случае.

Иначе выведите строку Impossible.

A. Коровоконг объединяет нацию

графы поиск в глубину и подобное *1500

Наконец-то Коровоконг стал правителем мира и теперь может навести в нём порядок. Для начала он хочет, чтобы людям было как можно более удобно путешествовать внутри своих стран.

Представим мир как неориентированный граф из n вершин (городов) и m рёбер (дорог). k из этих вершин являются столицами государств (по одной столице для каждой из k стран).

Любая пара вершин соединена не более чем одним ребром, и никакое ребро не соединяет вершину саму с собой. Более того, для любых двух вершин, являющихся столицами, не существует пути между этими двумя вершинами. Любой граф, удовлетворяющий всем этим условиям, называется стабильным.

Коровоконг хочет добавить в граф как можно больше рёбер, так чтобы он всё ещё оставался стабильным. Выясните, сколько рёбер он может добавить.

Входные данные

В первой строке входных данных записаны три числа n, m и k (1 ≤ n ≤ 1 000, 0 ≤ m ≤ 100 000, 1 ≤ k ≤ n) – количество вершин и рёбер в графе, а также количество вершин, являющихся столицами.

Во второй строке записаны k различных целых чисел c1, c2, ..., ck (1 ≤ ci ≤ n), означающих номера вершин, являющихся столицами.

В каждой из последующих m строк записаны два целых числа ui и vi (1 ≤ ui, vi ≤ n), означающих рёбра неориентированного графа.

Гарантируется, что описанный во входных данных граф является стабильным.

Выходные данные

Выведите одно целое число — максимальное количество рёбер, которое Коровоконг может добавить в имеющийся граф, чтобы он остался стабильным.

Примечание

В первом примере граф выглядит следующим образом:

Вершины 1 и 3 являются столицами. Оптимальным решением будет соединить вершину 4 с вершинами 1 и 2. Таким образом, в граф будут добавлены 2 новых ребра. Больше рёбер добавить нельзя, потому что между вершинами 1 и 3 не должно быть пути.

Во втором примере граф выглядит следующим образом:

В него нельзя добавить новые рёбра. Обратите внимание, что нельзя добавлять петли и кратные рёбра.

E. Комментарии

поиск в глубину и подобное Разбор выражений реализация Строки *1700

Редкая статья в интернете обходится без возможности комментирования. Вот и на сайте, который написал Поликарп, у каждой статьи есть лента комментариев. Каждый комментарий на сайте Поликарпа — это непустая строка из строчных или прописных латинских букв. Комментарии имеют древовидную структуру, то есть у каждого комментария, кроме корневых (то есть комментариев самого верхнего уровня) есть ровно один родительский комментарий. При сохранении комментариев на жесткий диск Поликарп использует следующий формат. Каждый комментарий он записывает так:

  • сначала следует текст комментария;
  • затем следует количество комментариев, для которых он является родительским (то есть тех, которые даны в ответ на этот комментарий);
  • после этого следуют комментарии, для которых этот является родительским (запись комментариев происходит по такому же алгоритму).
Все элементы в записи выше разделяются единичными запятыми. Аналогично, комментарии первого уровня Поликарп записывает через запятую. Например, если комментарии имели вид:

то первый будет записан как «hello,2,ok,0,bye,0», второй как «test,0», а третий как «one,1,two,2,a,0,b,0». Вся ветка комментариев будет записана как: «hello,2,ok,0,bye,0,test,0,one,1,two,2,a,0,b,0». По заданной ветке комментариев в формате описанном выше выведите комментарии в другом формате:

  • сначала выведите d — максимальную глубину вложенности комментариев;
  • затем выведите d строк, i-я из них соответствует комментариям вложенности i;
  • для i-й строки выведите комментарии вложенности i в порядке их появления в записи Поликарпа, разделённые единичными пробелами.
Входные данные

В первой строке следует непустая ветка всех комментариев, состоящая из строчных и прописных букв латинского алфавита, цифр и запятых.

Гарантируется, что каждый комментарий — это непустая строка из строчных или прописных латинских букв. Каждое из количеств комментариев — целое число, состоящее хотя бы из одной цифры, которое либо равно 0, либо не содержит лидирующих нулей.

Длина заданной строки не превышает 106 символов. Гарантируется, что заданная структура комментариев корректна.

Выходные данные

Выведите комментарии в формате, описанном в условии. Для каждого уровня вложенности комментарии выводите в том же порядке, в котором они заданы во входных данных.

Примечание

Первый пример разобран в условии.

F. Санта-Клаусы и чемпионат по футболу

графы Деревья Конструктив поиск в глубину и подобное *2300

В Древляндии n городов, соединенных между собой n - 1 дорогой так, что из каждого города можно по дорогам добраться до любого другого. В следующем году в Древляндии пройдет чемпионат по футболу среди команд, состоящих из Санта-Клаусов. Всего в чемпионате примут участие 2k команд из 2k различных городов.

На первом этапе команды разобьются на k пар, каждая пара сыграет два матча: один в городе первой команды из пары, другой — в городе второй команды из пары. Таким образом, в каждом из 2k городов участников будет проведен ровно один матч. Однако как разбить команды на пары, пока не решено.

Перед организаторами также стоит задача определить, в каких городах расселить участников на время чемпионата. Организаторы хотят поселить команды в как можно меньшее число городов, чтобы Санта-Клаусы побольше общались друг с другом и обменивались опытом.

Никакая из команд не хочет чересчур много передвигаться во время турнира, поэтому если команда будет играть в городах u и v, то жить она хочет в городе, лежащем на кратчайшем пути из u в v (в том числе, возможно, в городе u или городе v). Также команды из одной пары необходимо расселить в одном городе.

Таким образом, организаторы турнира хотят разбить 2k команд на пары и расселить участников по минимально возможному числу m городов так, чтобы команды из одной пары жили в одном городе, и чтобы для каждой команды город, в котором она будет жить во время турнира, лежал на кратчайшем пути между городами, в которых она будет играть.

Входные данные

В первой строке заданы два целых числа n и k (2 ≤ n ≤ 2·105, 2 ≤ 2k ≤ n) — количество городов в Древляндии и количество пар команд в турнире.

Следующие n - 1 строк задают описание дорог в Древляндии, каждая из них содержит два целых числа a, b (1 ≤ a, b ≤ n, a ≠ b), что значит, что города a и b соединены очередной дорогой. Гарантируется, что из любого города можно добраться в любой другой по дорогам.

Следующая строка содержит 2k различных целых чисел c1, c2, ..., c2k (1 ≤ ci ≤ n), где ci — город, из которого команда номер i. Все эти числа различны.

Выходные данные

В первой строке выведите целое число m — минимальное количество городов, по которым можно расселить участников.

Во второй строке выведите m различных чисел чисел d1, d2, ..., dm (1 ≤ di ≤ n) — номера городов, в которых будут жить участники.

Далее выведите k строк. В j-й из них выведите 3 числа uj, vj, xj, где uj и vj — города, в которых будет играть j-я пара, а xj — номер города, в котором будут жить команды этой пары. Каждое из чисел c1, c2, ..., c2k должно встретиться среди чисел uj и vj ровно один раз. Каждое из чисел xj должно принадлежать множеству {d1, d2, ..., dm}.

Если оптимальных ответов несколько, выведите любой из них.

Примечание

В первом тесте из условия можно расселить всех участников в один город с номером 2. Разбить на пары можно любым образом, при этом все условия всегда будут выполнены, т. к. город 2 лежит на кратчайшем пути между любой парой городов из множества {2, 4, 5, 6}.

D. Новый год и фейерверки

дп Перебор поиск в глубину и подобное реализация Структуры данных *1900

Одной из популярных традиций встречи нового года является запуск в небо фейерверков. Обычно фейерверк взлетает вертикально вверх в течение некоторого времени, после чего взрывается и разделяется на несколько частей, летящих в разных направлениях. Иногда эти части через некоторое время снова взрываются, также разделяясь на несколько частей и так далее.

Лимак живёт на бесконечном клетчатом поле и у него есть один фейерверк. Поведение этого фейерверка после запуска описывается рекурсией глубины n и продолжительностью каждого из уровней рекурсии t1, t2, ..., tn. Как только Лимак запустит фейерверк в какой-нибудь клетке поля, тот начнёт двигаться вверх. После прохождения t1 клеток (включая стартовую) он взрывается и разделяется на две части, каждая из которых двигается в направлении, изменённом на 45 градусов (для лучшего понимания посмотрите картинки ниже). Таким образом, одна часть будет двигаться в направлении вверх и влево, а другая в направлении вверх и вправо. Каждая из этих частей пройдёт t2 клеток, после чего также разделится на две части, каждая из которых также изменит траекторию на 45 градусов. Процесс будет продолжаться до n-го уровня рекурсии, после чего все 2n - 1 частей взорвутся и исчезнут не создавая новых частей.

После нескольких уровней рекурсивного разделения частей фейерверка может так оказаться, что две или более частей находятся в одной и той же клетке в один и тот же момент времени — такая ситуация разрешена и эти части не сталкиваются.

Перед тем как запустить данный фейерверк Лимак хочет убедиться в безопасности этого запуска. Сможете ли вы посчитать количество клеток, которые хотя бы один раз будут посещены какой-либо частью фейерверка?

Входные данные

В первой строке входных данных записано целое число n (1 ≤ n ≤ 30) — глубина рекурсии разделения фейерверка на части.

Во второй строке записаны n целых чисел t1, t2, ..., tn (1 ≤ ti ≤ 5). На i-м уровне каждая из 2i - 1 частей фейерверка пройдёт ti клеток перед тем как взорвётся.

Выходные данные

Выведите одно целое число, равное количеству клеток которые будут посещены хотя бы одной частью фейерверка хотя бы один раз.

Примечание

Рассмотрим первый пример. Рисунки ниже показывают как будет выглядеть процесс работы фейерверка после каждого уровня рекурсии. Лимак запускает фейерверк из самой нижней красной клетки. После прохождения t1 = 4 клеток (отмеченных красным) он взрывается и делится на две части (их дальнейшее движение показано зелёным). Все взрывы отмечены символом «X». На последнем рисунке присутствуют 4 красных, 4 зелёных, 8 оранжевых и 23 розовых клетки. Таким образом, итоговое количество посещённых клеток равняется 4 + 4 + 8 + 23 = 39.

Для второго примера рисунки демонстрируют ситуацию на 4, 5 и 6 уровнях рекурсии. На рисунке посередине показаны направления всех частей, которые будут двигаться на следующем уровне.

H. Новый год и заснеженное клетчатое поле

графы интерактив поиск в глубину и подобное снм *3500

Обратите внимание на информацию о том как сбрасывать буфер вывода (делать операцию 'flush'), указанную в секции «Выходные данные».

Беарляндия представляет из себя клетчатое поле, состоящее из h строк и w столбцов. Строки пронумерованы от 1 до h сверху вниз. Столбцы пронумерованы от 1 до w слева направо. Каждая клетка является либо свободной (обозначается символом «.» во входных данных) либо постоянно заблокированной (обозначается символом «#»).

Беарляндия — холодная страна и снегопады часто затрудняют путешествия. Каждый день некоторое небольшое количество клеток оказываются временно заблокированными из-за снега. Обратите внимание, что такая блокировка клетки работает только внутри одного конкретного дня и на следующий день любые из заблокированных клеток могут оказаться свободными (если только они не будут снова временно заблокированы).

Между двумя клетками можно перемещаться напрямую, если у них есть общая сторона и ни одна из них не является ни постоянно ни временно заблокированной.

Лимак — маленький полярный медвежонок, которой живёт в Беарляндии. Его дом расположен в левой верхней клетке поля, а школа в правой нижней клетке. Каждый день Лимак ходит из дома в школу и затем возвращается обратно домой. Поскольку Лимак очень легко может заскучать, то он не хочет посещать одну и ту же клетку дважды в течение одного дня, за исключением клетки с его домом, где он начинает и заканчивает свой маршрут. Если Лимак может дойти до школы, а потом вернуться домой не посещая никакую клетку второй раз, то он называет такой день интересным.

Вам требуется последовательно обработать q дней. Для каждого из дней вам требуется проверить является ли он интересным или нет, и соответственно вывести «YES» или «NO» на отдельной строке. Описание следующего дня будет доступно только после того как выведите ответ на текущий и выполните операцию 'flush'.

Гарантируется, что если в некоторый день ни одна клетка поля не является временно заблокированной, то такой день является интересным. Также гарантируется, что клетка, в которой расположен дом Лимака, и клетка, в которой расположена школа никогда не будут заблокированы (ни постоянно, ни временно).

Входные данные

В первой строке входных данных записаны три целых числа h, w и q (2 ≤ h, w ≤ 1000, 1 ≤ q ≤ 10 000) — высота и ширина клетчатого поля, а также количество дней, которые вам следует обработать.

В следующих h строках содержится описание клетчатого поля. В i-й из них записана строка длины w, описывающая i-ю строку поля. Каждый символ строки является либо «.» (соответствует пустой клетке), либо «#» (соответствует постоянно заблокированной клетке). Гарантируется, что если в некоторый день ни одна клетка не будет временно заблокирована, то день будет для Лимака интересным.

Далее следуют описания каждого из q дней. Описание i-го дня начинается со строки, содержащий одно целое число ki (1 ≤ ki ≤ 10) — количества временно заблокированных в этот день клеток. В каждой из последующих ki строк записаны два целых числа ri, j и ci, j (1 ≤ ri, j ≤ h, 1 ≤ ci, j ≤ w), означающих, что временно заблокирована клетка в строке ri, j и столбце ci, j. Гарантируется, что все ki клеток являются различными и ни одна из них не является постоянно заблокированной. Также, ни одна из этих клеток не содержит дом Лимака или школу.

Выходные данные

Для каждого из q дней выведите «YES», если данный день является интересным и «NO» в противном случае. После вывода ответа не забудьте вывести символ перевода строки и сделать операцию 'flush', после чего можно будет считать описание следующего дня. Если вы ничего не выведите или забудете сделать операцию 'flush', то можете получить вердикт Idleness Limit Exceeded.

Для сброса буфера вывода (то есть для операции 'flush') сразу после вывода числа или ответа и перевода строки можно сделать:

  • fflush(stdout) в языке C++;
  • System.out.flush() в Java;
  • stdout.flush() в Python;
  • flush(output) в Pascal;
  • смотрите документацию для других языков.
Примечание

Первый пример состоит из 4 дней. На рисунке ниже показаны возможные маршруты Лимака из дома в школу и обратно для второго и третьего дня (на левом и правом рисунках соответственно). Постоянно заблокированные клетки закрашены красным, а временно заблокированные оранжевым. Чёрные и зелёные стрелочки показывают как Лимак будет идти в школу и обратно соответственно.

Ниже изображено как будет выглядеть поле в каждый из дней второго примера, здесь «#» означает постоянно или временно заблокированную клетку.

C. Польшар и Лес

графы Деревья интерактив поиск в глубину и подобное снм *1300

Польшар и его семья живут в лесу. Лес состоит из деревьев. Деревом называется неориентированный ациклический граф с k вершинами и k - 1 ребрами, где k — некоторое целое число. Заметьте, что изолированная вершина является корректным деревом.

В каждой вершине каждого дерева живет ровно один родственник, они пронумерованы от 1 до n. Для каждого шара i нам известен номер самого дальнего от него родственника, живущего на том же дереве. Если существует несколько таких родственников, нам известен лишь наименьший номер среди них.

Сколько же деревьев в лесу?

Входные данные

Первая строка содержит единственное целое число n (1 ≤ n ≤ 104) — число шаров, живущих в лесу.

Вторая строка содержит последовательность целых чисел p1, p2, ..., pn длины n (1 ≤ pi ≤ n), где pi означает номер самого дальнего от шара i родственника, живущего на том же дереве. Если существует несколько самых дальних родственников живущих на том же дереве, то pi — это номер того среди них, который имеет наименьший номер.

Гарантируется, что последовательность p соответствует некоторому корректному лесу.

Взломы: Чтобы взломать кого-либо, вы должны предоставить в качестве теста корректный лес. По этому лесу будет вычислена последовательность p и подана на ввод взламываемому решению. Используйте следующий формат:

В первой строке выведите целое число n (1 ≤ n ≤ 104) — число шаров, и целое число m (0 ≤ m < n) — число ребер в лесу. Далее, выведите m строк. Строка i должна содержать два целых числа ai и bi, отражающих наличие ребра между вершинами, в которых живут родственники ai и bi. Например, первый тест из условия должен быть выведен так:


5 3
1 2
3 4
4 5
Выходные данные

Выведите число деревьев в лесу, где живет Польшар.

Протокол взаимодействия

Технически данная задача является интерактивной. Однако, это никак не влияет на вас (кроме взломов), т. к. никакого взаимодействия нет.

Примечание

В первом примере лес выглядит так: 1-2 3-4-5.

Всего здесь 2 дерева.

Во втором примере единственный возможный граф это одна вершина и ни одного ребра. Поэтому здесь всего одно дерево.

A. Паша и шашлыки

Конструктив поиск в глубину и подобное *1700

Паша жарит шашлыки. Всего есть n шампуров, они лежат на мангале в ряд, каждый на одной из n позиций. Паша хочет, чтобы все прожарилось равномерно, а для этого надо, чтобы каждый шампур полежал на каждой из n позиций в двух положениях: так, как он лежал изначально, и развернутым задом наперед.

Для этого у Паши есть план, а именно перестановка p и последовательность b1, b2, ..., bn, состоящая из нулей и единиц. Каждую секунду Паша перекладывает шампур на месте i на место pi, и, если bi равно 1, то разворачивает его. Таким образом он надеется, что все шампуры побывают на всех позициях, каждый в двух положениях.

К сожалению, не всякая перестановка p и последовательность b подходят для плана Паши. Какое минимальное суммарное количество элементов в перестановке p и элементов в последовательности b ему надо изменить, чтобы каждый шампур побывал во всех 2n положениях? При этом перестановка должна остаться перестановкой.

Пашу не беспокоит, если шампур примет одно и тоже положение несколько раз прежде, чем он закончит жарить шашлыки. Иными словами, перестановка p и последовательность b ему подходят, если существует такое число k (k ≥ 2n), что после k секунд каждый шампур побывает в каждом из 2n положений.

Можно показать, что некоторая подходящая перестановка p и последовательность b существуют для любого n.

Входные данные

В первой строке следует целое положительное число n (1 ≤ n ≤ 2·105) — количество шампуров.

Во второй строке следует последовательность различных целых чисел p1, p2, ..., pn (1 ≤ pi ≤ n) — перестановка, в соответствии с которой Паша будет перемещать шашлык на шампурах.

В третьей строке следует последовательность b1, b2, ..., bn, состоящая из нулей и единиц, в соответствии с которой Паша будет переворачивать шампуры.

Выходные данные

Выведите целое число — минимальное суммарное количисло элементов в перестановке p и элементов в последовательности b нужно изменить Паше, чтобы каждый шампур побывал во всех 2n положениях.

Примечание

В первом примере можно изменить перестановку на 4, 3, 1, 2.

Во втором примере можно любой из элементов последовательности b изменить на 1.

E. Сломанное дерево

графы Деревья дп жадные алгоритмы поиск в глубину и подобное *2600

Вам дано дерево, состоящее из n вершин, пронумерованных числами от 1 до n, где вершина с номером один — корень дерева. У каждого ребра есть собственные вес wi и прочность pi.

Ботаник Иннокентий, единственный член жюри олимпиады по информатике, очень не любит сломанные деревья.

Дерево является сломанным, если существует такое ребро, прочность которого меньше суммы весов рёбер поддерева, в которое оно ведёт.

Разрешается уменьшать вес любого ребра на целую величину, но тогда прочность этого ребра уменьшается на ту же величину. То есть если вес ребра 10, а прочность 12, то при уменьшении веса на 7 его вес станет равным 3, а прочность станет равной 5.

Увеличивать вес ребра нельзя.

Ваша задача: уменьшая веса рёбер заданного дерева, получить дерево, которое не является сломанным, а также все рёбра в нём должны иметь положительный вес, причём суммарный вес всех рёбер должен быть наибольшим.

Очевидно, что прочность рёбер не может быть отрицательной, однако она может равняться нулю, если вес поддерева равен нулю.

Входные данные

В первой строке входных данных содержится целое число n (1 ≤ n ≤ 2·105) — количество вершин в дереве.

В следующих n - 1 строках содержится описание рёбер. Каждая строка содержит четыре целых числа x, y, w, p (1 ≤ x, y ≤ n, 1 ≤ w ≤ 109, 0 ≤ p ≤ 109), где x и y — вершины, которые соединяет ребро (вершина под номером x — предок вершины под номером y), w и p — вес и прочность ребра соответственно. Гарантируется, что рёбра описывают дерево с корнем в вершине 1.

Выходные данные

Если из заданного дерева нельзя получить несломанное, то выведите в единственной строке -1.

Иначе, выходные данные должны содержать n строк:

В первой строке выведите число n — количество вершин в дереве.

В следующих n - 1 строках выведите описание рёбер конечного дерева. Каждая строка должна содержать четыре целых числа x, y, w, p (1 ≤ x, y ≤ n, 1 ≤ w ≤ 109, 0 ≤ p ≤ 109), где x и y — вершины, которые соединяет ребро (вершина под номером x — предок вершины под номером y), w и p — новые вес и прочность ребра соответственно.

Выводите рёбра в том же порядке, в каком они заданы во входных данных, то есть первые два числа каждой строки должны оставаться неизменёнными.

E. Даша и головоломка

графы Деревья жадные алгоритмы Конструктив поиск в глубину и подобное *2000

После решения задачи, Даша решила отдохнуть. Она уже была готова приступить к своему любимому занятию — оригами, но вспомнила о головоломке которую не смогла решить.

Дерево — это неориентированный связный граф без циклов. В частности, в дереве из n вершин всегда n - 1 ребро.

Головоломка заключалась в расположении вершин в точках декартовой плоскости с целочисленными координатами, так чтобы проведенные отрезки между вершинами соединенными ребрами были параллельны осям координат. Также пересечение отрезков допускается только на их концах. Различным вершинам должны соответствовать различные точки.

Помогите Даше найти любой из искомых способов расположения вершин дерева на плоскости.

Гарантируется, что если можно расположить вершины дерева на плоскости не нарушив условия выше, то это можно сделать воспользовавшись точками с целочисленными координатами по модулю не превышающими 1018.

Входные данные

Первая строка входных данных содержит одно целое число n (1 ≤ n ≤ 30) — количество вершин в дереве.

Следующие n - 1 строк содержат по два целых числа ui, vi (1 ≤ ui, vi ≤ n), которые означают, что i-е ребро дерева соединяет вершины ui и vi.

Гарантируется что описанный граф является деревом.

Выходные данные

Если головоломка не имеет решения, то в единственной строке выходных данных выведите «NO».

Иначе, первая строка выходных данных должна содержать «YES». В следующих n строках должна содержаться пара чисел xi, yi (|xi|, |yi| ≤ 1018) — координаты точки соответствующей i-ой вершине дерева.

Если решений несколько, выведите любое.

Примечание

В первом примере одним из возможных размещений дерева будет следующее:

A. Тимофей и береза

графы Деревья дп поиск в глубину и подобное реализация снм *1600

Каждый Новый Год Тимофей и его друзья рубят в лесу дерево из n вершин и приносят его домой. Чтобы получше его украсить, они превращают его в березу. Береза — дерево из n вершин, каждая вершина i которого покрашена в какой-то цвет ci.

Но вот настал день рождения, и мама Тимофея попросила его вынести березу. Тимофей выносит березу так: хватает за какую-то вершину, остальные вершины опускаются вниз, и дерево становится подвешенным за вершину, за которую он схватил. После этого он идет с ним на улицу и выкидывает.

Попытавшись ухватить березу, Тимофей понял, что его раздражают разноцветные переливы. Поддерево раздражает Тимофея, если в нем есть вершины разных цветов. Он хочет найти, за какую вершину ему нужно взяться, чтобы ни одно поддерево не раздражало его. При этом он не рассматривает все дерево целиком как поддерево, потому что он не видит цвет корневой вершины.

Поддерево некоторой вершины — это подграф, содержащий эту вершину и всех ее потомков.

Определите, есть ли вершина, схватившись за которую, Тимофей не будет раздражен.

Входные данные

Первая строка содержит одно натуральное число n (2 ≤ n ≤ 105) — количество вершин в дереве.

Каждая из следующих n - 1 строк содержит два натуральных числа u и v (1 ≤ u, v ≤ n, u ≠ v), означающие, что существует ребро между вершинами u и v. Гарантируется, что данный граф является деревом.

В следующей строке содержатся n натуральных чисел c1, c2, ..., cn (1 ≤ ci ≤ 105), задающих цвета вершин.

Выходные данные

В первой строке выведите «NO», если Тимофей не может взять березу так, чтобы его ничто не раздражало.

В противном случае выведите «YES», а в следующей строке выведите номер вершины, за которую Тимофею нужно схватить березу. Если существует несколько ответов, выведите любой.

E. Складывание дерева

Деревья дп жадные алгоритмы поиск в глубину и подобное реализация *2200

Ваня хочет уменьшить дерево. Для этого он может произвольное количество раз выполнять следующую операцию. Сначала Ваня выбирает вершину v и два пути одной длины, идущих из неё и не имеющих никаких общих вершин, кроме v. Обозначим эти пути за a0 = v, a1, ..., ak и b0 = v, b1, ..., bk. Кроме того, у вершин a1, ..., ak, b1, ..., bk не должно быть других соседей, кроме соседних вершин в соответствующем пути. После этого Ваня может «наложить» один путь на другой, тем самым, фактически, удалив вершины b1, ..., bk:

Помогите Ване определить, можно ли последовательным применением этой операции получить из дерева путь. Если ответ положительный, также определите минимально возможную длину такого пути.

Входные данные

Первая строка входного файла содержит единственное целое число n — количество вершин в дереве (2 ≤ n ≤ 2·105).

Следующие n - 1 строк описывают рёбра дерева. Каждая из этих строк содержит два целых числа u и v (1 ≤ u, v ≤ n, u ≠ v), разделённых пробелом: номера концов соответствующего ребра. Гарантируется, что заданный граф является деревом.

Выходные данные

Если получить путь невозможно, выведите -1. Иначе выведите минимально возможное число ребер в пути.

Примечание

В первом примере можно получить путь из трех ребер после наложения путей 2 - 1 - 6 и 2 - 4 - 5.

Во втором примере нельзя совершить ни одной корректной операции. Например, нельзя склеить пути 1 - 3 - 4 и 1 - 5 - 6, поскольку у вершины 6 есть сосед 7, которого нет в соответствующем пути.

D. Махмуд и словарь

графы дп поиск в глубину и подобное снм Структуры данных *2000

Махмуд хочет составить новый словарь, содержащий n слов и отношения между ними. Бывает два типа отношений: синонимичность (что значит, что два слова означают одно и тоже) и антонимичность (что значит, что два слова означают противоположные вещи). Время от времени он узнает новые отношения между некоторыми словами.

Махмуд знает, что если между двумя словами есть отношение, то каждое из этих слов имеет отношения со всеми словами, которые имеют отношения к другому слову из пары. Например, если like означает то же, что и love, и love — противоположность hate, то like — тоже противоположность hate. Еще один пример: если love — противоположность hate, и hate — противоположность like, то love — то же, что и like, и так далее.

Иногда Махмуд узнает неверное отношение. Неверное отношение это такое отношение, которое делает два слова одним и тем же и противоположностями одновременно. Например, если он знает, что love — то же, что и like, и like — противоположность hate, и затем узнает, что hate — то же, что и like, то последнее отношение, конечно, неверное, потому что оно делает hate и like антонимами и синонимами одновременно.

После того, как Махмуд узнал много отношений между словами, он обеспокоился тем, что некоторые отношения могут быть неверными. Он решил рассказать о каждом отношении знакомому программисту Ехабу. Махмуд хочет знать для каждого отношения, верное оно или неверное, основываясь на отношениях, которые он узнал раньше. Если отношение неверное, то Махмуд его игнорирует и не использует его для проверки последующих отношений.

После того, как Махмуд расскажет о всех отношениях, он спросит Ехаба об отношениях между некоторыми словами, основываясь на информации, которую дал. Ехаб занят подготовкой раунда Codeforces, поэтому вы должны ему помочь.

Входные данные

В первой строке находятся три целых числа n, m и q (2 ≤ n ≤ 105, 1 ≤ m, q ≤ 105), где n — число слов в словаре, m — число отношений, которые узнал Махмуд, и q — число вопросов, которые Махмуд спросит после того, как расскажет о всех отношениях.

Вторая строка содержит n различных слов a1, a2, ..., an, состоящих из строчных букв латинского алфавита длиной не более 20 — слова в словаре.

Затем следуют m строк, каждая из них содержит целое число t (1 ≤ t ≤ 2), а за ним два различных слова xi и yi, которые встречались в словаре. Если t = 1, то xi — синоним yi, иначе xi — антоним yi.

Затем следуют q строк, каждая из них содержит два различных слова из словаря. Это те пары слов, для которых Махмуд хочет знать отношение на основе тех отношений, которые он узнал.

Все слова во входных данных состоят только из строчных букв латинского алфавита, их длина не превышает 20 символов.

Выходные данные

В начале выведите m строк, по одной на каждое отношение. Если некоторое отношение неверно (т. е. делает два слова синонимами и антонимами одновременно), выведите «NO» (без кавычек) и игнорируйте его, иначе выведите «YES» (без кавычек).

После этого выведите q строк, по одной на каждый вопрос. Если два слова синонимы, выведите 1. Если они антонимы, выведите 2. Если между ними нет отношения, выведите 3.

Обратите внимание на тесты из условия для лучшего понимания.

E. Махмуд и xor-поездка

битмаски Деревья дп Конструктив математика поиск в глубину и подобное Структуры данных *2100

Махмуд и Ехаб живут в стране, в которой n городов, пронумерованных от 1 до n, соединенных n - 1 двунаправленными дорогами. Гарантируется, что из любого города можно добраться в любой другой используя только эти дороги. Про каждый город известна некоторая величина ai.

Определим расстояние от города x до города y как xor чисел, известных про города на пути от x до y (включая как x, так и y). Другими словами, если мы выпишем все величины городов на пути от x до y в массив p длины l, то расстояние между ними будет равно , где  — операция побитовый xor.

Махмуд и Ехаб хотят выбрать два города и проехать от одного до другого. Номер города, в котором они стартуют, всегда не больше номера города, в котором они финишируют (они могут стартовать и закончить в одном и том же городе, тогда расстояние будет равно величине, известной про этот город). Они никак не могут выбрать эти два города, поэтому они попробуют каждый город как старт и каждый город с не меньшим индексом как финиш. Определите суммарное расстояние между всеми этими парами городов.

Входные данные

В первой строке находится целое число n (1 ≤ n ≤ 105) — число городов в стране Махмуда и Ехаба.

Вторая строка содержит n целых чисел a1, a2, ..., an (0 ≤ ai ≤ 106), которые описывают величины, известные про города. Величина ai известна про город i.

Каждая из следующих n  -  1 строк содержит два числа u и v (1  ≤  u,  v  ≤  n, u  ≠  v), означающие, что между городами u и v существует двунаправленная дорога. Гарантируется, что можно доехать от любого города до любого другого по данным дорогам.

Выходные данные

Выведите одно число — суммарное расстояние между всеми возможными парами городов.

Примечание

Операция побитовый xor принимает два целых битовых числа одинаковой длины и выполняет логическую операцию xor на каждой паре соответсвующих бит. Результат в позиции равен 1, если и только если только первый бит 1 или только второй бит 1, и результат равен 0 если оба бита 0 или оба бита 1. Больше информации о побитовом xor можно найти здесь: https://ru.wikipedia.org/wiki/Битовые_операции#.D0.98.D1.81.D0.BA.D0.BB.D1.8E.D1.87.D0.B0.D1.8E.D1.89.D0.B5.D0.B5_.D0.98.D0.9B.D0.98_.28XOR.29.

В первом тесте из примера возможные пути следующие:

  • из города 1 в него самого, расстояние 1,
  • из города 2 в него самого, расстояние 2,
  • из города 3 в него самого, расстояние 3,
  • из города 1 в город 2, расстояние ,
  • из города 1 в город 3, расстояние ,
  • из города 2 в город 3, расстояние .
Суммарное расстояние равно 1 + 2 + 3 + 3 + 0 + 1 = 10.

C. Гирлянда

графы Деревья жадные алгоритмы поиск в глубину и подобное *2000

Однажды под Новый Год Диме приснилось, что ему подарили сказочную гирлянду. Гирлянда — это набор лампочек, некоторые пары которых соединены проводами. Дима запомнил, что она представляла из себя единое целое, то есть любая пара лампочек была связана некоторой последовательностью проводов. Еще он заметил, что проводов было ровно на один меньше, чем лампочек.

Необычность гирлянды состояла в том, что яркость каждой лампочки зависела от температуры этой лампочки, которая могла быть как отрицательной, так и положительной! У Димы есть два друга, и он захотел поделиться с ними сказочным подарком. Для этого он планирует разрезать два разных провода так, чтобы гирлянда распалась на три части. Дима хочет, чтобы все три части светились одинаково, то есть чтобы в каждой из них суммарная температура лампочек совпадала. Конечно же, каждая из частей должна быть непустой, то есть в ней должна быть хотя бы одна лампочка.

Помогите ему найти способ, как это сделать, либо определите, что такого не существует.

Осматривая гирлянду, Дима поднял ее, взяв за какую-то лампочку. Таким образом, каждая лампочка, кроме той, за которую он взял, оказалась висящей на некотором проводе. Поэтому в качестве ответа вам нужно вывести номера двух различных лампочек, что будет означать, что Диме нужно разрезать провода, за которые они подвешены. Соответственно, в ответ не может входить лампочка, за которую Дима взял гирлянду.

Входные данные

В первой строке находится целое число n (3 ≤ n ≤ 106) — количество лампочек в гирлянде.

Затем следует n строк: в i-й из них находится информация об i-й лампочке, а именно, два целых числа — номер лампочки ai, к которой она подвешена (если такой нет, то число 0), и температура ti ( - 100 ≤ ti ≤ 100). Лампочки пронумерованы от 1 до n.

Выходные данные

Если решения не существует, выведите ровно одно число -1.

В противном случае выведите одну строку из двух различных чисел — номеров искомых лампочек. Если правильных ответов несколько, выведите любой.

Примечание

Схема гирлянды и разрезаний к первому примеру из условия:

B. Код для 1

Конструктив поиск в глубину и подобное разделяй и властвуй *1600

Джон отважно боролся за спасение одичалых, атакованных белыми ходоками в Суровом Доме. По прибытию Сэм говорит, что хочет направиться в Старомест, чтобы тренироваться в Цитадели и стать мейстером. Так он сможет вернуться и занять место покойного Эймона, как мейстер Черного Замка. Джон согласился с предложением Сэма, и Сэм отправляется в свое путешествие в Цитадель. Однако становление учащимся Цитадели не так легко, и поэтому мейстеры в Цитадели предложили Сэму задачу, чтобы протестировать его соответствие требованиям.

Изначально у Сэма есть список с единственным числом n. Далее он выполняет некоторые операции над этим списком. На каждой операции Сэм должен удалить любой такой элемент x, что x > 1, из списка, и вставить вместо него три новых элемента , , последовательно. Он должен делать эти операции до тех пор, пока все элементы в списке не равны 0 или 1.

Теперь мейстеры хотят знать общее число единиц на позициях с l-й по r-ю в списке. Сэм хочет стать великим мейстером, но, к сожалению, он не может решить эту задачу. Можете ли вы помочь Сэму пройти тест на соответствие?

Входные данные

Первая строка содержит три целых числа n, l, r (0 ≤ n < 250, 0 ≤ r - l ≤ 105, r ≥ 1, l ≥ 1) — изначальный элемент и диапазон позиций с l-й по r-ю.

Гарантируется, что r не превосходит длины получившегося списка.

Выходные данные

Выведите общее число единиц на позициях с l-й по r-ю в получившемся списке.

Примечание

Рассмотрим первый тестовый пример:

Список чисел со 2-й по 5-ю позиции содержит числа [1, 1, 1, 1]. Количество единиц равно 4.

Второй тестовый пример:

Список чисел с 3-й по 10-ю позиции содержит числа [1, 1, 1, 0, 1, 0, 1, 0]. Количество единиц равно 5.

C. Цикл в лабиринте

*особая задача графы жадные алгоритмы кратчайшие пути поиск в глубину и подобное *1700

Робот находится в прямоугольном лабиринте размера n × m. Каждая из клеток лабиринта либо пустая, либо занята препятствием. Робот может передвигаться между соседними по стороне клетками влево (символ «L»), вправо (символ «R»), вверх (символ «U») или вниз (символ «D»). Робот может переместиться в клетку, только если она пустая. Изначально робот находится в пустой клетке.

Перед вами стоит задача найти лексикографически минимальный цикл Робота длины ровно k, который начинается и заканчивается в той клетке, в которой Робот находится изначально. Роботу разрешается посещать любую клетку сколько угодно раз (включая стартовую).

Считайте, что путь Робота задаётся строкой, состоящей из символов «L», «R», «U» и «D». Например, если Робот сначала пойдёт вниз, потом влево, затем вправо и вверх, то его путь записывается как «DLRU».

В этой задаче вам не нужно минимизировать длину пути. Найдите минимальную лексикографически (в алфавитном порядке, как в словаре) строку, которая удовлетворяет требованиям выше.

Входные данные

В первой строке следуют три целых числа n, m и k (1 ≤ n, m ≤ 1000, 1 ≤ k ≤ 106) — размеры лабиринта и длина цикла.

В каждой из следующих n строк следуют по m символов — описание лабиринта. Если символ равен «.», то текущая клетка пустая. Если символ равен «*», то текущая клетка занята препятствием. Если символ равен «X», то изначально Робот находится в этой клетке, и она пустая. Гарантируется, что символ «X» встречается в лабиринте ровно один раз.

Выходные данные

Выведите лексикографически минимальный путь Робота длины ровно k, который начинается и заканчивается в той клетке, в которой Робот находится изначально. Если такого пути не существует, выведите «IMPOSSIBLE» (без кавычек).

Примечание

В первом примере для Робота существует всего два циклических пути длины 2 — «UD» и «RL». Второй вариант лексикографически меньше.

Во втором примере Робот должен выполнять перемещения в следующем порядке: вниз, влево, вниз, вниз, влево, влево, влево, вправо, вправо, вправо, вверх, вверх, вправо, вверх.

В третьем примере Робот не может переместиться ни в одну из соседних клеток, так как все они заняты препятствиями.

C. Боброжуй-0xFF

Деревья дп жадные алгоритмы поиск в глубину и подобное снм *2100

«Съел бобра — спас дерево!» — именно под таким девизом пройдёт срочный слёт экологов в городе Бобруйске.

А всё дело в том, что популяция бобров на земном шаре достигла невероятных размеров! Каждый день их количество увеличивается в разы, а они даже и не догадываются, какой ущерб приносит природе и человечеству их нездоровая любовь к древесине. Количество кислорода в атмосфере упало до 17 процентов, и, как считают лучшие умы мира, это далеко не предел.

В середине 50-х годов прошлого века группа советских учёных смогла спрогнозировать ситуацию с бобрами и разработала секретную технологию по очистке территории под таинственным названием «Боброжуй-0xFF». Теперь судьба планеты лежит на хрупких плечах всего нескольких людей, отдавших свою жизнь науке.

Прототип уже готов, теперь нужно срочно проводить его испытания в полевых условиях.

Вам дано дерево, сплошь усеянное бобрами. Дерево состоит из n вершин, в i-ой вершине расположилось ki бобров. Напомним, дерево — это связный неориентированный граф без циклов.

«Боброжуй-0xFF» работает по следующему принципу: находясь в некоторой вершине u, он может перейти к вершине v, если они соединены ребром, и съесть ровно одного бобра из тех, что находятся в вершине v. Переместиться в вершину v невозможно, если в ней не осталось бобров. «Боброжуй-0xFF» не может просто так стоять в какой-то вершине и есть там бобров. Он должен двигаться без остановок.

Почему «Боброжуй-0xFF» работает именно так? Потому что разработчики не предусмотрели место в нём для аккумулятора, а поедание бобров необходимо для перегона их массы в чистую энергию.

Гарантируется, что бобры будут находиться в шоке от происходящего, поэтому не смогут перемещаться по дереву. В свою очередь, «Боброжуй-0xFF» может перемещаться по каждой ветке в обоих направлениях сколько угодно раз, пока условия, описанные выше, выполняются.

Корень дерева находится в вершине s. Это значит, что «Боброжуй-0xFF» начинает свою миссию в вершине s и обязательно должен в неё же вернуться в конце испытания, потому что снимать его с большой высоты никто не намерен.

Определите максимальное количество бобров, которое сможет съесть «Боброжуй-0xFF», вернувшись при этом в стартовую вершину.

Входные данные

В первой строке содержится целое число n — число вершин в дереве (1 ≤ n ≤ 105). Во второй строке содержится n целых чисел ki (1 ≤ ki ≤ 105) — количество бобров на каждой вершине. В следующих n - 1 строках находятся пары целых чисел — номера вершин, соединенных ребром. Вершины нумеруются от 1 до n. В последней строке находится целое число s — номер стартовой вершины (1 ≤ s ≤ n).

Выходные данные

Нужно вывести единственное число — максимальное возможное число бобров, съеденных «Боброжуем-0xFF».

Пожалуйста, не используйте спецификатор %lld для записи 64-х битовых чисел на С++. Рекомендуется использовать поток cout (также вы можете использовать спецификатор %I64d).

C. Онлайн-курсы в БГУ

*особая задача графы поиск в глубину и подобное реализация *1500

В Берляндском государственном университете теперь можно учиться онлайн! Для получения диплома среди всего многообразия онлайн-курсов Поликарпу необходимо пройти k главных онлайн-курса его специальности. Всего для прохождения доступны n курсов.

Ситуация осложняется тем, что онлайн-курсы зависят друг от друга и для каждого курса есть список тех, которые необходимо обязательно пройти до начала прохождения этого онлайн-курса (список может быть пустым, что означает отсутствие таких ограничений).

Помогите Поликарпу пройти наименьшее количество курсов суммарно, чтобы получить cпециальность (то есть пройти все главные курсы и необходимые для их прохождения курсы). Напишите программу, которая выводит порядок прохождения курсов.

Поликарп проходит курсы последовательно, то есть он может приступать к прохождению следующего только после окончания предыдущего. Каждый из курсов можно проходить не более одного раза.

Входные данные

В первой строке записаны n и k (1 ≤ k ≤ n ≤ 105) — количество онлайн-курсов и количество главных курсов специальности Поликарпа.

Вторая строка содержит k различных целых чисел от 1 до n — номера главных онлайн-курсов специальности Поликарпа.

Далее следует n строк, каждая из которых описывает очередной курс: i-я из них соответствует курсу i. Каждая строка начинается с целого числа ti (0 ≤ ti ≤ n - 1) — количества курсов, от которых зависит i-й. Далее следует последовательность из ti различных целых чисел от 1 до n — номера курсов в произвольном порядке, от которых зависит i-й. Гарантируется, что никакой курс не может зависеть сам от себя.

Гарантируется, что сумма по всем значениям ti не превосходит 105.

Выходные данные

Выведите -1, если не существует способа получения специальности.

В противном случае в первую строку выведите целое число m — минимальное количество онлайн-курсов, которое необходимо пройти для получения специальности. Во вторую строку выведите m различных целых чисел — номера курсов, которые надо пройти, в хронологическом порядке их прохождения. Если ответов несколько разрешается вывести любой из них.

Примечание

В первом примере можно сначала пройти курсы номер 1 и 2, после чего можно будет пройти курс номер 4, а затем курс номер 5, который является главным. После этого останется пройти только курс номер 3, который является последним непройденным главным курсом.

A. Мишка и условие дружбы

графы поиск в глубину и подобное снм *1500

Мишка Лимак исследует социальную сеть. Основная ее функциональность заключается в том, что два пользователя могут стать друзьями (в таком случае они могут обмениваться сообщениями и смешными картинками).

Сейчас в социальной сети n пользователей, они пронумерованы от 1 до n. Ровно m пар из них являются друзьями. Конечно. никакой пользователь не может быть другом с самим собой.

Пусть запись A-B означает, что пользователи A and B друзья. Лимак считает, что социальная сеть обоснована, если и только если выполняется следующее условие: для любых трех различных пользователей (X, Y, Z) если X-Y и Y-Z, то также X-Z.

Например, если Алан и Боб друзья, и Боб и Цири друзья, то Алан и Цири тоже должны быть друзьями.

Можете помочь Лимаку и проверить, что социальная сеть обоснована? Выведите «YES» или «NO» без кавычек в соответствии с результатом.

Входные данные

Первая строка содержит два целых числа n и m (3 ≤ n ≤ 150 000, ) — число пользователей сети и число пар пользователей, которые являются друзьями.

i-я из следующих m строк содержит два целых различных числа ai и bi (1 ≤ ai, bi ≤ n, ai ≠ bi), означающих, что ai-й и bi-й пользователи являются друзьями. Все пары друзей различны.

Выходные данные

Если данная социальная сеть обоснована, выведите в единственную строку «YES» (без кавычек).

Иначе выведите в единственную строку «NO» (без кавычек).

Примечание

Рисунки ниже показывают социальную сеть в первом (слева) и во втором (справа) примерах. Кружки обозначают пользователей, а линии означают, что два пользователя являются друзьями.

Во втором примере ответ «NO», потому что пользователи (2, 3) друзья, пользователи (3, 4) тоже друзья, а пользователи (2, 4) — нет.

C. Мишка и прыжки по дереву

Деревья дп поиск в глубину и подобное *2100

Деревом называется неориентированный ациклический связный граф. Расстоянием между двумя вершинами называется число ребер на простом пути между ними.

Лимак — маленький полярный мишка. Он живет на дереве, состоящем из n вершин, вершины дерева пронумерованы от 1 до n.

Недавно Лимак научился прыгать. Он может прыгнуть из некоторой вершины в любую вершину на расстоянии не дальше k.

Для пары вершин (s, t) определим f(s, t) как минимальное число прыжков, которое требуется Лимаку, чтобы попасть из вершины s в вершину t. Найдите сумму величин f(s, t) по всем парам вершин (s, t) таким, что s < t.

Входные данные

В первой строке содержатся два целых числа n и k (2 ≤ n ≤ 200 000, 1 ≤ k ≤ 5) — число вершин в дереве и максимальное расстояние, на которое может прыгнуть Лимак, соответственно.

Следующие n - 1 строк содержат описания ребер дерева. i-я из этих строк содержит два целых числа ai и bi (1 ≤ ai, bi ≤ n) — номера вершин, соединенных i-м ребром.

Гарантируется, что заданный граф является деревом.

Выходные данные

Выведите одно число — сумму величин f(s, t) по всем парам вершин (s, t) таким, что s < t.

Примечание

В первом примере дерево состоит из 6 вершин и показано на рисунке ниже. Лимак может прыгать в любую вершину на расстоянии не больше 2 от текущей. Например, из вершины 5 он может прыгнуть в вершины 1, 2 и 4 (а также в саму вершину 5).

Всего есть пар вершин (s, t) таких, что s < t. Для 5 из этих пар Лимаку понадобится два прыжка, это пары (1, 6), (3, 4), (3, 5), (3, 6), (5, 6). Для остальных 10 пар вершин достаточно одного прыжка. Таким образом, ответ равен 5·2 + 10·1 = 20.

В третьем примере Limak может прыгать из любой вершины в любую. Всего есть 3 пары вершин (s < t), поэтому ответ равен 3·1 = 3.

D. Задача о дверях

2-sat графы поиск в глубину и подобное снм *2000

Мориарти поймал n человек в n различных комнатах гостиницы. Двери в некоторые комнаты заперты, в остальные открыты. Однако, существует условие, что люди могут спастись только когда все двери будут открыты одновременно. Есть m переключателей. Каждый переключатель контролирует двери в некоторые комнаты, однако, каждая дверь контролируется ровно двумя переключателями.

Вам дано изначальное положение каждой двери. При изменении положения любого переключателя, то есть при включении его, когда он выключен, или выключении, когда он включен, меняется положение каждой двери, которые контролирует этот переключатель. Например, мы изменили положение переключателя 1, который подключен к дверям 1, 2, и 3, которые были в состояниях заперто, открыто и открыто. Тогда их состояния изменятся на открыто, закрыто и закрыто, соответственно.

Ваша задача сказать Шерлоку, существует ли способ открыть все двери одновременно.

Входные данные

Первая строка содержит два целых числа n и m (2 ≤ n ≤ 105, 2 ≤ m ≤ 105) — число комнат и число переключателей.

Следующая строка содержит n целых чисел r1, r2, ..., rn (0 ≤ ri ≤ 1) — изначальные состояния дверей. Комната i заперта, если ri = 0, иначе она открыта.

i-я из следующих m строк содержит целое число xi (0 ≤ xi ≤ n), а затем xi различных целых чисел — количество комнат, контролируемых i-м переключателем, а затем номера этих комнат. Гарантируется, что номера комнат — различные целые числа от 1 до n. Гарантируется, что каждая дверь контролируется ровно двумя переключателями.

Выходные данные

Выведите "YES" без кавычек, если возможно открыть все двери одновременно, иначе выведите "NO" без кавычек.

Примечание

Во втором примере изначальные состояния дверей равны [1, 0, 1] (0 — закрыта, 1 — открыта).

После переключения переключателя 3, мы получаем [0, 0, 0], что значит, что все двери закрыты.

Затем, после переключения переключателя 1, мы получим [1, 1, 1], что значит, что все двери открыты.

Можно показать, что в первом и третьем примере невозможно открыть все двери одновременно.

B. Побитовая формула

битмаски Перебор поиск в глубину и подобное Разбор выражений реализация *1800

Вася недавно прочитал о битовых операциях, которые используются в компьютерах: AND, OR и XOR. Он неплохо изучил их свойства и придумал новую игру. Изначально Вася выбирает разрядность m для своей игры, это значит, что все числа в игре будут состоять из m битов. Потом он просит Петю выбрать некоторое одно m-битное число. После этого Вася вычисляет значения n переменных. Каждой из переменных присваивается либо константное m-битное число, либо результат выполнения битовой операции, операндами которой могут являться уже определенные переменные или выбранное Петей число. После этого сумма очков, которую получает Петя, равна сумме значений всех переменных.

Вася хочет узнать, какое число должен выбрать Петя, чтобы получить минимально возможное число очков, и какое число он должен выбрать, чтобы получить максимальное число очков. В обоих случаях, если у Пети есть несколько способов получить такую сумму, найдите минимальное число, которое он может выбрать.

Входные данные

В первой строке содержатся два целых числа n и m — количество переменных и разрядность, соответственно (1 ≤ n ≤ 5000; 1 ≤ m ≤ 1000).

В следующих n строках содержится описание переменных. В каждой строке описывается ровно одна переменная. Описание имеет следующий вид: имя новой переменной, пробел, знак «:=», снова пробел, далее два варианта:

  1. Число в битовой записи длиной ровно m битов.
  2. Первый операнд, пробел, битовая операция («AND», «OR» или «XOR»), пробел, второй операнд. Каждый операнд — это либо имя уже определенной переменной, либо символ '?', обозначающий выбранное Петей число.

Имена переменных — строки из строчных латинских букв длиной не более 10 символов. Все имена переменных различны.

Выходные данные

В первой строке выведите минимальное число, которое должен выбрать Петя, чтобы сумма значений всех переменных была минимальна, во второй строке — минимальное число, которое должен выбрать Петя, чтобы сумма значений всех переменных была максимальна. Оба числа выведите в виде двоичного m-битного числа.

Примечание

В первом тесте если Петя выбирает число 0112, то a = 1012, b = 0112, c = 0002, сумма их значений равна 8. Если же он выберет число 1002, то a = 1012, b = 0112, c = 1112, сумма их значений равна 15.

Для второго теста минимальная и максимальная суммы переменных a, bb, cx, d и e равны 2 и не зависят от загаданного числа, поэтому минимальное число, которое может выбрать Петя — 0.

C. Петрович — полиглот

Деревья Перебор поиск в глубину и подобное снм Строки хэши *2500

Петрович обожает изучать новые языки, но самое любимое его увлечение — составление своих собственных. Языком Петрович называет множество слов, а словом — последовательность маленьких букв латинского алфавита.

Каждое утро Петрович составляет свой новый язык. Хранить все языки в явном виде очень сложно, поэтому Петрович придумал веник — специальную структуру данных для хранения языка, представляющую собой подвешенное дерево, на ребрах которого написаны буквы. Перед придумыванием языка веник представляет одну вершину — корень. При добавлении нового слова в язык Петрович встает в корень веника и обрабатывает буквы слова по одной. Пусть Петрович стоит в вершине u. Если из u есть ребро, на котором написана текущая буква, он переходит по нему. Иначе же, Петрович добавляет ребро из u в новую вершину v, пишет на нем текущую букву и переходит по этому ребру. Размером веника Петрович называет количество вершин в нем.

Вечером, приходя со смены, Петрович не может понять язык, придуманный утром: он ему кажется слишком сложным. Тогда Петрович старается упростить свой язык. Упрощением языка Петрович называет удаление букв из некоторых слов языка. Формально, Петрович фиксирует некоторое целое положительное число p, берет все слова, содержащие хотя бы p букв, и выкидывает из каждого из них букву с номером p. Буквы в слове Петрович предпочитает нумеровать, начиная с 1. Петрович считает, что при упрощении языка хотя бы одно слово должно измениться, то есть в языке должно быть хотя бы слово с длиной хотя бы p. Так как Петрович стремится сделать язык, придуманный утром, как можно проще, он старается подобрать число p таким образом, чтобы минимизировать размер веника, в котором он будет хранить язык.

Петровичу надоело заниматься одним и тем же каждый вечер, поэтому он обратился за помощью к вам. Напишите программу, которая будет находить минимальный размер веника, который может получиться в результате упрощения языка, придуманного Петровичем, и число p, которое нужно выбрать, чтобы получить такой размер.

Входные данные

В первой строке входного файла задано число n (2 ≤ n ≤ 3·105) — размер веника языка Петровича.

В следующих n - 1 строках задано описание веника. В i-й из них записаны числа ui, vi и буква xi, что соответствует ребру из ui в vi, на котором написана буква xi.

Вершины пронумерованы числами от 1 до n. Все xi являются маленькими буквами латинского алфавита. Вершина с номером 1 является корнем веника.

Гарантируется, что ребра описывают корректный веник, построенный по языку Петровича.

Выходные данные

В первой строке выведите минимальный возможный размер веника, который может получиться в результате упрощения языка. Во второй строке выведите число p, которое следует выбрать Петровичу для получения минимального размера. Если таких чисел p несколько, выведите минимальное из них.

Примечание

Веник из второго примера может быть составлен из множества слов «piece», «of», «pie», «pretty», «prefix». После упрощения языка с p = 2 получается язык из слов «pece», «o», «pe», «petty», «pefix». Этот язык и задаёт веник минимального возможного размера.

C. Андрюша и разноцветные шарики

графы Деревья жадные алгоритмы поиск в глубину и подобное *1600

Андрюша каждый день с самого детства ходит через городской парк. Дорожки и полянки парка все время казались ему слишком одинаковыми, и однажды он решил украсить их и сделать разнообразными.

Парк состоит из n полянок, которые соединены между собой (n - 1) двусторонними дорожками, причем от каждой полянки можно дойти по дорожкам до любой другой. Андрюша решил на каждой полянке повесить один цветной шарик. Цвета шариков задаются целыми положительными числами, начиная с 1. Чтобы парк стал более разнообразным, Андрюша решил выбирать цвета шариков по-особенному. А именно, он хочет развесить шарики так, чтобы для любых трех попарно различных полянок a, b и c таких, что a и b соединены дорожкой, и b и c соединены дорожкой, цвета шариков на этих полянках были попарно различными.

Чтобы не тратить много денег на покупку шариков, Андрюша хочет использовать как можно меньше различных цветов. Так как Андрюша не очень силен в программировании, он просит вас помочь ему решить эту задачу.

Входные данные

В первой строке находится одно целое число n (3 ≤ n ≤ 2·105) — число полянок в парке.

В каждой из следующих (n - 1) строк находятся два целых числа x и y (1 ≤ x, y ≤ n) — номера двух полянок, соединенных очередной дорожкой.

Гарантируется, что от любой полянки можно добраться до любой другой по дорожкам.

Выходные данные

В первой строке выведите одно целое число k — минимальное количество цветов, которое необходимо использовать Андрюше.

Во второй строке выведите n целых чисел, i-е из которых равняется цвету шарика, который нужно повесить на i-й полянке. Каждое из чисел должно быть в пределах от 1 до k.

Примечание

В первом примере из условия парк состоит из трех полянок, которые последовательно соединены: 1 → 3 → 2. Значит, цвета шариков на каждой полянке должны быть попарно различны.

Иллюстрация к первому примеру.

Во втором примере в парке можно найти следующие тройки полянок, соединенных последовательно:

  • 1 → 3 → 2
  • 1 → 3 → 4
  • 1 → 3 → 5
  • 2 → 3 → 4
  • 2 → 3 → 5
  • 4 → 3 → 5
Отсюда мы видим, что каждая пара полянок лежит в какой-нибудь тройке, а значит цвета шариков на всех полянках должны быть попарно различны.
Иллюстрация ко второму примеру.

В третьем примере есть следующие тройки:

  • 1 → 2 → 3
  • 2 → 3 → 4
  • 3 → 4 → 5
Это значит, что одного или двух цветов недостаточно, а для трех цветов ответ существует и приведен в примере.
Иллюстрация к третьему примеру.

E. Подземная лаборатория

графы Конструктив поиск в глубину и подобное *2100

В огромной подземной лаборатории злая корпорация Зонтик создает клонов для своих страшных экспериментов. Однажды компания клонировала мальчика по имени Андрюша, который был умнее своих сверстников. Андрюша понял, что вокруг творится что-то неладное. Он поднял клонов на борьбу против корпорации, и те начали искать выход из лаборатории. Компании ничего не оставалось, кроме как запустить процесс самоуничтожения подземного комплекса.

Лаборатория представляет собой связный граф из n вершин и m ребер. В некоторых вершинах этого графа k клонов Андрюши начинают поиск выхода из лаборатории. В процессе поиска каждую секунду они переходят по ребру в соседнюю вершину, причем в каждой вершине может одновременно находиться сколько угодно клонов. Каждый клон может в некоторый момент времени остановиться и прекратить поиски, но он обязательно должен их начать, то есть посетить хотя бы одну вершину. Более того, выход может находиться в произвольном месте лаборатории, поэтому клоны должны обойти граф целиком, то есть каждая вершина графа должна быть посещена хотя бы одним клоном хотя бы один раз.

Время клонов ограничено, и каждый из них сможет обойти не более комнат до того, как лаборатория взорвется.

Ваша задача заключается в том, чтобы расставить клонов по вершинам графа и для каждого клона вывести путь, по которому он должен обходить граф. При этом количество вершин в каждом пути должно быть не больше .

Входные данные

В первой строке находятся три целых числа n, m и k (1 ≤ n ≤ 2·105, n - 1 ≤ m ≤ 2·105, 1 ≤ k ≤ n) — число вершин в графе, число ребер в графе и количество клонов.

В каждой из следующих m строк находятся два целых числа xi и yi (1 ≤ xi, yi ≤ n) — номера двух вершин, соединенных очередным ребром. В графе могут быть петли и кратные ребра.

Гарантируется, что граф связный.

Выходные данные

Выведите k строк. В начале i-й строки выведите целое число ci () — количество вершин, которые посетит i-й клон, а затем выведите ci целых чисел — номера вершин, которые он посетит, в порядке их посещения. Выводите вершину каждый раз, когда клон ее посещает, даже если он посещал ее до этого.

Гарантируется, что ответ существует.

Примечание

В первом тесте есть всего 1 клон, он посещает вершины в порядке (2, 1, 3), что укладывается в ограничение 6 посещенных вершин.

Во втором тесте есть 2 клона, они посещают вершины в порядке (2, 1, 3) и (4, 1, 5), что укладывается в ограничение 5 посещенных вершин.

A. Берсерк

дп игры поиск в глубину и подобное *2000

Рик и Морти играют в свою собственную версию игры Берсерк (которая не имеет ничего общего с известной игрой Берсерк). Эта игра требует много пространства, поэтому они играют в нее на компьютере.

В этой игре есть n объектов, пронумерованных от 1 до n, расположенных в круг (по часовой стрелке). Объект номер 1 является черной дырой, а все остальные объекты являются планетами. Монстр находится на одной из планет. Рик и Морти ещё не знают на какой, только то, что он изначально не в черной дыре, но Юнити сообщит им положение монстра после начала игры. Но сейчас они хотят подготовиться к каждому возможному сценарию.

У каждого есть множество чисел, каждое из которых лежит между 1 и n - 1 (включительно). Множество Рика s1, имеющее k1 элементов, и множество Морти s2, имеющее k2 элементов. Один из них ходит первый, и игроки ходят поочередно. На каждом ходу игрок должен выбрать произвольное число x из своего множества, и монстр пойдет к x-му следующему объекту от его текущей позиции (по часовой стрелке). Если после его хода монстр попал в черную дыру, игрок выигрывает.

Ваша задача для каждой позиции монстра и тому, кто играет первый, определить, кто выиграет, проиграет, либо игра будет длиться вечно. В случае, если игрок может проиграть или сделать игру бесконечной, более выгодным вариантом является бесконечная игра.

Входные данные

Первая строка входных данных содержит единственное целое число n (2 ≤ n ≤ 7000) — количество объектов в игре.

Вторая строка содержит целое число k1, за которым следует k1 различных целых чисел s1, 1, s1, 2, ..., s1, k1 — множество Рика.

Третья строка содержит целое число k2, за которым следует k2 различных целых чисел s2, 1, s2, 2, ..., s2, k2 — множество Морти.

1 ≤ ki ≤ n - 1 и 1 ≤ si, 1, si, 2, ..., si, ki ≤ n - 1 для всех 1 ≤ i ≤ 2.

Выходные данные

В первой строке выведите n - 1 слов, разделенных пробелом, где i-е слово равно «Win» (без кавычек), если в сценарии, в котором Рик начинает первым и монстр изначально на объекте номер i + 1, он выигрывает, «Lose», если он проигрывает, и «Loop», если игра никогда не закончится.

Подобным образом, во второй строке выведите n - 1 слов, разделенных пробелом, где i-е слово равно «Win» (без кавычек), если в сценарии, в котором Морти начинает первым, и монстр изначально на объекте номер i + 1, он выигрывает, «Lose», если он проигрывает, и «Loop», если игра никогда не закончится.

D. Бог рэпа

Деревья поиск в глубину и подобное Строки Структуры данных хэши *3400

Рик влюблен в Юнити. Но и мистер Мисикс также любит Юнити. Поэтому Рик и мистер Мисикс «любовные соперники».

Юнити нравится рэп, поэтому было решено, что они должны участвовать в рэп игре (баттле), чтобы выбрать лучшего. Рик слишком ботаник, поэтому вместо этого он собирается сделать свой текст используя его оригинальный алгоритм на лирике песни «Rap God».

Его алгоритм немного сложен. Он делает дерево с n вершинами, пронумерованными от 1 до n. На каждом ребре дерева написана маленькая латинская буква. Он определил str(a, b), как строку сформированную написанием всех букв, одну за другой, на кратчайшем пути от a до b (длина строки равна расстоянию от a до b). Заметьте, что str(a, b) это, записанная задом наперед, строка str(b, a). Также строка str(a, a) является пустой строкой.

Чтобы сделать лучший текст, ему необходимо отвечать на некоторые запросы, но он не ученый-компьютерщик и не может ответить на эти запросы, поэтому он просит вас помочь ему. Каждый запрос характеризуется двумя вершинами x и y (x ≠ y). Ответом на этот запрос является кол-во таких вершин z, что z ≠ x, z ≠ y и str(x, y) лексикографически больше, чем str(x, z).

Строка x  =  x1x2...x|x| лексикографически больше, чем строка y  =  y1y2...y|y|, если |x|  >  |y| и x1  =  y1,  x2  =  y2,  ...,  x|y|  =  y|y|, или существует такое r (r  <  |x|,  r  <  |y|), что x1  =  y1,  x2  =  y2,  ...,  xr  =  yr и xr  +  1  >  yr  +  1. Символы сравниваются, как их ASCII коды (или как их позиции в алфавите).

Помогите Рику заполучить девушку.

Входные данные

Первая строка входных данных содержит два целых числа n и q (2 ≤ n ≤ 20000, 1 ≤ q ≤ 20000) — количество вершин в дереве и количество запросов соответсвенно.

Следующие n - 1 строк содержат ребра. Каждая строка содержит два целых числа v и u (концы ребра), за которыми следует маленькая латинская буква c (1 ≤ v, u ≤ n, v ≠ u).

Следующие q строк содержат запросы. Каждая строка содержит два целых числа x и y (1 ≤ x, y ≤ n, x ≠ y).

Выходные данные

Для каждого запроса выведите ответ в одну строку.

Примечание

Дерево для первого теста из условия:

Дерево для второго теста из условия:

В этом тесте:

  • str(8, 1) = poo
  • str(8, 2) = poe
  • str(8, 3) = po
  • str(8, 4) = pop
  • str(8, 5) = popd
  • str(8, 6) = popp
  • str(8, 7) = p

Поэтому для первого запроса и для третьего запроса это ответ.

B. Странное путешествие

графы Комбинаторика Конструктив поиск в глубину и подобное снм *2100

Маленький мальчик Игорь решил стать путешественником. Сначала он решил обойти все города в своей родной стране Ужляндии.

Как известно, в Ужляндии n городов, соединенных m двусторонними дорогами. Также известно, что между любыми двумя городами существует не больше одной дороги, но могут существовать дороги которые начинаются и заканчиваются в одном городе. Игорь решил спланировать свое путешествие заранее. Он называет хорошим путь, который посещает m - 2 дороги дважды, а остальные 2 дороги — по одному разу. Хороший путь начинается и заканчивается в любом городе. Не обязательно заканчивать путь в том же городе, в котором он начался.

Теперь Игорю стало интересно, сколько же путей его устраивают? Он считает два хороших пути различными, если различаются множества дорог, по которым он пройдет один раз. Помогите Игорю — посчитайте количество различных хороших путей.

Входные данные

В первой строке входных данных записано два целых числа n, m (1 ≤ n, m ≤ 106) — количество городов и дорог в Ужляндии соответственно. В каждой из следующих m строк находятся два целых числа u и v (1 ≤ u, v ≤ n), которые означают, что между городами u и v существует двусторонняя дорога.

Гарантируется, что между любыми двумя городами существует не больше одной дороги, в том числе, для каждого города существует не более одной дороги, которая ведет из него в него же самого.

Выходные данные

Выведите одно целое число — количество различных хороших путей.

Примечание

В первом тестовом примере хорошими являются пути:

  • 2 → 1 → 3 → 1 → 4 → 1 → 5,
  • 2 → 1 → 3 → 1 → 5 → 1 → 4,
  • 2 → 1 → 4 → 1 → 5 → 1 → 3,
  • 3 → 1 → 2 → 1 → 4 → 1 → 5,
  • 3 → 1 → 2 → 1 → 5 → 1 → 4,
  • 4 → 1 → 2 → 1 → 3 → 1 → 5.

Кроме того, существуют хорошие пути, которые совпадают с каким-то из перечисленных выше, потому что совпадают множества дорог, по которым Игорь пройдет один раз:

  • 2 → 1 → 4 → 1 → 3 → 1 → 5,
  • 2 → 1 → 5 → 1 → 3 → 1 → 4,
  • 2 → 1 → 5 → 1 → 4 → 1 → 3,
  • 3 → 1 → 4 → 1 → 2 → 1 → 5,
  • 3 → 1 → 5 → 1 → 2 → 1 → 4,
  • 4 → 1 → 3 → 1 → 2 → 1 → 5,
  • и все эти пути в обратную сторону.

Таким образом, ответ равен 6.

Во втором примере Игорь не может пройти по всем дорогам.

В третьем примере он пройдет по одному разу по каждой из дорог.

C. Большое смешивание

графы кратчайшие пути поиск в глубину и подобное *2300

Саша и Коля снова решили напиться колы. На этот раз у них есть k видов колы, i-й вид колы характеризуется концентрацией газа . Сегодня на празднике в честь Сергея Ванкуверского они решили приготовить бокал колы с концентрацией газа ровно . Чтобы напиток также был вкусным, они хотят, чтобы в бокале было целое число литров колы каждого вида (колы некоторых видов может и вовсе не быть в бокале). Кроме того, они хотят минимизировать общий объем колы в бокале.

Концентрацией газа в коле называется отношение объема газа к общему объему напитка. При смешивании объем газа в напитке равен суммарному объему газа в смешиваемых компонентах; объем напитка также равен сумме объемов напитка в смешиваемых компонентах.

Помогите Саше и Коле. Найдите минимальное натуральное количество литров колы, необходимое для получения бокала с концентрацией газа ровно . Считайте, что каждого вида колы у друзей бесконечное количество.

Входные данные

В первой строке входных данных содержится два целых числа n и k (0 ≤ n ≤ 1000, 1 ≤ k ≤ 106) — требуемая концентрация газа и количество видов колы соответственно.

Во второй строке находятся k целых чисел a1, a2, ..., ak (0 ≤ ai ≤ 1000) — концентрация газа в каждом из видов колы. Для некоторых видов колы концентрация газа может совпадать.

Выходные данные

Выведите минимальное натуральное количество литров колы, необходимое для получения бокала с концентрацией газа ровно , или -1, если это сделать невозможно.

Примечание

В первом примере мы можем получить концентрацию , используя по одному литру видов с концентрациями и : .

Во втором примере мы можем получить концентрацию , используя два литра вида , и один литр вида : .

B. Игорь и путь на работу

графы кратчайшие пути поиск в глубину и подобное реализация *1600

Проснувшись со звонком будильника, аналитик Игорь заспешил на работу. Совершив все необходимые утренние процедуры и позавтракав, Игорь сел в свой автомобиль. Открыв GPS-навигатор, он увидел, что в некоторых районах его родного города Банкополиса ведутся дорожные работы, поэтому они недоступны для проезда. Однако на этом неприятности Игоря не закончились: оказалось, что в его авто сломался руль, и он может совершить не более двух поворотов по пути в свой офис в банке.

Банкополис представляет из себя клетчатое поле из n строк и m столбцов. Помогите аналитику Игорю найти путь из дома в его офис, содержащий не более двух поворотов и не посещающий клетки, в которых проводятся дорожные работы, либо установить, что такого пути не существует, и Игорю придется отчитываться перед начальством за то, что он не явился на работу. Поворотом считается смена направления движения в пути. В силу своей конструкции автомобиль Игоря может двигаться только влево, вправо, вверх и вниз, изначально Игорь может выбрать любое направление движения. Игорь все еще сонный, поэтому он нуждается в вашей помощи.

Входные данные

На первой строке через пробел даны два числа n и m (1 ≤ n, m ≤ 1000)— количество строк и столбцов поля соответственно.

В каждой из последующих n строк содержится m символов, описывающих соответствующую строку поля. Возможные варианты символов:

  • «.» — свободная клетка;
  • «*» — клетка, в которой проводятся дорожные работы;
  • «S» — клетка, в которой находится дом аналитика Игоря;
  • «T» — клетка, в которой находится офис банка Игоря.

Гарантируется, что символы «S» и «T» встречаются ровно по одному разу.

Выходные данные

Выведите «YES», если существует путь от дома Игоря до его офиса, делающий не более двух поворотов, и «NO» иначе.

Примечание

Первый пример изображен на следующей картинке:

Во втором примере добраться из дома Игоря в его офис меньше чем за 4 поворота нельзя, а значит, не существует пути, использующего не больше 2-х поворотов. Путь из 4-х поворотов показан ниже:

E. Проблемы отделений

Деревья дп Конструктив поиск в глубину и подобное *2900

Раньше, когда не было интернета, у каждого банка было множество отделений по всему городу Банкополису, что вызывало множество проблем. А именно, в каждом отделении нужно было каждый день проводить инкассацию.

Однажды Олег услышал разговор двух инкассаторов одного банка. Они каждый день объезжали все отделения и офисы этого банка, причем двигались они по строго определенной схеме. Инкассаторы выезжали из центрального офиса, и каждый раз перемещались по специальной дороге либо между двумя офисами, либо между каким-то офисом и каким-то отделением, в итоге возвращаясь обратно в центральный офис. Известно, что всего отделений и офисов было было n, а специальных дорог — на одну меньше, то есть n - 1. Иными словами, система специальных дорог образовывала корневое дерево, корнем которого являлся центральный офис, все листья дерева были отделениями, а все внутренние вершины — офисами. Инкассаторы всегда объезжали офисы и отделения по одному и тому же маршруту, число дорог в котором было минимально возможным, то есть 2n - 2.

Один из инкассаторов утверждал, что между посещениями отделения a и отделения b (в таком порядке) они посещают столько же отделений, что и между посещениями отделений b и затем a. Другой инкассатор утверждал, что между посещениями отделения c и отделения d они посещают столько же отделений, что и между посещениями отделений d и затем c. Интересной особенностью разговора было то, что кратчайший путь по специальным дорогам между любой парой отделений из a, b, c и d проходил через центральный офис.

Зная схему дорог и номера отделений a, b, c и d, определите, могла ли происходить ситуация, описанная инкассаторами, или нет.

Входные данные

В первой строке находится одно целое число n (5 ≤ n ≤ 5000) — общее число отделений и офисов. Отделения и офисы пронумерованы от 1 до n, центральный офис имеет номер 1.

На следующей строке находятся четыре различных целых числа a, b, c или d (2 ≤ a, b, c, d ≤ n) — номера отделений, упомянутые в разговоре инкассаторов. Гарантируется, что все эти номера являются отделениями (то есть листьями дерева), а не офисами. Гарантируется, что кратчайший путь между любой парой из этих отделений проходит через центральный офис.

Далее следуют n - 1 чисел p2, p3, ..., pn (1 ≤ pi < i), где pi обозначает, что существует специальная дорога между i-м офисом и pi-м офисом или отделением.

Заметьте, что у отделений и офисов общая нумерация.

Гарантируется, что заданный граф является деревом. Отделениями являются листья этого дерева, а офисами — внутренние вершины.

Выходные данные

Если ситуация, описанная инкассаторами, возможна, выведите «YES». Иначе выведите «NO».

Примечание

В первом примере возможен следующий маршрут инкассаторов . Можно заметить, что между посещениями отделений a и b инкассаторы посещают столько же отделений, сколько между посещениями отделениями b и a; аналогичная ситуация с отделениями c и d (маршрут инкассаторов является бесконечным и периодичным, но порядок посещения офисов и отделений не меняется изо дня в день и всегда строго фиксирован).

Во втором примере не существует такого порядка посещения офисов и отделений, что между посещениями c и d инкассаторы заедут в столько же отделений, что между посещениями d и c, а значит, ответа не существует.

В третьем примере маршрут, удовлетворяющий условию задачи, такой: .

D. Отметки на городах

графы поиск в глубину и подобное хэши *2400

Олег живет в стране Банкополии. В стране n городов, некоторые пары городов соединены двунаправленными дорогами. Города пронумерованы от 1 до n. Всего в Банкополии m дорог, дорога номер i соединяет города ui и vi. Гарантируется. что из любого города можно добраться в любой другой по дорогам.

Олег хочет отметить целым числом каждый город. Предположим. отметка города i равна xi. Тогда для любой пары городов (u, v) условие |xu - xv| ≤ 1 должно выполняться тогда и только тогда, когда есть дорога, соединяющая u и v.

Олег задумался над вопросом, возможно ли так отметить города. Расставьте корректно отметки городам, или найдите, что это невозможно.

Входные данные

Первая строка содержит два целых числа n и m (2 ≤ n ≤ 3·105, 1 ≤ m ≤ 3·105) — число городов и число дорог.

Далее следуют m строк. Строка i содержит два целых числа ui и vi (1 ≤ ui, vi ≤ n, ui ≠ vi) — города. соединяемые i-й дорогой. Гарантируется, что между каждой парой городов есть не более чем одна дорога, и что от каждого города можно добраться до любого другого по дорогам.

Выходные данные

Если невозможно отметить города. удовлетворив условию, выведите в единственной строке «NO» (без кавычек).

Иначе выведите «YES» (без кавычек) в первой строке. Во второй строке выведите n целых чисел x1, x2, ..., xn. Должно выполняться 1 ≤ xi ≤ 109 для всех i, кроме того, для любой пары (u, v) условие |xu - xv| ≤ 1 должно выполняться тогда и только тогда, когда есть дорога, соединяющая u и v.

Примечание

В первом примере x1 = 2, x2 = 3, x3 = x4 = 1 — корректная расстановка отметок. Действительно, (3, 4), (1, 2), (1, 3), (1, 4) — пары городов, разница отметок на которых не превосходит 1, и именно эти пары городов соединяются дорогами Банкополии.

Во втором примере разница отметок между любой парой городов не превосходит 1, все пары городов соединены дорогами.

В последнем примере невозможно расставить отметки так, чтобы удовлетворить условию.

D. Посты полиции

графы Деревья дп Конструктив кратчайшие пути поиск в глубину и подобное *2100

Инзейн наконец-то нашел Зейна, и у них еще много денег! Поэтому они решили создать собственную страну.

Правление страной — непростая задача. Бандиты и террористы постоянно пытаются разрушить покой. Чтобы бороться с этим, Зейн и Инзейн разработали следующее правило: от каждого города должно быть возможно достичь пост полиции, проехав не более d километров по дорогам.

В стране n городов, пронумерованных от 1 до n, соединенных n - 1 дорогами. Все дороги имею длину 1 километр. Возможно добраться от любого города до любого другого, используя эти дороги. Кроме того, есть k постов полиции, расположенных в некоторых городах. Расположение постов полиции удовлетворяет закону, описанному выше. Заметьте, что некоторые посты могут быть расположены в одном и том же городе.

Однако, Зейн считает, что n - 1 дорога это слишком много. Страна испытывает финансовый кризис, поэтому необходимо закрыть как можно больше дорог.

Помогите Зейну определить максимальное число дорог, которое можно закрыть, не нарушая закон. Кроме того, найдите эти дороги.

Входные данные

Первая строка содержит три целых числа n, k и d (2 ≤ n ≤ 3·105, 1 ≤ k ≤ 3·105, 0 ≤ d ≤ n - 1) — число городов, число постов полиции, ограничение на расстояние в законе, соответственно.

Вторая строка содержит k целых чисел p1, p2, ..., pk (1 ≤ pi ≤ n) — города, в которых расположены посты полиции.

i-я из следующих n - 1 строк содержит два целых числа ui и vi (1 ≤ ui, vi ≤ n, ui ≠ vi) — города, непосредственно соединенные дорогой i.

Гарантируется, что возможно добраться от любого города до любого другого, используя эти дороги. Кроме того, от любого города можно добраться до поста полиции, проехав не более d километров.

Выходные данные

В первой строке выведите одно целое число s, означающее максимальное число дорог, которое можно закрыть.

Во второй строке выведите s различных чисел — номера дорог, для которых это верно.

Если ответов несколько, выведите любой из них.

Примечание

Во втором примере, если закрыть дорогу номер 5, то от всех городов по-прежнему можно будет достичь пост полиции, проехав не более k = 4 километров.

Во втором примере, несмотря на то, что множество дорог, которые можно закрыть, единственно, вы можете вывести 4 5 или 5 4 во второй строке.

D. Сломанное BST

поиск в глубину и подобное Структуры данных *2100

Пусть T — произвольное бинарное дерево, т.е. дерево, у каждой вершины которого не больше двух сыновей. Данное дерево является корневым, т.е существует единственная вершина, у которой нет родителя — корень дерева. В вершинах данного дерева записаны целые числа. Каждое число, которое есть в дереве T попытаются найти следующим алгоритмом:

  1. Поставить указатель на корень дерева
  2. Сообщить, что число найдено, если значение, записанное в текущей вершине, равно искомому числу
  3. Перейти в левого сына вершины, если значение, записанное в текущей вершине, больше искомого числа
  4. Перейти в правого сына вершины, если значение, записанное в текущей вершине, меньше искомого числа
  5. Сообщить, что число не найдено, если вершина, в которую надо перейти, не существует

Ниже приведен псевдокод описанного алгоритма:


bool find(TreeNode t, int x) {
if (t == null)
return false;
if (t.value == x)
return true;
if (x < t.value)
return find(t.left, x);
else
return find(t.right, x);
}
find(root, x);

Данный алгоритм работает корректно, если поиск осуществляется в бинарном дереве поиска (то есть таком дереве, где для каждого узла значение в нем больше значений в его левом поддереве и меньше значений в правом поддереве). На произвольном дереве этот алгоритм, разумеется, может вернуть неправильный результат.

Так как заданное дерево не является в общем случае бинарным деревом поиска, то не все числа возможно найти таким способом. Ваша задача — посчитать, сколько раз найти число не удастся, если алгоритм запущен для всех возможных значений, которые содержатся в дереве.

Если в дереве есть несколько вершин с одинаковыми числами на них, то алгоритм следует запустить для каждой из них отдельно.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105) — количество вершин в дереве.

В следующих n строках заданы по 3 числа v, l, r (0 ≤ v ≤ 109) — число, записанное в вершине, индекс левого сына вершины и индекс правого сына вершины, соответственно. Если какого-либо из сыновей не существует, то записано число  - 1. Обратите внимание, что в различных вершинах дерева могут быть записаны одинаковые значения.

Выходные данные

Выведите количество чисел, которые не будут найдены описанным алгоритмом.

Примечание

В первом примере корнем дерева является вершина 2. Поиск чисел 5 и 15 завершится неудачей, так как на первом шаге будут совершены переходы в поддеревья, в которых нет искомых чисел.

J. Отправьте Дурака Дальше! (простая)

графы Деревья поиск в глубину и подобное *1400

Друг Хайди Дженни просит ее доставить важное письмо их общему другу. Поскольку Дженни ирландка, Хайди считает, что это может быть шутка. Точнее, она подозревает, что сообщение, которое она попросила доставить, гласит: «Отправьте дурака дальше!», и, читая его, получатель попросит Хайди передать то же сообщение другому другу (общему для получателя и Хайди), и так далее.

Хайди считает, что ее друзья хотят избежать неловких ситуаций, поэтому она не сможет дважды посетить одного и того же человека (включая Дженни). Она также знает, какова стоимость путешествий между любыми двумя друзьями, которые знают друг друга. Она хочет знать: какова максимальная сумма денег, которую она потратит на путешествие, если это действительно шутка?

У Хайди есть n друзей, пронумерованных от 0 до n - 1, и их дружеские связи образуют дерево. Другими словами, каждые двое из ее друзей a и b знают друг друга, возможно, косвенно (то есть существует последовательность друзей, начинающаяся с a и заканчивающаяся b такая, что каждые два последовательных друга в этой последовательности знают друг друга напрямую). Есть ровно n - 1 пара друзей, которые знают друг друга напрямую.

Дженни имеет номер 0.

Входные данные

В первой строке следует целое число n (3 ≤ n ≤ 100) — количество друзей.

Каждая из следующих n - 1 строк содержит по три разделенных пробелом целых числа u, v и c (0 ≤ u, v ≤ n - 1, 1 ≤ c ≤ 104), что означает, что u и v являются друзьями (знают друг друга напрямую) и стоимость путешествия между u и v равна c.

Гарантируется, что дружеские связи из входных данных формируют дерево.

Выходные данные

Выведите единственное число — максимальная сумма денег, которую Хайди может потратить на путешествия между друзьями.

Примечание

Во втором примере наихудший сценарий выглядит следующим образом: Дженни отправляет Хайди к другу, помеченному номером 2 (Хайди расходует на это 100). Потом друг 2 отправляет Хайди к другу 1 (Хайди тратит на это 3). Затем 1 направляет ее к другу 4 (Хайди расходует на это 2).

L. Отправьте Дурака Дальше! (сложная)

Деревья дп математика поиск в глубину и подобное *2400

Хайди в ужасе от шутки, и она сочла нереальным, что ее друзья будут специально загонять её в долги. Она ожидает, что фактически, каждый человек просто выберет случайного друга, чтобы отправить Хайди. Из этого следует, что теперь Хайди может посещать одного и того же друга произвольное количество раз. Более того, если у человека есть ровно один общий друг с Хайди (то есть он является листом дерева), тогда этот человек не отправит Хайди обратно (то есть путешествие Хайди закончится в некоторой точке).

Хайди также кажется нереальным то, что она сможет совершить свое путешествие за один день. Поэтому теперь она предполагает, что каждый раз, когда она путешествует по маршруту между двумя друзьями, ей нужно покупать новый билет. Она хочет знать математическое ожидание суммы денег, которые она потратит на путешествия.

Полагайте, что у Дженни есть по крайней мере два друга.

Входные данные

В первой строке следует целое число n (3 ≤ n ≤ 105) — количество друзей.

В следующих n - 1 строках следует по три целых числа u, v и c (0 ≤ u, v ≤ n - 1, 1 ≤ c ≤ 104), означающих что u и v являются друзьями и стоимость путешествий между ними равна c (для каждого нового путешествия между ними теперь нужно покупать новый билет).

Гарантируется, что дружеские связи из входных данных формируют дерево.

Выходные данные

Предположим, что ожидаемая стоимость путешествий записывается как несократимая дробь a / b (то есть, a и b являются взаимно простыми). Хайди просит вас вывести величину . То есть, выводимое число должно быть в пределах от 0 до 109 + 6, включительно.

Примечание

В первом примере с вероятностью 1 / 2 Хайди пойдет в 1 из 0, и с вероятностью 1 / 2 она пойдет в 2. В первом случае стоимость будет 10, а во второй она будет 20. Достигнув 1 или 2 она остановится, так 1 и 2 являются листьями дерева. Следовательно, ожидаемые расходы Хайди на путешествия составляют 10·1 / 2 + 20·1 / 2 = 15.

В третьем примере ожидаемая стоимость составляет 81 / 5. Поэтому нужно вывести число 400000019.

В ходе своих путешествий Хайди узнала интригующий факт о структуре своих дружеских связей. Она сообщает вам следующее: Таинственный определитель, о котором вы могли бы подумать, таков, что он не вызывает странных ошибок в вашем разумном решении... Мы упоминали, что Хайди - странная корова?

C. Раскраска мороженого

жадные алгоритмы Конструктив поиск в глубину и подобное *2200

Исарт и Модсарт пытались решить интересную задачу в момент, когда пришел Касра. Задыхаясь, он спросил: «Можете ли вы решить задачу, надо которой я думаю весь день?»

Дано дерево T из n вершин и m типов мороженого, типы пронумерованы от 1 до m. В каждая вершине дерева i есть набор из si типов мороженого. Вершины, в которых есть i-й (1 ≤ i ≤ m) тип мороженого, образуют связный подграф. Построим новый граф G из m вершин. Проведем ребро между вершинами v и u (1 ≤ u, v ≤ m, u ≠ v) в графе G, если и только если существует вершина в T такая, в ней есть и u-й, и v-й типы мороженого. Задача состоит в том, чтобы раскрасить вершины графа G в минимальное количество цветов так, чтобы никакие две соседние вершины не имели одинаковый цвет.

В этой задаче мы считаем, что пустое множество вершин образует связный подграф.

Модсарт не хочет прерывать размышления над предыдущей задачей, поэтому Исарт попросил вас решить эту новую задачу.

Входные данные

Первая строка содержит два целых числа n и m (1 ≤ n, m ≤ 3·105) — количество вершин в T и количество типов мороженого.

Далее следуют n строк, i-я из этих строк содержит сначала целое число si (0 ≤ si ≤ 3·105), а затем si различных целых чисел, каждое в пределах от 1 до m — типа мороженого в i-й вершине. Сумма величин si не превосходит 5·105.

Далее следуют n - 1 строк. Каждая из этих строк описывает очередное ребро дерева двумя целыми числами u и v (1 ≤ u, v ≤ n) — индексами вершин, соединенных этим ребром.

Выходные данные

В первой строке выведите одно целое число c — минимально возможное число цветов для раскраски графа G.

Во второй строке выведите m целых чисел, i-е из них должно быть номером цвета вершины номер i. Цвета должны быть в пределах от 1 до c.

Примечание

В первом примере первый тип мороженого присутствует только в первой вершине дерева, поэтому мы можем покрасить его в любой цвет. Второй и третий типы присутствуют оба во второй вершине, поэтому мы должны покрасить их в разные цвета.

Во втором примере цвета второго, четвертого и пятого типов мороженого обязательно должны быть различны.

D. Матожидание диаметра дерева

Бинарный поиск Деревья дп Перебор поиск в глубину и подобное сортировки *2500

Паша — прилежный студент, один из лучших друзей Моджака. Он всегда размышляет над какой-то задачей. Сегодня они разговаривали о следующей задаче.

Дан лес (ациклический неориентированный граф) из n вершин и m ребер. Также есть q запросов, на которые необходимо ответить. В каждом запросе даны две вершины v и u. Пусть V — множество вершин в компоненте связности, к которой принадлежит v, а U — множество вершин в компоненте связности, к которой принадлежит u. Добавим ребро между некоторой вершиной и некоторой вершиной и вычислим величину d получившейся компоненты. Если получившаяся компонента — дерево, то величина d равна диаметру компоненты, иначе она равна -1. Найдите математическое ожидание величины d, если вершины a и b выбираются из множеств равновероятно случайным образом.

Можете помочь Паше решить эту задачу?

Диаметром компоненты называется максимальное расстояние между парой вершин в компоненте. Расстоянием между двумя вершинами называется минимальное число ребер на пути между ними.

Заметьте, что запросы не добавляют ребер в изначальный лес.

Входные данные

Первая строка содержит три целых числа n, m и q (1 ≤ n, m, q ≤ 105) — количество вершин и ребер в графе и количество запросов.

Каждая из следующих m строк содержит два целых числа ui и vi (1 ≤ ui, vi ≤ n), что значит, что есть ребро между вершинами ui и vi.

Гарантируется, что заданный граф — лес.

Каждая из следующих q строк содержит два целых числа ui и vi (1 ≤ ui, vi ≤ n) — вершины, участвующие в i-м запросе.

Выходные данные

Для каждого запроса выведите математическое ожидание величины d в соответствии с условием задачи.

Ваш ответ будет засчитан, если его абсолютная или относительная ошибка не превосходит10 - 6. Формально, пусть ваш ответ равен a, а ответ жюри равен b. Ваш ответ будет засчитан, если .

Примечание

В первом примере вершины 1 и 3 лежат в одной компоненте, поэтому ответ на первый запрос равен -1. Во втором запросе есть два исхода: добавить ребро 1 - 2, или добавить ребро 2 - 3. В обоих случаях диаметр равен 2, поэтому ответ равен 2.

Во втором примере ответ на первый запрос равен -1. Ответ на второй запрос — среднее по трем случаям: Если добавлены ребра 1 - 2 или 1 - 3, то диаметр будет равен 3, а если добавлено ребро 1 - 4, то диаметр равен 2. Поэтому ответ равен .

F. Фальшивые слитки

графы дп Комбинаторика поиск в глубину и подобное теория чисел *3400

В Исарте люди живут вечно. Среди них есть n банд злоумышленников. В i-й банде состоят si человек, пронумерованных от 0 до si - 1. Некоторые из них однажды приняли участие в большом ограблении шахты и украли каждый по одному золотому слитку (эти люди заданы во входных данных). Это произошло 10100 лет назад и с тех пор все банды уехали далеко от городов.

Все эти годы бандиты копировали некоторые золотые слитки в соответствии с определенным планом, чтобы не быть пойманными. Они построили ориентированный граф-турнир (то есть граф, в котором между каждой парой вершин есть одно направленное ребро), вершины в котором — банды (граф задан во входных данных). В этом графе ребро из вершины u в вершину v означало, что в i-й час человек номер из банды u может послать фальшивый слиток человеку номер из банды v. Он посылает слиток, только если у него есть какой-то слиток (настоящий или фальшивый), а у получателя нет слитков. Таким образом, в каждый момент времени каждый бандит имел один или ноль слитков. Некоторые из бандитов имели настоящие слитки, некоторые — фальшивые.

В начале этого года полиции удалось найти банды, но, как всегда, поймать их она пока не может. Полиция решила открыть ювелирный магазин, чтобы бандиты попытались продать слитки. Теперь каждый бандит, у которого есть слиток (подлинный или фальшивый), попробует его продать. Если слиток подлинный, то он его без проблем продаст, а если фальшивый, то может случиться одна из двух ситуаций:

  • Бандит успешно продаст слиток.
  • Бандит будет арестован полицией.

Сила банды равна числу бандитов, которые успешно продали свой слиток. После того, как все продажи завершены, полиция арестует b банд из самых сильных. Банда с силой p состоит в самых сильных бандах, если и только если не более чем a - 1 банда имеет силу строго больше p. Рассмотрим всевозможные результаты продажи фальшивых слитков и всевозможные способы выбрать b банд из самых сильных банд. Подсчитайте, сколько различных множеств могут образовать эти b банд по модулю 109 + 7. Два множества X и Y считаются различными, если некоторая банда есть в X, но ее нет в Y.

Входные данные

Первая строка содержит три целых числа n, a и b (1 ≤ b ≤ a ≤ n ≤ 5·103) — количество банд и числа a и b из условия.

Далее следуют n строк, каждая из них содержит строку длины n из нулей и единиц. Если j-й символ i-й строки равен 1, то из вершины i в вершину j есть ребро. Гарантируется, что aii = 0, и aij + aji = 1 при i ≠ j.

Далее следуют n строк, каждая начинается с числа si (1 ≤ si ≤ 2·106) — количеству бандитов в i-й банде, и затем содержит строку из нулей и единиц длины si. j-й символ равен 0, если j-й человек i-й банды имел настоящий слиток изначально, иначе символ равен 1. Гарантируется, что сумма si не превосходит 2·106.

Выходные данные

Выведите одно число: количество различных множеств из b банд, которые полиция может арестовать по модулю 109 + 7.

E. По парам

графы Деревья дп поиск в глубину и подобное реализация снм *2700

В классе у Поликарпа учится n человек (включая его самого). Недавно все ученики класса писали сочинение «Мой лучший друг». Сочинение каждого ученика было посвящено одному из учеников класса — лучшему другу. Заметим, что вовсе не обязательно у ученика b лучшим другом является ученик a, если у a лучший друг — b.

А сейчас учительница ведет весь класс в музей истории спортивного программирования. Учеников ждут захватывающие истории о легендарных героях: tourist, Petr, tomek, SnapDragon — вот о ком пойдет речь!

Учительница решила разбить учеников на пары так, чтобы каждая пара состояла из ученика и его лучшего друга. Возможно, ей не удастся разбить всех учеников на пары, не беда — она хочет выделить наибольшее количество таких пар. Если существует более одного варианта сделать это, она хочет выделить пары так, чтобы пар мальчик-девочка было как можно больше. Конечно, каждый ученик должен входить не более чем в одну пару.

Входные данные

Первая строка содержит целое число n (2 ≤ n ≤ 105), n — количество учеников в классе. Далее в n строках содержится информация об учениках, по одному в строке. Каждая строка содержит два целых числа fi, si (1 ≤ fi ≤ n, fi ≠ i, 1 ≤ si ≤ 2), где fi обозначает номер лучшего друга i-го ученика, а si обозначает пол i-го ученика (если мальчик, то si = 1, а если девочка, то si = 2).

Выходные данные

В первую строку выведите два числа t, e, где t — максимальное количество образованных пар, а e — максимальное количество среди них пар вида мальчик-девочка. Далее выведите t строк, каждая из строк должна содержать пару ai, bi (1 ≤ ai, bi ≤ n) — номера учеников в i-ой паре. Пары выводите в любом порядке. Числа в парах выводите в любом порядке. Если существует несколько решений, выведите любое.

Примечание

Рисунок ниже соответствует первому примеру. На нем ромбы обозначают мальчиков, а квадраты — девочек. Стрелки ведут от ученика к его лучшему другу, жирные (не пунктирные) обозначают пары из ответа.

D. Владик и любимая игра

графы интерактив Конструктив поиск в глубину и подобное *2100

Это интерактивная задача.

У Владика есть любимая игра, в которую он играет практически все свободное время.

Игровое поле представляет из себя матрицу n × m, клетки которого бывают трех типов:

  • «.» — обычная, игрок может свободно в ней находиться.
  • «F» — конечная, клетка до которой должен добраться игрок. Такая клетка будет ровно одна.
  • «*» — смертельная, оказавшись в ней игрок проиграет.

Изначально игрок находится в левой верхней клетке с координатами (1, 1).

Игроку доступны 4 кнопки «U», «D», «L», «R», каждая из которых перемещает его в направлениях вверх, вниз, влево, вправо соответственно.

Но не все так просто! Друзья иногда играют в игру и меняют управление, поменять между собой можно кнопки «L» и «R», а также «U» и «D». То есть кнопка «L» может выполнять операцию кнопки «R», в таком случае кнопка «R» будет выполнять операцию кнопки «L». Операции, за которые отвечают «U» и «D», обмениваются таким же образом. Обратите внимание, что направления могут поменяться только в начале игры.

Помогите Владику пройти игру!

Входные данные

На первой строке через пробел задано два числа n и m (1 ≤ n, m ≤ 100) — количество строк и столбцов поля соответственно.

В каждой из последующих n строк содержится m символов, описывающих соответствующую строку поля. Возможные варианты символов описаны в условии задачи.

Гарантируется, что клетка с координатами (1, 1) будет обычной, а также существует путь из начальной клетки до конечной не содержащий смертельных клеток.

Протокол взаимодействия

Вы можете сделать не более n·m нажатий на кнопку.

Для нажатия на кнопку вы должны в отдельной строке вывести «U», «D», «L», «R». Обязательно требуется вывести перевод строки и сделать операцию flush. После сброса буфера необходимо считать ответ на запрос из входных данных. Ответом будет являться пара целых чисел x, y, записанных через пробел, — новая позиция игрока. В случае, когда не существует клетки по направлению, за которое отвечает нажатая кнопка, позиция игрока не поменяется. Если после очередного хода игрок проиграет, то есть перейдет в смертельную клетку, x и y будут равны  - 1.

Если в результате очередного хода игрок окажется в конечной клетке либо проиграет, вы должны будете завершить работу программы.

Для сброса буфера вывода (то есть для операции flush) сразу после вывода направления и перевода строки можно сделать:

  • fflush(stdout) в языке C++
  • System.out.flush() в Java
  • stdout.flush() в Python
  • flush(output) в Pascal
  • смотрите документацию для других языков

Взломы

Чтобы совершить взлом, вам потребуется использовать следующий формат:


n m swapLR swapUD
a_1
a_2
...
a_n

Где n, m – количество строк и столбцов у игрового поля. swapLR равно 1, в случае, когда направления «L» и «R» поменялись местами и 0 в обратном случае. swapUD равно 1, в случае, когда направления «U» и «D» поменялись местами и 0 в обратном случае. a1, a2, ..., an — описание соответствующих строк игрового поля.

Примечание

В первом тестовом примере все четыре направления обменялись местами со своими обратными. Протокол взаимодействия в более удобном формате:

Этот тест можно было бы представить во время взлома следующим образом:


4 3 1 1
...
**.
F*.
...

D. Сахир и детский сад

графы Деревья поиск в глубину и подобное реализация *2700

Сахир работает в детском саду. Всего в саду n детей и m различных игрушек. Чтобы поиграть с игрушками, дети должны следовать определенному протоколу:

  • У каждого ребенка есть набор любимых игрушек. Он запрашивает эти игрушки по одной в различные моменты времени. Ребенок начинает играть, только когда у него окажутся все игрушки из любимого набора.
  • Если ребенок начал играть, то рано или поздно он отдаст все игрушки обратно. Никто не будет держать игрушки вечно.
  • Дети запрашивают игрушки в различные моменты времени, никакие два ребенка не запрашивают игрушки одновременно.
  • Если ребенку дали запрашиваемую игрушку, то он не отдаст ее, пока не закончит играть со своим любимым набором.
  • Если ребенку не дали запрашиваемую игрушку, то он будет ждать, пока ее ему дадут. Он не может запросить другую игрушку, пока ждет. То есть, каждый ребенок в каждый момент времени ждет не более одной игрушки.
  • Если два ребенка ждут одну и ту же игрушку, то сначала ее получит тот, кто запросил ее раньше.

Дети не любят играть друг с другом, поэтому они никогда не делятся игрушками. Когда ребенок запрашивает игрушку, то решение дать ему ее или нет зависит от того, свободна игрушка, или нет. Если игрушка свободна, Сахир даст ее ребенку. Иначе ребенок будет ждать ее и не сможет запрашивать другие игрушки, пока ждет.

Дети умные и замечают, если случилось так, что им придется ждать запрошенных игрушек бесконечно долго. В таких случаях они начинают плакать. Другими словами, группа плачущих детей это такая группа детей, в которой каждый ребенок ждет игрушку, которая находится у кого-то другого из этой группы.

У вас есть сценарий, в котором все дети запрашивают все игрушки из их любимых наборов, кроме одного ребенка x, который запросит еще одну игрушку. Сценарий таков, что после выполнения запросов из сценария некоторые дети начнут играть, а некоторые будут ждать последнюю игрушку, но никто не будет плакать. Если ребенок x будет ждать какую-то игрушку, то он сделает свой оставшийся запрос после ее получения. Иначе, он сразу же запросит ее. Когда ребенок x это сделает, сколько детей начнут плакать?

Вам дан сценарий и q независимых запросов. Каждый запрос будет иметь форму x y, что означает, что оставшийся запрос ребенка x — это игрушка y. Ваша задача — помочь Сахиру определить размер максимальной плачущей группы детей после того, как ребенок x сделает свой последний запрос.

Входные данные

Первая строка содержит четыре целых числа n, m, k, q (1 ≤ n, m, k, q ≤ 105) — количество детей, игрушек, запросов детей в сценарии и вариантов последнего запроса.

Каждая из следующих k строк содержит по два целых числа a, b (1 ≤ a ≤ n, 1 ≤ b ≤ m), означающих, что в сценарии ребенок a запрашивает игрушку b. Запросы даны в порядке их появления.

Каждая из следующих q строк содержит по два целых числа x и y (1 ≤ x ≤ n, 1 ≤ y ≤ m) — варианты последнего запроса (ребенок x запросит игрушку y как только сможет).

Гарантируется, что все запросы в сценарии удовлетворяют протоколу, и никто не плачет после выполнения запросов из сценария. Все запросы в сценарии различны, и никакой вариант последнего запроса не совпадает с запросами в сценарии.

Выходные данные

Для каждого запроса выведите на отдельной строке число детей, которые начнут плакать после того, как ребенок x сделает свой последний запрос (игрушку y). Заметьте, что все варианты последнего запроса независимы.

Примечание

В первом примере ребенок 1 ждет игрушку 2, которая находится у ребенка 2, а ребенок 2 ждет игрушку 3, которая находится у ребенка 3. Когда ребенок 3 сделает свой последний запрос (он может сделать это сразу), то игрушка, которую он запросит, будет у ребенка 1. Каждый из трех детей будет ждать игрушку, которая находится у другого ребенка, и никто не будет играть, поэтому все трое начнут плакать.

Во втором примере после исполнения сценария у ребенка номер i будет находиться игрушка i для 1 ≤ i ≤ 4. Дети 1 и 3 уже собрали свой любимый набор. После того, как они закончат играть, игрушка 3 освободится, а игрушку 1 отдадут ребенку 2, и он соберет любимый набор. После того, как он закончит играть, игрушки 1 и 2 освободятся, и ребенок 5 возьмет игрушку 1. Итак:

  • В первом варианте ребенок 5 возьмет игрушку 3, и когда он закончит играть, сможет играть ребенок 4.
  • Во втором варианте ребенок 5 запросит игрушку 4, которая находится у ребенка 4. В то же время ребенок 4 ждет игрушку 1, которая сейчас находится у ребенка 5. Никто из них не сможет начать играть, и они оба заплачут.

C. Догонялки

графы поиск в глубину и подобное *1700

Алисе надоели обычные правила игры в догонялки, и она предложила Бобу немного их изменить. Теперь игра происходит на неориентированном корневом дереве из n вершин. Вершина 1 является корнем дерева.

Алиса начинает в вершине 1, а Боб — в вершине x (x ≠ 1). Ходы совершаются по очереди, Боб начинает. За один ход игрок может либо остаться в текущей вершине, либо перейти в соседнюю.

Игра завершается, когда Алиса приходит в вершину, в которой находится Боб. Алиса хочет минимизировать общее количество ходов, Боб хочет максимизировать.

Напишите программу, которая определит, сколько ходов продлится игра.

Входные данные

В первой строке записано два целых числа n и x (2 ≤ n ≤ 2·105, 2 ≤ x ≤ n).

В каждой из следующих n - 1 строк записано по два целых числа a и b (1 ≤ a, b ≤ n) — ребра дерева. Гарантируется, что ребра составляют корректное дерево.

Выходные данные

Выведите общее количество ходов, которые будут совершены Алисой и Бобом.

Примечание

В первом примере дерево выглядит так:

Красная вершина — начальная позиция Алисы, синяя — Боба. Боб обеспечит самую долгую игру, если будет оставаться в вершине 3.

B: стоит в вершине 3

A: идет в вершину 2

B: стоит в вершине 3

A: идет в вершину 3

Во втором примере дерево выглядит так:

Ходы в оптимальной стратегии:

B: идет в вершину 3

A: идет в вершину 2

B: идет в вершину 4

A: идет в вершину 3

B: стоит в вершине 4

A: идет в вершину 4

D. Ночные танцы на дискотеке

геометрия Деревья дп жадные алгоритмы поиск в глубину и подобное *2000

Теснота на дискотеке никогда не помешает веселиться нашим друзьям, но побольше места не помешает, не правда ли?

Дискотека может быть представлена как бесконечная плоскость xy, на которой находятся n танцоров. Как только кто-то начинает двигаться, он будет перемещаться только в своей зоне движения, которая представляет из себя круг Ci с центром в (xi, yi) и радиусом ri. Никакие две границы зон не имеют более, чем одну общую точку, то есть для каждой пары (i, j) (1 ≤ i < j ≤ n) либо зоны Ci и Cj не пересекаются, либо одна лежит полностью в другой. Заметьте, что возможно такое, что две границы зон имеют ровно одну общую точку, однако, никакие два танцора не имеют совпадающие зоны.

Цукихи, один из танцоров, определяет просторность как площадь, покрытая нечетным числом зон движений танцоров. Пример показан на рисунке ниже, затемненные регионы определяют просторность, если все танцуют одновременно.

К счастью, никто не танцует всю ночь, поэтому ночь разделена на две части: до полуночи и после полуночи. Каждый танцор одну половину времени танцует, а другую — сидит с друзьями, не занимая площади. Просторность каждой половины времени вычисляется отдельно, и танцоры хотят, чтобы их сумма была максимально возможна. Следующий рисунок показывает оптимальное разделение примера выше.

Возможны различные варианты разделить танцоров на две части: кто танцует в первой половине, а кто — во второй, которые ведут к различным суммам просторности в двух половинах. Вам предстоит определить максимально возможное значение этой суммы.

Входные данные

Первая строка содержит целое чило n (1 ≤ n ≤ 1 000) — количество танцоров.

Следующие n строк описывают танцоров: в i-й строке находятся три целых числа xi, yi и ri ( - 106 ≤ xi, yi ≤ 106, 1 ≤ ri ≤ 106), описывающих зону движения в виде круга с центром в (xi, yi), радиусом ri.

Выходные данные

Выведите одно число — максимально возможную сумму просторностей двух половин ночи.

Ответ будет считаться верным, если его относительная или абсолютная ошибка не превосходит 10 - 9. Иными словами, пусть ваш ответ равен a, а ответ жюри равен b. Тогда ваш ответ будет зачтен, если .

Примечание

Первый пример соответствует рисунку из условия.

C. Всеобщая мобилизация

поиск в глубину и подобное сортировки Структуры данных *2000

Королевство Берляндия представляет собой множество из n городов, связанных n - 1 железнодорожными путями. Каждый путь соединяет ровно два различных города. Столица находится в городе номер 1. Из каждого города существует способ доехать по железной дороге до столицы.

В i-ом городе стоит дивизия солдат номер i, каждая дивизия характеризуется числом ai, означающим приоритет; чем меньше это число, тем выше приоритет у этой дивизии. Все значения ai — различны.

Однажды Король Берляндии Берл Великий объявил всеобщую мобилизацию, и для этого каждая дивизия должна прибыть в столицу. Каждый день из каждого города, кроме столицы, по каждому железнодорожному пути отходит поезд, который имеет некоторую конечную вместимость cj, выражаемую в максимальном количестве дивизий, которое этот поезд может увезти за один раз. Каждый поезд двигается по направлению сокращения расстояния до столицы. Поезд заканчивает свой путь на противоположном конце железнодорожного пути на следующий день. Таким образом, каждый поезд проезжает из города в соседний (в которой и заканчивает свой путь) по направлению к столице.

В первую очередь из числа дивизий, находящихся в городе, на поезд садятся дивизии с наименьшим числом ai, потом со следующим по величине и так далее, пока либо поезд не будет заполнен, либо пока все дивизии не будут погружены. Таким образом, некоторые дивизии могут оставаться в городе в ожидании поезда несколько дней.

Длительность путешествия поезда из одного города в другой всегда равно 1 дню. Все дивизии начинают свое передвижение одновременно и заканчивают в столице, откуда больше никуда не перемещаются. Каждая дивизия передвигается по простому пути из своего города в столицу, независимо от того, сколько времени займет это путешествие.

Ваша задача — найти для каждой дивизии, через сколько дней она прибудет в столицу Берляндии. Отсчет времени начинается с дня номер 0.

Входные данные

Первая строка содержит единственное число целое n (1 ≤ n ≤ 5000) — количество городов в Берляндии. Вторая строка содержит n целых разделенных пробелом чисел a1, a2, ..., an, где ai означает приоритет дивизии, находящейся в городе номер i. Все числа a1, a2, ..., an различны (1 ≤ ai ≤ 109). Далее в n - 1 строках даны описания железнодорожных путей тройками целых чисел vj, uj, cj, где vj, uj — номера городов, соединяемых j-ым железнодорожным путем, а cj означает максимальную вместимость поезда, курсирующего по этому пути (1 ≤ vj, uj ≤ n, vj ≠ uj, 1 ≤ cj ≤ n).

Выходные данные

Выведите последовательность t1, t2, ..., tn, где ti означает количество дней, через которое дивизия из города i прибудет в столицу. Числа разделяйте пробелами.

D. Окабэ и город

графы кратчайшие пути поиск в глубину и подобное *2200

Окабэ любит гулять по городу в освещенных лампами местах. Так ему удается избежать нападения школьников.

Город Окабэ представлен как таблица, строки пронумерованы от 1 до n сверху вниз, столбцы пронумерованы от 1 до m слева направо. Ровно k клеток города освещены лампами. Гарантируется, что левая верхняя клетка освещена.

Окабэ начинает свой путь из верхней левой клетки и хочет попасть в правую нижнюю. Конечно, Окабэ будет ходить только по освещенным клеткам, и может перемещаться из клетки только в соседнюю сверху, снизу, слева или справа. Однако, Окабэ может временно подсветить все клетки в одном столбце или строке, если он заплатит 1 монету, что позволит ему проходить по некоторым клеткам, не подсвеченным изначально.

Заметьте, что Окабэ может подсветить только один столбец или одну строку одновременно, и должен заплатить монету каждый раз, когда подсвечивает новый столбец или строку. Чтобы изменить строку или столбец, подсвеченный временно, он должен стоять в клетке, которая подсвечена изначально. Кроме того, как только он убирает временную подсветку со строки или столбца, все клетки этой строки/столбца, не подсвеченные изначально, перестают быть освещены.

Помогите Окабэ найти минимальное число монет, которое он должен заплатить, чтобы достичь своей цели!

Входные данные

Первая строка содержит три целых числа n, m и k (2 ≤ n, m, k ≤ 104).

Каждая из следующих k строк содержит два целых числа ri и ci (1 ≤ ri ≤ n, 1 ≤ ci ≤ m) — строку и столбец, в которых находится i-я подсвеченная клетка.

Гарантируются, что все k подсвеченных клеток различны. Гарантируется, что верхняя левая клетка подсвечена.

Выходные данные

Выведите минимальное число монет, которое должен заплатить Окабэ, чтобы достичь правой нижней клетки, или -1, если это невозможно.

Примечание

В первом примере Окабэ может пройти по пути , заплатив только перед перемещениями в (2, 3) и (4, 4).

В четвертом примере Окабэ может пройти по пути , заплатив перед переходами в (1, 2), (3, 4) и (5, 4).

F. Безумие

Деревья Конструктив поиск в глубину и подобное *2500

В университете Павлополиса начинается второй семестр. После отдыха в Вичкополисе Нура вынуждена вернуться в Павлополис и продолжить обучение.

Иногда (или достаточно часто) встречаются преподаватели, которым вы не нравитесь. Вот и у Нуры есть такой. Зовут его Юрий Дмитриевич и он преподает теорию графов. Нура совсем не нравится Юрию Дмитриевичу, поэтому он всегда даёт девушке самые сложные задания. Так случилось и на этот раз.

Преподаватель даёт Нуре дерево из n вершин. Вершины пронумерованы целыми числами от 1 до n. Длины всех ребер этого дерева равны 1. Нура выбирает некоторое множество простых путей, которые попарно не пересекаются по ребрам. При этом каждая вершина должна принадлежать хотя бы одному из выбранных путей.

Для каждого из выбранных путей выполняется следующее:

  1. Выбирается ровно одно ребро (u, v), которое принадлежит пути.
  2. На выбранном ребре (u, v) отмечается точка на некотором выбранном расстоянии x от вершины u и расстоянии 1 - x от вершины v. При этом расстояние x выбирается Нурой произвольно, то есть может быть различным для разных ребер.
  3. Выбирается одна из вершин u или v — именно к выбранной вершине точка начнет свое движение.

Поясним, как происходит движение точки на примере. Пусть путь состоит из двух ребер (v1, v2) и (v2, v3), точка изначально стоит на ребре (v1, v2) и начнет свое движение к вершине v1. Достигнет v1, затем «развернётся», так как был достигнут конец пути, начнет движение к v2, оттуда к v3, там снова «развернётся», переместится к v2 и так далее. При этом скорость движения точек равна 1 ребро в секунду. Например, за 0.5 секунды точка перемещается на длину половины ребра.

В каждую вершину дерева помещается секундомер. Время, которое показывают секундомеры в начальный момент времени, равно 0 секунд. Затем в начальный момент времени все точки одновременно начинают движения с выбранных позиций в выбранные направления по выбранным путям, а секундомеры одновременно запускаются. Когда какая-то из точек достигает вершины v, секундомер в вершине v автоматически обнуляется, то есть начинает считать время с нуля.

Обозначим за resv — максимальное время, которое покажет секундомер в вершине v, если процесс движения точек будет продолжаться бесконечно. Нуру просят выбрать пути и точки на них так, чтобы res1 было минимально возможным. Если вариантов сделать это несколько, необходимо минимизировать res2, затем res3, res4, ..., resn.

Помогите Нуре выполнить задание преподавателя.

Для лучшего понимания условия задачи смотрите пояснение к примерам.

Входные данные

В первой строке строке задано одно целое число n (2 ≤ n ≤ 100) — количество вершин в заданном преподавателем дереве.

В последующих n - 1 строках заданы по два целых числа u и v (1 ≤ u, v ≤ n, u ≠ v) — вершины, связанные очередным ребром дерева.

Гарантируется, что входные данные задают корректное дерево.

Выходные данные

В первой строке выведите одно целое число paths — количество путей, которые вы хотите выбрать.

В последующих paths строках выведите описания путей:

  1. Одно целое число len — количество ребер в текущем пути.
  2. len целых чисел — номера ребер, входящих в текущий путь. Ребра нумеруются от 1 до n - 1 в том порядке, в котором они следуют во входном файле.
  3. Два целых числа u и v — это будет означать, что вы поставили точку на ребро между вершинами u и v (очевидно, что оно должно принадлежать пути) и точка начнет движение по направлению к вершине v. Обратите внимание, что важен порядок, в котором вы выведите эти два числа. Например, если вы выведите «1 2» (без кавычек), то точка начнет движение по направлению к вершине с номером 2; если же вывести «2 1» (без кавычек), то точка начнет движение по направлению к вершине с номером 1.
  4. Одно вещественное число x (0 ≤ x ≤ 1) — расстояние между точкой и вершиной u (той самой, номер которой вы вывели первым в пункте 3).
Система оценки

Система проверки сгенерирует массив res по выходным данным, предоставленным участником. Кроме того, система проверки сгенерирует массив resOptimal по ответу жюри. Ваше решение будет считаться корректным, если для каждого целого i (1 ≤ i ≤ n) .

Примечание

Рассмотрим пример.

В начальный момент времени точки расположены следующим образом:

Красным выделен первый путь, синим — второй, зеленые круги обозначают выбранные точки, а коричневые числа внутри вершин — текущее значение секундомера. Фиолетовые стрелочки показывают направление, куда будет двигаться точка.

Через 0.(3) секунд точки будут расположены следующим образом (до обнуления секундомеров):

После обнуления секундомеров:

Через 1.0 секунду после начала движения:

Через 1.(3) секунд после начала движения (после обнуления секундомеров):

Наконец, через 2 секунды после начала движения точки вернутся на исходные позиции:

Такой процесс движения будет продолжаться бесконечно.

E. Минимальные метки

графы жадные алгоритмы поиск в глубину и подобное Структуры данных *2300

Задан ориентированный ацикличный граф из n вершин и m ребер. В нем нет петель и кратных ребер. Граф может быть несвязным.

Необходимо так расставить метки на вершинах, чтобы:

  • Метки образовывали корректную перестановку длины n. Это последовательность целых чисел, такая, что каждое число от 1 до n встречается в ней ровно один раз.
  • Если существует ребро от вершины v к вершине u, то labelv должно быть меньше labelu.
  • Перестановка должна быть лексикографически наименьшей среди всех подходящих.

Найдите последовательность, подходящую под все условия.

Входные данные

В первой строке записаны два целых числа n, m (2 ≤ n ≤ 105, 1 ≤ m ≤ 105).

В следующих m строках записаны по два целых числа v и u (1 ≤ v, u ≤ n, v ≠ u) — ребра в графе. Ребра ориентированы, граф не содержит циклов и кратных ребер.

Выходные данные

Выведите n чисел — лексикографически наименьшую корректную перестановку меток вершин.

G. Запросы на дереве

графы Деревья поиск в глубину и подобное *2500

Дано дерево из n вершин (пронумерованных от 1 до n). Изначально все вершины белого цвета. Необходимо обработать q запросов двух типов:

  1. 1 x — покрасить вершину x в чёрный цвет. Гарантируется, что первый запрос будет такого типа.
  2. 2 x — для вершины x найти минимальный индекс y, такой, что вершина с индексом y принадлежит простому пути от x до некоторой чёрной вершины (простой путь — такой путь, который проходит через каждую вершину не более одного раза).

Выведите ответ на каждый запрос типа 2.

Обратите внимание, что запросы задаются в модифицированном виде.

Входные данные

В первой строке записаны два числа n и q (3 ≤ n, q ≤ 106).

Затем следуют n - 1 строк, в каждой строке записаны два числа xi и yi (1 ≤ xi < yi ≤ n), обозначающие ребро между xi и yi.

Гарантируется, что эти рёбра образуют дерево.

Затем следуют q строк. Каждая строка содержит два целых числа ti и zi, где ti — тип i-го запроса, а zi используется для восстановления xi для этого запроса следующим образом: нужно хранить ответ на последний запрос типа 2 (назовём этот ответ last, изначально last = 0); тогда xi = (zi + last) modn + 1.

Гарантируется, что первый запрос типа 1, и существует хотя бы один запрос типа 2.

Выходные данные

Выведите ответ на каждый запрос типа 2.

D. Лучший вес для ребра

графы Деревья поиск в глубину и подобное Структуры данных *2700

Дан связный неориентированный взвешенный граф с n вершинами и m ребрами. Граф не содержит петель и мультиребер. Рассмотрим некоторое ребро с номером i. Для него определим наибольший возможный вес, который можно присвоить этому ребру, чтобы оно содержалось во всех минимальный покрывающих деревьях данного графа.

Требуется для каждого ребра посчитать максимальный вес по описанным правилам. При этом для каждого ребра ответ должен считаться независимо, то есть в графе может существовать максимум одно ребро с измененным весом.

Входные данные

В первой строке даны через пробел два целых положительных числа n и m (2 ≤ n ≤ 2·105, n - 1 ≤ m ≤ 2·105), где n и m — количество вершин и ребер графа соответственно.

В следующих m строках даны по три числа u, v и c (1 ≤ v, u ≤ n, v ≠ u, 1 ≤ c ≤ 109), означающие, что между вершинами u и v есть ребро с весом c.

Выходные данные

В единственной строке выведите через пробел искомые веса ребер в том порядке, в котором они заданы во входных данных. Если ребро при любом весе будет содержаться во всех покрывающих деревьях, выведите для него -1.

D. Миша, Гриша и метро

графы Деревья поиск в глубину и подобное *1900

Миша и Гриша — веселые ребята, поэтому они любят кататься на новом метро. В метро есть n станций, соединенных n - 1 перегонами так, что каждый перегон соединяет две станции, и от каждой станции до любой другой можно добраться по перегонам.

Ребята решили повеселиться и затеяли кое-что. А именно, в какой-нибудь день утром Миша проезжает кратчайшим путем от станции s до станции f, и на каждой из станций, мимо которых он проехал (включая s и f), он рисует баллончиком корявую надпись «Здесь был Миша». После чего вечером того же дня, Гриша едет со станции t до станции f кратчайшим путем и считает количество станций, на которых обнаружит надпись Миши. После этого ночью этого же дня работники метро смывают все эти надписи, потому что метро должно быть чистым.

Ребята уже выбрали на несколько дней вперед по три станции a, b и c, одна из которых должна стать станцией s, другая — станцией f, а третья — станцией t в каждый из дней. Им стало интересно, как нужно выбрать из этих трех станций s, f, t так, чтобы число, которое насчитает Гриша, было максимально возможным. Они просят вас помочь им.

Входные данные

Первая строка содержит два целых числа n и q (2 ≤ n ≤ 105, 1 ≤ q ≤ 105) — количество станций и на сколько дней вперед ребята выбрали станции.

Вторая строка содержит n - 1 целое число p2, p3, ..., pn (1 ≤ pi ≤ n). Число pi означает, что есть перегон между станциями pi и i. Гарантируется, что от каждой станции можно добраться до любой другой.

В следующих q строках находятся по три целых числа a, b и c (1 ≤ a, b, c ≤ n) — номера станций, которые выбрали ребята на очередной день. Обратите внимание, номера этих станций могут совпадать друг с другом.

Выходные данные

Выведите q строк. В i-й строке выведите максимальное число, которое может насчитать Гриша при оптимальном выборе s, t и f из трех станций в i-й день.

Примечание

В первом примере в первый день при s = 1, f = 2, t = 3, Миша поедет по маршруту 1 2, а Гриша по маршруту 3 1 2. Он увидит надпись на станциях 1 и 2. Во второй день при s = 3, f = 2, t = 3, оба мальчика едут по маршруту 3 1 2. Гриша видит надпись на 3 станциях.

Во втором примере при s = 1, f = 3, t = 2, Миша поедет по маршруту 1 2 3, а Гриша по маршруту 2 3 и увидит надпись на обеих станциях.

F. Дороги в королевстве

графы Деревья дп поиск в глубину и подобное *2500

В королестве К. есть n городов, занумерованных целыми числами от 1 до n. Города соединены n двусторонними дорогами, занумерованными целыми числами от 1 до n. i-я дорога соединяет города ui и vi и имеет длину li. Между двумя городами не бывает более одной дороги. Также не бывает дорог, которые соединяют город с самим собой.

Назовём неудобством дорог максимальное из кратчайших расстояний между всеми парами городов.

В связи с нехваткой денег было решено отказаться от одной из дорог, при этом после её удаления все города должны быть достижимы друг из друга. Вам необходимо узнать, какое минимальное неудобство дорог можно получить после отказа от одной из дорог.

Входные данные

Первая строка содержит целое число n (3 ≤ n ≤ 2·105) — количество городов и дорог.

Следующие n строк содержат описания дорог. i-я из этих строк содержит три целых числа ui, vi, li (1 ≤ ui, vi ≤ n, 1 ≤ li ≤ 109) — номера городов, которые соединяет i-я дорога, и длина i-й дороги. Никакая дорога не соединяет город сам с собой, никакие две дороги не соединяют одну и ту же пару городов.

Гарантируется, что всегда можно отказаться от одной из дорог так, чтобы все города были достижимы друг из друга.

Выходные данные

Выведите одно целое число — минимально возможное неудобство дорог после отказа от одной из дорог.

B. Расходящиеся направления

Деревья поиск в глубину и подобное Структуры данных *2100

Вам дан ориентированный взвешенный граф из n вершин и 2n - 2 ребер. Вершины пронумерованы от 1 до n, а ребра пронумерованы от 1 до 2n - 2. Ребра графа могут быть разделены на две группы.

  • Первые n - 1 ребер образуют корневое основное дерево, вершина 1 является корнем. Все ребра направлены от корня.
  • Последние n - 1 ребер идут от i к 1, для всех 2 ≤ i ≤ n.

Вам дано q запросов. Есть два типа запросов

  • 1 i w: Изменить вес i-го ребра на w;
  • 2 u v: Вывести длину кратчайшего пути между вершинами u и v.

По данным запросам выведите длины кратчайших путей.

Входные данные

Первая строка содержит два целых числа n, q (2 ≤ n, q ≤ 200 000) — количество вершин и количество запросов, соответственно.

Каждая из следующих 2n - 2 строк содержит три целых числа ai, bi, ci, обозначаищие ребро от вершины ai до вершины bi с весом ci.

Первые n - 1 из этих строк описывают корневое основное дерево, направленное от вершины 1, а для оставшихся n - 1 строк будет выполняться bi = 1.

Детальнее,

  • Ребра (a1, b1), (a2, b2), ... (an - 1, bn - 1) описывают корневое основное дерево, каждое из ребер которого направлено в сторону от вершины 1.
  • bj = 1 for n ≤ j ≤ 2n - 2.
  • an, an + 1, ..., a2n - 2 — различные целые числа от 2 до n.

Следующие q строк содержат по три целых числа каждая, описывающие запрос в формате, описанном в условии.

Все веса ребер будут в пределах от 1 до 106.

Выходные данные

Для каждого запроса второго типа, выведите длину кратчайшего пути на отдельной строке.

C. Путешествие

графы Деревья дп поиск в глубину и подобное Теория вероятностей *1500

В Семи Королевствах n городов и n - 1 дорога, каждая дорога соединяет два города, и возможно достичь каждый город из каждого, передвигаясь по дорогам.

Теон и Яра Грейджой начинают путешествовать на лошади по дорогам из первого города. Из-за тумана они не видят, куда лошадь их везет. Когда лошадь входит в город (в том числе в первый), она направляется в один из городов, соединенных с ним. Но это странная лошадь, поэтому она пойдет только в город, в котором до этого не была. Она идет равновероятно в каждый из таких городов и останавливается, если таких городов нет.

Пусть длина каждой дороги 1. Путешествие начинается в городе 1. Чему равно математическое ожидание длины их путешествия? Формально, математическое ожидание — это ожидаемое (то есть среднее) значение. Подробнее можно прочесть по ссылке https://ru.wikipedia.org/wiki/Математическое_ожидание.

Входные данные

Первая строка содержит одно целое число n (1 ≤ n ≤ 100000) — количество городов.

Далее следует n - 1 строк. i-я из них содержит два целых числа ui и vi (1 ≤ ui, vi ≤ n, ui ≠ vi) — номера городов, соединенных i-й дорогой.

Гарантируется, что возможно достичь каждый город из каждого, передвигаясь по дорогам.

Выходные данные

Выведите одно число — математическое ожидание длины путешествия. Путешествие начинается в городе 1.

Ваш ответ будет считаться правильным, если его абсолютная или относительная точность не превосходит 10 - 6.

А именно, если ваш ответ равен a, а ответ жюри равен b, то ваш ответ будет зачтен, если .

Примечание

В первом примере путешествие может закончиться в городах 3 или 4 с равной вероятностью. Расстояние до городов 3 и 4 равно 1 и 2, соответственно, поэтому матожидание длины равно 1.5.

Во втором примере путешествие может закончиться в городах 4 или 5. Расстояние до обоих городов 2, поэтому матожидание равно 2.

B. Леха и другая игра про графы

графы дп Конструктив поиск в глубину и подобное Структуры данных *2100

Лехе надоело играть с полным графом, который ему подарили в прошлый раз. Теперь он проходит компьютерную игру, где на каждом уровне ему сначала выдается связный неориентированный граф из n вершин и m ребер. Граф может содержать кратные ребра, но не содержит петель. Далее для каждой вершины задается число di, которое может равняться 0, 1 или  - 1. Чтобы пройти уровень, нужно найти любое «хорошее» подмножество ребер графа или сообщить, что его не существует. Подмножество называется «хорошим», если оставив в исходном графе только ребра из него, то для каждой вершины i будет верно, что di =  - 1 или ее степень по модулю 2 равна di. Леха хотел бы поскорее пройти игру до конца и похвастаться своим друзьям, поэтому он просит Вашей помощи.

Входные данные

Первая строка содержит два целых числа n, m (1 ≤ n ≤ 3·105, n - 1 ≤ m ≤ 3·105) — число вершин и ребер соответственно.

Вторая строка содержит n целых чисел d1, d2, ..., dn ( - 1 ≤ di ≤ 1) — значения на вершинах.

Каждая из следующих m строк содержит два целых числа u и v (1 ≤ u, v ≤ n) — описание ребер. Гарантируется, что граф во входных данных является связным.

Выходные данные

Выведите  - 1 в единственной строке, если решения не существует. Иначе в первой строке выведите целое число k — количество рёбер в ответе. В следующих k строках номера ребер в подмножестве. Ребра нумеруются в порядке ввода, начиная с 1.

Примечание

В первом примере у нас есть одна вершина без рёбер. Её степень 0 и получить 1 не получится.

C. Илья и дерево

графы Деревья математика поиск в глубину и подобное теория чисел *2000

Илья очень любит графы, особенно деревья. Во время последнего похода в лес Илья нашел очень интересное дерево с корнем в вершине 1, в каждой вершине i которого записано одно целое число ai.

Красотой вершины x Илья называет наибольший общий делитель всех чисел в вершинах на пути от корня до x включительно. При этом Илья может изменить число в одной произвольной вершине на 0, либо оставить все вершины неизменными. Теперь Илью интересует, какая максимальная красота может быть у каждой вершины.

Для каждой вершины ответ нужно считать независимо.

Красота корня равна числу, записанному на нем.

Входные данные

Первая строка содержит целое число n — количество вершин в дереве (1 ≤ n ≤ 2·105).

Следующая строка содержит n целых чисел ai (1 ≤ i ≤ n, 1 ≤ ai ≤ 2·105).

Каждая из следующий n - 1 строк содержит два целых числа x и y (1 ≤ x, y ≤ n, x ≠ y), означающие, что в дереве есть ребро (x, y).

Выходные данные

В единственной строке через пробел выведите n чисел, где i-е по порядку числу  — максимальная красота вершины i.

E. Никита и игра

Бинарный поиск графы Деревья поиск в глубину и подобное разделяй и властвуй *2800

Никита играет в новую компьютерную игру. Всего в игре m уровней. На каждом уровне появляется новый класс, который наследуется от класса yiyi является родителем нового класса). Таким образом, классы образуют дерево. Изначально существует только один класс с номером 1.

Поменять класс на его соседа в дереве стоит 1 монету, причем обратно класс поменять нельзя. Стоимость смены класса a на класс b равна суммарной стоимости изменений классов на пути от a до b в дереве классов.

Пусть на i-м уровне максимальная стоимость смены одного класса на другой равна x. Выведите для каждого уровня количество классов, для которых существует такой класс y, что смена с этого класса на y стоит x.

Входные данные

Первая строке содержит целое число m — количество запросов(1 ≤ m ≤ 3·105).

Следующие m строк содержат описание уровней. Строка с номером i (1 ≤ i ≤ m) описывает i -ый уровень и содержит одно целое число yi  — номер класса, от которого наследуется класс с номером i + 1 (1 ≤ yi ≤ i) .

Выходные данные

Пусть на i -ом уровне максимальная стоимость смены одного класса на другой равна x. Выведите для каждого уровня количество классов, для которых существует такой класс y, что смена с этого класса на y стоит x.

A. Сортировка подпоследовательностями

математика поиск в глубину и подобное реализация снм сортировки *1400

Дана последовательность a1, a2, ..., an, состоящая из различных целых чисел. Требуется разбить эту последовательность на максимальное число подпоследовательностей так, чтобы после сортировки по возрастанию чисел внутри каждой из них итоговая последовательность также оказалась отсортированной по возрастанию.

Под сортировкой по возрастанию чисел внутри подпоследовательности понимается процесс, в котором числа, входящие в подпоследовательность, упорядочиваются по возрастанию, а числа, не входящие в подпоследовательность, не меняют свои позиции.

При разбиении последовательности на подпоследовательности каждый элемент должен войти ровно в одну подпоследовательность.

Входные данные

Первая строка входных данных содержит целое число n (1 ≤ n ≤ 105) — длину последовательности.

Вторая строка входных данных содержит n различных целых чисел a1, a2, ..., an ( - 109 ≤ ai ≤ 109) — элементы последовательности. Гарантируется, что все элементы последовательности различны.

Выходные данные

В первой строке выведите максимальное число подпоследовательностей k, на которое можно разбить исходную последовательность, выполнив условие задачи.

В следующих k строках выведите описание подпоследовательностей в следующем формате: количество элементов в подпоследовательности ci (0 < ci ≤ n), а затем ci целых чисел l1, l2, ..., lci (1 ≤ lj ≤ n) — индексы этих элементов в исходной последовательности.

Индексы можно выводить в любом порядке. Каждый индекс от 1 до n должен присутствовать в выводе ровно один раз.

Если возможных ответов несколько, выведите любой из них.

Примечание

Пояснение к ответу на первый сэмпл:

После сортировки первой подпоследовательности мы получим последовательность 1 2 3 6 5 4.

После сортировки второй подпоследовательности ничего не изменится.

После сортировки третьей подпоследовательности мы получим последовательность 1 2 3 4 5 6.

После сортировки последней подпоследовательности ничего не изменится.

C. Переподвешивание дерева

графы Деревья Конструктив математика поиск в глубину и подобное *2600

Вам дано дерево размера n и разрешается выполнить не более 2n операций над ним. Операция заключается в выборе трех вершин x, y, y', удалении ребра (x, y) и добавлении ребра (x, y'). Операцию x, y, y' можно выполнить в случае, если выполнены все условия:

  1. Ребро (x, y) присутствует в дереве.
  2. После операции граф останется деревом.
  3. При удалении ребра (x, y) дерево распадается на две компоненты связности. Обозначим множество вершин в одной компоненте с вершиной x множеством Vx, а в одной компоненте с вершиной y — множеством Vy. Тогда должно выполняться условие |Vx| > |Vy|, т.е. размер компоненты с x должен быть строго больше размера компоненты с y.

Вам требуется минимизировать сумму квадратов расстояний между всеми парами вершин в итоговом дереве, полученном после не более чем 2n операций, а также предоставить последовательность операций, с помощью которых можно получить итоговое дерево из исходного.

Обратите внимание, что минимизировать количество операций не нужно. Нужно минимизировать исключительно сумму квадратов расстояний.

Входные данные

Первая строка входных данных содержит целое число n (1 ≤ n ≤ 2·105) — количество вершин в дереве.

Следующие n - 1 строки входных данных содержат пары целых чисел a и b (1 ≤ a, b ≤ n, a ≠ b) — описания рёбер. Гарантируется, что данные ребра образуют дерево.

Выходные данные

В первой строке выведите число k (0 ≤ k ≤ 2n) — количество операций, которые нужно провести, чтобы минимизировать сумму квадратов расстояний между различными парами вершин.

В следующих k строках выведите по три целых числа x, y, y' — номера вершин, участвующих в очередной операции.

Операции, в которых y = y', разрешены (хоть ничего и не меняют), если выполнены условия операции.

Если возможных ответов несколько, выведите любой из них.

Примечание

Иллюстрация изменений графа во втором примере из условия. Темным обозначены ребра после операции, пунктиром — до.

G. Кратчайший путь?

графы математика поиск в глубину и подобное *2300

Дан неориентированный граф со взвешенными рёбрами. Длина некоторого пути между двумя вершинами равна побитовому исключающему или весов всех рёбер, по которым проходит путь (если некоторое ребро используется в пути несколько раз, то столько же раз оно учитывается в длине пути). Вам необходимо найти минимально возможную длину пути между вершиной 1 и вершиной n.

Обратите внимание, что граф может содержать кратные рёбра и/или петли. Гарантируется, что граф связный.

Входные данные

В первой строке заданы два целых числа n и m (1 ≤ n ≤ 100000, n - 1 ≤ m ≤ 100000) — количество вершин и рёбер в графе.

Затем следуют m строк. В каждой строке заданы три целых числа x, y и w (1 ≤ x, y ≤ n, 0 ≤ w ≤ 108). Эти числа задают ребро между вершинами x и y с весом w.

Выходные данные

Выведите одно число — минимально возможную длину пути между вершинами 1 и n.

E. Берляндская химия

Деревья жадные алгоритмы поиск в глубину и подобное *2300

Игорь — аспирант химического факультета Берляндского Государственного Университета (БерГУ). Он должен провести сложный эксперимент для написания научной работы, но в лаборатории БерГУ не хватает некоторых веществ для проведения эксперимента.

К счастью, законы химии позволяют преобразовывать одни вещества в другие (да, химия в Берляндии сильно отличается от химии в нашем мире). Но правила преобразования достаточно странные.

Берляндским химикам известно n веществ, пронумерованных в порядке их открытия. Каждый материал можно преобразовать в какой-то другой материал (и обратно). Формально, для каждого i (2 ≤ i ≤ n) существуют два числа xi и ki, обозначающие возможное преобразование: ki килограмма вещества xi можно превратить в 1 килограмм вещества i, а 1 килограмм вещества i можно превратить в 1 килограмм вещества xi. Химическое оборудование в БерГУ позволяет проводить только такие преобразования, в результате которых получается целое число килограммов нового вещества.

Для каждого i (1 ≤ i ≤ n) Игорю известно, что эксперимент требует ai килограммов вещества i, а в лаборатории есть bi килограммов этого вещества. Можно ли после некоторых преобразований (или вообще без них) провести эксперимент?

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 105) — количество веществ, известных берляндским химикам.

Во второй строке записаны n целых чисел b1, b2... bn (1 ≤ bi ≤ 1012) — запасы лаборатории БерГУ.

В третьей строке записаны n целых чисел a1, a2... an (1 ≤ ai ≤ 1012) — необходимый минимум для проведения эксперимента.

Затем следуют n - 1 строк. j-я из них содержит два целых числа xj + 1 и kj + 1, обозначающую преобразование (j + 1)-го вещества (1 ≤ xj + 1 ≤ j, 1 ≤ kj + 1 ≤ 109).

Выходные данные

Выведите YES, если Игорь сможет провести эксперимент. Иначе выведите NO.

I. Уровень шума

математика поиск в глубину и подобное реализация *1900

Столица Берляндии имеет вид прямоугольника размером n × m кварталов. Все кварталы делятся на три типа:

  • обычные (обозначаются символом '.') — такие кварталы сами не производят шума, но не являются препятствиями для распространения шума;
  • источники шума (обозначаются заглавными латинскими буквами от 'A' до 'Z') — такие кварталы являются источниками шума и не являются препятствиями для распространения шума;
  • сильно застроенные (обозначаются символом '*') — такие кварталы являются шумоизолированными, в них не проникает шум, и они сами являются препятствиями для распространения шума.

Квартал, который обозначается буквой 'A', производит q единиц шума. Квартал, который обозначается буквой 'B', производит q единиц шума. И так далее, вплоть до квартала, обозначаемого буквой 'Z', который производит 26·q единиц шума. В городе может располагаться произвольное количество кварталов, обозначаемых одинаковыми буквами.

При распространении от источника при переходе к соседнему по стороне кварталу шум затихает в два раза (при делении следует округлять вниз). Шум распространяется по цепочке. Например, если квартал расположен на расстоянии 2 от источника шума, то величина шума, который дойдёт до квартала, делится на 4. Таким образом, уровень шума, дошедший от источника к кварталу определяется исключительно длиной кратчайшего пути между ними. Сильно застроенные кварталы являются препятствиями, шум в них не проникает.

Значения в ячейках таблицы справа показывают суммарный уровень шума в соответствующих кварталах для q = 100, первое слагаемое — шум от квартала 'A', второе слагаемое — шум от квартала 'B'.

Уровень шума в квартале определяется как сумма шумов от всех источников. Для оценки качества жизни населения столицы Берляндии требуется найти количество кварталов, уровень шума в которых превышает допустимую норму p.

Входные данные

В первой строке содержатся четыре целых числа n, m, q и p (1 ≤ n, m ≤ 250, 1 ≤ q, p ≤ 106) — размеры столицы Берляндии, количество единиц шума, которое производит квартал 'A', и допустимая норма шума.

В следующих n строках содержится по m символов — описание кварталов столицы в соответствии с условием. Возможно, что в столице Берляндии отсутствуют кварталы любого из трёх типов.

Выходные данные

Выведите количество кварталов, уровень шума в которых превышает допустимую норму p.

Примечание

Иллюстрация к первому примеру находится в основной части условия задачи.

L. Компьютерная сеть Берляндского ГУ

графы Деревья Конструктив поиск в глубину и подобное хэши *2400

В компьютерной сети Берляндского государственного университета имеется n маршрутизаторов, пронумерованных от 1 до n. Некоторые пары маршрутизаторов соединены коммутационными шнурами (патч-кордами). Информация по патч-корду может передаваться в любом из двух направлений. Сеть устроена таким образом, что между любыми двумя маршрутизаторами возможна передача информации (непосредственно или через другие маршрутизаторы). В сети отсутствуют циклы, поэтому между каждой парой маршрутизаторов существует единственный путь по патч-кордам.

К сожалению, точная топология сети была утеряна администраторами. С целью её восстановления была собрана следующая вспомогательная информация.

Для каждого патч-корда p, непосредственно присоединённого к маршрутизатору i, известны все маршрутизаторы, находящиеся за патч-кордом p относительно i. Иными словами, известны все маршрутизаторы, путь от которых до маршрутизатора i включает в себя патч-корд p. Таким образом, для каждого маршрутизатора i составлены ki списков, где ki — количество патч-кордов, подключенных к i.

Например, пусть сеть состоит из трех маршрутизаторов, соединённых в цепочку 1 - 2 - 3. Тогда:

  • маршрутизатор 1: для единственного патч-корда, присоединённого к первому маршрутизатору, составлен единственный список, который содержит два маршрутизатора: 2 и 3;
  • маршрутизатор 2: для каждого из патч-кордов, присоединённых ко второму маршрутизатору, составлено по списку: один из них содержит маршрутизатор 1, а другой — маршрутизатор 3;
  • маршрутизатор 3: для единственного патч-корда, присоединённого к третьему маршрутизатору, составлен один список, который содержит два маршрутизатора: 1 и 2.

Помогите администраторам компьютерной сети БГУ восстановить топологию сети, то есть определить все пары маршрутизаторов, непосредственно соединенные патч-кордами.

Входные данные

В первой строке содержится целое число n (2 ≤ n ≤ 1000) — количество маршрутизаторов в сети БГУ.

В каждой из следующих n строк содержатся описания списков для очередного маршрутизатора. Так, i-я строка содержит списки для i-го маршрутизатора.

Описание каждого списка начинается с количества маршрутизаторов в нём. Затем следует символ ':', а после него через запятую перечисляются номера всех маршрутизаторов из списка. Описания списков для каждого патч-корда разделяются символом '-'.

Гарантируется, что для каждого маршрутизатора суммарное количество маршрутизаторов во всех списках равно n - 1, причём все числа в списках каждого маршрутизатора различны. Списки каждого маршрутизатора не содержат номер этого маршрутизатора.

Выходные данные

Если решения не существует, выведите -1.

В противном случае в первую строку выведите число n - 1 — количество патч-кордов в сети. В каждой из следующих n - 1 строк выведите по два целых числа — описания патч-кордов в виде номеров соединяемых ими маршрутизаторов. Информация о каждом патч-корде должна быть выведена ровно один раз.

Примечание

Первый пример разобран в условии.

Ответ для второго примера изображён на рисунке.

На нём мы можем видеть, что у первого маршрутизатора один список, в котором встречаются все остальные маршрутизаторы. У второго маршрутизатора три списка: в первом — маршрутизатор 4, во втором — маршрутизатор 1, а в третьем — маршрутизаторы 3 и 5. У третьего маршрутизатора один список, в котором встречаются все остальные маршрутизаторы. У четвёртого маршрутизатора тоже один список, в котором встречаются все остальные маршрутизаторы. У пятого маршрутизатора два списка: в первом — маршрутизатор 3, а во втором — маршрутизаторы 1, 2 и 4.

C. Петя и дерево

Бинарный поиск Деревья поиск в глубину и подобное сортировки Теория вероятностей *2200

Однажды после тяжелого рабочего дня Пете приснился страшный сон. И было в том сне большое бинарное дерево поиска. Но не дерево пугало Петю, а то, что не получалось у Пети искать в этом дереве элементы. Сколько ни пробовал Петя загадывать ключ и искать его в дереве, каждый раз приходил куда-то не туда. Долго мучился Петя, много загадывал ключей, и все одно и то же. Отчание стало охватывать Петю, как вдруг на него снизошло озарение: каждый раз, когда он искал ключ, этого ключа не было в дереве, и при этом случалась ровно одна ошибка. "Не беда!" — подумал Петя, — "А посчитаю-ка я матожидание значения элемента, который находится при поиске данного ключа." Только он собрался это сделать, как, вдруг, проснулся.

Итак, вам дано бинарное дерево поиска, то есть дерево, у которого в каждой вершине записано некоторое число, называемое ключом вершины. Количество сыновей у каждой вершины дерева равно либо 0, либо 2. Вершины, имеющие 0 сыновей, называются листьями, а вершины, имеющие 2 сыновей, называются внутренними. У внутренней вершины есть левый сын, то есть сын, у которого ключ меньше ключа текущей вершины, и правый сын, у которого ключ больше ключа текущей вершины. Потомками некоторой вершины называются все вершины, достижимые из нее. То есть это непосредственные сыновья вершины, сыновья сыновей, и так далее. Левые потомки вершины — потомки ее левого сына. Аналогично, правые потомки вершины — потомки ее правого сына. По свойству дерева поиска, ключ любой вершины строго больше всех ключей левых потомков вершины и строго меньше всех ключей правых потомков вершины.

Так же вам задан набор ключей поиска, все из которых различны и отличаются от ключей вершин, имеющихся в дереве. Для каждого ключа из набора выполняется его поиск в дереве. Поиск устроен следующим образом: изначально мы находимся в корне дерева, если ключ текущей вершины больше нашего ключа поиска, то мы переходим в левого сына вершины, иначе переходим в правого сына вершины, и процесс повторяется. Так как ключ поиска гарантированно не содержится в дереве, поиск всегда будет останавливаться в листьях дерева. Ключ, лежащий в листе, объявляется результатом поиска.

Достоверно известно, что в ходе этого поиска мы ровно один раз ошибемся в сравнении, то есть пойдем не туда куда надо, а дальше ошибаться не будем. Все возможные ошибки равновероятны, то есть рассматриваются все такие поиски, в которых происходит ровно одна ошибка. Ваша задача — для каждого ключа поиска найти математическое ожидание (среднее значение) результата поиска, при условии что в этом поиске происходит ровно одна ошибка. То есть, надо для набора путей, в которых содержится ровно одна ошибка поиска заданного ключа, посчитать среднее значение ключей, находящихся в листьях этих путей.

Входные данные

В первой строке задано нечетное целое число n (3 ≤ n < 105) — количество вершин в дереве. В следущих n строках заданы описания вершин. На (i + 1)-ой строке записано два целых числа, разделенных пробелами. Первое число — это номер родителя i-ой вершины, второе — это ключ, лежащий в i-ой вершине. В следующей строке записано целое число k (1 ≤ k ≤ 105) — количество ключей, для которых надо посчитать среднее значение результатов поиска с одной ошибкой. В следующих k строках записаны сами ключи, по одному в каждой строке.

Все ключи вершин и все ключи поиска — это целые положительные числа, не превосходящие 109. Все n + k ключей различны.

Все вершины нумеруются от 1 до n. Для корня дерева вместо номера вершины родителя будет задано число «-1» (без кавычек). Гарантируется, что задано корректное бинарное дерево поиска. Для каждой вершины, кроме корня, согласно её ключу может быть установлено, является она левым или правым сыном.

Выходные данные

Выведите k действительных чисел, являющихся матожиданиями ответов для ключей, заданных во входе. Ответ должен отличаться от правильного с относительной или абсолютной погрешностью не более 10 - 9.

Примечание

В первом сэмпле поиск ключа 1 с одной ошибкой порождает в дереве два пути: (1, 2, 5) и (1, 3, 6), в скобках перечислены номера вершин от корня к листу. Ключи в листьях этих путей равны 6 и 10 соответственно, поэтому ответ равен 8.

I. Брачное агенство

графы Деревья Перебор поиск в глубину и подобное *2300

Эта история происходит в городе BubbleLand. В этом городе есть n домов. В каждом из этих n домов живет мальчик или девочка. В этом городе люди действительно любят числа, и у каждого есть свое любимое число f. Это означает, что мальчик или девочка, живущие в городе в i-м доме, имеют свое любимое число, равное fi.

Дома пронумерованы числами от 1 до n.

Дома соединены n - 1 двунаправленными дорогами, от любого дома возможно добраться до любого другого. Между каждой парой домов есть ровно один путь.

Новое брачное агенство открыло свои офисы в этом странном городе, и жители были восхищены. Они сразу же отправили q запросов в агенство, каждый запрос был в следующем формате:

  • a b — спрашивает, сколько есть способов выбрать пару (мальчик и девочка) такую, что они имеют одинаковое любимое число и живут в домах, находящимся на уникальном пути от дома a до дома b.

Помогите брачному агенству ответить на запросы и расширить их бизнес.

Входные данные

Первая строка содержит одно целое число n (1 ≤ n ≤ 105) — число домов в городе.

Вторая строка содержит n целых чисел, i-е из этих чисел равно 1, если в i-м доме живет мальчик, и 0, если в i-м доме живет девочка.

Третья строка содержит n целых чисел, где i-е число равно любимому числу fi (1 ≤ fi ≤ 109) девочки или мальчика, живущих в i-м доме.

Следующие n - 1 строк содержат информацию о дорогах, i-я из них содержит два целых числа ai и bi (1 ≤ ai, bi ≤ n), которые означают, что есть дорога между этими двумя домами. Гарантируется, что от любого дома можно добраться до любого другого по дорогам.

Следующая строка содержит одно целое число q (1 ≤ q ≤ 105) — число запросов.

Каждая из следующих q строк описывает запрос и содержит два целых числа a и b (1 ≤ a, b ≤ n).

Выходные данные

Для каждого из q запросов выведите единственное число — ответ на этот запрос.

Примечание

В первом вопросе на пути от дома 1 до дома 3 потенциальными парами являются (1, 3) и (6, 3).

Во втором вопросе на пути от дома 7 до дома 5 потенциальными парами являются (7, 6), (4, 2) и (4, 5).

G. Гарри против Волан-де-Морта

графы Деревья дп поиск в глубину и подобное *3300

После того, как Гарри уничтожил все крестражи Волан-де-Морта, началась их решающая битва. Они кидают друг в друга заклинания, исходящие из волшебных палочек, и заклинания сталкиваются.

Битва происходит в Хогвартсе, который можно представить в виде дерева. В Хогвартсе есть n локаций, соединённых n - 1 двунаправленной дорогой.

Рону, наблюдающему за битвой между Гарри и Волан-де-Мортом, стало интересно, сколько существует троек локаций (u, v, w), таких что если Гарри находится в локации u, а Волан-де-Морт в локации v, их заклинания могут столкнуться в локации w. Это возможно только если u, v и w попарно различны и существуют путь из u в w и путь из v в w, не проходящие по одной и той же дороге.

В хаосе битвы в Хогвартсе стали появляться новые дороги. Вам необходимо вычислять величину, интересующую Рона, после каждого добавления дороги.

Формально, задано дерево из n вершин и n - 1 ребер. q новых рёбер добавляются между вершинами дерева. После каждого добавления необходимо вычислять число троек вершин (u, v, w), таких что u, v и w попарно различны и существуют два пути, один из которых между вершинами u и w, а другой — между v и w, такие, что у них нет общих рёбер.

Входные данные

В первой строке содержится целое число n (1 ≤ n ≤ 105) — количество локаций в Хогвартсе.

В каждой из следующих n - 1 строках содержатся два целых числа u и v (1 ≤ u, v ≤ n), показывающие наличие дороги между локациями u и v. Гарантируется, что данный граф является деревом.

В следующей строке задано целое число q (1 ≤ q ≤ 105) — количество новых дорог, добавляемых в граф.

В каждой из следующих q строк содержатся два целых числа u и v, обозначающие новую добавленную дорогу (1 ≤ u, v ≤ n).

Обратите внимание, некоторые новые дороги могут соединять те же локации, что и ранее существующие дороги, или соединять локацию саму с собой.

Выходные данные

В первой строке выведите число троек до всех добавлений.

После этого выведите q строк, в каждой из которых выведите число ansi, показывающее число троек после i-го запроса о добавлении дороги.

Примечание

В первом примере для изначального дерева только (1, 3, 2) и (3, 1, 2) являются возможными тройками локаций (u, v, w).

После добавления ребра из 2 в 3, возможны тройки локаций (1, 3, 2), (3, 1, 2), (1, 2, 3) и (2, 1, 3).

F. Турне волшебника

графы Конструктив поиск в глубину и подобное *2300

Все жители Берляндии ждут беспрецедентного турне волшебника в голубом вертолете по городам Берляндии!

Известно, что в Берляндии n городов, некоторые пары которых соединены двусторонними дорогами. Каждая пара городов соединена не более чем одной дорогой. Не гарантируется, что дорожная сеть связна, то есть возможно, что из какого-то города невозможно добраться до других, двигаясь по дорогам.

Турне волшебника будет состоять из туров. Во время каждого тура:

  • волшебник высадится в некотором городе x с вертолета;
  • даст представление и бесплатно покажет кино в городе x;
  • проедет по дороге в соседний город y;
  • даст представление и бесплатно покажет кино в городе y;
  • проедет по дороге в соседний с y город z;
  • даст представление и бесплатно покажет кино в городе z;
  • улетит на вертолете из города z.

Известно, что волшебник не любит путешествовать по дорогам: по каждой дороге он может проехать лишь единожды (независимо от направления). Иными словами для дороги между a и b он может либо проехать один раз из a в b, либо проехать один раз из b в a, либо вообще не проезжать по этой дороге.

Волшебник хочет организовать максимальное количество туров, не нарушив правила изложенные выше. Помогите волшебнику!

Обратите внимание, что волшебник может посещать один город многократно, ограничение на посещения касается исключительно дорог.

Входные данные

В первой строке записаны два целых числа n, m (1 ≤ n ≤ 2·105, 0 ≤ m ≤ 2·105) — количество городов и количество дорог в Берляндии соответственно.

Далее следуют описания дорог, по одному описанию в строке. Каждое описание — это пара целых чисел ai, bi (1 ≤ ai, bi ≤ n, ai ≠ bi), где ai и bi — номера городов, которые соединены i-й дорогой. Гарантируется, что нет двух дорог, соединяющих одну и ту же пару городов. Все дороги — двусторонние. Города пронумерованы от 1 до n.

Возможно, что сеть дорог в Берляндии не является связной.

Выходные данные

В первую строку выведите w — максимальное количество туров волшебника. В следующих w строках выведите сами туры в формате x, y, z — три числа через пробел, номера посещенных за тур городов в порядке посещения.

E. Беспорядок на рабочих местах

графы Деревья Комбинаторика поиск в глубину и подобное снм *2100

Привезли новые рабочие столы, и нужно с ними поскорее разобраться, так как в офисе стало очень тесно! Вам нужно составить новую рассадку инженеров в офисе. Столы пронумерованы, и вы провели опрос среди инженеров, выяснив, за каким столом они работают сейчас, и за каким столом они хотели бы работать (может совпадать с тем столом, за которым они сейчас работают). Каждый инженер должен либо остаться на своем месте, либо переместиться на то место, которое он обозначил как желаемое. Никакие два инженера не работают сейчас за одним столом, и после пересадки никакие два инженера также не должны работать за одним столом.

Сколько существует способов рассадить инженеров так, чтобы удовлетворить описанным ограничениям? Ответ может быть большим, поэтому выведите его по модулю 1000000007 = 109 + 7.

Входные данные

В первой строке находится одно целое число N (1 ≤ N ≤ 100000) — количество инженеров.

Далее следуют N строк, в каждой из них находятся ровно два целых числа. Строка i содержит номер стола, за которым сейчас работает i-й инженер, и затем номер стола, за который i-й инженер хотел бы переехать. Столы пронумерованы от 1 до N. Гарантируется, что никакие два инженера не работают сейчас за одним столом.

Выходные данные

Выведите число способов рассадить всех инженеров по модулю 1000000007 = 109 + 7.

Примечание

Следующие рассадки возможны в первом примере:

  • 1 5 3 7
  • 1 2 3 7
  • 5 2 3 7
  • 1 5 7 3
  • 1 2 7 3
  • 5 2 7 3

E. Аркадий и человек-никто

Деревья поиск в глубину и подобное Структуры данных *2700

Аркадий работает в крупной компании. Всего в компании n сотрудников, при этом действует жесткая иерархия. А именно, у каждого сотрудника, кроме директора, есть ровно один непосредственный начальник, а директор является начальником (через цепочку непосредственных подчиненных) всех сотрудников.

У каждого сотрудника есть ранг, выраженный целым числом. У директора ранг равен 1, а каждый другой сотрудник имеет ранг на 1 больший, чем ранг его непосредственного начальника.

У Аркадия неплохая позиция в компании, однако он чувствует, что он — никто в структуре компании, и есть много людей, которые могут заменить его. Он ввел понятие заменяемости. Рассмотрим сотрудника a и сотрудника b, который является начальником a (не обязательно непосредственным). Тогда заменяемостью r(a, b) сотрудника a относительно начальника b называется количество подчиненных (не обязательно непосредственных) данного начальника b, ранг которых не превосходит ранга данного подчиненного a. Кроме заменяемости, Аркадий ввел еще и понятие ничтожности. Ничтожность za сотрудника a равна сумме его заменяемостей относительно всех его начальников, то есть , где сумма берется по всем его начальникам b.

Аркадию интересна не только своя ничтожность, но и ничтожность всех остальных сотрудников компании. Найдите для Аркадия ничтожность каждого из сотрудников.

Входные данные

В первой строке находится одно целое число n (1 ≤ n ≤ 5·105) — количество сотрудников в компании.

Во второй строке находится n целых чисел p1, p2, ..., pn (0 ≤ pi ≤ n), где pi = 0, если i-й сотрудник является директором, а иначе pi равно номеру сотрудника, являющегося непосредственным начальником сотрудника номер i. Сотрудники нумеруются от 1 до n. Гарантируется, что среди этих чисел встречается ровно один 0, а также то, что директор является начальником (не обязательно непосредственным) для всех остальных сотрудников.

Выходные данные

Выведите n целых чисел — ничтожности всех сотрудников в порядке их нумерации: z1, z2, ..., zn.

Примечание

Рассмотрим первый пример. Тогда:

  • У директора нет начальников, поэтому z1 = 0.
  • r(2, 1) = 2 (сотрудники 2 и 4 подходят, сотрудник 3 имеет слишком большой ранг). Поэтому z2 = r(2, 1) = 2.
  • Аналогично, z4 = r(4, 1) = 2.
  • r(3, 2) = 1 (сотрудник 3 является подчиненным 2 и имеет необходимый ранг). r(3, 1) = 3 (подходят сотрудники 2, 3, 4). Поэтому z3 = r(3, 2) + r(3, 1) = 4.

B. Махмуд, Ехаб и двудольность

графы Деревья поиск в глубину и подобное *1300

Махмуд и Ехаб продолжают свои приключения! Каждый житель Злой Страны знает, что Доктор Зло любит двудольные графы, особенно деревья.

Дерево — это связный граф без циклов. Двудольный граф — это граф, вершины которого можно разбить на 2 множества таким образом, что для любого ребра (u, v) графа вершины u и v лежат в разных множествах. Более формальное определение дерева и двудольного графа дано ниже.

Доктор Зло дал Махмуду и Ехабу дерево, состоящее из n вершин и сказал добавлять рёбра таким образом, чтобы граф оставался двудольным, а также в нём не было петель и кратных рёбер. Какое максимальное число рёбер они могут добавить?

Входные данные

В первой строке дано целое число n — число вершин в дереве (1 ≤ n ≤ 105).

В следующих n - 1 строках содержатся пары целых чисел u и v (1 ≤ u, v ≤ n, u ≠ v) — описание рёбер дерева.

Гарантируется, что заданный граф является деревом.

Выходные данные

Выведите одно число — максимальное число рёбер, которые Махмуд и Ехаб могут добавить в граф.

Примечание

Определение дерева: https://ru.wikipedia.org/wiki/Дерево_(теория_графов)

Определение двудольного графа: https://ru.wikipedia.org/wiki/Двудольный_граф

В первом тестовом примере единственное ребро, которое можно добавить в граф, чтобы избежать появления петель и кратных рёбер — это (2, 3), но его добавление сделает граф не двудольным.

Во втором тестовом примере Махмуд и Ехаб могут добавить рёбра (1, 4) и (2, 5).

F. Экскурсии по городам

графы Деревья поиск в глубину и подобное *2700

В Берляндии есть n городов. Некоторые пары городов соединены m односторонними дорогами. Из одного города в другой можно добраться только по этим дорогам. При этом нет дорог, соединяющих город с самим собой. Для любой пары городов (x, y) может быть не более одной дороги из x в y.

Путь из города s в город t представляет собой последовательность городов p1, p2, ... , pk, где p1 = s, pk = t, где из города pi идет дорога в город pi + 1 для все i от 1 до k - 1. Через любой из городов, кроме последнего города t пути, путь может проходить многократно. Через город t многократно путь проходить не может.

Путь p из s в t называется идеальным, если он является лексикографически минимальным таким путем. Иными словами, pидеальный путь из s в t, если для любого другого пути q из s в t pi < qi, где i — наименьший индекс такой, что pi ≠ qi.

В стране работает туристическое агенство, которое предоставляет q необычных экскурсий: j-я экскурсия начинается в городе sj и заканчивается в городе tj.

Помогите туристическому агентству для каждой пары sj, tj проанализировать идеальный путь из sj в tj. Заметим, что идеальный путь из sj в tj может не существовать. Такое возможно по двум причинам:

  • из города sj невозможно добраться по дорогам в город tj;
  • из города sj возможно добраться по дорогам в город tj, но для любого такого пути p найдется другой путь q из sj в tj, что pi > qi, где i — первый индекс, что pi ≠ qi.

Анализ идеального пути из sj в tj состоит в нахождении города, который является kj-м в этом пути (при следовании из sj в tj).

Напишите программу, которая для каждой тройки sj, tj, kj (1 ≤ j ≤ q) определит, существует ли идеальный путь из sj в tj и выведет kj-й город пути, если таковой есть.

Входные данные

Первая строка входных данных содержит три целых числа n, m и q (2 ≤ n ≤ 3000,0 ≤ m ≤ 3000, 1 ≤ q ≤ 4·105) — количество городов, количество дорог и количество экскурсий.

Следующие m строк содержат по два целых числа xi и yi (1 ≤ xi, yi ≤ n, xi ≠ yi), обозначающие, что i-я дорога ведет из города xi в город yi. Все дороги — односторонние. Между парой городов может быть не более одной дороги в каждом из двух направлений.

Каждая из следующих q строк содержит три целых числа sj, tj и kj (1 ≤ sj, tj ≤ n, sj ≠ tj, 1 ≤ kj ≤ 3000).

Выходные данные

В j-ю строку выходных данных выведите город, который расположен kj-м в идеальном пути из sj в tj. Если идеального пути из sj в tj не существует или число kj больше длины этого пути, выведите в j-ю строку '-1' без кавычек.

D. Постоянная вездесущесть

графы Перебор поиск в глубину и подобное *2800

Основная предпосылка справедливости не должна быть правильной, но должна быть сильной. Вот почему справедливость всегда побеждает.

Пчела Циндерсворм. Коёми с ним знаком.

Пчёлы, как известно, живут на дереве. Точнее в полном двоичном дереве с n вершинами, пронумерованными от 1 до n. Вершина с номером 1 является корнем, а предок i-й (2 ≤ i ≤ n) вершины имеет номер . Учтите, что все рёбра в дереве неориентированные.

Коёми добавил m дополнительных неориентированных рёбер, делая дом пчёл сложнее. А вам нужно посчитать количество простых путей в полученном графе, по модулю 109 + 7. Простой путь это последовательность из вершин, в которой каждые две соседние вершины соединены ребром, а также рёбер, их соединяющих. Кроме того, простой путь не содержит никакую вершину более одного раза. Учтите, что путь из одной вершины также является простым путём. Обратитесь к примерам для лучшего понимания условия.

Входные данные

В первой строке содержатся два целых числа n и m (1 ≤ n ≤ 109, 0 ≤ m ≤ 4) — число вершин в дереве и число добавленных рёбер, соответственно.

В следующих m строках содержатся пары целых чисел u и v (1 ≤ u, v ≤ n, u ≠ v), которые описывают ребро, добавленное между вершинами u и v.

Учтите, что в итоговом графе могут быть кратные рёбра.

Выходные данные

Выведите единственное число — количество простых путей в итоговом графе по модулю 109 + 7.

Примечание

В первом тестовом примере простыми путями являются: (1); (2); (3); (1, 2); (2, 1); (1, 3); (3, 1); (2, 1, 3); (3, 1, 2). (Для простоты тут не указаны рёбра в пути, так как в графе нет кратных рёбер)

Во втором тестовом примере простыми путями являются: (1); (1, 2); (1, 2, 3); (1, 3); (1, 3, 2) и аналогичные пути с началами в 2 и 3. (5 × 3 = 15 в итоге.)

В третьем тестовом примере простыми путями являются: (1); (2); и любой путь из одного ребра, пройденного в каком-то направлении. (2 + 5 × 2 = 12 путей в сумме.)

D. Красивая дорога

графы Деревья дп поиск в глубину и подобное реализация снм сортировки *2300

Давным давно где-то в Азии в одной стране шли междоусобные войны.

Каждый из n городов хотел захватить власть, поэтому иногда один город собирал армию и отправлял ее в поход против другого города.

Прокладывание дорог было делом трудным, поэтому их в стране было мало, а именно n - 1. Также из любого города до любого другого можно было добраться по этим дорогам.

Даже во время войны жители Востока остаются людьми духовно богатыми и ценящими красоту природы. И, дабы оставить на века память о своем великом походе, на дороге, на которой в пути армия провела больше всего времени, сажали одно красивое дерево. Жители Востока любят природу, поэтому если таких дорог было несколько, то по одному дереву сажалось на каждой.

Недавно, когда были обнаружены летописи той войны, выяснилось, что каждый город напал на каждый ровно по одному разу. Всего было ровно n(n - 1) походов. Всем стало интересно, какая дорога после тех войн стала самой красивой, то есть на какой дороге посадили больше всего красивых деревьев.

Входные данные

В первой строке записано целое число n (2 ≤ n ≤ 105) — количество городов. Следующие n - 1 строк содержат по три целых числа: номера городов ai, bi (1 ≤ ai, bi ≤ n), соединяемых i-ой дорогой и количество дней di, затрачиваемое армией на переход по ней (1 ≤ di ≤ 109). Длины некоторых дорог могут совпадать.

Выходные данные

В первой строке выведите два числа — количество красивых деревьев на самой красивой дороге и количество самых красивых дорог. Во второй строке выведите список самых красивых дорог, в порядке возрастания номеров. Дороги пронумерованы от 1 до n - 1 в том порядке, в котором они даны во входных данных.

Пожалуйста, не используйте спецификатор %lld для записи 64-х битовых чисел на С++. Рекомендуется использовать поток cout (также вы можете использовать спецификатор %I64d).

E. Точки, прямые и неоригинальные названия

графы Деревья поиск в глубину и подобное снм *2300

На плоскости дано n различных точек с целыми координатами. Для каждой точки можно выполнить одно из трех действий: провести через нее вертикальную прямую, провести через нее горизонтальную прямую или ничего не делать.

Если рассматривать несколько совпадающих прямых как одну, то сколько различных картинок может получиться? Ответ вывести по модулю 109 + 7.

Входные данные

В первой строке дано целое число n (1 ≤ n ≤ 105) — количество точек.

Далее идет n строк. В (i + 1)-й строке даны два целых числа xi, yi ( - 109 ≤ xi, yi ≤ 109) — координаты i-й точки.

Гарантируется, что все точки различны.

Выходные данные

Вывести количество различных картинок по модулю 109 + 7.

Примечание

В первом примере через точки проходят две вертикальные и две горизонтальные прямые. Существуют способы получить картинку из любого набора этих прямых. В частности, получить картинку на которой нарисованы все четыре прямые можно двумя способами (каждый отрезок обозначает прямую, которой отрезок принадлежит).

Первый способ: Второй способ:

Во втором примере для каждой точки можно независимо выполнить одно из трех действий. Количество картинок равно 32 = 9.

C. Национальное достояние

2-sat графы поиск в глубину и подобное реализация *2100

Как вы все знаете, в стране Книгерии находится самая большая в мире библиотека. В ней есть десятки тысяч книг, написанных в самые разные периоды человеческой истории.

Здесь была длинная и неинтересная история...

Книгерийский алфавит настолько большой, что его буквы обозначаются целыми положительными числами. Каждая буква алфавита бывает строчной и прописной, прописная версия буквы, соответствующей числу x, обозначается как x'. Кодировка BSCII, используемая повсеместно в Книгерии, устроена таким образом, что прописные буквы упорядочиваются в порядке увеличения числа, обозначающего букву, аналогично упорядочиваются строчные буквы, но при этом все прописные буквы алфавита следуют до всех строчных букв алфавита. Например, верны следующие утверждения: 2 < 3, 2' < 3', 3' < 2.

Слово x1, x2, ..., xa не превосходит слова y1, y2, ..., yb в лексикографическом порядке если верно одно из двух условий:

  • либо a ≤ b и x1 = y1, ..., xa = ya, то есть первое слово является префиксом второго;
  • либо есть такая позиция 1 ≤ j ≤ min(a, b), что x1 = y1, ..., xj - 1 = yj - 1 и xj < yj, то есть, в первой позиции, в которой слова отличаются, в первом слове стоит меньшая буква.

Как следствие, слово «3' 7 5» следует в лексикографическом порядке до слова «2 4' 6». Говорят, что слова в последовательности следуют в лексикографическом порядке, если каждое слово последовательности лексикографически не превосходит следующего слова в последовательности.

У Дениса есть последовательность слов, записанных строчными буквами. Денис хочет поменять некоторые буквы на прописные (такой процесс называется капитализацией) таким образом, чтобы слова стали следовать в лексикографическом порядке. Однако по некоторым причинам он столкнулся с проблемой: он не может капитализировать одну букву в конкретном слове. Единственная операция, которую он может проделать с буквой, это капитализировать все вхождения данной буквы во всех словах. Такую операцию можно проделать любое количество раз с произвольными буквами книгерийского алфавита.

Помогите Денису выбрать, какие буквы надо капитализировать, чтобы слова в заданной последовательности стали идти в лексикографическом порядке, либо определите, что это невозможно.

Обратите внимание, некоторые слова могут совпадать.

Входные данные

В первой строке даются числа n и m (2 ≤ n ≤ 100 000, 1 ≤ m ≤ 100 000) — количество слов и количество букв в книгерийском алфавите соответственно. Буквы книгерийского алфавита обозначаются целыми числами от 1 до m.

Каждая из последующих n строк содержит описание слова в формате li, si, 1, si, 2, ..., si, li (1 ≤ li ≤ 100 000, 1 ≤ si, j ≤ m), где li обозначает длину слова, а si, j задаёт последовательность букв в слове. Слова даны в порядке, в котором они идут в последовательности.

Гарантируется, что суммарная длина всех слов не превышает 100 000.

Выходные данные

В первой строке выведите «Yes» (без кавычек), если возможно капитализировать некоторое подмножество букв таким образом, чтобы последовательность слов стала отсортированной лексикографически. Иначе выведите «No» (без кавычек).

Если требуемое возможно, во второй строке выведите k — количество букв, которые надо капитализировать, а в третьей строке выведите k различных чисел — номера этих букв. Обратите внимание, минимизировать значение k не требуется.

Номера букв можно выводить в любом порядке. Если существует несколько возможных ответов, выведите любой из них.

Примечание

В первом примере слова после капитализации букв 2 и 3 выглядят следующим образом:

  • 2'
  • 1
  • 1 3' 2'
  • 1 1

Верно соотношение 2' < 1, поэтому первое слово лексикографически не превосходит второго. Второе слово является префиксом третьего, следовательно они идут в лексикографическом порядке. Так как у третьего и четвертого слов первая буква совпадает, а 3' < 1, то третье слово не превосходит четвертого лескикографически.

Во втором примере слова уже расположены в лексикографическом порядке, а значит можно не капитализировать буквы.

В третьем примере не существует набора букв, путём капитализации которых можно добиться, чтобы слова были расположены в лексикографическом порядке.

D. Оля и энергетики

графы кратчайшие пути поиск в глубину и подобное Структуры данных *2100

Оля очень любит энергетики. Настолько сильно, что её комната завалена банками от энергетиков.

Более формально, её комнату можно представить в виде прямоугольного клетчатого поля размером n × m, каждая клетка которого либо завалена банками, либо свободна.

Оля выпила много энергетика и теперь может пробегать k метров за секунду. Каждую секунду она выбирает одно из четырех направлений (вверх, вниз, влево или вправо) и пробегает в нем от 1 до k метров. Конечно, она может бежать только через свободные клетки.

Сейчас Оле нужно попасть из клетки (x1, y1) в клетку (x2, y2). Сколько секунд ей потребуется, если она будет действовать оптимально?

Гарантируется, что клетки (x1, y1) и (x2, y2) свободны. Эти клетки могут совпадать.

Входные данные

В первой строке находится три целых числа n, m и k (1 ≤ n, m, k ≤ 1000) — размеры комнаты и скорость Оли.

Далее следует n строк, каждая длиной m символов, i-я из которых содержит на j-й позиции «#», если клетка (i, j) завалена банками и «.» в противном случае.

Последняя строка содержит четыре целых числа x1, y1, x2, y2 (1 ≤ x1, x2 ≤ n, 1 ≤ y1, y2 ≤ m).

Выходные данные

Выведите одно число — минимальное время, которое понадобится Оле, чтобы попасть из (x1, y1) в (x2, y2).

Если Оля не сможет добраться из (x1, y1) в (x2, y2), выведите -1.

Примечание

В первом примере Оля должна пробежать 3 метра вправо в первую секунду, 2 метра вниз во вторую и 3 метра влево в третью.

Во втором примере Оля должна 3 секунды бежать вправо, 2 секунды вниз и 3 секунды влево.

Оля не рекомендует пить энергетики и вообще считает, что это плохо.

G. Orientation of Edges

графы поиск в глубину и подобное *1900

Vasya has a graph containing both directed (oriented) and undirected (non-oriented) edges. There can be multiple edges between a pair of vertices.

Vasya has picked a vertex s from the graph. Now Vasya wants to create two separate plans:

  1. to orient each undirected edge in one of two possible directions to maximize number of vertices reachable from vertex s;
  2. to orient each undirected edge in one of two possible directions to minimize number of vertices reachable from vertex s.

In each of two plans each undirected edge must become directed. For an edge chosen directions can differ in two plans.

Help Vasya find the plans.

Input

The first line contains three integers n, m and s (2 ≤ n ≤ 3·105, 1 ≤ m ≤ 3·105, 1 ≤ s ≤ n) — number of vertices and edges in the graph, and the vertex Vasya has picked.

The following m lines contain information about the graph edges. Each line contains three integers ti, ui and vi (1 ≤ ti ≤ 2, 1 ≤ ui, vi ≤ n, ui ≠ vi) — edge type and vertices connected by the edge. If ti = 1 then the edge is directed and goes from the vertex ui to the vertex vi. If ti = 2 then the edge is undirected and it connects the vertices ui and vi.

It is guaranteed that there is at least one undirected edge in the graph.

Output

The first two lines should describe the plan which maximizes the number of reachable vertices. The lines three and four should describe the plan which minimizes the number of reachable vertices.

A description of each plan should start with a line containing the number of reachable vertices. The second line of a plan should consist of f symbols '+' and '-', where f is the number of undirected edges in the initial graph. Print '+' as the j-th symbol of the string if the j-th undirected edge (u, v) from the input should be oriented from u to v. Print '-' to signify the opposite direction (from v to u). Consider undirected edges to be numbered in the same order they are given in the input.

If there are multiple solutions, print any of them.

C. Метро Бергорода

жадные алгоритмы математика поиск в глубину и подобное *1500

Строительство метро в Бергороде подходит к концу! Президент Берляндии решил посетить этот город и взглянуть на новое метро своими глазами.

Метро состоит из n станций. Оно построено по всем правилам Бергородского Транспортного Закона:

  1. Для каждой станции i существует ровно один поезд, идущий от этой станции. Его конечная станция — pi, возможно, что pi = i;
  2. Для каждой станции i существует ровно одна станция j такая, что pj = i.

Президент рассмотрит выгодность метро после посещения. Выгодность — это количество таких упорядоченных пар (x, y), что посетитель начнет на станции x, а после, воспользовавшись несколькими поездами (возможно нулевым количеством), прибудет на станцию y (1 ≤ x, y ≤ n).

Мэр Бергорода считает, что если выгодность метро недостаточно высока, то Президент может заменить мэра в городе (разумеется, текущий мэр не хочет, чтобы это произошло). Перед посещением Президентом города мэр успеет перестроить некоторые части метро, таким образом, изменяя значения pi для не более чем двух станций метро. Конечно, нарушать Бергородский Транспортный Закон недопустимо, поэтому метро должно подчиняться Закону и после изменений.

Мэр хочет перестроить такие части метро, чтобы выгодность метро стала максимальной возможной. Помогите ему посчитать, какую максимальную выгодность он может получить.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 100000) — количество станций.

Во второй строке записаны n целых чисел p1, p2, ..., pn (1 ≤ pi ≤ n) — текущая структура метро. Все эти числа различны.

Выходные данные

Выведите одно число — максимальное возможное значение выгодности.

Примечание

В первом примере мэр может поменять p2 на 3 и p3 на 1, тогда будет 9 пар: (1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3).

Во втором примере можно поменять p2 на 4 и p3 на 5.

D. Лень

Деревья дп Паросочетания поиск в глубину и подобное *3100

Лень — это плохо, не так ли? Поэтому мы решили приготовить задачу, чтобы наказать ленивых.

Вам дано дерево, вы должны посчитать количество способов убрать одно ребро, а затем добавить одно ребро так, чтобы получившийся граф был деревом, и в нем существовало совершенное паросочетание. Два способа считаются различными, если удаленные или добавленные ребра не совпадают. Добавленное ребро может совпадать с удаленным.

Совершенным паросочетанием называется подмножество ребер такое, что каждая вершина графа является концом ровно одного ребра.

Входные данные

Первая строка содержит одно целое число n (2 ≤ n ≤ 5·105) — количество вершин в дереве.

Каждая из следующих n - 1 строк содержит два целых числа a и b (1 ≤ a, b ≤ n) — концы ребер. Гарантируется, что заданный граф является деревом.

Выходные данные

Выведите одно целое число — ответ на задачу.

Примечание

В первом примере имеются 8 вариантов:

  • ребро между 2 и 3 заменить на ребро между 1 и 3,
  • ребро между 2 и 3 заменить на ребро между 1 и 4,
  • ребро между 2 и 3 заменить на ребро между 2 и 3,
  • ребро между 2 и 3 заменить на ребро между 2 и 4,
  • ребро между 1 и 2 заменить на ребро между 1 и 2,
  • ребро между 1 и 2 заменить на ребро между 1 и 4,
  • ребро между 3 и 4 заменить на ребро между 1 и 4,
  • ребро между 3 и 4 заменить на ребро между 3 и 4.

    C. Слух

    графы жадные алгоритмы поиск в глубину и подобное *1300

    Вова пообещал себе больше никогда не играть в игры... Но недавно компания Firestorm выпустила очень популярную игру — World of Farcraft, и Вова, конечно же, начал в неё играть.

    Он впал в ступор при выполнении очередного квеста — необходимо было прийти в поселение Надгород и распространить там слух.

    Вова знает, что в Надгороде живут n персонажей. Некоторые персонажи дружат между собой и готовы делиться информацией друг с другом. Также он знает, что i-й персонаж готов начать распространять слух за ci золота. Как только персонаж узнаёт слух, он рассказывает его всем своим друзьям, которые, в свою очередь, тоже начинают распространять этот слух (но уже бесплатно).

    Вова хочет, чтобы слух узнали все n персонажей Надгорода. За какое минимальное количество золота он сможет это сделать?

    Посмотрите примечание для лучшего понимания задачи.

    Входные данные

    В первой строке входных данных задано два целых числа n и m (1 ≤ n ≤ 105, 0 ≤ m ≤ 105) — количество людей в Надгороде и количество дружеских связей между ними.

    В следующей строке входных данных заданы n целых чисел ci (0 ≤ ci ≤ 109) — количество золота, за которое i-й персонаж готов начать распространять слух.

    В следующих m строках заданы пары (xi, yi), обозначающие, что персонажи xi и yi дружат (1 ≤ xi, yi ≤ n, xi ≠ yi). Гарантируется, что никакая пара дружащих персонажей не повторяется.

    Выходные данные

    Выведите единственное число — минимальное количество золота, за которое Вова сможет выполнить квест.

    Примечание

    В первом тестовом примере Вове выгоднее всего заплатить первому персонажу (он узнает слух и расскажет его четвёртому персонажу, который в свою очередь расскажет его пятому персонажу). Также ему будет необходимо заплатить второму и третьему персонажам, чтобы они тоже узнали слух.

    Во втором тестовом примере необходимо заплатить всем персонажам.

    В третьем тестовом примере необходимо заплатить первому, третьему, пятому, седьмому и девятому персонажам, которые расскажут слух своим друзьям.

    A. Загадка Нефлены

    Бинарный поиск поиск в глубину и подобное *1700

    Какие планы на конец света? Не занят? Не спасешь нас?

    Нефлен играет с маленькими лепреконами.

    Она даёт им бесконечный массив строк f0... ∞.

    Строка f0 — это «What are you doing at the end of the world? Are you busy? Will you save us?».

    Она хочет, чтобы как можно больше людей узнали об этом, поэтому она определяет fi =  «What are you doing while sending "fi - 1"? Are you busy? Will you send "fi - 1"?» для всех i ≥ 1.

    Например, строка f1 — это «What are you doing while sending "What are you doing at the end of the world? Are you busy? Will you save us?"? Are you busy? Will you send "What are you doing at the end of the world? Are you busy? Will you save us?"?». Обратите внимание, первые и последние кавычки не входят в строку f1.

    Нетрудно заметить, что символы в строках fi — это буквы, знаки вопроса, пробелы и, возможно, кавычки.

    Нефлена задаст лепреконам q вопросов. Каждый раз она просит их найти k-й символ строки fn. Символы в строке нумеруются, начиная с 1. Если в строке fn меньше, чем k символов, выведите «.» (без кавычек).

    Можете ли Вы ответить на её вопросы?

    Входные данные

    В первой строке задано одно целое число q (1 ≤ q ≤ 10) — количество вопросов Нефлены.

    Каждая из следующих q строк описывает вопрос Нефлены и содержит два целых числа n и k (0 ≤ n ≤ 105, 1 ≤ k ≤ 1018).

    Выходные данные

    Выведите строку из q символов, где i-й символ — это ответ на запрос с номером i.

    Примечание

    Для первых двух тестовых примеров f0 и f1 приведены в условии выше.

    E. Интересный граф и яблоки

    графы поиск в глубину и подобное снм *2300

    Хексадесимал очень любит рисовать. Её перу принадлежит большая коллекция графов, как ориентированных, так и не очень. Недавно она начала работу над натюрмортом «интересный граф и яблоки». Интересным считается такой неориентированный граф, у которого каждая вершина принадлежит только одному циклу: забавному кольцу, и, причём, не принадлежит никакому другому циклу. Забавное кольцо — это такой цикл, который проходит через все вершины графа ровно один раз. Также, к забавным циклам относятся петли.

    Яблоки она уже нарисовала и некоторые рёбра в графе тоже. Но теперь стало непонятно, как же соединить оставшиеся вершины, чтобы получился в результате интересный граф? Ответ должен содержать наименьшее количество добавляемых рёбер. И, помимо всего прочего, ответ должен быть лексикографически наименьшим. Набор ребер (x1, y1), (x2, y2), ..., (xn, yn), где xi ≤ yi, лексикографически меньше набора (u1, v1), (u2, v2), ..., (un, vn), где ui ≤ vi, в том случае, если последовательность целых чисел x1, y1, x2, y2, ..., xn, yn лексикографически меньше последовательности u1, v1, u2, v2, ..., un, vn. Если Вы не справитесь, Хексадесимал Вас съест. Живьём.

    Входные данные

    В первой строке входных данных записана пара целых чисел n и m (1 ≤ n ≤ 50, 0 ≤ m ≤ 2500) — количество вершин и количество рёбер соответственно. В следующих строках записаны пары чисел xi и yi (1 ≤ xi, yi ≤ n) — вершины, между которыми уже проведены рёбра. Исходный граф может содержать кратные ребра и петли.

    Выходные данные

    В первой строке выведите слово «YES» или «NO»: можно или нет построить интересный граф. Если ответ «YES», то во второй строке выведите k — количество рёбер, которые нужно добавить к исходному графу. И, наконец, выведите k строк: пары вершин xj и yj, между которыми нужно провести рёбра. Результат может содержать кратные рёбра и петли. k может быть равно нулю.

    C. Двудольные отрезки

    Бинарный поиск графы поиск в глубину и подобное снм Структуры данных *2300

    Дан неориентированный граф на n вершинах, в котором нет реберно-простых циклов четной длины (циклов четной длины, которые не проходят по одному ребру два раза). Будем считать, что вершины графа пронумерованы целыми числами от 1 до n.

    Требуется ответить на q запросов. Каждый запрос задается отрезком вершин [l; r], требуется посчитать количество его подотрезков [x; y] (l ≤ x ≤ y ≤ r) таких, что граф, в котором оставили только вершины из отрезка [x; y] (включая и x, и y) и ребра между этими вершинами, является двудольным.

    Входные данные

    В первой строке находятся два целых числа n и m (1 ≤ n ≤ 3·105, 1 ≤ m ≤ 3·105) — количество вершин и ребер графа.

    Следующие m строк содержат информацию о ребрах графа. В i-й из этих строк содержится два целых числа ai, bi, (1 ≤ ai, bi ≤ n; ai ≠ bi), обозначающие ребро между вершинами ai и bi. Гарантируется, что в данном графе нет реберно-простых циклов четной длины.

    Следующая строка содержит одно целое число q (1 ≤ q ≤ 3·105) — количество запросов.

    Следующие q строк содержат запросы. В i-й из этих строк содержится два целых числа li, ri (1 ≤ li ≤ ri ≤ n) — параметры запроса.

    Выходные данные

    Выведите q чисел, каждое в новой строке: i-е из них равно количеству таких подотрезков [x; y] (li ≤ x ≤ y ≤ ri), что граф, в котором оставили только вершины из отрезка [x; y] и ребра между этими вершинами, является двудольным.

    Примечание

    Первый пример расположен на следующей картинке:

    На первый запрос подходят все подотрезки отрезка [1; 3], кроме него самого.

    На второй запрос подходят все подотрезки отрезка [4; 6], кроме него самого.

    На третий запрос подходят все подотрезки отрезка [1; 6], кроме [1; 3], [1; 4], [1; 5], [1; 6], [2; 6], [3; 6], [4; 6].

    Второй пример расположен на следующей картинке:

    D. Взвешивание графа

    графы Конструктив поиск в глубину и подобное *2700

    Задан cвязный неориентированный граф, состоящий из n вершин и m ребер. Будем считать, что вершины графа пронумерованы целыми числами от 1 до n.

    Вам даны n целых чисел c1, c2, ..., cn, каждое из них находится в пределах от  - n до n, включительно. Также гарантируется, что четность cv совпадает с четностью степени вершины v. Степенью вершины называется число входящих в нее ребер.

    В задаче вам требуется поставить каждому ребру вес — целое число от  - 2·n2 до n2 (включительно) так, чтобы для каждой вершины v сумма весов входящих в нее ребер была равна cv, или сообщить, что это невозможно.

    Входные данные

    В первой строке находится два целых числа n, m (2 ≤ n ≤ 105, n - 1 ≤ m ≤ 105) — число вершин и ребер графа.

    В следующей строке следуют n целых чисел c1, c2, ..., cn ( - n ≤ ci ≤ n), где ci обозначает желаемую сумму весов ребер, инцидентных вершине i. Гарантируется, что четность ci совпадает с четностью степени вершины i.

    Следующие m строк содержат информацию о ребрах графа. В i-й из этих строк содержится два целых числа ai, bi, (1 ≤ ai, bi ≤ n; ai ≠ bi), обозначающие, что i-е ребро соединяет вершины ai и bi.

    Гарантируется, что граф связен и не содержит петель и кратных ребер.

    Выходные данные

    Если решения нет, то выведите «NO».

    Иначе, выведите «YES» и m строк, в i-й из этих строк должно содержаться одно целое число wi ( - 2·n2 ≤ wi ≤ 2·n2) – вес i-го ребра.

    B. Красим дерево

    жадные алгоритмы поиск в глубину и подобное снм *1200

    Задано корневое дерево, состоящее из n вершин. Будем считать, что вершины дерева пронумерованы целыми числами от 1 до n. Корнем дерева является вершина с номером 1.

    Каждая вершина дерева имеет определенный цвет, цвет вершины v будем обозначать cv, изначально cv = 0.

    В задаче вам требуется раскрасить дерево в заданные цвета с помощью минимального числа действий. За одно действие вы можете выбрать вершину v и цвет x, и покрасить все вершины поддерева v (включая v) в цвет x, то есть для всех вершин u таких, что путь от корня до u содержит вершину v, сделать cu = x.

    Гарантируется, что все вершины надо покрасить в цвет, отличный от 0.

    Определение корневого дерева можно прочитать по ссылке: https://ru.wikipedia.org/wiki/Дерево_(теория_графов).

    Входные данные

    В первой строке находится одно целое число n (2 ≤ n ≤ 104) — число вершин дерева.

    В следующей строке следуют n - 1 целых чисел p2, p3, ..., pn (1 ≤ pi < i), где pi обозначает, что существует ребро в графе между вершинами i и pi.

    В следующей строке следуют n целых чисел c1, c2, ..., cn (1 ≤ ci ≤ n), где ci обозначает желаемый цвет вершины i.

    Гарантируется, что заданный граф является деревом.

    Выходные данные

    На первой и единственной строке выведите одно целое число — минимальное число действий, за которое можно покрасить дерево в желаемые цвета.

    Примечание

    Первый пример расположен на следующей картинке (числа обозначают номера вершин):

    Первым действием мы красим все вершины поддерева вершины 1 в цвет 2 (числа обозначают цвета):

    Вторым действием мы красим все вершины поддерева вершины 5 в цвет 1:

    Третьим действием мы красим все вершины поддерева вершины 2 в цвет 1:

    Второй пример расположен на следующей картинке (числа обозначают номера вершин):

    Первым действием мы красим все вершины поддерева вершины 1 в цвет 3 (числа обозначают цвета):

    Вторым действием мы красим все вершины поддерева вершины 3 в цвет 1:

    Третьим действием мы красим все вершины поддерева вершины 6 в цвет 2:

    Четвертым действием мы красим все вершины поддерева вершины 4 в цвет 1:

    Пятым действием мы красим все вершины поддерева вершины 7 в цвет 3:

    E. Сопроцессор

    графы дп жадные алгоритмы поиск в глубину и подобное *1900

    Вам дана программа, состоящая из набора задач. Задачи организованы в ориентированный ациклический граф зависимостей: каждая задача может зависеть от результатов выполнения одной или нескольких других задач, и в графе нет ориентированных циклических зависимостей между задачами. Задача может быть выполнена только после завершения всех задач, от которых она зависит.

    Некоторые задачи в графе должны выполняться на сопроцессоре, остальные — только на главном процессоре. За один вызов сопроцессора вы можете передать ему список задач, которые должны выполниться на нем. Для каждой задачи из списка все задачи, от которых она зависит, должны быть либо уже выполнены на момент вызова сопроцессора, либо находиться в этом же списке. Главный процессор начинает выполнение программы и автоматически получает результаты выполнения задач от сопроцессора.

    Найдите минимальное количество вызовов сопроцессора, необходимых для выполнения программы.

    Входные данные

    Первая строка входных данных содержит два целых числа, разделенных пробелом: N (1 ≤ N ≤ 105) — общее количество задач и M (0 ≤ M ≤ 105) — общее количество зависимостей между задачами.

    Вторая строка содержит N целых чисел , разделенных пробелами. Если Ei = 0, задача i должна выполняться на главном процессоре, иначе — на сопроцессоре.

    Следующие M строк описывают зависимости между задачами. Каждая строка содержит два целых числа, разделенных пробелами, T1 и T2 и означает, что задача T1 зависит от задачи T2 (T1 ≠ T2). Задачи пронумерованы от 0 до N - 1. Все M пар (T1, T2) различны. Гарантируется, что циклических зависимостей между задачами нет.

    Выходные данные

    Выведите одно число — минимальное количество вызовов сопроцессора, необходимых для выполнения программы.

    Примечание

    В первом примере задачи 1 и 3 должны выполняться на сопроцессоре. Граф зависимостей линейный, и задачи должны выполняться в порядке 3 -> 2 -> 1 -> 0. Необходимо два вызова сопроцессора: за первый вызов выполняется задача 3, затем выполняется задача 2 на главном процессоре, за второй вызов выполняется задача 1 и наконец выполняется задача 0 на главном процессоре.

    Во втором примере задачи 0, 1 и 2 должны выполняться на сопроцессоре. У задач 1 и 2 нет зависимостей, а задача 0 зависит только от задач 1 и 2, поэтому все три задачи 0, 1 и 2 можно выполнить за один вызов сопроцессора. После этого задача 3 выполняется на главном процессоре.

    A. Путь домой

    дп жадные алгоритмы поиск в глубину и подобное реализация *800

    Лягушка живет на координатной прямой Ox и должна добраться домой в точку n из точки 1. Она может прыгать вправо на расстояние не более чем d. Таким образом, после прыжка из x она перемещается в точку x + a, где a — целое число от 1 до d.

    Для каждой точки от 1 до n известно, есть ли в ней лилия. Лягушка может прыгать только по лилиям. Гарантируется, что в точках 1 и n лилии обязательно есть.

    Определите минимальное количество прыжков, которые нужны сделать лягушке, чтобы попасть из точки 1 домой в точку n. Считайте, что изначально лягушка находится в точке 1. Если лягушка не может добраться домой, то выведите -1.

    Входные данные

    В первой строке записаны два целых числа n и d (2 ≤ n ≤ 100, 1 ≤ d ≤ n - 1) — точка, в которую лягушка хочет попасть, и максимальная длина прыжка лягушки.

    Во второй строке записана строка s длины n, состоящая из нулей и единиц. Если очередной символ строки s равен нулю, то в соответствующей точке нет лилии, в противном случае, в соответствующей точке лилия есть. Гарантируется, что первый и последний символы строки s равны единице.

    Выходные данные

    Если лягушка не сможет попасть домой, выведите -1.

    В противном случае, выведите минимальное количество прыжков, которые нужно сделать лягушке, чтобы попасть из точки 1 в точку n.

    Примечание

    В первом примере лягушка может добраться до дома за два прыжка: первый прыжок из точки 1 в точку 4 (длина прыжка равна трём), а второй прыжок из точки 4 в точку 8 (длина прыжка равна четырём).

    Во втором примере лягушка не сможет добраться до дома, так как ей нужно для этого прыгнуть на расстояние три, а максимальная длина её прыжка равна двум.

    F. Разрушение дерева

    графы Деревья жадные алгоритмы Конструктив поиск в глубину и подобное *2400

    Задано невзвешенное дерево с n вершинами. С ним производят n - 1 операцию. Каждая из операций состоит в следующем:

    1. выбирается два листа в дереве;
    2. к ответу добавляется длина простого пути между этими листами;
    3. выбирается один из этих двух листов и удаляется из дерева.

    До проведения операций ответ равен 0. Очевидно, что после n - 1 проведённой операции в дереве останется одна вершина.

    Вам необходимо посчитать, какого максимального ответа можно добиться, если действовать оптимально, и вывести, каким образом необходимо действовать.

    Входные данные

    В первой строке задано одно целое число n (2 ≤ n ≤ 2·105) — количество вершин в дереве.

    В следующих n - 1 строках заданы рёбра дерева в формате ai, bi (1 ≤ ai, bi ≤ n, ai ≠ bi). Гарантируется, что заданный граф является деревом.

    Выходные данные

    В первой строке выведите одно целое число — максимальный ответ, которого можно достигнуть.

    В следующих n - 1 строках выведите действия в порядке их совершения в формате ai, bi, ci, где ai, bi — пара листов, выбранных на текущем шаге (1 ≤ ai, bi ≤ n), ci (1 ≤ ci ≤ n, ci = ai или ci = bi) — выбранный лист, который удаляется на текущем шаге.

    Посмотрите в примеры для лучшего понимания.

    E. Простой подарок

    meet-in-the-middle Бинарный поиск математика поиск в глубину и подобное теория чисел *2400

    — Мужик, у тебя простые числа есть?

    — Нету.

    — На, мужик, простые числа.

    Пингвин

    В отличие от Гриши, который вел себя хорошо, Олег за весь год так и не научился решать задачи на теорию чисел. Поэтому вместо Деда Мороза к нему пришел его сокомандник Андрей и торжественно вручил ему множество из n различных простых чисел вместе с простой задачей: Олегу необходимо найти k-е в порядке возрастания положительное целое число, среди простых делителей которого встречаются числа только из этого множества.

    Входные данные

    В первой строке задано целое число n (1 ≤ n ≤ 16) — количество чисел во множестве.

    Во второй строке n различных простых чисел p1, p2, ..., pn (2 ≤ pi ≤ 100) — числа во множестве. Гарантируется, что числа идут в порядке возрастания.

    В третьей строке задано число k (1 ≤ k). Гарантируется, что k-е в порядке возрастания положительное целое число, среди простых делителей которого встречаются числа только из данного множества не превосходит 1018.

    Выходные данные

    Выведите k-е в порядке возрастания число, удовлетворяющее условию. Гарантируется, что оно не превосходит 1018.

    Примечание

    Для первого примера последовательность с простыми делителями из набора {2, 3, 5} выглядит так:

    (1, 2, 3, 4, 5, 6, 8, ...)

    Седьмым по счету числом (в 1-индексации) как раз и будет восьмерка.

    D. Почти ацикличный граф

    графы поиск в глубину и подобное *2200

    Задан ориентированный граф, состоящий из n вершин и m ребер (рёбра являются направленными, т. е. по каждому ребру можно проходить только в одном направлении). Разрешается удалить не более одного ребра из него.

    Можно ли сделать этот граф ацикличным, совершив такую операцию? Граф называется ацикличным, если в нём не существует циклов (цикл — непустой путь, начинающийся и заканчивающийся в одной и той же вершине).

    Входные данные

    В первой строке записаны два целых числа n и m (2 ≤ n ≤ 500, 1 ≤ m ≤ min(n(n - 1), 100000)) — количество вершин и ребер, соответственно.

    Затем идут m строк. В каждой записаны по два целых числа u и v, задающие ориентированное ребро из вершины u в вершину v (1 ≤ u, v ≤ n, u ≠ v). Каждая упорядоченная пара (u, v) встречается не более одного раза (существует не более одного ориентированного ребра из u в v).

    Выходные данные

    Если возможно сделать граф ацикличным, удалив не более одного ребра, то выведите YES. В противном случае выведите NO.

    Примечание

    В первом примере можно удалить ребро , и граф станет ацикличным.

    Во втором примере необходимо удалить не менее двух ребер (например, и ), чтобы сделать граф ацикличным.

    B. Безумная Макс

    графы дп игры поиск в глубину и подобное *1700

    Как мы все знаем, Макс лучше всех играет в компьютерные игры. Ее друзья настолько ей завидуют, что придумали игру в реальном мире, чтобы показать, что она не во всех играх лучшая. Игра проходит на ориентированном ациклическом графе с n вершинами и m ребрами. На каждом ребре написан символ — строчная латинская буква.

    Играют Макс и Лукас. Первой ходит Макс, потом ходит Лукас, затем снова Макс и так далее. У каждого игрока есть камешек, изначально расположенный в некоторой вершине. Каждый игрок в свой ход должен передвинуть свой камешек вдоль одного ребра (игрок может передвинуть камешек из вершины v в вершину u, если есть ребро из вершины v в u). Если игрок передвигает камешек из вершины v в вершину u, то «символом» этого раунда называется символ, написанный на ребре из v в u. Есть одно дополнительное правило: ASCII код символа раунда i должен быть не меньше, чем ASCII код символа раунда i - 1 (для i > 1). Раунды нумеруются для всех игроков вместе, иными словами, Макс ходит в нечетных раундах, в Лукас — в четных. Игрок, который не может сделать ход, проигрывает. Камешки могут находиться в одной вершине в одно и то же время.

    Поскольку игра занимает некоторое время, а Лукас и Макс должны найти Дарта, у них нет времени для игр. Они спрашивают у вас, кто выиграет, если оба будут играть оптимально?

    Вам необходимо определить победителя в игре для всех возможных начальных позиций камешков.

    Входные данные

    Первая строка содержит два целых числа n и m (2 ≤ n ≤ 100, ).

    Следующие m строк содержат ребра. Каждая строка содержит два целых числа v, u и строчную латинскую букву c (1 ≤ v, u ≤ n, v ≠ u), которые означают, что есть ребро из вершины v в u, и на нем написана буква c. Между каждой парой вершин есть не более одного ребра. Гарантируется, что в графе нет циклов.

    Выходные данные

    Выведите n строк, в каждой по n символов. j-й символ в i-й строке должен быть «A», если Макс побеждает в игре, где ее камешек изначально в вершине i, а камешек Лукаса — в вершине j, и «B» иначе.

    Примечание

    Граф из первого примера показан на рисунке ниже:

    Граф из второго примера показан на рисунке ниже:

    D. Подстрока

    графы дп поиск в глубину и подобное *1700

    Дан граф из \(n\) вершин и \(m\) ориентированных ребер. В каждой вершине записана некоторая строчная латинская буква. Определим величину пути как наибольшее количество раз, которое какая-то буква встречалась на этом пути. Например, если буквы на пути образуют строку «abaca», то величина этого пути равна \(3\). Ваша задача — найти путь с наибольшей величиной.

    Входные данные

    Первая строка содержит два целых числа \(n, m\) (\(1 \leq n, m \leq 300\,000\)), означающих, что в графе \(n\) вершин и \(m\) ориентированных ребер.

    Вторая строка содержит строку \(s\), состоящую только из строчных латинских букв. Символ номер \(i\) — это буква, записанная в вершине номер \(i\).

    Далее следуют \(m\) строк. Каждая из этих строк содержит два целых числа \(x, y\) (\(1 \leq x, y \leq n\)), описывающих ориентированное ребро из \(x\) в \(y\). Обратите внимание, \(x\) может быть равно \(y\), и могут быть несколько ребер между \(x\) и \(y\). Кроме того, граф может быть несвязным.

    Выходные данные

    Выведите одно число — максимальную величину пути. Если существуют пути со сколь угодно большой величиной, выведите -1.

    Примечание

    В первом примере путь с максимальной величиной — это \(1 \to 3 \to 4 \to 5\). Величина этих путей равна \(3\), т. к. буква «a» встречается \(3\) раза.

    C. Обмен соседних элементов

    жадные алгоритмы математика поиск в глубину и подобное сортировки *1400

    Задан массив a, состоящий из n элементов. Каждое число от 1 до n встречается в этом массиве ровно один раз.

    Для некоторых позиций i (1 ≤ i ≤ n - 1) разрешается поменять местами i-й элемент и (i + 1)-й, для остальных запрещается. Можно совершать произвольное количество операций в любом порядке. Можно менять местами i-й элемент и (i + 1)-й произовольное количество раз (если позиция разрешена).

    Можно ли привести массив к отсортированному в возрастающем порядке при помощи таких операций?

    Входные данные

    В первой строке записано одно целое число n (2 ≤ n ≤ 200000) — количество чисел в массиве.

    Во второй строке записаны n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 200000) — элементы массива. Каждое число от 1 до n встречается в нем ровно один раз.

    Третья строка состоит из n - 1 символа, каждый символ — либо 0, либо 1. Если i-й символ равен 1, то разрешается менять местами i-й элемент и (i + 1)-й любое количество раз, в противном случае i-й элемент и (i + 1)-й менять местами запрещено.

    Выходные данные

    Если возможно отсортировать массив в возрастающем порядке с помощью любой последовательности операций, то выведите YES. В противном случае выведите NO.

    Примечание

    В первом примере можно поменять местами a3 и a4, потом a4 и a5.

    E. Связные компоненты?

    графы поиск в глубину и подобное снм Структуры данных *2100

    Дан неориентированный граф, состоящий из n вершин и ребер. Вместо того, чтобы задавать ребра, которые присутствуют в графе, мы даем m неупорядоченных пар (x, y) таких, что между вершинами x и y не существует ребра, и если пара вершин не встречается во входных данных, то в графе есть ребро между ними.

    Необходимо найти количество связных компонент в графе и размер каждой компоненты. Связная компонента — это такой набор вершин X, что для любой пары вершин в компоненте существует хотя бы один путь, соединяющий их, и добавление любой новой вершины в X нарушает это правило.

    Входные данные

    В первой строке записаны два целых числа n и m (1 ≤ n ≤ 200000, ).

    Затем идут m строк, каждая содержит пару целых чисел x и y (1 ≤ x, y ≤ n, x ≠ y), означающую, что не существует ребра между x и y. Каждая пара присутствует во входных данных не более одного раза; (x, y) и (y, x) считаются одинаковыми (они так же никогда не встретятся одновременно в одном тесте). Если какая-то пара вершин не упомянута, то между этими вершинами есть ребро.

    Выходные данные

    Сначала выведите k — количество связных компонент в графе.

    Затем выведите k чисел — размеры компонент. Эти числа должны идти в неубывающем порядке.

    A. Необычная яблоня

    графы Деревья поиск в глубину и подобное *1500

    У Аркадия в саду есть одна необычная яблоня, с которой иногда необходимо собирать яблоки. Так как яблоня необычная, на ней есть n соцветий, они пронумерованы от 1 до n. Соцветие номер 1 находится около корня дерева, любое другое соцветие с номером i (i > 1) расположено на верхнем конце ветки, нижний конец которой расположен в соцветии pi, при этом pi < i.

    Когда яблоки созревают, одновременно появляется ровно по одному яблоку в каждом соцветии. В тот же момент все яблоки начинают скатываться вниз по веткам к корню дерева. Каждую секунду все яблоки, кроме находящегося в первом соцветии, одновременно скатываются на одну ветку ближе к корню, то есть, например, из соцветия a яблоко попадет в соцветие pa. Яблоки, находившиеся в первом соцветии, забирает Аркадий. Яблоня необычная, поэтому, если в какой-то момент в одном соцветии оказываются два яблока, они аннигилируют. Так происходит с каждой парой, например, если в соцветие попадет одновременно 5 яблок, то останется только одно яблоко, а если в соцветие попадет одновременно 8 яблок, то не останется ни одного яблока. Таким образом, в каждом соцветии в любой момент времени находится не более одного яблока.

    Помогите Аркадию, подсчитайте, сколько яблок он сможет забрать из первого соцветия за один урожай.

    Входные данные

    В первой строке следует целое число n (2 ≤ n ≤ 100 000) — количество соцветий.

    Во второй строке следует последовательность целых чисел p2, p3, ..., pn (1 ≤ pi < i), состоящая из n - 1 числа, где pi равно номеру соцветия, в которое скатывается яблоко из соцветия i.

    Выходные данные

    Выведите количество яблок, которые Аркадий сможет забрать из первого соцветия за один урожай.

    Примечание

    В первом примере Аркадий соберет всего одно яблоко, которое изначально находилось в соцветии номер 1. Через секунду в это соцветие попадёт еще два яблока из соцветий 2 и 3, но они аннигилируют между собой и Аркадий не сможет собрать ни одно из них.

    Во втором примере Аркадий соберет три яблока. Первым он соберет то яблоко, которое изначально находится в соцветии один. Через секунду в соцветие 1 попадет яблоко из соцветия 2 (которое Аркадий тоже соберет), а в соцветия 2 попадут три яблока из соцветий 3, 4 и 5, два из которых аннигилируют между собой, и в соцветии 2 останется всего одно яблоко, которое еще через секунду попадёт в соцветие 1, и Аркадий его соберёт.

    B. Рекурсивные запросы

    Бинарный поиск поиск в глубину и подобное Структуры данных *1300

    Определим две функции f и g от натурального числа.

    Вам необходимо обработать Q запросов. В каждом запросе вам будет дано три целых числа l, r и k. Вам необходимо вывести количество чисел x, лежащих между l и r включительно таких, что g(x) = k.

    Входные данные

    В первой строке содержится целое число Q (1 ≤ Q ≤ 2 × 105) — количество запросов.

    В следующих Q строках содержатся описания запросов. В каждой из этих строк содержатся 3 целых числа l, r и k (1 ≤ l ≤ r ≤ 106, 1 ≤ k ≤ 9).

    Выходные данные

    Для каждого запроса выведите ответ на него в отдельной строке.

    Примечание

    В первом тестовом примере:

    • g(33) = 9 так как g(33) = g(3 × 3) = g(9) = 9
    • g(47) = g(48) = g(60) = g(61) = 6
    • Между 47 и 55 подходящих чисел нет.
    • g(4) = g(14) = g(22) = g(27) = g(39) = g(40) = g(41) = g(58) = 4

    E. Фафа и древняя математика

    Деревья дп поиск в глубину и подобное *2300

    Известно, что древние Египтяне были сильными математиками. Древнеегипетский математик Ахмес любил писать некие арифметические выражения на листе папируса, которые он называл Ахмесовы арифметические выражения.

    Ахмесово арифметическое выражение можно определить как:

    • «d» является Ахмесовым арифметическим выражением, где d — это положительное число, состоящее из одной цифры;
    • «(E1opE2)» является Ахмесовым арифметическим выражением, где E1 и E2 — корректные Ахмесовы арифметические выражения (без пробелов) и op это плюс ( + ) или минус ( - ).
    Например 5, (1-1) и ((1+(2-3))-5) — корректные Ахмесовы арифметические выражения.

    Во время своей поездки в Египет, Фафа нашел кусочек папирусной бумаги, на которой было написано одно из корректных Ахмесовых арифметических выражений. Кусочек папируса очень состарился и все операции стерлись, оставив только числа и скобки. Так как Фафа любит математику, он решил бросить себе вызов следующей задачей.

    Дано количество операций плюс и минус в исходном выражении, найдите максимальное возможное значение выражения, поставив плюсы и минусы вместо стертых операций.

    Входные данные

    Первая строка содержит строку E (1 ≤ |E| ≤ 104) — корректное Ахмесово арифметическое выражение. Все операции стерлись и заменились на «?».

    Вторая строка содержит два разделенных пробелами числа P и M (0 ≤ min(P, M) ≤ 100) — количество операций плюс и минус, соответственно.

    Гарантируется, что P + M =  количество стертых операций.

    Выходные данные

    Выведите одну строку, содержащую ответ на задачу.

    Примечание
    • Ответом на первый тест из условия будет (1 + 1)  =  2.
    • Ответом на второй тест из условия будет (2 + (1 - 2))  =  1.
    • Ответом на третий тест из условия будет ((1 - (5 - 7)) + ((6 + 2) + 7))  =  18.
    • Ответом на четвертый тест из условия будет ((1 + (5 + 7)) - ((6 - 2) - 7))  =  16.

    D. Сонная игра

    графы игры поиск в глубину и подобное *2100

    Петя и Вася договорились сыграть в свою любимую игру. Игра проходит по следующим правилам. У игроков есть ориентированный граф с n вершинами и m рёбрами, в одной из вершин которого стоит фишка. Изначально она находится в вершине s. Игроки по очереди перемещают фишку, за каждый ход передвигая её вдоль ребра графа. Первым ходит Петя. Игрок, который не может совершить ход, проигрывает. Если игра продолжается 106 ходов, объявляется ничья.

    В ночь перед игрой Васе нужно было выполнить большую лабораторную работу по предмету «Орфография и части речи», поэтому, как только началась игра, он уснул. Петя решил воспользоваться ситуацией и делать ходы как за себя, так и за Васю.

    Помогите Пете понять, может ли он выиграть, или хотя бы сыграть вничью.

    Входные данные

    В первой строке входных данных содержатся два целых числа n и m — число вершин и число рёбер в графе соответственно (2 ≤ n ≤ 105, 0 ≤ m ≤ 2·105).

    В следующих n строках содержится информация о рёбрах графа. В i-й строке (1 ≤ i ≤ n) записано целое неотрицательное число ci — количество вершин, в которые есть рёбра из вершины i, а затем ci различных целых чисел ai, j — номера этих вершин (1 ≤ ai, j ≤ n, ai, j ≠ i).

    Гарантируется, что сумма всех ci равна m.

    В следующей строке содержится номер вершины s — изначальной позиции фишки (1 ≤ s ≤ n).

    Выходные данные

    Если Петя может выиграть, в первой строке выведите «Win». В следующей строке выведите числа v1, v2, ..., vk (1 ≤ k ≤ 106) — последовательность вершин, которые должен посетить Петя для победы. Вершина v1 должна совпадать с s. Для i = 1... k - 1 в графе должно быть ребро из вершины vi в вершину vi + 1. Последовательность должна быть такова, что из вершины vk нет хода, и при такой игре проигрывает именно Вася, а не Петя.

    Если Петя не может выиграть, но может сыграть вничью, в единственной строке выведите «Draw». Иначе выведите «Lose».

    Примечание

    В первом примере игра происходит на следующем графе:

    Изначально фишка находится в вершине 1. Первым ходом Петя передвигает фишку в вершину 2, затем он ходит за Васю в вершину 4. После чего опять за себя в вершину 5. Теперь ход Васи, но ему некуда ходить, поэтому Петя выиграл.

    Во втором примере игра происходит на следующем графе:

    Изначально фишка находится в вершине 2. Петя может сходить только в вершину 1. После этого он вынужден сходить за Васю в вершину 3. Теперь ход Пети, но ему некуда ходить, поэтому Петя проиграл.

    В третьем примере игра происходит на следующем графе:

    Петя не может выиграть, но может совершать ходы по циклу, поэтому партия закончится вничью.

    D. Спасение любви

    графы жадные алгоритмы поиск в глубину и подобное снм Строки *1600

    Валя и Толя — идеальная пара, но даже у них бывают ссоры. Недавно Валя обиделась на своего кавалера, так как он пришел к ней в футболке, надпись на которой отличается от надписи на ее свитере. Теперь она не хочет с ним видеться, а Толя сидит целыми днями в своей комнате и плачет над ее фотографиями.

    Эта история так и осталась бы такой печальной, если бы в нее не вмешалась добрая швея-волшебница (бабушка Толи). Ее сердце разрывается, когда она видит молодых людей в ссоре, и поэтому она срочно хочет все исправить. Бабушка уже тайно забрала Валин свитер и Толину футболку, осталось только сделать надписи на них одинаковыми. Для этого она может за одну единицу маны купить заклинание, которое позволяет менять некоторые буквы на одежде. Ваша задача — рассчитать, какое минимальное количество маны придется потратить бабушке Толи для спасения любви молодых людей.

    Более формально, надписи на Валином свитере и Толиной футболке — это две строчки одинаковой длины n, состоящие только из строчных букв латинского алфавита. За одну единицу маны бабушка может купить заклинание вида (c1, c2) (где c1 и c2 — произвольные строчные буквы латинского алфавита), с помощью которого она может сколько угодно раз менять букву c1 на c2 (и наоборот) как на Валином свитере, так и на Толиной футболке. Вам требуется найти минимальное количество маны, позволяющее приобрести набор заклинаний, с помощью которого можно сделать надписи одинаковыми. Также вам необходимо вывести соответствующий набор заклинаний.

    Входные данные

    В первой строке дано единственное число n (1 ≤ n ≤ 105) — длина надписей.

    Во второй строке дана строка длины n, состоящая только из маленьких букв латинского алфавита — надпись на Валином свитере.

    В третьей строке в таком же формате задана надпись на Толиной футболке.

    Выходные данные

    В первой строке выведите одно целое число — минимальное количество маны t для спасения любви молодых.

    В следующих t строках выведите по две строчные буквы латинского алфавита через пробел — заклинания, которые нужно приобрести бабушке Толи. Заклинания и буквы в заклинаниях можно выводить в любом порядке.

    Если оптимальных ответов несколько, выведите любой.

    Примечание

    В первом примере достаточно купить два заклинания: («a»,«d») и («b»,«a»). Тогда первые буквы совпадут, когда мы поменяем букву «a» на «d». Вторые совпадут, когда поменяем «b» на «a». Третьи совпадут, когда поменяем сначала «b» на «a», потом «a» на «d».

    A. Защитить овец

    графы Перебор поиск в глубину и подобное реализация *900

    Боб — пастух. Он пасет своих овец на большом пастбище. Недавно волки утащили нескольких из его овец. Поэтому он решил обзавестись несколькими собаками-пастухами, которые будут защищать всех его овец.

    Пастбище можно представить как прямоугольник из R × C клеток. Каждая клетка либо пустая, либо содержит овцу, волка или собаку. Овцы и собаки не могут двигаться, однако волки могут перемещаться по пастбищу свободно, каждый раз перемещаясь влево, вправо, вверх или вниз в соседнюю клетку. Если волк доберется до клетки с овцой, он съест ее. Однако волк не может зайти в клетку, где находится собака.

    Изначально собак нет. Расположите собак на пастбище так, чтобы никакой волк не мог бы добраться до никакой овцы, или определите, что это невозможно. Обратите внимание на то, что у вас достаточно собак, поэтому вам не нужно минимизировать их количество.

    Входные данные

    Первая строка содержит два целых числа R (1 ≤ R ≤ 500) и C (1 ≤ C ≤ 500) — число строк и число столбцов на пастбище, соответственно.

    Каждая из следующих R строк содержит строку, состоящую из ровно C символов и описывающую одну строку пастбища. Здесь «S» означает клетку с овцой, «W» означает клетку с волком, а «.» означает пустую клетку.

    Выходные данные

    Если невозможно защитить всех овец, выведите одну строчку со словом «No».

    Иначе выведите одну строку со словом «Yes». Затем выведите R строк, описывающих пастбище после того, как вы расставили собак. Как и во входных файлах, «S» означает клетку с овцой, «W» означает клетку с волком, «D» — собаку, а «.» — пустую клетку. Вы не можете перемещать, добавлять или удалять волков или овец.

    Если существует несколько решений, выведите любое из них. Вам не обязательно минимизировать число собак.

    Примечание

    В первом примере можно разбить пастбище собаками на две половины, в одной из которых находятся овцы, а в другой — волки. Обратите внимание на то, что овца в клетке (2,1) находится в безопасности, так как волки не могут двигаться по диагонали.

    Во втором примере нет мест, куда можно было бы добавить собаку для защиты единственной овцы.

    В третьем примере нет волков, поэтому задача очень проста. Мы посадили одну собаку в центр, чтобы она олицетворяла собой безопасность, однако решение без нее тоже верно.

    C. Обновление дата-центров

    графы поиск в глубину и подобное *1900

    У компании BigData Inc. есть n дата-центров, пронумерованных от 1 до n, расположенных по всему миру. В этих дата-центрах хранятся данные клиентов компании (как можно догадаться из названия — большие данные!)

    Основой предлагаемых компанией BigData Inc. услуг является гарантия возможности работы с пользовательскими данными даже при условии выхода какого-либо из дата-центров компании из доступности. Подобная гарантия достигается путём использования двойной репликации данных. Двойная репликация — это подход, при котором любые данные хранятся в двух идентичных копиях в двух различных дата-центрах.

    Про каждого из m клиентов компании известны номера двух различных дата-центров ci, 1 и ci, 2, в которых хранятся его данные.

    Для поддержания работоспособности дата-центра и безопасности данных программное обеспечение каждого дата-центра требует регулярного обновления. Релизный цикл в компании BigData Inc. составляет один день, то есть новая версия программного обеспечения выкладывается на каждый компьютер дата-центра каждый день.

    Обновление дата-центра, состоящего из множества компьютеров, является сложной и длительной задачей, поэтому для каждого дата-центра выделен временной интервал длиной в час, в течение которого компьютеры дата-центра обновляются и, как следствие, могут быть недоступны. Будем считать, что в сутках h часов. Таким образом, для каждого дата-центра зафиксировано целое число uj (0 ≤ uj ≤ h - 1), обозначающее номер часа в сутках, в течение которого j-й дата-центр недоступен в связи с плановым обновлением.

    Из всего вышесказанного следует, что для любого клиента должны выполняться условия uci, 1 ≠ uci, 2, так как иначе во время одновременного обновления обоих дата-центров, компания будет не в состоянии обеспечить клиенту доступ к его данным.

    В связи с переводом часов в разных странах и городах мира, время обновления в некоторых дата-центрах может сдвинуться на один час вперёд. Для подготовки к непредвиденным ситуациям руководство компании хочет провести учения, в ходе которых будет выбрано некоторое непустое подмножество дата-центров, и время обновления каждого из них будет сдвинуто на один час позже внутри суток (то есть, если uj = h - 1, то новым часом обновления будет 0, иначе новым часом обновления станет uj + 1). При этом учения не должны нарушать гарантии доступности, то есть, после смены графика обновления должно по-прежнему выполняться условие, что данные любого клиента доступны хотя бы в одном экземпляре в любой час.

    Учения — полезное мероприятие, но трудоёмкое и затратное, поэтому руководство компании обратилось к вам за помощью в определении минимального по размеру непустого подходящего подмножества дата-центров, чтобы провести учения только на этом подмножестве.

    Входные данные

    В первой строке находятся три целых числа n, m и h (2 ≤ n ≤ 100 000, 1 ≤ m ≤ 100 000, 2 ≤ h ≤ 100 000) — число дата-центров компании, число клиентов компании и количество часов в сутках.

    Во второй строке вам даны n чисел u1, u2, ..., un (0 ≤ uj < h), j-е из которых задаёт номер часа, в который происходит плановое обновление программного обеспечения на компьютерах дата-центра j.

    Далее в m строках находятся пары чисел ci, 1 и ci, 2 (1 ≤ ci, 1, ci, 2 ≤ n, ci, 1 ≠ ci, 2), задающие номера дата-центров, на которых находятся данные клиента i.

    Гарантируется, что при заданном расписании обновлений в дата-центрах любому клиенту в любой момент доступна хотя бы одна копия его данных.

    Выходные данные

    В первой строке выведите минимальное количество дата-центров k (1 ≤ k ≤ n), которые должны затронуть учения, чтобы не потерять гарантию доступности. Во второй строке выведите k различных целых чисел — номера кластеров x1, x2, ..., xk (1 ≤ xi ≤ n), на которых в рамках учений обновления станут проводиться на час позже. Номера кластеров можно выводить в любом порядке.

    Если возможных ответов несколько, разрешается вывести любой из них. Гарантируется, что хотя бы один ответ, удовлетворяющий условиям задачи, существует.

    Примечание

    Рассмотрим первый тест из условия. Приведённый ответ является единственным способом провести учения, затронув только один дата-центр. В таком сценарии третий сервер начинает обновляться в первый час дня, и никакие два сервера, хранящие данные одного и того же пользователя, не обновляются в один и тот же час.

    С другой стороны, например, сдвинуть только время обновления первого сервера на один час вперёд нельзя — в таком случае данные пользователей 1 и 3 будут недоступны в течение нулевого часа.

    D. Борьба с пробками

    графы кратчайшие пути поиск в глубину и подобное *1600

    Город Nск состоит из n перекрёстков, соединённых m двунаправленными дорогами. Каждая дорога соединяет какие-то два различных перекрёстка, причём никакие две дороги не соединяют одну и ту же пару перекрёстков. Гарантируется, что от любого перекрёстка можно добраться до любого другого, используя только данные дороги. Расстоянием между двумя перекрёстками называется минимальное количество дорог на пути между ними.

    В целях улучшения транспортной ситуации, городская дума требует от мэра города построить одну новую дорогу. Проблема заключается в том, что мэр только недавно купил себе новый автомобиль, поэтому ему настолько нравится ездить из дома, расположенного у перекрёстка s в здание мэрии, расположенное у перекрёстка t, что он хочет построить такую новую дорогу, что кратчайший путь между этими двумя перекрёстками не уменьшится.

    Вам поручено посчитать количество пар перекрёстков, не соединённых дорогой, таких что если добавить в дорожную сеть города двунаправленную дорогу между этими перекрёстками, то расстояние между перекрёстками s и t не уменьшится.

    Входные данные

    В первой строке входных данных записаны числа n, m, s и t (2 ≤ n ≤ 1000, 1 ≤ m ≤ 1000, 1 ≤ s, t ≤ n, s ≠ t) — количество перекрёстков и количество дорог в городе Nске, а также номера перекрёстков рядом с которыми расположены дом и мэрия соответственно. В i-й из последующих m строк записаны два целых числа ui и vi (1 ≤ ui, vi ≤ n, ui ≠ vi), означающих, что перекрёстки ui и vi соединены дорогой напрямую. Гарантируется, что между любой парой перекрёстков существует не более одной прямой дороги, и что, используя данные дороги, можно добраться от любого перекрёстка до любого другого.

    Выходные данные

    Выведите одно целое число — количество пар перекрёстков, не соединённых дорогой, таких что добавление между ними дороги не уменьшит расстояние между перекрёстками s и t.

    B2. Maximum Control (medium)

    графы Деревья жадные алгоритмы поиск в глубину и подобное Структуры данных *2200

    The Resistance is trying to take control over as many planets of a particular solar system as possible. Princess Heidi is in charge of the fleet, and she must send ships to some planets in order to maximize the number of controlled planets.

    The Galaxy contains N planets, connected by bidirectional hyperspace tunnels in such a way that there is a unique path between every pair of the planets.

    A planet is controlled by the Resistance if there is a Resistance ship in its orbit, or if the planet lies on the shortest path between some two planets that have Resistance ships in their orbits.

    Heidi has not yet made up her mind as to how many ships to use. Therefore, she is asking you to compute, for every K = 1, 2, 3, ..., N, the maximum number of planets that can be controlled with a fleet consisting of K ships.

    Input

    The first line of the input contains an integer N (1 ≤ N ≤ 105) – the number of planets in the galaxy.

    The next N - 1 lines describe the hyperspace tunnels between the planets. Each of the N - 1 lines contains two space-separated integers u and v (1 ≤ u, v ≤ N) indicating that there is a bidirectional hyperspace tunnel between the planets u and v. It is guaranteed that every two planets are connected by a path of tunnels, and that each tunnel connects a different pair of planets.

    Output

    On a single line, print N space-separated integers. The K-th number should correspond to the maximum number of planets that can be controlled by the Resistance using a fleet of K ships.

    Note

    Consider the first example. If K = 1, then Heidi can only send one ship to some planet and control it. However, for K ≥ 2, sending ships to planets 1 and 3 will allow the Resistance to control all planets.

    E. Знакопеременное дерево

    Деревья дп Комбинаторика поиск в глубину и подобное разделяй и властвуй Теория вероятностей *2300

    Вам дано дерево с \(n\) вершинами, пронумерованными с \(1\) до \(n\). В вершине \(i\) записано значение \(V_i\).

    Если простой путь от вершины \(u_1\) до вершины \(u_m\) состоит из \(m\) вершин, а именно из \(u_1 \rightarrow u_2 \rightarrow u_3 \rightarrow \dots u_{m-1} \rightarrow u_{m}\), то знакопеременная сумма для этого пути \(A(u_{1},u_{m})\) определяется как \(A(u_{1},u_{m}) = \sum\limits_{i=1}^{m} (-1)^{i+1} \cdot V_{u_{i}}\). Путь может содержать \(0\) рёбер, т. е. \(u_{1}=u_{m}\).

    Вычислите сумму знакопеременных сумм для всех различных простых путей в дереве. Обратите внимание, пути ориентированны: два пути считаются различными, если у них различное начало или различный конец. Так как ответ может быть большим, выведите остаток от деления его на \(10^{9}+7\).

    Входные данные

    В первой строке содержится целое число \(n\) \((2 \leq n \leq 2\cdot10^{5} )\) — число вершин в дереве.

    Во второй строке содержатся \(n\) целых чисел \(V_1, V_2, \ldots, V_n\) (\(-10^9\leq V_i \leq 10^9\)) — значения, записанные в вершинах.

    В каждой из следующих \(n-1\) строк содержатся два целых числа \(u\) и \(v\) \((1\leq u, v\leq n, u \neq v)\), разделённых пробелом, означающих, что в дереве есть ребро, соединяющее вершины \(u\) и \(v\). Гарантируется, что заданный граф является деревом.

    Выходные данные

    Выведите сумму знакопеременных сумм по всем различным простым путям в дереве по модулю \(10^{9}+7\).

    Примечание

    Рассмотрим первый пример.

    Знакопеременная сумма для простого пути из вершины \(1\) в вершину \(2\): \(1 \rightarrow 2\) равна \(A(1,2) = 1 \cdot (-4)+(-1) \cdot 1 = -5\).

    Знакопеременная сумма для простого пути из вершины \(1\) в вершину \(3\): \(1 \rightarrow 3\) равна \(A(1,3) = 1 \cdot (-4)+(-1) \cdot 5 = -9\).

    Знакопеременная сумма для простого пути из вершины \(2\) в вершину \(4\): \(2 \rightarrow 1 \rightarrow 4\) равна \(A(2,4) = 1 \cdot (1)+(-1) \cdot (-4)+1 \cdot (-2) = 3\).

    Простой путь из вершины \(1\) в вершину \(1\) содержит только вершину \(1\), поэтому \(A(1,1) = 1 \cdot (-4) = -4\).

    Аналогично, \(A(2, 1) = 5\), \(A(3, 1) = 9\), \(A(4, 2) = 3\), \(A(1, 4) = -2\), \(A(4, 1) = 2\), \(A(2, 2) = 1\), \(A(3, 3) = 5\), \(A(4, 4) = -2\), \(A(3, 4) = 7\), \(A(4, 3) = 7\), \(A(2, 3) = 10\), \(A(3, 2) = 10\). Поэтому ответ равен \((-5) + (-9) + 3 + (-4) + 5 + 9 + 3 + (-2) + 2 + 1 + 5 + (-2) + 7 + 7 + 10 + 10 = 40\).

    F. Рёбра на простых циклах

    графы Деревья поиск в глубину и подобное *2400

    Задан неориентированный граф, состоящий из \(n\) вершин и \(m\) рёбер. Граф не обязательно связный. Гарантируется, что в графе нет кратных рёбер и петель.

    Цикл в графе называется простым, если он содержит каждую свою вершину ровно один раз (под своими вершинами цикла понимаются все вершины, которые входят в этот цикл).

    Определите рёбра, которые лежат ровно на одном простом цикле.

    Входные данные

    В первой строке следуют два целых числа \(n\) и \(m\) \((1 \le n \le 100\,000\), \(0 \le m \le \min(n \cdot (n - 1) / 2, 100\,000))\) — количество вершин и количество рёбер.

    В следующих \(m\) строках следует по два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \neq v\)) — описание рёбер графа.

    Выходные данные

    В первую строку выведите количество рёбер, которые лежат ровно на одном простом цикле.

    Во вторую строку выведите номера рёбер, лежащих ровно на одном простом цикле, в порядке возрастания. Рёбра нумеруются начиная с единицы в том же порядке, в котором заданы во входных данных.

    B. Уничтожение дерева

    Деревья дп жадные алгоритмы Конструктив поиск в глубину и подобное *2000

    Дано дерево (граф состоящий из n вершин, соединенных n - 1 ребрами, в котором от каждой вершины можно добраться до каждой, двигаясь только по ребрам).

    Вершину можно уничтожить если из нее выходит четное число ребер, при этом уничтожаются все ребра, выходящие из нее.

    Требуется уничтожить все вершины в дереве, либо сказать, что это невозможно.

    Входные данные

    В первой строке задано целое число n (1 ≤ n ≤ 2·105) — количество вершин в дереве.

    Во второй строке заданы n целых чисел p1, p2, ..., pn (0 ≤ pi ≤ n). Если pi ≠ 0, то существует ребро между вершинами с номерами i и pi. Гарантируется, что задано дерево.

    Выходные данные

    Если уничтожить все вершины возможно, выведите «YES» (без кавычек), иначе выведите «NO» (без кавычек).

    Если возможно уничтожить все вершины, в следующих n строках выведите номера вершин в порядке, в котором их надо уничтожать. Если существует несколько способов удалить все вершины, выведите любой.

    Примечание

    В первом примере сначала нужно уничтожить вершину с номером 1 (при ее уничтожении удалятся ребра (1, 2) и (1, 4)), затем 2-ю (удаляются ребра (2, 3) и (2, 5)). После этого в дереве не остается ребер, поэтому оставшиеся вершины можно уничтожать в любом порядке.

    E. Лидеры

    графы Деревья поиск в глубину и подобное снм *2200

    После революции в Берляндии новый диктатор столкнулся с неожиданной проблемой — страной надо как-то управлять. Диктатор является очень эффективным менеджером, однако не может раздавать приказы всему населению лично, поэтому он решил выбрать некоторое множество подконтрольных ему лидеров, которые и будут управлять людьми непосредственно. Однако оказалось, что лидерская эффективность может очень сильно варьироваться от человека к человеку, поэтому диктатор обратился за помощью к всемирно известным берляндским ученым. Ученые предложили инновационную идею — лидеры должны работать парами.

    Граф взаимоотношений — некоторый неориентированный граф с вершинами, соответствующими людям. Путь называется простым, если вершины в нем не повторяются. В результате многодневных и очень дорогих исследований было выяснено, что пара людей обладает наиболее высокими лидерскими качествами, если между ними в графе взаимоотношений есть простой путь с нечетным количеством ребер. Ученые решили называть такие пары различных людей лидерскими. Спецслужбы выдали ученым граф взаимоотношений, так что дело осталось за малым — надо научиться отвечать диктатору, являются ли лидерскими заданные пары людей. Помогите ученым справиться с этой задачей.

    Входные данные

    Во первой строке записаны целые числа n и m (1 ≤ n ≤ 105, 0 ≤ m ≤ 105) — соответственно количество вершин и ребер в графе взаимоотношений. В следующих m строках записаны пары целых чисел a и b, означающие, что между вершинами с номерами a и b есть ребро (вершины пронумерованы начиная с 1, 1 ≤ a, b ≤ n). Гарантируется, что в графе нет петель и кратных ребер.

    В следующей строке записано число q (1 ≤ q ≤ 105) — количество пар, интересующих ученых. В следующих q строках записаны эти пары (в том же формате, что и ребра; запросы могут повторяться, запрос может содержать пару одинаковых вершин).

    Выходные данные

    Для каждого запроса ученых в отдельной строке выведите «Yes», если между парой людей существует простой нечетный путь, иначе выведите «No».

    Примечание

    Пояснение к примеру:

    1) Между вершинами 1 и 2 есть всего 2 различных простых пути: 1-3-2 и 1-4-2. Оба состоят из четного количества ребер.

    2) Вершины 1 и 3 соединены ребром, поэтому простой нечетный путь для них: 1-3.

    5) Вершины 1 и 5 находятся в разных компонентах связности, между ними нет ни одного пути.

    E. Компоненты-циклы

    графы поиск в глубину и подобное снм *1500

    Вам задан неориентированный граф, состоящий из \(n\) вершин и \(m\) ребер. Ваша задача — найти количество компонент связности, которые являются циклами.

    Вот несколько определений из теории графов.

    Неориентированный граф состоит из двух множеств: множества узлов (называемых вершинами) и множества рёбер. Каждое ребро соединяет пару вершин. Все ребра двунаправленные (то есть если вершина \(a\) соединена с вершиной \(b\), вершина \(b\) тоже соединена с вершиной \(a\)). Ребро не может соединять вершину саму с собой, также не может существовать более одного ребра между парой вершин.

    Две вершины \(u\) и \(v\) принадлежат одной компоненте связности тогда и только тогда, когда существует хотя бы один путь по ребрам, соединяющий \(u\) и \(v\).

    Компонента связности является циклом тогда и только тогда, когда все ее вершины могут быть переупорядочены следующим образом:

    • первая вершина соединена ребром со второй вершиной,
    • вторая вершина соединена ребром с третьей вершиной,
    • ...
    • последняя вершина соединена ребром с первой вершиной,
    • все описанные выше ребра цикла — различны.

    Цикл содержит только вершины и ребра, описанные выше. По определению цикл содержит не менее трех вершин.

    Граф на рисунке содержит \(6\) компонент связности, \(2\) из них являются циклами: \([7, 10, 16]\) и \([5, 11, 9, 15]\).
    Входные данные

    В первой строке входных данных задано два целых числа \(n\) и \(m\) (\(1 \le n \le 2 \cdot 10^5\), \(0 \le m \le 2 \cdot 10^5\)) — количество вершин и рёбер в графе.

    В следующих \(m\) строках заданы рёбра: \(i\)-е ребро задаётся парой вершин \(v_i\), \(u_i\) (\(1 \le v_i, u_i \le n\), \(u_i \ne v_i\)). Гарантируется, что граф не содержит кратных рёбер (то есть для любой пары (\(v_i, u_i\)) не существует других пар (\(v_i, u_i\)) и (\(u_i, v_i\)) среди заданных рёбер).

    Выходные данные

    Выведите одно целое число — количество компонент связности, которые являются циклами.

    Примечание

    В первом тестовом примере только компонента \([3, 4, 5]\) является циклом.

    Второй пример соответствует рисунку из условия.

    C. Куро и прогулочный маршрут

    Деревья поиск в глубину и подобное *1600

    Куро живёт в стране Уберляндии, состоящей из \(n\) городов, пронумерованных от \(1\) до \(n\), и \(n - 1\) двусторонняя дорога, соединяющих эти города. Из каждого города можно добраться до любого другого. Каждая дорога соединяет два города \(a\) и \(b\). Куро любит пешие прогулки и поэтому планирует устроить пеший марафон — она выберет пару городов \((u, v)\) (\(u \neq v\)) и пройдёт от \(u\) до \(v\) по кратчайшему пути (заметим, что пары \((u, v)\) и \((v, u)\) считаются различными).

    Как ни странно, в Уберляндии есть два особых города, один из которых — Цветниса (обозначается индексом \(x\)), а другой — Пчелополис (обозначается индексом \(y\)). Цветниса  — город, в котором растёт много сильнопахнущих растений, а в Пчелополисе живёт много пчёл. Куро будет избегать такие пары городов \((u, v)\), если на пути от \(u\) до \(v\) он достигнет Пчелополиса после того, как он побывал в Цветнисе, поскольку пчёлы будут привлечены цветочным запахом и ужалят Куро.

    Куро хочет узнать, сколько пар городов \((u, v)\) он может выбрать для своей пробежки. Так как задача нетривиальна, она обратилась за помощью к вам.

    Входные данные

    В первой строке содержится три целых числа \(n\), \(x\) and \(y\) (\(1 \leq n \leq 3 \cdot 10^5, 1 \leq x, y \leq n\), \(x \ne y\)) — число городов в Уберляндии, индекс Цветнисы и индекс Пчелополиса.

    Дальше следует \(n - 1\) строка, каждая из которых содержит два числа \(a\) и \(b\) (\(1 \leq a, b \leq n\), \(a \ne b\)), описывающих дорогу между городами \(a\) и \(b\).

    Гарантируется, что из каждого города можно достичь любого другого, пробегая по дорогам. Таким образом, сеть городов и дорог образует дерево.

    Выходные данные

    Выведите одно целое число — количество пар городов \((u, v)\), которые Куро может использовать для пешего марафона.

    Примечание

    В первом примере Куро может выбрать следующие пары городов:

    • \((1, 2)\): её маршрутом будет \(1 \rightarrow 2\),
    • \((2, 3)\): её маршрутом будет \(2 \rightarrow 3\),
    • \((3, 2)\): её маршрутом будет \(3 \rightarrow 2\),
    • \((2, 1)\): её маршрутом будет \(2 \rightarrow 1\),
    • \((3, 1)\): её маршрутом будет \(3 \rightarrow 2 \rightarrow 1\).

    Куро не может выбрать пару \((1, 3)\), так как её маршрутом будет \(1 \rightarrow 2 \rightarrow 3\), в котором Куро сначала посетит город \(1\) (Цветнису), после чего посетит город \(3\) (Пчелополис), что запрещено (заметьте, что пара \((3, 1)\) является разрешённой, поскольку хотя Куро и посетила и Цветнису, и Пчелополис, она не посетила их в этом порядке).

    Во втором примере, Куро может выбрать следующие пары городов:

    • \((1, 2)\): её маршрутом будет \(1 \rightarrow 2\),
    • \((2, 1)\): её маршрутом будет \(2 \rightarrow 1\),
    • \((3, 2)\): её маршрутом будет \(3 \rightarrow 1 \rightarrow 2\),
    • \((3, 1)\): её маршрутом будет \(3 \rightarrow 1\).

    C. Удали их всех!

    графы Деревья дп жадные алгоритмы поиск в глубину и подобное *1500

    Дано дерево из \(n\) вершин.

    Необходимо ответить на следующий вопрос: какое максимальное количество ребер можно удалить из дерева так, чтобы все получившиеся компоненты связности содержали в себе четное количество вершин?

    Входные данные

    В первой строке задано число вершин \(n\) (\(1 \le n \le 10^5\)).

    Следующие \(n - 1\) строк содержат по два числа \(u\), \(v\) (\(1 \le u, v \le n\)), описывающие вершины, соединенные \(i\)-м ребром.

    Гарантируется, что заданная конфигурация образует дерево.

    Выходные данные

    Выведите единственное число \(k\) — максимальное количество ребер, которое можно удалить, чтобы все компоненты связности имели четное число вершин, или \(-1\), если нельзя удалить ребра так, чтобы все компоненты связности имели четное число вершин.

    Примечание

    В первом тестовом примере можно удалить ребро, соединяющее вершины \(1\) и \(4\), тогда граф распадется на две компоненты связности, в каждой из которых по две вершины.

    Во втором тестовом примере нельзя удалить ребра так, чтобы все компоненты связности имели четное число вершин, поэтому ответ \(-1\).

    F. Место встречи изменить нельзя

    графы поиск в глубину и подобное *2700

    Петр — следователь по особо важным делам в городе Брагинске. Совсем недавно из банка организованная банда преступников похитила огромную сумму денег. В местном полицейском участке Петру приказали отыскать воришек. Днём и ночью работал Пётр, но никак не удавалось напасть на след злоумышленников. Однако воскресным днём поступил звонок, в котором сообщалось, что некоторая группа людей катается на новенькой машине по дорогам города, не останавливаясь.

    Сомнений не осталось: только те самые преступники могли так дерзко рассекать по городу. Дороги в Брагинске односторонние и каждая из них соединяет ровно два перекрестка. Теперь перед Петром стоит задача попроще – ему нужно узнать, может ли он выбрать перекрёсток таким образом, что, если преступники будут продолжать ездить по односторонним дорогам города бесконечно долго, рано или поздно они проедут через данный перекресток. Начальное положение преступников неизвестно. Найдите перекресток, подходящий Петру.

    Входные данные

    Первая строка входных данных содержит два целых числа \(n\) и \(m\) (\(2 \leq n \le 10^5\), \(2 \leq m \leq 5 \cdot 10^5\)) — количество перекрестков и односторонних дорог Брагинска, соответственно.

    В каждой из следующих \(m\) строк записано по два числа \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\), \(u_i \ne v_i\)) — начало и конец \(i\)-той односторонней дороги. Гарантируется, что преступники могут ездить по дорогам города бесконечно долго.

    Выходные данные

    Выведите единственное число \(k\) — номер перекрестка, который должен выбрать Петр. Если возможных ответов несколько, выведите любой. Если таких перекрестков в Брагинске нет, то выведите \(-1\).

    Примечание

    Преступники могли перемещаться, например, по следующим маршрутам: \((1-2-3-1)\), \((3-4-5-3)\), \((1-2-3-4-5-3-1)\). Можно показать, что если Петр устроит засаду на перекрестке \(3\), то, вне зависимости от того, какой на самом деле был маршрут бандитов, он сможет их поймать.

    C. AND Graph

    битмаски графы поиск в глубину и подобное снм *2500

    Дано множество размера \(m\), состоящее из целых неотрицательных чисел от \(0\) до \(2^{n}-1\) включительно. Построим на этих числах неориентированный граф следующим образом: соединим \(x\) и \(y\), если и только если \(x \& y = 0\). Здесь \(\&\) — операция побитового И. Посчитайте количество компонент связности в таком графе.

    Входные данные

    В первой строке записаны два целых числа \(n\) и \(m\) (\(0 \le n \le 22\), \(1 \le m \le 2^{n}\)).

    Во второй строке через пробел перечислены \(m\) чисел \(a_1, a_2, \ldots, a_m\) (\(0 \le a_{i} < 2^{n}\)) — элементы множества. Все \(a_{i}\) различны.

    Выходные данные

    Выведите одно целое число — количество компонент связности.

    Примечание

    Граф из первого примера:

    Граф из второго примера:

    F. Управление потоками

    Деревья дп жадные алгоритмы поиск в глубину и подобное *2400

    Вам необходимо настроить очень сложную водораспределительную систему. Система состоит из \(n\) узлов и \(m\) труб, \(i\)-я труба соединяет узлы \(x_i\) и \(y_i\).

    Вам нужно всего лишь подобрать настройки труб. Требуется выбрать \(m\) целых чисел \(f_1\), \(f_2\), ..., \(f_m\) для того, что использовать их в качестве настроек соответствующих труб. \(i\)-я труба будет пересылать \(f_i\) единиц воды в секунду из узла \(x_i\) в узел \(y_i\) (если \(f_i\) отрицательно, то труба будет пересылать \(|f_i|\) единиц воды из узла \(y_i\) в узел \(x_i\)). Разрешается выставлять \(f_i\) значение от \(-2 \cdot 10^9\) до \(2 \cdot 10^9\).

    Для корректной работы системы необходимо также соблюдать следующие ограничения: для каждого \(i \in [1, n]\), \(i\)-му узлу присвоено число \(s_i\), означающее, что разница между входным и выходным потоками для \(i\)-го узла должна быть ровно \(s_i\) (если \(s_i\) неотрицательно, то \(i\)-й узел должен принимать \(s_i\) единиц воды; если отрицательно, то \(i\)-й узел должен отдавать \(|s_i|\) единиц воды другим узлам).

    Можно ли выбрать целые числа \(f_1\), \(f_2\), ..., \(f_m\) таким образом, чтобы все ограничения на входные и выходные потоки соблюдались?

    Входные данные

    В первой строке записано одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество узлов.

    Во второй строке записаны \(n\) целых чисел \(s_1, s_2, \dots, s_n\) (\(-10^4 \le s_i \le 10^4\)) — ограничения для узлов.

    В третьей строке записано одно целое число \(m\) (\(0 \le m \le 2 \cdot 10^5\)) — количество труб.

    В \(i\)-й из следующих \(m\) строк записаны два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\), \(x_i \ne y_i\)) — описание \(i\)-й трубы. Гарантируется, что каждая неупорядоченная пара \((x, y)\) встретится во входных данных не более одного раза (это значит, что после первого вхождения \((x, y)\) не будет пар \((x, y)\) и \((y, x)\)). Гарантируется, что для каждой пары узлов существует некоторый путь по трубам, соединяющий их.

    Выходные данные

    Если можно выбрать целые числа \(f_1, f_2, \dots, f_m\) таким образом, что все ограничения на входные и выходные потоки соблюдаются, то выведите «Possible» в первой строке. После выведите \(m\) строк, в \(i\)-й строке должно быть записано число \(f_i\) — выбранные настройки труб. Трубы пронумерованы в порядке, в котором появляются во входных данных.

    В противном случае выведите «Impossible» в единственной строке.

    E. Достижимость из столицы

    графы жадные алгоритмы поиск в глубину и подобное *2000

    В Берляндии \(n\) городов и \(m\) дорог, каждая из дорог соединяет пару городов. Дороги в Берляндии — односторонние.

    Какое наименьшее количество новых дорог надо построить, чтобы из столицы Берляндии по дорогам стали достижимы все города страны?

    Построенные новые дороги тоже будут односторонними.

    Входные данные

    В первой строке задано три целых числа \(n\), \(m\) и \(s\) (\(1 \le n \le 5000, 0 \le m \le 5000, 1 \le s \le n\)) — количество городов, количество дорог и номер столицы. Города пронумерованы от \(1\) до \(n\).

    В следующих \(m\) строках заданы дороги: \(i\)-я дорога задается парой номеров соединяемых городов \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\), \(u_i \ne v_i\)). Для каждой пары городов \((u, v)\) может быть не более одной дороги из \(u\) в \(v\), но существование встречных дорог (из \(u\) в \(v\) и одновременно из \(v\) в \(u\)) допустимо. Все дороги в Берляндии — односторонние.

    Выходные данные

    Выведите одно целое число — минимальное количество дорог, которое необходимо построить, чтобы из города \(s\) стали достижимы все остальные города. Если во входных данных уже все города достижимы из \(s\), то выведите 0.

    Примечание

    Первый пример изображен на следующем рисунке:

    Для того, чтобы все города стали достижимы из \(s = 1\), можно добавить, например, дороги (\(6, 4\)), (\(7, 9\)), (\(1, 7\)).

    Второй пример:

    В этом примере можно добавить любую из дорог (\(5, 1\)), (\(5, 2\)), (\(5, 3\)), (\(5, 4\)), чтобы все остальные города стали достижимы из \(s = 5\).

    Build Gates

    поиск в глубину и подобное

    Фермер Джон строит изгородь.

    ФД начинает в позиции \((0,0)\) и делает \(N\) шагов, двигаясь каждый раз на Единицу расстояния на север, юг, восток или запад. Каждый раз, когда он делает шаг, он строит изгородь за собой. Например, если первый его шаг будет на север, он добавит сегмент изгороди от \((0,0)\) до \((0,1)\). ФД может посещать точки повторно много раз и даже может строить одни и те же отрезки изгороди много раз. Его изгородь может даже пересекать себя много раз.

    ФД в результате может разделить изгородями ферму на несколько независимых огороженных участков. Он хочет добавить двери для исправления такого положения. Дверь может быть установлена на любом отрезке единичной длины, так чтобы разрешить проход между двумя сторонами этого отрезка.

    Определите минимальное количество дверей которые требуется построить, так чтобы каждый регион был доступен из каждого другого региона.

    ФОРМАТ ВВОДА (файл gates.in):

    Первая строка ввода содержит \(N\) (\(1 \leq N \leq 1000\)). Следующая строка содержит строку длины \(N\), описывающую путь ФД. Каждый символ один из N(север), E (восток), S (юг), W (запад).

    ФОРМАТ ВЫВОДА (ФАЙЛ gates.out):

    Напишите одно целое число - минимальное количество ворот, которое должен построить ФД, чтобы восстановить полную связность всех регионов своей фермы. Заметим, что ответ может быть 0, если ферма изначально связная.

    Minimum Longest Trip

    графы поиск в глубину и подобное реализация

    Беси собирается в путешествие по Cowland, которая имеет \(N\) (\(2\le N\le 2\cdot 10^5\)) городов, пронумерованных от \(1\) до \(N\) и \(M\) (\(1\le M\le 4\cdot 10^5\)) односторонних дорог. \(i\)-ая дорога ведёт из города \(a_i\) в город \(b_i\) и имеет метку \(l_i\) (\(1\le a_i,b_i\le N\), \(1\le l_i\le 10^9\)).

    Путешествие длины \(k\) начинается в городе \(x_0\) - это последовательность городов \(x_0, x_1, \ldots, x_k\), таких, что что существует дорога из города \(x_i\) в город \(x_{i+1}\) для всех \(0\le i < k\). Гарантируется, что не существует путешествий бесконечной длины, и что никакие две дороги не соединяют одну и ту же пару городов.

    Для каждого города Беси хочет узнать наидлиннейшее путешествие, начинающееся в этом городе. Для некоторых стартовых городов может существовать несколько наидлиннейших путешествий - из них Беси предпочитает путешествие с лексикографически минимальной последовательностью меток дорог. Последовательность лексикографически меньше другой последовательности такой же длины, если на первой позиции, где они различаются, первая последовательность имеет меньший элемент, чем вторая последовательность.

    Выведите длину и сумму меток дорог, предпочитаемого Беси путешествия, начинающегося из каждого города.

    ФОРМАТ ВВОДА (с клавиатуры):

    Первая строка содержит \(N\) и \(M\).

    Каждая из следующих \(M\) строк содержит три целых числа \(a_i\), \(b_i\), \(l_i\), обозначающих дорогу из \(a_i\) в \(b_i\) с меткой \(l_i\).

    ФОРМАТ ВЫВОДА (на экран):

    Выведите \(N\) строк. \(i\)-ая строка должна содержать два разделённых одиночным пробелом целых числа длину и сумму меток дорог предпочитаемого Бесси путешествия, начинающегося в городе \(i\).

    Exercise Route

    графы Деревья поиск в глубину и подобное

    Ферма состоит из \(N\) полей (\(1 \leq N \leq 2 \cdot 10^5\)), последовательно пронумерованных \(1 \ldots N\), и удобно соединённых множеством из \(M\) двунаправленных тропинок (\(1 \leq M \leq 2 \cdot 10^5\)). Будучи "существами привычки" коровы используют одно множество из \(N-1\) тропинок для всех своих ежедневных перемещений между полями. Они называют эти тропинки "стандартными" тропинками. Возможно добраться от любого поля до любого другого поля, используя только стандартные тропинки.

    Беси, желая разнообразить маршрут своей утренней пробежки, хочет включить в маршрут нестандартные тропинки, однако не слишком много. Она определила хороший маршрут как сформированный из простого цикла, (возвращающего в исходное поле и не использующего никакое поле более одного раза), который содержит ровно две нестандартные тропинки.

    Помогите Беси посчитать количество хороших маршрутов, которые она может использовать.

    ФОРМАТ ВВОДА (файл exercise.in):

    Первая строка ввода содержит \(N\) и \(M\). Каждая из следующих \(M\) строк содержит два целых числа \(a_i\) и \(b_i\) описывающих конечные точки тропинки. Первые N-1 из них - стандартные тропинки.

    ФОРМАТ ВЫВОДА (файл exercise.out):

    Выведите общее количество различных маршрутов, которые Беси может использовать. Два маршрута рассматриваются как одинаковые, если они используют одно и то же множество тропинок.

    Push a Box

    графы поиск в глубину и подобное

    Беси и её друзья придумали новую игру "Затолкай ящик вокруг амбара в правый угол не сдвигая сено".

    Амбар может быть представлен прямоугольной решёткой \(N \times M\). В некоторых ячейках решётки находится сено. Беси находится в одной ячейке этой решётки, а большой деревянный ящик занимает другую. Беси и этот ящик не помещаются в одной ячейке одновременно, также они не могут заходить в ячейку с сеном.

    Бесси может двигаться в 4 ортогональных направлениях (север, юг, запад, восток). пока не уткнётся в ячейку с сеном. Если она попытается войти в ячейку с ящиком, то ящик продвинется на одну ячейку в этом же направлении, если там есть свободная ячейка. Если свободной ячейки нет, Беси не может сдвинуть ящик.

    Определённая ячейка решётки указана как цель. Беси должна доставить ящик в это место.

    По заданному описанию амбара, включая начальную позицию ящика и коровы, а также целевую позицию ящика, определите можно ли победить в игре.

    Замечание: в этой задаче можно использовать 512 Мбт оперативной памяти, в отличие от лимита по умолчанию в 256 Мбт.

    ФОРМАТ ВВОДА (файл pushabox.in):

    Первая строка ввода содержит три числа \(N\), \(M\), \(Q\), где \(N\) - количество строк, \(M\) - количество столбцов.

    • \(1 \le N,M \le 1500\).
    • \(1 \le Q \le 50,000\).

    Следующие \(N\) строк описывают решётку, где символ '.' показывает пустую ячейку, '#' - ячейку с сеном, 'A' - стартовую позицию Беси, 'B' - начальное положение ящика.

    Далее следуют \(Q\) строк, каждая из которых содержит пару чисел \((R, C)\). Для каждой пары Вы должны определить, возможно ли доставить ящик в эту ячейку, со строкой \(R\), столбцом \(C\), из начального состояния амбара. Верхняя строка имеет номер 1, левый столбец имеет номер 1.

    ФОРМАТ ВЫВОДА (файл pushabox.out):

    \(Q\) строк, каждая содержит одну из строк "YES" или "NO".

    Googol

    поиск в глубину и подобное

    Коровы вознамерились разработать собственной поисковик. К несчастью, они не имели опыта разработки больших программных продуктов и потому количество сотрудников их проекта \(N\) (\(1 \le N \le 10^{100}\)) стало существенно больше, чем изначально планировалось. Для того, чтобы найти подходящее имя для своей компании, они решили оттолкнуться от верхней границы количества сотрудников своей компании и назвались "Googol", что является названием числа \(10^{100}\).

    В попытке улучшить управленческую структуру в компании, коровы структурировали её в виде двоичного дерева, где каждый сотрудник отвечает за управление своим двумя непосредственными подчинёнными " левым " и " правым ". Кроме того, для того чтобы сбалансировать нагрузку на каждого работника, коровы организовали структуру дерева так, чтобы для каждого сотрудника E, общее количество сотрудников в левом поддереве E было равно или больше чем количество сотрудников в правом поддереве.

    Каждый сотрудник имеет уникальной ID - число в диапазоне \(1\ldots N\), с корнем дерева - сотрудником номер 1. Вы можете интерактивно запрашивать у сотрудника ID двух его подчинённых. Это делается выводом ID этого сотрудника в стандартный вывод, за которым следует перевод строки. В ответ Вы получите одну строку, которая содержит два целых числа - ID левого и правого подчинённых данного сотрудника. Оба этих числа могут быть равны 0, если у него нет ни одного подчинённого. Или только второе число может быть 0, если у него нет правого подчинённого. (Заметим, в что в соответствии с правилом балансирования, левое поддерево всегда больше или равно правом, и потому не возможна ситуация, когда у сотрудника есть правый подчинённый, но нет левого подчинённого).

    К несчастью, коровы потеряли точное значение \(N\) Пожалуйста, вычислите это число и выведите "Answer N", а за ним перевод строки как последнюю строку вашего вывода. Ваша программа имеет право сделать не более 70,000 запросов и не может выполняться боле 4 секунд (8 для Java и Python).

    Далее приведен пример возможного взаимодействия между Вашей программой и грейдером (оценивающей программой).

    YOUR PROGRAM: 1
    GRADER: 4 3
    YOUR PROGRAM: 4
    GRADER: 2 0
    YOUR PROGRAM: 3
    GRADER: 0 0
    YOUR PROGRAM: Answer 4
    

    Дерево, соответствующее этому взаимодействию

         1
       4   3
     2
    

    Заметим, что нет необходимости спрашивать о детях для узла 2, поскольку мы можем логически вывести, что у него нет детей из того факта, что у вершины 4 нет правого потомка.

    Decorating the Pastures

    графы Поиск компонент связности поиск в глубину и подобное


    У Фермера Джона имеется N (1 <= N <= 50,000) пастбищ, последовательно пронумерованных от 1 до N, соединённых M (1 <= M <= 100,000) двунаправленными дорогами. Дорога I соединяет пастбища Ai (1 <= Ai <= N) и Bi (1 <= Bi <= N), Ai != Bi. Возможны две дороги соединяющие одну и ту же пару пастбищ.
    Беси хочет украсить пастбища к дню рождения ФД. Она хочет разместить на каждом пастбище огромный знак содержащий либо букву ‘F’ либо букву ‘J’, но чтобы не огорчать ФД, должно быть выполнено правило, Пастбища декорируются разными знаками, если они соединены дорогой.
    Компания, изготавливающая знаки, требует больше денег за знак ‘F’ и меньше денег за знак ‘J’, поэтому Беси хочет максимизировать количество знаков ‘J’, которые она использует. Пожалуйста, определите это число или выведите -1, если невозможно расставить знаки по описанным правилам.
    uses. Please determine this number, or output -1 if there is no valid way to arrange the signs.
    PROBLEM NAME: decorate
    Формат ввода:
    * Строка 1: Два целых числа N и M.
    * Строки 2..M+1: Два целых числа, Ai и Bi указывающих наличие двунаправленной дороги между пастбищами Ai и Bi.
    Примечание
    Пастбища и дороги представляют собой вершины и стороны квадрата.
    Формат вывода:
    * Строка 1: Одно целое число, указывающее максимальное количество знаков ‘J’ которые сможет использовать Беси. Если нет решения, то выводить -1.
    Примечание
    Беси может пометить пастбища 1 и 3 знаком ‘J’ (или альтернативно - пастбища 2 и 4).

    Mirror Field

    поиск в глубину и подобное

    Problem 1: Mirror Field [Mark Gordon]
    Фермер Джон оставил несколько старых зеркал во дворе и коровы их украли. Коровы установили эти зеркала на прямоугольном поле из N*M квадратов (1<=N,M<=1000) . В каждом квадрате они разместили двустороннее зеркало между двумя противоположными углами. Такие две возможные конфигурации представлены символами ‘/’ (зеркало, соединяющее левый нижний угол с правым верхним углом) и символом ‘\’ (зеркало, соединяющее левый верхний угол с правым нижним углом).
    Однажды Беси пришла с лазером к этому полю. Она пускает луч света горизонтально или вертикально или в строку или в столбец поля, который отражается от некоторого количества зеркал. Поскольку все зеркала ориентированы диагонально, то горизонтальный луч света, отразившись от зеркала, продолжает движение вертикально, и наоборот.
    Беси интересно каково максимальное количество зеркал, от которых может отразится её лазерный луч отправленный из одной позиции. Помогите ей вычислить это число.
    PROBLEM NAME: mirror
    Формат входных данных
    * Строка 1: Целые числа N и M, разделённые одним пробелом.
    * Строки 2..1+N: Каждая содержит M символов '/' или '\', описывающих одну строку зеркального поля.
    Формат выходных данных
    * Строка 1: Одно целое число, указывающее максимальное количество раз, которое может отразится луч выпущенный вертикально или горизонтально снаружи поля. Выведите -1, если он может отражаться бесконечно.
    Примечание
    Беси может запустить лазер сверху вниз в средней колонке и этот луч отразится 3 раза.

    Mirrors

    поиск в глубину и подобное


    Фермер Джон установил N отражающих заборов (зеркал) (1 <= N <= 200) в различных местах фермы и надеется что сможет видеть из своего дома в точке (0,0) до амбара в точке (a,b).
    На 2D-карте фермы Джона забор i показывается коротким отрезком с центром в точке с целочисленными координатами (xi, yi) и повернутым на 45 градусов (либо так '/', либо так '/'). Например, забор типа '/' в позиции (3,5) может быть описан как отрезок из (2.9,4.9) в (3.1,5.1). Все центры заборов, а также амбар лежат в точках с целочисленными координатами в диапазоне от -1,000,000...1,000,000. Центр ни одного забора не лежит в точках (0,0) или (a,b).
    ФД планирует сидеть в своем доме в позиции (0,0) и смотреть вправо (вдоль по оси X в положительном направлении). Он хочет видеть точку (a,b). Однако одно зеркало установлено неправильно (например, '\' вместо '/'). Пожалуйста, выведите индекс первого зеркала в списке ФД, повернув которое (с '/' на '\' или наоборот) ФД сможет увидеть точку (a,b).
    Если ФД уже может видеть точку (a,b) не поворачивая ни одно зеркало, выведите 0. Если невозможно увидеть (a,b) после переключения ровно одного зеркала, выведите -1.
    PROBLEM NAME: mirrors
    Формат входных данных
    * Строка 1: Три разделенных пробелом целых числа, N, a, b.
    * Строки 2..1+N: Строка i+1 описывает зеркало i и содержит либо xi yi / либо xi yi \ Символ / или \ указывает ориентацию зеркала.
    Формат выходных данных
    * Строка 1: Индекс первого зеркала, переключение которого позволит ФД видеть точку (a,b). Если ФД уже может видеть точку (a,b) выведите 0, если переключение только одного зеркала не позволит видеть точку (a,b), выведите -1.
    Примечание
    Переключение зеркала в позиции (3,2) позволит ФД увидеть точку (a,b).
    3 .\..... 2 //./--B 1 ...|... 0 H--/... 0123456

    Unlocking Blocks

    поиск в глубину и подобное


    Коровы любят головоломки. Фермер Джон подарил Беси на день рождения новую головоломку. Она состоит из трех твердых объектов, каждый из которых состоит из склеенных вместе квадратиков размера 1 х 1. Каждый из этих объектов имеет «связную» форму в том смысле, что Вы можете перейти из одного квадратика в любой другой, двигаясь по квадратикам этого объекта в одном из четырех направлений: север, юг, запад, восток.
    Объект может перемещаться последовательно скольжением на одну единицу в одном из четырех направлений: север, юг, запад, восток. Цель головоломки - переместить объекты так, чтобы они разделились – то есть, чтобы граничные квадратики отошли друг от друга. Ваша задача – по заданным трем объектам определить, можно их разделить, или нет. Конфигурация, которую разделить нельзя, называется заблокированной.

    Замечание: программы, которые не делают ничего, кроме угадывания ответа, могут быть дисквалифицированы.
    PROBLEM NAME: unlock
    Формат входных данных
    * Строка 1: Три разделенных одиночными пробелами целых числа: N1, N2, and N3, описывающих количество квадратов соответственно в фигурах 1, 2, и 3.
    * Строки 2..1+N1: Каждая из этих строк описывает (x,y) координату юго-западного угла одного квадрата объекта 1. Все координаты в интервале 0..9.
    * Строки 2+N1..1+N1+N2: Каждая из этих строк описывает (x,y) координату юго-западного угла одного квадрата объекта 2. Все координаты в интервале 0..9.
    * Lines 2+N1+N2..1+N1+N2+N3: Каждая из этих строк описывает (x,y) координату юго-западного угла одного квадрата объекта 1. Все координаты в интервале 0..9.
    Формат выходных данных
    * Строка 1: Выведите 1, если объекты могут быть отделены друг от друга, и 0 в противном случае.

    Cow Beauty Pageant (Bronze Level)

    поиск в глубину и подобное

    Problem 4: Cow Beauty Pageant (Bronze Level) [Brian Dean]
    Прослышав о том, что последний писк моды – иметь коров с двумя пятнами, Фермер Джон купил себе целое стадо таких коров. Однако мода переменчива, и теперь модно иметь коров, у каждой из которых ровно одно пятно.
    ФД решил сделать стадо более модным, подкрасив каждую из коров таким образом, чтобы ее два пятна слились в одно.
    Корова представлена решеткой символов N*M (1 <= N,M <= 50), например, так:
    ................ ..XXXX....XXX... ...XXXX....XX... .XXXX......XXX.. ........XXXXX... .........XXX....
    Здесь каждый символ 'X' обозначает часть пятна. Два символа 'X' принадлежат одному и тому же пятну, если они вертикально или горизонтально соседние (диагонально соседние таковыми не считаются). Таким образом, на рисунке выше представлены два пятна. Вообще все коровы ФД имеют ровно два пятна.
    ФД хочет использовать как можно меньше краски, чтобы объединить два пятна в одно. В примере выше, он может сделать это, закрасив только три дополнительных клеточки (они помечены символами ‘*’ на рисунке ниже).
    ................ ..XXXX....XXX... ...XXXX*...XX... .XXXX..**..XXX.. ........XXXXX... .........XXX....
    Помогите ФД определить минимальное количество клеток, которые нужно закрасить, чтобы объединить два пятна в одно большее.
    PROBLEM NAME: pageant
    Формат входных данных
    * Строка 1: Два разделенных пробелом целых числа, N и M.
    * Строки 2..1+N: Каждая строка содержит строку из M символов 'X' и '.', указывающих одну строку коровьей окраски.
    Формат выходных данных
    * Строка 1: Минимальное количество новых символов 'X', которые необходимо добавить, чтобы получилось одно пятно.
    Примечание
    Три дополнительных символа ‘X’ превращают два пятна в одно.
    ................ ..1111....222... ...1111X...22... .1111..XX..222.. ........22222... .........222....

    Вышивка жемчугом

    графы поиск в глубину и подобное реализация

    Со стародавних времён в поморских деревнях рукодельницы вышивали жемчугом на прямоугольных полотенцах, состоящих из одинаковых клеток. Вышивка начиналась с пришивания жемчужины к полотенцу в центре одной из клеток. Чтобы пришить новую жемчужину, рукодельница делала стежок из клетки, уже содержащей жемчужину, в соседнюю с ней по горизонтали или вертикали свободную клетку. Новая жемчужина пришивалась в центре клетки на конце стежка. Этот процесс повторялся, пока не заканчивались жемчужины.

    Одно из таких праздничных полотенец находится в музее. К сожалению, некоторые части узора были утеряны, но описание полотенца сохранилось. Дирекция музея планирует восстановить один из прямоугольных фрагментов полотенца, но не ещё не решила какой именно. Затраты на восстановление фрагмента зависят от количества связных частей узора, попавших на этот фрагмент. Часть узора считается связной, если от любой её жемчужины можно по стежкам перейти к любой другой её жемчужине, не выходя за границы фрагмента. Дирекция всегда относит любые две жемчужины, между которыми можно перейти по стежкам, к одной и той же связной части узора.

    Требуется написать программу, вычисляющую количество связных частей узора для каждого из заданных фрагментов.

    Входные данные
    Первая строка входных данных содержит два целых числа \(a\) и \(b\) — размеры полотенца в клетках по горизонтали и вертикали.

    Вторая строка содержит два числа \(n\) и \(q\) — количество жемчужин в узоре и количество фрагментов соответственно.

    Следующие \((n - 1)\) строк содержат описания стежков. Каждый стежок имеет один из следующих видов:

    • h \(x~y\) означает, что клетки с координатами \((x, y)\) и \((x + 1, y)\) содержат жемчужины, соединённые горизонтальным стежком (\(1 \leq x \leq a - 1\); \(1 \leq y \leq b\));
    • v \(x~y\) означает, что клетки с координатами \((x, y)\) и \((x, y + 1)\) содержат жемчужины, соединённые вертикальным стежком (\(1 \leq x \leq a\); \(1 \leq y \leq b - 1\)).

    Так как неизвестно в каком порядке рукодельница наносила стежки, их описания следуют в произвольном порядке. При этом гарантируется, что узор был получен в результате процесса, описанного в условии задачи.

    Следующие \(q\) строк описывают фрагменты. Каждое описание содержит четыре целых числа \(x_1\), \(y_1\), \(x_2\) и \(y_2\) — координаты левой нижней и правой верхней клетки фрагмента (\(1 \leq x_1 \leq x_2 \leq a\); \(1 \leq y_1 \leq y_2 \leq b\)).

    Выходные данные
    Выходные данные должны содержать \(q\) строк, где \(i\)-я строка содержит количество связных частей узора в \(i\)-м фрагменте.

    Замечание
    Пояснение к тесту из условия.

    Водостоки

    графы поиск в глубину и подобное Поиск компонент связности

    Карту местности условно разбили на квадраты, и посчитали среднюю высоту над уровнем моря для каждого квадрата.

    Когда идет дождь, вода равномерно выпадает на все квадраты. Если один из четырех соседних с данным квадратом квадратов имеет меньшую высоту над уровнем моря, то вода с текущего квадрата стекает туда (и, если есть возможность, то дальше), если же все соседние квадраты имеют большую высоту, то вода скапливается в этом квадрате.

    Разрешается в некоторых квадратах построить водостоки. Когда на каком-то квадрате строят водосток, то вся вода, которая раньше скапливалась в этом квадрате, будет утекать в водосток.

    Если есть группа квадратов, имеющих одинаковую высоту и образующих связную область, то если хотя бы рядом с одним из этих квадратов есть квадрат, имеющий меньшую высоту, то вся вода утекает туда, если же такого квадрата нет, то вода стоит во всех этих квадратах. При этом достаточно построить водосток в любом из этих квадратов, и вся вода с них будет утекать в этот водосток.

    Требуется определить, какое минимальное количество водостоков нужно построить, чтобы после дождя вся вода утекала в водостоки.

    Входные данные
    В первой строке записаны числа N и M, задающие размеры карты — натуральные числа, не превышающие 100. Далее идет N строк, по M чисел в каждой, задающих высоту квадратов карты над уровнем моря. Высота задается натуральным числом, не превышающим 10000. Считается, что квадраты, расположенные за пределами карты, имеют высоту 10001 (то есть вода никогда не утекает за пределы карты).

    Выходные данные
    Выведите минимальное количество водостоков, которое необходимо построить.

    Электронная таблица

    Разбор выражений поиск в глубину и подобное Задача на реализацию

    Напишите программу, выполняющую функции очень простой электронной таблицы. Она работает с таблицей из 9 строк от 1 до 9 и 26 столбцов от A до Z. Клетки таблицы обозначаются именами, составленными из кодов столбца и строки, например, B1, S8.

    Каждая клетка содержит выражение. Выражения используют целые константы, ссылки на клетки, скобки, бинарные операторы +, -, * и / (целочисленное деление). Например, 567, E8/2, (3+B3)*(C4-1) являются правильными выражениями. Все операторы целочисленные. Деление на ноль даёт в результате ноль.

    Если значение ячейки, на которую ссылается некоторое выражение, не определено, оно считается равным нулю. Ситуация, когда две или более ячейки зависят друг от друга, является отдельным случаем - циклической ссылкой.

    Ограничения: длина выражения в одной ячейке до 255 символов, все аргументы и результаты меньше 1 000 000.

    Входные данные
    Первая строка содержит число выражений N. Следующие N строк имеют формат <Имя клетки>=<выражение>. Все выражения корректные, и каждая ячейка определена не более чем одним выражением.

    Выходные данные
    В единственной строке выводится или значение клетки A1, или число 1000000 (один миллион), если значение клетки A1 не может быть найдено из-за циклической ссылки.

    Робинзон и крокодилы

    графы поиск в глубину и подобное

    Робинзон живет на острове, который представляет собой прямоугольник размером \(n \times m\) клеток.

    На остров Робинзона выползли погреться на солнышке и задремали несколько крокодилов. Робинзон хочет прогнать неприятных соседей, не поднимая шума. Для этого он кидает в дремлющих крокодилов орехи.

    В каждой клетке острова находится не более одного крокодила. Напуганный орехом крокодил быстро бежит строго по прямой, пока не окажется в воде. Для каждого крокодила известно направление, в котором он побежит, если его напугать. Направления, в которых будут убегать крокодилы, параллельны сторонам острова.

    Если на пути напуганного крокодила окажется другой крокодил, то, столкнувшись, они разозлятся, и нападут на Робинзона. Поэтому надо тщательно выбирать очередного крокодила, чтобы на его пути были только пустые клетки.

    Робинзон не кидает очередной орех, пока предыдущий крокодил не окажется в воде.

    Требуется написать программу, определяющую максимальное количество крокодилов, которых можно прогнать, не разозлив их.

    Формат входных данных
    В первой строке записаны числа \(n\) и \(m\) "— размеры острова с севера на юг и с запада на восток. Последующие \(n\) строк по \(m\) символов в каждой описывают текущее расположение крокодилов на острове. Если клетка свободна, то она обозначается точкой <<.>>, а если там находится крокодил, то в ней указано направление, в котором побежит этот крокодил. Направления обозначаются буквами: <<N>> "— север, <<S>> "— юг, <<E>> "— восток, <<W>> "— запад.

    Формат входных данных
    Выходной файл должен содержать одно число "— максимальное количество крокодилов, которых можно прогнать, не разозлив.


    Пояснение к третьему примеру

    Годовой отчет

    графы поиск в глубину и подобное

    Некоторые IT-компании проводят ежегодное глобальное мероприятие для сотрудников, на котором подводятся итоги года и обсуждаются ключевые точки в развитии всех проектов. В одной из компаний, на которой мы сфокусируемся, планируется обсуждение \(k\) различных ее проектов.

    Для того, чтобы мероприятие прошло интересно, необходимо выбрать хороших спикеров. Есть \(n\) кандидатов, \(i\)-й из которых характеризуется своей осведомленностью о проектах — целым числом \(a_i\) от \(0\) до \(2^k - 1\). При этом некоторые из кандидатов дружат между собой, а именно, есть \(m\) пар друзей \((f_i, s_i)\).

    Разумеется, всем хочется, чтобы мероприятие прошло гладко, а для этого необходимо, чтобы все спикеры попарно дружили между собой. При этом, чтобы рассказы спикеров не казались однообразными, важно, чтобы количество выбранных спикеров было как можно больше. Осведомленностью группы размера \(s\), состоящей из кандидатов \(i_1, i_2, \ldots, i_s\), называется \(a_{i_1} \oplus a_{i_2} \oplus \ldots a_{i_s}\), где \(\oplus\) — операция побитового исключающего <<ИЛИ>>. Соответственно, помимо уже описанных критериев, среди всех подходящих групп кандидатов максимального размера необходимо выбрать группу спикеров с максимальной осведомленностью.

    Мероприятие уже скоро, поэтому процесс набора кандидатов сейчас в самом разгаре. Ваша задача — выбрать оптимальную по описанным критериям группу спикеров.

    Так как список кандидатов еще не утвержден окончательно и может меняться, вам надо решить эту задачу для \(t\) возможных наборов кандидатов.

    Формат входных данных
    В первой строке ввода находится одно целое число \(t\) — количество случаев, для которых надо решить задачу (\(1 \le t \le 120\)). Далее следует описание \(t\) наборов входных данных.

    Первая строка каждого набора содержит три целых числа \(n\), \(m\) и \(k\) — количество кандидатов, количество пар друзей среди кандидатов и количество различных тем, которые будут обсуждаться на конференции, соответственно (\(1 \le n \le 40\); \(0 \le m \le \frac{n \cdot (n - 1)}{2}\); \(0 \le k \le 30\)).

    Во второй строке каждого набора через пробел перечислены \(n\) целых чисел \(a_i\) — уровни осведомленности о проектах каждого из кандидатов (\(0 \le a_i \le 2^k - 1\)).

    Далее следуют \(m\) строк, \(i\)-я из которых содержит два целых числа \(f_i\) и \(s_i\) — номера кандидатов, образующих \(i\)-ю пару друзей (\(1 \le f_i, s_i \le n\); \(f_i \neq s_i\)). Гарантируется, что все перечисленные пары друзей различны.

    Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(120\).

    Формат выходных данных
    Для каждого набора входных данных выведите через пробел два числа в отдельной строке — сначала выведите размер максимальной группы спикеров, а затем выведите максимальную возможную осведомленность группы.

    Замечание

    В примере из условия:

    1. в первом наборе входных данных выгодно выбрать спикеров под номерами \(3\) и \(4\) с осведомленностью \(a_3 \oplus a_4 = 3 \oplus 4 = 7\);

    2. во втором наборе входных данных выгодно выбрать спикеров под номерами \(1\), \(3\) и \(4\) с осведомленностью \(1 \oplus 4 \oplus 8 = 14\);

    3. в третьем наборе входных данных есть единственный способ выбрать четырех попарно дружащих спикеров: выбрать всех, кроме пятого.

    Генеалогическое древо - 2. Потомки

    Словари Деревья поиск в глубину и подобное

    Генеалогическое древо — это графическая схема, описывающая родственные связи в пределах одной семьи. Начало такого дерева — это один предок (родоначальник) или супруги и далее цепочка строится вниз. По заданному генеалогическому древу, определите у каждого элемента число его потомков (не считая самого элемента). 


    Входные данные
    Программа получает на вход число элементов в генеалогическом древе N. Далее следует N−1 строка, задающие родителя для каждого элемента древа, кроме родоначальника. Каждая строка имеет вид имя_потомка имя_родителя.

    Выходные данные

    Программа должна вывести список всех элементов древа в лексикографическом порядке. После вывода имени каждого элемента, необходимо вывести число его потомков.
     

    Пример
    Входные данные Выходные данные
    1
    9
    Alexei Peter_I
    Anna Peter_I
    Elizabeth Peter_I
    Peter_II Alexei
    Peter_III Anna
    Paul_I Peter_III
    Alexander_I Paul_I
    Nicholaus_I Paul_I
    Alexander_I 0
    Alexei 1
    Anna 4
    Elizabeth 0
    Nicholaus_I 0
    Paul_I 2
    Peter_I 8
    Peter_II 0
    Peter_III 3

    История одной страны

    Клеточная геометрия поиск в глубину и подобное

    На летние каникулы Петя приехал в Байтландию. Как оказалась, история этого государства весьма необычна.

    Изначально, до появления Байтландии, на её территории были расположены n различных стран. Каждое государство владело своей территорией, которую можно было представить на карте как прямоугольник, стороны которого параллельны осям координат, а вершины расположены в целочисленных точках. Никакие две страны не пересекались, однако они могли касаться сторонами. Иногда в результате агрессивных переговоров и мирных военных походов две страны объединялись в одну. Слияние происходило только в том случае, если после объединения их владений снова получалась прямоугольная территория. В конце концов осталось только одно государство — Байтландия.

    В начале времён территория каждой страны содержала внутри себя ровно один прямоугольный замок, где стороны этого замка параллельны осям координат, а вершины расположены в целочисленных точках. Допускается, что границы замка могли прилегать к границе соответствующей территории страны и к границам других замков. Удивительным образом, даже после всех переворотов, замки прекрасно сохранились. Но, к сожалению, это единственная информация, которая позволяет хоть как-то судить об изначальном расположении стран.
     

    Возможное формирование Байтландии. Замки отмечены синим цветом.
     
    Петя не смог смириться с тем, что не осталось никаких данных об изначальных странах. У него возникло подозрение, что вся эта история всего лишь вымысел. Он знает, что вы умный человек, и поэтому просит у вас помощи. Требуется выяснить, существует ли расположение изначальных государств, для которых может быть верна данная история, или нет.

    Входные данные
    Первая строка содержит одно целое число n (1 ≤ n ≤ 100000) — количество замков и стран.

    Каждая из следующих n строк содержат четыре целых числа ai, bi, ci, di (0 ≤ ai  < ci ≤ 109, 0 ≤ bi < di ≤ 109) — координаты вершин i-го замка, где (ai, bi) — координаты левой нижней точки, а (ci, di) — правой верхней.

    Гарантируется, что никакие два замка не пересекаются, однако они могут касаться сторонами.

    Выходные данные
    Если существуют расположения изначальных стран, для которых верна данная история, то выведите « YES », иначе выведите « NO ».

    Примечание
    На картинках ниже изображено расположение замков в первом и втором примере.
    Примеры
    Входные данные Выходные данные
    1 4
    0 0 1 2
    0 2 1 3
    1 0 2 1
    1 1 2 3
    YES
    2 4
    0 0 2 1
    1 2 3 3
    2 0 3 2
    0 1 1 3
    NO

    Условное форматирование

    поиск в глубину и подобное Задачи на моделирование

    В свободное от программирования время Вася увлекается экспериментами, и его любимый — переливание воды между колбами. У него есть две колбы размером a и b миллилитров соответственно, и неограниченное количество воды. Вася может производить с ними следующие действия:

    •  Налить воду в первую колбу до края (после этого в ней будет a миллилитров воды)
    •  Полностью вылить воду из первой колбы
    •  Налить воду во вторую колбу до края (после этого в ней будет b миллилитров воды)
    •  Полностью вылить воду из второй колбы
    •  Перелить воду из первой колбы во вторую. В этом случае, если во второй колбе достаточно места, чтобы уместить всю текущую воду первой колбы, вода из первой колбы переливается полностью во вторую. Если же во второй колбе места недостаточно, вторая колба заполняется до предела (в ней после этого будет b миллилитров воды), а в первой колбе остается все остальное.
    Состоянием колб Вася называет упорядоченную пару (x, y), где x — текущее количество воды в первой колбе, а y— во второй. Вася хочет изучить поставленную самим собой задачу и понять, сколько различных состояний он может получить описанными выше переливаниями.
    Входные данные
    В единственной строке входного  через пробел записаны два натуральных числа a и b (1 ≤ a, b ≤ 100) — емкости первой и второй колбы соответственно.
    Выходные данные
    В единственной строке выходного выведите одно число — число различных состояний, которое можно получить описанными в задаче переливаниями воды.
     
    Ввод Вывод
    2 5 14

    Транзитивное замыкание

    графы кратчайшие пути поиск в глубину и подобное

    Невзвешенный ориентированный граф задан своей матрицей смежности. Требуется построить его транзитивное замыкание, то есть матрицу, в которой в i-й строке и j-м столбце находится 1, если от вершины i можно добраться до вершины j, и 0 - иначе.
     
    Входные данные
    В первой строке дано число N (1<=N<=100) - число вершин в графе. Далее задана матрица смежности графа: в N строках даны по N чисел 0 или 1 в каждой. i-е число в i-й строке всегда равно 1.
     
    Выходные данные
    Необходимо вывести матрицу транзитивного замыкания графа в формате, аналогичным формату матрицы смежности.

    Ввод Вывод
    4
    1 1 0 0
    0 1 1 0
    1 0 1 0
    0 0 1 1
    1 1 1 0 
    1 1 1 0 
    1 1 1 0 
    1 1 1 1 

    Перекрестные ребра

    Обход в глубину поиск в глубину и подобное

    Дан связный ориентированный невзвешенный граф. Требуется вывести номера вершин из которых исходят все его перекрестные ребра (нумерация с 1).
     
    Входные данные:
    Целое число n и m - число вершин и ребер в графе.
    Следующие m строк содержат 2 числа a и b, показывающие, что из вершины a есть ребро в вершину b.
     
    Выходные данные:
    В первой строке должно находиться число n - количество перекрестных ребер, в следующей строке должны быть перечисленны вершины в порядке возрастания без повторений. Если таковых нет, тогда следует вывести -1.

    Обратные ребра

    поиск в глубину и подобное графы

    Дан связный ориентированный невзвешенный граф. Требуется вывести номера вершин из которых исходят все его обратные ребра (нумерация с 1).
     
    Входные данные:
    Целое число n и m - число вершин и ребер в графе.
    Следующие m строк содержат 2 числа a и b, показывающие, что из вершины a есть ребро в вершину b.
     
    Выходные данные:
    В первой строке должно находиться число n - количество обратных ребер, в следующей строке должны быть перечисленны вершины в порядке возрастания без повторений. Если обратных ребер нет, тогда следует вывести -1.