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


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

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

E. Соня и магазины

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

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

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

У Сони есть ровно \(k\) друзей, которым она доверяет. Если она откроет магазин, один с её друзей должен там работать и смотреть, чтобы никто не ел мороженое не заплатив. Поскольку Соня не хочет пропускать важные соревнования по программированию, непосредственно в магазинах она работать не будет.

Соня хочет, чтобы все её магазины мороженого образовали простой путь длины \(r\) (\(1 \le r \le k\)), то есть были расположены в различных перекрёстках \(f_1, f_2, \dots, f_r\) и существовала улица между \(f_i\) и \(f_{i+1}\) для всех \(i\) от \(1\) до \(r-1\).

Девочка заботится о потенциальных покупателях, поэтому, она также хочет минимизировать максимальное расстояние от перекрестков до ближайшего магазина мороженого. Расстояние между двумя перекрестками \(a\) и \(b\) равно сумме длин всех улиц, которые нужно пройти, чтобы попасть с перекрестка \(a\) на перекресток \(b\). Таким образом, девочка хочет минимизировать

\(\)\max_{a} \min_{1 \le i \le r} d_{a,f_i}\(\),

где \(a\) принимает значение всевозможных \(n\) перекрёстков, \(f_i\) — перекресток с \(i\)-м магазином Сони, а \(d_{x,y}\) — расстояние между перекрестками \(x\) и \(y\).

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

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

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

Каждая из следующих \(n-1\) строк содержит три целых числа \(u_i\), \(v_i\) и \(d_i\) (\(1\leq u_i, v_i\leq n\), \(v_i\neq u_i\), \(1\leq d\leq 10^4\)) — перекрестки, которые соединяет улица и длина этой улицы. Гарантируется, что между любой парой перекрестков не более одной улицы. Гарантируется, что можно доехать из любого перекрестка в любой другой, двигаясь только по улицам.

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

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

Примечание

В первом примере можно выбрать путь 2-4, тогда ответ будет 4.

Первый пример.

Во втором примере можно выбрать путь 4-1-2, тогда ответ будет 7.

Второй пример.

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\).

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

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.

F. Сделай единицу

битмаски дп Комбинаторика кратчайшие пути математика теория чисел *2500

Януш — бизнесмен. Он владеет компанией «Янушзекс», которая производит игры для школьников. Последним хитом Янушзекс является крутая игра для одного человека «Сделай единицу». Игроку дана последовательность из \(n\) целых чисел \(a_i\).

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

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

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

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 300\,000\)).

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

Если нет ни одного подмножества данной последовательности с наибольшим общим делителем равным \(1\), то выведите -1.

Иначе выведите ровно одно целое число — размер минимального множества с наибольшим общим делителем равным \(1\).

Примечание

В первом примере подмножество, соответствующее всей последовательности даёт наибольший общий делитель равный \(1\). Все меньшие подмножества дают наибольший общий делитель больший \(1\).

Во втором примере наибольший общий делитель любого подмножества хотя бы \(2\).

F. Самое короткое условие

графы Деревья кратчайшие пути *2400

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

Вам нужно ответить на \(q\) запросов, \(i\)-й запрос — найти кратчайшее расстояние между вершинами \(u_i\) и \(v_i\).

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

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

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

Следующая строка содержит целое число \(q~(1 \le q \le 10^5)\) — количество запросов.

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

Обратите внимание на необычное ограничение \(m - n ~ \le ~ 20\).

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

Выведите \(q\) строк.

В \(i\)-й строке должен содержаться ответ на \(i\)-й запрос — кратчайшее расстояние между вершинами \(u_i\) и \(v_i\).

B. Лабиринт

графы кратчайшие пути *1800

В одном из уровней компьютерной игры вы попали в лабиринт, состоящий из n строк, каждая из которых содержит m клеток. Каждая клетка либо свободна, либо занята препятствием. Стартовая клетка находится в строке r и столбце c. За один шаг вы можете переместиться на одну клетку вверх, влево, вниз или вправо, если она не занята препятствием. Вы не можете перемещаться за границы лабиринта.

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

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

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

Первая строка содержит два целых числа n, m (1 ≤ n, m ≤ 2000) — количество строк и столбцов в лабиринте, соответственно.

Вторая строка содержит два целых числа r, c (1 ≤ r ≤ n, 1 ≤ c ≤ m) — номер строки и столбца, на пересечении которых расположена стартовая клетка.

Третья строка содержит два целых числа x, y (0 ≤ x, y ≤ 109) — максимальное количество перемещений влево и вправо, соответственно.

Следующие n строк содержат описание лабиринта. Каждая из этих строк имеет длину m и состоит только из символов '.' и '*'. В i-й строке j-й символ соответствует клетке лабиринта с номерами строки и столбца i и j, соответственно. Символ '.' соответствует свободной клетке лабиринта, а символ '*' — клетке с препятствием.

Гарантируется, что стартовая клетка не занята препятствием.

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

Выведите одно число — количество клеток лабиринта, достижимых из стартовой, включая её саму.

Примечание

Клетки, достижимые в соответствующем примере, отмечены '+'.

Первый пример


+++..
+***.
+++**
*+++.

Второй пример


.++.
.+*.
.++.
.++.

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)\)

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. Find a Number

графы дп кратчайшие пути теория чисел *2200

You are given two positive integers \(d\) and \(s\). Find minimal positive integer \(n\) which is divisible by \(d\) and has sum of digits equal to \(s\).

Input

The first line contains two positive integers \(d\) and \(s\) (\(1 \le d \le 500, 1 \le s \le 5000\)) separated by space.

Output

Print the required number or -1 if it doesn't exist.

D. Удаление ребер

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

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

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

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

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

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

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

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

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

В первой строке выведите \(e\) — количество ребер, которые останутся в графе (\(0 \le e \le k\)).

Во второй строке выведите \(e\) различных целых чисел от \(1\) до \(m\) — номера ребер, которые останутся в графе. Ребра пронумерованы в том же порядке, в котором задавались во входных данных. Количество хороших вершин должно быть максимально возможным.

D. Максимальное расстояние

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

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

Дан связный неориентированный граф, состоящий из \(n\) вершин и \(m\) взвешенных ребер. Также есть \(k\) выделенных вершин: \(x_1, x_2, \ldots, x_k\).

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

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

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

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

Первая строка содержит три целых числа \(n\), \(m\) и \(k\) (\(2 \leq k \leq n \leq 10^5\), \(n-1 \leq m \leq 10^5\)).

Вторая строка содержит \(k\) различных целых чисел \(x_1, x_2, \ldots, x_k\) (\(1 \leq x_i \leq n\)).

В каждой из следующих \(m\) строк записаны по три целых числа \(u\), \(v\) и \(w\) (\(1 \leq u,v \leq n, 1 \leq w \leq 10^9\)), задающие ребро между \(u\) и \(v\) веса \(w\). Заданный граф — неориентированный, то есть каждое ребро \((u, v)\) может быть использовано в любом из двух направлений.

В графе могут содержаться кратные рёбра и петли.

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

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

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

Примечание

В первом примере, расстояние между вершинами \(1\) и \(2\) равно \(2\), потому что можно пройти по ребру веса \(2\), соединяющему их. Поэтому, расстояние до самой далекой точки от обеих вершин \(1\) и \(2\) равно \(2\).

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

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

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\}\), которая является лексикографически наименьшей.

G. Двойное дерево

Деревья кратчайшие пути разделяй и властвуй Структуры данных *2700

Вам дан неориентированный граф специального вида. Он состоит из \(2n\) вершин, пронумерованных от \(1\) до \(2n\). Граф обладает следующими свойствами:

  • в нем ровно \(3n-2\) ребра: \(n\) ребер соединяют вершины с четными номерами и вершины с нечетными номерами, \(n - 1\) ребер соединяют вершины с нечетными номерами друг с другом, и \(n - 1\) ребер соединяют вершины с четными номерами друг с другом;
  • для каждого ребра \((u, v)\) между вершинами с нечетными номерами существует ребро \((u + 1, v + 1)\), и наоборот;
  • для каждого нечетного числа \(u \in [1, 2n - 1]\) существует ребро \((u, u + 1)\);
  • граф является связным; более того, если мы удалим все четные вершины и ребра, инцидентные им, граф станет деревом (то же самое произойдет, если удалить все нечетные вершины).

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

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

Вам даны \(q\) запросов к графу; в каждом запросе требуется подсчитать длину кратчайшего пути между какой-то парой вершин. Можете ли вы справиться со всеми запросами?

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

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

Во второй строке записаны \(n\) целых чисел \(w_{1, 2}\), \(w_{3,4}\), ..., \(w_{2n - 1, 2n}\) (\(1 \le w_{i, i + 1} \le 10^{12}\)). Эти числа обозначают веса ребер, соединяющих вершины разной четности.

Затем следуют \(n-1\) строк. В \(i\)-й строке записаны четыре числа \(x_i\), \(y_i\), \(w_{i, 1}\) и \(w_{i, 2}\) (\(1 \le x_i, y_i \le n\), \(x_i \ne y_i\), \(1 \le w_{i, j} \le 10^{12}\)); она обозначает два ребра, одно из которых соединяет \(2x_i - 1\) с \(2y_i - 1\) и имеет вес \(w_{i, 1}\); а второе соединяет \(2x_i\) с \(2y_i\) и имеет вес \(w_{i, 2}\).

В следующей строке записано одно целое число \(q\) (\(1 \le q \le 6 \cdot 10^5\)) — количество запросов.

Затем следуют \(q\) строк, \(i\)-я строка содержит два целых числа \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le 2n\), \(u_i \ne v_i\)). Она обозначает запрос «посчитайте длину кратчайшего пути между вершинами \(u_i\) и \(v_i\)».

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

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

Примечание

Граф в первом тесте выглядит следующим образом:

F. Цена поездки

графы кратчайшие пути Структуры данных *3000

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

Куро является владельцем одной такси-компании. Он хочет ввести новую ценовую политику в своей компании, согласно которой цена поездки зависит не от длины поездки, а от суммы цен дорог, по которым проедет такси. Цену каждой из \(m\) дорог назначает лично Куро.

В настоящий момент, цена \(i\)-й дороги равна \(w_i\) и соответственно цена поездки на такси по дорогам \(e_1, e_2, \ldots, e_k\) равна \(\sum_{i=1}^k w_{e_i}\).

Однако Куро сам по себе не очень решительный человек, так что он подготовил \(q\) планов по изменению цен дорог. Каждый из планов основан на изначальных ценах \(w_i\), за исключением одной дороги \(t_j\), цена которой меняется на \(x_j\). Обратите внимание, что все планы независимы друг от друга.

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

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

Первая строка содержит три целых числа \(n\), \(m\) и \(q\) (\(2 \le n \le 2 \cdot 10^5\), \(1 \le m, q \le 2 \cdot 10^5\)) — количество городов, количество дорог и количество планов, которые набросал Куро.

\(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 \ne v_i\)) — концы и исходная цена \(i\)-й дороги.

Гарантируется, что существует хотя бы один способ добраться из города \(1\) в город \(n\) по данным \(m\) двусторонним дорогам.

Каждая из следующих \(q\) строк содержит два целых числа \(t_j\) и \(x_j\) (\(1 \leq t_j \leq m, 1 \leq x_j \leq 10^9\)) — номер дороги меняющейся в очередном плане и её новая цена.

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

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

Примечание

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

В первом плане цены выглядят следующим образом:

Наименьшая возможная цену поездки Широ в этом плане равна \(4\), для этого ей нужно поехать по пути \(1 \rightarrow 4\).

Во втором плане цены выглядят следующим образом:

Наименьшая возможная цену поездки Широ в этом плане равна \(2\), для этого ей нужно поехать по пути \(1 \rightarrow 3 \rightarrow 4\).

В третьем плане цены выглядят следующим образом:

Наименьшая возможная цену поездки Широ в этом плане равна \(5\), для этого ей нужно поехать по пути \(1 \rightarrow 2 \rightarrow 4\).

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\)), но три так же подойдут.

E. Подпоследовательности (легкая версия)

графы дп кратчайшие пути реализация *2000

Единственное отличие между легкой и сложной версиями — ограничения.

Подпоследовательность строки может быть получена из другой строки при помощи удаления некоторого (возможно, нулевого) количества символов без изменения порядка оставшихся символов. Удаляемые символы не обязательно должны идти друг за другом, между ними могут быть любые пропуски. Например, для строки «abaca» следующие строки являются ее подпоследовательностями: «abaca», «aba», «aaa», «a» и «» (пустая строка). А следующие строки не являются подпоследовательностями: «aabaca», «cb» и «bcaa».

Вам задана строка \(s\), состоящая из \(n\) строчных букв латинского алфавита.

За один ход вы можете выбрать любую подпоследовательность \(t\) заданной строки и добавить ее во множество \(S\). Множество \(S\) не может содержать одинаковых элементов. Этот ход стоит \(n - |t|\), где \(|t|\) равно длине добавляемой подпоследовательности (то есть цена равна количеству удаленных символов).

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

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

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

Вторая строка входных данных содержит строку \(s\), состоящую из \(n\) строчных букв латинского алфавита.

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

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

Примечание

В первом тестовом примере мы можем составить \(S\) = { «asdf», «asd», «adf», «asf», «sdf» }. Стоимость первого элемента в \(S\) равна \(0\), а стоимости остальных равны \(1\). Таким образом, суммарная стоимость \(S\) равна \(4\).

B2. Доктор встречает Вейдера (средняя)

графы кратчайшие пути Паросочетания Потоки сортировки *2200

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

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

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

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

У каждого космического корабля есть его местоположение \(x\), обозначающее индекс планеты, на которой он находится, его сила атаки \(a\) и определённый уровень топлива \(f\).

У каждой базы есть местоположение \(x\) и уровень защиты \(d\).

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

  • Сила атаки космического корабля больше или равна уровня защиты базы,
  • Уровень топлива космического корабля больше или равен кратчайшему расстоянию (количество червоточин) между планетой космического корабля и планетой с базой

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

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

Таким образом, для каждой атакованной базы повстанцы теряют по \(k\) золота.

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

Разумеется, фейковые базы не содержат золота, но создание одной такой базы стоит \(h\) золота.

Какое минимальное количество золота повстанцы потеряют, если они создадут оптимальное количество фейковых баз?

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

Первая строка содержит целые числа \(n\) и \(m\) (\(1 \leq n \leq 100\), \(0 \leq m \leq 10000\)) — количество вершин и количество рёбер.

Каждая из следующих \(m\) строк содержит два целых числа \(u\) и \(v\) (\(1 \leq u\), \(v \leq n\)), обозначающие неориентированное ребро между двумя вершинами.

Следующая строка содержит четыре целых числа \(s\), \(b\), \(k\) и \(h\) (\(1 \leq s\), \(b \leq 1000\), \(0 \leq k\), \(h \leq 10^9\)) — количество космических кораблей, количество баз, штраф за атакованную базу и цена создания фейковой базы.

Каждая из следующих \(s\) строк содержит три целых числа \(x\), \(a\), \(f\) (\(1 \leq x \leq n\), \(0 \leq a\), \(f \leq 10^9\)) — местоположение, атака и уровень топлива у космического корабля.

Каждая из следующих \(b\) строк содержит два целых числа \(x\), \(d\) (\(1 \leq x \leq n\), \(0 \leq d \leq 10^9\)) — местоположение и зашищённость базы.

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

Выведите одно целое число — минимальную цену в золоте.

Примечание

Один из способов минимизировать стоимость — это построить \(4\) фейковые базы, тем самым итоговая стоимость равна \(4 \times 3 = 12\).

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

B3. Доктор встречает Вейдера (сложная)

кратчайшие пути Потоки *2700

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

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

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

Каждый космический корабль имеет местоположение \(x\), обозначающее индекс планеты, на которой он расположен, силу атаки \(a\), определённый уровень энергии \(f\) и цена эксплуатации \(p\).

Каждая база имеет местоположение \(x\), силу защиты \(d\) и определённый уровень золота \(g\).

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

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

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

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

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

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

Повстанцы попросили Хайди и Доктора определить какой набор кораблей следует использовать, чтобы получить максимальную суммарную прибыль.

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

В частности есть список из \(k\) зависимостей вида \(s_1, s_2\), обозначающие, что корабль \(s_1\) можно использовать только если корабль \(s_2\) тоже используется.

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

Первая строка содержит целые числа \(n\) и \(m\) (\(1 \leq n \leq 100\), \(0 \leq m \leq 10000\)) — количество вершин и количество рёбер.

Следующие \(m\) строк содержат целые числа \(u\) и \(v\) (\(1 \leq u, v \leq n\)), обозначающие неориентированное ребро между двумя вершинами.

Следующая строка содержит целые числа \(s\), \(b\) и \(k\) (\(1 \leq s, b \leq 10^5\), \(0 \leq k \leq 1000\)) — количество космических кораблей, баз и зависимостей.

Следующие \(s\) строк содержат целые числа \(x, a, f, p\) (\(1 \leq x \leq n\), \(0 \leq a, f, p \leq 10^9\)) — местоположение, сила атаки, уровень топлива и цену эксплуатации корабля. Корабли пронумерованы от \(1\) до \(s\).

Следующие \(b\) строк содержат целые числа \(x, d, g\) (\(1 \leq x \leq n\), \(0 \leq d, g \leq 10^9\)) — обозначающие местоположение, уровень защиты и количество золота на базе.

Следующие \(k\) строк содержат целые числа \(s_1\) и \(s_2\) (\(1 \leq s_1, s_2 \leq s\)), обозначающие зависимость \(s_1\) от \(s_2\).

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

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

Примечание

Оптимальной стратегией является выбрать корабли 1, 2, and 4, которые будут атаковать базы 1, 1 и 2 соответственно.

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. К-й путь

Конструктив кратчайшие пути Перебор сортировки *2200

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

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

Более формально, если \(d\) — матрица кратчайших путей, где \(d_{i, j}\) равно длине кратчайшего пути между вершинами \(i\) и \(j\) (\(1 \le i < j \le n\)), то вам необходимо вывести \(k\)-й элемент в отсортированном массиве, состоящем из всех \(d_{i, j}\), где \(1 \le i < j \le n\).

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

Первая строка входных данных содержит три целых числа \(n, m\) и \(k\) (\(2 \le n \le 2 \cdot 10^5\), \(n - 1 \le m \le \min\Big(\frac{n(n-1)}{2}, 2 \cdot 10^5\Big)\), \(1 \le k \le \min\Big(\frac{n(n-1)}{2}, 400\Big)\)) — количество вершин в графе, количество ребер в графе и значение \(k\) соответственно.

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

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

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

Выведите одно целое число — длину \(k\)-го минимального кратчайшего пути в заданном графе (пути из вершины в саму себя не учитываются, пути из вершины \(i\) в вершину \(j\) и из вершины \(j\) в вершину \(i\) считаются за один).

E. Культурный код

Бинарный поиск дп Комбинаторика кратчайшие пути сортировки Структуры данных *2300

В магазине неподалеку продаются известные русские деревянные игрушки под названием «матрешки», и вы бы хотели приобрести несколько штук. В магазине продается \(n\) различных матрешек. Любая матрешка — это фигурка объема \(out_i\) с пустотой внутри объемом \(in_i\) (конечно, \(out_i > in_i\)).

У вас не так много свободного места в сумке, но, к счастью, вы знаете, что матрешки можно вкладывать друг в друга. Формально, назовем набор матрешек вкладываемым, если мы можем переупорядочить их таким образом, что первая матрешка вкладывается во вторую, вторая — в третью и так далее. Матрешка \(i\) вкладывается в матрешку \(j\), если \(out_i \le in_j\). Только последняя игрушка из вкладываемого набора будет занимать место в вашей сумке.

Назовем пустотой вкладываемого набора общий объем пустого места внутри данной структуры. Очевидно, что она равна \(in_{i_1} + (in_{i_2} - out_{i_1}) + (in_{i_3} - out_{i_2}) + \dots + (in_{i_k} - out_{i_{k-1}})\), где \(i_1\), \(i_2\), ..., \(i_k\) — индексы выбранных матрешек в порядке их вкладывания.

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

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

Так как ответ может быть очень большим — выведите его по модулю \(10^9 + 7\).

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

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

Следующие \(n\) строк содержат описание каждой матрешки: два целых числа \(out_i\) и \(in_i\) (\(1 \le in_i < out_i \le 10^9\)) — внешний и внутренний объемы \(i\)-й матрёшки.

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

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

Примечание

В первом примере есть ровно \(6\) достаточно больших вкладываемых поднаборов с минимальной пустотой:

  • \(\{1, 5\}\): мы не можем добавить в него другие матрешки, не нарушая вкладываемость; пустота поднабора равна \(1\);
  • \(\{1, 6\}\);
  • \(\{2, 4, 5\}\);
  • \(\{2, 4, 6\}\);
  • \(\{3, 4, 5\}\);
  • \(\{3, 4, 6\}\).

Других «хороших» поднаборов нет, потому что, например, поднабор \(\{6, 7\}\) не достаточно большой (в него можно добавить \(4\)-ю матрешку), а поднабор \(\{4, 6, 7\}\) имеет пустоту, равную \(2\).

E1. Ночной шахмар (простая)

графы интерактив кратчайшие пути *2900

Эта задача отличается от следующей только ограничениями.

Это интерактивная задача.

Алиса и Боб играют в игру на шахматной доске размера \(n \times m\), где \(n\) и \(m\) являются чётными числами. Ряды доски пронумерованы целыми числами от \(1\) до \(n\), а столбцы пронумерованы от \(1\) до \(m\). На доске расположены два коня — белый и чёрный. Белый изначально находится в клетке \((x_1, y_1)\), а чёрный — в клетке \((x_2, y_2)\). Алиса выбирает коня, которым будет играть сама, а Боб будет играть другим.

Алиса и Боб будут делать ходы по очереди. Тот, кто играет белым конём, начинает игру. За один ход каждый игрок должен передвинуть своего коня в соответствии с шахматными правилами. А именно, если сейчас конь находится в клетке \((x, y)\), то его можно передвинуть в любую из следующих клеток (в предположении, что они находятся в пределах шахматной доски):

\((x+1, y+2)\), \((x+1, y-2)\), \((x-1, y+2)\), \((x-1, y-2)\),

\((x+2, y+1)\), \((x+2, y-1)\), \((x-2, y+1)\), \((x-2, y-1)\).

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

  • владелец белого коня выиграет, если он возьмет чёрного коня, или если белый конь окажется в клетке \((n/2, m/2)\), которую в этот момент не бьёт черный конь;
  • владелец чёрного коня выигрывает, если он возьмет белого коня, или если чёрный конь окажется в клетке \((n/2+1, m/2)\), которую в этот момент не бьёт белый конь.

Формально, игрок, взявший другого коня, выигрывает. Кроме того, игрок, находящийся в требуемой позиции (\((n/2, m/2)\) для белого коня, \((n/2+1, m/2)\) для чёрного коня) не под боем оппонента, выигрывает.

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

Если Алиса сделала \(350\) ходов и никто не выиграл, игра заканчивается вничью.

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

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

Взаимодействие начинается с двух целых чисел \(n\) и \(m\) (\(6 \le n,m \le 40\), \(n\) и \(m\) чётные) — размеров доски.

Вторая строка содержит четыре целых числа \(x_1, y_1, x_2, y_2\) (\(1 \le x_1, x_2 \le n\), \(1 \le y_1, y_2 \le m\)) — клетки, в которых расположен белый и чёрный конь. Гарантируется, что два коня находятся в разных клетках. Также гарантируется, что ни один из коней сейчас не находится в своей требуемой клетке (однако он может находится в требуемой клетке своего соперника).

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

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

После каждого хода оппонента вы получите два целых числа: \(x\) и \(y\) — координаты клетки, куда Боб переместил своего коня.

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

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

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

Взломы в этой задаче отключены.

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

Примечание

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

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

E2. Ночной шахмар (сложная)

графы интерактив кратчайшие пути *3000

Это интерактивная задача.

Алиса и Боб играют в игру на шахматной доске размера \(n \times m\), где \(n\) и \(m\) являются чётными числами. Ряды доски пронумерованы целыми числами от \(1\) до \(n\), а столбцы пронумерованы от \(1\) до \(m\). На доске расположены два коня — белый и чёрный. Белый изначально находится в клетке \((x_1, y_1)\), а чёрный — в клетке \((x_2, y_2)\). Алиса выбирает коня, которым будет играть сама, а Боб будет играть другим.

Алиса и Боб будут делать ходы по очереди. Тот, кто играет белым конём, начинает игру. За один ход каждый игрок должен передвинуть своего коня в соответствии с шахматными правилами. А именно, если сейчас конь находится в клетке \((x, y)\), то его можно передвинуть в любую из следующих клеток (в предположении, что они находятся в пределах шахматной доски):

\((x+1, y+2)\), \((x+1, y-2)\), \((x-1, y+2)\), \((x-1, y-2)\),

\((x+2, y+1)\), \((x+2, y-1)\), \((x-2, y+1)\), \((x-2, y-1)\).

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

  • владелец белого коня выиграет, если он возьмет чёрного коня, или если белый конь окажется в клетке \((n/2, m/2)\), которую в этот момент не бьёт черный конь;
  • владелец чёрного коня выигрывает, если он возьмет белого коня, или если чёрный конь окажется в клетке \((n/2+1, m/2)\), которую в этот момент не бьёт белый конь.

Формально, игрок, взявший другого коня, выигрывает. Кроме того, игрок, находящийся в требуемой позиции (\((n/2, m/2)\) для белого коня, \((n/2+1, m/2)\) для чёрного коня) не под боем оппонента, выигрывает.

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

Если Алиса сделала \(350\) ходов и никто не выиграл, игра заканчивается вничью.

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

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

Взаимодействие начинается с двух целых чисел \(n\) и \(m\) (\(6 \le n,m \le 1000\), \(n\) и \(m\) чётные) — размеров доски.

Вторая строка содержит четыре целых числа \(x_1, y_1, x_2, y_2\) (\(1 \le x_1, x_2 \le n\), \(1 \le y_1, y_2 \le m\)) — клетки, в которых расположен белый и чёрный конь. Гарантируется, что два коня находятся в разных клетках. Также гарантируется, что ни один из коней сейчас не находится в своей требуемой клетке (однако он может находится в требуемой клетке своего соперника).

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

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

После каждого хода оппонента вы получите два целых числа: \(x\) и \(y\) — координаты клетки, куда Боб переместил своего коня.

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

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

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

Взломы в этой задаче отключены.

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

Примечание

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

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

B. Вам задана десятичная строка...

дп кратчайшие пути Перебор *1700

Предположим, у вас есть специальный \(x\)-\(y\)-счетчик. Этот счетчик способен хранить некоторое число в десятичной записи; первоначально это число \(0\).

Счетчик выполняет следующий алгоритм: он выводит последнюю цифру своего значения, и после этого прибавляет к своему значению либо \(x\), либо \(y\). Поэтому все последовательности, порожденные им, начинаются с \(0\). Для примера, \(4\)-\(2\)-счетчик может вести себя следующим образом:

  1. он выводит \(0\) и добавляет \(4\) к своему значению, поэтому текущее значение — \(4\), и вывод — \(0\);
  2. он выводит \(4\) и добавляет \(4\) к своему значению, текущее значение — \(8\), и вывод — \(04\);
  3. он выводит \(8\) и добавляет \(4\) к своему значению, текущее значение — \(12\), и вывод — \(048\);
  4. он выводит \(2\) и добавляет \(2\) к своему значению, текущее значение — \(14\), и вывод — \(0482\);
  5. он выводит \(4\) и добавляет \(4\) к своему значению, текущее значение — \(18\), и вывод — \(04824\).

Это только один из возможных выводов; например, этот же счетчик мог сгенерировать \(0246802468024\) как вывод, если бы он добавлял \(2\) на каждом шаге.

Вы выписали последовательность, которая была сгенерирована \(x\)-\(y\)-счетчиком. Но последовательность была испорчена и некоторые ее элементы могли быть стерты.

Теперь вы хотите восстановить эту последовательность, но вы даже не знаете тип счетчика, который вы использовали. У вас есть только десятичная строка \(s\) — оставшиеся элементы последовательности.

Для каждого \(0 \le x, y < 10\) посчитайте минимальное количество цифр, которое вам необходимо вставить в строку \(s\), чтобы сделать ее возможным выводом \(x\)-\(y\)-счетчика. Заметим, что вы не можете менять порядок цифр в строке \(s\) или стирать какие-то цифры; разрешены только вставки.

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

В первой строке задана одна строка \(s\) (\(1 \le |s| \le 2 \cdot 10^6\), \(s_i \in \{\text{0} - \text{9}\}\)) — оставшаяся от последовательности информация. Гарантируется, что \(s_1 = 0\).

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

Выведите матрицу \(10 \times 10\), где \(j\)-й элемент (\(0\)-индексация) на \(i\)-й строке (тоже \(0\)-индексация) равен минимальному количеству цифр, которые необходимо вставить в строку \(s\), чтобы сделать ее возможным выводом \(i\)-\(j\)-счетчика, либо \(-1\), если так сделать невозможно.

Примечание

Возьмем, например, \(4\)-\(3\)-счетчик. Один из возможных выводов, который он мог выдать, — \(0(4)8(1)4(7)0\) (в скобках потерянные элементы).

Один из возможных выводов \(2\)-\(3\)-счетчика — \(0(35)8(1)4(7)0\).

А \(6\)-\(8\)-счетчик, например, мог вывести ровно строку \(0840\).

C. Анна, Святослав и карта

графы дп жадные алгоритмы кратчайшие пути *1700

Главные герои были опущены для краткости.

Вам дан ориентированный невзвешенный граф без петель с \(n\) вершинами и путь в нём (не обязательно простой), заданный последовательностью \(p_1, p_2, \ldots, p_m\) из \(m\) вершин; для любого \(1 \leq i < m\) существует дуга из \(p_i\) в \(p_{i+1}\).

Будем называть последовательность \(v_1, v_2, \ldots, v_k\) из \(k\) вершин хорошей, если \(v\) является подпоследовательностью \(p\), \(v_1 = p_1\), \(v_k = p_m\), и \(p\) является одним из кратчайших путей, проходящих через вершины \(v_1\), \(\ldots\), \(v_k\) в этом порядке.

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

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

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

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 100\)) — количество вершин в графе.

Следующие \(n\) строк задают граф матрицей смежности: \(j\)-й символ в \(i\)-й строке равен \(1\), если есть дуга из вершины \(i\) в вершину \(j\), иначе равен \(0\). Гарантируется, что заданный граф не имеет петель.

Следующая строка содержит одно целое число \(m\) (\(2 \le m \le 10^6\)) — количество вершин в выбранном пути.

Следующая строка содержит \(m\) целых чисел \(p_1, p_2, \ldots, p_m\) (\(1 \le p_i \le n\)) — вершины в пути. Гарантируется, что для любого \(1 \leq i < m\) существует дуга из \(p_i\) в \(p_{i+1}\).

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

В первой строке выведите одно число \(k\) (\(2 \leq k \leq m\)) — длину кратчайшей хорошей подпоследовательности. Во второй строке выведите \(k\) целых чисел \(v_1\), \(\ldots\), \(v_k\) (\(1 \leq v_i \leq n\)) — вершины в подпоследовательности. Если существует несколько кратчайших хороших подпоследовательностей, выведите любую. Любые два последовательные числа должны быть различны.

Примечание

На рисунке представлен граф для первого примера:

Заданный путь проходит через вершины \(1\), \(2\), \(3\), \(4\). Последовательность \(1-2-4\) является хорошей, т.к. она является подпоследовательностью заданного пути, её первый и последний элементы совпадают с первым и последним элементом заданного пути, и кратчайший путь, проходящий через вершины \(1\), \(2\) и \(4\) в этом порядке, это \(1-2-3-4\). Обратите внимание, что последовательности \(1-4\) и \(1-3-4\) не подходят, т. к. в обоих случаях кратчайший путь, проходящий через вершины этих последовательностей, это \(1-3-4\).

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

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

B. Кратчайший цикл

битмаски графы кратчайшие пути Перебор *1900

Даны \(n\) целых чисел \(a_1, a_2, \dots, a_n\). Рассмотрим граф на \(n\) вершинах, в котором вершины \(i\), \(j\) (\(i\neq j\)) соединены тогда и только тогда, когда \(a_i\) И \(a_j\neq 0\), где И обозначает операцию побитового И.

Найдите длину кратчайшего цикла в этом графе, или определите, что в графе нет циклов.

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

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

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 10^{18}\)).

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

Если в графе нет циклов, выведите \(-1\). Иначе выведите длину кратчайшего цикла.

Примечание

В первом примере, самым коротким циклом будет \((9, 3, 6, 28)\).

Во втором примере, самым коротким циклом будет \((5, 12, 9)\).

В графе нет циклов в третьем примере.

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\).

G. Alpha planetary system

графы Конструктив кратчайшие пути *3000

Three planets \(X\), \(Y\) and \(Z\) within the Alpha planetary system are inhabited with an advanced civilization. The spaceports of these planets are connected by interplanetary space shuttles. The flight scheduler should decide between \(1\), \(2\) and \(3\) return flights for every existing space shuttle connection. Since the residents of Alpha are strong opponents of the symmetry, there is a strict rule that any two of the spaceports connected by a shuttle must have a different number of flights.

For every pair of connected spaceports, your goal is to propose a number \(1\), \(2\) or \(3\) for each shuttle flight, so that for every two connected spaceports the overall number of flights differs.

You may assume that:

1) Every planet has at least one spaceport

2) There exist only shuttle flights between spaceports of different planets

3) For every two spaceports there is a series of shuttle flights enabling traveling between them

4) Spaceports are not connected by more than one shuttle

Input

The first row of the input is the integer number \(N\) \((3 \leq N \leq 100 000)\), representing overall number of spaceports. The second row is the integer number \(M\) \((2 \leq M \leq 100 000)\) representing number of shuttle flight connections.

Third row contains \(N\) characters from the set \(\{X, Y, Z\}\). Letter on \(I^{th}\) position indicates on which planet is situated spaceport \(I\). For example, "XYYXZZ" indicates that the spaceports \(0\) and \(3\) are located at planet \(X\), spaceports \(1\) and \(2\) are located at \(Y\), and spaceports \(4\) and \(5\) are at \(Z\).

Starting from the fourth row, every row contains two integer numbers separated by a whitespace. These numbers are natural numbers smaller than \(N\) and indicate the numbers of the spaceports that are connected. For example, "\(12\ 15\)" indicates that there is a shuttle flight between spaceports \(12\) and \(15\).

Output

The same representation of shuttle flights in separate rows as in the input, but also containing a third number from the set \(\{1, 2, 3\}\) standing for the number of shuttle flights between these spaceports.

E. Поджог в лесу Берляндии

Бинарный поиск графы графы кратчайшие пути *2200

Представим лес Берляндии как бесконечное клеточное поле. В каждой клетке растет дерево. Или росло, до недавних событий.

Разрушительный огонь бушевал в лесу и уничтожил несколько деревьев. У вас есть прямоугольная карта \(n \times m\), которая описывает поврежденную часть леса. Сожженные деревья отмечены на карте как «X», в то время как остальные отмечены как «.». Вы можете быть уверены, что все поврежденные деревья отмечены на карте. Все деревья за пределами карты — не повреждены.

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

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

Заметим, что вы хотите максимизировать значение \(T\), но множество деревьев может быть произвольным.

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

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

В следующих \(n\) строках задана карта. Строка \(i\) соответствует \(i\)-й строке карты и содержит строку из \(m\) символов. \(j\)-й символ \(i\)-й строки либо «X», если соответствующее дерево сгорело, либо «.» — если осталось в целости.

Гарантируется, что карта содержит хотя бы один «X».

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

В первой строке выведите единственное число \(T\) — максимальное время, которое мог гореть лес. В следующих \(n\) строках выведите сертификат: карту (прямоугольник \(n \times m\)), на которой подожженные деревья отмечены как «X», а оставшиеся как «.».

D. Шичикуджи и электросеть

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

Шичикуджи — новое местное божество Южного Храма Черной Улитки. Ее первое задание заключается в следующем:

В префектуре X построено \(n\) новых городов. Города пронумерованы от \(1\) до \(n\). Город \(i\) находится в \(x_i\) км на север от храма и в \(y_i\) ем на восток от храма. Возможно, что \((x_i, y_i) = (x_j, y_j)\) даже если \(i \ne j\).

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

  • Возведение электростанции в городе \(i\) стоит \(c_i\) иен;
  • Соединение города \(i\) и города \(j\) стоит \(k_i + k_j\) иен за каждый км кабеля, использованного для соединения. Однако кабель можно прокладывать вдоль сторон света (на север, юг, восток, запад). Кабели могут пересекать друг друга. У каждого кабеля оба конца должны быть в некоторых городах. Если город \(i\) и город \(j\) соединены кабелем, то кабель всегда будет прокладываться по кратчайшему пути из города \(i\) в город \(j\). Тогда длина кабеля, соединяющего город \(i\) и город \(j\), равна \(|x_i - x_j| + |y_i - y_j|\) км.

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

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

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

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

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

Затем следует \(n\) строк. В \(i\)-й строке записаны два целых числа \(x_i\) (\(1 \leq x_i \leq 10^6\)) и \(y_i\) (\(1 \leq y_i \leq 10^6\)) — координаты \(i\)-го города.

В следующей строке записаны \(n\) целых чисел \(c_1, c_2, \dots, c_n\) (\(1 \leq c_i \leq 10^9\)) — цена установки электростанции в \(i\)-м городе.

В последней строке записаны \(n\) целых чисел \(k_1, k_2, \dots, k_n\) (\(1 \leq k_i \leq 10^9\)).

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

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

Затем выведите одно целое число \(v\) — количество электростанций, которые требуется построить.

Далее выведите \(v\) целых чисел, обозначающих номера городов, в которых требуется построить электростанции. Каждое число должно быть от \(1\) до \(n\) и все числа должны быть попарно различны. Можно выводить числа в произвольном порядке.

После этого выведите одно целое число \(e\) — количество необходимых соединений.

Наконец, выведите \(e\) пар целых чисел \(a\) и \(b\) (\(1 \le a, b \le n\), \(a \ne b\)), обозначающих, что между городами \(a\) и \(b\) будет проведено соединение. Каждая неупорядоченная пара городов может встречаться не более одного раза (для каждого \((a, b)\) не должно больше существовать пар \((a, b)\) или \((b, a)\)). Пары можно выводить в произвольном порядке.

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

Примечание

Для ответов на примеры смотрите на данные графики (города с электростанциями раскрашены зеленым, остальные — синим, кабели покрашены в красный):

В первом примере цена строительства электростанций во всех городах равна \(3 + 2 + 3 = 8\). Можно показать, что больше никакая конфигурация не стоит меньше 8 иен.

Во втором примере цена строительства электростанции в городе 2 равна 2. Стоимость соединения городов 1 и 2 равна \(2 \cdot (3 + 2) = 10\). Стоимость соединения городов 2 и 3 равна \(3 \cdot (2 + 3) = 15\). Поэтому итоговая цена равна \(2 + 10 + 15 = 27\). Можно показать, что никакая конфигурация не стоит меньше 27 иен.

E. Хиякугоку и лестницы

дп кратчайшие пути Теория вероятностей *2300

Хиякугоку недавно покинула должность местного божежства Южного Храма Черной Улитки в погоне за своей мечтой стать художником мультфильмов. Шесть месяцев она только и делала, что играла в веревочку («Cat's Cradle»), и теперь решила попробовать новую игру — «Змеи и лестницы» («Лила»). К сожалению, все змеи оказались истреблены, поэтому остались лишь только лестницы.

Игра происходит на доске \(10 \times 10\) по следующим правилам:

  • В начале игры игрок стоит в левой нижней клетке.
  • Цель игры заключается в достижении игроком финиша (левой верхней клетки). Как только он достигает финиша, игра заканчивается.
  • Путь выглядит следующим образом: если клетка находится не на краю ряда, то она ведет в следующую клетку по направлению движения ряда; если на краю, то ведет в ячейку выше. Направление движение ряда определяется так: направление в самом нижнем ряду — направо; направление в любом другом ряду противоположно направлению предыдущего ряда. В примечании есть изображение данного маршрута.
  • На каждом ходу игрок бросает стандартный шестигранный кубик. Пусть выпало некоторое число \(r\). Если до финиша меньше \(r\) ходов, тогда игрок остается на месте (но ход считается сделанным). Иначе игрок делает ровно \(r\) шагов по своему пути и останавливается. Если игрок остановился в клетке, в которой находится основание лестницы, то игрок может выбрать, залезть по лестнице или нет. Если он выбирает не залезать, то к следующему ходу он остается в этой клетке.
  • В некоторых клетках есть лестницы. Лестницы расположены только вертикально — каждая ведет в ту же клетку в одном из рядов сверху.Игрок обязан остановиться в клетке, содержащей основание лестницы, после броска кубика, чтобы иметь возможность забраться по данной лестнице. После использования лестницы игрок оказывается в клетке, содержащей верхний конец лестницы. Нельзя слезть с лестницы в ходе восхождения. И если клетка, содержащая верхний конец лестницы, содержит также и основание другой лестницы, то вторую лестницу использовать нельзя.
  • Числа, написанные на кубике: 1, 2, 3, 4, 5 и 6 — у каждого одинаковая вероятность выпасть.

Обратите внимание, что:

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

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

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

Входные данные состоят из десяти строк. В \(i\)-й строке записаны 10 неотрицательных целых чисел \(h_{i1}, h_{i2}, \dots, h_{i10}\). Если \(h_{ij}\) равно \(0\), то ячейка в \(i\)-й строке в \(j\)-м столбце не содержит лестницу. Иначе высота лестницы в данной клетке равна \(h_{ij}\), то есть ее использование приведет в клетку, которая на \(h_{ij}\) рядов сверху данной. Гарантируется, что \(0 \leq h_{ij} < i\). Также первое число первой строки и первое число поледней строки всегда равны \(0\), то есть стартовая и финишная клетки никогда не содержат лестниц.

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

Выведите единственное вещественное число — минимальное математическое ожидание количества ходов, которые может занять игра. Ваш ответ будет засчитан, если его абсолютная или относительная ошибка не будет превосходить \(10^{-6}\).

Примечание

Визуализация пути и поле для второго примера:

Клетка с 'S' — это стартовая клетка, клетка с 'E' — финиш.

В первом примере лестниц нет.

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

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

E. На лифте или по лестнице?

дп кратчайшие пути *1700

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

Пусть:

  • \(a_i\) для всех \(i\) от \(1\) до \(n-1\) равно времени, необходимому для того, чтобы добраться с \(i\)-го этажа на \((i+1)\)-й (а также с \((i+1)\)-го на \(i\)-й) по лестнице;
  • \(b_i\) для всех \(i\) от \(1\) до \(n-1\) равно времени, необходимому для того, чтобы добраться с \(i\)-го этажа на \((i+1)\)-й (а также с \((i+1)\)-го на \(i\)-й) при помощи лифта, но здесь также есть дополнительное время \(c\) — дополнительное время за использование лифта (вам необходимо ждать его, также двери лифта очень медленные!).

За один ход вы можете добраться с этажа, на котором вы сейчас стоите, \(x\) до любого этажа \(y\) (\(x \ne y\)) двумя различными способами:

  • Если вы идете по лестнице, то это просто сумма соответствующих значений \(a_i\). Формально, это займет \(\sum\limits_{i=min(x, y)}^{max(x, y) - 1} a_i\) единиц времени.
  • Если вы используете лифт, то это просто сумма \(c\) и соответствующих значений \(b_i\). Формально, it это займет \(c + \sum\limits_{i=min(x, y)}^{max(x, y) - 1} b_i\) единиц времени.

Вы можете выполнять любое количество ходов (возможно, нулевое).

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

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

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

Вторая строка входных данных содержит \(n - 1\) целых чисел \(a_1, a_2, \dots, a_{n-1}\) (\(1 \le a_i \le 1000\)), где \(a_i\) авно времени, необходимому для того, чтобы добраться с \(i\)-го этажа на \((i+1)\)-й (а также с \((i+1)\)-го на \(i\)-й) по лестнице.

Третья строка входных данных содержит \(n - 1\) целое число \(b_1, b_2, \dots, b_{n-1}\) (\(1 \le b_i \le 1000\)), где \(b_i\) равно времени, необходимому для того, чтобы добраться с \(i\)-го этажа на \((i+1)\)-й (а также с \((i+1)\)-го на \(i\)-й) при помощи лифта.

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

Выведите \(n\) целых чисел \(t_1, t_2, \dots, t_n\), где \(t_i\) равно минимально возможному суммарному времени, чтобы достичь \(i\)-й этаж с первого этажа, если вы можете выполнять любое количество ходов.

I. Show Must Go On

Бинарный поиск жадные алгоритмы кратчайшие пути Перебор *3100

The director of the famous dance show plans a tour. It is already decided that the tour will consist of up to \(m\) concerts.

There are \(n\) dancers in the troupe. Each dancer is characterized by her awkwardness: the awkwardness of the \(i\)-th dancer is equal to \(a_i\).

The director likes diversity. For this reason, each concert will be performed by a different set of dancers. A dancer may perform in multiple concerts. For example, it is possible that a set of dancers performs in one concert and a subset of this set of dancers performs in another concert. The only constraint is that the same set of dancers cannot perform twice.

The director prefers the set with larger number of dancers over the set with smaller number of dancers. If two sets consist of the same number of dancers, then the director prefers the one which has smaller sum of awkwardness of dancers. If two sets of dancers are equal in size and total awkwardness, then the director does not have a preference which one is better.

A marketing study shows that viewers are not ready to come to a concert if the total awkwardness of all the dancers performing in the concert is greater than \(k\).

The director wants to find the best plan for \(m\) concerts. He thinks to write down all possible sets of dancers; then get rid of the sets with total awkwardness greater than \(k\). The remaining sets of dancers will be sorted according to his preference. The most preferred set of dancers will give the first concert, the second preferred set — the second concert and so on until the \(m\)-th concert. If it turns out that the total number of valid sets is less than \(m\), then the total number of concerts will be equal to the number of valid sets.

It turns out that the director delegated finding the plan to you! Please, notice that there might be several acceptable plans due to the fact that the director does not have a preference over sets of dancers with the same size and total awkwardness. In this case any of these plans is good enough. For each concert find the number of dancers and the total awkwardness of the set performing. Also, for the last concert find its set of dancers.

Input

The first line contains one integer \(t\) (\(1 \le t \le 10^5\)) — the number of test cases in the input. Then the test cases follow.

Each test case begins with a line containing three integers \(n\), \(k\) and \(m\) (\(1 \le n \le 10^6\), \(1 \le k \le 10^{18}\), \(1 \le m \le 10^6\)) — the total number of dancers, the maximum acceptable awkwardness of a set of dancers and the maximum number of concerts, respectively.

The following line contains \(n\) integers \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^{12}\)), where \(a_i\) is the awkwardness of the \(i\)-th dancer.

The sum of the values of \(n\) over all test cases in the input does not exceed \(10^6\). Similarly, the sum of the values of \(m\) over all test cases in the input does not exceed \(10^6\).

Output

Print the answers to all test cases in the input.

If the troupe cannot give concerts at all, then simply print one line "0". In this case, you should not print anything else.

If the troupe gives a positive number of concerts \(r\) (\(r\) is equal to the minimum of \(m\) and the total number of valid sets), then first print the value of \(r\), then \(r\) lines: the \(j\)-th line should contain two integers \(s_j\) and \(t_j\) — the number of dancers in the \(j\)-th concert and the total awkwardness of the dancers performing in the \(j\)-th concert. Complete the output to a test case with a line that describes the last set: print exactly \(s_r\) distinct integers from \(1\) to \(n\) — the numbers of the dancers who will perform at the \(r\)-th (last) concert, in any order. If there are several answers, print any of them.

F. Дешевый робот

Бинарный поиск графы Деревья кратчайшие пути снм *2500

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

Вершины пронумерованы от \(1\) до \(n\). Есть ровно \(k\) центров (точек перезарядки), находящихся в вершинах \(1, 2, \ldots, k\).

Рассмотрим робота, двигающегося по этому графу, с батареей емкости \(c\), пока не фиксированной конструктором. В любой момент времени батарея может содержать целое количество \(x\) энергии от \(0\) до \(c\) включительно.

Переход по ребру веса \(w_i\) возможен, только если \(x \ge w_i\), и это стоит \(w_i\) энергии (\(x := x - w_i\)).

Когда робот достигает центра, его батарея полностью перезаряжается (\(x := c\)).

Вам дано \(q\) независимых миссий, в \(i\)-й миссии роботу требуется добраться от центра \(a_i\) до центра \(b_i\).

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

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

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

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

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

В \(i\)-й из следующих \(q\) строк записаны два целых числа \(a_i\) и \(b_i\) (\(1 \le a_i, b_i \le k\), \(a_i \neq b_i\)).

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

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

Примечание

В первом примере, граф является цепочкой \(10 - 9 - 2^C - 4 - 1^C - 5 - 7 - 3^C - 8 - 6\), где центрами являются вершины \(1\), \(2\) and \(3\).

Для миссии \((2, 3)\), существует только один простой путь. Вот пример прохождения этой миссии с емкостью \(12\).

  • Робот начинает в вершине \(2\), с \(c = 12\) энергии.
  • Робот использует ребро веса \(4\).
  • Робот дошел до вершины \(4\), с \(12 - 4 = 8\) энергии.
  • Робот использует ребро веса \(8\).
  • Робот дошел до вершины \(1\) с \(8 - 8 = 0\) энергии.
  • Робот на центре, поэтому его батарея перезаряжается. Теперь у него есть \(c = 12\) энергии.
  • Робот использует ребро веса \(2\).
  • Робот находится в вершине \(5\), с \(12 - 2 = 10\) очками энергии.
  • Робот использует ребро веса \(3\).
  • Робот находится в вершине \(7\), с \(10 - 3 = 7\) очками энергии.
  • Робот использует ребро веса \(2\).
  • Робот находится в вершине \(3\), с \(7 - 2 = 5\) очками энергии.
  • Робот на центре, поэтому его батарея перезаряжается. Теперь у него есть \(c = 12\) энергии.
  • Конец симуляции

Обратите внимание, что если бы \(c\) было меньше \(12\), у нас было бы меньше \(8\) энергии в вершине \(4\), поэтому было бы невозможно воспользоваться ребром \(4 \leftrightarrow 1\) веса \(8\). Таким образом \(12\) это минимальная возможная емкость, которой хватит, для прохождения миссии.

Граф во втором примере описан здесь (центры это красные вершины):

Робот может выполнить миссию \((3, 1)\) с батареей емкости \(c = 38\), испольуя путь \(3 \rightarrow 9 \rightarrow 8 \rightarrow 7 \rightarrow 2 \rightarrow 7 \rightarrow 6 \rightarrow 5 \rightarrow 4 \rightarrow 1\)

Робот может выполнить миссию \((2, 3)\) с батареей емкости \(c = 15\), используя путь \(2 \rightarrow 7 \rightarrow 8 \rightarrow 9 \rightarrow 3\)

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, если такой позиции достичь невозможно.

D. Рождественские деревья

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

На бесконечной числовой прямой находятся \(n\) рождественных деревьев. \(i\)-е дерево растет на позиции \(x_i\). Гарантируется, что все значения \(x_i\) различны.

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

Есть \(m\) человек, которые хотят отпраздновать Рождество. Пусть \(y_1, y_2, \dots, y_m\) — это позиции людей (заметьте, что все значения \(x_1, x_2, \dots, x_n, y_1, y_2, \dots, y_m\) должны быть различны и все \(y_j\) должны быть целыми). Вы хотите найти такое расположение людей, что значение \(\sum\limits_{j=1}^{m}\min\limits_{i=1}^{n}|x_i - y_j|\) минимально возможное (другими словами, сумма расстояний до ближайшего рождественского дерева по всем людям должна быть минимизирована).

Другими словами, пусть \(d_j\) равно дистанции от \(j\)-го человека до ближайшего к нему рождественского дерева (\(d_j = \min\limits_{i=1}^{n} |y_j - x_i|\)). Тогда вам надо выбрать такие позиции \(y_1, y_2, \dots, y_m\), что \(\sum\limits_{j=1}^{m} d_j\) минимально возможна.

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

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

Вторая строка входных данных содержит \(n\) целых чисел \(x_1, x_2, \dots, x_n\) (\(-10^9 \le x_i \le 10^9\)), где \(x_i\) равно позиции \(i\)-го рождественского дерева. Гарантируется, что все \(x_i\) различны.

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

В первой строке выведите одно целое число \(res\) — минимально возможное значение \(\sum\limits_{j=1}^{m}\min\limits_{i=1}^{n}|x_i - y_j|\) (другими словами, сумму расстояний до ближайшего рождественского дерева по всем людям).

Во второй строке выведите \(m\) целых чисел \(y_1, y_2, \dots, y_m\) (\(-2 \cdot 10^9 \le y_j \le 2 \cdot 10^9\)), где \(y_j\) равно позиции \(j\)-го человека. Все \(y_j\) должны быть различными, а еще все значения \(x_1, x_2, \dots, x_n, y_1, y_2, \dots, y_m\) должны быть различными.

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

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)\).

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

Бесси пасется на ферме, состоящей из \(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\).

G. Корова и тренировка

графы кратчайшие пути Потоки *3100

Фермер Джон намерен заставить Бесси тренироваться больше!

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

Фермер Джон планирует увеличить время прохождения по некоторым дорогам. Он может увеличить время прохождения каждой дороги на неотрицательное число, но суммарная прибавка не должна превосходить \(x_i\) для \(i\)-го плана.

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

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

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

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

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

В следующей строке задано единственное целое число \(q\) (\(1 \le q \le 10^5\)) — количество независимых планов.

В каждой из следующих \(q\) строк задано по одному целому числу \(x_i\) (\(0 \le x_i \le 10^5\)) — ограничение на суммарную прибавку.

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

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

Ваш ответ будет считаться верным, если абсолютная или относительная погрешность не будет превосходить \(10^{-6}\).

Формально, пусть Ваш ответ равен \(a\), а ответ жюри равен \(b\). Вас ответ засчитается тогда и только тогда, когда\(\frac{|a - b|}{\max{(1, |b|)}} \le 10^{-6}\).

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]\).

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

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\) секунд.

Во втором тесте невозможно перейти дорогу по всем правилам.

E. Распределение весов

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

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

Майк планирует совершить путешествие из вершины (района) \(a\) в вершину (район) \(b\), а затем из вершины (района) \(b\) в вершину (район) \(c\). Он может посещать один и тот же район дважды или даже большее число раз. Но есть небольшая проблема: власти города хотят ввести цену за использование дорог, таким образом, что если кто-то проходит по ней, то он должен заплатить цену, соответствующую этой дороге (он платит каждый раз, когда проходит по дороге). Список используемых цен \(p\) готов и они просто хотят распределить его между всеми дорогами в городе таким образом, что каждая цена из массива соответствует ровно одной дороге.

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

Вам необходимо ответить на \(t\) независимых наборов тестовых данных.

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

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

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

Вторая строка набора тестовых данных содержит \(m\) целых чисел \(p_1, p_2, \dots, p_m\) (\(1 \le p_i \le 10^9\)), где \(p_i\) равно \(i\)-й цене из массива.

Следующие \(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\). Гарантируется, что заданный граф является связным.

Гарантируется, что сумма \(n\) (также как и сумма \(m\)) не превосходит \(2 \cdot 10^5\) (\(\sum n \le 2 \cdot 10^5\), \(\sum m \le 2 \cdot 10^5\)).

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

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

Примечание

Одно из возможных решение первого набора тестовых данных из примера:

Одно из возможных решение второго набора тестовых данных из примера:

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\) тоже черный.

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

E. Полигон

графы дп кратчайшие пути реализация *1300

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

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

Изначальный полигон для \(n=4\).

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

Более формально:

  • если пушка, стоящая в строке \(i\) перед первым столбцом, стреляет единицей, то единица начинает свой полет из клетки (\(i, 1\)) и заканчивает в какой-то клетке (\(i, j\));
  • если пушка, стоящая в столбце \(j\) над первой строкой, стреляет единицей, то единица начинает свой полет из клетки (\(1, j\)) и заканчивает в какой-то клетке (\(i, j\)).

Например, рассмотрим следующую последовательность выстрелов:

1. Стреляет пушка в строке \(2\).                         2. Стреляет пушка в строке \(2\).                         3. Стреляет пушка в столбце \(3\).

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

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

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

В первой строке записано целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов тестовых данных в тесте. Далее следуют \(t\) наборов тестовых данных.

Каждый набор начинается со строки, в которой записано целое число \(n\) (\(1 \le n \le 50\)) — размер полигона.

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

Суммарная площадь матриц во всех наборах тестовых данных в одном тесте не превосходит \(10^5\).

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

Для каждого набора тестовых данных выведите:

  • YES, если существует последовательность выстрелов, приводящая к заданной матрице;
  • NO, если такой последовательности не существует.

Буквы в словах YES и NO можно выводить в любом регистре.

Примечание

Первый набор тестовых данных примера разобран в условии.

Ответ на второй набор NO, так как, вылетев из любой пушки, единица в клетке (\(1, 1\)) продолжила бы свой полет дальше.

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)\).

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\).

C. Вирусы

*особая задача дп кратчайшие пути строковые суфф. структуры *2900

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

Например, при следующей таблице мутации: \(\) 2 \to \langle 0\ 1 \rangle \\ 3 \to \langle 2\ 0\ 0\rangle\\ 3 \to \langle 1\ 3\rangle\\ 4 \to \langle 0\ 3\ 1\ 2\rangle\\ 5 \to \langle 2\ 1\rangle\\ 5 \to \langle 5\rangle \(\) вирус, который изначально состоял из одного гена \(4\), мог мутировать так: \(\) \langle 4 \rangle \to \langle \underline{0\ 3\ 1\ 2} \rangle \to \langle 0\ \underline{2\ 0\ 0}\ 1\ 2 \rangle \to \langle 0\ \underline{0\ 1}\ 0\ 0\ 1\ 2 \rangle \to \langle 0\ 0\ 1\ 0\ 0\ 1\ \underline{0\ 1} \rangle \(\) или же другим образом: \(\) \langle 4 \rangle \to \langle \underline{0\ 3\ 1\ 2} \rangle \to \langle 0\ \underline{1\ 3}\ 1\ 2 \rangle \to \langle 0\ 1\ 3\ 1\ \underline{0\ 1} \rangle \to \langle 0\ 1\ \underline{2\ 0\ 0}\ 1\ 0\ 1 \rangle \to \langle 0\ 1\ \underline{0\ 1}\ 0\ 0\ 1\ 0\ 1 \rangle \(\)

Вирусы выявляются антителами, которые обнаруживают присутствие конкретных последовательностей нулей и единиц в коде вирусов. Например, антитело, которое реагирует на последовательность \(\langle 0\ 0\ 1\ 0\ 0 \rangle\), обнаружит вирус \(\langle 0\ 0\ 1\ 0\ 0\ 1\ 0\ 1 \rangle\), но не обнаружит вирус \(\langle 0\ 1\ 0\ 1\ 0\ 0\ 1\ 0\ 1 \rangle\).

Для каждого гена от \(2\) до \(G-1\), учёные хотят знать, достаточно ли данного множества антител, чтобы обнаружить все вирусы, которые могут мутировать из этого гена. Если нет, то они хотят знать длину кратчайшего вируса, который невозможно обнаружить.

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

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

В первой строке ввода даны три целых числа \(G\), \(N\) и \(M\) (\(G > 2\), \(N \geq G - 2\), \(M \geq 0\)), количество генов, количество строк в таблице мутаций и количество антител, соответсвенно.

Следующие \(N\) строк содержат описания строк в таблице мутаций; в начале каждой строки даны два целых числа \(a\) и \(k\) (\(2 \leq a < G\), \(k \geq 1\)), за которыми следуют \(k\) целых чисел \(b_1, b_2, \ldots, b_k\) (\(0 \leq b_i < G\)), которые описывают строку \(\) a \to \langle b_1\ b_2\ \ldots\ b_k \rangle \(\)

Сумма всех значений \(k\) не превышает \(100\). Каждое целое число от \(2\) до \(G - 1\) появляется в таблице как \(a\) по крайней мере один раз.

Следующие \(M\) строк содержат описание антител; каждая из этих строк содержит целое число \(\ell\) (\(\ell \geq 1\)), за которым следуют \(\ell\) целых чисел \(c_1, c_2, \ldots, c_\ell\) (\(0 \leq c_i \leq 1\)), которые описывают антитело. Сумма всех значений \(\ell\) не превышает \(50\).

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

Ваша программа должна вывести ровно \(G - 2\) строк с ответами для каждого гена от \(2\) до \(G - 1\) в такой последовательности.

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

Иначе выведите слово «NO», за которым выведите длину кратчайшего вируса, который невозможно обнаружить. Гарантируется, что это значение во всех тестовых примерах меньше, чем \(2^{63}\).

Система оценки

Подзадачи:

  1. (11 баллов) Без антител (\(M = 0\))
  2. (14 баллов) \(N = G - 2\)
  3. (25 баллов) Одно антитело (\(M = 1\))
  4. (32 баллов) Сумма всех значений \(\ell\) не превышает \(10\)
  5. (18 баллов) Без дополнительных ограничений.

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\).

D. Два пути

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

Как вы знаете, Васин брат живет во Флатландии. Во Флатландии n городов, соединенных n - 1 двусторонней дорогой. Города пронумерованы от 1 до n. Из любого города можно добраться до любого другого двигаясь по дорогам.

Компания «Два пути», в которой работает Васин брат, выиграла тендер на ремонт двух путей во Флатландии. Путем называется последовательность различных городов, последовательно соединенных дорогами. Пути, которые надо отремонтировать, компания может выбрать самостоятельно. Единственное условие, накладываемое тендером — они не должны пересекаться (то есть иметь общих городов).

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

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

В первой строке записано целое число n (2 ≤ n ≤ 200), где n — количество городов в стране. Далее в n - 1 строке записаны сами дороги. Каждая строка содержит пару номеров соединяемых городов ai, bi (1 ≤ ai, bi ≤ n).

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

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

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\). Обратите внимание: может существовать дорога, соединяющая город с самим собой.

D. Трамплины

графы кратчайшие пути *2300

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

Кроме того, на трассе расположено n трамплинов, каждый трамплин характеризуется четырьмя числами:

  • xi — координата трамплина,
  • di — через сколько метров приземлится Вася, если наедет на этот трамплин,
  • ti — длительность полета в секундах
  • pi — число, означающее сколько метров до трамплина Вася должен разбегаться, чтобы суметь приготовиться и прыгнуть с этого трамплина. В течение разбега Вася обязан ехать по снегу (то есть не должен находиться в полете), но его скорость все равно составляет один метр в секунду.

Васе разрешается двигаться в любом направлении оси X, но запрещается заходить за линию старта, то есть в отрицательную полуось. Вася сам выбирает, какими трамплинами он воспользуется и в каком порядке, то есть он не обязан пользоваться всеми трамплинами, которые находятся на его пути. В частности, Вася может проехать мимо трамплина. Гарантируется, что xi + di ≤ L, значит, Вася не сможет преодолеть линию финиша в полете.

Вася может прыгать на трамплине только в сторону положительного направления оси X. То есть, используя i-ый трамплин, он начинает разгон в точке xi - pi, прыгает в точке xi и приземляется в точке xi + di. В другую сторону прыгать не разрешается.

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

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

Первая строка входных данных содержит два целых числа n и L (0 ≤ n ≤ 105, 1 ≤ L ≤ 109). Далее в n строках находятся описания трамплинов, каждое описание находится на отдельной строке. Каждое описание — это четверка целых неотрицательных чисел xi, di, ti, pi (0 ≤ xi ≤ L, 1 ≤ di, ti, pi ≤ 109, xi + di ≤ L).

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

Выведите в первую строку минимальное время в секундах, которое нужно Васе, чтобы преодолеть трассу. Во вторую строку выведите k — количество трамплинов, которыми нужно воспользоваться Васе, а в третью строку выведите k чисел — номера использованных трамплинов в порядке, в котором Вася их использовал. Каждый номер выводите ровно один раз, числа при выводе разделяйте пробелом. Трамплины нумеруются с 1 в том порядке, в котором они заданы во входных данных.

Примечание

В первом примере, Вася не сможет воспользоваться трамплином номер 2, потому что тогда он должен будет разбегаться, начиная с точки -3, что не разрешено условием. Оптимальный вариант — воспользоваться трамплином номер 1, итоговое время равно: движение до точки разбега + разбег до трамплина + время полета + движение до финиша = 0 + 5 + 5 + 5 = 15.

Во втором примере, Васе вообще не выгодно использовать трамплин номер 1, так как t1 > d1. Оптимальный вариант — воспользоваться трамплином номер 2, итоговое время равно: движение до точки разбега + разбег до трамплина + время полета + движение до финиша = 14 + 1 + 1 + 0 = 16.

C. Mortal Kombat Tower

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

Вы и ваш друг играете в Mortal Kombat XI. Вы пытаетесь пройти башню испытаний. Всего в башне есть \(n\) боссов, пронумерованных от \(1\) до \(n\). Тип \(i\)-го босса равен \(a_i\). Если \(i\)-й босс является легким, то его тип равен \(a_i = 0\), иначе этот босс является сложным и его тип равен \(a_i = 1\).

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

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

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

Например: предположим, что \(n = 8\), \(a = [1, 0, 1, 1, 0, 1, 1, 1]\). Тогда лучшей последовательностью действий является следующая:

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

Вам необходимо ответить на \(t\) независимых наборов тестовых данных.

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

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 2 \cdot 10^4\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Первая строка набора входных данных содержит одно целое число \(n\) (\(1 \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\) не превосходит \(2 \cdot 10^5\) (\(\sum n \le 2 \cdot 10^5\)).

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

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

D. Шестиугольники

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

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

Рассмотрим шестиугольное покрытие плоскости, как на картинке ниже.

Ники хочет добраться от ячейки с координатами \((0, 0)\) к определенной ячейке, заданной координатами. Она может перейти от шестиугольника к любому из шести своих соседей, но у каждого из переходов есть своя стоимость. Стоимость зависит от направления, в котором вы путешествуете. Таким образом, переход от \((0, 0)\) до \((1, 1)\) будет стоить ровно столько же, как и переход от \((-2, -1)\) до \((-1, 0)\). Стоимости приведены во входных данных в порядке \(c_1\), \(c_2\), \(c_3\), \(c_4\), \(c_5\), \(c_6\), как на рисунке ниже.

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

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

Каждый тест содержит несколько наборов входных данных. В первой строке указано количество наборов входных данных \(t\) (\(1 \le t \le 10^{4}\)). Описание наборов входных данных приведено ниже.

Первая строка каждого набора входных данных содержит два целых числа \(x\) и \(y\) (\(-10^{9} \le x, y \le 10^{9}\)) — координаты конечного шестиугольника.

Вторая строка каждого набора входных данных содержит шесть целых чисел \(c_1\), \(c_2\), \(c_3\), \(c_4\), \(c_5\), \(c_6\) (\(1 \le c_1, c_2, c_3, c_4, c_5, c_6 \le 10^{9}\)) — стоимости совершения одного шага в определенном направлении (см. рисунок выше).

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

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

Примечание

На рисунке ниже показано решение для первого примера. Стоимость \(18\) достигается путем трехкратного взятия \(c_3\) и \(c_2\) один раз, что составляет \(5+5+5+3=18\).

D. Возвращение домой

графы кратчайшие пути сортировки *2300

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

Давайте расчертим весь город на \(n \times n\) квадратных регионов. Юре нужно добраться из региона с координатами \((s_x,s_y)\) в регион с координатами \((f_x,f_y)\). За одну минуту Юра может переместиться в любой соседний по стороне регион, то есть он может двигаться в четырех направлениях. Также в городе есть \(m\) точек для быстрого перемещения. Их координаты вам (и Юре, конечно) известны. Юра может мгновенно переместиться к точке быстрого перемещения, если сейчас он находится в клетке с той же самой координатой по \(x\) или по \(y\).

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

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

В первой строке задаются два целых числа \(n\) и \(m\) — размер города и количество точек быстрого перемещения (\(1 \le n \le 10^9\), \(0 \le m \le 10^5\)).

В следующей строке задаются четыре целых числа \(s_x\) \(s_y\) \(f_x\) \(f_y\) — координаты текущего положения Юры и его дома соответственно (\( 1 \le s_x, s_y, f_x, f_y \le n\)).

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

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

В единственной строке выведите минимальное время для возвращения домой.

Примечание

В первом примере Юра должен попасть в \((5, 5)\) из \((1, 1)\). Он может это сделать за \(5\) минут, сначала использовав вторую точку быстрого перемещения (потому что ее \(y\) координата равна \(y\) координате Юры), а затем пройдя пешком \((4, 1) \to (4, 2) \to (4, 3) \to (5, 3) \to (5, 4) \to (5, 5)\).

G. Уменьшение стоимости доставки

графы кратчайшие пути Перебор *2100

Вы являетесь мэром Берлятова. Всего в городе \(n\) районов и \(m\) двусторонних дорог между ними. \(i\)-я дорога соединяет районы с индексами \(x_i\) и \(y_i\). Стоимость путешествия по этой дороге равна \(w_i\). Между каждой парой районов существует какой-то путь, поэтому город является связным.

Всего в Берлятове есть \(k\) курьерских маршрутов. \(i\)-й маршрут идет из района \(a_i\) в район \(b_i\). На каждом маршруте находится один курьер и он всегда будет выбирать самый дешевый (минимальный по суммарной стоимости) путь из района \(a_i\) в район \(b_i\) для доставки продуктов.

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

Вы можете уменьшить стоимость не более чем одной дороги до нуля (то есть вы выбираете не более одной дороги и заменяете ее стоимость на \(0\)).

Пусть \(d(x, y)\) равно самой дешевой стоимости путешествия между районами \(x\) и \(y\).

Ваша задача — найти минимальную суммарную стоимость курьерских маршрутов, которую вы можете достичь, если вы оптимально выберете какую-то дорогу и замените ее стоимость на \(0\). Другими словами, вам необходимо найти минимально возможное значение \(\sum\limits_{i = 1}^{k} d(a_i, b_i)\) после оптимального применения операции, описанной выше.

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

Первая строка входных данных содержит три целых числа \(n\), \(m\) and \(k\) (\(2 \le n \le 1000\); \(n - 1 \le m \le min(1000, \frac{n(n-1)}{2})\); \(1 \le k \le 1000\)) — количество районов, количество дорог и количество курьерских маршрутов.

Следующие \(m\) строк описывают дороги. \(i\)-я дорога задана тремя целыми числами \(x_i\), \(y_i\) и \(w_i\) (\(1 \le x_i, y_i \le n\); \(x_i \ne y_i\); \(1 \le w_i \le 1000\)), где \(x_i\) и \(y_i\) — районы, которые соединены \(i\)-й дорогой, а \(w_i\) — ее стоимость. Гарантируется, что между каждой парой районов существует какой-то путь, поэтому город является связным. Также гарантируется, что между каждой парой районов существует не более одной дороги.

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

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

Выведите одно целое число — минимальную суммарную стоимость курьерских маршрутов, которой вы можете достичь (то есть минимальное значение \(\sum\limits_{i=1}^{k} d(a_i, b_i)\), где \(d(x, y)\) равно стоимости самого дешевого пути между районами \(x\) и \(y\)), если вы можете сделать стоимость какой-то (не более, чем одной) дороги равной нулю.

Примечание

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

Здесь вы можете выбрать либо дорогу \((2, 4)\), либо дорогу \((4, 6)\). Оба варианта приведут к суммарной стоимости \(22\).

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

Здесь вы можете выбрать дорогу \((3, 4)\). Это приведет к суммарной стоимости \(13\).

D. Дерево минимальной высоты

графы Деревья жадные алгоритмы кратчайшие пути *1600

У Монокарпа было дерево из \(n\) вершин с корнем в вершине \(1\). Он решил изучить алгоритм BFS (Поиск в ширину), и поэтому запустил BFS на своем дереве, стартуя с корня. Упрощенно, BFS можно описать следующим псевдокодом:

a = [] # порядок, в котором вершины обработались
q = Queue()
q.put(1) # кладем корень в конец очереди
while not q.empty():
k = q.pop() # достаем вершину из начала очереди
a.append(k) # кладем k в конец последовательности, описывающей порядок посещения вершин
for y in g[k]: # g[k] — это список всех детей вершины k, отсортированный в порядке возрастания
q.put(y)

Монокарп был так восхищен алгоритмом BFS, что в результате потерял свое дерево. К счастью, у него осталась последовательность вершин в порядке их посещения алгоритмом BFS (массив a из псевдокода). Монокарп знает, что каждая вершина была посещена ровно один раз (так как они кладутся и забираются из очереди ровно один раз). Также он знает, что все дети каждой вершины были просмотрены в порядке возрастания.

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

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

Помогите Монокарпу найти любое дерево с заданным порядком посещения \(a\) и минимальной высотой.

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

В первой строке задано единственное целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

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

Во второй строке каждого набора заданы \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\); \(a_i \neq a_j\); \(a_1 = 1\)) — порядок посещения вершин алгоритмом BFS.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

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

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

Примечание

В первом наборе входных данных, есть только одно дерево с заданным порядком посещения:

Во втором наборе, также есть только одно дерево с заданным порядком посещения:

В третьем наборе, оптимальное дерево с заданным порядком посещения изображено ниже:

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.

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. Переезд в столицу

графы дп кратчайшие пути поиск в глубину и подобное *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\)-е из которых равно минимально возможному расстоянию от столицы до города, в котором Поликарп закончил своё путешествие.

E. Минимальный путь

графы кратчайшие пути *2400

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

Определим вес пути, состоящего из \(k\) ребер с индексами \(e_1, e_2, \dots, e_k\) как \(\sum\limits_{i=1}^{k}{w_{e_i}} - \max\limits_{i=1}^{k}{w_{e_i}} + \min\limits_{i=1}^{k}{w_{e_i}}\), где \(w_i\) — вес \(i\)-го ребра в графе.

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

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

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

Следующие \(m\) строк содержат по три целых числа \(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\)) — концы \(i\)-го ребра и его вес соответственно.

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

Выведите \(n-1\) целых чисел — минимальный вес пути от \(1\)-й вершины до \(i\)-й вершины для каждого \(i\) (\(2 \le i \le n\)).

D. Плейлист

кратчайшие пути реализация снм Структуры данных *1900

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

У каждой песни есть жанр, определяемый натуральным числом \(a_i\). Пусть Аркадий только что прослушал песню с жанром \(y\), а до нее — песню с жанром \(x\). Если \(\operatorname{gcd}(x, y) = 1\), он думает, что песни не сочетаются, и удаляет последнюю прослушанную песню (с жанром \(y\)) из плейлиста. После этого он продолжает слушать песни как обычно, пропуская уже удаленные, при этом он забывает, что слушал какие-то песни до удаления. Иными словами, он не может удалить песню сразу после того, как удалил предыдущую. Здесь \(\operatorname{gcd}(x, y)\) обозначает наибольший общий делитель (НОД) чисел \(x\) и \(y\).

Например, если жанры песен в начальном плейлисте равны \([5, 9, 2, 10, 15]\), то прослушивание происходит следующим образом: [5, 9, 2, 10, 15] \(\to\) [5, 9, 2, 10, 15] \(\to\) [5, 2, 10, 15] (т. к. \(\operatorname{gcd}(5, 9) = 1\)) \(\to\) [5, 2, 10, 15] \(\to\) [5, 2, 10, 15] \(\to\) [5, 2, 10, 15] \(\to\) [5, 2, 10, 15] \(\to\) [5, 2, 10, 15] \(\to\) [5, 10, 15] (т. к. \(\operatorname{gcd}(5, 2) = 1\)) \(\to\) [5, 10, 15] \(\to\) [5, 10, 15] \(\to\) ... Жирным выделены последние две прослушанные песни. Обратите внимание, после удаления некоторой песни Аркадий забывает, что слушал ее и предыдущую.

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

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

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10\,000\)) — количество наборов входных данных. Далее следуют наборы входных данных.

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

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)) — жанры песен.

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

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

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

Примечание

Первый набор входных данных объяснен в условии.

Во втором наборе плейлист изменяется следующим образом: [1, 2, 4, 2, 4, 2] \(\to\) [1, 2, 4, 2, 4, 2] \(\to\) [1, 4, 2, 4, 2] (т. к. \(\operatorname{gcd}(1, 2) = 1\)) \(\to\) [1, 4, 2, 4, 2] \(\to\) [1, 4, 2, 4, 2] \(\to\) [1, 4, 2, 4, 2] \(\to\) [1, 4, 2, 4, 2] \(\to\) [1, 4, 2, 4, 2] \(\to\) [4, 2, 4, 2] (т. к. \(\operatorname{gcd}(2, 1) = 1\)) \(\to\) [4, 2, 4, 2] \(\to\) ...

Во третьем наборе плейлист изменяется следующим образом: [1, 2] \(\to\) [1, 2] \(\to\) [1] (т. к. \(\operatorname{gcd}(1, 2) = 1\)) \(\to\) [1] \(\to\) [1] (Аркадий послушал одну и ту же песню подряд дважды) \(\to\) [] (т. к. \(\operatorname{gcd}(1, 1) = 1\)).

Четвертый набор входных данных совпадает с предыдущим после удаления второй песни.

В пятом примере Аркадий слушает одну и ту же песню снова и снова, но т. к. \(\operatorname{gcd}(2, 2) \ne 1\), он не удаляет ее.

F. Полезные рёбра

графы кратчайшие пути *2400

Дан взвешенный неориентированный граф на \(n\) вершинах, а также \(q\) троек \((u, v, l)\), в каждой из которых \(u\) и \(v\) — некоторые вершины графа, а \(l\) — натуральное число. Назовём ребро \(e\) полезным, если существует хотя бы одна тройка \((u, v, l)\), для которой найдётся путь (не обязательно простой) в графе со следующими свойствами:

  • \(u\) и \(v\) являются концами этого пути,
  • путь содержит ребро \(e\),
  • сумма весов рёбер этого пути не превосходит \(l\).

Найдите количество полезных рёбер в этом графе.

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

В первой строке даны два целых числа \(n\) и \(m\) (\(2\leq n\leq 600\), \(0\leq m\leq \frac{n(n-1)}2\)).

Каждая из следующих \(m\) строк содержит три числа \(u\), \(v\) и \(w\) (\(1\leq u, v\leq n\), \(u\neq v\), \(1\leq w\leq 10^9\)), обозначающих, что в графе есть ребро между вершинами \(u\) и \(v\) с весом \(w\).

Следующая строка содержит единственное число \(q\) (\(1\leq q\leq \frac{n(n-1)}2\)) — количество троек.

Каждая из следующих \(q\) строк содержит по три числа \(u\), \(v\) и \(l\) (\(1\leq u, v\leq n\), \(u\neq v\), \(1\leq l\leq 10^9\)), обозначающих тройку \((u, v, l)\).

Гарантируется, что:

  • граф не содержит петель и кратных рёбер,
  • все пары \((u, v)\) в тройках попарно различны.
Выходные данные

Выведите одно число — количество полезных рёбер в графе.

Примечание

В первом примере каждое ребро полезно, кроме ребра веса \(5\).

Во втором примере полезно только ребро между \(1\) и \(2\), потому что оно принадлежит пути \(1-2\), и \(10 \leq 11\). С другой стороны, ребро между вершинами \(3\) и \(4\) не является полезным.

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

B. Восточная выставка

Бинарный поиск геометрия кратчайшие пути сортировки *1500

Вы и ваши друзья живете в \(n\) домах. Каждый дом расположен на 2D плоскости в точке с целыми координатами. Несколько домов могут быть расположены в одной точке. Мэр города хочет узнать у вас возможные места для постройки здания Восточной выставки. Найдите количество мест (точек с целыми координатами) таких, что суммарное расстояние от всех домов до выставки будет минимальным. Здание выставки может быть построено в той же точке, что и какой-то дом. Расстояние между двумя точками \((x_1, y_1)\) и \((x_2, y_2)\) считается по формуле \(|x_1 - x_2| + |y_1 - y_2|\), где \(|x|\) — модуль величины \(x\).

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

В первой строке находится единственное целое число \(t\) \((1 \leq t \leq 1000)\) — число наборов входных данных.

В первой строке каждого теста находится единственное целое число \(n\) \((1 \leq n \leq 1000)\). В следующих \(n\) строках находятся позиции домов \((x_i, y_i)\) \((0 \leq x_i, y_i \leq 10^9)\).

Гарантируется, что сумма \(n\) не превосходит \(1000\).

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

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

Примечание

Снизу находятся картинки поясняющие примеры. Голубые точки обозначают дома, а зеленые - возможные позиции для выставки.

Первый пример.

Второй пример.

Третий пример.

Четвертый пример.

Пятый пример.

Шестой пример. Оба дома находятся в позиции \((0, 0)\).

E. Парный платёж

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

В стране \(n\) городов и \(m\) двунаправленных дорог. Дороги в стране формируют неориентированный взвешенный граф. Граф может быть несвязным. У каждой дороги есть свой параметр \(w\). Вы можете ездить по дорогам, но правительство издало новый закон: вы можете проезжать только по двум дорогам сразу (проехать из города \(a\) в город \(b\), и из города \(b\) в город \(c\)) и вы должны будете заплатить \((w_{ab} + w_{bc})^2\) денег, чтобы проехать по этим дорогам. Для каждого города \(t\) найдите, можно ли добраться до него из города \(1\), и какое наименьшее количество денег необходимо потратить, чтобы добраться из \(1\) в \(t\).

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

В первой строке находятся два целых числа \(n\), \(m\) (\(2 \leq n \leq 10^5\), \(1 \leq m \leq min(\frac{n \cdot (n - 1)}{2}, 2 \cdot 10^5)\)).

В следующих \(m\) строках находятся по три целых числа \(v_i\), \(u_i\), \(w_i\) (\(1 \leq v_i, u_i \leq n\), \(1 \leq w_i \leq 50\), \(u_i \neq v_i\)). Гарантируется, что в графе нет кратных рёбер, то есть для любого ребра \((u_i, v_i)\) не существует других рёбер \((u_i, v_i)\) или \((v_i, u_i)\).

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

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

Примечание

Граф в первом примере выглядит так.

Во втором примере путь из \(1\) в \(3\) проходит через \(2\), так что результирующая стоимость поездки будет \((1 + 2)^2 = 9\).

F. Единицы

дп жадные алгоритмы кратчайшие пути *2900

Вам задано положительное (больше нуля) целое число \(n\).

Вам необходимо представить \(n\) как сумму целых чисел (возможно, отрицательных), состоящих только из единиц (цифр '1'). Например, \(24 = 11 + 11 + 1 + 1\) и \(102 = 111 - 11 + 1 + 1\).

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

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

Единственная строка содержит одно целое число \(n\) (\(1 \le n < 10^{50}\)).

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

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

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\).

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

C. Задача коммивояжёра

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

Есть \(n\) городов, пронумерованных от \(1\) до \(n\), красота города \(i\) равна \(a_i\).

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

Для всех \(i\ne j\), перелет из города \(i\) в город \(j\) стоит \(\max(c_i,a_j-a_i)\) долларов, где \(c_i\) — это нижний порог цены, наложенный на перелет городом \(i\). Обратите внимание, что здесь не берется абсолютное значение. Найдите минимальную общую стоимость поездки для коммивояжёра.

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

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

В \(i\)-й из следующих \(n\) строк содержится по два целых числа \(a_i\), \(c_i\) (\(0\le a_i,c_i\le 10^9\)) — красота и нижний порог цены города \(i\).

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

Выведите единственное целое число — минимальную суммарную стоимость.

Примечание

В первом примере мы можем путешествовать в порядке \(1\to 3\to 2\to 1\).

  • Рейс \(1\to 3\) стоит \(\max(c_1,a_3-a_1)=\max(9,4-1)=9\).
  • Рейс \(3\to 2\) стоит \(\max(c_3, a_2-a_3)=\max(1,2-4)=1\).
  • Рейс \(2\to 1\) стоит \(\max(c_2,a_1-a_2)=\max(1,1-2)=1\).

Общая стоимость составляет \(11\), и мы не можем обойтись меньшим числом долларов.

E. Прогулка по торту

*особая задача жадные алгоритмы кратчайшие пути реализация *1800

Мышь нашла большой красивый торт и решила прогуляться по нему, попутно объедая ягоды на верхушке торта. Торт прямоугольный и разделен на аккуратные квадраты; в некоторых квадратах есть ягода, а в некоторых нет.

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

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

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

Первая строка входных данных состоит из двух чисел \(H\) и \(W\) (\(1 \le H, W \le 5\)), разделенных пробелом - высоты и ширины торта.

Следующие \(H\) строк содержат строки из ровно \(W\) символов, описывающих квадраты торта: «.» представляет пустой квадрат, а «*» - квадрат с ягодой.

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

Выведите одно число - количество ягод, которые съест мышь, следуя своей стратегии.

F. Треугольные пути

графы Конструктив кратчайшие пути математика сортировки *2000

Рассмотрим бесконечный треугольник, состоящий из слоев. Занумеруем слои, начиная с единицы, от верхней точки треугольника (сверху вниз). На \(k\)-м слое треугольника расположены \(k\) точек, пронумерованных слева направо. Каждая точка бесконечного треугольника описывается парой чисел \((r, c)\) (\(1 \le c \le r\)), где \(r\) — номер слоя, а \(c\) — номер точки в слое. Из каждой точки \((r, c)\) исходит два направленных ребра в точки \((r+1, c)\) и \((r+1, c+1)\), но только одно из рёбер активировано. Если \(r + c\) — чётно, тогда активировано ребро в точку \((r+1, c)\), иначе активировано ребро в точку \((r+1, c+1)\). Изучите картинку для лучшего понимания.

Черным цветом обозначены активированные ребра. Серым цветом обозначены не активированные ребра.

Из точки \((r_1, c_1)\) можно дойти до точки \((r_2, c_2)\), если между ними существует путь только из активированных рёбер. Например, на картинке выше существует путь из точки \((1, 1)\) в точку \((3, 2)\), но не существует пути из точки \((2, 1)\) в точку \((1, 1)\).

Изначально вы находитесь в точке \((1, 1)\). За каждый ход вы можете:

  • Заменить активированное ребро для точки \((r, c)\). То есть, если активировано ребро в точку \((r+1, c)\), то вместо него активированным станет ребро в точку \((r+1, c+1)\), иначе, если активировано ребро в точку \((r+1, c+1)\), то вместо него активированным станет ребро в точку \((r+1, c)\). Это действие увеличивает стоимость пути на \(1\);
  • Переместиться из текущей точку в другую, перейдя по активированному ребру. Это действие не увеличивает стоимость пути.

Вам дана последовательность из \(n\) точек бесконечного треугольника \((r_1, c_1), (r_2, c_2), \ldots, (r_n, c_n)\). Найдите путь минимальной стоимости из точки \((1, 1)\), проходящий через все \(n\) точек в произвольном порядке.

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

Первая строка содержит одно целое \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

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

Во второй строке находится \(n\) чисел \(r_1, r_2, \ldots, r_n\) (\(1 \le r_i \le 10^9\)), где \(r_i\) — номер слоя, в котором находится \(i\)-я точка.

Во третьей строке находится \(n\) чисел \(c_1, c_2, \ldots, c_n\) (\(1 \le c_i \le r_i\)), где \(c_i\) — номер \(i\)-й точки в слое \(r_i\).

Гарантируется, что все \(n\) точек различны.

Гарантируется, что всегда существует хотя бы один способ обойти все \(n\) точек.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

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

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

D. Исследовательская выставка

графы дп кратчайшие пути *1800

Вы бродите по исследовательской выставке на конференции 2050.

Выставка может быть представлена как неориентированный взвешенный граф в виде сетки размера \(n\times m\). Множество вершин графа это \(\{(i, j)|1\le i\le n, 1\le j\le m\}\). Две вершины \((i_1,j_1)\) и \((i_2, j_2)\) соединены ребром, если и только если \(|i_1-i_2|+|j_1-j_2|=1\).

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

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

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

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

Первая строка содержит три целых числа \(n\), \(m\) и \(k\) (\(2\leq n, m\leq 500, 1\leq k\leq 20\)).

\(j\)-е число (\(1\le j \le m - 1\)) в \(i\)-й из следующих \(n\) строк равно количеству экспонатов, расположенных на ребре между вершинами \((i, j)\) и \((i, j+1)\).

\(j\)-е число (\(1\le j\le m\)) в \(i\)-й из следующих \(n-1\) строк равно количеству экспонатов, расположенных на ребре между вершинами \((i, j)\) и \((i+1, j)\).

На каждом ребре находится от \(1\) до \(10^6\) экспонатов.

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

Выведите \(n\) строк по \(m\) чисел в каждой. \(j\)-е число в \(i\)-й строке, \(answer_{ij}\), должно равняться минимальной возможной скукоте, если вы начнете в вершине \((i, j)\) и вернетесь обратно, сделав ровно \(k\) ходов.

Если вы не можете вернуться обратно в вершину \((i, j)\), сделав ровно \(k\) ходов, \(answer_{ij}\) должен равняться \(-1\).

Примечание

В первом примере ответ всегда равен \(10\) вне зависимости от того, как вы пойдете.

Во втором примере \(answer_{21} = 10\), путь может быть таким: \((2,1) \to (1,1) \to (1,2) \to (2,2) \to (2,1)\), скукота равна \(4 + 1 + 2 + 3 = 10\).

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. Это птица! Нет, это самолет! Нет, это AaParsa!

графы Конструктив кратчайшие пути *2500

В Шааззззляндии есть \(n\) городов, пронумерованных от \(0\) до \(n-1\). Гааззззляндией, бессмертным врагом Шааззззляндии, правит AaParsa.

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

AaParsa установил \(m\) транспортных пушек в городах Шааззззляндии. \(i\)-я пушка установлена в городе \(a_i\) и изначально направлена на город \(b_i\).

Гарантируется, что в каждом из \(n\) городов есть по крайней мере одна транспортная пушка, и что никакие две пушки из одного города изначально не направлены на один и тот же город (то есть, все пары \((a_i, b_i)\) попарно различны).

AaParsa использовал очень продвинутую технологию для создания пушек, пушки вращаются каждую секунду. Другими словами, если \(i\)-я пушка направлена на город \(x\) в какую-то секунду, то в следующую секунду она будет нацелена на город \((x + 1) \mod n\).

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

Если вы все еще не поняли, использование \(i\)-й пушки на \(s\)-й секунде (что возможно, только если вы в данный момент находитесь в городе \(a_i\)) запустит вас в город \((b_i + s) \mod n\), и вы приземлитесь в нем через \(c_i\) секунд (таким образом, вы окажетесь там в \((s + c_i)\)-ю секунду). Обратите внимание, что пушка, из которой вы изначально стартовали, будет вращаться каждую секунду, но вы, очевидно, не будете менять направление, пока находитесь в воздухе.

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

Обратите внимание, что AaParsa может оставаться в любом городе столько, сколько захочет.

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

Первая строка содержит два целых числа \(n\) и \(m\) \((2 \le n \le 600 , n \le m \le n^2)\) — количество городов и пушек соответственно.

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

Гарантируется, что в каждом из \(n\) городов есть по крайней мере одна транспортная пушка, и что никакие две пушки из одного города изначально не направлены на один и тот же город (то есть, все пары \((a_i, b_i)\) попарно различны).

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

Выведите \(n\) строк, каждая из которых должна содержать \(n\) целых чисел.

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

Примечание

В первом примере один из возможных путей перехода от \(0\) к \(2\) был бы таким:

  1. Остаться внутри \(0\) и ничего не делать в течение \(1\) секунды.
  2. Использовать первую пушку и приземлиться в \(2\) через \(1\) секунду.
Обратите внимание: мы могли бы использовать вторую пушку в \(0\)-ю секунду, но в этом случае нам потребовалось бы \(3\) секунды, чтобы достичь города \(2\).

E. Потерянный массив

графы жадные алгоритмы интерактив кратчайшие пути *2300

Это интерактивная задача

XOR-суммой массива \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)) называется величина \(a_1 \oplus a_2 \oplus \ldots \oplus a_n\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ.

Маленьких Дорми на Рождество получил массив из \(n\) целых \(a_1, a_2, \ldots, a_n\). Однако вскоре он уронил его в XOR-машину, и массив был утерян.

В настройках XOR-машины установлено целое число \(k\) (которое вы не можете менять), и вы можете делать запросы к XOR-машине: дав машине \(k\) различных индексов \(x_1, x_2, \ldots, x_k\), вы получите значение \(a_{x_1} \oplus a_{x_2} \oplus \ldots \oplus a_{x_k}\).

Как старший брат Дорми, вы хотите помочь ему восстановить XOR-сумму массива \(a_1, a_2, \ldots, a_n\), сделав несколько запросов к XOR-машине.

Маленький Дорми нетерпелив, поэтому вы должны сделать минимальное количество запросов к XOR-машине, чтобы найти XOR-сумму массива. Формально, пусть \(d\) равно минимальному числу запросов, необходимому, чтобы найти XOR-сумму любого массива длины \(n\), когда размер запроса равен \(k\). Ваше решение будет зачтено, если вы найдете XOR-сумму за не более чем \(d\) запросов.

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

Массив \(a_1, a_2, \ldots, a_n\) зафиксирован до того, как вы начнете делать запросы к XOR-машине, и не меняется в процессе взаимодействия.

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

Первая строка содержит целые числа \(n\) и \(k\) (\(1 \le n \le 500\), \(1 \le k \le n\)) — длину массива и размер запросов к XOR-машине.

Элементы массива удовлетворяют \(1 \le a_i \le 10^9\).

Можно показать, что если возможно найти XOR-сумму в данном тесте, то это можно сделать за не более чем \(500\) запросов. Поэтому \(d \le 500\).

После чтения \(n\) и \(k\) вы можете начать делать запросы.

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

Если невозможно вычислить XOR-сумму массива, выведите \(-1\) сразу после чтения \(n\) и \(k\). Не начинайте взаимодействие.

Иначе, когда ваша программа определит XOR-сумму найденного массив \(a_1, a_2, \ldots, a_n\), выведите ответ в следующем формате: «! x», где \(x\) равен XOR-сумме массива \(a_1, a_2, \ldots, a_n\), и завершите программу сразу после сброса буфера вывода.

Вывод ответа не считается за запрос.

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

Чтобы сделать запрос, выведите «? b», где \(b\) — массив из ровно \(k\) различных целых чисел от \(1\) до \(n\), обозначающий индексы элементов, XOR-сумму которых вы хотите узнать.

Затем считайте одно целое число \(x\) — XOR-сумму запрошенных элементов. Можно показать, что \(0 \le x \le 2 \cdot 10^9\).

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

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

Если вы сделаете некорректный запрос, или сделаете больше, чем \(500\) запросов, взаимодействие немедленно прекратится и вы получите вердикт «Неправильный ответ». Обратите внимание, если вы превысите \(d\) запросов, взаимодействие продолжится до тех пор, пока вы не превысите лимит в \(500\) запросов, а потом все равно получите вердикт «Неправильный ответ».

Взломы

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

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

Вторая строка содержит массив целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)).

Примечание

В первом примере массив \(a_1, a_2, \ldots, a_n\) равен \(2, 1, 7, 5, 6\), его XOR-сумма равна \(7\).

Первый запрос в примере включает индексы \(1,2,3\), поэтому ответ на запрос равен \(a_1 \oplus a_2 \oplus a_3 = 2 \oplus 1 \oplus 7 = 4\).

Второй запрос в примере включает индексы \(2,3,5\), поэтому ответ на запрос равен \(a_2 \oplus a_3 \oplus a_5 = 1 \oplus 7 \oplus 6 = 0\).

Первый запрос в примере включает индексы \(4,1,5\), поэтому ответ на запрос равен \(a_4 \oplus a_1 \oplus a_5 = 5 \oplus 2 \oplus 6 = 1\). Обратите внимание, что индексы можно выводить в любом порядке.

Обратите внимание, что в примере сделано три запроса для демонстрации взаимодействия, но они не обязательно следуют оптимальной стратегии.

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

E. Омкар и лес

графы Комбинаторика кратчайшие пути математика *2300

Последний присоединившийся последователь Омкара, Ajit, вошел в Священный лес. Ajit понимает, что лес Омкара — это таблица размером \(n\) на \(m\) (\(1 \leq n, m \leq 2000\)), состоящая из целых неотрицательных чисел. Поскольку лес благословлен Омкаром, он удовлетворяет некоторым особым условиям:

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

К сожалению, Ajit еще не полностью достоин способностей Омкара. Он видит каждую клетку как "0" или "#". Если клетка обозначена как "0", то число в ней должно быть равно \(0\). Иначе число в ней может быть любым неотрицательным целым числом.

Определите, сколько существует различных конфигураций элементов, при которых выполняются эти особые условия. Две конфигурации считаются различными, если существует хотя бы одна клетка такая, что числа, записанные в ней в этих конфигурациях, различны. Поскольку ответ может быть огромным, найдите ответ по модулю \(10^9+7\).

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

Каждый тест содержит несколько наборов входных данных. Первая строка содержит количество наборов входных данных \(t\) (\(1 \leq t \leq 100\)). Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1 \leq n, m \leq 2000, nm \geq 2\)) — размеры леса.

Далее следуют \(n\) строк, каждая из которых состоит из одной строки из \(m\) символов. Каждый из этих символов является либо "0", либо "#".

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2000\), а также сумма \(m\) по всем наборам входных данных не превышает \(2000\).

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

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

Примечание

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

\(0000\\ 0000\\ 0000\)

и

\(0000\\ 0010\\ 0000\)

A. Отличные графы

графы жадные алгоритмы Конструктив кратчайшие пути сортировки *1400

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

К сожалению, Фермер Джон потерял карту фермы. Все, что он знает — это массив \(d\), где \(d_i\) — это минимальное время, за которое коровы могут добраться до \(i\)-го пастбища из \(1\)-го, двигаясь по дорогам. Стоимость его фермы — это сумма весов всех дорог, и Фермер Джон хочет узнать минимально возможную стоимость фермы, которая не противоречит тому, что он помнит.

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

В первой строке задано одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

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

Во второй строке каждого набора заданы \(n\) целых чисел через пробел \(d_1, d_2, \ldots, d_n\) (\(0 \leq d_i \leq 10^9\)) — массив \(d\). Гарантируется, что \(d_1 = 0\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

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

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

Примечание

В первом наборе вы можете добавить дороги

  • от пастбища \(1\) к пастбищу \(2\) с весом \(2\),
  • от пастбища \(2\) к пастбищу \(3\) с весом \(1\),
  • от пастбища \(3\) к пастбищу \(1\) с весом \(-3\),
  • от пастбища \(3\) к пастбищу \(2\) с весом \(-1\),
  • от пастбища \(2\) к пастбищу \(1\) с весом \(-2\).
Суммарная стоимость равна \(2 + 1 + -3 + -1 + -2 = -3\).

Во втором набор вы можете добавить дорогу от пастбища \(1\) к пастбищу \(2\) с весом \(1000000000\) и дорогу от пастбища \(2\) к пастбищу \(1\) со стоимостью \(-1000000000\). Суммарная стоимость равна \(1000000000 + -1000000000 = 0\).

В третьем наборе, вы не можете добавить ни одной дороги. Суммарная стоимость равна \(0\).

E. Кондиционеры

дп кратчайшие пути реализация сортировки Структуры данных *1500

На клетчатой полоске длины \(n\) расположены \(k\) кондиционеров: \(i\)-й кондиционер расположен в клетке \(a_i\) (\(1 \le a_i \le n\)). Два или более кондиционера не могут находиться в одной клетке (то есть все \(a_i\) различны).

Каждый кондиционер характеризуется еще одним параметром — температурой: \(i\)-й кондиционер включен на температуру \(t_i\).

Пример полосы длины \(n=6\), где \(k=2\), \(a=[2,5]\) и \(t=[14,16]\).

Для каждой клетки \(i\) (\(1 \le i \le n\)) найдите температуру воздуха в ней, которая равна \(\)\min_{1 \le j \le k}(t_j + |a_j - i|),\(\)

где \(|a_j - i|\) обозначает абсолютную величину (модуль) значения разности \(a_j - i\).

Иными словами, температура в клетке \(i\) равна минимуму среди температур кондиционеров, увеличенных на расстояние от кондиционера до клетки \(i\).

Рассмотрим пример. Пусть \(n=6, k=2\), первый кондиционер стоит в клетке \(a_1=2\) включен на температуру \(t_1=14\), а второй стоит в клетке \(a_2=5\) и включен на температуру \(t_2=16\). В таком случае температуры воздуха в клетках будут следующими:

  1. температура в \(1\)-й клетке равна: \(\min(14 + |2 - 1|, 16 + |5 - 1|)=\min(14 + 1, 16 + 4)=\min(15, 20)=15\);
  2. температура во \(2\)-й клетке равна: \(\min(14 + |2 - 2|, 16 + |5 - 2|)=\min(14 + 0, 16 + 3)=\min(14, 19)=14\);
  3. температура в \(3\)-й клетке равна: \(\min(14 + |2 - 3|, 16 + |5 - 3|)=\min(14 + 1, 16 + 2)=\min(15, 18)=15\);
  4. температура в \(4\)-й клетке равна: \(\min(14 + |2 - 4|, 16 + |5 - 4|)=\min(14 + 2, 16 + 1)=\min(16, 17)=16\);
  5. температура в \(5\)-й клетке равна: \(\min(14 + |2 - 5|, 16 + |5 - 5|)=\min(14 + 3, 16 + 0)=\min(17, 16)=16\);
  6. температура в \(6\)-й клетке равна: \(\min(14 + |2 - 6|, 16 + |5 - 6|)=\min(14 + 4, 16 + 1)=\min(18, 17)=17\).

Для каждой клетки от \(1\) до \(n\) найдите температуру воздуха в ней.

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

В первой строке задано целое число \(q\) (\(1 \le q \le 10^4\)) — количество наборов входных данных в тесте. Далее следуют наборы входных данных. Перед каждым набором входных данных записана пустая строка.

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

Вторая строка содержит \(k\) целых чисел \(a_1, a_2, \ldots, a_k\) (\(1 \le a_i \le n\)) — позиции кондиционеров на клетчатой полоске.

Третья строка содержит \(k\) целых чисел \(t_1, t_2, \ldots, t_k\) (\(1 \le t_i \le 10^9\)) — температуры кондиционеров.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(3 \cdot 10^5\).

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

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

F. Попрыгунчик

Бинарный поиск графы дп кратчайшие пути разделяй и властвуй снм Структуры данных *2700

Представьте себе бесконечный пруд, спроецированный на числовую прямую. В пруду есть \(n\) камней, пронумерованных от \(1\) до \(n\). \(i\)-й камень находится в целой координате \(a_i\). Координаты камней попарно различны. Камни пронумерованы в порядке увеличения координаты, поэтому \(a_1 < a_2 < \dots < a_n\).

Лягушка-робот сидит на камне номер \(s\). Лягушку можно запрограммировать. У нее есть встроенный параметр базовой длины прыжка \(d\). Также есть настройка для интервала длины прыжка. Если интервал длины прыжка выставляется на некоторое целое значение \(k\), то лягушка может прыгать с некоторого камня на любой другой камень на расстоянии от \(d - k\) до \(d + k\) включительно в любом направлении. Расстояние между двумя камнями — это модуль разности между их координатами.

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

Вам будет предоставлено \(q\) тестов для данной функции, \(j\)-й набор состоит из двух целых чисел \(i\) и \(k\). Выведите «Yes», если \(i\)-й камень достижим и «No» в противном случае.

Вы можете выводить «YES» и «NO» в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

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

В первой строке записаны четыре целых числа \(n\), \(q\), \(s\) и \(d\) (\(1 \le n, q \le 2 \cdot 10^5\); \(1 \le s \le n\); \(1 \le d \le 10^6\)) — количество камней, количество тестов, начальный камень и базовая длина прыжка.

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^6\)) — координаты камней. Координаты камней попарно различны. Камни пронумерованы в порядке увеличения координаты, поэтому \(a_1 < a_2 < \dots < a_n\).

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

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

На каждый тест выведите ответ. Если существует такая последовательность прыжков с камня номер \(s\) до камня номер \(i\) с интервалом длины прыжка установленным на \(k\), то выведите «Yes». В противном случае выведите «No».

Примечание

Пояснение к первому примеру:

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

Во втором тесте лягушка может прыгать на любую длину в отрезке \([5 - 2; 5 + 2]\). Поэтому она может достичь камня номер \(5\) (прыжком на \(7\) направо) и камня номер \(3\) (прыжком на \(3\) налево). С камня номер \(3\) она может достичь камня номер \(2\) (прыжком на \(5\) налево). С камня номер \(2\) она может достичь камня номер \(1\) (прыжком на \(4\) налево). Однако, нет способа достичь камня номер \(7\).

В третьем тесте лягушка может прыгать на любую длину в отрезке \([5 - 3; 5 + 3]\). Поэтому она может достичь камня номер \(7\), прыгнув сначала на камень номер \(5\), а с него на \(7\).

Четвертый тест показан в описании ко второму тесту.

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\).

G. Четыре вершины

графы жадные алгоритмы Конструктив кратчайшие пути реализация Структуры данных *3100

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

На этом графе осуществляются запросы:

  • Удалить из графа существующее ребро.
  • Добавить в граф ещё не существующее в нём ребро.

В самом начале и после каждого запроса вам необходимо найти четыре различные вершины \(a\), \(b\), \(c\), \(d\) такие, что существует путь между \(a\) и \(b\), существует путь между \(c\) и \(d\) и сумма длин двух кратчайших путей из \(a\) в \(b\) и из \(c\) в \(d\) минимальна. Ответ на запрос — это сумма длин этих двух кратчайших путей. Длина пути равна сумме весов рёбер на этом пути.

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

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

Каждая из следующих \(m\) строк содержит три целых числа \(v\), \(u\), \(w\) (\(1 \le v, u \le n, v \neq u\), \(1 \le w \le 10^9\)) — это означает, что существует ребро между вершинами \(v\) и \(u\) с весом \(w\).

Следующая строка содержит одно целое число \(q\) \((0 \le q \le 10^5)\) — количество запросов.

Следующие \(q\) строк содержат запросы двух типов:

  • \(0\) \(v\) \(u\) — такой запрос означает удаление ребра между вершинами \(v\) и \(u\) \((1 \le v, u \le n, v \neq u)\). Гарантируется, что такое ребро существует в графе.
  • \(1\) \(v\) \(u\) \(w\) — такой запрос означает добавление ребра между вершинами \(v\) и \(u\) весом \(w\) (\(1 \le v, u \le n, v \neq u\), \(1 \le w \le 10^9\)). Гарантируется, что такого ребра не было в графе.

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

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

Гарантируется, что в любой момент количество рёбер в графе не будет меньше \(4\). Можно доказать, что в любой момент существуют четыре различные вершины \(a\), \(b\), \(c\), \(d\) такие, что существует путь между вершинами \(a\) и \(b\), и существует путь между вершинами \(c\) и \(d\).

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

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

Примечание

До всех запросов можно выбрать вершины \((a, b) = (3, 2)\) и \((c, d) = (1, 4)\). Сумма длин двух кратчайших путей равна \(3 + 1 = 4\).

После первого запроса можно выбрать вершины \((a, b) = (2, 5)\) и \((c, d) = (1, 4)\). Сумма длин двух кратчайших путей равна \(2 + 1 = 3\).

После второго запроса можно выбрать вершины \((a, b) = (3, 4)\) и \((c, d) = (2, 5)\). Сумма длин двух кратчайших путей равна \(1 + 2 = 3\).

После третьего запроса можно выбрать вершины \((a, b) = (2, 6)\) и \((c, d) = (4, 5)\). Сумма длин двух кратчайших путей равна \(4 + 3 = 7\).

После последнего запроса можно выбрать вершины \((a, b) = (1, 6)\) и \((c, d) = (2, 5)\). Сумма длин двух кратчайших путей равна \(3 + 2 = 5\).

A. Anti-Tetris

графы Конструктив кратчайшие пути *2800

Let us consider the game "Sticky Tetris". In this game, there is a field of \(n \times m\) squares. Tiles appear on the field and the player can move the tiles.

Each tile is a \(4\)-connected set of at most \(7\) squares.

Each new tile appears in any position that fits inside the field, does not intersect any other tile, and the top cell of the tile is at the top row of the field. The player can move the tile left, right, and down, and at any moment the tile must still entirely fit inside the field and must not intersect other tiles. The player can stop the tile at any position at any time. After that, it cannot be moved. Since this is "Sticky Tetris," the tile will not fall once stopped.

You are given a final configuration of a "Sticky Tetris" game. You need to restore a sequence of steps that leads to that configuration if it exists.

Input

The first line contains two integers \(n\) and \(m\) (\(1 \le n, m \le 50\)) — the size of the playing field.

The next \(n\) lines contain a string of \(m\) characters each. Each character could be either a '.', or lowercase English letter. Connected components of the same letter correspond to a single tile. Each tile consists of at most \(7\) squares.

Output

If there is no solution, print \(-1\).

Otherwise, print \(k\) — the number of different tiles that are placed on the field.

On the next \(k\) lines print the sequence of steps for each of the tiles in the order they are placed.

Each line consists of a number \(x\) followed by a string with steps. \(x\) (\(1 \le x \le m\)) is the starting column of the leftmost square in the top row of the tile. The string consists of characters 'L' (for left), 'R' (for right), and 'D' (for down), describing the path of that tile, ending with a single character 'S' (for stop). The final position of the tile determines which tile is being placed. The string with steps can have at most \(n \cdot m + 1\) characters.

F. Стабилизируй массив (И-версия)

графы кратчайшие пути математика Перебор теория чисел *1700

Задан массив из нулей и единиц \(a[0 \ldots n - 1] = [a_0, a_1, \ldots, a_{n - 1}]\). Обратите внимание, что в этой задаче, в отличие от остальных, индексы массива нумеруются с нуля, а не с единицы.

За один шаг массив \(a\) заменяется на другой массив длины \(n\) по следующим правилам:

  1. Сначала строится новый массив \(a^{\rightarrow d}\) — циклический сдвиг массива \(a\) вправо на \(d\) ячеек. Элементы этого массива определяются как \(a^{\rightarrow d}_i = a_{(i + n - d) \bmod n}\), где \((i + n - d) \bmod n\) — остаток от деления \(i + n - d\) на \(n\).

    Таким образом весь массив \(a^{\rightarrow d}\) можно записать как \(\)a^{\rightarrow d} = [a_{n - d}, a_{n - d + 1}, \ldots, a_{n - 1}, a_0, a_1, \ldots, a_{n - d - 1}]\(\)

  2. Затем каждый элемент массива \(a_i\) заменяется на \(a_i \,\&\, a^{\rightarrow d}_i\), где \(\&\) — операция логического «И».

Например, если \(a = [0, 0, 1, 1]\) и \(d = 1\), то \(a^{\rightarrow d} = [1, 0, 0, 1]\), и значение \(a\) после первого шага будет равно \([0 \,\&\, 1, 0 \,\&\, 0, 1 \,\&\, 0, 1 \,\&\, 1]\), то есть \([0, 0, 0, 1]\).

Процесс завершается, когда массив перестает меняться. Для заданного массива \(a\) определите, будет ли он состоять из одних нулей по окончании процесса. Если да, то также найдите количество шагов, которое процесс совершит до своего завершения.

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

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

В следующих \(2t\) строках даны описания наборов входных данных.

В описании каждого набора входных данных первая строка содержит два целых числа: \(n\) (\(1 \le n \le 10^6\)) — размер массива, и \(d\) (\(1 \le d \le n\)) — размер сдвига массива на каждом шаге. Во второй строке описания через пробел записаны \(n\) чисел \(a_i\) (\(0 \le a_i \le 1\)) — элементы исходного массива.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^6\).

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

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

Примечание

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

  1. В начале \(a = [1, 1, 0, 1, 0]\), и \(a^{\rightarrow 2} = [1, 0, 1, 1, 0]\). Их поэлементное «И» равно \(\)[1 \,\&\, 1, 1 \,\&\, 0, 0 \,\&\, 1, 1 \,\&\, 1, 0 \,\&\, 0] = [1, 0, 0, 1, 0]\(\)
  2. Теперь \(a = [1, 0, 0, 1, 0]\), тогда \(a^{\rightarrow 2} = [1, 0, 1, 0, 0]\). Их поэлементное «И» равно \(\)[1 \,\&\, 1, 0 \,\&\, 0, 0 \,\&\, 1, 1 \,\&\, 0, 0 \,\&\, 0] = [1, 0, 0, 0, 0]\(\)
  3. И, наконец, при \(a = [1, 0, 0, 0, 0]\) получаем \(a^{\rightarrow 2} = [0, 0, 1, 0, 0]\). Их поэлементное «И» равно \(\)[1 \,\&\, 0, 0 \,\&\, 0, 0 \,\&\, 1, 0 \,\&\, 0, 0 \,\&\, 0] = [0, 0, 0, 0, 0]\(\)
Таким образом, ответ — \(3\) итерации.

В четвертом наборе входных данных массив не будет изменяться при сдвиге на \(2\) вправо, потому что каждый элемент будет вычисляться как \(0 \,\&\, 0\) или \(1 \,\&\, 1\). Таким образом, единицы останутся на своих местах, и ответ — -1, массив никогда не будет состоять только из нулей.

E. Строительство железных дорог

графы Конструктив кратчайшие пути Перебор Структуры данных *3400

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

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

Из-за технологических ограничений Нитори может строить только односторонние железные дороги. Их длина также может быть произвольным целым положительным числом. Строительство железной дороги в один конец от станции \(u\) будет стоить \(w_u\) единиц ресурсов независимо от станции назначения.

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

В силу разных причин стоимость строительства новой железной дороги иногда может расти бесконтрольно. Произойдут \(q\) событий, где \(i\)-е событие увеличивает стоимость постройки односторонних дорог из станции \(k_i\) на \(x_i\).

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

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

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

Вторая строка содержит \(n\) целых чисел \(w_1,w_2,\ldots,w_n\) (\(1 \le w_i \le 10^9\)).

Каждая из следующих \(m\) строк содержит три целых числа \(u\), \(v\), \(d\) (\(1 \le u,v \le n\), \(u \ne v\), \(1 \le d \le 10^9\)), описывающие двустороннюю железную дорогу между станциями \(u\) и \(v\) длины \(d\).

\(i\)-я из следующих \(q\) строк содержит два целых числа \(k_i,x_i\) (\(1 \le k_i \le n, 1 \le x_i \le 4 \times 10^8\)) — описание событий.

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

Выведите \(q+1\) строк, где \(i\)-я строка содержит одно целое число, равное минимальной стоимости строительства железной дороги после \(i-1\)-го события (\(0\)-е событие — ни одного события не произошло).

Примечание

Во втором тестовом примере Нитори может строить железные дороги следующим образом: \(1 \rightarrow 2\), \(1 \rightarrow 3\), \(1 \rightarrow 4\), \(2 \rightarrow 8\). Стоимость в таком случае составит \(14 + 14 + 14 + 4 = 46\).

G. Shortest path

геометрия кратчайшие пути математика Перебор *2700

You are given \(N\) points on an infinite plane with the Cartesian coordinate system on it. \(N-1\) points lay on one line, and one point isn't on that line. You are on point \(K\) at the start, and the goal is to visit every point. You can move between any two points in a straight line, and you can revisit points. What is the minimum length of the path?

Input

The first line contains two integers: \(N\) (\(3 \leq N \leq 2*10^5\)) - the number of points, and \(K\) (\(1 \leq K \leq N\)) - the index of the starting point.

Each of the next \(N\) lines contain two integers, \(A_i\), \(B_i\) (\(-10^6 \leq A_i, B_i \leq 10^6\)) - coordinates of the \(i-th\) point.

Output

The output contains one number - the shortest path to visit all given points starting from point \(K\). The absolute difference between your solution and the main solution shouldn't exceed \(10^-6\);

Note

The shortest path consists of these moves:

2 -> 5

5 -> 4

4 -> 1

1 -> 3

There isn't any shorter path possible.

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\) обозначает спуск.

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».

F. Доспехи и оружие

дп жадные алгоритмы кратчайшие пути Перебор *2800

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

Изначально персонаж Монокарпа владеет только \(1\)-м доспехом и \(1\)-м оружием. Монокарп может получить новое оружие или новый доспех за один час. Если он хочет получить \(k\)-й доспех или \(k\)-е оружие, он должен обладать комбинацией доспеха и оружия, чья суммарная сила \(k\) или больше. Конечно, после того, как Монокарп получит оружие или доспех, он может использовать его для получения новых доспехов или оружия, но также он может использовать любой из старых доспехов и/или оружия.

Монокарп хочет получить \(n\)-й доспех и \(m\)-е оружие. Какое минимальное количество часов он должен потратить на это?

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

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

Вторая строка содержит одно целое число \(q\) (\(0 \le q \le \min(2 \cdot 10^5, nm)\)) — количество комбинаций, которые хорошо сочетаются.

Затем следуют \(q\) строк, \(i\)-я строка содержит два целых числа \(a_i\) и \(b_i\) (\(1 \le a_i \le n\); \(1 \le b_i \le m\)), что означает, что \(a_i\)-й доспех хорошо сочетается с \(b_i\)-м оружием. Все пары \((a_i, b_i)\) различны.

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

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

Примечание

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

  1. Получить \(2\)-е оружие используя \(1\)-й доспех и \(1\)-е оружие;
  2. Получить \(3\)-й доспех используя \(1\)-й доспех и \(2\)-е оружие;
  3. Получить \(4\)-е оружие используя \(3\)-й доспех и \(2\)-е оружие.

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

  1. Получить \(3\)-й доспех используя \(1\)-й доспех и \(1\)-е оружие (они хорошо сочетаются, а значит сила Монокарпа равна не \(2\), а \(3\));
  2. Получить \(4\)-е оружие используя \(3\)-й доспех и \(1\)-е оружие.

H. Оленьи игры

Бинарный поиск графы Конструктив кратчайшие пути Потоки разделяй и властвуй Структуры данных *3000

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

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

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

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

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

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

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

В следующих \(m\) строках заданы сами ограничения.

В \(i\)-й строке заданы два целых числа \(u_i\) и \(v_i\) (\(1\le u_i, v_i\le n\); \(u_i\ne v_i\)) — номера оленей в \(i\)-м ограничении.

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

Выведите \(n\) целых чисел \(b_1,\ldots, b_n\) (\(-10^{15}\le b_i\le 10^{15}\)), где \(b_i\) будет равно финальному вкладу \(i\)-го оленя после применения всех операций.

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

Можно доказать, что всегда существует оптимальное решение с \(|b_i|\le 10^{15}\) для всех \(i\).

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\).

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\).

E. Не спасаться

дп кратчайшие пути реализация Структуры данных *2200

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

Здание состоит из \(n\) этажей, на каждом этаже \(m\) комнат. За \((i, j)\) обозначим \(j\)-ю комнату на \(i\)-м этаже. В здании \(k\) лестниц. \(i\)-я лестница позволяет Раму подняться из комнаты \((a_i, b_i)\) в \((c_i, d_i)\), но не в другом направлении. За проход по \(i\)-й лестнице Рам получает \(h_i\) очков здоровья. Гарантируется, что для всех лестниц \(a_i < c_i\).

Если Рам находится на \(i\)-м этаже, то он может двигаться влево или вправо. Путешествовать по этажам, однако, сложно, поэтому если Рам переходит от комнаты \((i, j)\) к \((i, k)\), он теряет \(|j-k| \cdot x_i\) очков здоровья.

Изначально Рам находится в комнате \((1, 1)\), а вертолет ожидает его в \((n, m)\). Какое минимальное количество очков здоровья Рам может потерять, если выберет оптимальный путь? Обратите внимание, что этот ответ может быть отрицательным (в этом случае он наберет очки здоровья). Выведите «NO ESCAPE», если Рам никак не может добраться к вертолету.

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

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 5 \cdot 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит \(3\) целых числа \(n, m, k\) (\(2 \leq n, m \leq 10^5\); \(1 \leq k \leq 10^5\)) — количество этажей, количество комнат на каждом этаже, и количество лестниц, соответственно.

Вторая строка содержит \(n\) целых чисел \(x_1, x_2, \dots, x_n\) (\(1 \leq x_i \leq 10^6\)).

Следующие \(k\) строк содержат описания лестниц. Лестница \(i\) описана пятью целыми числами \(a_i, b_i, c_i, d_i, h_i\) (\(1 \leq a_i < c_i \leq n\); \(1 \leq b_i, d_i \leq m\); \(1 \leq h_i \leq 10^6\)) — номера комнат, которые она соединяет, и бонус к здоровью при использовании лестницы.

Гарантируется, что для всех лестниц выполняется \(a_i < c_i\), и между любыми двумя комнатами существует не более чем одна лестница.

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

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

Выведите минимальное число очков здоровья, которое Рам может потерять на пути от \((1, 1)\) до \((n, m)\). Если Рам не может добраться до вертолета, выведите «NO ESCAPE» (заглавными буквами без кавычек).

Примечание

Рисунок в условии демонстрирует первый пример из условия. Есть только \(2\) возможных пути к \((n, m)\):

  • Рам идет в \((1, 3)\), поднимается по лестнице в \((3, 3)\), идет в \((3, 2)\), поднимается по лестнице в \((5, 1)\), идет до \((5, 3)\), откуда улетает на вертолете. Потери здоровья равны \(\) \begin{align*} &\mathrel{\phantom{=}} x_1 \cdot |1-3| - h_1 + x_3 \cdot |3-2| - h_3 + x_5 \cdot |1-3| \\ &= 5 \cdot 2 - 4 + 8 \cdot 1 - 6 + 4 \cdot 2 \\ &= 16. \end{align*} \(\)
  • Рам идет в \((1, 3)\), поднимается по лестнице в \((3, 3)\), идет в \((3, 1)\), поднимается по лестнице в \((5, 2)\), идет до \((5, 3)\) , откуда улетает на вертолете. Потери здоровья равны \(\) \begin{align*} &\mathrel{\phantom{=}} x_1 \cdot |1-3| - h_1 + x_3 \cdot |3-1| - h_2 + a_5 \cdot |2-3| \\ &= 5 \cdot 2 - 4 + 8 \cdot 2 - 5 + 4 \cdot 1 \\ &= 21. \end{align*} \(\)
Минимальная потеря здоровья равна \(16\).

Во втором примере нет пути в \((n, m)\).

В третьем примере Рам идет в \((1, 3)\), а затем поднимается по лестнице в \((5, 3)\). Он теряет \(5 \cdot 2\) очка здоровья и затем получает \(h_1 = 100\) очков. Поэтому его потери равны \(10-100=-90\) (отрицательное число означает, что он улучшил здоровье).

F. Не разрезать

геометрия графы жадные алгоритмы кратчайшие пути реализация *2700

У вас есть квадрат \(k \times k\), причем \(k\) четно. Клетка в строке \(r\) и столбце \(c\) обозначается \((r,c)\). Две клетки \((r_1, c_1)\) и \((r_2, c_2)\) называются соседними, если \(\lvert r_1 - r_2 \rvert + \lvert c_1 - c_2 \rvert = 1\).

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

Рисунок выше демонстрирует первый пример. Стрелки показывают пары клеток, а жирная линия показывает разрез на две части.

Вам дан массив \(a\) из \(n\) пар соседних клеток. Найдите размер наибольшей прочной подпоследовательности \(a\). Массив \(p\) является подпоследовательностью \(q\), если \(p\) может быть получен из \(q\) удалением нескольких (возможно, ни одного или всех) элементов.

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

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(1 \leq n \leq 10^5\); \(2 \leq k \leq 500\), \(k\) четно) — размер \(a\) и размер квадрата, соответственно.

Далее следуют \(n\) строк. \(i\)-я из этих строк содержит четыре целых числа \(r_{i,1}\), \(c_{i,1}\), \(r_{i,2}\) и \(c_{i,2}\) (\(1 \leq r_{i,1}, c_{i,1}, r_{i,2}, c_{i,2} \leq k\)) — \(i\)-й элемент \(a\), где \((r_{i,1}, c_{i,1})\) — строка и столбец первой клетки, а \((r_{i,2}, c_{i,2})\) — строка и столбец второй. Эти квадраты соседние.

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

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

Для каждого набора входных данных выведите одно целое число — размер наибольшей прочной подподпоследовательности \(a\).

Примечание

В первом примере \(a\) не является прочным, но подпоследовательность \([a_1, a_2, a_3, a_4, a_5, a_6, a_8]\) является, т. к. квадрат может быть разрезан способом, показанным в условии.

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

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\).

D. Бизнес-шоу

дп кратчайшие пути разделяй и властвуй реализация Структуры данных *2800

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

На клетке на пересечении строки \(i\) и столбца \(j\) написано число \(a_{i,j}\). Изначально у Димы есть баланс, равный нулю, и когда Дима наступает на клетку в \(i\)-й строке и \(j\)-м столбце, его баланс меняется на \(a_{i,j}\) рублей. Баланс может становиться отрицательным.

Дима может заходить на любые клетки первой и третьей строки, но изначально клетки второй строки для него недоступны. Однако есть \(q\) предложений от бизнесмена Петра, которые могут сделать их доступными: \(i\)-е предложение позволяет разблокировать все клетки второй строки на отрезке с \(l_i\) по \(r_i\), заплатив за это \(k_i\) рублей. Дима может воспользоваться любым количеством таких предложений, а также разблокировать одну и ту же клетку несколько раз.

Дима изначально стоит на клетке в клетке \((1, 1)\) и хочет попасть в клетку \((3, n)\). За один ход Дима может подвинуться на 1 вправо или вниз, то есть увеличить на 1 номер строки или столбца. Таким образом, всего в процессе пути Дима сделает \(n + 1\) ход, из которых ровно \(n - 1\) будет по горизонтали и \(2\) по вертикали.

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

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

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

В следующих трёх строках описываются числа в прямоугольнике, в \(i\)-й строке даны \(n\) целых чисел \(a_{i1}\), \(a_{i2}\), ..., \(a_{in}\) (\(-10^9 \le a_{ij} \le 10^9)\) — числа в \(i\)-й строке прямоугольника.

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

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

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

Примечание

В первом примере оптимально воспользоваться вторым предложением Петра за \(4\) рубля и пройти по клеткам \((1, 1)\), \((1, 2)\), \((1, 3)\), \((2, 3)\), \((3, 3)\), \((3, 4)\), заработав \(1 + 0 + 2 + 9 + 4 + 1 - 4 = 13\) рублей.

Во втором примере оптимально воспользоваться вторым и третьим предложением Петра за \(2\) и \(3\) рубля соответственно, и пройти по клеткам \((1, 1)\), \((2, 1)\), \((2, 2)\), \((2, 3)\), \((2, 4)\), \((3, 4)\), \((3, 5)\), заработав \(-20 + 1 + 3 + 3 + 6 + 6 + 2 - 2 - 3= -4\) рубля.

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]\). Можно показать, что любой оптимальный ответ удовлетворяет заданным ограничениям.

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

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)\).

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)\).

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\).

E. Приключения в лабиринте

дп кратчайшие пути матрицы Структуры данных *2600

Вы нашли карту лабиринта довольно странной формы. Карта представляет собой сетку, разделенную на \(n\) строк и \(n\) столбцов. Строки карты пронумерованы от \(1\) до \(n\) снизу вверх. Столбцы карты пронумерованы от \(1\) до \(n\) слева направо.

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

Лабиринт из \(5\) слоев, например, выглядит следующим образом:

Слои отделены друг от друга стенами. Однако, в этих стенах есть двери.

В каждом слое (кроме слоя \(n\)) есть ровно две двери в следующий слой. Одна дверь размещена на верхней стене слоя, а другая дверь размещена на правой стене слоя. Для каждого слоя от \(1\) до \(n-1\) вам даны позиции этих двух дверей. Через эти двери можно ходить в обоих направлениях: либо из слоя \(i\) в слой \(i+1\), либо из слоя \(i+1\) в слой \(i\).

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

Вам нужно обработать \(m\) запросов следующего вида: какое минимальное количество ходов необходимо сделать, чтобы дойти из клетки \((x_1, y_1)\) в клетку \((x_2, y_2)\)?

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

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

В \(i\)-й из следующих \(n-1\) строк записаны четыре целых числа \(d_{1,x}, d_{1,y}, d_{2,x}\) and \(d_{2,y}\) (\(1 \le d_{1,x}, d_{1,y}, d_{2,x}, d_{2,y} \le n\)) — координаты дверей. Обе ячейки находятся на \(i\)-м слое. Первая ячейка смежна с верхней стеной \(i\)-го слоя по стороне — эта сторона — это место двери. Вторая ячейка смежна с правой стеной \(i\)-го слоя по стороне — эта сторона — это место двери.

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

В \(j\)-й из следующих \(m\) строк записаны четыре целых числа \(x_1, y_1, x_2\) and \(y_2\) (\(1 \le x_1, y_1, x_2, y_2 \le n\)) — координаты ячеек в \(j\)-м запросе.

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

На каждый запрос выведите одно целое число — минимальное количество ходов, которое необходимо сделать, чтобы дойти из клетки \((x_1, y_1)\) в клетку \((x_2, y_2)\).

Примечание

Здесь изображена карта лабиринта из второго примера. Двери отмечены красным.

D. Лена и матрица

геометрия дп кратчайшие пути Структуры данных *1900

Лена — красивая девушка, которая любит логические головоломки.

В подарок на день рождения Лена получила матрицу-головоломку!

Матрица состоит из \(n\) строк и \(m\) столбцов, и каждая ячейка либо черная, либо белая. Координаты \((i,j)\) обозначает ячейку, которая находится в \(i\)-й строке и \(j\)-м столбце для любых \(1\leq i \leq n\) и \(1\leq j \leq m\). Чтобы решить головоломку, Лена должна выбрать какую-то ячейку так, чтобы минимизировать манхэттенское расстояние от этой ячейки до самой дальней от нее черной клетки.

Более формально, пусть в матрице \(k \ge 1\) черных ячеек с координатами \((x_i,y_i)\) для каждого \(1\leq i \leq k\). Лене нужно так выбрать ячейку \((a,b)\), чтобы минимизировать \(\)\max_{i=1}^{k}(|a-x_i|+|b-y_i|).\(\)

Поскольку у Лены нет нужных навыков, она попросила вас о помощи. Скажите ей оптимальную клетку, которую нужно выбрать.

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

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1\leq t\leq 10\,000\)) — количество наборов входных данных. Далее следуют наборы входных данных.

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

Следующие \(n\) строк содержат по \(m\) символов, каждый символ это «W» или «B». \(j\)-й символ в \(i\)-й строке равен «W», если ячейка \((i,j)\) белая, и «B», если ячейка \((i,j)\) черная.

Гарантируется, что в матрице есть как минимум одна черная клетка.

Также гарантируется, что сумма \(n\cdot m\) по всем наборам входных данных не превосходит \(10^6\).

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

Для каждого набора входных данных выведите оптимальную ячейку \((a,b)\). Если существует несколько оптимальных ответов, выведите любой.

Примечание

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

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

C. Keshi ищет AmShZ

графы жадные алгоритмы кратчайшие пути *2300

AmShZ приехал в Италию из Ирана на концерт Тома Йорка. В Италии есть \(n\) городов с номерами от \(1\) до \(n\) и \(m\) ориентированных дорог с номерами от \(1\) до \(m\). Изначально Keshi находится в городе \(1\) и хочет добраться к дому AmShZ в городе \(n\). Поскольку Keshi не знает карту Италии, AmShZ помогает ему встретиться как можно скорее.

В начале каждого дня AmShZ может отправить Keshi одно из следующих двух сообщений:

  • AmShZ отправляет Keshi номер одной дороги, обозначая её как блокированную дорогу. Тогда Keshi поймет, что он никогда не должен пользоваться этой дорогой и останется в своем текущем городе на весь день.
  • AmShZ говорит Keshi двигаться. Затем Keshi случайным образом выберет один из городов, до которых можно добраться из его текущего города, и переедет туда. (Город \(B\) достижим из города \(A\), если есть исходящая дорога из города \(A\) в город \(B\), которая еще не заблокирована). Если таких городов нет, Keshi останется в своем текущем городе.

    Заметим, что AmShZ всегда знает текущее местоположение Keshi.

AmShZ и Keshi хотят найти наименьшее возможное целое число \(d\), при котором они могут быть уверены, что увидят друг друга через не более чем \(d\) дней. Помогите им найти \(d\).

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

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

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

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

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

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

Примечание

В первом примере достаточно, чтобы AmShZ отправил сообщение второго типа.

Во втором примере, в первый день, AmShZ блокирует первую дорогу. Поэтому единственным городом, до которого можно добраться из города \(1\), будет город \(4\). Следовательно, на второй день AmShZ может сказать Keshi двигаться, и Keshi прибудет в дом AmShZ.

AmShZ также может сказать Keshi двигаться в течение двух дней.

C. Нулевой путь

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

Вам дана таблица с \(n\) строк и \(m\) столбцов. Обозначим ячейку в \(i\)-й (\(1\le i\le n\)) строке и \(j\)-м (\(1\le j\le m\)) столбце через \((i, j)\), а число в ней через \(a_{ij}\). Все числа равны \(1\) или \(-1\).

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

Можно ли двигаться таким образом, чтобы сумма значений, записанных во всех посещенных ячейках (включая \(a_{11}\) и \(a_{nm}\)), была равна \(0\)?

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

Каждый тест содержит несколько наборов входных данных. Первая строка содержит количество наборов входных данных \(t\) (\(1 \leq t \leq 10^4\)). Далее следует описание наборов входных данных.

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

Каждая из следующих \(n\) строк содержит \(m\) целых чисел. \(j\)-е целое число в \(i\)-й строке это \(a_{ij}\) (\(a_{ij} = 1\) или \(-1\))  — элемент в ячейке \((i, j)\).

Гарантируется, что сумма \(n\cdot m\) по всем наборам входных данных не превышает \(10^6\).

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

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

Примечание

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

D. Граф перестановки

Бинарный поиск жадные алгоритмы Конструктив кратчайшие пути разделяй и властвуй Структуры данных *1900

Перестановкой является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)).

Дана перестановка \([a_1,a_2,\dots,a_n]\) чисел \(1,2,\dots,n\). Для целых \(i\),\(j\), таких что \(1\le i<j\le n\), определим \(\operatorname{mn}(i,j)\) как \(\min\limits_{k=i}^j a_k\), а \(\operatorname{mx}(i,j)\) как \(\max\limits_{k=i}^j a_k\).

Построим неориентированный граф на \(n\) вершинах, пронумерованных от \(1\) до \(n\). Для каждой пары \(1\le i<j\le n\), если одновременно \(\operatorname{mn}(i,j)=a_i\) и \(\operatorname{mx}(i,j)=a_j\), или одновременно \(\operatorname{mn}(i,j)=a_j\) и \(\operatorname{mx}(i,j)=a_i\), то между вершинами \(i\) и \(j\) проводится неориентированное ребро длины \(1\).

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

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

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 5\cdot 10^4\)) — количество наборов входных данных. Далее следуют наборы входных данных.

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

Вторая строка набора входных данных содержит \(n\) целых чисел \(a_1\),\(a_2\),\(\ldots\),\(a_n\) (\(1\le a_i\le n\)). Гарантируется, что \(a\) является перестановкой чисел \(1\),\(2\),\(\dots\),\(n\).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(5\cdot 10^5\).

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

Для каждого набора входных данных выведите одно число — длину кратчайшего пути от \(1\) до \(n\).

Примечание

Ниже приведены построенные графы, отвечающие наборам входных данных.

граф в наборе 1
граф в наборе 2
граф в наборе 3
граф в наборе 4
граф в наборе 5

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.

D. Пустой граф

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

 — Do you have a wish?
 — I want people to stop gifting each other arrays.
O_o and Another Young Boy

Массив из \(n\) целых положительных чисел \(a_1,a_2,\ldots,a_n\) упал на вас с небес вместе с целым положительным числом \(k \le n\).

Вы можете применить следующую операцию не более \(k\) раз:

  • Выбрать индекс \(1 \le i \le n\) и целое число \(1 \le x \le 10^9\). Затем выполнить \(a_i := x\) (присвоить \(x\) значению \(a_i\)).

Затем вы строите полный неориентированный взвешенный граф с \(n\) вершинами, пронумерованными целыми числами от \(1\) до \(n\), где ребро \((l, r)\) (\(1 \le l < r \le n\)) имеет вес \(\min(a_{l},a_{l+1},\ldots,a_{r})\).

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

Диаметр неориентированного взвешенного графа равен \(\max\limits_{1 \le u < v \le n}{\operatorname{d}(u, v)}\), где \(\operatorname{d}(u, v)\) является длиной кратчайшего пути между вершинами \(u\) и \(v\) данного графа.

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

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

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

Вторая строка каждого набора входных данных содержит \(n\) целых положительных чисел \(a_1,a_2,\ldots,a_n\) (\(1 \le a_i \le 10^9\)).

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

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

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

Примечание

В первом наборе входных данных один из оптимальных итоговых массивов — \([2,4,5]\).

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

\(\operatorname{d}(1, 2) = \operatorname{d}(1, 3) = 2\) и \(\operatorname{d}(2, 3) = 4\), поэтому диаметр графа равен \(\max(2,2,4) = 4\).

E. Долгий путь домой

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

Олеся решила отправиться в путешествие по стране, состоящей из \(n\) городов (она живет в городе \(1\)). Между некоторыми городами страны есть двусторонние дороги. Для каждой дороги известно время, необходимое для того, чтобы по ней проехать. Также между каждой парой городов есть авиарейс, перелет из города \(u\) в город \(v\) занимает \((u - v)^2\) времени.

Олеся недавно посмотрела «Чудо на Гудзоне» и несколько боится летать, поэтому она может воспользоваться не более чем \(k\) перелетами. Олеся хочет узнать минимальное время путешествия в каждый из \(n\) городов страны из города \(1\).

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

В первой строке находятся числа \(n\), \(m\) и \(k\) (\(2 \leq n \leq 10^{5}\), \(1 \leq m \leq 10^{5}\), \(1 \leq k \leq 20\)) — количество городов, дорог и максимальное количество перелётов, которое может совершить Олеся.

Следующие \(m\) строк описывают дороги. В каждой находятся числа \(u\), \(v\), \(w\) (\(1 \leq u, v \leq n\), \(u \neq v\), \(1 \leq w \leq 10^{9}\)) — города, которые соединяет дорога, и время, необходимое, чтобы по ней проехать. Некоторые пары городов могут быть соединены более чем одной парой дорог.

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

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

Примечание

В первом примере время путешествия до города 1 равно 0; чтобы добраться в город 2, можно воспользоваться авиаперелетом из 1 в 2 за 1 единицу времени; в город 3 можно добраться из города 1 по дороге за 1 единицу времени.

Во втором примере время путешествия до города 1 равно 0. Чтобы добраться в город 2, можно воспользоваться авиаперелетом из 1 в 2, занимающим 1 единицу времени. Чтобы добраться в город 3 за 4 единицы времени, можно проехать из города 1 в город 2 по дороге за 3 единицы времени, а потом воспользоваться авиаперелетом из 2 в 3. Чтобы добраться в город 4, можно воспользоваться авиаперелетом из города 1 в город 2, а потом проехать из города 2 в город 4 по дороге за 5 единиц времени.

M. Moving Both Hands

графы дп кратчайшие пути *1800

Pak Chanek is playing one of his favourite board games. In the game, there is a directed graph with \(N\) vertices and \(M\) edges. In the graph, edge \(i\) connects two different vertices \(U_i\) and \(V_i\) with a length of \(W_i\). By using the \(i\)-th edge, something can move from \(U_i\) to \(V_i\), but not from \(V_i\) to \(U_i\).

To play this game, initially Pak Chanek must place both of his hands onto two different vertices. In one move, he can move one of his hands to another vertex using an edge. To move a hand from vertex \(U_i\) to vertex \(V_i\), Pak Chanek needs a time of \(W_i\) seconds. Note that Pak Chanek can only move one hand at a time. This game ends when both of Pak Chanek's hands are on the same vertex.

Pak Chanek has several questions. For each \(p\) satisfying \(2 \leq p \leq N\), you need to find the minimum time in seconds needed for Pak Chanek to end the game if initially Pak Chanek's left hand and right hand are placed on vertex \(1\) and vertex \(p\), or report if it is impossible.

Input

The first line contains two integers \(N\) and \(M\) (\(2 \leq N \leq 10^5\), \(0 \leq M \leq 2 \cdot 10^5\)) — the number of vertices and edges in the graph.

The \(i\)-th of the next \(M\) lines contains three integers \(U_i\), \(V_i\), and \(W_i\) (\(1 \le U_i, V_i \le N\), \(U_i \neq V_i\), \(1 \le W_i \le 10^9\)) — a directed edge that connects two different vertices \(U_i\) and \(V_i\) with a length of \(W_i\). There is no pair of different edges \(i\) and \(j\) such that \(U_i = U_j\) and \(V_i = V_j\).

Output

Output a line containing \(N-1\) integers. The \(j\)-th integer represents the minimum time in seconds needed by Pak Chanek to end the game if initially Pak Chanek's left hand and right hand are placed on vertex \(1\) and vertex \(j+1\), or \(-1\) if it is impossible.

Note

If initially Pak Chanek's left hand is on vertex \(1\) and his right hand is on vertex \(5\), Pak Chanek can do the following moves:

  1. Move his right hand to vertex \(4\) in \(1\) second.
  2. Move his left hand to vertex \(2\) in \(2\) seconds.
  3. Move his left hand to vertex \(4\) in \(1\) second.

In total it needs \(1+2+1=4\) seconds. It can be proven that there is no other way that is faster.

F. Опоздать на работу (отправка решений запрещена)

жадные алгоритмы кратчайшие пути расписания Структуры данных *2900

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

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

Harsh должен забрать Debajyoti из его дома и отвезите его к месту назначения, чтобы Debajyoti успел вовремя посетить встречу. Прямая дорога с \(n\) светофорами соединяет дом и место проведения интервью. Светофоры пронумерованы по порядку от \(1\) до \(n\).

Каждый светофор зацикливается через \(t\) секунд. \(i\)-й светофор горит \(\color{green}{\text{зелёным}}\) (в этом случае Harsh может проехать светофор) первые \(g_i\) секунд, и \(\color{red}{\text{красным}}\) (в этом случае Harsh должен дождаться включения \(\color{green}{\text{зелёного}}\)) оставшиеся \((t−g_i)\) секунд, после чего схема повторяется. Цикл каждого светофора повторяется бесконечно, и изначально, \(i\)-й светофор находится на секунде \(c_i\) в своём цикле (светофор с \(c_i=0\) только что включил \(\color{green}{\text{зелёный}}\)). В случае, если Harsh приближается к светофору в то же время, когда он меняет цвет, он будет подчиняться новому цвету. Формально, \(i\)-й светофор горит \(\color{green}{\text{зелёным}}\) в отрезок времени \([0,g_i)\) и \(\color{red}{\text{красным}}\) в отрезок времени \([g_i,t)\) (после чего цикл повторяется). \(i\)-й светофор изначально находится на \(c_i\)-й секунде своего цикла.

От \(i\)-го светофора ровно \(d_i\) секунд требуются, чтобы доехать до следующего светофора (то есть до \((i+1)\)-го светофора). Дом Debajyoti расположен прямо перед первым светофором, и Debajyoti попадает на интервью как только он проезжает \(n\)-й светофор. Другими словами, не требуется времени, чтобы доехать до первого светофора из дома Debajyoti или добраться до центра интервью от \(n\)-го светофора.

Harsh не знает, сколько времени потребуется Debajyoti, чтобы собраться. В ожидании он задается вопросом, какое минимально возможное количество времени ему может понадобиться провести за рулем, если он начнет движение в момент прибытия Debajyoti, которое может быть любым от \(0\) до \(\infty\) секунд от данного момента. Можете ли вы сказать Harsh минимально возможное количество времени, которое ему нужно провести в дороге?

Обратите внимание, что Harsh может начинать или останавливать движение только в целочисленные моменты времени.

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

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

Далее следуют \(n\) строк. \(i\)-я строка содержит два целых числа \(g_i\) и \(c_i\) (\(1 \le g_i < t\), \(0 \le c_i < t\)), описывающие \(i\)-й светофор.

Следующая строка содержит \(n−1\) целых чисел \(d_1, d_2, \ldots, d_{n-1}\) (\(0 \le d_i \le 10^9\)) — время, нужное чтобы доехать от \(i\)-го до \((i+1)\)-го светофора.

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

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

Примечание

В первом примере мы можем сделать следующее:

  • Изначально, \(5\) светофоров находятся на следующих секундах в цикле: \(\{2,3,6,2,0\}\).
  • Оптимальное время для Harsh, чтобы начать, если Debajyoti приедет через \(1\) секунду. Заметьте, что эта \(1\) секунда не будет учитываться в финальном ответе.
  • Светофоры сейчас находятся в состоянии \(\{3,4,7,3,1\}\), поэтому Harsh может проехать от \(1\)-го светофора до \(2\)-го светофора, что требует \(1\) секунду для перемещения.
  • Светофоры сейчас находятся в состоянии \(\{4,5,8,4,2\}\), поэтому Harsh может продолжить движение без остановки до \(3\)-го светофора, что требует \(2\) секунды для перемещения.
  • Светофоры сейчас находятся в состоянии \(\{6,7,0,6,4\}\), поэтому Harsh продолжит движение до \(4\)-го светофора, что требует \(3\) секунды для перемещения.
  • Светофоры сейчас находятся в состоянии \(\{9,0,3,9,7\}\). Harsh должен подождать \(1\) секунду, чтобы \(4\)-й светофор загорелся зелёным прежде чем доехать до \(5\)-го светофора, что требует \(4\) секунды для передвижения.
  • Светофоры сейчас находятся в состоянии \(\{4,5,8,4,2\}\), поэтому Harsh может продолжить передвижение без остановки до места встречи. Общее время, которое Harsh провел за рулем, равно \(1+2+3+1+4=11\) секунд.

В втором примере мы можем сделать следующее:

  • Изначально \(6\) светофоров находятся на следующих секундах в цикле: \(\{3,5,0,8,7,6\}\).
  • Оптимальным для Harsh будет начать, если Debajyoti приедет после \(1\) секунды. Заметьте, что эта \(1\) секунда не будет учитываться в финальном ответе.
  • Светофоры сейчас находятся в состоянии \(\{4,6,1,0,8,7\}\), поэтому Harsh может проехать \(1\)-го светофора до \(2\)-го, что требует \(0\) секунд для передвижения.
  • Светофоры всё ещё находятся в состоянии \(\{4,6,1,0,8,7\}\). Harsh должен подождать \(3\) секунды, чтобы \(2\)-й светофор загорелся зелёным, прежде чем поехать до \(3\)-го светофора, что потребует \(0\) секунд для передвижения.
  • Светофоры сейчас находятся в состоянии \(\{7,0,4,3,2,1\}\), поэтому Harsh продолжит двигаться до \(4\)-го светофора, что потребует \(0\) секунд для передвижения.
  • Светофоры всё ещё находятся в состоянии \(\{7,0,4,3,2,1\}\), поэтому Harsh продолжит двигаться до \(5\)-го светофора, что потребует \(0\) секунд для передвижения.
  • Светофоры всё ещё находятся в состоянии \(\{7,0,4,3,2,1\}\), поэтому Harsh продолжит двигаться до \(6\)-го светофора, что потребует \(0\) секунд для передвижения.
  • Светофоры всё ещё находятся в состоянии \(\{7,0,4,3,2,1\}\), поэтому Harsh продолжит двигаться до места назначения без остановки. Общее время, которое Harsh проведёт в дороге равно \(0+3+0+0+0=3\) секунды.

B. Тайная комната

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

«Тайная комната снова открыта» — эта новость распространилась по всему Хогвартсу. Дамблдор был уволен и теперь Гарри пытается попасть в тайную комнату. Лорд Волдеморт не доволен таким развитием событий, он хочет помешать Гарри.

Тайная комната представляет собой прямоугольное поле n × m, в некоторых клетках которого стоят колонны. Колонны обладают необычным свойством: луч света может беспрепятственно проходить сквозь них, не меняя своего направления. Используя магию, можно превратить некоторые колонны в магические. Магические колонны отличаются от обычных тем, что луч света, проходящий через магическую колонну, отражается в четыре стороны как показано на рисунке.

Слева свет проходит через обычную колонну, справа — через магическую.

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

На рисунке изображен первый тестовый пример.

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

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

В первой строке записано два целых числа n и m (2 ≤ n, m ≤ 1000) — размеры тайной комнаты. Следующие n строк содержат по m символов. Каждый символ равен «.» или «#» и описывает соответствующую клетку тайной комнаты. Символ равен «.» — если соответствующая клетка комнаты пустая, «#» — если соответствующая клетка содержит обычную колонну.

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

Выведите единственное число — минимальное количество колонн, которое нужно сделать магическими, для защиты тайной комнаты или -1, если защитить тайную комнату невозможно.

Примечание

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

D. Эла и волшебник

графы дп жадные алгоритмы кратчайшие пути Перебор реализация *2200

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

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

  • Выберет один из компьютеров, соединенный этим проводом. Без ограничения общности выберем \(v_i\).
  • Выберет компьютер, который в данный момент подключен к \(v_i\) (можно выбрать \(u_i\)), назовем его \(t_i\), отсоединит провод с индексом \(i\) от \(v_i\), и соединит им \(u_i\) и \(t_i\).

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

Задача Элы — как можно быстрее отправить пакет данных с компьютера \(1\) на компьютер \(n\). Обратите внимание, что волшебник может использовать свое заклинание сколько угодно раз (возможно, ноль). Чтобы обеспечить бесперебойную работу сети при передаче большого пакета, все заклинания могут использоваться только до начала передачи данных с компьютера \(1\).

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

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

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следуют наборы входных данных.

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

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

Гарантируется, что сумма \(n\) по всем наборам не превышает \(500\) и сумма \(m\) по всем наборам не превышает \(250 000\). Граф в каждом наборе входных данных гарантированно будет связным и без петель, но он может содержать кратные ребра.

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

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

Примечание

Граф в первом наборе входных данных:

Эла может попросить волшебника использовать его заклинание на проводе с индексом \(7\), который соединяет компьютеры \(2\) и \(3\). Поскольку компьютер \(8\) подключена к компьютеру \(3\), волшебник может отключить провод \(7\) от компьютера \(3\) и подключить его к компьютеру \(8\) за \(3\) микросекунды (вес провода \(3\)).

После этого пакет можно отправить с компьютера \(1\) на компьютер \(8\) за \(6\) микросекунд. Следовательно, ответ \(3 + 6 = 9\) микросекунд.

F. Упоротая связность

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

Это интерактивная задача.

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

  1. Множество вершин цвета \(c\) является связным;
  2. \(s_c \leq n_c^2\), где \(n_c\) число вершин цвета \(c\), и \(s_c\) сумма степеней вершин цвета \(c\).
Можно показать, что всегда существует раскраска такая, что условия выполняются.

Исходно вам дано только \(n\) - число вершин и степень каждой вершины.

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

Вы можете сделать максимум \(n\) запросов.

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

Степень вершины это число ребер, исходящих из нее.

Множество вершин \(S\) называется связным если для любых двух различных вершин \(u, v \in S\), существует путь, который проходит только по вершинам множества \(S\), и соединяет \(u\) и \(v\). Формально, существует последовательность ребер \((u_1, v_1), (u_2, v_2), \dots, (u_k, v_k)\) с \(k \geq 1\) такая, что

  1. \(u_1 = u\), \(v_k = v\), и \(v_i = u_{i+1}\) для любого \(1 \leq i < k\); и
  2. \(u_k \in S\) и \(v_k \in S\) для любого \(1 \leq i \leq k\).
Множество содержащее одну вершину является связным.
Протокол взаимодействия

Каждый тест состоит из нескольких наборов входных данных. В первой строке содержится целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных. Следующие строки содержат описание и интерактивную часть каждого набора входных данных.

Для каждого набора входных данных вы начинаете взаимодействие с итерактором с чтения целого числа \(n\) (\(1\le n \le 1000\)) в первой строке, означающего число вершин в графе.

Вторая строка содержит \(n\) целых чисел \(d_1, d_2, \dots, d_n\) (\(0 \leq d_i \leq n - 1\)), где \(d_i\) это степень вершины \(i\).

Чтобы совершить запрос к вершине \(u\) (\(1 \leq u \leq n\)), вы должны вывести

  • «? \(u\)»
В отдельной строке. Если это \(k\)-й запрос к вершине \(u\), вершина \(e_{u, k}\) будет выведена на следующей отдельной строке, где \(\left(u, e_{u, k}\right)\) это \(k\)-е ребро, исходящее из вершины \(u\). В случае если \(k > d_u\), положим \(e_{u, k} = -1\). Вы должны сделать не более \(n\) «?» запросов.

Чтобы дать ответ вы должны вывести

  • «! \(c_1\) \(c_2\) \(\dots\) \(c_n\)»
в отдельной строке, где \(c_i\) (\(1 \leq c_i \leq n\)) это цвет вершины \(i\). После этого ваша программа должны продолжить работать со следующим набором входных данных или завершиться, если это был последний.

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

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(1000\).

В случае, если формат запроса неверный, или вы сделали более \(n\) «?» запросов, вы получите вердикт Неправильный Ответ.

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

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

Формат взломов

Первая строка взлома должна содержать целое число \(t\) (\(1 \leq t \leq 1000\)), означающее число наборов входных данных. Следующие строки содержат описание наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \leq n \leq 1000\)), означающее число вершин в графе.

Затем следуют \(n\) строк. В \(i\)-й строке содержится целое число \(d_i\) (\(0 \leq d_i \leq n - 1\)), означающее степень вершины \(i\), и затем \(d_i\) различных целых чисел \(e_{i,1}, e_{i,2}, \dots, e_{i,d_i}\) (\(1 \leq e_{i, j} \leq n\) и \(e_{i,j} \neq i\)), где \(\left(i, e_{i,j}\right)\) это \(j\)-е ребро, исходящее из вершины \(i\).

Вы должны гарантировать, что граф является простым и неориентированным.

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

Примечание

В примере только один набор входных данных.

В нем \(n = 5\) вершин, из которых \(1, 2, 3, 4\) имеют степень \(2\) и вершина \(5\) имеет степень \(0\). Это означает, что вершина \(5\) изолированная - не соединена ни с одной другой вершиной.

Возможное взаимодействие с итерактором показано во вводе и выводе примера, использовано \(4\) «?» запроса. Из них два к вершине \(1\) и два к вершине \(3\). Исходя из результатов этих запросов мы знаем, что вершины \(1\) и \(3\) соединены с вершинами \(2\) и \(4\).

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

  • Для цвета \(c = 1\), вершины \(1\) и \(2\) связны. Также, \(n_1 = 2\) и \(s_1 = d_1 + d_2 = 2 + 2 = 4 \leq n_1^2 = 2^2 = 4\);
  • Для цвета \(c = 2\), вершины \(3\) и \(4\) связны. Также, \(n_2 = 2\) и \(s_2 = d_3 + d_4 = 2 + 2 = 4 \leq n_2^2 = 2^2 = 4\);
  • Для цвета \(c = 3\), есть только одна вершина (вершина \(5\)) покрашенная в цвет \(3\). Также, \(n_3 = 1\) и \(s_3 = d_5 = 0 \leq n_3^2 = 1^2 = 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\).

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. Gnomes of Might and Magic

графы кратчайшие пути реализация Структуры данных *3000

Вася играет в популярную игру Gnomes of Might and Magic.

В этой игре Вася управляет королевством гномов, состоящим из нескольких замков, соединенных двусторонними дорогами. Сеть дорог королевства имеет специальный вид. В королевстве есть m главных замков: a1, a2, ... , am, которые образуют Путь Добра. Этот путь состоит из дорог между замками ai, ai + 1 (1 ≤ i < m), а так же дороги между am и a1. Никаких других дорог между замками Пути Добра нет.

Кроме того, для каждой пары соседних замков Пути Добра u и v существует ровно один Обход Зла — путь по дорогам королевства, ведущий из первого замка (u) во второй (v) и не имеющий с Путем Добра общих вершин, кроме вершин u и v. Известно, что никаких других дорог и замков в королевстве нет, то есть каждая дорога и каждый замок лежит либо на Пути Добра, либо на Обходе Зла (замки могут лежать и там, и там). Кроме того, никакие два Обхода Зла не имеют общих замков, отличных от замков Пути Добра.

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

Пусть Миссия Смерти должна попасть из замка s в замок t. Тогда она будет двигаться из замка s к замку t, уничтожая всех очень плохих гномов, находящихся на дорогах пути, по которому она следует. Вася настолько крут, что его Миссия Смерти может уничтожить любое число гномов на своем пути. Однако, Вася очень добрый, поэтому всегда выбирает такой путь между замками s и t, следуя которому придется уничтожить наименьшее число гномов. Если таких путей несколько то среди них Вася выбирает путь, содержащий наименьшее число дорог. Если и таких путей несколько, то среди них Вася выбирает лексикографически минимальный.

Помогите Васе, промоделируйте жизнь королевства в игре Gnomes of Might and Magic.

Под путем понимается последовательность замков такая, что каждая пара соседних замков пути соединена дорогой. При этом путь x1, x2, ... , xp лексикографически меньше пути y1, y2, ... , yq, если либо p < q и x1 = y1, x2 = y2, ... , xp = yp, либо существует такое число r (r < p, r < q), что x1 = y1, x2 = y2, ... , xr = yr и xr + 1 < yr + 1.

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

В первой строке находятся два целых числа n и m (3 ≤ m ≤ n ≤ 100000) — количество замков в королевстве и количество замков на Пути Добра, соответственно.

Во второй строке находится m целых чисел — номера замков Пути Добра (замки нумеруются от 1 до n) в порядке следования по Пути, начиная с некоторого замка. Все замки Пути Добра различны.

Каждая из следующих m строк описывает один Обход Зла. Сначала в строке записано целое число ki (3 ≤ ki ≤ 100000) — количество замков на соответствующем Обходе Зла (с учетом двух замков, находящихся на пути добра), затем следует ki целых чисел — номера замков в порядке следования по данному Обходу. Все замки в одном Обходе Зла различны. Гарантируется, что первый и последний замки Обхода находятся на Пути Добра, а первые замки в Обходах Зла образуют Путь Добра и представлены в том же порядке, что и Путь во второй строке.

В следующей строке находится целое число q (1 ≤ q ≤ 100000) — количество событий в жизни королевства. Каждая из следующих q строк описывает одно событие. Событие описывается символом cj и двумя номерами замков sj и tj (символ и номера замков разделены единичным пробелом). Если символ cj равен «+» (плюс), то это означает, что на дороге между замками sj и tj встал (возможно, не первый) очень плохой гном. Если cj равен «?» (вопрос), то Вася направил Миссию Смерти из замка sj в замок tj. Гарантируется, что при запросе «+» дорога между замками sj и tj существует. События даны в хронологическом порядке, начиная с самого раннего. Изначально очень плохих гномов на дорогах нет.

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

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

Для каждого запроса «?» необходимо вывести единственное число на отдельной строчке — количество очень плохих гномов, уничтоженных соответствующей Миссией Смерти. Ответы на запросы нужно выводить в хронологическом порядке.

Примечание

В примере после первых 4 запросов существует только один путь из замка 1 в замок 2, не содержащий дорог с очень плохими гномами: 1 6 3 5 2.

После того, как гном встал на дорогу (2, 5), следующая Миссия Смерти движется по пути 1 2 и уничтожает гнома, находившегося на дороге (1, 2). Следующая Миссия смерти идет по этому же пути, уже свободному от гномов.

После того, как еще один гном встал на дорогу (1, 2), следующая Миссия Смерти идет по пути 1 2 и уничтожает этого гнома.

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\) единицы дискомфорта. Можно показать, что доставить меньшее количество дискомфорта не получится.

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

C. Термостат

жадные алгоритмы кратчайшие пути математика *1100

Влад пришёл домой и обнаружил, что кто-то перенастроил старый термостат на температуру \(a\).

Термостат можно настроить только на температуру от \(l\) до \(r\) включительно, при этом температура не может измениться меньше чем на \(x\). Формально, за одно действие вы можете перенастроить термостат с температуры \(a\) на температуру \(b\), если \(|a - b| \ge x\) и \(l \le b \le r\).

Вам заданы \(l\), \(r\), \(x\), \(a\) и \(b\). Найдите минимальное количество действий, необходимое чтобы из температуры \(a\) получить температуру \(b\), либо сообщите что это невозможно сделать.

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

Первая строка входных данных содержит единственное число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов входных данных.

Первая строка каждого набора содержит по три целых числа \(l\), \(r\) и \(x\) (\(-10^9 \le l \le r \le 10^9\), \(1 \le x \le 10^9\)) — границы диапазона и минимальное изменение температуры.

Вторая строка каждого набора содержит по два целых числа \(a\) и \(b\) (\(l \le a, b \le r\)) — начальная и конечная температуры.

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

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

Примечание

В первом примере термостат уже настроен правильно.

Во втором примере можно добиться нужной температуры следующим образом: \(4 \rightarrow 10 \rightarrow 5\).

В третьем примере можно добиться нужной температуры следующим образом: \(3 \rightarrow 8 \rightarrow 2 \rightarrow 7\).

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

I. Infinite Chess

кратчайшие пути реализация *2800

The black king lives on a chess board with an infinite number of columns (files) and \(8\) rows (ranks). The columns are numbered with all integer numbers (including negative). The rows are numbered from \(1\) to \(8\).

Initially, the black king is located on the starting square \((x_s, y_s)\), and he needs to reach some target square \((x_t, y_t)\). Unfortunately, there are also white pieces on the board, and they threaten the black king. After negotiations, the white pieces agreed to let the black king pass to the target square on the following conditions:

  • each turn, the black king makes a move according to the movement rules;
  • the black king cannot move to a square occupied by a white piece;
  • the black king cannot move to a square which is under attack by any white piece. A square is under attack if a white piece can reach it in one move according to the movement rules;
  • the white pieces never move.

Help the black king find the minimum number of moves needed to reach the target square while not violating the conditions. The black king cannot leave the board at any time.

The black king moves according to the movement rules below. Even though the white pieces never move, squares which they can reach in one move are considered to be under attack, so the black king cannot move into those squares.

Below are the movement rules. Note that the pieces (except for the knight) cannot jump over other pieces.

  • a king moves exactly one square horizontally, vertically, or diagonally.
  • a rook moves any number of vacant squares horizontally or vertically.
  • a bishop moves any number of vacant squares diagonally.
  • a queen moves any number of vacant squares horizontally, vertically, or diagonally.
  • a knight moves to one of the nearest squares not on the same rank, file, or diagonal (this can be thought of as moving two squares horizontally then one square vertically, or moving one square horizontally then two squares vertically — i. e. in an "L" pattern). Knights are not blocked by other pieces, they can simply jump over them.

There are no pawns on the board.

King and knight possible moves, respectively. Dotted line shows that knight can jump over other pieces.
Queen, bishop, and rook possible moves, respectively.
Input

The first line contains two integers \(x_s\) and \(y_s\) (\(1 \le x_s \le 10^8\); \(1 \le y_s \le 8\)) — the starting coordinates of the black king.

The second line contains two integers \(x_t\) and \(y_t\) (\(1 \le x_t \le 10^8\); \(1 \le y_t \le 8\)) — the coordinates of the target square for the black king.

The third line contains one integer \(n\) (\(0 \le n \le 2000\)) — the number of white pieces on the board.

Then \(n\) lines follow, the \(i\)-th line contains one character \(t_i\) and two integers \(x_i\) and \(y_i\) (\(1 \le x_i \le 10^8\); \(1 \le y_i \le 8\)) — the type and the coordinates of the \(i\)-th white piece. The types of pieces are represented by the following uppercase Latin letters:

  • K — king
  • Q — queen
  • R — rook
  • B — bishop
  • N — knight

There can be any number of white pieces of any type listed above on the board, for example, \(3\) white kings or \(4\) white queens. There are no pawns on the board.

Additional constrains on the input:

  • no square is occupied by more than one white piece;
  • the starting square for the black king is different from the square he wants to reach, and neither of these two squares is occupied or is under attack by any white piece.
Output

Print one integer — the minimum number of moves needed for the black king to reach the target square while not violating the conditions, or \(-1\) if it is impossible.

Note

The image below demonstrates the solution for the second example. Here, the letters K, R, s, and t represent the white king, the white rook, the starting square, and the target square, respectively. Bold crosses mark the squares which are under attack by the white pieces. Bold dots show the shortest path for the black king.

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\) лапками) ни с кем не дружит, поэтому ему невозможно передать сообщение.

J. Italian Data Centers

графы кратчайшие пути *2500

An Italian data center consists of a set of servers, each colored green, white, or red, and a set of wires connecting them. Each wire connects two distinct servers and two servers are connected by at most one wire. Additionally, the data center is connected, i.e. there is a way to transmit information between any two servers through a sequence of wires.

To judge all of the contestant submissions, SWERC has an Italian data center. Since every year the number of contestants doubles, the data center needs to grow to adapt to the extra load. To address this, SWERC builds a new data center based on the previous year's one by following these steps:

  • For each server \(s\) in the old data center, the new data center contains two servers \(s_1\) and \(s_2\) of the same color as \(s\). A wire is placed connecting the two servers \(s_1\) and \(s_2\).
  • For each wire connecting servers \(s\) and \(t\) in the old data center: if \(s\) and \(t\) have the same color, then a wire is placed in the new data center connecting \(s_1\) and \(t_1\) and another wire connecting \(s_2\) and \(t_2\); otherwise, a wire is placed in the new data center connecting \(s_1\) and \(t_2\) and another one connecting \(s_2\) and \(t_1\).

One can show that if the old data center is connected than the new data center is also connected.

You are given the Italian data center that SWERC currently has, which contains \(n\) servers (indexed by \(1, \, 2, \, \dots, \, n\)) and \(m\) wires connecting them. The organization wants to know how good their data center will be after \(k\) years, so you should determine the diameter of the data center SWERC will have in \(k\) years. The diameter of the data center is the largest distance between any two servers, i.e. the shortest number of wires that have to be used to transmit something between the two servers.

Input

The first line contains three integers \(n\), \(m\) and \(k\) (\(2 \leq n \leq 100\), \(n - 1 \leq m \leq n (n - 1) / 2\), \(0 \leq k \leq 100\)) — the number of servers, the number of wires, and the number of years to consider.

The second line contains \(n\) integers \(c_1, \, c_2, \, \dots, \, c_n\) (\(1 \leq c_i \leq 3\)) — \(c_i\) is the color of server \(i\) (where \(1\) stands for green, \(2\) for white and \(3\) for red).

Each of the next \(m\) lines contains two integers \(s_i\) and \(t_i\) (\(1 \leq s_i, t_i \leq n\)) — the two servers the \(i\)-th wire connects.

It is guaranteed that the data center is connected, the endpoints of each wire are distinct, and that there are no repeated wires.

Output

Print the diameter of SWERC's data center after \(k\) years.

Note

In the first sample, the Italian data center is the following:

The distance between any pair of servers is \(1\) so the diameter is \(1\).

In the second sample, the initial Italian data center is the one from the first sample.

After one year we obtain the following (where the numbers indicate which copy the server refers to):

Consider the highlighted servers. The distance between them is \(2\) and there is no pair of servers with greater distance, so the diameter is \(2\).

In the third sample, the data center after one year is the following:

After one more year:

Consider the highlighted servers. The distance between them is \(3\) and there is no pair of servers with greater distance, so the diameter is \(3\).

G. Игра века

графы Конструктив кратчайшие пути *3000

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

Деревня имеет вид равностороннего треугольника, ограниченного тремя дорогами длины \(n\). Она разделена на \(n^2\) меньших равносторонних треугольников со стороной \(1\) с помощью \(3n-3\) дополнительных дорог, параллельных сторонам, см. рисунок для \(n=3\). Каждая из \(3n\) дорог состоит из нескольких (возможно, \(1\)) участков дороги длины \(1\), соединяющих соседние перекрестки.

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

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

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

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 10\,000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит целое положительное число \(n\) (\(1\leq n\leq 10^5\)) — размер стороны треугольной деревни.

Далее следуют три строки, каждая из которых содержит бинарную строку длины \(n\), описывающую направления движения на дорогах.

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

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

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

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

Примечание

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

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

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\), поэтому мы побеждаем сразу.

D. Путь домой

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

Известный фокусник Боря Будини путешествовал по стране \(X\), которая состоит из \(n\) городов. Однако случилось несчастье, и его обокрали в городе номер \(1\). Теперь Будини предстоит нелегкий путь домой в город \(n\).

Добираться он собирается самолетами. Всего в стране есть \(m\) авиарейсов, \(i\)-й летит из города \(a_i\) в город \(b_i\) и стоит \(s_i\) монет. Обратите внимание, что \(i\)-й рейс односторонний, то есть не может использоваться, чтобы добраться из города \(b_i\) в город \(a_i\). Чтобы им воспользоваться, Боря должен быть в городе \(a_i\) и иметь на руках хотя бы \(s_i\) монет (которые он потратит на перелет).

После ограбления у него осталось всего \(p\) монет, однако он не отчаивается! Находясь в городе \(i\), он может хоть каждый день организовывать представления, которые будут приносить ему по \(w_i\) монет каждый.

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

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

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 80\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных содержит три целых числа \(n\), \(m\) и \(p\) (\(2 \le n \le 800\), \(1 \le m \le 3000\), \(0 \le p \le 10^9\)) — количество городов, количество авиарейсов и изначальное количество монет.

Во второй строке каждого набора входных даны \(n\) целых чисел \(w_1, w_2, \ldots, w_n\) \((1 \le w_i \le 10^9)\) — прибыль от представлений.

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

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(800\), а также, что сумма \(m\) по всем наборам входных данных не превосходит \(10000\).

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

Для каждого теста выведите единственное целое число — минимальное количество представлений, которое придется организовать Боре, чтобы добраться до дома, или \(-1\), если это сделать невозможно.

Примечание

В первом примере Боре оптимально сделать \(4\) представления в первом городе, имея в итоге \(2 + 7 \cdot 4 = 30\) рублей, а потом пройтись по маршруту \(1-3-2-4\), потратив \(6+8+11=25\) рублей.

Во втором примере Боре оптимально сделать \(15\) представлений в первом городе, полететь в \(3\) город, сделать там \(9\) представлений, и далее отправиться в \(4\) город.

F. Приближение диаметра

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

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

Расстояние между вершинами \(u\) и \(v\) обозначается как \(\rho(u, v)\) и равно минимально возможному количеству рёбер на пути между \(u\) и \(v\). Диаметр графа \(G\) определяется как максимальное расстояние между парой его вершин и обозначается как \(d(G)\). Формально, \(\)d(G) = \max_{1 \le u, v \le n}{\rho(u, v)}.\(\)

Джек планирует последовательно применить к своему графу \(q\) модификаций. Каждая модификация добавляет ровно одно ребро. Обозначим через \(G_i\) граф Джека после первых \(i\) модификаций. Джек хочет вычислить \(q + 1\) значений \(d(G_0), d(G_1), d(G_2), \ldots, d(G_q)\).

Джек подозревает, что нахождение точных диаметров \(q + 1\) графов может быть сложной задачей, поэтому ему подойдут приближённые ответы, отличающиеся от правильных ответов не более чем в два раза. Формально, Джек хочет найти последовательность целых положительных чисел \(a_0, a_1, a_2, \ldots, a_q\) такую, что \(\)\left\lceil \frac{d(G_i)}{2} \right\rceil \le a_i \le 2 \cdot d(G_i)\(\) для каждого \(i\).

Взломы

Вы не можете делать взломы в этой задаче.

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

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

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

Затем следуют \(q\) строк, описывающие модификации. В \(i\)-й из этих строк записаны два целых числа \(u'_i\) и \(v'_i\) (\(1 \leq u'_i, v'_i \leq n\)) — номера вершин, соединенных ребром, которое добавляется в граф в \(i\)-й модификации.

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

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

Выведите последовательность из \(q + 1\) целого положительного числа \(a_0, a_1, a_2, \ldots, a_q\). \(i\)-е из этих чисел должно отличаться от диаметра графа \(G_i\) не более чем в два раза.

Примечание

В первом примере последовательность значений диаметров \(d(G_0), d(G_1), d(G_2), \ldots, d(G_q)\) равна \(6, 6, 6, 3, 3, 3, 2, 2, 2\).

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

B. Граф сумм

графы Деревья интерактив Конструктив кратчайшие пути Перебор реализация *2000

Это интерактивная задача.

Загадана перестановка \(p_1, p_2, \dots, p_n\).

Рассмотрим неориентированный граф с \(n\) вершинами и без рёбер. Вы можете делать два типа запросов:

  1. Укажите целое число \(x\) такое, что \(2 \le x \le 2n\). Тогда для всех целых чисел \(i\) (\(1 \le i \le n\)) таких, что \(1 \le x-i \le n\), будет добавлено ребро между вершинами \(i\) и \(x-i\).
  2. Запросить число рёбер в кратчайшем пути между вершинами \(p_i\) и \(p_j\). В качестве ответа вы получите количество рёбер на кратчайшем пути, если такой путь существует, или \(-1\), если такого пути нет.

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

Сделав \(2n\) запросов (включая тип \(1\) и тип \(2\)), угадайте две возможные перестановки, хотя бы одна из которых равна \(p_1, p_2, \dots, p_n\). Ваш ответ будет засчитан, если хотя бы одна из перестановок верна. Вы можете вывести одну и ту же перестановку дважды.

Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)).

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

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит единственное целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит единственное целое число \(n\) (\(2 \le n \le 10^3\)) — длина перестановки.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^3\).

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

Взаимодействие для каждого набора входных данных начинается после считывания \(n\).

Затем, сделайте не более \(2n\) запросов:

  • Если вы хотите сделать запрос типа \(1\), выведите «+ x». \(x\) должно быть целым числом от \(2\) до \(2n\) включительно. После этого считайте \(1\) или \(-2\). Если вы считали \(1\), то ваш запрос был корректным, иначе он был некорректным или вы превысили количество запросов, и ваша программа должна немедленно завершиться, чтобы получить вердикт Неправильный ответ.
  • Если вы хотите сделать запрос типа \(2\), выведите «? i j». \(i\) и \(j\) должны быть целыми числами от \(1\) до \(n\) включительно. После этого, считайте единственное целое число \(r\) (\(-1 \le r \le n\)) — ответ на ваш запрос. Если вы получили число \(−2\) вместо ответа, то ваша программа сделала некорректный запрос или превысила число запросов. Ваша программа должна немедленно завершиться для получения вердикта Неправильный ответ.

В любой момент взаимодействия, если вы хотите угадать две перестановки, выведите «! \(p_{1,1}\) \(p_{1,2}\) \(\dots\) \(p_{1,n}\) \(p_{2,1}\) \(p_{2,2}\) \(\dots\) \(p_{2,n}\)». Обратите внимание, что вы должны выводить две перестановки на одной и той же строке и без восклицательного знака между перестановками. После этого считайте \(1\) или \(-2\). Если вы считали \(1\), то ваш ответ был правильным, иначе он был неправильным, и ваша программа должна немедленно завершиться, чтобы получить вердикт Неправильный ответ. После этого, перейдите к следующему набору входных данных, или завершите программу, если такого нет. Обратите внимание, что вывод ответа не считается как запрос.

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

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

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

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

Интерактор является неадаптивным. Это означает, что все перестановки зафиксированы до начала взаимодействия.

Взломы

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

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

Первая строка каждого набора входных данных должна содержать единственное целое число \(n\) (\(2 \le n \le 10^3\)) — длину перестановки.

Вторая строка каждого набора входных данных должна содержать \(n\) различных целых чисел \(p_1, p_2, \ldots, p_n\) (\(1 \le p_i \le n\)) — загаданную перестановку.

Сумма \(n\) по всем наборам входных данных не превосходит \(10^3\).

Примечание

В первом наборе входных данных \(n=6\) и загадана перестановка \(p = [1,4,2,5,3,6]\).

Сначала сделаем запросы типа \(1\) с \(x=12, 2, 3\) соответственно. Это суммарно добавит в граф четыре ребра:

  • Ребро, соединяющее вершины \(6\) и \(6\).
  • Ребро, соединяющее вершины \(1\) и \(1\).
  • Ребро, соединяющее вершины \(1\) и \(2\).
  • Ребро, соединяющее вершины \(2\) и \(1\).

Поскольку все эти запросы корректны, интерактор вернул \(1\) после каждого из них.

Затем спросим количество рёбер на кратчайшем пути между вершинами \(p_1 = 1\) и \(p_3 = 2\), которое равно \(1\).

Затем сделаем запрос типа \(1\) с \(x=5\). Это суммарно добавит в граф четыре ребра:

  • Ребро, соединяющее вершины \(1\) и \(4\).
  • Ребро, соединяющее вершины \(2\) и \(3\).
  • Ребро, соединяющее вершины \(3\) и \(2\).
  • Ребро, соединяющее вершины \(4\) и \(1\).

Поскольку этот запрос корректен, интерактор вернул \(1\).

Затем спросим количество рёбер на кратчайшем пути между вершинами \(p_1 = 1\) и \(p_5 = 3\), которое равно \(2\).

Затем спросим количество рёбер на кратчайшем пути между вершинами \(p_4 = 5\) и \(p_5 = 3\). Такого пути не существует, поэтому интерактор вернёт \(-1\).

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

Поскольку ответ правильный, интерактор вернул \(1\).

Во втором наборе входных данных \(n=2\) и загадана перестановка \(p = [2,1]\).

Так как есть только \(2! = 2\) возможные перестановки, никаких запросов не требуется. Достаточно просто вывести две перестановки \([1,2]\) и \([2,1]\). Всего \(0\) запросов использовано, что находится в пределах \(2 \cdot 2 = 4\) запросов.

Поскольку ответ правильный, интерактор вернул \(1\).

A. Поле битвы

геометрия графы кратчайшие пути реализация *2200

Вася плохо учился в университете и попал на поле битвы. Шутка. Он всего лишь играет в какую-то компьютерную игру. Поле представляет собой плоскую площадку, на которой выкопано n траншей. Траншеи — это отрезки на плоскости, параллельные осям координат. Никакие две траншеи не пересекаются.

Далеко от Васи находится огромный вражеский лазер. Лазер заряжается в течении a секунд, а после этого стреляет непрерывно в течении b секунд. Потом снова a секунд заряжается. Потом опять непрерывно в течении b секунд стреляет и так далее. Числа a и b известны Васе. Так же Васе известно, что во время выстрела лазера ему необходимо находиться в траншее, а в пока лазер заряжается, он может без опасений передвигаться по полю. Главное успеть до выстрела спрятаться в траншее. Если Вася добегает до траншеи ровно в момент начала выстрела лазера, считается, что Вася успел спрятаться. Так совпало, что длина любой траншеи в метрах численно не превосходит b.

Изначально Вася находится в точке A. Ему необходимо попасть в точку B. Вася передвигается со скоростью 1 метр в секунду в любом направлении. В траншею можно входить и из нее можно выходить в любой её точке. Вход и выход из траншеи осуществляется мгновенно. Так же по траншее можно передвигаться, не выходя из нее.

Какое минимальное время потребуется Васе, чтобы добраться из точки A в точку B, если в начальный момент времени лазер только что начал заряжаться? Если же Вася не может попасть из точки A в точку B, выведите -1. Если Вася достигнет точки B в момент начала выстрела лазера, то считается, что он успел дойти в точку B.

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

В первой строке заданы два целых числа через пробел: a и b (1 ≤ a, b ≤ 1000), — продолжительность процесса зарядки лазера и продолжительность выстрела лазера в секундах.

Во второй строке заданы четыре целых числа через пробел: Ax, Ay, Bx, By ( - 104 ≤ Ax, Ay, Bx, By ≤ 104) — координаты точек А и B. Гарантируется, что точки A и B не принадлежат никакой траншее.

В третьей строке задано единственное целое число: n (1 ≤ n ≤ 1000), — количество траншей.

В каждой из следующих n строк задано по четыре целых числа через пробел: x1, y1, x2, y2 ( - 104 ≤ xi, yi ≤ 104) — координаты концов соответствующей траншеи.

Все координаты заданы в метрах. Гарантируется, что для каждой траншеи либо x1 = x2, либо y1 = y2. Никакие две траншеи не пересекаются. Длина любой траншеи в метрах численно не превосходит b.

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

Если Вася может попасть из точки A в точку B, то выведите минимальное время, которое ему для этого потребуется. Иначе выведите число -1.

Ответ будет считаться правильным, если абсолютная или относительная погрешность не превышает 10 - 4

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\).

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

Для каждого набора входных данных выведите два целых числа — минимальное и максимальное количество хороводов, которое могло быть.

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\).

G. Рудольф и CodeVid-23

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

Среди программистов распространился новый вирус «CodeVid-23». Рудольфу, как программисту, также не удалось избежать его.

Всего есть \(n\) симптомов, пронумерованных от \(1\) до \(n\), которые могут появиться при заболевании. Изначально Рудольф имеет некоторые из них. Чтобы вылечиться он сходил в аптеку и купил \(m\) лекарств.

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

Почитав инструкции Рудольф понял, что принимать больше одного лекарства одновременно очень вредно для организма.

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

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

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

Далее следуют описания наборов.

Первая строка набора содержит два целых числа \(n, m\) \((1 \le n \le 10, 1 \le m \le 10^3)\) — количество симптомов и лекарств, соответственно.

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

Затем следуют \(3 \cdot m\) строк — описание лекарств.

Первая строка каждого описания содержит целое число \(d\) \((1 \le d \le 10^3)\) — количество дней, которое нужно принимать лекарство.

Следующие две строки описания содержат две строки длины \(n\), состоящие из символов \(0\) и \(1\) — описание симптомов, которые оно снимает, а также описание побочных эффектов.

В первой из строк \(1\) на \(i\)-й позиции означает, что лекарство снимает \(i\)-й симптом, и \(0\) иначе.

Во второй из строк \(1\) на \(i\)-й позиции означает, что после приема появляется \(i\)-й симптом, и \(0\) иначе.

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

Сумма \(m\) по всем наборам входных данных не превосходит \(10^3\).

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

Для каждого набора входных данных в отдельной строке выведите одно целое число — минимальное количество дней, через которое Рудольф сможет избавиться ото всех симптомов. Если этого не случится никогда выведите \(-1\).

Примечание

В первом примере мы можем применить сначала лекарство номер \(4\), после него симптомы примут вид «00101». После этого лекарство номер \(2\), тогда симптомы полностью исчезнут, а количество дней будет равно \(5 + 3 = 8\). Ещё один вариант применения лекарств в порядке \(1, 3, 2\). В этом случае все симптомы также исчезнут, но количество дней будет равно \(3 + 3 + 3 = 9\).

Во втором примере симптомов нет изначально, поэтому лечение займет \(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\).

B. 2D Путешествие

геометрия кратчайшие пути математика сортировки *1100

Piggy живет на бесконечной плоскости с декартовой системой координат.

На плоскости есть \(n\) городов, пронумерованных от \(1\) до \(n\), и первые \(k\) городов являются крупными. Координаты \(i\)-го города равны \((x_i,y_i)\).

Piggy, как опытный путешественник, хочет совершить расслабляющую поездку после экзамена. В данный момент он находится в городе \(a\), и хочет добраться до города \(b\) на самолете. Между любыми двумя городами можно совершить перелёт, а также можно посещать несколько городов во время путешествия, но конечным пунктом должен быть город \(b\).

Из-за активной торговли между крупными городами можно путешествовать на самолете между ними бесплатно. Формально, цена авиабилета \(f(i,j)\) между двумя городами \(i\) и \(j\) определяется следующим образом:

\(\) f(i,j)= \begin{cases} 0, & \text{если оба города }i \text{ и }j \text{ являются крупными городами} \\ |x_i-x_j|+|y_i-y_j|, & \text{в противном случае} \end{cases} \(\)

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

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

Первая строка входных данных содержит одно целое число \(t\) (\(1\le t\le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит четыре целых числа \(n\), \(k\), \(a\) и \(b\) (\(2\le n\le 2\cdot 10^5\), \(0\le k\le n\), \(1\le a,b\le n\), \(a\ne b\)) — количество городов, количество крупных городов и номера начального и конечного городов.

Затем следуют \(n\) строк, \(i\)-я строка содержит два целых числа \(x_i\) и \(y_i\) (\(-10^9\le x_i,y_i\le 10^9\)) — координаты \(i\)-го города. Первые \(k\) строк описывают крупные города. Гарантируется, что все координаты попарно различны.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2\cdot 10^5\).

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

Для каждого набора входных данных выведите одно целое число — минимальное значение суммарной стоимости всех авиабилетов.

Примечание

В первом наборе входных данных:

Крупные города отмечены красным.

Оптимальный способ выбора перелётов: \(3\rightarrow 1 \rightarrow 2 \rightarrow 5\), что будет стоить \(3+0+1=4\). Обратите внимание, что перелёт \(1\rightarrow 2\) стоит \(0\), потому что города \(1\) и \(2\) являются крупными городами.

Во втором наборе входных данных, так как всего \(2\) города, единственный способ — совершить перелёт из города \(1\) в город \(2\).

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

В четвертом наборе входных данных, Piggy может совершить перелёты \(3\rightarrow 2\rightarrow 1\), и стоимость будет \(11+11=22\).

B. Алгогонки

дп кратчайшие пути *1800

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

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

Соревнование проводится в r раундов. На i-м раунде водители стартуют в городе si, а финишируют в городе ti. В течении этого раунда водителям разрешено менять автомобили не более ki раз. Поменять автомобиль можно в любом городе, это действие не занимает времени. Один автомобиль можно использовать несколько раз за раунд, но общее число пересадок не должно превышать ki. Водители могут свободно выбирать свой путь к месту назначения.

PMP-воин подготовил m типов специально сконструированных автомобилей. Кроме того, PMP водит по-разному в зависимости от свойств автомобиля и дороги, следовательно, автомобиль проезжает разные дороги (или одну дорогу в разных направлениях) за разное время.

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

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

Первая строка содержит три целых числа, разделенных пробелом n, m, r (2 ≤ n ≤ 60, 1 ≤ m ≤ 60, 1 ≤ r ≤ 105) — количество городов, количество различных типов машин и количество раундов в соревновании, соответственно.

Затем последуют m матриц размера n × n, состоящих из целых чисел от 0 до 106 (включительно), описывающие время, необходимое для одной машины для того, чтобы проехать разные дороги. Целое число, которое следует k-ым в j-ой строке i-й матрицы, обозначает время, за которое i-ый автомобиль проедет дорогу из j-го города в k-ый город. Заданные матрицы необязательно симметричны, но их диагональ всегда нулевая.

В следующих r строках содержатся описания раундов, i-ая из них содержит разделенные пробелом целые числа si, ti, ki (1 ≤ si, ti ≤ n, si ≠ ti, 0 ≤ ki ≤ 1000) — номер города-старта, номер города-финиша и количество допустимых пересадок в i-ом раунде, соответственно.

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

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

Примечание

В первом примере во всех раундах PMP проезжает от города #1 до города #2, затем до города #3 и наконец до города #4. Но последовательность типов машин, которые он использует, в первом раунде (1, 2, 1), а во втором раунде (1, 2, 2). В третьем раунде он может поменять машину три раза. Здесь PMP использует такую же стратегию как и в первом раунде, меняя машину только два раза.

E. Очередная задача на MEX

битмаски дп кратчайшие пути Перебор *2300

Вам дан массив целых чисел \(a\) размера \(n\). Вы можете выбрать некое множество непересекающихся подотрезков данного массива (заметим, что некоторые элементы могут не попасть ни в один из отрезков, это не запрещено), для каждого выбранного подотрезка посчитать MEX его элементов, а затем посчитать побитовое исключающее ИЛИ (XOR) всех полученных значений MEX. Какое наибольшее значение XOR может получиться?

MEX (minimum excluded, минимальное отсутствующее) массива — это наименьшее целое неотрицательное целое число, которое не принадлежит массиву. Например:

  • MEX массива \([2,2,1]\) равен \(0\), потому что \(0\) не принадлежит массиву.
  • MEX массива \([3,1,0,1]\) равен \(2\), потому что \(0\) и \(1\) принадлежат массиву, а \(2\) — нет.
  • MEX массива \([0,3,1,2]\) равен \(4\), потому что \(0\), \(1\), \(2\) и \(3\) принадлежат массиву, а \(4\) — нет.
Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 5000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \leq n \leq 5000\)) — размер массива \(a\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \leq a_i \leq n\)) — массив \(a\).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(5000\).

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

На каждый набор входных данных выведите одно число — наибольший возможный XOR значений MEX элементов выбранных отрезков.

Примечание

В первом наборе входных данных максимальный XOR равен \(2\), если взять весь массив, \(\operatorname{MEX}([1, 0]) = 2\).

Во втором наборе входных данных максимальный XOR равен \(6\), если выделить отрезки \([1, 2, 0]\) и \([7, 1, 2, 0, 2, 4, 3]\):

  • \(\operatorname{MEX}([1, 2, 0]) = 3\),
  • \(\operatorname{MEX}([7, 1, 2, 0, 2, 4, 3]) = 5\),
таким образом, побитовое исключающее ИЛИ равно \(5 \oplus 3=6\).

В третьем наборе входных данных максимальный XOR равен \(7\), если выделить отрезки \([1, 0]\) и \([7, 1, 2, 0, 2, 4, 3]\):

  • \(\operatorname{MEX}([1, 0]) = 2\),
  • \(\operatorname{MEX}([7, 1, 2, 0, 2, 4, 3]) = 5\),
таким образом, побитовое исключающее ИЛИ равно \(5 \oplus 2 = 7\).

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\).

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\) по всем вершинам.

B. Путешествия во времени

Бинарный поиск графы кратчайшие пути *1900

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

Вы обнаружили машину времени, которая перемещает вас между ключевыми моментами. К сожалению, вы не можете выбирать, в какой момент времени переместиться, но знаете порядок, состоящий из \(k\) моментов времени \(a_{i}\), в котором машина будет вас перемещать. Так как времени между перемещениями мало, то оказавшись в очередном ключевом моменте времени (в том числе после последнего перемещения во времени), вы можете проехать не более чем по одной существующей в данный момент времени дороге, выходящей из города, в котором вы оказались перед перемещением во времени.

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

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

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

Первая строка описания каждой записи содержит одно целое число \(m_{i}\) (\(0 \le m_{i} \le \min \left(\frac{n(n-1)}{2}, 2 \cdot 10^5\right)\)) — количество дорог в \(i\)-й записи.

Каждая из следующих \(m_i\) строк содержит два целых числа \(v_{j}\) и \(u_{j}\) (\(1 \le v_{j}, u_{j} \le n\), \(v_{j} \neq u_{j}\)) — номера городов, которые соединяет \(j\)-я дорога в \(i\)-й ключевой момент истории.

Следующая строка содержит одно целое число \(k\) (\(1 \le k \le 2 \cdot 10^5\)) — количество моментов времени, между которыми будут происходить перемещения.

Следующая строка содержит \(k\) целых чисел \(a_1, a_2, \ldots, a_k\) (\(1 \le a_{i} \le t\)) — моменты времени, в которых вы будете оказываться после каждого перемещения.

Гарантируется, что сумма \(m_{i}\) не превосходит \(2 \cdot 10^5\). Гарантируется, что каждая неупорядоченная пара \((u, v)\) встречается в описании дорог для одной записи не более одного раза.

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

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

Обратите внимание, что перемещение в момент времени \(a_{1}\) тоже считается перемещением.

Примечание

В первом примере вы находитесь в городе \(1\) и перемещаетесь в момент \(a_{1} = 2\). Так как подходящих для проезда дорог нет, то вы ничего не делаете и перемещаетесь в момент \(a_{2} = 1\), после чего проезжаете по дороге \((1, 2)\). Переместившись в момент \(a_{3} = 2\), вы проезжаете по дороге \((2, 3)\). Переместившись в момент \(a_{4} = 1\), вы останетесь в городе \(3\) и сделаете следующее перемещение во времени. В момент времени \(a_{5} = 2\) вы проедете по дороге \((3, 5)\) и окажетесь в конечном городе за \(5\) перемещений во времени.

Во втором примере можно показать, что при данных перемещениях во времени добраться до города \(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)\), не изменяя тип матрицы.

F. Лёшины капризы

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

Дерево — связный граф без циклов. Можно показать, что любое дерево из \(n\) вершин имеет ровно \(n - 1\) ребро.

Лист — вершина в дереве, из которой выходит ровно одно ребро.

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

У Лёши скоро день рождения, и Тимофею хотелось бы подарить ему дерево из \(n\) вершин. Однако Лёша очень капризный мальчик. Каждый день на протяжении \(q\) дней он будет выбирать целое число, обозначим выбранное в \(i\)-й день число \(d_i\). Если в \(i\)-й день в дереве не будет двух листов на расстоянии ровно \(d_i\), то Лёша будет разочарован.

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

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

Чудесным образом Тимофею удалось узнать все \(d_i\). После этого его посетила ещё одна гениальная мысль — на всякий случай сделать инструкцию к набору, при этом такую, чтобы Лёша не был разочарован.

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

Вот пример операции, где были выбраны вершины: \(u\) — \(6\), \(v_1\) — \(1\), \(v_2\) — \(4\).

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

В первой строке дано целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных.

В первой строке каждого набора входных данных даны целые числа \(n\) (\(3 \leq n \leq 500\)) и \(q\) (\(1 \leq q \leq 500\)) — количество вершин в дереве и количество дней соответственно.

В \(i\)-й из следующих \(q\) строк дано целое число \(d_i\) (\(2 \leq d_i \leq n - 1\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(500\). То же самое гарантируется для \(q\).

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

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

Для каждого набора входных данных сначала выведите \(n - 1\) строку с описанием рёбер дерева. Если вы хотите, чтобы в дереве было ребро между вершинами \(u\) и \(v\), то среди этих \(n - 1\) строк должна быть строка \(v\) \(u\) или \(u\) \(v\).

В следующих \(q\) строках выведите по три целых числа \(u\) \(v_1\) \(v_2\) — описание операций. Если Лёше не нужно выполнять операцию, выведите \(-1\) \(-1\) \(-1\).

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» будут распознаны как положительный ответ).

G. Велосипеды

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

Все друзья Славика планируют отправиться на вечеринку на своих велосипедах из места, где они живут. У всех есть велосипеды, кроме Славика. Есть \(n\) городов, через которые они могут путешествовать. Все живут в городе \(1\) и хотят пойти на вечеринку, которая находится в городе \(n\). Карту городов можно рассматривать как ненаправленный граф с \(n\) узлами и \(m\) ребрами. Ребро \(i\) соединяет города \(u_i\) и \(v_i\) и имеет длину \(w_i\).

У Славика нет велосипеда, но у него есть деньги. В каждом городе есть ровно один велосипед, который можно купить. У велосипеда в \(i\)-м городе есть коэффициент медлительности \(s_{i}\). Как только Славик купит велосипед, он может использовать его, чтобы путешествовать из города, в котором он находится, в любой город. Проезд по ребру \(i\) с использованием велосипеда \(j\) занимает время \(w_i \cdot s_j\).

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

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

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

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Далее следует описание самих наборов.

Первая строка каждого набора содержит два целых числа, разделенных пробелом: \(n\) и \(m\) (\(2 \leq n \leq 1000\); \(n - 1 \leq m \leq 1000\)) — количество городов и количество дорог, соответственно.

\(i\)-я из следующих \(m\) строк содержит три целых числа \(u_i\), \(v_i\), \(w_i\) (\(1 \le u_i, v_i \le n\), \(u_i \neq v_i\); \(1 \leq w_i \leq 10^5\)), обозначающих, что есть дорога между городами \(u_i\) и \(v_i\) длиной \(w_i\).

Следующая строка содержит \(n\) целых чисел \(s_1, \ldots, s_n\) (\(1 \leq s_i \leq 1000\)) — коэффициент медлительности каждого велосипеда. Одну и ту же пару городов может соединять больше, чем одна дорога.

Сумма \(n\) по всем наборам не превышает \(1000\), и сумма \(m\) по всем наборам не превышает \(1000\).

Дополнительное ограничение на ввод: возможно путешествовать от города \(1\) до любого другого города.

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

Для каждого набора входных данных выведите одно целое число, обозначающее минимальное количество времени, за которое Славик может добраться из города \(1\) в город \(n\).

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)\).

A. Покрыли ли мы всё?

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

Вам дано два целых числа \(n\) и \(k\) вместе со строкой \(s\).

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

Если существует несколько ответов — выведите любой.

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

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

В первой строке содержится одно целое число \(t \, (1 \le t \le 10^5)\) количество наборов входных данных.

Первая строка каждого набора входных данных содержит \(3\) целых числа \(n \, (1 \le n \le 26), \: k \, (1 \le k \le 26), \: m \, (1 \le m \le 1000)\) где \(n\) и \(k\) означают то же, что и в условии, а \(m\) означает длину строки \(s\).

Вторая строка каждого набора входных данных содержит строку \(s\) длины \(m\), состоящую только из первых \(k\) прописных букв латинского алфавита.

Гарантируется, что сумма \(m\) и сумма \(n\) по всем наборам входных данных не превосходит \(10^6\).

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

Для каждого набора входных данных выведите YES если все возможные строки длины \(n\) состоящие только из первых \(k\) прописных букв латинского алфавита присутствуют как подпоследовательность в \(s\), а иначе выведите NO.

Если ваш ответ NO, дополнительно выведите строку длины \(n\), которая состоит только из первых \(k\) прописных букв латинского алфавита, и не входит как подпоследовательность \(s\), в следующей строке.

Вы можете писать каждую букву YES и NO в любом регистре (например, YES, yES, YeS будут распознаны как положительный ответ).

Примечание

В первом наборе входных данных все возможные строки (aa, ab, ba, bb) длины \(2\), которые могут быть получены из первых \(2\) прописных букв латинского алфавита, присутствуют как подпоследовательности в строке abba.

Во втором наборе входных данных строка aa не является подпоследовательностью abb.

G. Перемещающиеся платформы

графы кратчайшие пути математика теория чисел *2300

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

Каждая платформа находится на уровне \(l_i\), уровни платформ — целые числа от \(0\) до \(H - 1\). За один шаг, если вы находитесь на платформе \(i\), вы можете остаться на ней или перейти на другую платформу \(j\). Чтобы перейти на платформу \(j\), они должны быть соединены проходом, и их уровни должны быть одинаковыми, то есть \(l_i = l_j\).

После каждого шага уровни всех платформ меняются. Новый уровень платформы \(i\) вычисляется как \(l'_i = (l_i + s_i) \bmod H\), для всех \(i\).

Вы начинаете на платформе \(1\). Найдите минимальное количество шагов, необходимых, чтобы добраться до платформы \(n\).

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

Первая строка ввода содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Затем следуют описания наборов входных данных.

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

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(l_i\), начальный уровень каждой платформы (\(0 \le l_i \le H-1\)).

Третья строка каждого набора входных данных содержит \(n\) целых чисел \(s_i\), изменение уровня для каждой платформы (\(0 \le s_i \le H-1\)).

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

Сумма \(n\) для всех тестов не превышает \(10^5\), сумма \(m\) для всех тестов не превышает \(10^5\).

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

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

Если невозможно добраться до платформы \(n\), выведите \(-1\).

Примечание

Вот как меняются уровни платформ и какие действия нам нужно выполнить в первом примере.

Платформа 1Платформа 2Платформа 3Действие
Шаг 1194Остаться на платформе 1
Шаг 2324Остаться на платформе 1
Шаг 3554Перейти на платформу 2
Шаг 4784Остаться на платформе 2
Шаг 5914Остаться на платформе 2
Шаг 6144Перейти на платформу 3

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\).
Примечание

Визуальное объяснение первого теста в примере:

C. Арена покемонов

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

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

Каждый покемон имеет \(m\) характеристик. Значение \(j\)-й характеристики у \(i\)-го покемона равно \(a_{i,j}\). Также у каждого покемона есть стоимость его вызова: цена \(i\)-го покемона равна \(c_i\).

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

  • Выбрать три целых числа \(i\), \(j\), \(k\) (\(1 \le i \le n\), \(1 \le j \le m\), \(k > 0\)) и навсегда увеличить \(a_{i,j}\) на \(k\). Стоимость такой операции равна \(k\).
  • Выбрать два числа \(i\), \(j\) (\(1 \le i \le n\), \(1 \le j \le m\)) и вызвать \(i\)-го покемона, который бросит вызов текущему покемону на арене по \(j\)-й характеристике. При этом \(i\)-й покемон победит, если \(a_{i,j}\) не меньше, чем \(j\)-я характеристика текущего покемона на арене (иначе он проиграет). После дуэли на арене остаётся только её победитель. Стоимость такой операции равна \(c_i\).

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

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

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

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

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(c_1, c_2, \ldots, c_n\) (\(1 \le c_i \le 10^9\)).

Далее, \(i\)-я из следующих \(n\) строк содержит \(m\) целых чисел \(a_{i,1}, a_{i,2}, \ldots, a_{i,m}\) (\(1 \le a_{i,j} \le 10^9\)).

Гарантируется, что сумма значений \(n \cdot m\) по всем наборам входных данных не превосходит \(4 \cdot 10^5\).

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

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

Примечание

В первом наборе входных данных массив значений характеристик \(1\)-го покемона (который изначально расположен на арене) есть \([2,9,9]\).

На первой операции можно выбрать \(i=3\), \(j=1\), \(k=1\) и увеличить \(a_{3,1}\) на \(1\) навсегда. Теперь массив значений характеристик \(3\)-го покемона станет равен \([2,2,1]\). Стоимость этой операции равна \(k = 1\).

На второй операции можно выбрать \(i=3\), \(j=1\) и вызвать \(3\)-го покемона, который сразится с текущим покемоном на арене по \(1\)-й характеристике. Поскольку \(a_{i,j}=a_{3,1}=2 \ge 2=a_{1,1}\), \(3\)-й покемон победит. Стоимость этой операции равна \(c_3 = 1\).

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

Во втором наборе входных данных массив значений характеристик \(1\)-го покемона есть \([9,9,9]\).

На первой операции можно выбрать \(i=2\), \(j=3\), \(k=2\) и увеличить \(a_{2,3}\) на \(2\) навсегда. Теперь массив значений характеристик \(2\)-го покемона есть \([6,1,9]\). Стоимость этой операции равна \(k = 2\).

На второй операции можно выбрать \(i=2\), \(j=3\) и вызвать \(2\)-го покемона, который сразится с текущим покемоном на арене по \(3\)-й характеристике. Поскольку \(a_{i,j}=a_{2,3}=9 \ge 9=a_{1,3}\), \(2\)-й покемон победит. Стоимость этой операции равна \(c_2 = 3\).

На третьей операции можно выбрать \(i=3\), \(j=2\) и вызвать \(3\)-го покемона, который сразится с текущим покемоном на арене по \(2\)-й характеристике. Поскольку \(a_{i,j}=a_{1,2}=2 \ge 1=a_{2,2}\), \(3\)-й покемон победит. Стоимость этой операции равна \(c_3 = 1\).

Таким образом, \(3\)-й покемон находится на арене, а суммарная стоимость операций равна \(6\). Можно показать, что меньше \(6\) ответ получить нельзя.

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\).

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)\).

H. Самая безбашенная оборона

битмаски дп Конструктив кратчайшие пути Паросочетания Перебор Потоки *2300

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

Вам дано клетчатое поле размера \(n \times m\), на котором уже расставлены \(k\) башен и проложен маршрут, через который будут идти враги. Клетка на пересечении \(x\)-й строки и \(y\)-го столбца обозначается как \((x, y)\).

Каждую секунду башня наносит \(p_i\) единиц урона всем врагам в радиусе её действия. Например, если враг расположен в клетке \((x, y)\), а башня в \((x_i, y_i)\), и её радиус равен \(r\), тогда врагу будет нанесён урон \(p_i\), если \((x - x_i) ^ 2 + (y - y_i) ^ 2 \le r ^ 2\).

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

По умолчанию все башни обладают нулевым радиусом действия, но игрок может сделать радиус башни равным целому числу \(r\) (\(r > 0\)) за это здоровье всех врагов увеличится на \(3^r\), однако каждое \(r\) может быть использовано не более чем для одной башни.

Допустим, враг имел \(h\) единиц базового здоровья. Если радиусы башен \(2\), \(4\) и \(5\), то его здоровье в начале пути будет \(h + 3 ^ 2 + 3 ^ 4 + 3 ^ 5 = h + 9 + 81 + 243 = h + 333\). Выбор радиусов происходит один раз до появления врагов и не может быть изменён после начала игры.

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

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

В первой строке задано целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

Первая строка каждого набора содержит три целых числа \(n\), \(m\) и \(k\) (\(2 \le n, m \le 50, 1 \le k < n \cdot m\)) — размеры поля и количество башен на нём.

В следующих \(n\) строках даётся по \(m\) символов — описание очередной строки поля, где символ «.» обозначает пустую клетку, символ «#» клетку пути, по которой пройдут враги.

Далее следует \(k\) строк — описание башен. Каждая строка описания содержит три целых числа \(x_i\), \(y_i\) и \(p_i\) (\(1 \le x_i \le n, 1 \le y_i \le m, 1 \le p_i \le 500\)) — координаты башни и её параметр атаки. Все координаты соответствуют пустым клеткам на игровом поле, а так же все пары \((x_i, y_i)\) попарно различны.

Гарантируется, что сумма \(n \cdot m\) не превосходит \(2500\) по всем тестовым случаям.

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

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

Если невозможно выбрать радиусы даже для врага с \(1\) единицей базового здоровья, выведите «0».

Примечание

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

Во втором примере радиус башни равен \(1\), она наносит урон монстру в клетках \((1, 1)\) и \((2, 2)\).

В третьем примере радиус башни равен \(2\), она наносит урон монстру на всех клетках пути. Если базовое здоровье врага \(1491\), то после прибавки за радиус башни его здоровье будет \(1491 + 3 ^ 2 = 1500\), что в точности будет равно урону, который ему нанесёт башня за три секунды.

В четвёртом примере у башни \((1, 2)\) радиус \(1\), а у башни \((3, 1)\) радиус \(2\).

E. Открытие порталов

графы кратчайшие пути снм *2600

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

В этой стране n городов, соединенных m двусторонними дорогами различной длины так, что из каждого города можно добраться до каждого. В k из этих городов имеются порталы. В начале игры все порталы закрыты. Когда игрок посещает город, в котором есть портал, этот портал становится открытым. Из открытого портала в открытый можно, как ни странно, телепортироваться. Телепортация происходит мгновенно, что дает возможность игроку быстро перемещаться между довольно удаленными областями страны.

В начале игры Павел находится в городе с номером 1. Он хочет как можно быстрее открыть все порталы. Какое наименьшее время ему для этого потребуется?

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

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

В каждой из следующих m строк содержится описание дороги — три целых числа xi, yi, wi, записанные через пробел (1 ≤ xi, yi ≤ n, xi ≠ yi, 1 ≤ wi ≤ 109) — номера городов, соединенных i-ой дорогой и время, необходимое на ее преодоление. Между любыми двумя городами проведено не более одной дороги. Гарантируется, что из любого города можно добраться до любого, двигаясь по дорогам страны.

В следующей строке записано целое число k (1 ≤ k ≤ n) — количество порталов.

В следующей строке через пробел записаны k целых чисел p1, p2, ..., pk — номера городов, в которых установлены порталы. В каждом городе установлено не более одного портала.

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

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

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на C++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Примечание

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

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. Раскрасьте дерево

Деревья дп жадные алгоритмы кратчайшие пути Перебор поиск в глубину и подобное *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\) и закрашивает её синим цветом.

B. Прыжки по стенам

кратчайшие пути *1400

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

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

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

  • подняться на один участок вверх;
  • спуститься на один участок вниз;
  • перепрыгнуть на противоположную стену, при этом ниндзя оказывается на участке, который ровно на k метров выше того участка, с которого производился прыжок. Более формально, если до прыжка ниндзя находился на участке номер x одной стены, то после прыжка, он будет находиться на участке номер x + k другой стены.

Если в какой-то момент времени, ниндзя пытается переместиться на участок с номером большим n, то считается, что ниндзя выбрался из ущелья.

Ущелье затапливает, и уровень воды каждую секунду поднимается на один метр. Изначально уровень воды находится на нижней границе первого участка. Ниндзя не может находиться на участках, покрытых водой. Можно считать, что нинздя и вода «ходят» по очереди — сначала ниндзя делает какое-либо действие, затем вода поднимается на один метр, затем ниндзя опять делает действие и так далее.

Уровень считается пройденным, если ниндзя удалось выбраться из ущелья.

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

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

В первой строке записаны два целых числа n и k (1 ≤ n, k ≤ 105) — высота ущелья и высота прыжка ниндзя соответственно.

Во второй строке задано описание левой стены — строка длиной n символов. i-ый символ обозначает состояние i-го участка стены: символ «X» обозначает, что участок опасен, символ «-» — что нет.

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

Гарантируется, что первый участок левой стены не опасен.

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

Выведите «YES» (без кавычек) если ниндзя может выбраться из ущелья или «NO» (без кавычек) в противном случае.

Примечание

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

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

D. Определите победные острова в гонке

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

МУУУУУУУУУУУУУУУУУ
— Корова Бесси, Искусство гонок по островам

Две коровы фермера Джона, Бесси и Элси, планируют участвовать в гонках по \(n\) островам. Существует \(n - 1\) основных мостов, соединяющих остров \(i\) с островом \(i + 1\) для всех \(1 \leq i \leq n - 1\). Кроме того, существует \(m\) альтернативных мостов. Элси может использовать и основные, и альтернативные мосты, а Бесси — только основные. Все мосты являются односторонними и могут использоваться только для перемещения с острова с меньшим индексом на остров с большим индексом.

Изначально Элси находится на острове \(1\), а Бесси — на острове \(s\). Коровы ходят по очереди, причем Бесси ходит первой. Предположим, что корова находится на острове \(i\). Во время хода коровы, если есть мост, соединяющий остров \(i\) с островом \(j\), то корова может переместиться на остров \(j\). Затем остров \(i\) разрушается, и все мосты, соединяющие остров \(i\), также разрушаются. Обратите внимание на следующее:

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

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

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

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

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два числа \(n\) и \(m\) (\(2 \leq n \leq 2 \cdot 10^5\), \(0 \leq m \leq 2 \cdot 10^5\)) — количество островов и количество альтернативных мостов.

Следующие \(m\) строк каждого набора входных данных содержат по два числа \(u\) и \(v\) (\(1 \leq u < v \leq n\)) — острова, которые соединяет альтернативный мост. Гарантируется, что все альтернативные мосты различны и не совпадают с основными мостами.

Гарантируется, что ни сумма \(n\), ни сумма \(m\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

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

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

Примечание

В первом наборе входных данных нет альтернативных мостов, по которым Элси могла бы обогнать Бесси и первой достичь острова \(n\), поэтому Бесси выиграет на всех островах, потому что она всегда ходит первой.

Во втором случае Бесси проиграет, если начнет с острова \(3\), потому что:

  • Ход Бесси: Перейти по основному мосту с острова \(3\) на остров \(4\).
  • Ход Элси: Перейти по основному мосту с острова \(1\) на остров \(2\).
  • Ход Бесси: Перейти по основному мосту с острова \(4\) на остров \(5\).
  • Ход Элси: Перейти по альтернативному мосту с острова \(2\) на остров \(6\). Элси первой достигает острова \(n\).

C. Алгоритм Дейкстры?

графы кратчайшие пути *1900

Задан неориентированный взвешенный граф, вершины которого пронумерованы от 1 до n. Ваша задача найти кратчайший путь из вершины 1 в вершину n.

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

В первой строке содержатся целые числа n и m (2 ≤ n ≤ 105, 0 ≤ m ≤ 105), где n — количество вершин, а m — количество ребер в графе. Далее в m строках содержатся сами ребра, по одному в строке. Каждое ребро задается тремя числами ai, bi, wi (1 ≤ ai, bi ≤ n, 1 ≤ wi ≤ 106), где ai, bi — это концы ребра, а wi — его длина.

Граф может содержать кратные ребра и петли.

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

Выведите число -1 если пути нет или сам кратчайший путь, если он существует.

G. Звонок во время пути

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

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

Каждую минуту вы можете сесть на автобус на перекрёстке \(u_i\) и доехать за \(l_{i1}\) минут до перекрёстка \(v_i\). И наоборот доехать от перекрёстка \(v_i\) до перекрёстка \(u_i\) за \(l_{i1}\) минут. Садиться в автобус и выходить из него можно только на перекрёстках. Сесть в автобус на перекрёстке можно только находясь в нём.

Также по каждой улице можно пройти пешком за \(l_{i2} > l_{i1}\) минут.

Вы можете делать остановки на перекрёстках.

Вы живёте на перекрёстке с номером \(1\). Сегодня вы проснулись в момент времени \(0\), и у вас запланировано важное мероприятие на перекрёстке с номером \(n\), на которое вы должны добраться не позднее момента времени \(t_0\). Также у вас запланирован телефонный звонок, который продлится с \(t_1\) по \(t_2\) минуту (\(t_1 < t_2 < t_0\)).

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

Так как вы хотите выспаться, вам стало интересно — как поздно вы можете выйти из дома, чтобы успеть поговорить по телефону и при этом не опоздать на мероприятие?

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

Первая строка содержит целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют описания наборов входных данных.

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

Вторая строка описания каждого набора входных данных содержит три целых числа \(t_0\), \(t_1\), \(t_2\) (\(1 \le t_1 < t_2 < t_0 \le 10^9\)) — время начала мероприятия, время начала телефонного звонка и время его конца, соответственно.

Следующие \(m\) строк каждого набора данных содержат описания улиц.

\(i\)-я строка содержит четыре целых числа \(u_i\), \(v_i\), \(l_{i1}\), \(l_{i2}\) (\(1 \le u_i, v_i \le n\), \(u_i \neq v_i\), \(1 \le l_{i1} < l_{i2} \le 10^9\)) — номера перекрёстков, соединяемых \(i\)-й улицей, а также время пути по улице на автобусе и пешком. Гарантируется, что никакие две улицы не соединяют одну и ту же пару перекрёстков, а также что из любого перекрёстка можно добраться до любого другого.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^5\). Также гарантируется, что сумма значений \(m\) по всем наборам входных данных не превосходит \(10^5\).

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

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

D. Цветные порталы

Бинарный поиск графы жадные алгоритмы кратчайшие пути Перебор реализация Структуры данных *1600

На прямой расположено \(n\) городов. Города пронумерованы целыми числами от \(1\) до \(n\).

Для перемещения между городами используются порталы. Порталы бывают \(4\) цветов: синий, зеленый, красный и желтый. В каждом городе расположены порталы двух разных цветов. Из города \(i\) можно переместиться в город \(j\), если в них есть порталы одинакового цвета (например, между городом «красный-синий» и городом «синий-зеленый» можно перемещаться). Данное перемещение стоит \(|i-j|\) монет.

Ваша задача — ответить на \(q\) независимых запросов: посчитайте минимальную стоимость, чтобы переместиться из города \(x\) в город \(y\).

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

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

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

Вторая строка содержит \(n\) строк одного из следующих типов: BG, BR, BY, GR, GY или RY; \(i\)-я из них описывает порталы, находящиеся в \(i\)-м городе; символ B обозначает, что в городе есть портал синего цвета, G — зеленого, R — красного, а Y — желтого.

\(j\)-я из следующих \(q\) строк содержит два целых числа \(x_j\) и \(y_j\) (\(1 \le x_j, y_j \le n\)) — описание \(j\)-го запроса.

Дополнительные ограничения на входные данные:

  • сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\);
  • сумма \(q\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).
Выходные данные

Для каждого запроса выведите одно целое число — минимальную стоимость, чтобы переместиться из города \(x\) в город \(y\) (или \(-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\).

B. Пропуск

Бинарный поиск графы дп кратчайшие пути *1700

На улице уже \(3024\) год, идеи для задач давно закончились, а олимпиады теперь проходят в изменённом индивидуальном формате. Олимпиада состоит из \(n\) задач, пронумерованных от \(1\) до \(n\). \(i\)-я задача имеет свою стоимость \(a_i\) и некоторый параметр \(b_i\) (\(1 \le b_i \le n\)).

Изначально тестирующая система выдаёт участнику первую задачу. Когда участнику выдают \(i\)-ю задачу, у него есть два варианта:

  • Либо он сдаёт задачу и получает \(a_i\) баллов;
  • Либо он может пропустить задачу, тогда он никогда не сможет её сдать.

Далее тестирующая система выбирает для участника следующую задачу среди задач с номерами \(j\), такими что:

  • Если он сдал \(i\)-ю задачу, она смотрит на задачи с номерами \(j < i\);
  • Если он пропустил \(i\)-ю задачу, она смотрит на задачи с номерами \(j \leq b_i\).

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

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

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

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит единственное целое число \(t\) (\(1 \leq t \leq 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq 4 \cdot 10^5\)) — количество задач на олимпиаде.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 10^9\)) — стоимости задач.

Третья строка каждого набора входных данных содержит \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) (\(1 \leq b_i \leq n\)) — параметры задач.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(4 \cdot 10^5\).

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

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

Примечание

В первом наборе входных данных Прохор может пропустить первую задачу, тогда он получит задачу с номером \(b_1 = 2\). Прохор может сдать её и получить \(a_2 = 16\) баллов. После этого соревнование завершится, потому что Прохор уже получал все задачи. Обратите внимание, что если Прохор сдаст первую задачу, то он получит \(a_1 = 15\) баллов, но соревнование сразу завершится.

Во втором наборе входных данных Прохор может пропустить первую задачу, тогда он получит задачу с номером \(b_1 = 3\). Прохор может сдать её и получить \(a_3 = 100\) баллов. После этого Прохор получит вторую задачу, которую он может пропустить и получить задачу с номером \(b_2 = 4\). Прохор может сдать четвёртую задачу и получить ещё \(a_4 = 100\) баллов. После этого соревнование завершается, потому что Прохор уже получал все задачи с номерами, не превосходящими \(4\). Таким образом, суммарно Прохор получит \(200\) баллов.

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

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. Ним

битмаски дп жадные алгоритмы игры Комбинаторика кратчайшие пути Перебор реализация *2700

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

Дан массив \(a\), состоящий из \(n\) целых чисел. Артем и Руслан решили играть в Ним на подотрезках массива. Каждый из \(q\) раундов определяется отрезком \((l_i, r_i)\), где элементы массива \(a_{l_i}, a_{l_i+1}, \dots, a_{r_i}\) рассматриваются как размеры кучек камней.

До начала игры Руслан может удалить любое количество кучек из выбранного подотрезка. Однако хотя бы одна кучка должна остаться, поэтому в рамках одного раунда он может удалить не более \((r_i - l_i)\) кучек. Разрешается удалить \(0\) кучек. После удаления ребята играют в Ним на всех оставшихся кучках из этого отрезка.

Все раунды независимы: удаления, произведенные в одном раунде, не влияют на исходный массив или другие раунды.

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

Для каждого раунда определите:

  1. максимальное количество кучек, которые Руслан может удалить;
  2. количество способов выбрать максимальное количество кучек для удаления.

Два способа считаются различными, если существует такая позиция \(i\), что в одном из способов кучка на позиции \(i\) удаляется, а во втором — нет. Поскольку количество способов может быть большим, выведите его по модулю \(998\,244\,353\).

Если в каком-то раунде Руслан не может сделать так, чтобы Артем проиграл, выведите для этого раунда одно число -1.

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

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

Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 50\)) — элементы исходного массива.

Далее следуют \(q\) строк, \(i\)-я из которых содержит два целых числа \(l_i, r_i\) (\(1 \le l_i \le r_i \le n\)) — границы отрезка, на котором ребята хотят сыграть в игру в \(i\)-м раунде.

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

Для каждого раунда:

  • если Руслан может победить, выведите два целых числа — максимальное количество кучек, которые можно удалить, и количество способов удалить максимальное количество кучек, взятое по модулю \(998\,244\,353\);
  • иначе выведите -1.

G. X Aura

графы кратчайшие пути математика *2200

Mount ICPC can be represented as a grid of \(R\) rows (numbered from \(1\) to \(R\)) and \(C\) columns (numbered from \(1\) to \(C\)). The cell located at row \(r\) and column \(c\) is denoted as \((r, c)\) and has a height of \(H_{r, c}\). Two cells are adjacent to each other if they share a side. Formally, \((r, c)\) is adjacent to \((r-1, c)\), \((r+1, c)\), \((r, c-1)\), and \((r, c+1)\), if any exists.

You can move only between adjacent cells, and each move comes with a penalty. With an aura of an odd positive integer \(X\), moving from a cell with height \(h_1\) to a cell with height \(h_2\) gives you a penalty of \((h_1 - h_2)^X\). Note that the penalty can be negative.

You want to answer \(Q\) independent scenarios. In each scenario, you start at the starting cell \((R_s, C_s)\) and you want to go to the destination cell \((R_f, C_f)\) with minimum total penalty. In some scenarios, the total penalty might become arbitrarily small; such a scenario is called invalid. Find the minimum total penalty to move from the starting cell to the destination cell, or determine if the scenario is invalid.

Input

The first line consists of three integers \(R\) \(C\) \(X\) (\(1 \leq R, C \leq 1000; 1 \leq X \leq 9; X\) is an odd integer).

Each of the next \(R\) lines consists of a string \(H_r\) of length \(C\). Each character in \(H_r\) is a number from 0 to 9. The \(c\)-th character of \(H_r\) represents the height of cell \((r, c)\), or \(H_{r, c}\).

The next line consists of an integer \(Q\) (\(1 \leq Q \leq 100\,000)\).

Each of the next \(Q\) lines consists of four integers \(R_s\) \(C_s\) \(R_f\) \(C_f\) (\(1 \leq R_s, R_f \leq R; 1 \leq C_s, C_f \leq C\)).

Output

For each scenario, output the following in a single line. If the scenario is invalid, output INVALID. Otherwise, output a single integer representing the minimum total penalty to move from the starting cell to the destination cell.

Note

Explanation for the sample input/output #1

For the first scenario, one of the solutions is to move as follows: \((1, 1) \rightarrow (2, 1) \rightarrow (3, 1) \rightarrow (3, 2) \rightarrow (3, 3) \rightarrow (3, 4)\). The total penalty of this solution is \((3 - 4)^1 + (4 - 3)^1 + (3 - 6)^1 + (6 - 8)^1 + (8 - 1)^1 = 2\).

Explanation for the sample input/output #2

For the first scenario, the cycle \((1, 1) \rightarrow (2, 1) \rightarrow (2, 2) \rightarrow (1, 2) \rightarrow (1, 1)\) has a penalty of \((1 - 2)^5 + (2 - 0)^5 + (0 - 9)^5 + (9 - 1)^5 = -26250\). You can keep repeating this cycle to make your total penalty arbitrarily small. Similarly, for the second scenario, you can move to \((1, 1)\) first, then repeat the same cycle.

I2. Ласковые массивы (сложная версия)

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

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

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

Ирис хранит целочисленный массив \(a_1, a_2, \ldots, a_n\). Она знает, что этот массив обладает интересным свойством: максимальное абсолютное значение всех элементов меньше или равно сумме всех элементов, то есть \(\max(\lvert a_i\rvert) \leq \sum a_i\).

Ирис определяет скучность массива как максимальную сумму его подмассива\(^{\text{∗}}\).

Приближается день рождения Ирис, и Виктор собирается прислать ей ещё один массив \(b_1, b_2, \ldots, b_m\). По некоторым, казалось бы, очевидным причинам он решает, что массив \(b_1, b_2, \ldots, b_m\) должен обладать следующими свойствами.

  • \(a_1, a_2, \ldots, a_n\) должен быть подпоследовательностью\(^{\text{†}}\) из \(b_1, b_2, \ldots, b_m\).
  • Эти два массива имеют одинаковую сумму. То есть, \(\sum\limits_{i=1}^n a_i = \sum\limits_{i=1}^m b_i\).
  • Значение скучности массива \(b_1, b_2, \ldots, b_m\) является наименьшим из возможных.
  • Среди массивов с наименьшей скучностью длина массива \(b\) (т.е. \(m\)) является наименьшей из возможных. В этом случае Ирис поймёт его уважение как можно скорее!

Для массива \(b_1, b_2, \ldots, b_m\), удовлетворяющего условиям выше, Виктор определяет значение массива как количество вхождений массива \(a\) как подпоследовательности в массив \(b\). Другими словами, вычисляет количество массивов \(c_1, c_2, \ldots, c_{n}\) таких, что \(1\le c_1< c_2< \ldots< c_n\le m\), и для всех целых \(i\), удовлетворяющих \(1\le i\le n\), выполняется \(b_{c_{i}}=a_i\), и называет это число значением массива \(b\).

Даже при таких ограничениях, как указано выше, всё равно существует слишком много возможных подарков. Поэтому Виктор просит вас посчитать сумму значений подходящих массивов \(b_1, b_2, \ldots, b_m\), удовлетворяющих всем вышеприведенным условиям. Так как ответ может быть очень большим, Виктору нужно только это число по модулю \(998\,244\,353\). Он обещает вам: если вы успешно поможете ему, он поделится с вами кусочком праздничного торта Ирис.

\(^{\text{∗}}\)Массив \(c\) является подмассивом массива \(d\), если \(c\) может быть получен из \(d\) удалением нескольких (возможно, ни одного или всех) элементов с начала и нескольких (возможно, ни одного или всех) элементов с конца.

\(^{\text{†}}\)Последовательность \(c\) является подпоследовательностью \(d\), если \(c\) может быть получена из \(d\) удалением нескольких (возможно, ни одного или всех) элементов на произвольных позициях.

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

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq 3\cdot 10^6\)) — длина массива \(a_1, a_2, \ldots, a_n\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(-10^9 \leq a_i \leq 10^9\)) — исходный массив. Гарантируется, что \(\max(\lvert a_i\rvert) \leq \sum a_i\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(3\cdot 10^6\).

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

Для каждого набора входных данных выведите одну строку, содержащую целое число: сумму значений подходящих массивов \(b_1, b_2, \ldots, b_m\) по модулю \(998\,244\,353\).

Примечание

В первом наборе входных данных \(a=[1, 2, 3, 4]\). Единственный возможный массив \(b\) — это \([1, 2, 3, 4]\), его значение равно \(1\).

Во втором наборе входных данных \(a=[2, -3, 2, 2]\). Возможными массивами \(b\) являются \([1, 2, -3, 2, -1, 2]\) и \([2, 1, -3, 2, -1, 2]\), их значения равны \(1\).

В третьем наборе \(a=[1, -2, 2, 1]\). Единственный подходящий массив \(b\) является \([1, 1, -2, 2, -1, 1]\). Его значение равно \(2\), так как мы можем выбрать массивы \(c=[1,3,4,6]\) или \([2,3,4,6]\). Таким образом, массив \(a\) встречается в \(b\) дважды, поэтому ответ \(2\).

E1. Очередное упражнение на графы (простая версия)

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

Это простая версия задачи. Отличие между версиями заключается в том, что в этой версии есть дополнительное ограничение на \(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 \operatorname{min}(\mathbf{400}, \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\).

Гарантируется, что сумма значений \(m\) по всем наборам входных данных не превосходит \(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\).

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\).

D. Граф и граф

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

Вам даны два связных неориентированных графа с одинаковым количеством вершин. В обоих графах в какой-то вершине находится фишка. В первом графе фишка изначально находится в вершине \(s_1\), во втором графе фишка изначально находится в вершине \(s_2\). Далее бесконечное количество раз повторяются следующая операция:

  • Пусть сейчас в первом графе фишка находится в вершине \(v_1\), а во втором графе в вершине \(v_2\).
  • Выбирается какая-то вершина \(u_1\), смежная с \(v_1\), в первом графе.
  • Выбирается какая-то вершина \(u_2\), смежная с \(v_2\), во втором графе.
  • Фишки перемещаются в выбранные вершины: в первом графе фишка перемещается из \(v_1\) в \(u_1\), во втором графе из \(v_2\) в \(u_2\).
  • Стоимость такой операции равна \(|u_1 - u_2|\).

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

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

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(n\), \(s_1\) и \(s_2\) (\(2 \le n \le 1000\), \(1 \le s_1, s_2 \le n\)) — количество вершин в каждом графе, номер вершины в первом графе, где изначально находится фишка, и номер вершины во втором графе, где изначально находится фишка.

Вторая строка каждого набора входных данных содержит одно целое число \(m_1\) (\(1 \le m_1 \le 1000\)) — количество рёбер в первом графе.

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

Следующая строка каждого набора входных данных содержит одно целое число \(m_2\) (\(1 \le m_2 \le 1000\)) — количество рёбер во втором графе.

\(j\)-я из следующих \(m_2\) строк содержит два целых числа \(c_j\) и \(d_j\) (\(1 \le c_j, d_j \le n\), \(c_j \ne d_j\)) — номера концов \(j\)-го ребра во втором графе.

Гарантируется, что сумма \(n\), сумма \(m_1\) и сумма \(m_2\) по всем наборам входных данных не превосходят \(1000\).

Гарантируется, что оба графа являются связными.

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

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

Примечание

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

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

C. Контрольный пункт полиции

графы дп кратчайшие пути *1900

Дорожная сеть Берляндии состоит из n городов и m двусторонних дорог. Города пронумерованы от 1 до n, причем главная столица имеет номер n, а культурная столица — номер 1. Дорожная сеть устроена таким образом, что по дорогам возможно доехать от любого города до любого другого. Проезд по каждой их дорог в любом направлении занимает одно и тоже время.

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

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

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

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

В первой строке входных данных содержатся два целых числа n и m (2 ≤ n ≤ 100, ) — количество городов и количество дорог в Берляндии соотвественно. Далее в m строках даны пары целых чисел vi, ui (1 ≤ vi, ui ≤ n, vi ≠ ui) — номера городов, соединенных i-ой дорогой. Числа в строке разделяются пробелом.

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

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

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

Примечание

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

Во втором примере наибольшее искомое значение достигается, если поставить пункт в город номер 4, тогда 6 путей будут иметь по 2 безопасные дороги, и один путь — 0, таким образом, ответ будет равен .

B. Планеты

Бинарный поиск графы кратчайшие пути Структуры данных *1700

Гоа'улд Апофис снова захватил команду Джека О'Нила! Сам Джек смог спастись, но к тому времени корабль Апофиса уже совершил прыжок в гиперпространство. Однако Джек знает, на какой планете высадится Апофис. Чтобы спасти друзей, Джеку предстоит несколько раз пройти через звездные врата, чтобы попасть на эту планету.

Всего в галактике находится n планет, пронумерованных числами от 1 до n. Джек находится на планете с номером 1, а Апофис высадится на планете с номером n. Между некоторыми парами планет можно перемещаться через звездные врата (перемещение возможно в обоих направлениях); перемещение занимает положительное и, возможно, для разных пар планет неодинаковое количество секунд. Джек начинает свое путешествие в момент времени 0.

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

Зная информацию о времени перемещения между планетами, а также о моментах времени, когда Джек не сможет пользоваться звездными вратами на конкретных планетах, определите наименьшее время, за которое он сможет попасть на планету с номером n.

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

Первая строка содержит два целых числа, разделенные пробелом: n (2 ≤ n ≤ 105), количество планет в галактике, и m (0 ≤ m ≤ 105), количество пар планет, между которыми можно перемещаться сквозь звездные врата. Далее следуют m строк, в каждой из них содержится три целых числа: i-ая строка содержит номера планет ai и bi (1 ≤ ai, bi ≤ n, ai ≠ bi), между которыми есть связь через звездные врата, и целочисленное время (в секундах) перемещения между этими планетами ci (1 ≤ ci ≤ 104). Гарантируется, что между любой парой планет существует не более одного перехода, образованного звездными вратами.

Далее следуют n строк: i-тая строка содержит целое число ki (0 ≤ ki ≤ 105), которое обозначает количество моментов времени, в которые на планету с номером i прибывают другие путешественники. Далее через пробел следуют ki упорядоченных по возрастанию различных целых чисел tij (0 ≤ tij < 109). Число tij обозначает, что в момент времени tij (в секундах) на планету i прибывает другой путешественник. Гарантируется, что сумма всех ki не превышает 105.

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

Выведите единственное число — наименьшее количество времени, которое понадобится Джеку, чтобы попасть с планеты 1 на планету n. Если Джек не сможет попасть на планету n ни за какое время, выведите число -1.

Примечание

В первом примере у Джека три выбора, куда переместиться с планеты 1. Если он переместится сразу на планету 4, то потратит 8 секунд. Если он переместится на планету 3, то потратит 3 секунды, но, поскольку в моменты времени 3 и 4 на планету 3 прибывают другие путешественники, то он сможет отправиться на планету 4 только в момент времени 5, затратив в сумме 8 секунд. Если же Джек переместится на планету 2, а потом на планету 4, то потратит в сумме всего лишь 2 + 5 = 7 секунд.

Во втором примере с планеты 1 на планету 3 нельзя попасть, перемещаясь через звездные врата.

C. Графы Доу

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

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

Граф Доу порядка k обозначим за D(k), за |D(k)| обозначим количество вершин в графе D(k). Тогда определим графы Доу следующим образом:

  • D(0) состоит из единственной вершины, которая имеет номер 1.
  • D(1) состоит из двух вершин с номерами 1 и 2, соединенных ребром.
  • D(n) для n ≥ 2 получается из графов D(n - 1) и D(n - 2). D(n - 1) и D(n - 2) объединяются в один граф, при этом номера всех вершин графа D(n - 2) увеличиваются на |D(n - 1)| (например, вершина номер 1 графа D(n - 2) становится вершиной номер 1 + |D(n - 1)|). После этого в граф добавляются два ребра: первое — между вершинами с номерами |D(n - 1)| и |D(n - 1)| + 1, второе — между вершинами с номерами |D(n - 1)| + 1 и 1. Обратите внимание, что из определения графа D(n) следует, что D(n) является связным графом, вершины которого пронумерованы от 1 до |D(n)|.
На рисунке изображены, слева-направо, графы Доу порядка 1, 2, 3 и 4.

Графы Доу, по мнению Джона, хороши прежде всего тем, что для них существует полиномиальный алгоритм поиска Гамильтонова пути. Однако от Вас требуется отвечать на запросы о нахождении кратчайшего по длине пути между вершинами ai и bi в графе D(n).

Путь между парой вершин u и v в графе — это последовательность вершин x1, x2, ..., xk (k > 1) такая, что x1 = u, xk = v, и для любого i (i < k) вершины xi и xi + 1 связаны ребром графа. Длиной пути x1, x2, ..., xk называется число (k - 1).

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

В первой строке записаны два целых числа t и n (1 ≤ t ≤ 105; 1 ≤ n ≤ 103) — количество запросов и порядок рассматриваемого графа. В i-той из следующих t строк записано два целых числа ai и bi (1 ≤ ai, bi ≤ 1016, ai ≠ bi) — номера двух вершин в i-м запросе. Гарантируется, что ai, bi ≤ |D(n)|.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

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

Для каждого запроса выведите в отдельной строке единственное целое число — длину кратчайшего пути между вершинами ai и bi. Ответы на запросы выводите в том порядке, в котором запросы заданы во входных данных.

E. Встретить Ее

графы дп кратчайшие пути *2600

Урпал живет в большом городе. Он назначил свидание своей любимой этим вечером.

Всего в городе n перекрестков, пронумерованных от 1 до n. Перекрестки соединены m направленными улицами, все улицы имеют одинаковую длину. Урпал живет на перекрестке a, а свидание назначено в ресторане на перекрестке b. Он хочет добраться до перекрестка b на общественном транспорте. Всего есть k автобусных компаний. В начале каждой секунды автобус из i-ой компании выбирает случайный наикратчайший путь между перекрестком si и перекрестком ti и проезжает по этому пути. Возможна такая ситуация, когда от перекрестка si до перекрестка ti не существует никакого пути. В этом случае ни один автобус не отправится из si до ti. Если автобус проезжает перекресток, на котором стоит Урпал, то юноша может сесть на этот автобус. Также он может сойти с автобуса на любом перекрестке на пути.

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

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

Обратите внимание, что Урпалу неизвестна скорость автобусов.

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

Первая строка входных данных содержит целые числа n, m, a, b (2 ≤ n ≤ 100; 0 ≤ m ≤ n·(n - 1); 1 ≤ a, b ≤ na ≠ b).

Следующие m строк содержат по два целых числа ui и vi (1 ≤ ui, vi ≤ nui ≠ vi), которые описывают направленную дорогу из перекрестка ui до перекрестка vi. Все дороги во входных данных различны.

В следующей строке записано целое число k (0 ≤ k ≤ 100). Затем идут k строк, содержащих целые числа si и ti (1 ≤ si, ti ≤ nsi ≠ ti), означающие, что есть автобусный путь от si до ti. Обратите внимание, что между перекрестками si и ti может не существовать пути, данная ситуация описана в условии задачи.

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

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

E. Flights

графы кратчайшие пути *2600

LiLand is a country, consisting of n cities. The cities are numbered from 1 to n. The country is well known because it has a very strange transportation system. There are many one-way flights that make it possible to travel between the cities, but the flights are arranged in a way that once you leave a city you will never be able to return to that city again.

Previously each flight took exactly one hour, but recently Lily has become the new manager of transportation system and she wants to change the duration of some flights. Specifically, she wants to change the duration of some flights to exactly 2 hours in such a way that all trips from city 1 to city n take the same time regardless of their path.

Your task is to help Lily to change the duration of flights.

Input

First line of the input contains two integer numbers n and m (2 ≤ n ≤ 1000; 1 ≤ m ≤ 5000) specifying the number of cities and the number of flights.

Each of the next m lines contains two integers ai and bi (1 ≤ ai < bi ≤ n) specifying a one-directional flight from city ai to city bi. It is guaranteed that there exists a way to travel from city number 1 to city number n using the given flights. It is guaranteed that there is no sequence of flights that forms a cyclical path and no two flights are between the same pair of cities.

Output

If it is impossible for Lily to do her task, print "No" (without quotes) on the only line of the output.

Otherwise print "Yes" (without quotes) on the first line of output, then print an integer ansi (1 ≤ ansi ≤ 2) to each of the next m lines being the duration of flights in new transportation system. You should print these numbers in the order that flights are given in the input.

If there are multiple solutions for the input, output any of them.

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.

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

C. Дороги в Берляндии

графы кратчайшие пути *1900

В Берляндии n городов, пронумерованных от 1 до n, некоторые из которых соединены двусторонними дорогами. Все дороги имеют длину — некоторое целое число от 1 до 1000. Известно, что из любого города можно доехать до любого другого по существующим дорогам. Так же для каждой пары городов известно кратчайшее расстояние между ними. Правительство Берляндии планирует построить k новых дорог. Для каждой запланированной дороги известна ее длина, и какие города она будет соединять. Чтобы контролировать правильность постройки новых дорог, после открытия очередной дороги правительство Берляндии хочет проверять сумму кратчайших расстояний между всеми парами городов. Помогите им — по заданной матрице кратчайших расстояний по старым дорогам и планам всех новых дорог, выясните, как будет меняться сумма кратчайших расстояний между всеми парами городов после постройки каждой дороги.

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

В первой строке записано целое число n (2 ≤ n ≤ 300) — число городов в Берляндии. Далее в n строках записано по n целых чисел — матрица кратчайших расстояний. j-ое число в i-ой строке — di, j, кратчайшее расстояние между городами i и j. Гарантируется, что di, i = 0, di, j = dj, i, и заданная матрица является матрицей кратчайших расстояний для некоторого набора двусторонних дорог с целочисленной длиной от 1 до 1000, таким, что по этим дорогам можно доехать из любого города до любого другого.

На следующей строке записано целое число k (1 ≤ k ≤ 300) — число запланированных дорог. В следующих k строках записаны описания запланированных дорог. Каждая дорога описывается тремя целыми числами ai, bi, ci (1 ≤ ai, bi ≤ n, ai ≠ bi, 1 ≤ ci ≤ 1000) — ai и bi — пара городов, которые соединяет дорога, ci — длина дороги. Между парой городов может быть несколько дорог, но никакая дорога не соединяет город сам с собой.

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

Выведите k целых чисел qi (1 ≤ i ≤ k). qi должно равняться сумме кратчайших расстояний между всеми парами городов после постройки дорог с номерами от 1 до i. Дороги нумеруются начиная с 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. В одной и той же клетке дважды взрывать гранату нельзя. Взрывные волны гранат могут пересекаться. Возможно, взрыв одной из гранат не уничтожит ни одной крысы, а взрыв другой уничтожит всех.

B. Очередь в школе

Конструктив кратчайшие пути Паросочетания реализация *800

На перемене в школьной столовой образовалась очередь из n человек, в которой стоят мальчики и девочки. Изначально ребята встали в таком порядке, в котором они забежали в столовую. Однако через некоторое время мальчикам стало неловко, что они стоят в очереди перед девочками, и они стали каждую секунду пропускать девочек вперед.

Опишем процесс более точно. Пусть позиции в очереди последовательно пронумерованы целыми числами от 1 до n, причем тот, кто стоит на позиции номер 1 обслуживается первым. Тогда, если в момент времени x на i-ой позиции стоит мальчик, а на (i + 1)-ой — девочка, то в момент времени x + 1 на i-ой позиции будет находиться девочка, а на (i + 1)-ой — мальчик. Моменты времени заданы в секундах.

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

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

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

В следующей строке задана строка s, обозначающая начальную расстановку школьников. Если на i-ой позиции в очереди стоит мальчик, то i-ый символ строки s равен «B», иначе i-ый символ равен «G».

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

Выведите строку a, обозначающую расположение ребят в очереди спустя t секунд. Если на i-ой позиции через заданное время будет стоять мальчик, то i-ый символ a должен быть равен «B», иначе он должен быть равен «G».

D. БерДональдс

графы кратчайшие пути математика *2400

В Бертауне собираются открыть кафе известной сети БерДональдс. При этом очень важно правильно выбрать месторасположение нового кафе, чтобы до него было удобно добираться. Система дорог Бертауна представляет собой n перекрестков, соединенных m двусторонними дорогами. Для каждой дороги известна ее длина. Также известно, что от каждого перекрестка по дорогам можно добраться до любого другого.

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

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

В первой строке записаны два целых числа n и m () — количество перекрестков и дорог соответственно. Далее следует m строк — описание всех дорог в Бертауне. Каждая дорога описывается тремя целыми числами ai, bi, wi (1 ≤ ai, bi ≤ n, ai ≠ bi; 1 ≤ wi ≤ 105), где ai и bi — номера перекрестков, которые соединяет i-ая дорога, а wi — длина i-ой дороги.

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

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

Выведите единственное вещественное число — кратчайшее расстояние от оптимального положения кафе до самого дальнего перекрестка. Ответ будет считаться правильным, если его абсолютная или относительная погрешность не превосходит 10 - 9.

E. Ссора

графы кратчайшие пути *2400

Друзья Вася и Петя живут в Бертауне. В этом городе n перекрестков, некоторые из которых соединены одинаковыми по длине двунаправленными улицами. Вася живет в доме на перекрестке номер 1, а Петя — в доме на перекрестке номер n.

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

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

Вася и Петя двигаются одновременно и с одинаковой скоростью, то есть допустима ситуация, когда один из них приходит к некоторому перекрестку, а другой уходит из него же. Например, Вася может пойти от перекрестка 1 к перекрестку 2, а Петя может в то же время пойти от перекрестка 2 к перекрестку 3.

Если маршрутов, удовлетворяющих всем требованиям, не существует, ваша программа должны выводить -1.

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

В первой строке записаны два целых числа n и m (2 ≤ n ≤ 500, 1 ≤ m ≤ 10000) — число перекрестков и улиц соответственно. Далее следует m строк по два целых числа в каждой — описания улиц. Улица описывается парой перекрестков, которые она соединяет. Гарантируется, что никакая улица не соединяет перекресток с самим собой, и между любой парой перекрестков есть не более одной улицы.

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

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

B. Егор и граф

графы дп кратчайшие пути *1700

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

  • Игра состоит из n шагов.
  • На i-том шаге Егор удаляет из графа вершину номер xi. Удаляя вершину, Егор удаляет все ребра, которые входили в данную вершину и которые выходили из нее.
  • Перед выполнением каждого шага, Егор хочет знать сумму длин кратчайших путей между всеми парами оставшихся вершин. Кратчайший путь может проходить через любую оставшуюся вершину. Другими словами, если обозначить как d(i, v, u) кратчайший путь между вершинами v и u в графе, который получился до удаления вершины xi, то Егор хочет знать значение следующей суммы: .

Помогите Егору, выведите значение искомой суммы перед каждым шагом.

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

В первой строке содержится целое число n (1 ≤ n ≤ 500) — количество вершин в графе.

В следующих n строках содержится по n целых чисел — матрица смежности графа: j-тое число в i-той строке aij (1 ≤ aij ≤ 105, aii = 0) обозначает вес ребра, ведущего из вершины i в вершину j.

В следующей строке содержится n различных целых чисел: x1, x2, ..., xn (1 ≤ xi ≤ n) — вершины, которые удаляет Егор.

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

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

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на C++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

C. Егор и друзья

графы дп Комбинаторика кратчайшие пути *2100

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

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

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

Помогите Егору с этой задачей.

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

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

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

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

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

Во вторую строку выведите остаток от деления количества способов переправить людей за минимальное количество переправ на число 1000000007 (109 + 7). Если невозможно переправить всех людей на другой берег, то выведите число 0.

Примечание

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

Во втором тесте нужно действовать по следующему плану:

  1. переправить двух людей весом по 50 килограмм;
  2. переправить одного человека весом 50 килограмм обратно;
  3. переправить человека весом 100 килограмм;
  4. переправить человека весом 50 килограмм обратно;
  5. переправить двух людей весом по 50 килограмм.

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

A. Кратчайший путь короля

жадные алгоритмы кратчайшие пути *1000

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

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

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

В первой строке входных данных заданы шахматные координаты клетки s, а во второй — клетки t.

Шахматные координаты состоят из двух символов, один из которых это строчная буква латинского алфавита (от a до h), а второй — цифра от 1 до 8.

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

В первую строку выведите n — минимальное число ходов короля. Далее в n строк выведите сами ходы. Каждый ход описывается одной из восьми строк: L, R, U, D, LU, LD, RU или RD.

L, R, U, D, соответственно, означают ходы влево, вправо, вверх и вниз (согласно рисунку), двухбуквенные обозначения соответствуют диагональным ходам. Если решений несколько, выведите любое.

B. Ярослав и время

Бинарный поиск графы кратчайшие пути *2100

Ярослав играет в игру «Время». В игре у него есть таймер, на котором изображено время, которое ему осталось жить. Как только таймер показывает 0, игровой персонаж Ярослава умирает и игра заканчивается. Так же в игре существует n часовых станций, станция номер i находится в точке (xi, yi) плоскости. Зайдя на станцию номер i, игрок увеличивает текущее время на своем таймере на ai. Станции одноразовые, то есть если игрок второй раз зайдет на какую-нибудь станцию, то время на его таймере не увеличится.

На перемещение между станциями игрок тратит d·dist единиц времени, где dist — расстояние, пройденное игроком, а d — некоторая константа. Расстояние между станциями i и j определяется как |xi - xj| + |yi - yj|.

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

Сейчас Ярослава интересует вопрос: сколько единиц денег нужно ему, чтобы попасть на станцию номер n? Помогите Ярославу. Считайте, что время покупки и увеличения времени на таймере пренебрежимо мало.

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

В первой строке содержатся целые числа n и d (3 ≤ n ≤ 100, 103 ≤ d ≤ 105) — количество станций и константа из условия.

Во второй строке заданы n - 2 целых числа: a2, a3, ..., an - 1 (1 ≤ ai ≤ 103). В следующих n строках содержатся координаты станций. В i-той из них записаны два целых чисел xi, yi (-100 ≤ xi, yi ≤ 100).

Гарантируется, что никакие две станции не находятся в одной точке.

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

В единственную строку выведите целое число — ответ на задачу.

C. Достать сокровище

графы кратчайшие пути Перебор Структуры данных *2500

Рейнбоу выстроил h ячеек в ряд и пронумеровал их от 1 до h слева направо. В n из этих ячеек находится сокровище. Будем называть каждую из этих n ячеек «ячейка с сокровищами». «Ячейка с сокровищами» номер i — это ai-ая ячейка, в ней лежат сокровища на ci долларов.

Сейчас Фреда встала в первую ячейку. В любой момент она может пройти k ячеек вперед или вернуться в первую ячейку. Это значит, что Фреда может дойти до 1-ой, (k + 1)-ой, (k + 1)-ой, (k + 1)-ой ячеек и так далее.

Рейнбоу дала Фреде m операций. Каждая операция относится к одному из следующих трех типов:

  1. Добавить способ перемещения x: в любой момент времени можно также пройти на x ячеек вперед. Например, в самом начале у Фреды есть только один способ перемещения k. Если в какой-то момент времени у Фреды есть способы перемещения a1, a2, ..., ar, то она может дойти до любой ячейки вида , где vi — некоторое целое неотрицательное число.
  2. Уменьшить цену сокровища в x-ой «ячейке с сокровищами» на y долларов. Иными словами, выполнить присвоение cx = cx - y.
  3. Узнать стоимость самого ценного сокровища среди ячеек, до которых может дойти Фреда. Если Фреда не может дойти ни до одной ячейки с сокровищами, то считается, что стоимость самого ценного сокровища в таком случае равна 0 и дальше ничего не происходит. Иначе, Фреда забирает самое ценное сокровище из соответствующей ячейки. Если существует несколько «ячеек с сокровищами», которые содержат самое ценное сокровище, то нужно выбрать ту, номер которой минимален (такая ячейка не обязательно имеет минимальный номер, потому что нумерации ячеек и «ячеек с сокровищами» независимы). После этой операции количество ячеек, в которых содержится сокровище, становится на единицу меньше.

Фреда как программист просит Вас написать программу, которая выполнит каждую операцию.

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

Первая строка содержит четыре целых числа: h (1 ≤ h ≤ 1018), n, m (1 ≤ n, m ≤ 105) и k (1 ≤ k ≤ 104).

Каждая из следующих n строк содержит два целых числа: ai (1 ≤ ai ≤ h), ci (1 ≤ ci ≤ 109). Это означает, что i-ая «ячейка с сокровищами» — это ai-ая ячейка и в ней лежит сокровище на ci долларов. Все ai различны.

Каждая из следующих m строк записана в одном из следующих трех форматов:

  • «1 x» — операция типа 1, 1 ≤ x ≤ h;
  • «2 x y» — операция типа 2, 1 ≤ x ≤ n, 0 ≤ y < cx;
  • «3» — операция типа 3.

Максимальное количество операций типа 1 — 20. Гарантируется, что в любой момент стоимость сокровища в любой ячейке с сокровищем положительна. Гарантируется, что все операции корректны (никакая операция не может уменьшить стоимость уже взятого сокровища).

Пожалуйста, не используйте спецификатор %lld, для чтения 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

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

Для каждой операции типа 3, выведите целое число, указывающее на ценность (в долларах) самого ценного сокровища среди «ячеек c сокровищами», которые Фреда может достать. Если такого сокровища нет, выведите 0.

Примечание

В примере дано 10 ячеек и 3 «ячейки с сокровищами». Первая — это ячейка 5, в ней лежит сокровище на 50 долларов. Вторая — это ячейка 7, в ней лежит сокровище на 60 долларов. Третья — это ячейка 8, в ней лежит сокровище на 100 долларов.

Сначала Фреда может дотянуться только до ячеек 1, 3, 5, 7 и 9. Первая операция уменьшает стоимость в долларах второй «ячейки с сокровищами» с 60 до 55. После этого самое ценное сокровище среди доступных ей «ячеек с сокровищами» — это max(50, 55) = 55. После третьей операции она может двигаться на 3 ячейки вперед с каждым шагом, таким образом она может достигнуть ячеек 1, 3, 4, 5, 6, 7, 8, 9, 10. Значит, четвертая операция забирает сокровище стоимостью 100 долларов.

Обратите внимание, что она забрала сокровище стоимостью 55 и 100 долларов, следовательно, ответ последней операцией она забирает сокровище стоимостью 50 долларов.

E. Принцесса и ее тень

Конструктив кратчайшие пути *3100

Юная Принцесса Влада любит прыгать по лужайкам и гулять по лесу. Как-то раз в один замечательный солнечный день во время прогулки Принцесса с удивлением обнаружила, что ее тень куда-то пропала. «Ну и дела», — подумала она и отправилась гулять по лесу в поисках своей тени.

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

Лес, в котором развлекаются наши герои, можно представить как множество целочисленных клеток на плоскости, и перемещаться Тень с Принцессой могут только вверх, вниз, вправо и влево на 1. В некоторых клетках, как и положено лесу, растут деревья. Тень и Принцесса не могут ходить в клетку, где расположено дерево. Стоит отметить, что лес переживает трудные времена. В лесу растет совсем немного деревьев...

В начальный момент времени Принцесса гуляет в клетке с координатами (vxvy), в то время как Тень спряталась от Принцессы в клетке (sxsy). Принцесса, Тень и деревья находятся в разных клетках.

Тень играет с Принцессой. Как только Принцесса ходит на 1 в каком-либо направлении, Тень одновременно с Принцессой отлетает на 1 в том же направлении, если это возможно (если клетка, в которую она отлетает, не содержит дерево); в противном случае, Тень остается на своем месте. Тень эфемерна, поэтому наши герои никоим образом не мешают друг другу.

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

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

Первая строка входных данных содержит координаты героев vx, vy, sx, sy и количество деревьев m (0 ≤ m ≤ 400), разделенные пробелом. Следующие m строк содержат координаты деревьев.

Координаты героев и деревьев целые и лежат в границах от -100 до 100 включительно. Принцесса, Тень и деревья расположены в различных клетках.

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

Если Принцесса никак не сможет поймать Тень, выведите «-1» (без кавычек).

Иначе выведите последовательность символов «L», «R», «D», «U», соответствующих ходам Принцессы, следуя которым, она поймает Тень в некоторой клетке своего пути (L — ход налево, R — направо, U — вверх, D — вниз; ось x направлена вправо, y — вверх).

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

Примечание

Ниже приведены картинки к примерам (Принцессе, Тени и деревьям отвечают розовый, серый и черный цвета соответственно; синим цветом помечен центр плоскости).

В первом случае Принцесса может сделать два хода влево, один вверх и один вправо:

В следующем случае Принцесса не сможет добраться до Тени:

В данном примере можно сделать два хода влево и один вниз (в любом порядке):

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 вместо этого значения.

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 битвы микемонов. После этих битв Ваши противники покинут лес.

И наконец, надо сделать еще один шаг и выйти из леса.

B. Строковая задача

кратчайшие пути *1800

Мальчик Валера очень любит строки. А еще больше он любит, когда строки одинаковые. Поэтому на досуге Валера сам с собой играет в следующую игру. Он берет две произвольные строки, состоящие из строчных букв латинского алфавита, и пытается сделать из них две равные друг другу. По правилам его игры, во время очередного хода Валере разрешается заменить в одной из строк один произвольный символ Ai на произвольный символ Bi, но при этом за каждый свой ход ему придется заплатить некоторую сумму денег, равную Wi. Ходов разрешается сделать бесконечно много. Поскольку Валера очень экономный мальчик и никогда не тратит свои деньги зря, он попросил Вас, как опытного программиста, помочь ему ответить на вопрос: какое наименьшее количество денег должно быть у Валеры, чтобы он смог получить одинаковые строки.

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

В первых двух строках входного файла заданы две исходные непустые строки s и t, состоящих из строчных латинских букв. Длины обеих строк не превосходят 105. В следующей строке задано целое число n (0 ≤ n ≤ 500) — количество возможных замен. В следующих n строках заданы два символа Ai и Bi, являющихся строчными латинскими буквами, а также целое число Wi (0 ≤ Wi ≤ 100), означающие, что разрешено заменить символ Ai на символ Bi в любой из строк, потратив количество денег в размере Wi.

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

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

D. Рыцари

геометрия графы кратчайшие пути сортировки *2000

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

Берляндия разделена на m + 1 область m заборами, и единственный способ перейти из одной области в другую это перелезть через забор. Каждый забор представляет собой окружность на плоскости, причём никакие два забора не имеют общих точек и ни одна опорная точка не находится на заборе. Вам задано k пар чисел ai, bi. Для каждой пары вам нужно узнать: сколько заборов придётся пересечь рыцарю, находящемуся в опорной точке номер ai, чтобы достигнуть опорной точки bi (в случае если Ван де Март нанесёт первый удар в опорную точку номер bi). Поскольку каждый рыцарь путешествует на коне (а коня непросто перекидывать через забор), то вам нужно для каждой пары найти минимальное число пересечений.

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

В первой строке входных данных записано три целых числа n, m, k (1 ≤ n, m ≤ 1000, 0 ≤ k ≤ 100000). В следующих n строках записано по два целых числа Kxi, Kyi ( - 109 ≤ Kxi, Kyi ≤ 109) — координаты опорной точки номер i. Опорные точки могут совпадать.

Каждая из следующих m строк описывает забор номер i тремя целыми числами ri, Cxi, Cyi (1 ≤ ri ≤ 109,  - 109 ≤ Cxi, Cyi ≤ 109) — радиусом и центром окружности, на которой находится соответствующий забор.

Далее заданы k пар целых чисел ai, bi (1 ≤ ai, bi ≤ n), каждая в отдельной строке — запросы на которые вам придётся отвечать. ai и bi могут совпадать.

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

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

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 целых чисел — веса гирек в порядке их выкладывания на весы.

Если существует несколько решений, разрешается вывести любое.

D. Управляем роботом

графы дп кратчайшие пути *2600

Робокомпанию возглавляет жестокий человек. Его девиз: «Движение или смерть»! Именно этим его продукт и занимается. Рассмотрим поведение робота этой компании. Пусть робот движется по ориентированному графу. Поведение робота на таком графе называется «Три закона робототехники»:

  • Закон 1. Робот самоликвидируется, если посетит ранее посещенную вершину графа.
  • Закон 2. Робот самоликвидируется, если окажется в ситуации, в которой ему некуда будет идти (иными словами, если робот зайдет в вершину, исходящая степень которой равна нулю).
  • Закон 3. Робот движется случайным образом, когда он может двигаться в нескольких направлениях (то есть, когда он достигает вершины, исходящая степень которой больше единицы). Конечно, робот может двигаться только по направленным ребрам графа.

Можете представить робота с таким поведением? Поэтому они очень дешевые и рассчитаны на потребителя, стесненного в средствах. Среди них, конечно, есть пользователь mzry1992. У mzry1992 имеется такой робот и она хочет переместить его из вершины s в вершину t по направленному графу так, чтобы робот не самоликвидировался. К счастью, в каждой вершине девушка может посылать роботу специальные приказ. Специальный приказ показывает роботу нужное направление в тех случаях, когда у робота есть несколько направлений на выбор (во избежание случайного выбора направления робота согласно закону 3). Когда робот дойдет до вершины номер t, mzry1992 немедленно изымает его из графа. Таким образом, девушка всегда найдет способ достичь желаемого результата, при условии, что существует путь из s в t (независимо от того, равна ли исходящая степень вершины t нулю или нет).

Тест 2

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

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

Первая строка содержит два целых числа n (1 ≤ n ≤ 106) — количество вершин графа, и m (1 ≤ m ≤ 106) — количество ребер. Затем следует m строк, в каждой строке записано два целых числа, ui и vi (1 ≤ ui, vi ≤ n; vi ≠ ui), эти целые числа обозначают направленное ребро, проходящее из вершины ui в вершину vi. В последней строке записано два целых числа, s и t (1 ≤ s, t ≤ n).

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

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

Если выполнить поставленную цель возможно, выведите требуемое минимальное количество приказов в худшем случае. Иначе выведите -1.

Примечание

Рассмотрим первый пример. Изначально робот находится в вершине номер 1. Таким образом, на первом шагу робот может пойти в вершину 2 или 3. В зависимости от выбора робота, mzry1992 должна отдать приказ роботу. Приказ направляет его в вершину 4. Если mzry1992 не отдает приказа роботу на вершине 2 или 3, то робот может выбрать «плохое» исходящее ребро (вернуться в вершину 1) согласно закону № 3. Таким образом, ответ — один.

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. Левко и игра

графы жадные алгоритмы кратчайшие пути *2800

Левко очень любит соревнования по спортивному ориентированию в своем городе. Чтобы лучше выступать на соревнованиях Левко тренируется все свободное время. Тренировки проводятся в игровой форме.

Город состоит из n перекрестков, которые соединены m + k односторонними дорогами. Между двумя перекрестками может существовать больше одной дороги, а также могут быть дороги из одного перекрестка в него же.

Левко и Зенык играют в игру. В самом начале игры Левко стоит на перекрестке s1, а Зенык — на перекрестке s2. Они оба хотят добраться до перекрестка f. Кто сделает это быстрее, тот и победит. Если они доберутся туда одновременно, то объявляется ничья. По предварительной договоренности игроки стартуют одновременно, а также двигаются по дорогам с одинаковой скоростью.

Левко очень хочет победить в игре. Он знает длины всех дорог в городе и знает, что есть ровно k дорог, длины которых можно изменить, заплатив городскому правительству. По заказу Левко правительство может изменить длину i-ой из этих k дорог на любое целое значение из интервала [li, ri] (оба конца отрезка включаются). Левко стало интересно, может ли он перестроить дороги так, чтобы победить в игре, и если нет, то может ли он надеяться на ничью.

Считайте, что оба игрока действуют оптимально, играя в игру. Гарантируется, что из перекрестков s1 и s2 можно добраться до перекрестка f.

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

В первой строке записано три целых числа n, m и k (1 ≤ n, m ≤ 104, 1 ≤ k ≤ 100). Во второй строке записано три целых числа s1, s2 и f (1 ≤ s1, s2, f ≤ n).

В следующих m строках записаны дороги, длины которых нельзя менять. В каждой строке записано три целых числа ai, bi и ci (1 ≤ ai, bi ≤ n, 1 ≤ ci ≤ 109), обозначающих дорогу, ведущую из перекрестка ai в перекресток bi длины ci.

В следующих k строках записаны дороги, длины которых можно менять. В каждой строке записано по четыре целых числа ai, bi, li и ri (1 ≤ ai, bi ≤ n, 1 ≤ li ≤ ri ≤ 109), обозначающих, что есть дорога из перекрестка ai в перекресток bi, длину которой Левко может установить в пределах [li, ri].

Считайте, что перекрестки пронумерованы от 1 до n. Гарантируется, что из перекрестков s1 и s2 можно добраться до перекрестка f.

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

В первой строке выведите строку «WIN» (без кавычек) — если Левко может победить в этой игре, «DRAW» (без кавычек) — если Левко может достичь ничьи и «LOSE» (без кавычек), если он точно проиграет.

Если ответ «WIN» или «DRAW» во второй строке выведите k целых чисел через пробел — длины дорог, которые устанавливает Левко. Длины для дорог выводите в порядке следования дорог во входных данных.

E. Петя и трубопровод

графы кратчайшие пути Потоки *2300

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

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

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

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

В первой строке заданы два целых числа n и k (2 ≤ n ≤ 50, 0 ≤ k ≤ 1000), разделенные пробелом. Далее следуют n строк по n целых чисел, разделенных единичными пробелами. В строке i + 1 в колонке j записано целое число cij — толщина трубы из резервуара i в резервуар j (0 ≤ cij ≤ 106, сii = 0). Если cij = 0, то трубы из резервуара i в резервуар j нет.

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

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

Примечание

В первом тесте можно увеличить толщину трубы из 1-го во 2-ой резервуар на 7 единиц.

Во втором тесте толщину трубы из 1-го во 2-ой резервуар нужно увеличить на 4 единицы, из 2-го в 3-ий — на 3 единицы, из 3-го в 4-ый — на 2 единицы и из 4-ого в 5-ый — на 1 единицу.

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. Валера и дураки

графы дп кратчайшие пути поиск в глубину и подобное *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}.

E. Испытание для вождя

графы жадные алгоритмы кратчайшие пути *2600

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

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

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

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

В первой строке записаны два целых числа N и M (1 ≤ N, M ≤ 50) — количество строк и столбцов у плиты. В следующих N строках записаны по M символов — итоговая раскраска плиты. Символ W означает, что клетка должна быть покрашена в белый цвет, а B — в черный.

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

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

A. Ладья, слон и король

графы кратчайшие пути математика *1100

Маленький Петя учится играть в шахматы. Он уже выучил, как перемещаются король, ладья и слон. Напомним и вам правила перемещения этих шахматных фигур. Шахматная доска представляет собой 64 квадратных поля, выстроенных в таблицу 8 × 8. Поле обозначается парой целых чисел (r, c) — номером строки и номером столбца (в классическом варианте столбцы обозначаются буквами). Каждая фигура занимает ровно одно поле. Ход состоит в перемещении фигуры, причем фигуры перемещаются по следующим правилам:

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

Петя раздумывает над следующей задачей: за какое наименьшее количество ходов каждая из этих фигур может переместиться из поля (r1, c1) на поле (r2, c2)? При этом считается, что других фигур, кроме данной, на доске нет. Помогите ему в решении этой задачи.

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

Во входных данных записаны четыре целых числа r1, c1, r2, c2 (1 ≤ r1, c1, r2, c2 ≤ 8) — координаты стартового и конечного полей. Стартовое поле не совпадает с конечным.

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

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

Выведите три целых числа через пробел: наименьшее количество ходов, требуемых ладье, слону и королю (в таком порядке) для того, чтобы переместиться из поля (r1, c1) на поле (r2, c2). В случае, если какая-то из фигур не может совершить такое перемещение, выведите вместо соответствующего числа 0.

C. Окружение сокровищ

битмаски кратчайшие пути *2600

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

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

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

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

  1. Представьте себе, что клетки таблицы — это точки на плоскости (клетка таблицы на пересечении i-го столбца и j-ой строки является точкой (i, j)). А заданный вам путь — это замкнутая ломаная, проходящая через эти точки.
  2. Вам нужно определить: находится ли точка p таблицы, через которую не проходит ломаная, внутри ломаной.
  3. Проведем луч, начинающийся в точке p и не проходящий через другие точки таблицы (такой луч обязательно существует).
  4. Посчитаем сколько отрезков ломаной пересекает проведенный луч. Если это количество нечетно, считается, что точка p (а следовательно и клетка таблицы) находится внутри ломаной (пути). Иначе, считается, что она находится снаружи.
Входные данные

В первой строке записаны два целых числа n и m (1 ≤ n, m ≤ 20) — размеры таблицы. Далее в n строках записано по m символов — описание таблицы. Расшифровка описания:

  • символ «B» — обозначает клетку с бомбой;
  • символ «S» — обозначает стартовую клетку, считается пустой клеткой;
  • цифра c (1-8) — обозначает сокровище с индексом c;
  • символ «.» — пустая клетка;
  • символ «#» — препятствие.

Пусть на карте есть t сокровищ. Тогда далее в t строках заданы стоимости сокровищ. В i-ой строке задана стоимость сокровища с индексом i, vi ( - 200 ≤ vi ≤ 200). Гарантируется, что сокровища пронумерованы от 1 до t. Гарантируется, что всего на карте суммарно не более 8 объектов. Объектами считаются бомбы и сокровища. Гарантируется, что на карте ровно один символ «S».

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

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

Примечание

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

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

В третьем тесте прибыль нельзя получить.

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

D. Игра с точками

графы дп кратчайшие пути реализация *2100

Представьте, что Вы играете в следующую игру. Имеется n точек, являющихся вершинами правильного n-угольника. Точки пронумерованы целыми числами от 1 до n. Каждая пара точек соединена отрезком некоторого цвета. Различных цветов не более 26, они обозначаются строчными латинскими буквами. В трех различных точках стоит по фишке. Все фишки одинаковые. За один ход Вы можете взять любую из фишек и передвинуть ее в другую точку. При этом цвет отрезка, по которому Вы можете передвинуть фишку, должен совпадать с цветом отрезка, соединяющего точки, в которых находятся две другие фишки. Нельзя перемещать фишку в точку, в которой уже находится другая фишка. Ваша задача состоит в том, чтобы за наименьшее количество ходов добиться того, чтобы фишки находились в точках с номерами 1, 2 и 3. Напишите программу, которая оптимальным образом играет в эту игру.

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

В первой строке записано целое число n (3 ≤ n ≤ 70) — количество точек. Во второй строке записаны три различных целых числа от 1 до n — номера точек, в которых изначально находятся фишки. Каждая из следующих строк содержит по n символов — это матрица, задающая цвета отрезков. Цвета задаются строчными буквами латинского алфавита. Символ с номером j в i-й строке матрицы обозначает цвет отрезка между точками i и j. Матрица симметрична, то есть j-й символ i-й строки совпадает с i-м символом j-й строки. На главной диагонали матрицы стоят символы '*', потому что не существует отрезка, соединяющего точку саму с собой.

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

Если не существует ни одной последовательности ходов, после которых фишки оказываются в точках с номерами 1, 2 и 3, выведите в единственной строке число -1. Если же решение существует, то в первой строке выведите наименьшее возможное количество ходов, а далее сами ходы. Для описания очередного хода в отдельной строке выведите два целых числа через пробел — номер точки, откуда следует взять фишку, и номер точки, куда ее следует передвинуть. Если оптимальных последовательностей ходов несколько, выведите любую из них.

Примечание

В первом примере мы можем передвинуть фишку из точки 4 в точку 1, потому что они соединены отрезком цвета 'a', как и точки 2 и 3, в которых находятся две другие фишки. После этого хода фишки находятся в точках 1, 2 и 3.

D. Дима и бактерии

графы кратчайшие пути снм *2000

Дима стал заниматься биологией бактерий, в результате своих опытов он вывел k видов бактерий. Всего сейчас в его лаборатории содержится n бактерий, причем количество бактерий вида i равно ci. Для удобства будем считать, что все бактерии пронумерованы от 1 до n. При этом бактерии вида ci имеют номера от до .

С помощью специального оборудования Дима может передавать энергию между некоторыми бактериями. Конечно, пользование таким оборудованием не бесплатно. Дима знает m способов передачи энергии с помощью оборудования. Способ с номером i характеризуется тремя целыми числами vi, ui, xi и позволяет за xi долларов передавать энергию от бактерии с номером ui к бактерии с номером vi или наоборот.

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

Поскольку в таком случае стоимость передачи энергии от любой бактерии к любой другой зависит лишь только от видов этих двух бактерий, помогите Инне определить: образуют ли выведенные Димой бактерии устроенное правильным образом распределение на виды? И если образуют, выведите матрицу d размера k × k. Ячейка d[i][j] этой матрицы должна обозначать стоимость передачи энергии от бактерии вида i к бактерии вида j.

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

В первой строке записаны три целых числа n, m, k (1 ≤ n ≤ 105; 0 ≤ m ≤ 105; 1 ≤ k ≤ 500). В следующей строке записаны k целых чисел c1, c2, ..., ck (1 ≤ ci ≤ n). В каждой из следующих m строк записано три целых числа ui, vi, xi (1 ≤ ui, vi ≤ n; 0 ≤ xi ≤ 104ui ≠ vi). Гарантируется, что .

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

Если распределение Димы устроено правильным образом, выведите строку «Yes», а затем k строк: в i-й строке выведите целые числа d[i][1], d[i][2], ..., d[i][k] (d[i][i] = 0). Если нельзя передать энергию бактерии типа j от бактерии типа i соответствующее значение d[i][j] должно быть равно -1. Если распределение Димы устроено неправильным образом, выведите «No».

E. Маршрут Президента

графы дп кратчайшие пути *2500

В старой доброй Берляндии n городов, m дорог. Каждая из дорог соединяет пару различных городов и является двусторонней. Между парой городов не более одной дороги. Известна длина каждой из дорог.

Известно, что совсем скоро Президент поедет по дорогам Берляндии из города s в город t. Конечно, он выберет один из кратчайших путей из s в t, но какой именно — не известно.

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

Составить бюджет для такого мероприятия — непростая задача. Для всех возможных различных пар s, t (s < t) найдите количество дорог, которые лежат на хотя бы одном кратчайшем пути из s в t.

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

В первой строке входных данных записаны целые числа n, m (2 ≤ n ≤ 500, 0 ≤ m ≤ n·(n - 1) / 2) — количество городов и дорог соответственно. Далее следует m строк с описаниями дорог, по одному описанию в строке. Каждое описание содержит три целых числа xi, yi, li (1 ≤ xi, yi ≤ n, xi ≠ yi, 1 ≤ li ≤ 106), где xi, yi — номера соединяемых i-й дорогой городов, а li — ее длина.

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

Выведите последовательность целых чисел c12, c13, ..., c1n, c23, c24, ..., c2n, ..., cn - 1, n, где cst — искомое количество дорог на пути из s в t. Элементы последовательности c выводите в описанном порядке. Если между парой городов s и t вообще нет пути, то cst = 0.

B. Jzzhu и города

графы жадные алгоритмы кратчайшие пути *2000

Jzzhu — президент страны A. В его стране есть n городов, пронумерованных от 1 до n. Город 1 — столица A. Также есть m дорог, соединяющих города. По i-й дороге можно дойти из города ui в город vi (и наоборот), длина этой дороги равна xi. Более того, в стране есть k железнодорожных маршрутов. По i-му маршруту можно доехать от столицы страны до города si (и наоборот), длина этого маршрута равна yi.

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

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

В первой строке записано три целых числа, n, m, k (2 ≤ n ≤ 105; 1 ≤ m ≤ 3·105; 1 ≤ k ≤ 105).

В каждой из следующих m строк записано три целых числа, ui, vi, xi (1 ≤ ui, vi ≤ nui ≠ vi; 1 ≤ xi ≤ 109).

В каждой из следующих k строк записано два целых числа, si и yi (2 ≤ si ≤ n; 1 ≤ yi ≤ 109).

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

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

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

E. Яблов и игра

Бинарный поиск кратчайшие пути Строки *3000

Яблов и Тостов любят играть. Сегодня они играют со строками по следующим правилам. Сперва Тостов называет Яблову две строки s и t, состоящие исключительно из букв 'A', 'B', 'C', 'D'. Затем Яблов должен как можно быстрее получить строку s. Изначально у него есть пустая строка, за одну секунду он может дописать к концу текущей строки любую непрерывную подстроку строки t.

И вот Тостов и Яблов начинают играть в описанную игру. Тостов уже назвал Яблову строку t, а вот строку s он еще не придумал. Тостов считает, что строка s должна состоять из n символов. Конечно, он хочет придумать самую плохую строку для Яблова (такую, что Яблов проведет как можно больше времени, получая ее). Скажите Тостову, сколько времени Яблов проведет за игрой, если Тостов найдет для него самую худшую строку длины n? Считайте, что Яблов всегда действует оптимально и получает любую строку s за минимально возможное время.

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

В первой строке записано целое число n (1 ≤ n ≤ 1018). Во второй строке записана строка t (1 ≤ |t| ≤ 105). Строка t состоит только из букв 'A', 'B', 'C', 'D'. Каждая буква встречается в строке t хотя бы раз.

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

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

Примечание

В первом примере Тостов может выбрать строку «AAAAA».

Во втором примере Тостов может выбрать строку «DADDA».

E. Классическая задача

графы кратчайшие пути Структуры данных *3000

Дан взвешенный неориентированный граф из n вершин и m ребер. Найдите кратчайший путь из вершины s в вершину t, либо определите, что пути не существует.

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

В первой строке записано два целых числа, разделенных пробелом, n и m (1 ≤ n ≤ 105; 0 ≤ m ≤ 105).

В следующих m строках приведено описание ребер графа. В i-й строке записано три целых числа, разделенных пробелами — ui, vi, xi (1 ≤ ui, vi ≤ n; 0 ≤ xi ≤ 105). Это означает, что вершины с номерами ui и vi соединены ребром длины 2xi (2 в степени xi).

В последней строке записаны два целых числа, разделенных пробелом — номера вершин s и t.

Вершины пронумерованы от 1 до n. В графе отсутствуют кратные ребра и петли.

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

В первой строке выведите остаток от деления длины кратчайшего пути на 1000000007 (109 + 7), если путь существует, и -1, если пути не существует.

В случае, если путь существует, во второй строке выведите целое число k —количество вершин в кратчайшем пути из вершины s в вершину t; в третьей строке выведите k чисел, разделенных пробелами — вершины кратчайшего пути в порядке посещения. Первая вершина должна быть вершиной s, последняя — вершиной t. Если существует несколько кратчайших путей, выведите любой.

Примечание

Путем из вершины s в вершину t называется последовательность вершин v0, ..., vk, такая что v0 = s, vk = t, и для любого i от 0 до k - 1 вершины vi и vi + 1 соединены ребром.

Длиной пути называется сумма длин ребер между vi и vi + 1 для всех i от 0 до k - 1.

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

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.

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

B. Две кнопки

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

Вася нашел странное устройство. На передней панели устройства расположен дисплей, отображающий некоторое целое положительное число, а также красная и синяя кнопки. При нажатии на красную кнопку число на дисплее увеличивается в два раза. При нажатии на синюю кнопку число на дисплее уменьшается на единицу. Если в какой-то момент число перестает быть положительным, устройство ломается. Дисплей может отображать сколь угодно большие числа. Изначально на дисплее отображается число n.

Вася хочет получить на дисплее число m. Какое минимальное количество нажатий ему придется совершить?

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

Первая и единственная строка ввода содержит два различных целых числа n и m, разделенных пробелом (1 ≤ n, m ≤ 104).

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

Выведите одно число — минимальное количество нажатий на кнопки, необходимое, чтобы получить число m из числа n.

Примечание

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

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

D. Артур и стены

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

Наконец настал тот день, когда Артур накопил достаточную сумму денег и решил купить квартиру. Ему предложили отличный вариант — квартиру в самом центре города по отличной цене.

План предложенной Артуру квартиры представляет собой прямоугольник размера n × m, разделенный на квадраты размера 1 × 1. В каждом из таких квадратов находится либо стена (такой квадрат обозначен на плане символом "*"), либо свободное от стены место (такой квадрат обозначен на плане символом ".").

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

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

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

В первой строке входных данных следуют два целых числа n, m (1 ≤ n, m ≤ 2000) — размеры плана квартиры Артура.

В следующих n строках задано по m символов — описание плана квартиры.

Если клетка плана обозначена символом "*", значит в ней находится стена.

Если клетка карты обозначена символом ".", значит в этом месте квартиры свободное от стены место, и эта клетка относится к какой-то из комнат.

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

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

Если возможных ответов несколько, разрешается вывести любой из них.

B. Разрушение дорог

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

В некоторой стране есть ровно n городов и m двусторонних дорог, соединяющих города. Пронумеруем города некоторым образом целыми числами от 1 до n. Если города a и b соединены дорогой, то за один час вы можете по ней проехать как из города a в город b, так и из города b в город a. Кроме того, сеть дорог такова, что из каждого города можно добраться до любого другого города, двигаясь по дорогам.

Вы хотите разрушить наибольшее количество дорог в стране так, чтобы с помощью оставшихся дорог можно было добраться из города s1 в город t1 не более чем за l1 часов и из города s2 в город t2 не более чем за l2 часов.

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

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

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

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

Последние две строки содержат по три числа s1, t1, l1 и s2, t2, l2, соответственно (1 ≤ si, ti ≤ n, 0 ≤ li ≤ n).

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

Выведите единственное число — ответ на задачу. Если план выполнить невозможно, выведите -1.

E. Пути и деревья

графы жадные алгоритмы кратчайшие пути *2000

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

Пусть дан связный взвешенный неориентированный граф G = (V, E) (здесь V — множество вершин, E — множество рёбер). Деревом кратчайших путей из вершины u называется граф G1 = (V, E1), который является деревом, множество его рёбер E1 является подмножеством множества рёбер исходного графа E, и длины кратчайших путей от u до любой вершины в G и в G1 совпадают.

Вам дан связный взвешенный неориентированный граф G и вершина u. Необходимо найти дерево кратчайших путей заданого графа из вершины u, суммарный вес рёбер которого минимален.

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

В первой строке находятся два числа n и m (1 ≤ n ≤ 3·105, 0 ≤ m ≤ 3·105) — количество вершин и рёбер графа соответственно.

В следующих m строках находятся по три числа, обозначающих очередное ребро — ui, vi, wi — номера вершин, соединённых ребром, и вес ребра (ui ≠ vi, 1 ≤ wi ≤ 109). Гарантируется, что граф связен, и что между каждой парой вершин существует не более одного ребра.

В последней строке ввода находится целое число u (1 ≤ u ≤ n) — номер стартовой вершины.

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

Выведите в первой строке минимальный суммарный вес рёбер дерева.

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

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

Примечание

В первом тесте из условия возможны два дерева кратчайших путей:

  • с ребрами 1 – 3 и 2 – 3 (суммарный вес 3);
  • с ребрами 1 – 2 и 2 – 3 (суммарный вес 2);

А, например, дерево с ребрами 1 – 2 и 1 – 3 не будет деревом кратчайших путей для вершины 3, потому что расстояние от вершины 3 до вершины 2 в этом дереве равно 3, а в исходном графе оно 1.

C. Amr и химия

графы жадные алгоритмы кратчайшие пути математика Перебор *1900

Amr любит химию, а особенно эксперименты. Он готовится к новому, интересному эксперименту.

У Amr есть n различных типов реактивов. У каждого реактива i есть изначальный объем ai литров. Для этого эксперимента Amr надо смешать друг с другом все реактивы, но сперва надо, чтобы у всех реактивов были одинаковые объемы. Итак, его задание — сделать так, чтобы у всех реактивов были одинаковые объемы.

Для этого Amr может производить операции двух различных типов.

  • Выбрать некий реактив i и удвоить его текущий объем, то есть его новый объем будет равен 2ai
  • Выбрать некий реактив i и разделить его объем на 2, округлив вниз до целого числа литров, то есть новый объем будет равен

Предположим, что каждый реактив расположен в контейнере бесконечного объема. Теперь Amr интересно, какое минимальное количество операций необходимо для того, чтобы объемы всех химикатов стали равны?

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

В первой строке записано одно целое число n (1 ≤ n ≤ 105), количество реактивов.

Во второй строке записано n целых чисел через пробел ai (1 ≤ ai ≤ 105), обозначающих изначальный объем i-го реактивов в литрах.

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

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

Примечание

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

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

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.

E. Шахматы

кратчайшие пути математика *3000

Кролик Брайан любит шахматы. Недавно он поспорил с кроликом Стьюи что конь лучше короля. Для этого он пытается показать, что конь очень быстрый, но Стьюи не принимает утверждений без доказательств. Он соорудил для Брайана бесконечную шахматную доску, в которой удалил некоторые клетки для спортивного интереса. Брайану осталось посчитать, сколько различных клеток доски достижимы не более чем за k ходов для коня, который стоит в клетке с координатами (0, 0), Естественно, на вырезанные клетки ходить нельзя.

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

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

Первая строка содержит два целых числа k и n (0 ≤ k ≤ 1018, 0 ≤ n ≤ 440) — соответственно максимальное количество ходов, которые может совершить конь, и количество удаленных клеток. Далее записано n строк — каждая задает координаты вырезанной клетки в виде (xi, yi) (|xi| ≤ 10, |yi| ≤ 10). Все числа целые, вырезанные клетки различны, и клетка (0, 0) гарантированно не вырезана.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать поток cin (также вы можете использовать спецификатор %I64d).

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

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

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. Филипп и поезда

графы кратчайшие пути поиск в глубину и подобное *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 в противном случае.

Примечание

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

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

E. Кратчайший путь

графы кратчайшие пути *2000

В Древней Берляндии n городов и m двунаправленных дорог одинаковой длины. Города пронумерованы целыми числами от 1 до n включительно. Согласно древней примете, если путешественник посетит подряд (не заходя ни в какие другие) три города ai, bi, ci, его ждет большая беда. И всего есть k таких троек городов. Каждая тройка является упорядоченной, это означает, что, например, посещать города в порядке ai, ci, bi можно. Вася хочет попасть из города 1 в город n, не нарушая приметы. Выясните, какое наименьшее число дорог ему нужно пройти. Также требуется найти один из его возможных маршрутов.

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

В первой строке записаны три целых числа n, m, k (2 ≤ n ≤ 3000, 1 ≤ m ≤ 20000, 0 ≤ k ≤ 105) — количество городов, количество дорог и количество запрещенных троек соответственно.

Далее следует m строк по два целых числа xi, yi (1 ≤ xi, yi ≤ n) — описания дорог. Дорога описывается номерами городов, которые она соединяет. Никакая дорога не соединяет город с самим собой, между парой городов может быть не более одной дороги.

Далее следует k строк по три целых числа ai, bi, ci (1 ≤ ai, bi, ci ≤ n) — запрещенные тройки. Каждая упорядоченная тройка перечислена не более одного раза. Все три города в каждой тройке попарно различны.

Город n может быть недостижим из города 1 по дорогам.

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

Если пути из 1 в n не существует, выведите -1. Иначе в первой строке выведите количество дорог d в кратчайшем пути из города 1 в город n. Во второй строке выведите d + 1 чисел — любой из возможных кратчайших маршрутов Васи. Маршрут должен начинаться с города 1 и заканчиваться в городе n.

C. Три государства

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

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

Так как дороги всегда обходятся недёшево, правительства государств новообразованного союза попросили вас помочь им оценить затраты. Для этого вам была выдана карта, которая представляет собой клетчатый прямоугольник из n строк по m клеток в каждой. Любая клетка карты либо принадлежит одному из трёх государств, либо является областью, на которой можно построить дорогу, либо является областью, на которой дорогу построить нельзя. Проходимыми являются все клетки, принадлежащие государствам, а также все клетки, в которых построены дороги. Из любой проходимой клетки можно перемещаться вверх, вниз, вправо и влево, если соответствующая такому перемещению клетка существует и является проходимой.

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

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

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

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

Следующие n строк содержат по m символов каждая и описывают строки карты. Цифры от 1 до 3 означают принадлежность соответствующему государству. Символ '.' соответствует клетке, на которой можно построить дорогу, а символ '#' соответствует клетке, на которой дорогу построить нельзя.

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

Выведите единственное целое число — минимальное количество клеток, в которых необходимо построить дороги, чтобы соединить все клетки всех государств. Если это сделать невозможно, то выведите -1.

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 целых чисел — максимальное количество картин, которые сможет посмотреть Игорь, для каждого начального положения.

A. Два пути

графы кратчайшие пути *1600

В Абсурдистане n городов (пронумерованных от 1 до n) и m двунаправленных железнодорожных перегонов. А ещё там абсурдно простая сеть автотрасс — для любой пары различных городов x и y между ними есть двунаправленная автомобильная дорога тогда и только тогда, когда между ними нет железнодорожного перегона. На перемещение в соседний город по одному железнодорожному перегону или по одной автомобильной дороге уходит ровно один час.

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

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

Через какое наименьшее количество часов оба транспортных могут быть в городе n (максимальное из времён прибытия для автобуса и поезда)? Обратите внимание, что автобус и поезд не обязаны прибыть в город n одновременно, но могут так сделать, если потребуется.

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

Первая строка входных данных содержит два числа n и m (2 ≤ n ≤ 400, 0 ≤ m ≤ n(n - 1) / 2) — количество городов и количество железнодорожных перегонов соответственно.

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

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

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

Выведите единственное целое число — наименьшее возможное время прибытия последнего из транспортных средств в город n. Если хотя бы одно из двух транспортных средств не сможет добраться до города n, то выведите  - 1.

Примечание

В первом примере поезд может поехать по маршруту , а автобус по маршруту . Обратите внимание, что автобусу и поезду разрешается прибывать в город 4 одновременно.

Во втором примере Абсурдистаном правят железнодорожники. Обычных дорог (не ЖД перегонов) нет, так что автобус никак не может добраться до города 4.

E. Межгалактические путешествия

кратчайшие пути Теория вероятностей *2700

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

Учёным известно, что в пределах досягаемости находятся n галактик. Вы находитесь в галактике 1, и вам нужно попасть в галактику n. Чтобы попасть из галактики i в галактику j, необходимо залететь внутрь кротовой норы (i, j), и спустя ровно одни галактические сутки вы окажетесь в галактике j.

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

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

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

В первой строке записано целое число n (1 ≤ n ≤ 1000) — количество галактик в пределах досягаемости.

Далее записана матрица из n строк и n столбцов. Каждый её элемент pij обозначает вероятность существования кротовой норы из галактики i в галактику j. Все вероятности даны в процентах и представляют собой целые числа. Гарантируется, что все элементы на главной диагонали равны 100.

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

Выведите единственное вещественное число — математическое ожидание времени пути из галактики 1 в галактику n. Ваш ответ будет считаться правильным, если его абсолютная или относительная ошибка не будет превосходить 10 - 6.

А именно: пусть ваш ответ равен a, а ответ жюри — b. Проверяющая программа будет считать ваш ответ правильным, если .

Примечание

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

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. Собери число

графы кратчайшие пути *2300

Дано целое неотрицательное число k и n неотрицательных целых чисел a1, a2, ..., an. Записывая некоторые из этих чисел друг за другом в произвольном порядке и, возможно, используя какие-то из них несколько раз (а какие-то вообще не используя), требуется составить кратчайшее (наименьшее по количеству цифр) число, делящееся на k, или определить, что это невозможно.

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

В первой строке содержится два целых числа n (1 ≤ n ≤ 1 000 000) и k (1 ≤ k ≤ 1000) — количество чисел и требуемый делитель соответственно.

Во второй строке содержится n целых чисел a1, a2, ..., an (0 ≤ ai ≤ 109).

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

Если ответ существует, в первой строке выведите «YES» (без кавычек), а во второй строке — искомое кратчайшее число без ведущих нулей. В случае если ответа не существует, в единственной строке выходных данных выведите «NO» (без кавычек).

B. Мировое турне

графы кратчайшие пути *2000

Знаменитый скульптор Кикассо отправляется в мировое турне!

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

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

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

Обратите внимание, промежуточные маршруты могут проходить через города, которые назначены для турне, а также проходить через один и тот же город дважды. Например, турне может выглядеть так: . Надчёркиваниями обозначены четыре города, в порядке их посещения: [1, 5, 2, 4].

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

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

В первой строке находится пара целых чисел n и m (4 ≤ n ≤ 3000, 3 ≤ m ≤ 5000) — количество городов и однонаправленных дорог в Берляндии.

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

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

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

Примечание

Пусть d(x, y) — кратчайшее расстояние между городами x и y. Тогда в примере из условия d(2, 1) = 3, d(1, 8) = 7, d(8, 7) = 3. Суммарное расстояние равно 13.

D. Тесей и лабиринт

графы кратчайшие пути реализация *2000

Как известно, Тесей отправился на остров Крит, чтобы победить Минотавра. Приплыв на остров, он обнаружил лабиринт, который представляет собой прямоугольное поле размера n × m, состоящее из блоков размера 1 × 1.

В каждом блоке имеется кнопка, разворачивающая все блоки по часовой стрелке на 90 градусов. Каждый блок поворачивается вокруг своего центра, расположение блоков в таблице при этом не меняется. Помимо кнопки, в каждом блоке есть несколько (возможно, 0) дверей. За одну минуту Тесей может либо перейти в соседний по стороне блок, либо нажать кнопку и привести в действие механизм по повороту всех блоков по часовой стрелке на 90 градусов. Из блока A можно перейти в соседний блок B тогда и только тогда, когда у блока A есть дверь, ведущая в блок B, а у блока B есть дверь, ведущая в блок A. Тесей уже обнаружил вход в лабиринт и оказался в блоке (xT, yT), то есть в блоке, расположенном в ряду xT и столбце yT. Тесей слышал, что Минотавр прячется в блоке (xM, yM), и хочет узнать минимальное количество минут, через которое он сможет добраться до чудовища.

Герою не к лицу решать задачи по программированию, поэтому он просит вас помочь ему.

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

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

В каждой из последующих n строк содержится по m символов, описывающих соответствующий ряд лабиринта. Рассмотрим возможные варианты символов:

  • «+» означает, что этот блок имеет 4 двери (в каждый из соседних блоков);
  • «-» означает, что этот блок имеет 2 двери — в соседний слева и соседний справа блок;
  • «|» означает, что этот блок имеет 2 двери — в соседний сверху и снизу блоки;
  • «^» означает, что этот блок имеет 1 дверь — в соседний сверху блок;
  • «>» означает, что этот блок имеет 1 дверь — в соседний справа блок;
  • «<» означает, что этот блок имеет 1 дверь — в соседний слева блок;
  • «v» означает, что этот блок имеет 1 дверь — в соседний снизу блок;
  • «L» означает, что этот блок имеет 3 двери — отсутствует дверь в соседний слева блок;
  • «R» означает, что этот блок имеет 3 двери — отсутствует дверь в соседний справа блок;
  • «U» означает, что этот блок имеет 3 двери — отсутствует дверь в соседний сверху блок;
  • «D» означает, что этот блок имеет 3 двери — отсутствует дверь в соседний снизу блок;
  • «*» означает, что этот блок является стеной и не имеет дверей.

Лево, право, верх и низ определяются из представления лабиринта в виде таблицы, где строки пронумерованы сверху вниз от 1 до n, а столбцы слева направо от 1 до m.

В предпоследней строке содержатся два целых числа — координаты блока (xT, yT) (1 ≤ xT ≤ n, 1 ≤ yT ≤ m), где находится Тесей.

В последней строке содержатся два целых числа — координаты блока (xM, yM) (1 ≤ xM ≤ n, 1 ≤ yM ≤ m), где расположен Минотавр.

Гарантируется, что блок, в котором находится Минотавр (а также блок, в котором находится Тесей), не является блоком-стеной. Блоки, в которых изначально находятся Минотавр и Тесей, могут совпадать.

Выходные данные

Если Тесей не сможет добраться до Минотавра, то выведите -1 в единственной строке выходных данных. В противном случае выведите минимальное количество минут, за которое он сможет это сделать.

Примечание

В момент времени 0 Тесей уже находится в лабиринте в блоке с координатами (xT, yT).

D. Ваня и сокровище

графы дп кратчайшие пути Структуры данных *2300

Ваня оказался во дворце, который можно представить как таблицу из комнат размера n × m. В каждой комнате находится ровно один сундук, при этом в комнате в i-м ряду и j-м столбце находится сундук вида aij. При этом в каждом сундуке типа x ≤ p - 1 находится ключ, открывающий любой сундук типа x + 1, а все сундуки типа 1 не заперты. Сундук типа p ровно один, и в нём находится сокровище.

Ваня начинает в клетке (1, 1) (верхний левый угол). Какое минимальное расстояние ему нужно пройти, чтобы получить сокровище? Считается, что расстояние между двумя клетками (r1, c1) (то есть клетки в строке r1 и столбце c1) и (r2, c2) равно |r1 - r2| + |c1 - c2|.

Входные данные

В первой строке входных данных записаны три числа n, m и p (1 ≤ n, m ≤ 300, 1 ≤ p ≤ n·m) — размеры дворца и количество типов сундуков соответственно.

В каждой из последующих n строк находится по m целых чисел aij (1 ≤ aij ≤ p) — типы сундуков в соответствующих комнатах. Гарантируется, что для любого x от 1 до p найдётся хотя бы один сундук такого типа (то есть существуют r и c, такие что arc = x). Также гарантируется, что сундук типа p ровно один.

Выходные данные

Выведите единственное целое число — минимальное расстояние, которое потребуется преодолеть Ване, чтобы забрать сокровище из сундука типа p.

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.

B. Дополни граф

Бинарный поиск графы Конструктив кратчайшие пути *2300

Кодер ZS нарисовал неориентированный граф из n вершин пронумерованных от 0 до n - 1 и m ребер между ними. Каждое ребро графа взвешено, а каждый вес — целое положительное число.

На следующий день Кодер ZS обнаружил, что некоторые из весов были стерты! Теперь он хочет восстановить целый положительный вес у каждого ребра, вес которого был стерт, так, что длина кратчайшего пути между вершинами s и t в получившемся графе в точности равна L. Поможете ему?

Входные данные

Первая строка содержит пять целых чисел n, m, L, s, t (2 ≤ n ≤ 1000,  1 ≤ m ≤ 10 000,  1 ≤ L ≤ 109,  0 ≤ s, t ≤ n - 1,  s ≠ t) — количество вершин, количество ребер, желаемая длина кратчайшего пути, начальная и конечная вершины соответственно.

Далее следуют m строк, описывающие ребра графа. i-ая из них содержит три целых числа ui, vi, wi (0 ≤ ui, vi ≤ n - 1,  ui ≠ vi,  0 ≤ wi ≤ 109). ui и vi означают концы ребра, а wi — его вес. Если wi равно 0, то вес соответствующего ребра был стерт.

Гарантируется, что между каждой парой вершин существует не более одного ребра.

Выходные данные

Выведите «NO» (без кавычек) в единственной строке, если восстановить веса ребрам требуемым образом невозможно.

В противном случае, выведите «YES» в первой строке. Следующие m строк должны содержать описания ребер получившегося графа, с весами, заданными ребрам, вес которых был стерт. i-ая из них должна содержать три целых числа ui, vi и wi, означающих ребро между ui и vi веса wi. Ребра нового графа должны совпадать с ребрами графа из входных данных. Веса, которые не были стерты, должны остаться неизменными, тогда как новые веса могут быть любыми целыми положительными числами, не превышающими 1018.

Порядок ребер в выходных данных не важен. Длина кратчайшего пути между s и t должна равняться L.

Если существует несколько решений, выведите любое из них.

Примечание

Вот так выглядит граф в первом примере из условия:

В первом примере из условия вес отсутствует всего у одного ребра. Если задать ему вес, равный 8, то длина кратчайшего пути между 0 и 4 будет равна 13.

Во втором примере из условия всего одно ребро. Очевидно, единственным ответом является задание ему веса 123456789.

В последнем примере из условия ни один вес задавать не нужно, но длина кратчайшего пути не совпадает с нужным значением, так что ответ — «NO».

E. Кратчайший путь корабля

геометрия кратчайшие пути *2400

У вас новая, очень интересная работа. Вы — капитан корабля. Ваша задача — провести корабль из одной точки в другую, минимизируя при этом расходы.

Всем известно, что кратчайшее расстояние между любыми двумя точками — отрезок прямой, соединяющий эти точки. Но к сожалению, в море есть остров, поэтому иногда невозможно провести корабль по отрезку прямой между этими точками.

Вы можете двигаться только по безопасным точкам. Точка называется безопасной, если она либо принадлежит прямой, соединяющей начальную и конечную точку, либо находится на границе острова.

Вам повезло — у вас есть умные и сильные рабочие, которые могут помочь в вашем путешествии. Они могут перемещать корабль по морю: это стоит 1 египетский фунт за каждую единицу расстояния по морю. Они так же могут даже нести корабль по суше (они очень сильные!): это стоит 2 египетских фунта за каждую единицу расстояния по территории острова. Ваши деньги рабочие делят между собой поровну, поэтому количество рабочих значения не имеет.

Вы можете перемещать корабль по границе острова, это считается за перемещение по морю.

Вам задана карта моря, вам необходимо определить наименьшую возможную стоимость путешествия.

Вы начинаете в точке (xStart, yStart), и должны приплыть в точку (xEnd, yEnd). Гарантируется, что эти точки различны.

Остров представляет собой выпуклый многоугольник. Никакие 3 точки многоугольника не лежат на одной прямой. Также начальная и конечная точка не лежат внутри или на границе острова. Точки многоугольника заданы в порядке обхода против часовой стрелки.

Входные данные

В первой строке записано 4 целых числа, xStart, yStart, xEnd и yEnd ( - 100 ≤ xStart, yStart, xEnd, yEnd ≤ 100). Во второй строке записано целое число n, количество точек в многоугольнике (3 ≤ n ≤ 30), на следующей строке записано n пар целых чисел x и y — координаты точек многоугольника ( - 100 ≤ x, y ≤ 100), все точки многоугольника различны.

Выходные данные

Выведите минимальную возможную стоимость. Абсолютная или относительная погрешность ответа не должна превосходить 10 - 6.

E. Польшар и Бело-красный граф

графы Конструктив кратчайшие пути *2400

У Польшара есть неориентированный простой граф из n вершин. К сожалению, в графе нет ребер, и граф очень расстроен этим. Польшар хочет сделать его счастливее, добавив несколько красных ребер. Затем он добавит белые ребра на каждое оставшееся место. В итоге граф будет полным графом из красных и белых ребер.

Красочностью графа называют величину min(dr, dw), где dr — диаметр красного подграфа, а dw — диаметр белого подграфа. Диаметр графа — это максимальное натуральное число d такое, что длина кратчайшего пути между некоторой парой вершин равна d. Если граф несвязен, мы будем считать его диаметр равным -1.

Польшар хочет, чтобы его граф был как можно более изящен. А именно, он хочет, чтобы красочность графа была равна k. Можете помочь ему и найти любой граф, удовлетворяющий запросам Польшара?

Входные данные

В единственной строке находятся два числа n и k (2 ≤ n ≤ 1000, 1 ≤ k ≤ 1000) — размер графа и искомая красочность.

Выходные данные

Если подходящих графов не существует, выведите -1.

Иначе, выведите любой граф, удовлетворяющий требованиям Польшара. Сначала выведите m — число красных ребер в графе. Затем, выведите m строк, каждая из которых содержит два числа ai и bi, (1 ≤ ai, bi ≤ n, ai ≠ bi) которые означают, что в графе есть красное ребро между вершинами ai и bi. Каждое красное ребро должно быть выведено один раз, порядок вывода ребер и вершин в ребре не важен.

Помните, что граф Польшара должен остаться простым, а значит, петли и кратные ребра запрещены.

Примечание

В первом примере не существует подходящего графа.

Во втором примере, красный подграф представляет собой путь между вершинами 1 и 5. Его диаметр равен 4. Однако, диаметр белого подграфа равен 2, т. к. он содержит ребра 1-3, 1-4, 1-5, 2-4, 2-5, 3-5.

F. Команда Р снова на высоте!

графы кратчайшие пути Структуры данных *2800

Сейчас новый год, поэтому Баш хочет подарить подарки своим друзьям. В Гималаях n городов, и m двусторонних дорог между ними. Баш живет в городе s. У Баша ровно один друг в каждом из остальных городов. Так как Баш хочет сделать сюрприз своим друзьям, он решил отправить Пикачу к каждому из своих друзей. Так как не все города достижимы из города, где живет Баш, он посылает Пикачу только тем друзьям, которые живут в достижимых городах. Также, он хочет послать их как можно раньше.

Баш нашел, какое минимальное время необходимо каждому из Пикачу, чтобы добраться до места назначения. Так как он перфекционист, он уведомил всех своих друзей о времени прибытия подарка. Все Пикачу двигаются со скоростью 1 метр в секунду. Друзья Баша будут расстроены, если подарки задержаться. К сожалению, команда Р на свободе и знает о плане Баша. Они хотят максимизировать число друзей Баша, которые расстроятся.

Они планируют разрушить ровно один из n - 1 городов, в которых живут друзья. Друг, которых жил в этом городе, умирает, поэтому он тоже расстраивается.

Заметьте, что если город разрушен, то все дороги, ведущие в этот город, также разрушены, поэтому некоторым Пикачу может потребоваться выбрать другой, более длинный путь.

Также заметьте, что только те друзья, которые ждут подарка, могут считаться расстроенными, даже если они умирают.

Так как Баш — уже легенда, помогите в этот раз команде Р и найдите максимальное возможное число друзей, которые будут расстроены, если разрушен ровно один город.

Входные данные

Первая строка содержит три целых числа n, m и s (2 ≤ n ≤ 2·105, , 1 ≤ s ≤ n) — число городов, число дорог в Гималаях и город, в котором живет Баш.

Каждая из следующих m строк содержит три целых числа u, v и w (1 ≤ u, v ≤ n, u ≠ v, 1 ≤ w ≤ 109), означающих, что существует дорога между городами u и v длины w метров.

Гарантируется, что не существует дороги, которая соединяет один и тот же город, а также, не существует нескольких дорог между одной и той же парой городов.

Выходные данные

Выведите единственное число — ответ на задачу.

Примечание

В первом примере после разрушения города 2 длина кратчайших путей между парами городов (3, 2) и (3, 4) изменится. Поэтому ответ равен 2.

D. Тимофей и плоское дерево

графы Деревья кратчайшие пути Структуры данных хэши *2900

У маленького Тимофея есть большое дерево — неориентированный связный граф из n вершин, не содержащий ни одного простого цикла. Он очень любит по нему гулять. Дерево Тимофея плоское и когда он гуляет по нему, он видит всё дерево целиком. Вполне естественно, что, находясь в вершине, он видит дерево подвешенным за эту вершину.

Тимофей считает, что чем больше в дереве вершин, поддеревья которых попарно неизоморфны, тем лучше выглядит подвешенное дерево. Под поддеревом вершины подвешенного дерева он понимает подграф, состоящий из этой вершины и всех ее потомков. Помогите ему встать в такую вершину, что размер максимального подмножества вершин, поддеревья которых попарно неизоморфны при подвешивании за эту вершину, был максимально возможным.

Поддеревья вершин u и v изоморфны, если число сыновей у u и v совпадают, и можно так упорядочить сыновей, что поддерево первого сына u изоморфно поддереву первого сына v, поддерево второго сына u изоморфно поддереву второго сына v, и так далее. В частности, поддеревья, состоящие из одной вершины, всегда изоморфны друг другу.

Входные данные

В первой строке находится одно целое число n(1 ≤ n ≤ 105) — количество вершин в дереве.

В следующих n - 1 строках заданы по два числа ui и vi (1 ≤ ui, vi ≤ 105, ui ≠ vi), означающие номера вершин, соединенных i-м ребром.

Гарантируется, что заданный граф является деревом.

Выходные данные

Выведите одно число — номер вершины, в которую надо встать Тимофею. Если ответов несколько, можно вывести любой.

Примечание

В первом примере можно встать в вершину 1 или вершину 3, тогда все поддеревья будут неизоморфны. Если же встать в вершину 2, то поддеревья вершин 1 и 3 будут изоморфны друг другу.

Во втором примере, если встать в вершину 1, то только поддеревья вершин 4 и 5 будут изоморфны.

В третьем примере, если встать в вершину 1, то поддеревья вершин 2, 3, 4, 6, 7 и 8 будут изоморфны друг другу. Если же встать в вершину 2, то изоморфны будут только воддеревья вершин 3, 4, 6, 7 и 8. А если, например, встать в вершину 5, то будут изоморфны поддеревья вершин 2, 3, 4, 6, 7 и 8, а также поддеревья вершин 1 и 9:


1 9
/\ /\
7 8 4 2

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». Второй вариант лексикографически меньше.

Во втором примере Робот должен выполнять перемещения в следующем порядке: вниз, влево, вниз, вниз, влево, влево, влево, вправо, вправо, вправо, вверх, вверх, вправо, вверх.

В третьем примере Робот не может переместиться ни в одну из соседних клеток, так как все они заняты препятствиями.

D. Тленные дороги

графы дп кратчайшие пути *2700

В стране Невер n городов и очень хорошо развитая дорожная сеть. Между каждой парой городов есть ровно одна двусторонняя дорога, таким образом, всего в Невере целых дорог! При этом никакая дорога не пересекается ни с какой другой дорогой и не проходит через промежуточные города. Что-что, а туннели и мосты в Невере строить умели.

Независимая комиссия оценила каждую дорогу Невера положительным целым числом, называемым тленностью дороги. Чем ниже тленность, тем приятнее по дороге ехать.

В рамках года транспорта в Невере было решено построить музей транспорта в одном из городов страны, а в каждом другом городе установить ровно один указатель на некоторый город (не обязательно тот, в котором находится музей). Указатели должны удовлетворять следующему важному требованию: если любой неверец, живущий в городе без музея, отправится из своего родного города по указателям, то рано или поздно обязательно приедет в город с музеем.

Неверцы — невероятно положительно настроенные люди. Если неверец отправился по маршруту, состоящему из нескольких дорог, то тленностью маршрута неверец считает минимальную из тленностей дорог в этом маршруте.

Руководство Невера еще не приняло окончательное решение относительно города, в котором следует построить музей, и рассматривает все n возможных вариантов. Принципиальное значение имеет сумма тленностей маршрутов до города с музеем из всех остальных городов страны, если путники будут строго следовать установленным указателям. Руководство Невера заботится о своих жителях, поэтому они хотели бы направить указатели таким образом, чтобы минимизировать эту сумму. Помогите им определить минимальное возможное её значение при всех n вариантах строительства музея.

Входные данные

В первой строке содержится число n (2 ≤ n ≤ 2000) — количество городов в Невере.

Следующие n - 1 строк содержат описание дорожной сети. i-я из этих строк содержит n - i целых чисел. j-е число в i-й строке обозначает тленность дороги между городами i и i + j.

Все тленности дорог находятся в диапазоне от 1 до 109, включительно.

Выходные данные

Для каждого города в порядке от 1 до n выведите минимальную возможную сумму тленностей маршрутов до данного города из всех остальных городов при оптимальной установке указателей.

Примечание

Первый пример пояснен рисунком ниже. Слева направо изображены исходная дорожная сеть и оптимальные расстановки указателей при строительстве музея в городах 1, 2 и 3, соответственно. Синим цветом обозначен город с музеем, зеленым — направление указателя в каждом другом городе.

Например, при строительстве музея в городе 3 следует направить указатель в городе 1 на город 3, а указатель в городе 2 — на город 1. Тогда маршрут из города 1 до города 3 будет иметь тленность 2, а маршрут из города 2 до города 3 — тленность 1. Сумма тленностей данных маршрутов составит 3.

E. Эвакуация

графы кратчайшие пути Потоки *2300

Опять они там что-то напортачили... В одном из ядерных реакторов исследовательской станции идет неуправляемая реакция и скоро произойдет взрыв, который уничтожит всю станцию.

Станция представляет собой квадрат n × n разбитый на блоки 1 × 1. Каждый блок является или реактором или лабораторией. Реакторов может быть несколько и ровно один из них собирается взорваться. Реакторы можно считать непроходимыми блоками, по лабораториям же можно перемещаться. Между любыми двумя лабораториями, которые находятся в соседних блоках, имеется коридор. Блоки считаются соседними, если имеют общее ребро.

В каждой из лабораторий имеется некоторое количество ученых и некоторое количество спасательных капсул. Как только ученый залезает в капсулу, он считается спасенным. В каждую капсулу помещается не более одного ученого.

Реактор, который скоро взорвется, поврежден и из него вытекает токсичная охлаждающая жидкость в соседние блоки. Блок, в котором расположен этот реактор, считается зараженным. Каждую минуту охлаждающая жидкость растекается по лабораториям через коридоры. Если в какую-то минуту один из блоков заражен, то на следующую минуту все соседние лаборатории также оказываются заражены. Как только лаборатория оказывается заражена, все ученые в ней, которые находятся не в спасательных капсулах, погибают. Через блоки с реакторами охлаждающая жидкость не распространяется.

До взрыва осталось ровно t минут. Любой ученый за одну минуту может переместиться по коридору в соседнюю лабораторию, если она не заражена. По любому коридору одновременно могут перемещаться неограниченное количество ученых в обоих направлениях. Считается, что ученые внутри лаборатории перемещается без затрат времени. Кроме того, любой ученый может залезть в спасательную капсулу мгновенно. Также считается, что любой ученый в данную минуту всегда успевает сделать свои действия (переместиться из данной лаборатории в соседнюю или залезть в спасательную капсулу) до того, как лаборатория окажется заражена.

Определите максимальное количество ученых, которым удастся спастись.

Входные данные

В первой строке находятся два целых числа n и t (2 ≤ n ≤ 10, 1 ≤ t ≤ 60). В каждой из последующих n строк находится по n символов — описание расположения ученых. Затем идет ровно одна пустая строка. После этого идет еще n строк по n символов в каждой — описание расположения спасательных капсул.

В описаниях расположения ученых и спасательных капсул символ «Y» означает исправно работающий реактор, «Z» — поврежденный реактор. Расположения реакторов в обоих описаниях совпадают. На станции имеется ровно один поврежденный реактор. Символами «0» - «9» обозначаются лаборатории. В описании расположения ученых эти символы обозначают количество ученых в соответствующих лабораториях. В описании спасательных капсул — количество этих капсул в каждой из лабораторий.

Выходные данные

Выведите одно целое число — максимальное количество ученых, которым удастся спастись.

Примечание

Во втором примере события могли происходить следующим образом:

D. Иннокентий и футбольная лига

2-sat графы жадные алгоритмы кратчайшие пути реализация Строки *1900

Иннокентий — президент только что созданной футбольной лиги в Байтландии. Первая задача, которая стоит перед ним — обеспечить трансляцию всех матчей лиги по телевидению. Как вы, возможно, знаете, во время футбольного матча на экране отображаются сокращенные названия команд и текущий счет. Конечно, будет странно, если сокращенные названия клубов соперников совпадут, поэтому Иннокентий должен придумать. как сократить название каждого из клубов лиги до трех букв так, чтобы у всех команд лиги были разные названия.

Название каждого клуба состоит из двух слов: названия команды и города, в котором располагается клуб, например, «DINAMO BYTECITY». Иннокентий не хочет сильно искажать название, поэтому он хочет выбрать сокращенное название для каждого из клубов таким образом, чтобы:

  1. либо сокращенное название клуба совпадало с первыми тремя буквами названия команды, например, для вышеприведенный команды это «DIN»,
  2. либо первые две буквы сокращенного названия клуба совпадали с первыми двумя буквами названия команды, а третья — с первой буквой города команды. Например, для вышеприведенный команды это «DIB».

Кроме этого, если для какой-то команды x выбран второй вариант названия, то не должно быть команды, у которой выбран первый вариант сокращенного названия, совпадающий с первым вариантом названия команды x. Например, если сокращенное название вышеприведенной команды это «DIB», то никакая команда, у которой выбран первый вариант сокращенного названия, не должна иметь сокращенного названия «DIN». При этом возможно, что какая-то команда получит название «DIN», где «DI» — первые две буквы названия команды, а «N» — первая буква города. Конечно, никакие две команды не должны иметь одинакового сокращенного названия.

Помогите Иннокентию выбрать сокращенное название для каждой из команд. Если это невозможно, сообщите об этом. Если возможных ответов несколько, Иннокентия устроит любой из них. Если для некоторой команды совпадают оба варианта сокращенного названия, то Иннокентий все равно будет формально считать, что выбран только один из этих вариантов.

Входные данные

В первой строке находится единственное целое число n (1 ≤ n ≤ 1000) — число футбольных клубов в лиге.

В каждой из следующих n строк находятся два слова — название команды и название города очередного клуба. И название команды, и название города состоят из заглавных букв латинского алфавита и имеют длину не менее 3 и не более 20.

Выходные данные

Если выбрать сокращенные названия, удовлетворив требованиям Иннокентия, невозможно, выведите единственную строку «NO».

Иначе в первую строку выведите «YES». Далее выведите n строк, в каждой строке выведите выведите сокращенное название очередного клуба. Выводите клубы в том же порядке, в каком они заданы во входных данных.

Если возможных ответов несколько, выведите любой.

Примечание

В первом примере можно выбрать первый вариант названия для обеих команд.

Во втором примере невозможно подобрать названия, т. к. по условию нельзя у одной команды выбрать первый вариант названия, а у второй выбрать второй вариант названия, если первые варианты названий у этих команд совпадают.

В третьем примере можно выбрать вторые варианты названий у первых двух команд, и первый вариант — у третьей команды.

В четвертом примере обратите внимание на то, что разрешается, чтобы выбранное название некоторой команды x совпадало с первым вариантом названия y, если первый вариант названия x не совпадает с первым вариантом названия y.

B. Наследство

графы кратчайшие пути Структуры данных *2300

Рик и его коллеги сделали новую радиактивную формулу, и она понадобилась многим плохим парням. Поэтому Рик хочет оставить свое наследство Морти до того, как плохие парни поймают его.

Всего есть n планет в их вселенной, пронумерованных от 1 до n. Рик находится на планете номер s (планетя Земля) и он не знает, где сейчас Морти. Всё, что мы знаем, что Рику принадлежит портальное оружие. С помощью этой пушки он может открыть односторонний портал с одной планеты на любую другую (включая эту планету). Но у этого оружия есть ограничения, потому что он все еще использует бесплатную версию.

По умолчанию он не может открыть любой портал этим оружием. Всего есть q планов на сайте, который продает это оружие. Каждый раз, когда происходит покупка плана, его можно использовать только один раз. Но можно покупать один и тот же план произвольное количество раз.

Планы на сайте имеют три типа:

  1. С планом этого типа вы можете открыть портал с планеты v до планеты u.
  2. С планом этого типа вы можете открыть портал с планеты v до любой планеты с номером из диапазона [l, r].
  3. С планом этого типа вы можете открыть портал с любой планеты с номером из диапазона [l, r] до планеты v.

Рик не знает, где находится Морти, но Юнити собирается проинформировать его, и он хочет быть готовым к тому, чтобы начать свое путешествие немедленно. Поэтому для каждой планеты (включая Землю) он хочет знать минимальное количество денег, которое ему необходимо чтобы добраться от Земли до этой планеты.

Входные данные

Первая строка входных данных содержит три целых числа n, q и s (1 ≤ n, q ≤ 105, 1 ≤ s ≤ n) — количество планет, количество планов и номер планеты Земля соответственно.

Следующие q строк содержат планы. Каждая строка начинается целым числом t — тип плана (1 ≤ t ≤ 3). Если t = 1, тогда далее следуют три числа v, u и w, где w — стоимость плана (1 ≤ v, u ≤ n, 1 ≤ w ≤ 109). Иначе следуют четыре числа v, l, r и w, где w — стоимость плана (1 ≤ v ≤ n, 1 ≤ l ≤ r ≤ n, 1 ≤ w ≤ 109).

Выходные данные

В первой и единственной строке выведите n целых чисел разделенных пробелами. i-е из них должно быть равно минимальному количеству денег, необходимых, чтобы добраться с планеты Земля до i-й планеты, или  - 1, если невозможно добраться до этой планеты.

Примечание

В первом тестовом примере, Рик покупает 4-й план единожды, далее 2-й план, чтобы добраться до планеты номер 2.

C. Большое смешивание

графы кратчайшие пути поиск в глубину и подобное *2300

Саша и Коля снова решили напиться колы. На этот раз у них есть k видов колы, i-й вид колы характеризуется концентрацией газа . Сегодня на празднике в честь Сергея Ванкуверского они решили приготовить бокал колы с концентрацией газа ровно . Чтобы напиток также был вкусным, они хотят, чтобы в бокале было целое число литров колы каждого вида (колы некоторых видов может и вовсе не быть в бокале). Кроме того, они хотят минимизировать общий объем колы в бокале.

Концентрацией газа в коле называется отношение объема газа к общему объему напитка. При смешивании объем газа в напитке равен суммарному объему газа в смешиваемых компонентах; объем напитка также равен сумме объемов напитка в смешиваемых компонентах.

Помогите Саше и Коле. Найдите минимальное натуральное количество литров колы, необходимое для получения бокала с концентрацией газа ровно . Считайте, что каждого вида колы у друзей бесконечное количество.

Входные данные

В первой строке входных данных содержится два целых числа n и k (0 ≤ n ≤ 1000, 1 ≤ k ≤ 106) — требуемая концентрация газа и количество видов колы соответственно.

Во второй строке находятся k целых чисел a1, a2, ..., ak (0 ≤ ai ≤ 1000) — концентрация газа в каждом из видов колы. Для некоторых видов колы концентрация газа может совпадать.

Выходные данные

Выведите минимальное натуральное количество литров колы, необходимое для получения бокала с концентрацией газа ровно , или -1, если это сделать невозможно.

Примечание

В первом примере мы можем получить концентрацию , используя по одному литру видов с концентрациями и : .

Во втором примере мы можем получить концентрацию , используя два литра вида , и один литр вида : .

D. Кодовый замок

битмаски дп кратчайшие пути *2800

Наконец лиса Кейл прибыла к своему замку!

Она должна ввести код для входа в свой замок. Консоль ввода, подключенная к её замку, немного необычна.

Консоль ввода — это прямоугольник размера 1 × n, разделенный на n одинаковых квадратных панелей. Они пронумерованы от 1 до n слева направо. Каждая панель имеет состояние ON (включено) или OFF (выключено). Изначально все панели выключены. Она может войти в её замок, тогда и только тогда, когда x1-я, x2-я, ..., xk-я панели находятся во включенном состоянии, а остальные панели находятся в выключенном состоянии.

Ей дан массив a1, a2, ..., al. За каждый ход она может выполнять следующую операцию: выбрать индекс i (1 ≤ i ≤ l), выбрать последовательные ai панелей, и изменить состояния выбранных ai панелей (т.е. ON → OFF, OFF → ON).

К сожалению, она забыла как набрать код, в условиях описанных правил. Помогите определить минимальное число операций, необходимых Кейл для того, чтобы войти в замок.

Входные данные

В первой строке содержится три целых числа n, k и l (1 ≤ n ≤ 10000, 1 ≤ k ≤ 10, 1 ≤ l ≤ 100), разделенных пробелами.

Во второй строке содержится k целых чисел x1, x2, ..., xk (1 ≤ x1 < x2 < ... < xk ≤ n), разделенных пробелом.

В третьей строке содержится l целых чисел a1, a2, ..., al (1 ≤ ai ≤ n), разделенных пробелом. Возможно, что некоторые элементы последовательности a совпадают.

Выходные данные

Выведите наименьшее число ходов, необходимое для того, чтобы ввести код. Если это невозможно, выведите -1.

Примечание

Один из возможных способов ввести код в первом примере: на первом ходу выбрать 1-ую, 2-ую, 3-ую панели и изменить их состояния. На втором ходу можно выбрать 5-ую, 6-ую, 7-ую, 8-ую, 9-ую панели и изменить их состояния.

B. Игорь и путь на работу

графы кратчайшие пути поиск в глубину и подобное реализация *1600

Проснувшись со звонком будильника, аналитик Игорь заспешил на работу. Совершив все необходимые утренние процедуры и позавтракав, Игорь сел в свой автомобиль. Открыв GPS-навигатор, он увидел, что в некоторых районах его родного города Банкополиса ведутся дорожные работы, поэтому они недоступны для проезда. Однако на этом неприятности Игоря не закончились: оказалось, что в его авто сломался руль, и он может совершить не более двух поворотов по пути в свой офис в банке.

Банкополис представляет из себя клетчатое поле из n строк и m столбцов. Помогите аналитику Игорю найти путь из дома в его офис, содержащий не более двух поворотов и не посещающий клетки, в которых проводятся дорожные работы, либо установить, что такого пути не существует, и Игорю придется отчитываться перед начальством за то, что он не явился на работу. Поворотом считается смена направления движения в пути. В силу своей конструкции автомобиль Игоря может двигаться только влево, вправо, вверх и вниз, изначально Игорь может выбрать любое направление движения. Игорь все еще сонный, поэтому он нуждается в вашей помощи.

Входные данные

На первой строке через пробел даны два числа n и m (1 ≤ n, m ≤ 1000)— количество строк и столбцов поля соответственно.

В каждой из последующих n строк содержится m символов, описывающих соответствующую строку поля. Возможные варианты символов:

  • «.» — свободная клетка;
  • «*» — клетка, в которой проводятся дорожные работы;
  • «S» — клетка, в которой находится дом аналитика Игоря;
  • «T» — клетка, в которой находится офис банка Игоря.

Гарантируется, что символы «S» и «T» встречаются ровно по одному разу.

Выходные данные

Выведите «YES», если существует путь от дома Игоря до его офиса, делающий не более двух поворотов, и «NO» иначе.

Примечание

Первый пример изображен на следующей картинке:

Во втором примере добраться из дома Игоря в его офис меньше чем за 4 поворота нельзя, а значит, не существует пути, использующего не больше 2-х поворотов. Путь из 4-х поворотов показан ниже:

D. Подарки в Банкополисе

графы дп кратчайшие пути *2100

Банкополис — удивительный город, в котором все n перекрестков расположены на одной прямой, пронумерованы вдоль нее от 1 до n, и на углу каждого из них есть офис банка.

Перекрестки соединены m ориентированными велосипедными дорожками (дорожка номер i ведет от перекрестка ui к перекрестку vi), для каждой дорожки известна сложность проезда по ней.

Обычный клиент банка Олег на день рождения этого самого банка решил подарить счастье и радость его работникам. Он хочет посетить ровно k отделений банка и в каждом посещенном отделении подарить всем его работникам подарки.

Проблема в том, что Олег не хочет видеть реакцию на свои подарки, поэтому он не будет пользоваться дорожкой, проходящей мимо офиса, в котором он уже раздавал подарки (формально, дорожка номер i проходит мимо офиса на перекрестке x если и только если min(ui, vi) < x < max(ui, vi))). Конечно, в каждом офисе Олег может раздавать подарки только один раз. Передвигаться Олег будет по дорожкам, причем он хочет использовать ровно k - 1 дорожку на перемещение между офисами. Олег может начать с любого офиса и закончить поздравлять в любом офисе.

Олег хочет выбрать среди всех возможных маршрутов тот, суммарная сложность дорожек в котором минимальна. Помогите ему найти эту наименьшую возможную сложность.

Входные данные

Первая строка содержит два целых числа n и k, (1 ≤ n, k ≤ 80) — количество перекрестков в Банкополисе и количество офисов, которые хочет посетить Олег.

Вторая строка содержит одно целое число m (0 ≤ m ≤ 2000) — количество велосипедных дорожек в Банкополисе.

Следующие m строк содержат информацию о дорожках.

В i-й из этих строк содержится три целых числа ui, vi и ci (1 ≤ ui, vi ≤ n, 1 ≤ ci ≤ 1000), обозначающие перекрестки, которые соединяет i-я дорожка, и ее сложность.

Выходные данные

В единственной строке выведите минимальную суммарную сложность дорожек в маршруте, или -1, если нет подходящих Олегу маршрутов.

Примечание

В первом примере Олег посещает банки по маршруту 1 → 6 → 2 → 4.

Маршрут 1 → 6 → 2 → 7 с меньшей сложностью является некорректным потому что дорожка 2 → 7 проходит мимо офиса 6 в котором Олег уже побывал.

Во втором примере Олег посещает банки по маршруту 4 → 1 → 3.

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 во второй строке.

E. Неизбежный объезд

графы дп Комбинаторика кратчайшие пути *2600

Те, кто не хотят возвращаться домой из дальнего путешествия, будут поражены болезнью улитки и потеряются. Майои, переносчик болезни, не хочет, чтобы такое случалось, но не может ничем помочь до того, как найдется лекарство. Сейчас она лишь хочет узнать, насколько сложно придется потерявшемуся.

В регионе находятся n городов, пронумерованных от 1 до n, город номер 1 является столицей. Сеть дорог образована двусторонними дорогами равной длины, каждая из которых соединяет два города. Никакие две дороги не соединяют одинаковые пары городов, и никакая дорога не соединяет город сам с собой. Потерявшиеся не могут узнать, как устроена сеть, но жители могут предоставить следующую информацию:

  • Из любого города существует ровно один кратчайший (по числу дорог) путь до столицы;
  • Пусть расстояние от города i до столицы равно li. Тогда li ≥ li - 1 выполняется для всех 2 ≤ i ≤ n;
  • К городу i подходит ровно di дорог, и это число равно либо 2, либо 3.

Подсчитайте, сколько различных сетей дорог существует с заданными ограничениями и выведите ответ по модулю 109 + 7. Две сети считаются различными, если есть пара (u, v) (1 ≤ u, v ≤ n) такая, что в одной сети есть дорога между городами u и v, а в другой такой дороги нет.

Входные данные

В первой строке находится целое число n (3 ≤ n ≤ 50) — количество городов.

Во второй строке находятся n целых чисел d1, d2, ..., dn (2 ≤ di ≤ 3) — количество дорог, подходящих к городам 1, 2, ..., n, соответственно. Гарантируется, что сумма di по всем i четна.

Выходные данные

Выведите одно число — число различных графов по модулю 109 + 7.

Примечание

В первом примере следующая сеть — единственная, удовлетворяющая ограничениям. Все расстояния из столицы до городов 2, 3, 4 равны 1.

Во втором примере следующие две сети удовлетворяют условию:

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).

C. Трасса

графы жадные алгоритмы кратчайшие пути *2400

Вы уже точно знаете, что любимый спорт Валерия — биатлон. Благодаря Вашей помощи, он уже научился стрелять без промаха, и на огневом рубеже ему нет равных. Но теперь остается дело за малым — научиться быстрее всех преодолевать маршрут.

Карта трассы представляет собой прямоугольник размером n × m разбитый на клетки. Каждая клетка помечена маленькой латинской буквой (которая означает тип участка), исключение составляют клетка-старт (она помечена заглавной латинской буквой S) и клетка-финиш (она помечена заглавной латинской буквой T). Время перехода от одной клетки к другой равно 1 минуте, временем пути внутри клетки можно пренебречь. Из клетки можно перейти только в соседние по стороне, но запрещается выходить за пределы карты. Также на маршрут накладывается ограничение — запрещается посещать более k различных типов клеток (клетки одного типа можно посещать бесконечное количество раз). Клетки, помеченные символами S и T, не имеют типа, поэтому они не считаются. Но клетка S должна быть посещена ровно один раз — в самом начале, и клетка T должна быть посещена ровно один раз — в самом конце.

Ваша задача найти кратчайший по времени маршрут из клетки S в клетку T, а из всех кратчайших маршрутов нужно выбрать лексикографически минимальный. При сравнении маршрутов лексикографически следует их представлять как последовательность символов — типов участков.

Входные данные

В первой строке входного файла заданы три целых числа n, m и k (1 ≤ n, m ≤ 50, n·m ≥ 2, 1 ≤ k ≤ 4). Далее в n строках задана карта. Каждая строка имеет длину ровно m символов и состоит из строчных латинских букв и символов S и T. Гарантируется, что карта содержит ровно один символ S и ровно один символ T.

Претест 12 является одним из максимальных тестов в этой задаче.

Выходные данные

Если существует путь, удовлетворяющий условию, выведите его как последовательность символов — типов участков, символ S в начале и символ T в конце выводить не следует. Иначе выведите «-1» (без кавычек).

Обратите внимание, что эта последовательность может быть пустой. Этот случай присутствует в претестах. Вы можете ничего не выводить или выводить один символ конца строки. Оба варианта будут засчитаны за правильный ответ.

D. Динамический кратчайший путь

графы кратчайшие пути *3400

Дан взвешенный ориентированный граф, состоящий из n вершин и m ребер. Требуется ответить на q запросов двух типов:

  • 1 v — найти длину кратчайшего пути из вершины 1 в вершину v.
  • 2 c l1 l2 ... lc — прибавить 1 к весам ребер с номерами l1, l2, ..., lc.
Входные данные

Первая строка входных данных содержит целые числа n, m, q (1 ≤ n, m ≤ 105, 1 ≤ q ≤ 2000) — число вершин и ребер в графе и число запросов, соответственно.

Следующие m строк входных данных содержат описания ребер: в i-й из них находится описание ребра с номером i — три целых числа ai, bi, ci (1 ≤ ai, bi ≤ n, 0 ≤ ci ≤ 109) — начало ребра, конец ребра и его изначальный вес, соответственно.

Следующие q строк входных данных содержат описания запросов в вышеописанном формате (1 ≤ v ≤ n, 1 ≤ lj ≤ m). Гарантируется, что внутри одного запроса все lj различны, а также что суммарное число ребер в запросах второго типа не превосходит 106.

Выходные данные

Для каждого запроса первого типа выведите строку с одним числом — длиной кратчайшего пути от 1 до v, либо -1, если такого путь не существует.

Примечание

Иллюстрация изменений графа в первом примере из условия:

Иллюстрация изменений графа во втором примере из условия:

D. Путь исследования

Бинарный поиск кратчайшие пути Паросочетания Потоки *2100

Участники Bubble Cup X собрались после соревнования и обсуждают, как лучше всего узнать страну-организатор и города в ней.

После небольшого исследования карты Сербии участники выяснили следующий факт: в стране есть V городов, которые пронумерованы от 1 до V, и E двусторонних дорог, соединяющих города. У каждой дороги есть вес (время, необходимое для прохода по этой дороге).

На Bubble Cup есть N команд, поэтому участники придумали следующий план: каждая из N команд начнет свой путь в одном из V городов, возможно, некоторые команды будут иметь одинаковую начальную позицию.

Они хотят найти минимальное время T такое, что каждая команда может двигаться в течении этих T минут, и количество различных городов, в которых окажутся команды, как минимум K (потому что они будут исследовать только город, в котором окажутся в конце). Команда не обязана двигаться все время, если им нравится какой-то город, они могут остаться в нем и подождать, пока время пройдет.

Помогите участникам определить это минимальное время T такое, что участники закончат в минимум K различных городах, или выведите -1, если решения нет.

Обратите внимание, что между некоторыми городами может быть больше одной дороги.

Входные данные

Первая строка содержит четыре целых числа: V, E, N и K (1 ≤  V  ≤  600,  1  ≤  E  ≤  20000,  1  ≤  N  ≤  min(V, 200),  1  ≤  K  ≤  N) — количество городов, количество дорог, количество команд и минимальное количество различных городов, в которых они должны закончить.

Вторая строка содержит N целых чисел — города, в которых команды начнут свой путь.

Следующие E строк содержат информацию о дорогах в следующем формате: Ai Bi Ti (1 ≤ Ai, Bi ≤ V,  1 ≤ Ti ≤ 10000), что означает, что есть дорога, соединяющая города Ai и Bi, и команде нужно Ti минут, чтобы пройти по этой дороге.

Выходные данные

Выведите единственное число — минимальное время, в течение которого команды могут двигаться, чтобы закончить в хотя бы K различных городах, или выведите -1, если решения не существует.

Если решение существует, результат будет не больше 1731311.

Примечание

В примере три команды начинают из города 5, две начинают из города 2. Если они будут двигаться 3 минуты, то возможно следующее: две команды в городе 2, одна команда в городе 5, одна команда в городе 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 секунды влево.

Оля не рекомендует пить энергетики и вообще считает, что это плохо.

D. Рыбки

графы жадные алгоритмы кратчайшие пути Структуры данных Теория вероятностей *2100

Пока Гриша встречает Новый Год в компании Деда Мороза, Миша дарит Саше небольшой прямоугольный прудик размера n × m, поделенный на клеточки размера 1 × 1, в которых обитают маленькие злобные рыбки (не более одной рыбки на клеточку, иначе они подерутся!).

Вместе с прудиком в комплекте идет квадратный сачок размера r × r, предназначенный для рыбной ловли. Так, если поместить левый нижний угол сачка клеточку с координатами (x, y), будут пойманы все рыбки в квадрате (x, y)...(x + r - 1, y + r - 1). Отметим, что в процессе сачок должен полностью находиться внутри прудика.

К сожалению, Саша совсем не искушена в благородном искусстве рыбной ловли, поэтому закидывает сачок случайным образом. Чтобы та не расстраивалась из-за плохих результатов, Миша решил выпустить в различные клеточки изначально пустого прудика k рыбок так, чтобы математическое ожидание количества пойманных сачком рыбок было бы максимально. Помогите ему этого достигнуть и обрадовать Сашу! А именно, расположите k рыбок в различных клетках так, чтобы при забрасывании сачка в случайное из (n - r + 1)·(m - r + 1) положений среднее количество рыбок в сачке было максимально возможным.

Входные данные

В единственной строчке заданы четыре целых числа — n, m, r, k (1 ≤ n, m ≤ 105, 1 ≤ r ≤ min(n, m), 1 ≤ k ≤ min(n·m, 105)).

Выходные данные

Выведите одно число — максимально возможное математическое ожидание числа пойманных рыбок.

Ваш ответ будет зачтен, если его относительная или абсолютная ошибка не превосходит 10 - 9. А именно, пусть ваш ответ равен a, а ответ жюри — b. Ваш ответ будет зачтен, если .

Примечание

В первом примере можно выпустить рыбок в клетки (2, 1), (2, 2), (2, 3). В таком случае для любой из четырех возможных конфигураций сачка (выделены салатовым) количество рыбок внутри будет равняться двум, как и математическое ожидание.

E. Логическое выражение

битмаски дп кратчайшие пути *2400

Вам дана булева функция от трех переменных, заданная своей таблицей истинности. Требуется построить минимальное по длине выражение, равное этой функции. Выражение может содержать:

  • Операцию И ('&', ASCII код 38)
  • Операцию ИЛИ ('|', ASCII код 124)
  • Операцию НЕ ('!', ASCII код 33)
  • Переменные x, y и z (ASCII коды 120-122)
  • Круглые скобки ('(', ASCII код 40, и ')', ASCII код 41)

Если выражений несколько, требуется найти лексикографически минимальное.

Операции имеют стандартный приоритет: самый большой приоритет у НЕ, затем идет И, а самый маленький приоритет у ИЛИ. Формально, выражение должно удовлетворять следующей грамматике:

E ::= E '|' T | T

T ::= T '&' F | F

F ::= '!' F | '(' E ')' | 'x' | 'y' | 'z'

Входные данные

В первой строке дано одно целое число n — количество функций, для которых нужно найти ответ (1 ≤ n ≤ 10 000).

В следующих n строках дано описание функций, в i-й строке дана строка длины 8, состоящая из символов 0 и 1 — таблица истинности i-й функции. Символ на позиции j (0 ≤ j < 8) означает, что должна возвращать функция, если ей на вход подать , и .

Выходные данные

Выведите n строк, в i-й должно содержаться выражение минимальной длины, равное i-й функции. Если выражений минимальной длины несколько, нужно вывести лексикографически минимальное. Выражения должны удовлетворять грамматике из условия и не должны содержать пробельных символов.

Примечание

Таблица истинности для второй функции:

C. Джейми и интересный граф

графы Конструктив кратчайшие пути *1600

Джейми называет неориентированный взвешенный граф интересным если он обладает следующими свойствами:

  • Граф связен и содержит ровно n вершин и m рёбер.
  • Все веса рёбер — целые числа и принадлежат отрезку [1, 109].
  • Вес кратчайшего пути из вершины 1 в n является простым числом.
  • Сумма весов рёбер в минимальном остовном дереве графа является простым числом.
  • Граф не содержит петель и кратных рёбер.

В разделе «Примечание» содержатся описания терминов выше.

Помогите Джейми найти какой-нибудь интересный граф.

Входные данные

В первой строке содержатся два целых числа n и m  — требуемое количество вершин и рёбер.

Выходные данные

В первой строке выведите два целых числа sp, mstw (1 ≤ sp, mstw ≤ 1014) — вес кратчайшего пути и сумма весов рёбер в минимальном остовном дереве найденного графа.

В следующих m строках выведите рёбра графа. В каждой строке выведите три целых числа u, v, w (1 ≤ u, v ≤ n, 1 ≤ w ≤ 109) обозначающие ребро между вершинами u и v и имеющее вес w.

Примечание

Граф из первого тестового примера: Последовательность вершин в кратчайшем пути: {1, 2, 3, 4}. Рёбра минимального остовного дерева обозначены звёздочкой (*).

Определения терминов из условия:

Кратчайший путь в неориентированном графе — это последовательность вершин (v1, v2, ... , vk) такая, что существует ребро между vi и vi + 1 1 ≤ i < k и сумма весов минимальна, где w(i, j) — это вес ребра между вершинами i и j. (https://ru.wikipedia.org/wiki/Задача_о_кратчайшем_пути)

Простое число — это целое число, большее 1, такое, что у него нет положительных делителей отличных от 1 и этого числа. (https://ru.wikipedia.org/wiki/Простое_число)

Минимальное остовное дерево графа — это подмножество рёбер связного, неориентированного, взвешенного графа, соединяющее все вершины, не имеющее циклов и имеющее минимальную возможную сумму весов рёбер, в него входящих. (https://ru.wikipedia.org/wiki/Минимальное_остовное_дерево)

(https://ru.wikipedia.org/wiki/Кратные_рёбра)

F. Игра с числами

графы игры кратчайшие пути *2600

Представим, что Алиса играет в карточную игру со своим другом Бобом. У каждого из них есть ровно \(8\) карт, и на каждой карте есть целое число от \(0\) до \(4\). На каждом ходу Алиса или Боб по очереди выбирают две карты, по одной у каждого, пусть это будут карты \(a\) и \(b\), где \(a\) — число на карте игрока, совершающего ход, а \(b\) — число на карте соперника. Необходимо, чтобы \(a \cdot b \ne 0\). Затем игрок вычислает \(c = (a + b) \bmod 5\) и заменяет число \(a\) на \(c\). Игрок, который первым получит \(0\) на всех своих \(8\) картах, побеждает.

Теперь Алиса хочет узнать, кто выигрывает при каких начальных условиях. Она даст вам числа на ее картах, числа на картах Боба, и кто будет ходить первым. Ваша задача — узнать, кто выигрывает, если оба играют оптимально.

Входные данные

Первая строка содержит одно целое число \(T\) (\(1 \leq T \leq 100\,000\)), обозначающее число ситуаций, которые вам надо рассмотреть.

Далее описываются эти \(T\) ситуаций. Для каждой ситуации:

  • Первая строка содержит неотрицательное число \(f\) (\(0 \leq f \leq 1\)), где \(f = 0\) означает, что Алиса ходит первой, а \(f = 1\) означает, что первым ходит Боб.
  • Вторая строка содержит \(8\) неотрицательных целых чисел \(a_1, a_2, \ldots, a_8\) (\(0 \leq a_i \leq 4\)), описывающих карты Алисы.
  • Третья строка содержит \(8\) неотрицательных целых чисел \(b_1, b_2, \ldots, b_8\) (\(0 \leq b_i \leq 4\)), описывающих карты Боба.

Гарантируется, что, если \(f=0\), то \(\sum_{i=1}^{8}a_i \ne 0\). Если \(f=1\), то \(\sum_{i=1}^{8}b_i \ne 0\).

Выходные данные

Выведите \(T\) строк. Для каждой ситуации определите, кто выигрывает. Выведите

  • «Alice» (без кавычек), если выигрывает Алиса.
  • «Bob» (без кавычек), если выигрывает Боб.
  • «Deal» (без кавычек), если никто не сможет выиграть.
Примечание

В первой ситуации у Алисы на всех картах нули \(0\). Она мгновенно выигрывает.

Во второй ситуации Боб выбирает числа \(4\) и \(1\). Так как \((4 + 1) \bmod 5 = 0\), Боб выигрывает после этого хода.

В третьей ситуации, Алиса выбирает числа \(1\) и \(4\). Она выигрывает после этого хода.

В четвертой ситуации можно доказать, что игра зайдет в цикл.

D. Покупка билетов

графы кратчайшие пути Структуры данных *2000

Участники популярной музыкальной группы «Flayer» объявили о своем прощальном мировом турне. Разумеется, посетят они и Берляндию.

В Берляндии n городов. Между городами можно перемещаться, используя двусторонние железнодорожные маршруты; есть ровно m маршрутов, i-й используется для поездки из города vi в город ui (и из ui в vi) и стоит wi монет.

«Flayer» посетят все города, в i-м городе цена билета на концерт составит ai монет.

У вас есть друзья в каждом городе Берляндии, и все знают о ваших программистских способностях! Они просят вас посчитать, за какое минимальное количество монет им удастся посетить концерт. Для каждого города i необходимо посчитать минимальное количество монет, которое придется потратить жителю города i, чтобы доехать до какого-либо города j (или остаться в городе i), посетить там концерт, и вернуться в город i (если j ≠ i).

Формально, для каждого требуется посчитать , где d(i, j) — минимальное количество монет, нужных для поездки из города i в город j. Если невозможно приехать в город j из города i, то d(i, j) считается бесконечно большим.

Входные данные

В первой строке записано два целых числа n и m (2 ≤ n ≤ 2·105, 1 ≤ m ≤ 2·105).

Затем идет m строк, в i-й записаны три целых числа vi, ui и wi (1 ≤ vi, ui ≤ n, vi ≠ ui, 1 ≤ wi ≤ 1012), определяющие i-й железнодорожный маршрут. Между каждой парой городов существует не больше одного железнодорожного маршрута, то есть, для каждой пары (v, u) во входных данных нет ни (u, v), ни дополнительных вхождений (v, u).

В следующей строке записаны n целых чисел a1, a2, ... ak (1 ≤ ai ≤ 1012) — цена билета на концерт в городе i.

Выходные данные

Выведите n целых чисел. i-е из них должно быть равно минимальному количеству монет, которое придется потратить жителю города i для того, чтобы доехать до какого-либо города j (или остаться в городе i), посетить там концерт, и вернуться в город i (если j ≠ i).

C. Волейбол

кратчайшие пути *1900

Петя очень любит волейбол. Однажды он опаздывал на волейбольный матч. Свою собственную машину Петя еще не купил, поэтому ему пришлось ехать на такси. В городе n перекрестков, некоторые из которых соединены двусторонними дорогами. Длина каждой дороги выражается некоторым натуральным числом метров, дороги могут иметь разные длины.

Изначально на каждом перекрестке стоит ровно одно такси. Таксист с i-го перекрестка согласен проехать (возможно, через несколько других перекрестков) не более ti метров и остановиться на каком-то другом перекрестке. Причем цена поездки не зависит от расстояния и равна ci бурлей. Посреди дороги такси останавливаться не могут. Каждое такси можно использовать не более 1 раза. В такси можно сесть только в перекрестке, где оно изначально расположено.

Сейчас Петя находится на перекрестке x, а волейбольный стадион — на перекрестке y. Определите, какая минимальная сумма денег потребуется Пете чтобы доехать до стадиона.

Входные данные

В первой строке заданы два целых числа n и m (1 ≤ n ≤ 1000, 0 ≤ m ≤ 1000) — количество перекрестков и дорог в городе соответственно. Перекрестки нумеруются от 1 до n включительно. В следующей строке заданы два целых числа x и y (1 ≤ x, y ≤ n) — номер начального и конечного перекрестков соответственно. В последующих m строках содержится описание дорог. Каждая дорога описывается тройкой целых чисел ui, vi, wi (1 ≤ ui, vi ≤ n, 1 ≤ wi ≤ 109) — соответственно начальный перекресток, конечный перекресток и длина. В следующих n строках заданы n пар целых чисел ti и ci (1 ≤ ti, ci ≤ 109), описывающих таксиста, стоящего на i-ом перекрестке — максимальное расстояние, которое он может проехать, и цена за поездку. Дорога не может соединять перекресток сам с собой, но между парой перекрестков может быть больше одной дороги. Все числа в строках отделяются друг от друга ровно одним пробелом.

Выходные данные

Если Петя не может доехать на такси, выведите «-1» (без кавычек). Иначе выведите минимальную стоимость поездки.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Примечание

Оптимальный путь - поехать из перекрестка 1 к 2 (через 4), потом из 2 в 3. На это потратится 7+2=9 бурлей.

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.

C. Выигрышная cтратегия

Бинарный поиск графы кратчайшие пути математика *2400

В одном университете совсем недавно узнали о существовании соревнования по спортивному программированию под названием ACM ICPC v2.0. Данное соревнование мало чем отличается от всем известного ACM ICPC, например, в финале соревнования участникам запрещается участвовать более двух раз. Однако, есть одно существенное отличие: команды в этом состязании должны состоять ровно из n участников.

Поучаствовав в нескольких финалах ACM ICPC v2.0 и не добившись ни одной медали, студенты и руководство университета поняли, что настало время изменить что-то в процессе подготовки. В частности, в качестве первой инновации было решено изменить процесс формирования команд. Потратив немалое количество времени на изучение статистики выступлений других университетов, удалось получить некоторую интересную информацию: вероятность получения медали в зависимости от количества членов команды, побывавших на финале ранее. Более формально, известно n + 1 действительных чисел p0 ≤ p1 ≤ ... ≤ pn, где pi — вероятность получения медали на финале, если в команде присутствуют i участников прошлых финалов, а остальные n - i участников приехали на финал впервые.

Несмотря на такие полезные данные, руководство университета не в состоянии определить такую тактику формирования команд, которая обеспечит максимальную вероятность получения медали на финале ACM ICPC v2.0 в среднем (подразумевается, что мы хотим обеспечить такой результат на далекое будущее и обладаем бесконечным ресурсом студентов). А сможете ли вы предложить такую оптимальную тактику? На первом этапе руководству университета достаточно знать лишь значение максимальной средней вероятности.

Более формально: пусть в k-ый год участия университет послал на финал команду, в которой было ak участников финалов прошлых лет (0 ≤ ak ≤ n). Так как один человек может участвовать в финале не более двух раз, должно выполняться условие: . Ваша задача — выбрать последовательность таким образом, что предел Ψ существует и его значение максимально:

Так как — бесконечная последовательность, вывести требуется только максимальное значение предела Ψ.

Входные данные

В первой строке задано целое число n (3 ≤ n ≤ 100), n — количество участников команды. Во второй строке заданы n + 1 действительных чисел, с не более чем 6-ю знаками после десятичной точки, pi (0 ≤ i ≤ n, 0 ≤ pi ≤ 1) — вероятность того, что команда сможет выиграть медаль, если в ее состав входят i участников, побывавших на финале ранее. Также выполняется условие, что pi ≤ pi + 1 для всех 0 ≤ i ≤ n - 1.

Выходные данные

Выведите одно единственное действительное число — ожидаемое среднее количество выигранных медалей в год, при использовании оптимальной стратегии. Для ответа допустима абсолютная или относительная погрешность 10 - 6.

Примечание

Во втором тесте, из каких бы участников не состояла команда, она обречена на успех.

C. Лифт

графы дп кратчайшие пути *2400

Вы работаете в большом офисе, которое представляет из себя 9-этажное здание с одним лифтом, вмещающим 4 человека. В ваши обязанности входит управлять этим лифтом.

Сегодня вы опоздали на работу, и у лифта уже выстроились очереди на разных этажах. Про каждого человека известно, на каком этаже он сейчас находится и на какой этаж хочет попасть. Также известен порядок, в котором люди подходили к лифту.

По правилам компании, если сотрудник подошел к лифту раньше другого, то он должен оказаться внутри лифта раньше (даже если они находятся на разных этажах). Выходить сотрудники могут в любом порядке.

У лифта есть две команды:

  • Проехать на один этаж вверх/вниз. На перемещение тратится 1 секунда.
  • Открыть двери на этаже. После этого все сотрудники, которым нужно выйти на этом этаже выйдут из лифта. После этого сотрудники, находящиеся на этаже, начнут заходить в лифт в порядке очереди, пока это не противоречит правилам и в лифте достаточно места. Люди заходят и выходят последовательно, каждый тратит 1 секунду на вход или выход.

Изначально лифт находится на 1 этаже.

Вам интересно, сколько нужно времени, чтобы доставить всех сотрудников на нужные этажи. Не обязательно возвращать лифт на 1 этаж.

Входные данные

В первой строке дано целое число n (1 ≤ n ≤ 2000) — число сотрудников в очереди.

i-я из следующих n строк содержит два целых числа ai и bi (1 ≤ ai, bi ≤ 9, ai ≠ bi) — этаж, на котором находится сотрудник, и этаж, на который он хочет попасть.

Сотрудники даны в порядке, в котором они подходили к лифту.

Выходные данные

Выведите одно целое число — минимальное время в секундах.

Примечание
Пояснение к первому примеру t = 0

t = 2

t = 3

t = 5

t = 6

t = 7

t = 9

t = 10

A. Ярмарка

графы жадные алгоритмы кратчайшие пути теория чисел *1600

В Байтландии собираются провести ярмарку. В Байтландии \(n\) городов, которые соединены \(m\) двухсторонними дорогами, причём из любого города можно доехать до любого другого, передвигаясь только по дорогам.

В Байтландии производят \(k\) различных товаров, причём каждый город специализируется на одном товаре. Чтобы ярмарка состоялась, на неё нужно привезти хотя бы \(s\) различных товаров. Чтобы привезти товары из города \(u\) в город \(v\) нужно потратить \(d(u,v)\) монет, где \(d(u,v)\) — длина кратчайшего пути между городами \(u\) и \(v\). Длина пути — это количество дорог, которые входят в этот путь.

Организаторы ярмарки оплатят перевозку товаров, однако они сами могут выбрать, производителей из каких городов пригласить на ярмарку. Теперь организаторы хотят для каждого из \(n\) городов посчитать, какое минимальное количество монет нужно потратить на перевозку товаров, чтобы провести ярмарку в этом городе.

Входные данные

В первой строке записаны \(4\) целых числа \(n\), \(m\), \(k\), \(s\) (\(1 \le n \le 10^{5}\), \(0 \le m \le 10^{5}\), \(1 \le s \le k \le min(n, 100)\)) — количество городов, количество дорог, количество различных товаров, количество различных товаров необходимых для проведения ярмарки.

В следующей строке записаны \(n\) чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_{i} \le k\)), где \(a_i\) — номер товара, который производится в \(i\)-м городе. Гарантируется, что среди чисел \(a_{i}\) встречаются все числа от \(1\) до \(k\).

В следующих \(m\) строках описываются дороги. Каждая дорога описывается парой \(u\) \(v\) городов, которые она соединяет (\(1 \le u, v \le n\), \(u \ne v\)). Гарантируется, что между любой парой городов не более одной дороги. Гарантируется, что можно доехать из любого города в любой, двигаясь только по дорогам.

Выходные данные

Выведите \(n\) чисел, \(i\)-е из которых — минимальное количество монет на перевозку товаров при проведении ярмарки в городе \(i\). Разделяйте числа пробелами.

Примечание

Рассмотрим первый пример.

Чтобы провести ярмарку в городе \(1\), можно привезти товары из городов \(1\) (\(0\) монет), \(2\) (\(1\) монета) и \(4\) (\(1\) монета). Суммарное количество монет равно \(2\).

Город \(2\): Товары из городов \(2\) (\(0\)), \(1\) (\(1\)), \(3\) (\(1\)). Сумма \(2\).

Город \(3\): Товары из городов \(3\) (\(0\)), \(2\) (\(1\)), \(4\) (\(1\)). Сумма \(2\).

Город \(4\): Товары из городов \(4\) (\(0\)), \(1\) (\(1\)), \(5\) (\(1\)). Сумма \(2\).

Город \(5\): Товары из городов \(5\) (\(0\)), \(4\) (\(1\)), \(3\) (\(2\)). Сумма \(3\).

F. Oppa Funcan Style Remastered

графы кратчайшие пути математика теория чисел *3300

Наверняка вы видели безумные клипы южнокорейского рэпера PSY, такие как «Gangnam Style», «Gentleman» и «Daddy». Вы также могли слышать, что PSY пару лет назад записывал клип «Oppa Funcan Style» (к сожалению, мы не смогли найти этот клип на просторах сети; мы не исключаем, что виноват Ромкоснадзор). Мы напомним вам, как выглядел этот хит (оригинальное описание можно прочитать здесь).

На площадке есть \(n\) платформ, пронумерованных целыми числами от \(1\) до \(n\), на \(i\)-й платформе стоит танцор с номером \(i\). Далее, каждую секунду все танцоры, стоявшие на платформе с номером \(i\), перепрыгивают на платформу с номером \(f(i)\). Правило перемещения \(f\) выбирается заранее и не меняется на протяжении клипа.

Продолжительность клипа составляла \(k\) секунд, и правило \(f\) было выбрано таким образом, чтобы в конце клипа (через \(k\) секунд) все танцоры оказались на своих изначальных местах (то есть танцор номер \(i\) должен оказаться на платформе с номером \(i\)). Это позволило зациклить клип и собрать ещё больше лайков.

PSY знает, что сейчас всё большую популярность набирают улучшенные версии старых произведений искусства, поэтому он решил выпустить remastered-версию своего клипа двухлетней давности.

В данном случае «улучшенная версия» подразумевает ещё больше безумия, и количество платформ может достигать \(10^{18}\)! Однако режиссёр клипа говорит, что если какой-то танцор будет оставаться на одной и той же платформе, то зритель заскучает и сразу выключит клип. Поэтому для всех \(x\) от \(1\) до \(n\) должно быть выполнено \(f(x) \neq x\).

Немалая часть успеха классического клипа была в том, что его удалось зациклить, поэтому для remastered-версии это также должно быть выполнено.

PSY ещё не определился с точным количеством платформ и продолжительностью клипа, поэтому он просит вас для разных вариантов определить, существует ли подходящее правило \(f\).

Входные данные

В первой строке записано одно число \(t\) — количество вариантов \(n\) и \(k\), которые необходимо проверить (\(1 \le t \le 10^{4}\)).

В следующих \(t\) строках записаны сами варианты: два числа \(n\) и \(k\) (\(1 \le n \le 10^{18}\), \(1 \le k \le 10^{15}\)) — количество платформ и длительность ролика в секундах.

Гарантируется, что количество различных \(k\) в одном тесте не превосходит \(50\).

Выходные данные

Выведите \(t\) строк — если \(i\)-й вариант клипа осуществим, выведите в \(i\)-й строке «YES» (без кавычек), иначе выведите «NO» (без кавычек).

1260

кратчайшие пути

 На схеме нарисованы дороги между четырьмя населенными пунктами A, B, C, D и указаны протяженности данных дорог.

Определите, какие два пункта наиболее удалены друг от друга (при условии,что передвигаться можно только по указанным на схеме дорогам). В ответе укажите кратчайшее расстояние между этими пунктами.
1) 9     2) 13     3) 15     4) 17

Cow Routing

кратчайшие пути

Беси устала от холодной зимы и решила выбраться на каникулах в
местечко потеплее. К несчастью коров перевозит только Air Bovinia.

Air Bovinia имеет N самолётов (1 <= N <= 1000), каждый из которых
летает по специфическому маршруту, состоящему
из двух или более городов. Например, самолёт может
лететь по маршруту, который начинается в городе 1,
затем летит в город 5. затем в город 2, и потом
в город 8. Никакой город не появится в этом маршруте 2 или
более раз. Если Беси выбрала маршрут, она может сесть на самолёт
в любом городе маршрута и выйти из самолёта
в любом городе маршрута. Например, она не обязана садиться
в первом городе маршрута а выходить в последнем городе
маршрута. Каждый маршрут имеет свою цену и Беси
должна платить её всю вне зависимости от количества городов,
которые она посетит на маршруте. Если Беси
использует некоторый маршрут несколько раз за время
путешествия (то есть, она покидает маршрут,
и позднее возвращается на него из другого города), она должна
платить за каждый раз когда она использует маршрут.

Беси хочет определить самый дешёвый способ пропутешествовать
от её фермы (города A) до выбранного «тёплого местечка»
(города B). Пожалуйста, помогите ей определить минимальную
цену, которую она должна заплатить и также минимальное
количество разных полётов, которые она должна использовать,
чтобы достичь этой минимальной цены.

Формат входных данных

Первая строка ввода содержит A,B, N, разделённые одиночными
пробелами.

Следующие 2N строк описывают доступные маршруты, по две строки
на маршрут. Первая строка содержит стоимость маршрута (целое
число в диапазоне 1.. 1,000,000,000) и количество
городов на маршруте (целое число в диапазоне 1..100).
Вторая строка содержит список городов в порядке следования
по маршруту. Каждый город обозначается целым числом в
диапазоне 1..1000.

Рекомендуется использовать 64-битные целые.

Формат выходных данных

Выведите минимальную цену путешествия Беси из города A в город B,
а также минимальное количество полётов, требующихся для достижения
этой минимальной цены. Если решение не существует, выводите -1 -1

Meeting Time

кратчайшие пути

Беси и её сестра Эльза хотят путешествовать от амбара
к любимому полю, так чтобы уходит в одно и то же время от
амбара и приходить в одно и то же время к любимому полю.

Ферма представляет собой N полей (1 <= N <= 16), пронумерованных
от 1 до N, где поле 1 – амбар, а поле N – любимое поле.

Ферма построена на склоне холма и поле X будет выше, чем поле Y,
если X каждая дорожка довольно крутая, можно двигаться только вниз.
Например, по дорожке, соединяющей поля 5 и 8 можно двигаться
только от поля 5 к полю 8 и нельзя в противоположном направлении.
Каждая пара полей соединена не более чем одной дорожкой, поэтому
M <= N(N-1)/2.

Беси и Эльза тратят разное количество времени на прохождение
дорожек. Например, Беси нужно 10 единиц времени, чтобы пройти
некоторую дорожку, а Эльзе – 20. Кроме того, они всегда проходят
поля за нулевое время.

Пожалуйста, помогите определить минимальное время, которое
потребуется Беси и Эльзе чтобы достичь любимого поля в один
и тот же момент времени.

Формат входных данных

Первая строка ввода содержит N и M, разделённые одиночным
пробелом.

Каждая из последующих M строк описывает некоторую дорожку
четырьмя целыми числами A B C D, где A и B (A соединённые дорожкой, C – время, требуемое Беси на прохождение
этой дорожки. D – время, требуемое Эльзе на прохождение этой
дорожки. C и D оба в диапазоне 1..1000.

Вывод (файл meeting.out)
Одно целое число, минимальное время, требуемое Беси и Эльзе
чтобы придти на любимое поле в одно и то же время. Если невозможно,
чтобы Беси и Эльза пришли в одно и то же время, выведите IMPOSSIBLE.

Примечание
Беси в два раза быстрее Эльзы на каждой дорожке,
поэтому если Беси пойдёт по пути 1->2->3, а Эльза – по пути 1->3,
они придут в одно и то же время.

Cow Routing II

графы кратчайшие пути реализация

Устав от холодной зимы Беси хочет на каникулах слетать туда, где потеплее.
Билеты коровам продаёт только Air Bovinia.

Air Bovinia имеет N самолётов (1 <= N <= 500), каждый из которых летит
по специфическому маршруту, состоящему из двух или более городов.
Например, самолёт может стартовать в городе 1, затем лететь в город 5,
затем лететь в город 2, затем лететь в город 8 (конечную точку маршрута).
Никакой город не появляется в маршруте два или более раз. Если Беси
выбрала маршрут, она может сесть на него в любом городе этого маршрута
и выйти из него в любом из последующих городов этого маршрута. Она не
обязана садиться в первом городе, а выходить в последнем городе этого
маршрута. Каждый маршрут имеет определённую цену, которую Беси должна
заплатить, если она использует любую часть маршрута, не зависящую от
количества городов, которые она посетит вдоль маршрута. Также Беси
имеет право использовать один маршрут только один раз, это означает,
что она не может использовать маршрут, а затем позже использовать другую
часть этого же маршрута.

Беси хочет найти самый дешёвый способ добраться от своей фермы (город A)
до своего "тёплого местечка" (город B). Она хочет использовать не более
чем два маршрута. Помогите ей определить минимальную цену путешествия.

Заметим, что единственное отличие этой задачи от предыдущей в том, что Беси
может использовать до двух маршрутов, в отличие от ровно одного маршрута
в предыдущей задаче.

Формат входных данных

Первая строка ввода содержит A, B, N разделённые одиночными пробелами.
Следующие 2N строк описывают доступные маршруты, по две строки на маршрут.
Первая строка содержит стоимость маршрута (целое число в интервале от 1 до 1000)
и количество городов в этом маршруте (целое число от 1 до 500). Вторая
строка содержит список городов в порядке следования в этом маршруте.
Каждый город идентифицируется целым числом в диапазоне от 1 до 10,000.

Формат выходных данных

Выведите минимальную цену путешествия из A в B, использующего не более
чем два маршрута. Если такого решения нет, выведите -1.

Примечание

Используя маршрут 2 добираемся от города 1 до города 3, а затем с помошью
маршрута 1 путешествуем из города 3 в город 2.

Cowreography

кратчайшие пути

п»ї

Коровы сформировали танцевальную команду, а Фермер Джон их хореограф. Последний и самый большой танец включает \(N\) коров (\(2 \le N \le 10^6\)), стоящих в ряд. Каждое движение в танце вовлекает две коровы на расстоянии до \(K\) позиций друг от друга (\(1 \le K < N\)) грациозно прыгающих и приземляющихся в каждой другой позиции.

�меется два типа коров в этом ряду Guernseys и Holsteins. Поэтому ФД задокументировал танец как последовательность двоичных строк длины \(N\) , где a \(0\) представляет Guernsey, a \(1\) представляет Holstein, и вся строка представляет как коровы расположены в ряду.

К несчастью Фермер Нхой (хореограф команды соперников) стёр все строки кроме первой и последней. Поскольку скоро состоится соревнование, ФД должен, не теряя времени, реконструировать танец.

Вам даны две двоичные строки, помогите ФД определить минимальное количество движений в танце.

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка содержит \(N\) и \(K\).

Вторая строка содержит первую двоичную строку.

Третья строка содержит последнюю двоичную строку.

Гарантируется, что обе двоичные строки содержат одинаковое количество единиц.

ФОРМАТ ВЫВОДА (на экран / stdout):

Минимальное количество движений в танце.

ПР�МЕР ВВОДА:

4 1
0111
1110

ПР�МЕР ВЫВОДА:

3

Один возможный танец:

0111 -> 1011 -> 1101 -> 1110

ПР�МЕР ВВОДА:

5 2
11000
00011

ПР�МЕР ВЫВОДА:

3

Один возможный танец:

11000 -> 01100 -> 00110 -> 00011

ПР�МЕР ВВОДА:

5 4
11000
00011

ПР�МЕР ВЫВОДА:

2

Один возможный танец:

11000 -> 10010 -> 00011

ОЦЕН�ВАН�Е:

  • Тесты 4-5: \(K=1\)
  • Тесты 6-7: РћР±Рµ строки имеют РЅРµ более чем \(8\) единиц.
  • Тесты 8-15: \(N\le 5000\)
  • Тесты 16-23: Нет дополнительных ограничений.

Problem credits: Benjamin Qi

Walking Along a Fence

кратчайшие пути

Каждая из \(N\) коров (\(1 \leq N \leq 10^5\)) Фермера Джона любит ежедневно прогуливаться вдоль изгороди вокруг пастбища.

Изгородь состоит из \(P\) столбов (\(4 \leq P \leq 2\cdot 10^5\), \(P\) чётное), расположение каждого из них имеет координаты \((x,y)\) на карте фермы (\(0 \leq x, y \leq 1000\)). Каждый столб соединяется с двумя соседними столбами либо горизонтальным, либо вертикальным отрезком. Таким образом вся изгородь может рассматриваться как многоугольник стороны которого параллельны осям координат x или y. Последний столб соединён с первым, поэтому получается замкнутый многоугольник вокруг пастбища. Отрезки изгороди могут пересекаться только в конечных точках, каждый столб принадлежит ровно двум конечным точкам отрезков, и каждые два отрезка, которые имеют общую точку, перпендикулярны.

Каждая корова имеет предпочтительные стартовую и конечную позиции прогулки, которые являются точками где-то вдоль изгороди (возможно в столбе, возможно нет) Каждая корова совершает свою ежедневную прогулку начиная со своей стартовой позиции и заканчивая в своей конечной позиции. Имеется два маршрута, которые корова может выбрать, поскольку изгородь представляет замкнуты цикл. Поскольку коровы ленивы, каждая корова идёт вдоль изгороди в направлении, которое обеспечивает кратчайший путь из начальной точки в конечную. Если оба пути одинаковы, корова может выбрать любое направлении.

Определите расстояние, которое пройдёт каждая корова.

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка ввода содержит \(N\) и \(P\). Каждая из последующих \(P\) строк содержит два целых числа, представляющих позиции столбов изгороди в порядке её обхода по часовой стрелке или против часовой стрелки. Каждая из последующих \(N\) строк содержит 4 целых числа \(x_1\) \(y_1\) \(x_2\) \(y_2\) представляющих стартовую позицию \((x_1, y_1)\) и конечную позицию \((x_2, y_2)\) каждой коровы.

ФОРМАТ ВЫВОДА (на экран / stdout):

Выведите \(N\) целых чисел, задающих расстояние, которое пройдёт каждая корова.

Bessla Motors

кратчайшие пути

**Замечание: время на тест в этой задаче 3 сек, в 1.5 раза больше чем по умолчанию. Память на тест 512 Мбт, что в два раза больше чем по умолчанию.

Фермер Джон хочет продвинуть свою линию электрических тракторов, создав рекламную сеть электрозарядных станций. Он подготовил \(N\) (\(2\le N\le 5\cdot 10^4\)) интересных точек, пронумеровав их \(1\dots N\), из которых первые \(C\) (\(1\le C < N\)) это зарядные станции, а оставшиеся - станции для посещения во время рекламного путешествия. Эти интересные точки соединены (\(1\le M\le 10^5\)) двунаправленными дорогами, \(i\)-ая из которых соединяет различные точки \(u_i\) и \(v_i\) (\(1\le u_i, v_i\le N\)) и имеет длину \(\ell_i\) миль (\(1\le\ell_i\le 10^9\)).

Электротрактор может путешествовать \(2R\) миль (\(1\le R\le 10^9\)) на одной зарядке, позволяя достичь любую точку в пределах \(R\) миль от зарядной станции. Точка назначения считается хорошо-связной, если она достижима не менее чем из \(K\) (\(1\le K\le 10\)) различных зарядных станций. Ваша задача - помочь ФД определить множество хорошо связных точек назначения.

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка содержит пять разделённых одиночными пробелами целых чисел \(N\), \(M\), \(C\), \(R\), \(K\). Каждая из последующих \(M\) строк содержит три разделённых одиночными пробелами целых чисел: \(u_i\), \(v_i\), \(\ell_i\) (\(u_i\neq v_i\)).

Зарядные станции помечены номерами \(1, 2, \ldots, C\). Оставшиеся точки это интересные места для посещения.

ФОРМАТ ВЫВОДА (на экран / stdout):

Сначала выведите количество хорошо связных точек назначения в одной строке. Затем выведите сами хорошо связные точки назначения в возрастающем порядке, каждую на отдельной строке.

Tractor Paths

графы кратчайшие пути реализация

**Замечание: Время на тест в этой задаче 4s, в два раза больше чем по умолчанию. Ограничение по памяти для этой задачи 512MB, в два раза больше чем по умолчанию.**

У Фермера Джона \(N\) (\(2\le N\le 2\cdot 10^5\)) тракторов, где -ый трактор может использоваться только в интервале \([l_i,r_i]\) включительно. Интервалы для тракторов имеют левые конечные точки \(\ell_1<\ell_2<\dots<\ell_N\) и правые конечные точки \(r_1<r_2<\dots<r_N\). Некоторые из тракторов специальные.

Два трактора \(i\) и \(j\) называются соседними если \([\ell_i,r_i]\) и \([\ell_j,r_j]\) пересекаются. ФД может перебраться (выполнить трансфер) с одного трактора на любой соседний трактор. Путь между двумя тракторами \(a\) и \(b\) состоит трансферов таких, что первый трактор в последовательности есть \(a\), последний трактор в последовательности есть \(b\) и каждые два трактора в последовательности соседние. Гарантируется ,что имеется путь из трактора \(1\) в трактор \(N\). Длина пути - количество трансферов (или эквивалентно, количество тракторов минус один).

Вам даётся \(Q\) (\(1\le Q\le 2\cdot 10^5\)) запросов, каждый указывает пару тракторов \(a\) и \(b\) (\(1\le a<b\le N\)). Для каждого запроса выведите два целых числа:

  • Длину любого кратчайшего пути между тракторами \(a\) и \(b\).
  • Количество специальных тракторов, таких, что существует как минимум один кратчайший путь из трактора \(a\) в трактор \(b\), содержащий его.

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка содержит \(N\) и \(Q\).

Следующая строка содержит строку длины \(2N\), содержащую символы L и R, представляющие левые и правые конечные точки в отсортированном порядке. Гарантируется, что для каждого префикса этой строки количество символов L превышает количество символов R.

Следующая строка содержит битовую строку длины \(N\), представляющую для каждого трактора, является он специальным или нет.

Каждая из следующих \(Q\) строк содержит два целых числа \(a\) и \(b\), описывающих запрос.

ФОРМАТ ВЫВОДА (на экран / stdout):

Для каждого запроса выведите два числа, разделённых пробелом.

Moo Route II

кратчайшие пути

**Замечание: Время на тест в этой задаче 4 сек, в два раза больше времени на тест по умолчанию.**

Беси на каникулах, она может путешествовать во времени, И нет проблем если две версии Беси встретятся.

В этой стране имеется \(N\) аэропортов, пронумерованных \(1, 2, \ldots, N\) и \(M\) полётов во времени (\(1\leq N, M \leq 200000\)). Полёт \(j\) вылетает из аэропорта \(c_j\) в момент времени \(r_j\), и прибывает в аэропорт \(d_j\) в момент времени \(s_j\) (\(0 \leq r_j, s_j \leq 10^9\), \(s_j < r_j\) - такое возможно!). Кроме того, она должна потратить \(a_i\) времени для пересадки в аэропорту \(i\) (\(1\le a_i\le 10^9\)). Необходимо отметить, что если Беси прилетает в аэропорт \(i\) в момент времени \(s\), она может пересесть на рейс, который отправляется в момент времени \(r\), только если \(r \geq s + a_i\).

Беси начинает в городе \(1\) в момент времени \(0\). Для каждого аэропорта от \(1\) to \(N\), каково минимальное время когда Беси сможет в него попасть?

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка ввода содержит \(N\) и \(M\).

Следующие \(M\) строк описывают полёты. \(j\)-ая из этих строк содержит \(c_j\), \(r_j\), \(d_j\), \(s_j\) в указанном порядке. (\(1\leq c_j, d_j \leq N\), \(0\leq r_j, s_j \leq 10^9\))

Следующая строка описывает аэропорты - она содержит \(N\) разделённых одиночными пробелами целых чисел \(a_1, \ldots, a_N\).

ФОРМАТ ВЫВОДА (на экран / stdout):

На выводе должно быть \(N\) строк. Строка \(i\) содержит самое раннее время, в которое Беси может добраться в аэропорт \(i\) или -1, если Беси не может добраться в этот аэропорт.

Breakdown

кратчайшие пути дп графы

**Обратите внимание: время на тест для этой задачи 3сек, на 50% больше чем по умолчанию. **

Ферма Джона может быть представлена как ориентированный взвешенный граф, с дорогами (дугами), соединяющими различные вершины и вес каждой дуги есть время, которое требуется чтобы проехать по этой дороге. Каждый день Беси любит путешествовать из амбара (вершина \(1\)) в поле (вершина \(N\)), используя ровно \(K\) дорог и хочет добраться до поля как можно быстрее при этих ограничениях. Однако, в некоторой точке, прекращается поддержка дорог и они начинают ломаться одна за другой, становясь непроходимыми. Помогите Беси определить кратчайший путь от амбара до поля во все моменты времени.

Формально, мы начинаем с полного взвешенного ориентированного графа из \(N\) вершин (\(1\le N\le 300\)) и \(N^2\) дуг: одна дуга для каждой пары \((i, j)\) \(1 \le i, j \le N\), заметим, что имеется \(N\) петель (дуг из \(i\) в \(i\)). После каждого удаления выведите минимальный вес из всех путей из \(1\) в \(N\), проходящих ровно \(K\) (необязательно различных) дуг \(2\le K\le 8\)). Заметим, что после \(i\)-го удаленя в графе остаётся \(N^2-i\) дуг.

Вес пути определяется как сумма весов всех дуг в пути. Заметим, что путь может содержать множество вхождений одних и тех же дуг, и одних и тех же вершин, включая \(1\) и \(N\).

ФОРМАТ ВВОДА (с клаватуры / stdin):

Первая строка содержит \(N\) и \(K\).

Следющие \(N\) строк содержат по \(N\) целых чисел каждая. \(j\)-ое целое \(i\)-ой строки есть \(w_{ij}\) (\(1\le w_{ij}\le 10^8\)).

Затем следуют \(N^2\) дополнительных строк, каждая содержит два целых числа \(i\) и \(j\) (\(1\le i,j\le N\)). Каждая пара целых чисел появляется ровно один раз.

ФОРМАТ ВЫВОДА (на экран / stdout):

Ровно \(N^2\) строк, минимальный вес \(K\)-пути после каждого удаления. Если \(K\)-путь не существует, выведите \(-1\).

Sum of Distances

графы кратчайшие пути Кратчайшие пути в графе

У Беси есть коллекция связных неориентированных графов \(G_1,G_2,\ldots,G_K\) (\(2\le K\le 5\cdot 10^4\)). Для каждого i (\(1\le i\le K\)), \(G_i\) имеет ровно \(N_i\) (\(N_i\ge 2\)) вершин, помеченных \(1\ldots N_i\) и \(M_i\) (\(M_i\ge N_i-1\)) ребер. Каждый \(G_i\) может содержать циклы, но нет двух и более ребер между парой вершин.

Сейчас Эльза создаёт новый неориентированный граф \(G\) с \(N_1\cdot N_2\cdots N_K\) вершинами, каждая из которых помечена \(K\)-плетом \((j_1,j_2,\ldots,j_K)\), где \(1\le j_i\le N_i\). В \(G\) две вершины \((j_1,j_2,\ldots,j_K)\) и \((k_1,k_2,\ldots,k_K)\) соединены ребром, если для всех i \(1\le i\le K\), \(j_i\) и \(k_i\) соединены ребром в \(G_i\).

Определим расстояние между двумя вершинами в \(G\) которые лежат в одной и той же связной компоненте как минимальное количество ребер на пути из одной вершины в другую. Вычислите сумму расстояний между вершиной \((1,1,\ldots,1)\) и каждой вершиной в этой же компоненте в \(G\) по модулю \(10^9+7\).

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка содердит \(K\), количество графов.

Описание каждого графа начинается с \(N_i\) и \(M_i\) в одной строке, за которой следуют \(M_i\) ребер.

Последовательные графы разделены пустыми строками для читабельности. Гарантируется, что \(\sum N_i\le 10^5\) и \(\sum M_i\le 2\cdot 10^5\).

ФОРМАТ ВЫВОДА (на экран / stdout):

Сумма расстояний от вершины \((1,1,\ldots,1)\) и каждой вершины достижимой от неё по модулю \(10^9+7\).

Telephone

графы Обход в ширину кратчайшие пути

\(N\) коров Фермера Джона, последовательно пронумерованные, \(1 \ldots N\) выстроены в ряд (\(1\le N\le 5\cdot 10^4\)). \(i\)-ая корова имеет идентификатор породы \(b_i\) в интервале \(1 \ldots K\), with \(1\le K\le 50\). Коровы нуждаются в Вашей помощи чтобы узнать, как быстрее передать сообщение от коровы \(1\) корове \(N\).

\(|i-j|\) минут требуется, чтобы передать сообщение от коровы \(i\) к корове \(j\). Однако не все породы готовы взаимодействовать друг с другом, что описано в матрице \(S\) размером \(K \times K\), где \(S_{ij} = 1\) если корова породы \(i\) готова передать сообщение корове породы \(j\) и 0 в противном случае. Необязательно истина то, что \(S_{ij}=S_{ji}\), и даже может быть случай, когда \(S_{ii} = 0\), то есть корова породы \(i\) не будет передавать сообщение корове своей породы.

Определите минимальное количество времени, которое потребуется для передачи сообщения.

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка содержит \(N\) и \(K\).

Следующая строка содержит \(N\) разделённых пробелом целых чисел \(b_1,b_2,\ldots,b_N\).

Следующие \(K\) строк описывают матрицу \(S\). Каждая строка состоит из строки из K бит. \(S_{ij}\) \(j\)-ый бит \(i\)-ой строки сверху.

ФОРМАТ ВЫВОДА (на экран / stdout):

Выведите одно целое число - минимальное количество требуемого времени. Если невозможно передать сообщение от коровы \(1\) к корове \(N\), выведите \(-1\).

Falling Portals

графы кратчайшие пути математика

Имеется \(N\) (\(2\le N\le 2\cdot 10^5\)) миров, каждый с порталом. Изначально, мир \(i\) (for \(1 \leq i \leq N\)) имеет \(x\)-координату \(i\), и \(y\)-координату \(A_i\) (\(1\le A_i\le 10^9\)). В каждом мире есть по одной корове. В момент времени \(0\), все \(y\)-координаты различны и все миры начинают падать. Мир \(i\) двигается непрерывно в отрицательном направлении координаты \(y\) со скоростью \(i\) единиц в секунду.

В любой момент времени, когда два мира находятся на одной и той же \(y\)-координате (возможно в дробное время), порталы "выравниваются". Это означает, что корова из одного из этих миров, может используя эти порталы мгновенно перебраться в другой мир.

Для каждого \(i\) корова из мира \(i\) хочет перебраться в мир \(Q_i\) (\(Q_i\neq i\)). Определите для каждой коровы, сколько времени ей понадобиться, чтобы перебраться в желаемый мир, если она будет путешествовать оптимально.

Ответ на каждый запрос необходимо вывести в виде дроби \(a/b\), где \(a\) и \(b\) положительные и взаимно простые целые числа. Выведите \(-1\) если путешествие невозможно.

ОЦЕНИВАНИЕ:

  • В тестах 2-3 \(N\le 100.\)
  • В тестах 4-5 \(N\le 2000.\)
  • В тестах 6-14 нет дополнительных ограничений.

ФОРМАТ ВВОДА (файл falling.in):

Первая строка ввода должна содержать одно целое число \(N.\)

Следующая строка содержит \(N\) разделённых одиночными пробелами целых числе \(A_1,A_2,\ldots,A_N.\)

Следующая строка содержит \(N\) разделённых одиночными пробелами целых чисел \(Q_1,Q_2,\ldots,Q_N.\)

ФОРМАТ ВЫВОДА (файл falling.out):

Выведите \(N\) строк, \(i\)-th из которых содержит длину пути для коровы \(i.\)

Shortcut

кратчайшие пути графы реализация

Каждый день фермер Джон звонит в гигантский колокол, созывая своих коров в амбар на обед. Все коровы идут кратчайшим путём.

Ферма описывается как \(N\) полей (\(1 \leq N \leq 10,000\)), последовательно пронумерованных \(1 \ldots N\), амбар находится в поле 1. Поля соединены \(M\) двунаправленными тропинками (\(N-1 \leq M \leq 50,000\)). С каждой тропинкой ассоциировано время её прохождения, и от любого поля имеется путь к амбару, состоящий из некоторого множества тропинок.

Поле \(i\) содержит \(c_i\) коров. Услышав колокол, все коровы двигаются к амбару так, чтобы потратить минимальное количество времени. Если имеется несколько путей с минимальным временем, коровы выбирают "лексикографически минимальный" путь. Например, путь через поля 7,3,6,1 лексикографически минимальнее, чем путь 7,5,1.

ФД хочет сократить общее время движения (сумму времён движения всех коров) как можно больше добавлением одной сокращающей тропинки, которая имеет время прохождения \(T\) (\(1 \leq T \leq 10,000\)), от амбара (поле 1) до другого поля, которое он выберет. Если корова встретится с этой сокращающей тропинкой на своём обычном пути, тогда корова пойдёт по этой тропинке, если в результате уменьшится время её прихода в амбар. Иначе, корова пойдёт по своему обычному маршруту, даже если бы она могла уменьшить своё время в пути, используя сокращающую тропинку.

Помогите ФД определить наибольшую величину уменьшения суммарного времени движения, которое он может достичь добавлением сокращающей тропинки.

ФОРМАТ ВВОДА (файл shortcut.in):

Первая строка ввода содержит \(N\), \(M\), \(T\). Каждая из \(N\) последующих строк содержит \(c_1 \ldots c_N\) - целое число в интервале \(0 \ldots 10,000\). Каждая из последующих \(M\) строк описывает тропинку тремя целыми числами \(a\), \(b\), \(t\), обозначающими, что поля \(a\) и \(b\) соединены тропинкой время прохождения которой равно \(t\). Все времена в интервале \(1 \ldots 25,000\).

ФОРМАТИ ВВОДА (файл shortcut.out):

Выведите наибольшее возможное сокращение суммарного времени движения, которое может добиться ФД.

Milk Pumping

кратчайшие пути

Фермер Джон недавно купил новую ферму, чтобы расширить свою империю производства молока. Новая ферма соединена с ближайшим городом сетью труб, и ФД хочет вычленить наилучшее подмножество этих труб для покупки с целью передачи молока с фермы в город.

Сеть труб описывается \(N\) точками соединения (конечными точками труб), последовательно пронумерованных \(1 \ldots N\) (\(2 \leq N \leq 1000\)). Точка соединения 1 представляет новую ферму Джона, а точка соединения \(N\) представляет город. Имеется \(M\) двунаправленных труб (\(1 \leq M \leq 1000\)), каждая их которых соединяет две точки соединения. \(i\)-ая труба стоит \(c_i\) долларов и может поддерживать передачу молока со скоростью \(f_i\) литров в секунду.

ФД хочет купить один путь (самый выгодный) из труб, конечными точками которого будут точки \(1\) и \(N\). Стоимость пути равна сумме стоимостей труб вдоль этого пути. Скорость передачи молока по пути равна минимальной из скоростей передачи труб (минимальное звено будет узким местом пути). ФД хочет максимизировать скорость передачи, делённую на стоимость пути. Гарантируется существование пути из \(1\) в \(N\).

ОЦЕНИВАНИЕ:

  • Тесты 2-5 удовлетворяют \(N,M\le 100.\)

ФОРМАТ ВВОДА (файл pump.in):

Первая строка ввода содержит \(N\) and \(M\). Каждая из последующих \(M\) строк описывает трубу четырьмя целыми числами \(a\) и \(b\) (две различные точки соединения, соединёнными этой трубой), \(c\) (её стоимость), \(f\) (её производительность - скорость передачи молока). \(c\) и \(f\) оба положительные целые числа в интервале \(1 \ldots 1000\).

ФОРМАТ ВЫВОДА (файл pump.out):

Выведите оптимальное значение, умноженное на \(10^6\), обрезанное до целого (то есть округлённое вниз до ближайшего целого числа, если это число не целое).

Fine Dining

кратчайшие пути

Коровы возвращаются в амбар в конце длинного дня и чувствуют себя усталыми и голодными.

Ферма состоит из \(N\) пастбищ (\(2 \leq N \leq 50,000\)), последовательно пронумерованных \(1 \dots N\). Коровы хотят добраться до амбара в пастбище \(N\). Каждое из остальных \(N-1\) пастбищ содержит ровно 1 корову. Коровы могут двигаться от пастбища к пастбищу по множеству из \(M\) ненаправленных дорожек (\(1 \leq M \leq 100,000\)). \(i\)-ая дорожка соединяет пару пастбищ \(a_i\) и \(b_i\), и требуется \(t_i\) единиц времени для её прохождения. Каждая корова может достичь амбара, пройдя некоторую последовательность дорожек.

Будучи голодными, коровы заинтересованы в остановках для еды на их пути домой. К счастью, \(K\) пастбищ содержат стоги сена (\(1 \leq K \leq N\)), \(i\)-ый из этих стогов сена имеет величину вкусности \(y_i\). Каждая хочет съесть один такой стог сена по дороге в амбар, но только если время, которое добавиться к её пути, не больше чем вкусность стога, который она съест. Заметим, что корова может съесть не более одного стога сена. Если на её пути встретятся другие пастбища со стогами, она просто игнорирует их.

ФОРМАТ ВВОДА (файл dining.in):

Первая строка содержит три разделённых пробелом целых числа \(N\), \(M\), \(K\). Каждая из последующих \(M\) строк содержит три целых числа \(a_i\), \(b_i\), \(t_i\), описывающих дорожку между пастбищами \(a_i\) и \(b_i\), на прохождение которой требуется \(t_i\) времени (\(a_i\) и \(b_i\) отличаются друг от друга, а \(t_i\) - положительное целое число не более чем \(10^4\)).

Каждая из следующих \(K\) строк описывает стог сена двумя целыми числами: индекс пастбища и вкусность стога (положительное целое число не более \(10^9\)). Множество стогов сена может располагаться на одном и том же пастбище.

ФОРМАТ ВЫВОДА (файл dining.out):

Вывод должен содержать \(N-1\) строку. Строка \(i\) содержит одно целое число \(1\), если корова на пастбище \(i\) может посетить пастбище со стогом сена и съесть это стог и 0, в потивном случае.

A Pie for a Pie

графы Обход в ширину кратчайшие пути

У Беси и Эльзы по N (\(1 \leq N \leq 10^5\)) пирогов. Каждый из \(2N\) пирогов имеет величину вкусности по мнению Беси и величину вкусности (возможно отличающуюся) по мнению Эльзы.

Беси хочет отдать один из своих пирогов Эльзе. Если Эльза получит пирог от Беси, она должна будет отдать один из своих пирогов Беси. Чтобы не оказаться ни скупой, ни щедрой, Эльза постарается выбрать пирог, как минимум, такой же вкусный (по мнению Эльзы) как она получила, но не более чем на \(D\) единиц вкуснее (\(0 \leq D \leq 10^9\)). Такой пирог может не существовать, в этом случае Эльза сбежит в Японию.

Но если Эльза отдаст Беси пирог взамен, то Беси аналогично постарается отдать Эльзе пирог, как минимум такой же вкусный (по мнению Беси), но не более чем на \(D\) единиц вкуснее, чем кусок, который она получила. Если Беси не сможет, то тоже сбежит. Иначе отдаст кусок Эльзе. Этот цикл продолжается, пока возможно, или пока одна из коров не получит кусок с величиной вкусности равной \(0\), в этом случае процесс заканчивается и обе коровы счастливы.

Заметим, что один и тот же кусок не может быть подарен дважды, и кусок не может вернуться той корове, которая его дарила.

Для каждого из \(N\) кусков Беси может выбрать его как начальный подарок Эльзе. Определите минимальное количество кусков, которые могут быть подарены так, чтобы обе коровы оказались счастливы.

ФОРМАТ ВВОДА (файл piepie.in):

Первая строка содержит два целых числа \(N\) и \(D\).

Следующие \(2N\) строк содержат по два целых числа, разделённых пробелом, соответственно обозначающие вкусность данного куска по мнению Беси и по мнению Эльзы.

Первые \(N\) строк о кусках Беси, а оставшиеся \(N\) строк о кусках Эльзы.

Гарантируется, что все величины вкусности в интервале \([0,10^9]\).

ФОРМАТ ВЫВОДА (файл piepie.out):

На выводе должно быть \(N\) строк. Строка \(i\) должна содержать одно целое число: минимальное количество кусков, которое может быть подарено при счастливом исходе, если Беси начнёт с куска \(i\). Если счастливый исход при начале с куска \(i\) невозможен, то строка \(i\) должна содержать \(-1\).

Dueling GPSs

графы кратчайшие пути Алгоритм Дейкстры

Фермер Джон недавно купил новую машину с двумя навигационными
системами GPS. Что ещё хуже, они часто конфликтуют при выборе
Маршрута.

Карта региона, в котором живёт ФД представляет собой N перекрёстков
(2 <= N <= 10,000) и M двунаправленных дорог (1 <= M <= 50,000).
Дорога I соединяет перекрёстки Ai (1 <= Ai <= N) и Bi (1 <= Bi <= N).

Множество дорого может соединять одну и ту же пару перекрёстков.
Двунаправленные дороги представлены двумя раздельными
однонаправленными дорогами в противоположных направлениях.

Дом ФД находится в перекрёстке 1, а его ферма распложена в перекрёстке
N. Существует путь из дома на ферму, по серии однонаправленных дорог.

Обе GPS-системы используют карту описанную выше, однако они дают
различные значения времени проезда по каждой дороге. Дорога I
требует Pi единиц времени по первой GPS-системе и Qi единиц времени
по второй (каждая из величин – целое число в интервале 1..100,000).

ФД хочет проехать от дома до фермы. Однако каждая GPS-система громко
оповещает ФД каждый раз, когда ФД выбирает дорогу (например, от
перекрёстка X до перекрёстка Y) которую GPS не считает частью
кратчайшего пути от X до фермы (возможно даже что предупреждение
выдают обе GPS-системы, если ФД выбирает дорогу, которую каждая из
GPS считает не принадлежащей к кратчайшему маршруту).

Пожалуйста, помогите ФД определить минимальное количество предупреждений,
которое он может получить соответствующим выбором маршрута.
Если две SPS-системы предупреждают одновременно, к ответу в этом случае
нужно прибавлять число 2.

PROBLEM NAME: gpsduel

Формат ввода:

* Строка 1: целые числа N и M.
* Строка 2-N+1: Строка i описывает дорогу i четырьмя
целыми числами: Ai Bi Pi Qi.

Примечание

Всего имеется 5 перекрёстков и 7 однонаправленных дорог. Первая
дорога идёт от перекрёстка 3 к перекрёстку 4, первая GPS считает,
что нужно 7 единиц времени для проезда по этой дороге, а вторая GPS
- полагает, что требуется одна единица времени.

Формат вывода:

* Строка 1: Минимальное количество предупреждений, которое
может получить ФД при оптимальном проезде от дома до фермы.

Примечание

Если ФД выберет путь 1 -> 2 -> 4 -> 5, тогда первая GPS пожалуется на
дороге 1->2 (она предпочитает путь 1>3). Однако в остальной части маршрута
2 -> 4 -> 5, обе GPS промолчат, поскольку обе считают такой маршрут
кратчайшим от 2 до 5.

Roadblock

кратчайшие пути графы реализация

Problem 2: Roadblock [Brian Dean]
Каждое утро Фермер Джон по ферме от своего дома к амбару. Ферма это коллекция из N полей (1<=N<=250), соединённых M двунаправленными дорожками (1<=M<=25,000) определённой длины. Дом фермера находится на поле 1, а амбар – на поле N. Никакие два поля не соединены более чем одной дорожкой. И существует путь (как последовательность дорожек) из любого поля к любому. Перемещаясь от поля к полю, ФД всегда выбирает маршрут, состоящий из последовательности дорожек, имеющих наименьшую общую длину. Коровы «вредничают». Они планируют построить стог сена ровно на одной из M дорожек, тем самым увеличив вдвое её длину. Коровы хотят выбрать такую дорожку, чтобы максимизировать увеличение маршрута ФД от дома к амбару. Помогите коровам определить, насколько они могут удлинить маршрут ФД.
PROBLEM NAME: rblock
Формат входных данных
* Строка 1: Два разделённых пробелом целых числа, N и M.
* Строки 2..1+M: Строка j+1 описывает j-ую двунаправленную дорожку тремя разделёнными пробелами числами Aj Bj Lj, где Aj и Bj это числа в диапазоне1..N, указывающие поля, соединённые этой дорожкой, а L – длина этой дорожки (в диапазоне 1...1,000,000).
Формат выходных данных
* Строка 1: Максимально возможное увеличение длины кратчайшего маршрута ФД, которого можно достичь удвоением длины одной дорожки.
Примечание
Если коровы удвоят длину дорожки из поля 3 в поле 3 (от 3 до 6), тогда кратчайший маршрут ФД станет 1-3-5 с длиной 1+7=8, что увеличивает на 2 первый кратчайший путь.

Roadblock

кратчайшие пути

Problem 1: Roadblock [Brian Dean]
Каждое утро Фермер Джон по ферме от своего дома к амбару. Ферма это коллекция из N полей (1<=N<=250), соединённых M двунаправленными дорожками (1<=M<=25,000) определённой длины. Дом фермера находится на поле 1, а амбар – на поле N. Никакие два поля не соединены более чем одной дорожкой. И существует путь (как последовательность дорожек) из любого поля к любому. Перемещаясь от поля к полю, ФД всегда выбирает маршрут, состоящий из последовательности дорожек, имеющих наименьшую общую длину. Коровы «вредничают». Они планируют построить стог сена ровно на одной из M дорожек, тем самым увеличив вдвое её длину. Коровы хотят выбрать такую дорожку, чтобы максимизировать увеличение маршрута ФД от дома к амбару. Помогите коровам определить, насколько они могут удлинить маршрут ФД.
PROBLEM NAME: rblock
Формат входных данных
* Строка 1: Два разделённых пробелом целых числа, N и M.
* Строки 2..1+M: Строка j+1 описывает j-ую двунаправленную дорожку тремя разделёнными пробелами числами Aj Bj Lj, где Aj и Bj это числа в диапазоне1..N, указывающие поля, соединённые этой дорожкой, а L – длина этой дорожки (в диапазоне 1...1,000,000).
Формат выходных данных
* Строка 1: Максимально возможное увеличение длины кратчайшего маршрута ФД, которого можно достичь удвоением длины одной дорожки.
Примечание
Если коровы удвоят длину дорожки из поля 3 в поле 3 (от 3 до 6), тогда кратчайший маршрут ФД станет 1-3-5 с длиной 1+7=8, что увеличивает на 2 первый кратчайший путь.

Vacation Planning

кратчайшие пути

Air Bovinia планирует соединить N ферм (1 <= N <= 200), в которых живут
коровы. K из этих ферм выбраны как хабы (1 <= K <= 100, K <= N).
Фермы пронумерованы от 1 до N, при этом фермы 1..K являются хабами.

Сейчас имеется M (1 <= M <= 10,000) однонаправленных полётов.
Полёт I происходит из фермы ui в ферму vi, с ценой di долларов
(1 <= di <= 1,000,000).

Авиакомпания получила требование на Q (1 <= Q <= 10,000)
однонаправленных путешествий. I-ое путешествие из фермы ai в ферму bi.
Путешествие может включать любую последовательность прямых перелётов,
(возможно даже посещая одну и туже ферму несколько раз),
но эта последовательность должна включать как минимум один хаб
(который может быть а может и не быть в ферме старта или назначения).
Следствием последнего требования может быть отсутствие корректного
маршрута из ai в bi. Для всех остальных путешествий Ваша цель
помочь Air Bovinia определить минимальную стоимость корректного маршрута.

PROBLEM NAME: vacation

Формат входных данных

* Строка 1: Четыре целых числа: N, M, K, Q.

* Строки 2..1+M: Строка i+1 содержит ui, vi, di для полёта i.

* Строки 2+M..1+M+Q: Строка 1+M+i описывает i-ое путешествие в терминах ai bi

Формат выходных данных

* Строка 1: Количество путешествий (из Q) для которых существует
корректный маршрут

* Строка 2: Сумма всех корректных минимальных маршрутов.

Примечание

Путешествие из 3 в 2 может быть осуществлено единственным способом
с ценой 10+7. путешествие из 2 в 3 невозможно, поскольку из 2 нет
ни одного полёта. Путешествие из 1 в 2 возможно единственным способом
с ценой 7.

Vacation Planning (gold)

кратчайшие пути


Air Bovinia выполняет полёты, соединяющие N (1 <= N <= 20,000) ферм, в которых живут коровы. K (1 <= K <= 200, K <= N) из этих ферм назначены хабами.
Сейчас Air Bovinia предлагает M (1 <= M <= 20,000) однонаправленных полётов, где полёт i производится из фермы ui в ферму vi и стоит di (1 <= di <=10,000) долларов. Для каждого из этих полётов или ui или vi является терминалом. Существует не более одного полёта между любыми двумя фермами в любом заданном направлении, и не существует полёта, который начинается и заканчивается в одной и той же ферме.
Беси руководитель службы занимающейся билетами. Получено Q (1 <= Q <= 50,000) однонаправленных запросов на путешествие, где i-ый запрос – перелёт из фермы ai на ферму bi.
Напишите программу, которая определит можно ли выписывать билет и, если да, то какова будет его минимальная стоимость.
Чтобы сократить размер вывода Вы должны вывести только общее количество билетов, которые можно выписать и суммарную их минимальную стоимость. Заметим, что это число может не поместиться в 32-битное целое.
PROBLEM NAME: vacationgold
Формат входных данных
* Строка 1: Целые числа N, M, K, Q.
* Строки 2..M + 1: Строка i+1 содержит ui, vi, и di. (1 <= ui, vi <= N, ui != vi)
* Строки M + 2..M + K + 1: Каждая из этих строк содержит ID одного хаба (в интервале 1..N).
* Строки M + K + 2..M + K + Q + 1: Два числа на строке, указывающие запрос на билет из фермы ai на ферму bi (1 <= ai, bi <=N, ai != bi)
Формат выходных данных
* Строка 1: Количество билетов, которые могут быть выписаны
* Строка 2: Минимальная общая стоимость всех выписанных билетов
Примечание
Для первого полёта есть только один маршрут 1->2->3 с ценой 20. Нет полётов из фермы 3, поэтому бедные коровы останутся там.

Milk Routing

кратчайшие пути


На ферме Джона имеется сеть из M труб (1 <= M <= 500) для передачи молока от фермы к молокохранилищу. ФД хочет удалить и заменить некоторые из труб, но оставить ровно один путь, так чтобы он смог по прежнему передавать молоко из амбара в хранилище.
Сеть труб описывается N точками соединения (1 <= N <= 500), каждая из которых может служить конечной точкой множества труб. Точка соединения номер 1 - это амбар, а точка соединения номер N - молокохранилище. Каждая из M двунаправленных труб соединяет пару точек соединения и имеет время задержки - (количество времени, которое требуется чтобы молоко достигло одного конца из другого) пропускную способность - количество молока в единицу времени, которое может быть передано по этой трубе. Пары точек соединения могут соединяться более чем одной трубой.
Для пути от амбара к хранилищу время задержки - это сумма всех времен задержки всех труб в этом пути. А пропускная способность пути - минимум из пропускных способностей всех труб этого пути. Если ФД хочет передать X единиц молока через путь с временем задержки L и пропускной способностью C, то требуемое время равно L + X/C.
По заданной структуре сети труб ФД помогите ему выделить один путь от амбара к хранилищу, который позволит ему передать X единиц молока за минимальное количество времени.
PROBLEM NAME: mroute
Формат входных данных
* Строка 1: Три разделенных пробелом целых числа: N M X (1 <= X <= 1,000,000).
* Строки 2..1+M: Каждая строка описывает трубу 4-мя целыми числами: I J L C. I и J (1 <= I,J <= N) точки соединения обоих концов трубы L и C (1 <= L,C <= 1,000,000) задают время задержки и пропускную способность трубы.
Формат выходных данных
* Строка 1: Минимальное количество времени, которое потребуется чтобы передать молоко по единственному пути, округленное вниз до ближашего целого.


Примечание
Путь 1->3 занимает 14 + 15/1 = 29 единиц времени. Путь 1->2->3 занимает 20 + 15/2 = 27.5 единиц времени, и поэтому оптимальный.

Roadblock

кратчайшие пути графы реализация


Каждое утро Фермер Джон идет от дома к амбару. Ферма представляет собой множество из N полей (1 <= N <= 100) (дом на поле 1, амбар на поле N), соединенных M (1 <= M <= 10,000) двунаправленными дорогами, с каждой из которых ассоциирована длина.
Никакие два поля не соединены более чем одной дорогой, и существует маршрут дорог от любого поля к любому. Когда ФД идет от одного поля к другому, он всегда выбирает маршрут, состоящий из последовательности дорог, которые дают минимальную суммарную длину.
Коровы решили сделать ФД маленькую неприятность, выложив сено на одной из M дорог, тем самым удваивая ее длину.
Коровы хотят выбрать такую дорожку, чтобы максимально увеличить расстояние, которое ФД пройдет от дома до амбара. Помогите коровам определить, насколько они удлинят маршрут ФД.
PROBLEM NAME: rblock
Формат входных данных
* Строка 1: Два разделенных пробелом целых числа, N (1 <= N <= 100) и M (1 <= M <= 10,000).
* Строки 2..1+M: Строка j+1 описывает j-ую двунаправленную дорожку тремя разделенными пробелами целыми числами Aj Bj Lj, где Aj и Bj это числа от 1 до N, указывающие поля, соединенные этой Дорогой, а Lj - длина этой дороги (в диапазоне 1...1,000,000).
Формат выходных данных
* Строка 1: Максимально возможное увеличение общей длины кратчайшего маршрута, которого можно добиться удвоением длины одной дороги.
Примечание
Если коровы удвоят длину дороги от поля 3 к полю 4 (от 3 до 6), тогда кратчайшим маршрутом станет путь 1-3-5, с общей длиной 1+7= 8. Что на 2 больше, чем исходный кратчайший маршрут.

Кейс на рейс

кратчайшие пути реализация

Авиакомпания <<Флагманский Флот Татарстана>> предлагает в своих самолётах новый вид бизнес-класса. Салон самолёта состоит из \(n\) мест, расположенных в один ряд вдоль прохода. Введём координатную прямую вдоль салона так, что расстояние между креслами будет равно \(1\), и места будут иметь координаты от \(1\) до \(n\).

Во время полёта стюарду нужно пройти по самолету и раздать всем пассажирам напитки. Напитки бывают \(k\) разных видов, пронумерованных числами от \(1\) до \(k\). Каждый пассажир получает одну порцию одного напитка, пассажир заказывает предпочитаемый вид напитков при бронировании билета, поэтому все предпочтения пассажиров известны заранее.

Напитки разлиты по бутылкам, каждая бутылка вмещает \(p\) порций одного напитка. В тележку для напитков можно загрузить не более \(m\) бутылок с любыми видами напитков, гарантируется, что \(m\ge k\).

Пассажиры обслуживаются в порядке возрастания номеров их мест. Первоначально тележка находится в начале салона в точке \(0\), и её можно заполнить любыми видами напитков перед обслуживанием. После завершения обслуживания тележка должна приехать в точку \(n+1\). При этом в точках \(0\) и \(n+1\) могут находиться кладовые: или одна кладовая в одном из концов салона или две кладовые в двух концах, в которых имеется достаточный запас напитков каждого вида. В этих кладовых можно выгрузить из тележки пустые бутылки и погрузить полные бутылки.

По ходу обслуживания напитки будут расходоваться, поэтому время от времени возникает необходимость пополнить запас напитков на тележке в одной из кладовых. Если в текущий момент тележка находится напротив кресла номер \(i\), то для того, чтобы доехать до кладовой в точке \(0\) необходимо проехать расстояние \(i\), а для того, чтобы доехать до кладовой в точке \(n + 1\) необходимо проехать расстояние \(n+1-i\). В кладовых можно выгрузить пустые бутылки из тележки и загрузить на свободные места бутылки с напитками любых видов. Выгружаемые бутылки должны быть пустыми, нельзя выгружать бутылки, в которых остались напитки, или выливать напитки. Нельзя переливать остатки напитков между разными бутылками. Можно загружать на тележку более одной бутылки одного вида. После этого тележка должна проехать расстояние от кладовой до кресла первого необслуженного пассажира, чтобы продолжить обслуживание.

Определите, какое минимальное расстояние должна проехать тележка, чтобы переместиться из точки \(0\) в точку \(n+1\) и обслужить всех пассажиров.

Формат входных данных
Первая строка входных данных содержит четыре целых числа \(n\), \(m\), \(k\), \(p\) (\(3 \leq n \leq 10^6\), \(1 \leq p \leq 10^6\), \(1 \leq k \leq m \leq 10^6\)) — количество мест в салоне, вместимость тележки, количество типов напитков и вместимость каждой бутылки соответственно.

В следующей строке содержится целое число \(c\) (\(1 \leq c \leq 3\)) — параметр, описывающий наличие кладовых в салоне. Если \(c=1\), то кладовая находится только в точке \(n+1\). Если \(c=2\), то кладовая находится только в точке \(0\). Если \(c=3\), то кладовые находятся в обоих концах салона.

В следующей строке содержатся \(n\) целых чисел \(a_i\) (\(1 \leq a_i \leq k\)) — типы напитков, которые заказали пассажиры.

Формат выходных данных
Программа должна вывести одно целое число — минимальное расстояние, которое должна проехать тележка.

Пояснения к примерам
В первом примере в тележку вмещается \(m=2\) бутылки по \(p=1\) порции в каждой. Кладовая находится в конце салона. Первоначально тележку нужно загрузить бутылками с напитками вида \(1\) и \(2\), которые будут налиты пассажирам на местах \(1\) и \(2\), тележка проедет расстояние \(2\) от точки \(0\) до точки \(2\). После этого тележке нужно будет проехать до кладовой в конце салона (расстояние \(4\)), загрузить тележку бутылками вида \(1\) и \(2\) и вернуться к креслу номер \(3\) (тележка проедет расстояние \(3\)). Пассажирам на местах \(3\) и \(4\) выдаются напитки вида \(1\) и \(2\) (тележка проезжает расстояние \(1\) от места \(3\) до места \(4\)). После этого тележке понадобится ещё раз съездить в кладовую (от кресла \(4\) до кладовой расстояние \(2\)), вернуться из кладовой до кресла \(5\) (расстояние \(1\)), и проехать ещё \(1\) до конца салона. Общее расстояние равно \(2+4+3+1+2+1+1=14\).

Во втором примере в тележку вмещаются \(m=3\) бутылки по \(p=2\) порции в каждой. Кладовая находится в начале салона. Необходимо загрузить тележку тремя бутылками вида \(1\), обслужить пассажиров на местах с номерами от \(1\) до \(4\). После этого опустошатся две бутылки вида \(1\), нужно будет сразу съездить в кладовую, чтобы загрузить две бутылки вида \(2\), затем обслужить пассажиров на местах с номерами от \(5\) до \(8\).

В третьем примере в тележку вмещаются \(m=3\) бутылки по \(p=2\) порции в каждой, кладовые находятся в обоих концах салона. Для обслуживания пассажиров нужны две бутылки вида \(2\) и по одной бутылке видов \(1\) и \(3\), поэтому понадобится один раз съездить в кладовую для того, чтобы заменить пустую бутылку вида \(2\) на полную. Это лучше сделать после обслуживания пассажира на месте \(3\), тележка должна съездить в кладовую в начале салона.

В четвёртом примере в тележку нужно загрузить по одной бутылке каждого вида, и поскольку каждая бутылка вмещает по две порции напитков, это позволит обслужить всех пассажиров без дополнительного пополнения тележки.

В пятом примере понадобится два пополнения тележки, один раз тележке придётся вернуться в кладовую в начало салона после обслуживания пассажира \(3\), второй раз — в конец салона после обслуживания пассажира \(6\).

Злой лифт

кратчайшие пути теория чисел реализация

Дизайн-студия Артемия Индюкова получила заказ на разработку очень пафосного лифта для нового небоскреба. За работу взялся сам Артемий, отличающейся, кстати, редкой неадекватностью. У него есть идея-фикс: для управления лифтом достаточно четырех кнопок. Кнопки должны быть следующие:

  • - Поднятся на A этажей вверх
  • - Поднятся на B этажей вверх
  • - Поднятся на C этажей вверх
  • - Спустится на первый этаж
Изначально лифт находится на первом этаже. Пассажир лифта использует первые три кнопки чтобы попасть на тот этаж, на который он хочет. Если пассажир пытается подняться вверх на A, B или C этажей, а такого этажа в здании не существует (т.е. пассажир хочет подняться выше N-го, последнего этажа), то лифт никуда не едет.
Заказчики проекта оказались с юмором и вместе с отказом от футуристичного дизайна решили оценить адекватность Артемия по шкале от 1 до N. Оценка адеватности равна количеству этажей, на которые можно попасть с первого с помощью такого лифта. Помогите им в этом.

Входные данные
Первая строка содержит число N – высоту небоскреба (1 <= N <= 1018).

Вторая строка содержит три числа A, B и C, задающие параметры кнопок (1 <= A, B, C <= 100 000).

Выходные данные
Выведите единственное число — оценку адекватности Артемия Индюкова.

Модульный граф

кратчайшие пути графы дп

Дан связный неориентированный граф из \(n\) вершин. Изначально в \(i\)-й вершине (\(1 \leq i \leq n\)) записано целое положительное число \(a_i\). Боб хочет за минимальное время попасть из вершины с номером \(1\) в вершину с номером \(n\). Время, которое требуется, чтобы пройти по ребру, соединяющему вершины \(u\) и \(v\), составляет \(|a_u - a_v|\).

Перед тем, как начать обход, Боб может поменять значение \(a_i\) в не более чем \(k\) вершинах. За какое минимальное время можно попасть из \(1\) в \(n\), поменяв значения оптимальным образом?

Формат входных данных
В первой строке входных данных записаны три целых числа \(n, m, k\) (\(2 \leq n \leq 2000, 1 \leq m \leq 2000, 0 \leq k \leq 10\)) — количество вершин графа, количество ребер и параметр \(k\) соответственно.

В следующей строке содержится \(n\) целых чисел \(a_i\) (\(0 \leq a_i \leq 10^9\)) — начальные значения в вершинах.

В следующих \(m\) строках содержатся пары чисел \(u_i, v_i\) (\(1 \leq u_i, v_i \leq n\)) — вершины, соединенные \(i\)-м ребром. Гарантируется, что граф связный, в нем нет петель и кратных ребер.

Формат выходных данных
В единственной строке выходных данных выведите ответ на задачу.

Примечание

В первом тестовом примере одним из оптимальных способов получения ответа может быть изменение значения в вершине с номером \(2\) с числа \(15\) на число \(3\). В таком случае путь \(1 \rightarrow 2 \rightarrow 5 \rightarrow 6\) будет иметь стоимость \(|1 - 3| + |3 - 4| + |4 - 10| = 9\).

Второй пример отличается от первого лишь значением \(k\). Во втором примере можно поменять значения записанные в вершинах с номерами \(2, 3, 6\) на \(1\). Тогда стоимостью пути станет \(|1 - 1| + |1 - 1| + |1 - 1| + |1 - 1| = 0\).

50111

кратчайшие пути реализация

В реальных компьютерных сетях также используется понятие максимальной единицы передачи (MTU, maximum transmission unit) - размер блока данных, который может быть передан на отрезке сети между двумя устройствами. Этот размер зависит от ограничений используемой технологии
передачи данных на нижнем уровне.
В данной задаче требуется составить оптимальный план передачи пакетов с учётом MTU между разными маршрутизаторами и вычислить минимальное время передачи на его основе.
Нужно иметь в виду, что окно передачи работает по "скользящему" принципу, то есть после получения подтверждения доставки первых байтов окна оно сдвигается вправо на размер доставленной информации.

Входные данные
В первой строке записано натуральное число N, не превышающее 100 - количество маршрутизаторов. Далее записано N таблиц маршрутизации в следующем формате: в первой строке число N1 - количество маршрутов в таблице, далее N1 строк, где через пробел указаны адрес сети, маска (целое число от 1 до 32), номер маршрутизатора, куда будет отправлен пакет (номера считаются с 1 по порядку описания), время передачи до следующего маршрутизатора в миллисекундах и MTU в байтах.
После описания таблиц маршрутизации в следующей строке записаны через пробел адрес узла-отправителя, номер маршрутизатора, к которому он подключён, адрес узла-получателя, номер маршрутизатора, к которому подключён получатель, и объём данных (в байтах), который требуется передать.

Выходные данные
Минимальное время передачи в миллисекундах.
Примечание: считать, что между получением каждого пакета и отправкой подтверждения с конечного устройства всегда проходит 1 мс.
Примечание 2: считать, если объём данных, который требуется отправить с одного маршрутизатора на другой, превышает MTU, то данные делятся на пакеты, равные максимальной единице передачи или меньше, и отправляются с задержкой в 1 мс.
В рамках данной задачи считать, что потери отсутствуют и все отправленные пакеты достигают получателя, а также что размер окна фиксированный и составляет 10240 байт. Также следует пренебречь временем передачи данных между конечными узлами и ближайшими
маршрутизаторами и размером пакета ACK (считать, что он меньше любого MTU).

Примеры
Входные данные Выходные данные
1 5
3
10.0.0.0 8 2 10 100
20.0.0.0 8 3 10 100
10.0.0.0 8 5 10 10240
1
10.0.0.0 8 4 10 100
1
30.0.0.0 8 4 10 100
1
40.0.0.0 8 1 10 100
1
10.0.0.0 8 4 20 10240
40.1.1.1 1 10.1.1.1 4 102400
410


Примечание
Если отправлять пакеты с 1-го маршрутизатора на 5-й, то время передачи каждых 10240 байт с учётом подтверждения займёт 41 мс. Если же отправлять с 1-го через 2-й, то 10240 байт окна передачи будут делиться на 103 блока и суммарное время доставки для первого окна
увеличится до 133 мс, а для всего объёма данных - более 1000 мс.

50105

кратчайшие пути реализация

Для передачи пакетов в глобальной компьютерной сети используются специальные устройства - маршрутизаторы. Они подключены к нескольким линиям связи и на основе содержащихся в их памяти таблиц маршрутизации определяют, по какому из направлений передавать приходящие пакеты.
IPv4 - 4-я и первая, получившая широкое распространение, версия протокола IP (Internet Protocol).
Адреса в этой версии представляют собой 4 октета - блока по 8 бит. В человекочитаемом представлении адреса принято записывать в форме 4-х десятичных чисел от 0 до 255, разделённых точками.
Поскольку маршрутизатор имеет несколько интерфейсов (физических разъёмов, куда подключены кабели связи), в таблице маршрутизации задано соответствие каждого интерфейса той или иной сети. Сеть определяется парой из IP-адреса и битовой маски (в которой N старших бит заполнены единицами, а 32-N младших заполнены нулями). Для проверки того, можно ли маршрутизировать
пакет в какую-либо сеть, битовая маска применяется к адресу сети и адресу узла назначения из пакета с помощью побитового И. Если получившийся результат совпадает, то пакет можно отправить на соответствующий интерфейс.
Протокол управления передачей TCP (transmission control protocol) - протокол более высокого уровня по сравнению с IP, предназначенный для доставки данных в неизменном виде. Для решения этой задачи в нём применяется ряд принципов, один из которых - подтверждение
получения данных. Для подтверждения от получателя к отправителю направляется специальный пакет с признаком ACK, в котором указан диапазон полученных байтов.
При этом для исключения перегрузок сети при передаче больших объёмов данных применяются "окна" передачи. Окном называется максимальный объём данных, который может быть отправлен от отправителя получателю без подтверждения получения. По мере подтверждения получения данных окно смещается вправо и отправляются новые данные.

Входные данные
В первой строке записано натуральное число N, не превышающее 100 - количество маршрутизаторов. Далее записано N таблиц маршрутизации в следующем формате: в первой строке число N1 - количество маршрутов в таблице, далее N1 строк, где через пробел
указаны адрес сети, маска (целое число от 1 до 32), номер маршрутизатора, куда будет отправлен пакет (номера считаются с 1 по порядку описания), и время передачи до следующего маршрутизатора в миллисекундах.
После описания таблиц маршрутизации в следующей строке записаны через пробел адрес узла-отправителя, номер маршрутизатора, к которому он подключён, адрес узла-получателя, номер маршрутизатора, к которому подключён получатель, и объём данных (в байтах), который требуется передать.

Выходные данные
Минимальное время передачи в миллисекундах.
Примечание: считать, что между получением каждого пакета и отправкой подтверждения с конечного устройства всегда проходит 1 мс.
В рамках данной задачи считать, что потери отсутствуют и все отправленные пакеты достигают получателя, а также что размер окна фиксированный и составляет 10240 байт. Также следует пренебречь временем передачи данных между конечными узлами и ближайшими
маршрутизаторами.

Примечание
102400 = 10240*10, значит, для передачи данных потребуется 10 итераций (сдвигов окна передачи). Каждые 10 Кбайт будут проходить следующую цепочку: отправка с первого маршрутизатора на второй - 10мс, затем со 2-го на 4-й ещё 10 мс, затем 1 мс задержки на
отправку подтверждения и сама передача подтверждения напрямую с 4-го маршрутизатора на 1-й - ещё 10 мс. Таким образом, на передачу каждых 10 Кбайт будет уходить 31 мс.
 

Космолёт

графы кратчайшие пути реализация

Миссия космолёта “Юрий Гагарин” определена - посещение трех звёздных систем в глубоком космосе. Эти звёзды находятся на Земном небосводе в созвездии Орион:

  •  звезда Беллатрикс (250 световых лет от Земли)
  •  звезда Бетельгейзе (643 световых года от Земли)
  •  парная звёздная система Ригель (773 световых года от Земли)
Маршрут путешествия должен предусматривать посещение их в порядке удаления от Земли. Однако гиперсветовой прыжок не может пока быть выполнен с приемлемой точностью на расстояние 20 и более световых лет. Спланированная трасса полёта должна состоять из серии
прыжков, каждый прыжок менее безопасного расстояния. Вторым ограничением является то, что промежуточные точки трассы должны находиться в окрестности массивного тела, т.е. звезды. Такие звёзды в навигации называются контрольными пунктами.
Необходимо учитывать, что управление выходом из гиперпространства невозможно без существенного искривления его в точке назначения гравитационным воздействием звезды контрольного пункта. Эта особенность налагает дополнительное ограничение на каждый
выполняемый гиперпрыжок: траектория прыжка не должна проходить меньше одного светового года от звёздной системы, не являющейся контрольным пунктом.
Задача : построить трассу в трёхмерном пространстве с минимально возможным количеством гиперпрыжков, при соблюдении указанных выше ограничений. Если таких трасс несколько, то следует выбрать ту, в которой суммарная длина трассы меньше.

Входные данные
Первая строка : натуральное число N - количество звезд, внесённых в лоцию (от 3 до 100).
Далее N строк, каждая содержит три целых числа, записанных через пробел: координаты X Y Z, заданные в световых годах. Все значения координат не превышают 10000. Точка старта (0 0 0) - звезда Солнце - не указана в лоции.
Три посещаемые звёздные системы находятся в лоции в порядке ожидаемого посещения, в строках с номерами 1, 2 и 3.

Выходные данные
Первая строка: через пробел должны быть указаны количество прыжков и длина трассы с точностью до третьего знака после запятой.
Вторая строка: номера звёзд-”контрольных пунктов” и звёзд-”целей миссии” в порядке следования звездолёта, записанные через пробел.
Примечание: для отработки алгоритма построения маршрута космолёта в лоцию (комплект навигационной информации для судовождения) могут включаться различные произвольные координаты, не соответствующие известным звёздам.
В рамках задачи считать, что движение космолёта между контрольными точками происходит прямолинейно.

 
Примеры
Входные данные Выходные данные
1 3
10 10 10
20 20 20
30 30 30
3 51.962
1 2 3
2 5
20 0 0
10 0 0
40 0 0
30 0 0
50 0 0
4 40.000
2 1 4 3

Все кратчайшие маршруты

Алгоритм Флойда кратчайшие пути

Учёный-ботаник получил карту дорог страны Лимония. Чтобы составить план исследования этой страны, ему требуется найти кратчайшие расстояния между каждой парой городов этой страны (можно ехать только по проложенным дорогам). Помогите учёному – напишите программу, которая решает эту задачу.
 
Входные данные
В первой строке вводится количество городов N ( 1 ≤ N ≤ 100 ). В следующих N строках записано по N чисел, разделённых пробелами – элементы весовой матрицы графа, который описывает схему дорог между городами: положительное число означает расстояние между городами, ноль говорит о том, что дороги нет.
 
Выходные данные
Программа должна вывести все кратчайшие маршруты между всеми городами в следующем формате:
 
(1->3): 1 2 3 (23)
 
Сначала выводятся номера начального и конечного города (в скобках), затем – последовательность номеров городов, составляющая оптимальный маршрут, затем (в скобках) длина этого маршрута. Если между какими-то городами нет дороги, нужно вывести число 0.
 
Ввод Вывод
4
0 0 0 0
0 0 2 1
0 2 0 4
0 1 4 0
(1,2): 0 
(1,3): 0 
(1,4): 0 
(2,3): 2 3 (2)
(2,4): 2 4 (1)
(3,4): 3 2 4 (3)

33228

Алгоритм Флойда кратчайшие пути

В одной из деревень Центрального района решили построить новую школу, но никак не могут выбрать, в какой именно. Решили сделать так: подсчитать для каждой деревни суммарное расстояние, которое будут проходить все школьники Центрального района, если школа будет построена в этой деревне, и выбрать место, для которого эта сумма будет минимальной. В распоряжении администрации есть карта дорог Центрального района. Напишите программу, которая поможет выбрать место для школы. Если какой-то населенный пункт не имеет связи с другим населенным пунктом, где предполагается разместить школу, считайте, что доставка каждого ученика вертолётом "стоит" 10000 единиц расстояния.
 
Входные данные
В первой строке вводится количество деревень N ( 1 ≤ N ≤ 100 ). В следующих N строках записано по N чисел, разделённых пробелами – элементы весовой матрицы графа, который описывает схему дорог: положительное число означает расстояние между деревнями, ноль говорит о том, что дороги нет. В последней строке вводится N чисел - количество школьников в каждой деревне.
 
Выходные данные
Программа должна вывести два числа: сначала номер деревни, где нужно построить школу, а затем (через пробел) – общее расстояние, которое будут проходить все школьники Центрального района, если школа будет построена в этой деревне.

Ввод Вывод
4
0 11 8 4
11 0 2 5
8 2 0 13
4 5 13 0
15 26 30 12
2 255

Авиаперелеты

Алгоритм Форда-Беллмана кратчайшие пути

Профессору Форду необходимо попасть на международную конференцию. Он хочет потратить на дорогу наименьшее количество денег, поэтому решил, что будет путешествовать исключительно ночными авиарейсами (чтобы не тратиться на ночевку в отелях), а днем будет осматривать достопримечательности тех городов, через которые он будет проезжать транзитом. Он внимательно изучил расписание авиаперелетов и составил набор подходящих авиарейсов, выяснив, что перелеты на выбранных направлениях совершаются каждую ночь и за одну ночь он не сможет совершить два перелета.
 
Теперь профессор хочет найти путь наименьшей стоимости, учитывая что до конференции осталось K ночей (то есть профессор может совершить не более K перелетов).
 
Входные данные
В первой строке находятся числа N (количество городов), M (количество авиарейсов), K (количество оставшихся ночей), S (номер города, в котором живет профессор), F (номер города, в котором проводится конференция).
 
Ограничения: 2≤N≤100, 1≤M≤105, 1≤K≤100, 1≤S≤N, 1≤F≤N.
 
Далее идет M строк, задающих расписание авиарейсов. i-я строка содержит три натуральных числа: Si, Fi и Pi, где Si - номер города, из которого вылетает i-й рейс, Fi - номер го-рода, в который прилетает i-й рейс, Pi - стоимость перелета i-м рейсом. 1≤Si≤N, 1≤Fi≤N, 1≤Pi≤106.
 
Выходные данные
Выведите одно число - минимальную стоимость пути, подходящего для профессора. Если профессор не сможет за K ночей добраться до конференции, выведите число -1.

Ввод Вывод
4 5 2 1 4
1 2 1
2 3 1
3 4 1
1 3 3 
1 4 5
4

Pink Floyd

Алгоритм Флойда кратчайшие пути графы

Группа Pink Floyd собирается дать новый концертный тур по всему миру. По предыдущему опыту группа знает, что солист Роджер Уотерс постоянно нервничает при перелетах. На некоторых маршрутах он теряет вес от волнения, а на других - много ест и набирает вес.
 
Известно, что чем больше весит Роджер, тем лучше выступает группа, поэтому требуется спланировать перелеты так, чтобы вес Роджера на каждом концерте был максимально возможным. Группа должна посещать города в том же порядке, в котором она дает концерты. При этом между концертами группа может посещать промежуточные города.
 
Входные данные
Первая строка входного файла содержит три натуральных числа n, m и k - количество городов в мире, количество рейсов и количество концертов, которые должна дать группа соответственно (n≤100, m≤104, 2≤k≤104). Города пронумерованы числами от 1 до n. Следующие m строк содержат описание рейсов, по одному на строке. Рейс номер i описывается тремя числами bi, ei и wi - номер начального и конечного города рейса и предполагаемое изменение веса Роджера в миллиграммах (1≤bi,ei≤n, −105≤wi≤105). Последняя строка содержит числа a1, a2, ..., ak - номера городов, в которых проводятся концерты. В начале концертного тура группа находится в городе a1.Гарантируется, что группа может дать все концерты.
 
Выходные данные
Первая строка выходного файла должна содержать число s - количество рейсов, которые должна сделать группа. Вторая строка должна содержать s чисел - номера используемых рейсов. Если существует такая последовательность маршрутов между концертами, что Роджер будет набирать вес неограниченно, то первая строка выходного файла должна содержать строку “infinitely kind”.

Ввод Вывод
4 8 5
1 2 -2
2 3 3
3 4 -5
4 1 3
1 3 2
3 1 -2
3 2 -3
2 4 -10
1 3 1 2 4
6
5 6 5 7 2 3 
4 8 5
1 2 -2
2 3 3
3 4 -5
4 1 3
1 3 2
3 1 -2
3 2 -3
2 4 10
1 3 1 2 4
infinitely kind

 

Опасный маршрут

Алгоритм Дейкстры кратчайшие пути

Профессор Флойд живёт в очень опасном районе города. Ежедневно бандиты грабят на улицах прохожих. Читая криминальную хронику, профессор Флойд вычислил вероятность быть ограбленным при проходе по каждой улице города.
 
Теперь он хочет найти наиболее безопасный путь от дома до университета, в котором он преподаёт. Иными словами, он хочет найти путь от дома до университета, для которого вероятность быть ограбленным минимальна.
 
Входные данные
В первой строке находятся два числа N и M - количество зданий и количество улиц, соединяющих здания (1<=N<=100, 1<=M<= (N*(N−1))/2. В следующей строке находятся числа S и E -- номер дома, в котором живёт профессор и номер дома, в котором находится университет соответственно. Далее в M строках расположены описания дорог: 3 целых числа sieipi - здания, в которых начинается и заканчивается дорога и вероятность в процентах быть ограбленным, пройдя по дороге соответственно (1<=si, ei<=N, 0<=pi<=100 , дороги двунаправленные). Гарантируется, что существует хотя бы один путь от дома профессора до университета.
 
Выходные данные
Необходимо вывести одно число - минимальную возможную вероятность быть ограбленным. Выведите ответ с максимально возможной точностью.

Ввод Вывод
3 3
1 3
1 2 20
1 3 50
2 3 20
0.36

 

Столовая

Алгоритм Флойда кратчайшие пути

Сегодня у студентов праздник! В одном из новых зданий университета решили открыть столовую. Для этих целей требуется выбрать одно из зданий, в котором и будет располагаться столовая. Чтобы студенты как можно меньше отвлекались от учёбы, было решено выбрать такое здание, чтобы максимальное расстояние от него до всех остальных зданий было как можно меньше.
 
Помогите найти такое здание!
 
Входные данные
В первой строке находятся два числе N и M - количество зданий и количество дорог, соединяющих здания (1<=N<=100, 0 <=M<=(N(N−1))/2. Далее в M строках расположены описания дорог: 3 целых числа si, ei, li - здания, в которых начинается и заканчивается дорога и длина дороги соответственно (1<=si, ei<=N, 0<=li,=100, дороги двунаправленные).
 
Выходные данные
Необходимо вывести одно число - номер искомого здания. Если есть несколько зданий удовлетворяющих поставленным критериям, выберите среди них здание с наименьшим номером.

Ввод Вывод
3 2
1 2 1
2 3 2
2
3 1
1 2 10
1

Транзитивное замыкание

графы кратчайшие пути поиск в глубину и подобное

Невзвешенный ориентированный граф задан своей матрицей смежности. Требуется построить его транзитивное замыкание, то есть матрицу, в которой в 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 

Флойд №2

Алгоритм Флойда кратчайшие пути

Дан ориентированный взвешенный граф. Вам необходимо найти пару вершин, кратчайшее расстояние от одной из которых до другой максимально среди всех пар вершин.
 
Входные данные
В первой строке вводится единственное число N (1 <= N <= 100) – количество вершин графа. В следующих N строках по N чисел задается матрица смежности графа, где -1 означает отсутствие ребра между вершинами, а любое неотрицательное число – присутствие ребра данного веса. На главной диагонали матрицы – всегда нули.
 
Выходные данные
Выведите искомое максимальное кратчайшее расстояние.

Ввод Вывод
6
0 6 8 -1 -1 -1
5 0 5 -1 -1 -1
1 7 0 -1 -1 -1
-1 -1 -1 0 6 -1
-1 -1 -1 -1 0 3
-1 -1 -1 2 -1 0
9

Дейкстра: кратчайший путь через наибольшее число узлов

Алгоритм Дейкстры кратчайшие пути

Дан ориентированный взвешенный граф. Используя алгоритм Дейкстры, найдите кратчайший путь от одной заданной вершины до другой, проходящий через наибольшее число узлов.
 
Входные данные
В первой строке содержатся два числа: N, F (1≤N≤100, F≤N), где N – количество вершин графа, а F – конечная. В следующих N строках вводится по N чисел, не превосходящих 100, – матрица смежности графа, где -1 означает отсутствие ребра между вершинами, а любое неотрицательное число – присутствие ребра данного веса. На главной диагонали матрицы записаны нули.
 
Выходные данные
Требуется вывести последовательно все вершины того из путей до заданной, у которого количество переходов наибольшее.
 
Ввод Вывод
3 1
0 1 1
4 0 1
2 1 0
2 3 1

Метро

кратчайшие пути Разбор случаев

В мегаполисе, испытывающем большие транспортные проблемы, построили легкое метро. Оно состоит из 6 радиальных линий, которые расходятся от центра города, и k кольцевых линий в форме правильных шестиугольников.  Станции метро располагаются на пересечении кольцевых и радиальных линий. На любой станции разрешено делать пересадки с кольцевых линий на радиальные и обратно. Радиальные линии последовательно нумеруются по часовой стрелке от 1 до 6. Кольцевые линии нумеруются от центра города (центр считается кольцевой линией с номером ноль, состоящей из одной станции). 

Расстояние между двумя соседними станциями на одной радиальной линии равно 1 км. Расстояние между соседними станциями на кольцевой линии с номером i составляет i км. Любая станция обозначается парой чисел - номером радиальной линии r (\(1<=r<=6\)) и номером кольцевой линии k (\(0<=k<=32000\)), на пересечении которых она находится. 

Напишите программу, определяющую длину кратчайшего пути между станциями.

 

Входные данные: Вводятся четыре числа: r1, k1, r2, k2 - координаты начальной и конечной станции. 

Выходные данные: Необходимо вывести расстояние (в км), которое потребуется проехать пассажиру, чтобы попасть c начальной станции на конечную.


Примеры
Входные данные Выходные данные
1 1 5 1 4 1
2 1 5 2 4 5
3 2 0 6 3 3

 

Безопасный путь

геометрия графы кратчайшие пути

Петя и Вася — хорошие друзья. Поэтому они часто ездят друг к другу в гости. Недавно Петя
получил водительские права и собирается навестить своего друга. Для простоты будем считать, что
все дороги в городе, в котором они живут, являются бесконечными прямыми. В месте пересечения
двух или более дорог находятся перекрестки. Дома Пети и Васи расположены возле некоторых
дорог города, но не на перекрестках.
Петя начинает путь на дороге возле своего дома. При этом он может выбрать любое из
двух направлений. Когда Петя подъезжает к перекрестку, он может повернуть на любую другую
проходящую через него дорогу или продолжить ехать по текущей. Поскольку Петя не очень
опытный водитель, каждый поворот, который он совершает, заставляет его волноваться. Причем
волнение Пети равно величине угла, на который он поворачивает, в градусах. Например, при
повороте на прямой угол волнение Пети равно 90.

При менее крутом повороте Петя волнуется меньше, а при более крутом — сильнее.

 Будем считать, что волнение Пети в течении всего маршрута равно сумме величин в
градусах углов, на которые ему придется повернуть в течении движения. Конечно, Петя хочет
воспользоваться маршрутом, который заставит его волноваться как можно меньше.
Помогите Пете выяснить, чему равно минимальное суммарное волнение, которое он испытает,
добравшись до дома Васи.
Формат входных данных
В первой строке входного файла находится целое число n (1 ≤ n ≤ 50) — количество дорог в
городе. В следующих n строках находится описание дорог.
Каждая дорога описывается четверкой целых чисел x1, y1, x2, y2, которые задают координатами
двух различных точек (x1, y1) и (x2, y2), через которые проходит дорога.
Гарантируется, что никакие две дороги не совпадают. В следующих двух строках заданы
координаты домов Пети и Васи. Гарантируется, что каждый дом находится ровно на одной дороге,
а также, что Петя и Вася живут в разных местах.
Координаты всех точек во входном файле являются целыми числами и не превосходят 100 по
абсолютному значению.

Формат выходных данных
В выходной файл выведите единственное число — суммарный угол в градусах, на который
придется повернуть Пете при оптимальном выборе маршрута. Ответ считается правильным, если
его относительная или абсолютная погрешность не превосходит 10−9.
Если Петя никак не сможет добраться до дома Васи, выведите число −1.

Примеры
Ввод
3
0 0 2 0
1 1 0 2
1 2 3 2
-3 0
3 2
Вывод
270.0

Ввод
1
0 0 2 0
0 0
2 0
Вывод
0.0

Ввод
5
0 0 1 0
0 0 1 1
0 0 0 1
0 0 -1 1
0 1 1 1
5 0
0 5
Вывод
90.0

Следующий рисунок соответствует первому примеру. Петя совершает два поворота на 135
градусов, его суммарное волнение равно 270.