| | | |
|
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\) магазинов, которые образуют простой путь, и максимальное расстояние от произвольного перекрестка города до ближайшего магазина минимально. Выходные данные Выведите одно число — минимальное максимальное расстояние, которое нужно будет пройти, чтобы попасть с любого перекрестка до ближайшего магазина мороженого. Магазины Сони должны располагаться вдоль произвольного простого пути из перекрестков длины не более \(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\) вариантов не существует, то программа должна вывести всевозможные подходящие варианты. Выходные данные Выведите \(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\) до \(n\). Инициализируем \(q\) как новую очередь, содержащую только вершину \(1\), также пометим вершину \(1\) как использованную.
- Извлечем вершину \(v\) из начала очереди \(q\).
- Напечатаем номер вершины \(v\).
- Переберем в произвольном порядке все вершины \(u\) такие, что \(u\) является соседом \(v\) и ещё не помечена как использованная. Пометим вершину \(u\) как использованную и добавим в конец очереди \(q\).
- Если очередь не является пустой, продолжим выполнение с шага 2.
- В противном случае закончим.
Так как порядок обхода соседей в каждой вершине не является фиксированным, то для данного графа BFS может вывести несколько различных последовательностей. В данной задаче вам нужно проверить, может ли данная последовательность соответствовать какому-то запуску BFS на заданном дереве, начиная с вершины \(1\). Деревом называется неориентированный граф, в котором между каждой парой вершин есть ровно один простой путь. Выходные данные Выведите «Yes» (без кавычек), если порядок вершин соответствует какому-то корректному BFS на данном дереве, и «No» (без кавычек) иначе. Вы можете выводить каждую из букв в любом регистре (строчную или заглавную). Примечание Оба теста из примеров содержат одинаковое дерево. Для этого дерева существует два возможных порядка вершин, соответствующих какому-то запуску BFS. - \(1, 2, 3, 4\),
- \(1, 3, 2, 4\).
Порядок вершин \(1, 2, 4, 3\) не может получится в результате BFS.
| |
|
|
F. Сделай единицу
битмаски
дп
Комбинаторика
кратчайшие пути
математика
теория чисел
*2500
Януш — бизнесмен. Он владеет компанией «Янушзекс», которая производит игры для школьников. Последним хитом Янушзекс является крутая игра для одного человека «Сделай единицу». Игроку дана последовательность из \(n\) целых чисел \(a_i\). Разрешается выбрать любое подмножество из них и количество очков равно наибольшему общему делителю выбранных чисел. Игроку нужно выбрать наименьшее количество элементов, получив количество очков, равное \(1\). Теперь Януш интересуется, какое минимальное количество элементов нужно выбрать игроку в таком случае? Выходные данные Если нет ни одного подмножества данной последовательности с наибольшим общим делителем равным \(1\), то выведите -1. Иначе выведите ровно одно целое число — размер минимального множества с наибольшим общим делителем равным \(1\). Примечание В первом примере подмножество, соответствующее всей последовательности даёт наибольший общий делитель равный \(1\). Все меньшие подмножества дают наибольший общий делитель больший \(1\). Во втором примере наибольший общий делитель любого подмножества хотя бы \(2\).
| |
|
|
F. Самое короткое условие
графы
Деревья
кратчайшие пути
*2400
Вам задан взвешенный неориентированный связанный граф состоящий из \(n\) вершин и \(m\) ребер. Вам нужно ответить на \(q\) запросов, \(i\)-й запрос — найти кратчайшее расстояние между вершинами \(u_i\) и \(v_i\). Выходные данные Выведите \(q\) строк. В \(i\)-й строке должен содержаться ответ на \(i\)-й запрос — кратчайшее расстояние между вершинами \(u_i\) и \(v_i\).
| |
|
|
B. Лабиринт
графы
кратчайшие пути
*1800
В одном из уровней компьютерной игры вы попали в лабиринт, состоящий из n строк, каждая из которых содержит m клеток. Каждая клетка либо свободна, либо занята препятствием. Стартовая клетка находится в строке r и столбце c. За один шаг вы можете переместиться на одну клетку вверх, влево, вниз или вправо, если она не занята препятствием. Вы не можете перемещаться за границы лабиринта. К сожалению, ваша клавиатура крайне близка к поломке, поэтому вы можете переместиться влево не более x раз и вправо не более y раз. При этом ограничений на перемещения вверх и вниз нет, поскольку клавиши, используемые для движения вверх и вниз, всё ещё в идеальном состоянии. Теперь вы для каждой клетки поля решили установить, можно ли выбрать такую последовательность нажатий, которая приведёт вас из стартовой в эту клетку. Посчитайте, сколько клеток поля обладают таким свойством. Выходные данные Выведите одно число — количество клеток лабиринта, достижимых из стартовой, включая её саму. Примечание Клетки, достижимые в соответствующем примере, отмечены '+'. Первый пример +++.. +***. +++** *+++.
Второй пример .++. .+*. .++. .++.
| |
|
|
D. Три фигуры
дп
кратчайшие пути
поиск в глубину и подобное
*2200
Вы наткнулись на новый вид шахматной головоломки. Доска, на которой вы играете, не обязательно \(8 \times 8\), но обязательно \(N \times N\). На каждой клетке записано некоторое число от \(1\) до \(N^2\), и все числа попарно различны. В \(j\)-й клетке \(i\)-й строки записано число \(A_{ij}\). У вас в распоряжении только три фигуры: конь, слон и ладья. Вначале вы выставляете одну из фигур в клетку с номером \(1\) (вы сами выбираете какую). Далее вы хотите добраться до клетки с номером \(2\) (возможно, проходя через некоторые другие клетки в процессе), далее — до клетки \(3\) и так далее, пока не достигнете клетки \(N^2\). За один шаг вы можете либо сделать один валидный ход текущей фигурой, либо заменить фигуру на другую в вашем распоряжении. Каждая клетка может быть посещена любое количество раз. Конь может ходить на две клетки по горизонтали и одну по вертикали, либо на две клетки по вертикали и одну по горизонтали. Слон двигается по диагонали. Ладья движется по вертикали или горизонтали. Во время хода фигуры она должна переместиться в клетку, отличную от текущей. Вы хотите минимизировать общее количество шагов. Среди всех путей с одинаковым количеством шагов вам нужно выбрать тот, который минимизирует количество замен фигур. Найдите путь, отвечающий всем условиям. Выходные данные В единственной строке выведите два числа — количество шагов в лучшем ответе и количество замен в нем. Примечание Один из оптимальных ответов описан ниже (начальная фигура — конь): - Перейти в \((3, 2)\)
- Перейти в \((1, 3)\)
- Перейти в \((3, 2)\)
- Заменить коня на ладью
- Перейти в \((3, 1)\)
- Перейти в \((3, 3)\)
- Перейти в \((3, 2)\)
- Перейти в \((2, 2)\)
- Перейти в \((2, 3)\)
- Перейти в \((2, 1)\)
- Перейти в \((1, 1)\)
- Перейти в \((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\)-мультиежом. Выходные данные Выведите "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\). 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\). Ваша задача — удалить ребра таким образом, чтобы количество хороших вершин было максимально. Выходные данные В первой строке выведите \(e\) — количество ребер, которые останутся в графе (\(0 \le e \le k\)). Во второй строке выведите \(e\) различных целых чисел от \(1\) до \(m\) — номера ребер, которые останутся в графе. Ребра пронумерованы в том же порядке, в котором задавались во входных данных. Количество хороших вершин должно быть максимально возможным.
| |
|
|
D. Максимальное расстояние
графы
кратчайшие пути
снм
сортировки
*1800
Chouti устал от утомительного домашнего задания и решил открыть старую задачу, которую он придумал несколько лет назад. Дан связный неориентированный граф, состоящий из \(n\) вершин и \(m\) взвешенных ребер. Также есть \(k\) выделенных вершин: \(x_1, x_2, \ldots, x_k\). Определим стоимость пути как максимальный вес среди рёбер на пути, а расстояние между двумя вершинами как минимальную стоимость пути, их соединяющего. Для каждой выделенной вершины найдите другую выделенную вершину, которая является максимально далёкой от неё (в терминах абзаца выше, то есть соответствующее расстояние максимально возможное), и выведите расстояние между ними. Оригинальные ограничения очень маленькие, поэтому он подумал, что задача скучная. Теперь он увеличил ограничения и надеется, что вы можете решить эту задачу за него. Выходные данные В единственной строке выведите \(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\) — это показатель скорости игрока) движений влево, вверх, вправо или вниз, не проходящих через заблокированные клетки или клетки с замками других игроков. Игрок рассматривает множество клеток, в которые он может расшириться, и моментально строит во всех них свой замок. После этого ход переходит к следующему игроку. Игра заканчивается, когда ни один игрок не может сделать ход. Вам дано поле игры и скорости расширения для каждого игрока. Килани хочет узнать для каждого игрока как много клеток он будет контролировать (иметь там замок) после того как игра закончится. Выходные данные Выведите \(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\).
Выходные данные Выведите лексикографически наименьшую последовательность \(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\) запросов к графу; в каждом запросе требуется подсчитать длину кратчайшего пути между какой-то парой вершин. Можете ли вы справиться со всеми запросами? Выходные данные Выведите \(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\) в каждом из планов Куро. Выходные данные Выведите \(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\) вершин в данном графе так, чтобы каждая невыбранная вершина была смежна (другими словами, связана ребром) с хотя бы одной выбранной вершиной. Гарантируется, что ответ существует. Если существует несколько решений, выведите любое из них. Требуется ответить на несколько независимых запросов. Выходные данные Для каждого запроса выведите две строки. В первой строке выведите \(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\) или сообщить, что это сделать невозможно. Выходные данные Выведите одно целое число — если невозможно составить множество \(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\) золота. Какое минимальное количество золота повстанцы потеряют, если они создадут оптимальное количество фейковых баз? Выходные данные Выведите одно целое число — минимальную цену в золоте. Примечание Один из способов минимизировать стоимость — это построить \(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\) тоже используется. Выходные данные Выведите одно целое число — максимальную суммарную прибыль, которую можно получить. Примечание Оптимальной стратегией является выбрать корабли 1, 2, and 4, которые будут атаковать базы 1, 1 и 2 соответственно.
| |
|
|
E2. Вторжение Далеков (средняя)
графы
Деревья
кратчайшие пути
поиск в глубину и подобное
*2100
После успешных полевых испытаний, Хайди хочет развернуть ловушку вдоль какого-нибудь Коридора, не обязательно первого. Она хочет избежать встречи с Далеками внутри Временного Вихря, поэтому для большей осторожности она рассматривает размещение ловушек только вдоль тех коридоров, которые не будут использоваться в соответствии с текущим планом Далеков, который представляет из себя минимальное остовное дерево из Коридоров. Хайди знает, что потребности в энергии для всех Коридоров теперь разные, и что у Далеков есть единственный план, который они собираются использовать. Вашей задачей является вычисление функции \(E_{max}(c)\), которая определена также как и в лёгкой версии — как наибольшее \(e \le 10^9\), такое что если мы изменим энергию коридора \(c\) на \(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\). Выходные данные Выведите одно целое число — длину \(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\). Выходные данные Выведите единственное число — количество достаточно больших вкладываемых поднаборов таких, что пустота каждого такого поднабора минимально возможная. Так как ответ может быть очень большим, выведите его по модулю \(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\)-счетчик может вести себя следующим образом: - он выводит \(0\) и добавляет \(4\) к своему значению, поэтому текущее значение — \(4\), и вывод — \(0\);
- он выводит \(4\) и добавляет \(4\) к своему значению, текущее значение — \(8\), и вывод — \(04\);
- он выводит \(8\) и добавляет \(4\) к своему значению, текущее значение — \(12\), и вывод — \(048\);
- он выводит \(2\) и добавляет \(2\) к своему значению, текущее значение — \(14\), и вывод — \(0482\);
- он выводит \(4\) и добавляет \(4\) к своему значению, текущее значение — \(18\), и вывод — \(04824\).
Это только один из возможных выводов; например, этот же счетчик мог сгенерировать \(0246802468024\) как вывод, если бы он добавлял \(2\) на каждом шаге. Вы выписали последовательность, которая была сгенерирована \(x\)-\(y\)-счетчиком. Но последовательность была испорчена и некоторые ее элементы могли быть стерты. Теперь вы хотите восстановить эту последовательность, но вы даже не знаете тип счетчика, который вы использовали. У вас есть только десятичная строка \(s\) — оставшиеся элементы последовательности. Для каждого \(0 \le x, y < 10\) посчитайте минимальное количество цифр, которое вам необходимо вставить в строку \(s\), чтобы сделать ее возможным выводом \(x\)-\(y\)-счетчика. Заметим, что вы не можете менять порядок цифр в строке \(s\) или стирать какие-то цифры; разрешены только вставки. Выходные данные Выведите матрицу \(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\) является хорошей, но вам предстоит найти кратчайшую хорошую подпоследовательность. Если существует несколько кратчайших хороших подпоследовательностей, выведите любую. Выходные данные В первой строке выведите одно число \(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\), где И обозначает операцию побитового И. Найдите длину кратчайшего цикла в этом графе, или определите, что в графе нет циклов. Выходные данные Если в графе нет циклов, выведите \(-1\). Иначе выведите длину кратчайшего цикла. Примечание В первом примере, самым коротким циклом будет \((9, 3, 6, 28)\). Во втором примере, самым коротким циклом будет \((5, 12, 9)\). В графе нет циклов в третьем примере.
| |
|
|
F. Коала и блокнот
графы
Деревья
кратчайшие пути
поиск в глубину и подобное
Строки
Структуры данных
*2600
Страна коал состоит из \(n\) городов и \(m\) двусторонних дорог, их соединяющих. Дороги пронумерованы от \(1\) до \(m\) в порядке входных данных. Гарантируется, что можно добраться от каждого города до любого другого города. Коала начинает путешествие из города \(1\). Каждый раз, когда он проходит по дороге, он записывает её номер в блокнот. Он не делает пробелов между числами, так что все записи склеятся в одно большое число. Перед тем как отправится в свой путь, Коала интересуется какое число может получится в блокноте в зависимости от конечного пункта. Для каждого возможного конечного пункта выясните, какое наименьшее число может для него получиться? Так как эти числа могут быть достаточно большими, вычислите их по модулю \(10^9+7\). Обратите внимание, что нужно вычислить остаток минимального возможного числа, не минимально возможный остаток. Выходные данные Выведите \(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 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\), но множество деревьев может быть произвольным. Выходные данные В первой строке выведите единственное число \(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|\) км.
Шичикуджи хочет осуществить эту затею, потратив как можно меньше денег, так как она считает, что нет ничего важнее в мире, чем деньги. Однако она умерла, когда была всего в пятом классе (разумеется, божества не стареют после смерти), поэтому недостаточно смышленая, чтобы воплотить проект в жизнь. Поэтому она просит вас о помощи. Таким образом, от вас требуется предоставить Шичикуджи следующую информацию: минимальное количество иен, необходимое, чтобы обеспечить электричеством все города, города, в которых будут построены электростанции, и проведенные соединения. Если существует несколько способов так выбрать города и соединения, чтобы получить конструкцию минимальной цены, то выведите любую из них. Выходные данные В первой строке выведите одно целое число, обозначающее минимальное количество иен, требуемых для конструкции. Затем выведите одно целое число \(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 — у каждого одинаковая вероятность выпасть.
Обратите внимание, что: - возможно, что некоторые лестницы пересекаются, но игрок не может перелезть на другую лестницы, пока он использует первую.
- возможно, что лестница ведет на самый верхний ряд, но не выше;
- возможно, что две лестницы ведут в одну и ту же клетку;
- возможно, что лестница ведет в клетку, в которой находится основание другой лестницы, но игрок не может воспользоваться второй, если он использовал первую;
- игрок может только залезать вверх по лестнице, спускаться вниз не может.
Хиякугоку хочет как можно быстрее закончить игру. Поэтому на каждом ходу она выбирает, залезать по лестнице или нет, оптимальным способом. Помогите ей определить минимальное математическое ожидание количества ходов, которое может занять игра. Выходные данные Выведите единственное вещественное число — минимальное математическое ожидание количества ходов, которые может занять игра. Ваш ответ будет засчитан, если его абсолютная или относительная ошибка не будет превосходить \(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\) целых чисел \(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. 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\). Для каждой миссии, вам требуется найти минимальную емкость батареи, которая требуется, чтобы пройти эту миссию. Выходные данные Вам нужно вывести \(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\) целых чисел \(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\) минимально возможна. Выходные данные В первой строке выведите одно целое число \(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\). Джабер просит вашей помощи в расчете минимального возможного времени, необходимого, чтобы попасть из стартового города в конечный в каждой миссии. Выходные данные Для каждой миссии выведите минимальное время, необходимое, чтобы попасть в клетку \((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\). Путь может содержать одни и те же вершины и ребра несколько раз. Все запросы независимы друг от друга; т.е. добавленное ребро удаляется для следующего запроса. Выходные данные Для каждого запроса, выведите «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\). Так как Бесси нужно больше тренироваться, Фермер Джон должен максимизировать длину данного кратчайшего пути. Помогите ему! Выходные данные Выведите единственное число — максимально возможную длину кратчайшего пути из \(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\) независимых планов. Выходные данные Для каждого плана выведите максимальную длину кратчайшего пути, которую может достичь Фермер Джон, если суммарная прибавка не превосходит \(x_i\). Ваш ответ будет считаться верным, если абсолютная или относительная погрешность не будет превосходить \(10^{-6}\). Формально, пусть Ваш ответ равен \(a\), а ответ жюри равен \(b\). Вас ответ засчитается тогда и только тогда, когда\(\frac{|a - b|}{\max{(1, |b|)}} \le 10^{-6}\).
| |
|
|
E. НАСТОЯЩАЯ Теория чисел от Ехаба
графы
кратчайшие пути
Перебор
поиск в глубину и подобное
теория чисел
*2600
Вам дан массив \(a\) длины \(n\), который имеет специальное условие: каждый элемент в этом массиве имеет не более 7 делителей. Найдите длину кратчайшей непустой подпоследовательности этого массива, произведение элементов которой является полным квадратом. Последовательность \(a\) является подпоследовательностью массива \(b\), если \(a\) можно получить из \(b\), удалив несколько (возможно, ноль или все) элементов. Выходные данные Выведите длину кратчайшей непустой подпоследовательности \(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\). Эта задача оказалась не так проста, ведь возможно, таким способом даже невозможно перейти дорогу. Так как у Дениса все мысли о любви, он не справился решить ее и попросил нас помочь ему в этом. Найдите минимальное возможное время, за которое он сможет перейти дорогу по таким правилам, либо установите, что это сделать невозможно. Выходные данные Выведите одно целое число — минимальное время, за которое Денис может перейти дорогу по всем правилам. Если перейти дорогу по всем правилам невозможно выведите \(-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\). Он может задавать вам эти вопросы по несколько раз. Выходные данные Выведите \(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\), состоящей из нулей и единиц. Вам интересно, действительно ли произошли учения. Другими словами, существует ли такая последовательность выстрелов, что в конце получится заданная матрица? Каждая пушка может сделать произвольное количество выстрелов. Перед началом учений полигон состоит из нулей. Выходные данные Для каждого набора тестовых данных выведите: - YES, если существует последовательность выстрелов, приводящая к заданной матрице;
- NO, если такой последовательности не существует.
Буквы в словах YES и NO можно выводить в любом регистре. Примечание Первый набор тестовых данных примера разобран в условии. Ответ на второй набор NO, так как, вылетев из любой пушки, единица в клетке (\(1, 1\)) продолжила бы свой полет дальше.
| |
|
|
D. Решить лабиринт
графы
жадные алгоритмы
Конструктив
кратчайшие пути
поиск в глубину и подобное
реализация
снм
*1700
Vivek столкнулся с интересной задачей. У него есть лабиринт, который можно описать таблицей \(n \times m\). Каждая клетка может быть одного из следующих типов: - Пустая — '.'
- Стена — '#'
- Хороший человек — 'G'
- Плохой человек — 'B'
Единственный выход из лабиринта находится в клетке \((n, m)\). Человек может перейти в клетку если она не содержит стену и она имеет общую сторону с его текущей клеткой. Vivek хочет заблокировать (заменить на стены) некоторые пустые клетки, чтобы все хорошие люди могли дойти до выхода из лабиринта, но чтобы все плохие люди не могли. Клетку которая исходно содержит 'G' или 'B' нельзя блокировать, но через нее можно проходить. Ваша задача — определить, можно ли заменить несколько (ноль или более) пустых клеток на стены, чтобы удовлетворить описанным ограничениям. Гарантируется, что клетка \((n,m)\) пустая. Vivek разрешается ее блокировать. Выходные данные Для каждого набора входных данных, выведите «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\) запросов. Протокол взаимодействия Для того, чтобы сделать запрос, выведите единственную строку в следующем формате: - В начале строки выведите «? 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\) запросов. Протокол взаимодействия Для того, чтобы сделать запрос, выведите единственную строку в следующем формате: - В начале строки выведите «? 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 - 2\) строк с ответами для каждого гена от \(2\) до \(G - 1\) в такой последовательности. Если с помощью данных антител возможно обнаружить все вирусы, которые могут появиться в результате мутаций из конкретного гена, выведите слово «YES». Это нужно вывести также и тогда, если из данного гена не может появиться ни один вирус (такое может случиться также и тогда, если цепочка никогда не перестаёт мутировать). Иначе выведите слово «NO», за которым выведите длину кратчайшего вируса, который невозможно обнаружить. Гарантируется, что это значение во всех тестовых примерах меньше, чем \(2^{63}\). Система оценки Подзадачи: - (11 баллов) Без антител (\(M = 0\))
- (14 баллов) \(N = G - 2\)
- (25 баллов) Одно антитело (\(M = 1\))
- (32 баллов) Сумма всех значений \(\ell\) не превышает \(10\)
- (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\). Помогите Омкару выбрать подотрезок эльфов таким образом, чтобы количество позиций в итоговой расстановке Омкара, содержащих тот же тип пирога, что и в его идеальной расстановке, было максимально возможным. Обратите внимание, что поскольку Омкар обладает большим воображением, может случиться так, что количество пирогов каждого типа в его первоначальном расположении и в его идеальном расположении не совпадают. Выходные данные Выводите две строки. Первая строка должна содержать одно целое \(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}\) к сторонам куска ткани. Рарити интересно, сколько существует вариантов вырезать выкройку, которая удовлетворяет всем нужным условиям. Помогите ей удовлетворить свое любопытство, чтобы она могла продолжать работу над своим новым шедевром! Выходные данные Выведите единственное число — количество способов вырезать выкройку, чтобы удовлетворить условия Рарити. Примечание В первом тесте из условия подходят все выкройки размера \(1\) и одна размера \(2\). Во втором тесте из условия подходят только выкройки размера \(1\).
| |
|
|
D. Два пути
графы
Деревья
дп
кратчайшие пути
поиск в глубину и подобное
*1900
Как вы знаете, Васин брат живет во Флатландии. Во Флатландии n городов, соединенных n - 1 двусторонней дорогой. Города пронумерованы от 1 до n. Из любого города можно добраться до любого другого двигаясь по дорогам. Компания «Два пути», в которой работает Васин брат, выиграла тендер на ремонт двух путей во Флатландии. Путем называется последовательность различных городов, последовательно соединенных дорогами. Пути, которые надо отремонтировать, компания может выбрать самостоятельно. Единственное условие, накладываемое тендером — они не должны пересекаться (то есть иметь общих городов). Известно, что прибыль, которую получит компания «Два пути», равна произведению длин выбранных двух путей. Считая длину каждой дороги равной 1, а длину пути равной количеству дорог в ней, найдите максимальную возможную прибыль компании. Выходные данные Выведите максимальную возможную прибыль.
| |
|
|
E. Егор в республике Дагестан
графы
дп
жадные алгоритмы
Конструктив
кратчайшие пути
поиск в глубину и подобное
*2500
Егор — известный российский певец, рэпер, актёр и блогер, и наконец-то он решил дать концерт в солнечной республике Дагестан. В республике есть \(n\) городов, некоторые пары которых соединены \(m\) односторонними дорогами без дополнительных условий. Иными словами, дорожная сеть Дагестана представляет собой произвольный ориентированный граф. Егор собирается прилететь в город \(1\), проехать из него по дорогам вдоль некоторого пути до города \(n\), дать в нём концерт и улететь. Как и у любого артиста, у Егора есть множество недоброжелателей и слишком назойливых фанатов, поэтому ездить Егор и его команда будут только по безопасным дорогам. В Дагестане есть два типа дорог, чёрные и белые: по чёрным можно безопасно проехать только ночью, а по белым — только утром. Перед началом поездки менеджер Егора составляет расписание: он выбирает для каждого города его тип, чёрный или белый, и если команда посещает какой-то город, то уехать из него она сможет только по одной из дорог соответствующего типа. После определения расписания Егор выбирает любой маршрут из города \(1\) в город \(n\), причём из соображений безопасности этот путь должен быть кратчайшим. Менеджер Егора очень любит Дагестан и хочет задержаться здесь подольше, поэтому он попросил Вас составить такое расписание, чтобы из города \(1\) в город \(n\) не существовало пути вообще, или кратчайший путь был максимально возможной длины. Путём является один город или последовательность дорог такая что начало каждой дороги в последовательности (кроме первой) является концом предыдущей. Егор может перемещаться вдоль пути, только если все его дороги безопасны. Длиной пути называется количество дорог в нём. Кратчайшим путём называется путь минимальной длины. Выходные данные В первой строке выведите длину искомого пути (или \(-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. В другую сторону прыгать не разрешается. Ваша задача — найти минимальное время, которое потратит Вася, чтобы преодолеть дистанцию. Выходные данные Выведите в первую строку минимальное время в секундах, которое нужно Васе, чтобы преодолеть трассу. Во вторую строку выведите 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\) независимых наборов тестовых данных. Выходные данные Выведите ответ на каждый набор тестовых данных: минимальное количество очков пропуска, которое ваш друг должен использовать для того, чтобы вы с вашим другом убили всех \(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)\), к данной ячейке. Выходные данные Для каждого набора входных данных выведите наименьшую стоимость пути от начала координат до данной клетки. Примечание На рисунке ниже показано решение для первого примера. Стоимость \(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\). Помогите Юре посчитать, какое минимальное время потребуется ему для возвращения домой. Выходные данные В единственной строке выведите минимальное время для возвращения домой. Примечание В первом примере Юра должен попасть в \((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)\) после оптимального применения операции, описанной выше. Выходные данные Выведите одно целое число — минимальную суммарную стоимость курьерских маршрутов, которой вы можете достичь (то есть минимальное значение \(\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\) и минимальной высотой. Выходные данные Для каждого набора входных данных, выведите минимально возможную высоту дерева с заданным порядком обхода \(a\). Примечание В первом наборе входных данных, есть только одно дерево с заданным порядком посещения: Во втором наборе, также есть только одно дерево с заданным порядком посещения: В третьем наборе, оптимальное дерево с заданным порядком посещения изображено ниже:
| |
|
|
D. Ракетные шахты
графы
кратчайшие пути
поиск в глубину и подобное
Структуры данных
*1900
Страна Берляндия состоит из n городов, пронумерованных целыми числами от 1 до n. Некоторые города соединены двунаправленными дорогами, каждая из которых имеет некоторую длину. Из каждого города существует путь в любой другой город по дорогам. Согласно Самым Секретным Документам, Берляндию охраняют Самые Секретные Ракеты. Точное местонахождение Самых Секретных Ракетных Шахт неизвестно, но Вася сумел достать информацию, в которой сказано, что все Шахты расположены точно на расстоянии l от столицы, которая находится в городе номер s. В документах дано формальное определение: в некотором месте, являющемся городом или точкой на дороге, находится Самая Секретная Ракетная Шахта тогда и только тогда, когда кратчайшее расстояние от этого места до столицы по дорогам страны в точности равно l. Вася хочет узнать, сколько именно ракетных шахт находится в Берляндии, чтобы затем продать эту информацию вражеским шпионам. Помогите Васе. Выходные данные Выведите единственное число — сколько Самых Секретных Ракетных Шахт находится в Берляндии. Примечание В первом примере шахты расположены в городах 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\). Вы знаете про все существующие пары друзей, но не знаете доходы людей. Если это общество не может быть капиталистическим ни при каких доходах людей, сообщите об этом. Иначе, вы должны найти возможные доходы для всех людей такие, чтобы общество было капиталистическим и неравенство доходов было максимальным. Выходные данные Выведите «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\)-м городе, выбирает одно из следующих действий: - Поехать из \(i\)-го города в \(j\)-й, если существует дорога из \(i\)-го города в \(j\)-й и \(d_i < d_j\);
- Поехать из \(i\)-го города в \(j\)-й, если существует дорога из \(i\)-го города в \(j\)-й и \(d_i \geq d_j\);
- Прекратить путешествие.
Так как правительство Берляндии не хочет, чтобы все люди съезжались в столицу, поэтому Поликарп может не более одного раза совершить действие из пункта два. Иными словами, второе действие он может совершить \(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\) по выше описанным правилам. Выходные данные Для каждого набора входных данных в отдельной строке выведите \(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-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\) ... Жирным выделены последние две прослушанные песни. Обратите внимание, после удаления некоторой песни Аркадий забывает, что слушал ее и предыдущую. Вам дан начальный плейлист, определите, какие песни будут в итоге удалены и в каком порядке. Выходные данные Для каждого набора входных данных выведите одну строку. Сначала выведите одно целое число \(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\).
Найдите количество полезных рёбер в этом графе. Выходные данные Выведите одно число — количество полезных рёбер в графе. Примечание В первом примере каждое ребро полезно, кроме ребра веса \(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\). Выходные данные Для каждого набора входных данных выведите единственное число — количество различных позиций для здания выставки. Здание выставки может быть построено в той же точке, что и какой-то дом. Примечание Снизу находятся картинки поясняющие примеры. Голубые точки обозначают дома, а зеленые - возможные позиции для выставки. 
Первый пример. 
Второй пример. 
Третий пример.  Четвертый пример.  Пятый пример.  Шестой пример. Оба дома находятся в позиции \((0, 0)\).
| |
|
|
E. Парный платёж
Бинарный поиск
графы
дп
Конструктив
кратчайшие пути
Перебор
Потоки
*2200
В стране \(n\) городов и \(m\) двунаправленных дорог. Дороги в стране формируют неориентированный взвешенный граф. Граф может быть несвязным. У каждой дороги есть свой параметр \(w\). Вы можете ездить по дорогам, но правительство издало новый закон: вы можете проезжать только по двум дорогам сразу (проехать из города \(a\) в город \(b\), и из города \(b\) в город \(c\)) и вы должны будете заплатить \((w_{ab} + w_{bc})^2\) денег, чтобы проехать по этим дорогам. Для каждого города \(t\) найдите, можно ли добраться до него из города \(1\), и какое наименьшее количество денег необходимо потратить, чтобы добраться из \(1\) в \(t\). Выходные данные Для каждого города \(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\). Среди всех возможных представлений вы должны найти то, которое использует минимальное количество единиц в общей сложности. Выходные данные Выведите одно целое число \(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\) строк, каждая из которых содержит \(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\). Обратите внимание, что здесь не берется абсолютное значение. Найдите минимальную общую стоимость поездки для коммивояжёра. Выходные данные Выведите единственное целое число — минимальную суммарную стоимость. Примечание В первом примере мы можем путешествовать в порядке \(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
Мышь нашла большой красивый торт и решила прогуляться по нему, попутно объедая ягоды на верхушке торта. Торт прямоугольный и разделен на аккуратные квадраты; в некоторых квадратах есть ягода, а в некоторых нет. Мышь спешит, поэтому когда она взберется на торт в его северо-западном углу (вернняя левая клетка входных данных), она будет двигаться только на восток (направо) или на юг (вниз), пока не достигнет юго-восточного угла (нижняя правая клетка). Она съест все ягоды на клетках, через которые она пройдет, и оставит остальные ягоды нетронутыми. Мышь хочет выбрать свой путь так, чтобы съесть наибольшее возможное количество ягод. Но, возможно, ее спешка и голод затмевают ее разум и вынуждают ее принимать неоптимальные решения... Выходные данные Выведите одно число - количество ягод, которые съест мышь, следуя своей стратегии.
| |
|
|
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\) точек в произвольном порядке. Выходные данные Для каждого набора входных данных выведите одно целое число — минимальную стоимость пути, проходящего через все точки в соответствующем наборе входных данных.
| |
|
|
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\) чисел в каждой. \(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)\). Выходные данные Выведите одно число — минимальное время, которое потребуется Диме, чтобы добраться до школы. Если он не сможет добраться до школы вообще — выведите «-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\) строк, каждая из которых должна содержать \(n\) целых чисел. \(j\)-е целое число в \(i\)-й строке должно быть равно минимальному времени, необходимому для достижения города \(j\) из города \(i\). Примечание В первом примере один из возможных путей перехода от \(0\) к \(2\) был бы таким: - Остаться внутри \(0\) и ничего не делать в течение \(1\) секунды.
- Использовать первую пушку и приземлиться в \(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-машине, и не меняется в процессе взаимодействия. Выходные данные Если невозможно вычислить 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\).
- Если число в какой-то клетке строго больше \(0\), то оно должно быть строго больше, чем значение числа в по крайней мере одной клетке, примыкающей к ней по стороне.
К сожалению, Ajit еще не полностью достоин способностей Омкара. Он видит каждую клетку как "0" или "#". Если клетка обозначена как "0", то число в ней должно быть равно \(0\). Иначе число в ней может быть любым неотрицательным целым числом. Определите, сколько существует различных конфигураций элементов, при которых выполняются эти особые условия. Две конфигурации считаются различными, если существует хотя бы одна клетка такая, что числа, записанные в ней в этих конфигурациях, различны. Поскольку ответ может быть огромным, найдите ответ по модулю \(10^9+7\). Выходные данные Для каждого набора входных данных выведите одно целое число: количество допустимых конфигураций по модулю \(10^9+7\). Примечание Для первого набора входных данных есть две допустимых конфигурации: \(0000\\ 0000\\ 0000\) и \(0000\\ 0010\\ 0000\)
| |
|
|
A. Отличные графы
графы
жадные алгоритмы
Конструктив
кратчайшие пути
сортировки
*1400
У Фермера Джона есть ферма, состоящая из \(n\) пастбищ, соединенных с помощью односторонних дорог. У каждой дороги есть вес, означающий время, которое необходимо потратить, чтобы пройти по ней. Дороги могут иметь отрицательный вес, иными словами, коровы по ним движутся так быстро, что способны перемещаться назад во времени! Однако, Фермер Джон гарантирует, что коровы никак не смогут попасть во временную петлю в том смысле, что не смогут, двигаясь по дорогам, уйти бесконечно далеко в прошлое. Кроме того, каждая пара пастбищ соединена не более чем одной дорогой в каждом направлении. К сожалению, Фермер Джон потерял карту фермы. Все, что он знает — это массив \(d\), где \(d_i\) — это минимальное время, за которое коровы могут добраться до \(i\)-го пастбища из \(1\)-го, двигаясь по дорогам. Стоимость его фермы — это сумма весов всех дорог, и Фермер Джон хочет узнать минимально возможную стоимость фермы, которая не противоречит тому, что он помнит. Выходные данные Для каждого набора, выведите минимально возможную стоимость фермы, которая не противоречит воспоминаниям Фермера Джона. Примечание В первом наборе вы можете добавить дороги - от пастбища \(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\)-й клетке равна: \(\min(14 + |2 - 1|, 16 + |5 - 1|)=\min(14 + 1, 16 + 4)=\min(15, 20)=15\);
- температура во \(2\)-й клетке равна: \(\min(14 + |2 - 2|, 16 + |5 - 2|)=\min(14 + 0, 16 + 3)=\min(14, 19)=14\);
- температура в \(3\)-й клетке равна: \(\min(14 + |2 - 3|, 16 + |5 - 3|)=\min(14 + 1, 16 + 2)=\min(15, 18)=15\);
- температура в \(4\)-й клетке равна: \(\min(14 + |2 - 4|, 16 + |5 - 4|)=\min(14 + 2, 16 + 1)=\min(16, 17)=16\);
- температура в \(5\)-й клетке равна: \(\min(14 + |2 - 5|, 16 + |5 - 5|)=\min(14 + 3, 16 + 0)=\min(17, 16)=16\);
- температура в \(6\)-й клетке равна: \(\min(14 + |2 - 6|, 16 + |5 - 6|)=\min(14 + 4, 16 + 1)=\min(18, 17)=17\).
Для каждой клетки от \(1\) до \(n\) найдите температуру воздуха в ней. Выходные данные Для каждого набора входных данных выведите через пробел \(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» будут распознаны как положительный ответ). Выходные данные На каждый тест выведите ответ. Если существует такая последовательность прыжков с камня номер \(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\) минимальна. Ответ на запрос — это сумма длин этих двух кратчайших путей. Длина пути равна сумме весов рёбер на этом пути. Выходные данные Выведите \(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. 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\) по следующим правилам: - Сначала строится новый массив \(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}]\(\) - Затем каждый элемент массива \(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. Примечание В третьем наборе входных данных из примера с массивом будут происходить следующие изменения: - В начале \(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]\(\)
- Теперь \(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]\(\)
- И, наконец, при \(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\). Для экономии ресурсов Нитори хочет, чтобы вы помогли ей рассчитать минимальную стоимость строительства железной дороги до всех событий и после каждого из них. Выходные данные Выведите \(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? 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\) метров вниз (пока отдыхает). Определите, за какое минимальное число прыжков Горф способен подняться до уровня земли. Выходные данные Если лягушонок не может выбраться из колодца, выведите \(-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\) строк, каждая из которых содержит ответ на соответствующий набор входных данных. В качестве ответа выведите «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\), если Влад в любом случае победит, и минимальное необходимое число друзей иначе. Примечание В первом наборе входных данных даже если все друзья останутся в лабиринте, Влад всё равно сможет выиграть. Поэтому ответ «-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\)-е оружие используя \(1\)-й доспех и \(1\)-е оружие;
- Получить \(3\)-й доспех используя \(1\)-й доспех и \(2\)-е оружие;
- Получить \(4\)-е оружие используя \(3\)-й доспех и \(2\)-е оружие.
Во втором примере Монокарп может получить самый сильный доспех и самое сильное оружие следующим образом: - Получить \(3\)-й доспех используя \(1\)-й доспех и \(1\)-е оружие (они хорошо сочетаются, а значит сила Монокарпа равна не \(2\), а \(3\));
- Получить \(4\)-е оружие используя \(3\)-й доспех и \(1\)-е оружие.
| |
|
|
H. Оленьи игры
Бинарный поиск
графы
Конструктив
кратчайшие пути
Потоки
разделяй и властвуй
Структуры данных
*3000
На северном полюсе проживают \(n\) оленей, и все они соревнуются за первые позиции в таблице лидеров на главной странице CodeNorses (популярный сайт по спортивным оленьим играм). Довольно примечательно, что лидерство в таблице зависит от вклада и напрямую не связано с уровнем навыков в самих оленьих играх, однако для оленей таблица все равно крайне важна. На текущий момент, у \(i\)-го оленя вклад равен \(a_i\). Вы хотите повлиять на таблицу лидеров с помощью нескольких операций. За одну операцию вы можете выбрать оленя и либо увеличить, либо уменьшить его вклад на \(1\). Отрицательные вклады разрешены. При этом у вас есть \(m\) ограничений на получившиеся вклады. Каждое ограничение задается упорядоченной парой \((u, v)\), означающей, что в финальный вклад оленя \(u\) должен быть меньше или равен финального вклада оленя \(v\). Ваша задача — сделать наименьшее количество операций так, чтобы все ограничения были выполнены. Выходные данные Выведите \(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)\). Так как у Льдинки не очень хорошо с математикой, она надеется, что вы поможете ей решить эту задачу. Выходные данные Выведите три целых числа \(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», если Рам никак не может добраться к вертолету. Выходные данные Выведите минимальное число очков здоровья, которое Рам может потерять на пути от \((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\) удалением нескольких (возможно, ни одного или всех) элементов. Выходные данные Для каждого набора входных данных выведите одно целое число — размер наибольшей прочной подподпоследовательности \(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)\). Выходные данные Для каждого набора входных данных выведите в одной строке \(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)\). Выходные данные Для каждого набора входных данных выведите в одной строке \(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\) по вертикали. Выигрыш Димы будет равен финальному балансу после совершения всех ходов, то есть сумме чисел на всех посещённых клетках за вычетом стоимости всех использованных предложений. Ваша задача — определить максимальный возможный выигрыш Димы. Выходные данные Выведите одно число — максимальный возможный выигрыш Димы. Примечание В первом примере оптимально воспользоваться вторым предложением Петра за \(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\) подходящих пути. Выходные данные Для каждого тестового случая выведите единственное число — количество путей из \(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\) строк. В \(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\) чисел: \(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? 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? 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\). Какое минимальное количество операций вам потребуется для этого? Выходные данные Выведите одно целое число — минимальное количество операций, необходимое, чтобы сделать длину десятичной записи \(x\) (без ведущих нулей) равной \(n\), или \(-1\), если это невозможно. Примечание Во втором примере следующая последовательность операций позволяет достичь цели: - умножить \(x\) на \(2\), тогда \(x = 2 \cdot 2 = 4\);
- умножить \(x\) на \(4\), тогда \(x = 4 \cdot 4 = 16\);
- умножить \(x\) на \(6\), тогда \(x = 16 \cdot 6 = 96\);
- умножить \(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)\)? Выходные данные На каждый запрос выведите одно целое число — минимальное количество ходов, которое необходимо сделать, чтобы дойти из клетки \((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|).\(\) Поскольку у Лены нет нужных навыков, она попросила вас о помощи. Скажите ей оптимальную клетку, которую нужно выбрать. Выходные данные Для каждого набора входных данных выведите оптимальную ячейку \((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 хотят найти наименьшее возможное целое число \(d\), при котором они могут быть уверены, что увидят друг друга через не более чем \(d\) дней. Помогите им найти \(d\). Выходные данные Выведите наименьшее возможное целое число \(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\)?  Выходные данные Для каждого набора входных данных выведите «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\) всегда будут соединены каким-либо путём, так что кратчайший путь всегда существует. Выходные данные Для каждого набора входных данных выведите одно число — длину кратчайшего пути от \(1\) до \(n\).
| |
|
|
B. Иерархия
жадные алгоритмы
кратчайшие пути
поиск в глубину и подобное
снм
*1500
В фирму Никиты набрали n человек. Теперь ему нужно построить древовидную иерархию отношений «начальник-подчинённый» в этой фирме (то есть у каждого человека, кроме одного, должен быть ровно один начальник). Дано m заявлений вида «человек ai готов стать начальником человека bi за дополнительную плату ci». Для каждого человека известно его значение квалификации qj, и для каждого заявления выполняется условие qai > qbi. Помогите Никите определить минимальную стоимость создания иерархии, либо выяснить, что это невозможно. Выходные данные В единственной строке выходных данных выведите минимальную стоимость создания иерархии или -1, если создать иерархию невозможно. Примечание В первом примере один из возможных вариантов составления иерархии — взять заявления под номерами 1, 2 и 4, которые в сумме дадут стоимость 11. Во втором примере составить иерархию невозможно, поэтому ответ -1.
| |
|
|
D. Пустой граф
Бинарный поиск
жадные алгоритмы
Конструктив
кратчайшие пути
Структуры данных
*2000
— 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\) данного графа. Выходные данные Для каждого набора входных данных выведите единственное целое число — максимально возможный диаметр итогового графа после применения не более \(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\) чисел, \(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. 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: - Move his right hand to vertex \(4\) in \(1\) second.
- Move his left hand to vertex \(2\) in \(2\) seconds.
- 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 может начинать или останавливать движение только в целочисленные моменты времени. Выходные данные Выведите единственное целое число — минимально возможное количество времени, которое 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, в некоторых клетках которого стоят колонны. Колонны обладают необычным свойством: луч света может беспрепятственно проходить сквозь них, не меняя своего направления. Используя магию, можно превратить некоторые колонны в магические. Магические колонны отличаются от обычных тем, что луч света, проходящий через магическую колонну, отражается в четыре стороны как показано на рисунке. Слева свет проходит через обычную колонну, справа — через магическую. Василиск находится на правой стороне правой нижней клетки поля и смотрит налево (в сторону левой нижней клетки). Как гласит легенда, тот, кто посмотрит прямо в глаза Василиску, сразу умирает. А тот, кто посмотрит в глаза Василиску через колонну, окаменеет. Мы знаем, что дверь в тайную комнату находится на левой стороне левой верхней клетки поля, а также что любой заходящий в комнату человек обязательно будет смотреть по направлению своего движения (то есть в сторону правой верхней клетки). На рисунке изображен первый тестовый пример. Вам заданы размеры тайной комнаты и позиции колонн. Лорд Волдеморт попросил вас найти минимальное количество колонн, которое нужно сделать магическими, чтобы любой, кто вошел в тайную комнату, немедленно окаменел, или сказать, что задуманное сделать невозможно. Выходные данные Выведите единственное число — минимальное количество колонн, которое нужно сделать магическими, для защиты тайной комнаты или -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\), с учетом времени, потраченного на применение заклинаний? Выходные данные Для каждого набора входных данных выведите одно целое число, обозначающее наименьшее количество времени, необходимое для передачи пакета данных с компьютера \(1\) на \(n\). Примечание Граф в первом наборе входных данных: Эла может попросить волшебника использовать его заклинание на проводе с индексом \(7\), который соединяет компьютеры \(2\) и \(3\). Поскольку компьютер \(8\) подключена к компьютеру \(3\), волшебник может отключить провод \(7\) от компьютера \(3\) и подключить его к компьютеру \(8\) за \(3\) микросекунды (вес провода \(3\)). После этого пакет можно отправить с компьютера \(1\) на компьютер \(8\) за \(6\) микросекунд. Следовательно, ответ \(3 + 6 = 9\) микросекунд.
| |
|
|
F. Упоротая связность
графы
Деревья
жадные алгоритмы
интерактив
Конструктив
кратчайшие пути
снм
*2400
Это интерактивная задача. Дан простой неориентированный граф с \(n\) вершинами пронумерованными от \(1\) до \(n\), ваша задача состоит в том, чтобы покрасить все вершины так, чтобы для каждого цвета \(c\), выполнялись следующие условия: - Множество вершин цвета \(c\) является связным;
- \(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\) такая, что - \(u_1 = u\), \(v_k = v\), и \(v_i = u_{i+1}\) для любого \(1 \leq i < k\); и
- \(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\)), вы должны вывести В отдельной строке. Если это \(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 кактусы не могут расти на соседних по стороне клетках; и начальное поле соответствует этому ограничению. Монокарп может сажать новые кактусы (они также должны соответствовать вышеупомянутому условию). Он не может срубить ни один из кактусов, которые уже растут на поле — у него нет топора, а кактусы слишком колючие для его рук. Монокарп считает, что стена завершена, если нет пути от верхнего ряда поля к нижнему ряду, такого, что: - каждые две последовательные клетки в пути соседние по стороне;
- ни одна ячейка, принадлежащая пути, не содержит кактуса.
Ваша задача — посадить минимальное количество кактусов, чтобы построить стену (или сообщить, что это невозможно). Выходные данные Для каждого набора входных данных, в первой строку выведите 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. Выходные данные Для каждого запроса «?» необходимо вывести единственное число на отдельной строчке — количество очень плохих гномов, уничтоженных соответствующей Миссией Смерти. Ответы на запросы нужно выводить в хронологическом порядке. Примечание В примере после первых 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\) единиц дискомфорта его хозяину, подвинуть лежак вдоль его длинной стороны на одну клетку. Одна сторона лежака должна переместиться на место другой, а другая — в свободную клетку. Сдвиг лежака на одну клетку вправо.
В любой момент времени каждый лежак занимает две соседние клетки, не содержащие ничего другого. Вы можете двигать одновременно максимум один лежак. Помогите Андрею освободить место для еще одного лежака, доставив минимальное количество дискомфорта окружающим, или скажите, что сделать это не получится. Выходные данные Выведите одно число — минимальное количество дискомфорта, которое возникнет при освобождении места для лежака. Если освободить место для лежака невозможно, выведите число \(-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\) чисел, каждое из которых является ответом на соответствующий набор входных данных. Если невозможно добиться температуры \(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. 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\)-му пауку. У исследователей есть гипотеза, что пауки всегда передают сообщения оптимально. По этой причине ученым потребуется программа, которая смогла бы вычислить минимальное время передачи сообщения, а также вывести один из оптимальных маршрутов. Выходные данные Если передать сообщение между заданной парой пауков невозможно, выведите \(-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. 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\). Чему равно минимальное количество участков дорог, на которых нужно изменить направление? Выходные данные Для каждого набора входных данных выведите минимальное количество участков дороги, на которых нужно изменить направление движения. Примечание Первый пример показан на рисунке в условии. Существует несколько решений, изменяющих направление на ровно \(2\) участках дорог, но изменение направления только на \(1\) участке дороги не может привести к тому, что от каждого перекрестка можно добраться до любого другого. Одно из возможных решений показано на рисунке ниже, измененные участки дорог показаны синим. Во втором примере ответ равен \(0\), потому что уже в изначальной конфигурации можно от каждого перекрестка добраться до любого другого.
| |
|
|
F. Тимофей и черно-белое дерево
графы
Деревья
жадные алгоритмы
кратчайшие пути
математика
Перебор
поиск в глубину и подобное
разделяй и властвуй
*2100
Тимофей приехал в известную летнюю школу и нашел там дерево на \(n\) вершинах. Дерево — это связный неориентированный граф без циклов. Каждая вершина этого дерева, кроме \(c_0\), покрашена в белый цвет. Вершина \(c_0\) покрашена в черный цвет. Тимофей хочет покрасить все вершины этого дерева в черный цвет. Для этого он выполняет \(n - 1\) операцию. Во время \(i\)-й операции он выбирает белую вершину \(c_i\) и красит ее в черный цвет. Назовем позитивностью дерева минимальное расстояние между всеми парами различных черных вершин в нем. Расстоянием между вершинами \(v\) и \(u\) называется количество ребер на пути от \(v\) до \(u\). После каждой очередной покраски Тимофей хочет знать позитивность текущего дерева. Выходные данные Для каждого набора входных данных выведите в отдельной строке \(n - 1\) число. Число с номером \(i\) должно быть равно позитивности дерева, полученного первыми \(i\) покрасками. Примечание В первом наборе входных данных, после второй покраски, дерево выглядит так:  Расстояние между вершинами \(1\) и \(6\) равно \(3\), расстояние между вершинами \(4\) и \(6\) равно \(3\), расстояние между вершинами \(1\) и \(4\) равно \(2\). Позитивность такого дерева равна минимуму из этих расстояний, то есть \(2\). В третьем наборе входных данных, после четвертой покраски, дерево выглядит так:  Позитивность такого дерева равна \(2\).
| |
|
|
G. Фишки на графе
графы
Конструктив
кратчайшие пути
поиск в глубину и подобное
*2300
Вам дан неориентированный связный граф, в некоторых вершинах которого находятся фишки и/или бонусы. Рассмотрим игру, в которой участвует один игрок — вы. Вы можете передвигать фишки согласно следующим правилам: - В начале игры вы можете совершить ровно один ход: подвинуть любую фишку на любую соседнюю вершину.
- Если перемещение фишки завершилось на бонусе, то разрешается совершить ещё один ход любой другой фишкой.
Можно использовать разные бонусы в любом порядке, один и тот же бонус может быть использован несколько раз. Бонусы в ходе игры не перемещаются. В одной вершине может одновременно находиться несколько фишек, но изначально в каждой вершине находится не более одной фишки. Вершина с номером \(1\) является финишной, и ваша задача — определить, можно ли попасть в неё какой-либо фишкой, совершая ходы фишками по описанным выше правилам. Если какая-то фишка изначально находится в вершине \(1\), то игра считается уже выигранной. Финиш обозначен чёрным цветом, бонусы красным, фишки — серым. Например, для данного графа можно дойти до финиша фишкой из \(8\)-й вершины, совершив следующую последовательность ходов: - Перейти из \(8\)-й вершины в \(6\)-ю.
- Перейти из \(7\)-й вершины в \(5\)-ю.
- Перейти из \(6\)-й вершины в \(4\)-ю.
- Перейти из \(5\)-й вершины в \(6\)-ю.
- Перейти из \(4\)-й вершины в \(2\)-ю.
- Перейти из \(6\)-й вершины в \(4\)-ю.
- Перейти из \(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\) монет каждый. Помогите фокуснику узнать, сможет ли он добраться до дома, а также какое минимальное количество представлений придется для этого организовать. Выходные данные Для каждого теста выведите единственное целое число — минимальное количество представлений, которое придется организовать Боре, чтобы добраться до дома, или \(-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\). Взломы Вы не можете делать взломы в этой задаче. Выходные данные Выведите последовательность из \(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\) вершинами и без рёбер. Вы можете делать два типа запросов: - Укажите целое число \(x\) такое, что \(2 \le x \le 2n\). Тогда для всех целых чисел \(i\) (\(1 \le i \le n\)) таких, что \(1 \le x-i \le n\), будет добавлено ребро между вершинами \(i\) и \(x-i\).
- Запросить число рёбер в кратчайшем пути между вершинами \(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\)). Протокол взаимодействия Взаимодействие для каждого набора входных данных начинается после считывания \(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. Ответ будет считаться правильным, если абсолютная или относительная погрешность не превышает 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\)
Выходные данные Для каждого набора входных данных выведите два целых числа — минимальное и максимальное количество хороводов, которое могло быть.
| |
|
|
F. Тенцинг и дерево
Деревья
жадные алгоритмы
кратчайшие пути
поиск в глубину и подобное
сортировки
*2500
У Тенцинга есть неориентированное дерево из \(n\) вершин. Определим ценность дерева с черными и белыми вершинами следующим образом: значение ребра — это абсолютная разница между количеством черных вершин в двух компонентах дерева после удаления ребра. Ценность дерева — это сумма значений по всем ребрам. Для всех \(k\) таких, что \(0 \leq k \leq n\), Тенцинг хочет знать максимальную ценность дерева, когда \(k\) вершин окрашены в черный цвет, а \(n-k\) вершин — в белый. Выходные данные Выведите \(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\)? Выходные данные Для каждого запроса выведите одно целое число в отдельной строке — минимальное время, за которое можно добраться в соответствующем запросе. Примечание В первом наборе входных данных в первом запросе оптимально не проходить курсы вождения. Тогда минимальное время равно сложности дороги между городами \(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\). Выходные данные На каждый запрос выведите одно целое число — минимальное количество действий, необходимое, чтобы передвинуть курсор из позиции \(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 не хочет экономить время, но хочет сэкономить деньги. Поэтому вам нужно сказать ему минимальное значение суммарной стоимости всех авиабилетов, если он может совершить произвольное количество перелётов. Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное значение суммарной стоимости всех авиабилетов. Примечание В первом наборе входных данных: Крупные города отмечены красным. Оптимальный способ выбора перелётов: \(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-воин хочет разработать лучшие стратегии выбора автомобилей и дорог в каждом раунде, чтобы максимизировать шансы выиграть кубок. Для каждого раунда надо найти минимальное время, необходимое для его прохождения. Выходные данные Ваша задача — для каждого раунда вывести на отдельной строке минимальное время, необходимое для прохождения раунда. Примечание В первом примере во всех раундах 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\) — нет.
Выходные данные На каждый набор входных данных выведите одно число — наибольший возможный 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\) соответственно. Марсель хочет поймать Валериу, то есть оказаться в том же здании, что и он, или встретиться на одной дороге. Во время каждого хода они выбирают, пойти в соседнее здание от текущего или остаться в том же здании. Поскольку Валериу хорошо знает Марселя, Валериу может предсказать, куда Марсель пойдет в следующем ходу. Валериу может использовать эту информацию, чтобы сделать свой ход. Они начинают и заканчивают ход одновременно. Гарантируется, что любая пара зданий соединена некоторым путем, и между любой парой зданий есть не более одной дороги. Предполагая, что оба игрока играют оптимально, ответьте, есть ли у Валериу стратегия, чтобы бесконечно уходить от Марселя. Выходные данные Для каждого набора входных данных выведите «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)\). Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество операций. Если требуемые значения не достижимы, то вместо этого выведите \(-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\). Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное значение \(f_i\) по всем вершинам.
| |
|
|
B. Путешествия во времени
Бинарный поиск
графы
кратчайшие пути
*1900
Берляндия — страна с древней историей, столетиями в ней строились и разрушались дороги. Известно, что в Берляндии всегда было \(n\) городов. Также у вас сохранились записи про \(t\) ключевых моментов в истории страны, пронумерованных от \(1\) до \(t\). Каждая запись содержит список двунаправленных дорог между некоторым парами городов, по которым можно было перемещаться в Берляндии в конкретный момент времени. Вы обнаружили машину времени, которая перемещает вас между ключевыми моментами. К сожалению, вы не можете выбирать, в какой момент времени переместиться, но знаете порядок, состоящий из \(k\) моментов времени \(a_{i}\), в котором машина будет вас перемещать. Так как времени между перемещениями мало, то оказавшись в очередном ключевом моменте времени (в том числе после последнего перемещения во времени), вы можете проехать не более чем по одной существующей в данный момент времени дороге, выходящей из города, в котором вы оказались перед перемещением во времени. Сейчас вы находитесь в городе \(1\), и машина времени уже перенесла вас в момент времени \(a_{1}\). Вы хотите как можно быстрее добраться до города \(n\). Определите минимальное количество перемещений во времени, включая первое, которые нужно совершить, чтобы оказаться в городе \(n\). Выходные данные Выведите единственное целое число — минимально количество перемещений во времени, чтобы добраться из города \(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\)-го типа: матрицы с несколькими (двумя или более) выходами, которые Вова может использовать, чтобы покинуть матрицу.
До того как Вова начнёт перемещаться, Миша может создать больше препятствий и заблокировать часть свободных клеток. При этом Миша не может менять тип матрицы. Какое максимальное количество клеток может заблокировать Миша, не изменяя тип матрицы? Миша не может заблокировать клетку, в которой сейчас находится Вова. Выходные данные Для каждого набора входных данных выведите одно число: максимальное количество клеток, которые может заблокировать Миша. Примечание В первом наборе входных данных дана матрица \(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\). Выходные данные Для каждого набора входных данных сначала выведите \(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\) троек, описанных выше, надеясь, что Захар сможет проверить наличие потомка. Захар очень сильно хочет спать, поэтому обратился за помощью к вам. Помогите Захару ответить на все вопросы Лёши и наконец-то пойти спать. Выходные данные Для каждого вопроса Лёши выведите «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\) до любого другого города. Выходные данные Для каждого набора входных данных выведите одно целое число, обозначающее минимальное количество времени, за которое Славик может добраться из города \(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|\). Выходные данные Для каждого запроса выведите одно целое число — максимальную безопасность кругового маршрута, начинающегося в указанной клетке. Примечание Для первого примера на изображении ниже показан оптимальный круговой маршрут, начинающийся в \((1, 1)\). Безопасность кругового маршрута равна \(3\), так как минимальное манхэттенское расстояние от клетки на круговом маршруте до подводного вулкана равно \(3\). Пример оптимального кругового маршрута В четвёртом примере помните, что Томасу разрешается посещать одну и ту же клетку несколько раз за один круговой маршрут. Например, это необходимо для кругового маршрута, начинающегося в \((7, 6)\).
| |
|
|
A. Покрыли ли мы всё?
дп
жадные алгоритмы
Конструктив
кратчайшие пути
Строки
*1500
Вам дано два целых числа \(n\) и \(k\) вместе со строкой \(s\). Ваша задача состоит в том, чтобы проверить, входят ли все возможные строки длины \(n\), которые могут быть получены из первых \(k\) прописных букв латинского алфавита, как подпоследовательности в \(s\). Если ответ NO, вам необходимо также найти строку длины \(n\) из первых \(k\) прописных букв латинского алфавита такую, что она не входит как подпоследовательность в \(s\). Если существует несколько ответов — выведите любой. Примечание: Строка \(a\) называется подпоследовательностью другой строки \(b\), если \(a\) может быть получена удалением нескольких (возможно нуля) символов из \(b\) без изменения порядка оставшихся символов. Выходные данные Для каждого набора входных данных выведите 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\). Выходные данные Для каждого теста выведите одно целое число, минимальное количество шагов, необходимых, чтобы добраться с платформы \(1\) до платформы \(n\). Если невозможно добраться до платформы \(n\), выведите \(-1\). Примечание Вот как меняются уровни платформ и какие действия нам нужно выполнить в первом примере. | Платформа 1 | Платформа 2 | Платформа 3 | Действие | | Шаг 1 | 1 | 9 | 4 | Остаться на платформе 1 | | Шаг 2 | 3 | 2 | 4 | Остаться на платформе 1 | | Шаг 3 | 5 | 5 | 4 | Перейти на платформу 2 | | Шаг 4 | 7 | 8 | 4 | Остаться на платформе 2 | | Шаг 5 | 9 | 1 | 4 | Остаться на платформе 2 | | Шаг 6 | 1 | 4 | 4 | Перейти на платформу 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\). Выходные данные Для каждого набора входных данных: - Если конечная точка может быть достигнута без столкновения с камнями, выведите одно целое число — минимальное количество времени, которое 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\)-й покемон. Выходные данные Для каждого набора входных данных выведите минимальную суммарную стоимость операций, чтобы на арене оказался \(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
Бернарду не помогло строительство мостов, и он все равно продолжил везде опаздывать. Тогда Рудольф решил научить его оптимально пользоваться метро. Рудольф изобразил карту метро как неориентированный связный граф, не имеющий петель, в котором вершины представляют собой станции метро. Любая пара вершин соединяется не более чем одним ребром. Две вершины соединяются ребром, если между соответствующими станциями метро можно переместиться на поезде напрямую, минуя другие станции. Метро в городе, в котором живут Рудольф и Бернард, имеет цветовую нотацию. Это значит, что любое ребро между какими-либо станциями имеет определенный цвет. Ребра определенного цвета в совокупности образуют ветку метро. Ветка метро не может содержать не связанные между собой ребра, то есть образует связный подграф заданного графа метро. Пример карты метро приведен на рисунке. Рудольф утверждает, что маршрут будет максимально оптимальным, если он будет проходить через минимальное количество веток. Помогите Бернарду определить это минимальное количество для заданных станций отправления и назначения. Выходные данные Для каждого набора входных данных выведите единственное целое число — минимальное количество веток, через которое может пройти маршрут от станции \(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)\). Каждую секунду происходят следующие два действия одно за другим: - сначала робот двигается влево, вправо, вниз или вверх (он не может попытаться выйти за пределы поля и не может пропустить ход);
- затем он двигается по направлению стрелки, которая находится в текущей ячейке (в ячейке, в которой он окажется после своего хода).
Ваша задача — определить, может ли робот достичь клетки \((2, n)\). Выходные данные Для каждого набора входных данных выведите 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\) (без учёта прибавок за радиусы башен). Выходные данные Для каждого набора входных данных в отдельной строке выведите максимальное количество базового здоровья \(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. Он хочет как можно быстрее открыть все порталы. Какое наименьшее время ему для этого потребуется? Выходные данные Выведите единственное число — минимальное время, которое требуется игроку, чтобы открыть все порталы. Пожалуйста, не используйте спецификатор %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\). Выходные данные Для каждого набора входных данных выведите одно целое число: минимально необходимое количество фокусов или \(-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 выполняет следующие действия по порядку: - Переместить \(P_A\) в соседнюю вершину. Если вершина, в которую переместилась фигура, белая, то перекрасить эту вершину в красный цвет.
- Переместить \(P_B\) в соседнюю вершину. Если вершина, в которую переместилась фигура, красная, то перекрасить эту вершину в синий цвет.
Изначально вершина \(a\) окрашена в красный цвет. Если \(a=b\), то вместо этого вершина \(a\) окрашена в синий цвет. Обратите внимание, что на каждом шаге обе шахматные фигуры должны быть перемещены. Две фигуры могут находиться в одной вершине в любой момент времени. 378QAQ хочет узнать минимальное количество шагов, которое требуется, чтобы покрасить все вершины в синий цвет. Выходные данные Для каждого набора входных данных выведите минимальное количество шагов, которое требуется, чтобы покрасить все вершины в синий цвет. Примечание В первом наборе входных данных 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, то считается, что ниндзя выбрался из ущелья. Ущелье затапливает, и уровень воды каждую секунду поднимается на один метр. Изначально уровень воды находится на нижней границе первого участка. Ниндзя не может находиться на участках, покрытых водой. Можно считать, что нинздя и вода «ходят» по очереди — сначала ниндзя делает какое-либо действие, затем вода поднимается на один метр, затем ниндзя опять делает действие и так далее. Уровень считается пройденным, если ниндзя удалось выбраться из ущелья. После нескольких неудачных попыток, Вася начал сомневаться: возможно ли вообще пройти данный уровень или нет? Помогите ему ответить на этот вопрос. Выходные данные Выведите «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\). Предположим, что обе коровы следуют оптимальным стратегиям, чтобы обеспечить себе победу. Выходные данные Для каждого набора входных данных выведите в отдельной строке бинарную строку длины \(n - 1\). \(i\)-й символ равен \(1\), если Бесси может выиграть, если она начнет с острова \(i\). В противном случае он равен \(0\). Примечание В первом наборе входных данных нет альтернативных мостов, по которым Элси могла бы обогнать Бесси и первой достичь острова \(n\), поэтому Бесси выиграет на всех островах, потому что она всегда ходит первой. Во втором случае Бесси проиграет, если начнет с острова \(3\), потому что: - Ход Бесси: Перейти по основному мосту с острова \(3\) на остров \(4\).
- Ход Элси: Перейти по основному мосту с острова \(1\) на остров \(2\).
- Ход Бесси: Перейти по основному мосту с острова \(4\) на остров \(5\).
- Ход Элси: Перейти по альтернативному мосту с острова \(2\) на остров \(6\). Элси первой достигает острова \(n\).
| |
|
|
C. Алгоритм Дейкстры?
графы
кратчайшие пути
*1900
Задан неориентированный взвешенный граф, вершины которого пронумерованы от 1 до n. Ваша задача найти кратчайший путь из вершины 1 в вершину n. Выходные данные Выведите число -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\). Так как вы хотите выспаться, вам стало интересно — как поздно вы можете выйти из дома, чтобы успеть поговорить по телефону и при этом не опоздать на мероприятие? Выходные данные Для каждого набора входных данных выведите одно целое число — максимальный момент времени, когда вы можете выйти из дома, чтобы успеть поговорить по телефону и не опоздать на мероприятие. Если вы не можете попасть на мероприятие вовремя, выведите -1.
| |
|
|
D. Цветные порталы
Бинарный поиск
графы
жадные алгоритмы
кратчайшие пути
Перебор
реализация
Структуры данных
*1600
На прямой расположено \(n\) городов. Города пронумерованы целыми числами от \(1\) до \(n\). Для перемещения между городами используются порталы. Порталы бывают \(4\) цветов: синий, зеленый, красный и желтый. В каждом городе расположены порталы двух разных цветов. Из города \(i\) можно переместиться в город \(j\), если в них есть порталы одинакового цвета (например, между городом «красный-синий» и городом «синий-зеленый» можно перемещаться). Данное перемещение стоит \(|i-j|\) монет. Ваша задача — ответить на \(q\) независимых запросов: посчитайте минимальную стоимость, чтобы переместиться из города \(x\) в город \(y\). Выходные данные Для каждого запроса выведите одно целое число — минимальную стоимость, чтобы переместиться из города \(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\), так как встреча отменяется. Выходные данные Для каждого набора входных данных выведите одно целое число — самое раннее время, когда Робин и Мариан могут встретиться. Если встреча невозможна, выведите \(-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\).
Среди этих задач она выбирает задачу с максимальным номером, которую она ранее не выдавала участнику (до этого он её не сдавал и не пропускал). Если такой задачи нет, то соревнование для участника завершается, и его результат равен сумме баллов за все сданные задачи. В частности, если участник сдаёт первую задачу, то соревнование для него завершается. Заметьте, что участник получает каждую задачу максимум один раз. Прохор тщательно готовился к олимпиаде, и теперь он может сдать любую задачу. Помогите ему определить, какое максимальное количество баллов он может получить. Выходные данные Для каждого набора входных данных выведите единственное целое число — максимальное количество баллов, которое может получить Прохор. Примечание В первом наборе входных данных Прохор может пропустить первую задачу, тогда он получит задачу с номером \(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. 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\) кучек. После удаления ребята играют в Ним на всех оставшихся кучках из этого отрезка. Все раунды независимы: удаления, произведенные в одном раунде, не влияют на исходный массив или другие раунды. Руслану нужно удалить как можно больше кучек так, чтобы Артем, который будет ходить первым, проиграл. Для каждого раунда определите: - максимальное количество кучек, которые Руслан может удалить;
- количество способов выбрать максимальное количество кучек для удаления.
Два способа считаются различными, если существует такая позиция \(i\), что в одном из способов кучка на позиции \(i\) удаляется, а во втором — нет. Поскольку количество способов может быть большим, выведите его по модулю \(998\,244\,353\). Если в каком-то раунде Руслан не может сделать так, чтобы Артем проиграл, выведите для этого раунда одно число -1. Выходные данные Для каждого раунда: - если Руслан может победить, выведите два целых числа — максимальное количество кучек, которые можно удалить, и количество способов удалить максимальное количество кучек, взятое по модулю \(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. 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\). Он обещает вам: если вы успешно поможете ему, он поделится с вами кусочком праздничного торта Ирис. Выходные данные Для каждого набора входных данных выведите одну строку, содержащую целое число: сумму значений подходящих массивов \(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}\). Выходные данные Для каждого набора входных данных выведите ответы на все вопросы. Примечание В первом наборе входных данных одним из оптимальных путей в первом запросе является путь \(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}\). Выходные данные Для каждого набора входных данных выведите ответы на все вопросы. Примечание В первом наборе входных данных одним из оптимальных путей в первом запросе является путь \(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|\).
Определите минимально возможную суммарную стоимость всех операций или сообщите, что это значение будет бесконечно большим. Выходные данные Для каждого набора входных данных выведите одно целое число — минимальную суммарную стоимость всех операций или \(-1\), если это значение будет бесконечно большим. Примечание В первом наборе входных данных можно построить бесконечную последовательность переходов в вершины \(2, 3, 4, 1, 2, 3, 4, 1, \ldots\), по которой фишка может двигаться как в первом, так и во втором графе. Во втором наборе входных данных можно доказать, что стоимость любой операции будет больше \(0\), поэтому суммарная стоимость всех операций будет бесконечно большой.
| |
|
|
C. Контрольный пункт полиции
графы
дп
кратчайшие пути
*1900
Дорожная сеть Берляндии состоит из n городов и m двусторонних дорог. Города пронумерованы от 1 до n, причем главная столица имеет номер n, а культурная столица — номер 1. Дорожная сеть устроена таким образом, что по дорогам возможно доехать от любого города до любого другого. Проезд по каждой их дорог в любом направлении занимает одно и тоже время. Все жители Берляндии — очень ленивые люди, и поэтому, когда они хотят добраться из города v в город u, то всегда выбирают один из кратчайших путей (неважно какой именно). Правительство Берляндии хочет сделать дорожную сеть своей страны более безопасной и для этого собирается поставить в один из городов пункт полиции, который обладает странным свойством: когда гражданин Берляндии едет по дороге, в одном из концов которой находится пункт полиции, он внимательнее следит за дорогой, и поэтому все такие дороги считаются безопасными. Дороги, оба конца которых отличаются от города с пунктом полиции, считаются опасными. Теперь Правительство задумалось, где поставить пункт полиции так, чтобы усредненное количество безопасных дорог по всем кратчайшим путям от культурной столицы до главной принимало максимальное значение. Выходные данные Выведите максимально возможное значение усредненного количества безопасных дорог по всем кратчайшим путям от культурной столицы до главной. Ответ будет считаться правильным, если его абсолютная или относительная погрешность не превосходит 10 - 6. Примечание В первом примере если поставить пункт полиции в одну из столиц, тогда на каждом пути будет ровно по одной безопасной дороге, а если пункт поставить не в столицу, то среднее количество безопасных дорог также составит . Во втором примере наибольшее искомое значение достигается, если поставить пункт в город номер 4, тогда 6 путей будут иметь по 2 безопасные дороги, и один путь — 0, таким образом, ответ будет равен .
| |
|
|
B. Планеты
Бинарный поиск
графы
кратчайшие пути
Структуры данных
*1700
Гоа'улд Апофис снова захватил команду Джека О'Нила! Сам Джек смог спастись, но к тому времени корабль Апофиса уже совершил прыжок в гиперпространство. Однако Джек знает, на какой планете высадится Апофис. Чтобы спасти друзей, Джеку предстоит несколько раз пройти через звездные врата, чтобы попасть на эту планету. Всего в галактике находится n планет, пронумерованных числами от 1 до n. Джек находится на планете с номером 1, а Апофис высадится на планете с номером n. Между некоторыми парами планет можно перемещаться через звездные врата (перемещение возможно в обоих направлениях); перемещение занимает положительное и, возможно, для разных пар планет неодинаковое количество секунд. Джек начинает свое путешествие в момент времени 0. Может оказаться, что на планету, где сейчас находится Джек, через звездные врата прибывают другие путешественники, в этом случае Джек должен подождать ровно 1 секунду, прежде чем сам сможет воспользоваться звездными вратами. То есть, если в момент времени t на планету прибывает другой путешественник, то Джек может пройти через врата только в момент времени t + 1, если только в момент времени t + 1 на ту же планету не прибывают еще путешественники. Зная информацию о времени перемещения между планетами, а также о моментах времени, когда Джек не сможет пользоваться звездными вратами на конкретных планетах, определите наименьшее время, за которое он сможет попасть на планету с номером n. Выходные данные Выведите единственное число — наименьшее количество времени, которое понадобится Джеку, чтобы попасть с планеты 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). Выходные данные Для каждого запроса выведите в отдельной строке единственное целое число — длину кратчайшего пути между вершинами ai и bi. Ответы на запросы выводите в том порядке, в котором запросы заданы во входных данных.
| |
|
|
E. Встретить Ее
графы
дп
кратчайшие пути
*2600
Урпал живет в большом городе. Он назначил свидание своей любимой этим вечером. Всего в городе n перекрестков, пронумерованных от 1 до n. Перекрестки соединены m направленными улицами, все улицы имеют одинаковую длину. Урпал живет на перекрестке a, а свидание назначено в ресторане на перекрестке b. Он хочет добраться до перекрестка b на общественном транспорте. Всего есть k автобусных компаний. В начале каждой секунды автобус из i-ой компании выбирает случайный наикратчайший путь между перекрестком si и перекрестком ti и проезжает по этому пути. Возможна такая ситуация, когда от перекрестка si до перекрестка 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. 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), двигаясь только по разрешенным клеткам поля. Другими словами, во время своего пути шахматный король может находиться только лишь на разрешенных клетках поля. Напомним, что шахматный король за один ход может переместиться в любую из (в общем случае восьми) соседних клеток. Две клетки шахматного поля считаются соседними, если они имеют хотя бы одну общую точку. Выходные данные Если пути между начальной и конечной позициями, состоящего из разрешенных клеток, не существует, выведите -1. В противном случае выведите единственное целое число — минимальное количество ходов, за которое король сможет добраться из начальной позиции в конечную.
| |
|
|
C. Дороги в Берляндии
графы
кратчайшие пути
*1900
В Берляндии n городов, пронумерованных от 1 до n, некоторые из которых соединены двусторонними дорогами. Все дороги имеют длину — некоторое целое число от 1 до 1000. Известно, что из любого города можно доехать до любого другого по существующим дорогам. Так же для каждой пары городов известно кратчайшее расстояние между ними. Правительство Берляндии планирует построить k новых дорог. Для каждой запланированной дороги известна ее длина, и какие города она будет соединять. Чтобы контролировать правильность постройки новых дорог, после открытия очередной дороги правительство Берляндии хочет проверять сумму кратчайших расстояний между всеми парами городов. Помогите им — по заданной матрице кратчайших расстояний по старым дорогам и планам всех новых дорог, выясните, как будет меняться сумма кратчайших расстояний между всеми парами городов после постройки каждой дороги. Выходные данные Выведите 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). Выходные данные Выведите единственное число — наименьшее количество нажатий, требуемое для того, чтобы переместить курсор из положения (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 секунды. Василий Петрович интересуется, можно ли выбрать две клетки для подрыва гранат таким образом, чтобы все клетки, в которых спят крысы, оказались взорваны. Напишите программу, которая это выясняет. Выходные данные Если невозможно взорвать все клетки, в которых спят крысы, выведите единственное целое число -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 секунд. Выходные данные Выведите строку a, обозначающую расположение ребят в очереди спустя t секунд. Если на i-ой позиции через заданное время будет стоять мальчик, то i-ый символ a должен быть равен «B», иначе он должен быть равен «G».
| |
|
|
D. БерДональдс
графы
кратчайшие пути
математика
*2400
В Бертауне собираются открыть кафе известной сети БерДональдс. При этом очень важно правильно выбрать месторасположение нового кафе, чтобы до него было удобно добираться. Система дорог Бертауна представляет собой n перекрестков, соединенных m двусторонними дорогами. Для каждой дороги известна ее длина. Также известно, что от каждого перекрестка по дорогам можно добраться до любого другого. Ваша задача — найти такое расположение кафе, при котором кратчайшее расстояние по дорогам от кафе до самого дальнего перекрестка будет минимально. Учтите, что кафе может находиться не только на перекрестке, но и в любой точке любой дороги. Выходные данные Выведите единственное вещественное число — кратчайшее расстояние от оптимального положения кафе до самого дальнего перекрестка. Ответ будет считаться правильным, если его абсолютная или относительная погрешность не превосходит 10 - 9.
| |
|
|
E. Ссора
графы
кратчайшие пути
*2400
Друзья Вася и Петя живут в Бертауне. В этом городе n перекрестков, некоторые из которых соединены одинаковыми по длине двунаправленными улицами. Вася живет в доме на перекрестке номер 1, а Петя — в доме на перекрестке номер n. Однажды Вася и Петя поссорились так сильно, что отказывались даже видеть друг друга. Так уж вышло, что сегодня Васе нужно дойти от своего дома до перекрестка n, а Пете — от своего дома до перекрестка 1. При этом они не хотят встречаться ни на одном перекрестке, но вполне допустимо, если они встретятся в середине улицы, проходя ее в противоположных направлениях. Вася и Петя попросили вас, как их общего друга, помочь им справиться с этой непростой задачей. Найдите для Васи и Пети такие маршруты с одинаковым числом улиц, чтобы ребята, следуя маршрутам, никогда не оказывались одновременно на одном перекрестке. Встречаться в середине улицы, двигаясь навстречу друг другу, они могут (см. пример 1). Среди всех возможных маршрутов выберите такой, что количество улиц в нем как можно меньше. Пока оба одновременно не дошли до своих целей, ребята не могут стоять на месте. Вася и Петя двигаются одновременно и с одинаковой скоростью, то есть допустима ситуация, когда один из них приходит к некоторому перекрестку, а другой уходит из него же. Например, Вася может пойти от перекрестка 1 к перекрестку 2, а Петя может в то же время пойти от перекрестка 2 к перекрестку 3. Если маршрутов, удовлетворяющих всем требованиям, не существует, ваша программа должны выводить -1. Выходные данные Если искомых маршрутов не существует, выведите -1. Иначе в первой строке должно быть записано одно натуральное число k — длина кратчайшего маршрута (число улиц в нем). Следующая строка должна содержать k + 1 чисел — маршрут Васи, т. е. номера k + 1 перекрестков в порядке их прохождения Васей. Следующая строка должна содержать k + 1 чисел — маршрут Пети в том же формате. Если решений несколько, выведите любое.
| |
|
|
B. Егор и граф
графы
дп
кратчайшие пути
*1700
У Егора есть взвешенный ориентированный граф, состоящий из n вершин. В этом графе между любой парой различных вершин есть ребро в обоих направлениях. Егор любит играть с графом, и сейчас он придумал новую игру: - Игра состоит из n шагов.
- На i-том шаге Егор удаляет из графа вершину номер xi. Удаляя вершину, Егор удаляет все ребра, которые входили в данную вершину и которые выходили из нее.
- Перед выполнением каждого шага, Егор хочет знать сумму длин кратчайших путей между всеми парами оставшихся вершин. Кратчайший путь может проходить через любую оставшуюся вершину. Другими словами, если обозначить как d(i, v, u) кратчайший путь между вершинами v и u в графе, который получился до удаления вершины xi, то Егор хочет знать значение следующей суммы:
. Помогите Егору, выведите значение искомой суммы перед каждым шагом. Выходные данные Выведите n целых чисел — i-тое число равно искомой сумме перед i-тым шагом. Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на C++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.
| |
|
|
C. Егор и друзья
графы
дп
Комбинаторика
кратчайшие пути
*2100
Егор с друзьями гуляли по лесу, всего, включая Егора, гуляло n человек. Очень скоро перед ними оказалась река. Ребята сразу же захотели перебраться через реку, тем более, что возле берега, к которому подошла компания стояла лодка. Известно, что эта лодка вмещает людей, суммарным весом не более k килограмм. Егор тут же выписал на листок бумаги список весов всех людей из его компании, включая свой вес. Оказалось, что каждый человек весит либо 50, либо 100 килограмм. Сейчас Егору нужно знать, за какое минимальное количество переправ на лодке через реку вся компания сможет оказаться на другом берегу. При переправе в лодке обязательно должен быть хотя бы один человек. При переправке в лодке может сидеть любое (ненулевое) количество человек, но их суммарный вес не должен превышать k. Так же Егора заинтересовал вопрос: сколько существует способов переправить всех людей на другую сторону за минимальное количество переправ на лодке. Два способа считаются различными, если при какой-либо переправе множество людей находящихся в лодке отличается. Помогите Егору с этой задачей. Выходные данные В первую строку выведите целое число — минимальное количество переправ. Если невозможно переправить всех людей на другой берег, то выведите целое число -1. Во вторую строку выведите остаток от деления количества способов переправить людей за минимальное количество переправ на число 1000000007 (109 + 7). Если невозможно переправить всех людей на другой берег, то выведите число 0. Примечание В первом тесте Егор гуляет один и соответственно требуется только одна переправа через реку. Во втором тесте нужно действовать по следующему плану: - переправить двух людей весом по 50 килограмм;
- переправить одного человека весом 50 килограмм обратно;
- переправить человека весом 100 килограмм;
- переправить человека весом 50 килограмм обратно;
- переправить двух людей весом по 50 килограмм.
Суммарно выходит 5 переправ. В зависимости от того, какого человека выбрать на шаге 2, получаются два различных способа.
| |
|
|
A. Кратчайший путь короля
жадные алгоритмы
кратчайшие пути
*1000
Одинокий король остался совсем один на шахматной доске. Несмотря на одиночество, он вовсе не унывает — ведь ему еще надо сделать так много дел государственной важности. Например, ему надо совершить официальный визит в клетку t. Так как король не привык терять попусту время, он хочет добраться от своего местоположения s до клетки t за наименьшее число ходов. Помогите ему это сделать. Король за один ход может переместиться на любую клетку, которая по стороне или углу граничит с текущей (их в общем случае 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? Помогите Ярославу. Считайте, что время покупки и увеличения времени на таймере пренебрежимо мало. Выходные данные В единственную строку выведите целое число — ответ на задачу.
| |
|
|
C. Достать сокровище
графы
кратчайшие пути
Перебор
Структуры данных
*2500
Рейнбоу выстроил h ячеек в ряд и пронумеровал их от 1 до h слева направо. В n из этих ячеек находится сокровище. Будем называть каждую из этих n ячеек «ячейка с сокровищами». «Ячейка с сокровищами» номер i — это ai-ая ячейка, в ней лежат сокровища на ci долларов. Сейчас Фреда встала в первую ячейку. В любой момент она может пройти k ячеек вперед или вернуться в первую ячейку. Это значит, что Фреда может дойти до 1-ой, (k + 1)-ой, (2·k + 1)-ой, (3·k + 1)-ой ячеек и так далее. Рейнбоу дала Фреде m операций. Каждая операция относится к одному из следующих трех типов: - Добавить способ перемещения x: в любой момент времени можно также пройти на x ячеек вперед. Например, в самом начале у Фреды есть только один способ перемещения k. Если в какой-то момент времени у Фреды есть способы перемещения a1, a2, ..., ar, то она может дойти до любой ячейки вида
, где vi — некоторое целое неотрицательное число. - Уменьшить цену сокровища в x-ой «ячейке с сокровищами» на y долларов. Иными словами, выполнить присвоение cx = cx - y.
- Узнать стоимость самого ценного сокровища среди ячеек, до которых может дойти Фреда. Если Фреда не может дойти ни до одной ячейки с сокровищами, то считается, что стоимость самого ценного сокровища в таком случае равна 0 и дальше ничего не происходит. Иначе, Фреда забирает самое ценное сокровище из соответствующей ячейки. Если существует несколько «ячеек с сокровищами», которые содержат самое ценное сокровище, то нужно выбрать ту, номер которой минимален (такая ячейка не обязательно имеет минимальный номер, потому что нумерации ячеек и «ячеек с сокровищами» независимы). После этой операции количество ячеек, в которых содержится сокровище, становится на единицу меньше.
Фреда как программист просит Вас написать программу, которая выполнит каждую операцию. Выходные данные Для каждой операции типа 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. В некоторых клетках, как и положено лесу, растут деревья. Тень и Принцесса не могут ходить в клетку, где расположено дерево. Стоит отметить, что лес переживает трудные времена. В лесу растет совсем немного деревьев... В начальный момент времени Принцесса гуляет в клетке с координатами (vx, vy), в то время как Тень спряталась от Принцессы в клетке (sx, sy). Принцесса, Тень и деревья находятся в разных клетках. Тень играет с Принцессой. Как только Принцесса ходит на 1 в каком-либо направлении, Тень одновременно с Принцессой отлетает на 1 в том же направлении, если это возможно (если клетка, в которую она отлетает, не содержит дерево); в противном случае, Тень остается на своем месте. Тень эфемерна, поэтому наши герои никоим образом не мешают друг другу. Считается, что Принцесса поймает Тень, если после какого-либо хода она окажется с ней в одной клетке. Владе удалось отыскать свою Тень. А смогли бы Вы? Выходные данные Если Принцесса никак не сможет поймать Тень, выведите «-1» (без кавычек). Иначе выведите последовательность символов «L», «R», «D», «U», соответствующих ходам Принцессы, следуя которым, она поймает Тень в некоторой клетке своего пути (L — ход налево, R — направо, U — вверх, D — вниз; ось x направлена вправо, y — вверх). Количество символов (то есть количество ходов) не должно превышать 106. Все ходы Принцессы должны быть корректны, то есть не могут вести туда, где стоит дерево. Принцессе разрешается вставать с Тенью в одну клетку и до последнего хода. Примечание Ниже приведены картинки к примерам (Принцессе, Тени и деревьям отвечают розовый, серый и черный цвета соответственно; синим цветом помечен центр плоскости). В первом случае Принцесса может сделать два хода влево, один вверх и один вправо:  В следующем случае Принцесса не сможет добраться до Тени:  В данном примере можно сделать два хода влево и один вниз (в любом порядке): 
| |
|
|
C. Монстры и бриллианты
графы
кратчайшие пути
поиск в глубину и подобное
*2600
Красная Шапочка нашла одного монстра и книгу о монстрах. В книге она нашла информацию о том, что всего существует n типов монстров, и каждый тип монстра имеет номер (целое число от 1 до n). А также, что если монстра накормить пирожком, то он превратится в несколько (возможно, ноль) других или таких же монстров, и несколько (не менее одного) бриллиантов. Известно, что монстр определенного типа может превращаться несколькими способами. Красная Шапочка взяла монстра и посадила его на полянке. Затем она накормила его пирожком. Покуда на полянке есть хотя бы один монстр, Красная Шапочка продолжает кормить их пирожками. В конце, когда монстров больше не осталось, она собирает все бриллианты, которые получились в процессе превращений монстров. Вам дана информация о всех возможных превращениях: для каждого превращения определенного типа монстра, во что он превратится. Известно, что для каждого типа монстра имеется хотя бы одно превращение. Некоторые типы монстров могут иметь больше одного варианта превращения, тогда в тот момент, когда такой монстр превращается, Красная Шапочка выбирает, какое именно превращение будет иметь место в этот раз. Для каждого типа монстра определите, каково наименьшее и наибольшее количество бриллиантов, которое Красная Шапочка может собрать к моменту, когда на полянке не останется монстров, если изначально у нее будет один монстр этого типа. Учтите, Красная Шапочка имеет бесконечно большой запас пирожков. Выходные данные Для каждого типа монстра, в порядке их номеров, выведите одну строку с двумя целыми числами: минимальное и максимальное количество бриллиантов, которое можно получить к моменту, когда на полянке не останется ни одного монстра, если начать с одним монстром этого типа. Если, начав с этого монстра, Красная Шапочка не имеет никакого шанса остаться без монстров на полянке, выведите -1 вместо минимального и -1 вместо максимального значения. Если, начав с этим монстром, Красная Шапочка может получить произвольно большое количество бриллиантов, выведите -2 вместо максимального значения. Если любое значение в выходных данных превышает 314000000 (но является конечным), выведите 314000000 вместо этого значения.
| |
|
|
B. Биридианский лес
кратчайшие пути
поиск в глубину и подобное
*1500
Вы — разводчик микемонов. Вы на полпути к званию повелителя микемонов, но вот, Вы сталкиваетесь с проблемой: надо пройти через печально известный Биридианский лес. Биридианский лес Биридианский лес представляет собой двухмерную таблицу, состоящую из r строк и c столбцов. Каждая ячейка Биридианского леса может либо быть пустой, либо содержать дерево. В пустой ячейке могут распологаться ноль или больше разводчиков микемонов (кроме вас в лесу могут быть и другие разводчики). Разводчики микемонов (включая Вас) не могут заходить в ячейки с деревьями. Одна из ячеек служит ячейкой выхода. Вам даны исходная таблица с Вашим начальным положением, ячейка выхода и начальные положения всех остальных разводчиков. Вот пример такой таблицы (из первого тестового примера): Передвижение Разводчики (включая Вас) могут двигаться по лесу. За один ход разводчики могут выполнить одно из следующих действий: - Ничего не делать.
- Перейти из текущей ячейки в одну из четырех соседних ячеек (две ячейки называются соседними тогда, когда они имеют общую сторону). Обратите внимание, что разводчики не могут заходить в ячейки с деревьями.
- Если Вы стоите в ячейке выхода, то можете выходить из леса. Этот ход доступен только Вам — все остальные разводчики микемонов никогда не воспользуются этим шагом для выхода из леса.
После каждого Вашего шага все остальные разводчики одновременно делают ход (каждый из них выбирает ход независимо от других). Битва микемонов Если Вы и t (t > 0) разводчиков микемонов оказались в одной ячейке, тут же разгорится ровно t битв микемонов (так как вы будете сражаться с каждым из разводчиков в этой клетке). После сражения, все t разводчиков покинут лес. Обратите внимание, что после того, как Вы покинете лес, битв микемонов больше быть не может, даже если сразу за Вами в клетку выхода заходит другой разводчик микемонов. Также обратите внимание на то, что битвы проводятся только между Вами и другими разводчиками — между собой остальные разводчики не дерутся (в одной клетке могут находится несколько разводчиков одновременно). Ваша задача Вы хотели бы выбраться из леса. Для этого надо совершить некоторую последовательность шагов, завершающуюся шагом финального типа. Однако перед тем, как совершить этот грандиозный поход, вам надо опубликовать всю последовательность в своем виртуальном блоге Идол. Затем можно верно следовать этой последовательности движений. Задачи других разводчиков Вы публикуете Вашу последовательность в личном блоге, поэтому остальные разводчики будут в курсе всех Ваших передвижений еще до первого Вашего шага. Каждый из них будет двигаться так, чтобы гарантированно устроить с Вами битву микемонов, если это возможно. Если кто-то из разводчиков не сможет гарантированно устроить с Вами битву микемонов, он не будет ничего делать. Ваше задание Выведите минимальное количество битв микемонов, в которых Вам придется поучаствовать, предполагая, что Вы выбираете последовательность движений, минимизирующих это количество. Обратите внимание на то, что Вам необязательно минимизировать количество шагов. Выходные данные В единственной строке выведите минимально возможное количество битв микемонов, в которых Вам придется принять участие, если Вы выберете стратегию минимизации количества битв микемонов. Примечание Следующий рисунок иллюстрирует первый пример. Возможная последовательность движений, которую надо опубликовать в блоге, такова: С Вами смогут сразиться три разводчика с левой стороны карты — одинокий разводчик может просто стоять на месте, пока Вы не подойдете, а два других разводчика могут двигаться к одинокому и стоять с ним, поджидая Вас. У трех разводчиков справа не будет возможности сразиться с Вами, и они будут стоять на месте. Для второго примера надо опубликовать следующую последовательность в блоге: Случается вот что. Сначала надо шагнуть на ячейку вправо. Затем, два разводчика правее Вас одновременно шагнут навстречу Вам. Остальные три разводчика не могу с Вами сразиться, поэтому не делают ничего. Вы находитесь в одной клетке с 2 разводчиками, а значит тут же случится 2 битвы микемонов. После этих битв Ваши противники покинут лес. И наконец, надо сделать еще один шаг и выйти из леса.
| |
|
|
B. Строковая задача
кратчайшие пути
*1800
Мальчик Валера очень любит строки. А еще больше он любит, когда строки одинаковые. Поэтому на досуге Валера сам с собой играет в следующую игру. Он берет две произвольные строки, состоящие из строчных букв латинского алфавита, и пытается сделать из них две равные друг другу. По правилам его игры, во время очередного хода Валере разрешается заменить в одной из строк один произвольный символ Ai на произвольный символ Bi, но при этом за каждый свой ход ему придется заплатить некоторую сумму денег, равную Wi. Ходов разрешается сделать бесконечно много. Поскольку Валера очень экономный мальчик и никогда не тратит свои деньги зря, он попросил Вас, как опытного программиста, помочь ему ответить на вопрос: какое наименьшее количество денег должно быть у Валеры, чтобы он смог получить одинаковые строки. Выходные данные Если решение существует, выведите в выходной файл ответ на задачу, а также получившуюся строку. В противном случае в единственной строке выведете -1. Если оптимальных решений несколько, выведите любое из них.
| |
|
|
D. Рыцари
геометрия
графы
кратчайшие пути
сортировки
*2000
Над Берляндией снова сгустились тучи. Армия злого лорда Ван де Марта собирается захватить королевство. На военный совет созванный королём Берляндии Валерием Суровым прибыло n рыцарей. После долгих дискуссий стало ясно, что в королевстве есть ровно n опорных точек (сдача каждого из них врагу равносильна поражению в войне) и каждый рыцарь займёт одну из этих точек. Берляндия разделена на m + 1 область m заборами, и единственный способ перейти из одной области в другую это перелезть через забор. Каждый забор представляет собой окружность на плоскости, причём никакие два забора не имеют общих точек и ни одна опорная точка не находится на заборе. Вам задано k пар чисел ai, bi. Для каждой пары вам нужно узнать: сколько заборов придётся пересечь рыцарю, находящемуся в опорной точке номер ai, чтобы достигнуть опорной точки bi (в случае если Ван де Март нанесёт первый удар в опорную точку номер bi). Поскольку каждый рыцарь путешествует на коне (а коня непросто перекидывать через забор), то вам нужно для каждой пары найти минимальное число пересечений. Выходные данные Выведите ровно k строк, в каждой из которых записано одно число — ответ на соответствующий запрос.
| |
|
|
C. Ксюша и гири
графы
дп
жадные алгоритмы
Конструктив
кратчайшие пути
поиск в глубину и подобное
*1700
У Ксюши есть набор из гирек, а также чашечные весы. Каждая гирька имеет целочисленный вес от 1 до 10 килограмм. Ксюша собирается поиграть с весами и гирьками. Для этого она последовательно кладет гирьки на весы. Первую гирьку на левую чашу весов, вторую гирьку — на правую чашу весов, третью — на левую чашу весов, четвертую — на правую чашу весов и так далее. Всего Ксюша хочет положить на весы m гирек. Просто так класть гирьки на весы не интересно, поэтому Ксюша установила несколько правил. Во-первых, она не кладет на весы подряд две гирьки одинакового веса. То есть i-я положенная гирька, должна отличаться от (i + 1)-й по весу для любого i (1 ≤ i < m). Во-вторых, Ксюше хочется, чтобы каждый раз, когда она кладет гирьку на некоторую чашу весов, эта чаша весов перевешивала противоположную. То есть сумма весов гирек на соответствующей чаше должна быть строго больше, чем на противоположной. Вам заданы все типы гирек, которые имеются у Ксюши. Можете считать, что у Ксюши имеется бесконечное количество гирек каждого заданного типа. Ваша задача, помочь Ксюше выложить m гирек на весы или сказать, что это сделать невозможно. Выходные данные В первой строке выведите «YES», если существует способ выложить m гирек на весы, соблюдая все правила, иначе в первой строке выведите «NO». Если выложить m гирек на весы возможно, то в следующей строке выведите m целых чисел — веса гирек в порядке их выкладывания на весы. Если существует несколько решений, разрешается вывести любое.
| |
|
|
D. Управляем роботом
графы
дп
кратчайшие пути
*2600
Робокомпанию возглавляет жестокий человек. Его девиз: «Движение или смерть»! Именно этим его продукт и занимается. Рассмотрим поведение робота этой компании. Пусть робот движется по ориентированному графу. Поведение робота на таком графе называется «Три закона робототехники»: - Закон 1. Робот самоликвидируется, если посетит ранее посещенную вершину графа.
- Закон 2. Робот самоликвидируется, если окажется в ситуации, в которой ему некуда будет идти (иными словами, если робот зайдет в вершину, исходящая степень которой равна нулю).
- Закон 3. Робот движется случайным образом, когда он может двигаться в нескольких направлениях (то есть, когда он достигает вершины, исходящая степень которой больше единицы). Конечно, робот может двигаться только по направленным ребрам графа.
Можете представить робота с таким поведением? Поэтому они очень дешевые и рассчитаны на потребителя, стесненного в средствах. Среди них, конечно, есть пользователь mzry1992. У mzry1992 имеется такой робот и она хочет переместить его из вершины s в вершину t по направленному графу так, чтобы робот не самоликвидировался. К счастью, в каждой вершине девушка может посылать роботу специальные приказ. Специальный приказ показывает роботу нужное направление в тех случаях, когда у робота есть несколько направлений на выбор (во избежание случайного выбора направления робота согласно закону 3). Когда робот дойдет до вершины номер t, mzry1992 немедленно изымает его из графа. Таким образом, девушка всегда найдет способ достичь желаемого результата, при условии, что существует путь из s в t (независимо от того, равна ли исходящая степень вершины t нулю или нет). Тест 2 Однако отсылать приказы недешево. Поэтому Ваша задача — найти наименьшее количество приказов, которые должна отдать mzry1992 в наихудшем случае. Заметим, что mzry1992 может отдавать приказ роботу в момент движения робота по графу. Обратите внимание на первый пример для лучшего понимания этой части задачи. Выходные данные Если выполнить поставленную цель возможно, выведите требуемое минимальное количество приказов в худшем случае. Иначе выведите -1. Примечание Рассмотрим первый пример. Изначально робот находится в вершине номер 1. Таким образом, на первом шагу робот может пойти в вершину 2 или 3. В зависимости от выбора робота, mzry1992 должна отдать приказ роботу. Приказ направляет его в вершину 4. Если mzry1992 не отдает приказа роботу на вершине 2 или 3, то робот может выбрать «плохое» исходящее ребро (вернуться в вершину 1) согласно закону № 3. Таким образом, ответ — один.
| |
|
|
C. Опять пожар
кратчайшие пути
Перебор
поиск в глубину и подобное
*1500
После ужасающего лесного пожара в Берляндии была реализована программа восстановления леса, по которой были посажены N рядов по M деревьев в каждом, причем настолько ровно, что можно ввести систему координат, в которой j-тое дерево в i-м ряду будет иметь координаты (i, j). Но случилось ужасное, и едва окрепший лес загорелся. И теперь для составления плана эвакуации необходимо найти координаты дерева, которое загорится позже всех. Возгорание произошло в K точках одновременно, т.е. в начальный момент времени загорелось K деревьев. Каждую минуту огонь перекидывается со всех горящих деревьев на те деревья, которые еще не горят и расстояние от которых до ближайшего горящего дерева равно 1. Найдите дерево, которое загорится позже всех. Если таких деревьев несколько, выведите любое. Выходные данные Выведите одну строку, содержащую два целых числа x и y, записанные через пробел, — координаты дерева, которое загорится последним. Если таких деревьев несколько, выведите любое из них.
| |
|
|
E. Левко и игра
графы
жадные алгоритмы
кратчайшие пути
*2800
Левко очень любит соревнования по спортивному ориентированию в своем городе. Чтобы лучше выступать на соревнованиях Левко тренируется все свободное время. Тренировки проводятся в игровой форме. Город состоит из n перекрестков, которые соединены m + k односторонними дорогами. Между двумя перекрестками может существовать больше одной дороги, а также могут быть дороги из одного перекрестка в него же. Левко и Зенык играют в игру. В самом начале игры Левко стоит на перекрестке s1, а Зенык — на перекрестке s2. Они оба хотят добраться до перекрестка f. Кто сделает это быстрее, тот и победит. Если они доберутся туда одновременно, то объявляется ничья. По предварительной договоренности игроки стартуют одновременно, а также двигаются по дорогам с одинаковой скоростью. Левко очень хочет победить в игре. Он знает длины всех дорог в городе и знает, что есть ровно k дорог, длины которых можно изменить, заплатив городскому правительству. По заказу Левко правительство может изменить длину i-ой из этих k дорог на любое целое значение из интервала [li, ri] (оба конца отрезка включаются). Левко стало интересно, может ли он перестроить дороги так, чтобы победить в игре, и если нет, то может ли он надеяться на ничью. Считайте, что оба игрока действуют оптимально, играя в игру. Гарантируется, что из перекрестков s1 и s2 можно добраться до перекрестка f. Выходные данные В первой строке выведите строку «WIN» (без кавычек) — если Левко может победить в этой игре, «DRAW» (без кавычек) — если Левко может достичь ничьи и «LOSE» (без кавычек), если он точно проиграет. Если ответ «WIN» или «DRAW» во второй строке выведите k целых чисел через пробел — длины дорог, которые устанавливает Левко. Длины для дорог выводите в порядке следования дорог во входных данных.
| |
|
|
E. Петя и трубопровод
графы
кратчайшие пути
Потоки
*2300
Мальчик Петя мечтает вырасти и стать Главным Сантехником Берляндии. Уже сейчас он обдумывает задачи, которые ему наверняка придется решать в будущем. К сожалению, Петя еще слишком неопытен, и потому одну из таких задач (вызывающую у Пети наибольший интерес) предстоит решить Вам. В столице Берляндии есть n резервуаров для воды, пронумерованных целыми числами от 1 до n. Эти резервуары некоторым образом соединены однонаправленными трубами, причем любая пара резервуаров соединена не более чем одной трубой в каждом из направлений. Каждая труба характеризуется своей толщиной — строго положительным целым числом, которое определяет, сколько литров воды в единицу времени эта труба может пропустить. Вода в город поступает из главного водохранилища, имеющего номер 1. Пройдя по некоторому пути из труб, она должна попасть в сточный резервуар, снабженный очистной системой (он имеет номер n). Петя хочет увеличить толщину некоторого поднабора труб суммарно не более чем на k единиц толщины таким образом, чтобы толщина каждой трубы осталась целочисленной. Помогите ему определить, какое максимальное количество воды может протекать в единицу времени из главного водохранилища в сточный резервуар после осуществления такой операции. Выходные данные Выведите единственное целое число — максимальное количество воды, которое может протекать в единицу времени из главного водохранилища в сточный резервуар. Примечание В первом тесте можно увеличить толщину трубы из 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-ую. Если таких путей не существует, или максимальная лояльность равна 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. Помогите Валере определить количество различных возможных ситуаций. Выходные данные Выведите единственное число — ответ на задачу. Примечание В первом примере любая ситуация возможна, кроме ситуации {1, 2}. Во втором примере ровно один дурак, поэтому он не совершает выстрелов. В третьем примере возможны ситуации {1, 2} (после нуля раундов) и «пустая» ситуация {} (после одного раунда). В четвертом примере возможна только ситуация {1, 2, 3}.
| |
|
|
E. Испытание для вождя
графы
жадные алгоритмы
кратчайшие пути
*2600
Разгадав словарь древнеберляндского языка, ученые смогли прочитать записи летописцев того времени. В частности, они узнали, как происходил выбор вождя древнеберляндского племени. Как только на место вождя набиралось достаточное количество претендентов, среди них проводилось следующее испытание: шаман племени брал плиту, разделенную вертикальными и горизонтальными полосам на одинаковые клетки (плита состояла из N строк и M столбцов), и красил каждую клетку в черный или белый цвет. Затем каждому испытуемому выдавалась плита такого же размера, но покрашенная полностью в белый цвет. За один день он мог перекрасить любое связное по стороне множество клеток этой плиты в некоторый цвет. Множество называется связным, если для любых двух клеток этого множества существует путь, все клетки которого принадлежат этому множеству, и любые две соседние клетки на этом пути имеют общую сторону. Цель каждого из претендентов — получить в точности такую же раскраску как у шамана. Тот, кто получал такую раскраску раньше всех, становился новым вождем племени. Ученые обнаружили плиту, раскрашенную шаманом древнеберляндского племени. Помогите им определить, за какое минимальное количество дней мог определиться новый вождь, если ему нужно было получить заданную раскраску. Выходные данные В единственной строке выведите минимальное количество перекрашиваний связных областей, необходимых для получения искомой раскраски плиты.
| |
|
|
A. Ладья, слон и король
графы
кратчайшие пути
математика
*1100
Маленький Петя учится играть в шахматы. Он уже выучил, как перемещаются король, ладья и слон. Напомним и вам правила перемещения этих шахматных фигур. Шахматная доска представляет собой 64 квадратных поля, выстроенных в таблицу 8 × 8. Поле обозначается парой целых чисел (r, c) — номером строки и номером столбца (в классическом варианте столбцы обозначаются буквами). Каждая фигура занимает ровно одно поле. Ход состоит в перемещении фигуры, причем фигуры перемещаются по следующим правилам: - Ладья за один ход перемещается на произвольное количество клеток по горизонтали либо по вертикали.
- Слон за один ход перемещается на произвольное количество клеток по диагонали.
- Король за один ход перемещается на одно поле в любом направлении — горизонтально, вертикально, или по диагонали.
Ходы шахматных фигур Петя раздумывает над следующей задачей: за какое наименьшее количество ходов каждая из этих фигур может переместиться из поля (r1, c1) на поле (r2, c2)? При этом считается, что других фигур, кроме данной, на доске нет. Помогите ему в решении этой задачи. Выходные данные Выведите три целых числа через пробел: наименьшее количество ходов, требуемых ладье, слону и королю (в таком порядке) для того, чтобы переместиться из поля (r1, c1) на поле (r2, c2). В случае, если какая-то из фигур не может совершить такое перемещение, выведите вместо соответствующего числа 0.
| |
|
|
C. Окружение сокровищ
битмаски
кратчайшие пути
*2600
Вам задана карта — прямоугольная таблица. Каждая клетка таблицы — это: либо препятствие, либо сокровище с определенной стоимостью, либо бомба, либо пустая клетка. Также задано ваше начальное положение. Вы можете перейти из клетки в соседнюю по стороне клетку карты. При этом не разрешается выходить за пределы карты, приходить в клетки с сокровищами, препятствиями и бомбами. Для того, чтобы собрать сокровища, вы должны построить замкнутый путь (он должен начинаться и заканчиваться в стартовой клетке). Внутри этого замкнутого пути не должно быть клеток с бомбами. Пусть сумма стоимости сокровищ, находящихся внутри замкнутого пути, равна v, и при этом вы совершили k единичных переходов (из клетки в клетку), когда проходили этот путь, тогда такой путь принесет вам прибыль v - k рублей. Ваша задача построить замкнутый путь, внутри которого не содержится бомб, который принесет наибольшую прибыль. Обратите внимание, что путь может иметь самопересечения. Для определения того, лежит клетка внутри пути или нет используется следующий алгоритм: - Представьте себе, что клетки таблицы — это точки на плоскости (клетка таблицы на пересечении i-го столбца и j-ой строки является точкой (i, j)). А заданный вам путь — это замкнутая ломаная, проходящая через эти точки.
- Вам нужно определить: находится ли точка p таблицы, через которую не проходит ломаная, внутри ломаной.
- Проведем луч, начинающийся в точке p и не проходящий через другие точки таблицы (такой луч обязательно существует).
- Посчитаем сколько отрезков ломаной пересекает проведенный луч. Если это количество нечетно, считается, что точка p (а следовательно и клетка таблицы) находится внутри ломаной (пути). Иначе, считается, что она находится снаружи.
Выходные данные Выведите одно целое число — максимально возможную прибыль, которую вы можете получить. Примечание В первом тестовом примере ответ будет выглядеть следующим образом. Во втором тестовом примере ответ будет выглядеть следующим образом. В третьем тесте прибыль нельзя получить. В четвертом тесте прибыль нельзя получить, поскольку нельзя построить замкнутый путь более чем из одной клетки.
| |
|
|
D. Игра с точками
графы
дп
кратчайшие пути
реализация
*2100
Представьте, что Вы играете в следующую игру. Имеется n точек, являющихся вершинами правильного n-угольника. Точки пронумерованы целыми числами от 1 до n. Каждая пара точек соединена отрезком некоторого цвета. Различных цветов не более 26, они обозначаются строчными латинскими буквами. В трех различных точках стоит по фишке. Все фишки одинаковые. За один ход Вы можете взять любую из фишек и передвинуть ее в другую точку. При этом цвет отрезка, по которому Вы можете передвинуть фишку, должен совпадать с цветом отрезка, соединяющего точки, в которых находятся две другие фишки. Нельзя перемещать фишку в точку, в которой уже находится другая фишка. Ваша задача состоит в том, чтобы за наименьшее количество ходов добиться того, чтобы фишки находились в точках с номерами 1, 2 и 3. Напишите программу, которая оптимальным образом играет в эту игру. Выходные данные Если не существует ни одной последовательности ходов, после которых фишки оказываются в точках с номерами 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. Выходные данные Если распределение Димы устроено правильным образом, выведите строку «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. Выходные данные Выведите последовательность целых чисел 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, какое максимальное количество железнодорожных маршрутов можно закрыть, если требуется выполнить следующее условие: длина кратчайшего пути из каждого города в столицу не должна измениться. Выходные данные Выведите единственное целое число, обозначающее максимальное количество железнодорожных путей, которые можно закрыть.
| |
|
|
E. Яблов и игра
Бинарный поиск
кратчайшие пути
Строки
*3000
Яблов и Тостов любят играть. Сегодня они играют со строками по следующим правилам. Сперва Тостов называет Яблову две строки s и t, состоящие исключительно из букв 'A', 'B', 'C', 'D'. Затем Яблов должен как можно быстрее получить строку s. Изначально у него есть пустая строка, за одну секунду он может дописать к концу текущей строки любую непрерывную подстроку строки t. И вот Тостов и Яблов начинают играть в описанную игру. Тостов уже назвал Яблову строку t, а вот строку s он еще не придумал. Тостов считает, что строка s должна состоять из n символов. Конечно, он хочет придумать самую плохую строку для Яблова (такую, что Яблов проведет как можно больше времени, получая ее). Скажите Тостову, сколько времени Яблов проведет за игрой, если Тостов найдет для него самую худшую строку длины n? Считайте, что Яблов всегда действует оптимально и получает любую строку s за минимально возможное время. Выходные данные Выведите единственное целое число — максимальное возможное время, необходимое Яблову, чтобы получить какую-то строку s длины n. Примечание В первом примере Тостов может выбрать строку «AAAAA». Во втором примере Тостов может выбрать строку «DADDA».
| |
|
|
E. Классическая задача
графы
кратчайшие пути
Структуры данных
*3000
Дан взвешенный неориентированный граф из n вершин и m ребер. Найдите кратчайший путь из вершины s в вершину t, либо определите, что пути не существует. Выходные данные В первой строке выведите остаток от деления длины кратчайшего пути на 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. Определите, может ли данная матрица быть матрицей всех попарных расстояний между вершинами взвешенного дерева (все веса должны быть целыми положительными числами). Выходные данные Если такое дерево существует, выведите «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, должен быть как можно короче, так как очень важно завершить операцию как можно быстрее. Затем, в качестве подготовки к операции банда должна взорвать все остальные дороги в стране, не лежащие на их пути, чтобы полиция не могла послать подкрепления. Если дорога к моменту операции не работает, взрывать её не нужно, так как по ней и так не проехать. Если на выбранном пути находится несколько неработающих дорог, их надо отремонтировать перед операцией. Уолтер обнаружил, что может быть несколько возможных путей минимальной длины, так что он решил выбрать среди них такой путь, который минимизирует общее количество дорог, над которыми банде придётся потрудиться (т. е. взорвать или отремонтировать). Помогите Уолтеру завершить задание и завоевать доверие банды. Выходные данные В первой строке выведите единственное целое число 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. Какое минимальное количество нажатий ему придется совершить? Выходные данные Выведите одно число — минимальное количество нажатий на кнопки, необходимое, чтобы получить число m из числа n. Примечание В первом примере нужно один раз нажать на синюю кнопку, и затем раз один раз на красную кнопку. Во втором примере удваивать число невыгодно, поэтому надо девять раз нажать на синюю кнопку.
| |
|
|
D. Артур и стены
графы
жадные алгоритмы
Конструктив
кратчайшие пути
Структуры данных
*2400
Наконец настал тот день, когда Артур накопил достаточную сумму денег и решил купить квартиру. Ему предложили отличный вариант — квартиру в самом центре города по отличной цене. План предложенной Артуру квартиры представляет собой прямоугольник размера n × m, разделенный на квадраты размера 1 × 1. В каждом из таких квадратов находится либо стена (такой квадрат обозначен на плане символом "*"), либо свободное от стены место (такой квадрат обозначен на плане символом "."). Комнаты в квартире представляют собой максимальные по размеру связные области из клеток, свободных от стен. Две клетки считаются соседними, если они имеют общую сторону. Давней мечтой Артура была квартира, в которой все комнаты представляют собой прямоугольники. Он просит вас посчитать минимальное количество стен, которое нужно удалить для осуществления его мечты. После удаления из клетки стены в ней образуется свободное место. В процессе удаления стен несколько комнат могут объединиться в одну. Выходные данные Выведите n строк по m символов — как будет выглядеть план квартиры Артура, после удаления минимального количества стен для того, чтобы каждая комната (максимальная по размеру связная область из свободных от стен мест), представляла собой прямоугольник. Если возможных ответов несколько, разрешается вывести любой из них.
| |
|
|
B. Разрушение дорог
графы
Конструктив
кратчайшие пути
*2100
В некоторой стране есть ровно n городов и m двусторонних дорог, соединяющих города. Пронумеруем города некоторым образом целыми числами от 1 до n. Если города a и b соединены дорогой, то за один час вы можете по ней проехать как из города a в город b, так и из города b в город a. Кроме того, сеть дорог такова, что из каждого города можно добраться до любого другого города, двигаясь по дорогам. Вы хотите разрушить наибольшее количество дорог в стране так, чтобы с помощью оставшихся дорог можно было добраться из города s1 в город t1 не более чем за l1 часов и из города s2 в город t2 не более чем за l2 часов. Определите, какое максимальное количество дорог можно разрушить так, чтобы удовлетворить условию вашего плана. Если добиться желаемого невозможно, выведите -1. Выходные данные Выведите единственное число — ответ на задачу. Если план выполнить невозможно, выведите -1.
| |
|
|
E. Пути и деревья
графы
жадные алгоритмы
кратчайшие пути
*2000
Маленькая девочка Сьюзи случайно нашла тетрадь своего старшего брата. У неё есть много более важных дел, чем решение задач, но эта показалась ей слишком интересной, так что она всё же захотела узнать её решение и решила спросить у вас. Итак, условие задачи. Пусть дан связный взвешенный неориентированный граф G = (V, E) (здесь V — множество вершин, E — множество рёбер). Деревом кратчайших путей из вершины u называется граф G1 = (V, E1), который является деревом, множество его рёбер E1 является подмножеством множества рёбер исходного графа E, и длины кратчайших путей от u до любой вершины в G и в G1 совпадают. Вам дан связный взвешенный неориентированный граф G и вершина u. Необходимо найти дерево кратчайших путей заданого графа из вершины u, суммарный вес рёбер которого минимален. Выходные данные Выведите в первой строке минимальный суммарный вес рёбер дерева. В следующей строке выведите номера рёбер, входящих в дерево, разделяя их пробелом. Рёбра нумеруются с единицы в порядке следования во входных данных. Номера рёбер можно выводить в любом порядке. Если возможных ответов несколько, выведите любой. Примечание В первом тесте из условия возможны два дерева кратчайших путей: - с ребрами 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 интересно, какое минимальное количество операций необходимо для того, чтобы объемы всех химикатов стали равны? Выходные данные Выведите единственное целое число — минимальное количество операций, необходимое, чтобы уравнять объемы всех химикатов. Примечание В первом тесте оптимальное решение — разделить объем второго реактива на два и умножить объем третьего химиката на два, чтобы все объемы стали равны 4. Во втором тесте оптимальное решение — разделить объем первого реактива на два и разделить объемы второго и третьего химиката на два дважды, чтобы все объемы стали равны 1.
| |
|
|
E. Президент и дороги
графы
кратчайшие пути
поиск в глубину и подобное
хэши
*2200
В Берляндии n городов, столица находится в городе s, а историческая родина Президента — в городе t (s ≠ t). Города соединены односторонними дорогами, время проезда по каждой из дорог — целое положительное число. Раз в год Президент посещает свою историческую родину t, для чего его кортеж проезжает по некоторому пути из s в t (обратно он всегда возвращается на личном самолете). Так как Президент — очень занятой человек, то он всегда выбирает путь из s в t, по которому он проедет быстрее всего. Министерство дорог и путей сообщения хочет узнать для каждой дороги: обязательно ли проедет по ней Президент во время своего путешествия, и если нет, то возможно ли её починить так, чтобы она в любом случае входила в кратчайший путь из столицы в историческую родину Президента. Очевидно, что дорогу невозможно починить так, чтобы время проезда по ней стало меньше единицы. Министерство Берляндии, как и любое другое, заинтересовано в сохранении бюджета, поэтому оно хочет узнать минимальную стоимость починки дороги. Также оно очень любит точность, поэтому ремонтирует дороги так, что время проезда по ним всегда остаётся целым числом. Выходные данные Выведите m строк. В i-й строке должна содержаться информация об i-й дороге (дороги нумеруются с единицы в порядке следования во входных данных). Если президент в любом случае проедет по ней во время своего путешествия, строка должна содержать единственное слово «YES» (без кавычек). Иначе если i-ю дорогу возможно починить так, чтобы время проезда по ней осталось положительным, и президент в любом случае выбрал бы её для своего путешествия, выведите через пробел слово «CAN» (без кавычек) и минимальную стоимость ремонта. Если же нельзя починить дорогу так, чтобы по ней в обязательном порядке проехал президент, выведите «NO» (без кавычек). Примечание Стоимостью починки дороги называется разность между временем проезда по ней до и после починки. В первом тесте из условия президент исходно может выбрать один из двух маршрутов для своей поездки: 1 → 2 → 4 → 5 → 6 либо 1 → 2 → 3 → 5 → 6.
| |
|
|
E. Шахматы
кратчайшие пути
математика
*3000
Кролик Брайан любит шахматы. Недавно он поспорил с кроликом Стьюи что конь лучше короля. Для этого он пытается показать, что конь очень быстрый, но Стьюи не принимает утверждений без доказательств. Он соорудил для Брайана бесконечную шахматную доску, в которой удалил некоторые клетки для спортивного интереса. Брайану осталось посчитать, сколько различных клеток доски достижимы не более чем за k ходов для коня, который стоит в клетке с координатами (0, 0), Естественно, на вырезанные клетки ходить нельзя. Брайан сам не очень любит точные науки и не знаком с программированием, поэтому вряд ли ему удастся опередить Стьюи, который уже принялся за решение поставленной задачи. Помогите Брайану решить задачку быстрей Стьюи. Выходные данные В единственной строке требуется вывести ответ. Так как он может быть достаточно большим нужно вывести его по модулю 1000000007.
| |
|
|
G. Пивной путь
кратчайшие пути
поиск в глубину и подобное
*2200
Народ в Пиволенде любит пить пиво. Знаете ли вы, что пиво здесь такое хорошее и сильное, что каждый раз, когда вы пьете его, ваша скорость снижается в десять раз по сравнению с вашей скоростью до его употребления? Бирко живет в городе Пивграде, но хочет отправиться в город Пивбург. Вам дана дорожная карта Пиволенда и Вам надо найти для него самую быструю дорогу. Когда он начнет свое путешествие в Пивграде, его скорость будет равна 1. Придя в новый город, он всегда пробует стакан местного пива, что делит его скорость на 10. Вопрос таков: за какое минимальное время он доберется до Пивбурга? Если есть несколько маршрутов с минимальным временем, выберите тот, что содержит наименьшее количество дорог. Если всё равно остается более одного маршрута, выберите любой из них. Гарантируется, что из Пивграда в Пивбург будет вести не менее одного маршрута. Выходные данные В первой строке должно быть записано наименьшее время, необходимое на то, чтобы перейти из Пивграда в Пивбург. Во второй строке дожны быть записаны номера городов по дороге из Пивграда в Пивбург, занимающей наименьшее время. В третьей строке выхода должны быть записаны номера городов на этом маршруте в порядке посещения, разделенные пробелами.
| |
|
|
B. Филипп и поезда
графы
кратчайшие пути
поиск в глубину и подобное
*1700
В магазине мобильных приложений появилась новая игра «Subway Roller». Главный герой игры Филипп находится в одном конце туннеля и хочет выйти из другого. Туннель представляет собой клетчатое прямоугольное поле, состоящее из трех строк и n столбцов. В начале игры герой находится в некоторой клетке самого левого столбца. Навстречу герою едет некоторое количество поездов. Каждый поезд представляет собой две или более клетки, находящиеся непосредственно друг за другом в некоторой строке поля. Все поезда двигаются справа налево со скоростью две клетки в секунду, а герой бежит слева направо со скоростью одна клетка в секунду. Для простоты игра реализована так, что герой и поезда двигаются по очереди. Сначала герой двигается на одну клетку вправо, затем на одну клетку вверх или вниз или остается на месте, затем все поезда дважды одновременно перемещаются на одну клетку влево. Таким образом, за один ход Филипп обязательно делает перемещение вправо и может переместиться вверх или вниз. Если в какой-то момент Филипп оказывается в одной клетке с некоторым поездом, то он проигрывает. Если поезд доезжает до левого столбца, то он продолжает двигаться как и ранее, выезжая из туннеля. Ваша задача ответить на вопрос, существует ли такая последовательность передвижений Филиппа, что он сможет дойти до самого правого столбца. Выходные данные Для каждого набора входных данных выведите в отдельной строке слово YES, если пройти игру возможно и слово NO в противном случае. Примечание В первом наборе входных данных первого примера Филиппу нужно сначала пройти вперед и спуститься вниз на третью строку поля, затем пройти вперед, затем пройти вперед и подняться на вторую строку, снова пройти вперед и подняться на первую строку. После этого пути Филиппа не преграждает ни один поезд, поэтому он может идти прямо до конца туннеля. Обратите внимание, что в этой задаче во взломах разрешается использовать только тесты, содержащий один набор входных данных.
| |
|
|
E. Кратчайший путь
графы
кратчайшие пути
*2000
В Древней Берляндии n городов и m двунаправленных дорог одинаковой длины. Города пронумерованы целыми числами от 1 до n включительно. Согласно древней примете, если путешественник посетит подряд (не заходя ни в какие другие) три города ai, bi, ci, его ждет большая беда. И всего есть k таких троек городов. Каждая тройка является упорядоченной, это означает, что, например, посещать города в порядке ai, ci, bi можно. Вася хочет попасть из города 1 в город n, не нарушая приметы. Выясните, какое наименьшее число дорог ему нужно пройти. Также требуется найти один из его возможных маршрутов. Выходные данные Если пути из 1 в n не существует, выведите -1. Иначе в первой строке выведите количество дорог d в кратчайшем пути из города 1 в город n. Во второй строке выведите d + 1 чисел — любой из возможных кратчайших маршрутов Васи. Маршрут должен начинаться с города 1 и заканчиваться в городе n.
| |
|
|
C. Три государства
графы
кратчайшие пути
поиск в глубину и подобное
*2200
Опасаясь приближения мирового экономического кризиса, государства Бермания, Беранция и Берталия заключили союз и разрешили жителям всех входящих в него государств беспрепятственный проход по территории любого из них. Дополнительно было решено построить дороги между государствами так, чтобы из любой точки любого государства можно было добраться до любой точки любого другого государства. Так как дороги всегда обходятся недёшево, правительства государств новообразованного союза попросили вас помочь им оценить затраты. Для этого вам была выдана карта, которая представляет собой клетчатый прямоугольник из n строк по m клеток в каждой. Любая клетка карты либо принадлежит одному из трёх государств, либо является областью, на которой можно построить дорогу, либо является областью, на которой дорогу построить нельзя. Проходимыми являются все клетки, принадлежащие государствам, а также все клетки, в которых построены дороги. Из любой проходимой клетки можно перемещаться вверх, вниз, вправо и влево, если соответствующая такому перемещению клетка существует и является проходимой. Требуется построить дороги в минимальном количестве клеток так, чтобы стало возможным добраться из любой клетки любого государства до любой клетки любого другого государства. Гарантируется, что изначально из любой клетки любого государства можно добраться до любой клетки этого же государства, перемещаясь только по его клеткам. Также гарантируется, что на карте присутствует хотя бы одна клетка каждого государства. Выходные данные Выведите единственное целое число — минимальное количество клеток, в которых необходимо построить дороги, чтобы соединить все клетки всех государств. Если это сделать невозможно, то выведите -1.
| |
|
|
D. Игорь в музее
графы
кратчайшие пути
поиск в глубину и подобное
*1700
Игорь пришёл в музей и хочет посмотреть на как можно большее количество картин. Музей представляет собой прямоугольное клетчатое поле размером n × m. Каждая клетка либо является пустой и обозначена символом '.', либо является непроходимой и обозначена символом '*'. Любую пару соседних по стороне клеток, одна из которых пустая, а другая непроходимая, разделяет стена, на которой висит картина. Игорь всегда начинает в некоторой пустой клетке. В любой момент времени Игорь может переместиться в любую из четырёх соседних по стороне клеток, если она является пустой. Ваша задача для нескольких начальных положений Игоря определить максимальное количество картин, которые он сможет посмотреть. Игорь может посмотреть на картину, если находится в клетке, одной из сторон которой является стена с данной картиной. Можно считать, что Игорю всегда хватит времени, чтобы сколь угодно долго перемещаться по музею и смотреть на картины. Выходные данные Выведите k целых чисел — максимальное количество картин, которые сможет посмотреть Игорь, для каждого начального положения.
| |
|
|
A. Два пути
графы
кратчайшие пути
*1600
В Абсурдистане n городов (пронумерованных от 1 до n) и m двунаправленных железнодорожных перегонов. А ещё там абсурдно простая сеть автотрасс — для любой пары различных городов x и y между ними есть двунаправленная автомобильная дорога тогда и только тогда, когда между ними нет железнодорожного перегона. На перемещение в соседний город по одному железнодорожному перегону или по одной автомобильной дороге уходит ровно один час. Поезд и автобус одновременно выезжают из города 1. У них обоих один и тот же пункт назначения, город n, и они нигде не останавливаются по пути (кроме итоговой стоянки в городе n). Поезд перемещается только по железнодорожным перегонам, а автобус только по автомобильным дорогам. Вас попросили составить маршруты для обоих транспортных средств; каждый маршрут может проходить по любой дороге/перегону произвольное количество раз. Одним из наиболее важных пунктов при составлении маршрута является безопасность, поэтому, во избежании несчастных случаев на железнодорожных переездах, поезд и автобус никогда не должны одновременно прибывать в один и тот же город, кроме, возможно, города n. Через какое наименьшее количество часов оба транспортных могут быть в городе n (максимальное из времён прибытия для автобуса и поезда)? Обратите внимание, что автобус и поезд не обязаны прибыть в город n одновременно, но могут так сделать, если потребуется. Выходные данные Выведите единственное целое число — наименьшее возможное время прибытия последнего из транспортных средств в город n. Если хотя бы одно из двух транспортных средств не сможет добраться до города n, то выведите - 1. Примечание В первом примере поезд может поехать по маршруту , а автобус по маршруту . Обратите внимание, что автобусу и поезду разрешается прибывать в город 4 одновременно. Во втором примере Абсурдистаном правят железнодорожники. Обычных дорог (не ЖД перегонов) нет, так что автобус никак не может добраться до города 4.
| |
|
|
E. Межгалактические путешествия
кратчайшие пути
Теория вероятностей
*2700
Не так давно учёные открыли кротовые норы — объекты в космосе, позволяющие перемещаться на очень большие расстояния между галактиками и звёздными системами. Учёным известно, что в пределах досягаемости находятся n галактик. Вы находитесь в галактике 1, и вам нужно попасть в галактику n. Чтобы попасть из галактики i в галактику j, необходимо залететь внутрь кротовой норы (i, j), и спустя ровно одни галактические сутки вы окажетесь в галактике j. К сожалению, нужная кротовая нора найдётся не всегда. Каждые галактические сутки они исчезают и появляются случайным образом. Однако в пределах одних галактических суток состояние кротовых нор не изменяется. Кротовая нора из галактики i в галактику j существует в каждые отдельно взятые галактические сутки с вероятностью pij. Вы всегда можете узнать, какие кротовые норы существуют в настоящий момент. В каждый момент времени вы можете либо перелететь в другую галактику через одну из существующих в этот момент кротовых нор, либо можете просто ждать одни галактические сутки, чтобы посмотреть, какие норы из вашей текущей позиции будут существовать на следующие сутки. Требуется найти математическое ожидание времени пути из галактики 1 в галактику n, если вы будете действовать оптимально. Гарантируется, что это математическое ожидание существует. Выходные данные Выведите единственное вещественное число — математическое ожидание времени пути из галактики 1 в галактику n. Ваш ответ будет считаться правильным, если его абсолютная или относительная ошибка не будет превосходить 10 - 6. А именно: пусть ваш ответ равен a, а ответ жюри — b. Проверяющая программа будет считать ваш ответ правильным, если . Примечание Комментарий ко второму примеру: каждые галактические сутки с вероятностью 0.3 появится кротовая нора прямо до точки назначения. Поэтому время достижения финиша — это ожидаемое число экспериментов до ближайшей реализации случайного события с вероятностью 0.3, т.е. .
| |
|
|
D. Великая победа
графы
Деревья
жадные алгоритмы
кратчайшие пути
поиск в глубину и подобное
*1800
Шапур победил Валериана. Эта победа была так важна, что Шапур решил вырезать на скале сцену поражения Валериана. Теперь ему нужно было найти наилучшее место и увековечить там свою победу! Он решил посетить все n городов Персии чтобы найти наиболее подходящую скалу. Но недавняя война утомила его, и он не хотел много путешествовать. Поэтому он хотел посетить каждый из этих n городов хотя бы один раз. При этом пройденное расстояние должно быть как можно меньше. Персидские города соединены двусторонними дорогами. Из каждого города можно дойти до любого другого, причем единственным способом. Все города пронумерованы от 1 до n. Шапур сейчас в городе 1, и он хочет посетить все остальные города, пройдя как можно меньше. Шапур может закончить свое путешествие в любом городе. Найдите расстояние, которое Шапур пройдет. Выходные данные Выведите одно число — минимальную длину пути Шапура. Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать поток cout (также вы можете использовать спецификатор %I64d).
| |
|
|
E. Собери число
графы
кратчайшие пути
*2300
Дано целое неотрицательное число k и n неотрицательных целых чисел a1, a2, ..., an. Записывая некоторые из этих чисел друг за другом в произвольном порядке и, возможно, используя какие-то из них несколько раз (а какие-то вообще не используя), требуется составить кратчайшее (наименьшее по количеству цифр) число, делящееся на k, или определить, что это невозможно. Выходные данные Если ответ существует, в первой строке выведите «YES» (без кавычек), а во второй строке — искомое кратчайшее число без ведущих нулей. В случае если ответа не существует, в единственной строке выходных данных выведите «NO» (без кавычек).
| |
|
|
B. Мировое турне
графы
кратчайшие пути
*2000
Знаменитый скульптор Кикассо отправляется в мировое турне! Ну, не такое уж оно на самом деле и мировое. Но ведь возможность своими глазами повидать работы скульптора и не должна быть у всех, правда? Иначе в этом не было бы никакой эксклюзивности. Поэтому своё мировое турне Кикассо проведёт целиком и полностью в своей родной стране — Берляндии. Кикассо очень предан своей работе и хочет как можно меньше отвлекаться от неё. Поэтому в своём турне он посетит всего четыре города. При этом города обязательно будут различными, чтобы никто не подумал, что у звезды есть «любимчики». Конечно, в целях экономии, перемещаться между этими городами он будет по кратчайшим маршрутам. Но, как вы уже, наверно, догадались, Кикассо — тот ещё чудак, поэтому, хотя он и не любит устраивать выставки, ему нравится ездить по стране и любоваться её пейзажами, поэтому он хочет, чтобы суммарное расстояние, которое он проедет, перемещаясь между городами, было максимально возможным. Сам скульптор, впрочем, плох в планировании, поэтому он обратился к вам за помощью. В Берляндии есть n городов и m однонаправленных автомобильных дорог. Вам необходимо выбрать четыре различных города, которые посетит Кикассо, а также определить порядок посещения этих городов. При этом вам необходимо, чтобы суммарное расстояние, которое он проедет, если посетит города в указанном вами порядке, начав в первом городе из вашего списка и закончив в последнем, выбирая при этом каждый раз самый короткий маршрут между парой городов, было наибольшим. Обратите внимание, промежуточные маршруты могут проходить через города, которые назначены для турне, а также проходить через один и тот же город дважды. Например, турне может выглядеть так: . Надчёркиваниями обозначены четыре города, в порядке их посещения: [1, 5, 2, 4]. Отметим, что Берляндия — высокотехнологичная страна, поэтому с помощью нанотехнологий все дороги были переделаны таким образом, что они имеют одинаковую длину. По этой же причине перемещение на обычных автомобилях в ней не очень популярно и может случиться, что существуют такие пары городов, что из одного из них вообще нельзя добраться на автомобиле до другого. Однако, Кикассо весьма консервативен и использует исключительно автомобильный транспорт в своём турне, поэтому вам нужно выбрать города таким образом, чтобы турне могло состояться, то есть, чтобы скульптор мог провести его, используя только автомобиль. Гарантируется, что это всегда можно сделать. Выходные данные Выведите четыре целых числа — номера городов, которые посетит Кикассо при оптимальном выборе маршрута. Номера городов нужно выводить в порядке, в котором Кикассо их посетит. Если существует несколько решений, выведите любое из них. Примечание Пусть 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), и хочет узнать минимальное количество минут, через которое он сможет добраться до чудовища. Герою не к лицу решать задачи по программированию, поэтому он просит вас помочь ему. Выходные данные Если Тесей не сможет добраться до Минотавра, то выведите -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|. Выходные данные Выведите единственное целое число — минимальное расстояние, которое потребуется преодолеть Ване, чтобы забрать сокровище из сундука типа 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 чисел 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. Поможете ему? Выходные данные Выведите «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 точки многоугольника не лежат на одной прямой. Также начальная и конечная точка не лежат внутри или на границе острова. Точки многоугольника заданы в порядке обхода против часовой стрелки. Выходные данные Выведите минимальную возможную стоимость. Абсолютная или относительная погрешность ответа не должна превосходить 10 - 6.
| |
|
|
E. Польшар и Бело-красный граф
графы
Конструктив
кратчайшие пути
*2400
У Польшара есть неориентированный простой граф из n вершин. К сожалению, в графе нет ребер, и граф очень расстроен этим. Польшар хочет сделать его счастливее, добавив несколько красных ребер. Затем он добавит белые ребра на каждое оставшееся место. В итоге граф будет полным графом из красных и белых ребер. Красочностью графа называют величину min(dr, dw), где dr — диаметр красного подграфа, а dw — диаметр белого подграфа. Диаметр графа — это максимальное натуральное число d такое, что длина кратчайшего пути между некоторой парой вершин равна d. Если граф несвязен, мы будем считать его диаметр равным -1. Польшар хочет, чтобы его граф был как можно более изящен. А именно, он хочет, чтобы красочность графа была равна k. Можете помочь ему и найти любой граф, удовлетворяющий запросам Польшара? Выходные данные Если подходящих графов не существует, выведите -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 городов, в которых живут друзья. Друг, которых жил в этом городе, умирает, поэтому он тоже расстраивается. Заметьте, что если город разрушен, то все дороги, ведущие в этот город, также разрушены, поэтому некоторым Пикачу может потребоваться выбрать другой, более длинный путь. Также заметьте, что только те друзья, которые ждут подарка, могут считаться расстроенными, даже если они умирают. Так как Баш — уже легенда, помогите в этот раз команде Р и найдите максимальное возможное число друзей, которые будут расстроены, если разрушен ровно один город. Выходные данные Выведите единственное число — ответ на задачу. Примечание В первом примере после разрушения города 2 длина кратчайших путей между парами городов (3, 2) и (3, 4) изменится. Поэтому ответ равен 2.
| |
|
|
D. Тимофей и плоское дерево
графы
Деревья
кратчайшие пути
Структуры данных
хэши
*2900
У маленького Тимофея есть большое дерево — неориентированный связный граф из n вершин, не содержащий ни одного простого цикла. Он очень любит по нему гулять. Дерево Тимофея плоское и когда он гуляет по нему, он видит всё дерево целиком. Вполне естественно, что, находясь в вершине, он видит дерево подвешенным за эту вершину. Тимофей считает, что чем больше в дереве вершин, поддеревья которых попарно неизоморфны, тем лучше выглядит подвешенное дерево. Под поддеревом вершины подвешенного дерева он понимает подграф, состоящий из этой вершины и всех ее потомков. Помогите ему встать в такую вершину, что размер максимального подмножества вершин, поддеревья которых попарно неизоморфны при подвешивании за эту вершину, был максимально возможным. Поддеревья вершин u и v изоморфны, если число сыновей у u и v совпадают, и можно так упорядочить сыновей, что поддерево первого сына u изоморфно поддереву первого сына v, поддерево второго сына u изоморфно поддереву второго сына v, и так далее. В частности, поддеревья, состоящие из одной вершины, всегда изоморфны друг другу. Выходные данные Выведите одно число — номер вершины, в которую надо встать Тимофею. Если ответов несколько, можно вывести любой. Примечание В первом примере можно встать в вершину 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». В этой задаче вам не нужно минимизировать длину пути. Найдите минимальную лексикографически (в алфавитном порядке, как в словаре) строку, которая удовлетворяет требованиям выше. Выходные данные Выведите лексикографически минимальный путь Робота длины ровно k, который начинается и заканчивается в той клетке, в которой Робот находится изначально. Если такого пути не существует, выведите «IMPOSSIBLE» (без кавычек). Примечание В первом примере для Робота существует всего два циклических пути длины 2 — «UD» и «RL». Второй вариант лексикографически меньше. Во втором примере Робот должен выполнять перемещения в следующем порядке: вниз, влево, вниз, вниз, влево, влево, влево, вправо, вправо, вправо, вверх, вверх, вправо, вверх. В третьем примере Робот не может переместиться ни в одну из соседних клеток, так как все они заняты препятствиями.
| |
|
|
D. Тленные дороги
графы
дп
кратчайшие пути
*2700
В стране Невер n городов и очень хорошо развитая дорожная сеть. Между каждой парой городов есть ровно одна двусторонняя дорога, таким образом, всего в Невере целых дорог! При этом никакая дорога не пересекается ни с какой другой дорогой и не проходит через промежуточные города. Что-что, а туннели и мосты в Невере строить умели. Независимая комиссия оценила каждую дорогу Невера положительным целым числом, называемым тленностью дороги. Чем ниже тленность, тем приятнее по дороге ехать. В рамках года транспорта в Невере было решено построить музей транспорта в одном из городов страны, а в каждом другом городе установить ровно один указатель на некоторый город (не обязательно тот, в котором находится музей). Указатели должны удовлетворять следующему важному требованию: если любой неверец, живущий в городе без музея, отправится из своего родного города по указателям, то рано или поздно обязательно приедет в город с музеем. Неверцы — невероятно положительно настроенные люди. Если неверец отправился по маршруту, состоящему из нескольких дорог, то тленностью маршрута неверец считает минимальную из тленностей дорог в этом маршруте. Руководство Невера еще не приняло окончательное решение относительно города, в котором следует построить музей, и рассматривает все n возможных вариантов. Принципиальное значение имеет сумма тленностей маршрутов до города с музеем из всех остальных городов страны, если путники будут строго следовать установленным указателям. Руководство Невера заботится о своих жителях, поэтому они хотели бы направить указатели таким образом, чтобы минимизировать эту сумму. Помогите им определить минимальное возможное её значение при всех n вариантах строительства музея. Выходные данные Для каждого города в порядке от 1 до n выведите минимальную возможную сумму тленностей маршрутов до данного города из всех остальных городов при оптимальной установке указателей. Примечание Первый пример пояснен рисунком ниже. Слева направо изображены исходная дорожная сеть и оптимальные расстановки указателей при строительстве музея в городах 1, 2 и 3, соответственно. Синим цветом обозначен город с музеем, зеленым — направление указателя в каждом другом городе. Например, при строительстве музея в городе 3 следует направить указатель в городе 1 на город 3, а указатель в городе 2 — на город 1. Тогда маршрут из города 1 до города 3 будет иметь тленность 2, а маршрут из города 2 до города 3 — тленность 1. Сумма тленностей данных маршрутов составит 3.
| |
|
|
E. Эвакуация
графы
кратчайшие пути
Потоки
*2300
Опять они там что-то напортачили... В одном из ядерных реакторов исследовательской станции идет неуправляемая реакция и скоро произойдет взрыв, который уничтожит всю станцию. Станция представляет собой квадрат n × n разбитый на блоки 1 × 1. Каждый блок является или реактором или лабораторией. Реакторов может быть несколько и ровно один из них собирается взорваться. Реакторы можно считать непроходимыми блоками, по лабораториям же можно перемещаться. Между любыми двумя лабораториями, которые находятся в соседних блоках, имеется коридор. Блоки считаются соседними, если имеют общее ребро. В каждой из лабораторий имеется некоторое количество ученых и некоторое количество спасательных капсул. Как только ученый залезает в капсулу, он считается спасенным. В каждую капсулу помещается не более одного ученого. Реактор, который скоро взорвется, поврежден и из него вытекает токсичная охлаждающая жидкость в соседние блоки. Блок, в котором расположен этот реактор, считается зараженным. Каждую минуту охлаждающая жидкость растекается по лабораториям через коридоры. Если в какую-то минуту один из блоков заражен, то на следующую минуту все соседние лаборатории также оказываются заражены. Как только лаборатория оказывается заражена, все ученые в ней, которые находятся не в спасательных капсулах, погибают. Через блоки с реакторами охлаждающая жидкость не распространяется. До взрыва осталось ровно t минут. Любой ученый за одну минуту может переместиться по коридору в соседнюю лабораторию, если она не заражена. По любому коридору одновременно могут перемещаться неограниченное количество ученых в обоих направлениях. Считается, что ученые внутри лаборатории перемещается без затрат времени. Кроме того, любой ученый может залезть в спасательную капсулу мгновенно. Также считается, что любой ученый в данную минуту всегда успевает сделать свои действия (переместиться из данной лаборатории в соседнюю или залезть в спасательную капсулу) до того, как лаборатория окажется заражена. Определите максимальное количество ученых, которым удастся спастись. Выходные данные Выведите одно целое число — максимальное количество ученых, которым удастся спастись. Примечание Во втором примере события могли происходить следующим образом:
| |
|
|
D. Иннокентий и футбольная лига
2-sat
графы
жадные алгоритмы
кратчайшие пути
реализация
Строки
*1900
Иннокентий — президент только что созданной футбольной лиги в Байтландии. Первая задача, которая стоит перед ним — обеспечить трансляцию всех матчей лиги по телевидению. Как вы, возможно, знаете, во время футбольного матча на экране отображаются сокращенные названия команд и текущий счет. Конечно, будет странно, если сокращенные названия клубов соперников совпадут, поэтому Иннокентий должен придумать. как сократить название каждого из клубов лиги до трех букв так, чтобы у всех команд лиги были разные названия. Название каждого клуба состоит из двух слов: названия команды и города, в котором располагается клуб, например, «DINAMO BYTECITY». Иннокентий не хочет сильно искажать название, поэтому он хочет выбрать сокращенное название для каждого из клубов таким образом, чтобы: - либо сокращенное название клуба совпадало с первыми тремя буквами названия команды, например, для вышеприведенный команды это «DIN»,
- либо первые две буквы сокращенного названия клуба совпадали с первыми двумя буквами названия команды, а третья — с первой буквой города команды. Например, для вышеприведенный команды это «DIB».
Кроме этого, если для какой-то команды x выбран второй вариант названия, то не должно быть команды, у которой выбран первый вариант сокращенного названия, совпадающий с первым вариантом названия команды x. Например, если сокращенное название вышеприведенной команды это «DIB», то никакая команда, у которой выбран первый вариант сокращенного названия, не должна иметь сокращенного названия «DIN». При этом возможно, что какая-то команда получит название «DIN», где «DI» — первые две буквы названия команды, а «N» — первая буква города. Конечно, никакие две команды не должны иметь одинакового сокращенного названия. Помогите Иннокентию выбрать сокращенное название для каждой из команд. Если это невозможно, сообщите об этом. Если возможных ответов несколько, Иннокентия устроит любой из них. Если для некоторой команды совпадают оба варианта сокращенного названия, то Иннокентий все равно будет формально считать, что выбран только один из этих вариантов. Выходные данные Если выбрать сокращенные названия, удовлетворив требованиям Иннокентия, невозможно, выведите единственную строку «NO». Иначе в первую строку выведите «YES». Далее выведите n строк, в каждой строке выведите выведите сокращенное название очередного клуба. Выводите клубы в том же порядке, в каком они заданы во входных данных. Если возможных ответов несколько, выведите любой. Примечание В первом примере можно выбрать первый вариант названия для обеих команд. Во втором примере невозможно подобрать названия, т. к. по условию нельзя у одной команды выбрать первый вариант названия, а у второй выбрать второй вариант названия, если первые варианты названий у этих команд совпадают. В третьем примере можно выбрать вторые варианты названий у первых двух команд, и первый вариант — у третьей команды. В четвертом примере обратите внимание на то, что разрешается, чтобы выбранное название некоторой команды x совпадало с первым вариантом названия y, если первый вариант названия x не совпадает с первым вариантом названия y.
| |
|
|
B. Наследство
графы
кратчайшие пути
Структуры данных
*2300
Рик и его коллеги сделали новую радиактивную формулу, и она понадобилась многим плохим парням. Поэтому Рик хочет оставить свое наследство Морти до того, как плохие парни поймают его. Всего есть n планет в их вселенной, пронумерованных от 1 до n. Рик находится на планете номер s (планетя Земля) и он не знает, где сейчас Морти. Всё, что мы знаем, что Рику принадлежит портальное оружие. С помощью этой пушки он может открыть односторонний портал с одной планеты на любую другую (включая эту планету). Но у этого оружия есть ограничения, потому что он все еще использует бесплатную версию. По умолчанию он не может открыть любой портал этим оружием. Всего есть q планов на сайте, который продает это оружие. Каждый раз, когда происходит покупка плана, его можно использовать только один раз. Но можно покупать один и тот же план произвольное количество раз. Планы на сайте имеют три типа: - С планом этого типа вы можете открыть портал с планеты v до планеты u.
- С планом этого типа вы можете открыть портал с планеты v до любой планеты с номером из диапазона [l, r].
- С планом этого типа вы можете открыть портал с любой планеты с номером из диапазона [l, r] до планеты v.
Рик не знает, где находится Морти, но Юнити собирается проинформировать его, и он хочет быть готовым к тому, чтобы начать свое путешествие немедленно. Поэтому для каждой планеты (включая Землю) он хочет знать минимальное количество денег, которое ему необходимо чтобы добраться от Земли до этой планеты. Выходные данные В первой и единственной строке выведите n целых чисел разделенных пробелами. i-е из них должно быть равно минимальному количеству денег, необходимых, чтобы добраться с планеты Земля до i-й планеты, или - 1, если невозможно добраться до этой планеты. Примечание В первом тестовом примере, Рик покупает 4-й план единожды, далее 2-й план, чтобы добраться до планеты номер 2.
| |
|
|
C. Большое смешивание
графы
кратчайшие пути
поиск в глубину и подобное
*2300
Саша и Коля снова решили напиться колы. На этот раз у них есть k видов колы, i-й вид колы характеризуется концентрацией газа . Сегодня на празднике в честь Сергея Ванкуверского они решили приготовить бокал колы с концентрацией газа ровно . Чтобы напиток также был вкусным, они хотят, чтобы в бокале было целое число литров колы каждого вида (колы некоторых видов может и вовсе не быть в бокале). Кроме того, они хотят минимизировать общий объем колы в бокале. Концентрацией газа в коле называется отношение объема газа к общему объему напитка. При смешивании объем газа в напитке равен суммарному объему газа в смешиваемых компонентах; объем напитка также равен сумме объемов напитка в смешиваемых компонентах. Помогите Саше и Коле. Найдите минимальное натуральное количество литров колы, необходимое для получения бокала с концентрацией газа ровно . Считайте, что каждого вида колы у друзей бесконечное количество. Выходные данные Выведите минимальное натуральное количество литров колы, необходимое для получения бокала с концентрацией газа ровно , или -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). К сожалению, она забыла как набрать код, в условиях описанных правил. Помогите определить минимальное число операций, необходимых Кейл для того, чтобы войти в замок. Выходные данные Выведите наименьшее число ходов, необходимое для того, чтобы ввести код. Если это невозможно, выведите -1. Примечание Один из возможных способов ввести код в первом примере: на первом ходу выбрать 1-ую, 2-ую, 3-ую панели и изменить их состояния. На втором ходу можно выбрать 5-ую, 6-ую, 7-ую, 8-ую, 9-ую панели и изменить их состояния.
| |
|
|
B. Игорь и путь на работу
графы
кратчайшие пути
поиск в глубину и подобное
реализация
*1600
Проснувшись со звонком будильника, аналитик Игорь заспешил на работу. Совершив все необходимые утренние процедуры и позавтракав, Игорь сел в свой автомобиль. Открыв GPS-навигатор, он увидел, что в некоторых районах его родного города Банкополиса ведутся дорожные работы, поэтому они недоступны для проезда. Однако на этом неприятности Игоря не закончились: оказалось, что в его авто сломался руль, и он может совершить не более двух поворотов по пути в свой офис в банке. Банкополис представляет из себя клетчатое поле из n строк и m столбцов. Помогите аналитику Игорю найти путь из дома в его офис, содержащий не более двух поворотов и не посещающий клетки, в которых проводятся дорожные работы, либо установить, что такого пути не существует, и Игорю придется отчитываться перед начальством за то, что он не явился на работу. Поворотом считается смена направления движения в пути. В силу своей конструкции автомобиль Игоря может двигаться только влево, вправо, вверх и вниз, изначально Игорь может выбрать любое направление движения. Игорь все еще сонный, поэтому он нуждается в вашей помощи. Выходные данные Выведите «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 дорожку на перемещение между офисами. Олег может начать с любого офиса и закончить поздравлять в любом офисе. Олег хочет выбрать среди всех возможных маршрутов тот, суммарная сложность дорожек в котором минимальна. Помогите ему найти эту наименьшую возможную сложность. Выходные данные В единственной строке выведите минимальную суммарную сложность дорожек в маршруте, или -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 дорога это слишком много. Страна испытывает финансовый кризис, поэтому необходимо закрыть как можно больше дорог. Помогите Зейну определить максимальное число дорог, которое можно закрыть, не нарушая закон. Кроме того, найдите эти дороги. Выходные данные В первой строке выведите одно целое число 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, а в другой такой дороги нет. Выходные данные Выведите одно число — число различных графов по модулю 109 + 7. Примечание В первом примере следующая сеть — единственная, удовлетворяющая ограничениям. Все расстояния из столицы до городов 2, 3, 4 равны 1. Во втором примере следующие две сети удовлетворяют условию:
| |
|
|
D. Окабэ и город
графы
кратчайшие пути
поиск в глубину и подобное
*2200
Окабэ любит гулять по городу в освещенных лампами местах. Так ему удается избежать нападения школьников. Город Окабэ представлен как таблица, строки пронумерованы от 1 до n сверху вниз, столбцы пронумерованы от 1 до m слева направо. Ровно k клеток города освещены лампами. Гарантируется, что левая верхняя клетка освещена. Окабэ начинает свой путь из верхней левой клетки и хочет попасть в правую нижнюю. Конечно, Окабэ будет ходить только по освещенным клеткам, и может перемещаться из клетки только в соседнюю сверху, снизу, слева или справа. Однако, Окабэ может временно подсветить все клетки в одном столбце или строке, если он заплатит 1 монету, что позволит ему проходить по некоторым клеткам, не подсвеченным изначально. Заметьте, что Окабэ может подсветить только один столбец или одну строку одновременно, и должен заплатить монету каждый раз, когда подсвечивает новый столбец или строку. Чтобы изменить строку или столбец, подсвеченный временно, он должен стоять в клетке, которая подсвечена изначально. Кроме того, как только он убирает временную подсветку со строки или столбца, все клетки этой строки/столбца, не подсвеченные изначально, перестают быть освещены. Помогите Окабэ найти минимальное число монет, которое он должен заплатить, чтобы достичь своей цели! Выходные данные Выведите минимальное число монет, которое должен заплатить Окабэ, чтобы достичь правой нижней клетки, или -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, а из всех кратчайших маршрутов нужно выбрать лексикографически минимальный. При сравнении маршрутов лексикографически следует их представлять как последовательность символов — типов участков. Выходные данные Если существует путь, удовлетворяющий условию, выведите его как последовательность символов — типов участков, символ S в начале и символ T в конце выводить не следует. Иначе выведите «-1» (без кавычек). Обратите внимание, что эта последовательность может быть пустой. Этот случай присутствует в претестах. Вы можете ничего не выводить или выводить один символ конца строки. Оба варианта будут засчитаны за правильный ответ.
| |
|
|
D. Динамический кратчайший путь
графы
кратчайшие пути
*3400
Дан взвешенный ориентированный граф, состоящий из n вершин и m ребер. Требуется ответить на q запросов двух типов: - 1 v — найти длину кратчайшего пути из вершины 1 в вершину v.
- 2 c l1 l2 ... lc — прибавить 1 к весам ребер с номерами l1, l2, ..., lc.
Выходные данные Для каждого запроса первого типа выведите строку с одним числом — длиной кратчайшего пути от 1 до v, либо -1, если такого путь не существует. Примечание Иллюстрация изменений графа в первом примере из условия: 
Иллюстрация изменений графа во втором примере из условия: 
| |
|
|
D. Путь исследования
Бинарный поиск
кратчайшие пути
Паросочетания
Потоки
*2100
Участники Bubble Cup X собрались после соревнования и обсуждают, как лучше всего узнать страну-организатор и города в ней. После небольшого исследования карты Сербии участники выяснили следующий факт: в стране есть V городов, которые пронумерованы от 1 до V, и E двусторонних дорог, соединяющих города. У каждой дороги есть вес (время, необходимое для прохода по этой дороге). На Bubble Cup есть N команд, поэтому участники придумали следующий план: каждая из N команд начнет свой путь в одном из V городов, возможно, некоторые команды будут иметь одинаковую начальную позицию. Они хотят найти минимальное время T такое, что каждая команда может двигаться в течении этих T минут, и количество различных городов, в которых окажутся команды, как минимум K (потому что они будут исследовать только город, в котором окажутся в конце). Команда не обязана двигаться все время, если им нравится какой-то город, они могут остаться в нем и подождать, пока время пройдет. Помогите участникам определить это минимальное время T такое, что участники закончат в минимум K различных городах, или выведите -1, если решения нет. Обратите внимание, что между некоторыми городами может быть больше одной дороги. Выходные данные Выведите единственное число — минимальное время, в течение которого команды могут двигаться, чтобы закончить в хотя бы 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) свободны. Эти клетки могут совпадать. Выходные данные Выведите одно число — минимальное время, которое понадобится Оле, чтобы попасть из (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) положений среднее количество рыбок в сачке было максимально возможным. Выходные данные Выведите одно число — максимально возможное математическое ожидание числа пойманных рыбок. Ваш ответ будет зачтен, если его относительная или абсолютная ошибка не превосходит 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 строк, в i-й должно содержаться выражение минимальной длины, равное i-й функции. Если выражений минимальной длины несколько, нужно вывести лексикографически минимальное. Выражения должны удовлетворять грамматике из условия и не должны содержать пробельных символов. Примечание Таблица истинности для второй функции: 
| |
|
|
C. Джейми и интересный граф
графы
Конструктив
кратчайшие пути
*1600
Джейми называет неориентированный взвешенный граф интересным если он обладает следующими свойствами: - Граф связен и содержит ровно n вершин и m рёбер.
- Все веса рёбер — целые числа и принадлежат отрезку [1, 109].
- Вес кратчайшего пути из вершины 1 в n является простым числом.
- Сумма весов рёбер в минимальном остовном дереве графа является простым числом.
- Граф не содержит петель и кратных рёбер.
В разделе «Примечание» содержатся описания терминов выше. Помогите Джейми найти какой-нибудь интересный граф. Выходные данные В первой строке выведите два целых числа 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\) строк. Для каждой ситуации определите, кто выигрывает. Выведите - «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 целых чисел. i-е из них должно быть равно минимальному количеству монет, которое придется потратить жителю города i для того, чтобы доехать до какого-либо города j (или остаться в городе i), посетить там концерт, и вернуться в город i (если j ≠ i).
| |
|
|
C. Волейбол
кратчайшие пути
*1900
Петя очень любит волейбол. Однажды он опаздывал на волейбольный матч. Свою собственную машину Петя еще не купил, поэтому ему пришлось ехать на такси. В городе n перекрестков, некоторые из которых соединены двусторонними дорогами. Длина каждой дороги выражается некоторым натуральным числом метров, дороги могут иметь разные длины. Изначально на каждом перекрестке стоит ровно одно такси. Таксист с i-го перекрестка согласен проехать (возможно, через несколько других перекрестков) не более ti метров и остановиться на каком-то другом перекрестке. Причем цена поездки не зависит от расстояния и равна ci бурлей. Посреди дороги такси останавливаться не могут. Каждое такси можно использовать не более 1 раза. В такси можно сесть только в перекрестке, где оно изначально расположено. Сейчас Петя находится на перекрестке x, а волейбольный стадион — на перекрестке y. Определите, какая минимальная сумма денег потребуется Пете чтобы доехать до стадиона. Выходные данные Если Петя не может доехать на такси, выведите «-1» (без кавычек). Иначе выведите минимальную стоимость поездки. Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d. Примечание Оптимальный путь - поехать из перекрестка 1 к 2 (через 4), потом из 2 в 3. На это потратится 7+2=9 бурлей.
| |
|
|
D. Борьба с пробками
графы
кратчайшие пути
поиск в глубину и подобное
*1600
Город Nск состоит из n перекрёстков, соединённых m двунаправленными дорогами. Каждая дорога соединяет какие-то два различных перекрёстка, причём никакие две дороги не соединяют одну и ту же пару перекрёстков. Гарантируется, что от любого перекрёстка можно добраться до любого другого, используя только данные дороги. Расстоянием между двумя перекрёстками называется минимальное количество дорог на пути между ними. В целях улучшения транспортной ситуации, городская дума требует от мэра города построить одну новую дорогу. Проблема заключается в том, что мэр только недавно купил себе новый автомобиль, поэтому ему настолько нравится ездить из дома, расположенного у перекрёстка s в здание мэрии, расположенное у перекрёстка t, что он хочет построить такую новую дорогу, что кратчайший путь между этими двумя перекрёстками не уменьшится. Вам поручено посчитать количество пар перекрёстков, не соединённых дорогой, таких что если добавить в дорожную сеть города двунаправленную дорогу между этими перекрёстками, то расстояние между перекрёстками s и t не уменьшится. Выходные данные Выведите одно целое число — количество пар перекрёстков, не соединённых дорогой, таких что добавление между ними дороги не уменьшит расстояние между перекрёстками 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). Так как один человек может участвовать в финале не более двух раз, должно выполняться условие: . Ваша задача — выбрать последовательность таким образом, что предел Ψ существует и его значение максимально:  Так как — бесконечная последовательность, вывести требуется только максимальное значение предела Ψ. Выходные данные Выведите одно единственное действительное число — ожидаемое среднее количество выигранных медалей в год, при использовании оптимальной стратегии. Для ответа допустима абсолютная или относительная погрешность 10 - 6. Примечание Во втором тесте, из каких бы участников не состояла команда, она обречена на успех.
| |
|
|
C. Лифт
графы
дп
кратчайшие пути
*2400
Вы работаете в большом офисе, которое представляет из себя 9-этажное здание с одним лифтом, вмещающим 4 человека. В ваши обязанности входит управлять этим лифтом. Сегодня вы опоздали на работу, и у лифта уже выстроились очереди на разных этажах. Про каждого человека известно, на каком этаже он сейчас находится и на какой этаж хочет попасть. Также известен порядок, в котором люди подходили к лифту. По правилам компании, если сотрудник подошел к лифту раньше другого, то он должен оказаться внутри лифта раньше (даже если они находятся на разных этажах). Выходить сотрудники могут в любом порядке. У лифта есть две команды: - Проехать на один этаж вверх/вниз. На перемещение тратится 1 секунда.
- Открыть двери на этаже. После этого все сотрудники, которым нужно выйти на этом этаже выйдут из лифта. После этого сотрудники, находящиеся на этаже, начнут заходить в лифт в порядке очереди, пока это не противоречит правилам и в лифте достаточно места. Люди заходят и выходят последовательно, каждый тратит 1 секунду на вход или выход.
Изначально лифт находится на 1 этаже. Вам интересно, сколько нужно времени, чтобы доставить всех сотрудников на нужные этажи. Не обязательно возвращать лифт на 1 этаж. Выходные данные Выведите одно целое число — минимальное время в секундах. Примечание Пояснение к первому примеру 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\) городов посчитать, какое минимальное количество монет нужно потратить на перевозку товаров, чтобы провести ярмарку в этом городе. Выходные данные Выведите \(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\) строк — если \(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.

| |
|