| | | |
|
F. Доминирующие индексы
Деревья
снм
Структуры данных
*2300
Задано корневое неориентированное дерево, состоящее из \(n\) вершин. Вершина \(1\) является корнем. Определим массив глубин вершины \(x\), как бесконечную последовательность \([d_{x, 0}, d_{x, 1}, d_{x, 2}, \dots]\), где \(d_{x, i}\) — это количество вершин \(y\) таких, что выполняются оба следующих условия: - \(x\) является предком \(y\);
- простой путь из \(x\) в \(y\) проходит ровно по \(i\) ребрам.
Доминирующий индекс массива глубин вершины \(x\) (или же просто доминирующий индекс вершины \(x\)) — это такой индекс \(j\), что: - для каждого \(k < j\), \(d_{x, k} < d_{x, j}\);
- для каждого \(k > j\), \(d_{x, k} \le d_{x, j}\).
Для каждой вершины дерева вычислите ее доминирующий индекс. Выходные данные Выведите \(n\) чисел. \(i\)-е число должно быть равно доминирующему индексу вершины \(i\).
| |
|
|
B. Химическая таблица
графы
Конструктив
матрицы
поиск в глубину и подобное
снм
*1900
Учёные Иннополиса продолжили исследование периодической таблицы. Существуют n·m известных элементов, и они представлены в периодической таблице — прямоугольнике, состоящем из n строк и m столбцов. Каждый элемент может быть описан своими координатами в таблице (r, c) (1 ≤ r ≤ n, 1 ≤ c ≤ m). Недавно учёные открыли, что для каждых четырёх различных элементов в этой таблице, которые образуют прямоугольник со сторонами, параллельными сторонам таблицы, если они имеют экземпляры трёх из четырёх элементов, то с помощью ядерного синтеза они могут произвести четвёртый элемент. Так, если имеются элементы с позиций (r1, c1), (r1, c2), (r2, c1), где r1 ≠ r2 и c1 ≠ c2, то можно произвести элемент (r2, c2). Использованные экземпляры элементов не выбрасываются и могут быть использованы в дальнейшем для создания других элементов. Созданные элементы также могут в этом участвовать. Учёные Иннополиса уже имеют образцы q элементов. Они хотят получить образцы всех n·m элементов таблицы. Чтобы добиться этого, они могут купить некоторые образцы в других лабораториях, а потом произвести остальные в некотором порядке. Помогите им определить, какое минимальное число элементов им надо купить. Выходные данные Выведите минимальное количество элементов, которые надо купить. Примечание Каждый пример имеет иллюстрацию возможного решения. На левой части картинки крестиками показаны уже имеющиеся элементы. Правая часть картинки показывает, как оставшиеся элементы могут быть получены. Красные кружки обозначают купленные элементы, а числа в синих кружках обозначают возможный порядок, в котором эти элементы могут быть получены Тест 1 Мы можем получить недостающий элемент ядерным синтезом, поэтому не требуется ничего покупать. Тест 2 Так как в таблице всего один ряд, ядерный синтез не может производиться, поэтому мы вынуждены купить недостающие элементы. Тест 3 Существует несколько возможных решений. Одно из них описано ниже. Заметим, что непосредственно после покупки обозначенного красным элемента мы все еще не можем произвести элемент, обозначенный числом 4. Мы сможем это сделать только после получения элемента, обозначенного 1.
| |
|
|
E. Сортировка циклами
математика
снм
*3100
Вам дан массив из \(n\) целых положительных чисел \(a_1, a_2, \dots, a_n\). К массиву можно применять следующие операции: выбрать несколько различных индексов этого массива \(i_1, i_2, \dots, i_k\) (\(1 \le i_j \le n\)) и переместить число, стоящее на позиции \(i_1\) на позицию \(i_2\), число стоящее на позиции \(i_2\) на позицию \(i_3\), ..., число на позиции \(i_k\) на позицию \(i_1\). То есть сдвинуть элементы по циклу \(i_1 \to i_2 \to \ldots i_k \to i_1\). К примеру, если у вас есть \(n=4\), массив \(a_1=10, a_2=20, a_3=30, a_4=40\), и вы выбрали три индекса \(i_1=2\), \(i_2=1\), \(i_3=4\), то получившийся массив будет \(a_1=20, a_2=40, a_3=30, a_4=10\). Вам дано целое неотрицательное число \(s\). Отсортируйте массив с помощью минимально возможного количества таких операций, при условии, что сумма размеров циклов для всех операций не превосходит \(s\), или скажите, что это невозможно. Выходные данные Если невозможно упорядочить массив, используя циклы с суммарной длиной меньше либо равной \(s\), выведите единственное число «-1». В противном случае, в первой строке выведите единственное число \(q\) — минимальное количество операций, требующееся для того, чтобы упорядочить массив. На следующих \(2 \cdot q\) строках выведите описания операций в том порядке, в каком их нужно применять к массиву. Описание \(i\)-й операции начинается со строки с единственным числом \(k\) (\(1 \le k \le n\)) — длины цикла (т.е. количества выбранных индексов). Следующая строка должна содержать \(k\) различных целых чисел \(i_1, i_2, \dots, i_k\) (\(1 \le i_j \le n\)) — сами индексы. Суммарная длина циклов должна быть меньше или равна \(s\), и массив должен быть упорядочен после применениях всех \(q\) операций. Если есть несколько возможных ответов с оптимальным \(q\), выведите любой из них. Примечание В первом примере также возможно упорядочить массив двумя операциями суммарной длины 5: сначала применить цикл \(1 \to 4 \to 1\) (длины 2), потом применить цикл \(2 \to 3 \to 5 \to 2\) (длины 3). Однако, это неверный ответ, поскольку в задаче требуется минимизировать количество операций, а минимальное число операций для этого теста равно единице. Во втором примере, можно упорядочить массив двумя циклами общей длины 4 \(1 \to 2 \to 1\) и \(3 \to 4 \to 3\). Но невозможно циклами длиной не больше 3. В третьем примере, массив уже упорядочен, поэтому операции не нужны. Общая длина пустого множества циклов принимается равной нулю.
| |
|
|
F. Мобильная сеть
графы
Деревья
поиск в глубину и подобное
снм
*2600
Вы руководите мобильным оператором и хотите предлагать конкурентоспособные цены для создания сети. В сети есть \(n\) узлов. Ваш конкурент уже предложил некоторые подключения между узлами по некоторым фиксированным ценам. Эти подключения двусторонние. Всего ваш конкурент предложил \(m\) подключений. \(i\)-е из этих подключений соединяет узлы \(fa_i\) и \(fb_i\) и стоит \(fw_i\). У вас есть список из \(k\) подключений, которые вы хотите предложить. Гарантируется, что эти подключения не образуют ни одного цикла. \(j\)-е из этих подключений соединит вершины \(ga_j\) и \(gb_j\). Эти подключения тоже двусторонние. Вы еще не определились с ценой каждого из подключений. Вы можете выбрать стоимости этих подключений любыми целыми числами независимо для каждого из подключений. После этого клиент выберет \(n - 1\) такое подключение из предложенных вами и вашим конкурентом, что все узлы будут объединены в единую сеть, а суммарная стоимость данных подключений будет минимальна. Если существует несколько способов сделать такой выбор, клиент выберет такой, где число ваших подключений максимально. Вы хотите предложить такие цены, что клиент выберет все \(k\) ваши подключения, а суммарная стоимость этих подключений максимально возможная. Выведите эту максимально возможную суммарную стоимость, или \(-1\), если она не ограничена. Выходные данные Выведите единственное число — максимально возможную прибыль, если вы можете произвольно выбирать стоимости ваших подключений. Если прибыль неограничена, выведите \(-1\). Примечание В первом примере оптимально дать стоимость \(3\) подключению \(1-3\), стоимость \(3\) подключению \(1-2\), стоимость \(8\) подключению \(3-4\). В таком случае самый дешевый способ получить связную сеть стоит \(14\), и клиент из таких способов выберет тот, которые содержит все ваши подключения. Во втором примере до тех пор, пока ваше первое подключение стоит \(30\) или меньше, клиент будет вынужден выбрать оба ваших подключения независимо от цены второго, и вы можете получить неограниченную прибыль.
| |
|
|
F. Сессия в БГУ
Бинарный поиск
графы
Паросочетания
поиск в глубину и подобное
снм
*2400
Поликарп учится в Берляндском государственном университете. Совсем скоро ему предстоит сдать сессию. Он должен сдать \(n\) экзаменов. Для каждого экзамена \(i\) известны два дня: \(a_i\) — день основной сдачи экзамена, \(b_i\) — день пересдачи (\(a_i < b_i\)). В один день Поликарп может сдавать не более одного экзамена. Для каждого экзамена Поликарп самостоятельно выбирает, в какой из двух дней его сдать. Необходимо сдать все \(n\) экзаменов. Поликарп хочет сдать сессию как можно быстрее. Выведите минимальный номер дня, в который Поликарп сможет сдать все \(n\) экзаменов, либо выведите -1, если сдать сессию полностью невозможно. Выходные данные Если Поликарп не сможет сдать все \(n\) экзаменов, выведите -1. В противном случае выведите минимальный номер дня, когда Поликарп сможет это сделать.
| |
|
|
B. Ктулху
графы
поиск в глубину и подобное
снм
*1500
...И пошел старик к синему морю; видит, на море черная буря. Стал он кликать золотую рыбку, но, увы, появился лишь Ктулху... А на другом конце земного шара Пентагон уже вовсю собирает данные, прогнозирует поведение монстра и готовит сверхсекретное супероружие. Из-за высокой сейсмической активности и плохих погодных условий до сих пор не удалось сделать качественные фотоснимки со спутников. Результатом первичного анализа объекта оказался неориентированный граф c n вершинами и m ребрами. Теперь лучшим умам мира предстоит определить, можно ли считать этот граф Ктулху или нет. Для простоты предположим, что Ктулху из космоса выглядит как некоторое сферическое тело, к которому прикреплены отростки-щупальца. Формально, Ктулху назовем такой неориентированный граф, который может быть представлен как набор из трех или более корневых деревьев, корни которых соединены простым циклом. Гарантируется, что граф не содержит кратных ребер и петель. Выходные данные Выведите «NO», если граф не является Ктулху, и «FHTAGN!» в противном случае. Примечание Простым циклом назовем множество из v вершин, которые можно пронумеровать так, что будут существовать ребра только между вершинами с номерами 1 и 2, 2 и 3, ..., v - 1 и v, v и 1. Дерево — связный неориентированный граф из n вершин и n - 1 ребер (n > 0). Корневое дерево — дерево, в котором выделена одна вершина, корень.
| |
|
|
C. Безопасность сети
графы
математика
поиск в глубину и подобное
снм
сортировки
*2200
К компьютерной сети Метрополии подключены \(n\) серверов, каждому из которых назначен некоторый ключ шифрования, выбранный в диапазоне от \(0\) до \(2^k - 1\) включительно. Обозначим через \(c_i\) ключ шифрования, назначенный \(i\)-му серверу. Также некоторые \(m\) пар серверов напрямую соединены каналом передачи данных. Из-за особенностей используемых алгоритмов шифрования канал передачи данных безопасен, только если два соединённых этим каналом сервера используют различные ключи шифрования. Изначально ключи шифрования выбраны таким образом, что все каналы передачи данных безопасны. Вам стало известно, что по интернету активно распространяется новый вирус, который при заражении им какого-либо сервера Метрополии изменяет его ключ шифрования. А именно, в теле вируса хранится некоторое неизвестное вам число \(x\), выбранное в том же диапазоне, и если вирусом заразится сервер \(i\), то его ключ шифрования изменится с \(c_i\) на \(c_i \oplus x\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ. К сожалению, вы не знаете ни число \(x\), ни какие именно серверы Метрополии будут заражены опасным вирусом, поэтому решили посчитать количество вариантов, при которых безопасность каналов нарушена не будет. Формально, вам требуется найти количество пар \((A, x)\), где \(A\) — некоторое подмножество серверов (возможно пустое), а \(x\) — возможное значение внутреннего параметра вируса в диапазоне от \(0\) до \(2^k - 1\) включительно, таких что если вирус с параметром \(x\) заразит компьютеры из подмножества \(A\), а остальные компьютеры заражены не будут, то все каналы передачи данных останутся безопасными. Поскольку эта величина может быть достаточно большой, найдите остаток от её деления на \(10^9 + 7\). Выходные данные В единственной строке выходного файла выведите одно число — количество удачных исходов заражения какого-то подмножества компьютеров вирусом по модулю \(10^9 + 7\). Примечание Рассмотрим первый пример. Возможные значения числа \(x\), содержащегося в вирусе, равны \(0\), \(1\), \(2\) и \(3\). Для значений \(0\), \(2\) и \(3\) вирус может заразить любое подмножество серверов, что дает нам \(16\) исходов для каждого значения. Если же вирус содержит число \(1\), то он может заразить либо все серверы, либо ни одного. Таким образом, количество удачных исходов равно \(16 + 2 + 16 + 16 = 50\).
| |
|
|
F. Множества листьев
графы
Деревья
жадные алгоритмы
поиск в глубину и подобное
снм
сортировки
Структуры данных
*2400
Вам дано неориентированное дерево, состоящее из \(n\) вершин. Назовём вершину листом, если она соединена ровно с одной другой вершиной. Под расстоянием между двумя вершинами будем понимать количество рёбер на кратчайшем пути между этими вершинами. Назовем некоторое множество листьев красивым, если максимальное расстояние между любой парой листьев из этого множества не превышает \(k\). Перед вами стоит задача разделить все листья дерева на непересекающиеся красивые множества. Определите минимальное количество множеств, которые можно получить в результате описанного разделения. Выходные данные Выведите минимальное количество красивых множеств в разбиении всех листьев. Примечание Картинка описывает разбиение дерева из первого примера.
| |
|
|
D. Запросы на дедукцию
снм
Структуры данных
*2400
Есть массив \(a\) из \(2^{30}\) целых чисел, пронумерованных от \(0\) до \(2^{30}-1\). Изначально вы знаете, что \(0 \leq a_i < 2^{30}\) (\(0 \leq i < 2^{30}\)), но вы не знаете эти числа. Ваша задача заключается в том, чтобы обработать все запросы двух видов: - 1 l r x: Вам сообщают, что исключающее ИЛИ (он же XOR) подотрезка \([l, r]\) (включительно) равно \(x\). То есть \(a_l \oplus a_{l+1} \oplus \ldots \oplus a_{r-1} \oplus a_r = x\), где \(\oplus\) — побитовое исключающее ИЛИ. В некоторых случаях полученный запрос противоречит предыдущим запросам. В этом случае нужно проигнорировать противоречивый запрос (новый запрос).
- 2 l r: Нужно вывести исключающее ИЛИ подмассива \([l, r]\) (включительно). Если же, используя все предыдущие запросы, ответить на этот запрос невозможно, нужно вывести \(-1\).
Обратите внимание, что запросы в этой задаче закодированы, каждый следующий запрос вы сможете раскодировать, вычислив ответ на предыдущий. Выходные данные Для каждого запроса второго типа, выведите исключающее ИЛИ подмассива или \(-1\), если на этот запрос невозможно ответить. Примечание В первом примере, реальными запросами (перед кодированием) являются: - 12
- 2 1 2
- 2 0 1073741823
- 1 1 2 5
- 2 1 1
- 2 2 2
- 2 1 2
- 1 2 3 6
- 2 1 1
- 1 1 3 0
- 2 1 1
- 2 2 2
- 2 3 3
- Ответы на первые два запроса равны \(-1\) потому, что нет достаточно информации.
- Первый запрос первого типа сообщает, что \(a_1 \oplus a_2 = 5\). Обратите внимание, что до сих пор невозможно узнать значения в \(a_1\) или \(a_2\) (например, может быть, что \(a_1 = 1, a_2 = 4\), или же \(a_1 = 3, a_2 = 6\)).
- После трех запросов первого типа есть достаточно информации, чтобы узнать значения в \(a_1, a_2, a_3\).
Во втором примере обратите внимание, что после двух запросов первого типа, уже известно, что \(a_5 \oplus a_6 = 12\), значит третий запрос противоречит предыдущим двум, поэтому, ми его игнорируем.
| |
|
|
D. Занимательная Геодезия
Перебор
реализация
снм
*2700
Карты в игре разбиты на квадратные ячейки, которые называются гео-панелями. Некоторые из этих панелей окрашены. Будем считать, что гео-панели, которые не имеют цвета, покрашены в прозрачный цвет. Еще на карте есть так называемые гео-символы. Они имеют вид цветных пирамидок (в том числе существуют гео-символы прозрачного цвета). Каждый гео-символ расположен на одной гео-панели, а на каждой гео-панели может находиться не более одного гео-символа. Гео-символы можно уничтожать. Чтобы лучше понять что происходит при уничтожении гео-символов, заведем некую очередь, в которую будем складывать только что уничтоженные гео-символы. В самом начале поместим в очередь только что уничтоженный гео-символ. Далее будем повторять следующую операцию: Извлечем из начала очереди гео-символ. Посмотрим на цвет панели, на которой находился данный гео-символ. Если он отличен от прозрачного и отличен от цвета данного гео-символа, то происходит перекрашивание всех гео-панелей этого цвета в цвет данного гео-символ (в том числе, прозрачные гео-символы перекрашивают гео-панели в прозрачный цвет). Перекрашивание происходит по бесконечной спирали строго в следующем порядке, начиная от панели, на которой стоял гео-символ: Другими словами, мы выбираем все панели, которые нужно перекрасить и находим их номера в бесконечной спирали, центр которой помещен в позицию данного гео-символа. После этого перекрашиваем их в порядке возрастания номеров. Если в момент перекрашивания панели на ней находится еще один гео-символ, то он удаляется с карты и помещается в конец очереди. После перекрашивания гео-символ уничтожается окончательно и из начала очереди извлекается следующий гео-символ (если он есть) и процесс повторяется. Процесс заканчивается если очередь оказалась пуста. Чтобы лучше понять этот процесс — смотрите разбор примера. Вам известны цвета всех гео-панелей и расположение всех гео-символов. Определите количество перекрашиваний, которое случится, если уничтожить один из гео-символов. Выходные данные Выведите одно целое число — общее количество перекрашиваний после уничтожения гео-символа. Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать поток cout (также вы можете использовать спецификатор %I64d). Примечание Все действия, происходящие в примере можно видеть на следующей картинке: Если ваш браузер не поддерживает APNG, и вы видите только статичную картинку, то вы можете посмотреть GIF версию этой картинки по следующей ссылке: 105_D_img_2.gif
| |
|
|
G. Дистинктификация
жадные алгоритмы
снм
Структуры данных
*2900
Допустим, у вас есть последовательность \(S\) из \(k\) пар целых чисел \((a_1, b_1), (a_2, b_2), \dots, (a_k, b_k)\). Вы можете совершать с ней следующие операции: - Выбрать некоторую позицию \(i\) и увеличить \(a_i\) на \(1\). Эту операцию можно делать только в том случае, если существует хотя бы одна позиция \(j\), такая, что \(i \ne j\) и \(a_i = a_j\). Стоимость такой операции равна \(b_i\);
- Выбрать некоторую позицию \(i\) и уменьшить \(a_i\) на \(1\). Эту операцию можно делать только в том случае, если существует хотя бы одна позиция \(j\), такая, что \(a_i = a_j + 1\). Стоимость такой операции равна \(-b_i\).
Каждая операция может быть использована любое количество раз (возможно, ноль). Обозначим за \(f(S)\) такое минимально возможное \(x\), что существует последовательность операций с суммарной стоимостью \(x\), после которой все \(a_i\) в \(S\) станут попарно различными. А теперь, собственно, сама задача. Вам дана последовательность \(P\), состоящая из \(n\) пар целых чисел \((a_1, b_1), (a_2, b_2), \dots, (a_n, b_n)\). Все значения \(b_i\) попарно различны. Пусть \(P_i\) — это последовательность, состоящая из первых \(i\) пар из \(P\). Ваша задача — подсчитать \(f(P_1), f(P_2), \dots, f(P_n)\). Выходные данные Выведите \(n\) целых чисел, \(i\)-е из которых должно быть равно \(f(P_i)\).
| |
|
|
B. Алиса и парикмахер
реализация
снм
*1300
Волосы Алисы стали расти не по дням, а по минутам. Возможно, этому причиной является избыток витаминов, а возможно — чёрная магия... Чтобы предотвратить это, Алиса решила сходить в парикмахерскую. При этом она хочет, чтобы после стрижки её волосы стали иметь длину не более \(l\) сантиметров, где \(l\) — её любимое число. Для наглядности будем считать, что голова Алисы представляет собой прямую линию, на которой последовательно растут \(n\) волос. Давайте пронумеруем их от \(1\) до \(n\). За один взмах ножницами парикмахер может укоротить все волосы на любом отрезке до длины \(l\), но с одним условием: все волосы на этом отрезке изначально имели длину строго больше \(l\). Парикмахер хочет сделать свою работу как можно скорее, поэтому сделает минимальное число взмахов ножницами, так как каждый взмах занимает одну секунду. Алиса пока ещё не решила, когда пойдёт в парикмахерскую, поэтому попросила вас посчитать время её стрижки в разные моменты времени. В частности, вам нужно обрабатывать два типа запросов: - \(0\) — Алиса интересуется сколько времени займёт стрижка если она прямо сейчас пойдёт в парикмахерскую.
- \(1\) \(p\) \(d\) — \(p\)-й волос вырос на \(d\) сантиметров.
Обратите внимание, что в запросе \(0\) Алису интересует гипотетический сценарий стрижки волос — длина волос после этого не изменяется. Выходные данные Для каждого запроса типа \(0\) выведите время стрижки Алисы. Примечание Рассмотрим пример из условия: - Изначально длины волос равны \(1, 2, 3, 4\) и только \(4\)-й волос длиннее \(l=3\), и парикмахер может укоротить его за \(1\) секунду.
- Затем у Алисы подрастает второй волос, и длины волос теперь равны \(1, 5, 3, 4\)
- Теперь стрижка занимает две секунды: требуется два взмаха ножницами — на \(4\)-й волос и на \(2\)-й.
- Затем у Алисы подрастает первый волос, и длины волос теперь равны \(4, 5, 3, 4\)
- Стрижка всё ещё занимает две секунды: за один взмах парикмахер может состричь \(4\)-й волос и за ещё один отрезок с \(1\)-го по \(2\)-й волос.
- Затем у Алисы подрастает третий волос, и длины волос теперь равны \(4, 5, 4, 4\)
- Теперь стрижка занимает всего одну секунду: за один взмах можно укоротить подотрезок с \(1\)-го волоса по \(4\)-й.
| |
|
|
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\). В графе могут содержаться параллельные ребра и петли, как в первом примере.
| |
|
|
C. Счастливое дерево
Деревья
дп
снм
*1900
Петя любит счастливые числа. Всем известно, что счастливыми являются положительные целые числа, в десятичной записи которых содержатся только счастливые цифры 4 и 7. Например, числа 47, 744, 4 являются счастливыми, а 5, 17, 467 — не являются. Однажды Пете встретилось дерево из n вершин. При этом дерево было взвешенным, то есть каждое его ребро имело вес (целое положительное число). Ребро счастливое, если его вес — счастливое число. Напомним, что дерево из n вершин — это неориентированный связный граф, у которого ровно n - 1 ребер. Пете стало интересно, сколько существует таких троек вершин дерева (i, j, k), что и на пути из i в j, и на пути из i в k есть хотя бы одно счастливое ребро (все три вершины попарно различны). Порядок чисел в тройке имеет значение, то есть тройка (1, 2, 3) не равна тройке (2, 1, 3) и не равна тройке (1, 3, 2). Найдите количество таких троек. Выходные данные В единственной строке выведите одно число — ответ на задачу. Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d. Примечание 16 троек из первого примера: (1, 2, 4), (1, 4, 2), (2, 1, 3), (2, 1, 4), (2, 3, 1), (2, 3, 4), (2, 4, 1), (2, 4, 3), (3, 2, 4), (3, 4, 2), (4, 1, 2), (4, 1, 3), (4, 2, 1), (4, 2, 3), (4, 3, 1), (4, 3, 2). Во втором примере подходит любая тройка вершин. Всего троек: 4·3·2 = 24.
| |
|
|
F. Сделай связным
графы
жадные алгоритмы
снм
*1900
Вам дан неориентированный граф, состоящий из \(n\) вершин. На каждой вершине записано число; число, записанное на вершине \(i\), равно \(a_i\). Изначально в графе нет ни одного ребра. Вы можете добавлять ребра в граф за определенную стоимость. За добавление ребра между вершинами \(x\) и \(y\) надо заплатить \(a_x + a_y\) монет. Также существует \(m\) специальных предложений, каждое из которых характеризуется тремя числами \(x\), \(y\) и \(w\), и означает, что можно добавить ребро между вершинами \(x\) и \(y\) за \(w\) монет. Эти специальные предложения не обязательно использовать: если существует такая пара вершин \(x\) и \(y\), такая, что для нее существует специальное предложение, можно все равно добавить ребро между ними за \(a_x + a_y\) монет. Сколько монет минимально вам потребуется, чтобы сделать граф связным? Граф является связным, если от каждой вершины можно добраться до любой другой вершины, используя только ребра этого графа. Выходные данные Выведите одно целое число — минимальное количество монет, которое необходимо потратить, чтобы сделать граф связным. Примечание В первом примере из условия можно соединить \(1\) и \(2\) при помощи \(2\)-го спецпредложения, а затем \(1\) и \(3\) без использования спецпредложения. В следующих двух примерах оптимальный ответ можно получить без использования спецпредложений.
| |
|
|
G. Вася и максимальный заработок
Бинарный поиск
дп
Конструктив
снм
Структуры данных
*2400
Вася сильно устал от кредитов (из задачи F) и теперь хочет заработать деньги сам! Для этого он решил подготовить контест. Васе предложено \(n\) задач. Они пронумерованы от \(1\) до \(n\). Сложность \(i\)-й задачи равна \(d_i\). Кроме того, задачи заданы в возрастающем относительно сложности порядке. Сложности всех задач различны. Для того чтобы добавить \(i\)-ю задачу в контест Васе нужно заплатить \(c_i\) бурлей автору. За каждую задачу в своем контесте Вася получит \(a\) бурлей. Для того чтобы создать контест нужно выбрать непрерывный подотрезок задач. Суммарный заработок за контест считается следующим образом: - если Вася берет задачу \(i\) в контест, ему нужно заплатить \(c_i\) её автору;
- за каждую добавленную задачу Вася получает \(a\) бурлей;
- пусть \(gap(l, r) = \max\limits_{l \le i < r} (d_{i + 1} - d_i)^2\). Если Вася берет в контест все задачи с индексом от \(l\) до \(r\), он так же платит \(gap(l, r)\). Если \(l = r\) то \(gap(l, r) = 0\).
Посчитайте максимальный Васин заработок, если он подготовит непрерывный подотрезок задач. Выходные данные Выведите одно число — максимальное количество бурлей, которое может заработать Вася.
| |
|
|
F. Унификация MST
Бинарный поиск
графы
жадные алгоритмы
снм
*2100
Задан неориентированный взвешенный связный граф, состоящий из \(n\) вершин и \(m\) ребер без петель и кратных ребер. \(i\)-е ребро — \(e_i = (u_i, v_i, w_i)\); расстояние между вершинами \(u_i\) и \(v_i\) по ребру \(e_i\) равно \(w_i\) (\(1 \le w_i\)). Граф является связным, то есть для каждой пары вершин существует хотя бы один путь между ними, состоящий только из ребер заданного графа. Минимальное остовное дерево (MST) в случае положительных весов — это подмножество ребер связного взвешенного неориентированного графа, соединяющее все его вершины и имеющее минимальный суммарный вес среди всех таких подмножеств (суммарный вес — это сумма весов выбранных ребер). Вы можете модифицировать заданный граф. Единственная операция, которую вы можете проводить, заключается в следующем: увеличить вес какого-либо ребра на \(1\). Вы можете увеличивать вес каждого ребра любое (возможно, нулевое) количество раз. Предположим, что изначальный вес MST был равен \(k\). Ваша задача — увеличить веса некоторых ребер за минимально возможное количество операций таким образом, чтобы вес MST в получившемся графе остался равен \(k\), но MST стало уникальным (это означает, что есть только один способ выбрать MST в получившемся графе). Ваша задача — посчитать минимальное количество операций, необходимое для того, чтобы это сделать. Выходные данные Выведите одно целое число — минимальное количество операций, чтобы унифицировать MST заданного графа без изменения веса MST. Примечание Картинка, соответствующая первому тестовому примеру:  Вы можете, например, увеличить вес ребра \((1, 6)\) или \((6, 3)\) на \(1\) для унификации MST. Картинка, соответствующая последнему тестовому примеру:  Вы можете, например, увеличить веса ребер \((1, 5)\) и \((2, 4)\) на \(1\) для унификации MST.
| |
|
|
C. Петя и пауки
битмаски
дп
снм
*2100
Маленький Петя любит заниматься дрессировкой пауков. У Пети есть доска размера n × m, в каждой клетке которой изначально сидит паук. Через одну секунду Петя быстро выбирает для каждого паука некоторое действие, и все они покорно выполняют свои команды. Всего есть 5 различных команд: остаться на месте или переползти из своей клетки в определенную из четырех соседних по стороне (то есть по одной команде на каждое из четырех возможных направлений). Петя дает команды таким образом, чтобы ни один паук не уполз за пределы доски. Допускается, что пауки могут ползти навстречу друг другу. Все пауки переползают одновременно, в одной клетке в итоге может оказаться более одного паука. Петя хочет знать, каким может быть максимальное возможное количество свободных от пауков клеток через одну секунду. Выходные данные В первой строке выведите максимальное число клеток, в которых нет пауков. Примечание В первом примере единственный возможный ответ: s Во втором примере один из возможных вариантов ответа: rdl rul
s обозначает команду «оставаться на месте», l, r, d, u обозначают команды соответственно «ползти влево», «ползти вправо», «ползти вниз», «ползти вверх».
| |
|
|
C. Соединить
Перебор
поиск в глубину и подобное
снм
*1400
Алиса живет на плоской земле, которая может быть представлена как квадратная решетка \(n \times n\) со строками и столбцами, пронумерованными от \(1\) до \(n\). Обозначим клетку на пересечении строки \(r\) и столбца \(c\) упорядоченной парой \((r, c)\). Каждая клетка решетки является либо землей, либо водой. Пример планеты с \(n = 5\). Она также является первым примером. Алиса живет на клетке, которая является землей, \((r_1, c_1)\). Она хочет добраться до другой клетки, которая является землей, \((r_2, c_2)\). В любой момент она может переместиться в одну из соседних с ней ячеек — в одном из четырех направлений (т.е. вверх, вниз, влево или вправо). К сожалению, Алиса не умеет плавать, и можно перемещаться только пешком (т.е. только по земле). В итоге путешествие Алисы может быть невозможно. Чтобы помочь Алисе, вы хотите создать не более одного туннеля между какими-то двумя земляными клетками. Туннель позволяет Алисе перемещаться между двумя его концами. Создание туннеля требует некоторых затрат: стоимость туннеля между клетками \((r_s, c_s)\) и \((r_t, c_t)\) равна \((r_s-r_t)^2 + (c_s-c_t)^2\). Таким образом, ваша задача — найти минимальную стоимость постройки не более одного туннеля так, чтобы Алиса смогла добраться от клетки \((r_1, c_1)\) до клетки \((r_2, c_2)\). Если постройка туннеля не обязательна, стоимость полагается равной \(0\). Выходные данные Выведите одно целое число — минимальную возможную стоимость постройки не более одного туннеля так, чтобы Алиса смогла добраться от клетки \((r_1, c_1)\) до клетки \((r_2, c_2)\). Примечание В первом примере должен быть построен туннель между клетками \((1, 4)\) и \((4, 5)\). Стоимость такого туннеля равна \((1-4)^2 + (4-5)^2 = 10\), что является оптимальным. Таким образом, Алиса сможет дойти от \((1, 1)\) до \((1, 4)\), использовать туннель от \((1, 4)\) до \((4, 5)\), а затем дойти от \((4, 5)\) до \((5, 5)\). Во втором примере должен быть построен туннель между клетками \((1, 3)\) и \((3, 1)\). Стоимость такой постройки равна \((1-3)^2 + (3-1)^2 = 8\).
| |
|
|
D. Выбор гурмана
графы
дп
жадные алгоритмы
поиск в глубину и подобное
снм
*2000
Гурман Яблочков работает редактором известного гастрономического издания. Он разъезжает по всему миру, дегустируя новые изыски именитых шеф-поваров самых фешенебельных ресторанов высокой кухни. У Яблочкова есть свой фирменный способ ревью: в каждом заведении Яблочков заказывает два набора блюд в разные дни. Все заказанные блюда разные, так как Яблочков не любит есть одно и то же. Для каждой пары блюд из разных наборов он точно помнит, какое из них лучше по его ощущениям, или что они одинаковы по вкусовым качествам. Затем гурман оценивает каждое блюдо положительным целым числом. Однажды, во время очередной ревизии, ресторан кельтской средневековой кухни «Пуассон», подающий суп из каштанов с пихтой, теплый содовый хлеб, пряный лимонный пирог и другую народную еду, очень приятно удивил гурмана своим разнообразным меню, и эксперт заказал слишком много. Поэтому ему нужна помощь в оценке блюд. Гурман в первый день дегустировал набор из \(n\) блюд, во второй день набор из \(m\) блюд. Он составил таблицу ощущений \(a\) размером \(n \times m\), в которой описал свои впечатления. Если по мнению эксперта блюдо \(i\) из первого набора лучше блюда \(j\) из второго набора, то \(a_{ij}\) равно «>», в противоположном случае \(a_{ij}\) равно «<». Блюда также могут быть равны по уровню, тогда \(a_{ij}\) равно «=». Теперь Яблочков хочет, чтобы вы помогли ему оценить каждое блюдо в наборах целым положительным числом. Так как Яблочков очень строгий дегустатор, то постарается оценить блюда так, чтобы максимальная из оценок была как можно меньше. В то же время Яблочков очень справедливый, поэтому никогда не оценивает блюда так, чтобы это шло вразрез с его ощущениями. Другими словами, если \(a_{ij}\) равно «<», то оценка блюда \(i\) из первого набора должна быть меньше оценки блюда \(j\) из второго набора, если \(a_{ij}\) равно «>», то должна быть больше, а если \(a_{ij}\) равно «=», то должна совпадать. Помогите Яблочкову выставить оценки каждому блюду из обоих наборов так, чтобы это согласовывалось с его ощущениями, или определите, что это невозможно. Выходные данные В первой строке выведите «Yes», если можно сделать корректную оценку всем блюдам и «No» иначе. В случае, если сделать корректную оценку можно, во второй строке выведите \(n\) целых чисел — оценки блюд первого набора, а в третьей строке \(m\) целых чисел — оценки блюд второго набора. Примечание В первом примере все блюда первого дня лучше всех блюд второго дня. Значит, самой высокой оценкой будет \(2\) для всех блюд первого дня. В третьем примере таблица противоречива: нет ни одного набора оценок, который удовлетворял бы ей.
| |
|
|
F. Ася и котята
Конструктив
снм
*1700
Ася очень любит животных. Недавно она приобрела \(n\) котят, пронумеровала их от \(1\) до \(n\) и поселила в вольере. Вольер представляет собой ряд из \(n\) ячеек, пронумерованных от \(1\) до \(n\) слева направо. Cоседние ячейки разделены сетчатыми перегородками, всего в вольере \(n - 1\) перегородок. Изначально в каждой ячейке поселился ровно один котёнок с некоторым номером. Наблюдая за котятами, Ася заметила, что они очень дружелюбны и некоторые пары живущих в соседних ячейках котят очень хотят играть друг с другом. Чтобы не лишать их этого удовольствия, Ася стала вынимать перегородки между соседними ячейками. В частности, в \(i\)-й день, Ася: - Обратила внимание, что котята \(x_i\) и \(y_i\), живущие в соседних ячейках, хотят играть вместе.
- Удаляла перегородку между этими ячейками, превращая их в одну, в которой оказывались все котята из двух прежних ячеек.
Поскольку Ася ни разу возвращала перегородки, через \(n - 1\) день вольер стал единой ячейкой, в которой оказались все котята. Для каждого дня, Ася помнит номера котят \(x_i\) и \(y_i\), которые хотели играть вместе, однако она не помнит как котята были поселены в ячейки изначально. Помогите ей найти какое-нибудь возможное начальное расселение котят по \(n\) ячейкам. Выходные данные Для каждой ячейки от \(1\) до \(n\) выведите целое число — номер котёнка от \(1\) до \(n\), который в ней находился изначально. Все выведенные числа должны быть различны. Гарантируется, что существует хотя бы один возможный ответ. В случае, если существует несколько решений, выведите любое из них. Примечание В ответе к примеру приведено одно из нескольких возможных изначальных расселений котят. На картинке ниже показано, как происходило объединение ячеек при таком изначальном расселении. Обратите внимание, что котята, желавшие играть вместе в каждый из дней, действительно находились в соседних ячейках.
| |
|
|
F2. Покрывающее дерево с одной фиксированной степенью
графы
жадные алгоритмы
Конструктив
поиск в глубину и подобное
снм
*1900
Задан неориентированный невзвешенный связный граф, состоящий из \(n\) вершин и \(m\) ребер. Гарантируется, что в графе отсутствуют петли и кратные ребра. Ваша задача — найти любое такое покрывающее дерево этого графа, что степень первой вершины (вершины с номером \(1\)) вершины равна \(D\) (или сказать, что таких покрывающих деревьев не существует). Напомним, что степень вершины — это количество ребер, инцидентных ей. Выходные данные Если не существует покрывающего дерева, удовлетворяющего условию задачи выведите «NO» в первой строке. Иначе выведите «YES» в первой строке и затем выведите \(n-1\) строк, описывающих ребра такого покрывающего дерева, что степень первой вершины (вершины с номером \(1\)) равна \(D\). Убедитесь, что ребра выводимого покрывающего дерева представляют собой подмножество ребер входных данных (порядок ребер не важен, также ребро \((v, u)\) может быть выведено как \((u, v)\)). Если существует несколько возможных ответов, выведите любой. Примечание Картинка, соответствующая первому и второму тестовым примерам:  Картинка, соответствующая третьему тестовому примеру: 
| |
|
|
C. Дерево и рёбра
графы
Деревья
математика
поиск в глубину и подобное
снм
*1500
Вам дано дерево (связный неориентированный граф без циклов), состоящее из \(n\) вершин. Каждое из \(n - 1\) рёбер дерева покрашено в чёрный или красный цвет. Вам также дано целое число \(k\). Рассмотрим последовательности из \(k\) вершин. Скажем, что последовательность \([a_1, a_2, \ldots, a_k]\) является хорошей, если она удовлетворяет следующему: - Мы пройдём некоторый путь в дереве (возможно посещающий несколько раз одну и ту же вершину или ребро), начинающийся в \(a_1\) и заканчивающийся в \(a_k\).
- Начнём в \(a_1\), затем перейдём в \(a_2\) по кратчайшему пути между \(a_1\) и \(a_2\), затем перейдём в \(a_3\) аналогичным образом, и так далее, пока наконец не пройдём кратчайший путь из \(a_{k-1}\) в \(a_k\).
- Если в результате такого процесса мы пройдём хотя бы по одному чёрному ребру, то последовательность является хорошей.
Рассмотрим дерево, изображенное на рисунке. Если \(k=3\), то следующие последовательности являются хорошими: \([1, 4, 7]\), \([5, 5, 3]\) и \([2, 3, 7]\). Следующие последовательности не являются хорошими: \([1, 4, 6]\), \([5, 5, 5]\), \([3, 7, 3]\). Всего есть \(n^k\) последовательностей вершин, посчитайте сколько из них являются хорошими. Так как это число может быть очень большим, выведите его по модулю \(10^9+7\). Выходные данные Выведите одно число — количество хороших последовательностей по модулю \(10^9 + 7\). Примечание В первом примере все последовательности (\(4^4\)) длины \(4\) являются хорошими, кроме следующих: - \([1, 1, 1, 1]\)
- \([2, 2, 2, 2]\)
- \([3, 3, 3, 3]\)
- \([4, 4, 4, 4]\)
Во втором примере, все рёбра красные, а значит нет ни одной хорошей последовательности.
| |
|
|
F. Расширение множества точек
разделяй и властвуй
снм
Структуры данных
*2600
Для заданного множества точек на координатной плоскости \(S\) обозначим его расширение \(E(S)\) как результат следующего алгоритма: Создадим другое множество точек \(R\), изначально равное \(S\). Затем, пока существуют четыре числа \(x_1\), \(y_1\), \(x_2\) и \(y_2\), такие, что \((x_1, y_1) \in R\), \((x_1, y_2) \in R\), \((x_2, y_1) \in R\) и \((x_2, y_2) \notin R\), добавим \((x_2, y_2)\) к \(R\). Когда такую четверку чисел найти будет нельзя, прекратим алгоритм и скажем, что множество \(R\) — результат. А теперь — сама задача. У вас есть множество \(S\), изначально пустое. Надо обрабатывать два типа запросов: добавить какую-нибудь точку в \(S\), или удалить точку. После каждого запроса выведите, чему равен размер множества \(E(S)\). Выходные данные Выведите \(q\) целых чисел. \(i\)-е число должно быть равно размеру \(E(S)\) после первых \(i\) запросов.
| |
|
|
D. 0-1-Дерево
Деревья
дп
поиск в глубину и подобное
разделяй и властвуй
снм
*2200
Задано дерево (неориентированный связный ацикличный граф), состоящее из \(n\) вершин и \(n - 1\) ребра. На каждом ребре записано число, каждое из чисел — это либо \(0\) (назовем такие ребра \(0\)-ребрами), либо \(1\) (назовем их \(1\)-ребрами). Назовем упорядоченную пару вершин \((x, y)\) (\(x \ne y\)) корректной, если при проходе по простому пути от \(x\) до \(y\) мы никогда не пройдем по \(0\)-ребру после прохода по \(1\)-ребру. Ваша задача — посчитать количество корректных пар в дереве. Выходные данные Выведите одно целое число — количество корректных пар вершин. Примечание Картинка, соответствующая первому тестовому примеру: 
| |
|
|
E. Специальные подотрезки перестановки
разделяй и властвуй
снм
Структуры данных
*2200
Вам дана перестановка \(p\) состоящая из \(n\) чисел \(1\), \(2\), ..., \(n\) (перестановка — это массив, в котором каждый элемент от \(1\) до \(n\) встречается ровно один раз). Назовем подотрезок этой перестановки \(p[l, r]\) специальным, если \(p_l + p_r = \max \limits_{i = l}^{r} p_i\). Вам нужно посчитать количество специальных подотрезков заданной перестановки. Выходные данные Выведите количество специальных подотрезков заданной перестановки. Примечание В первом тестовом примере два специальных подотрезка — \([1, 5]\) и \([1, 3]\). Во втором тестовом примере только один специальный подотрезок — \([1, 3]\).
| |
|
|
F. Служба доставки Вики
графы
снм
Структуры данных
хэши
*2400
В одной волшебной стране ровно \(n\) городов, пронумерованных \(1, 2, \dots, n\). Некоторые пары городов соединены волшебными цветными дорогами. Волшебство непостоянно, поэтому иногда между городами возникают новые дороги. Работа ведьмы Вики — доставлять посылки из одних городов в другие. Вики — новичок, поэтому она может выполнить доставку, только если существует двойной радужный путь из начального города в конечный. Двойным радужным путем называется последовательность городов \(c_1, c_2, \dots, c_k\), удовлетворяющая следующим свойствам: - Для каждого \(i\), где \(1 \le i \le k - 1\), города \(c_i\) и \(c_{i + 1}\) соединены дорогой.
- Для каждого \(i\), где \(1 \le i \le \frac{k - 1}{2}\), дороги, соединяющие \(c_{2i}\) с городами \(c_{2i - 1}\) и \(c_{2i + 1}\), должны иметь один и тот же цвет.
Например, если \(k = 5\), то дорога между городами \(c_1\) и \(c_2\) должна быть того же цвета, что и дорога между \(c_2\) и \(c_3\), а дорога между \(c_3\) и \(c_4\) должна иметь тот же цвет, что и дорога между \(c_4\) и \(c_5\). У Вики есть список событий в хронологическом порядке. Каждое событие — это либо доставка, которую она должна выполнить, либо появление новой дороги. Помогите ей определить, какие доставки она сможет выполнить. Выходные данные Для каждого события сторого типа выведите одну строку, содержащую «Yes» (без кавычек), если доставку можно осуществить, и «No» (без кавычек) иначе. Примечание Пример соответствует рисунку. Для первой доставки Вики может использовать путь 1, 2, 3, 4, который является двойным радужным. Вторую доставку нельзя осуществить, так как лучшее, что может сделать Вики — добраться до города \(3\). После добавления новой дороги между городами \(1\) и \(3\), Вики может добраться из города \(4\) в город \(1\) по двойному радужному пути 4, 3, 1.
| |
|
|
C. Распространение новостей
графы
поиск в глубину и подобное
снм
*1400
В некоторой социальной сети зарегистрированы \(n\) пользователей. Они общаются между собой в \(m\) группах. Давайте рассмотрим процесс распространения новостей между пользователями. Изначально какой-нибудь пользователь \(x\) узнает новость из какого-то внешнего источника. Затем этот пользователь отправляет новость всем своим друзьям (два пользователя считаются друзьями, если они оба принадлежат к какой-нибудь группе). Друзья продолжают отправлять новость своим друзьям, и так далее. Процесс заканчивается, когда не останется ни одной пары друзей, в которой один пользователь знает новость, а другой — нет. Для каждого пользователя \(x\) определите, сколько пользователей в конечном итоге узнает новость, если \(x\) начнет ее распространять. Выходные данные Выведите \(n\) целых чисел. \(i\)-е из них должно быть равно количеству пользователей, которые узнают новость, если пользователь \(i\) начнет ее распространять.
| |
|
|
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\)), но три так же подойдут.
| |
|
|
E3. Вторжение Далеков (сложная)
графы
Деревья
снм
Структуры данных
*2400
С вашей помощью Хайди подготовила план размещения ловушки и защиты. Однако внезапно из ТАРДИС выпрыгнул Доктор и сказал ей, что он шпионил за подготовкой Далеков, и что их больше, чем когда-либо. Отчаянные времена требует отчаянных мер, поэтому Хайди собирается рискнуть и встретится с Далеками и что она рассмотрит вариант размещения ловушки вдоль любого Коридора. Это означает что ей опять нужна ваша помощь с вычислением \(E_{max}(c)\) — наибольшего \(e \le 10^9\), такого что если мы сменим требуемый уровень энергии у \(c\) на \(e\), то Далеки возможно воспользуются \(c\) в своём вторжении. Теперь нужно вычислить эту функцию для всех Временных Коридоров. Выходные данные Выведите \(m\) целых чисел: для каждого \(i\), \(E_{max}(c_i)\) для Коридора \(c_i\) из входных данных.
| |
|
|
D. Корова и вечеринка
графы
поиск в глубину и подобное
снм
*1700
Легендарный фермер Джон готовит большую вечеринку. В гости были приглашены животные со всего мира. Сейчас гости проголодались, так что Джон попросил свою корову Бесси достать чего-нибудь перекусить. Есть \(n\) разных видов закусок, пронумерованных числами \(1, 2, \ldots, n\). У Бесси есть \(n\) закусок, по одной закуске каждого вида. У каждого гостя есть ровно два любимых вида закусок. Процесс перекуса будет происходить следующим образом: - Сначала Бесси упорядочит всех гостей в каком-то порядке.
- Затем, в этом порядке гости будут по одному подходить к закускам.
- Каждый гость будет в свой ход съедать все оставшиеся закуски любимых типов. В случае, если не осталось ни одной закуски любимых типов, то гость уйдёт очень грустным.
Помогите Бесси минимизировать число грустных гостей, упорядочив гостей правильным образом. Выходные данные Выведите одно целое число — минимальное возможное количество грустных гостей. Примечание В первом примере Бесси может упорядочить гостей следующим образом: \(3, 1, 2, 4\). Гость \(3\) пойдёт первым и съест закуски \(1\) и \(4\). Затем идёт гость \(1\) и съедает закуску \(2\), так как закуска \(1\) уже съедена. Затем приходит гость \(2\) и съедает только закуску \(3\). Так как все закуски уже съедены, то гость \(4\) будет грустным. Во втором примере можно упорядочить гостей как \(2, 1, 3, 5, 4\). Тогда все гости будут удовлетворены.
| |
|
|
G1. На блоки (упрощенная версия)
жадные алгоритмы
реализация
снм
Структуры данных
*2000
Это более простая версия следующей задачи. В данной версии \(q = 0\). Последовательность чисел называется хорошей, если элементы разбиты на блоки как в \([3, 3, 3, 4, 1, 1]\). Формально, если два элемента равны, то все элементы между ними должны быть тоже равны тому же значению. Определим сложность последовательности как минимальное число элементов, которое нужно поменять, чтобы получить хорошую последовательность. Однако, если вы заменяете хотя бы один \(x\) на какое-то значение \(y\), нужно заменить все остальные значения \(x\) на \(y\) тоже. Например, для \([3, 3, 1, 3, 2, 1, 2]\) не разрешается поменять первую \(1\) на \(3\), а вторую \(1\) на \(2\). Вы можете или не заменять \(1\) совсем, или заменить их все на что-то одно. Вам дана последовательность целых чисел \(a_1, a_2, \ldots, a_n\) и \(q\) изменений. Каждое изменение имеет вид «\(i\) \(x\)» — заменить \(a_i\) на \(x\). Выведите сложность изначальной последовательности и последовательности после каждого изменения. Обратите внимание, что изменения не независимы (изменение сохраняется на будущее). Выходные данные Выведите \(q+1\) целое число — ответ для изначальной последовательности и ответ после каждого изменения.
| |
|
|
F. Нестабильная сортировка строки
графы
жадные алгоритмы
поиск в глубину и подобное
реализация
снм
Строки
Структуры данных
*2100
Авторы загадали строку \(s\), состоящую из \(n\) строчных букв латинского алфавита. Вам задано две перестановки ее индексов (не обязательно одинаковых) \(p\) и \(q\) (обе длины \(n\)). Напомним, что перестановкой называется массив длины \(n\), содержащий каждое целое число от \(1\) до \(n\) ровно один раз. Для всех \(i\) от \(1\) до \(n-1\) выполняются следующие свойства: \(s[p_i] \le s[p_{i + 1}]\) и \(s[q_i] \le s[q_{i + 1}]\). Это значит, что если вы выпишете все символы \(s\) в порядке индексов в перестановке, результирующая строка получится отсортированной в неубывающем порядке. Ваша задача — восстановить любую строку \(s\) длины \(n\), состоящую хотя бы из \(k\) различных строчных букв латинского алфавита, которая подходит к заданным перестановкам. Если существует несколько возможных ответов, вы можете вывести любой. Выходные данные Если невозможно найти подходящую строку, выведите «NO» в первой строке. Иначе выведите «YES» в первой строке и строку \(s\) во второй строке. Она должна состоять ровно из \(n\) строчных букв латинского алфавита, содержать хотя бы \(k\) различных символов и подходить заданным перестановкам. Если существует несколько возможных ответов, вы можете вывести любой.
| |
|
|
G. Запросы на пути
графы
Деревья
разделяй и властвуй
снм
сортировки
*1800
Вам задано взвешенное дерево, состоящее из \(n\) вершин. Напомним, что деревом называется связный граф без циклов. Вершины \(u_i\) и \(v_i\) соединены ребром веса \(w_i\). Вам задано \(m\) запросов. \(i\)-й запрос задан целым числом \(q_i\). В этом запросе вам необходимо посчитать количество пар вершин \((u, v)\) (\(u < v\)) таких, что максимальный вес ребра на простом пути между \(u\) и \(v\) не превосходит \(q_i\). Выходные данные Выведите \(m\) целых чисел — ответы на запросы. \(i\)-е число должно равняться количеству пар вершин \((u, v)\) (\(u < v\)) таких, что максимальный вес ребра на простом пути между \(u\) и \(v\) не превосходит \(q_i\). Запросы пронумерованы от \(1\) до \(m\) в порядке входных данных. Примечание Картинка, соответствующая дереву из первого тестового примера: 
| |
|
|
F. Задача с обязательными онлайн-запросами
графы
Деревья
разделяй и властвуй
снм
Структуры данных
*2600
Дан неориентированный граф из \(n\) вершин и без ребер. Вершины пронумерованы от \(1\) до \(n\). Необходимо ответить на запросы к нему. Пусть \(last\) будет ответом на предыдущий запрос второго типа (или \(0\), если таких запросов еще не было). Тогда запросы следующие: - \(1~x~y\) (\(1 \le x, y \le n\), \(x \ne y\)) — добавить неориентированное ребро между вершинами \((x + last - 1)~mod~n + 1\) и \((y + last - 1)~mod~n + 1\), если такого в графе нет, а иначе удалить его;
- \(2~x~y\) (\(1 \le x, y \le n\), \(x \ne y\)) — проверить, что существует путь между вершинами \((x + last - 1)~mod~n + 1\) и \((y + last - 1)~mod~n + 1\), который проходит только через существующие ребра, и выставить \(last\) значение \(1\), если есть, и \(0\) иначе.
Удачи! Выходные данные Выведите строку, состоящую из символов '0' и '1'. \(i\)-й символ должен быть равен ответу на \(i\)-й запрос второго типа. Таким образом, длина строки должна быть равна количеству запросов второго типа. Примечание Преобразованные запросы из первого примера: - 1 1 2
- 1 1 3
- 2 3 2
- 1 3 5
- 2 4 5
- 1 2 4
- 2 3 4
- 1 2 4
- 2 5 4
Преобразованные запросы из второго примера: - 1 1 2
- 1 2 3
- 1 3 1
- 2 1 3
- 1 1 3
- 2 3 1
- 1 2 3
- 2 2 3
- 2 1 2
| |
|
|
E. Туризм
графы
Деревья
дп
жадные алгоритмы
поиск в глубину и подобное
снм
*2200
Лёша решил отправиться в туристическую поездку по стране. Для простоты стоит считать, что в стране есть \(n\) городов и \(m\) двусторонних дороги, которые их соединяют. Лёша живёт в городе \(s\) и изначально находится в нём. Каждый город в стране по своему хорош, и чтобы сравнивать города между собой, Лёша поставил каждому городу оценку \(w_i\), которая тем больше, чем интереснее город кажется Лёше. Лёша считает, что его поездка по стране будет интересной только в том случае, если ему ни в какой момент времени не придётся ехать назад по дороге, по которой он только что проехал. Другими словами, если Лёша переехал из города \(u\) в город \(v\), следующим в своей поездке Лёша может выбрать любой город, соединённый с \(v\) дорогой, кроме города \(u\). Помогите Лёше спланировать поездку так, чтобы сумма оценок по всем посещённым им городам была максимальна. Считайте, что оценка любого посещённого города учитывается в сумме только один раз, даже если город был посещён не единожды. Выходные данные Выведите одно целое число — максимальную сумму оценок посещённых городов, которую можно получить.
| |
|
|
E. Алиса и нечестная игра
Бинарный поиск
дп
снм
Структуры данных
*2500
Алиса играет в игру со своей хорошей подругой, Марисой. В линию располагается \(n\) коробок, пронумерованных слева направо целыми числами от \(1\) до \(n\). Мариса спрячет куклу в одной из коробок. Затем у Алисы будет \(m\) шансов угадать где находится кукла. Если Алиса хотя бы раз верно угадает номер коробки, в которой сейчас находится кукла, то она победит, иначе победит ее подруга. Для того, чтобы победить, Мариса будет использовать некоторые нечестные трюки. После каждого раза, когда Алиса пыталась угадать коробку, она может переместить куклу в соседнюю коробку или оставить на месте. Коробки с номерами \(i\) и \(i + 1\) являются соседними, для всех \(1 \leq i \leq n - 1\). Перед тем как игра начнется, она также может сделать этот трюк один раз. Таким образом, игра происходит следующим образом: игра начинается, Мариса делает трюк, Алиса делает первое предположение, Мариса делает трюк, Алиса делает второе предположение, Мариса делает трюк, \(\ldots\), Алиса делает \(m\)-е предположение, Мариса делает трюк, игра заканчивается. Алиса придумала некоторую последовательность \(a_1, a_2, \ldots, a_m\). В \(i\)-м вопросе, она спросит, находится ли кукла в коробке с номером \(a_i\). Она хочет узнать сколько существует различных сценариев \((x, y)\) (для всех \(1 \leq x, y \leq n\)), таких что Мариса сможет выиграть в игре, если она положит куклу в коробку с номером \(x\) в начале игры и после того, как игра закончится, кукла будет в коробке с номером \(y\). Помогите ей и посчитайте это число. Выходные данные Выведите количество сценариев в единственной строке, а именно количество пар коробок \((x, y)\) (\(1 \leq x, y \leq n\)), таких что если Мариса положит куклу в коробку \(x\), то она сможет делать трюки так, что в конце игры кукла будет в коробке \(y\) и она не проиграет игру. Примечание В первом тесте, возможные сценарии это \((1, 1)\), \((1, 2)\), \((2, 1)\), \((2, 2)\), \((2, 3)\), \((3, 2)\), \((3, 3)\). Возьмем \((2, 2)\) в качестве примера. Коробки, в которых находится кукла во время игры могут быть \(2 \to 3 \to 3 \to 3 \to 2\).
| |
|
|
B. 0-1 MST
графы
поиск в глубину и подобное
снм
сортировки
*1900
Уджан накопил много ненужного хлама в своих ящиках, значительная часть которого является тетрадями с записями по математике: настало время их разобрать. Сейчас он нашёл старую запылившуюся тетрадь по теории графов с описанием одного графа. Это неориентированный взвешенный граф с \(n\) вершинами. К тому же, это полный граф: каждая пара вершин соединена ребром. Вес каждого ребра равен либо \(0\), либо \(1\); к тому же, ровно \(m\) рёбер имеют вес \(1\), а все остальные рёбра имеют вес \(0\). Так как Уджан не очень сильно желает разбирать свои записи, он решил найти вес минимального остовного дерева данного графа. (Вес остовного дерева графа равняется сумме весов всех его рёбер.) Можете ли вы найти ответ за Уджана, чтобы он прекратил валять дурака? Выходные данные Выведите одно целое число, вес минимального остовного дерева в данном графе. Примечание Граф из первого примера показан на картинке ниже. Пунктирные рёбра имеют вес \(0\), все остальные рёбра имеют вес \(1\). Одно из возможных остовных деревьев покрашено в оранжевый цвет и имеет общий вес \(2\). Во втором примере, вес каждого ребра \(0\), поэтому вес любого остовного дерева равен \(0\).
| |
|
|
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 иен.
| |
|
|
B1. Обмен книгами (простая версия)
математика
снм
*1000
Единственное отличие между простой и сложной версиями — ограничения. Есть \(n\) детей, каждый из которых читает уникальную книгу. В конце каждого дня \(i\)-й ребёнок отдаёт свою книгу \(p_i\)-му ребёнку (в случае, когда \(i = p_i\) ребенок отдает свою книгу самому себе). Гарантируется, что все значения \(p_i\) — различные целые числа от \(1\) до \(n\) (то есть \(p\) — перестановка). Последовательность \(p\) не меняется изо дня в день, она фиксированная. Например, если \(n=6\) и \(p=[4, 6, 1, 3, 5, 2]\), то в конце первого дня книга \(1\)-го ребёнка будет у \(4\)-го ребёнка, книга \(2\)-го ребёнка будет у \(6\)-го ребёнка и так далее. В конце второго дня книга \(1\)-го ребёнка будет у \(3\)-го ребёнка, книга \(2\)-го ребёнка будет у \(2\)-го ребёнка и так далее. Перед вами стоит задача — для каждого \(i\) от \(1\) до \(n\) определить число дней, через которое книга \(i\)-го ребёнка вернётся обратно к нему в первый раз. Предположим что \(p = [5, 1, 2, 4, 3]\). Книга \(1\)-го ребёнка будет передана следующим детям: - после \(1\)-го дня она будет у \(5\)-го ребёнка,
- после \(2\)-го дня она будет у \(3\)-го ребёнка,
- после \(3\)-го дня она будет у \(2\)-го ребёнка,
- после \(4\)-го дня она будет у \(1\)-го ребёнка.
Таким образом, после четвертого дня книга первого ребёнка вернётся к своему владельцу. Книга четвёртого ребёнка вернётся к нему в первый раз сразу после первого дня. Вы должны ответить на \(q\) независимых запросов. Выходные данные Для каждого запроса выведите ответ на него: \(n\) целых чисел \(a_1, a_2, \dots, a_n\), где \(a_i\) — номер дня, в конце которого книга \(i\)-го ребёнка вернётся к нему в первый раз в этом запросе.
| |
|
|
B2. Обмен книгами (сложная версия)
математика
поиск в глубину и подобное
снм
*1300
Единственное отличие между простой и сложной версиями — ограничения. Есть \(n\) детей, каждый из которых читает уникальную книгу. В конце каждого дня \(i\)-й ребёнок отдаёт свою книгу \(p_i\)-му ребёнку (в случае, когда \(i = p_i\) ребенок отдает свою книгу самому себе). Гарантируется, что все значения \(p_i\) — различные целые числа от \(1\) до \(n\) (то есть \(p\) — перестановка). Последовательность \(p\) не меняется изо дня в день, она фиксированная. Например, если \(n=6\) и \(p=[4, 6, 1, 3, 5, 2]\), то в конце первого дня книга \(1\)-го ребёнка будет у \(4\)-го ребёнка, книга \(2\)-го ребёнка будет у \(6\)-го ребёнка и так далее. В конце второго дня книга \(1\)-го ребёнка будет у \(3\)-го ребёнка, книга \(2\)-го ребёнка будет у \(2\)-го ребёнка и так далее. Перед вами стоит задача — для каждого \(i\) от \(1\) до \(n\) определить число дней, через которое книга \(i\)-го ребёнка вернётся обратно к нему в первый раз. Предположим что \(p = [5, 1, 2, 4, 3]\). Книга \(1\)-го ребёнка будет передана следующим детям: - после \(1\)-го дня она будет у \(5\)-го ребёнка,
- после \(2\)-го дня она будет у \(3\)-го ребёнка,
- после \(3\)-го дня она будет у \(2\)-го ребёнка,
- после \(4\)-го дня она будет у \(1\)-го ребёнка.
Таким образом, после четвертого дня книга первого ребёнка вернётся к своему владельцу. Книга четвёртого ребёнка вернётся к нему в первый раз сразу после первого дня. Вы должны ответить на \(q\) независимых запросов. Выходные данные Для каждого запроса выведите ответ на него: \(n\) целых чисел \(a_1, a_2, \dots, a_n\), где \(a_i\) — номер дня, в конце которого книга \(i\)-го ребёнка вернётся к нему в первый раз в этом запросе.
| |
|
|
D. Гармоничный граф
графы
жадные алгоритмы
Конструктив
поиск в глубину и подобное
снм
сортировки
*1700
Вам дан неориентированный граф из \(n\) вершин и \(m\) ребер. Вершины пронумерованы целыми числами от \(1\) до \(n\). Назовем граф гармоничным если и только если выполняется следующее свойство: - Для каждой такой тройки целых чисел \((l, m, r)\), что \(1 \le l < m < r \le n\), если есть путь из вершины \(l\) в вершину \(r\), тогда существует путь из вершины \(l\) в вершину \(m\).
Иначе говоря, в гармоничном графе, если из вершины \(l\) можно по ребрам дойти до вершины \(r\) (\(l < r\)), тогда также должно быть можно дойти до вершин \((l+1), (l+2), \ldots, (r-1)\). Какое минимальное число ребер надо добавить в граф, чтобы он стал гармоничным? Выходные данные Выведите минимальное количество ребер которое нужно добавить в граф, чтобы он стал гармоничным. Примечание В первом примере граф не гармоничный (например, при \(1 < 6 < 7\), из вершины \(1\) можно достичь вершину \(7\) по пути \(1 \rightarrow 2 \rightarrow 7\), но из вершины \(1\) нельзя достичь вершину \(6\)). Однако добавление ребра \((2, 4)\) достаточно, чтобы сделать его гармоничным. Во втором примере граф уже гармоничный.
| |
|
|
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. Отправьте дерево Чарли
Деревья
Комбинаторика
поиск в глубину и подобное
снм
*3300
Рождество постучало в дверь, и наш главный герой, Боб, готовил захватывающий подарок для своего давнего второго лучшего друга Чарли. Поскольку ему не нравится шоколад, он решил вместо этого украсить дерево. Дерево Боба можно представить в виде неориентированного связного графа с \(n\) вершинами (пронумерованными от \(1\) до \(n\)) и \(n-1\) ребрами. Первоначально Боб поместил украшение с номером \(i\) на вершину \(i\) для каждого \(1 \le i \le n\). Однако, поскольку такая простая композиция получилась некрасивой, он решил немного переместить украшения. Формально Боб сделал следующие шаги: - Сначала он выписал все \(n-1\) ребра в некотором порядке.
- Затем он рассмотрел все ребра один за другим в таком порядке. Для каждого ребра \((u, v)\) он поменял местами украшение вершины \(u\) с украшением вершины \(v\).
После этого Боб оказался довольным такой аранжировкой и пошел спать. На следующее утро Боб просыпается, только чтобы узнать, что его прекрасная аранжировка разрушена! Прошлой ночью младший брат Боба, Бобо, бросил некоторые украшения на пол, когда играл с деревом. К счастью, украшения не были потеряны, поэтому Боб может восстановить дерево в кратчайшие сроки. Однако он полностью забыл, как дерево выглядело вчера. Поэтому, учитывая номера украшений, которые все еще на дереве, Боб хочет узнать количество возможных конфигураций дерева. Поскольку результат может быть довольно большим, Боб будет рад, если вы сможете вывести результат по модулю \(1000000007\) (\(10^9+7\)). Обратите внимание, что, возможно, не существует никаких возможных конфигураций. Выходные данные Выведите количество конфигураций по модулю \(1000000007\) (\(10^9+7\)). Примечание В первом примере возможными конфигурациями дерева являются \([2, 4, 1, 3]\) и \([3, 4, 2, 1]\). Во втором примере обратите внимание, что есть \(4! = 24\) возможных перестановок ребер, но возможны только \(12\) различные финальные конфигурации. В третьем примере легко увидеть, что украшение с номером \(1\) не может оставаться в вершине \(1\) после перестановок.
| |
|
|
D. Секретные пароли
графы
поиск в глубину и подобное
снм
*1500
Один малоизвестный хакер захотел заполучить пароль администратора от тестирующей системы AtForces, чтобы узнать задачи с предстоящего контеста. Чтобы достичь этого, он пробрался в кабинет администратора и украл листочек, на котором записан список из \(n\) паролей — строк, состоящих из строчных букв латинского алфавита. Хакер вернулся домой и начал готовиться ко взлому. Он обнаружил, что в системе содержатся только пароли с украденного листочка, и что система определяет эквивалентность паролей \(a\) и \(b\) следующим образом: - два пароля \(a\) и \(b\) эквивалентны, если существует символ, который есть и в \(a\), и в \(b\);
- два пароля \(a\) и \(b\) эквивалентны, если существует другой пароль \(c\) из списка, которому эквивалентны одновременно и \(a\), и \(b\).
Если в системе установлен некоторый пароль, а применяется ему эквивалентный, то пользователь получает доступ к системе. К примеру, если в списке содержатся пароли «a», «b», «ab», «d», то с точки зрения системы пароли «a», «b», «ab» эквивалентны друг другу, а пароль «d» никакому другому не эквивалентен. Иначе говоря, если: - установленный пароль равен, например, «b», то можно зайти в систему под любым из трёх паролей: «a», «b», «ab»;
- установленный пароль равен «d», то можно зайти в систему только под паролем «d».
Известно, что ровно один пароль из списка является паролем администратора от тестирующей системы. Помогите хакеру понять, какое минимальное количество паролей понадобится использовать при взломе, чтобы гарантированно получить доступ к системе. Имейте в виду, что хакер не знает, какой именно пароль установлен в системе. Выходные данные В единственной строке выведите минимальное количество паролей, использование которых позволит гарантированно получить доступ к системе. Примечание Во втором примере необходимо использовать любой из паролей, чтобы получить доступ к системе.
| |
|
|
D. Дерево отрезков
графы
Деревья
снм
Структуры данных
*2100
Как видно из названия задачи, вам предстоит решить задачу про отрезки и деревья. Напомним, что деревом является связный неориентированным граф, такой что между каждой парой его вершин существует ровно один простой путь. Вам дано \(n\) отрезков \([l_1, r_1], [l_2, r_2], \dots, [l_n, r_n]\), \(l_i < r_i\) для всех \(i\). Гарантируется, что концы отрезков являются целыми числами, все концы являются уникальными — нет такой пары отрезков, которые начинались бы в одной и той же точке, заканчивались в одной и той же точке, или один бы начинался в такой точке, что другой в ней заканчивается. Давайте построим граф с \(n\) вершинами. Вершины \(v\) и \(u\) соединены ребром тогда и только тогда, когда отрезки \([l_v, r_v]\) и \([l_u, r_u]\) пересекаются и ни один из них не лежит полностью внутри другого. Например, пары \(([1, 3], [2, 4])\) и \(([5, 10], [3, 7])\) будут образовывать ребра, а пары \(([1, 2], [3, 4])\) и \(([5, 7], [3, 10])\) не будут. Определите, является ли полученный граф деревом или нет. Выходные данные Выведите «YES», если полученный граф является деревом и «NO» в противном случае. Примечание Граф полученный в первом примере: 
Граф полученный во втором примере: 
Граф полученный в третьем примере: 
| |
|
|
C. Освещение префиксов
графы
поиск в глубину и подобное
снм
*2400
В линию было расположено \(n\) ламп, пронумерованных целыми числами от \(1\) до \(n\). Каждая лампа изначально либо выключена (\(0\)) или включена (\(1\)). Вам дано \(k\) подмножеств \(A_1, \ldots, A_k\) множества ламп \(\{1, 2, \dots, n\}\), таких что пересечение любых трех подмножеств пусто. Другими словами, для всех \(1 \le i_1 < i_2 < i_3 \le k\) выполнено \(A_{i_1} \cap A_{i_2} \cap A_{i_3} = \varnothing\). За одну операцию вы можете выбрать одно из этих \(k\) подмножеств и изменить состояние всех ламп из этого подмножества (выключенные лампы становятся включенными, включенные становятся выключенными). Гарантируется, что для данных подмножеств можно совершить несколько операций так, чтобы все лампы стали включенными. Обозначим за \(m_i\) минимальное количество операций, которое вы должны совершить, чтобы первые \(i\) ламп оказались включенными. Обратите внимание, что при этом состояние других ламп (с номерами между \(i+1\) и \(n\)) может быть любым. Посчитайте \(m_i\) для всех \(1 \le i \le n\). Выходные данные Вы должны вывести \(n\) строк. В \(i\)-й строке должно содержаться единственное целое число \(m_i\) — минимальное количество операций, необходимое для того чтобы сделать все лампы с номерами от \(1\) до \(i\) включенными. Примечание В первом тесте: - Для \(i = 1\), мы можем сделать одну операцию с множеством \(A_1\), итоговые состояния будут \(1010110\);
- Для \(i = 2\), мы можем сделать операции с множествами \(A_1\) и \(A_3\), итоговые состояния будут \(1100110\);
- For \(i \ge 3\), we can apply operations on \(A_1\), \(A_2\) and \(A_3\), the final states will be \(1111111\).
Во втором тесте: - Для \(i \le 6\), мы можем просто сделать одну операцию с множеством \(A_2\), итоговые состояния будут \(11111101\);
- Для \(i \ge 7\), мы можем сделать операции с множествами \(A_1, A_3, A_4, A_6\), итоговые состояния будут \(11111111\).
| |
|
|
A. Игровой лабиринт Неко
реализация
снм
Структуры данных
*1400
NEKO#ΦωΦ только что купила новую игру на свой компьютер! Главный пазл этой игры это прямоугольный лабиринт \(2 \times n\). Неко должна провести Некомими девочку из клетки \((1, 1)\) в клетку \((2, n)\), тем самым выбравшись из лабиринта. Девочка может переходить только между клетками, соседними по стороне. Однако, в некоторые моменты игры, некоторые клетки меняют своё состояние: или из земли в лаву (которая не позволяет проходить через клетку), или наоборот (что делает клетку проходимой вновь). Изначально ни в одной клетке лавы нет. Спустя часы стриминга Неко выяснила, что есть всего \(q\) таких моментов, причём \(i\)-й из них переключает состояние клетки \((r_i, c_i)\) (с земли на лаву, или наоборот). Неко хочет узнать для каждого момента из этих \(q\), можно ли после него пройти из клетки \((1, 1)\) в \((2, n)\) не проходя через клетки с лавой. Неко великий игрок и стример, но она всё ещё не справляется с пазлами и задачками, требующими большой силы мозга. Не могли бы вы ей помочь? Выходные данные Для каждого момента выведите «Yes» или «No» в зависимости от того, можно ли пройти от клетки \((1, 1)\) до \((2, n)\). Всего вам нужно вывести ровно \(q\) ответов, по одному после каждого изменения. Каждое слово можно выводить в любом регистре (нижнем, верхнем или смешанном). Примечание Разберём пример из условия: - После первого запроса девочка всё ещё может достичь цели, один из возможных путей выглядит как \((1,1) \to (1,2) \to (1,3) \to (1,4) \to (1,5) \to (2,5)\).
- После второго запроса, добраться до цели невозможно, самая дальняя клетка, которой она может достичь, это \((1, 3)\).
- После четвёртого запроса, клетка \((2, 3)\) уже не заблокирована, однако теперь заблокирован весь \(4\)-й столбец, так что достичь цели не получится.
- После пятого запроса, проблемы со столбцом пропадают, так что она снова может добраться до цели.
| |
|
|
E. Лунки
снм
Структуры данных
*2700
Маленький Петя очень любит играть. Больше всего он любит играть в игру «Лунки». Это игра для одного игрока со следующими правилами: Есть N лунок, расположенных в ряд, пронумерованных слева направо числами от 1 до N. У каждой лунки изначально установлена своя сила выброса (у лунки с номером i она равна ai). Если вбросить шарик в лунку i, то он тут же вылетит из нее и попадет в лунку i + ai, после чего он опять вылетит и т.д.. Если же лунки с таким номером нету, то он просто вылетит за край ряда. На каждом из M ходов игрок выбирает одно из двух действий: - Установить силу выброса лунки a равной b.
- Вбросить шарик в лунку a и посчитать количество прыжков шарика, прежде чем он вылетит за край ряда, а так же записать номер лунки, после выпрыгивания из которой шарик вылетел за край.
У Пети есть некоторые проблемы с математикой, поэтому, как Вы уже догадались, именно Вам предстоит произвести все подсчеты. Выходные данные Для каждого хода второго типа (задающего вбрасывание шарика) в порядке следования во входном файле выведите два числа через пробел в отдельной строке — номер последней лунки перед вылетом шарика за край и количество прыжков.
| |
|
|
F. Количество компонент
реализация
снм
*2800
У вас есть матрица размера \(n \times m\), изначально заполненная нулями. Элемент в \(i\)-й строке и \(j\)-м столбце обозначим как \(a_{i, j}\). Две ячейки матрицы являются связанными, если они имеют общую сторону, и элементы в этих ячейках равны. Две ячейки матрицы принадлежат одной и той же компоненте связности, если существует последовательность \(s_1\), \(s_2\), ..., \(s_k\) такая, что \(s_1\) — первая ячейка, \(s_k\) — вторая ячейка, и для каждого \(i \in [1, k - 1]\), \(s_i\) и \(s_{i + 1}\) связаны. Вам заданы \(q\) запросов вида \(x_i\) \(y_i\) \(c_i\) (\(i \in [1, q]\)). Для каждого такого запроса вам необходимо сделать следующее: - заменить элемент \(a_{x, y}\) на \(c\);
- посчитать кол-во компонент связности в матрице.
Существует одно дополнительное ограничение: для каждого \(i \in [1, q - 1]\), \(c_i \le c_{i + 1}\). Выходные данные Выведите \(q\) целых чисел, \(i\)-е из них должно быть равно числу компонент связности в матрице после выполнения первых \(i\) запросов.
| |
|
|
G. Курони и Антихайп
битмаски
графы
дп
Перебор
снм
*3500
Курони плохо разбирается в экономике. Поэтому он решил основать новую финансовую пирамиду под названием Антихайп. У него есть следующие правила: - Вы можете присоединиться к пирамиде бесплатно и получить \(0\) монет.
- Если вы уже являетесь участником Антихайпа, вы можете пригласить своего друга, который в настоящее время не является участником Антихайпа, и получить количество монет, равное вашему возрасту (за каждого приглашенного друга).
\(n\) людей недавно услышали об Антихайпе, возраст \(i\)-го человека - \(a_i\). Некоторые из них являются друзьями, но дружба сегодня — странная вещь: \(i\)-й человек является другом \(j\)-го человека тогда и только тогда, когда \(a_i \text{ AND } a_j = 0\), где \(\text{AND}\) обозначает операцию побитового И. На данный момент никто из \(n\) людей не является членом Антихайпа. Они хотят сотрудничать, чтобы присоединяться и приглашать друг друга в Антихайп таким образом, чтобы максимизировать их суммарную прибыль. Не могли бы вы помочь им? Выходные данные Выведите одно целое число — максимальную возможную суммарную прибыль всех \(n\) людей. Примечание Только первый и второй человек дружат. Второй может присоединиться к Антихайпу и пригласить первого, получив за это \(2\) монеты.
| |
|
|
F. Корова и отпуск
Деревья
поиск в глубину и подобное
снм
*3300
Бесси планирует отпуск! Кор-лифония состоит из \(n\) городов, соединенных \(n-1\) двусторонними дорогами. Гарантируется, что из любого города можно добраться до любого другого. Бесси рассматривает \(v\) возможных планов проведения отпуска, \(i\)-й план описывается начальным городом \(a_i\) и конечным городом \(b_i\). Известно, что только в \(r\) городах оборудованы специальные стоянки для отдыха. Бесси быстро устает, поэтому не может проехать более чем по \(k\) дорогам подряд, не отдохнув на стоянке. Фактически, отдых для Бесси настолько важен, что она готова ради этого посещать города по несколько раз. Для каждого плана отпуска, существует ли маршрут для Бесси, который позволит ей добраться из начального города в конечный? Выходные данные Если Бесси может достичь конечного города, не проезжая более \(k\) дорог без отдыха подряд, для \(i\)-го плана, выведите YES. Иначе, выведите NO. Примечание Граф из первого примера изображен ниже. Города со стоянками для отдыха отмечены красным. В первом плане, Бесси может посетить следующие города в таком порядке: \(1, 2, 3\). Во втором плане, Бесси может посетить следующие города в таком порядке: \(3, 2, 4, 5\). В третьем плане, Бесси не сможет достигнуть конечного города. Например, если она попытается проехать следующим образом: \(3, 2, 4, 5, 6\), ей придется проехать более \(2\) дорог без отдыха. Граф из второго примера изображен ниже.
| |
|
|
C. K-полное слово
жадные алгоритмы
поиск в глубину и подобное
реализация
снм
Строки
*1500
Слово \(s\) длины \(n\) называется \(k\)-полным, если - \(s\) — палиндром, то есть \(s_i=s_{n+1-i}\) для всех \(1 \le i \le n\);
- \(s\) имеет период \(k\), то есть \(s_i=s_{k+i}\) для всех \(1 \le i \le n-k\).
Например, «abaaba» — это \(3\)-полное слово, а «abccba» нет. Бобу вручили слово \(s\) длины \(n\), состоящее только из строчных букв латинского алфавита, и целое число \(k\) такое, что \(n\) делится на \(k\). Он хочет превратить слово \(s\) в любое \(k\)-полное слово. Для этого Боб может выбирать некоторую позицию \(i\) (\(1 \le i \le n\)) и заменять букву на позиции \(i\) на любую другую строчную букву латинского алфавита. Поэтому теперь Боба интересует минимальное количество позиций, буквы на которых ему необходимо заменить, чтобы превратить \(s\) в любое \(k\)-полное слово. Обратите внимание, что Боб может сделать ноль изменений, если слово \(s\) уже \(k\)-полное. Требуется ответить на \(t\) независимых наборов входных данных. Выходные данные Для каждого набора входных данных выведите одно целое число, обозначающее минимальное количество позиций, буквы на которых ему придется заменить, чтобы превратить \(s\) в любое \(k\)-полное слово. Примечание В первом наборе входных данных одно из оптимальных решений — это «aaaaaa». Во втором наборе входных данных слово уже \(k\)-полное.
| |
|
|
F. Роботы на поле
графы
жадные алгоритмы
матрицы
поиск в глубину и подобное
снм
Структуры данных
*2200
Задано прямоугольное поле размера \(n \times m\). Каждая клетка поля покрашена либо в черный цвет ('0'), либо в белый цвет ('1'). Цвет клетки \((i, j)\) обозначается как \(c_{i, j}\). Вам также задана карта направлений: для каждой клетки указано направление \(s_{i, j}\), которое равно одному из четырех символов 'U', 'R', 'D' и 'L'. - Если \(s_{i, j}\) равно 'U', то из клетки \((i, j)\) есть переход в клетку \((i - 1, j)\);
- если \(s_{i, j}\) равно 'R', то из клетки \((i, j)\) есть переход в клетку \((i, j + 1)\);
- если \(s_{i, j}\) равно 'D', то из клетки \((i, j)\) есть переход в клетку \((i + 1, j)\);
- если \(s_{i, j}\) равно 'L', то из клетки \((i, j)\) есть переход в клетку \((i, j - 1)\).
Гарантируется, что самая верхняя строка не содержит символов 'U', самая нижняя строка не содержит символов 'D', самый левый столбец не содержит символов 'L' и самый правый столбец не содержит символов 'R'. Вы хотите поставить роботов на поле (не более одного робота в клетку). При этом следующие условия должны быть соблюдены. - Во-первых, каждый робот всегда обязан перемещаться (то есть он не может пропустить ход). За один ход каждый робот перемещается в соседнюю клетку в соответствии с текущим направлением.
- Во-вторых, вам необходимо поставить роботов таким образом, что не найдется такого хода, перед которым два различных робота стоят в одной и той же клетке (это также значит, что вы не можете поставить двух роботов в одну и ту же клетку). Таким образом, Если поле равно «RL» (одна строка, два столбца, цвета здесь не важны), то вы можете поставить двух роботов в клетки \((1, 1)\) и \((1, 2)\), но если поле равно «RLL», то вы не можете поставить роботов в клетки \((1, 1)\) и \((1, 3)\), потому что в течение первой секунды оба робота будут стоять в клетке \((1, 2)\).
Роботы делают бесконечное количество ходов. Ваша задача — поставить максимальное количество роботов таким образом, чтобы удовлетворить все условия, описанные выше, а среди всех таких способов вам необходимо выбрать такой, что количество черных клеток, на которых стоят роботы перед началом всех перемещений является максимально возможным. Заметьте, что вы можете ставить роботов только перед началом всех перемещений. Вам необходимо ответить на \(t\) независимых наборов тестовых данных. Выходные данные Для каждого набора тестовых данных выведите два числа — максимальное количество роботов, которое вы можете поставить, чтобы удовлетворить все ограничения, указанные в условии задачи, и максимальное количество черных клеток, в которых находятся роботы перед началом всех перемещений, если количество поставленных роботов максимально. Заметьте, что вы можете ставить роботов только перед началом всех перемещений.
| |
|
|
B. Однополюсные магниты
графы
Конструктив
поиск в глубину и подобное
снм
*2000
Однополюсный магнит — это магнит, у которого ровно один полюс: либо северный, либо южный. Они не существуют в природе, потому что настоящие магниты имеют два полюса, но это задача по программированию, поэтому будем считать, что такие магниты существуют. У вас есть таблица размером \(n\times m\). Изначально вы можете поставить несколько магнитов с северным полюсом и несколько магнитов с южным полюсом в некоторые клетки этой таблицы. Вам разрешено расставлять сколько угодно магнитов, в том числе несколько в одну клетку. Можно выполнять следующую операцию: выбрать один магнит с северным полюсом и один магнит с южным полюсом для активации. Если они находятся в одной строке или в одном столбце, но занимают разные клетки, то магнит с северным полюсом переместится на одну клетку ближе к магниту с южным полюсом. Иначе, если они занимают одинаковые клетки или не находятся в одной строке или в одном столбце, то ничего не произойдет. Обратите внимание, что магниты с южным полюсом неподвижны. Каждая клетка таблицы покрашена в черный или белый цвет. Будем рассматривать расстановки магнитов в таблице, для которых следующие условия будут выполнены. - В каждой строке и каждом столбце таблицы находится хотя бы один магнит с южным полюсом.
- Если клетка таблицы черная, тогда можно переместить какой-нибудь магнит с северным полюсом в эту клетку с помощью некоторой последовательности операций из начального расположения магнитов.
- Если клетка таблицы белая, тогда никакой магнит с северным полюсом невозможно переместить в эту клетку с помощью некоторой последовательности операций из начального расположения магнитов.
Определите, можно ли расположить магниты в таблице так, что все условия будут выполнены. Если это возможно, найдите минимальное количество магнитов с северным полюсом, которое для этого требуется (минимизировать количество магнитов с южным полюсом не нужно). Выходные данные Выведите единственное целое число, которое равно минимальному количеству магнитов с северным полюсом, которое требуется. Если не существует способа расставить магниты, который будет удовлетворять всем условиям, выведите единственное целое число \(-1\). Примечание В первом тесте возможно расположить магниты следующим образом: Во втором тесте можно показать, что не существует необходимых расположений магнитов. На следующей картинке показаны три примера расположений, которые удовлетворяют не всем условиям. Первый пример нарушает правило \(3\), потому что мы можем переместить магнит с северным полюсом вниз на белую клетку. Второй пример нарушает правило \(2\), потому что мы не можем переместить магнит с северным полюсом в левую нижнюю черную клетку никакой последовательностью операций. Третий пример нарушает правило \(1\), потому что нет ни одного магнита с южным полюсом в первом столбце. Следующая картинка показывает пример возможного расположения магнитов в третьем тесте. Можно показать, что не существует необходимых расположений магнитов с меньшим количеством магнитов с северным полюсом. Во четвертом тесте можно показать, что не существует необходимых расположений магнитов. На следующей картинке два примера расположений, которые удовлетворяют не всем условиям. Первый пример нарушает правило \(1\), потому что нет ни одного магнита с южным полюсом в первой строке. Второй пример нарушает правила \(1\) и \(3\), потому что нет ни одного магнита с южным полюсом во второй строке, а кроме того, мы можем переместить магнит с северным полюсом на одну клетку вверх, и он попадет на белую клетку. В пятом тесте мы можем поставить магниты с южным полюсом во все клетки и не использовать ни одного магнита с северным полюсом. Поскольку нет ни одной черной клетки, это будет корректной расстановкой магнитов.
| |
|
|
C. Джонни и ожерелье Меган
Бинарный поиск
битмаски
графы
Конструктив
поиск в глубину и подобное
снм
*2500
У младшей сестры Джонни, Меган, недавно был день рождения. Её брат подарил ей коробочку, подписанную как: «Твое прекрасное ожерелье — сделай сама!». Коробочка содержит много частей ожерелья и магический клей. Каждая часть ожерелья представляет собой цепочку, соединяющую две жемчужины. Цвет каждой из жемчужин может быть представлен целым неотрицательным числом. Магический клей позволяет Меган склеивать две жемчужины (возможно, из одной части ожерелья) в одну. Красота соединения двух жемчужин цветов \(u\) и \(v\) определяется следующим образом: пусть \(2^k\) — максимальная степень двух, делящая \(u \oplus v\) — исключающее или \(u\) и \(v\). Тогда красота соединения равна \(k\). Если \(u = v\), вы можете считать, что красота равна \(20\). Каждая жемчужина может быть склеена с другой максимум один раз. Склеивание двух частей ожерелья объединяет их. Используя клей несколько раз, Меган может наконец получить свое ожерелье, которое является циклом, сделанным из соединенных последовательно частей ожерелья (так, что каждая жемчужина в ожерелье соединена с ровно одной другой жемчужиной). Красота такого ожерелья равна минимальной красоте соединений в нем. Девочка хочет использовать все доступные части ожерелья, чтобы получить ровно одно ожерелье, содержащее все части, с максимальной возможной красотой. Помогите ей! Выходные данные Первая строка должна содержать одно целое число \(b\), обозначающее максимальную возможную красоту ожерелья, собранного из всех данных частей. Следующая строка должна содержать \(2n\) различных целых чисел \(p_i\) \((1 \leq p_i \leq 2n)\) — индексы исходных жемчужин в порядке, в котором они должны быть расположены в ожерелье. Индексы жемчужин, принадлежащих одной части, должны быть расположены на соседних позициях в перестановке (поэтому \(1\,4\,3\,2\) не является корректным выводом, а \(2\,1\,4\,3\) и \(4\,3\,1\,2\) являются). Если существует несколько подходящих ответов, вы можете вывести любой. Примечание В первом примере следующие пары жемчужин объединяются: \((7, 9)\), \((10, 5)\), \((6, 1)\), \((2, 3)\) и \((4, 8)\). Красота соединений равна: \(3\), \(3\), \(3\), \(20\), \(20\), соответственно. Иллюстрация показывает эту конструкцию:
| |
|
|
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)\).
| |
|
|
D. Чет-нечет подпоследовательность
Бинарный поиск
дп
жадные алгоритмы
реализация
снм
*2000
У Ashish есть массив \(a\) размера \(n\). Подпоследовательность массива \(a\) определяется, как последовательность, которая может быть получена из \(a\) с помощью удаления некоторых элементов (возможно нуля) без изменения порядка оставшихся элементов. Рассмотрим подпоследовательность \(s\) массива \(a\). Он определяет цену подпоследовательности \(s\) как минимум между: - Максимумом по всем числам, стоящим на нечетных позициях в \(s\).
- Максимумом по всем числам, стоящим на четных позициях в \(s\).
Обратите внимание, что индекс числа определяется, как его индекс в \(s\), независимо от его индекса в \(a\). Все позиции нумеруются с \(1\). Другими словами, цена \(s\) равна \(min(max(s_1, s_3, s_5, \ldots), max(s_2, s_4, s_6, \ldots))\). Например, цена последовательности \(\{7, 5, 6\}\) равна \(min( max(7, 6), max(5) ) = min(7, 5) = 5\). Помогите ему найти минимальную цену какой-то подпоследовательности размера \(k\). Выходные данные Выведите единственное целое число — минимальную цену подпоследовательности размера \(k\). Примечание В первом тесте, рассмотрим подпоследовательность \(s\) = \(\{1, 3\}\). Здесь цена подпоследовательности равна \(min(max(1), max(3)) = 1\). Во втором тесте, рассмотрим подпоследовательность \(s\) = \(\{1, 2, 4\}\). Здесь цена подпоследовательности равна \(min(max(1, 4), max(2)) = 2\). В четвертом тесте, рассмотрим подпоследовательность \(s\) = \(\{3, 50, 2, 4\}\). Здесь цена подпоследовательности равна \(min(max(3, 2), max(50, 4)) = 3\).
| |
|
|
E. Слияние башен
Деревья
реализация
снм
Структуры данных
*2300
У вас есть \(n\) дисков, радиус \(i\)-го диска равен \(i\). Изначально эти диски распределены по \(m\) башням из дисков: каждая башня содержит хотя бы один диск, и диски в каждой башне отсортированы от большего к меньшему снизу вверх. Вы должны собрать все диски в одну башню. Чтобы сделать это, вы можете выбрать две различных башни \(i\) и \(j\) (каждая из которых содержит хотя бы один диск), взять несколько (возможно, все) верхних дисков с башни \(i\) и поместить их на вершину башни \(j\) в том же самом порядке — при условии, что верхний диск башни \(j\) больше каждого перемещаемого диска. Эту операцию можно применять любое количество раз. Например, если у вас есть две башни, содержащие диски \([6, 4, 2, 1]\) и \([8, 7, 5, 3]\) (в порядке снизу вверх), существуют ровно две возможные операции: - переместить диск \(1\) с первой башни на вторую, после чего башни станут следующими: \([6, 4, 2]\) и \([8, 7, 5, 3, 1]\);
- переместить диски \([2, 1]\) с первой башни на вторую, после чего башни станут следующими: \([6, 4]\) и \([8, 7, 5, 3, 2, 1]\).
Пусть сложность некоторого набора башен — это минимальное количество операций, необходимых для того, чтобы собрать все диски в одну башню. Например, сложность набора башен \([[3, 1], [2]]\) равна \(2\): вы можете переместить диск \(1\) на вторую башню, а потом переместить оба диска со второй башни на первую башню. Вам заданы \(m - 1\) запросов. Каждый запрос обозначается двумя числами \(a_i\) и \(b_i\), обозначающими следующее: «слить башни \(a_i\) и \(b_i\) в одну» (то есть взять все диски из этих башен и составить из них одну башню, в которой диски отсортированы по убыванию размера снизу вверх). Новая башня (являющаяся результатом слияния) получает индекс \(a_i\). Для каждого \(k \in [0, m - 1]\) посчитайте сложность набора башен после выполнения первых \(k\) запросов. Выходные данные Выведите \(m\) целых чисел. \(k\)-е число (в \(0\)-индексации) должно быть равно сложности набора башен после первых \(k\) запросов. Примечание Башни в примере из условия: - до запросов: \([[5, 1], [2], [7, 4, 3], [6]]\);
- после первого запроса: \([[2], [7, 5, 4, 3, 1], [6]]\);
- после второго запроса: \([[7, 5, 4, 3, 2, 1], [6]]\);
- после третьего запроса остается только одна башня: \([7, 6, 5, 4, 3, 2, 1]\).
| |
|
|
A. Трансформация строки 1
графы
Деревья
жадные алгоритмы
снм
сортировки
Строки
*1700
Обратите внимание, что единственная разница между Трансформация строки 1 и Трансформация строки 2 заключается в операции, которую делает Коа. В этой версии буква \(y\), которую выбирает Koa, должна быть строго больше по алфавиту, чем \(x\) (для лучшего понимания прочитайте условие). Вы можете делать взломы по этим задачам независимо. У Коалы Коа есть две строки \(A\) и \(B\) одинаковой длины \(n\) (\(|A|=|B|=n\)), состоящие из первых \(20\) строчных букв английского алфавита (то есть от a до t). В один ход Коа: - выбирает некоторое подмножество позиций \(p_1, p_2, \ldots, p_k\) (\(k \ge 1; 1 \le p_i \le n; p_i \neq p_j\) если \(i \neq j\)) из \(A\), такое что \(A_{p_1} = A_{p_2} = \ldots = A_{p_k} = x\) (т. е. все буквы на этой позиции равны некоторой букве \(x\)).
- выбирает букву \(y\) (из первых \(20\) строчных букв английского алфавита) такую, что \(y>x\) (т. е. буква \(y\) в алфавитном порядке строго больше, чем \(x\)).
- делает все буквы в позициях \(p_1, p_2, \ldots, p_k\) равными \(y\). Более формально: для каждого \(i\) (\(1 \le i \le k\)) Коа устанавливает \(A_{p_i} = y\).
Обратите внимание, что вы можете изменять только буквы в строке \(A\).
Коа хочет знать наименьшее число ходов, которые она должна сделать, чтобы сделать строки равными друг другу (\(A = B\)) или определить, что нет никакого способа сделать их равными. Помогите ей! Выходные данные Для каждого набора входных данных: Выведите в единственной строке минимальное количество ходов, которое Koa должна сделать, чтобы строки стали равны друг другу (\(A = B\)) или \(-1\), если нет никакого способа сделать их равными. Примечание - В \(1\)-м наборе входных данных Коа:
- выбирает позиции \(1\) и \(2\) и устанавливает \(A_1 = A_2 = \) b (\(\color{red}{aa}b \rightarrow \color{blue}{bb}b\)).
- выбирает позиции \(2\) b \(3\) и устанавливает \(A_2 = A_3 = \) c (\(b\color{red}{bb} \rightarrow b\color{blue}{cc}\)).
- Во \(2\)-м наборе входных данных Коа не может сделать строку \(A\) равной строке \(B\).
- В \(3\)-м наборе входных данных Коа:
- выбирает позицию \(1\) и устанавливает \(A_1 = \) t (\(\color{red}{a}bc \rightarrow \color{blue}{t}bc\)).
- выбирает позицию \(2\) и устанавливает \(A_2 = \) s (\(t\color{red}{b}c \rightarrow t\color{blue}{s}c\)).
- выбирает позицию \(3\) и устанавливает \(A_3 = \) r (\(ts\color{red}{c} \rightarrow ts\color{blue}{r}\)).
| |
|
|
G. Перевороты столбцов
2-sat
графы
поиск в глубину и подобное
реализация
снм
*2300
Вам дана таблица \(a\) размера \(2 \times n\) (из двух строк и \(n\) столбцов), состоящая из целых чисел от \(1\) до \(n\). За один ход вы можете выбрать какой-то столбец \(j\) (\(1 \le j \le n\)) и обменять местами значения \(a_{1, j}\) и \(a_{2, j}\). Каждый столбец может быть выбран не более одного раза. Ваша задача — найти минимальное количество ходов, необходимое для того, чтобы получить перестановки размера \(n\) в первой и во второй строках, или же определить, что это сделать невозможно. Вам необходимо ответить на \(t\) независимых наборов тестовых данных. Напомним, что перестановкой размера \(n\) называется такой массив размера \(n\), который содержит каждое целое число от \(1\) до \(n\) ровно один раз (порядок элементов не важен). Выходные данные Выведите ответ на каждый набор тестовых данных: -1, если невозможно получить перестановки размера \(n\) в первой и второй строках таблицы, или же одно целое число \(k\) в первой строке, где \(k\) равно минимальному количеству ходов, необходимому для получения перестановок в обеих строках, а затем \(k\) различных целых чисел \(pos_1, pos_2, \dots, pos_k\) во второй строке (\(1 \le pos_i \le n\)) в любом порядке — индексы столбцов, в которых вам необходимо обменять значения местами для получения перестановок в обеих строках. Если существует несколько ответов, выведите любой.
| |
|
|
C. Джокер
*особая задача
битмаски
разделяй и властвуй
снм
Структуры данных
*2800
Джокер вернулся в Готэм-Сити для осуществления очередного злодейского плана. В Готэм-Сити есть \(N\) перекрёстков (пронумерованных от \(1\) до \(N\)) и \(M\) дорог (пронумерованных от \(1\) до \(M\)). Каждая улица соединяет два различных перекрёстка, и любые два перекрёстка соединены не более одной улицей. Для своего злодейского плана, Джокеру нужно использовать нечётное количество улиц, которые образуют цикл. Формально, для перекрёстка \(S\) и чётного натурального \(k\), должна существовать такая последовательность перекрёстков \(S, s_1, \ldots, s_k, S\), что есть улицы, соединяющие перекрёстки (a) \(S\) и \(s_1\), (b) \(s_k\) и \(S\), и (c) \(s_{i-1}\) и \(s_i\) для каждого \(i = 2, \ldots, k\). Однако, полиция патрулирует улицы Готэм-Сити. Каждый день \(i\), она наблюдает за конкретным подмножеством улиц с последовательными номерами \(j\): \(l_i \leq j \leq r_i\). Эти улицы под наблюдением не могут быть использованы Джокером для своего плана в этот день. К несчастью для полиции, у Джокера есть шпионы среди Отделения Полиции Готэм-Сити; они доносят ему, в какие дни за какими улицами ведётся наблюдение. Теперь Джокер хочет узнать для некоторого количества дней, может ли он провернуть свой план в каждый из этих дней или нет. План может быть осуществлён, если есть цикл с нечётным количеством улиц, которые не находятся под наблюдением в данный день. Выходные данные Выведите \(Q\) строк. \(i\)-я строка (\(1 \leq i \leq Q\)) должна содержать «YES», если Джокер может осуществить план в день \(i\), и «NO» иначе. Система оценки Подзадачи: - (6 баллов) \(1 \leq N, M, Q \leq 200\)
- (8 баллов) \(1 \leq N, M, Q \leq 2\,000\)
- (25 баллов) \(l_i = 1\) для \(i = 1, \ldots, Q\)
- (10 баллов) \(l_i \leq 200\) для \(i = 1, \ldots, Q\)
- (22 баллов) \(Q \leq 2\,000\)
- (29 баллов) Без дополнительных ограничений.
Примечание Граф из данного примера:
| |
|
|
G. Наемники
битмаски
дп
Комбинаторика
математика
Перебор
снм
*2600
Поликарп играет в (очередную) стратегическую компьютерную игру. В этой игре он управляет армией наемников. Поликарп хочет собрать свою армию для выполнения задания. Для найма доступны \(n\) наемников, и армия Поликарпа должна состоять из некоторого подмножества множества доступных наемников. \(i\)-го наемника можно выбрать только в том случае, если итоговое количество выбранных наемников не менее \(l_i\) (иначе этот наемник считает задание слишком опасным) и не более \(r_i\) (он не хочет делить добычу со слишком большим количеством других наемников). Кроме того, \(m\) пар наемников ненавидят друг друга, и из каждой такой пары можно взять на задание не более одного наемника. Сколько непустых подмножеств наемников Поликарп должен рассмотреть? Другими словами, посчитайте количество подмножеств наемников, которые не содержат пар наемников, ненавидящих друг друга, и размер которых принадлежит отрезку \([l_i, r_i]\) для каждого наемника из подмножества. Ответ может быть очень большим, поэтому посчитайте его по модулю \(998244353\). Выходные данные Выведите одно целое число — количество подмножеств, удовлетворяющих условию задачи, взятое по модулю \(998244353\).
| |
|
|
A. Fancy Fence
*особая задача
математика
реализация
снм
сортировки
Структуры данных
*1800
Everybody knows that Balázs has the fanciest fence in the whole town. It's built up from \(N\) fancy sections. The sections are rectangles standing closely next to each other on the ground. The \(i\)th section has integer height \(h_i\) and integer width \(w_i\). We are looking for fancy rectangles on this fancy fence. A rectangle is fancy if: - its sides are either horizontal or vertical and have integer lengths
- the distance between the rectangle and the ground is integer
- the distance between the rectangle and the left side of the first section is integer
- it's lying completely on sections
What is the number of fancy rectangles? This number can be very big, so we are interested in it modulo \(10^9+7\). Output You should print a single integer, the number of fancy rectangles modulo \(10^9+7\). So the output range is \(0,1,2,\ldots, 10^9+6\). Scoring \( \begin{array}{|c|c|c|} \hline \text{Subtask} & \text{Points} & \text{Constraints} \\ \hline 1 & 0 & \text{sample}\\ \hline 2 & 12 & N \leq 50 \: \text{and} \: h_i \leq 50 \: \text{and} \: w_i = 1 \: \text{for all} \: i \\ \hline 3 & 13 & h_i = 1 \: \text{or} \: h_i = 2 \: \text{for all} \: i \\ \hline 4 & 15 & \text{all} \: h_i \: \text{are equal} \\ \hline 5 & 15 & h_i \leq h_{i+1} \: \text{for all} \: i \leq N-1 \\ \hline 6 & 18 & N \leq 1000\\ \hline 7 & 27 & \text{no additional constraints}\\ \hline \end{array} \)Note The fence looks like this:  There are 5 fancy rectangles of shape:  There are 3 fancy rectangles of shape:  There is 1 fancy rectangle of shape:  There are 2 fancy rectangles of shape:  There is 1 fancy rectangle of shape: 
| |
|
|
E. Избегайте разноцветных циклов
графы
Деревья
жадные алгоритмы
снм
сортировки
Структуры данных
*2400
Вам дано \(m\) множеств \(A_1, A_2, \ldots, A_m\), состоящих из целых чисел; элементы этих множеств — целые числа от \(1\) до \(n\) включительно. Есть два массива положительных целых чисел \(a_1, a_2, \ldots, a_m\) и \(b_1, b_2, \ldots, b_n\). За одну операцию вы можете удалить элемент \(j\) из множества \(A_i\) и заплатить за это \(a_i + b_j\) монет. Вы можете сделать несколько (возможно, ноль) операций (после этого некоторые множества могут стать пустыми). После этого вы построите неориентированный граф, где каждое ребро будет иметь цвет. Граф будет иметь \(n\) вершин. Для каждого множества \(A_i\) вы добавите ребро \((x, y)\) цвета \(i\) для всех \(x, y \in A_i\) и \(x < y\). Некоторые пары вершин могут быть соединены больше чем одним ребром, но такие ребра будут иметь разные цвета. Мы называем цикл \(i_1 \to e_1 \to i_2 \to e_2 \to \ldots \to i_k \to e_k \to i_1\) (\(e_j\) это какое-то ребро, соединяющее вершины \(i_j\) и \(i_{j+1}\) этого графа) разноцветным, если цвета всех ребер этого цикла различны. Найдите минимальное количество монет, которое нужно заплатить, чтобы получить граф без разноцветных циклов. Выходные данные Выведите единственное целое число — минимальное количество монет, которое нужно заплатить, чтобы получить граф без разноцветных циклов. Примечание В первом тесте можно сделать следующие операции. - Удалить элемент \(1\) из множества \(1\). Вы должны заплатить \(a_1 + b_1 = 5\) монет за эту операцию.
- Удалить элемент \(1\) из множества \(2\). Вы должны заплатить \(a_2 + b_1 = 6\) монет за эту операцию.
Суммарно вы заплатите \(11\) монет. После этих операций первое и второй множества будут равны \(\{2\}\), а третье множество будет равно \(\{1, 2\}\). Поэтому построенный граф будет содержать одно ребро \((1, 2)\) цвета \(3\). Во втором тесте можно сделать следующие операции. - Удалить элемент \(1\) из множества \(1\). Вы должны заплатить \(a_1 + b_1 = 11\) монет за эту операцию.
- Удалить элемент \(4\) из множества \(2\). Вы должны заплатить \(a_2 + b_4 = 13\) монет за эту операцию.
- Удалить элемент \(7\) из множества \(3\). Вы должны заплатить \(a_3 + b_7 = 13\) монет за эту операцию.
- Удалить элемент \(4\) из множества \(4\). Вы должны заплатить \(a_4 + b_4 = 16\) монет за эту операцию.
- Удалить элемент \(7\) из множества \(6\). Вы должны заплатить \(a_6 + b_7 = 13\) монет за эту операцию.
Суммарно вы заплатите \(66\) монет. После этих операций будут следующие множества: - \(\{2, 3\}\);
- \(\{1\}\);
- \(\{1, 3\}\);
- \(\{3\}\);
- \(\{3, 4, 5, 6, 7\}\);
- \(\{5\}\);
- \(\{8\}\).
Вы построите такой граф: 
В нем нет разноцветных циклов.
| |
|
|
G. Подсчет кластеризаций
бпф
графы
Деревья
дп
Комбинаторика
снм
*2700
В сети компании есть \(n\) компьютеров. Они пронумерованы от \(1\) до \(n\). Для каждой пары компьютеров \(1 \leq i < j \leq n\) вы знаете значение \(a_{i,j}\): сложность отправки сообщения между компьютерами \(i\) и \(j\). Значения \(a_{i,j}\) для \(i<j\) различны. Вы хотите разделить компьютеры на \(k\) множеств \(A_1, A_2, \ldots, A_k\), чтобы следующие условия выполнялись: - для каждого компьютера \(1 \leq i \leq n\) есть ровно одно множество \(A_j\) такое, что \(i \in A_j\);
- для каждых двух пар компьютеров \((s, f)\) и \((x, y)\) (\(s \neq f\), \(x \neq y\)) таких, что \(s\), \(f\), \(x\) из одного множества, а \(x\) и \(y\) из разных, выполняется \(a_{s,f} < a_{x,y}\).
Для каждого \(1 \leq k \leq n\) найдите число способов разделить компьютеры на \(k\) групп так, чтобы все упомянутые условия соблюдались. Эти значения могут быть большими, так что вам нужно найти их по модулю \(998\,244\,353\). Выходные данные Выведите \(n\) целых чисел: \(k\)-е из них должно быть равно числу способов разбить компьютеры на \(k\) групп, соблюдая все описанные условия, по модулю \(998\,244\,353\). Примечание Ниже приведены все возможные разбиения компьютеров на \(4\) группы для второго примера: - \(\{1, 2\}, \{3, 4\}, \{5\}, \{6, 7\}\);
- \(\{1\}, \{2\}, \{3, 4\}, \{5, 6, 7\}\);
- \(\{1, 2\}, \{3\}, \{4\}, \{5, 6, 7\}\).
| |
|
|
E. Большая чистка
графы
дп
Конструктив
снм
*2300
Дед Мороз со Снегурочкой после того, как раздали все подарки и исполнили все желания, вернулись в свою резиденцию и обнаружили, что она вся занесена снегом. Герои очень устали, и решили расчистить лишь дорожки между домиками. В резиденции n домиков, соединенных m дорожками. По дорожкам можно ходить в обоих направлениях. Снегурочка предложила разделить работу: Дед Мороз будет чистить широкие дорожки, а она будет протаптывать узенькие. Для каждой дорожки герои определили, кто ее может чистить: либо Дед Мороз, либо Снегурочка. Для экономии усилий было решено расчистить дорожки так, чтобы выполнялись оба условия: - между любыми двумя домиками должен существовать ровно один простой путь по расчищенным дорожкам;
- Дед Мороз должен расчистить столько же дорожек, сколько и Снегурочка.
И тут герои задумались: какие же дорожки им надо расчистить? Выходные данные Выведите «-1» без кавычек, если невозможно выбрать дорожки, которые будут расчищены по заданным правилам. В противном случае выведите в первую строку количество расчищенных дорожек, а во вторую — номера этих дорожек (дорожки нумеруются с 1 в том порядке, в котором они заданы во входных данных). Номера дорожек разрешается выводить в любом порядке. Каждый номер следует вывести ровно один раз. Числа при выводе разделяйте пробелами. Примечание Путь называется простым, если все домики на пути попарно различны.
| |
|
|
C. Ладейное поле
графы
поиск в глубину и подобное
снм
*1700
Дана шахматная доска размера \(n \times n\). Строки и столбцы доски пронумерованы от \(1\) до \(n\). Клетка \((x, y)\) лежит на пересечении столбца номер \(x\) и строки номер \(y\). Ладья это шахматная фигура, которая за один ход может переместиться на любое количество клеток по вертикали, либо по горизонтали. На доске размещены \(m\) ладей (\(m < n\)), которые не бьют друг друга. То есть, нет пары ладей, стоящих на одной вертикали или горизонтали. За один ход можно сделать ход одной из ладей. То есть, переместить ее на любое количество клеток по вертикали или горизонтали. При этом, после хода ладья снова не должна оказаться под боем других ладей. Какое минимальное количество ходов нужно сделать, чтобы разместить все ладьи на главной диагонали? Главной диагональю называются клетки \((i, i)\), где \(1 \le i \le n\). Выходные данные Для каждого из \(t\) тестовых случаев в новой строке выведите наименьшее количество ходов, которые требуются, чтобы поставить все ладьи на главную диагональ. Можно доказать, что это всегда возможно. Примечание Возможные ходы для первых трех тестовых случаев: - \((2, 3) \to (2, 2)\)
- \((2, 1) \to (2, 3)\), \((1, 2) \to (1, 1)\), \((2, 3) \to (2, 2)\)
- \((2, 3) \to (2, 4)\), \((2, 4) \to (4, 4)\), \((3, 1) \to (3, 3)\), \((1, 2) \to (1, 1)\)
| |
|
|
D. Граф и запросы
графы
Деревья
реализация
снм
Структуры данных
*2600
Вам дан неориентированный граф из \(n\) вершин и \(m\) ребер. Изначально в каждой вершине записано число: в вершине \(i\) записано число \(p_i\) (все \(p_i\) — различные числа от \(1\) до \(n\)). Вы должны обработать \(q\) запросов двух типов: - \(1\) \(v\) — среди всех вершин, достижимых из вершины \(v\) по ребрам (включая саму вершину \(v\)), найти вершину \(u\) с максимальным записанным в ней числом \(p_u\), вывести \(p_u\) и заменить \(p_u\) на \(0\);
- \(2\) \(i\) — удалить \(i\)-е ребро из графа.
Обратите внимание, что в запросе первого типа может возникнуть такая ситуация, что во всех вершинах, достижимых из \(v\), записано число \(0\) — в таком случае вершина \(u\) явно не определена, но так как от выбора конкретной вершины \(u\) ничего не зависит, в ответ на такой запрос можно выбрать любую вершину, достижимую из \(v\), и вывести число, записанное в ней (то есть \(0\)). Выходные данные На каждый запрос первого типа выведите одно целое число — значение \(p_u\), записанное в выбранной в запросе вершине \(u\).
| |
|
|
F. Огненный ливень
Бинарный поиск
графы
поиск в глубину и подобное
реализация
снм
Структуры данных
*2800
На плоскости есть \(n\) отрядов, пронумерованных от \(1\) до \(n\), \(i\)-й отряд находится в точке с целочисленными координатами \((x_i, y_i)\). Все отряды находятся в различных точках. Бримстоун должен посетить каждый отряд как минимум один раз. Вы можете выбрать, с каким отрядом в одной точке изначально находится Бримстоун. Чтобы перейти от одного отряда к другому, Бримстоун выбирает одно из четырех направлений движения (вверх, вниз, вправо или влево) и двигается в этом направлении с постоянной скоростью — один единичный отрезок в секунду — до тех пор, пока не придёт к какому-либо отряду. Как только он приходит к какому-либо отряду, он может повторить этот процесс. Каждые \(t\) секунд происходит огненный ливень, и в эти моменты Бримстоун должен находиться в одной точке с любым своим отрядом. Он может сколько угодно времени стоять на месте в одной точке с любым отрядом. Бримстоун хороший командир, поэтому до начала обхода он может собрать не более одного нового отряда и поставить его в любую точку плоскости с целочисленными координатами, в которой не стоит ни один отряд. Обратите внимание, что он также должен будет посетить новый отряд хотя бы один раз. Помогите Бримстоуну, найдите минимальное целое положительное \(t\) такое, что обход можно произвести, добавив не более одного отряда. Если такого \(t\) не существует, вы должны сообщить об этом. Выходные данные Выведите единственное целое число — минимальное время \(t\), такое что обход всех отрядов можно произвести, добавив не более одного нового отряда. Если ни одного такого \(t\) не существует, выведите \(-1\). Примечание В первом примере из условия можно добавить отряд в точку \((0, 0)\), после чего все отряды можно будет обойти при \(t = 100\). Можно доказать, что при \(t < 100\), даже добавив не более одного нового отряда, не получится сделать обход, поэтому ответ \(100\). Во втором тесте из условия нельзя посетить все отряды ни при каком \(t\), даже при добавлении не более одного нового отряда, поэтому ответ \(-1\). В третьем тесте можно добавить отряд в точку \((1, 0)\), и тогда все отряды можно будет обойти при \(t = 2\). Можно доказать, что это минимальное такое \(t\). В четвертом тесте не нужно добавлять новый отряд и можно обойти все отряды при \(t = 2\). Можно доказать, что это минимальное такое \(t\).
| |
|
|
H. Virus
графы
разделяй и властвуй
снм
Структуры данных
*2500
In Bubbleland a group of special programming forces gets a top secret job to calculate the number of potentially infected people by a new unknown virus. The state has a population of \(n\) people and every day there is new information about new contacts between people. The job of special programming forces is to calculate how many contacts in the last \(k\) days a given person had. The new virus has an incubation period of \(k\) days, and after that time people consider as non-infectious. Because the new virus is an extremely dangerous, government mark as suspicious everybody who had direct or indirect contact in the last \(k\) days, independently of the order of contacts. This virus is very strange, and people can't get durable immunity. You need to help special programming forces to calculate the number of suspicious people for a given person (number of people who had contact with a given person). There are 3 given inputs on beginning \(n\) where \(n\) is population, \(q\) number of queries, \(k\) virus incubation time in days. Each query is one of three types: - (\(x\), \(y\)) person \(x\) and person \(y\) met that day (\(x \neq y\)).
- (\(z\)) return the number of people in contact with \(z\), counting himself.
- The end of the current day moves on to the next day.
Output For the queries of the second type print on a separate line the current number of people in contact with a given person. Note Pay attention if persons \(1\) and \(2\) had contact first day and next day persons \(1\) and \(3\) had contact, for \(k\)>\(1\) number of contacts of person \(3\) is \(3\)(persons:1,2,3).
| |
|
|
E. Выпуклая игра
игры
снм
*3500
Шикамару и Асума любят играть в различные игры, и очень часто они играют в следующую игру. У них есть список возрастающих чисел, и они по очереди делают ходы. Каждый ход — это выбор числа из списка. Пусть в процессе игры последовательно были выбраны числа \(v_{i_1}\), \(v_{i_2}\), \(\ldots\), \(v_{i_k}\). Числа должны удовлетворять следующим правилам: - \(i_{j} < i_{j+1}\), если \(1 \leq j \leq k-1\);
- \(v_{i_{j+1}} - v_{i_j} < v_{i_{j+2}} - v_{i_{j+1}}\), если \(1 \leq j \leq k-2\).
Но поскольку играть в одну игру просто, то сегодня Шикамару и Асума решили сыграть в \(n\) игр одновременно. Они договорились, что ходить они также будут по очереди, причем начинает Шикамару. Делать ход разрешается в любой из игр, где это еще возможно. Проигрывает тот, кто не может сделать ход ни в одной из игр. Необходимо определить, кто выиграет при оптимальной игре обоих игроков. Выходные данные Необходимо вывести «YES», если Шикамару может выиграть при оптимальной игре, и «NO» иначе. Примечание В первом примере Шикамару может сделать ход в последнее число. Тогда Асума не сможет сделать ход из-за первого условия и проиграет. Во втором примере куда бы ни делал ход Шикамару, Асума всегда может сделать такой же ход в другой игре, поэтому Асума выиграет.
| |
|
|
C. Тимбилдинг
графы
поиск в глубину и подобное
снм
Структуры данных
*2500
Начался новый учебный год, и в университет Берляндии пришли \(n\) новых студентов, которых разбили на \(k\) групп, причем некоторые группы могли оказаться пустыми. Среди студентов есть \(m\) пар знакомых, причём знакомые студенты могут быть как из одной, так и из разных групп. Алиcа, как куратор нового набора, позвала всех новоприбывших на организационную встречу. На ней она хочет устроить игру, чтобы еще незнакомые студенты получше узнали друг друга. Для этого она выберет две группы, студенты из которых будут играть. При этом правила игры требуют разделить участников на две команды так, чтобы внутри каждой из команд никто не знал друг друга. Алиcу интересует: сколько существует способов выбрать две различные группы студентов так, чтобы получилось сыграть в игру по всем правилам. При этом в игре должны участвовать все студенты обеих групп. Обратите внимание, что команды, на которые Алиca разделит студентов, не обязаны совпадать с группами, в которых учатся участники. Более того, команды могут быть разного размера (или даже пустыми). Выходные данные Выведите одно число — количество способов выбрать две различные группы так, чтобы получилось сыграть в игру по всем правилам. Примечание Граф знакомств для первого тестового примера выглядит следующим образом (рядом с каждым студентом подписан номер его группы): 
В данном случае нам подходят способы: - Выбрать первую и вторую группу — например, можно отнести студентов номер \(1\) и \(4\) к первой команде, а студентов номер \(2\) и \(3\) ко второй.
- Выбрать вторую и третью группу — можно отнести студентов номер \(3\) и \(6\) к первой команде, а студентов номер \(4\) и \(5\) ко второй.
- Выбрать первую и третью группы мы не можем, потому что не существует разбиения на команды, удовлетворяющего правилам игры.
Во втором тестовом примере мы можем выбрать любую пару групп. Обратите внимание, что несмотря на то, что в третьей группе нет студентов, мы все равно можем ее выбирать.
| |
|
|
E. План лекций
графы
Деревья
Конструктив
поиск в глубину и подобное
реализация
снм
сортировки
*2400
Иван — учитель по программированию. В течение учебного года он планирует прочитать \(n\) лекций на \(n\) различных тем. Каждая тема должна быть использована ровно в одной лекции. Иван хочет выбрать, какую тему он будет объяснять во время \(1\)-й, \(2\)-й, ..., \(n\)-й лекции — формально он хочет выбрать некоторую перестановку целых чисел от \(1\) до \(n\) (назовем эту перестановку \(q\)). \(q_i\) — это номер темы, которую Иван объяснит во время \(i\)-й лекции. Для каждой темы (за исключением ровно одной) существует обязательная предшествующая тема (для \(i\)-й темы предшествующая тема — \(p_i\)). Иван не может читать лекцию по теме, не прочитав лекцию по ее предшествующей теме. Существует по крайней мере один допустимый порядок тем в соответствии с этими предварительными ограничениями. Правильный порядок тем может помочь студентам лучше понять лекции. У Ивана есть \(k\) специальных пар тем \((x_i, y_i)\) таких, что он знает, что студенты лучше поймут \(y_i\)-ю тему, если лекция по ней будет проводиться сразу после лекции по \(x_i\)-й теме. Иван хочет удовлетворить ограничениям на каждую такую пару, то есть для каждого \(i \in [1, k]\) должно существовать некоторое \(j \in [1, n - 1]\) такое, что \(q_j = x_i\) и \(q_{j + 1} = y_i\). Теперь Иван хочет знать, существует ли порядок тем, удовлетворяющий всем этим ограничениям, и если хотя бы один из них существует, найти любой из них. Выходные данные Если не существует порядка тем, удовлетворяющих всем ограничениям, выведите \(0\). В противном случае выведите \(n\) попарно различных целых чисел \(q_1\), \(q_2\), ..., \(q_n\) (\(1 \le q_i \le n\)) — порядок тем, удовлетворяющих всем ограничениям. Если ответов несколько, выведите любой из них.
| |
|
|
F. Кошмар Евклида
битмаски
графы
жадные алгоритмы
математика
поиск в глубину и подобное
снм
сортировки
*2100
Вы должно быть знаете, что Евклид был математиком. Ну, как оказалось, Морфей об этом тоже знал. Поэтому, когда он захотел разыграть Евклида, он послал ему соответствующий кошмар. В своем плохом сне, у Евклида был набор \(S\) из \(n\) \(m\)-мерных векторов над полем \(\mathbb{Z}_2\), и он мог их складывать. Другими словами, у него были вектора с \(m\) координатами, каждая координата равнялась либо \(0\), либо \(1\). Сложение векторов определяется следующим образом: пусть \(u+v = w\), тогда \(w_i = (u_i + v_i) \bmod 2\). Евклид может сложить любое подмножество векторов из \(S\) и сохранить получившийся \(m\)-мерный вектор над \(\mathbb{Z}_2\). В частности, он может сложить пустое подмножество векторов. В таком случае, все координаты получившегося вектора будут равны \(0\). Пусть \(T\) будет множеством всех векторов, которые могут быть получены как сумма некоторого подмножества векторов из \(S\). Теперь Евклид интересуется, каков размер \(T\), и может ли он использовать только какое-то подмножество \(S'\) множества \(S\), чтобы получить все вектора из \(T\). Как всегда и бывает в таких ситуациях, он не проснется до тех пор, пока не выяснит это. Пока что дела для философа обстоят довольно мрачно. Однако, появилась надежда, когда он заметил, что все вектора из \(S\) содержат максимум \(2\) координаты, равные \(1\). Помогите Евклиду вычислить \(|T|\), количество \(m\)-мерных векторов над \(\mathbb{Z}_2\), которые могут быть получены как сумма какого-то подмножества векторов из \(S\). Так как оно может быть довольно велико, выведите его по модулю \(10^9+7\). Также, вы должны найти \(S'\), минимальное такое подмножество \(S\), что все вектора из \(T\) могут быть получены как как сумма какого-то подмножества векторов из \(S'\). В случае, если существует несколько таких подмножеств с минимальным количеством элементов, выведите лексикографически минимальный по индексам взятых элементов. Рассмотрим два множества \(A\) и \(B\), такие что \(|A| = |B|\). Пусть \(a_1, a_2, \dots a_{|A|}\) и \(b_1, b_2, \dots b_{|B|}\) будут возрастающие массивы индексов элементов, взятых в \(A\) и в \(B\), соответственно. \(A\) лексикографически меньше, чем \(B\), если существует такое \(i\), что \(a_j = b_j\) для всех \(j < i\) и \(a_i < b_i\). Выходные данные В первой строке выведите два целых числа: остаток от деления \(|T|\) на \(10^9+7\), и \(|S'|\). Во второй строке выведите \(|S'|\) целых чисел — индексы элементов, входящих в \(S'\), в возрастающем порядке. Элементы \(S\) нумеруются с \(1\) в порядке, в котором они даны во входных данных. Примечание В первом примере нам даны три вектора: Оказывается, что мы может представить все вектора из \(2\)-мерного пространства используя эти вектора: - \(00\), сумма пустого подмножества векторов;
- \(01 = 11 + 10\), сумма первого и третьего векторов;
- \(10 = 10\), просто первый вектор;
- \(11 = 10 + 01\), сумма первого и второго векторов.
Поэтому, \(T = \{00, 01, 10, 11\}\). Мы можем выбрать любые два из трех векторов \(S\), и все еще будем способны получить все вектора из \(T\). В таком случае, мы выберем два первых вектора. Так как мы не можем получить все вектора из \(T\), используя только один вектор из \(S\), \(|S'| = 2\) и \(S' = \{10, 01\}\) (индексы \(1\) и \(2\)), как множество \(\{1, 2 \}\) — лексикографически минимально. Мы можем получить все вектора из \(T\), используя только вектора из \(S'\), как показано ниже: - \(00\), сумма пустого подмножества;
- \(01 = 01\), просто второй вектор;
- \(10 = 10\), просто первый вектор;
- \(11 = 10 + 01\), сумма первого и второго вектора.
| |
|
|
B. Bakery
снм
Структуры данных
*2900
Monocarp would like to open a bakery in his local area. But, at first, he should figure out whether he can compete with other shops. Monocarp plans that the bakery will work for \(n\) days. On the \(i\)-th day, \(a_i\) loaves of bread will be baked in the morning before the opening. At the end of the \(n\)-th day, Monocarp will sell all the remaining bread that wasn't sold earlier with a huge discount. Because of how bread is stored, the bakery seller sells the bread in the following order: firstly, he sells the loaves that were baked that morning; secondly, he sells the loaves that were baked the day before and weren't sold yet; then the loaves that were baked two days before and weren't sold yet, and so on. That's why some customers may buy a rather stale bread and will definitely spread negative rumors. Let's define loaf spoilage as the difference between the day it was baked and the day it was sold. Then the unattractiveness of the bakery will be equal to the maximum spoilage among all loaves of bread baked at the bakery. Suppose Monocarp's local area has consumer demand equal to \(k\), it means that each day \(k\) customers will come to the bakery and each of them will ask for one loaf of bread (the loaves are sold according to the aforementioned order). If there is no bread left, then the person just doesn't buy anything. During the last day sale, all the remaining loaves will be sold (and they will still count in the calculation of the unattractiveness). Monocarp analyzed his competitors' data and came up with \(m\) possible consumer demand values \(k_1, k_2, \dots, k_m\), and now he'd like to calculate the unattractiveness of the bakery for each value of demand. Can you help him? Output Print \(m\) integers: for each consumer demand, print the unattractiveness of the bakery. Note In the first example, let's describe what happens for couple consumer demands: If consumer demand is equal to \(1\): - at day \(1\): \(5\) loaves are baked and only \(1\) is sold with spoilage equal to \(1 - 1 = 0\);
- at day \(2\): \(4\) loaves are left and \(2\) more are baked. Only \(1\) loaf was sold and it was the loaf baked today with spoilage \(2 - 2 = 0\);
- at day \(3\): \(4\) loaves from the first day and \(1\) loaf from the second day left. One more loaf was baked and was sold this day with spoilage \(3 - 3 = 0\);
- at day \(4\): \(4\) loaves from the first day and \(1\) loaf from the second day left. \(3\) more loaves were baked and one of them was sold this day with spoilage \(4 - 4 = 0\);
- at day \(5\): \(4\) loaves from the first day, \(1\) loaf from the second day and \(2\) loaves from the fourth day left. \(7\) more loaves were baked and, since it's the last day, all \(14\) loaves were sold. \(4\) loaves from the first day have the maximum spoilage equal to \(5 - 1 = 4\).
In total, the unattractiveness of the bakery will be equal to \(4\). If consumer demand is equal to \(10\) then all baked bread will be sold in the day it was baked and will have spoilage equal to \(0\).
| |
|
|
J. Road Reform
графы
жадные алгоритмы
снм
*1800
There are \(n\) cities and \(m\) bidirectional roads in Berland. The \(i\)-th road connects the cities \(x_i\) and \(y_i\), and has the speed limit \(s_i\). The road network allows everyone to get from any city to any other city. The Berland Transport Ministry is planning a road reform. First of all, maintaining all \(m\) roads is too costly, so \(m - (n - 1)\) roads will be demolished in such a way that the remaining \((n - 1)\) roads still allow to get to any city from any other city. Formally, the remaining roads should represent an undirected tree. Secondly, the speed limits on the remaining roads might be changed. The changes will be done sequentially, each change is either increasing the speed limit on some road by \(1\), or decreasing it by \(1\). Since changing the speed limit requires a lot of work, the Ministry wants to minimize the number of changes. The goal of the Ministry is to have a road network of \((n - 1)\) roads with the maximum speed limit over all roads equal to exactly \(k\). They assigned you the task of calculating the minimum number of speed limit changes they have to perform so the road network meets their requirements. For example, suppose the initial map of Berland looks like that, and \(k = 7\): Then one of the optimal courses of action is to demolish the roads \(1\)–\(4\) and \(3\)–\(4\), and then decrease the speed limit on the road \(2\)–\(3\) by \(1\), so the resulting road network looks like that: Output For each test case, print one integer — the minimum number of changes the Ministry has to perform so that the maximum speed limit among the remaining \((n - 1)\) roads is exactly \(k\). Note The explanation for the example test: The first test case is described in the problem statement. In the second test case, the road network initially looks like that: The Ministry can demolish the roads \(1\)–\(2\), \(3\)–\(2\) and \(3\)–\(4\), and then increase the speed limit on the road \(1\)–\(4\) three times. In the third test case, the road network already meets all the requirements. In the fourth test case, it is enough to demolish the road \(1\)–\(2\) so the resulting road network meets the requirements.
| |
|
|
D. Путешествие
дп
поиск в глубину и подобное
реализация
снм
*1700
В некоторой стране \(n + 1\) городов, пронумерованных от \(0\) до \(n\). \(n\) дорог соединяют эти города, \(i\)-я дорога соединяет города \(i - 1\) и \(i\) (\(i \in [1, n]\)). У каждой дороги есть направление. Направления задаются строкой из \(n\) символов, каждый символ — либо L, либо R. Если \(i\)-й символ — L, то \(i\)-я дорога сначала направлена из города \(i\) в город \(i - 1\); иначе она направлена из города \(i - 1\) в город \(i\). Путешественник хочет посетить как можно больше городов этой страны. Сначала он выбирает город, из которого начнет свое путешествие. Каждый день путешественник должен перейти из текущего города в соседний город по дороге, и он может перейти по дороге только в соответствии с ее направлением; то есть, если дорога направлена из города \(i\) в город \(i + 1\), он может перейти из города \(i\) в город \(i + 1\), но не из \(i + 1\) в \(i\). После того как путешественник перемещается в соседний город, все дороги меняют свое направление на противоположное. Если путешественник не может перейти в соседний город, он обязан закончить свое путешествие; также он может закончить путешествие в любой момент, в который захочет. Цель путешественника — посетить как можно больше городов за одно путешествие (каждый город можно посетить любое количество раз, но только первое посещение считается). Для каждого города \(i\) посчитайте максимальное количество городов, которое путешественник может посетить за одно путешествие, если оно начинается в городе \(i\). Выходные данные Для каждого набора входных данных выведите \(n + 1\) целое число. \(i\)-е число должно быть равно максимальному количеству городов, которое можно посетить за одно путешествие, если это путешествие начинается в \(i\)-м городе.
| |
|
|
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\), он не удаляет ее.
| |
|
|
D. Dogeforces
Деревья
жадные алгоритмы
Конструктив
поиск в глубину и подобное
разделяй и властвуй
снм
сортировки
Структуры данных
*2300
В компании Dogeforces работают \(k\) сотрудников. У каждого сотрудника, кроме сотрудников нижнего звена, есть не менее \(2\) подчиненных. У сотрудников нижнего звена нет подчиненных. У каждого сотрудника (кроме руководителя компании) есть ровно один непосредственный начальник. Руководитель компании является непосредственным или косвенным начальником всех сотрудников. Известно, что в Dogeforces любой начальник получает зарплату строго больше, чем все его подчиненные. Полная структура компании является секретом, но вам известно количество сотрудников нижнего звена и для каждой пары сотрудников нижнего звена известна зарплата их общего начальника (если таких начальников несколько, то начальника с минимальной зарплатой). Вам предстоит восстановить структуру компании. Выходные данные В первую строку выведите одно целое число \(k\) — количество сотрудников в компании. Во второй строке выведите \(k\) целых чисел \(c_1, c_2, \dots, c_k\), где \(c_i\) — зарплата сотрудника с номером \(i\). В третьей строке выведите одно целое число \(r\) — номер сотрудника, который является руководителем компании. В последующих \(k-1\) строках выведите по два целых числа \(v\) и \(u\) (\(1 \le v, u \le k\)) — номер сотрудника и его непосредственного начальника. Обратите внимание, что сотрудники нижнего звена имею номера с \(1\) по \(n\), а для остальных сотрудников вам предстоит назначить номера от \(n+1\) до \(k\). Если корректных структур компании несколько, вы можете вывести любую из них. Примечание Одна из возможных структур в первом примере: 
| |
|
|
C. Завершите MST
битмаски
графы
Деревья
жадные алгоритмы
Перебор
поиск в глубину и подобное
снм
Структуры данных
*2500
Как преподаватель, Riko Hakozaki часто помогает ученикам в решении задач по различным предметам. Сегодня ее попросили помочь с задачей по программированию, которая заключается в следующем. Вам выдается неориентированный полный граф с \(n\) вершинами, где для некоторых ребер заданы положительные веса, а для остальных нет. Вам нужно назначить всем еще не назначенным рёбрам неотрицательные веса так, чтобы у получившегося графа XOR (побитовое исключающее ИЛИ) всех весов был равен \(0\). Определим уродство полного графа как вес его минимального остовного дерева, где вес остовного дерева равен сумме весов его рёбер. Нужно назначить веса так, чтобы уродство получившегося графа было как можно меньше. Напомним, что неориентированный полный граф с \(n\) вершинами содержит все рёбра \((u, v)\) с \(1 \le u < v \le n\); такой граф имеет \(\frac{n(n-1)}{2}\) рёбер. Она не знает, как решить эту задачу, поэтому просит вас решить ее за нее. Выходные данные Выведите в одной строке одно целое число — минимальное уродство среди всех возможных назначений весов с XOR суммой равной \(0\). Примечание На изображении ниже показан первый пример. Черные веса назначены предварительно, красные веса назначены нами, а минимальное остовное дерево состоит из синих ребер.
| |
|
|
D. НОД и МОД
графы
жадные алгоритмы
Конструктив
снм
сортировки
теория чисел
*2000
Вам дан массив \(a\) из \(n\) (\(n \geq 2\)) положительных целых чисел, а также целое число \(p\). Рассмотрим неориентированный взвешенный граф на \(n\) вершинах, пронумерованных от \(1\) до \(n\), в котором между вершинами \(i\) и \(j\) (\(i<j\)) добавлены следующие ребра: - Если \(gcd(a_i, a_{i+1}, a_{i+2}, \dots, a_{j}) = min(a_i, a_{i+1}, a_{i+2}, \dots, a_j)\), то между вершинами \(i\) и \(j\) существует ребро веса \(min(a_i, a_{i+1}, a_{i+2}, \dots, a_j)\).
- Если \(i+1=j\), то между вершинами \(i\) и \(j\) существует ребро веса \(p\).
Здесь \(gcd(x, y, \ldots)\) обозначает наибольший общий делитель (НОД) чисел \(x\), \(y\), .... Обратите внимание, между вершинами \(i\) и \(j\) появляются кратные ребра, если оба условия выполнены. Если же ни одно условие не выполнено для \(i\) и \(j\), то между ними нет ребер. Ваша цель — найти вес минимального остовного дерева данного графа. Выходные данные Выведите \(t\) строк. Для каждого набора входных данных выведите вес соответствующего минимального остовного дерева. Примечание Ниже изображены графы для четырех наборов входных данных примера (ребра одного из минимальных остовных деревьев показаны розовым): Набор 1 Набор 2 Набор 3 Набор 4
| |
|
|
F. Феникс и землетрясение
графы
Деревья
жадные алгоритмы
Конструктив
поиск в глубину и подобное
снм
*2600
Родина Феникса, Страна Огня, состоит из \(n\) городов, которые были соединены \(m\) дорогами, но из-за землетрясения они все были разрушены. Теперь Страна Огня хочет восстановить \(n-1\) из этих дорог так, чтобы все города стали снова связаны. Первоначально, в \(i\)-м городе есть \(a_i\) тонн асфальта. Чтобы восстановить дорогу, необходимо \(x\) тонн асфальта. При этом, чтобы восстановить дорогу между городами \(i\) и \(j\), в городах \(i\) и \(j\) должно быть суммарно хотя бы \(x\) тонн асфальта. Другими словами, в городе \(i\) есть \(a_i\) тонн асфальта, а городе \(j\) — \(a_j\) тонн, то после восстановления дороги между ними останется \(a_i+a_j-x\) тонн. Асфальт можно перевозить между городами, если дорога между ними уже восстановлена. Определите, возможно ли связать все города, и если да, то выведите последовательность дорог, которые нужно восстановить, в соответствующем порядке. Выходные данные Если невозможно связать все города, выведите NO. В противном случае выведите YES и далее \(n-1\) целое число \(e_1, e_2, \dots, e_{n-1}\) — порядок, в котором нужно восстанавливать дороги. \(e_i\) — это номер \(i\)-й в порядке восстановления дороги. Если существует несколько ответов, выведите любой. Примечание В первом примере, дороги восстанавливаются в следующем порядке: - Дорога \(3\) восстановлена (соединяет города \(3\) и \(4\)). В городе \(4\) первоначально было \(4\) тонны асфальта. После восстановления, осталось \(3\) тонны.
- Дорога \(2\) восстановлена (соединяет города \(2\) и \(3\)). Асфальт из города \(4\) можно перевезти в город \(3\) и использовать на дорогу. Осталось \(2\) тонны.
- Дорога \(1\) восстановлена (соединяет города \(1\) и \(2\)). Асфальт перевезен в город \(2\) и потрачен на дорогу. Осталась \(1\) тонна.
- Дорога \(4\) восстановлена (соединяет города \(4\) и \(5\)). Асфальт перевезен в город \(4\) и потрачен на дорогу. Больше асфальта не осталось.
Все города теперь связаны. Во втором примере, города \(1\) и \(2\) используют свой асфальт вместе для постройки дороги. В каждом городе по \(1\) тонне, то есть вместе \(2\) тонны, чего достаточно. В третьем примере, для восстановления дороги между городами \(1\) и \(2\) асфальта недостаточно.
| |
|
|
D. Настя играет с деревом
Деревья
дп
жадные алгоритмы
Конструктив
поиск в глубину и подобное
реализация
снм
Структуры данных
*2500
У Насти есть невзвешенное дерево из \(n\) вершин, с которым ей не терпится поиграть! Девочка будет выполнять следующую операцию с деревом столько раз, сколько ей потребуется: - удалить любое существующее ребро, затем
- добавить неориентированное ребро между любой парой вершин.
Какое минимальное количество операций требуется девочке, чтобы получить из дерева бамбук? Бамбуком называется дерево, степень вершин в котором не превосходит \(2\). Выходные данные Для каждого из наборов входных данных в первой строке выведите одно целое число \(k\) — минимальное количество операций, необходимых, чтобы получить из дерева бамбук. В последующих \(k\) строках выведите \(4\) целых числа \(x_1\), \(y_1\), \(x_2\), \(y_2\) (\(1 \le x_1, y_1, x_2, y_{2} \le n\), \(x_1 \neq y_1\), \(x_2 \neq y_2\)) — таким образом вы удаляете ребро \((x_1, y_1)\) и добавляете неориентированное ребро \((x_2, y_2)\). Обратите внимание, что ребро \((x_1, y_1)\) обязано содержаться в графе до его удаления. Примечание Обратите внимание, что граф может быть несвязным после какого-то количества операций. Рассмотрим первый набор входных данных: Красным обозначены удаленные ребра, а зеленым – добавленные.
| |
|
|
C. Головоломка маленького Алана
графы
дп
Комбинаторика
математика
снм
*1300
Во время перерывов в подготовке к Международной олимпиаде школьников по информатике маленький Алан любит решать различные головоломки, чтобы развивать мозги. Сегодня он решает головоломку, которая выглядит как таблица \(2 \times n\), где в каждом ряду записана перестановка чисел \(1,2,3,\ldots,n\). Задача головоломки — сделать так, чтобы ни в каком ряду и ни в каком столбце не было двух одинаковых чисел (назовем такие состояния решенными), а единственная разрешенная операция — поменять местами два числа в одном столбце. Когда маленький Алан решил головоломку много раз, он заскучал и начал размышлять, а сколько вообще существует различных решенных состояний в данной головоломке, которые он может получить из некоторого начального решенного состояния, применяя только разрешенные операции? Маленький Алан не справился с этой сложной задачей, поэтому он попросил вас помочь ему. Найдите ответ по модулю \(10^9+7\). Выходные данные Для каждого набора входных данных выведите одно целое число — количество решенных состояний головоломки, которые можно получить из данного, меняя местами числа в столбцах. Так как ответ может быть большим, выведите его по модулю \(10^9+7\). Примечание Два возможных решенный состояния в примере \(1\): - \([1,4,2,3]\) в первой строке, и \([3,2,1,4]\) во второй,
- \([3,2,1,4]\) в первой строке, и \([1,4,2,3]\) во второй.
| |
|
|
F. Исправляем фигуры
графы
жадные алгоритмы
Конструктив
математика
поиск в глубину и подобное
снм
*2200
У вас есть связный неориентированный граф, состоящий из \(n\) вершин и \(m\) ребер. У \(i\)-го узла есть начальное значение \(v_i\) и целевое значение \(t_i\). За одну операцию можно выбрать любое ребро \((i, j)\) и добавить \(k\) к \(v_i\) и \(v_j\), где \(k\) может быть любым целым числом. В частности, \(k\) может быть отрицательным. Ваша задача определить, можно ли, выполнив некоторое конечное число операций (возможно, ноль), добиться того, что каждого узла \(i\), \(v_i = t_i\). Выходные данные Для каждого наборам входных данных, если возможно, чтобы значение в каждой вершине стало равно целевому после некоторого количества операций, выведите «YES». В противном случае выведите «NO». Примечание Вот визуализация первого тестового случая (оранжевые значения обозначают начальные значения, а синие — целевые): Один из возможных порядков действий для получения нужных значений для каждого узла следующий: - Операция \(1\): Добавить \(2\) к вершинами \(2\) и \(3\).
- Операция \(2\): Добавить \(-2\) к вершинам \(1\) и \(4\).
- Операция \(3\): Добавить \(6\) к вершинам \(3\) и \(4\).
Теперь мы видим, что в общей сложности мы добавили \(-2\) к вершине \(1\), \(2\) к вершине \(2\), \(8\) к вершине \(3\) и \(4\) к вершине \(4\), что привело каждую вершину к нужному значению. Для графа из второго набора входных данных получить нужные значения невозможно.
| |
|
|
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. Сдвиг перестановки
графы
Комбинаторика
Конструктив
математика
Перебор
поиск в глубину и подобное
снм
*2100
Тождественная перестановка длины \(n\) — это массив \([1, 2, 3, \dots, n]\). Мы применили следующие операции к тождественной перестановке длины \(n\): - Вначале мы циклически сдвинули ее вправо на \(k\) позиций, где \(k\) вам неизвестно (вы знаете только то, что \(0 \le k \le n - 1\)). При циклическом сдвиге массива вправо на \(k\) позиций необходимо взять \(k\) последних элементов исходного массива (не меняя их относительный порядок) и дописать \(n - k\) первых элементов исходного массива справа от них (также не меняя относительный порядок этих \(n - k\) элементов). Например, если бы мы циклически сдвинули тождественную перестановку длины \(6\) на \(2\) позиции вправо, мы бы получили массив \([5, 6, 1, 2, 3, 4]\);
- Далее мы выполнили следующую операцию не более \(m\) раз: выбрали два элемента массива и поменяли их местами.
Вам даны \(n\) и \(m\), а также полученный массив. Ваша задача — найти все возможные значения \(k\) в операции циклического сдвига. Выходные данные Для каждого набора входных данных выведите ответ следующим образом: - Вначале выведите одно целое число \(r\) (\(0 \le r \le n\)) — количество возможных значений \(k\) в операции циклического сдвига;
- Далее выведите \(r\) целых чисел \(k_1, k_2, \dots, k_r\) (\(0 \le k_i \le n - 1\)) — все возможные значения \(k\) в возрастающем порядке.
Примечание Рассмотрим примеры из условия. - В первом наборе входных данных единственное возможное значение для циклического сдвига это \(3\). Если мы сдвинем \([1, 2, 3, 4]\) на \(3\) позиции, мы получим \([2, 3, 4, 1]\). Далее мы можем поменять \(3\)-й и \(4\)-й элементы местами, чтобы получить массив \([2, 3, 1, 4]\);
- Во втором наборе единственное возможное значение для циклического сдвига это \(0\). Если мы сдвинем \([1, 2, 3]\) на \(0\) позиций, мы получим \([1, 2, 3]\). Далее мы не производим операций обмена (так как нам разрешено совершить не более \(1\)-го обмена), таким образом, полученный массив остается равным \([1, 2, 3]\);
- В третьем наборе все значения от \(0\) до \(2\) допустимы для циклического сдвига:
- если мы сдвинем \([1, 2, 3]\) на \(0\) позиций, мы получим \([1, 2, 3]\). Далее мы можем поменять \(1\)-й и \(3\)-й элементы, чтобы получить \([3, 2, 1]\);
- если мы сдвинем \([1, 2, 3]\) на \(1\) позицию, мы получим \([3, 1, 2]\). Далее мы можем поменять \(2\)-й и \(3\)-й элементы, чтобы получить \([3, 2, 1]\);
- если мы сдвинем \([1, 2, 3]\) на \(2\) позиции, мы получим \([2, 3, 1]\). Далее мы можем поменять \(1\)-й и \(2\)-й элементы, чтобы получить \([3, 2, 1]\);
- В четвертом наборе входных данных операции обмена запрещены, однако ни один циклический сдвиг не равен массиву \([1, 2, 3, 4, 6, 5]\).
| |
|
|
G. Граф общих делителей
графы
Конструктив
математика
Перебор
снм
теория чисел
хэши
*2700
Рассмотрим последовательность различных целых чисел \(a_1, \ldots, a_n\), каждое из которых соответствует отдельной вершине графа. Будем соединять две вершины ребром, если соответствующие им числа не взаимно просты, т. е. если они имеют общий делитель, больший чем \(1\). Вам даны \(q\) запросов, в каждом запросе вы хотите попасть из вершины, соответствующей значению \(a_s\), в вершину, соответствующую \(a_t\). Для того чтобы это сделать, вы можете выбирать существующее значение \(a_i\), создать новую вершину со значением \(a_{n+1} = a_i \cdot (1 + a_i)\) и соединить ее со всеми вершинами, значения которых не взаимно просты с \(a_{n+1}\). После этого \(n\) увеличивается на \(1\). Вы можете повторять эту операцию любое количество раз, удлиняя последовательность, и, возможно, получая одинаковые значения. Какое минимальное количество вершин нужно добавить, чтобы \(a_t\) стало достижимо из \(a_s\)? Обратите внимание, что запросы независимы. В каждом запросе вы начинаете с исходной последовательности \(a\), заданной во входных данных. Выходные данные Выведите \(q\) строк. \(j\)-я строка должна содержать одно целое число: минимальное количество вершин, которое нужно добавить, чтобы можно было достичь \(a_{s_j}\) из \(a_{t_j}\). Примечание В первом примере вы можете добавить вершину со значением \(2 \cdot 3 = 6\), или \(10 \cdot 11 = 110\), или \(3 \cdot 4 = 12\). Ни одно из этих добавлений не нужно в первом запросе, так как вы уже можете добраться из \(a_1 = 2\) в \(a_2 = 10\). Во втором запросе оптимальным является добавление вершины со значением \(6\) или \(12\). Например, добавляя вершину со значением \(6\), мы сможем добраться из \(a_1 = 2\) в \(a_3 = 3\) по пути со значениями \((2, 6, 3)\). В последнем запросе второго примера мы хотим добраться из \(a_3 = 7\) в \(a_5 = 25\). Одним из возможных способов достичь это является создание вершины со значением \(6 \cdot 7 = 42\), а затем создание вершины со значением \(25 \cdot 26 = 650\). В финальном графе, состоящем из 7 вершин, существует путь из \(a_3 = 7\) в \(a_5 = 25\).
| |
|
|
F. Хороший граф
графы
Деревья
снм
Структуры данных
*2700
У вас есть неориентированный граф из \(n\) вершин, и у каждого ребра есть вес. Назовем простым циклом цикл в графе без повторяющихся вершин. Назовем весом цикла исключающее ИЛИ весов его ребер. Скажем, что граф хороший, если все его простые циклы имеют вес \(1\). Граф плохой, если он является не хорошим. Первоначально, граф пустой. Далее приходят \(q\) запросов. Каждый запрос имеет следующий вид: - \(u\) \(v\) \(x\) — нужно добавить ребро между вершинами \(u\) и \(v\) веса \(x\), если добавление данного ребра не делает граф плохим.
Для каждого запроса выведите: было ли добавлено данное ребро. Выходные данные Для каждого запроса, выведите YES, если ребро было добавлено в граф, или NO в противном случае (оба в любом регистре).
| |
|
|
G. Врата в другой мир
битмаски
снм
Структуры данных
*3300
Как уже упоминалось, Василий любит играть в компьютерные игры. В одной из его любимых игр персонаж находится во вселенной, где каждая планета обозначается двоичным числом от \(0\) до \(2^n - 1\). На каждой из планет находятся врата, позволяющие перемещаться с планеты \(i\) на планету \(j\), если двоичная запись \(i\) отличается от двоичной записи \(j\) ровно в одном бите. Василий хочет проверить вас и посмотреть, как вы справитесь с обработкой следующих запросов в этом игровом мире: - Уничтожить планеты с номерами от \(l\) до \(r\) включительно. На такие планеты больше нельзя перемещаться.
- Узнать, можно ли с планеты \(a\) долететь до планеты \(b\), используя какое-то количество планетных врат. Гарантируется, что планеты \(a\) и \(b\) не являются уничтоженными.
Выходные данные На каждый запрос типа ask в отдельной строке необходимо вывести «1», если с планеты \(a\) можно долететь до планеты \(b\), и «0» иначе (без кавычек). Примечание Первый тест можно визуализировать следующим образом: Ответ на запрос ask 0 7 положительный. Далее после запроса block 3 6 граф будет выглядеть следующим образом (выделены уничтоженные вершины): Ответ на запрос ask 0 7 отрицательный, так как любой путь из вершины \(0\) в вершину \(7\) лежит через одну из уничтоженных вершин.
| |
|
|
D1. Mocha и Diana (простая версия)
графы
Деревья
жадные алгоритмы
Конструктив
Перебор
снм
*1400
Это простая версия задачи. Две версии отличаются ограничениями на \(n\). Вы можете делать взломы, только если обе версии задачи решены. Лесом называется неориентированный граф без циклов (не обязательно связный). Mocha и Diana — друзья из Чжицзяна, у каждой из них есть лес с вершинами, пронумерованными от \(1\) до \(n\), и они хотят добавить ребра в свои леса с выполнением следующих условий: - После добавления ребер каждый из графов остается лесом.
- Они добавляют одинаковые ребра. Это значит, что если ребро \((u, v)\) добавляется в лес Mocha, то также ребро \((u, v)\) добавляется в лес Diana, и наоборот.
Mocha и Diana хотят знать, какое максимальное количество ребер они могут добавить, и какие ребра им нужно добавлять. Выходные данные Первая строка содержит одно целое число \(h\) — максимальное количество ребер, которое можно добавить в каждый из лесов Mocha и Diana. Каждая из следующих \(h\) строк содержит два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \neq v\)) — ребра, которые нужно добавить. Если существует несколько решений, выведите любое из них. Примечание В первом примере нельзя добавить ни одно ребро. Во втором примере начальные леса выглядят следующим образом. 
Можно добавить ребро \((2, 4)\). 
| |
|
|
D2. Mocha и Diana (сложная версия)
графы
Деревья
жадные алгоритмы
Конструктив
Перебор
поиск в глубину и подобное
снм
*2500
Это сложная версия задачи. Две версии отличаются ограничениями на \(n\). Вы можете делать взломы, только если обе версии задачи решены. Лесом называется неориентированный граф без циклов (не обязательно связный). Mocha и Diana — друзья из Чжицзяна, у каждой из них есть лес с вершинами, пронумерованными от \(1\) до \(n\), и они хотят добавить ребра в свои леса с выполнением следующих условий: - После добавления ребер каждый из графов остается лесом.
- Они добавляют одинаковые ребра. Это значит, что если ребро \((u, v)\) добавляется в лес Mocha, то также ребро \((u, v)\) добавляется в лес Diana, и наоборот.
Mocha и Diana хотят знать, какое максимальное количество ребер они могут добавить, и какие ребра им нужно добавлять. Выходные данные Первая строка содержит одно целое число \(h\) — максимальное количество ребер, которое можно добавить в каждый из лесов Mocha и Diana. Каждая из следующих \(h\) строк содержит два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \neq v\)) — ребра, которые нужно добавить. Если существует несколько решений, выведите любое из них. Примечание В первом примере нельзя добавить ни одно ребро. Во втором примере начальные леса выглядят следующим образом. 
Можно добавить ребро \((2, 4)\). 
| |
|
|
F. Непереводимое название
2-sat
графы
Конструктив
поиск в глубину и подобное
реализация
снм
*2700
У Алисы есть пустое поле из \(n\) строк и \(m\) столбцов. Некоторые клетки этого поля помечены, и ни одна помеченная клетка не касается края поля. (Две клетки считаются соседними, если они касаются по стороне.) Алиса хочет записать в каждую клетку число так, чтобы они удовлетворяли следующим условиям: - в каждой непомеченной клетке записано либо \(1\), либо \(4\);
- в каждой помеченной клетке записана сумма чисел всех соседних непомеченных клеток (если у помеченной вершины нет соседних непомеченных, то сумма равна \(0\));
- в каждой помеченной клетке записанное число делится на \(5\).
Не придумав ничего, Алиса решила попросить помощи у Боба. Помогите Бобу найти любое подходящее заполнение поля, или определить, что такого поля не существует. Выходные данные Выведите «NO», если не существует подходящего заполнения. В противном случае выведите «YES». Далее выведите \(n\) строк по \(m\) целых чисел через пробел — числа в клетках поля. Примечание Можно показать, что во втором примере не существует подходящего заполнения.
| |
|
|
F. Вхождения
бпф
графы
дп
Комбинаторика
поиск в глубину и подобное
снм
*2700
Подмассив массива \(a\) с индекса \(l\) по индекс \(r\) — это массив \([a_l, a_{l+1}, \dots, a_{r}]\). Количество вхождений массива \(b\) в массива \(a\) — это количество таких подмассивов массива \(a\), которые равны \(b\). Вам даны \(n\) массивов \(A_1, A_2, \dots, A_n\); их элементы — целые числа от \(1\) до \(k\). Вы должны построить массив \(a\) из \(m\) целых чисел от \(1\) до \(k\) таким образом, чтобы для каждого заданного массива \(A_i\) выполнялось следующее условие: количество вхождений массива \(A_i\) в массив \(a\) не меньше, чем количество вхождений каждого непустого подмассива \(A_i\) в \(a\) (по отдельности). Обратите внимание, что если \(A_i\) не входит в \(a\), и никакой подмассив \(A_i\) не входит в \(a\), это условие выполняется для \(A_i\). Ваша задача — посчитать количество различных массивов \(a\), удовлетворяющих этим условиям, и вывести его по модулю \(998244353\). Выходные данные Выведите одно целое число — количество различных массивов \(a\), удовлетворяющих данным условиям, по модулю \(998244353\).
| |
|
|
J. Jeopardy of Dropped Balls
Бинарный поиск
Перебор
реализация
снм
*1500
Mr. Chanek has a new game called Dropping Balls. Initially, Mr. Chanek has a grid \(a\) of size \(n \times m\) Each cell \((x,y)\) contains an integer \(a_{x,y}\) denoting the direction of how the ball will move. - \(a_{x,y}=1\) — the ball will move to the right (the next cell is \((x, y + 1)\));
- \(a_{x,y}=2\) — the ball will move to the bottom (the next cell is \((x + 1, y)\));
- \(a_{x,y}=3\) — the ball will move to the left (the next cell is \((x, y - 1)\)).
Every time a ball leaves a cell \((x,y)\), the integer \(a_{x,y}\) will change to \(2\). Mr. Chanek will drop \(k\) balls sequentially, each starting from the first row, and on the \(c_1, c_2, \dots, c_k\)-th (\(1 \leq c_i \leq m\)) columns. Determine in which column each ball will end up in (position of the ball after leaving the grid). Output Output \(k\) integers — the \(i\)-th integer denoting the column where the \(i\)-th ball will end. Note In the first example, the first ball will drop as follows. Note that the cell \((1, 1)\) will change direction to the bottom direction. The second and third balls will drop as follows. All balls will be dropped from the first row and on the \(c_1, c_2, \dots, c_k\)-th columns respectively. A ball will stop dropping once it leaves the grid.
| |
|
|
B. Building Forest Trails
снм
Структуры данных
*2800
There are \(n\) villages lying equidistant on a circle in the middle of a thick, impassable forest. From ancient times, it was impossible to move from one village to another, but technical progress has changed a lot. Now, there is a technology to build passable trails in the forest. The building process consists of \(m\) events. Each event is either building a trail or querying if two villages are connected. Trails are built as straight lines connecting two villages. After a trail is built, anybody can walk along the trail from one village to another. Moreover, if two trails cross, anybody can turn at the intersection, and if other trails leave a village you have just reached, they can also be used to walk along. So, for example, if villages are numbered \(1\) to \(6\) in the order around the circle, and there are trails \(1\) to \(3\), \(2\) to \(4\), and \(4\) to \(6\), then all villages, except the \(5\)-th, are reachable from the \(1\)-st village. Given a list of \(m\) events, for each query, find if two given villages are reachable from each other at that moment. Output For each query print one character '0' if villages are not reachable, and '1' if villages are reachable from each other. Print answers for all queries as a single string in one line.
| |
|
|
L. Labyrinth
Бинарный поиск
жадные алгоритмы
снм
*2400
In a dream, Lucy found herself in a labyrinth. This labyrinth consists of \(n\) rooms, connected by \(m\) passages (\(i\)-th passage is \(w_i\) cm wide). Each passage can be traversed in both directions. It is guaranteed that it is possible to get from any room to any other room. But this is not an ordinary labyrinth — each room in this labyrinth contains a magic candy. When Lucy eats this magic candy, she is getting wider. Specifically, if she eats candy from room \(i\) she becomes wider by \(c_i\) cm. Note that she is not obliged to eat candy the first time she visits a particular room, but she can eat each candy only once. Unfortunately, passages in this labyrinth are pretty narrow, so after eating some candy, Lucy can get too wide and will not be able to traverse them — her width should not be greater than the width of the corresponding passage. Lucy starts her journey in a room number \(1\). She wants to eat all the candies. After that, she will just wake up, so she does not have to be able to return to the room \(1\). She realizes that with her current width, she may not be able to do so, so she plans a workout before embarking on her journey. Lucy wants to know if it is possible to start with some positive width and still eat all the candies. If yes, then what is the maximal starting width with which it is possible. Output If it is possible to eat all the candies, output the maximal possible starting width, otherwise output \(-1\).
| |
|
|
B. Хемосе в магазинах
Конструктив
математика
снм
сортировки
*1200
Хемосе вместе со своими друзьями Самезом, Ахмедом, Ашрафом, Саваном и О_Е ходил по магазинам в Германии. Как вы знаете, Хемосе и его друзья решают задачи, поэтому они очень умны. Поэтому они отправятся во все магазины со скидками в Германии. У Хемосе есть массив из \(n\) целых чисел. Он хочет, чтобы Самез отсортировал массив в неубывающем порядке. Поскольку для Самеза это было бы слишком простой задачей, Хемосе разрешает Самезу использовать только следующую операцию: Выберите индексы \(i\) и \(j\) такие, что \(1 \le i, j \le n\), и \(\lvert i - j \rvert \geq x\). Затем поменяйте местами элементы \(a_i\) и \(a_j\).
Подскажите, пожалуйста, существует ли способ отсортировать массив в неубывающем порядке, используя вышеописанную операцию некоторое конечное число раз (возможно, \(0\))? Выходные данные Для каждого набора входных данных необходимо вывести одну строку. Если Самез может отсортировать массив в неубывающем порядке с помощью операции, описанной выше, выведите «YES» (без кавычек). В противном случае выведите «NO» (без кавычек). Вы можете вывести каждую букву «YES» и «NO» в любом регистре (верхнем или нижнем). Примечание В первом наборов входных данных вы не можете выполнить никаких операций. Во втором наборе входных данных массив уже отсортирован. В третьем наборе входных данных вы можете выполнить следующие операции: - \([5,1,2,3,4]\), \(swap(a_1,a_3)\)
- \([2,1,5,3,4]\), \(swap(a_2,a_5)\)
- \([2,4,5,3,1]\), \(swap(a_2,a_4)\)
- \([2,3,5,4,1]\), \(swap(a_1,a_5)\)
- \([1,3,5,4,2]\), \(swap(a_2,a_5)\)
- \([1,2,5,4,3]\), \(swap(a_3,a_5)\)
- \([1,2,3,4,5]\)
(Здесь под \(swap(a_i, a_j)\) имеется в виду обмен местами элементов на позициях \(i\), \(j\)).
| |
|
|
D. Количество предателей
графы
дп
Конструктив
поиск в глубину и подобное
снм
*1700
Теофанис начал играть в новую онлайн-игру под названием «Among them». Однако, он постоянно играет с игроками из Кипра, и всех их зовут «Андреас» (самое распространенное имя на Кипре). В каждой игре Теофанис играет с \(n\) другими игроками. Так как у них всех одинаковые имена, то они были пронумерованы от \(1\) по \(n\). Игроки написали \(m\) комментариев в чате. Каждый комментарий имеет вид «\(i\) \(j\) \(c\)», где \(i\) и \(j\) — это два различных целых числа, а \(c\) — строка (\(1 \le i, j \le n\); \(i \neq j\); \(c\) — это либо imposter (предатель), либо crewmate (член экипажа)). Данный комментарий означает, что игрок \(i\) говорит, что роль игрока \(j\) — это \(c\). Предатели всегда врут, а члены экипажа всегда говорят правду. Помогите Теофанису подсчитать максимальное возможное количество предателей среди всех кипрских игроков, или определить, что комментарии противоречат друг другу (ознакомьтесь с заметками для лучшего понимания). Заметим, что у каждого игрока ровно одна роль: либо imposter (предатель), либо crewmate (член экипажа). Выходные данные Для каждого набора входных данных выведите одно целое число — максимально возможное количество предателей. Если комментарии противоречат друг другу, выведите \(-1\). Примечание В первом наборе входных данных, предателями могут быть Андреас \(2\) и Андреас \(3\). Во втором наборе, предателями могут быть Андреас \(1\), Андреас \(2\), Андреас \(3\) и Андреас \(5\). В третьем наборе, комментарии противоречат друг другу. Это потому что игрок \(1\) называет игрока \(2\) предателем, в то время как игрок \(2\) называет игрока \(1\) членом экипажа. Если игрок \(1\) — член экипажа, то он должен говорить правду, а значит игрок \(2\) — предатель. Но если игрок \(2\) — предатель, то он лжет, и, следовательно, игрок \(1\) не может быть членом экипажа. Противоречие.
| |
|
|
D. Ребра в MST
графы
поиск в глубину и подобное
снм
сортировки
*2300
Дан связный взвешенный неориентированный граф без петель и кратных ребер. Напоминаем, что остовным деревом графа называется ациклический связный подграф данного графа, в который входят все его вершины. Весом дерева называется сумма весов входящих в него ребер. Минимальным остовным деревом (MST) графа называется остовное дерево этого графа, имеющее минимальный возможный вес. Очевидно, что для любого связного графа минимальное остовное дерево существует, но, в общем случае, минимальное остовное дерево графа не единственно. Ваша задача — для каждого ребра данного графа определить: либо оно входит в любое MST, либо оно входит хотя бы в одно MST, либо оно не входит ни в одно MST. Выходные данные Выведите m строк — ответы для всех ребер. Если i-е ребро входит в любое MST, выведите «any»; если i-е ребро входит хотя бы в одно MST, выведите «at least one»; если i-е ребро не входит ни в одно MST, выведите «none». Ответы для ребер выводите в том порядке, в котором ребра заданы во входных данных. Примечание Во втором примере для данного графа MST единственно: оно содержит первые два ребра. В третьем примере для данного графа любые два ребра образуют MST. Значит, любое ребро входит хотя бы в одно MST.
| |
|
|
D. Социальная сеть
графы
Деревья
жадные алгоритмы
реализация
снм
*1600
Василий приехал на посвященную криптовалютам конференцию. Для того, чтобы быть в курсе всех самых важных новостей из мира криптовалют, нужно постоянно заводить новые знакомства или пользоваться знакомствами своих друзей. В конференции участвует \(n\) человек, которые изначально не знакомы между собой. Василий может познакомить двух любых людей \(a\) и \(b\), которые не были знакомы до этого. У Василия есть \(d\) условий, \(i\)-е из которых требует, чтобы человек \(x_i\) имел связь с человеком \(y_i\). Формально два человека \(x\) и \(y\) имеют связь, если найдется цепочка \(p_1=x, p_2, p_3, \dots, p_k=y\) такая, что для всех \(i\) от \(1\) до \(k - 1\) известно, что люди под номерами \(p_i\) и \(p_{i + 1}\) знакомы. Василий хочет, чтобы для каждого \(i\) (\(1 \le i \le d\)) вы рассчитали, какое максимальное количество знакомств может иметь один человек при условии, что Василий выполнил все условия от \(1\) до \(i\) включительно, произведя при этом ровно \(i\) знакомств. Проверка условий происходит после того, как Василий провел \(i\) знакомств. Ответ для каждого \(i\) необходимо найти независимо. То есть, когда вы вычисляете ответ для \(i\), вы должны считать, что никто из людей еще не был знаком. Выходные данные Выведите \(d\) целых чисел. \(i\)-е число должно быть равно количеству знакомств у человека с наибольшим возможным количеством знакомств, если Василий провел \(i\) знакомств и выполнил первые \(i\) условий. Примечание Пояснение для первого тестового примера: В этом пояснении круг и вписанное число обозначают человека с соответствующим номером. Линии, соединяющие людей, обозначают то, что эти люди знакомы между собой. Человек, отмеченный красным цветом, имеет наибольшее количество знакомых. Данные способы познакомить людей не являются единственными правильными.
| |
|
|
D. (XO)R-ождественское дерево
битмаски
графы
Деревья
поиск в глубину и подобное
снм
*2200
Это была ночь перед рождеством, и пришло время Санте украсить свое Рождественское дерево. Это дерево состоит из \(n\) вершин, соединенных \(n-1\) ребром. На каждом ребре дерева расположена гирлянда, которую можно описать некоторым числом в двоичном представлении. Посмотреть на это дерево собралось \(m\) эльфов. Каждый эльф выбрал две вершины \(a\) и \(b\), и он смотрит только на гирлянды на простом пути между этими вершинами. В результате созерцания у эльфа появляется любимое число, равное побитовому исключающему ИЛИ значений на ребрах этого пути. Однако, Северный Полюс только начал восстанавливаться после недавней эпидемии ОРВИ. Из-за этого Санта успел забыть, как выглядели некоторые гирлянды, и проверить их он не может, потому что уже покинул Северный Полюс! К счастью, на помощь пришли эльфы: каждый из них сообщил Санте свою пару вершин \((a_i, b_i)\), и четность количества единичных битов в своем любимом числе. Другими словами, каждый эльф помнит, было ли количество \(1\)-ц в его любимом числе, записанном в двоичном виде, четным или нечетным. Помогите Санте проверить, могло ли существовать такое дерево, и если да, как оно могло выглядеть, и возможно вы войдете в историю! Выходные данные Для каждого набора входных данных, сначала выведите YES или NO (в любом регистре), в зависимости от того, существует ли дерево, соответствующее памяти Санты, или нет. Если ответ YES, выведите \(n-1\) строк по три целых числа в каждом: \(x\), \(y\) и \(v\) (\(1 \le x, y \le n\); \(0 \le v < 2^{30}\)) — ребро дерева и число, описывающее состояние гирлянды на нем. Множество ребер должно совпадать с множеством из входных данных, и если состояние гирлянды на ребре известно, то оно не должно измениться. Вы можете выводить ребра в любом порядке. Если существует несколько решений, выведите любое. Примечание Первый набор входных данных соответствует изображению из условия. Один из возможных ответов — это присвоить ребру \((1, 2)\) значение \(5\), а ребру \((2, 5)\) — значение \(3\). Этот способ подходит потому что: - Первый эльф рассматривает путь между вершинами \(2\) и \(3\). Его любимое число будет равно \(4\), а потому он помнит значение \(1\) (так как в двоичном представлении \(4\) нечетное количество битов \(1\)).
- Второй эльф рассматривает путь между вершинами \(2\) и \(5\). Его любимое число будет равно \(3\), а потому он помнит значение \(0\) (так как в двоичном представлении \(3\) четное количество битов \(1\)).
- Третий эльф рассматривает путь между вершинами \(5\) и \(6\). Его любимое число будет равно \(7\), а потому он помнит значение \(1\) (так как в двоичном представлении \(7\) нечетное количество битов \(1\)).
- Четвертый эльф рассматривает путь между вершинами \(6\) и \(1\). Его любимое число будет равно \(1\), а потому он помнит значение \(1\) (так как в двоичном представлении \(1\) нечетное количество битов \(1\)).
- Пятый эльф рассматривает путь между вершинами \(4\) и \(5\). Его любимое число будет равно \(4\), а потому он помнит значение \(1\) (так как в двоичном представлении \(4\) нечетное количество битов \(1\)).
Заметим, что существуют и другие возможные ответы.
| |
|
|
G. Торговая задача
жадные алгоритмы
снм
сортировки
Структуры данных
*2200
Монокарп играет в компьютерную игру (ага, опять). В этой игре довольно нестандартно реализована механика торговли. Чтобы поторговать с кем-то из персонажей игры, Монокарп должен выбрать какую-то свою вещь и обменять ее на вещь того персонажа, с которым он торгует. У каждой вещи есть целочисленная цена. Если у Монокарпа есть вещь с ценой \(x\), он может обменять ее на вещь (ровно одну) с ценой не более \(x+k\). Изначально у Монокарпа есть \(n\) вещей, цена \(i\)-й из них равна \(a_i\). У персонажа, с которым Монокарп торгует, изначально есть \(m\) вещей, цена \(i\)-й из них равна \(b_i\). Монокарп может поторговать с этим персонажем столько раз, сколько захочет (возможно, ноль), каждый раз меняя одну из своих вещей на вещь, принадлежащую персонажу, по описанным ранее правилам. Обратите внимание, что если Монокарп получает какую-то вещь в результате обмена, он потом может ее обменять на другую вещь (так как это теперь его вещь); и наоборот, если Монокарп отдал свою вещь в процессе обмена, он может получить ее обратно, обменяв на нее что-то еще. Вы должны ответить на \(q\) запросов. В каждом запросе вам подается одно целое число, которое соответствует значению \(k\). Чтобы ответить на запрос, вы должны посчитать максимально возможную суммарную стоимость вещей, которые могут оказаться у Монокарпа (при условии, что вещь стоимости \(x\) можно обменивать на вещь стоимости не более \(x+k\)). Обратите внимание, что запросы независимые: Монокарп на самом деле не обменивает вещи, он просто хочет оценить максимально возможную суммарную цену вещей. Выходные данные Для каждого запроса выведите одно целое число — максимально возможную суммарную цену вещей, которые могут оказаться у Монокарпа при заданном значении \(k\) для запроса.
| |
|
|
G. Необычный сапёр
Бинарный поиск
жадные алгоритмы
поиск в глубину и подобное
снм
сортировки
*2000
Поликарп очень любит играть в игру сапёр. Недавно он нашёл похожую игру и там такие правила. На поле находятся мины, для каждой известны координаты её местоположения (\(x_i, y_i\)). Каждая мина имеет время жизни в секундах, после которого она взорвётся. После взрыва мина также детонирует все мины по вертикали и горизонтали на расстоянии \(k\) (две перпендикулярные линии). В итоге получаем взрыв на поле в виде символа «плюс» ('+'). Таким образом, один взрыв может вызвать новые взрывы, а новые взрывы — следующие и так далее. Также Поликарп может сам взорвать одну любую мину в каждую секунду, начиная с нулевой. После этого также проходит цепная реакция взрывов. Мины взрываются моментально и также моментально детонируют другие мины по написанным выше правилам. Поликарп хочет установить новый рекорд и просит вас помочь ему рассчитать, за какое минимальное количество секунд можно взорвать все мины. Выходные данные Выведите \(t\) строк, каждая из строк должна содержать ответ на соответствующий набор входных данных — минимальное количество секунд, за которое можно взорвать все мины. Примечание Первый набор входных данных примера. Первый пример: - Секунда \(0\): взрываем мину в клетке \((2, 2)\) она никого не задевает так как \(k=0\).
- Секунда \(1\): взрываем мину в клетке \((0, 1)\), а мина в клетке \((0, 0)\) взрывается сама.
- Секунда \(2\): взрываем мину в клетке \((1, 1)\), а мина в клетке \((1, 0)\) взрывается сама.
Второй пример: - Секунда \(0\): взрываем мину в клетке \((2, 2)\) получаем:
- Секунда \(1\): взрывается мина в клетке \((0, 0)\) и так как \(k=2\) взрыв задевает мины в клетках \((0, 1)\) и \((1, 0)\), а их взрывы задевают мину в клетке \((1, 1)\) и на поле не остаётся мин.
| |
|
|
A. Равно или не равно
Конструктив
реализация
снм
*800
У вас были \(n\) положительных целых чисел \(a_1, a_2, \dots, a_n\), записанных по кругу. Для каждой пары соседних элементов (\(a_1\) и \(a_2\), \(a_2\) и \(a_3\), ..., \(a_{n - 1}\) и \(a_n\), и \(a_n\) и \(a_1\)) вы выписали следующее: равны ли элементы в паре или нет. К сожалению, вы потеряли бумажку с записанным массивом \(a\). Более того, вы боитесь, что и информация о равенстве соседних элементов могла быть повреждена. А потому вас интересует: существует ли массив \(a\), который согласовывается с вашей информацией о равенстве (или неравенстве) соседних элементов? Выходные данные Для каждого набора входных данных, выведите YES, если возможно подобрать массив \(a\), который согласуется с вашей информацией из строки \(s\). Иначе, выведите NO. Можно доказать, что если существует какой-то подходящий массив \(a\), то существует также массив \(a\) из положительных целых чисел меньше или равных \(10^9\). Примечание В первом наборе входных данных, вы можете выбрать, например, \(a_1 = a_2 = a_3 = 5\). Во втором наборе, не существует подходящего массива \(a\), так как, согласно \(s_1\), \(a_1\) равно \(a_2\), но, согласно \(s_2\), \(a_2\) не равно \(a_1\). В третьем наборе, вы можете, например, выбрать массив \(a = [20, 20, 4, 50, 50, 50, 20]\). Во четвертом наборе, вы можете, например, выбрать массив \(a = [1, 3, 3, 7]\).
| |
|
|
E. Замена чисел
Конструктив
реализация
снм
Структуры данных
*1900
У вас есть массив целых чисел (изначально пустой). Вам предстоит выполнить \(q\) запросов. Каждый запрос имеет один из двух типов: - «\(1\) \(x\)» — добавить элемент \(x\) в конец массива;
- «\(2\) \(x\) \(y\)» — заменить все вхождения \(x\) в массиве на \(y\).
Найдите массив, получившийся после выполнения всех запросов. Выходные данные В единственную строку выведите \(k\) целых чисел — массив, получившийся после выполнения всех запросов, где \(k\) — количество запросов первого типа. Примечание В первом примере из условия массив меняется следующим образом: \([]\) \(\rightarrow\) \([3]\) \(\rightarrow\) \([3, 1]\) \(\rightarrow\) \([3, 2]\) \(\rightarrow\) \([3, 2, 2]\) \(\rightarrow\) \([3, 2, 2, 1]\) \(\rightarrow\) \([3, 2, 2, 1, 2]\) \(\rightarrow\) \([3, 2, 2, 3, 2]\). Во втором примере из условия массив меняется следующим образом: \([]\) \(\rightarrow\) \([1]\) \(\rightarrow\) \([1, 2]\) \(\rightarrow\) \([1, 2, 1]\) \(\rightarrow\) \([1, 2, 1]\). В третьем примере из условия массив меняется следующим образом: \([]\) \(\rightarrow\) \([]\) \(\rightarrow\) \([1]\) \(\rightarrow\) \([1, 4]\) \(\rightarrow\) \([1, 4, 2]\) \(\rightarrow\) \([1, 4, 4]\) \(\rightarrow\) \([1, 3, 3]\) \(\rightarrow\) \([1, 3, 3, 2]\) \(\rightarrow\) \([1, 3, 3, 7]\).
| |
|
|
G. Дерево минимального ора
битмаски
графы
жадные алгоритмы
поиск в глубину и подобное
снм
*1900
В последнее время Влад увлёкся остовными деревьями, так что его друзья не долго думая подарили ему на день рождения связный взвешенный неориентированный граф из \(n\) вершин и \(m\) рёбер. Влад определил орность остовного дерева как побитовое ИЛИ всех его весов и теперь его интересует, какова минимальная возможная орность, которой можно добиться, выбрав некоторое остовное дерево. Остовное дерево — связный подграф данного графа, не содержащий циклов. Иными словами вы хотите оставить \(n-1\) ребро, так чтобы граф остался связным и побитовое ИЛИ весов рёбер было как можно меньше. Вы должны найти само побитовое ИЛИ. Выходные данные Выведите \(t\) строк, каждая из которых содержит ответ на соответствующий набор входных данных — минимальную возможную орность остовного дерева.
| |
|
|
E. Метеоритный город
Бинарный поиск
Деревья
снм
Структуры данных
*3100
Mihai живет в городе, где часто случаются метеоритные бури. Это раздражает, потому что Mihai иногда приходится покупать продукты, а попасть под метеориты крайне не весело. Поэтому мы просим вас найти самый опасный способ купить продукты, чтобы мы могли обманом заставить Mihai пойти туда. В городе есть \(n\) зданий с номерами от \(1\) до \(n\). Между некоторыми зданиями есть дороги, и существует ровно \(1\) простой путь от любого здания к любому другому. Каждая дорога имеет определенный уровень метеоритной опасности. Во всех зданиях есть продуктовые магазины, но Mihai, конечно, интересуют только открытые магазины. Изначально все продуктовые магазины закрыты. Вам задано \(q\) запросов трех типов: - Учитывая целые числа \(l\) и \(r\), в зданиях с номерами от \(l\) до \(r\) открываются продуктовые магазины (ничего не происходит со зданиями, в которых уже открыт продуктовый магазин).
- Учитывая целые числа \(l\) и \(r\), здания с номерами от \(l\) до \(r\) закрывают свои продуктовые магазины (ничего не происходит со зданиями, в которых уже закрыт продуктовый магазин).
- Учитывая целое число \(x\), найдите максимальный уровень метеоритной опасности на простом пути от \(x\) до любого открытого продуктового магазина или \(-1\), если нет ни одной дороги на любом простом пути к любому открытому магазину.
Выходные данные Для каждого запроса типа \(3\) (\(t_j = 3\)) выведите максимальный уровень метеоритной опасности, который находится на некотором простом пути от \(x_j\) до некоторого открытого магазина, или \(-1\), если нет ни одной дороги на любом простом пути к любому открытому магазину. Примечание 
Это иллюстрация города, представленного во входных данных примера. В первом запросе открытых магазинов нет, поэтому очевидно, что нет ребер на простом пути от \(1\) до любого открытого магазина, поэтому ответ \(-1\). После второго и третьего запросов набор открытых магазинов равен \(\{1\}\). Простой путь от \(1\) до \(1\) не имеет ребер, поэтому ответ для запроса \(3\) равен \(-1\). После четвертого запроса открытых магазинов нет. После пятого и шестого запросов набор открытых магазинов равен \(\{5, 6\}\). В шестом запросе есть два пути от \(x_j = 4\) до некоторого открытого продуктового магазина: От \(4\) до \(5\) и от \(4\) до \(6\). Самая большая метеоритная опасность находится на пути от \(4\) до \(6\), так что ответ на запрос \(6\) будет \(4\). На рисунке этот путь отмечен красным. После остальных запросов набор открытых магазинов равен \(\{5\}\). В восьмом запросе единственный путь от \(x_j = 4\) к открытому магазину от \(4\) до \(5\), а максимальная метеоритная опасность на этом пути составляет \(3\). На рисунке этот путь отмечен зеленым. В девятом запросе единственный путь от \(x_j = 1\) к открытому магазину от \(1\) до \(5\), а максимальная метеоритная опасность на этом пути равна \(5\). На рисунке этот путь отмечен синим цветом.
| |
|
|
E. Запросы об остовном дереве
Бинарный поиск
графы
Деревья
жадные алгоритмы
математика
поиск в глубину и подобное
снм
сортировки
Структуры данных
*2400
Задан связный взвешенный неориентированный граф, состоящий из \(n\) вершин и \(m\) ребер. К нему задаются \(k\) запросов. Каждый запрос состоит из одного целого числа \(x\). На каждый запрос вы должны выбрать остовное дерево в графе. Пусть веса его ребер будут \(w_1, w_2, \dots, w_{n-1}\). Стоимость остовного дерева равна \(\sum \limits_{i=1}^{n-1} |w_i - x|\) (сумма абсолютных разностей между весами и \(x\)). Ответ на запрос — это минимальная стоимость остовного дерева. Запросы даны в сжатом формате. Первые \(p\) \((1 \le p \le k)\) запросов \(q_1, q_2, \dots, q_p\) даны явно. Для запросов с \(p+1\) по \(k\) выполняется \(q_j = (q_{j-1} \cdot a + b) \mod c\). Выведите исключающее или ответов на все запросы. Выходные данные Выведите одно целое число — исключающее или ответов на все запросы. Примечание Запросы в первом примере: \(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0\). Ответы: \(11, 9, 7, 3, 1, 5, 8, 7, 5, 7, 11\). Запросы во втором примере: \(3, 0, 2, 1, 6, 0, 3, 5, 4, 1\). Ответы: \(14, 19, 15, 16, 11, 19, 14, 12, 13, 16\). Запросы в третьем примере: \(75, 0, 0, \dots\). Ответы: \(50, 150, 150, \dots\).
| |
|
|
E. Автомобили
2-sat
графы
жадные алгоритмы
Конструктив
поиск в глубину и подобное
снм
сортировки
*2200
На координатной оси \(OX\) стоят \(n\) автомобилей. Каждая машина изначально находится в целочисленной точке, и никакие две машины не находятся в одной и той же точке. Кроме того, каждая машина ориентирована либо влево, либо вправо, и в любой момент они могут двигаться с любой постоянной положительной скоростью в этом направлении. Более формально мы можем описать \(i\)-й автомобиль буквой и целым числом: его ориентацию \(ori_i\) и его местоположение \(x_i\). Если \(ori_i = L\), то \(x_i\) убывает со временем. Точно так же, если \(ori_i = R\), то \(x_i\) увеличивается со временем. Мы называем две машины нерелевантными, если они никогда не оказываются в одной и той же точке независимо от их скорости. Другими словами, они не будут иметь одну и ту же координату в любой момент. Мы называем два автомобиля предназначенными, если они когда-нибудь окажутся в одной и той же точке независимо от их скорости. К сожалению, мы потеряли всю информацию о наших машинах, но мы помним \(m\) отношений между ними. Существует два типа отношений: \(1\) \(i\) \(j\) —\(i\)-й автомобиль и \(j\)-й автомобиль нерелевантные. \(2\) \(i\) \(j\) —\(i\)-й автомобиль и \(j\)-й автомобиль предназначенные. Восстановите ориентации и местоположения автомобилей, удовлетворяющих отношениям, или сообщите, что это невозможно. Если решений несколько, можно вывести любое. Обратите внимание на то, что если два автомобиля окажутся в одной точке, то они продолжат свое движение. Выходные данные В первой строке выведите «YES», если можно восстановить ориентации и положения автомобилей, удовлетворяющих отношениям, и «NO» в противном случае. Если ответ «YES», выведите \(n\) строк, каждая из которых содержит символ и целое число: \(ori_i\) и \(x_i\) \((ori_i \in \{L, R\}; -10^9 \leq x_i \leq 10^9)\) — представляет информацию о \(i\)-м автомобиле. Если ориентация налево, то \(ori_i\) = \(L\). В противном случае \(ori_i\) = \(R\). \(x_i\) — координата, где находится \(i\)-й автомобиль. Обратите внимание, что все \(x_i\) должны быть различными. Мы можем доказать, что если существует решение, то должно быть и решение, удовлетворяющее ограничениям на \(x_i\).
| |
|
|
C. Граф инверсий
графы
математика
снм
Структуры данных
*1300
Вам дана перестановка \(p_1, p_2, \dots, p_n\). Затем вы строите неориентированный граф следующим образом: добавляется ребро между вершинами \(i\), \(j\) такими, что \(i < j\) тогда и только тогда, когда \(p_i > p_j\). Вам нужно посчитать количество компонент связности в этом графе. Две вершины \(u\) и \(v\) принадлежат одной компоненте связности тогда и только тогда, когда существует хотя бы один путь по рёбрам графа, соединяющий \(u\) и \(v\). Перестановкой называется массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) является перестановкой, но \([1,2,2]\) не является перестановкой (\(2\) встречается дважды в массиве) и \([1,3,4]\) тоже не является перестановкой (\(n=3\), но \(4\) присутствует в массиве). Выходные данные Для каждого набора входных данных выведите одно целое число \(k\) — количество компонент связности. Примечание Каждый отдельный набор входных данных изображен на картинке ниже. Цветные квадраты представляют собой элементы перестановки. Для одной перестановки каждый цвет представляет некоторую компоненту связности. Ответом является количество различных цветов.
| |
|
|
C. Анонимность наше все
Бинарный поиск
жадные алгоритмы
Перебор
снм
сортировки
Структуры данных
*2200
В работе врача важно сохранять анонимность своих клиентов и результатов анализов. Результаты теста отправляются каждому лично по электронной почте, но люди очень нетерпеливые и им хочется узнавать результаты сразу. Именно поэтому в одном центре для сдачи анализов «Девитро» придумали экспериментальный способ сообщать результаты. Пусть всего анализы сдавало \(n\) человек в порядке очереди. Тогда главврач Стас может сделать несколько сообщений, в каждом из которых сообщить, был ли больной человек среди людей в очереди от \(l\)-го до \(r\)-го (включительно) для некоторых значений \(l\) и \(r\). В процессе Стас будет проверять, насколько хорошо работает эта схема, и будет интересоваться, можно ли однозначно узнать результат анализа \(i\)-го человека по уже сообщенной информации. И если это сделать можно, то болен ли этот человек. Помогите Стасу протестировать свою схему. Выходные данные После каждого вопроса Стаса (запроса с \(t = 1\)) выведите: - «NO», если пациент однозначно не болен,
- «YES», если пациент однозначно болен,
- «N/A», если по имеющейся информации нельзя однозначно сказать, болен пациент или нет.
Примечание В первом тесте для первых пяти запросов: - Изначально Стас сообщает, что среди \(4\), \(5\) людей нет больных.
- В следующем запросе Стас интересуется конфиденциальностью человека \(5\). Из предыдущего запроса мы знаем, что он однозначно не болен.
- В следующем запросе Стас интересуется конфиденциальностью человека \(6\). Мы не знаем про него вообще никакой информации, поэтому он может быть как болен, так и не болен.
- Затем Стас сообщает, что среди \(4\), \(5\), \(6\) людей есть больной.
- В следующем запросе Стас интересуется конфиденциальностью человека \(6\). Теперь мы можем однозначно сказать, что он болен, потому что из предыдущего запроса среди трех человек болен мог быть только он.
| |
|
|
E. Авиареформа
графы
Деревья
поиск в глубину и подобное
разделяй и властвуй
реализация
снм
Структуры данных
*3200
Берляндия — большая страна с развитой системой авиасообщения. Всего в стране есть \(n\) городов, которые исторически обслуживаются авиакомпанией Берляфлот. Авиакомпания выполняет двухсторонние рейсы между \(m\) парами городов, \(i\)-й из них соединяет города с номерами \(a_i\) и \(b_i\) и имеет цену \(c_i\) на перелёт в каждую из сторон. Известно, что с помощью рейсов Берляфлота можно добраться от любого города до любого другого (возможно, с пересадками), а стоимость любого маршрута из нескольких стыковочных рейсов Берляфлота равна стоимости самого дорогого из них. Более формально, стоимость маршрута из города \(t_1\) в город \(t_k\) с \((k-2)\)-мя пересадками в городах \(t_2,\ t_3,\ t_4,\ \ldots,\ t_{k - 1}\) равна максимуму из стоимостей рейсов из города \(t_1\) в \(t_2\), из \(t_2\) в \(t_3\), из \(t_3\) в \(t_4\) и так далее до рейса из \(t_{k - 1}\) в \(t_k\). Разумеется, все эти рейсы должны выполняться авиакомпанией Берляфлот. Недавно в Берляндии начала работать новая авиакомпания S8 Airlines. Эта авиакомпания совершает двусторонние рейсы между всеми парами городов, между которыми нет рейсов Берляфлота. Таким образом, между каждой парой городов есть рейс либо Берляфлота, либо S8 Airlines. Стоимости рейсов авиакомпании S8 Airlines рассчитываются следующим образом: для каждой пары городов \(x\) и \(y\), между которыми выполняется рейс S8 Airlines, стоимость этого рейса равняется минимальной стоимости маршрута между городами \(x\) и \(y\) у Берляфлота в соответствии с описанным ранее ценообразованием. Известно, что с помощью рейсов S8 Airlines можно добраться от любого города до любого другого с возможными пересадками, и, аналогично Берляфлоту, стоимость маршрута между любыми двумя городами стыковочными рейсами S8 Airlines равна стоимости самого дорогого рейса в этом маршруте. Из-за увеличившейся конкуренции с S8 Airlines Берляфлот решил провести авиареформу и изменить стоимости своих рейсов. А именно, для \(i\)-го своего рейса между городами \(a_i\) и \(b_i\) Берляфлот хочет сделать стоимость этого рейса равной минимальной стоимости маршрута между городами \(a_i\) и \(b_i\) у авиакомпании S8 Airlines. Помогите менеджерам Берляфлота рассчитать новые стоимости рейсов. Выходные данные Для каждого набора входных данных в отдельной строке выведите \(m\) целых чисел, \(i\)-е из которых должно быть равно стоимости \(i\)-го рейса Берляфлота после авиареформы. Примечание В примере в первом наборе входных данных авиакомпания S8 Airlines будет выполнять рейсы между парами городов: \((1, 3)\), \((1, 4)\) и \((2, 4)\). Стоимость рейса между городами \(1\) и \(3\) будет равна \(2\), так как минимальная стоимость маршрута Берляфлота равна \(2\) — маршрут состоит из рейса между городами \(1\) и \(2\) стоимостью \(1\) и рейса между городами \(2\) и \(3\) стоимостью \(2\), максимум из стоимостей равен \(2\). Стоимость рейса между городами \(1\) и \(4\) будет равна \(3\), так как минимальная стоимость маршрута Берляфлота составляет \(3\) — маршрут состоит из рейса между городами \(1\) и \(2\) стоимостью \(1\), рейса между городами \(2\) и \(3\) стоимостью \(2\) и рейса между городами \(3\) и \(4\) стоимостью \(3\), максимум из стоимостей равен \(3\). Стоимость рейса между городами \(2\) и \(4\) будет равна \(3\), так как минимальная стоимость маршрута Берляфлота составляет \(3\) — маршрут состоит из рейса между городами \(2\) и \(3\) стоимостью \(2\) и рейса между городами \(3\) и \(4\) стоимостью \(3\), максимум из стоимостей равен \(3\). После авиареформы стоимость рейса Берляфлота между городами \(1\) и \(2\) будет составлять \(3\), так как минимальная стоимость маршрута S8 Airlines между этими городами составляет \(3\) — маршрут состоит из рейса между городами \(1\) и \(4\) стоимостью \(3\) и рейса между городами \(2\) и \(4\) стоимостью \(3\), максимум равен \(3\). Стоимость рейса Берляфлота между городами \(2\) и \(3\) будет составлять \(3\), так как минимальная стоимость маршрута S8 Airlines между этими городами составляет \(3\) — маршрут состоит из рейса между городами \(2\) и \(4\) стоимостью \(3\), рейса между городами \(1\) и \(4\) стоимостью \(3\) и рейса между \(1\) и \(3\) стоимостью \(2\), максимум равен \(3\). Стоимость рейса Берляфлота между городами \(3\) и \(4\) будет составлять \(3\), так как минимальная стоимость маршрута S8 Airlines между этими городами составляет \(3\) — маршрут состоит из рейса между городами \(1\) и \(3\) стоимостью \(2\) и рейса между городами \(1\) и \(4\) стоимостью \(3\), максимум равен \(3\). Во втором наборе входных данных у авиакомпании S8 Airlines будут следующие рейсы: между городами \(1\) и \(4\) стоимостью \(1\), между городами \(2\) и \(3\) стоимостью \(1\), между городами \(2\) и \(5\) стоимостью \(2\), между городами \(3\) и \(4\) стоимостью \(1\) и между городами \(3\) и \(5\) стоимостью \(2\).
| |
|
|
D. Граф-борода
Деревья
снм
Структуры данных
*2100
Назовем неориентированный связный граф из n вершин и n - 1 ребра бородой, если в нем все вершины кроме, возможно, одной имеют степень 2 или 1 (то есть в нем существует не более одной вершины, степень которой более двух). Напомним, что степень вершины — это количество инцидентных ей ребер. Пусть каждое ребро имеет либо черный цвет, либо белый, изначально все ребра имеют черный цвет. Вам дано описание графа-бороды. Ваша задача — обрабатывать запросы следующих типов: - покрасить в черный цвет ребро, которое в описании имеет номер i (гарантируется, что к моменту этого запроса i-ое ребро имеет белый цвет)
- покрасить в белый цвет ребро, которое в описании имеет номер i (гарантируется, что к моменту этого запроса i-ое ребро имеет черный цвет)
- найти длину кратчайшего пути только по черным ребрам между вершинами a и b или указать, что не существует такого пути между ними (длина пути — это количество ребер в нем)
Вершины пронумерованы целыми числами от 1 до n, а ребра — целыми числами от 1 до n - 1. Выходные данные Для каждого запроса «найти расстояние между вершинами a и b» выведите результат. Если данные вершины на момент запроса недостижимы друг из друга по черным ребрам, то выведите «-1» (без кавычек). Результаты выводите в порядке поступления запросов, числа разделяйте пробелами или переводами строк. Примечание В первом примере вершины 1 и 2 связаны ребром номер 1, а вершины 2 и 3 — ребром номер 2. До перекраски ребра номер 2 каждая вершина достижима из каждой по черным ребрам, в частности, кратчайший путь между 1 и 3 проходит через оба ребра. Если перекрасить ребро номер 2 в белый цвет, то вершина 3 оказывается отрезанной от остальных, то есть из нее не существует пути по черным ребрам ни в какую другую вершину.
| |
|
|
F. Слова на дереве
2-sat
графы
Деревья
поиск в глубину и подобное
снм
*2600
Дано дерево из \(n\) вершин, а также \(q\) троек \((x_i, y_i, s_i)\), где \(x_i\) и \(y_i\) — целые числа от \(1\) до \(n\), а \(s_i\) — строка, длина которой равна количеству вершин на простом пути от \(x_i\) до \(y_i\). Вы должны написать на каждой вершине строчную латинскую букву таким образом, что для каждой из \(q\) троек выполняется хотя бы одно из условий: - если выписать буквы на пути от \(x_i\) до \(y_i\) в том порядке, в котором они встречаются на пути, вы получите строку \(s_i\);
- если выписать буквы на пути от \(y_i\) до \(x_i\) в том порядке, в котором они встречаются на пути, вы получите строку \(s_i\).
Найдите любой способ написать по одной букве на каждую вершину, чтобы соблюсти ограничения, или сообщите, что это невозможно. Выходные данные Если нет способа удовлетворить ограничения задачи, выведите NO. Иначе выведите YES в первой строке и \(n\) строчных латинских букв во второй строке; \(i\)-я буква должна соответствовать той букве, которую вы пишете на \(i\)-й вершине. Если ответов несколько, выведите любой из них.
| |
|
|
E. AND-MEX-прогулка
битмаски
графы
Конструктив
Перебор
поиск в глубину и подобное
снм
*2200
Вам дан неориентированный связный граф из \(n\) вершин и \(m\) взвешенных ребер. Прогулкой от вершины \(u\) до вершины \(v\) называется последовательность вершин \(p_1,p_2,\ldots,p_k\) (не обязательно различных), начинающаяся в вершине \(u\) и заканчивающаяся в вершине \(v\), такая что \(p_i\) и \(p_{i+1}\) соединены ребром для всех \(1 \leq i < k\). Определим длину прогулки следующим образом: выпишем веса ребер в порядке следования в массив. Затем выпишем побитовое И каждого непустого префикса этого массива. Длиной прогулки называется MEX этих значений. Более формально, пусть веса ребер это \([w_1,w_2,\ldots,w_{k-1}]\), где \(w_i\) — вес ребра между \(p_i\) и \(p_{i+1}\). Тогда длина прогулки равна \(\mathrm{MEX}(\{w_1,\,w_1\& w_2,\,\ldots,\,w_1\& w_2\& \ldots\& w_{k-1}\})\), где \(\&\) обозначает операцию побитового И. Вы должны обработать \(q\) запросов вида u v. Для каждого запроса найдите минимально возможную длину пути из \(u\) в \(v\). MEX (минимальное отсутствующее) множества чисел — наименьшее неотрицательное число, отсутствующее в этом множестве. Например: - MEX множества \(\{2,1\}\) равен \(0\), т. к. \(0\) отсутствует в множестве.
- MEX множества \(\{3,1,0\}\) равен \(2\), т. к. \(0\) и \(1\) присутствуют в множестве, а \(2\) — нет.
- MEX множества \(\{0,3,1,2\}\) равен \(4\), т. к. \(0\), \(1\), \(2\) и \(3\) присутствуют в множестве, а \(4\) отсутствует.
Выходные данные Для каждого запроса выведите одно целое число — ответ на запрос. Примечание Ниже находится пояснение к первому примеру. Граф из первого примера. Идна из возможных прогулок в первом запросе: \(\)1 \overset{5}{\rightarrow} 3 \overset{3}{\rightarrow} 2 \overset{1}{\rightarrow} 1 \overset{5}{\rightarrow} 3 \overset{1}{\rightarrow} 4 \overset{2}{\rightarrow} 5.\(\) Массив весов равен \(w=[5,3,1,5,1,2]\). Если мы возьмем побитовое И для всех префиксов, мы получим множество \(\{5,1,0\}\). MEX этого множества равен \(2\). Нельзя получить прогулку меньшей длины.
| |
|
|
E. Узкие компоненты
Деревья
дп
математика
Перебор
снм
Структуры данных
*2500
Задана матрица \(a\), состоящая из \(3\) строк и \(n\) столбцов. Каждая клетка матрицы либо свободна, либо занята. Свободная клетка \(y\) достижима из свободной клетки \(x\), если выполняется хотя бы одно из следующих условий: - \(x\) и \(y\) имеют общую сторону;
- существует такая свободная клетка \(z\), что \(z\) достижима из \(x\), а \(y\) достижима из \(z\).
Компонента связности — это такой набор свободных клеток матрицы, что все клетки в нем достижимы друг из друга, а добавление любой другой свободной клетки в него нарушает это правило. К матрице задаются \(q\) запросов. Запросы следующего вида: - \(l\) \(r\) — посчитайте количество компонент связности матрицы, состоящей из столбцов с \(l\) по \(r\) матрицы \(a\) включительно.
Выведите ответы на все запросы. Выходные данные Выведите \(q\) целых чисел — \(j\)-е значение должно быть равно количеству компонент связности матрицы, состоящей из столбцов с \(l_j\) по \(r_j\) матрицы \(a\) включительно.
| |
|
|
C. Где пицца?
графы
математика
поиск в глубину и подобное
реализация
снм
Структуры данных
*1400
Хоссам в попытках найти пиццу наткнулся на две перестановки \(a\) и \(b\) длины \(n\). Вспомним, что перестановкой называется массив из \(n\) различных чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, а \([1,2,2]\) — не перестановка (\(2\) встречается дважды), и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве есть число \(4\)). Хоссам позабыл про пиццу и начал играть с этими перестановками. В процессе игры некоторые элементы первой перестановки смешались с элементами второй, но к удивлению Хоссама в итоге получилась тоже перестановка длины \(n\). Более конкретно, он смешал перестановки, получив массив \(c\) следующим образом. - Для всех \(i\) (\(1\le i\le n\)), он сделал \(c_i=a_i\) или \(c_i=b_i\).
- Массив \(c\) является перестановкой.
Вы знаете две перестановки \(a\) и \(b\) и значения на некоторых позициях в \(c\). Пожалуйста, посчитайте количество различных перестановок \(c\), не противоречащих описанному процессу и известным значениям. Так как ответ может быть большим, выведите его по модулю \(10^9+7\). Гарантируется, что существует хотя бы одна перестановка \(c\), удовлетворяющая всем ограничениям. Выходные данные Для каждого набора входных данных выведите количество различных перестановок \(c\) по модулю \(10^9+7\). Примечание В первом наборе входных данных подходят \(4\) перестановки: \([2,3,1,4,5,6,7]\), \([2,3,1,7,6,5,4]\), \([2,3,1,4,6,5,7]\), \([2,3,1,7,5,6,4]\). Во втором наборе входных данных подходит только одна перестановка: \([1]\). В третьем наборе входных данных подходят \(2\) перестановки: \([6,5,2,1,4,3]\), \([6,5,3,1,4,2]\). В четвертом наборе входных данных подходят \(2\) перестановки: \([1,2,8,7,4,3,6,5]\), \([1,6,4,7,2,3,8,5]\). В пятом наборе входных данных подходит только одна перестановка: \([1,9,2,3,4,10,8,6,7,5]\).
| |
|
|
E. Прямой обход
Деревья
дп
Комбинаторика
разделяй и властвуй
снм
сортировки
хэши
*2100
Дано корневое дерево из \(2^n - 1\) вершин. У каждой вершины дерева либо \(0\) сыновей, либо \(2\). Все листья дерева расположены на одинаковой глубине, а у каждой внутренней вершины один из сыновей является левым, а другой — правым. Формально, вам задано совершенное бинарное дерево. Вершины дерева пронумерованы следующим образом: - номер корня — \(1\);
- если номер внутренней вершины — \(x\), то номер ее левого сына — \(2x\), а номер правого сына — \(2x+1\).
На каждой вершине дерева записана буква A или буква B. Пусть буква на вершине \(x\) — это \(s_x\). Назовем строкой прямого обхода вершины \(x\) строку, которая строится по следующим правилам: - если вершина \(x\) — лист, то строка прямого обхода \(x\) состоит из одного символа \(s_x\);
- в противном случае строка прямого обхода \(x\) равна \(s_x + f(l_x) + f(r_x)\), где \(+\) обозначает конкатенацию строк, \(f(l_x)\) — строка прямого обхода левого сына \(x\), а \(f(r_x)\) — строка прямого обхода правого сына \(x\).
Строка прямого обхода всего дерева — это строка прямого обхода его корня. А теперь — сама задача. Вы должны посчитать количество различных строк, которые могут быть получены как строка прямого обхода заданного дерева, если до построения строки прямого обхода можно применить следующую операцию любое количество раз: - выбрать любую вершину \(x\), не являющуюся листом, и поменять местами ее детей (то есть левый сын становится правым, и наоборот).
Выходные данные Выведите одно целое число — количество различных строк, которые можно получить в качестве строки прямого обхода дерева, если можно применить любое количество описанных в условии операций. Ответ может быть очень большим, поэтому выведите его по модулю \(998244353\).
| |
|
|
E. Замени на предыдущий, минимизируй
жадные алгоритмы
снм
Строки
*1500
Дана строка \(s\), состоящая из строчных латинских букв. Можно применять следующую операцию: - выбрать один символ (от 'a' до 'z'), который хотя бы один раз встречается в строке. И все такие символы в строке заменить на предыдущий в алфавитном порядке по циклу. Например, все 'c' заменить на 'b' или все 'a' заменить на 'z'.
Задано число \(k\) — максимальное количество операций, которое можно совершить. Найдите минимальную лексикографически строку, которую можно получить, совершив не более \(k\) операций. Строка \(a=a_1a_2 \dots a_n\) лексикографически меньше строки \(b = b_1b_2 \dots b_n\), если существует такой индекс \(k\) (\(1 \le k \le n\)), что \(a_1=b_1\), \(a_2=b_2\), ..., \(a_{k-1}=b_{k-1}\), но \(a_k < b_k\). Выходные данные Для каждого набора входных данных выведите лексикографически минимальную строку, которую можно получить из строки \(s\), применив не более чем \(k\) операций.
| |
|
|
F. Свободное вершинное покрытие
графы
Деревья
поиск в глубину и подобное
разделяй и властвуй
снм
*2600
Дан простой связный неориентированный граф, состоящий из \(n\) вершин и \(m\) ребер. Вершины пронумерованы от \(1\) до \(n\). Вершинное покрытие графа — это такой набор вершин, что у каждого ребра есть хотя бы один конец в наборе. Назовем свободным вершинным покрытием такое вершинное покрытие, что не более одного ребра имеет оба конца в наборе. Найдите свободное вершинное покрытие графа или сообщите, что его нет. Если существует несколько ответов, то выведите любой из них. Выходные данные На каждый набор входных данных в первой строке выведите YES, если свободное вершинное покрытие существует и NO, если нет. Если оно существует, то во второй строке выведите бинарную строку \(s\) длины \(n\), где \(s_i = 1\) означает, что \(i\)-я вершина в вершинном покрытии, а \(s_i = 0\) означает, что \(i\)-я вершина не в нем. Если существует несколько ответов, то выведите любой из них. Примечание Здесь изображены графы из первого примера. Вершины в свободном вершинном покрытии помечены красным.
| |
|
|
F. Уникальные вхождения
Деревья
дп
поиск в глубину и подобное
разделяй и властвуй
снм
Структуры данных
*2300
Задано дерево, состоящее из \(n\) вершин. На каждом ребре написано целое число. Пусть \(f(v, u)\) будет равно количеству значений, которые встречаются ровно один раз на ребрах на простом пути между \(v\) и \(u\). Посчитайте сумму \(f(v, u)\) по всем парам вершин \(v\) и \(u\), для которых \(1 \le v < u \le n\). Выходные данные Выведите одно целое число — сумму \(f(v, u)\) по всем парам вершин \(v\) и \(u\) таким, что \(v < u\).
| |
|
|
D1. Вес перестановки (простая версия)
Конструктив
поиск в глубину и подобное
снм
*2800
Это простая версия задачи. Разница между простой и сложной версиями в том, что в этой версии вы можете вывести любую перестановку с наименьшим весом. Вам дана перестановка \(p_1, p_2, \ldots, p_n\) целых чисел от \(1\) до \(n\). Определим вес перестановки \(q_1, q_2, \ldots, q_n\) целых чисел от \(1\) до \(n\) как \(\)|q_1 - p_{q_{2}}| + |q_2 - p_{q_{3}}| + \ldots + |q_{n-1} - p_{q_{n}}| + |q_n - p_{q_{1}}|\(\) Вы хотите, чтобы ваша перестановка была настолько легкой, насколько это возможно. Найдите любую перестановку \(q\) с наименьшим возможным весом. Выходные данные Для каждого набора входных данных выведите \(n\) целых чисел \(q_1, q_2, \ldots, q_n\) (\(1 \le q_i \le n\), все \(q_i\) различны) — одну из перестановок с наименьшим весом. Примечание В первом наборе входных данных есть две перестановки длины \(2\): \((1, 2)\) и \((2, 1)\). Перестановка \((1, 2)\) имеет вес \(|1 - p_2| + |2 - p_1| = 0\), а перестановка \((2, 1)\) имеет тот же вес: \(|2 - p_1| + |1 - p_2| = 0\). В этой версии мы можем вывести любую из этих перестановок. Во втором наборе входных данных вес перестановки \((1, 3, 4, 2)\) равен \(|1 - p_3| + |3 - p_4| + |4 - p_2| + |2 - p_1| = |1 - 1| + |3 - 4| + |4 - 3| + |2 - 2| = 2\). Перестановок с меньшими весами не существует. В третьем наборе входных данных вес перестановки \((1, 4, 2, 3, 5)\) равен \(|1 - p_4| + |4 - p_2| + |2 - p_3| + |3 - p_5| + |5 - p_1| = |1 - 2| + |4 - 4| + |2 - 3| + |3 - 1| + |5 - 5| = 4\). Перестановок с меньшими весами не существует.
| |
|
|
C. Sanae и гигантский робот
Бинарный поиск
жадные алгоритмы
Перебор
снм
сортировки
Структуры данных
*2500
Sanae сделала гигантского робота — Hisoutensoku, но с ним что-то не так. Что еще хуже, Sanae, кажется, не может понять, как его остановить, и она вынуждена исправлять это на лету. Состояние робота можно представить массивом целых чисел длины \(n\). Изначально робот находится в состоянии \(a\). Она хочет превратить его в состояние \(b\). Как отличный программист, Sanae владеет искусством копирования и вставки. За одну операцию она может выбрать некоторый отрезок из заданных отрезков, скопировать этот отрезок из \(b\) и вставить его в то же место робота, заменив исходное состояние на этих позициях. Однако она должна следить за тем, чтобы сумма \(a\) не менялась после каждой операции копирования на случай, если робот выйдет из строя. Формально Sanae может выбрать отрезок \([l,r]\) и сделать \(a_i = b_i\) (\(l\le i\le r\)), если \(\sum\limits_{i=1}^n a_i\) не изменится после применения операции. Определите, может ли Sanae успешно перевести робота из начального состояния \(a\) в желаемое состояние \(b\) с помощью любых (возможно, ноль) операций. Выходные данные Для каждого теста выведите «YES» (без кавычек), если \(a\) можно превратить в \(b\), или «NO» (без кавычек) в противном случае. Вы можете вывести «YES» и «NO» в любом регистре (например, строки «yEs», «yes» и «Yes» являются правильным ответом). Примечание В первом наборе входных данных один из возможных способов превратить \(a\) в \(b\): Сначала выберите \([1,3]\). После операции \(a=[3,2,5,2,3]\). Затем выберите \([2,5]\). После операции \(a=[3,2,5,4,1]=b\). Во втором наборе входных данных можно показать, что невозможно превратить \(a\) в \(b\).
| |
|
|
D. Милые числа
Бинарный поиск
математика
Перебор
реализация
снм
Структуры данных
*2900
Ran Yakumo симпатичная девочка, которая любит решать милые математические задачи. Пусть \(f(x)\) будет минимальным квадратом строго большим, чем \(x\), и \(g(x)\) будет максимальным квадратом, не строго меньшим, чем \(x\). Например, \(f(1)=f(2)=g(4)=g(8)=4\). Натуральное целое число \(x\) называется милым, если \(x-g(x)<f(x)-x\). Например, \(1,5,11\) это милые целые числа, а \(3,8,15\) нет. Ran Yakumo дает вам массив \(a\) длины \(n\). Она хочет, чтобы вы нашли минимальное неотрицательное целое число \(k\), такое что \(a_i + k\) является милым числом для любого элемента массива \(a\). Выходные данные Выведите одно целое число \(k\) — ответ на задачу. Примечание В первом тесте \(3\) не является красивым целым числом, поэтому \(k\ne 0\). \(2,4,9,11\) являются милыми целыми числами, поэтому \(k=1\).
| |
|
|
E. Бесконечность
битмаски
графы
Конструктив
Перебор
поиск в глубину и подобное
снм
*2500
После окончания университета Влад получил массив \(a_1,a_2,\ldots,a_n\) из \(n\) целых неотрицательных чисел. Он сразу же захотел построить граф, состоящий из \(n\) вершин, пронумерованных \(1, 2,\ldots, n\). Он решил добавлять ребро между \(i\) и \(j\) тогда и только тогда, когда \(a_i \& a_j > 0\), где \(\&\) обозначает операцию побитового И. Влад также хочет, чтобы такой граф был связным, что, к сожалению, может быть не так. Чтобы удовлетворить свое желание, он может выполнять следующие два типа операций над массивом: - Выбрать некоторый элемент \(a_i\) и увеличить его на \(1\).
- Выбрать некоторый элемент \(a_i\) и уменьшить его на \(1\) (разрешено, только если \(a_i > 0\)).
Можно доказать, что существует конечная последовательность таких операций, при которой граф станет связным. Не могли бы вы помочь Владу найти минимально возможное количество операций для этого, а также предоставить способ, как это сделать? Выходные данные Для каждого набора входных данных выведите в первой строке единственное целое число \(m\) — минимальное количество операций. Во второй строке выведите массив после допустимой последовательности операций, которые были выполнены так, что граф из задачи стал связным. Если решений несколько, выведите любое. Примечание В первом наборе входных данных граф уже связен. Во втором наборе входных данных мы можем дважды увеличить \(0\) и получить массив \([2,2]\). Поскольку \(2 \& 2 = 2 > 0\), граф связен. Можно показать, что одной операции недостаточно. В третьем наборе входных данных мы можем один раз уменьшить \(12\) и получить массив \([3,11]\). \(3 \& 11 = 3 > 0\), следовательно, граф связен. Необходимо выполнить одну операцию, так как граф вначале не связен.
| |
|
|
E. Число групп отрезков
графы
жадные алгоритмы
поиск в глубину и подобное
снм
сортировки
Структуры данных
*2300
Вам дано \(n\) цветных отрезков на числовой оси. Каждый отрезок либо красный, либо синий. Отрезок \(i\) описывается тройкой чисел \((c_i, l_i, r_i)\). Отрезок содержит все точки на отрезке \([l_i, r_i]\), включая концы, а его цвет описывается значением \(c_i\): - если \(c_i = 0\), то это красный отрезок;
- если \(c_i = 1\), то это синий отрезок.
Скажем, что два отрезка различных цветов соединены, если они имеют хотя бы одну общую точку. Два отрезка принадлежат одной группе отрезков, если они соединены непосредственно или через цепочку соединенных непосредственно отрезок. Найдите число различных групп отрезков. Выходные данные Для каждого набора входных данных выведите одно целое число \(k\) — количество групп отрезков. Примечание В первом примере \(5\) отрезков. Отрезки \(1\) и \(2\) соединены, так как они различных цветов и имеют общую точку. Также отрезки \(2\) и \(3\) соединены, и отрезки \(4\) и \(5\) соединены. Таким образом, есть две группы: одна содержит отрезки \(\{1, 2, 3\}\), другая содержит отрезки \(\{4, 5\}\).
| |
|
|
F. Восстановление дерева
графы
Деревья
Конструктив
Перебор
поиск в глубину и подобное
снм
*2600
Fishingprince любит деревья. Дерево — это связный неориентированный граф без циклов. У Fishingprince'а есть дерево на \(n\) вершинах. Его вершины пронумерованы числами от \(1\) до \(n\). Пусть \(d(x,y)\) равно длине кратчайшего расстояния между вершинами \(x\) и \(y\), если считать длину каждого ребра равной \(1\). К сожалению, Fishingprince потерял своё дерево. Тем не менее какая-то информация о нём сохранилась. А именно, для каждой тройки чисел \(x,y,z\) (\(1\le x<y\le n\), \(1\le z\le n\)) известно, выполнено ли равенство \(d(x,z)=d(y,z)\). Помогите ему восстановить структуру дерева или сообщите, что дерева, удовлетворяющего всем ограничениям, не существует. Выходные данные Для каждого набора входных данных: - выведите No, если искомого дерева не существует;
- иначе в первой строке выведите Yes. Затем выведите \(n-1\) строк. Каждая из них должна содержать два целых числа \(x,y\) (\(1\le x,y\le n\)), означающих ребро между вершинами \(x\) и \(y\) в дереве. Если существуют несколько решений, выведите любое из них.
При выводе Yes и No вы можете выводить каждый символ в любом регистре (верхнем или нижнем).
| |
|
|
B. Иерархия
жадные алгоритмы
кратчайшие пути
поиск в глубину и подобное
снм
*1500
В фирму Никиты набрали n человек. Теперь ему нужно построить древовидную иерархию отношений «начальник-подчинённый» в этой фирме (то есть у каждого человека, кроме одного, должен быть ровно один начальник). Дано m заявлений вида «человек ai готов стать начальником человека bi за дополнительную плату ci». Для каждого человека известно его значение квалификации qj, и для каждого заявления выполняется условие qai > qbi. Помогите Никите определить минимальную стоимость создания иерархии, либо выяснить, что это невозможно. Выходные данные В единственной строке выходных данных выведите минимальную стоимость создания иерархии или -1, если создать иерархию невозможно. Примечание В первом примере один из возможных вариантов составления иерархии — взять заявления под номерами 1, 2 и 4, которые в сумме дадут стоимость 11. Во втором примере составить иерархию невозможно, поэтому ответ -1.
| |
|
|
E. Раздели на два набора
графы
поиск в глубину и подобное
снм
*1600
Поликарпу недавно подарили набор из \(n\) (число \(n\) — чётное) костяшек домино. На каждой костяшке написаны два целых числа от \(1\) до \(n\). Сможет ли он разделить все костяшки на два набора так, чтобы все числа на костяшках каждого набора были различны? Каждая костяшка должна войти ровно в один из двух наборов. Например, если у него есть \(4\) костяшки: \(\{1, 4\}\), \(\{1, 3\}\), \(\{3, 2\}\) и \(\{4, 2\}\), то Поликарп сможет разделить их на два набора требуемым образом. В первый набор может войти первая и третья костяшка (\(\{1, 4\}\) и \(\{3, 2\}\)), а во второй — вторая и четвёртая (\(\{1, 3\}\) и \(\{4, 2\}\)). Выходные данные Для каждого набора входных данных выведите: - YES, если возможно разделить \(n\) костяшек на два набора так, что числа на костяшках каждого набора различны;
- NO, если сделать это невозможно.
Вы можете выводить YES и NO в любом регистре (например, строки yEs, yes, Yes и YES будут распознаны как положительный ответ). Примечание В первом наборе входных данных костяшки можно разделить так: - Первый набор: \([\{1, 2\}, \{4, 3\}]\)
- Второй набор: \([\{2, 1\}, \{3, 4\}]\)
Иными словами в первый набор берём костяшки с номерами \(1\) и \(2\), а во второй набор берём костяшки с номерами \(3\) и \(4\). Во втором наборе входных данных как костяшки не раздели на \(2\) набора, хотя бы в одном будут повторяющиеся числа.
| |
|
|
E. Qpwoeirut и вершины
Бинарный поиск
Деревья
жадные алгоритмы
поиск в глубину и подобное
разделяй и властвуй
снм
Структуры данных
*2300
Вам дан связный неориентированный граф из \(n\) вершин и \(m\) рёбер. Вершины графа пронумерованы целыми числами от \(1\) до \(n\), а рёбра графа пронумерованы целыми числами от \(1\) до \(m\). Вам предстоит ответить на \(q\) запросов, каждый из которых состоит из двух чисел \(l\) и \(r\). Ответом на запрос является наименьшее неотрицательное число \(k\), для которого выполняется следующее условие: - для всех пар чисел \((a, b)\) таких, что \(l\le a\le b\le r\), вершины \(a\) и \(b\) достижимы друг из друга по пути, проходящему только по первым \(k\) рёбрам (то есть в пути могут встречаться только рёбра \(1, 2, \ldots, k\)).
Выходные данные Для каждого набора входных данных выведите \(q\) чисел — ответы на запросы. Примечание Граф из первого набора входных данных. Около ребра записан его номер. В первом наборе входных данных граф состоит из \(2\) вершин и одного ребра между вершинами \(1\) и \(2\). В первом запросе \(l=1\) и \(r=1\). Вершина достижима сама из себя без использования рёбер, поэтому ответ на этот запрос равен \(0\). Во втором запросе \(l=1\) и \(r=2\). Вершины \(1\) и \(2\) достижимы друг из друга по пути \(1 \longleftrightarrow 2\), состоящему только из первого ребра. В то же время невозможно добраться из вершины \(1\) до вершины \(2\), используя только первые \(0\) рёбер. Поэтому ответ на запрос равен \(1\). Граф из второго набора входных данных. Около рёбер записаны их номера. Во втором наборе входных данных граф состоит из \(5\) вершин и \(5\) рёбер. В первом запросе \(l=1\) и \(r=4\). Чтобы выполнить требуемое условие, достаточно использовать первые \(3\) ребра: - Вершины \(1\) и \(2\) достижимы друг из друга по пути \(1 \longleftrightarrow 2\) (состоящему из ребра \(1\)).
- Вершины \(1\) и \(3\) достижимы друг из друга по пути \(1 \longleftrightarrow 3\) (состоящему из ребра \(2\)).
- Вершины \(1\) и \(4\) достижимы друг из друга по пути \(1 \longleftrightarrow 2 \longleftrightarrow 4\) (состоящему из рёбер \(1\) и \(3\)).
- Вершины \(2\) и \(3\) достижимы друг из друга по пути \(2 \longleftrightarrow 1 \longleftrightarrow 3\) (состоящему из рёбер \(1\) и \(2\)).
- Вершины \(2\) и \(4\) достижимы друг из друга по пути \(2 \longleftrightarrow 4\) (состоящему из ребра \(3\)).
- Вершины \(3\) и \(4\) достижимы друг из друга по пути \(3 \longleftrightarrow 1 \longleftrightarrow 2 \longleftrightarrow 4\) (состоящему из рёбер \(2\), \(1\) и \(3\)).
Невозможно выполнить требуемое условие, используя меньше \(3\) первых рёбер. Например, при использовании \(2\) рёбер, невозможно добраться из вершины \(1\) в вершину \(4\). Поэтому ответ на запрос равен \(3\). Во втором запросе \(l=3\) и \(r=4\). Вершины \(3\) и \(4\) достижимы друг из друга по пути \(3 \longleftrightarrow 1 \longleftrightarrow 2 \longleftrightarrow 4\) (состоящему из рёбер \(2\), \(1\) и \(3\)). При использовании меньшего числа первых рёбер вершины \(3\) и \(4\) не будут достижимы друг из друга.
| |
|
|
C. Деревья поиска в глубину
графы
Деревья
жадные алгоритмы
поиск в глубину и подобное
снм
сортировки
*2400
Вам дан связный неориентированный граф из \(n\) вершин и \(m\) рёбер. Вес \(i\)-го ребра равен \(i\). Ниже представлен некорректный алгоритм поиска минимального остовного дерева: vis := массив длины n s := множество рёбер
function dfs(u): vis[u] := true пройтись по каждому ребру (u, v) в порядке увеличения весов if vis[v] = false добавить ребро (u, v) в множество (s) dfs(v)
function findMST(u): установить все элементы (vis) в false очистить множество (s) dfs(u) return множество (s)
Любой из вызовов функций findMST(1), findMST(2), ..., findMST(n) возвращает вам остовное дерево графа. Определите, какие из этих деревьев являются минимальными остовными деревьями. Выходные данные Выведите строку \(s\), состоящую из нулей и единиц, где \(s_i=1\), если findMST(i) возвращает минимальное остовное дерево, и \(s_i = 0\) иначе. Примечание Ниже показан граф из первого примера: В этом графе существует только одно минимальное остовное дерево, состоящее из ребер \((1,2),(3,5),(1,3),(2,4)\), имеющих суммарный вес \(1+2+3+5=11\). Ниже описана часть вычислений при вызове findMST(1): - реинициализируем массив vis и множество ребер s;
- вызываем dfs(1);
- vis[1] := true;
- итерируемся по ребрам \((1,2),(1,3)\);
- добавляем ребро \((1,2)\) во множество s, вызываем dfs(2):
- vis[2] := true;
- итерируемся по ребрам \((2,1),(2,3),(2,4)\);
- так как vis[1] = true, игнорируем ребро \((2,1)\);
- добавляем ребро \((2,3)\) во множество s, вызываем dfs(3):
В конце алгоритма будут выбраны ребра \((1,2),(2,3),(3,5),(2,4)\) с суммарным весом \(1+4+2+5=12>11\), поэтому findMST(1) находит не минимальное остовное дерево. Можно показать, что остальные остовные деревья являются минимальными, поэтому ответ 01111.
| |
|
|
E. XOR дерево
битмаски
Деревья
жадные алгоритмы
поиск в глубину и подобное
снм
Структуры данных
*2400
Дано дерево из \(n\) вершин. На каждой вершине дерева записано число; на \(i\)-й вершине записано число \(a_i\). Напомним, что простой путь — это путь, посещающий каждую вершину не более одного раза. Назовем весом пути побитовое исключающее ИЛИ значений записанных на его вершинах. Скажем, что дерево хорошее, если в нем не существует ни одного простого пути с весом \(0\). Вы можете применить следующую операцию произвольное количество раз (возможно, ноль): выбрать вершину дерева и заменить значение записанное на ней на произвольное положительное целое число. Какое минимальное количество раз необходимо применить данную операцию, чтобы дерево стало хорошим? Выходные данные Выведите одно целое число — минимальное количество раз, которое необходимо применить операцию, чтобы дерево стало хорошим. Примечание В первом примере можно заменить значение на вершине \(1\) на \(13\), а значение на вершине \(4\) — на \(42\).
| |
|
|
E. Обмен крестом
2-sat
жадные алгоритмы
матрицы
снм
Структуры данных
*2400
Вам дана квадратная матрица \(A\) размера \(n \times n\), элементы которой — целые числа. Обозначим элемент на пересечении \(i\)-й строки и \(j\)-го столбца за \(A_{i,j}\). Вы можете выполнять некоторые операции над матрицей. На каждой операции вы выбираете индекс \(k\), а затем для всех \(i\) (\(1 \leq i \leq n\)) меняете местами \(A_{i, k}\) и \(A_{k, i}\). Обратите внимание, что элемент \(A_{k, k}\) не меняется. Например, для \(n = 4\) и \(k = 3\) матрица будет преобразована следующим образом: Операция \(k = 3\) меняет местами синюю строку и зеленый столбец. Вы можете выполнять эту операцию произвольное количество раз. Найдите лексикографически минимальную матрицу\(^\dagger\), которую вы можете получить после выполнения произвольного числа операций. \({}^\dagger\) Для двух матриц \(A\) и \(B\) размера \(n \times n\) положим \(a_{(i-1) \cdot n + j} = A_{i,j}\) и \(b_{(i-1) \cdot n + j} = B_{i,j}\). Тогда матрица \(A\) лексикографически меньше матрицы \(B\), если существует индекс \(i\) (\(1 \leq i \leq n^2\)) такой, что \(a_i < b_i\) и для всех индексов \(j\) таких, что \(1 \leq j < i\), выполняется \(a_j = b_j\). Выходные данные Для каждого набора входных данных выведите \(n\) строк по \(n\) чисел — лексикографически минимальную матрицу. Примечание На каждом рисунке ниже преобразование матрицы меняет местами синюю строку и зеленый столбец. В первом наборе входных данных можно выполнить \(1\) операцию с \(k = 3\). Матрица будет преобразована следующим образом: Во втором наборе можно выполнить \(2\) операции с \(k = 1\) и \(k = 3\):
| |
|
|
I. Imitating the Key Tree
Деревья
Комбинаторика
снм
*2800
Pak Chanek has a tree called the key tree. This tree consists of \(N\) vertices and \(N-1\) edges. The edges of the tree are numbered from \(1\) to \(N-1\) with edge \(i\) connecting vertices \(U_i\) and \(V_i\). Initially, each edge of the key tree does not have a weight. Formally, a path with length \(k\) in a graph is a sequence \([v_1, e_1, v_2, e_2, v_3, e_3, \ldots, v_k, e_k, v_{k+1}]\) such that: - For each \(i\), \(v_i\) is a vertex and \(e_i\) is an edge.
- For each \(i\), \(e_i\) connects vertices \(v_i\) and \(v_{i+1}\).
A circuit is a path that starts and ends on the same vertex. A path in a graph is said to be simple if and only if the path does not use the same edge more than once. Note that a simple path can use the same vertex more than once. The cost of a simple path in a weighted graph is defined as the maximum weight of all edges it traverses. Count the number of distinct undirected weighted graphs that satisfy the following conditions: - The graph has \(N\) vertices and \(2N-2\) edges.
- For each pair of different vertices \((x, y)\), there exists a simple circuit that goes through vertices \(x\) and \(y\) in the graph.
- The weight of each edge in the graph is an integer between \(1\) and \(2N-2\) inclusive. Each edge has distinct weights.
- The graph is formed in a way such that there is a way to assign a weight \(W_i\) to each edge \(i\) in the key tree that satisfies the following conditions:
- For each pair of edges \((i, j)\), if \(i<j\), then \(W_i<W_j\).
- For each pair of different vertex indices \((x, y)\), the cost of the only simple path from vertex \(x\) to \(y\) in the key tree is equal to the minimum cost of a simple circuit that goes through vertices \(x\) and \(y\) in the graph.
- Note that the graph is allowed to have multi-edges, but is not allowed to have self-loops.
Print the answer modulo \(998\,244\,353\). Two graphs are considered distinct if and only if there exists a triple \((a, b, c)\) such that there exists an edge that connects vertices \(a\) and \(b\) with weight \(c\) in one graph, but not in the other. Output An integer representing the number of distinct undirected weighted graphs that satisfy the conditions of the problem modulo \(998\,244\,353\). Note The following is an example of a graph that satisfies. 
The following is an assignment of edge weights in the key tree that corresponds to the graph above. 
As an example, consider a pair of vertex indices \((1, 4)\). - The circuit in the graph for this pair of vertices is \(3 \xrightarrow{2} 2 \xrightarrow{4} 4 \xrightarrow{6} 2 \xrightarrow{1} 1 \xrightarrow{5} 3\) with a cost of \(6\).
- The path in the key tree for this pair of vertices is \(1 \xrightarrow{5} 3 \xrightarrow{6} 4\) with a cost of \(6\).
| |
|
|
K. Kingdom of Criticism
снм
Структуры данных
*2500
Pak Chanek is visiting a kingdom that earned a nickname "Kingdom of Criticism" because of how often its residents criticise each aspect of the kingdom. One aspect that is often criticised is the heights of the buildings. The kingdom has \(N\) buildings. Initially, building \(i\) has a height of \(A_i\) units. At any point in time, the residents can give a new criticism, namely they currently do not like buildings with heights between \(l\) and \(r\) units inclusive for some two integers \(l\) and \(r\). It is known that \(r-l\) is always odd. In \(1\) minute, the kingdom's construction team can increase or decrease the height of any building by \(1\) unit as long as the height still becomes a positive number. Each time they receive the current criticism from the residents, the kingdom's construction team makes it so that there are no buildings with heights between \(l\) and \(r\) units inclusive in the minimum time possible. It can be obtained that there is only one way to do this. Note that the construction team only cares about the current criticism from the residents. All previous criticisms are forgotten. There will be \(Q\) queries that you must solve. Each query is one of the three following possibilities: - 1 k w: The kingdom's construction team changes the height of building \(k\) to be \(w\) units (\(1 \leq k \leq N\), \(1 \leq w \leq 10^9\)).
- 2 k: The kingdom's construction team wants you to find the height of building \(k\) (\(1 \leq k \leq N\)).
- 3 l r: The residents currently do not like buildings with heights between \(l\) and \(r\) units inclusive (\(2 \leq l \leq r \leq 10^9-1\), \(r-l\) is odd).
Note that each change in height still persists to the next queries. Output For each query of type \(2\), output a line containing an integer representing the height of the building asked. Note After the \(1\)-st query, the height of each building is \(2, 6, 5, 6, 10\). After the \(3\)-rd query, the height of each building is \(3, 6, 5, 6, 10\). After the \(4\)-th query, the height of each building is \(2, 7, 7, 7, 10\). After the \(5\)-th query, the height of each building is \(2, 7, 7, 7, 10\). After the \(6\)-th query, the height of each building is \(2, 9, 7, 7, 10\).
| |
|
|
C. Правильная скобочная последовательность Jatayu
графы
жадные алгоритмы
снм
Структуры данных
*1300
Прошлым летом Feluda подарил Lalmohan-Babu правильную скобочную последовательность \(s\) длины \(2 n\). Topshe скучал во время летних каникул, и поэтому решил нарисовать неориентированный граф из \(2 n\) вершин, используя правильную скобочную последовательность \(s\). Для каждых двух различных вершин \(i\) и \(j\) (\(1 \le i < j \le 2 n\)) Topshe рисует ребро между этими двумя вершинами тогда и только тогда, когда подотрезок \(s[i \ldots j]\) образует правильную скобочную последовательность. Определите количество компонент связности в графе Topshe. Смотрите определения подчёркнутых терминов в Примечании. Выходные данные Для каждого набора входных данных выведите единственное целое число — количество компонент связности в графе Topshe. Примечание Объяснение примера: В первом наборе входных данных, граф, построенный из скобочной последовательности (), является просто графом, содержащим вершины \(1\) и \(2\), соединёнными единственным ребром. Во втором наборе входных данных, граф, построенный из скобочной последовательности ()(()) будет следующим (содержит две компоненты связности): Определения подчёркнутых терминов: - Последовательность скобок является правильной, если её можно превратить в корректное математическое выражение путём добавления символов \(+\) и \(1\). Например, последовательности (())(), () и (()(())) являются правильными, а )(, (() и (()))( не являются.
- Подотрезок \(s[l \ldots r]\) обозначает последовательность \([s_l, s_{l + 1}, \ldots, s_r]\).
- Компонента связности является множеством вершин \(X\) таким, что для каждых двух вершин из этого множества существует хотя бы один путь в графе, соединяющий эти вершины, но добавление любой другой вершины в \(X\) нарушает это правило.
| |
|
|
D. Разделение рёбер
графы
Деревья
Конструктив
Перебор
поиск в глубину и подобное
снм
Теория вероятностей
*2000
Вам дан связный, неориентированный и невзвешенный граф с \(n\) вершинами и \(m\) рёбрами. Обратите внимание на ограничение на количество рёбер: \(m \le n + 2\). Давайте скажем, что мы красим некоторые рёбра в красный и оставшиеся рёбра в синий. Теперь рассмотрим только красные рёбра и посчитаем количество компонент связности в графе. Пусть это значение равно \(c_1\). Аналогично, рассмотрим только синие рёбра и посчитаем количество компонент связности в графе. Пусть это значение равно \(c_2\). Найдите распределение цветов по рёбрам такое, что величина \(c_1+c_2\) минимальна. Выходные данные Для каждого набора входных данных выведите бинарную строку длины \(m\). \(i\)-й символ строки должен быть 1, если \(i\)-е ребро должно иметь красный цвет, и 0, если оно должно иметь синий цвет. Если существует несколько способов распределить цвета, чтобы получить минимальную величину, вы можете вывести любой.
| |
|
|
C. Сдвиг по фазе
графы
жадные алгоритмы
поиск в глубину и подобное
реализация
снм
Строки
*1400
Была строка \(s\), которую захотели зашифровать. Для этого взяли все \(26\) строчных латинских букв, расположили их в некотором порядке по кругу, после чего заменили каждую букву в \(s\) на ту, что является следующей по часовой стрелке, получив таким образом строку \(t\). Вам дали строку \(t\). Определите лексикографически минимальную строку \(s\), из которой могла быть получена данная строка \(t\). Строка \(a\) лексикографически меньше строки \(b\) такой же длины, если и только если: - в первой позиции, где \(a\) и \(b\) различны, в строке \(a\) находится буква, которая встречается в алфавите раньше, чем соответствующая буква в \(b\).
Выходные данные Для каждого набора входных данных выведите одну строку — лексикографически минимальную строку \(s\), из которой могла получиться \(t\). Примечание В первом наборе входных данных мы не могли иметь строку «a», поскольку тогда буква a переходила бы сама в себя, что невозможно. В качестве ответа нам подходит лексикографически вторая строка «b». Во втором наборе нам не подходит «aa», поскольку a переходила бы в себя, и не подходит «ab», поскольку круг переходов замкнулся бы на \(2\) буквах, а он должен состоять из всех \(26\). Следующая строка «ac» нам подходит. Ниже приведены схемы для первых трех наборов входных данных. В круге пропущены неучаствующие буквы, их можно расставить произвольно в пропуски.
| |
|
|
D. Упоротые перестановки
графы
Деревья
Конструктив
поиск в глубину и подобное
снм
Структуры данных
*1900
Дана перестановка \(a_1, a_2, \dots, a_n\) целых чисел от \(1\) до \(n\), и пороговое значение \(k\) такое, что \(0 \leq k \leq n\), по ним вычисляется последовательность \(b_1, b_2, \dots, b_n\) следующим образом. Для всех \(1 \leq i \leq n\) в порядке возрастания положим \(x = a_i\). - Если \(x \leq k\), приравняем \(b_{x}\) последнему элементу \(a_j\) (\(1 \leq j < i\)) такому, что \(a_j > k\). Если такого элемента \(a_j\) не существует, положим \(b_{x} = n+1\).
- Если \(x > k\), приравняем \(b_{x}\) последнему элементу \(a_j\) (\(1 \leq j < i\)) такому, что \(a_j \leq k\). Если такого элемента \(a_j\) не существует, положим \(b_{x} = 0\).
К сожалению, после построения последовательности \(b_1, b_2, \dots, b_n\), перестановка \(a_1, a_2, \dots, a_n\) и пороговое значение \(k\) потерялись. Теперь у вас есть только последовательность \(b_1, b_2, \dots, b_n\). Ваша задача найти любую подходящую перестановку \(a_1, a_2, \dots, a_n\) и пороговое значение \(k\) которые порождают последовательность \(b_1, b_2, \dots, b_n\). Гарантируется, что существует хотя бы одна пара перестановки \(a_1, a_2, \dots, a_n\) и порогового значения \(k\), что порождают \(b_1, b_2, \dots, b_n\). Перестановкой чисел от \(1\) до \(n\) называется последовательность длины \(n\) которая содержит все целые числа от \(1\) до \(n\) ровно один раз. Выходные данные Для каждого набора входных данных выведите пороговое значение \(k\) (\(0 \leq k \leq n\)) в первой строке, и затем выведите перестановку \(a_1, a_2, \dots, a_n\) (\(1 \leq a_i \leq n\)) во второй строке так, что перестановку \(a_1, a_2, \dots, a_n\) и пороговое значение \(k\) порождают последовательность \(b_1, b_2, \dots, b_n\). Если существуют несколько решений, выведите любое из них. Примечание В первом примере перестановка \(a = [1,3,2,4]\) и пороговое значение \(k = 2\) породят \(b\) следующим образом. - Когда \(i = 1\), \(x = a_i = 1 \leq k\), нет такого \(a_j\) (\(1 \leq j < i\)) что \(a_j > k\). Значит, \(b_1 = n + 1 = 5\).
- Когда \(i = 2\), \(x = a_i = 3 > k\), последний элемент \(a_j\) такой, что \(a_j \leq k\) это \(a_1\). Значит, \(b_3 = a_1 = 1\).
- Когда \(i = 3\), \(x = a_i = 2 \leq k\), последний элемент \(a_j\) такой, что \(a_j > k\) это \(a_2\). Значит, \(b_2 = a_2 = 3\).
- Когда \(i = 4\), \(x = a_i = 4 > k\), последний элемент \(a_j\) такой, что \(a_j \leq k\) это \(a_3\). Значит, \(b_4 = a_3 = 2\).
Получается последовательность \(b = [5,3,1,2]\). Для второго примера перестановка \(a = [1,2,3,4,5,6]\) и пороговое значение \(k = 3\) породят \(b\) следующим образом. - Когда \(i = 1, 2, 3\), \(a_i \leq k\), нет такого \(a_j\) (\(1 \leq j < i\)) что \(a_j > k\). Значит, \(b_1 = b_2 = b_3 = n + 1 = 7\).
- Когда \(i = 4, 5, 6\), \(a_i > k\), последний элемент \(a_j\) такой, что \(a_j \leq k\) это \(a_3\). Значит, \(b_4 = b_5 = b_6 = a_3 = 3\).
Получается последовательность \(b = [7,7,7,3,3,3]\). Для третьего примера перестановка \(a = [6,5,4,3,2,1]\) и пороговое значение \(k = 3\) породят \(b\) следующим образом. - Когда \(i = 1, 2, 3\), \(a_i > k\), нет такого \(a_j\) (\(1 \leq j < i\)) что \(a_j \leq k\). Значит, \(b_4 = b_5 = b_6 = 0\).
- Когда \(i = 4, 5, 6\), \(a_i \leq k\), последний элемент \(a_j\) такой, что \(a_j > k\) это \(a_3\). Значит, \(b_1 = b_2 = b_3 = a_3 = 4\).
Получается последовательность \(b = [4,4,4,0,0,0]\).
| |
|
|
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. Опасные лазеры
Конструктив
снм
сортировки
*3100
У Пака Чанека есть сетка из порталов размера \(n \times m\). Портал в \(i\)-й строке и \(j\)-м столбце обозначается как портал \((i,j)\). Порталы \((1,1)\) и \((n,m)\) находятся в северо-западном и юго-восточном углах сетки соответственно. Портал \((i,j)\) имеет две настройки: - Тип \(t_{i,j}\), который может быть \(0\) или \(1\).
- Сила \(s_{i,j}\), являющаяся целым числом от \(1\) до \(10^9\) включительно.
Каждый портал имеет \(4\) грани, помеченные целыми числами \(0,1,2,3\), которые соответствуют направлениям на север, восток, юг и запад соответственно. Когда лазерный луч входит в грань \(k\) портала \((i, j)\) со скоростью \(x_\text{in}\), он покидает портал из грани \((k+2+t_{i,j}) \bmod 4\) со скоростью \(x_\text{out} = \max(x_\text{in},s_{i,j})\). Портал при этом потребляет \(x_\text{out} - x_\text{in}\) единиц энергии. Паку Чанеку сегодня очень скучно. Он собирается запустить \(4nm\) лазерных лучей с начальной скоростью \(1\), по одному в каждую грань каждого портала. Каждый луч будет перемещаться по этой сетке порталов, пока не выйдет за пределы сетки или не пройдет через \(10^{100}\) порталов. Пак Чанек считает, что портал хороший тогда и только тогда, когда суммарная энергия, потребленная этим порталом по модулю \(2\), равна его типу. Учитывая настройки силы всех порталов, найдите способ назначить настройки типа каждого портала таким образом, чтобы количество хороших порталов было максимально возможным. Выходные данные Выведите \(n\) строк, каждая их которых состоит из \(m\) символов \(0\) или \(1\), обозначающих тип портала, где \(j\)-й символ в \(i\)-й строке это настройка типа портала \((i, j)\). Если решений несколько, выведите любое из них. Примечание В первом примере рассмотрим лазерный луч, который Пак Чанек запускает в грань \(1\) портала \((2, 2)\). Луч перемещается следующим образом: - Луч входит в грань \(1\) портала \((2, 2)\) со скоростью \(1\). Он покидает портал из грани \(3\) со скоростью \(5\). Портал \((2, 2)\) потребляет \(4\) единиц энергии.
- Луч входит в грань \(1\) портала \((2, 1)\) со скоростью \(5\). Он покидает портал из грани \(0\) со скоростью \(6\). Портал \((2, 1)\) потребляет \(1\) единиц энергии.
- Луч входит в грань \(2\) портала \((1, 1)\) со скоростью \(6\). Он покидает портал из грани \(1\) со скоростью \(8\). Портал \((1, 1)\) потребляет \(2\) единиц энергии.
- Луч входит в грань \(3\) портала \((1, 2)\) со скоростью \(8\). Он покидает портал из грани \(2\) со скоростью \(8\). Портал \((1, 2)\) потребляет \(0\) единиц энергии.
- Луч входит в грань \(0\) портала \((2, 2)\) со скоростью \(8\). Он покидает портал из грани \(2\) со скоростью \(8\). Портал \((2, 2)\) потребляет \(0\) единиц энергии.
Иллюстрация перемещений луча, описанных выше, выглядит следующим образом. Для примера рассмотрим портал \((2, 3)\). Мы можем подсчитать, что суммарная энергия, потребляемая этим порталом, к концу процесса составит \(32\). Так как \(32 \bmod 2 = 0\) и \(t_{2,3} = 0\), этот портал будет считаться хорошим.
| |
|
|
E. Тик-так
графы
Комбинаторика
поиск в глубину и подобное
снм
*2500
Танхаус, часовщик в городе Винден, делает необычные часы, измеряющие время в \(h\) часах, пронумерованных от \(0\) до \(h-1\). Однажды он решил сделать из таких часов загадку. Загадка состоит из таблицы размера \(n \times m\) с часами, где каждые часы показывают какой-то час ровно (то есть время не лежит между двумя ровными часами). За один ход он может выбрать строку или столбец и перевести все часы в строке или столбце на час вперед\(^\dagger\). Таблица с часами называется решаемой, если можно сделать так, чтобы все часы показывали одно и то же время. При создании закагки Танхаус вдруг забеспокоился, что, возможно, его загадка не получится решаемой. В некоторых клетках таблицы уже находятся часы, которые показывают определенное время, а некоторые клетки еще пустые. Вам дана частично заполненная таблица с часами, найдите количество способов\(^\ddagger\) заполнить пустые клетки часами так, чтобы таблица была решаемой. Так как ответ может быть большим, выведите его по модулю \(10^9 + 7\). \(^\dagger\) Если часы показывают \(t\) часов, и их переводят на час вперед, они будут показывать \((t+1) \bmod h\) часов. \(^\ddagger\) Два способа считаются различными, если существует клетка с часами, в двух способах показывающими различное время. Выходные данные Для каждого набора входных данных выведите число способов заполнить пустые клетки таблицы так, чтобы загадка была решаемой. Так как ответ может быть большим, выведите его по модулю \(10^9 + 7\). Примечание В первом примере например подходит следующая конфигурация часов: Она решаемая, например, так: - Перевести часы в среднем столбце на час.
- Перевести часы в третьем столбце на час.
- Перевести часы в третьем столбце на час.
- Перевести часы во второй строке на час.
После этого все часы показывают один час. Во втором примере можно показать, что нет решаемых конфигураций.
| |
|
|
E. Сделайте связным
Бинарный поиск
графы
Деревья
жадные алгоритмы
Конструктив
матрицы
Перебор
снм
*2400
Вам дан простой неориентированный граф, состоящий из \(n\) вершин. Граф не содержит петель, между каждой парой вершин существует не более одного ребра. Ваша задача проста: сделать граф связным. Вы можете выполнить следующую операцию любое количество раз (возможно, ноль): - Выберите произвольную вершину \(u\).
- Для каждой вершины \(v\), для которой \(v\ne u\), если \(v\) смежна с \(u\), удалите ребро между \(u\) и \(v\), иначе добавьте ребро между \(u\) и \(v\).
Найдите минимальное количество операций, необходимых для того, чтобы сделать граф связным. Также найдите любую последовательность операций минимальной длины, которая делает граф связным. Выходные данные Для каждого набора входных данных в первой строке выведите целое число \(m\) — минимально необходимое количество операций. Если \(m\) больше нуля, то выведите дополнительную строку, состоящую из \(m\) целых чисел — вершин, выбранных в операциях в вашем решении. Если существует несколько решений с минимальным количеством операций, выведите любое из них. Примечание В первом наборе входных данных граф связен в начале, поэтому ответ — \(0\). Во втором наборе входных данных, если мы выполним операцию с вершиной \(1\), то получим следующий граф, представленный следующей матрицей смежности: \(\) \begin{bmatrix} 0&1&1\\ 1&0&1\\ 1&1&0 \end{bmatrix} \(\) Очевидно, что приведенный выше граф является связным. В третьем наборе входных данных, если мы проделаем операцию с вершинами \(3\) и \(4\), то получим следующий граф, представленный следующей матрицей смежности: \(\) \begin{bmatrix} 0&1&1&1\\ 1&0&1&1\\ 1&1&0&1\\ 1&1&1&0 \end{bmatrix} \(\) Очевидно, что приведенный выше граф является связным, и можно доказать, что мы не можем выполнить менее \(2\) операций, чтобы сделать граф связным.
| |
|
|
F. Запросы к ребрам
графы
Деревья
дп
поиск в глубину и подобное
снм
Структуры данных
*3000
Вам дан неориентированных, связный граф из \(n\) вершин и \(m\) ребер. Все вершины \(u\) графа удовлетворяют следующему условию: - Пусть \(S_u\) это множество вершин принадлежащих длиннейшему простому циклу начинающемуся и заканчивающемуся в \(u\).
- Пусть \(C_u\) это объединение множеств вершин всех простых циклов начинающихся и заканчивающихся в \(u\).
- \(S_u = C_u\).
Вы должны ответить на \(q\) запросов. Для каждого запроса вам будет дана вершина \(a\) и вершина \(b\). Для всех ребер принадлежащих любому простому пути из \(a\) в \(b\), посчитайте число ребер таких, что если вы удалите их, \(a\) и \(b\) останутся достижимы друг из друга. Выходные данные Для каждого запроса выведите одно целое число — ответ на запрос. Примечание Граф в первом примере: Первый запрос это \((1, 4)\). Тут всего \(5\) ребер принадлежат любому простому пути из \(1\) в \(4\). Ребра \((3, 4), (4, 5), (5, 3)\) будут посчитаны как ответ на запрос. Четвертый запрос \((2, 8)\). Тут только один простой путь из \(2\) в \(8\), причем ни одно ребро не будет посчитано в ответ. Пятый запрос \((7, 10)\). Тут всего \(4\) ребра принадлежат любому простому пути из \(7\) в \(10\), все они будут посчитаны в ответе.
| |
|
|
F. Дореми и экспериментальное дерево
Деревья
Конструктив
Перебор
поиск в глубину и подобное
снм
сортировки
*2500
У Дореми есть реберно-взвешенное дерево из \(n\) вершин, веса являются целыми числами от \(1\) до \(10^9\). Дореми провела \(\frac{n(n+1)}{2}\) экспериментов с деревом. В каждом эксперименте Дореми выбирает две вершины \(i\) и \(j\) такие, что \(j \leq i\), и соединяет их дополнительным ребром веса \(1\). После этого в графе образовывается один цикл (или петля, если \(i=j\)). Дореми определяет \(f(i,j)\) как сумму длин кратчайших путей от каждой вершины до цикла. Формально, пусть \(\mathrm{dis}_{i,j}(x,y)\) — длина кратчайшего пути между вершинами \(x\) и \(y\), когда в дерево добавлено одно ребро \((i,j)\) веса \(1\), а \(S_{i,j}\) — множество вершин на цикле, когда добавлено ребро \((i,j)\). Тогда \(\) f(i,j)=\sum_{x=1}^{n}\left(\min_{y\in S_{i,j}}\mathrm{dis}_{i,j}(x,y)\right). \(\) Дореми записала все значения \(f(i,j)\) для \(1 \leq j \leq i \leq n\), потом пошла спать. Однако проснувшись, она обнаружила, что дерево пропало. К счастью, значения \(f(i,j)\) все еще в ее тетради, и она значит, каким \(i\) и \(j\) они соответствуют. Вам даны значения \(f(i,j)\), можете ли вы помочь Дореми восстановить дерево? Гарантируется, что хотя бы одно подходящее дерево существует. Выходные данные Выведите \(n-1\) строку, описывающую дерево. В \(i\)-й строке выведите три целых числа \(u_i\), \(v_i\), \(w_i\) (\(1 \le u_i,v_i \le n\), \(1 \le w_i \le 10^9\)), обозначающих ребро \((u_i,v_i)\) веса \(w_i\). Если существуют несколько решений, выведите любое из них. Ребра должны образовывать дерево, а все значения \(f(i,j)\) должны совпадать с данными. Примечание Для первого примере рисунок ниже слева направо сверху вниз показывает графы, получающиеся при добавлении ребер \((1,1)\), \((1,2)\), \((1,3)\), \((2,2)\), \((2,3)\), \((3,3)\) соответственно. Вершины на цикле выделены желтым. 
| |
|
|
A. Access Levels
битмаски
Паросочетания
Потоки
снм
*2400
BerSoft is the biggest IT corporation in Berland, and Monocarp is the head of its security department. This time, he faced the most difficult task ever. Basically, there are \(n\) developers working at BerSoft, numbered from \(1\) to \(n\). There are \(m\) documents shared on the internal network, numbered from \(1\) to \(m\). There is a table of access requirements \(a\) such that \(a_{i,j}\) (the \(j\)-th element of the \(i\)-th row) is \(1\) if the \(i\)-th developer should have access to the \(j\)-th document, and \(0\) if they should have no access to it. In order to restrict the access, Monocarp is going to perform the following actions: - choose the number of access groups \(k \ge 1\);
- assign each document an access group (an integer from \(1\) to \(k\)) and the required access level (an integer from \(1\) to \(10^9\));
- assign each developer \(k\) integer values (from \(1\) to \(10^9\)) — their access levels for each of the access groups.
The developer \(i\) has access to the document \(j\) if their access level for the access group of the document is greater than or equal to the required access level of the document. What's the smallest number of access groups Monocarp can choose so that it's possible to assign access groups and access levels in order to satisfy the table of access requirements? Output The first line should contain a single integer \(k\) — the smallest number of access groups Monocarp can choose so that it's possible to assign access groups and access levels in order to satisfy the table of access requirements. The second line should contain \(m\) integers from \(1\) to \(k\) — the access groups of the documents. The third line should contain \(m\) integers from \(1\) to \(10^9\) — the required access levels of the documents. The \(i\)-th of the next \(n\) lines should contain \(k\) integers from \(1\) to \(10^9\) — the access level of the \(i\)-th developer on each of the access groups. If there are multiple solutions, print any of them. Note In the first example, we assign the documents to different access groups. Both documents have level \(2\) in their access group. This way, we can assign the developers, who need the access, level \(2\), and the developers, who have to have no access, level \(1\). If they had the same access group, it would be impossible to assign access levels to developers \(1\) and \(3\). Developer \(1\) should've had a lower level than developer \(3\) in this group to not be able to access document \(1\). At the same time, developer \(3\) should've had a lower level than developer \(1\) in this group to not be able to access document \(2\). Since they can't both have lower level than each other, it's impossible to have only one access group. In the second example, it's possible to assign all documents to the same access group.
| |
|
|
C1. Вечеринка
графы
поиск в глубину и подобное
снм
*1500
В честь проведения второго турнира ABBYY Cup Умный Бобер решил устроить вечеринку. У Бобра много знакомых, и некоторые из них дружат друг с другом, а некоторые друг другу не нравятся. Чтобы вечеринка удалась на славу, Умный Бобер хочет пригласить только тех своих знакомых, которые дружат, и не приглашать тех, кто не нравится друг другу. Отношения дружбы и антипатии симметричны. Более формально, для каждого приглашенного человека должны выполняться следующие условия: - все его друзья должны быть также приглашены на вечеринку;
- среди приглашенных не должно быть людей, которые ему не нравятся;
- все приглашенные на вечеринку должны быть связаны с ним дружбой напрямую или через цепь общих друзей произвольной длины. Будем говорить, что люди a1 и ap связаны цепью общих друзей, если существует последовательность людей a2, a3, ..., ap - 1 такая, что все пары людей ai и ai + 1 (1 ≤ i < p) — друзья.
Помогите Бобру определить максимальное количество знакомых, которых он сможет пригласить. Выходные данные Выведите единственное число — максимальное количество людей, которых Бобер сможет пригласить на вечеринку. Если группу людей, удовлетворяющую всем требованиям, выбрать невозможно, выведите 0. Примечание Рассмотрим пример. Под условия задачи подходят две группы людей: {1, 2, 3} и {4, 5}, при этом ответом будет размер наибольшей из этих групп. Группа {6, 7, 8, 9} не подходит, так как в ней есть люди 7 и 9, которые не нравятся друг другу. Группа {1, 2, 3, 4, 5} также не подходит, так как не все ее члены связаны цепью общих друзей (например, люди 2 и 5 не связаны).
| |
|
|
D. Косия и игра
графы
игры
Конструктив
Паросочетания
поиск в глубину и подобное
Потоки
реализация
снм
Структуры данных
*2000
Косия и Махиру играют в игру с тремя массивами \(a\), \(b\) и \(c\) длины \(n\). Каждый элемент \(a\), \(b\) и \(c\) — целое число от \(1\) до \(n\) включительно. Игра состоит из \(n\) раундов. В \(i\)-м раунде они делают следующие ходы: - Пусть \(S\) — мультимножество \(\{a_i, b_i, c_i\}\).
- Косия удаляет один из элементов \(S\) по своему выбору.
- Затем Махиру выбирает одно из двух оставшихся в \(S\) чисел.
Пусть \(d_i\) — число, выбранное Махиру в \(i\)-м раунде. Если \(d\) является перестановкой\(^\dagger\), Косия выигрывает. Иначе выигрывает Махиру. Сейчас выбраны только массивы \(a\) и \(b\). Являясь ярым поклонником Косии, вы хотите выбрать массив \(c\) так, чтобы Косия выиграла. Вычислите количество таких \(c\) по модулю \(998\,244\,353\). Обратите внимание, что Косия и Махиру играют оптимально. \(^\dagger\) Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)). Выходные данные Выведите одно целое число — количество массивов \(c\), при которых выигрывает Косия, по модулю \(998\,244\,353\). Примечание В первом примере есть \(6\) массивов \(c\), при которых выигрывает Косия: \([1, 2, 3]\), \([1, 3, 2]\), \([2, 2, 3]\), \([2, 3, 2]\), \([3, 2, 3]\), \([3, 3, 2]\). Во втором примере можно показать, что нет массивов \(c\), при которых выигрывает Косия.
| |
|
|
E. Косия и дерево
Деревья
дп
Комбинаторика
математика
поиск в глубину и подобное
снм
Теория вероятностей
*2400
У Ими есть неориентированное дерево из \(n\) вершин, ребра которого пронумерованы от \(1\) до \(n-1\). \(i\)-е ребро соединят вершины \(u_i\) и \(v_i\). Также на дереве находятся \(k\) бабочек. Изначально \(i\)-я бабочка находится в вершине \(a_i\). Все значения \(a\) попарно различны. Косия играет в игру следующим образом. - Для \(i = 1, 2, \dots, n - 1\) Косия выбирает одно из направлений \(i\)-го ребра (\(u_i \rightarrow v_i\) или \(v_i \rightarrow u_i\)) с одинаковой вероятностью.
- Для \(i = 1, 2, \dots, n - 1\), если в начальной вершине \(i\)-го ребра есть бабочка, а в конечной вершине нет бабочки, то эта бабочка перелетает в конечную вершину. Обратите внимание, что операции выполняются для ребер \(1, 2, \dots, n - 1\) по порядку, а не одновременно.
- Косия выбирает две бабочки из \(k\) бабочек с равной вероятностью для всех \(\frac{k(k-1)}{2}\) способов выбрать две бабочки, затем она вычисляет расстояние\(^\dagger\) между двумя вершинами, и объявляет это своим счетом.
Косия хочет, чтобы вы вычислили математическое ожидание ее счета по модулю \(998\,244\,353^\ddagger\). \(^\dagger\) Расстоянием между двумя вершинами в дереве называется количество ребер на (единственном) простом пути между ними. \(^\ddagger\) Формально, пусть \(M = 998\,244\,353\). Можно показать, что ответ может быть представлен в виде несократимой дроби \(\frac{p}{q}\), где \(p\) и \(q\) — целые числа, и \(q \not \equiv 0 \pmod{M}\). Выведите целое число, равное \(p \cdot q^{-1} \bmod M\). Другими словами, выведите такое целое число \(x\), что \(0 \le x < M\) и \(x \cdot q \equiv p \pmod{M}\). Выходные данные Выведите одно целое число — математическое ожидание счета Косии по модулю \(998\,244\,353\). Примечание Дерево из первого примера показано ниже. Вершины с бабочками отмечены жирным. Существуют только \(2\) бабочки, поэтому выбор бабочек фиксирован. Рассмотрим следующие \(4\) случая: - Ориентация ребер \(1 \rightarrow 2\) и \(2 \rightarrow 3\): бабочка из вершины \(1\) перемещается в вершину \(2\), а бабочка в вершине \(3\) не двигается. Расстояние между вершинами \(2\) и \(3\) равно \(1\).
- Ориентация ребер \(1 \rightarrow 2\) и \(3 \rightarrow 2\): бабочка из вершины \(1\) перемещается в вершину \(2\), а бабочка в вершине \(3\) не двигается, потому что вершина \(2\) занята. Расстояние между вершинами \(2\) и \(3\) равно \(1\).
- Ориентация ребер \(2 \rightarrow 1\) и \(2 \rightarrow 3\): бабочки в вершинах \(1\) и \(3\) не двигаются. Расстояние между вершинами \(1\) и \(3\) равно \(2\).
- Ориентация ребер \(2 \rightarrow 1\) и \(3 \rightarrow 2\): бабочка в вершине \(1\) не двигается, а бабочка из вершины \(3\) перемещается в вершину \(2\). Расстояние между вершинами \(1\) и \(2\) равно \(1\).
Таким образом, математическое ожидание счета Косии равно \(\frac {1+1+2+1} {4} = \frac {5} {4}\), что есть \(748\,683\,266\) по модулю \(998\,244\,353\). Дерево из второго примера показано ниже. Вершины с бабочками отмечены жирным. Математическое ожидание счета Косии равно \(\frac {11} {6}\), что есть \(831\,870\,296\) по модулю \(998\,244\,353\).
| |
|
|
D. Борис и его восхитительная прическа
дп
жадные алгоритмы
Конструктив
снм
сортировки
Структуры данных
*1700
Борис думает, что шахматы это скучная игра, поэтому он ушел со своего турнира пораньше. Он пошел в парикмахерскую, ведь его прическа была немного неаккуратная. В настоящий момент его волосы можно описать массивом \(a_1,a_2,\ldots, a_n\), где \(a_i\) — высота волоса на позиции \(i\). Его желаемая прическа описывается массивом \(b_1,b_2,\ldots, b_n\) аналогично. У парикмахера есть \(m\) бритв. Каждая бритва имеет некоторый размер и может быть использована не более одного раза. За одну операцию парикмахер может выбрать одну бритву и обрезать с помощью нее отрезок волос Бориса. Формально, операция выглядит следующим образом: - Выбрать ранее неиспользованную бритву, пусть ее размер равен \(x\);
- Выбрать отрезок \([l,r]\) (\(1\leq l \leq r \leq n\));
- Присвоить \(a_i := \min (a_i,x)\) для всех \(l\leq i \leq r\).
Обратите внимание, что некоторые бритвы могут иметь одинаковый размер. Парикмахер может выбирать размер \(x\) максимум столько раз, сколько у него есть бритв размера \(x\). Парикмахер может выполнить сколько угодно операций, не используя одну бритву дважды. Необходимо, чтобы в конце выполнялось \(a_i = b_i\) для всех \(1 \leq i \leq n\). Он не обязан использовать все бритвы. Определите, может ли парикмахер сделать необходимую Борису стрижку. Выходные данные Для каждого набора входных данных выведите «YES», если парикмахер может выполнить необходимую стрижку, и «NO» иначе. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В первом примере волосы Бориса изначально равны \([3,3,3]\). Опишем последовательность из \(2\) операций, которые может выполнить парикмахер: - Использовать бритву размера \(1\) на отрезке \([2,2]\); волосы становятся \([3,1,3]\).
- Использовать бритву размера \(2\) на отрезке \([1,3]\); волосы становятся \([2,1,2]\), что и требуется.
В третьем примере можно ничего не делать, так как волосы уже в желаемом состоянии. В четвертом примере нельзя обрезать волосы так, чтобы их длина увеличилась, и \([1,1,1]\) превратился в \([1,1,2]\).
| |
|
|
G. Вкусный десерт
Бинарный поиск
математика
снм
строковые суфф. структуры
теория чисел
хэши
*2400
Сегодня у повара Тонио важный день — в его родной город Морио приехал ревизор. Он доехал и до ресторана Тонио и заказал у него десерт. Тонио к такому повороту событий не был готов. Как известно, десерт — это строка из строчных латинских символов. Тонио вспомнил общее правило десертов — строку \(s\) длины \(n\). Любой десерт \(t\) является вкусным, если количество вхождений строки \(t\) в строку \(s\) как подстроки делится нацело на длину \(t\). Теперь Тонио хочет знать количество вкусных подстрок заготовки \(s\). Если подстрока встречается в строке \(s\) несколько раз, то в ответе нужно учесть все вхождения. Выходные данные В единственной строке выведите количество подстрок строки \(s\), являющихся вкусными десертами. Примечание В первом примере есть много вкусных подстрок — \(7\) из них это подстроки длины \(1\) (так как любое число делится на \(1\) нацело). Рассмотрим другие вкусные подстроки: - «ab» встречается в \(s\) \(2\) раза, что делится на длину подстроки.
- «ba» также встречается \(2\) раза.
Следовательно ответ \(7 + 2 + 2 = 11\). Обратите внимание, что в ответе учтены оба вхождения как «ab», так и «ba».
| |
|
|
D. Игра на оси
графы
Комбинаторика
поиск в глубину и подобное
реализация
снм
*1900
Есть \(n\) точек \(1,2,\ldots,n\), у каждой точки \(i\) написано число \(a_i\). Вы играете в игру на этих точках. Изначально вы находитесь в точке \(1\). Когда вы находитесь в точке \(i\), выполните следующий шаг: - Если \(1\le i\le n\), перейдите к точке \(i+a_i\);
- В противном случае игра заканчивается.
Перед началом игры вы можете выбрать два целых числа \(x\) и \(y\), удовлетворяющих \(1\le x\le n\), \(-n \le y \le n\), и заменить число \(a_x\) на \(y\) (сделать \(a_x := y\)). Найдите количество различных пар \((x,y)\), при которых игра, которую вы начнете после замены, закончится за конечное число шагов. Обратите внимание, что вам не нужно удовлетворять условию \(a_x\not=y\). Выходные данные Для каждого набора входных данных выведите строку, содержащую одно целое число — количество различных пар \((x,y)\), игра с которыми конечна. Примечание В первом наборе входных данных парами \((x,y)\), с которыми игра конечна, являются \((1,-1)\) и \((1,1)\), соответствующие маршрутам \(1\rightarrow 0\) и \(1\rightarrow 2\). Обратите внимание, что пара \((1,2)\) не подходит, так как при \(n=1\) равенство \(y=2\) нарушает \(-n\le y\le n\). \((1,0)\) также не подходит, так как вы всегда переходите от \(1\) к \(1\), и игра не заканчивается. Во втором наборе входных данных подходящие пары равны \((1,-2),(1,-1),(1,2),(2,-2),(2,-1),(2,0),(2,1),(2,2)\). В четвертом наборе входных данных подходящие пары \((1,-2),(1,-1),(1,1),(1,2),(2,-2),(2,1),(2,2)\).
| |
|
|
F. XOR, деревья и запросы
битмаски
графы
Деревья
жадные алгоритмы
Конструктив
поиск в глубину и подобное
реализация
снм
*2500
Вам дано дерево с \(n\) вершинами. Вершины пронумерованы от \(1\) до \(n\). Вам нужно будет назначить каждому ребру вес. Пусть вес \(i\)-го ребра будет \(a_i\) (\(1 \leq i \leq n-1\)). Вес каждого ребра должен быть целым числом от \(0\) до \(2^{30}-1\), включительно. Вам дано \(q\) условий. Каждое условие состоит из трех целых чисел \(u\), \(v\) и \(x\). Это означает, что побитовое исключающее ИЛИ всех ребер на кратчайшем пути от \(u\) до \(v\) должно быть равно \(x\). Выясните, существуют ли числа \(a_1, a_2, \ldots, a_{n-1}\), удовлетворяющие заданным условиям. Если существуют, выведите такое решение, при котором \(a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1}\) будет наименьшим. Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Если существует несколько решений таких, что \(a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1}\) является наименьшим, выведите любое из них. Выходные данные Если не существует \(a_1\), \(a_2\), ..., \(a_{n-1}\), которые удовлетворяют заданным условиям, выведите «No». В противном случае в первой строке выведите «Yes». Затем в следующей строке выведите \(n-1\) целых чисел, где \(i\)-е целое число — это вес \(i\)-го ребра. Если существует несколько решений, то выведите такое решение, при котором \(a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1}\) будет наименьшим. Если существует несколько решений, при которых \(a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1}\) принимает наименьшее значение, выведите любое. При выводе «Yes» или «No» вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание Для первого примера не существует набора весов ребер, удовлетворяющего заданному условию. Для второго примера два условия означают, что \(a_1 \oplus a_2 \oplus a_3=2\) и \(a_4 \oplus a_5=7\). Может существовать несколько решений, например, \((a_1, a_2, a_3, a_4, a_5)=(1, 2, 1, 4, 3)\). Для третьего примера два условия означают, что \(a_1 \oplus a_2 \oplus a_3=3\) и \(a_1 \oplus a_4 \oplus a_5=5\). Существует множество решений, удовлетворяющих данному условию. \((a_1, a_2, a_3, a_4, a_5)=(1, 1, 3, 4, 0)\) удовлетворяет заданным условиям, но побитовое исключающее ИЛИ весов всех ребер равно \(7\), что не является наименьшим возможным значением \(a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1}\), поэтому это не является верным решением.
| |
|
|
E. Li Hua и массив
математика
Перебор
снм
Структуры данных
теория чисел
*2300
Li Hua хочет решить задачу о \(\varphi\) — функции Эйлера. Напомним, что \(\varphi(x)=\sum\limits_{i=1}^x[\gcd(i,x)=1]\).\(^{\dagger,\ddagger}\) У него есть последовательность \(a_1,a_2,\cdots,a_n\) и он хочет выполнить \(m\) операций: - «1 \(l\) \(r\)» (\(1\le l\le r\le n\)) — для каждого \(x\in[l,r]\), изменить \(a_x\) на \(\varphi(a_x)\).
- «2 \(l\) \(r\)» (\(1\le l\le r\le n\)) — найдите минимальное количество изменений, необходимое для того, чтобы стало верно \(a_l=a_{l+1}=\cdots=a_r\). За одно изменение он выбирает один \(x\in[l,r]\) и изменяет \(a_x\) на \(\varphi(a_x)\).
Каждая операция второго типа является независимой, то есть массив не изменяется. Предположим, что вы Li Hua. Пожалуйста, решите эту задачу. \(^\dagger\) \(\gcd(x,y)\) обозначает наибольший общий делитель (НОД) целых чисел \(x\) и \(y\). \(^\ddagger\) Выражение \([\textrm{cond}]\) равно \(1\), если условие \(\textrm{cond}\) верно, и \(0\) в противном случае. Выходные данные Для каждого запроса вида «2 \(l\) \(r\)» выведите ответ в отдельной строке. Примечание Обозначим \(\varphi^k(x)=\begin{cases}x,&k=0\\\varphi(\varphi^{k-1}(x)),&k > 0\end{cases}\). Сначала \(a=[8,1,6,3,7]\). Чтобы сделать верным выражение \(a_1=a_2=a_3=a_4=a_5\), мы можем изменить \(a\) на \(a'=[\varphi^3(8),\varphi^0(1),\varphi^2(6),\varphi^2(3),\varphi^3(7)]=[1,1,1,1,1]\), используя \(3+0+2+2+3=10\) изменений. Чтобы сделать \(a_3=a_4\), мы можем изменить \(a\) на \(a'=[\varphi^0(8),\varphi^0(1),\varphi^1(6),\varphi^1(3),\varphi^0(7)]=[8,1,2,2,7]\), используя \(0+0+1+1+0=2\) изменения. После «1 \(1\) \(3\)», \(a\) меняется на \(a=[\varphi^1(8),\varphi^1(1),\varphi^1(6),\varphi^0(3),\varphi^0(7)]=[4,1,2,3,7]\). Чтобы сделать \(a_3=a_4\), мы можем изменить \(a\) на \(a'=[\varphi^0(4),\varphi^0(1),\varphi^0(2),\varphi^1(3),\varphi^0(7)]=[4,1,2,2,7]\), используя \(0+0+0+1+0=1\) изменение.
| |
|
|
F. Li Hua и путь
Деревья
поиск в глубину и подобное
разделяй и властвуй
снм
Структуры данных
*3000
У Li Hua есть дерево из \(n\) вершин и \(n-1\) рёбер. Вершины пронумерованы от \(1\) до \(n\). Пара вершин \((u,v)\) (\(u < v\)) считается милой, если ровно одно из следующих двух утверждений истинно: - \(u\) является вершиной с минимальным индексом среди всех вершин на пути \((u,v)\).
- \(v\) — вершина с максимальным индексом среди всех вершин на пути \((u,v)\).
Будет выполнено \(m\) операций. В каждой операции Li Hua выбирает целое число \(k_j\), затем вставляет в дерево вершину с номером \(n+j\), соединяющуюся с вершиной номер \(k_j\). Он хочет подсчитать количество милых пар вершин до операций и после каждой операции. Предположим, что вы Li Hua. Пожалуйста, решите эту задачу. Выходные данные Выведите \(m+1\) целых чисел — количество милых пар вершин до операций и после каждой операции. Примечание Начальное дерево показано на следующем рисунке: Существует \(11\) милых пар — \((1,5),(2,3),(2,4),(2,6),(2,7),(3,4),(3,6),(3,7),(4,5),(5,7),(6,7)\). Аналогично, мы можем посчитать милые пары после каждой операции, и результатами будут \(15\) и \(19\).
| |
|
|
E. Объединение городов
геометрия
жадные алгоритмы
Конструктив
математика
поиск в глубину и подобное
реализация
снм
*2300
Вам дана таблица \(n \times m\). Некоторые клетки заполнены, некоторые пустые. Город — это максимальное (по включению) множество заполненных клеток, такое что можно дойти из любой клетки города до любой другой клетки города, перемещаясь в соседние по стороне клетки, только по клеткам города. Другими словами, город — это компонента связности заполненных клеток, где ребро проводится между соседними по стороне заполненными клетками. Изначально в таблице находятся два города. Вы хотите поменять некоторые пустые клетки на заполненные, так что выполняются два условия: - В таблице находится один город.
- Кратчайший путь между любыми двумя заполненными клетками, если можно перемещаться только по заполненным клеткам, равно манхеттенскому расстоянию между клетками.
Манхеттенское расстояние между двумя клетками \((a, b)\) и \((c, d)\) равняется \(|a - c| + |b - d|\). Найдите способ заполнить некоторые клетки, чтобы все условия выполнялись и общее количество заполненных клеток было минимально. Выходные данные Для каждого набора входных данных выведите \(n\) строк, каждая содержит строку длины \(m\) — описание таблицы, которую вы сделали в том же формате, что во входных данных. Если существует несколько возможных способов заполнить некоторые пустые клетки, чтобы общее количество заполненных клеток было минимально, выведите любой. Примечание В первом наборе входных данных мы добавляем одну заполненную клетку между двумя городами, чтобы соединить их. Можно убедиться, что второе условие также выполняется. Во втором наборе входных данных мы также соединяем города одной заполненной клеткой, также выполняя второе условие. В третьем наборе входных данных, обратите внимание, что если мы заполним 3 клетки слева сверху, города будут соединены, однако второе условие не будет выполняться для пары клеток \((4, 2)\) и \((2, 4)\).
| |
|
|
E1. Непростительное заклятие (простая версия)
графы
жадные алгоритмы
Конструктив
Перебор
снм
Строки
*1400
Это простая версия задачи. В этой версии \(k\) всегда равно \(3\). Верховный чародей Визенгамота однажды поймал злого волшебника Drahyrt, но злой волшебник вернулся и хочет отомстить верховному чародею. Поэтому он украл у его ученика Гарри заклинание \(s\). Заклинание — это строка длины \(n\), состоящая из строчных латинских букв. Drahyrt хочет заменить заклинание на непростительное заклятие — строку \(t\). Drahyrt с помощью древней магии может менять местами буквы на расстоянии \(k\) или \(k+1\) в заклинании сколько угодно раз. В этой версии задачи можно менять буквы на расстоянии \(3\) или \(4\). Другими словами, Drahyrt может поменять буквы на позициях \(i\) и \(j\) в заклинании \(s\) если \(|i-j|=3\) или \(|i-j|=4\). Например, если \(s = \) «talant» и \(t = \) «atltna», то Drahyrt может действовать следующим образом: - поменять местами буквы на позициях \(1\) и \(4\), получив заклинание «aaltnt».
- поменять местами буквы на позициях \(2\) и \(6\), получив заклинание «atltna».
Вам даны заклинания \(s\) и \(t\). Может ли Drahyrt изменить заклинание \(s\) на \(t\)? Выходные данные Для каждого набора входных данных выведите в отдельной строке «YES» если Drahyrt может изменить заклинание \(s\) на \(t\) и «NO» иначе. Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ). Примечание Первый пример разобран в условии. Во втором примере можно действовать следующим образом: - Поменять местами буквы на позициях \(2\) и \(5\) (расстояние \(3\)), тогда получим заклинание «aaacbba».
- Поменять местами буквы на позициях \(4\) и \(7\) (расстояние \(3\)), тогда получим заклинание «aaaabbc».
Во третьем примере можно показать, что из строки \(s\) невозможно получить строку \(t\) меняя местами буквы на расстоянии \(3\) или \(4\). В четвертом примере подходит например следующая последовательность преобразований: - «accio» \(\rightarrow\) «aocic» \(\rightarrow\) «cocia» \(\rightarrow\) «iocca» \(\rightarrow\) «aocci» \(\rightarrow\) «aicco» \(\rightarrow\) «cicao».
В пятом примере можно показать, что невозможно получить из строки \(s\) строку \(t\). В шестом примере достаточно поменять местами две крайние буквы.
| |
|
|
E2. Непростительное заклятие (сложная версия)
графы
жадные алгоритмы
Конструктив
Перебор
поиск в глубину и подобное
снм
Строки
*1500
Это сложная версия задачи. В этой версии нет дополнительных ограничений на число \(k\). Верховный чародей Визенгамота однажды поймал злого волшебника Drahyrt, но злой волшебник вернулся и хочет отомстить верховному чародею. Поэтому он украл у его ученика Гарри заклинание \(s\). Заклинание — это строка длины \(n\), состоящая из строчных латинских букв. Drahyrt хочет заменить заклинание на непростительное заклятие — строку \(t\). Drahyrt с помощью древней магии может менять местами буквы на расстоянии \(k\) или \(k+1\) в заклинании сколько угодно раз. Другими словами, Drahyrt может поменять буквы на позициях \(i\) и \(j\) в заклинании \(s\) если \(|i-j|=k\) или \(|i-j|=k+1\). Например, если \(k = 3, s = \) «talant» и \(t = \) «atltna», то Drahyrt может действовать следующим образом: - поменять местами буквы на позициях \(1\) и \(4\), получив заклинание «aaltnt».
- поменять местами буквы на позициях \(2\) и \(6\), получив заклинание «atltna».
Вам даны заклинания \(s\) и \(t\). Может ли Drahyrt изменить заклинание \(s\) на \(t\)? Выходные данные Для каждого набора входных данных выведите в отдельной строке «YES» если Drahyrt может изменить заклинание \(s\) на \(t\) и «NO» иначе. Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ). Примечание Первый пример разобран в условии. Во втором примере можно менять соседние буквы местами, так что можем отсортировать строку например с помощью сортировки пузырьком. Во третьем примере можно показать, что из строки \(s\) невозможно получить строку \(t\) меняя местами буквы на расстоянии \(6\) или \(7\). В четвертом примере подходит например следующая последовательность преобразований: - «accio» \(\rightarrow\) «aocic» \(\rightarrow\) «cocia» \(\rightarrow\) «iocca» \(\rightarrow\) «aocci» \(\rightarrow\) «aicco» \(\rightarrow\) «cicao».
В пятом примере можно показать, что невозможно получить из строки \(s\) строку \(t\). В шестом примере достаточно поменять местами две крайние буквы.
| |
|
|
E. Цены на бензин
Деревья
разделяй и властвуй
снм
Структуры данных
хэши
*3000
Берляндия — это огромная страна, состоящая из \(n\) городов. Дорожную сеть Берляндии можно представить в виде корневого дерева, то есть всего в стране \(n - 1\) дорога, и от любого города можно добраться до любого другого ровно по одному пути, если не посещать никакой город дважды. Для удобства представления страны, для каждого города \(i\) зафиксирован город \(p_i\), равный первому городу, в который надо ехать из города \(i\), чтобы добраться до города \(1\). Иными словами, город \(p_i\) равен предку города \(i\), если дерево подвесить за город \(1\). В каждом городе Берляндии работает по одной заправке. У заправок особое ценообразование, и для каждой заправки зафиксирован диапазон цен, за которые там готовы продавать бензин. Заправка в городе с номером \(i\) готова продавать бензин по любой цене от \(l_i\) до \(r_i\) включительно. Король Берляндии — примерный семьянин, и в течение \(m\) лет каждый год у него рождалось по двое сыновей. Дети короля с раннего детства участвуют в государственных делах, и в конце каждого года они проверяют честность цен на бензин. С самого рождения дети короля, которые рождены в год \(i\), отвечают за проверку цен на бензин на путях от города \(a_i\) до города \(b_i\) и от города \(c_i\) до города \(d_i\) соответственно. Проверка происходит следующим образом: оба ребенка одновременно начинают путь от городов \(a_i\) и \(c_i\) соответственно. Первый сын короля, рождённый в год \(i\), двигается по пути от города \(a_i\) до города \(b_i\), а второй — от города \(c_i\) до города \(d_i\). Дети проверяют, что цена на бензин в городе \(a_i\) совпадает с ценой на бензин в городе \(c_i\). Далее они проверяют, что цена на бензин во втором городе на пути от \(a_i\) до \(b_i\) совпадает с ценой во втором городе на пути от \(c_i\) до \(d_i\). Далее они повторяют то же самое для пары третьих городов на их путях и так далее. В конце они проверяют, что цена на бензин в городе \(b_i\) совпадает с ценой на бензин в городе \(d_i\). Гарантируется, что длина пути от города \(a_i\) до города \(b_i\) совпадает с длиной пути от города \(c_i\) до города \(d_i\). Заправки должны строго подчиняться законам, а поэтому все проверки цен на бензин не должны выявлять нарушений. Помогите заправкам Берляндии выяснить, сколькими способами они могут выставлять цены на бензин в течение \(m\) лет. Другими словами, для каждого \(i\) от \(1\) до \(m\) посчитайте, сколькими способами можно выставить цены на бензин во всех заправках, чтобы после рождения первых \(i\) пар детей короля, все их проверки не выявили нарушений, а на любой заправке цена находилась в допустимом диапазоне цен. Так как число таких способов может быть большим, посчитайте ответ по модулю \(10^9 + 7\). Выходные данные В \(m\) строках выведите по одному числу. Число в \(i\)-й строке должно равняться числу способов выставить цены на бензин во всех городах, чтобы дети короля, рождённые в годы до \(i\)-го включительно не выявили нарушений в проверках. Числа выводите по модулю \(10^9 + 7\). Примечание Рассмотрим первый пример. После рождения первых двух сыновей цены в городах \(1\) и \(2\) должны быть равны. Всего существует 2 способа выбрать одинаковую цену на бензин для городов \(1\) и \(2\), чтобы она входила в допустимый диапазон цен для этих городов. Значит, всего способов выставить цены на бензин: \(2 \cdot 3 \cdot 3 \cdot 1 = 18\). Вторая пара сыновей будет проверять цены на путях \(1 - 2\) и \(2 - 1\). Значит, цены на бензин в городах \(1\) и \(2\) должны совпадать, что уже выполняется. Поэтому после рождения второй пары сыновей ответ никак не изменился. Третья пара сыновей будет проверять цены на путях \(3 - 1 - 2 - 4\) и \(4 - 2 - 1 - 3\). Тогда цена не бензин в городе \(3\) должна быть равна цене в городе \(4\), и цена в городе \(1\) должна быть равна цене в городе \(2\). Цены в городах \(1\) и \(2\) уже одинаковые. Для городов \(3\) и \(4\) существует 2 способа выбрать одинаковую цену на бензин, чтобы она входила в допустимый диапазон цен для этих городов. Значит, всего способов выставить цены на бензин: \(2 \cdot 2 \cdot 1 = 4\). Четвертая пара сыновей будет проверять цены на путях \(3 - 1 - 2 - 4\) и \(3 - 1 - 2 - 5\). Это означает, что цены в городах \(4\) и \(5\) должны быть равны, и так как цены в городах \(3\) и \(4\) уже совпадают, то в городах \(3\), \(4\) и \(5\) должна быть одинаковая цена на бензин. Цена на бензин в городе \(3\) должна быть не больше 3, а цена на бензин в городе \(5\) должна быть не меньше 4. Значит, после рождения четвёртой пары сыновей не существует способов выставить цены на бензин так, чтобы все проверки выполнялись и цены находились в необходимых диапазонах.
| |
|
|
G. Управление потоком
реализация
снм
Структуры данных
*3500
У Раджа есть одна физическая сетевая линия, которая соединяет его офис с интернетом. Пропускная способность этой линии составляет \(b\) байт в миллисекунду. Есть \(n\) пользователей, которые хотели бы использовать эту сетевую линию для передачи некоторых данных. \(i\)-й из них будет использовать линию начиная с миллисекунды \(s_i\) и до миллисекунды \(f_i\) включительно. Изначально он установит свою скорость передачи данных в значение \(d_i\). Это означает, что он будет использовать скорость передачи данных, равную \(d_i\), в течение миллисекунды \(s_i\), а затем она будет меняться в соответствии с процедурой, описанной ниже. Контроль за соблюдением пропускной способности линии происходит следующим образом. Предположим, что есть \(m\) пользователей, пытающихся передать какие-то данные по заданной сетевой линии в течение миллисекунды \(x\). Обозначим за \(t_i\) скорость передачи данных у \(i\)-м из этих \(m\) пользователей в начале данной миллисекунды. Все \(t_i\) являются целыми неотрицательными значениями. - Если \(m = 0\), то есть в течение этой миллисекунды нет пользователей, пытающихся передать данные, ничего не происходит.
- Если сумма всех \(t_i\) меньше или равна \(b\), то каждый активный пользователь успешно завершает свою передачу данных (\(i\)-й активный пользователь передаёт \(t_i\) байт). После этого скорость передачи данных каждого активного пользователя увеличивается на \(1\), то есть каждое \(t_i\) увеличивается на \(1\).
- Если сумма всех \(t_i\) больше, чем \(b\), то возникает перегрузка линии и в эту миллисекунду вообще никому не удаётся передать данные. В таком случае каждое значение \(t_i\) уменьшается вдвое, то есть каждое \(t_i\) заменяется на \(\lfloor \frac{t_i}{2} \rfloor\).
Радж знает все значения \(n\), \(b\), \(s_i\), \(f_i\) и \(d_i\), он хочет подсчитать общее количество байтов, переданных всеми пользователями в совокупности. Выходные данные Выведите одно целое число — общее количество байтов, которое все пользователи успешно передадут. Примечание Рассмотрим первый пример. - Миллисекунда \(1\): Пользователь \(1\) передает \(2\) байта.
- Миллисекунда \(2\): Пользователь \(1\) передает \(3\) байта.
- Миллисекунда \(3\): Возникает перегрузка, и никто не передает данные.
- Миллисекунда \(4\): Пользователь \(1\) передает \(2\) байта.
- Миллисекунда \(5\): Пользователь \(1\) передает \(3\) байта.
Во втором примере в каждую миллисекунду с \(7\)-й по \(11\)-ю включительно возникает перегрузка, и единственный пользователь уменьшает свою скорость вдвое. Однако он не успевает достаточно снизить скорость до отключения. Рассмотрим третий пример. - Миллисекунда \(1\): Пользователь \(1\) передает \(1\) байт.
- Миллисекунда \(2\): Пользователь \(1\) передает \(2\) байта.
- Миллисекунда \(3\): Пользователь \(1\) передает \(3\) байта.
- Миллисекунда \(4\): Пользователь \(1\) передает \(4\) байта.
- Миллисекунда \(5\): Пользователь \(1\) передает \(5\) байтов.
- Миллисекунда \(6\): Пользователь \(1\) передает \(6\) байтов.
- Миллисекунда \(7\): Возникает перегрузка, и никто не передает данные.
- Миллисекунда \(8\): Пользователь \(1\) передает \(3\) байта. Пользователь \(2\) передает \(3\) байта.
- Миллисекунда \(9\): Возникает перегрузка, и никто не передает данные.
- Миллисекунда \(10\): Пользователь \(1\) передает \(2\) байта. Пользователь \(2\) передает \(2\) байта.
- Миллисекунда \(11\): Пользователь \(1\) передает \(3\) байта. Пользователь \(2\) передает \(3\) байта.
- Миллисекунда \(12\): Возникает перегрузка, и никто не передает данные.
- Миллисекунда \(13\): Пользователь \(2\) передает \(2\) байта.
- Миллисекунда \(14\): Пользователь \(2\) передает \(3\) байта.
- Миллисекунда \(15\): Пользователь \(2\) передает \(4\) байта.
- Миллисекунда \(16\): Пользователь \(2\) передает \(5\) байтов.
- Миллисекунда \(17\): Пользователь \(2\) передает \(6\) байтов.
- Миллисекунда \(18\): Возникает перегрузка, и никто не передает данные.
- Миллисекунда \(19\): Пользователь \(2\) передает \(3\) байта.
- Миллисекунда \(20\): Пользователь \(2\) передает \(4\) байта.
| |
|
|
D. Мастер СНМ
дп
Комбинаторика
математика
снм
*2500
Вам дано целое число \(n\) и массив \(a\) длины \(n-1\), элементы которого либо \(0\), либо \(1\). Определим стоимость перестановки \(^\dagger\) \(p\) длины \(m-1\) (\(m \leq n\)) следующим образом. Пусть \(G\) - граф из \(m\) вершин с номерами от \(1\) до \(m\), не содержащий ребер. Для каждого \(i\) от \(1\) до \(m-1\) выполните следующие операции: - определим \(u\) и \(v\) как (различные) вершины с только входящими ребрами\(^{\dagger\dagger}\) в компонентах слабой связности \(^\ddagger\), содержащих вершины \(p_i\) и \(p_i+1\) соответственно
- в графе \(G\), добавим направленное ребро из вершины \(v\) в \(u\), если \(a_{p_i}=0\), иначе добавим направленное ребро из вершины \(u\) в \(v\) (если \(a_{p_i}=1\)).
Заметим, что после каждого шага можно показать, что каждая компонента слабой связности \(G\) имеет ровно одну вершину с только входящими рёбрами. Тогда, значение \(p\) — это количество входящих ребер \(G\) в вершину \(1\). Для каждого \(k\) от \(1\) до \(n-1\) найдите сумму стоимостей всех \(k!\) перестановок длины \(k\). Поскольку эта величина может быть большой, от вас требуется вычислить ее только по модулю \(998\,244\,353\). Операции при \(n=3\), \(a=[0,1]\) и \(p=[1,2]\) \(^\dagger\) Перестановка длины \(n\) - это массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) - перестановка, но \([1,2,2]\) - не перестановка (\(2\) встречается в массиве дважды), и \([1,3,4]\) - тоже не перестановка (\(n=3\), но в массиве есть \(4\)). \(^\ddagger\) Компоненты слабой связности направленного графа — это то же самое, что и компоненты неориентированной версии графа. Формально, для направленного графа \(G\) определите граф \(H\), где для всех ребер \(a \to b\) в \(G\) добавляется неориентированное ребро \(a \leftrightarrow b\) в \(H\). Тогда компоненты слабой связности \(G\) являются компонентами \(H\). \(^{\dagger\dagger}\) Заметим, что вершина, не имеющая ребер, считается имеющей только входящие ребра. Выходные данные Для каждого набора входных данных выведите \(n-1\) целых чисел в строке. \(i\)-е число является ответом для \(k=i\), по модулю \(998\,244\,353\). Примечание Рассмотрим первый набор входных данных. Когда \(k=1\), существует только \(1\) перестановка \(p\). - Когда \(p=[1]\), мы добавим одно ребро из вершины \(2\) в \(1\). Вершина \(1\) будет иметь \(1\) входящее ребро. Поэтому значение \([1]\) равно \(1\).
Поэтому, когда \(k=1\), ответ равен \(1\). Когда \(k=2\), существует \(2\) перестановки \(p\). - Когда \(p=[1,2]\), мы добавим ребро из вершины \(2\) в \(1\) и ребро из \(3\) в \(1\). Вершина \(1\) будет иметь \(2\) входящих ребер. Таким образом, значение \([1,2]\) равно \(2\).
- Когда \(p=[2,1]\), мы добавим ребро из вершины \(3\) в \(2\) и ребро из \(2\) в \(1\). Вершина \(1\) будет иметь входящее ребро \(1\). Таким образом, значение \([2,1]\) равно \(1\).
Поэтому, когда \(k=2\), ответ будет \(2+1=3\).
| |
|
|
E. Монстры
графы
жадные алгоритмы
Перебор
поиск в глубину и подобное
снм
Структуры данных
*2100
Вам дан неориентированный граф с \(n\) вершинами и \(m\) ребрами. Изначально для каждой вершины \(i\) существует монстр с опасностью \(a_{i}\) в этой вершине. Вы можете победить монстра с опасностью \(a_{i}\) тогда и только тогда, когда вы уже победили как минимум \(a_{i}\) других монстров. Вы хотите победить всех монстров. Сначала вы выбираете некоторую вершину \(s\) и побеждаете монстра в этой вершине (поскольку вы еще не побеждали монстров, \(a_{s}\) должно быть равно \(0\)). Затем вы можете перемещаться в соседние вершины. Если вы хотите переместиться из вершины \(u\) в вершину \(v\), то должно выполняться следующее: либо монстр в вершине \(v\) уже побежден ранее, либо вы можете победить его сейчас. Во втором случае вы побеждаете монстра в вершине \(v\) и достигаете вершины \(v\). Вы можете проходить вершины и ребра любое количество раз. Определите, сможете ли вы победить всех монстров или нет. Выходные данные Для каждого наборов входных данных выведите «YES», если вы можете победить всех монстров, и «NO» иначе. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В первом наборе входных данных мы можем начать с вершины \(3\), победить монстра в ней, затем перейти в вершины \(2\), \(1\) в этом порядке, победив монстров в них. Затем вернуться к вершине \(3\) и пойти к вершине \(4\), победив в ней монстра. В третьем наборе входных данных нет пути к вершине \(4\), если мы начинаем с вершины \(1\). Также нет пути к вершинам \(1\), \(2\), \(3\), если мы начнем с вершины \(4\).
| |
|
|
F. Вышки связи
Перебор
разделяй и властвуй
снм
*2700
Рассмотрим \(n\) вышек связи, пронумерованных от \(1\) до \(n\). Они соединены \(m\) двунаправленными проводами. У каждой вышки есть определенный набор частот, которые она принимает, \(i\)-я из них принимает частоты от \(l_i\) до \(r_i\). Скажем, что вышка \(b\) доступна из вышки \(a\), если существует такая частота \(x\) и последовательность вышек \(a=v_1, v_2, \dots, v_k=b\), что соседние вышки в последовательности напрямую соединены проводом, и каждая из них принимает частоту \(x\). Обратите внимание, что доступность не является транзитивной, т.е. если \(b\) доступна из \(a\), а \(c\) доступна из \(b\), \(c\) может быть недоступна из \(a\). Ваша задача — определить номера вышек связи, доступных из \(1\)-й вышки. Выходные данные В единственную строку выведите различные целые числа от \(1\) до \(n\) в порядке возрастания — номера вышек связи, доступных из \(1\)-й вышки.
| |
|
|
C. LuoTianyi и XOR-дерево
Деревья
дп
жадные алгоритмы
поиск в глубину и подобное
снм
Структуры данных
*2500
LuoTianyi дала вам дерево со значениями в вершинах, корнем этого дерева является вершина \(1\). За одну операцию вы можете изменить значение в любой вершине на любое неотрицательное целое число. Вам нужно найти минимальное количество операций, которые нужно сделать, чтобы побитовое исключающее ИЛИ на любом пути от корня до листа\(^{\dagger}\) было равно нулю. \(^{\dagger}\)Листом в корневом дереве называется вершина, которая имеет ровно одного соседа, и при этом не является корнем. Выходные данные Выведите единственное целое число — минимальное количество операций. Примечание Дерево из первого примера: Если мы поменяем значение в вершине \(2\) на \(3\), значение в вершине \(5\) на \(4\), значение в вершине \(6\) на \(6\), то дерево станет подходящим. Побитовое исключающее ИЛИ от корня до листа \(2\) будет равно \(3 \oplus 3=0\). Побитовое исключающее ИЛИ от корня до листа \(5\) будет равно \(4 \oplus 7 \oplus 3=0\). Побитовое исключающее ИЛИ от корня до листа \(6\) будет равно \(6 \oplus 5 \oplus 3=0\). Дерево из второго примера: Если мы поменяем значение в вершине \(2\) на \(4\), значение в вершине \(3\) на \(27\), значение в вершине \(6\) на \(20\), то дерево станет подходящим. Побитовое исключающее ИЛИ от корня до листа \(6\) будет равно \(20 \oplus 19 \oplus 7=0\). Побитовое исключающее ИЛИ от корня до листа \(8\) будет равно \(11 \oplus 27 \oplus 4 \oplus 19 \oplus 7=0\). Побитовое исключающее ИЛИ от корня до листа \(4\) будет равно \(16 \oplus 4 \oplus 19 \oplus 7=0\). Побитовое исключающее ИЛИ от корня до листа \(7\) будет равно \(16 \oplus 4 \oplus 19 \oplus 7=0\). В третьем примере единственным листом является вершина \(4\), и побитовое исключающее ИЛИ на пути до неё равно \(1 \oplus 2 \oplus 1 \oplus 2 = 0\), поэтому нам не нужно изменять значения. В четвёртом примере мы можем изменить значение в вершине \(1\) на \(5\), а значение в вершине \(4\) на \(0\). Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ.
| |
|
|
B1. Сортировка подотрезков (простая версия)
Бинарный поиск
Деревья
дп
жадные алгоритмы
снм
*2000
Единственная разница между простой и сложной версиями состоит в ограничениях на \(t\) и \(n\). Вам задан массив \(a\), состоящий из \(n\) различных целых чисел \(a_1, a_2, \ldots, a_n\). Определим стоимость массива \(p_1, p_2, \ldots p_k\) как минимальное количество времени, необходимое для сортировки этого массива с использованием произвольного количества операций сортировки диапазона. В каждой операции сортировки диапазона вы будете делать следующее: - Выберите два целых числа \(l\) и \(r\) (\(1 \le l < r \le k\)).
- Отсортируйте подмассив \(p_l, p_{l + 1}, \ldots, p_r\) за \(r - l\) секунд.
Пожалуйста, посчитайте сумму стоимостей по всем подмассивам массива \(a\). Подмассив массива определяется как непрерывная последовательность элементов массива. Выходные данные Для каждого набора входных данных выведите сумму стоимостей по всем подмассивам массива \(a\). Примечание В первом наборе входных данных: - Подмассив \([6]\) уже отсортирован, поэтому его стоимость равна \(0\).
- Подмассив \([4]\) уже отсортирован, поэтому его стоимость равна \(0\).
- Подмассив \([6, 4]\) можно отсортировать за одну операцию, выбрав \(l = 1\) и \(r = 2\). Его стоимость равна \(1\).
Сумма стоимостей по всем подмассивам данного массива равна \(0 + 0 + 1 = 1\). Во втором наборе входных данных: - Подмассив \([3]\) уже отсортирован, поэтому его стоимость равна \(0\).
- Подмассив \([10]\) уже отсортирован, поэтому его стоимость равна \(0\).
- Подмассив \([6]\) уже отсортирован, поэтому его стоимость равна \(0\).
- Подмассив \([3, 10]\) уже отсортирован, поэтому его стоимость равна \(0\).
- Подмассив \([10, 6]\) можно отсортировать за одну операцию, выбрав \(l = 1\) и \(r = 2\). Его стоимость равна \(2 - 1 = 1\).
- Подмассив \([3, 10, 6]\) можно отсортировать за одну операцию, выбрав \(l = 2\) и \(r = 3\). Его стоимость равна \(3 - 2 = 1\).
Сумма стоимостей по всем подмассивам данного массива равна \(0 + 0 + 0 + 0 + 1 + 1 = 2\).
| |
|
|
E. Озера
графы
поиск в глубину и подобное
реализация
снм
*1100
Дана сетка \(a\) размера \(n \times m\) из неотрицательных целых чисел, где \(a_{i,j}\) представляет глубину воды в \(i\)-й строке и \(j\)-м столбце. Озеро — это набор ячеек, таких что: - Каждая ячейка в наборе имеет \(a_{i,j} > 0\)
- Существует путь между любой парой ячеек в озере, двигаясь вверх, вниз, влево или вправо, несколько раз и не наступая на ячейку с \(a_{i,j} = 0\).
Объем озера — это сумма глубин всех ячеек в озере. Найдите наибольший объем озера в сетке. Выходные данные Для каждого теста выведите одно целое число — наибольший объем озера в сетке.
| |
|
|
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\)
Выходные данные Для каждого набора входных данных выведите два целых числа — минимальное и максимальное количество хороводов, которое могло быть.
| |
|
|
G. Ксюша и шиншилла
Деревья
дп
жадные алгоритмы
Конструктив
поиск в глубину и подобное
реализация
снм
*1800
У Ксюши есть домашняя шиншилла, дерево на \(n\) вершинах и огромные ножницы. Деревом называется связный граф без циклов. Сейчас Ксюша сидит на скучном уроке физики и думает над тем, как развлечь своего питомца. Шиншиллам нравится играть с веточками. Веточкой называется дерево из \(3\) вершин. Веточка выглядит так. Разрезом называется удаление некоторого (ещё не отрезанного) ребра в дереве. У Ксюши полно свободного времени, поэтому она может себе позволить сделать достаточно разрезов, чтобы дерево распалось на веточки. Другими словами, после нескольких (возможно нуля) разрезов, каждая вершина должна принадлежать ровно одной веточке. Помогите Ксюше выбрать отрезаемые рёбра или сообщите, что сделать это невозможно. Выходные данные Выведите ответ для каждого набора входных данных. Если искомого способа разрезать дерево не существует, выведите \(-1\). В противном случае выведите целое число \(k\) — количество отрезаемых рёбер. В следующей строке выведите \(k\) различных целых чисел \(e_i\) (\(1 \le e_i < n\)) — номера отрезаемых рёбер. Если \(k = 0\), выведите вместо этого пустую строку. Если решений несколько, вы можете вывести любое. Примечание Первый набор входных данных в первом тесте.
| |
|
|
E. Прекрасные таблицы
2-sat
графы
Конструктив
поиск в глубину и подобное
снм
*2400
Таблицу размерами \(n \times m\), состоящую из символов, назовём прекрасной, если она удовлетворяет следующим трём условиям: - Каждый символ — это 'A', 'B' или 'C'.
- В любой непрерывной подтаблице размерами \(2 \times 2\) каждая из трёх букв встречается хотя бы один раз.
- В любых двух клетках, имеющих общую сторону, записаны разные буквы.
Через \((x,y)\) обозначим клетку на пересечении \(x\)-й сверху строки и \(y\)-го слева столбца. Вы хотите построить прекрасную таблицу, которая бы также удовлетворяла \(k\) ограничениям. Каждое ограничение задаёт условие на две клетки — \((x_{i,1},y_{i,1})\) и \((x_{i,2},y_{i,2})\), которые имеют ровно один общий угол. Вы хотите, чтобы в вашей таблице в клетках \((x_{i,1},y_{i,1})\) и \((x_{i,2},y_{i,2})\) были записаны одинаковые буквы. Определите, существует ли прекрасная таблица, удовлетворяющая всем ограничениям. Входные данные Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных. Далее следует описание наборов входных данных. Первая строка каждого набора входных данных содержит три целых числа: \(n\), \(m\) и \(k\) (\(2 \le n,m \le 2 \cdot 10^3\), \(1 \le k \le 4 \cdot 10^3\)). Каждая из следующих \(k\) строк содержит по четыре целых числа: \(x_{i,1}\), \(y_{i,1}\), \(x_{i,2}\) и \(y_{i,2}\) (\(1 \le x_{i,1} < x_{i,2} \le n\), \(1 \le y_{i,1},y_{i,2} \le m\)). Гарантируется, что \((x_{i,2},y_{i,2}) = (x_{i,1}+1,y_{i,1}+1)\) или \((x_{i,2},y_{i,2}) = (x_{i,1}+1,y_{i,1}-1)\). Пары клеток попарно различны, т. е. для всех \(1 \le i < j \le k\) неверно, что \(x_{i,1} = x_{j,1}\), \(y_{i,1} = y_{j,1}\), \(x_{i,2} = x_{j,2}\) и \(y_{i,2} = y_{j,2}\) одновременно. Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^3\). Гарантируется, что сумма значений \(m\) по всем наборам входных данных не превосходит \(2 \cdot 10^3\). Гарантируется, что сумма значений \(k\) по всем наборам входных данных не превосходит \(4 \cdot 10^3\). Выходные данные Для каждого набора входных данных выведите «YES», если существует прекрасная таблица, удовлетворяющая всем ограничениям. Иначе выведите «NO». Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В первом наборе входных данных следующая прекрасная таблица удовлетворяет всем ограничениям: Во втором наборе входных данных два ограничения означают, что в клетках \((1,1)\) и \((2,2)\) записаны одинаковые буквы, а также в клетках \((1,2)\) и \((2,1)\) записаны одинаковые буквы. Поэтому невозможно сделать так, чтобы единственная подтаблица \(2 \times 2\) содержала бы все три буквы хотя бы по разу.
| |
|
|
H. Циклы, кратные трём
дп
Комбинаторика
математика
снм
Структуры данных
*3400
Дана последовательность \(a_1,\dots,a_n\) длины \(n\), изначально все её элементы — пустые. Над последовательностью совершают \(n\) обновлений, в каждом из которых один из элементов \(a\) становится некоторым числом, таким образом, что после всех обновлений \(a\) становится перестановкой \(1,2,\dots,n\). После каждого обновления найдите число способов (по модулю \(998\,244\,353\)) заполнить остающиеся пустые места в \(a\) так, чтобы \(a\) стала перестановкой \(1,2,\dots,n\), причём длины всех циклов в \(a\) стали кратны \(3\). Перестановкой \(1,2,\dots,n\) является последовательность длины \(n\), состоящая из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Циклом в перестановке \(a\) называется последовательность попарно различных чисел \((i_1,\dots,i_k)\), такая что \(i_2 = a_{i_1},i_3 = a_{i_2},\dots,i_k = a_{i_{k-1}},i_1 = a_{i_k}\). Длина этого цикла равна числу \(k\), которое кратно \(3\), если и только если \(k \equiv 0 \pmod 3\). Выходные данные Выведите \(n\) строк: число способов (по модулю \(998\,244\,353\)) после \(1,2,\dots,n\) обновлений. Примечание В первом примере, скажем, после \(3\)-го обновления есть \(3\) способа заполнить последовательность \(a = [4,\_,2,5,\_,\_]\): - \([4,1,2,5,6,3]\): имеем один цикл \((1\,4\,5\,6\,3\,2)\) длины \(6\).
- \([4,6,2,5,1,3]\): имеем два цикла \((1\,4\,5)\) и \((2\,6\,3)\), с длинами \(3\) и \(3\).
- \([4,6,2,5,3,1]\): имеем один цикл \((1\,4\,5\,3\,2\,6)\) длины \(6\).
Во втором примере первое же обновление создаёт цикл длины \(1\), так что нет ни одного способа сделать так, чтобы длины всех циклов были кратны \(3\).
| |
|
|
D. Рейтинговая система
Бинарный поиск
дп
жадные алгоритмы
математика
Перебор
снм
Структуры данных
*1800
Вы разрабатываете рейтинговую систему для онлайн-игры. Каждый раз, когда игрок участвует в матче в этой игре, его рейтинг меняется в зависимости от результатов. Изначально рейтинг игрока равен \(0\). Он будет участвовать в \(n\) матчах; после \(i\)-го матча рейтинг изменяется на \(a_i\) (рейтинг увеличивается на \(a_i\), если \(a_i\) положительное, или уменьшается на \(|a_i|\), если отрицательное. В последовательности \(a\) нет нулей). В системе есть дополнительное правило: для заданного целого числа \(k\), если рейтинг игрока достиг значения \(k\), он никогда не опустится ниже него. Формально, если рейтинг игрока хотя бы \(k\), а изменение рейтинга должно сделать его меньше \(k\), то рейтинг снизится ровно до \(k\). Ваша задача состоит в том, чтобы определить значение \(k\) таким образом, чтобы рейтинг игрока после всех \(n\) матчей был максимально возможным (среди всех возможных целочисленных значений \(k\)). Если существует несколько возможных ответов, выведите любой из них. Выходные данные Для каждого набора входных данных выведите одно целое число \(m\) (\(-10^{18} \le m \le 10^{18}\)) — такое значение \(k\), при котором рейтинг игрока будет максимально возможным. Можно показать, что существует хотя бы одно такое значение, которое удовлетворяет ограничениям \(-10^{18} \le m \le 10^{18}\). Примечание В первом примере, если \(k=3\), то рейтинг изменяется следующим образом: \(0 \rightarrow 3 \rightarrow 3 \rightarrow 4 \rightarrow 6\). Во втором примере, если \(k=0\), то рейтинг изменяется следующим образом: \(0 \rightarrow 0 \rightarrow 0 \rightarrow 0\). В третьем примере, если \(k=25\), то рейтинг изменяется следующим образом: \(0 \rightarrow 4 \rightarrow 6\). В четвертом примере, если \(k=6\), то рейтинг изменяется следующим образом: \(0 \rightarrow 5 \rightarrow 6 \rightarrow 6 \rightarrow 8 \rightarrow 7 \rightarrow 6 \rightarrow 8\).
| |
|
|
D. Профессор Хигасиката
жадные алгоритмы
реализация
снм
Строки
Структуры данных
*1900
Джосуке устал от спокойной жизни в Мориохе. Пойдя по стопам своего племянника Дзётаро, он решает упорно учиться и стать профессором информатики. Просматривая в Интернете задачи по программированию, он наткнулся на следующую. Пусть \(s\) — бинарная строка длины \(n\). Операция над \(s\) определяется как выбор двух различных целых чисел \(i\) и \(j\) (\(1 \leq i < j \leq n\)), и обмен местами символов \(s_i, s_j\). Рассмотрим \(m\) строк \(t_1, t_2, \ldots, t_m\), где \(t_i\) — подстрока\(^\dagger\) из \(s\) от \(l_i\) до \(r_i\). Определим \(t(s) = t_1+t_2+\ldots+t_m\) как конкатенацию строк \(t_i\) в таком порядке. Существует \(q\) обновлений строки. В \(i\)-м обновлении \(s_{x_i}\) инвертируется. То есть, если \(s_{x_i}=1\), то \(s_{x_i}\) становится \(0\) и наоборот. После каждого обновления найдите минимальное количество операций, которые нужно выполнить над \(s\), чтобы сделать \(t(s)\) лексикографически как можно большим\(^\ddagger\). Обратите внимание, что на самом деле ни одна операция не применяется. Нужно найти только количество операций. Помогите Йосуке в его мечте, решив за него эту задачу. —————————————————————— \(\dagger\) Строка \(a\) является подстрокой строки \(b\), если \(a\) может быть получена из \(b\) удалением нескольких (возможно, нуля или всех) символов из начала и нескольких (возможно, нуля или всех) символов из конца. \(\ddagger\) Строка \(a\) лексикографически больше строки \(b\) такой же длины тогда и только тогда, когда выполняется следующее условие: - в первой позиции, где \(a\) и \(b\) отличаются, в строка \(a\) стоит \(1\), а в строке \(b\) стоит \(0\).
Выходные данные Выведите \(q\) целых чисел. В строке \(i\) выведите минимальное количество операций, которое необходимо выполнить над \(s\), чтобы получить лексикографически наибольшую возможную строку \(t(s)\) после \(i\)-го обновления. Примечание В первом примере: Изначально \(t(s) = s(1,2) + s(1,2) = 0101\). После \(1\)-го запроса, \(s\) становится \(11\) и, соответственно, \(t\) становится \(1111\). Никаких операций выполнять не нужно, так как \(t(s)\) уже является лексикографически наибольшей строкой из возможных. После \(2\)-го запроса \(s\) становится \(01\) и, следовательно, \(t\) становится \(0101\). Необходимо выполнить операцию \(1\), поменяв местами \(s_1\) и \(s_2\). Следовательно, \(t(s)\) становится \(1010\), что является лексикографически наибольшей строкой, которую можно получить.
| |
|
|
E. Максимум справа от минимума
Бинарный поиск
дп
разделяй и властвуй
снм
Структуры данных
*2300
Дана перестановка \(p\) длины \(n\) — массив, состоящий из целых чисел от \(1\) до \(n\), все различные. Пусть \(p_{l,r}\) задает подмассив — массив, полученный при выписывании элементов с позиции \(l\) по позицию \(r\), включительно. Пусть \(\mathit{maxpos}_{l,r}\) задает позицию максимального элемента на \(p_{l,r}\). Аналогично, пусть \(\mathit{minpos}_{l,r}\) задает позицию минимального элемента на нем. Посчитайте количество подмассивов \(p_{l,r}\) таких, что \(\mathit{maxpos}_{l,r} > \mathit{minpos}_{l,r}\). Выходные данные Выведите одно целое число — количество подмассивов \(p_{l,r}\) таких, что \(\mathit{maxpos}_{l,r} > \mathit{minpos}_{l,r}\).
| |
|
|
H. Третья буква
графы
жадные алгоритмы
поиск в глубину и подобное
реализация
снм
*1700
Чтобы выиграть свою самую трудную битву, Мирча придумал отличную стратегию для своей армии. У него есть \(n\) солдат, и он решил расположить их определенным образом в лагерях. Каждый солдат должен принадлежать ровно одному лагерю, и на каждой целочисленной точке оси \(x\) находится один лагерь (на точках \(\cdots, -2, -1, 0, 1, 2, \cdots\)). Стратегия состоит из \(m\) условий. Условие \(i\) гласит, что солдат \(a_i\) должен принадлежать лагерю, который находится в \(d_i\) метрах перед лагерем, к которому принадлежит человек \(b_i\). (Если \(d_i < 0\), то лагерь \(a_i\) должен быть в \(-d_i\) метрах позади лагеря \(b_i\).) Теперь Мирча задается вопросом, существует ли разбиение солдат, которое удовлетворяет условию, и просит вашей помощи! Ответьте «YES», если существует разбиение из \(n\) солдат, которое удовлетворяет всем \(m\) условиям, и «NO» в противном случае. Обратите внимание, что два разных солдата могут быть размещены в одном лагере. Выходные данные Для каждого набора входных данных выведите «YES», если существует такое расположение \(n\) солдат, которое удовлетворяет всем \(m\) условиям, и «NO» в противном случае. Примечание В первом примере мы можем разделить солдат на лагеря следующим образом: - Солдат \(1\) в лагере с координатой \(x = 3\).
- Солдат \(2\) в лагере с координатой \(x = 5\).
- Солдат \(3\) в лагере с координатой \(x = 9\).
- Солдат \(4\) в лагере с координатой \(x = 11\).
Для второго примера не существует разбиения, которое может удовлетворить все ограничения одновременно. Для третьего примера не существует разбиения, которое удовлетворяет всем условиям, так как мы получаем противоречивую информацию о той же паре. Одно из возможных разбиений, удовлетворяющих условиям в четвёртом примере: - Солдат \(1\) в лагере с координатой \(x = 10\).
- Солдат \(2\) в лагере с координатой \(x = 13\).
- Солдат \(3\) в лагере с координатой \(x = -2023\).
- Солдат \(4\) в лагере с координатой \(x = -2023\).
| |
|
|
G. Влад и горы
Бинарный поиск
графы
Деревья
реализация
снм
сортировки
Структуры данных
*2000
Влад решил отправиться в путешествие в горы. Всего он планирует перемещаться по \(n\) горам, между некоторыми из которых есть дороги. Горы имеют высоты, высота \(i\)-й горы равна \(h_i\). Если между горами \(i\) и \(j\) есть дорога, то Влад может перейти с горы \(i\) на гору \(j\), потратив при этом \(h_j - h_i\) единиц энергии. Если при переходе его энергия должна опуститься ниже нуля, он не сможет перейти с горы \(i\) на гору \(j\). Обратите внимание, что \(h_j - h_i\) может быть отрицательным и тогда энергия восстановится. Влад хочет рассмотреть разные варианты маршрута, поэтому просит вас ответить на следующие запросы: можно ли построить какой-либо маршрут, начинающийся на горе \(a\) и заканчивающийся на горе \(b\), если изначально у него есть \(e\) единиц энергии? Выходные данные Для каждого запроса выведите «YES», если Влад может составить маршрут от горы \(a\) до горы \(b\), и «NO» в противном случае. Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ). В примерах ниже ответы на разные наборы данных разделены пустой строкой, вы можете её не выводить.
| |
|
|
G. Подсчет графов
графы
Деревья
жадные алгоритмы
Комбинаторика
разделяй и властвуй
снм
сортировки
*2000
Дано дерево, состоящее из \(n\) вершин. Дерево — это связный неориентированный граф без циклов. Каждое ребро дерева имеет свой вес, \(w_i\). Ваша задача — подсчитать количество различных графов, для которых одновременно выполняются четыре условия: - В графе нет петель и кратных ребер.
- Веса на ребрах графа целые числа и не превышают \(S\).
- Граф имеет ровно одно минимальное остовное дерево.
- Минимальное остовное дерево графа является заданным деревом.
Два графа считаются различными, если их наборы рёбер различны с учётом весов рёбер. Ответ может быть большим, выведите его по модулю \(998244353\). Выходные данные Для каждого теста выведите количество различных графов, удовлетворяющих условиям, по модулю \(998244353\). Примечание В первом примере существует единственный граф, который и является заданным деревом. Во втором примере заданное дерево выглядит так: Ниже изображены все возможные графы для второго примера, красным цветом выделено минимальное остовное дерево:
| |
|
|
D. Андрей и побег из Капиграда
Бинарный поиск
дп
жадные алгоритмы
снм
сортировки
Структуры данных
*1800
В Капиграде, столице Тяголяндии, произошло происшествие, все капибары в городе одичали и стали кидаться мандаринами. Андрей был вынужден сбежать из города максимально далеко, пользуясь порталами. Тяголяндия представляет из себя числовую прямую, а Капиград находится в точке \(0\). По всей Тяголяндии расставлены \(n\) порталов, каждый из которых характеризуется четырьмя целыми числами \(l_i\), \(r_i\), \(a_i\) и \(b_i\) (\(1 \le l_i \le a_i \le b_i \le r_i \le 10^9\)). Обратите внимание, что отрезок \([a_i, b_i]\) содержится в отрезке \([l_i, r_i]\). Если Андрей находится на отрезке \([l_i, r_i]\), тогда портал может его телепортировать в любую точку на отрезке \([a_i, b_i]\). У Андрея есть проездной, который позволяет ему пользоваться порталами неограниченное количество раз. Андрей считает, что точка \(x\) находится на отрезке \([l, r]\), если выполняется неравенство \(l \le x \le r\). У Андрея есть \(q\) вариантов откуда начать свой побег, каждый вариант характеризуется одним целом числом \(x_i\) — позицией начала побега. Он хочет убежать от Капиграда как можно дальше (в точку с максимально возможной координатой). Помогите Андрею узнать, насколько далеко от Капиграда он может убежать, начиная в каждой из \(q\) позиций. Выходные данные Для каждого набора входных данных выведите одну строку из \(q\) целых чисел, содержащую ответы на интересующие Андрея вопросы. Примечание В первом наборе входных данных: Оптимальные действия при старте из каждой позиции: - Воспользуемся порталом \(1\) и телепортируемся в точку \(b_1 = 14\).
- Воспользуемся сначала порталом \(2\) и телепортируемся в точку \(6\), находящуюся на отрезке \([l_1, r_1] = [6, 17]\), после чего воспользуемся порталом \(1\) и телепортируемся в точку \(b_1 = 14\).
- Останемся в точке \(x_3=23\), не пользуясь порталами.
- Останемся в точке \(x_4=15\), не пользуясь порталами.
- Точка \(x_5=28\) не находится ни на одном отрезке, поэтому Андрей не сможет никуда телепортироваться.
- Точка \(x_6=18\) находится на отрезке \([l_3, r_3] = [16, 24]\), воспользуемся порталом \(3\) и телепортируемся в точку \(b_3 = 22\).
В пятом наборе входных данных: Оптимальные действия при старте из каждой позиции: - Воспользуемся сначала порталом \(1\) и телепортируемся в точку \(15\) на отрезке \([a_1, b_1] = [14, 20]\), после чего воспользуемся порталом \(2\) и телепортируемся в точку \(21\), находящуюся на отрезке \([l_4, r_4] = [21, 33]\) и на отрезке \([a_2, b_2] = [13, 24]\), после телепортируемся в точку \(b_4 = 32\).
- Воспользуемся сначала порталом \(6\) и телепортируемся в точку \(20\) на отрезке \([a_6, b_6] = [20, 21]\), после чего воспользуемся порталом \(2\) и телепортируемся в точку \(22\), находящуюся одновременно на отрезке \([l_4, r_4] = [21, 33]\) и на отрезке \([a_2, b_2] = [13, 24]\), после телепортируемся в точку \(b_4 = 32\).
- Сделаем те же самые действия что из с первой позиции.
- Останемся в точке \(x_4=5\), не пользуясь порталами.
- Точка \(8\) не находится ни на одном отрезке, поэтому Андрей не сможет никуда телепортироваться.
- Останемся в точке \(x_6=33\), не пользуясь порталами.
- Воспользуемся порталом \(5\) и телепортируемся в точку \(b_5 = 4\).
- Сделаем те же самые действия что и из первой позиции.
| |
|
|
C. Скверная Память
поиск в глубину и подобное
снм
*2000
Zart PMP вышел в финал мирового чемпионата ICPC World Finals, который проводится в китайском городе Харбине. Сходив на групповую экскурсию в Sun Island Park и насладившись выставкой снежных скульптур, PMP должен вернуться к автобусам до того, как они уедут. Но парк очень большой, и он не знает, как найти стоянку. В парке есть n перекрестков, пронумерованных от 1 до n. Есть m двунаправленных дорог, соединяющих некоторые пары из этих перекрестков. На k перекрестках волонтеры ICPC помогают командам и показывают им путь к месту назначения. Волонтеры стоят в фиксированных точках и не двигаются, никакие два волонтера не стоят на одном перекрестке. Когда PMP просит волонтера указать путь до стоянки, тот/та может описать ему весь путь. Но парк полностью покрыт льдом и снегом и все выглядит почти одинаково. Из-за этого PMP может запомнить не более q перекрестков после каждого вопроса (не считая перекрестка, на котором он стоит в данный момент). Он всегда рассказывает волонтерам о своей слабой памяти и если нет прямого пути длиной не более q (в количестве дорог), ведущему к стоянке, то волонтер направит PMP к другому волонтеру (расстояние до которого в количестве дорог, разумеется, не должно превышать q). Волонтеры ICPC прекрасно знают парк и всегда указывают PMP самый лучший путь. Таким образом, если существует путь до стоянки, PMP безусловно найдет его. Изначально PMP находится на перекрестке s, а автобусы стоят на перекрестке t. На перекрестке s всегда есть волонтер. Ваша задача — найти, при каком минимальном значении q PMP сможет найти автобусы. Выходные данные Выведите на единственной строке ответ к задаче: минимальное значении q, при котором PMP сможет найти автобусы. Если PMP не сможет найти автобусы ни при каком значении q выведите -1. Примечание Первый пример проиллюстрирован ниже. Синим отмечены перекрестки, в которых находятся волонтеры. Пунктирная линия показывает возможный путь, для такого пути ответ q = 3: Во втором примере, при q = 3 PMP может дойти до перекрестка номер 6, а потом дойти до автобусной остановки.
| |
|
|
F. Продажа зверинца
графы
математика
поиск в глубину и подобное
реализация
снм
*1800
Вы владелец зверинца, состоящего из \(n\) животных пронумерованных от \(1\) до \(n\). Однако содержать зверинец достаточно затратно, поэтому вы решили его продать! Известно, что каждое животное боится ровно одного другого животного. А точнее, животное \(i\) боится животного \(a_i\) (\(a_i \neq i\)). Также для каждого животного известна его стоимость, для животного \(i\) она равняется \(c_i\). Вы будете продавать всех своих животных в каком-то зафиксированном порядке. Формально, вам надо будет выбрать некоторую перестановку\(^\dagger\) \(p_1, p_2, \ldots, p_n\), и продать сначала животное \(p_1\), потом животное \(p_2\), и так далее, последним продав животное \(p_n\). Когда вы продаёте животное \(i\), есть два варианта развития событий: - Если животное \(a_i\) было продано раньше чем животное \(i\), вы получаете \(c_i\) денег за продажу животного \(i\).
- Если животное \(a_i\) не было продано раньше чем животное \(i\), вы получаете \(2 \cdot c_i\) денег за продажу животного \(i\). (Удивительно, но животные, которые боятся в текущий момент имеют большую ценность).
Ваша задача — выбрать порядок продажи животных так, чтобы максимизировать суммарную прибыль. Например, если \(a = [3, 4, 4, 1, 3]\), \(c = [3, 4, 5, 6, 7]\) и выбранная вами перестановка равна \([4, 2, 5, 1, 3]\), то: - Первым продаётся животное \(4\). Животное \(a_4 = 1\) не было продано ранее, а значит, вы получаете \(2 \cdot c_4 = 12\) денег за продажу.
- Вторым продаётся животное \(2\). Животное \(a_2 = 4\) было продано ранее, а значит, вы получаете \(c_2 = 4\) денег за продажу.
- Третьим продаётся животное \(5\). Животное \(a_5 = 3\) не было продано ранее, а значит, вы получаете \(2 \cdot c_5 = 14\) денег за продажу.
- Четвёртым продаётся животное \(1\). Животное \(a_1 = 3\) не было продано ранее, а значит, вы получаете \(2 \cdot c_1 = 6\) денег за продажу.
- Пятым продаётся животное \(3\). Животное \(a_3 = 4\) было продано ранее, а значит, вы получаете \(c_3 = 5\) денег за продажу.
Ваша суммарная прибыль при таком выборе перестановки, равна \(12 + 4 + 14 + 6 + 5 = 41\). Обратите внимание, что \(41\) — не максимально возможная прибыль в этом примере. \(^\dagger\) Перестановкой длины \(n\) называется массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) является перестановкой, но \([1,2,2]\) не является перестановкой (\(2\) встречается дважды в массиве) и \([1,3,4]\) тоже не является перестановкой (\(n=3\), но в массиве присутствует \(4\)). Выходные данные Выведите \(t\) строк, каждая из которых содержит ответ на соответствующий набор входных данных. В качестве ответа выведите \(n\) целых чисел — перестановку \(p_1, p_2, \ldots, p_n\), обозначающую, в каком порядке нужно продавать животных, чтобы максимизировать прибыль. Если есть несколько возможных ответов, можно вывести любой из них.
| |
|
|
H. Безумный город
графы
Деревья
игры
кратчайшие пути
поиск в глубину и подобное
снм
*1700
Марсель и Валериу находятся в безумном городе, который представляет собой \(n\) зданий с \(n\) двусторонними дорогами между ними. Марсель и Валериу начинают в зданиях \(a\) и \(b\) соответственно. Марсель хочет поймать Валериу, то есть оказаться в том же здании, что и он, или встретиться на одной дороге. Во время каждого хода они выбирают, пойти в соседнее здание от текущего или остаться в том же здании. Поскольку Валериу хорошо знает Марселя, Валериу может предсказать, куда Марсель пойдет в следующем ходу. Валериу может использовать эту информацию, чтобы сделать свой ход. Они начинают и заканчивают ход одновременно. Гарантируется, что любая пара зданий соединена некоторым путем, и между любой парой зданий есть не более одной дороги. Предполагая, что оба игрока играют оптимально, ответьте, есть ли у Валериу стратегия, чтобы бесконечно уходить от Марселя. Выходные данные Для каждого набора входных данных выведите «YES», если Валериу может бесконечно уходить от Марселя, и «NO» в противном случае. Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ). Примечание В первом примере граф выглядит следующим образом: Марсель начинает в здании \(2\), а Валериу начинает в здании \(1\). Валериу знает, каким путем Марсель будет двигаться вокруг треугольника, и он может просто всегда двигаться так же, чтобы всегда избегать Марселя. Во втором примере граф выглядит следующим образом: Марсель начинает в здании \(1\), а Валериу начинает в здании \(4\). Марсель может пойти в здание \(4\) на своем первом ходу и победить, так как Валериу должен либо пойти в здание \(1\) (тогда они встретятся на дороге от \(1\) до \(4\)), либо остаться в здании \(4\) (тогда они встретятся в здании \(4\)). Таким образом, у Валериу нет стратегии для победы.
| |
|
|
D. Лексихроматография
графы
Комбинаторика
поиск в глубину и подобное
снм
*2500
Пак Чанек любит свой факультет — факультет компьютерных наук Университета Индонезии (Fasilkom). Он хочет поиграть с цветами эмблемы факультета - синим и красным. Имеется массив \(a\), состоящий из \(n\) элементов, элемент \(i\) имеет значение \(a_i\). Пак Чанек хочет окрасить каждый элемент массива в синий или красный цвет так, чтобы выполнялись следующие условия: - Если все синие элементы складываются в подпоследовательность\(^\dagger\) и все красные элементы тоже, то синяя подпоследовательность строго меньше красной подпоследовательности лексикографически\(^\ddagger\).
- Массив \(a\) не имеет ни одного несбалансированного подмассива. Подмассив называется несбалансированным тогда и только тогда, когда существует такое значение \(k\), что количество красных элементов на этом подмассиве со значением \(k\) и количество синих элементов со значением \(k\) отличается хотя бы на \(2\).
- Заметим, что можно покрасить все элементы массива в один и тот же цвет.
Сколько различных раскрасок удовлетворяют всем этим условиям? Поскольку ответ может быть очень большим, выведите ответ по модулю \(998\,244\,353\). Две раскраски различны тогда и только тогда, когда существует хотя бы один элемент, который в одной раскраске является синим, а в другой - красным. \(^\dagger\) Подпоследовательность массива - это последовательность, которая может быть получена из массива путем удаления некоторых элементов (возможно, ни одного), без изменения порядка оставшихся элементов. \(^\ddagger\) Пусть \(p\) и \(q\) - две различные последовательности. Считается, что последовательность \(p\) лексикографически меньше последовательности \(q\) тогда и только тогда, когда \(p\) является префиксом \(q\) или существует индекс \(i\) такой, что \(p_j=q_j\) для всех \(1\leq j<i\), и \(p_i<q_i\). В частности, пустая последовательность всегда лексикографически меньше любой непустой последовательности. Выходные данные Выведите одно целое число — количество различных раскрасок, удовлетворяющих всем условиям задачи, по модулю \(998\,244\,353\). Примечание В первом примере \(3\) способа раскраски всех элементов с индекса \(1\) по индекс \(8\): - Синий, красный, красный, синий, синий, красный, красный, синий.
- Синий, красный, красный, красный, синий, синий, красный, синий.
- Красный, красный, синий, голубой, синий, красный, красный, синий.
Например, если мы раскрасим элементы с индекса \(1\) по индекс \(8\) в красный, красный, синий, красный, красный, красный, синий, синий, синий, то это не будет корректной раскраской, так как для подмассива \(a[2..6]\) существует \(0\) синих элементов со значением \(3\) и \(2\) красных элемента со значением \(3\), что делает подмассив \(a[2..6]\) несбалансированным подмассивом.
| |
|
|
D. Разрез
Бинарный поиск
Деревья
математика
разделяй и властвуй
снм
Структуры данных
*2700
Назовём массив \(b_1, b_2, \ldots, b_m\) (\(m \ge 2\)) хорошим, если его можно разрезать на две части так, чтобы все элементы в левой части были строго меньше, чем все элементы в правой части. Другими словами, должен существовать такой индекс \(1 \le i < m\), что любой элемент из \(b_1, \ldots, b_i\) строго меньше любого элемента из \(b_{i+1}, \ldots, b_m\). Дан массив \(a_1, a_2, \ldots a_n\), состоящий из различных целых чисел от \(1\) до \(n\). Поступают \(q\) запросов. В каждом запросе даны два числа \(l\) и \(r\). Требуется для каждого запроса проверить, является ли массив \(a_l, a_{l+1}, \ldots, a_r\) хорошим. Выходные данные Для каждого запроса выведите «Yes» (без кавычек), если массив \(a_l, a_{l+1}, \ldots, a_r\) является хорошим, и «No» (без кавычек) иначе. Вы можете выводить «Yes» и «No» в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ). Примечание В первом примере: - Массив \([3,2,1,4,5]\) можно разрезать на две части \([3,2,1]\) и \([4,5]\).
- Массив \([3,2,1]\) нельзя разрезать на две части так, чтобы все элементы в левой части были меньше всех элементов в правой части.
- Массив \([3,2,1,4]\) можно разрезать на две части \([3,2,1]\) и \([4]\).
- Массив \([3,2]\) нельзя разрезать на две части так, чтобы все элементы в левой части были меньше всех элементов в правой части.
- Массив \([2,1,4,5]\) можно разрезать на две части \([2,1]\) и \([4,5]\).
Во втором примере: - Массив \([2,4,3]\) можно разрезать на две части \([2]\) и \([4,3]\).
- Массив \([6,2,4,3,5]\) нельзя разрезать на две части так, чтобы все элементы в левой части были меньше всех элементов в правой части.
- Массив \([4,3,5]\) можно разрезать на две части \([4,3]\) и \([5]\).
| |
|
|
E. Бесконечная карточная игра
Бинарный поиск
графы
дп
жадные алгоритмы
игры
Перебор
поиск в глубину и подобное
снм
сортировки
Структуры данных
*2300
Монокарп и Бикарп играют в карточную игру. Каждая карта имеет два параметра: значение атаки и значение защиты. Карта \(s\) бьет карту \(t\), если значение атаки карты \(s\) строго больше значения защиты карты \(t\). У Монокарпа есть \(n\) карт, \(i\)-я из которых имеет значение атаки \(\mathit{ax}_i\) и значение защиты \(\mathit{ay}_i\). У Бикарпа есть \(m\) карт, \(j\)-я из которых имеет значение атаки \(\mathit{bx}_j\) и значение защиты \(\mathit{by}_j\). На первом ходе Монокарп выбирает одну из своих карт и кладет ее на стол. Бикарп должен побить эту карту своей картой. Затем Монокарп должен побить карту Бикарпа. Затем ход переходит к Бикарпу, и так далее. После того, как карта побита, она возвращается в руку игрока, который ее сыграл. Это подразумевает, что у игрока, который сейчас ходит, всегда на руках те же карты, что и в начале игры. Игра заканчивается, когда у текущего игрока нет карт, которые побеждают карту, которую только что сыграл его оппонент, и текущий игрок проигрывает. Если игра длится \(100^{500}\) ходов, объявляется ничья. И Монокарп, и Бикарп играют оптимально. То есть, если у игрока есть выигрышная стратегия независимо от ходов его оппонента, он играет на победу. В противном случае, если у него есть стратегия для ничьи, он играет на ничью. Вам нужно вычислить три значения: - количество начальных ходов Монокарпа, которые приводят к победе Монокарпа;
- количество начальных ходов Монокарпа, которые приводят к ничьей;
- количество начальных ходов Монокарпа, которые приводят к победе Бикарпа.
Выходные данные Для каждого набора входных данных выведите три целых числа: - количество начальных ходов Монокарпа, которые приводят к победе Монокарпа;
- количество начальных ходов Монокарпа, которые приводят к ничьей;
- количество начальных ходов Монокарпа, которые приводят к победе Бикарпа.
| |
|
|
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» будут распознаны как положительный ответ).
| |
|
|
E. Фея
поиск в глубину и подобное
разделяй и властвуй
снм
*2900
В давние-давние времена жила добрая фея А. Однажды пришел к ней добрый молодец Б и попросил предсказать ему будущее. Посмотрев в магический шар, А сказала, что скоро молодец встретит самую красивую принцессу на свете и женится на ней. Затем она нарисовала на бумаге n точек и соединила некоторые из них отрезками, каждый из которых начинается в некоторой точке и заканчивается в некоторой другой точке. Нарисовав этот рисунок, она попросила молодца стереть с бумаги ровно один отрезок. Затем она попытается окрасить каждую точку в красный или синий цвет так, чтобы не существовало отрезка, оба конца которого окрашены в одинаковый цвет. Если у нее получится это сделать, то гадание сбудется. Б очень хочет, чтобы это случилось, и поэтому он просит Вас помочь ему. Найдите все отрезки, которые помогут ему встретить принцессу. Выходные данные В первую строку ответа выведите число k — количество отрезков в ответе. Во второй строке выведите k чисел, разделенные одним пробелом — номера этих отрезков в возрастающем порядке. Каждый номер нужно выводить ровно один раз. Отрезки нумеруются с 1 в том порядке, в котором они заданы во входных данных.
| |
|
|
E. Контрнаступление
графы
снм
сортировки
Структуры данных
хэши
*2100
Берляндия смогла отразить удар флатландцев и теперь переходит в наступление. Во Флатландии n городов, пронумерованных от 1 до n, и некоторые пары из них соединены двухсторонними дорогами. Флатландцы (то ли это их военная хитрость, а может, они просто экономят чернила) на своих картах соединяют дорогой те и только те города, между которыми на самом деле нет дороги. Другими словами, если на карте флатландцев два города соединены дорогой, значит на самом деле между ними дороги нет. Обратное тоже верно: если на карте флатландцев два города не соединены дорогой, значит на самом деле дорога между ними есть. В руки берляндцев попала флатландская карта. Теперь ефрейтор Вася по заданию генерала Туристова хочет найти все такие группы флатландских городов, что в каждой группе из каждого города можно попасть в каждый, двигаясь по настоящим дорогам, при этом города из разных групп недостижимы по настоящим дорогам. Действительно, разгромить такие группы по отдельности значительно легче, чем окружать сразу всю Флатландию! Помогите ефрейтору выполнить это задание и получить-таки звание сержанта! Не забудьте, что на флатландской карте города, соединены дорогой тогда и только тогда, когда на самом деле между ними нет дороги. Выходные данные Выведите в первой строке число k — количество групп городов во Флатландии таких, что в каждой группе из каждого города можно добраться до каждого по дорогам Флатландии, а города разных групп недостижимы по флатландским дорогам. В каждой из следующих k строк выведите сначала ti (1 ≤ ti ≤ n) — количество вершин в i-й группе. Далее через пробел выведите номера городов i-й группы. Порядок вывода групп и порядок вывода номеров в группах значения не имеет. Сумма ti по всем k группам должна быть равна n. Примечание В первом примере есть только дороги между парами городов 1-4 и 2-3. Во втором примере между городами 1 и 2 нет дороги, но все равно можно добраться из одного до другого через город номер 3.
| |
|
|
E. Транзитивный граф
графы
дп
поиск в глубину и подобное
реализация
снм
*2100
Дан ориентированный граф \(G\) с \(n\) вершинами и \(m\) ребрами. Изначально граф \(H\) совпадает с графом \(G\). Затем вы решили выполнить следующие действия: - Если в графе \(H\) существует тройка вершин \(a\), \(b\), \(c\) такая, что есть ребро из \(a\) в \(b\) и ребро из \(b\) в \(c\), но нет ребра из \(a\) в \(c\), то добавить ребро из \(a\) в \(c\).
- Повторять предыдущий шаг до тех пор, пока существуют такие тройки.
Заметим, что после выполнения этих действий количество ребер в \(H\) может достигать \(n^2\). Вы также записали некоторые значения на вершинах графа \(H\): на вершине \(i\) записано значение \(a_i\). Рассмотрим простой путь, состоящий из \(k\) различных вершин с номерами \(v_1, v_2, \ldots, v_k\). Длина такого пути равняется \(k\). Значение этого пути определим как \(\sum_{i = 1}^k a_{v_i}\). Простой путь считается самым длинным, если в графе нет другого простого пути с большей длиной. Среди всех самых длинных простых путей в \(H\) найдите тот, который имеет наименьшее значение. Выходные данные Для каждого набора входных данных выведите два числа — длину самого длинного простого пути в \(H\) и минимально возможное значение такого пути. Примечание В первом наборе входных данных самый длинный путь в обоих графах равен \(1 \to 3 \to 4 \to 5 \to 2\). Поскольку путь включает все вершины, то минимально возможное значение самого длинного пути равно сумме значений по всем вершинам, которое равняется \(12\). Во втором наборе входных данных самый длинный путь равен \(1 \to 2 \to 3 \to 4 \to 6 \to 7\). Поскольку самых длинных путей с вершиной \(5\) не существует, то такой путь имеет минимально возможное значение \(5\,999\,999\,995\). В третьем наборе входных данных можно доказать, что не существует пути длиннее \(11\) и что значение самого длинного пути не может быть меньше \(37\). Также заметим, что данный граф содержит петли и кратные ребра.
| |
|
|
C. Тяжелые интервалы
жадные алгоритмы
Конструктив
математика
снм
сортировки
Структуры данных
*1400
У вас есть \(n\) интервалов \([l_1, r_1], [l_2, r_2], \dots, [l_n, r_n]\) таких, что \(l_i < r_i\) для каждого \(i\), и все конечные точки интервалов различны. Вес \(i\)-го интервала составляет \(c_i\) на единицу длины. Поэтому вес \(i\)-го интервала равен \(c_i \cdot (r_i - l_i)\). Вам не нравятся большие веса, поэтому вы хотите сделать сумму весов всех интервалов как можно меньше. Оказывается, вы можете выполнять следующие три типа операций: - переставить элементы массива \(l\) в любом порядке;
- переставить элементы массива \(r\) в любом порядке;
- переставить элементы массива \(c\) в любом порядке.
Однако после выполнения всех операций интервалы должны оставаться корректными (т.е. для каждого \(i\) должно выполняться условие \(l_i < r_i\)). Какова минимально возможная сумма весов интервалов после выполнения этих операций? Выходные данные Для каждого набора входных данных выведите одно целое число: минимально возможную сумму всех весов интервалов после ваших операций. Примечание В первом наборе входных данных вы можете сделать так - \(l = [8, 3]\);
- \(r = [23, 12]\);
- \(c = [100, 100]\).
В этом случае будет два интервала: - интервал \([8, 23]\) с весом \(100\) на единицу длины, тогда вес интервала равняется \(100 \cdot (23-8) = 1500\);
- интервал \([3, 12]\) с весом \(100\) на единицу длины, тогда вес интервала равняется \(100 \cdot (12-3) = 900\);
Сумма весов составляет \(2400\). Можно показать, что не существует конфигурации конечных интервалов, сумма весов которых меньше \(2400\). Во втором наборе входных данных можно сделать так - \(l = [1, 2, 5, 20]\);
- \(r = [3, 4, 10, 30]\);
- \(c = [3, 3, 2, 2]\).
В этом случае будет четыре интервала: - интервал \([1, 3]\) с весом \(3\) на единицу длины, вес всего интервала равен \(3 \cdot (3-1) = 6\);
- интервал \([2, 4]\) с весом \(3\) на единицу длины, вес всего интервала равен \(3 \cdot (4-2) = 6\);
- интервал \([5, 10]\) с весом \(2\) на единицу длины, вес всего интервала равен \(2 \cdot (10-5) = 10\);
- интервал \([20, 30]\) с весом \(2\) на единицу длины, вес всего интервала равен \(2 \cdot (30-20) = 20\).
Сумма весов равна \(42\). Можно показать, что не существует конфигурации конечных интервалов, сумма весов которых меньше \(42\).
| |
|
|
G1. Лампочки (простая версия)
графы
Деревья
дп
Комбинаторика
математика
Перебор
поиск в глубину и подобное
снм
*2100
Простая и сложная версии этой задачи отличаются друг от друга только ограничениями на \(n\). В простой версии сумма значений \(n^2\) по всем наборам входных данных не превосходит \(10^6\). Кроме того, \(n\) не превосходит \(1000\) в каждом наборе входных данных. В ряд расположены \(2n\) лампочек. У каждой лампочки есть цвет от \(1\) до \(n\) (ровно по две лампочки каждого цвета). Изначально все лампочки выключены. Вы выбираете некоторое множество лампочек \(S\), которое вы изначально включите. После этого вы можете выполнять следующие операции в любом порядке любое количество раз: - выбрать две лампочки \(i\) и \(j\) одинакового цвета, ровно одна из которых включена, и включить вторую из них;
- выбрать три лампочки \(i, j, k\), такие, что обе лампочки \(i\) и \(k\) включены и имеют одинаковый цвет, а лампочка \(j\) находится между ними (\(i < j < k\)), и включить лампочку \(j\).
Вы хотите выбрать такое множество лампочек \(S\), которые вы изначально включаете, чтобы путем выполнения описанных операций можно было добиться того, чтобы все лампочки оказались включены. Посчитайте два числа: - минимальный размер множества \(S\), которое вы изначально включаете;
- количество множеств \(S\) минимального размера (по модулю \(998244353\)).
Выходные данные Для каждого набора входных данных выведите два целых числа: - минимальный размер множества \(S\), которое вы изначально включаете;
- количество множеств \(S\) минимального размера (по модулю \(998244353\)).
| |
|
|
D. 01-дерево
Деревья
жадные алгоритмы
Конструктив
снм
сортировки
Структуры данных
*2100
Есть ребро-взвешенное полное двоичное дерево с \(n\) листьями. Полное двоичное дерево определяется как дерево, в котором каждая нелистовая вершина имеет ровно 2 дочерних вершины. Для каждой нелистовой вершины обозначим одного из ее детей как левого ребенка, а другого — как правого. Это двоичное дерево обладает очень странным свойством. Для каждой нелистовой вершины одно из ребер к ее детям имеет вес \(0\), а другое ребро — вес \(1\). Обратите внимание, что ребро с весом \(0\) может идти как к левому ребенку, так и к правому. Вы забыли, как выглядит дерево, но, к счастью, вы помните некоторую информацию о листьях в виде массива \(a\) длины \(n\). Для каждого \(i\) от \(1\) до \(n\), \(a_i\) представляет собой расстояние\(^\dagger\) от корня до \(i\)-го листа (в порядке обхода dfs\(^\ddagger\)). Определите, существует ли полное двоичное дерево, удовлетворяющее массиву \(a\). Обратите внимание, что восстанавливать дерево не нужно. \(^\dagger\) Расстояние от вершины \(u\) до вершины \(v\) определяется как сумма весов ребер на пути от вершины \(u\) до вершины \(v\). \(^\ddagger\) Порядок листьев в dfs определяется вызовом следующей функции \(\texttt{dfs}\) на корне бинарного дерева. dfs_order = [] — порядок обхода dfs
функция dfs(v): если v — лист: добавить v в конец dfs_order иначе: dfs(левый ребенок v) dfs(правый ребенок v)
dfs(корень)
Выходные данные Для каждого набора входных данных выведите «YES», если существует полное двоичное дерево, удовлетворяющее массиву \(a\), и «NO» в противном случае. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В первом наборе входных данных массиву удовлетворяет следующее дерево. 
Для второго набора входных данных можно доказать, что не существует полного двоичного дерева, удовлетворяющего массиву.
| |
|
|
D. Повторение в массиве
Бинарный поиск
математика
Перебор
реализация
снм
*1900
У Джейдена есть массив \(a\), который изначально пуст. Ему необходимо выполнить \(n\) операций двух типов в заданном порядке. - Джейден добавляет целое число \(x\) (\(1 \leq x \leq n\)) в конец массива \(a\).
- Джейден добавляет \(x\) копий массива \(a\) в конец массива \(a\). Другими словами, массив \(a\) становится равным \([a,\underbrace{a,\ldots,a}_{x}]\). Гарантируется, что перед этим была выполнена хотя бы одна операция первого типа.
У Джейдена есть \(q\) запросов. Для каждого запроса вы должны сообщить ему \(k\)-й элемент массива \(a\). Элементы массива нумеруются с \(1\). Выходные данные Для каждого набора входных данных выведите \(q\) целых чисел — ответы на запросы Джейдена. Примечание В первом наборе входных данных: - После первой операции \(a = [1]\);
- После второй операции \(a = [1, 2]\);
- После третьей операции \(a = [1, 2, 1, 2]\);
- После четвёртой операции \(a = [1, 2, 1, 2, 3]\);
- После пятой операции \(a = [1, 2, 1, 2, 3, 1, 2, 1, 2, 3, 1, 2, 1, 2, 3, 1, 2, 1, 2, 3]\).
В четвёртом наборе входных данных после всех операций \(a = [1, 2]\).
| |
|
|
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)\).
| |
|
|
F2. Спокойное плавание (сложная версия)
Бинарный поиск
геометрия
графы
Деревья
снм
Структуры данных
*3000
Единственное отличие двух версий этой задачи состоит в ограничении на \(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)\).
| |
|
|
D. Безумные монстры
математика
Перебор
реализация
снм
Структуры данных
*1900
Монокарп играет в компьютерную игру (опять). Угадайте, что он делает? Правильно, убивает монстров. В ряд стоят \(n\) монстров, пронумерованных от \(1\) до \(n\). У \(i\)-го монстра есть два параметра: значение атаки, равное \(a_i\), и значение защиты, равное \(d_i\). Чтобы убить этих монстров, Монокарп наложил на них заклинание безумия, так что они атакуют друг друга, а не персонажа Монокарпа. Бой состоит из \(n\) раундов. В каждом раунде происходит следующее: - сначала каждый живой монстр \(i\) наносит \(a_i\) урона ближайшему живому монстру слева (если он существует) и ближайшему живому монстру справа (если он существует);
- затем каждый живой монстр \(j\), который получил больше \(d_j\) урона в течение этого раунда, умирает. Т.е. \(j\)-й монстр умирает тогда и только тогда, когда его значение защиты \(d_j\) строго меньше суммарного урона, который он получил в этом раунде.
Для каждого раунда вычислите количество монстров, которые умрут во время этого раунда. Выходные данные Для каждого набора входных данных выведите \(n\) целых чисел. \(i\)-е целое число должно быть равно количеству монстров, которые умрут в \(i\)-м раунде. Примечание Объяснение для первого примера: Во время первого раунда происходит следующее: - монстр \(1\) наносит \(3\) урона монстру \(2\);
- монстр \(2\) наносит \(4\) урона монстру \(1\) и монстру \(3\);
- монстр \(3\) наносит \(7\) урона монстру \(2\) и монстру \(4\);
- монстр \(4\) наносит \(5\) урона монстру \(3\) и монстру \(5\);
- монстр \(5\) наносит \(10\) урона монстру \(4\);
- монстр \(1\) не умирает, так как он получил \(4\) урона и его защита равна \(4\);
- монстр \(2\) умирает, так как он получил \(10\) урона и его защита равна \(9\);
- монстр \(3\) умирает, так как он получил \(9\) урона и его защита равна \(1\);
- монстр \(4\) не умирает, так как он получил \(17\) урона и его защита равна \(18\);
- монстр \(5\) умирает, так как он получил \(5\) урона и его защита равна \(1\).
После первого раунда остаются в живых монстры \(1\) и \(4\). Во время второго раунда происходит следующее: - монстр \(1\) наносит \(3\) урона монстру \(4\);
- монстр \(4\) наносит \(5\) урона монстру \(1\);
- монстр \(1\) умирает, так как он получил \(5\) урона и его защита равна \(4\);
- монстр \(4\) не умирает, так как он получил \(3\) урона и его защита равна \(18\).
В следующих трех раундах остается в живых только монстр \(4\), поэтому ничего не происходит.
| |
|
|
E. Посчитай пути
графы
Деревья
дп
поиск в глубину и подобное
снм
Структуры данных
*2000
Вам дано дерево, состоящее из \(n\) вершин, пронумерованных от \(1\) до \(n\). Каждая вершина окрашена в некоторый цвет, обозначенный целым числом от \(1\) до \(n\). Простой путь в дереве называется красивым, если: - он состоит хотя бы из \(2\) вершин;
- первая и последняя вершины пути имеют одинаковый цвет;
- ни одна другая вершина на пути не имеет такой же цвет, как и первая вершина.
Посчитайте количество красивых простых путей в дереве. Обратите внимание, что пути считаются ненаправленными (то есть путь из \(x\) в \(y\) — это то же самое, что и путь из \(y\) в \(x\)). Выходные данные Для каждого набора входных данных выведите одно целое число — количество красивых простых путей в дереве.
| |
|
|
D. Найди различные!
Бинарный поиск
дп
жадные алгоритмы
Перебор
снм
Структуры данных
*1300
Вам дан массив \(a\) из \(n\) целых чисел, а также \(q\) запросов. Каждый запрос представлен двумя числами \(l\) и \(r\) (\(1 \le l \le r \le n\)). Ваша задача для каждого запроса найти такие два индекса \(i\) и \(j\) (или сообщить, что их не существует), что: - \(l \le i \le r\);
- \(l \le j \le r\);
- \(a_i \ne a_j\).
Иными словами, вам нужно для каждого запроса найти пару различных элементов среди \(a_l, a_{l+1}, \dots, a_r\) или сообщить, что такой пары не существует. Выходные данные Для каждого запроса выведите два числа: искомые \(i\) и \(j\) (\(l \le i, j \le r\)), для которых \(a_i \ne a_j\). Если такой пары не существует, выведите \(i=-1\) и \(j=-1\). Вы можете разделять выводы для наборов входных данных пустыми строками. Это не является обязательным требованием.
| |
|
|
F. Микроцикл
графы
Деревья
жадные алгоритмы
поиск в глубину и подобное
реализация
снм
сортировки
Структуры данных
*1900
Дан неориентированный взвешенный граф из \(n\) вершин и \(m\) рёбер. Между каждой парой вершин в графе существует не более одного ребра, граф не содержит петель (рёбер из вершины в себя же). Граф не обязательно связный. Цикл в графе называется простым, если он не проходит через одну и ту же вершину дважды и не содержит одно и то же ребро дважды. Найдите любой простой цикл этого графа, в котором вес самого лёгкого ребра минимален. Выходные данные Для каждого набора входных данных выведите пару чисел \(b\) и \(k\), где: - \(b\) — минимальный вес ребра в найденном цикле,
- \(k\) — количество вершин в найденном цикле.
В следующей строке выведите \(k\) чисел от \(1\) до \(n\) — вершины цикла в порядке обхода. Обратите внимание, что ответ всегда существует, так как при заданных ограничениях в графе всегда есть хотя бы один простой цикл.
| |
|
|
D2. Сумма по всем подстрокам (сложная версия)
битмаски
дп
жадные алгоритмы
разделяй и властвуй
реализация
снм
Строки
*2100
Это простая версия задачи. Единственное отличие между версиями заключается в ограничениях на \(t\) и \(n\). Вы можете делать взломы только тогда, когда обе версии задачи решены. Для бинарного\(^\dagger\) шаблона \(p\) и бинарной строки \(q\) одинаковой длины \(m\), скажем, что строка \(q\) называется \(p\)-хорошей, если для каждого \(i\) (\(1 \leq i \leq m\)) существуют индексы \(l\) и \(r\) такие, что: - \(1 \leq l \leq i \leq r \leq m\), и
- \(p_i\) является модой\(^\ddagger\) строки \(q_l q_{l+1} \ldots q_{r}\).
Для шаблона \(p\) определим \(f(p)\) как минимально возможное количество \(\mathtt{1}\) в \(p\)-хорошей бинарной строке (такой же длины, как и шаблон). Вам дана бинарная строка \(s\) длины \(n\). Найдите \(\)\sum_{i=1}^{n} \sum_{j=i}^{n} f(s_i s_{i+1} \ldots s_j).\(\) Другими словами, вам нужно просуммировать значения \(f\) по всем \(\frac{n(n+1)}{2}\) подстрокам \(s\). \(^\dagger\) Бинарный шаблон — это строка, состоящая только из символов \(\mathtt{0}\) и \(\mathtt{1}\). \(^\ddagger\) Символ \(c\) является модой строки \(t\) длины \(m\), если число вхождений \(c\) в \(t\) не меньше \(\lceil \frac{m}{2} \rceil\). Например, \(\mathtt{0}\) является модой \(\mathtt{010}\), \(\mathtt{1}\) не является модой \(\mathtt{010}\), и оба символа \(\mathtt{0}\) и \(\mathtt{1}\) являются модами \(\mathtt{011010}\). Выходные данные Для каждого набора входных данных выведите сумму значений \(f\) по всем подстрокам \(s\). Примечание В первом наборе входных данных единственной \(\mathtt{1}\)-хорошей строкой является \(\mathtt{1}\). Таким образом, \(f(\mathtt{1})=1\). Во втором наборе входных данных \(f(\mathtt{10})=1\), так как \(\mathtt{01}\) является \(\mathtt{10}\)-хорошей, а \(\mathtt{00}\) не является \(\mathtt{10}\)-хорошей. Таким образом, ответ равен \(f(\mathtt{1})+f(\mathtt{10})+f(\mathtt{0}) = 1 + 1 + 0 = 2\). В третьем наборе входных данных \(f\) равна \(0\) для всех \(1 \leq i \leq j \leq 5\). Таким образом, ответ равен \(0\).
| |
|
|
F. Дерево Андрея
Бинарный поиск
Деревья
жадные алгоритмы
Конструктив
поиск в глубину и подобное
реализация
снм
Структуры данных
*2800
Магистр Андрей очень любит деревья\(^{\dagger}\), поэтому у него есть дерево, состоящее из \(n\) вершин. Но не все так просто. Магистр Тимофей решил украсть одну вершину из дерева. Если Тимофей украл вершину \(v\) из дерева, то вершина \(v\) и все ребра с концом в вершине \(v\) удаляются из дерева, при этом номера других вершин не меняются. Чтобы Андрей не расстраивался, Тимофей решил сделать получившийся граф снова деревом. Для этого он может добавлять ребра между произвольными вершинами \(a\) и \(b\), однако при добавлении такого ребра он должен заплатить \(|a - b|\) монет в Центр Помощи Магистрам. Обратите внимание, что получившееся дерево не содержит вершину \(v\). Тимофей не определился, какую вершину \(v\) он удалит из дерева, поэтому он хочет знать для каждой вершины \(1 \leq v \leq n\), какое минимальное количество монет нужно потратить, чтобы после удаления вершины \(v\) сделать граф снова деревом, а также какие ребра при этом нужно добавить. \(^{\dagger}\)Деревом называется неориентированный связный граф без циклов. Выходные данные Для каждого набора входных данных выведите ответ в следующем формате: Для каждой вершины \(v\) (в порядке от \(1\) до \(n\)) в первой строке выведите два целых числа \(w\) и \(m\) — минимальное количество монет, которое нужно потратить, чтобы граф после удаления вершины \(v\) снова стал деревом, и количество добавленных ребер. Далее выведите \(m\) строк, каждая из которых содержит два целых числа \(a\) и \(b\) (\(1 \le a, b \le n, a \ne v, b \ne v\), \(a \ne b\)) — концы добавленного ребра. Если существует несколько способов добавить ребра, вы можете вывести любое решение с минимальной стоимостью. Примечание В первом наборе входных данных: Рассмотрим удаление вершины \(4\): Оптимальным решением будет провести ребро из вершины \(5\) в вершину \(3\). Тогда мы потратим \(|5 - 3| = 2\) монеты. В третьем наборе входных данных: Рассмотрим удаление вершины \(1\): Оптимальным решением будет: - Провести ребро из вершины \(2\) в вершину \(3\), потратив \(|2 - 3| = 1\) монету.
- Провести ребро из вершины \(3\) в вершину \(4\), потратив \(|3 - 4| = 1\) монету.
- Провести ребро из вершины \(4\) в вершину \(5\), потратив \(|4 - 5| = 1\) монету.
Тогда сумарно мы потратим \(1 + 1 + 1 = 3\) монеты. Рассмотрим удаление вершины \(2\): Ребра проводить не нужно, так как после удаления вершины граф останется деревом.
| |
|
|
G. MST с паросочетанием
битмаски
Деревья
Паросочетания
Перебор
снм
*3100
Дан неориентированный связный граф, в котором \(n\) вершин. У каждого ребра этого графа есть вес; вес ребра между вершинами \(i\) и \(j\) равен \(w_{i,j}\) (или \(w_{i,j} = 0\), что означает, что между \(i\) и \(j\) нет ребра). Все веса — положительные целые числа. Также дано положительное целое число \(c\). Вы должны построить остовное дерево для этого графа, то есть выбрать ровно \((n-1)\) ребер графа так, чтобы можно было из любой вершины добраться до любой другой по выбранным ребрам. Стоимость остовного дерева — это сумма двух значений: - сумма весов всех выбранных ребер;
- максимальное паросочетание в остовном дереве (то есть максимальный размер множества ребер, такого, что каждое ребро принадлежит остовному дереву и каждой вершине инцидентно не более одного ребра из множества), умноженное на заданное число \(c\).
Найдите любое остовное дерево с минимальной стоимостью. Так как граф связный, у него существует хотя бы одно остовное дерево. Выходные данные Выведите одно целое число — минимальную стоимость остовного дерева. Примечание В первом примере минимальное остовное дерево состоит из ребер \((1, 3)\), \((2, 3)\) и \((3, 4)\). Максимальное паросочетание относительно него равно \(1\). Во втором примере минимальное остовное дерево состоит из ребер \((1, 2)\), \((2, 3)\) и \((3, 4)\). Максимальное паросочетание относительно него равно \(2\).
| |
|
|
E. Построение леса
графы
снм
Структуры данных
*2000
Ориентированным взвешенным лесом называется взвешенный ациклический орграф, в котором из каждой вершины выходит не более одного ребра. Корнем вершины v ориентированного взвешенного леса назовем вершину, из которой не выходит ребра, и до которой можно дойти из вершины v, двигаясь по ребрам ориентированного взвешенного леса. Обозначим корень вершины v как root(v). Глубиной вершины v назовем сумму весов пути проходящего от вершины v до ее корня. Обозначим глубину вершины v как depth(v). Рассмотрим процесс построения ориентированного взвешенного леса. Изначально лес не содержит вершин. Вершины последовательно добавляются по одной. Всего выполняется n операций добавления. i-я (i > 0) операция добавления описывается набором чисел (k, v1, x1, v2, x2, ... , vk, xk) и означает, что в граф нужно добавить вершину номер i и k ребер: ребро из вершины root(v1) в вершину i весом depth(v1) + x1, ребро из вершины root(v2) в вершину i весом depth(v2) + x2 и так далее. В случае, если k = 0, в граф добавляется только вершина i и не добавляется никаких ребер. Ваша задача состоит в том, чтобы по заданным операциям добавления вершин вычислить остаток от деления суммы весов всех ребер леса, получившихся после применения всех заданных операций, на 1000000007 (109 + 7). Выходные данные Выведите одно целое число — сумму весов всех ребер получившегося графа по модулю 1000000007 (109 + 7). Примечание Рассмотрим первый пример: - Добавляется вершина 1. Так как k = 0, то ребер не добавляется.
- Добавляется вершина 2. Так как k = 0, то ребер не добавляется.
- Добавляется вершина 3. k = 1. v1 = 2, x1 = 1. Добавляется ребро из вершины root(2) = 2 в вершину 3 веса depth(2) + x1 = 0 + 1 = 1.
- Добавляется вершина 4. k = 2. v1 = 1, x1 = 5. Добавляется ребро из вершины root(1) = 1 в вершину 4 веса depth(1) + x1 = 0 + 5 = 5. v2 = 2, x2 = 2. Добавляется ребро из вершины root(2) = 3 в вершину 4 веса depth(2) + x1 = 1 + 2 = 3.
- Добавляется вершина 5. k = 1. v1 = 1, x1 = 2. Добавляется ребро из вершины root(1) = 4 в вершину 5 веса depth(1) + x1 = 5 + 2 = 7.
- Добавляется вершина 6. k = 1. v1 = 3, x1 = 4. Добавляется ребро из вершины root(3) = 5 в вершину 6 веса depth(3) + x1 = 10 + 4 = 14.
Получившийся граф показан на иллюстрации ниже: 
| |
|
|
E. Цепная реакция
Бинарный поиск
жадные алгоритмы
математика
реализация
снм
Структуры данных
теория чисел
*2200
В ряд стоят \(n\) монстров, у \(i\)-го монстра \(a_i\) очков здоровья. В каждую секунду вы можете выбрать одного живого монстра и запустить в него цепную молнию. Молния наносит ему \(k\) урона, а также распространяется налево (в сторону уменьшения \(i\)) и направо (в сторону увеличения \(i\)) по живым монстрам, нанося каждому по \(k\) урона. Когда молния доходит до мертвого монстра или до начала/конца ряда, она останавливается. Монстр считается живым, если количество его очков здоровья строго больше \(0\). Например, рассмотрим следующий сценарий: три монстра с уровнями здоровья \([5, 2, 7]\), \(k = 3\). Можно убить всех монстров за \(4\) секунды: - запустить цепную молнию в \(3\)-го монстра, тогда уровни здоровья будут равны \([2, -1, 4]\);
- запустить цепную молнию в \(1\)-го монстра, тогда уровни здоровья будут равны \([-1, -1, 4]\);
- запустить цепную молнию в \(3\)-го монстра, тогда уровни здоровья будут равны \([-1, -1, 1]\);
- запустить цепную молнию в \(3\)-го монстра, тогда уровни здоровья будут равны \([-1, -1, -2]\).
Для каждого \(k\) от \(1\) до \(\max(a_1, a_2, \dots, a_n)\) посчитайте минимальное количество секунд, за которое можно убить всех монстров. Выходные данные Для каждого \(k\) от \(1\) до \(\max(a_1, a_2, \dots, a_n)\) выведите минимальное количество секунд, за которое можно убить всех монстров.
| |
|
|
F. Нина и игра в баскетбол
графы
Конструктив
снм
сортировки
Структуры данных
*3000
Нина тренирует свою команду по баскетболу. Команда Нины состоит из \(n\) игроков, пронумерованных от \(1\) до \(n\). У \(i\)-го игрока есть интервал рук \([l_i,r_i]\). Два игрока \(i\) и \(j\) (\(i \neq j\)) могут передавать мяч друг другу, только если \(|i-j|\in[l_i+l_j,r_i+r_j]\) (здесь \(|x|\) обозначает абсолютное значение \(x\)). Нина хочет проверить готовность своей команды. Для этого она проведет несколько раундов передач. - В каждом раунде Нина выберет последовательность игроков \(p_1,p_2,\ldots,p_m\) такую, что игроки \(p_i\) и \(p_{i+1}\) могут передавать мяч друг другу для всех \(1 \le i < m\). Длина последовательности \(m\) может быть выбрана Ниной. Каждый игрок может появиться в последовательности \(p_1,p_2,\ldots,p_m\) несколько раз или вообще не появиться в ней.
- Затем Нина бросит мяч игроку \(p_1\), игрок \(p_1\) передаст мяч игроку \(p_2\) и так далее... Игрок \(p_m\) выбросит мяч за пределы баскетбольного поля, так что его больше нельзя будет использовать.
Как тренер, Нина хочет, чтобы каждый из \(n\) игроков участвовал хотя бы в одном раунде передач. Поскольку Нина хочет пойти на свидание после школы, она хочет, чтобы вы вычислили минимальное количество раундов передач, необходимых для выполнения задачи. Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество раундов передач, которое Нина должна провести, чтобы завершить свою работу. Примечание В первых двух наборах входных данных Нина может провести два раунда передач: один с \(p=[1]\) и один с \(p=[2]\). Можно показать, что одного раунда передач недостаточно, поэтому ответ \(2\). В третьем наборе входных данных Нина может провести два раунда передач: один с \(p=[1,3]\) и один с \(p=[2]\). Игрок \(1\) может передать мяч игроку \(3\), так как \(|3-1|=2 \in [1+1,3+3]\). Можно показать, что одного раунда передач недостаточно, поэтому ответ \(2\).
| |
|
|
E. Открытие порталов
графы
кратчайшие пути
снм
*2600
Павел играет в одну известную компьютерную игру. Игроку предоставлена в распоряжение целая страна, где можно свободно путешествовать, выполнять квесты и набирать опыт. В этой стране n городов, соединенных m двусторонними дорогами различной длины так, что из каждого города можно добраться до каждого. В k из этих городов имеются порталы. В начале игры все порталы закрыты. Когда игрок посещает город, в котором есть портал, этот портал становится открытым. Из открытого портала в открытый можно, как ни странно, телепортироваться. Телепортация происходит мгновенно, что дает возможность игроку быстро перемещаться между довольно удаленными областями страны. В начале игры Павел находится в городе с номером 1. Он хочет как можно быстрее открыть все порталы. Какое наименьшее время ему для этого потребуется? Выходные данные Выведите единственное число — минимальное время, которое требуется игроку, чтобы открыть все порталы. Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на C++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d. Примечание Во втором примере игрок должен прийти в город 2, открыть в нем портал, затем отправиться в город 3, открыть там портал, телепортироваться обратно в город 2 и, наконец, завершить свое путешествие в городе 4.
| |
|
|
G. XOUR
снм
сортировки
Структуры данных
*1700
Вам дан массив \(a\), состоящий из \(n\) неотрицательных целых чисел. Вы можете поменять местами элементы на позициях \(i\) и \(j\), если \(a_i~\mathsf{XOR}~a_j < 4\), где \(\mathsf{XOR}\) — это побитовая операция XOR. Найдите лексикографически наименьший массив, который можно получить любым количеством обменов. Массив \(x\) лексикографически меньше массива \(y\), если на первой позиции, где \(x\) и \(y\) отличаются, \(x_i < y_i\). Выходные данные Для каждого набора входных данных выведите \(n\) целых чисел — лексикографически наименьший массив, который можно получить любым количеством обменов. Примечание В первом примере вы можете поменять местами любые два элемента, поэтому мы можем получить отсортированный массив. Во втором примере вы можете поменять местами \(2\) и \(1\) (их \(\mathsf{XOR}\) равен \(3\)), \(7\) и \(5\) (их \(\mathsf{XOR}\) равен \(2\)), и \(7\) и \(6\) (их \(\mathsf{XOR}\) равен \(1\)), чтобы получить лексикографически наименьший массив.
| |
|
|
F. Большой граф
графы
поиск в глубину и подобное
снм
Структуры данных
теория чисел
*2400
Дан массив \(a\) длины \(n\). Построим квадратную матрицу \(b\) размера \(n \times n\), где в \(i\)-й строке записан массив \(a\), циклически сдвинутый на \((i - 1)\) вправо. Например, для массива \(a = [3, 4, 5]\) получается матрица \(\)b = \begin{bmatrix} 3 & 4 & 5 \\ 5 & 3 & 4 \\ 4 & 5 & 3 \end{bmatrix}\(\) Построим следующий граф: - Граф содержит \(n^2\) вершин, каждая из которых соответствует одному из элементов матрицы. Обозначим вершину, соответствующую элементу \(b_{i, j}\), как \((i, j)\).
- Между вершинами \((i_1, j_1)\) и \((i_2, j_2)\) проведём ребро, если \(|i_1 - i_2| + |j_1 - j_2| \le k\) и \(\gcd(b_{i_1, j_1}, b_{i_2, j_2}) > 1\), где \(\gcd(x, y)\) обозначает наибольший общий делитель чисел \(x\) и \(y\).
Ваша задача — посчитать количество компонент связности\(^{\dagger}\) в полученном графе. \(^{\dagger}\)Компонента связности графа — это множество некоторых вершин графа, в котором любая вершина достижима из любой по рёбрам, и добавление любой другой вершины в множество нарушает это правило. Выходные данные Для каждого набора входных данных выведите одно целое число — количество компонент связности в полученном графе. Примечание В первом наборе входных данных матрица \(b\) приведена в условии. Первая компонента связности содержит вершины \((1, 1)\), \((2, 2)\) и \((3, 3)\). Вторая компонента связности содержит вершины \((1, 2)\), \((2, 3)\) и \((3, 1)\). Третья компонента связности содержит вершины \((1, 3)\), \((2, 1)\) и \((3, 2)\). Таким образом, в графе есть \(3\) компоненты связности. Во втором наборе входных данных получается следующая матрица: \(\)b = \begin{bmatrix} 3 & 4 & 9 \\ 9 & 3 & 4 \\ 4 & 9 & 3 \end{bmatrix}\(\) Первая компонента связности содержит все вершины, соответствующие элементам со значениями \(3\) и \(9\). Вторая компонента связности содержит все вершины, соответствующие элементам со значением \(4\). В четвёртом наборе входных данных все вершины находятся в одной компоненте связности.
| |
|
|
E. Черепаха и пересекающиеся отрезки
графы
жадные алгоритмы
снм
Структуры данных
*2600
Черепаха только что получила \(n\) отрезков и последовательность \(a_1, a_2, \ldots, a_n\). \(i\)-й отрезок представляет собой \([l_i, r_i]\). Черепаха создаст неориентированный граф \(G\). Если отрезок \(i\) и отрезок \(j\) пересекаются, то Черепаха добавит неориентированное ребро между \(i\) и \(j\) с весом \(|a_i - a_j|\), для каждого \(i \ne j\). Черепаха хочет, чтобы вы вычислили сумму весов рёбер минимального остовного дерева графа \(G\), или сообщили, что у графа \(G\) нет остовного дерева. Мы говорим, что два отрезка \([l_1, r_1]\) и \([l_2, r_2]\) пересекаются тогда и только тогда, когда \(\max(l_1, l_2) \le \min(r_1, r_2)\). Выходные данные Для каждого теста выведите одно целое число — сумму весов рёбер минимального остовного дерева графа \(G\). Если у графа \(G\) нет остовного дерева, выведите \(-1\). Примечание В первом тесте граф \(G\) выглядит следующим образом: Одно из минимальных остовных деревьев \(G\) выглядит следующим образом: Сумма весов рёбер минимального остовного дерева равна \(9\). Во втором тесте граф \(G\) выглядит следующим образом: \(G\) уже является деревом, и сумма весов дерева равна \(13\). В третьем тесте граф \(G\) выглядит следующим образом: В четвертом тесте граф \(G\) выглядит следующим образом: Легко видеть, что \(G\) не связан, поэтому у \(G\) нет остовного дерева.
| |
|
|
H1. Максимизация наибольшей компоненты (простая версия)
графы
Перебор
поиск в глубину и подобное
реализация
снм
Структуры данных
*1700
Простая и сложная версии фактически представляют собой разные задачи, поэтому внимательно прочитайте условия обеих задач. Единственное различие между двумя версиями — это применяемая операция. У Алекса есть матрица из \(n\) строк и \(m\) столбцов, состоящая из символов '.' и '#'. Набор '#' ячеек формирует компоненту связности, если из любой ячейки в этом наборе можно достичь любую другую ячейку в этом наборе, перемещаясь только в другую ячейку набора, которая имеет общую сторону. Размер компоненты связности — это количество ячеек в наборе. За одну операцию Алекс выбирает любую строку \(r\) (\(1 \le r \le n\)) или любой столбец \(c\) (\(1 \le c \le m\)), затем устанавливает каждую ячейку в строке \(r\) или столбце \(c\) равной '#'. Помогите Алексу найти максимально возможный размер наибольшей компоненты связности из ячеек '#', который он может достичь после выполнения операции не более одного раза. Выходные данные Для каждого теста выведите одно целое число — максимально возможный размер компоненты связности из ячеек '#', который может достичь Алекс. Примечание Во втором примере для Алекса оптимально установить все ячейки в столбце \(2\) равными '#'. Это приведет к тому, что наибольшая компонента связности из '#' будет иметь размер \(6\). В третьем примере для Алекса оптимально установить все ячейки в строке \(2\) равными '#'. Это приведет к тому, что наибольшая компонента связности из '#' будет иметь размер \(9\). В четвертом примере для Алекса оптимально установить все ячейки в строке \(4\) равными '#'. Это приведет к тому, что наибольшая компонента связности из '#' будет иметь размер \(11\).
| |
|
|
H2. Максимизация наибольшей компоненты (сложная версия)
дп
поиск в глубину и подобное
реализация
снм
Структуры данных
*2200
Простая и сложная версии фактически представляют собой разные задачи, поэтому внимательно прочитайте условия обеих задач. Единственное различие между двумя версиями — это применяемая операция. У Алекса есть матрица из \(n\) строк и \(m\) столбцов, состоящая из символов '.' и '#'. Набор '#' ячеек формирует компоненту связности, если из любой ячейки в этом наборе можно достичь любую другую ячейку в этом наборе, перемещаясь только в другую ячейку набора, которая имеет общую сторону. Размер компоненты связности — это количество ячеек в наборе. За одну операцию Алекс выбирает любую строку \(r\) (\(1 \le r \le n\)) и любой столбец \(c\) (\(1 \le c \le m\)), затем устанавливает каждую ячейку в строке \(r\) и столбце \(c\) равной '#'. Помогите Алексу найти максимально возможный размер наибольшей компоненты связности из ячеек '#', который он может достичь после выполнения операции не более одного раза. Выходные данные Для каждого теста выведите одно целое число — максимально возможный размер связного компонента из ячеек '#', который может достичь Алекс. Примечание В четвертом тесте для Алекса оптимально установить все ячейки в строке \(4\) и столбце \(2\) равными '#'. Это приведет к наибольшей компоненте связности из ячеек '#' размером \(16\). В пятом тесте для Алекса оптимально установить все ячейки в строке \(2\) и столбце \(4\) равными '#'. Это приведет к наибольшей компоненте связности из ячеек '#' размером \(22\).
| |
|
|
E. Прекрасное дерево!
Деревья
жадные алгоритмы
Перебор
поиск в глубину и подобное
снм
Структуры данных
*2000
Да благословят боги этот прекрасный ArrayForces! Случайная галька Дано дерево с \(n\) вершинами с корнем в вершине \(1\), в \(i\)-й вершине записано целое число \(a_i\). Пусть \(L\) — это множество всех прямых сыновей\(^{\text{∗}}\) вершины \(v\). Назовём дерево прекрасным, если для всех вершин \(v\) с непустым \(L\) верно \(\)a_v \le \sum_{u \in L}{a_u}.\(\) За одну операцию вы можете выбрать любую вершину \(v\) и увеличить значение \(a_v\) на \(1\). Найдите минимальное количество операций, необходимых для того, чтобы сделать данное дерево прекрасным! Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество операций, необходимых для того, чтобы сделать данное дерево прекрасным! Примечание Дерево в первом наборе входных данных: Вы можете применить операцию к вершине \(5\) и дважды к вершине \(2\), чтобы получить прекрасное дерево. Во втором наборе входных данных вы можете два раза применить операцию к вершине \(2\), чтобы получить прекрасное дерево. В третьих и четвёртых наборах входных данных дерево уже прекрасно, поэтому применять операций не надо.
| |
|
|
D. Смешная игра
графы
Деревья
жадные алгоритмы
Конструктив
математика
снм
теория чисел
*1900
У Вани есть граф из \(n\) вершин (пронумерованных от \(1\) до \(n\)) и массив \(a\) из \(n\) целых чисел, изначально в графе нет рёбер. Ване стало скучно, и чтобы ему стало весело, он решил выполнить \(n - 1\) операцию. Операция под номером \(x\) (операции нумеруются по порядку начиная с \(1\)) заключается в следующем: - Выбрать \(2\) различных числа \(1 \leq u,v \leq n\), таких что \(|a_u - a_v|\) делится на \(x\).
- Добавить в граф неориентированное ребро между вершинами \(u\) и \(v\).
Помогите Ване с помощью \(n - 1\) операции получить связный\(^{\text{∗}}\) граф, или скажите, что это невозможно. Выходные данные Для каждого набора входных данных, если решения не существует, то выведите «No» (без кавычек). Иначе выведите «Yes» (без кавычек), после этого выведите \(n - 1\) строку, в \(i\)-й из них выведите числа \(u\) и \(v\), которые надо выбрать на операции \(i\). Вы можете вывести каждую букву в любом регистре (например, «YES», «Yes», «yes», «yEs» будут распознаны как положительный ответ). Примечание Рассмотрим второй набор входных данных. - Первая операция \((x = 1)\): можно соединить вершины \(4\) и \(1\), так как \(|a_4 - a_1| = |13 - 99| = |-86| = 86\), а \(86\) кратно \(1\).
- Вторая операция \((x = 2)\): можно соединить вершины \(2\) и \(1\), так как \(|a_2 - a_1| = |7 - 99| = |-92| = 92\), а \(92\) кратно \(2\).
- Третья операция \((x = 3)\): можно соединить вершины \(3\) и \(2\), так как \(|a_3 - a_2| = |1 - 7| = |-6| = 6\), а \(6\) кратно \(3\).
 Из картинки видно, что получился связный граф.
| |
|
|
C. Угадайте дерево
Бинарный поиск
Деревья
жадные алгоритмы
интерактив
Перебор
поиск в глубину и подобное
разделяй и властвуй
снм
*1500
Это интерактивная задача. Мизуки выбрала секретное дерево с \(n\) вершинами, пронумерованными от \(1\) до \(n\), и попросила вас отгадать его с помощью запросов следующего типа: - «? a b» — Мизуки скажет вам, какая вершина \(x\) минимизирует \(|d(a,x) - d(b,x)|\), где \(d(x,y)\) — расстояние между вершинами \(x\) и \(y\). Если таких вершин несколько, Мизуки укажет вам ту, которая минимизирует \(d(a,x)\).
Выясните структуру секретного дерева Мизуки, используя не более \(15n\) запросов! Протокол взаимодействия Взаимодействие начинается с чтения целого числа \(n\). Затем вы можете сделать до \(15n\) запросов. Чтобы сделать запрос, выведите строку в формате «? a b» (без кавычек) (\(1 \le a,b \le n\)). После каждого запроса считайте целое число — ответ на ваш запрос. Чтобы сообщить ответ, выведите строку в формате «! \(a_1\) \(b_1\) \(a_2\) \(b_2\) ... \(a_{n-1}\) \(b_{n-1}\)» (без кавычек), что означает, что между вершинами \(a_i\) и \(b_i\) существует ребро для каждого \(1 \le i \le n-1\). Вы можете выводить ребра в любом порядке. После того как будет сделано \(15n\) запросов, ответ на любой другой запрос будет равен \(-1\). Получив такой ответ, завершите программу, чтобы получить вердикт Неправильный ответ. После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Взломы Для взломов используйте следующий формат: Первая строка содержит целое число \(t\) (\(1 \le t \le 200\)) — количество наборов входных данных. Первая строка каждого набора входных данных держит целое число \(n\) — количество вершин в скрытом дереве. Затем следует \(n-1\) строка. В \(i\)-й из них содержатся два целых числа \(a_i\) и \(b_i\) (\(1 \le a_i, b_i \le n\)), что означает, что между \(a_i\) и \(b_i\) в скрытом дереве есть ребро. Сумма \(n\) по всем наборам входных данных не должна превосходить \(1000\). Примечание Дерево — это связный неориентированный граф без циклов. Дерево с \(n\) вершинами всегда будет иметь \(n-1\) ребро. В примере ответ на «? 1 2» равен \(1\). Это означает, что между вершинами \(1\) и \(2\) есть ребро. Ответ на запрос «? 1 3» равен \(1\). Это означает, что между вершинами \(1\) и \(3\) есть ребро. Ответ на запрос «? 1 4» равен \(3\). Можно доказать, что это возможно только в том случае, если вершина \(3\) соединена с вершинами \(1\) и \(4\). Следовательно, ребра дерева — это \((1,2)\), \((1,3)\) и \((3,4)\).
| |
|
|
B. Ирис и дерево
Деревья
математика
Перебор
поиск в глубину и подобное
снм
Структуры данных
*1800
Дано корневое дерево с корнем в вершине \(1\). Для любой вершины \(i\) (\(1 < i \leq n\)) в дереве есть ребро, соединяющее вершины \(i\) и \(p_i\) (\(1 \leq p_i < i\)), вес которого равен \(t_i\). Ирис не знает значений \(t_i\), но она знает, что \(\displaystyle\sum_{i=2}^n t_i = w\) и любое из \(t_i\) является неотрицательным целым числом. Вершины дерева пронумерованы особым образом: номера вершин в каждом поддереве представляют собой последовательные целые числа. Другими словами, вершины дерева пронумерованы в порядке обхода в глубину. Дерево на этой картинке удовлетворяет условию. Например, в поддереве вершины \(2\) номера вершин равны \(2, 3, 4, 5\), то есть являются последовательными целыми числами. Дерево на этой картинке не удовлетворяет условию, так как в поддереве вершины \(2\) номера вершин \(2\) и \(4\) не являются последовательными целыми числами. Определим \(\operatorname{dist}(u, v)\) как длину простого пути между вершинами \(u\) и \(v\) в дереве. Далее произойдёт \(n - 1\) событие: - Ирис сообщают целые числа \(x\) и \(y\), обозначающие, что \(t_x = y\).
После каждого события Ирис хочет знать максимальное возможное значение \(\operatorname{dist}(i, i \bmod n + 1)\) независимо для всех \(i\) (\(1\le i\le n\)). Ей достаточно узнать только сумму этих \(n\) значений. Пожалуйста, помогите Ирис быстро получить ответы. Обратите внимание, что при вычислении максимально возможных значений \(\operatorname{dist}(i, i \bmod n + 1)\) и \(\operatorname{dist}(j, j \bmod n + 1)\) для \(i \ne j\) неизвестные веса рёбер могут быть разными. Выходные данные Для каждого набора входных данных выведите одну строку, содержащую \(n-1\) целых числа, каждое из которых представляет ответ после каждого события. Примечание В первом наборе входных данных \(\operatorname{dist}(1, 2) = \operatorname{dist}(2, 1) = t_2 = w = 10^{12}\), поэтому \(\operatorname{dist}(1, 2) + \operatorname{dist}(2, 1) = 2 \cdot 10^{12}\) Во втором наборе входных данных дерево после того, как Ирис узнала все \(t_x\), показано ниже: \(\operatorname{dist}(1, 2) = t_2\), \(\operatorname{dist}(2, 3) = t_2 + t_3\), \(\operatorname{dist}(3, 4) = t_3 + t_4\), \(\operatorname{dist}(4, 1) = t_4\). После первого события мы узнали, что \(t_2 = 2\), поэтому \(\operatorname{dist}(1, 2) = 2\). В то же время: - \(\operatorname{dist}(2, 3)\) максимально, если \(t_3 = 7\), \(t_4 = 0\). Тогда \(\operatorname{dist}(2, 3) = 9\).
- \(\operatorname{dist}(3, 4)\) и \(\operatorname{dist}(4, 1)\) максимальны, если \(t_3 = 0\), \(t_4 = 7\). Тогда \(\operatorname{dist}(3, 4) = \operatorname{dist}(4, 1) = 7\).
Таким образом, ответ равен \(2 + 9 + 7 + 7 = 25\). После второго события мы узнали, что \(t_4 = 4\), тогда \(t_3 = w - t_2 - t_4 = 4\). \(\operatorname{dist}(1, 2) = 2\), \(\operatorname{dist}(2, 3) = 2 + 3 = 5\), \(\operatorname{dist}(3, 4) = 3 + 4 = 7\), \(\operatorname{dist}(4, 1) = 4\). Таким образом, ответ равен \(2 + 5 + 7 + 4 = 18\).
| |
|
|
D. Хобби Сакурако
графы
дп
математика
снм
*1100
Для некоторой перестановки \(p\)\(^{\text{∗}}\) Сакурако называет целое число \(j\) достижимым из целого числа \(i\), если можно сделать так, чтобы \(i\) стало равным \(j\), присваивая \(i=p_i\) некоторое количество раз. Если \(p=[3,5,6,1,2,4]\), то, например, \(4\) достижимо из \(1\), потому что: \(i=1\) \(\rightarrow\) \(i=p_1=3\) \(\rightarrow\) \(i=p_3=6\) \(\rightarrow\) \(i=p_6=4\). Теперь \(i=4\), так что \(4\) достижимо из \(1\). Каждое число перестановки окрашено либо в чёрный, либо в белый цвет. Сакурако определяет функцию \(F(i)\) как количество целых чисел чёрного цвета, которые достижимы из \(i\). Сакурако интересует \(F(i)\) для каждого \(1\le i\le n\), но вычислить все значения становится очень сложно, поэтому она просит вас, как своего хорошего друга, вычислить это. Выходные данные Для каждого набора входных данных выведите \(n\) целых чисел \(F(1), F(2), \dots, F(n)\).
| |
|
|
D. Максимум + минимум + количество
дп
жадные алгоритмы
матрицы
реализация
снм
сортировки
Структуры данных
*2200
Дан массив целых положительных чисел \(a_1, a_2, \ldots, a_n\). Вы можете раскрасить некоторые элементы массива в красный цвет, но при этом в нем не должно оказаться двух соседних красных элементов (т.е. для \(1 \leq i \leq n-1\) хотя бы один из \(a_i\) и \(a_{i+1}\) должен не быть красным). Ваш счет — это максимальное значение красного элемента, плюс минимальное значение красного элемента, плюс количество красных элементов. Найдите максимальный счет, который вы можете получить. Выходные данные Для каждого набора входных данных выведите одно целое число: максимально возможный счет, который можно получить, раскрасив некоторые элементы в красный цвет в соответствии с условием. Примечание В первом наборе входных данных вы можете раскрасить массив следующим образом: \([\color{red}{5}, 4, \color{red}{5}]\). Ваш счет составит \(\max([5, 5]) + \min([5, 5]) + \text{size}([5, 5]) = 5+5+2 = 12\). Это максимальный счет, который вы можете получить. Во втором наборе входных данных вы можете раскрасить массив следующим образом: \([4, \color{red}{5}, 4]\). Ваш счет составит \(\max([5]) + \min([5]) + \text{size}([5]) = 5+5+1 = 11\). Это максимальный счет, который вы можете получить. В третьем наборе входных данных вы можете раскрасить массив следующим образом: \([\color{red}{3}, 3, \color{red}{3}, 3, \color{red}{4}, 1, 2, \color{red}{3}, 5, \color{red}{4}]\). Ваш счет составит \(\max([3, 3, 4, 3, 4]) + \min([3, 3, 4, 3, 4]) + \text{size}([3, 3, 4, 3, 4]) = 4+3+5 = 12\). Это максимальный счет, который вы можете получить.
| |
|
|
E1. Сложные отрезки (простая версия)
Бинарный поиск
жадные алгоритмы
математика
разделяй и властвуй
снм
сортировки
Структуры данных
*3300
Это простая версия задачи. В этой версии ограничения на \(n\) и ограничение по времени ниже. Вы можете совершать взломы только в том случае, если решены обе версии задачи. Назовём множество (замкнутых) отрезков сложным, если оно может быть разбито на некоторые подмножества так, что - все подмножества имеют одинаковый размер; и
- пара отрезков пересекается тогда и только тогда, когда эти два отрезка находятся в одном и том же подмножестве.
Вам даны \(n\) отрезков \([l_1, r_1], [l_2, r_2], \ldots, [l_n, r_n]\). Найдите максимальный размер сложного подмножества этих отрезков. Выходные данные Для каждого набора входных данных выведите одно целое число: максимальный размер сложного подмножества заданных отрезков. Примечание В первом наборе входных данных все пары отрезков пересекаются, поэтому оптимально сформировать одну группу, содержащую все три отрезка. Во втором наборе входных данных не существует подходящего разбиения для всех пяти отрезков. Корректное разбиение с четырьмя отрезками выглядит следующим образом: \(\{\{ [1, 5], [2, 4] \}, \{ [6, 9], [8, 10] \}\}\). В третьем наборе входных данных оптимально составить одну группу, содержащую все отрезки, кроме второго.
| |
|
|
E2. Сложные отрезки (сложная версия)
Бинарный поиск
жадные алгоритмы
математика
разделяй и властвуй
снм
сортировки
Структуры данных
*3400
Это сложная версия задачи. В этой версии ограничения на \(n\) и ограничение по времени выше. Вы можете совершать взломы только в том случае, если решены обе версии задачи. Назовём множество (замкнутых) отрезков сложным, если оно может быть разбито на некоторые подмножества так, что - все подмножества имеют одинаковый размер; и
- пара отрезков пересекается тогда и только тогда, когда эти два отрезка находятся в одном и том же подмножестве.
Вам даны \(n\) отрезков \([l_1, r_1], [l_2, r_2], \ldots, [l_n, r_n]\). Найдите максимальный размер сложного подмножества этих отрезков. Выходные данные Для каждого набора входных данных выведите одно целое число: максимальный размер сложного подмножества заданных отрезков. Примечание В первом наборе входных данных все пары отрезков пересекаются, поэтому оптимально сформировать одну группу, содержащую все три отрезка. Во втором наборе входных данных не существует подходящего разбиения для всех пяти отрезков. Корректное разбиение с четырьмя отрезками выглядит следующим образом: \(\{\{ [1, 5], [2, 4] \}, \{ [6, 9], [8, 10] \}\}\). В третьем наборе входных данных оптимально составить одну группу, содержащую все отрезки, кроме второго.
| |
|
|
D. Соедини точки
графы
Деревья
дп
математика
Перебор
снм
*1800
Одним уютным вечером Алиса решила сыграть в классическую игру «Соедини точки», но с подвохом. Чтобы начать игру, Алиса рисует прямую линию и отмечает на ней \(n\) точек, проиндексированных числами от \(1\) до \(n\). Изначально между точками нет рёбер, так что все они попарно не соединены. Затем Алиса выполняет \(m\) операций следующего типа: - Она выбирает три целых числа \(a_i\), \(d_i\) (\(1 \le d_i \le 10\)) и \(k_i\).
- Затем для точек \(a_i, a_i+d_i, a_i+2d_i, a_i+3d_i, \ldots, a_i+k_i\cdot d_i\) Алиса соединяет ребром каждую пару из них.
Алиса хочет узнать, сколько компонент связности\(^\dagger\) образуют эти точки после выполнения всех \(m\) операций. \(^\dagger\) Считается, что две точки лежат в одной компоненте связности, если между ними есть путь, использующий несколько (возможно, ноль) промежуточных рёбер и вершин. Выходные данные Для каждого набора входных данных выведите количество компонент связности. Примечание В первом наборе входных данных есть \(n = 10\) точек. Первая операция соединяет точки \(1\), \(3\), \(5\), \(7\) и \(9\). Вторая операция соединяет точки \(2\), \(4\), \(6\), \(8\) и \(10\). В итоге получаем две компоненты связности: \(\{1, 3, 5, 7, 9\}\) и \(\{2, 4, 6, 8, 10\}\). Во втором наборе входных данных есть \(n = 100\) точек. Единственная операция соединяет точки \(19\), \(21\), \(23\), \(25\) и \(27\). Теперь они образуют одну компоненту связности размера \(5\). Остальные \(95\) точек ни с кем не соединены, так что каждая из них образует отдельную компоненту связности. Значит, ответ равен \(1 + 95 = 96\). В третьем наборе входных данных есть \(n = 100\) точек. После выполнения всех операций все точки с нечётными номерами от \(1\) до \(79\) образуют одну компоненту связности размера \(40\). Остальные \(60\) точек ни с кем не соединены, так что каждая из них образует отдельную компоненту связности. Значит, ответ равен \(1 + 60 = 61\).
| |
|
|
E1. Цифровая деревня (простая версия)
бпф
графы
Деревья
дп
жадные алгоритмы
математика
Перебор
поиск в глубину и подобное
реализация
снм
Структуры данных
*2300
Это простая версия задачи. В трех версиях отличаются ограничения на \(n\) и \(m\). Вы можете совершать взломы только в том случае, если решены все версии задачи. Пак Чанек устанавливает интернет-связь в деревне Кхунтиен. Деревню можно представить как связный простой граф с \(n\) домами и \(m\) интернет-кабелями, соединяющими дом \(u_i\) и дом \(v_i\), каждый с задержкой \(w_i\). Существует \(p\) домов, которым требуется интернет. Пак Чанек может установить серверы не более чем в \(k\) домов. Дома, которым нужен интернет, будут подключены к одному из серверов. Однако, поскольку каждый кабель имеет свою задержку, задержка, которую испытывает дом \(s_i\), нуждающийся в интернете, будет равна максимальной задержке кабелей между этим домом и сервером, к которому он подключен. Для каждого \(k = 1,2,\ldots,n\), помогите Пак Чанеку определить минимальную суммарную задержку, которая может быть достигнута для всех домов, требующих интернет. Выходные данные Для каждого набора входных данных выведите \(n\) целых чисел: минимальное общее время ожидания, которое может быть достигнуто для всех домов, нуждающихся в интернете для каждого \(k = 1,2,\ldots,n\). Примечание В первом наборе входных данных для \(k=3\) одним из лучших решений является установка серверов в вершинах \(2\), \(6\) и \(8\) и получение следующей задержки: - задержка\((2) = 0\)
- задержка\((5) = \max(3, 5) = 5\)
- задержка\((6) = 0\)
- задержка\((8) = 0\)
- задержка\((9) = \max(2, 4) = 4\)
Таким образом, общая задержка составит \(9\).
| |
|
|
E2. Цифровая деревня (сложная версия)
графы
Деревья
дп
математика
снм
Структуры данных
*2500
Это сложная версия задачи. В трех версиях отличаются ограничения на \(n\) и \(m\). Вы можете совершать взломы только в том случае, если решены все версии задачи. Пак Чанек устанавливает интернет-связь в деревне Кхунтиен. Деревню можно представить как связный простой граф с \(n\) домами и \(m\) интернет-кабелями, соединяющими дом \(u_i\) и дом \(v_i\), каждый с задержкой \(w_i\). Существует \(p\) домов, которым требуется интернет. Пак Чанек может установить серверы не более чем в \(k\) домов. Дома, которым нужен интернет, будут подключены к одному из серверов. Однако, поскольку каждый кабель имеет свою задержку, задержка, которую испытывает дом \(s_i\), нуждающийся в интернете, будет равна максимальной задержке кабелей между этим домом и сервером, к которому он подключен. Для каждого \(k = 1,2,\ldots,n\), помогите Пак Чанеку определить минимальную суммарную задержку, которая может быть достигнута для всех домов, требующих интернет. Выходные данные Для каждого набора входных данных выведите \(n\) целых чисел: минимальное общее время ожидания, которое может быть достигнуто для всех домов, нуждающихся в интернете для каждого \(k = 1,2,\ldots,n\). Примечание В первом наборе входных данных для \(k=3\) одним из лучших решений является установка серверов в вершинах \(2\), \(6\) и \(8\) и получение следующей задержки: - задержка\((2) = 0\)
- задержка\((5) = \max(3, 5) = 5\)
- задержка\((6) = 0\)
- задержка\((8) = 0\)
- задержка\((9) = \max(2, 4) = 4\)
Таким образом, общая задержка составит \(9\).
| |
|
|
E3. Цифровая деревня (экстремальная версия)
графы
Деревья
дп
жадные алгоритмы
математика
поиск в глубину и подобное
снм
Структуры данных
*2800
Это экстремальная версия задачи. В трех версиях отличаются ограничения на \(n\) и \(m\). Вы можете совершать взломы только в том случае, если решены все версии задачи. Пак Чанек устанавливает интернет-связь в деревне Кхунтиен. Деревню можно представить как связный простой граф с \(n\) домами и \(m\) интернет-кабелями, соединяющими дом \(u_i\) и дом \(v_i\), каждый с задержкой \(w_i\). Существует \(p\) домов, которым требуется интернет. Пак Чанек может установить серверы не более чем в \(k\) домов. Дома, которым нужен интернет, будут подключены к одному из серверов. Однако, поскольку каждый кабель имеет свою задержку, задержка, которую испытывает дом \(s_i\), нуждающийся в интернете, будет равна максимальной задержке кабелей между этим домом и сервером, к которому он подключен. Для каждого \(k = 1,2,\ldots,n\), помогите Пак Чанеку определить минимальную суммарную задержку, которая может быть достигнута для всех домов, требующих интернет. Выходные данные Для каждого набора входных данных выведите \(n\) целых чисел: минимальное общее время ожидания, которое может быть достигнуто для всех домов, нуждающихся в интернете для каждого \(k = 1,2,\ldots,n\). Примечание В первом наборе входных данных для \(k=3\) одним из лучших решений является установка серверов в вершинах \(2\), \(6\) и \(8\) и получение следующей задержки: - задержка\((2) = 0\)
- задержка\((5) = \max(3, 5) = 5\)
- задержка\((6) = 0\)
- задержка\((8) = 0\)
- задержка\((9) = \max(2, 4) = 4\)
Таким образом, общая задержка составит \(9\).
| |
|
|
E1. Billetes MX (простая версия)
2-sat
Бинарный поиск
графы
Комбинаторика
Конструктив
поиск в глубину и подобное
снм
*2500
Это простая версия задачи. В этой версии гарантируется, что \(q = 0\). Вы можете совершать взломы только в том случае, если решены обе версии задачи. Целочисленная сетка \(A\) с \(p\) строками и \(q\) столбцами называется красивой, если: - Все элементы сетки являются целыми числами от \(0\) до \(2^{30}-1\), и
- Для любой подсетки XOR значений в углах равен \(0\). Формально, для любых четырех целых чисел \(i_1\), \(i_2\), \(j_1\), \(j_2\) (\(1 \le i_1 < i_2 \le p\); \(1 \le j_1 < j_2 \le q\)) должно выполняться \(A_{i_1, j_1} \oplus A_{i_1, j_2} \oplus A_{i_2, j_1} \oplus A_{i_2, j_2} = 0\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ.
Имеется частично заполненная целочисленная сетка \(G\) с \(n\) строками и \(m\) столбцами, в которой заполнены только \(k\) ячеек. Поликарп хочет узнать, сколькими способами он может распределить целые числа по незаполненным ячейкам, чтобы сетка стала красивой. Однако Монокарп считает, что эта задача слишком проста. Поэтому он выполнит \(q\) обновлений сетки. В каждом обновлении он будет выбирать незаполненную ячейку и присваивать ей целое число. Заметим, что эти обновления перманентны. То есть изменения, внесенные в сетку, будут применяться при обработке будущих обновлений. Для каждого из \(q + 1\) состояния сетки (начального состояния и после каждого из \(q\) запросов) определите количество способов, которыми Поликарп может присвоить целые числа незаполненным ячейкам, чтобы сетка стала красивой. Поскольку это число может быть очень большим, от вас требуется только вывести их значения по модулю \(10^9+7\). Выходные данные Для каждого набора входных данных выведите \(q + 1\) строку. В \(i\)-й строке вывода должен содержаться ответ для \(i\)-го состояния решетки по модулю \(10^9 + 7\). Примечание В первом наборе входных данных мы имеем следующую сетку: | \(0\) | \(6\) | \(10\) | | \(6\) | \(0\) | \(12\) | | \(10\) | \(12\) | \(?\) | Можно доказать, что единственным допустимым значением для ячейки \((3, 3)\) является \(0\).
| |
|
|
E2. Billetes MX (сложная версия)
Бинарный поиск
графы
Комбинаторика
снм
Структуры данных
*2600
Это сложная версия задачи. В этой версии гарантируется, что \(q \leq 10^5\). Вы можете совершать взломы только в том случае, если решены обе версии задачи. Целочисленная сетка \(A\) с \(p\) строками и \(q\) столбцами называется красивой, если: - Все элементы сетки являются целыми числами от \(0\) до \(2^{30}-1\), и
- Для любой подсетки XOR значений в углах равен \(0\). Формально, для любых четырех целых чисел \(i_1\), \(i_2\), \(j_1\), \(j_2\) (\(1 \le i_1 < i_2 \le p\); \(1 \le j_1 < j_2 \le q\)) должно выполняться \(A_{i_1, j_1} \oplus A_{i_1, j_2} \oplus A_{i_2, j_1} \oplus A_{i_2, j_2} = 0\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ.
Имеется частично заполненная целочисленная сетка \(G\) с \(n\) строками и \(m\) столбцами, в которой заполнены только \(k\) ячеек. Поликарп хочет узнать, сколькими способами он может распределить целые числа по незаполненным ячейкам, чтобы сетка стала красивой. Однако Монокарп считает, что эта задача слишком проста. Поэтому он выполнит \(q\) обновлений сетки. В каждом обновлении он будет выбирать незаполненную ячейку и присваивать ей целое число. Заметим, что эти обновления перманентны. То есть изменения, внесенные в сетку, будут применяться при обработке будущих обновлений. Для каждого из \(q + 1\) состояния сетки (начального состояния и после каждого из \(q\) запросов) определите количество способов, которыми Поликарп может присвоить целые числа незаполненным ячейкам, чтобы сетка стала красивой. Поскольку это число может быть очень большим, от вас требуется только вывести их значения по модулю \(10^9+7\). Выходные данные Для каждого набора входных данных выведите \(q + 1\) строку. В \(i\)-й строке вывода должен содержаться ответ для \(i\)-го состояния решетки по модулю \(10^9 + 7\). Примечание В первом наборе входных данных мы изначально имеем следующую сетку: | \(0\) | \(6\) | \(10\) | | \(6\) | \(0\) | \(12\) | | \(10\) | \(12\) | \(?\) | Можно доказать, что единственным допустимым значением для ячейки \((3, 3)\) является \(0\), поэтому первый ответ — \(1\). Для второго запроса ячейка не удовлетворяет условию, поэтому ответ — \(0\).
| |
|
|
D. Классный граф
графы
Деревья
жадные алгоритмы
Конструктив
поиск в глубину и подобное
снм
Структуры данных
*1900
Вам дан неориентированный граф с \(n\) вершинами и \(m\) рёбрами. Вы можете выполнить следующую операцию не более чем \(2\cdot \max(n,m)\) раз: - Выберите три различные вершины \(a\), \(b\) и \(c\). Затем для каждого из рёбер \((a,b)\), \((b,c)\) и \((c,a)\) выполните следующее:
- Если ребро не существует, добавьте его. В противном случае, если оно существует, удалите его.
Граф называется классным, если и только если выполняется одно из следующих условий: - Граф не имеет рёбер, или
- Граф является деревом.
Вам нужно сделать граф классным, выполняя указанные выше операции. Обратите внимание, что вы можете использовать не более чем \(2\cdot \max(n,m)\) операций. Можно показать, что всегда существует хотя бы одно решение. Выходные данные Для каждого набора входных данных в первой строке выведите целое число \(k\) (\(0\le k\le 2\cdot \max(n, m)\)) — количество операций. Затем выведите \(k\) строк, \(i\)-я строка содержит три различных целых числа \(a\), \(b\) и \(c\) (\(1\le a,b,c\le n\)) — три целых числа, которые вы выбрали в \(i\)-й операции. Если существует несколько решений, вы можете вывести любое из них. Примечание В первом наборе входных данных граф уже классный, потому что рёбер нет. Во втором наборе входных данных, после выполнения единственной операции, граф становится деревом, поэтому он классный. В третьем наборе входных данных граф уже классный, потому что он является деревом. В четвёртом наборе входных данных, после выполнения единственной операции, граф не имеет рёбер, поэтому он классный. В пятом наборе входных данных: | Операция | Граф до операции | Граф после операции | | \(1\) |  |  | | \(2\) |  |  | | \(3\) |  |  | Обратите внимание, что после первой операции граф уже стал классным, и есть две лишние операции. Поскольку граф по-прежнему классный после двух лишних операций, это является допустимым ответом.
| |
|
|
D. Пенчик и пустынный кролик
Бинарный поиск
дп
жадные алгоритмы
поиск в глубину и подобное
реализация
снм
Структуры данных
*1700
Пенчик бросил себе вызов — выжить под полуденным солнцем в Аравийской пустыне! На линейном оазисе в ряд растёт \(n\) пальм, обозначим их высоты \(a_i\). Во время прогулки Пенчик заметил пустынного кролика, который готовится прыгнуть вдоль линии пальм. Кролик может перепрыгнуть с \(i\)-го дерева на \(j\)-е, если верно ровно одно из следующих условий: - \(j < i\) и \(a_j > a_i\): кролик может прыгнуть назад на более высокое дерево.
- \(j > i\) и \(a_j < a_i\): кролик может прыгнуть вперёд на более низкое дерево.
Для каждого \(i\) от \(1\) до \(n\) определите максимальную высоту среди всех деревьев, которые может достичь кролик, если он начнёт с \(i\)-го дерева. Выходные данные Для каждого набора входных данных выведите \(n\) целых чисел. \(i\)-е число должно равняться максимальной высоте среди всех деревьев, которые может достичь кролик, если он начнёт с дерева \(i\). Примечание В первом наборе входных данных высоты деревьев равны \(a = [2, 3, 1, 4]\). - Если кролик стартует с первого дерева, то он может перепрыгнуть на третье дерево, так как \(3 > 1\) и \(1 < 2\). Затем кролик может перепрыгнуть на второе дерево, так как \(2 < 3\) и \(3 > 1\). Можно доказать, что кролик не может допрыгнуть до четвёртого дерева; следовательно, максимальная высота дерева, до которого может допрыгнуть кролик, равна \(a_2 = 3\).
- Если кролик стартует с четвёртого дерева, ему не нужно никуда прыгать, так как он уже находится на самом высоком дереве.
Во втором наборе входных данных кролик может прыгнуть на первое дерево независимо от того, с какого дерева он стартует. В пятом наборе входных данных, если кролик начинает с пятого дерева, он может прыгнуть на четвёртое дерево. Затем кролик может перепрыгнуть на седьмое дерево и, наконец, достичь шестого дерева. Таким образом, максимальная высота дерева, до которого может добраться кролик, равна \(8\).
| |
|
|
D. Задание Косукэ
дп
жадные алгоритмы
математика
снм
Структуры данных
*1300
После поездки с Сакурако Косукэ очень испугался, потому что забыл о своем задании по программированию. В этом задании учитель дал ему массив \(a\) из \(n\) целых чисел и попросил вычислить количество непересекающихся отрезков массива \(a\), таких что каждый отрезок считается красивым. Отрезок \([l,r]\) считается красивым, если \(a_l + a_{l+1} + \dots + a_{r-1} + a_r=0\). Для фиксированного массива \(a\) ваша задача состоит в том, чтобы вычислить максимальное количество непересекающихся красивых сегментов. Выходные данные Для каждого теста выведите одно целое число: максимальное количество непересекающихся красивых отрезков.
| |
|
|
E. Сакурако, Косукэ и перестановка
графы
жадные алгоритмы
математика
Перебор
поиск в глубину и подобное
снм
Структуры данных
*1400
Экзамены Сакурако закончились, она справилась на отлично. В награду она получила перестановку \(p\). Косукэ был не совсем доволен, потому что он провалил один экзамен и не получил подарок. Он решил пробраться в её комнату (спасибо за код от её замка) и испортить перестановку так, чтобы она стала простой. Перестановка \(p\) считается простой, если для каждого \(i\) \((1\le i \le n)\) выполняется одно из условий: Например, перестановки \([1, 2, 3, 4]\), \([5, 2, 4, 3, 1]\) и \([2, 1]\) являются простыми, а \([2, 3, 1]\) и \([5, 2, 1, 4, 3]\) — нет. За одну операцию Косукэ может выбрать индексы \(i,j\) \((1\le i,j\le n)\) и поменять местами элементы \(p_i\) и \(p_j\). Сакурако вот-вот вернется домой. Ваша задача — вычислить минимальное количество операций, которые необходимо выполнить Косукэ, чтобы сделать перестановку простой. Выходные данные Для каждого набора входных данных выведите минимальное количество операций, которые необходимо выполнить Косукэ, чтобы перестановка стала простой. Примечание В первом и втором примерах перестановки уже простые. В четвёртом примере достаточно поменять местами \(p_2\) и \(p_4\). Таким образом перестановка станет равна \([2, 1, 4, 3]\) за \(1\) операцию.
| |
|
|
J. Bottle Arrangement
дп
жадные алгоритмы
разделяй и властвуй
снм
Структуры данных
*2700
Image generated by ChatGPT 4o. Mayaw works in a renowned Epah (aboriginal Taiwanese millet wine; Epah is the Pangcah term for aboriginal Taiwanese millet wine, named in the language of the Pangcah people, the largest Indigenous group in Taiwan) bar in the Fata'an Village. To showcase the depth of its collections, the bar has a two-row wine rack where each row can fit exactly \(n\) bottles. There are already \(n\) bottles placed on the back row of the rack, where the \(i\)-th bottle from left has height \(a_i\). The owner of the bar has another \(n\) bottles with distinct heights \(b_1, \ldots, b_n\) that he would like Mayaw to put on the first row. To ensure that all bottles on the rack are visible, the owner requires that each bottle on the back row should not be blocked by the one put in front of it. That is, if a bottle of height \(h\) is put on the \(i\)-th spot (from left) in the first row, then \(h\) must be less than \(a_i\). However, not all such arrangements are good for the owner. To pay tributes to the Maxi Mountain nearby, he additionally demands that the bottles in the front row should display a mountain-like shape. In particular, the heights of the bottles, when listing from left to right, should form a sequence that is first (non-strictly) increasing and then (non-strictly) decreasing. Unfortunately, sometimes it is impossible to achieve owner's requirements. That is why Mayaw is also allowed to slightly reduce a bottle's height by removing its cap that has a height of \(1\). In other words, after the removal of the cap, the height of the bottle decreases by exactly \(1\). Of course, exposing the Epah inside the bottle to the open air is detrimental to its quality, and therefore it is desirable to remove as few bottle caps as possible. Can you help Mayaw determine the minimum number of caps needed to be removed so that he can arrange the bottles in a way that satisfies the owner's requirements? Note that the positions of the bottles in the back row are fixed and Mayaw is not allowed to modify them. Output Output the minimum number of bottle caps needed to be removed so that Mayaw can arrange the bottles in the desired way. If it is impossible to achieve that (regardless of the number of caps removed), output -1 instead.
| |
|
|
G2. Средняя демоническая задача (сложная версия)
графы
Деревья
дп
поиск в глубину и подобное
реализация
снм
*1900
Это сложная версия задачи. Ключевое отличие между двумя версиями выделено жирным шрифтом. Группа из \(n\) пауков собралась, чтобы обменяться плюшевыми игрушками. Изначально у каждого паука есть \(1\) плюшевая игрушка. Каждый год, если паук \(i\) имеет хотя бы одну плюшевую игрушку, он отдаст ровно одну плюшевую игрушку пауку \(r_i\). В противном случае он ничего не сделает. Обратите внимание, что все передачи плюшевых игрушек происходят одновременно. В этой версии каждому пауку разрешено иметь более 1 плюшевой игрушки в любой момент времени. Процесс считается стабильным в текущем году, если у каждого паука такое же количество плюшевых игрушек (до обмена в текущем году), как и в предыдущем году (до обмена в предыдущем году). Обратите внимание, что год \(1\) никогда не может быть стабильным. Найдите первый год, в котором процесс становится стабильным. Выходные данные Для каждого набора входных данных выведите целое число в новой строке, первый год, в котором процесс становится стабильным. Примечание Для второго набора входных данных: - В год \(1\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 1, 1, 1]\). Затем происходит обмен в год \(1\).
- В год \(2\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 1, 1, 1]\). Поскольку этот массив такой же, как в предыдущем году, этот год является стабильным.
Для третьего набора входных данных: - В год \(1\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 1, 1, 1]\). Затем происходит обмен в год \(1\).
- В год \(2\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 2, 1, 1, 0]\). Затем происходит обмен в год \(2\).
- В год \(3\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 3, 0, 1, 0]\). Затем происходит обмен в год \(3\).
- В год \(4\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 4, 0, 0, 0]\). Затем происходит обмен в год \(4\).
- В год \(5\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 4, 0, 0, 0]\). Поскольку этот массив такой же, как в предыдущем году, этот год является стабильным.
| |
|
|
F. MEX-ИЛИ-мания
битмаски
Перебор
реализация
снм
Структуры данных
*2700
Последовательность чисел \(b_1, b_2, \ldots, b_n\) является хорошей, если \(\operatorname{mex}(b_1, b_2, \ldots, b_n) - (b_1 | b_2 | \ldots | b_n) = 1\). Здесь \(\operatorname{mex(c)}\) обозначает MEX\(^{\text{∗}}\) набора чисел \(c\), а \(|\) обозначает операцию побитового ИЛИ. У Шохага есть целочисленная последовательность \(a_1, a_2, \ldots, a_n\). Он выполнит следующие \(q\) обновлений последовательности \(a\): - \(i\) \(x\) — увеличить \(a_i\) на \(x\).
После каждого обновления помогите Шохагу найти длину самого длинного хорошего подмассива\(^{\text{†}}\) массива \(a\). Выходные данные Для каждого набора входных данных выведите \(q\) строк — в \(i\)-й строке выведите длину самого длинного хорошего подмассива \(a\) после \(i\)-го обновления. Примечание В первом наборе входных данных после первого обновления массив становится \([0, 0, 1, 0, 1, 1]\). Весь массив является хорошим, так как \(\operatorname{mex}([0, 0, 1, 0, 1, 1]) - (0 | 0 | 1 | 0 | 1 | 1) = 2 - 1 = 1\). После второго обновления массив становится равен \([0, 0, 3, 0, 1, 1]\), и его подмассив \([0, 1, 1]\) имеет максимальную длину среди всех хороших подмассивов. Наконец, после третьего обновления массив становится равен \([0, 0, 3, 0, 1, 4]\), и два его подмассива \([0, 0]\) и \([0, 1]\) имеют максимальную длину среди всех хороших подмассивов.
| |
|
|
G. Змейки
битмаски
графы
дп
снм
*2100
Предположим, вы играете в игру, где игровое поле выглядит как полоска из \(1 \times 10^9\) квадратных ячеек, пронумерованных от \(1\) до \(10^9\). У вас есть \(n\) змеек (пронумерованных от \(1\) до \(n\)), которые нужно разместить в некоторых ячейках. Изначально каждая змейка занимает ровно одну ячейку, и вы не можете разместить более одной змейки в одной ячейке. После этого начинается игра. Игра длится \(q\) секунд. Каждую секунду происходит один из двух типов событий: - змейка \(s_i\) увеличивается: если змейка \(s_i\) занимала ячейки \([l, r]\), она увеличивается до отрезка \([l, r + 1]\);
- змейка \(s_i\) уменьшается: если змейка \(s_i\) занимала ячейки \([l, r]\), она уменьшается до отрезка \([l + 1, r]\).
Каждую секунду происходит ровно одно из событий. Если в любой момент времени какая-либо змея наткнется на какое-либо препятствие (либо на другую змею, либо на конец полосы), вы проигрываете. В противном случае вы выигрываете со счетом, равным максимальной ячейке, занятой какой-либо змеей на данный момент. Какой минимально возможный счет вы можете получить? Выходные данные Выведите одно целое число — минимально возможный счет. Примечание В первом тесте оптимальная стратегия заключается в том, чтобы разместить вторую змею в ячейке \(1\), третью змею — в \(2\), а первую — в \(3\). Максимальная занятая ячейка — ячейка \(4\), и это минимально возможный результат. Во втором тесте одна из оптимальных стратегий — следующая: нужно поставить - змейку \(2\) в позицию \(1\);
- змейку \(3\) в позицию \(4\);
- змейку \(5\) в позицию \(6\);
- змейку \(1\) в позицию \(9\);
- змейку \(4\) в позицию \(10\).
| |
|
|
E. Вложенные отрезки
дп
Комбинаторика
математика
поиск в глубину и подобное
снм
*2500
Множество \(A\), состоящее из попарно различных отрезков \([l, r]\) с целочисленными концами, называется хорошим, если \(1\le l\le r\le n\), и для любой пары различных отрезков \([l_i, r_i], [l_j, r_j]\) из \(A\) выполняется ровно одно из следующих условий: - \(r_i < l_j\) или \(r_j < l_i\) (отрезки не пересекаются)
- \(l_i \le l_j \le r_j \le r_i\) или \(l_j \le l_i \le r_i \le r_j\) (один отрезок полностью содержится внутри другого)
Вам дано хорошее множество \(S\), состоящее из \(m\) попарно различных отрезков \([l_i, r_i]\) с целочисленными концами. Вы хотите добавить как можно больше дополнительных отрезков к набору \(S\), так, чтобы набор \(S\) остался хорошим. Поскольку эта задача слишком проста, вам нужно определить количество различных способов добавления максимального числа дополнительных отрезков к \(S\), так, чтобы набор остался хорошим. Два способа считаются разными, если существует отрезок, который добавляется одним из способов, но не другим. Формально, вам нужно найти количество хороших наборов различных отрезков \(T\), таких, чтобы \(S\) было подмножеством \(T\), и \(T\) имело максимально возможный размер. Поскольку ответ может быть очень большим, вычислите его по модулю \(998\,244\,353\). Выходные данные Для каждого набора входных данных выведите одно целое число — количество различных способов, которыми вы можете добавить максимальное количество дополнительных отрезков к набору \(S\), гарантируя при этом, что набор \(S\) останется хорошим, по модулю \(998\,244\,353\) Примечание В первом наборе входных данных единственным возможным отрезком является \([1, 1]\), поэтому \(T = \{[1, 1]\}\) имеет максимальный размер, и это единственное решение. Во втором наборе входных данных невозможно добавить какие-либо дополнительные отрезки к набору \(S\). Следовательно, единственный способ добавить отрезки к \(S\) — это ничего не добавлять. В третьем наборе входных данных можно добавить \(7\) дополнительных отрезков к \(S\), гарантируя, что набор останется хорошим. Можно доказать, что добавление более \(7\) дополнительных отрезков к \(S\) невозможно. Существует ровно \(2\) различных способа добавить эти \(7\) отрезков к \(S\), и соответствующие наборы \(T\) показаны ниже: - \(\{[1, 1], [1, 3], [1, 4], [1, 5], [2, 2], [2, 3], [3, 3], [4, 4], [5, 5]\}\)
- \(\{[1, 1], [1, 3], [1, 5], [2, 2], [2, 3], [3, 3], [4, 4], [4, 5], [5, 5]\}\).
В четвертом наборе входных данных существует ровно \(5\) различных способов добавить максимум \(6\) дополнительных отрезков к \(S\), соответствующие наборы \(T\) показаны ниже: - \(\{[1, 1], [1, 2], [1, 3], [1, 4], [2, 2], [3, 3], [4, 4]\}\)
- \(\{[1, 1], [1, 2], [1, 4], [2, 2], [3, 3], [3, 4], [4, 4]\}\)
- \(\{[1, 1], [1, 3], [1, 4], [2, 2], [2, 3], [3, 3], [4, 4]\}\)
- \(\{[1, 1], [1, 4], [2, 2], [2, 3], [2, 4], [3, 3], [4, 4]\}\)
- \(\{[1, 1], [1, 4], [2, 2], [2, 4], [3, 3], [3, 4], [4, 4]\}\)
| |
|
|
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\).
| |
|
|
E. Составление графа
графы
жадные алгоритмы
поиск в глубину и подобное
снм
*1500
Даны два простых неориентированных графа \(F\) и \(G\) с \(n\) узлами. У графа \(F\) есть \(m_1\) рёбер, а у графа \(G\) — \(m_2\) рёбер. Вы можете выполнять одну из следующих двух операций любое количество раз: - Выберите два целых числа \(u\) и \(v\) (\(1 \leq u,v \leq n\)), такие что между \(u\) и \(v\) в графе \(F\) есть ребро. Затем удалите это ребро из \(F\).
- Выберите два целых числа \(u\) и \(v\) (\(1 \leq u,v \leq n\)), такие что между \(u\) и \(v\) в графе \(F\) нет ребра. Затем добавьте ребро между \(u\) и \(v\) в \(F\).
Определите минимальное количество операций, необходимых для того, чтобы для всех целых чисел \(u\) и \(v\) (\(1 \leq u,v \leq n\)) существовал путь от \(u\) до \(v\) в \(F\) если и только если существует путь от \(u\) до \(v\) в \(G\). Выходные данные Для каждого набора входных данных выведите одно целое число, обозначающее минимальное количество операций, необходимых на новой строке. Примечание В первом наборе входных данных вы можете выполнить следующие три операции: - Добавить ребро между вершиной \(1\) и вершиной \(3\).
- Удалить ребро между вершиной \(1\) и вершиной \(2\).
- Удалить ребро между вершиной \(2\) и вершиной \(3\).
Можно показать, что меньшее количество операций невозможно достичь. Во втором наборе входных данных графы \(F\) и \(G\) уже изначально удовлетворяют условию. В пятом наборе входных данных рёбра от \(1\) до \(3\) и от \(2\) до \(3\) должны быть оба удалены.
| |
|
|
F1. Считать не весело (Простая версия)
графы
Деревья
дп
Комбинаторика
математика
поиск в глубину и подобное
реализация
снм
Структуры данных
хэши
*2400
Это простая версия задачи. Отличие между версиями заключается в том, что в этой версии ограничения на \(t\) и \(n\) меньше. Вы можете делать взломы только в том случае, если решили все версии этой задачи. Теперь Маленький Джон богат, и поэтому он наконец-то покупает дом, достаточно большой, чтобы вместить его и его любимую скобочную последовательность. Но каким-то образом он оказался с большим количеством скобок! Разочарованный, он пробивает потолок с помощью «ладони Будды». Скобочная последовательность называется правильной, если она может быть построена по следующей формальной грамматике: - Пустая последовательность \(\varnothing\) сбалансирована.
- Если скобочная последовательность \(A\) правильная, то \(\mathtt{(}A\mathtt{)}\) также является правильной.
- Если скобочные последовательности \(A\) и \(B\) правильные, то и их конкатенированная последовательность \(A B\) также правильная.
Например, последовательности «(())()», «()», «(()(()))» и пустая последовательность являются правильными, в то время как «(()» и «(()))(» — нет. Дана правильная скобочная последовательность \(s\), пара индексов \((i,j)\) (\(i<j\)) называется хорошей, если \(s_i\) — это «(», а \(s_j\) — это «)», и две скобки добавляются одновременно в соответствии с правилом 2 при построении последовательности \(s\). Например, последовательность «(())()» имеет три разные хорошие пары: \((1,4)\), \((2,3)\) и \((5,6)\). Можно показать, что любая правильная скобочная последовательность из \(2n\) скобок содержит ровно \(n\) различных пар скобок, и использование любого порядка правил для построения одной и той же последовательности скобок приведет к одному и тому же набору пар скобок. Эмили будет играть в игру по угадыванию скобок с Джоном. Игра проходит следующим образом. Изначально у Джона есть правильная скобочная последовательность \(s\), содержащая \(n\) различных пар скобок, которая не известна Эмили. Джон говорит Эмили значение \(n\) и просит Эмили угадать последовательность. На протяжении \(n\) ходов Джон дает Эмили следующие подсказки на каждом ходе: - \(l\;r\): Последовательность \(s\) содержит пару скобок \((l,r)\).
Гарантируется, что подсказки, которые Джон дает Эмили, попарно различны и не противоречат друг другу. В какой-то момент Эмили может быть уверена, что правильная скобочная последовательность, удовлетворяющая подсказкам, данным до сих пор, уникальна. Например, предположим, что Эмили знает, что \(s\) имеет \(3\) хорошие пары, и она содержит пару скобок \((2,5)\). Из \(5\) правильных скобочных последовательностей с \(3\) хорошими парами существует только одна такая последовательность «((()))» с парой скобок \((2,5)\). Следовательно, можно увидеть, что Эмили не всегда нужно \(n\) ходов, чтобы угадать \(s\). Чтобы как можно раньше узнать содержимое \(s\), Эмили хочет знать количество различных правильных скобочных последовательностей, которые соответствуют подсказкам после каждого хода. Конечно, это не легкая задача для Эмили, особенно когда ей дано настолько много хороших пар. Теперь ваша очередь помочь Эмили. Учитывая подсказки, вы должны найти ответ до всех ходов и после каждого хода. Поскольку ответы могут быть огромными, вам нужно найти их по модулю \(998\,244\,353\). Выходные данные Для каждого набора выведите \(n+1\) целых числа в одной строке: - Первое целое число — это ответ до всех подсказок, по модулю \(998\,244\,353\).
- Для всех \(i \ge 1\), \(i+1\)-е целое число — это ответ после \(i\)-й подсказки, по модулю \(998\,244\,353\).
Примечание Первый пример из примера объясняется в описании задачи. Третий пример из примера объясняется следующим образом. Можно показать, что существует \(132\) сбалансированных последовательностей скобок с \(6\) парами скобок. Ответы после каждой подсказки следующие: - Вам дана хорошая пара \((2,3)\). Существует \(42\) правильных скобочных последовательностей, имеющих хорошую пару \((2,3)\).
- Вам дана хорошая пара \((1,6)\). Существует \(5\) правильных скобочных последовательностей, имеющих хорошие пары \((2,3)\), \((1,6)\).
- Вам дана хорошая пара \((7,8)\). Существуют \(2\) правильных скобочных последовательностей, имеющих три хорошие пары. Это строки «(()())()(())» и «(()())()()()», соответственно.
- Вам дана хорошая пара \((9,12)\). Существует только одна правильная скобочная последовательность, содержащая четыре хорошие пары. Таким образом, содержимое \(s\) имеет вид «(()())()(())».
Тогда количество правильных скобочных последовательностей после пятой и шестой подсказки равно \(1\), поскольку вы уже знаете содержимое \(s\).
| |
|
|
F2. Считать не весело (Сложная версия)
графы
Деревья
Комбинаторика
поиск в глубину и подобное
реализация
снм
Структуры данных
*2700
Это сложная версия задачи. Отличие между версиями заключается в том, что в этой версии ограничения на \(t\) и \(n\) больше. Вы можете делать взломы только в том случае, если решили все версии этой задачи. Теперь Маленький Джон богат, и поэтому он наконец-то покупает дом, достаточно большой, чтобы вместить его и его любимую скобочную последовательность. Но каким-то образом он оказался с большим количеством скобок! Разочарованный, он пробивает потолок с помощью «ладони Будды». Скобочная последовательность называется правильной, если она может быть построена по следующей формальной грамматике: - Пустая последовательность \(\varnothing\) сбалансирована.
- Если скобочная последовательность \(A\) правильная, то \(\mathtt{(}A\mathtt{)}\) также является правильной.
- Если скобочные последовательности \(A\) и \(B\) правильные, то и их конкатенированная последовательность \(A B\) также правильная.
Например, последовательности «(())()», «()», «(()(()))» и пустая последовательность являются правильными, в то время как «(()» и «(()))(» — нет. Дана правильная скобочная последовательность \(s\), пара индексов \((i,j)\) (\(i<j\)) называется хорошей, если \(s_i\) — это «(», а \(s_j\) — это «)», и две скобки добавляются одновременно в соответствии с правилом 2 при построении последовательности \(s\). Например, последовательность «(())()» имеет три разные хорошие пары: \((1,4)\), \((2,3)\) и \((5,6)\). Можно показать, что любая правильная скобочная последовательность из \(2n\) скобок содержит ровно \(n\) различных пар скобок, и использование любого порядка правил для построения одной и той же последовательности скобок приведет к одному и тому же набору пар скобок. Эмили будет играть в игру по угадыванию скобок с Джоном. Игра проходит следующим образом. Изначально у Джона есть правильная скобочная последовательность \(s\), содержащая \(n\) различных пар скобок, которая не известна Эмили. Джон говорит Эмили значение \(n\) и просит Эмили угадать последовательность. На протяжении \(n\) ходов Джон дает Эмили следующие подсказки на каждом ходе: - \(l\;r\): Последовательность \(s\) содержит пару скобок \((l,r)\).
Гарантируется, что подсказки, которые Джон дает Эмили, попарно различны и не противоречат друг другу. В какой-то момент Эмили может быть уверена, что правильная скобочная последовательность, удовлетворяющая подсказкам, данным до сих пор, уникальна. Например, предположим, что Эмили знает, что \(s\) имеет \(3\) хорошие пары, и она содержит пару скобок \((2,5)\). Из \(5\) правильных скобочных последовательностей с \(3\) хорошими парами существует только одна такая последовательность «((()))» с парой скобок \((2,5)\). Следовательно, можно увидеть, что Эмили не всегда нужно \(n\) ходов, чтобы угадать \(s\). Чтобы как можно раньше узнать содержимое \(s\), Эмили хочет знать количество различных правильных скобочных последовательностей, которые соответствуют подсказкам после каждого хода. Конечно, это не легкая задача для Эмили, особенно когда ей дано настолько много хороших пар. Теперь ваша очередь помочь Эмили. Учитывая подсказки, вы должны найти ответ до всех ходов и после каждого хода. Поскольку ответы могут быть огромными, вам нужно найти их по модулю \(998\,244\,353\). Выходные данные Для каждого набора выведите \(n+1\) целых числа в одной строке: - Первое целое число — это ответ до всех подсказок, по модулю \(998\,244\,353\).
- Для всех \(i \ge 1\), \(i+1\)-е целое число — это ответ после \(i\)-й подсказки, по модулю \(998\,244\,353\).
Примечание Первый пример из примера объясняется в описании задачи. Третий пример из примера объясняется следующим образом. Можно показать, что существует \(132\) сбалансированных последовательностей скобок с \(6\) парами скобок. Ответы после каждой подсказки следующие: - Вам дана хорошая пара \((2,3)\). Существует \(42\) правильных скобочных последовательностей, имеющих хорошую пару \((2,3)\).
- Вам дана хорошая пара \((1,6)\). Существует \(5\) правильных скобочных последовательностей, имеющих хорошие пары \((2,3)\), \((1,6)\).
- Вам дана хорошая пара \((7,8)\). Существуют \(2\) правильных скобочных последовательностей, имеющих три хорошие пары. Это строки «(()())()(())» и «(()())()()()», соответственно.
- Вам дана хорошая пара \((9,12)\). Существует только одна правильная скобочная последовательность, содержащая четыре хорошие пары. Таким образом, содержимое \(s\) имеет вид «(()())()(())».
Тогда количество правильных скобочных последовательностей после пятой и шестой подсказки равно \(1\), поскольку вы уже знаете содержимое \(s\).
| |
|
|
C. Тропинки и полянки
графы
жадные алгоритмы
Конструктив
снм
*2400
Вася пришел погулять в парк. В парке есть n полянок пронумерованных от 1 до n. Между полянками есть m тропинок. Тропинки пронумерованы от 1 до m, причем i-ая тропинка соединяет полянки номер xi и yi. Номера соединяемых полянок могут совпадать (xi = yi) — это значит, что тропинка ведет с какой-то полянки на нее же. Также между двумя полянками может быть несколько непересекающихся тропинок. Вася стоит на полянке номер 1, он хочет прогуляться по всем тропинкам парка ровно один раз, так чтобы в итоге вернуться на полянку номер 1. К сожалению, Вася не знает возможна такая прогулка или нет. Помогите Васе, определите возможна такая прогулка или нет. Если такая прогулка невозможна, найдите, какое минимальное количество тропинок придется дополнительно проложить в парке, чтобы описанная прогулка стала возможной. Переходить с тропинки на тропинку Вася может только на полянках. По тропинкам можно двигаться в обоих направлениях. Если Вася зашел на тропинку, соединяющую полянки a и b, со стороны полянки a, то он обязан выйти с этой тропинки со стороны полянки b. Выходные данные Выведите одно число — ответ на задачу. Если прогулка Васи возможна без строительства дополнительных тропинок выведите 0, иначе выведите минимальное количество тропинок, которые придется дополнительно проложить в парке, чтобы описанная прогулка стала возможной. Примечание В первом тестовом примере описанная прогулка возможна и без постройки дополнительных тропинок. Например, сначала можно пройти по первой тропинке, потом по второй и, наконец, по третьей. Во втором тестовом примере описанная прогулка невозможна без постройки дополнительных тропинок. Чтобы прогулка стала возможной, достаточно построить одну тропинку между полянками номер один и два.
| |
|
|
A. Катание на Коньках
графы
Перебор
поиск в глубину и подобное
снм
*1200
Байтек учится кататься на льду. Он новичок, и поэтому он передвигается следующим образом: сначала отталкивается от сугроба на север, восток, юг или запад — и катится до тех пор, пока не повстречает очередной сугроб. Байтек заметил, что таким образом он не сможет добраться от некоторых сугробов до некоторых других, какой бы ни была последовательность его движений. Теперь он хочет соорудить несколько дополнительных сугробов так, чтобы он мог добраться от любого сугроба до любого другого. Байтек попросил Вас найти наименьшее количество сугробов, которые ему потребуется соорудить. Мы предполагаем, что Байтек может сооружать сугробы только в точках с целочисленными координатами. Выходные данные Выведите наименьшее количество сугробов, которые надо соорудить Байтеку для того, чтобы он мог добраться от любого сугроба до любого другого.
| |
|
|
E. Инопланетная ДНК
Деревья
снм
Структуры данных
*2800
Профессор Байтоцы проводит опыты над инопланетными ДНК. Он обнаружил, что эта ДНК подвержена повторяющимся мутациям — каждая мутация проходит одинаково: некоторая непрерывная подпоследовательность инопланетной ДНК активируется, копируется, после чего копия подпоследовательности искажается и вставляется сразу после неискаженной подпоследовательности в ДНК. Искаженная копия активированной непрерывной подпоследовательности образуется следующим образом: сначала соединяются все элементы подпоследовательности на четных позициях, далее к ним присоединяются все элементы подпоследовательности на нечетных позициях. Таким образом, если активированная подпоследовательность состоит из 11 элементов и имеет вид s1s2... s11, то ее искаженная копия выглядит как s2s4s6s8s10s1s3s5s7s9s11. Например, если исходная последовательность была «ACTGG», а мутация произошла на отрезке [2, 4] (то есть активирована подпоследовательность «CTG»), то мутировавшая ДНК выглядит так: «ACTGTCGG». Искаженная копия активированной подпоследовательности выделена жирным шрифтом. Профессор Байтоцы записал исходную последовательность ДНК и затронувшую ее последовательность мутаций. Теперь он просит Вас восстановить первые k элементов последовательности ДНК после всех мутаций. Выходные данные Выведите единственную строку, которая содержит первые k букв из мутировавшей последовательности ДНК. Примечание Во втором примере после первой мутации последовательность превратилась в «ACCAGTACGT». После второй — в «ACCAGTACCGACATCGT».
| |
|
|
E. Как два пальца об асфальт
2-sat
графы
поиск в глубину и подобное
снм
*1900
В Берляндии n городов, некоторые из которых соединены двунаправленными дорогами. Про каждую дорогу известно, заасфальтирована она, или нет. Король Берляндии Валера II хочет заасфальтировать все дороги Берляндии, для этого он собрал бригаду рабочих. Каждый день Валера выбирает ровно один из городов и отдает приказ бригаде асфальтировать все дороги, исходящие из этого города. Доблестная бригада за день выполняет приказ короля, после чего работяги отправляются по домам. К сожалению, не все так гладко, как хотелось бы Валере II. Основная часть бригады — гастарбайтеры. Поэтому, получив приказ заасфальтировать все дороги, исходящие из некоторого города, бригада асфальтировала все не асфальтированные дороги, исходящие из этого города, и, наоборот, снимала асфальт с тех дорог, где он был. Узнав о таком ходе работ, Валера II был сильно расстроен, но так как менять что-либо было поздно, он попросил вас составить программу, которая бы определяла, можно ли хоть каким-то образом не более чем за n дней заасфальтировать все дороги Берляндии. Помогите королю. Выходные данные В первой строке выведите единственное целое число x (0 ≤ x ≤ n) — количество дней, требуемое для ремонта всех дорог. Во второй строке через пробел выведите x целых чисел номера городов, в которые нужно посылать бригады, в том порядке, в котором Валера посылает их ремонтировать дороги. В случае, если решений несколько выведите любое. Если заасфальтировать все дороги никак не получится, выведите «Impossible» (без кавычек).
| |
|
|
D. Дороги не только в Берляндии
графы
Деревья
снм
*1900
Правительство Берляндии решило улучшать отношения с соседними странами. В первую очередь было решено построить новые дороги так чтобы из всех городов Берляндии и соседних стран можно было добраться до всех остальных. Всего в Берляндии и соседних странах n городов и ровно n - 1 двусторонних дорог. Из-за недавнего финансового кризиса правительство Берляндии сильно стеснено в средствах, поэтому чтобы построить новую дорогу оно вынуждено закрывать какую-то из существующих. Каждый день можно закрыть одну существующую дорогу и сразу же построить новую. Ваша задача — определить, сколько дней потребуется для перестройки дороги так, чтобы из любого города можно было добраться до любого другого, а так же составить план закрытия старых и постройки новых дорог. Выходные данные Выведите ответ на задачу, число t — какое наименьшее число дней потребуется, чтобы перестроить дороги так чтобы из любого города можно было добраться до любого другого. Далее выведите t строк — план закрытия старых и постройки новых дорог. Каждая строка должна описывать действия в очередной день в формате i j u v — означает, что нужно закрыть дорогу между городами i и j и построить дорогу между городами u и v. Города нумеруются начиная с 1. Если решений несколько, выведите любое.
| |
|
|
D. Черно-белое дерево
графы
Деревья
жадные алгоритмы
Конструктив
снм
*2100
На доске нарисован граф-дерево из n вершин. Напомним, что неориентированный граф называется деревом, если он связен и не содержит циклов. Каждая вершина графа покрашена в черный или белый цвет таким образом, что не существует двух вершин одного цвета, соединенных ребром. На каждом ребре записана его стоимость — неотрицательное целое число. Плохой мальчик Вася подошел к доске и написал около каждой вершины v число sv — сумму стоимостей всех инцидентных этой вершине ребер, после чего он стер ребра и их стоимости с доски. Ваша задача — восстановить исходное дерево по цветам вершин и числам sv. Выходные данные Выведите описание n - 1 ребер графа-дерева. Каждое описание — это тройка чисел vi, ui, wi (1 ≤ vi, ui ≤ n, vi ≠ ui, 0 ≤ wi ≤ 109), где vi и ui — номера вершин, которые соединяет i-ое ребро, а wi — его стоимость. Обратите внимание, что должно выполняться условие cvi ≠ cui. Гарантируется, что для любых входных данных существует по крайней мере один соответствующий этим данным граф. Если существует несколько решений, то выведите любое. Ребра разрешается выводить в любом порядке. Числа при выводе разделяйте пробелами.
| |
|
|
D. Кольцевая 2
2-sat
графы
поиск в глубину и подобное
снм
*2200
Всем известно, что в Берляндии есть n городов, образующих Серебряное кольцо — пары городов с номерами i и i + 1 (1 ≤ i < n), а так же n и 1 соединены дорогами. Правительство Берляндии решило построить m новых дорог. Уже подготовлен план постройки — список пар городов, которые нужно соединить дорогами. Каждая дорога будет представлять собой непрерывную линию, находящуюся внутри, либо снаружи кольца. Дороги не будут иметь общих точек с кольцом (кроме двух ее концов). Теперь разработчикам плана интересно, можно ли построить дороги так, чтобы они не пересекались (заметим, что дороги могут пересекаться своими концами). Если это возможно сделать, то какие дороги должны находиться внутри кольца, а какие снаружи? Выходные данные Если невозможно построить дороги так, чтобы они пересекались только в концах, выведите Impossible. Иначе выведите m символов. i-ый символ должен быть i, если дорогу нужно проводить внутри кольца, или o — если дорогу нужно проводить снаружи кольца. Если решений несколько, выведите любое.
| |
|
|
A. Изучение языков
поиск в глубину и подобное
снм
*1400
В компании «BerCorp» работает n сотрудников. Для официальной переписки утверждено m языков, пронумерованных целыми числами от 1 до m. Для каждого сотрудника известно, какие языки он знает. Возможно даже, что человек не знает ни одного официального языка. Но работники готовы выучить любое количество языков, если только компания оплатит им обучение. Стоимость курса изучения одного языка для одного сотрудника составляет 1 бердоллар. Определите, какую минимальную сумму денег придется затратить компании, чтобы любой сотрудник мог обратиться к любому другому, возможно, не напрямую (то есть, привлекая других сотрудников для перевода). Выходные данные Выведите единственное целое число — наименьшее количество денег, которое придется заплатить, чтобы каждый мог написать письмо каждому (возможно, привлекая других для перевода). Примечание Во втором примере сотрудник с номером 1 может выучить язык с номером 2, а сотрудник с номером 8 — язык с номером 4. В третьем примере сотруднику с номером 2 нужно выучить язык с номером 2.
| |
|
|
B. pSort
графы
поиск в глубину и подобное
снм
*1600
Однажды n ячеек одного массива решили поиграть в некоторую игру. Сначала каждая ячейка записала в себя свой порядковый номер (считая с 1), а затем каждая ячейка назвала свое любимое число. На своем ходе i-ая ячейка могла поменять местами свое содержимое и содержимое j-ой ячейки, если |i - j| = di, где di — любимое число i-ой ячейки. «Игроки» ходят в любом порядке, в каком захотят. Количество ходов не ограничено. Вам дана перестановка чисел от 1 до n и любимые числа ячеек. Ваша задача ответить: может ли игра зайти в такое положение. Выходные данные Если игра могла зайти в заданное положение выведите YES, иначе выведите NO.
| |
|
|
D. Компоненты связности
дп
поиск в глубину и подобное
снм
Структуры данных
*1900
В уже известной нам некоторой большой корпорации, в которой работает системный администратор Поликарп, компьютерная сеть состоит n компьютеров и m кабелей, которые соединяют некоторые пары компьютеров. Другими словами, компьютерная сеть может быть представлена некоторым неориентированным графом из n вершин и m ребер. Пронумеруем компьютеры целыми числами от 1 до n, пронумеруем кабели целыми числами от 1 до m. Поликарпу поручили ответственное задание — проверить надежность компьютерной сети его корпорации. Для этого Поликарп решил провести серию из k экспериментов с компьютерной сетью, где i-ый эксперимент заключается в следующем: - Временно отсоединить кабели с номерами от li до ri, включительно (остальные кабели остаются подсоединенными).
- Посчитать количество компонент связности в графе, который определяет компьютерную сеть в настоящий момент.
- Подсоединить отключенные кабели с номерами от li до ri (то есть восстановить исходную сеть).
Помогите Поликарпу провести все эксперименты и для каждого из них выведите количество компонент связности в графе, который определяет компьютерную сеть во время данного эксперимента. Изолированную вершину нужно считать отдельной компонентой. Выходные данные Выведите k чисел, в которых i-ое число обозначает количество компонент связности графа, который определяет компьютерную сеть во время i-го эксперимента.
| |
|
|
E. Илья и два числа
жадные алгоритмы
Конструктив
снм
Структуры данных
*2300
Илья в последнее время начал увлекаться археологией. Недавно он нашел два числа, записанных в системе счисления по основанию m. Каждое из найденных чисел состояло ровно из n цифр. Илья сразу начал искать информацию об этих числах, он узнал, что числа — это часть шифра, а тот, кто разгадает шифр, обретет невиданное сокровище. После длительных исследований Илья понял: чтобы разгадать шифр, нужно сделать следующее: - Переставить цифры в первом числе некоторым образом, аналогично, переставить цифры во втором числе некоторым образом. В результате этой операции у чисел могут появиться лидирующие нули.
- Поцифренно сложить числа по модулю m. Другими словами, нужно получить третье число, длины n, каждая цифра которого, есть сумма соответствующих цифр найденных чисел. Например, пусть есть два числа, записанных в троичной системе счисления, 001210 и 012111, тогда, если их сложить поцифренно по модулю 3, получится число 010021.
- Ключ к шифру — это максимально возможное число, которое можно получить на предыдущем шаге.
Помогите Илье, найдите ключ к шифру. Выходные данные Выведите n цифр в системе счисления по основанию m — полученное третье число. Цифры выводите в порядке от старших разрядов к младшим.
| |
|
|
D. Царство и государство
снм
*2900
Красная Шапочка и Иван Дурак внезапно обнаружили себя за тридевять земель, в мире, который представлен огромным цилиндром. На одном из оснований цилиндра (назовем его «верх цилиндра») вся поверхность занята некоторым царством, на другом основании (назовем его «низ цилиндра») вся поверхность занята некоторым государством, а боковая поверхность цилиндра целиком покрыта морем. В один прекрасный день царь некоторого царства и государь некоторого государства решили, что не дело это морю пропадать зря, когда его можно превратить в землю и тем самым расширить границы своих владений. Для того, чтобы писари могли вести учет происходящего, море представили в виде сетки, состоящей из r строк и c столбцов — каждая ячейка этой сетки представляет некоторую прямоугольную область на стороне цилиндра. Строки занумерованы от 1 до r сверху вниз, а столбцы — от 1 до c слева направо. Две ячейки считаются смежными, если у них есть общая сторона. Кроме того, если две ячейки расположены в одной строке — одна в самом левом столбце, а другая — в самом правом, то они тоже смежны. Изначально все ячейки покрыты морем. Теперь царь и государь планируют превратить часть из них в землю одна за одной согласно некоторому порядку, который Вам предоставлен. Единственной проблемой на пути выполнения их плана является то, что по морю пролегает важный торговый маршрут. Поэтому в процессе превращения моря в землю Вы хотите, чтобы в каждый момент времени существовала последовательность ячеек, удовлетворяющих следующим свойствам (такую последовательность ячеек назовем торговым маршрутом): - Все ячейки в последовательности являются морем (еще не превращены в землю).
- Первая ячейка в последовательности находится в первой строке (самой верхней).
- Последняя ячейка в последовательности находится в последней строке (самой нижней).
- Любые две последовательные ячейки в последовательности смежны друг с другом.
Красной Шапочке и Ивану Дураку поручили переработать план так, чтобы в любой момент времени существовал хотя бы один торговый маршрут. План Ивана и Панамки очень прост — каждый раз, когда ячейка должна быть превращена из моря в землю, они проверяют, не получится ли так, что после превращения не останется ни одного торгового маршрута. Если хотя бы один маршрут остается, они превращают море в землю на этой ячейке, и переходят к следующей ячейке. Если ни одного маршрута не остается, они не превращают эту ячейку в землю, и переходят к следующей ячейке. Ваша задача симулировать этот процесс, и определить, сколько же ячеек в конечном итоге будет превращено из моря в землю. Выходные данные В единственной строке выведите целое число — сколько ячеек из плана Красная Шапочка и Иван Дурак смогут перекрасить, следуя их плану. Примечание Ниже представлены превращения, которые были выполнены (красной линией показан возможный торговый маршрут, желтым цветом или красным цветом помечается текущая рассматриваемая ячейка, в зависимости от того существует торговый маршрут или нет): 





После этого превращения не остается ни одного маршрута, поэтому превращение не осуществлено. 

Маршрута нет, превращение не осуществлено. 
Не забывайте, что самая левая и самая правая ячейки одной строки смежны. 
Маршрута нет, превращение не осуществлено. Соответственно, результат: 
В землю превращено шесть ячеек.
| |
|
|
E. Тропинки и полянки
графы
жадные алгоритмы
Комбинаторика
поиск в глубину и подобное
снм
*2800
Красная Шапочка и Иван Дурак гуляют по лесу. Гуляя по лесу, они обнаружили, что в лесу есть тропинки и полянки. Всего в лесу n полянок, которым Иван Дурак назначил номера от 0 до n - 1. Иван Дурак заметил, что для каждой полянки i, из нее есть ровно две тропинки: одна ведет в полянку номер (2·i) mod n, вторая — в полянку ((2·i) + 1) mod n. Красная Шапочка, в свою очередь, заметила, что все тропинки однонаправленные (Красная Шапочка не может объяснить природу этого явления). Теперь, стоя в полянке с номером 0, Красная Шапочка задалась вопросом — если она начнет гулять по тропинкам, может ли она обойти все полянки ровно по одному разу и в конце вернуться на полянку с номером 0 опять (тем самым посетив ее дважды)? Запись x mod y обозначает операцию взятия остатка от деления числа x на число y. Выходные данные Выведите порядок, в котором следует обойти полянки. Каждая полянка должна быть выведена ровно один раз, кроме полянки 0, которая должна быть выведена ровно дважды: первой и последней в списке. Если решения не существует, выведите -1. Если решений несколько, выведите любое из них.
| |
|
|
A. Рыцарский турнир
снм
Структуры данных
*1500
Ура! Король Берлядии Берл II устраивает рыцарский турнир. Король уже разослал послание всем рыцарям королевства, а они, в свою очередь, дали согласие на участие в этом грандиозном событии. Что же касается вас, то вы — простой крестьянин. Не удивительно, что рыцарский турнир вы проспали (ведь он проводился в выходной), и теперь вам очень хочется узнать его результаты. В этот раз рыцарский турнир в Берляндии проходил следующим образом: - В турнире принимали участие n рыцарей. Каждому рыцарю был присвоен уникальный номер — целое число от 1 до n.
- Турнир проводился в m сражений, в i-ом сражении все еще не выбывшие рыцари с номерами не меньше li и не больше ri боролись за право продолжить участие в турнире.
- После i-го сражения среди всех рыцарей, которые боролись, победил только один — рыцарь с номером xi, он продолжил участие в турнире. Остальные рыцари выбыли из турнира.
- Победитель самого последнего (m-го) сражения (рыцарь с номером xm) был объявлен победителем всего турнира.
Вы узнали у своих друзей информацию про все сражения, и теперь для каждого рыцаря вам интересно знать, каким рыцарем он был побежден. Считается, что рыцарь с номером a победил рыцаря с номером b, если было такое сражение, в котором боролись оба этих рыцаря, а победителем из этого сражения вышел рыцарь с номером a. Напишите программу, вычисляющую для каждого рыцаря, каким рыцарем он был побежден. Выходные данные Выведите n целых чисел. Если i-ый рыцарь был побежден, то i-ое число должно быть равно номеру рыцаря, который победил рыцаря с номером i. Если i-ый рыцарь является победителем турнира, то i-ое число должно быть равно 0. Примечание Рассмотрим первый тестовый пример. В первом сражении бились рыцари 1 и 2, победил рыцарь 1. Во втором сражении бились рыцари 1 и 3, победил рыцарь 3. В последнем сражении бились рыцари 3 и 4, победил рыцарь 4.
| |
|
|
E. Дима и пинки
графы
Перебор
реализация
снм
*2300
Дима хороший. Очень. Но всему хорошему приходит конец... Сережа собирается надавать Диме пинков. Для этого Сережа разделил комнату на единичные квадраты. Теперь комната представляет собой прямоугольник, состоящий из единичных квадратов, размера n × m. Первоначально Сережа поставил Диму в центр некоторого единичного квадрата. Затем он начал давать Диме пинков (известно, что он дал Диме как минимум один пинок). Каждый раз, когда Дима получает пинок, он подлетает и перемешается в одном из четырех направлений (вверх, вниз, влево, вправо) на k (k > 1) единиц длины. Сережа очень добрый, поэтому он пинает Диму так, что тот никогда не ударяется о стены (то есть не вылетает за пределы прямоугольной комнаты). Еще Сережа очень оригинальный, поэтому он пинает Диму так, что тот никогда не пролетает над одним и тем же отрезком, который соединяет центры двух соседних по стороне квадратов, дважды. Сережа долго пинал Диму. Но Дима не злопамятный — Дима записывает. Поэтому Дима пометил все квадраты, в которых он находился и над центрами которых он пролетал. Дима совершенно не помнит, с какой силой его пинал Сережа. Он хочет восстановить по своим записям все возможные варианты. Помогите ему, найдите все такие значения k, что Сережа мог пинать Диму так, что тот перемещался по комнате на k единиц от одного пинка. Выходные данные В единственной строке выведите в возрастающем порядке все k (k > 1), при которых могли получиться такие записи Димы. Если таких k не существует и Дима выдумал всю эту историю с пинками, выведите -1.
| |
|
|
E. Два пути
графы
Конструктив
реализация
снм
*2600
Как-то раз археологи нашли m таинственных бумажек, на каждой из которых была написана пара целых чисел. Известно, что в древние времена очень любили записывать номера дорог, по которым ходили, в виде «a b» или «b a», где a, b — номера двух различных городов, между которыми шла дорога. Также известно, что таинственные бумаги — это листы из двух путевых дневников (для каждого нового путешествия раньше всегда заводили новый дневник). В течение одного путешествия странник мог проходить по одной и той же дороге несколько раз в одном или разных направлениях, но в этом случае он ровно столько же раз делал запись об этой дороге в своем дневнике. Кроме того, археологи предполагают, что направление движения путника по дороге никак не влияло на запись в дневнике: запись «a b» могла относиться как к дороге из a в b, так и к дороге из b в a. Археологи очень хотят расположить страницы в правильной последовательности и восстановить два маршрута путешествия, но, увы, они не сильны в программировании, так что настал ваш час. Помогите им! Выходные данные В первой строке выведите число L1 — длину первого пути, т.е. количество бумаг в его описании. В следующей строке через пробел выведите L1 чисел — номера бумаг, описывающих первый из путей. В третьей и четвертой строках аналогичным образом выведите длину второго пути L2 и сам путь. Оба пути должны содержать по крайней мере по одной дороге, т.е. должно выполняться L1 > 0 и L2 > 0. Бумаги нумеруются числами от 1 до m в соответствии с порядком их задания во входном файле. Номера следует выводить в том порядке, в каком путешественник проходил соответствующие дороги. Если решений несколько, выведите любое из них. Если построить два таких пути невозможно, выведите «-1». Не забудьте, что использовать нужно все записи ровно по одному разу, т.е. L1 + L2 = m.
| |
|
|
D. Дураки и дороги
графы
жадные алгоритмы
поиск в глубину и подобное
снм
Структуры данных
*2100
На уроках географии в школе Вам наверняка рассказывали о Стране Дураков. В частности, Вы должны знать, что внутреннее устройство Страны Дураков не менялось на протяжении многих столетий. Страна состоит из n городов, некоторые пары которых соединены двусторонними дорогами, причем каждая из дорог характеризуется величиной li — своей длиной. Так и жили бы дураки, но недавно в результате государственного переворота в стране поменялся король — им стал медведь Василий. Василий разделил города страны на области таким образом, что между любыми двумя городами из одной области существует путь по дорогам страны, а между двумя городами из разных областей такого пути нет. После этого Василий решил провести дорожную реформу: построить в стране ровно p новых дорог. Строительство одной дороги происходит следующим образом: - Выбирается пара различных городов u, v, которые будет соединять новая дорога (при этом возможно, что между этими городами уже существует дорога).
- Определяется длина новой дороги: если города u, v относятся к различным областям, то длина вычисляется как min(109, S + 1) (S — суммарная длина всех дорог, существующих в соединяемых областях), иначе длина полагается равной 1000.
- Между выбранными городами строится дорога указанной длины. Если новая дорога соединяла различные области, то после ее строительства эти две области будут объединены в одну.
Василий хочет, чтобы после проведения дорожной реформы страна состояла ровно из q областей. Ваша задача — разработать для медведя Василия такой план строительства дорог, удовлетворяющий этому требованию, чтобы суммарная длина построенных дорог была минимально возможной. Выходные данные Если невозможно требуемым образом построить дороги, выведите единственную строку «NO» (без кавычек). В противном случае выведите в первую строку слово «YES» (без кавычек), а в следующих p строках приведите план строительства дорог. Каждая строка плана должна состоять из двух различных целых чисел, задающих номера городов, которые соединяет очередная дорога. Дороги в плане должны следовать в том порядке, в котором их нужно строить. Если существует несколько оптимальных решений, можно вывести любое. Примечание Рассмотрим первый пример. До начала реформы Страна Дураков состоит из четырех областей. Первая область включает в себя города 1, 2, 3, вторая — города 4 и 6, третья — города 5, 7, 8, четвертая — город 9. Суммарная длина дорог, существующих в этих областях, составляет 11, 20, 5 и 0 соответственно. Согласно плану, первой строится дорога длины 6 между городами 5 и 9, а второй — дорога длины 23 между городами 1 и 9. Таким образом, суммарная длина построенных дорог составляет 29.
| |
|
|
D. Дима и граф-ловушка
Бинарный поиск
кратчайшие пути
поиск в глубину и подобное
снм
Структуры данных
*2000
Дима и Инна обожают проводить время вместе. Только Сережа почему-то не обожает уходить из собственной комнаты. Но Дима и Инна так любят друг друга, что решили пойти на криминал... Дима сконструировал граф-ловушку и под предлогом: «Сереж, смотри какой у меня граф классный!», — толкнул соседа в первую вершину. Граф-ловушка — это неориентированный граф, состоящий из n вершин и m ребер. Ребру с номером k Дима сопоставил диапазон целых чисел от lk до rk (lk ≤ rk). Чтобы выйти из графа ловушки, Сережа первоначально (перед началом пути) должен выбрать некоторое целое число (обозначим его x), после этого Сережа должен пройти путь от стартовой вершины с номером 1 до конечной вершины с номером n. При этом Сережа может пройти по ребру k только в том случае, если lk ≤ x ≤ rk. Сережа — математик. Он определил лояльность какого-то пути из 1-ой вершины в n-ую, как количество целых чисел x, выбрав которые первоначально, можно пройти этот путь. Помогите Сереже найти путь, обладающий максимальной лояльностью, и поскорее вернуться в комнату! Выходные данные В единственной строке выходных данных выведите целое положительное число — максимальную лояльность, среди всех путей из первой вершины в n-ую. Если таких путей не существует, или максимальная лояльность равна 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. Сосуды
Деревья
реализация
снм
Структуры данных
*1800
Есть система из n сосудов, расположенных один над другим так, как показано на рисунке ниже. Представим, что сосуды пронумерованы числами от 1 до n в порядке от самого верхнего к самому нижнему, объем i-го сосуда равен ai литров. Изначально все сосуды пустые. В некоторые сосуды наливают воду, при этом вся вода, не поместившаяся в i-й сосуд, переливается в (i + 1)-й. Жидкость, не поместившаяся в n-й сосуд, выливается на пол. Ваша задача состоит в том, чтобы промоделировать наливание воды в сосуды. Для этого вам потребуется обрабатывать два типа запросов: - Долить в pi-й сосуд xi литров воды;
- Вывести, сколько воды находится в ki-м сосуде.
При ответе на второй запрос можно считать, что вся вода, налитая до этого момента, уже успела перелиться между сосудами. Выходные данные На каждый запрос второго типа в отдельной строке выведите количество воды в соответствующем сосуде.
| |
|
|
E. Инна и пупсики
Бинарный поиск
геометрия
реализация
снм
Структуры данных
*2600
Инна, Дима и Сережа собрались в комнате. На улице холодно, поэтому Сережа предложил ребятам поиграть в настольную игру «Пупсики». Поле для игры в «Пупсики» представляет собой безграничную плоскость, на которой находятся n синих пупсиков и m красных. Каждый пупсик — это отрезок, который растет во времени. В момент времени t синий пупсик (x, y) представляет собой синий отрезок с концами в точках (x - t, y + t), (x + t, y - t). Аналогично, в момент времени t красный пупсик (x, y) представляет собой красный отрезок с концами в точках (x + t, y + t), (x - t, y - t) плоскости. Первоначально, в момент времени t = 0, все пупсики — это точки на плоскости. Цель игры — найти первый целочисленный момент времени, в который на плоскости будет существовать прямоугольник ненулевой площади, стороны которого целиком покрываются некоторыми пупсикам (сторона может быть покрыта несколькими пупсиками). Более формально, для любой точки границы прямоугольника должен существовать пупсик, которому эта точка принадлежит. При этом нужно считать, что пупсики являются замкнутыми отрезками, то есть содержат свои конечные точки. Вам заданы позиции все пупсиков — помогите ребятам найти требуемый момент времени. Выходные данные В единственной строке выведите целое число — ответ на задачу. Если прямоугольник никогда не появится на плоскости, выведите «Poor Sereja!» без кавычек.
| |
|
|
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».
| |
|
|
H. A + B наносит ответный удар
*особая задача
Конструктив
Перебор
реализация
снм
*1500
Задача A + B часто используется как пример простейшей задачи для демонстрации платформы спортивного программирования. Тем не менее, некоторые ученые отмечают, что иногда эту задачу не так-то просто сдать. Хотите попробовать? Выходные данные Выведите сумму заданных чисел.
| |
|
|
D. Электронная таблица Нанами
реализация
снм
*2000
Нанами — эксперт в видеоиграх. Сегодня хороший друг Нанами, Хаджиме, пригласил ее посмотреть бейсбольный матч. Скрепя сердце девушка пошла с ним на стадион. Матч был не интересен Нанами, и она смотрела по сторонам в поисках чего-нибудь интересного. Внезапно она заметила цифровую таблицу в одном из концов стадиона. Цифровая таблица имеет размер n пикселей в высоту и m пикселей в ширину, каждый пиксель таблицы либо светится, либо — нет. Пиксели описываются их координатами. Будем обозначать j-й пиксель в i-й строке таблицы записью (i, j). Во время матча электронная таблица отображает сообщения путем подсвечивания некоторой комбинации пикселей. Нанами заметила, что состояние пикселей на доске время от времени меняется. В определенное время определенные пиксели на доске могут переключаться со светящегося на не светящийся и наоборот. Нанами интересно, какова площадь наибольшего светящегося подпрямоугольника таблицы, такого, что на его стороне есть определенный пиксель. Пиксель (i, j) принадлежит стороне подпрямоугольника, левый верхний и правый нижний углы которого находятся в (x1, y1) и (x2, y2), тогда и только тогда, когда выполняется следующее логическое условие: ((i = x1 или i = x2) и (y1 ≤ j ≤ y2)) или ((j = y1 или j = y2) и (x1 ≤ i ≤ x2)).Нанами записала, как менялась доска во время матча, также у нее есть несколько вопросов описанного выше типа, можете ли вы ответить на все ее вопросы? Выходные данные Для каждого вопроса выведите единственную строку, содержащую целое число — ответ на вопрос Нанами. Примечание Рассмотрим первый пример. В первом вопросе подпрямоугольник должен содержать пиксель (2, 2) на стороне, но этот пиксель не светится, поэтому подходящих светящихся прямоугольников нет, и ответ равняется 0. В втором вопросе подпрямоугольник должен содержать пиксель (1, 2) на стороне. Самый большой такой подпрямоугольник — это подпрямоугольник с левым верхним углом в (1, 2) и правым нижним углом в (1, 3). В последнем вопросе подпрямоугольник должен содержать пиксель (2, 2) на стороне, который засветился после третьего события. Самый большой светящийся подпрямоугольник — это подпрямоугольник с верхним левым углом в (1, 2) и правым нижним углом в (3, 3).
| |
|
|
C. Dungeons and Candies
графы
Деревья
жадные алгоритмы
снм
*1800
Во время запуска игры «Dungeons and Candies» требуется получить по сети от сервера описания k уровней игры. Каждое описание — карта клетчатого прямоугольного поля n × m, в клетках которого расположены конфеты (в каждой клетке находится не более одной конфеты). Пустая клетка обозначается символом «.», если же в клетке находится конфета, то она кодируется буквой латинского алфавита. Уровень может содержать одинаковые конфеты, в таком случае буквы в соответствующих клетках карты будут одинаковы. При передачи по сети требуется минимизировать трафик — суммарный размер переданных данных. Уровни можно передавать в любом порядке. Существует два способа передать очередной уровень A: - Можно передать уровень A целиком. Этот способ требует передачи n·m байтов по сети.
- Можно передать разницу между уровнем A и каким-то ранее переданным уровнем B, если такой существует; эта операция требует передачи dA, B·w байтов, где dA, B обозначает количество клеток поля, которые отличаются в A и B, а w — константа. Обратите внимание, что при вычислении dA, B сравниваются соответствующие друг другу клетки уровней A и B. При этом карты уровней нельзя преобразовывать, например, поворачивать или смещать относительно друг друга.
Ваша задача — найти способ передать все k уровней, минимизировав трафик. Выходные данные В первой строке выведите искомое минимальное количество переданных байтов. Далее выведите k пар целых чисел x1, y1, x2, y2, ..., xk, yk, описывающих способ передачи уровней. Пара xi, yi обозначает, что уровень xi нужно передавать способом yi. Если yi равно 0, значит, уровень нужно передавать первым способом, иначе yi должно быть равно номеру ранее переданного уровня, разницу по сравнению с которым нужно передать, т. е. вы передадите уровень xi, передавая разницу между уровнями xi и yi. Пары выводите в порядке передачи уровней. Уровни пронумерованы от 1 до k в порядке их описания во входных данных. Если существует несколько оптимальных решений, разрешается вывести любое.
| |
|
|
D. Ребенок и зоопарк
снм
сортировки
*1900
Конечно, наш ребенок любит гулять по зоопарку. В зоопарке n вольеров, пронумерованных от 1 до n. В i-м вольере содержится ai животных. Также в зоопарке имеется m дорог, каждая дорога соединяет два различных вольера. Естественно, зоопарк связный, так что до любого вольера можно дойти по дорожкам от любого другого вольера. Наш ребенок очень умный. Предположим, что ребенок хочет пройти из вольера p в вольер q. Сначала он рассматривает все простые пути от p до q. Для каждого пути ребенок выписывает число, равное минимальному количеству животных в вольерах на этом пути. Обозначим наибольшее записанное число как f(p, q). Наконец, ребенок выбирает один из путей, для которого выписанное значение равно f(p, q). Ребенок уже посетил зоопарк, и теперь он размышляет: чему равно среднее значение f(p, q) для всех пар p, q (p ≠ q)? Можете ли вы ответить на его вопрос? Выходные данные Выведите вещественное число — значение . Ответ будет считаться правильным, если его относительная или абсолютная погрешность не превышает 10 - 4. Примечание Рассмотрим первый пример. Существует 12 возможных пар вольеров: - p = 1, q = 3, f(p, q) = 10.
- p = 2, q = 3, f(p, q) = 20.
- p = 4, q = 3, f(p, q) = 30.
- p = 1, q = 2, f(p, q) = 10.
- p = 2, q = 4, f(p, q) = 20.
- p = 4, q = 1, f(p, q) = 10.
Еще 6 случаев симметричны приведенному выше. Среднее значение равно . Рассмотрим второй пример. Существует 6 возможных пар вольеров: - p = 1, q = 2, f(p, q) = 10.
- p = 2, q = 3, f(p, q) = 20.
- p = 1, q = 3, f(p, q) = 10.
Еще 3 случая симметричны приведенному выше. Среднее значение равно .
| |
|
|
D. Валера и обмены
графы
Конструктив
математика
реализация
снм
строковые суфф. структуры
*2100
Перестановкой p длины n называется последовательность различных целых чисел p1, p2, ..., pn (1 ≤ pi ≤ n). Перестановка называется тождественной, если для всех i выполняется равенство pi = i. Обмен (i, j) — это операция, в результате которой элементы pi и pj меняются местами в перестановке. Пусть f(p) — это минимальное число обменов, которое нужно совершить, чтобы перестановка p стала тождественной. Валера очень хочет узнать, как за минимальное число обменов из перестановки p получить перестановку q, такую, что f(q) = m. Помогите ему в этом. Выходные данные В первой строке выведите целое число k — минимальное число обменов. Во второй строке выведите 2k целых чисел x1, x2, ..., x2k — описание последовательности обменов. Выведенные числа обозначают, что необходимо последовательно произвести обмены (x1, x2), (x3, x4), ..., (x2k - 1, x2k). Если существует несколько последовательностей обменов минимальной длины, выведите лексикографически минимальную. Примечание Последовательность x1, x2, ..., xs лексикографически меньше последовательности y1, y2, ..., ys, если существует такое целое число r (1 ≤ r ≤ s), что x1 = y1, x2 = y2, ..., xr - 1 = yr - 1 и xr < yr.
| |
|
|
E. DZY любит садоводство
Бинарный поиск
Деревья
снм
*2700
DZY любит садоводство, поэтому он обожает решать задачи про деревья. У DZY есть взвешенное дерево (связный неориентированный граф без циклов), состоящее из n вершин (пронумерованных от 1 до n). Определим функцию g(x, y) (1 ≤ x, y ≤ n) как длину самого длинного ребра в кратчайшем пути между вершинами x и y. В частности, g(z, z) = 0 для любого z. Для каждой целочисленной последовательности p1, p2, ..., pn (1 ≤ pi ≤ n), определим f(p) как . DZY хочет найти такую последовательность p, что f(p) принимает максимальное возможное значение. Есть еще одно ограничение: элемент j может встречаться в p не более xj раз. Пожалуйста, помогите DZY, найдите максимальное возможное f(p) при описанных ограничениях. Выходные данные Выведите единственное целое число — ответ на задачу. Примечание В первом примере одна из оптимальных последовательностей p равна [4, 3, 2, 1].
| |
|
|
B. DZY любит химию
жадные алгоритмы
поиск в глубину и подобное
снм
*1400
DZY любит химию, он обожает смешивать химикаты. У DZY есть n химических веществ, m пар из них реагируют друг с другом. Он хочет вылить все эти вещества в пробирку одно за другим в некотором порядке. Определим величину опасности вещества в пробирке. Опасность пустой пробирки равна 1. Каждый раз, когда DZY подливает в пробирку вещество, которое реагирует хотя бы с одним веществом, уже находящимся в данный момент в пробирке, опасность вещества пробирки умножается на 2. В противном случае опасность не изменяется. Какую максимально возможную опасность вещества можно получить в итоге, после выливания в пробирку всех n веществ в оптимальном порядке? Выходные данные Выведите единственное целое число — максимальную возможную опасность. Примечание В первом примере существует один способ смешать вещества, опасность при нем не возрастет. Во втором примере порядок не имеет значения. В обоих случаях опасность будет равняться 2. В третьем примере есть четыре способа достичь максимально возможной опасности: 2-1-3, 2-3-1, 1-2-3 и 3-2-1 (номера веществ в порядке наливания в пробирку).
| |
|
|
B. Школа
дп
снм
*2200
В 6Б классе берляндской средней школы учится n ребят. У каждого из них есть ровно один друг, которому он звонит, когда узнает новость. Обозначим друга i-ого человека через g(i). Обратите внимание, что дружбы не взаимны, т. е. g(g(i)) не обязательно равно i. В i-ый день человек с номером ai узнает новость с рейтингом bi (bi ≥ 1). Он тут же звонит своему другу и рассказывает ее. При этом новость устаревает, и ее рейтинг немного падает и становится bi - 1. Друг действует так же — он тоже звонит своему другу и тоже рассказывает новость. Друг друга получает новость уже с рейтингом bi - 2. Все это продолжается до тех пор, пока рейтинг новости не упадет до нуля — никто не захочет рассказывать новость с нулевым рейтингом. Более формально, все действуют следующим образом: если человек x узнал новость с ненулевым рейтингом y, он звонит своему другу g(i), и тот узнает новость с рейтингом y - 1 и, если возможно, продолжает процесс. Заметим, что в течение одного дня один и тот же человек может позвонить своему другу и рассказать ему одну и ту же новость с разными рейтингами. Таким образом, новость с рейтингом bi повлечет за собой ровно bi звонков. Ваша задача: посчитать величины resi — сколько учеников узнали свою первую новость в день i. Значения bi известны сразу, а вот ai вычисляются по следующей формуле:  где mod обозначает операцию взятия остатка от деления, res0 считается равным нулю, а vi — некоторые заданные целые числа. Выходные данные Выведите m строк по одному числу на каждой. i-ая строка должна содержать resi — для какого количества учеников первой новостью, которую они узнали за рассматриваемые m дней, была новость номер i. Номер новости — это номер дня, в который ее можно было узнать. Дни нумеруются с 1 в том порядке, в котором они заданы во входных данных. res0 выводить не следует.
| |
|
|
E. Три строки
снм
Строки
строковые суфф. структуры
Структуры данных
*2400
Заданы три строки (s1, s2, s3). Для каждого целого l (1 ≤ l ≤ min(|s1|, |s2|, |s3|), найдите количество троек целых чисел (i1, i2, i3) таких, что три строки sk[ik... ik + l - 1] (k = 1, 2, 3) попарно равны между собой. Все найденные числа выведите по модулю 1000000007 (109 + 7). Если какие-то из обозначений вам не знакомы, прочтите примечание. Выходные данные Выведите min(|s1|, |s2|, |s3|) чисел, разделенных пробелом — ответы на задачу по модулю 1000000007 (109 + 7). Примечание Рассмотрим строку t = t1t2... t|t|, где ti обозначает i-й символ строки, а |t| обозначает длину строки t. Подстрокой t[i... j] (1 ≤ i ≤ j ≤ |t|) будем называть строку titi + 1... tj.
| |
|
|
C. Цивилизация
Деревья
дп
поиск в глубину и подобное
снм
Тернарный поиск
*2100
Андрей играет в игру «Цивилизация». Дима помогает ему. В игре «Цивилизация» n городов и m двусторонних дорог. Города пронумерованы целыми числами от 1 до n. Между любой парой городов либо существует единственный путь, либо не существует никакого пути. Путем называется последовательность различных городов v1, v2, ..., vk, в которой между любыми двумя соседними городами vi и vi + 1 (1 ≤ i < k) есть дорога. Длина такого пути равна (k - 1). Давайте говорить, что два города лежат в одной области тогда и только тогда, когда существует путь между этими двумя городами. В процессе игры происходят события двух типов: - Андрей спрашивает у Димы длину самого длинного пути в области, в которой лежит город x.
- Андрей просит Диму объединить область, в которой лежит город x, с областью, в которой лежит город y. Если города лежат в одной области, то объединять области не нужно. Иначе нужно объединить области следующим образом: выбрать город в первой области, город во второй области и связать их дорогой так, чтобы минимизировать длину самого длинного пути в полученной области. Если существует несколько оптимальных способов соединить области, то разрешается выбрать любой.
Диме очень сложно выполнять просьбы Андрея, поэтому он обращается к вам за помощью. Помогите Диме. Выходные данные Для каждого события первого типа выведите ответ на него в отдельной строке.
| |
|
|
F. Задача Эркюля Пуаро
графы
снм
*2300
Сегодня вам предстоит решить задачу, с которой не может справиться сам Эркюль Пуаро! Именно поэтому данное преступление до сих пор не раскрыто, и эта история так и не вошла в детективы Агаты Кристи. Вам не сообщается, какое совершено преступление, где и когда обнаружен труп и остальные детали. Известно только то, что преступление совершено в доме, имеющем n комнат и m дверей между парами комнат. Жильцы дома очень подозрительны, поэтому все двери запираются на ключ и все ключи различны. Согласно показаниям свидетелей в ночь с четверга на пятницу все двери в доме были заперты и известно, в каких комнатах находились жильцы и какие ключи у кого были. Аналогичная информация известна и про ночь с пятницы на субботу, в которую все двери также были заперты. В пятницу лил сильный дождь, поэтому из дома никто не выходил и никто в него не входил. В течение дня обитатели дома могли - открывать и закрывать двери в соседние комнаты при помощи имеющихся ключей (каждую дверь можно открывать и закрывать с любой стороны);
- свободно перемещаться между комнатами, если соответствующие двери открыты;
- передавать друг другу ключи, находясь в одной комнате.
«Серые клеточки» Эркюля Пуаро не способны справиться с таким количеством информации. Определите, могло ли из расположения людей и ключей в первую ночь получиться расположение во вторую ночь, или кто-то из свидетелей точно лжет. Выходные данные Выведите «YES» (без кавычек), если из первого расположения можно получить второе, и «NO» в противном случае.
| |
|
|
D. Яблов и сложная задача
математика
снм
*2800
Тостов придумал очень сложную задачу. Он задал ее Яблову, но Яблов не может ее решить. Вы можете ему помочь? Дана шахматная доска размера n × n. В каждой клетке доски записан либо символ 'x', либо символ 'o', либо ничего не записано. Сколько существует способов заполнить все пустые клетки символами 'x' или 'o' (в каждой клетке в итоге должен быть записан ровно один символ) так, чтобы для каждой клетки доски количество соседних клеток с символом 'o' было четным? Найдите это количество способов по модулю 1000000007 (109 + 7). Две клетки доски соседние, если у них есть общая сторона. Выходные данные Выведите единственное целое число — ответ на задачу. Примечание В первом тестовом примере существует два способа: xxo xoo xox ooo oxx oox
| |
|
|
E. Граф информаций
графы
Деревья
поиск в глубину и подобное
снм
*2100
В компании «X» работает n сотрудников (для удобства пронумеруем их от 1 до n). Изначально, не было никаких отношений между сотрудниками. В каждый из m следующих дней происходило одно из событий: - либо сотрудник y стал начальником сотрудника x (при этом у сотрудника x не было начальника до этого события);
- либо сотруднику x передают пакет документов и он подписывает их; затем передает их своему начальнику, затем начальник подписывает документы и передает их своему начальнику и так далее (последний человек, подписавший документы, отправляет их в архив);
- либо приходит запрос вида «определить, подписывался ли сотрудник x на определенных документах».
Ваша задача написать программу, которая по заданным событиям будет отвечать на запросы, описанного вида. При этом гарантируется, что на протяжении всего времени работы компании не было циклических зависимостей. Выходные данные Для каждого запроса третьего типа выведите «YES», если сотрудник подписывал пакет документов, и «NO» в ином случае. Все слова выводите без кавычек.
| |
|
|
B. Два множества
2-sat
жадные алгоритмы
Паросочетания
поиск в глубину и подобное
снм
*2000
У Little X есть n различных целых чисел: p1, p2, ..., pn. Он хочет так разделить все числа на два множества, A и B, чтобы выполнялись условия: - Если число x принадлежит множеству A, то число a - x также должно принадлежать множеству A.
- Если число x принадлежит множеству B, то число b - x также должно принадлежать множеству B.
Помогите Little X разделить числа на два множества или определите, что это невозможно. Выходные данные Если способ разделения чисел на два множества существует, то выведите "YES" в первой строке. Затем выведите n целых чисел: b1, b2, ..., bn (bi равняется либо 0, либо 1), описывающих разделение. Если bi равняется 0, то pi принадлежит множеству A, в противном случае оно принадлежит множеству B. Если это невозможно, выведите "NO" (без кавычек). Примечание Допустимо следующее разбиение: все числа содержатся в одном множестве, а второе множество пустое.
| |
|
|
E. МУХ и много-много отрезков
снм
Структуры данных
*2700
Белые медведи Меньшиков и Услада из Санкт-Петербургского зоопарка и слоник Хорас из Киевского зоопарка решили заняться живописью. В рамках создания своего первого шедевра они уже нарисовали на бумаге эскиз, который состоит из n отрезков. Каждый отрезок был либо горизонтальный, либо вертикальный. Теперь друзья хотят упростить этот эскиз, стерев некоторые отрезки или части отрезков, так чтобы окончательное творение удовлетворяло трем условиям: - Хорас хочет иметь возможность нарисовать всю картину, поставив кисть на холст только один раз и не отрывая ее, пока картина не будет закончена (нет ничего плохого в том, чтобы при этом провести кистью несколько раз по одному месту). Поэтому все оставшиеся отрезки должны образовывать единую связную фигуру.
- Меньшиков хочет, чтобы получившаяся фигура была простой. Простой фигурой он называет фигуру, которая не содержит ни одного цикла.
- Изначально все отрезки на эскизе имеют целочисленные координаты точек начала и конца. Услада не любит вещественные координаты и хочет, чтобы это условие выполнялось и после стирания.
Так как в остальном их эскиз уже прекрасен, то друзья решили стереть такие части эскиза, чтобы максимизировать сумму длин оставшихся отрезков. От вас требуется посчитать эту максимальную сумму длин оставшихся после стирания отрезков. Выходные данные Выведите единственное целое число — максимальную сумму длин оставшихся отрезков. Примечание Фигуры, которые можно получить в двух данных примерах: В первом примере необходимо стереть любой из отрезков, так как два отрезка вместе не образуют единую связную фигуру. Во втором примере изначальные отрезки образуют цикл, есть четыре способа разорвать этот цикл — стереть первый, второй или четвертый отрезок полностью или стереть середину третьего отрезка. Последний вариант изображен на рисунке.
| |
|
|
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.
| |
|
|
B. Очередь
реализация
снм
*1500
На большой перемене все n студентов Берляндского государственного университета выстроились в очередь в столовой. Однако оказалось, что у столовой тоже есть перерыв на обед, и она временно перестала работать. Стоять в очереди, пока она не обслуживается, так скучно! Поэтому каждый из студентов записал номер студенческого билета того студента, что стоит в очереди перед ним, и того, что стоит в очереди непосредственно за ним. Если перед или после студента никого нет (то есть он первый или последний в очереди), то в качестве номера он записал число 0 (билеты студентов Берляндского государственного университета нумеруются с 1). После этого все студенты разошлись по своим делам. Когда же они вернулись, то оказалось, что восстановить очередь не такая простая задача, как кажется на первый взгляд. Помогите студентам восстановить состояние очереди по номерам студенческих билетов соседей в очереди. Выходные данные Выведите последовательность n целых чисел x1, x2, ..., xn — последовательность номеров студенческих билетов всех студентов в порядке очереди от первого к последнему. Примечание Картинка иллюстрирует очередь для первого примера.
| |
|
|
B. Новогодняя перестановка
графы
жадные алгоритмы
математика
поиск в глубину и подобное
снм
сортировки
*1600
У пользователя ainta есть перестановка p1, p2, ..., pn. Приближается Новый год, и юноша хочет как можно лучше украсить свою перестановку. Перестановка a1, a2, ..., an красивее перестановки b1, b2, ..., bn тогда и только тогда, когда существует целое число k (1 ≤ k ≤ n), для которого верно a1 = b1, a2 = b2, ..., ak - 1 = bk - 1 и ak < bk. Как известно, перестановка p — очень чувствительная натура, так что её можно изменять только путем перестановки двух различных элементов. Но переставлять элементы сложнее, чем вы думаете. Вам дана матрица A размера n × n, такая что пользователь ainta может переставить значения pi и pj (1 ≤ i, j ≤ n, i ≠ j) тогда и только тогда, когда Ai, j = 1. Дана перестановка p и матрица A. Пользователь ainta хочет знать, какая из достижимых перестановок самая красивая. Выходные данные В первой и единственной строке выведите n целых чисел через пробел, описывающих самую красивую достижимую перестановку. Примечание В первом примере для достижения самой красивой перестановки необходимо переставить элементы (p1, p7). Во втором примере для достижения самой красивой перестановки необходимо переставить (p1, p3), (p4, p5), (p3, p4). Перестановка p — это последовательность целых чисел p1, p2, ..., pn, состоящая из n различных положительных целых чисел, каждое из которых не превышает n. i-й элемент перестановки p обозначается как pi. Размер перестановки p обозначается как n.
| |
|
|
E. Новогоднее домино
дп
снм
Структуры данных
*2300
Многие празднуют Новый год, публикуя видео с падающими доминошками. Ознакомиться с подобными видео можно здесь: https://www.youtube.com/results?search_query=New+Years+Dominos Пользователь ainta, живущий в двухмерном мире, тоже хочет опубликовать видео. Дано n доминошек на плоскости с декартовой системой координат. i-ю доминошку (1 ≤ i ≤ n) можно представить как параллельный оси y отрезок длины li. Нижняя точка отрезка находится на оси x. Обозначим x-координату i-й доминошки как pi. Доминошки ставятся друг за другом, таким образом, выполняется условие p1 < p2 < ... < pn - 1 < pn. Пользователь ainta хочет снять видео с падающими доминошками. Чтобы доминошки попадали, он может толкнуть одну доминошку вправо. Тогда доминошка будет падать по круговой орбите, пока её отрезок полностью не коснётся оси x. Также, если s-я доминошка, падая, задевает t-ю доминошку, то и t-я доминошка упадет направо, таким же описанным выше образом. Доминошка s касается доминошки t тогда и только тогда, когда отрезки, образующие s и t, пересекаются. Рассмотрим рисунок, данный выше. Если толкнуть крайнюю слева доминошку вправо, она упадет, затронув доминошки (A), (B) и (C). В результате, доминошки (A), (B), (C) также упадут вправо. Хотя доминошка (D) не будет задета при падении крайней доминошки слева, она в итоге также упадет, потому что её толкнет доминошка (C). Приведенный выше рисунок демонстрирует пример падающих доминошек. Каждый красный кружок означает соприкосновение двух доминошек. У пользователя ainta есть q планов публикации видео. j-й из них начинается с того, что мы толкаем xj-ю доминошку и заканчивается с падением yj-й доминошки. Но порой реализовать такой план невозможно, в связи с чем требуется удлинить некоторые доминошки. Увеличить длину одной доминошки на 1 единицу стоит один доллар. Пользователь ainta хочет знать для каждого плана минимальную цену, необходимую для достижения цели. Планы обрабатываются независимо друг от друга, то есть если длина доминошки увеличивается при каком-либо плане, это не влияет на длину этой доминошки в других планах. Множество доминошек, которые упадут помимо xj-й и yj-й, не имеет значения, но исходный удар должен наноситься именно по доминошке xi. Выходные данные Для каждого плана выведите строку, содержащую минимальную стоимость, необходимую для его реализации. Если никаких затрат не требуется, выведите 0.
| |
|
|
B. Миша и смена хэндлов
снм
Строки
Структуры данных
*1100
Взломав сайт Codeforces, Миша решил дать возможность всем пользователям менять их хэндлы. Пользователь теперь может сменить свой хэндл сколько угодно раз. Но при этом каждый новый хэндл не должен совпадать ни с каким из уже занятых или занятых в прошлом хэндлов. У Миши есть список запросов пользователей на смену хэндлов. После их выполнения он хочет понять соответствие между исходными хэндлами пользователей и новыми. Помогите ему в этом. Выходные данные В первой строке выведите целое число n — количество пользователей, воспользовавшихся возможностью сменить хэндл. В последующих n строках выведите соответствие между старыми хэндлами пользователей и новыми. Каждая из них должна содержать по две строки old и new, разделенные пробелом, что означает следующее: до взлома сайта пользователь имел хэндл old, а после выполнения всех запросов получил хэндл new. Строки разрешается выводить в любом порядке. Каждый пользователь, менявший хэндл, должен встретиться в этом описании ровно один раз.
| |
|
|
B. Цветной граф мистера Китаюта
графы
дп
поиск в глубину и подобное
снм
*1400
Мистер Китаюта недавно приобрёл неориентированный граф, состоящий из n вершин и m ребер. Вершины графа пронумерованы от 1 до n. Ребро i окрашено в цвет ci и соединяет вершины ai и bi. Мистер Китаюта хочет, чтобы вы обработали q запросов следующего вида. В i-м запросе он дает вам два целых числа — ui и vi. Вам требуется найти количество цветов, таких, что ребра этого цвета непосредственно или косвенно соединяют вершины ui и vi (т. е. по рёбрам только этого цвета можно добраться от вершины ui до вершины vi). Выходные данные Для каждого запроса выведите ответ в отдельной строке. Примечание Рассмотрим первый пример. Рисунок выше иллюстрирует первый пример. - Вершина 1 и вершина 2 соединены цветами 1 и 2.
- Вершина 3 и вершина 4 соединены цветом 3.
- Вершина 1 и вершина 4 не соединены никаким цветом.
| |
|
|
D. Цветной граф мистера Китаюта
графы
Перебор
поиск в глубину и подобное
снм
*2400
Мистер Китаюта только что приобрёл неориентированный граф, состоящий из n вершин и m ребер. Вершины графа пронумерованы от 1 до n. i-е ребро, соединяющее вершины ai и bi, окрашено в цвет ci. Мистер Китаюта хочет, чтобы вы обработали следующие q запросов. i-й запрос состоит из двух целых чисел — ui и vi. Найдите количество цветов, таких, что ребра этого цвета непосредственно или косвенно соединяют вершину ui и вершину vi (т. е. по рёбрам только этого цвета можно добраться от вершины ui до вершины vi). Выходные данные Для каждого запроса выведите ответ на отдельной строке. Примечание Рассмотрим первый пример. Рисунок выше иллюстрирует первый пример. - Вершина 1 и вершина 2 соединены цветами 1 и 2.
- Вершина 3 и вершина 4 соединены цветом 3.
- Вершина 1 и вершина 4 не соединены никаким цветом.
| |
|
|
B. Drazil и его счастливые друзья
meet-in-the-middle
Перебор
снм
теория чисел
*1300
У Drazil много друзей. Некоторые из них счастливы, а некоторые несчастны. Drazil хочет, чтобы все его друзья были счастливы. Поэтому он придумал такой план. Среди его друзей n юношей и m девушек. Пронумеруем их от 0 до n - 1 и 0 до m - 1 соответственно. В i-й день Drazil приглашает -го юношу и -ю девушку поужинать (Drazil программист, поэтому i принимает значения с нуля). Если один из этих двух людей счастлив, то и другой становится счастливым. В противном случае оба человека останутся в том состоянии, в котором они были изначально. Как только человек становится счастливым (или же если он был счастлив с самого начала), он остается счастливым навсегда. Drazil интересно, приведёт ли этот план к тому, что его друзья рано или поздно все станут счастливыми. Помогите ему найти ответ на этот вопрос. Выходные данные Если Drazil может осчастливить всех своих друзей, воспользовавшись этим планом, выведите "Yes". В противном случае выведите "No". Примечание Определим как остаток от целочисленного деления i на k. В первом тесте из условия: - В 0-й день Drazil приглашает 0-го парня и 0-ю девушку. Так как 0-я девушка изначально счастливая, 0-й юноша становится счастлив в этот день.
- В 1-й день Drazil приглашает 1-го парня и 1-ю девушку. Они оба несчастны, так что в этот день ничего не меняется.
- Во 2-й день Drazil приглашает 0-го парня и 2-ю девушку. Так как 0-й парень уже счастлив, в этот день он делает 2-ю девушку счастливой.
- В 3-й день Drazil приглашает 1-го парня и 0-ю девушку. 0-я девушка счастливая, она делает счастливым 1-го парня.
- В 4-й день Drazil приглашает 0-го парня и 1-ю девушку. 0-ой парень счастлив, так что он делает 1-ю девушку счастливой. Итак, в этот момент все друзья Drazil становятся счастливыми.
| |
|
|
D. Drazil и утренняя зарядка
Деревья
дп
поиск в глубину и подобное
снм
*2800
Drazil и Varda — дождевые черви. Они хотят подыскать хорошее местечко, чтобы растить детей. И вот нашли они подходящую почву с хорошей природной норой. Нора состоит из множества комнат, некоторые пары которых соединены маленькими туннелями, по которым могут перемещаться черви. Рассмотрим комнаты и туннели как вершины и ребра в графе. Этот граф представляет собой дерево. Иными словами, между любой парой вершин существует единственный простой путь. Каждая комната, являющаяся листом этого дерева, соединена с поверхностью вертикальным туннелем. Здесь, под листом мы подразумеваем вершину, смежную ровно с одним ребром в дереве. В каждой комнате хватает места для проживания не более одного червя. Дождевой червь не может жить в туннеле. Drazil и Varda подумывают воспитывать своих деток по следующему плану. Им хочется, чтобы все их дети сразу после подъема делали утреннюю зарядку! Когда наступает утро, все червячки просыпаются в одно и то же время, затем каждый из них выбирает самый длинный путь к поверхности на собрание (как и любые дети, они ленятся делать зарядку, поэтому им всем хочется приступить к упражнениям как можно позже). Drazil и Varda хотят, чтобы разница между моментами появления на поверхности первого и последнего червячка не превышала l (в противном случае детишки расползутся по земле и их будет сложно собрать на зарядку). Есть дополнительное условие — комнаты, которые занимают детки, должны формировать связное множество. Иными словами, для любых двух комнат, которые занимают червячки, все комнаты, лежащие на пути из одной комнаты в другую, тоже должны быть заняты червячками. Какое максимальное количество детей может быть у Drazil и Varda, чтобы удовлетворить всем вышеприведенным условиям? Drazil и Varda хотят знать ответ для многих различных вариантов l. (Drazil и Varda не живут в одной норке со своими детьми) Выходные данные Выведите q строк, каждая из которых содержит единственное целое число, обозначающее ответ для очередного значения l. Примечание В первом примере нора выглядит следующим образом. Комнаты 1 и 5 представляют из себя листы, так что в них содержится по вертикальному туннелю, связывающему их с поверхностью. Длины наидлиннейшего пути из комнат 1 – 5 наружу равняются 12, 9, 7, 9, 12, соответственно. При l = 1 мы можем выбрать любую одну комнату. При l = 2..4 мы можем выбрать в качестве ответа комнаты 2, 3, и 4. При l = 5 мы можем выбрать все комнаты. 
| |
|
|
B. Майк и футы
Бинарный поиск
дп
снм
Структуры данных
*1900
Майк — президент страны What-The-Fatherland. Помимо Майка, там живёт ещё n медведей. Все они стоят в ряд и пронумерованы от 1 до n слева направо. Рост i-го медведя составляет ровно ai футов. Назовём группой медеведей непустой непрерывный подотрезок этого ряда. Размер группы — это количество медведей в этой группе. Сила группы — это минимальная высота медведя в этой группе. Майку хочется знать для каждого x, такого что 1 ≤ x ≤ n, максимальную силу группы медведей размера x. Выходные данные Выведите n целых чисел в одной строке. Для каждого x от 1 до n выведите максимальную силу среди всех групп размера x.
| |
|
|
C. Любовные треугольники
графы
поиск в глубину и подобное
снм
*2200
Во многих аниме фигурируют любовные треугольники: Алиса любит Боба, Чарли тоже любит Боба, но Алиса ненавидит Чарли. Вы задумали аниме с n персонажами. Персонажи обозначены числами от 1 от n. Каждая пара персонажей может либо взаимно любить, либо взаимно ненавидеть друг друга (нейтрального состояния нет). Вы ненавидите любовные треугольники (А и B любят друг друга и B и C любят друг друга, но А и C ненавидят друг друга), а также вы терпеть не можете, когда никто никого не любит. Итак, рассматривая любых трёх человек, вы будете довольны, если ровно одна пара из них любит друг друга (А и B любят друг друга, а C ненавидит и А, и B), либо если все три пары любят друг друга (А любит B, B любит C, C любит А). Вам дан список из m известных отношений в аниме. Вы точно знаете, что некоторые пары любят друг друга, а некоторые пары ненавидят друг друга. Вам интересно, сколько есть способов доопределить оставшиеся отношения так, чтобы вы были довольны каждым из треугольников. Два способа считаются различными, если два персонажа любят друг друга в одном способе и ненавидят друг друга в другом способе. Выведите это количество по модулю 1 000 000 007. Выходные данные Выведите единственное целое число, равное остатку от деления на 1 000 000 007 количества способов заполнения оставшихся пар так, чтобы вы были довольны каждым треугольником. Примечание В первом примере четыре способа таковы: - Все любят друг друга;
- 1 и 2 любят друг друга, а 3 ненавидит 1 и 2 (а также два симметричных способа).
Во втором примере единственный возможный способ — заставить 1 и 3 любить друг друга, а 2 и 4 — ненавидеть друг друга.
| |
|
|
D. Кампус
Бинарный поиск
Деревья
снм
Структуры данных
*3100
В городе Осколково есть кампус, состоящий из n студенческих общежитий, n университетов и n военкоматов. Изначально i-е общежитие принадлежит i-му университету и приписано к i-му военкомату. Жизнь бурлит, и в кампусе постоянно происходят изменения. Изменения бывают четырех типов: - Университет под номером aj объединяется с университетом bj, после чего все общежития, которые принадлежали университету bj, переходят под контроль университета aj, а университет bj перестает существовать.
- Военкомат под номером cj объединяется с военкоматом dj, после чего все общежития, которые были приписаны к военкомату dj, переходят под контроль военкомата cj, а военкомат dj перестает существовать.
- Университет под номером xj производит заселение. Путь kxj — количество общежитий, которые принадлежат этому университету в момент заселения. Тогда количество студентов в каждом общежитии университета xj увеличивается на kxj (обратите внимание, чем больше общежитий принадлежат университету, тем больше студентов заселяется в каждое общежитие университета).
- Военкомат под номером yj производит облаву на все подконтрольные ему общежития и забирает из них всех студентов.
Таким образом, в любой момент времени каждое общежитие относится только к одному университету и одному военкомату. Изначально все общежития пусты. Вам требуется обрабатывать изменения, происходящие в кампусе, а также отвечать на запросы, сколько человек живёт в общежитии qj в данный момент времени. Выходные данные В i-й строке выведите ответ на i-й запрос количества человек в общежитии. Примечание Рассмотрим первый тестовый пример: - При первом запросе университету 1 принадлежит только общежитие номер 1, значит после запроса в общежитии 1 будет жить 1 студент.
- После третьего запроса университету номер 1 принадлежат общежития 1 и 2.
- Четвертый запрос увеличивает на 2 количество студентов, живущих в общежитиях 1 и 2, принадлежащих университету номер 1. После этого в первом общежитии живет 3 студента, а во втором — 2 студента.
- При пятом запросе обнуляется количество студентов, живущих в общежитии номер 1, приписанном к военкомату номер 1.
| |
|
|
E. Экспозиция
Бинарный поиск
Деревья
снм
Структуры данных
*1900
До пятидесятилетия известного писателя Берляева осталось несколько дней. По этому поводу в местной библиотеке решили организовать выставку сочинений известного фантаста. Также было решено, что необходимо выбрать все книги, изданные автором за какой-то интервал времени. Понятно, что если книги будут очень сильно различаться по размерам, то посетителям это не понравится. Поэтому, посовещавшись, организаторы пришли к мнению, что высота самой низкой и самой высокой книг, отобранных для экспозиции, должны отличаться не более чем на k миллиметров. В библиотеке имеется n томов произведений Берляева, расположенных в хронологическом порядке выпуска в свет. Про каждую книгу известна ее высота в миллиметрах hi. Поскольку юбиляр является очень уважаемым в городе человеком, то организаторы хотят представить на выставке наибольшее число его книг, а также узнать, какие при этом периоды творчества писателя они смогут охватить. Помогите организаторам справиться с этой нелегкой задачей. Выходные данные В первую строку выходных данных выведите через пробел два числа a и b. Число a означает наибольшее количество книг, которое организаторы смогут представить на выставке, а число b — количество интервалов времени таких, что в каждый из них писатель Берляев издал a книг, и самая высокая из этих книг превосходит самую низкую не более чем на k миллиметров. В последующие b строк выведите по два целых числа через пробел — номер первого и последнего тома каждого из искомых периодов творчества Берляева.
| |
|
|
B. Время сериала!
поиск в глубину и подобное
снм
*1400
Друг Сereal Guy, Serial Guy, любит смотреть сериалы. У него вот-вот начнётся сериал, а он не помыл свою тарелку. Но он решил хотя бы поставить набираться в нее воду. Тарелка представляет собой параллелепипед k × n × m, то есть имеет k слоёв (первый слой — верхний), каждый из которых является прямоугольником n × m со свободными ('.') и занятыми клетками ('#'). Вода может находиться только в свободных клетках. Кран находится над клеткой (x, y) первого слоя, гарантируется, что эта клетка свободна. Каждую минуту в тарелку попадает одна кубическая единица воды. Выясните, через сколько минут Serial Guy должен оторваться от сериала и выключить воду, чтобы вода не переполнила тарелку. То есть нужно найти момент времени, когда тарелка будет заполнена доверху и в следующий момент переполнится. Примечание: вода заполняет всё свободное достижимое пространство (см. пример 4). Вода течет во всех 6 направлениях, через грани кубиков 1 × 1 × 1. Выходные данные В ответе должно содержаться одно число — через сколько минут тарелка наполнится.
| |
|
|
D. Спаситель
математика
Перебор
снм
*2500
Миша решил помочь Паше и Акиму помириться. У него есть хитрый план — уничтожить все смешливые грибы. Он знает, что смешливые грибы замечательно лопаются от смеха. На полянках растут грибы. На t-ой полянке растет a[t] грибов. Ещё Миша знает, что у полянок, на которых растут грибы, есть уникальная способность. Полянка (например, i) может передать свой смех на другую полянку (например, j) если существует целое число (например, b) такое, что некоторая перестановка чисел a[i], a[j] и b является красивой тройкой (i ≠ j). Красивая тройка — это такие три попарно взаимно простые числа x, y, z, что: x2 + y2 = z2. Миша хочет узнать, на каком минимальном количестве полянок ему нужно посмеяться, чтобы все смешливые грибы лопнули. Выходные данные Выведите одно число — минимальное количество полянок, на которых Миша должен посмеяться, чтобы все грибы лопнули.
| |
|
|
E. Lomsat gelral
Деревья
поиск в глубину и подобное
снм
Структуры данных
*2300
Задано корневое дерево с корнем в вершине 1. Каждая вершина покрашена в некоторый цвет. Будем говорить, что цвет c доминирует в поддереве вершины v, если нет другого цвета, который встречается в поддереве вершины v большее количество раз, чем цвет c. Таким образом, возможно два или более цвета одновременно доминируют в одном поддереве. Поддерево вершины v — это сама вершина v и все такие вершины, путь от которых до корня обязательно проходит через вершину v. Вам нужно для каждой вершины v определить сумму доминирующих цветов в поддереве вершины v. Выходные данные Выведите n целых чисел — суммы доминирующих цветов, для каждой вершины.
| |
|
|
D. Ациклические органические составляющие
Деревья
поиск в глубину и подобное
снм
Строки
Структуры данных
хэши
*2400
Дано дерево T состоящее из n вершин (пронумерованных целыми числами от 1 до n). В каждой вершине записана некоторая буква. Корень дерева расположен в вершине 1. Рассмотрим поддерево дерево Tv некоторой вершины v. Вдоль любого просто пути, начинающегося в v и заканчивающегося в некоторой вершине (возможно, в самой v), можно прочитать некоторую строку. Обозначим количество различных строк, которые можно прочитать таким способом как . Дополнительно: для каждой вершины v дано целое число cv. Нас интересуют вершины, в которых значение как можно больше. Вы должны вычислить две величины — максимальное значение и количество вершин v с максимальным . Выходные данные Выведите два числа — значение для всех 1 ≤ i ≤ n и количество вершин v, для которых . Примечание В первом примере дерево выглядит следующим образом: 
Наборы строк, которые могут быть прочитаны из вершин: 
Наконец, значения таковы: 
Во втором примере значения таковы: (5, 4, 2, 1, 1, 1).Различные строки, которые можно прочитать из вершины 2 таковы: ; обратите внимание, что может быть прочитано как на пути до вершины 3, так и на пути до вершины 4.
| |
|
|
B. Муудулярная Арифметика
Комбинаторика
математика
поиск в глубину и подобное
снм
теория чисел
*1800
Как подобает любому порядочному школьнику, Кевин Сан изучает коровометрию, коровоматику и криптобычество в Буреновском государственном университете (БГУ) под руководством Фермера Ивана. На последнем занятии по математическому упрощению уравнений (МУУ) Кевин столкнулся со странным функциональным уравнением, для решения которого он нуждается в вашей помощи. Даны два целых числа k и p, при этом p — нечётное простое число и функциональное уравнение:  для некоторой функции . (Равенство должно выполняться для любого целого x от 0 до p - 1 включительно). Кевин просит вас посчитать количество различных функций f, удовлетворяющих этому уравнению. Поскольку ответ может быть достаточно большим, вы должны вывести остаток от деления этого числа на 109 + 7. Выходные данные Выведите единственное целое число — количество различных функций f, удовлетворяющих уравнению, по модулю 109 + 7. Примечание В первом примере p = 3 и k = 2. Подходят следующие функции: - f(0) = 0, f(1) = 1, f(2) = 2.
- f(0) = 0, f(1) = 2, f(2) = 1.
- f(0) = f(1) = f(2) = 0.
| |
|
|
E. Пастушеские странности
Деревья
математика
разделяй и властвуй
снм
Структуры данных
*3000
В стране Бурении есть n пастбищ, но нет дорог, их соединяющих. Конечно, это ужасная ситуация, поэтому Кевин Сан планирует исправить её, построив m двунаправленных дорог. Каждая дорога соединит какую пару пастбищ. Для того чтобы перемещение по дорогам было более эффективным, он также планирует замостить некоторые из этих новых дорог булыжником. Кевин очень дотошен в вопросе мощения путей. Так как он любит нечётные числа, то хочет, чтобы к каждому пастбищу вело нечётное число мощеных дорог. Назовём замощение дорог солнечным, если каждому пастбищу инцидентно нечётное количество замощёных дорог. Кроме того, короткие дороги нравятся Кевину больше, чем длинные, поэтому он хочет, чтобы самая длинная мощёная дорога была как можно короче. После добавления очередной дороги Кевин хочет знать, может ли он добиться солнечного замощения дорог Бурении, и если это так, то надо найти минимальную возможную длину самой длинной дороги, которую он замостит. Выходные данные Выведите m целых чисел, i-е из которых обозначает минимальную возможную длину самой длинной дороги в солнечном замощении после добавления первых i дорог. Если не существует такого замощения, что каждое пастбище инцидентно нечётному количеству мощёных дорог, то выведите - 1. Обратите внимание, что каждый раз рассматривается только гипотетическое замощение — ваш ответ после добавления i-й дороги не должен никак зависеть от ваших предыдущих ответов. Примечание В первом примере после добавления i-й дороги пути Кевин должен вымостить следующие из них: - Никакой набор дорог не подходит.
- Дорога номер 1 (длина 4) и номер 2 (длина 8).
- Дорога номер 1 (длина 4) и номер 2 (длина 8).
- Дорога номер 3 (длина 2) и номер 4 (длина 3).
Во втором примере нет ни одного солнечного замощения.
| |
|
|
E. Минимальное остовное дерево по каждому ребру
графы
Деревья
поиск в глубину и подобное
снм
Структуры данных
*2100
Дан связный неориентированный взвешенный граф без петель и кратных ребер, состоящий из n вершин и m ребер. Для каждого ребра графа (u, v) найдите вес такого остовного дерева, что это ребро (u, v) входит в него, и при этом вес этого остовного дерева минимален. Весом остовного дерева называется сумма весов ребер, входящих в остовное дерево. Выходные данные Выведите m строк: i-я строка должна содержать минимальный вес такого остовного дерева, содержащего i-ое ребро. Ребра нумеруются от 1 до m в порядке их появления во входных данных.
| |
|
|
F. Островной пазл
графы
Деревья
поиск в глубину и подобное
снм
*3400
В далёком островном государстве насчитывается n островов, соединённых мостами с двухсторонним движением. Текущая система мостов образует дерево. Другими словами, всего мостов n - 1, каждый мост соединяет одну пару различных островов, и от любого острова можно дойти до любого другого, используя только эти мосты. В центре каждого острова расположен пьедестал. На всех пьедесталах всех островов, кроме одного, находится очень хрупкая статуя, причём все статуи различны. У оставшегося острова пьедестал пуст. Жители островов договорились переупорядочить статуи определённым образом. Единственная доступная им операция — это выбрать какой-то остров, непосредственно соединённый мостом с островом с пустым пьедесталом, и аккуратно перенести статую с одного пьедестала на свободный пьедестал. Разумеется, очень часто статуи невозможно переупорядочить требуемым образом, используя только описанную выше операцию переноса. Островитяне хотят построить ещё один дополнительный мост, такой что после этого станет возможным перенести все статуи. При этом они, конечно, хотели бы выполнить как можно меньше переносов. Помогите им определить, какой мост необходимо построить и какое минимальное количество действий выполнить, чтобы добиться желаемого расположения статуй. Выходные данные Возможные варианты вывода: Если переупорядочить статуи требуемым образом можно и без постройки дополнительно моста, то выведите 0 t, где t равняется минимальному требуемому количеству действий. В противном случае выведите u, v и t (1 ≤ u < v ≤ n) — концы нового моста и минимальное количество действий, необходимое, чтобы добиться желаемого расположения статуй. Если переставить статуи невозможно, даже построив новый мост, выведите - 1. Примечание В первом примере островитяне могут соединить мостом острова 1 и 3, после чего выполнить следующую последовательность действий: передвинуть статую 1 с острова 1 на остров 2, передвинуть статую 2 с острова 3 на остров 1, передвинуть статую 1 с острова 2 на остров 3. Желаемое расположение статуй будет достигнуто за 3 действия. Во втором примере можно просто передвинуть статую 1 с острова 1 на остров 2. Строить новых мостов не требуется. В третьем примере переставить статуи желаемым образом невозможно, даже построив новый мост.
| |
|
|
C. Сжатие таблицы
графы
дп
жадные алгоритмы
поиск в глубину и подобное
снм
*2200
Петя увлёкся алгоритмами сжатия данных. Он уже изучил форматы gz, bz, zip и несколько других. Воодушевившись новыми знаниями, Петя собрался разработать свой формат сжатия и назвать его dis. Петя решил сжимать таблицы. У него есть таблица, состоящая из n строк и m столбцов, заполненная целыми положительными числами. Он хочет заменить значения элементов таблицы на целые положительные числа так, чтобы отношение элементов в каждой строке и каждом столбце не изменилось. То есть, если в некоторой строке исходной таблицы ai, j < ai, k, то и в сжатой таблице a'i, j < a'i, k, и если ai, j = ai, k, то a'i, j = a'i, k. Аналогично, если в некотором столбце исходной таблицы ai, j < ap, j, то и в сжатой таблице a'i, j < a'p, j, и если ai, j = ap, j, то a'i, j = a'p, j. Поскольку большие значения требуют больше места для хранения, максимальное значение элемента получившейся матрицы должно быть как можно меньше. В теории Петя мастер, но вот писать код он не любит. Помогите ему реализовать формат сжатия dis. Выходные данные Выведите сжатую таблицу: n строк, содержащих по m чисел. Если существует несколько ответов, минимизирующих максимальное число, то разрешается вывести любой из них. Примечание В первом примере a1, 2 ≠ a2, 1, но, поскольку они не располагаются в одной строке или в одном столбце, при сжатии их можно сделать равными.
| |
|
|
E. Часовой механизм
Деревья
жадные алгоритмы
поиск в глубину и подобное
снм
Структуры данных
*3200
Меня зовут Джим ди Гриз, я самый ловкий мошенник и авантюрист во всей галактике. По мотивам моих похождений написано множество книг, а ограблениям, совершённым мною, нет числа. Однако вы смогли застать меня в весьма неприятной ситуации. Не обнаружив себя перед камерами, перехитрив десяток охранников и обойдя множество ловушек, я смог добраться до желанного ящика с сокровищами. Отворив его крышку, я активировал бомбу с часовым механизмом, который уже отсчитывает секунды до неминуемого взрыва! К счастью, мне уже приходилось сталкиваться с бомбами подобной модели, и я знаю, что часовой механизм можно остановить, если правильно соединить проводами контакты на панели управления. Передо мной n контактов, соединённых n - 1 проводами. Контакты пронумерованы целыми числами от 1 до n. Бомба устроена таким образом, что если некоторый набор из k ≥ 2 контактов c1, c2, ..., ck соединён по циклу, то есть между парами контактов c1 и c2, c2 и c3, ..., ck и c1 есть k различных проводов, то срабатывает проверка безопасности, и заряд мгновенно детонирует, не оставляя от неудачливого взломщика и следа. В том числе, если два контакта соединены более чем одним проводом, то на них образуется цикл длины 2, и бомба также взрывается. Соединять контакт с самим собой запрещается. С другой стороны, если я отсоединю одновременно более чем один провод (иными словами, в какой-то момент времени будет подключено менее n - 2 проводов), то сработает другая проверка безопасности, которая приведёт к такому же плачевному результату. Таким образом, всё, что мне остаётся, это последовательно вытаскивать провод и вставлять его в новое место, следя, чтобы не образовалось цикла, связывающего контакты. Я знаю, как надо расположить провода, чтобы остановить часовой механизм. Но у меня остаётся всё меньше и меньше времени на это! Помогите мне выбраться из передряги: найдите кратчайшую последовательность безопасных операций, каждая из которых представляет собой отключение определённого провода и его подключение в новое место, а также выстраивает провода требуемым образом. Выходные данные В первой строке выведите число k (k ≥ 0) — минимальное количество проводов, которые потребуется переподключить. В последующих k строках выведите четвёрки чисел ai, bi, ci, di, означающих, что на i-м шаге нужно отсоединить провод, соединяющий контакты ai и bi, и соединить им контакты ci и di. Разумеется, к этому моменту времени провод между контактами ai и bi должен присутствовать на схеме. Если оптимальных последовательностей несколько, то выведите любую из них. Если требуемой последовательности операций не существует, выведите одно число -1. Примечание Картинка с пояснением к тестам из условия:
| |
|
|
E. В погоне за артефактами
графы
Деревья
поиск в глубину и подобное
снм
*2300
Павел снова играет в одну известную компьютерную игру. Игроку предоставлена в распоряжение целая страна, где можно свободно путешествовать, выполнять квесты и набирать опыт. В этой стране n островов и m мостов, расположенных между островами так, что от каждого острова можно добраться до каждого. В середине некоторых мостов лежат древние могущественные артефакты. Павлу сами по себе артефакты не нужны, зато он может неплохо заработать, продав хотя бы один такой артефакт. В начале игры Павел находится на острове a, а торговец артефактами — на острове b (возможно, на том же самом, что и Павел). Павел хочет найти артефакт, прийти к торговцу и продать его. Проблема осложняется тем, что мосты между островами очень старые и разрушаются сразу после того, как по ним пройти. Так как персонаж Павла не умеет плавать, летать и телепортироваться, задача становится не такой и простой! Обратите внимание, что Павел не может пройти половину моста, забрать артефакт и вернуться на тот же остров. Определите, сможет ли Павел найти артефакт и принести его к торговцу. Выходные данные Если Павел сможет добыть артефакт и продать его торговцу, выведите «YES» (без кавычек). Иначе выведите «NO» (без кавычек).
| |
|
|
E. Медвежонок и забытое дерево 2
графы
Деревья
поиск в глубину и подобное
снм
*2400
Деревом называется связный неориентированный граф, состоящий из n вершин и n - 1 ребра. Вершины пронумерованы целыми числами от 1 до n. У полярного медвежонка Лимака было дерево, но он его потерял. Однако он всё ещё помнит о нём некоторые факты. Вам даны m пар вершин (a1, b1), (a2, b2), ..., (am, bm). Лимак точно помнит, что между вершинами ai и bi не было ребра. Помимо этого, он помнит, что в дереве было ровно k рёбер инцидентных вершин 1 (степень вершины 1 равнялась k). Проверьте, существует ли хотя бы одно дерево, подходящее под описание Лимака. Выходные данные Если существует хотя бы одно дерево, подходящее под описание Лимака, то выведите «possible» (без кавычек). В противном случае выведите «impossible» (без кавычек). Примечание В первом примере дерево состоит из 5 вершин. Степень вершины 1 должна быть равна 2. Все условия будут выполнены для дерева, состоящего из рёбер 1 - 5, 5 - 2, 1 - 3 и 3 - 4. Во втором примере Лимак помнит, что не существовало рёбер 1 - 2, 1 - 3, 1 - 4, 1 - 5 и 1 - 6. Таким образом, вершина 1 не могла быть соединена ни с одной другой вершиной, и подходящего дерева не существует.
| |
|
|
E. Новая реформа
графы
жадные алгоритмы
поиск в глубину и подобное
снм
Структуры данных
*1600
В Берляндии есть n городов, соединённых m двусторонними дорогами. Дороги не могут соединять город с самим собой, и каждая пара городов соединяется не более чем одной дорогой. Не гарантируется, что из любого города можно доехать до любого другого, используя только имеющиеся дороги. Президент Берляндии решил внести изменения в систему дорожных путей и дал указание министерству транспорта заняться данной реформой. Теперь каждая дорога должна стать односторонней (вести только из одного города в другой). Чтобы не вызвать большого недовольства у жителей, необходимо провести реформу так, чтобы оставалось как можно меньше обособленных городов. Город считается обособленным, если в него не входит ни одна дорога, при этом выходящие из этого города дороги допустимы. Помогите министерству транспорта найти минимальное количество обособленных городов после проведения реформы. Выходные данные Выведите единственное число — минимальное количество обособленных городов после проведения реформы. Примечание В первом примере допустима следующая ориентация дорог: , , . Во втором примере: , , , , . В третьем примере: , , , , .
| |
|
|
F. Поликарп и сено
графы
жадные алгоритмы
поиск в глубину и подобное
снм
сортировки
*2000
У фермера Поликарпа есть склад с сеном, который можно представить как прямоугольную таблицу n × m, где n — количество строк, а m — количество столбцов в таблице. В каждой клетке таблицы содержится стог сена. Высота в метрах стога, расположенного в i-й строке и j-м столбце, равна целому числу ai, j и совпадает с количеством кубометров сена в данном стоге, поскольку все клетки имеют размер основания 1 × 1. Поликарп решил навести на складе порядок, сняв некоторое целое количество кубометров сена с верхушки каждого стога. С разных стогов разрешается снимать различный объем сена. В том числе стог разрешается не трогать совсем или, наоборот, убирать полностью. Если стог убран полностью, то соответствующая клетка становится пустой и стога более не содержит. Поликарп хочет, чтобы после реорганизации выполнялись следующие требования: - суммарный объём сена на складе должен быть в точности равен k,
- высоты всех стогов (то есть клеток, содержащих ненулевое количество сена) должны быть одинаковыми,
- высота хотя бы одного стога должна остаться такой же, как была,
- для устойчивости оставшейся конструкции все стога должны представлять собой одну связную область.
Два стога считаются соседними, если они имеют общую сторону в таблице. Область называется связной, если от любого стога этой области можно добраться до любого другого стога этой области, двигаясь только по соседним стогам. При этом два соседних стога обязательно принадлежат одной области. Помогите Поликарпу выполнить это нелёгкое задание или сообщите, что это невозможно. Выходные данные В первой строке выведите «YES», если Поликарп сможет совершить реорганизацию, и «NO» в противном случае. Если ответ «YES», то в следующих n строках выведите по m чисел — высоты оставшихся стогов. Все оставшиеся ненулевые значения должны быть равны, представлять собой связанную область, и хотя бы одно из этих значений не должно быть изменено. Если существует несколько ответов, разрешается вывести любой из них. Примечание В первом примере ненулевые значения составляют связную область, значения не превосходят начальных высот стогов. Все ненулевые значения равны 7, а их количество равно 5, значит суммарный объём оставшегося сена равен требуемому значению k = 7·5 = 35. При этом стог, находящийся во второй строке и третьем столбце, остался нетронутым.
| |
|
|
E. Редактор правильных скобочных последовательностей
снм
Строки
Структуры данных
*1700
Недавно Поликарп взялся за разработку текстового редактора правильных скобочных последовательностей (сокращенно ПСП). Напомним, что скобочная последовательность называется правильной, если путем вставки в нее символов «+» и «1» можно получить из нее корректное математическое выражение. Например, последовательности «(())()», «()» и «(()(()))» — правильные, в то время как «)(», «(()» и «(()))(» — нет. Каждая скобка в ПСП имеет парную ей. Например, в «(()(()))»: - для 1-й скобки — парная 8-я,
- для 2-й скобки — парная 3-я,
- для 3-й скобки — парная 2-я,
- для 4-й скобки — парная 7-я,
- для 5-й скобки — парная 6-я,
- для 6-й скобки — парная 5-я,
- для 7-й скобки — парная 4-я,
- для 8-й скобки — парная 1-я.
Редактор Поликарпа пока поддерживает лишь три операции при работе с ПСП. Курсор в редакторе занимает целиком позицию одной из скобок (а не позицию между скобками!). Вот три поддерживаемых операции: - «L» — передвинуть курсор влево на одну позицию,
- «R» — передвинуть курсор вправо на одну позицию,
- «D» — удалить скобку, в которой находится курсор, парную ей, а также все скобки между ними (то есть удалить подстроку от скобки до парной ей).
После операции «D» курсор перемещается на ближайшую скобку вправо (конечно, среди неудалённых). Если такой нет, то есть был удалён суффикс строки, то на ближайшую скобку влево (конечно, среди неудалённых). Ниже приведены рисунки нескольких возможных вариантов операции «D». Всевозможные некорректные операции (сдвиг курсора за границы строки, удаление всей строки) пока Поликарпом не поддержаны. Поликарп очень гордится своей разработкой, а сможете ли вы реализовать функциональность его редактора? Выходные данные Выведите правильную скобочную последовательность, полученную в результате выполнения всех операций. Примечание В первом тестовом примере изначально курсор находится в позиции 5. Рассмотрим действия редактора подробнее: - команда «R» — курсор передвигается вправо в позицию 6;
- команда «D» — удаляются скобки с позиции 5 до позиции 6. После этого ПСП принимает вид (())(), курсор находится в позиции 5;
- команда «L» — курсор передвигается влево в позицию 4;
- команда «D» — удаляются скобки с позиции 1 до позиции 4. После этого ПСП принимает вид (), курсор находится в позиции 1.
Таким образом, ответ равен ().
| |
|
|
C. Медвежонок и клетчатое поле
поиск в глубину и подобное
реализация
снм
*2400
Вам дано клетчатое поле из n строк и n столбцов. Каждая клетка либо пуста (обозначается символом «.»), либо занята (обозначается символом «X»). Две пустые клетки соединены напрямую, если у них есть общая сторона. Две клетки (r1, c1) (то есть клетка, расположенная в ряду r1 и столбце c1) и (r2, c2) соединены путём, если существует последовательность пустых клеток, начинающаяся с (r1, c1) и заканчивающаяся на (r2, c2), такая что любые две соседние клетки последовательности соединены напрямую. Компонентой связности называется множество пустых клеток, такое что любые две клетки множества соединены путём, и при этом никакая клетка множества не соединена путём ни с какой пустой клеткой не из этого множества. Ваш друг Лимак — большой медведь гризли, способный разрушать препятствия в некоторой области. Точнее, вы можете попросить Лимака разрушить все препятствия в некотором квадрате k × k, то есть превратить все занятые клетки в свободные. Однако попросить помощи у Лимака можно только один раз. Выбранный квадрат должен находиться строго внутри сетки. Возможно, что все клетки уже пусты и помощь Лимака вам никак не поможет. Вы любите большие компоненты связности. Какую самую большую компоненту связности можно получить, попросив Лимака о помощи не более одного раза? Выходные данные Выведите максимально возможный размер (количество клеток) одной компоненты связности после помощи Лимака. Примечание В первом примере Лимак может сделать пустыми все клетки в каком-нибудь квадрате размером 2 × 2. Оптимальный способ выбрать квадрат показан красным на левом рисунке ниже. Таким образом, можно получить компоненту связности размером 10 клеток, отмеченную синим на правом рисунке ниже.
| |
|
|
D. Разделение королевства II
графы
Перебор
снм
сортировки
Структуры данных
*2500
Давным-давно существовало великое королевство, которым правили Великий Арий и Пари Великая. У этих двоих были некоторые разногласия по вопросу любимых чисел, поэтому они решили разделить королевство между собой. Великое королевство состояло из n городов, пронумерованных целыми числами от 1 до n, и m двунаправленных дорог, пронумерованных от 1 до m. Длина i-й из этих дорог равняется wi. Великий Арий и Пари Великая договорились уничтожить некоторый префикс дорог (все дороги с номером меньше некоторого x) и некоторый суффикс дорог (все дороги с номером больше некоторого x), оставив таким образом дороги с номерами l, l + 1, ..., r - 1 и r. После этого они разделят королевство на две части (каждый город отойдёт ровно к одной из двух частей), такие что трудность разделения будет минимальна. Трудностью разделения называется максимальная длина дороги, такой что оба её конца принадлежат одной части. В случае если таких дорог вообще нет, трудность разделения полагается равной - 1. Историки обнаружили карту великого королевства и теперь обсуждают q возможных сценариев выбора параметров l и r великими правителями. По имеющимся данным для каждой гипотезы li, ri определите минимально возможную трудность разделения королевства. Выходные данные Для каждой догадки историков выведите минимально возможную трудность разделения королевства.
| |
|
|
D. Свопы в перестановке
математика
поиск в глубину и подобное
снм
*1700
Вам задана перестановка чисел 1, 2, ..., n, а также m пар позиций (aj, bj). На каждом шагу вы можете выбрать некоторую пару из заданного набора и поменять местами числа на этих позициях. Найдите лексикографически максимальную перестановку, которую можно получить такими операциями. Пусть p и q — это две перестановки чисел 1, 2, ..., n. Перестановка p считается лексикографически меньше перестановки q, если существует число 1 ≤ i ≤ n такое, что pk = qk для всех 1 ≤ k < i и pi < qi. Выходные данные Выведите строку с n различными целыми числами p'i (1 ≤ p'i ≤ n) — лексикографически максимальную перестановку, которую можно получить.
| |
|
|
E. ...Подожди...
Деревья
снм
Структуры данных
*3000
Барни ищет девушку своей мечты. Он живет в Нью-Йорке, который состоит из n перекрестков с номерами от 1 до n, соединенных n - 1 дорогами. Будем рассматривать Нью-Йорк как ориентированное дерево с корнем в перекрестке 1. В Нью-Йорке живут m девушек, i-я из них живет рядом с перекрестком номер ci, а ее вес исходно равен i килограмм. Барни считает, что девушка x лучше девушки y тогда и только тогда, когда: вес девушки x строго меньше веса девушки y, либо же они весят одинаково, но номер перекрестка, рядом с которым живет девушка x строго меньше соответствующего номера для девушки y, то есть cx < cy. Таким образом, среди любой пары девушек одна из них всегда лучше другой. В следующие q дней происходит по одному событию в день. Всего типов событий два: - Барни идет от перекрестка v до перекрестка u. На пути он подбирает не более k лучших девушек, которых он еще не приглашал и приглашает к себе домой, чтобы проверить, не является ли кто-то из них девушкой его мечты. Если на пути Барни находятся меньше чем k еще не приглашенных девушек, то Барни приглашает их всех.
- Девушки, живущие возле перекрестков в поддереве перекрестка v (включая сам перекресток v) набирают вес. В результате вес каждой из них увеличивается на k килограмм.
Ваша задача — для каждого события первого типа сообщить Барни номера девушек, которых он пригласит к себе домой во время этого события. Выходные данные Для каждого события первого типа выведите число t и t целых чисел g1, g2, ..., gt в одной строке, означающих, что во время этого события Барни пригласит t девушек, номера которых равны g1, ..., gt в порядке от лучшей к худшей по меркам Барни. Примечание В первом примере из условия: Описание событий: - Веса девушек в поддереве перекрестка 4 увеличиваются на 3. Номера этих девушек: 1, 3, 5, 4, 7.
- Барни идет от перекрестка 2 до перекрестка 1. На его пути встречаются девушки с номерами 1, 2, 3, 5, 6, 7 и весами 4, 2, 6, 8, 6, 10 соответственно. Он приглашает девушек 2 и 1.
- Барни идет от перекрестка 4 до перекрестка 2. На его пути встречаются девушки с номерами 3, 5, 7 и весами 6, 8, 10 соответственно. Барни приглашает девушку 3.
- Веса девушек в поддереве перекрестка 2 увеличиваются на 10. Неприглашенных девушек это не касается, и ничего интересного не происходит.
- Веса девушек в поддереве перекрестка 1 увеличиваются на 10. Номера этих девушек равны 4, 5, 6, 7.
- Барни идет от перекрестка 2 до перекрестка 4. На его пути встречаются девушки с номерами 5, 7 и весами 18, 20 соответственно. Барни приглашает девушку с номером 5.
- Барни идет от перекрестка 2 до перекрестка 3. На его пути нет девушек.
- Веса девушек в поддереве перекрестка 5 увеличиваются на 2. Единственная девушка там имеет номер 4.
- Веса девушек в поддереве перекрестка 4 увеличиваются на 9. Номера этих девушек: 4, 6, 7.
- Барни идет от перекрестка 3 до перекрестка 5. Единственная девушка на его пути имеет номер 4.
- Барни идет от перекрестка 1 до перекрестка 2. Девушки на его пути имеют номера 6, 7 и веса 16, 29 соответственно.
| |
|
|
B. Исправление дерева
графы
Деревья
Конструктив
поиск в глубину и подобное
снм
*1700
Дерево — это неориентированный связный граф без циклов. Рассмотрим корневое неориентированное дерево, состоящее из n вершин, пронумерованных от 1 до n. Существует несколько способов представлять такие деревья. Одним из наиболее популярных является массив предков, состоящий из n чисел p1, p2, ..., pn, где pi означает предка вершины i (в рамках данной задачи корень дерева считается предком самого себя). Для данного корневого дерева массив p равен [2, 3, 3, 2]. По данной последовательности p1, p2, ..., pn легко восстановить дерево: - Существует ровно один индекс r, такой что pr = r. Вершина r является корнем дерева.
- Для всех остальных n - 1 вершины i существует ребро между вершинами i и pi.
Последовательность p1, p2, ..., pn является корректной, если описанная выше процедура определяет некоторое (произвольное) корневое дерево. Например, для n = 3 последовательности (1,2,2), (2,3,1) и (2,1,3) не являются корректными. Вам дана последовательность a1, a2, ..., an, не обязательно являющаяся корректной. Вам требуется изменить минимальное количество элементов, чтобы последовательность стала корректной. Выведите минимальное необходимое количество изменений и пример любого ответа, который можно получить с их помощью. Если существует несколько корректных последовательностей, достижимых за минимальное количество изменений, то разрешается вывести любую. Выходные данные В первой строке выведите минимальное количество изменений, которое надо сделать, чтобы получить корректную последовательность. Во второй строке выведите любую корректную последовательность, которая может быть получена из (a1, a2, ..., an) за минимальное количество изменений. Если существует несколько таких последовательностей, то выведите любую. Примечание В первом примере достаточно изменить один элемент. В приведённом примере вывода последовательность представляет корневое дерево с корнем в вершине 4 (потому что p4 = 4), которое можно увидеть на левом рисунке. Одним из корректных решений будет являться последовательность 2 3 3 2, определяющая дерево с корнем в вершине 3 (правый рисунок). На обоих рисунках корни выделены красным. Во втором примере данная во входных данных последовательность уже является корректной.
| |
|
|
C. Цифровое дерево
Деревья
поиск в глубину и подобное
разделяй и властвуй
снм
*2700
У Кодера ZS'а есть большое дерево. Его можно представить как неориентированный связный граф из n вершин, пронумерованных от 0 до n - 1, и n - 1 ребер между ними. На каждом ребре записана одна ненулевая цифра. Однажды, Кодер ZS заскучал и решил исследовать некоторые параметры дерева. Он выбрал целое положительное M, которое является взаимно простым с 10, т.е. . ZS считает упорядоченную пару различных вершин (u, v) интересной, когда если бы он проследовал по кратчайшему пути от вершины u до вершины v и выписывал цифры, которые он встречает на своем пути, в том же порядке, он получил бы десятичную запись целого числа, делящегося на M. Формально, ZS считает упорядоченную пару различных вершин (u, v) интересной, если верно следующее: - Пусть a1 = u, a2, ..., ak = v — последовательность вершин на кратчайшем пути от u до v в порядке их встречи;
- Пусть di (1 ≤ i < k) — цифра, записанная на ребре между вершинами ai и ai + 1;
- Целое число
делится на M. Помогите Кодеру ZS'у найти количество интересных пар! Выходные данные Выведите единственное целое число — количество интересных (по мнению Кодера ZS'а) пар. Примечание В первом примере из условия интересными являются пары (0, 4), (1, 2), (1, 5), (3, 2), (2, 5), (5, 2), (3, 5). Числа, образуемые этими парами — 14, 21, 217, 91, 7, 7, 917 соответственно, все они кратны 7. Заметьте, что (2, 5) и (5, 2) считаются различными. 
Во втором примере из условия интересными являются пары (4, 0), (0, 4), (3, 2), (2, 3), (0, 1), (1, 0), (4, 1), (1, 4), и 6 из этих пар дают число 33, а 2 из них дают число 3333, и все они кратны 11. 
| |
|
|
C. Уничтожение массива
снм
Структуры данных
*1600
Вам дан массив, состоящий из n неотрицательных целых чисел a1, a2, ..., an. В этом массиве один за другим зачёркиваются числа. Вам задана перестановка чисел от 1 до n — порядок, в котором это происходит. После зачёркивания очередного числа вам необходимо найти в этом массиве подотрезок с максимальной суммой, не содержащий ни одного зачёркнутого числа. Сумму чисел в пустом подотрезке считайте равной 0. Выходные данные В выходной файл выведите n строк, каждая из которых должна содержать одно число — максимальную сумму на подотрезке заданного массива, не содержащем зачёркнутых чисел, после выполнения очередного действия. Примечание В первом тестовом примере происходит следующее: - Зачеркивается третий элемент, массив принимает вид 1 3 * 5. Отрезок с максимально суммой 5 состоит из одного числа 5.
- Зачеркивается четвертый элемент, массив принимает вид 1 3 * * . Отрезок с максимально суммой 4 состоит из двух чисел 1 3.
- Зачеркивается первый элемент, массив принимает вид * 3 * * . Отрезок с максимально суммой 3 состоит из одного числа 3.
- Зачеркивается оставшийся второй элемент, в этот момент непустых допустимых подотрезков не остается, поэтому здесь ответ равен нулю.
| |
|
|
D. Озёра в Берляндии
графы
жадные алгоритмы
поиск в глубину и подобное
реализация
снм
*1600
Карта Берляндии представляет собой прямоугольник размера n × m, состоящий из клеток размера 1 × 1. Каждая из клеток карты является либо сушей, либо водой. Со всех краёв Берляндия омывается океаном. Озёрами называются такие связные по сторонам максимальные по включению области из клеток с водой, которые не имеют общих границ с океаном. Другими словами, озеро — это область клеток с водой, такая что из любой клетки можно добраться до любой другой, не покидая озера, двигаясь только между соседними по стороне клетками, никакая из клеток не расположена на границе прямоугольника и нельзя добавить ещё одну клетку с водой, так что по-прежнему можно будет добраться от любой клетки до любой другой. Перед вами стоит задача засыпать землей минимальное количество клеток таким образом, чтобы в Берляндии стало ровно k озёр. Изначально на карте находятся не менее k озер. Выходные данные В первую строку выведите минимальное количество клеток, которые из воды нужно превратить в сушу. В следующие n строк выведите m символов — карта после внесения в неё изменений. Формат должен строго соответствовать формату карты из входных данных (размеры карты выводить не нужно). Если решений несколько, выведите любое из них. Гарантируется, что ответ всегда существует. Примечание В первом примере всего содержится два озера — первое состоит из клеток (2, 2) и (2, 3), а второе состоит из клетки (4, 3). Выгодно засыпать второе озеро, так как оно наименьшее по размеру. Обратите внимание, что участок воды в нижнем левом углу поля не является озером, так как этот участок граничит с океаном.
| |
|
|
F. st-остов
графы
жадные алгоритмы
реализация
снм
*2300
Вам задан связный неориентированный граф, состоящий из n вершин и m рёбер. Каждое ребро соединяет две различные вершины, любую пару вершин соединяет не более одного ребра. Также вам даны две различные вершины s и t, а также две величины ds и dt. Перед вами стоит задача построить любой остов заданного графа (обратите внимание, что граф невзвешенный), у которого степень вершины s не превышает ds, а степень вершины t не превышает dt, либо сообщить, что это невозможно. Остов (покрывающее дерево) графа G — такой его подграф, который является деревом и содержит все вершины графа G. Иными словами, это связный граф, содержащий n - 1 ребро и полученный из заданного графа G удалением некоторых рёбер. Степенью вершины называется число инцидентных этой вершине рёбер. Выходные данные Если ответа не существует, выведите в первую строку «No» (без кавычек). В противном случае в первую строку выведите «Yes» (без кавычек). В следующей (n - 1)-й строке выведите по два целых числа — описание рёбер остова. Каждое из рёбер остова должно быть выведено ровно один раз. Выводить ребра можно в любом порядке. Концы ребер также можно выводить в любом порядке. Если решений несколько, выведите любое из них.
| |
|
|
C. Носки
графы
жадные алгоритмы
поиск в глубину и подобное
снм
*1600
Арсений уже совсем взрослый и самостоятельный. Мама решила оставить его на m дней в одиночестве и уехать отдыхать в тёплые страны. Перед этим она наготовила ему много еды, оставила достаточное количество карманных денег и постирала всю одежду. Однако за десять минут до отъезда в тёплые страны ей пришла в голову мысль, что Арсению надо оставить точную инструкцию, какую одежду надевать в какой из дней её отсутствия. Арсений живёт в очень необычной семье, в которой вся одежда пронумерована: например, n носков Арсения имеют различными целые номера от 1 до n. Поэтому всё, что потребовалось его маме, это указать для каждого дня два числа li и ri — номера носков, которые надо надеть в i-й день на левую и правую ногу соответственно (разумеется, li не совпадает с ri). Каждый носок покрашен в один из k цветов. Уже после отъезда матери Арсений заметил, что в некоторые дни в соответствии с инструкцией ему придётся надеть носки разных цветов, что, конечно, является досадной оплошностью, вызванной спешкой перед отъездом при составлении инструкции. Но Арсений находчивый мальчик, и, по счастливому совпадению, он нашёл у себя дома банки с красками всех k цветов, которые встречаются среди его носков. Арсений собирается перекрасить некоторые носки таким образом, чтобы, следуя инструкции, оставленной его мамой, на протяжении каждого из m дней носить одноцветные носки. Арсений уже запланировал деловые встречи в каждый день отсутствия мамы, в течение которых у него не будет возможности заниматься перекраской носков, поэтому он должен определиться с цветами и провести всю работу именно сейчас. Он хочет как можно быстрее расправиться с этой задачей, чтобы отправиться играть в недавно вышедшую суперпопулярную игру Bota-3, поэтому он просит вас помочь определить минимальное количество носков, которое ему придётся перекрасить, чтобы в каждый день надевать два одноцветных носка. Выходные данные Выведите единственное целое число — минимальное количество носков, которые Арсений должен перекрасить, чтобы не насмешить людей разноцветными носками ни в один из дней отсутствия мамы. Примечание В первом примере Арсений может, например, перекрасить первый и третий носки во второй цвет. Во втором примере ничего перекрашивать не придётся.
| |
|
|
F. Недовольство автомобилистов
графы
Деревья
снм
Структуры данных
*2200
В одном королевстве имеется n городов и m двусторонних дорог. Каждая дорога соединяет пару городов, причём для каждой дороги известен уровень недовольства ею автомобилистами — величина wi. Для каждой дороги известна величина ci — сколько надо потратить лямзиков, чтобы уменьшить уровень недовольства этой дорогой на единицу. Таким образом, чтобы уменьшить недовольство i-й дорогой на k, надо потратить k·ci лямзиков. При этом допустимо, чтобы недовольство стало нулевым или даже отрицательным. В соответствии с приказом короля, необходимо выбрать n - 1 дорогу, сделав их главными дорогами. Должно выполняться важное условие: из любого города должно быть возможно проехать в любой другой по главным дорогам. У министерства дорог есть бюджет S лямзиков на проведение реформы. Министерство планирует потратить этот бюджет на ремонт некоторых дорог (то есть уменьшить недовольство ими), а уже затем выбрать n - 1 главную дорогу. Помогите потратить бюджет так, а затем и произвести выбор главных дорог, чтобы суммарное недовольство главными дорогами было как можно меньше. При этом величина недовольства некоторыми дорогами может стать отрицательной. Не обязательно тратить весь бюджет S полностью. Гарантируется, что из любого города королевства можно добраться по дорогам в любой другой город королевства. Каждая дорога в королевстве — двусторонняя. Выходные данные В первой строке выведите K — минимально возможное суммарное недовольство главными дорогами. В следующих n - 1 строках выведите по два целых числа x, vx — означающих, что дорога x является главной, и дорога x после реформы имеет уровень недовольства vx. Считайте, что дороги пронумерованы от 1 до m в порядке их задания во входных данных. Номера рёбер можно выводить в произвольном порядке. Если решений несколько, выведите любое.
| |
|
|
C. Бильярд на шахматной доске
графы
поиск в глубину и подобное
снм
теория чисел
*2100
Ход шахматной фигуры бильярдный шар похож на ход шахматной фигуры слон, с тем лишь различием, что при столкновении с границей доски бильярдный шар может от нее отразиться и продолжить движение. Более формально — сначала выбирается одно из четырех диагональных направлений и бильярдный шар движется в этом направлении. Попав на клетку, находящуюся на границе доски, бильярдный шар отражается от нее — изменяет направление своего движения на 90 градусов — и продолжает свое движение. В частности, попав в угловую клетку, бильярдный шар делает сразу 2 отражения и начинает двигаться в обратную сторону. В ходе своего движения бильярдный шар может сделать неограниченное число отражений. В любой клетке своей траектории шар может остановиться и на этом ход считается законченным. Считается, что один бильярдный шар a бьет другой бильярдный шар b если a может сходить в ту клетку, где находится b. Вам предлагается найти максимальное количество попарно не бьющих друг друга бильярдных шаров, которые можно разместить на шахматной доске размера n × m. Выходные данные Выведите одно число — максимальное возможное количество попарно не бьющих друг друга бильярдных шаров. Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать поток cin (также вы можете использовать спецификатор %I64d).
| |
|
|
B. Хрупкий амфитеатр Arpa и ценные девушки Mehrdad
дп
поиск в глубину и подобное
снм
*1600
Просто напоминаю, некоторые девушки в стране Arpa по-настоящему красивы. Mehrdad хочет пригласить некоторых девушек во дворец на танцы. У каждой девушки есть некоторый вес wi и некоторая красота bi. Также, у каждой девушки могут быть друзья среди других девушек. Девушек можно разделить на группы по дружбе. Две девушки x и y находятся в одной группе по дружбе, если и только если существует последовательность девушек a1, a2, ..., ak такая, что ai дружит с ai + 1 для каждого 1 ≤ i < k, а a1 = x и ak = y. Arpa предоставил амфитеатр для вечеринки Mehrdad. Амфитеатр может выдержать суммарный вес не более w. Mehrdad настолько жадный, что хочет пригласить некоторых девушек так, чтобы их суммарный вес не превышал w, а их суммарная красота была максимальна. При этом, из каждой группы по дружбе он может пригласить либо всех девушек, либо не более одной, иначе кто-нибудь обидится. Найдите для Mehrdad наибольшую суммарную красоту девушек, которых он может пригласить так, чтобы никто не обиделся, а суммарный вес не превысил w. Выходные данные Выведите наибольшую суммарную красоту девушек, которых Mehrdad может пригласить так, чтобы никто не обиделся, а суммарный вес не превысил w. Примечание В первом тесте из условия две группы по дружбе: девушки {1, 2}, а также девушка {3}. Лучший способ — пригласить всех девушек из первой группы, их суммарный вес будет равен 5, а суммарная красота — 6. Во втором тесте из условия также две группы по дружбе: девушки {1, 2, 3}, и девушка {4}. Mehrdad не может пригласить всех девушек из первой группы, т. к. их суммарный вес 12 > 11, поэтому лучше всего пригласить первую девушку из первой группы, и единственную девушку из второй. Суммарный вес будет равен 8, а суммарная красота — 7.
| |
|
|
H. Новый год и заснеженное клетчатое поле
графы
интерактив
поиск в глубину и подобное
снм
*3500
Обратите внимание на информацию о том как сбрасывать буфер вывода (делать операцию 'flush'), указанную в секции «Выходные данные». Беарляндия представляет из себя клетчатое поле, состоящее из h строк и w столбцов. Строки пронумерованы от 1 до h сверху вниз. Столбцы пронумерованы от 1 до w слева направо. Каждая клетка является либо свободной (обозначается символом «.» во входных данных) либо постоянно заблокированной (обозначается символом «#»). Беарляндия — холодная страна и снегопады часто затрудняют путешествия. Каждый день некоторое небольшое количество клеток оказываются временно заблокированными из-за снега. Обратите внимание, что такая блокировка клетки работает только внутри одного конкретного дня и на следующий день любые из заблокированных клеток могут оказаться свободными (если только они не будут снова временно заблокированы). Между двумя клетками можно перемещаться напрямую, если у них есть общая сторона и ни одна из них не является ни постоянно ни временно заблокированной. Лимак — маленький полярный медвежонок, которой живёт в Беарляндии. Его дом расположен в левой верхней клетке поля, а школа в правой нижней клетке. Каждый день Лимак ходит из дома в школу и затем возвращается обратно домой. Поскольку Лимак очень легко может заскучать, то он не хочет посещать одну и ту же клетку дважды в течение одного дня, за исключением клетки с его домом, где он начинает и заканчивает свой маршрут. Если Лимак может дойти до школы, а потом вернуться домой не посещая никакую клетку второй раз, то он называет такой день интересным. Вам требуется последовательно обработать q дней. Для каждого из дней вам требуется проверить является ли он интересным или нет, и соответственно вывести «YES» или «NO» на отдельной строке. Описание следующего дня будет доступно только после того как выведите ответ на текущий и выполните операцию 'flush'. Гарантируется, что если в некоторый день ни одна клетка поля не является временно заблокированной, то такой день является интересным. Также гарантируется, что клетка, в которой расположен дом Лимака, и клетка, в которой расположена школа никогда не будут заблокированы (ни постоянно, ни временно). Выходные данные Для каждого из q дней выведите «YES», если данный день является интересным и «NO» в противном случае. После вывода ответа не забудьте вывести символ перевода строки и сделать операцию 'flush', после чего можно будет считать описание следующего дня. Если вы ничего не выведите или забудете сделать операцию 'flush', то можете получить вердикт Idleness Limit Exceeded. Для сброса буфера вывода (то есть для операции 'flush') сразу после вывода числа или ответа и перевода строки можно сделать: - fflush(stdout) в языке C++;
- System.out.flush() в Java;
- stdout.flush() в Python;
- flush(output) в Pascal;
- смотрите документацию для других языков.
Примечание Первый пример состоит из 4 дней. На рисунке ниже показаны возможные маршруты Лимака из дома в школу и обратно для второго и третьего дня (на левом и правом рисунках соответственно). Постоянно заблокированные клетки закрашены красным, а временно заблокированные оранжевым. Чёрные и зелёные стрелочки показывают как Лимак будет идти в школу и обратно соответственно. Ниже изображено как будет выглядеть поле в каждый из дней второго примера, здесь «#» означает постоянно или временно заблокированную клетку.
| |
|
|
C. Польшар и Лес
графы
Деревья
интерактив
поиск в глубину и подобное
снм
*1300
Польшар и его семья живут в лесу. Лес состоит из деревьев. Деревом называется неориентированный ациклический граф с k вершинами и k - 1 ребрами, где k — некоторое целое число. Заметьте, что изолированная вершина является корректным деревом. В каждой вершине каждого дерева живет ровно один родственник, они пронумерованы от 1 до n. Для каждого шара i нам известен номер самого дальнего от него родственника, живущего на том же дереве. Если существует несколько таких родственников, нам известен лишь наименьший номер среди них. Сколько же деревьев в лесу? Выходные данные Выведите число деревьев в лесу, где живет Польшар. Протокол взаимодействия Технически данная задача является интерактивной. Однако, это никак не влияет на вас (кроме взломов), т. к. никакого взаимодействия нет. Примечание В первом примере лес выглядит так: 1-2 3-4-5. Всего здесь 2 дерева. Во втором примере единственный возможный граф это одна вершина и ни одного ребра. Поэтому здесь всего одно дерево.
| |
|
|
A. Подарок
графы
Деревья
снм
сортировки
*2200
В королевстве Олимпия находится N городов и M двусторонних дорог, каждая из которых соединяет ровно два города. Между двумя городами может быть более одной дороги. Дорога может соединять город с самим собой, образуя петлю. Все дороги постоянно грабятся разбойниками. В последнее время разбойникам надоело тратить силы на грабеж и они обратились к могущественному и справедливому королю Олимпии с коммерческим предложением. Согласно этому предложению король должен отправить разбойникам подарок, состоящий из золотых и серебряных монет. В ответ на любезность короля разбойники прекратят грабить определенные дороги. Для каждой из дорог установлено: gi — минимальное количество золотых и si — минимальное количество серебряных монет в подарке, чтобы ее грабеж закончился. То есть, если в подарке a золотых и b серебряных монет, то прекращается грабеж всех дорог, для которых gi ≤ a и si ≤ b. В казне короля нет ни одной золотой или серебряной монеты, но есть Олимпийские Тугрики. Цена одной золотой монеты в тугриках — G, а серебряной — S. Король хочет, чтобы после отправки подарка разбойникам между каждой парой городов существовал хотя бы один безопасный путь, который, возможно, проходит через другие города. Ваше задание найти минимальное количество тугриков, которую нужно потратить королю для того, чтобы получить безопасные пути между каждой парой городов в королевстве. Выходные данные Единственная строка должна содержать минимальное количество тугриков, которое нужно потратить королю на покупку золотых и серебряных монет, чтобы достичь своей цели. Выведите , в случае, если никакое количество тугриков не поможет.
| |
|
|
A. Тимофей и береза
графы
Деревья
дп
поиск в глубину и подобное
реализация
снм
*1600
Каждый Новый Год Тимофей и его друзья рубят в лесу дерево из n вершин и приносят его домой. Чтобы получше его украсить, они превращают его в березу. Береза — дерево из n вершин, каждая вершина i которого покрашена в какой-то цвет ci. Но вот настал день рождения, и мама Тимофея попросила его вынести березу. Тимофей выносит березу так: хватает за какую-то вершину, остальные вершины опускаются вниз, и дерево становится подвешенным за вершину, за которую он схватил. После этого он идет с ним на улицу и выкидывает. Попытавшись ухватить березу, Тимофей понял, что его раздражают разноцветные переливы. Поддерево раздражает Тимофея, если в нем есть вершины разных цветов. Он хочет найти, за какую вершину ему нужно взяться, чтобы ни одно поддерево не раздражало его. При этом он не рассматривает все дерево целиком как поддерево, потому что он не видит цвет корневой вершины. Поддерево некоторой вершины — это подграф, содержащий эту вершину и всех ее потомков. Определите, есть ли вершина, схватившись за которую, Тимофей не будет раздражен. Выходные данные В первой строке выведите «NO», если Тимофей не может взять березу так, чтобы его ничто не раздражало. В противном случае выведите «YES», а в следующей строке выведите номер вершины, за которую Тимофею нужно схватить березу. Если существует несколько ответов, выведите любой.
| |
|
|
E. Тимофей и братья наши меньшие
разделяй и властвуй
снм
Структуры данных
*2900
После празднования дня рождения Тимофей пошел на свою любимую березовую аллею, чтобы покормить своих любимых птиц — ворон. Вороны уже привыкли к маленькому Тимофею, поскольку он очень добрый и заботливый мальчик — постоянно подкармливает своих любимцев. Как известно, на каждой березе живет ровно одно семейство ворон. Березы в аллее стоят в ряд и пронумерованы от 1 до n. Также известно, что некоторые семейства дружат между собой. По некоторым причинам одно семейство может дружить с другим, только если они живут на достаточно близком расстоянии, а именно, между любыми двумя дружащими семействами должна быть не более чем k - 1 береза. Более формально, семейство, живущее на дереве u, может дружить с семейством, живущим на дереве v, только если |u - v| ≤ k. Одно из проявлений дружбы заключается в том, что если некоторое семейство узнает, что Тимофей где-то кормит ворон, то оно немедленно сообщит об этом всем семействам, с которыми оно дружит. Таким образом, после того, как Тимофей начнет кормить ворон около некоторой березы, к месту кормежки слетятся все семейства, которые дружат с семейством, живущим на этой березе, непосредственно или через цепочку нескольких дружественных отношений. Разумеется, обитатели данной березы тоже слетятся. Сегодня Тимофей пришел на аллею, и обнаружил, что все семейства, живущие на березах с номерами, строго меньшими l или строго большими r, куда-то улетели. Таким образом, передача информации о кормежке через них невозможна. Кроме того, кормить их также не нужно. Помогите Тимофею узнать, возле какого минимального числа берез Тимофею необходимо покормить ворон, чтобы все оставшиеся семейства узнали о кормежке. Вам дано несколько возможных ситуаций, определяемых числами l и r, и требуется посчитать ответ для каждой из них. Выходные данные Выведите q строк: в i-той строке должно быть одно число — ответ на i-ю ситуацию. Примечание В первом примере дружат пары семейств (1, 3), (2, 3) и (4, 5). - В первой ситуации осталось только первое семейство, поэтому ответ 1.
- Во второй ситуации остались первые два семейства, при этом они не дружат непосредственно, а значит ответ 2.
- В третьей ситуации семейства 2 и 3 дружат, поэтому достаточно покормить любое из них, ответ 1.
- В четвертой ситуации можно покормить, например, первое семейство, от него о кормежке узнает третье, а он него — второе. Ответ 1.
- В пятой ситуации достаточно покормить первое и пятое семейства, ответ 2.
| |
|
|
D. Артем и Сандерс
Конструктив
математика
снм
*1700
У Артема есть друг Сандерс из университета Чикаго. Сандерс предложил Артему следующую задачу. Обозначим за [n] множество {1, ..., n}. Также мы будем использовать обозначение f: [x] → [y], чтобы показать, что функция f имеет значения в точках 1, ..., x, и все эти значения — целые числа от 1 до y. Итак, вам дана функция f: [n] → [n]. Ваша задача в том, чтобы найти целое положительное число m и две функции g: [n] → [m], h: [m] → [n], такие что g(h(x)) = x для всех и h(g(x)) = f(x) для всех , либо определите, что найти их невозможно. Выходные данные Если найти требуемые функции невозможно, выведите -1. Иначе, на первой строке выведите число m (1 ≤ m ≤ 106). На второй строке выведите n чисел g(1), ..., g(n). На третьей строке выведите m чисел h(1), ..., h(m). Если существует несколько верных ответов, вы можете вывести любой из них. Гарантируется, что если ответ существует, то также существует ответ, подходящий под указанные ограничения.
| |
|
|
D. Махмуд и словарь
графы
дп
поиск в глубину и подобное
снм
Структуры данных
*2000
Махмуд хочет составить новый словарь, содержащий n слов и отношения между ними. Бывает два типа отношений: синонимичность (что значит, что два слова означают одно и тоже) и антонимичность (что значит, что два слова означают противоположные вещи). Время от времени он узнает новые отношения между некоторыми словами. Махмуд знает, что если между двумя словами есть отношение, то каждое из этих слов имеет отношения со всеми словами, которые имеют отношения к другому слову из пары. Например, если like означает то же, что и love, и love — противоположность hate, то like — тоже противоположность hate. Еще один пример: если love — противоположность hate, и hate — противоположность like, то love — то же, что и like, и так далее. Иногда Махмуд узнает неверное отношение. Неверное отношение это такое отношение, которое делает два слова одним и тем же и противоположностями одновременно. Например, если он знает, что love — то же, что и like, и like — противоположность hate, и затем узнает, что hate — то же, что и like, то последнее отношение, конечно, неверное, потому что оно делает hate и like антонимами и синонимами одновременно. После того, как Махмуд узнал много отношений между словами, он обеспокоился тем, что некоторые отношения могут быть неверными. Он решил рассказать о каждом отношении знакомому программисту Ехабу. Махмуд хочет знать для каждого отношения, верное оно или неверное, основываясь на отношениях, которые он узнал раньше. Если отношение неверное, то Махмуд его игнорирует и не использует его для проверки последующих отношений. После того, как Махмуд расскажет о всех отношениях, он спросит Ехаба об отношениях между некоторыми словами, основываясь на информации, которую дал. Ехаб занят подготовкой раунда Codeforces, поэтому вы должны ему помочь. Выходные данные В начале выведите m строк, по одной на каждое отношение. Если некоторое отношение неверно (т. е. делает два слова синонимами и антонимами одновременно), выведите «NO» (без кавычек) и игнорируйте его, иначе выведите «YES» (без кавычек). После этого выведите q строк, по одной на каждый вопрос. Если два слова синонимы, выведите 1. Если они антонимы, выведите 2. Если между ними нет отношения, выведите 3. Обратите внимание на тесты из условия для лучшего понимания.
| |
|
|
C. Боброжуй-0xFF
Деревья
дп
жадные алгоритмы
поиск в глубину и подобное
снм
*2100
«Съел бобра — спас дерево!» — именно под таким девизом пройдёт срочный слёт экологов в городе Бобруйске. А всё дело в том, что популяция бобров на земном шаре достигла невероятных размеров! Каждый день их количество увеличивается в разы, а они даже и не догадываются, какой ущерб приносит природе и человечеству их нездоровая любовь к древесине. Количество кислорода в атмосфере упало до 17 процентов, и, как считают лучшие умы мира, это далеко не предел. В середине 50-х годов прошлого века группа советских учёных смогла спрогнозировать ситуацию с бобрами и разработала секретную технологию по очистке территории под таинственным названием «Боброжуй-0xFF». Теперь судьба планеты лежит на хрупких плечах всего нескольких людей, отдавших свою жизнь науке. Прототип уже готов, теперь нужно срочно проводить его испытания в полевых условиях. Вам дано дерево, сплошь усеянное бобрами. Дерево состоит из n вершин, в i-ой вершине расположилось ki бобров. Напомним, дерево — это связный неориентированный граф без циклов. «Боброжуй-0xFF» работает по следующему принципу: находясь в некоторой вершине u, он может перейти к вершине v, если они соединены ребром, и съесть ровно одного бобра из тех, что находятся в вершине v. Переместиться в вершину v невозможно, если в ней не осталось бобров. «Боброжуй-0xFF» не может просто так стоять в какой-то вершине и есть там бобров. Он должен двигаться без остановок. Почему «Боброжуй-0xFF» работает именно так? Потому что разработчики не предусмотрели место в нём для аккумулятора, а поедание бобров необходимо для перегона их массы в чистую энергию. Гарантируется, что бобры будут находиться в шоке от происходящего, поэтому не смогут перемещаться по дереву. В свою очередь, «Боброжуй-0xFF» может перемещаться по каждой ветке в обоих направлениях сколько угодно раз, пока условия, описанные выше, выполняются. Корень дерева находится в вершине s. Это значит, что «Боброжуй-0xFF» начинает свою миссию в вершине s и обязательно должен в неё же вернуться в конце испытания, потому что снимать его с большой высоты никто не намерен. Определите максимальное количество бобров, которое сможет съесть «Боброжуй-0xFF», вернувшись при этом в стартовую вершину. Выходные данные Нужно вывести единственное число — максимальное возможное число бобров, съеденных «Боброжуем-0xFF». Пожалуйста, не используйте спецификатор %lld для записи 64-х битовых чисел на С++. Рекомендуется использовать поток cout (также вы можете использовать спецификатор %I64d).
| |
|
|
A. Мишка и условие дружбы
графы
поиск в глубину и подобное
снм
*1500
Мишка Лимак исследует социальную сеть. Основная ее функциональность заключается в том, что два пользователя могут стать друзьями (в таком случае они могут обмениваться сообщениями и смешными картинками). Сейчас в социальной сети n пользователей, они пронумерованы от 1 до n. Ровно m пар из них являются друзьями. Конечно. никакой пользователь не может быть другом с самим собой. Пусть запись A-B означает, что пользователи A and B друзья. Лимак считает, что социальная сеть обоснована, если и только если выполняется следующее условие: для любых трех различных пользователей (X, Y, Z) если X-Y и Y-Z, то также X-Z. Например, если Алан и Боб друзья, и Боб и Цири друзья, то Алан и Цири тоже должны быть друзьями. Можете помочь Лимаку и проверить, что социальная сеть обоснована? Выведите «YES» или «NO» без кавычек в соответствии с результатом. Выходные данные Если данная социальная сеть обоснована, выведите в единственную строку «YES» (без кавычек). Иначе выведите в единственную строку «NO» (без кавычек). Примечание Рисунки ниже показывают социальную сеть в первом (слева) и во втором (справа) примерах. Кружки обозначают пользователей, а линии означают, что два пользователя являются друзьями. Во втором примере ответ «NO», потому что пользователи (2, 3) друзья, пользователи (3, 4) тоже друзья, а пользователи (2, 4) — нет.
| |
|
|
D. Задача о дверях
2-sat
графы
поиск в глубину и подобное
снм
*2000
Мориарти поймал n человек в n различных комнатах гостиницы. Двери в некоторые комнаты заперты, в остальные открыты. Однако, существует условие, что люди могут спастись только когда все двери будут открыты одновременно. Есть m переключателей. Каждый переключатель контролирует двери в некоторые комнаты, однако, каждая дверь контролируется ровно двумя переключателями. Вам дано изначальное положение каждой двери. При изменении положения любого переключателя, то есть при включении его, когда он выключен, или выключении, когда он включен, меняется положение каждой двери, которые контролирует этот переключатель. Например, мы изменили положение переключателя 1, который подключен к дверям 1, 2, и 3, которые были в состояниях заперто, открыто и открыто. Тогда их состояния изменятся на открыто, закрыто и закрыто, соответственно. Ваша задача сказать Шерлоку, существует ли способ открыть все двери одновременно. Выходные данные Выведите "YES" без кавычек, если возможно открыть все двери одновременно, иначе выведите "NO" без кавычек. Примечание Во втором примере изначальные состояния дверей равны [1, 0, 1] (0 — закрыта, 1 — открыта). После переключения переключателя 3, мы получаем [0, 0, 0], что значит, что все двери закрыты. Затем, после переключения переключателя 1, мы получим [1, 1, 1], что значит, что все двери открыты. Можно показать, что в первом и третьем примере невозможно открыть все двери одновременно.
| |
|
|
C. Петрович — полиглот
Деревья
Перебор
поиск в глубину и подобное
снм
Строки
хэши
*2500
Петрович обожает изучать новые языки, но самое любимое его увлечение — составление своих собственных. Языком Петрович называет множество слов, а словом — последовательность маленьких букв латинского алфавита. Каждое утро Петрович составляет свой новый язык. Хранить все языки в явном виде очень сложно, поэтому Петрович придумал веник — специальную структуру данных для хранения языка, представляющую собой подвешенное дерево, на ребрах которого написаны буквы. Перед придумыванием языка веник представляет одну вершину — корень. При добавлении нового слова в язык Петрович встает в корень веника и обрабатывает буквы слова по одной. Пусть Петрович стоит в вершине u. Если из u есть ребро, на котором написана текущая буква, он переходит по нему. Иначе же, Петрович добавляет ребро из u в новую вершину v, пишет на нем текущую букву и переходит по этому ребру. Размером веника Петрович называет количество вершин в нем. Вечером, приходя со смены, Петрович не может понять язык, придуманный утром: он ему кажется слишком сложным. Тогда Петрович старается упростить свой язык. Упрощением языка Петрович называет удаление букв из некоторых слов языка. Формально, Петрович фиксирует некоторое целое положительное число p, берет все слова, содержащие хотя бы p букв, и выкидывает из каждого из них букву с номером p. Буквы в слове Петрович предпочитает нумеровать, начиная с 1. Петрович считает, что при упрощении языка хотя бы одно слово должно измениться, то есть в языке должно быть хотя бы слово с длиной хотя бы p. Так как Петрович стремится сделать язык, придуманный утром, как можно проще, он старается подобрать число p таким образом, чтобы минимизировать размер веника, в котором он будет хранить язык. Петровичу надоело заниматься одним и тем же каждый вечер, поэтому он обратился за помощью к вам. Напишите программу, которая будет находить минимальный размер веника, который может получиться в результате упрощения языка, придуманного Петровичем, и число p, которое нужно выбрать, чтобы получить такой размер. Выходные данные В первой строке выведите минимальный возможный размер веника, который может получиться в результате упрощения языка. Во второй строке выведите число p, которое следует выбрать Петровичу для получения минимального размера. Если таких чисел p несколько, выведите минимальное из них. Примечание 
Веник из второго примера может быть составлен из множества слов «piece», «of», «pie», «pretty», «prefix». После упрощения языка с p = 2 получается язык из слов «pece», «o», «pe», «petty», «pefix». Этот язык и задаёт веник минимального возможного размера.
| |
|
|
B. Странное путешествие
графы
Комбинаторика
Конструктив
поиск в глубину и подобное
снм
*2100
Маленький мальчик Игорь решил стать путешественником. Сначала он решил обойти все города в своей родной стране Ужляндии. Как известно, в Ужляндии n городов, соединенных m двусторонними дорогами. Также известно, что между любыми двумя городами существует не больше одной дороги, но могут существовать дороги которые начинаются и заканчиваются в одном городе. Игорь решил спланировать свое путешествие заранее. Он называет хорошим путь, который посещает m - 2 дороги дважды, а остальные 2 дороги — по одному разу. Хороший путь начинается и заканчивается в любом городе. Не обязательно заканчивать путь в том же городе, в котором он начался. Теперь Игорю стало интересно, сколько же путей его устраивают? Он считает два хороших пути различными, если различаются множества дорог, по которым он пройдет один раз. Помогите Игорю — посчитайте количество различных хороших путей. Выходные данные Выведите одно целое число — количество различных хороших путей. Примечание В первом тестовом примере хорошими являются пути: - 2 → 1 → 3 → 1 → 4 → 1 → 5,
- 2 → 1 → 3 → 1 → 5 → 1 → 4,
- 2 → 1 → 4 → 1 → 5 → 1 → 3,
- 3 → 1 → 2 → 1 → 4 → 1 → 5,
- 3 → 1 → 2 → 1 → 5 → 1 → 4,
- 4 → 1 → 2 → 1 → 3 → 1 → 5.
Кроме того, существуют хорошие пути, которые совпадают с каким-то из перечисленных выше, потому что совпадают множества дорог, по которым Игорь пройдет один раз: - 2 → 1 → 4 → 1 → 3 → 1 → 5,
- 2 → 1 → 5 → 1 → 3 → 1 → 4,
- 2 → 1 → 5 → 1 → 4 → 1 → 3,
- 3 → 1 → 4 → 1 → 2 → 1 → 5,
- 3 → 1 → 5 → 1 → 2 → 1 → 4,
- 4 → 1 → 3 → 1 → 2 → 1 → 5,
- и все эти пути в обратную сторону.
Таким образом, ответ равен 6. Во втором примере Игорь не может пройти по всем дорогам. В третьем примере он пройдет по одному разу по каждой из дорог.
| |
|
|
E. По парам
графы
Деревья
дп
поиск в глубину и подобное
реализация
снм
*2700
В классе у Поликарпа учится n человек (включая его самого). Недавно все ученики класса писали сочинение «Мой лучший друг». Сочинение каждого ученика было посвящено одному из учеников класса — лучшему другу. Заметим, что вовсе не обязательно у ученика b лучшим другом является ученик a, если у a лучший друг — b. А сейчас учительница ведет весь класс в музей истории спортивного программирования. Учеников ждут захватывающие истории о легендарных героях: tourist, Petr, tomek, SnapDragon — вот о ком пойдет речь! Учительница решила разбить учеников на пары так, чтобы каждая пара состояла из ученика и его лучшего друга. Возможно, ей не удастся разбить всех учеников на пары, не беда — она хочет выделить наибольшее количество таких пар. Если существует более одного варианта сделать это, она хочет выделить пары так, чтобы пар мальчик-девочка было как можно больше. Конечно, каждый ученик должен входить не более чем в одну пару. Выходные данные В первую строку выведите два числа t, e, где t — максимальное количество образованных пар, а e — максимальное количество среди них пар вида мальчик-девочка. Далее выведите t строк, каждая из строк должна содержать пару ai, bi (1 ≤ ai, bi ≤ n) — номера учеников в i-ой паре. Пары выводите в любом порядке. Числа в парах выводите в любом порядке. Если существует несколько решений, выведите любое. Примечание Рисунок ниже соответствует первому примеру. На нем ромбы обозначают мальчиков, а квадраты — девочек. Стрелки ведут от ученика к его лучшему другу, жирные (не пунктирные) обозначают пары из ответа.
| |
|
|
E. Владик и занимательные флаги
графы
снм
Структуры данных
*2600
В свободное время Владик оценивает красоту флагов. Флаг можно представить как матрицу n × m из целых положительных чисел. Определим красоту матрицы, как количество пятен в ней. Пятном назовем некоторое множество клеток с одинаковыми числами таких, что между любой парой клеток множества существует путь по смежным по стороне клеткам. Пример разделения матрицы на пятна: Но в этот раз он решил что-то поменять и начать оценивать не весь флаг целиком, а только некоторый его отрезок. Отрезок флага можно описать как подматрицу матрицы флага с противоложными углами в (1, l) и (n, r), где 1 ≤ l ≤ r ≤ m. Помогите Владику посчитать красоту для некоторых отрезков флага! Выходные данные Для каждого отрезка в отдельной строке выведите количество пятен на нем. Примечание Разделение на пятна для каждого отрезка: 
| |
|
|
F. Проверка на двудольность
графы
снм
Структуры данных
*2500
Дан неориентированный граф, состоящий из n вершин. Изначально в графе нет рёбер. Также даны q запросов; каждый запрос либо добавляет ребро в граф, либо удаляет ранее добавленное. После каждого запроса необходимо проверить, что граф двудольный (т. е. можно покрасить все вершины в два цвета так, чтобы ни одно ребро не соединяло две вершины одного цвета). Выходные данные Выведите q строк. В i-й строке должно быть записано YES, если граф является двудольным после i-го запроса, и NO в противном случае.
| |
|
|
D. Несбалансированный массив
разделяй и властвуй
снм
сортировки
Структуры данных
*1900
Дан массив a, состоящий из n элементов. Назовём дисбалансом некоторого подотрезка массива разность между максимумом и минимумом на этом подотрезке. Дисбаланс всего массива — сумма дисбалансов всех подотрезков этого массива. Например, дисбаланс массива [1, 4, 1] равен 9, так как его 6 подотрезков имеют следующий дисбаланс: - [1] (с позиции 1 до позиции 1), дисбаланс равен 0;
- [1, 4] (с позиции 1 до позиции 2), дисбаланс равен 3;
- [1, 4, 1] (с позиции 1 до позиции 3), дисбаланс равен 3;
- [4] (с позиции 2 до позиции 2), дисбаланс равен 0;
- [4, 1] (с позиции 2 до позиции 3), дисбаланс равен 3;
- [1] (с позиции 3 до позиции 3), дисбаланс равен 0;
Ваша задача — вычислить дисбаланс массива a. Выходные данные Выведите одно целое число — дисбаланс массива a.
| |
|
|
A. Сортировка подпоследовательностями
математика
поиск в глубину и подобное
реализация
снм
сортировки
*1400
Дана последовательность a1, a2, ..., an, состоящая из различных целых чисел. Требуется разбить эту последовательность на максимальное число подпоследовательностей так, чтобы после сортировки по возрастанию чисел внутри каждой из них итоговая последовательность также оказалась отсортированной по возрастанию. Под сортировкой по возрастанию чисел внутри подпоследовательности понимается процесс, в котором числа, входящие в подпоследовательность, упорядочиваются по возрастанию, а числа, не входящие в подпоследовательность, не меняют свои позиции. При разбиении последовательности на подпоследовательности каждый элемент должен войти ровно в одну подпоследовательность. Выходные данные В первой строке выведите максимальное число подпоследовательностей k, на которое можно разбить исходную последовательность, выполнив условие задачи. В следующих k строках выведите описание подпоследовательностей в следующем формате: количество элементов в подпоследовательности ci (0 < ci ≤ n), а затем ci целых чисел l1, l2, ..., lci (1 ≤ lj ≤ n) — индексы этих элементов в исходной последовательности. Индексы можно выводить в любом порядке. Каждый индекс от 1 до n должен присутствовать в выводе ровно один раз. Если возможных ответов несколько, выведите любой из них. Примечание Пояснение к ответу на первый сэмпл: После сортировки первой подпоследовательности мы получим последовательность 1 2 3 6 5 4. После сортировки второй подпоследовательности ничего не изменится. После сортировки третьей подпоследовательности мы получим последовательность 1 2 3 4 5 6. После сортировки последней подпоследовательности ничего не изменится.
| |
|
|
E. Сторожевые башни
Бинарный поиск
геометрия
графы
снм
сортировки
*2600
В одном далеком-предалеком королевстве живет жадный-прежадный король. Для защиты своих владений он построил n сторожевых башен. Помимо башен, в королевстве есть две армии, во главе каждой из которых стоит властный и самодовольный генерал. Генералы терпеть не могут друг друга, в частности, они никогда не допустят, чтобы в одной из башен находились солдаты обеих армий. Во время оборонительных действий для управления сторожевой башней генералу необходимо направить часть своей армии в эту башню. Каждый генерал требует у короля гонорар за управление башнями. Поскольку они живут в действительно очень далеком королевстве, каждый генерал оценивает свой гонорар следующим странным образом: он находит две самые удаленные башни, в которых находятся солдаты его армии и требует гонорар, равный этому расстоянию. Каждую башню можно считать точкой на плоскости с координатами (x, y), а расстояние между двумя точками с координатами (x1, y1) и (x2, y2) определяется в этом королевстве как |x1 - x2| + |y1 - y2|. Жадного короля не совсем устроило такое требование генералов, поэтому он лишь согласился выплатить один гонорар на двоих генералов, равный максимальному из запрашиваемых двух гонораров. Однако, жадность все еще не дает покоя королю, поэтому из всех таких распределений башен между армиями, он хочет отыскать наиболее дешевое. Каждая башня должна быть занята солдатами ровно одной армии. Для этих целей он нанял Вас. Вам необходимо найти минимальное количество денег, которое хватит для оплаты гонорара. А так как король еще крайне щепетилен, вы должны посчитать количество распределений, которые стоят такой же суммы денег. Поскольку их число может быть крайне велико, королю достаточно знать его значение в виде остатка от деления на 109 + 7. Два распределения называются различными, если различаются множества башен, занятых солдатами первого генерала. Выходные данные В первую строку выведите минимальное количество денег, которого хватит для выплаты гонорара генералам. Во вторую строку выведите количество распределений, которые можно реализовать, используя минимальный гонорар. Это число необходимо вычислить по модулю 1000000007 (109 + 7). Примечание В первом примере всего две башни, растояние между которыми равно 2. Если мы отдадим одному генералу все две башни, то генералам необходимо будет заплатить 2 условные единицы. В случае когда каждый генерал получит в командование по башне, величина гонорара будет равно 0. Это и есть минимальный гонорар, как не трудно заметить, его мы можем получить двумя способами.
| |
|
|
E. Беспорядок на рабочих местах
графы
Деревья
Комбинаторика
поиск в глубину и подобное
снм
*2100
Привезли новые рабочие столы, и нужно с ними поскорее разобраться, так как в офисе стало очень тесно! Вам нужно составить новую рассадку инженеров в офисе. Столы пронумерованы, и вы провели опрос среди инженеров, выяснив, за каким столом они работают сейчас, и за каким столом они хотели бы работать (может совпадать с тем столом, за которым они сейчас работают). Каждый инженер должен либо остаться на своем месте, либо переместиться на то место, которое он обозначил как желаемое. Никакие два инженера не работают сейчас за одним столом, и после пересадки никакие два инженера также не должны работать за одним столом. Сколько существует способов рассадить инженеров так, чтобы удовлетворить описанным ограничениям? Ответ может быть большим, поэтому выведите его по модулю 1000000007 = 109 + 7. Выходные данные Выведите число способов рассадить всех инженеров по модулю 1000000007 = 109 + 7. Примечание Следующие рассадки возможны в первом примере: - 1 5 3 7
- 1 2 3 7
- 5 2 3 7
- 1 5 7 3
- 1 2 7 3
- 5 2 7 3
| |
|
|
D. Красивая дорога
графы
Деревья
дп
поиск в глубину и подобное
реализация
снм
сортировки
*2300
Давным давно где-то в Азии в одной стране шли междоусобные войны. Каждый из n городов хотел захватить власть, поэтому иногда один город собирал армию и отправлял ее в поход против другого города. Прокладывание дорог было делом трудным, поэтому их в стране было мало, а именно n - 1. Также из любого города до любого другого можно было добраться по этим дорогам. Даже во время войны жители Востока остаются людьми духовно богатыми и ценящими красоту природы. И, дабы оставить на века память о своем великом походе, на дороге, на которой в пути армия провела больше всего времени, сажали одно красивое дерево. Жители Востока любят природу, поэтому если таких дорог было несколько, то по одному дереву сажалось на каждой. Недавно, когда были обнаружены летописи той войны, выяснилось, что каждый город напал на каждый ровно по одному разу. Всего было ровно n(n - 1) походов. Всем стало интересно, какая дорога после тех войн стала самой красивой, то есть на какой дороге посадили больше всего красивых деревьев. Выходные данные В первой строке выведите два числа — количество красивых деревьев на самой красивой дороге и количество самых красивых дорог. Во второй строке выведите список самых красивых дорог, в порядке возрастания номеров. Дороги пронумерованы от 1 до n - 1 в том порядке, в котором они даны во входных данных. Пожалуйста, не используйте спецификатор %lld для записи 64-х битовых чисел на С++. Рекомендуется использовать поток cout (также вы можете использовать спецификатор %I64d).
| |
|
|
E. Точки, прямые и неоригинальные названия
графы
Деревья
поиск в глубину и подобное
снм
*2300
На плоскости дано n различных точек с целыми координатами. Для каждой точки можно выполнить одно из трех действий: провести через нее вертикальную прямую, провести через нее горизонтальную прямую или ничего не делать. Если рассматривать несколько совпадающих прямых как одну, то сколько различных картинок может получиться? Ответ вывести по модулю 109 + 7. Выходные данные Вывести количество различных картинок по модулю 109 + 7. Примечание В первом примере через точки проходят две вертикальные и две горизонтальные прямые. Существуют способы получить картинку из любого набора этих прямых. В частности, получить картинку на которой нарисованы все четыре прямые можно двумя способами (каждый отрезок обозначает прямую, которой отрезок принадлежит). Первый способ: Второй способ: Во втором примере для каждой точки можно независимо выполнить одно из трех действий. Количество картинок равно 32 = 9.
| |
|
|
F. Запрещённые индексы
снм
Строки
строковые суфф. структуры
*2400
Дана строка s, состоящая из n строчных латинских букв. Некоторые индексы в этой строке являются запрещёнными. Вам необходимо найти такую строку a, что значение |a|·f(a) является максимально возможным, где f(a) — количество вхождений a в s, заканчивающихся в индексах, не являющихся запрещёнными. Например, если s — aaaa, a — aa и индекс 3 — запрещённый, то f(a) = 2, так как a встречается в s три раза (начиная с индексов 1, 2 и 3), но одно из этих вхождений (то, которое начинается в индексе 2) заканчивается в запрещённом индексе. Посчитайте максимально возможное значение |a|·f(a). Выходные данные Выведите максимально возможное значение |a|·f(a).
| |
|
|
B. Сортировка монет
реализация
снм
сортировки
*1500
Недавно Дима познакомился с Сашей в филателистическом магазине, и с тех пор они собирают монеты вместе. Их любимое занятие — сортировать коллекции монет. Саше нравится порядок, поэтому он хочет, чтобы монеты были расположены в ряд, причём сначала шли монеты, вышедшие из обращения, а потом монеты, всё ещё находящиеся в обращении. Для упорядочивания монет Дима использует алгоритм, один шаг которого выглядит следующим образом: - Дима просматривает все монеты слева направо;
- если он видит, что i-я монета ещё в ходу, а (i + 1)-я уже вышла из обращения, то он меняет эти две монеты местами, и продолжает смотреть на монеты дальше, начиная с (i + 1)-й.
Дима повторяет этот шаг до тех пор, пока не окажется, что на очередном шаге не произошло ни одного обмена. Сложностью упорядочивания Дима называет количество шагов, которые ему требуются в соответствии с процедурой, описанной выше, то есть, количество раз, которое он будет начинать просматривать монеты с начала. В частности, для уже упорядоченной исходной последовательности монет сложность упорядочивания равна единице. Сегодня Саша в очередной раз позвал Диму в гости, чтобы предложить ему следующую игру. Сначала он выложил в ряд перед Димой n монет, все из которых вышли из обращения. Затем Саша n раз выбирает какую-то из монет, которая вышла из обращения, и заменяет её на монету, которая находится в обращении. В ходе этого процесса Саша постоянно интересуется у Димы, какова на данный момент сложность упорядочивания последовательности. Задачу усложняет тот факт, что Диме нельзя трогать монеты, и поэтому определять сложность упорядочивания ему приходится в уме. Помогите Диме справиться с этим заданием. Выходные данные Выведите n + 1 чисел a0, a1, ..., an, где a0 — сложность упорядочивания последовательности в начале, a1 — сложность упорядочивания после замены одной монеты и так далее. Примечание Разберём первый пример. Будем обозначать за O монету, вышедшую из обращения, а за X — монету в обращении. Изначально в ряду лежат монеты, вышедшие из обращения, поэтому Дима один раз просмотрит их слева направо, и не совершит никаких обменов. После замены Сашей первой монеты на находящуюся в обращении Дима на первом шаге алгоритма три раза поменяет эту монету с последующей, после чего один раз просмотрит монеты и завершит процесс: XOOO → OOOX После замены Сашей третьей монеты действия Димы выглядят следующим образом: XOXO → OXOX → OOXX После замены Сашей четвёртой монеты действия Димы выглядят следующим образом: XOXX → OXXX Наконец, после замены Сашей второй монеты весь ряд оказывается состоящим из монет, находящихся в обращении, и Дима один раз просмотрит ряд слева направо.
| |
|
|
F. Королевские вопросы
графы
жадные алгоритмы
снм
*2500
В одном средневековом королевстве бушует экономический кризис. Надои молока падают, экономические показатели каждый день пробивают новое дно, деньги из казны пропадают в неизвестном направлении. Чтобы исправить положение, король Карл Солнцеликий принял решение женить своих n сыновей-принцев на невестах с, по возможности, как можно б'{о}льшим приданым. В поисках кандидаток король отправил гонцов в соседние королевства, в результате чего ко двору прибыли делегации с m незамужними принцессами. Принимая гостей, Карл узнал, что приданое i-й принцессы составляет wi золотых монет. Хотя дело и происходит в средневековье, в обществе уже широко распространены прогрессивные представления, в соответствии с которыми никто не может заставить принцессу выйти замуж за принца, который ей не по нраву. Поэтому каждой принцессе была предоставлена возможность выбрать двух принцев, за каждого из которых она готова выйти замуж. Принцам повезло меньше, они в вопросе выбора невесты будут повиноваться воле своего отца. Зная размер приданого и предпочтения каждой принцессы, Карл хочет сыграть свадьбы таким образом, чтобы суммарное приданое невест всех его сыновей было как можно больше. При этом женить всех принцев или выдавать всех принцесс замуж не обязательно. Каждый принц может жениться не более чем на одной принцессе, и наоборот каждая принцесса может быть выдана не более чем за одного принца. Помогите королю организовать женитьбу своих сыновей наиболее выгодным для казны способом. Выходные данные Выведите единственное целое число — максимальное количество золотых монет, которое может получить король, сыграв нужные свадьбы.
| |
|
|
E. Бинарная матрица
снм
*2500
Вам задана матрица размера n × m, состоящая из нулей и единиц. Необходимо определить количество компонент связности, состоящих из единиц. Две клетки входят в одну компоненту связности, если они смежны по стороне и в них стоят единицы. Обратите внимание на ограничение памяти! Выходные данные Выведите количество компонент связности, состоящих из единиц. Примечание В первом примере матрица имеет вид: 0001 1010 1000
Очевидно, что в ней три компоненты связности из единиц. Во втором примере матрица имеет вид: 01011111 11100011
Очевидно, что в ней две компоненты связности из единиц. В третьем примере в матрице нет ни одной единицы, поэтому ответ равен нулю.
| |
|
|
C. Петя и катакомбы
Деревья
жадные алгоритмы
реализация
снм
*1300
Однажды Петя — очень храбрый исследователь — решил заняться изучением великих парижских катакомб. Так как Петя не очень опытный в этом деле, его исследование заключается в хождении по катакомбам. Катакомбы представляют из себя набор комнат, некоторые из которых соединены переходами, переход может соединять комнату с самой собой, по переходам можно ходить в любую сторону. Переходы могут находиться на разных глубинах, что позволяет им не пересекаться. Каждую минуту Петя выбирает произвольным образом переход из комнаты, в которой он находится, и проходит его за одну минуту. Когда он заходит в комнату в минуту i, он делает в журнал запись — число ti: - Если Петя уже был в этой комнате, он записывает минуту, когда он был в этой комнате в предыдущий раз;
- Иначе Петя записывает в журнал произвольное неотрицательное целое число, строго меньшее текущей минуты i.
Изначально Петя находился в какой-то из комнат в минуту 0, при этом число t0 он не записывал. В какой-то момент Петя устал, бросил журнал и пошёл домой (не обязательно в той же комнате, из которой он начинал). Вася нашёл этот журнал, и теперь ему интересно: какое наименьшее количество комнат может быть в катакомбах, согласно журналу Пети? Выходные данные В первой строке выведите единственное число — минимальное возможное количество комнат в парижских катакомбах. Примечание В первом тестовом примере последовательность комнат, по которым прошёл Петя, могла быть 1 → 1 → 2 или 1 → 2 → 1, или, например, 1 → 2 → 3. Минимальное число комнат равно 2. Во втором тестовом примере эта последовательность могла быть 1 → 2 → 3 → 1 → 2 → 1.
| |
|
|
C. Зависть
графы
снм
Структуры данных
*2300
Для заданного связного неориентированного взвешенного графа G минимальным остовным деревом называется подграф G, содержащий все вершины G, являющийся деревом, а также имеющий минимально возможную сумму весов ребер. Вам дан граф G. Если вы запустите алгоритм по поиску минимального остовного дерева, вы найдете лишь одно минимальное остовное дерево, а другие ребра будут завидовать. Вам дано несколько запросов, каждый запрос содержит подмножество ребер графа G, определите, существует ли минимальное остовное дерево этого графа, содержащее все эти ребра, или нет. Выходные данные Для каждого запроса выведите «YES» (без кавычек), если существует минимальное остовное дерево со всеми данными ребрами, и «NO» (конечно же, без кавычек) иначе. Примечание На рисунке граф из первого примера: Вес минимального остовного дерева равен 6. Минимальное остовное дерево из ребер (1, 3, 4, 6) содержит все ребра из первого запроса, поэтому ответ на первый запрос «YES». Ребра из второго запроса образуют цикл длины 3, поэтому не существует остовного дерева, включающего в себя эти три ребра. Поэтому ответ «NO».
| |
|
|
E. Добро пожаловать домой, Ктолли
снм
Структуры данных
*3100
— Я... Я выжила. — С возвращением домой, Ктолли. — Я сдержал своё обещание. — Я сделала это... Я сделала это! После нескольких дней битвы Ктолли Нота Сениориус чудом вернулась с поля боя живой. Уильям, как и обещал, готовит торт для неё. Хоть Уильям и отлично готовит десерты, он плохо умеет готовить торты. На этот рад Уильям допустил серьёзную ошибку: он сломал духовой шкаф! К счастью, Ктолли решила помочь ему. Уильям выложил в ряд n тортов на стол, торты пронумерованы от 1 до n, торт с номером i должен выпекаться ai секунд. Уильяму нужна помощь Ктолли, чтобы выполнить m операций для выпекания тортов. Каждая операция бывает одного из двух типов. Тип 1: 1 l r x Уильям просит Ктолли проверить все торты на отрезке [l, r]. Если некоторый торт должен готовиться дольше чем x секунд, он поместит его на x секунд в духовой шкаф, а затем вернёт на прежнее место. Более формально, для каждого i на отрезке [l, r] если ai строго больше x, ai становится равным ai - x. Тип 2: 2 l r x Уильям спрашивает Ктолли количество тортов на отрезке [l, r] таких, что они должны выпекаться ещё ровно x секунд. Более формально, вы должны найти количество таких i на отрезке [l, r], что ai = x. Выходные данные Для каждой операции второго типа выведите ответ.
| |
|
|
E. Удаление отрезков
Потоки
реализация
снм
Структуры данных
*2000
У Васи есть массив целых чисел, состоящий из n элементов. Вася производит с массивом следующие операции: каждый раз он находит самый длинный отрезок подряд идущих одинаковых чисел (если таких несколько, то Вася выберет самый левый из них) и удаляет его из массива. Например, если массив Васи имеет вид [13, 13, 7, 7, 7, 2, 2, 2], то после одной операции массив примет вид: [13, 13, 2, 2, 2]. Определите количество описанных операций, которое произведёт Вася до того момента, как его массив станет пустым (то есть Вася удалит из него все элементы). Выходные данные Выведите количество операций, которые произведет Вася, чтобы удалить из массива все элементы. Примечание В первом примере Вася сначала удалит две пятёрки, стоящие во второй и третьей позициях. После этого массив будет выглядеть как [2, 2]. Во время второй операции Вася удалит две двойки, стоящие в первой и второй позициях. После этого массив станет пустым, и Вася закончит выполнение операций. Во втором примере Васе нужно пять операций, чтобы удалить все элементы из массива. Во время каждой операции он будет удалять самый левый элемент из массива. В третьем примере Васе нужно три операции, чтобы удалить все элементы из массива. Во время первой операции он удалит все числа 4, во время второй — все числа 100, а во время третьей — все числа 2. В четвёртом примере во время первой операции Вася удалит два первых числа 10. После этого массив примет вид [50, 10, 50, 50]. Затем во время второй операции Вася удалит два крайних правых числа 50, массив примет вид [50, 10]. Во время третьей операции — число 50, массив примет вид [10]. Во время последней четвертой операции он удалит единственное число 10. После этого массив Васи станет пустым.
| |
|
|
E. Интересный граф и яблоки
графы
поиск в глубину и подобное
снм
*2300
Хексадесимал очень любит рисовать. Её перу принадлежит большая коллекция графов, как ориентированных, так и не очень. Недавно она начала работу над натюрмортом «интересный граф и яблоки». Интересным считается такой неориентированный граф, у которого каждая вершина принадлежит только одному циклу: забавному кольцу, и, причём, не принадлежит никакому другому циклу. Забавное кольцо — это такой цикл, который проходит через все вершины графа ровно один раз. Также, к забавным циклам относятся петли. Яблоки она уже нарисовала и некоторые рёбра в графе тоже. Но теперь стало непонятно, как же соединить оставшиеся вершины, чтобы получился в результате интересный граф? Ответ должен содержать наименьшее количество добавляемых рёбер. И, помимо всего прочего, ответ должен быть лексикографически наименьшим. Набор ребер (x1, y1), (x2, y2), ..., (xn, yn), где xi ≤ yi, лексикографически меньше набора (u1, v1), (u2, v2), ..., (un, vn), где ui ≤ vi, в том случае, если последовательность целых чисел x1, y1, x2, y2, ..., xn, yn лексикографически меньше последовательности u1, v1, u2, v2, ..., un, vn. Если Вы не справитесь, Хексадесимал Вас съест. Живьём. Выходные данные В первой строке выведите слово «YES» или «NO»: можно или нет построить интересный граф. Если ответ «YES», то во второй строке выведите k — количество рёбер, которые нужно добавить к исходному графу. И, наконец, выведите k строк: пары вершин xj и yj, между которыми нужно провести рёбра. Результат может содержать кратные рёбра и петли. k может быть равно нулю.
| |
|
|
C. Двудольные отрезки
Бинарный поиск
графы
поиск в глубину и подобное
снм
Структуры данных
*2300
Дан неориентированный граф на n вершинах, в котором нет реберно-простых циклов четной длины (циклов четной длины, которые не проходят по одному ребру два раза). Будем считать, что вершины графа пронумерованы целыми числами от 1 до n. Требуется ответить на q запросов. Каждый запрос задается отрезком вершин [l; r], требуется посчитать количество его подотрезков [x; y] (l ≤ x ≤ y ≤ r) таких, что граф, в котором оставили только вершины из отрезка [x; y] (включая и x, и y) и ребра между этими вершинами, является двудольным. Выходные данные Выведите q чисел, каждое в новой строке: i-е из них равно количеству таких подотрезков [x; y] (li ≤ x ≤ y ≤ ri), что граф, в котором оставили только вершины из отрезка [x; y] и ребра между этими вершинами, является двудольным. Примечание Первый пример расположен на следующей картинке: 
На первый запрос подходят все подотрезки отрезка [1; 3], кроме него самого. На второй запрос подходят все подотрезки отрезка [4; 6], кроме него самого. На третий запрос подходят все подотрезки отрезка [1; 6], кроме [1; 3], [1; 4], [1; 5], [1; 6], [2; 6], [3; 6], [4; 6]. Второй пример расположен на следующей картинке: 
| |
|
|
B. Красим дерево
жадные алгоритмы
поиск в глубину и подобное
снм
*1200
Задано корневое дерево, состоящее из n вершин. Будем считать, что вершины дерева пронумерованы целыми числами от 1 до n. Корнем дерева является вершина с номером 1. Каждая вершина дерева имеет определенный цвет, цвет вершины v будем обозначать cv, изначально cv = 0. В задаче вам требуется раскрасить дерево в заданные цвета с помощью минимального числа действий. За одно действие вы можете выбрать вершину v и цвет x, и покрасить все вершины поддерева v (включая v) в цвет x, то есть для всех вершин u таких, что путь от корня до u содержит вершину v, сделать cu = x. Гарантируется, что все вершины надо покрасить в цвет, отличный от 0. Определение корневого дерева можно прочитать по ссылке: https://ru.wikipedia.org/wiki/Дерево_(теория_графов). Выходные данные На первой и единственной строке выведите одно целое число — минимальное число действий, за которое можно покрасить дерево в желаемые цвета. Примечание Первый пример расположен на следующей картинке (числа обозначают номера вершин): 
Первым действием мы красим все вершины поддерева вершины 1 в цвет 2 (числа обозначают цвета): 
Вторым действием мы красим все вершины поддерева вершины 5 в цвет 1: 
Третьим действием мы красим все вершины поддерева вершины 2 в цвет 1: 
Второй пример расположен на следующей картинке (числа обозначают номера вершин): 
Первым действием мы красим все вершины поддерева вершины 1 в цвет 3 (числа обозначают цвета): 
Вторым действием мы красим все вершины поддерева вершины 3 в цвет 1: 
Третьим действием мы красим все вершины поддерева вершины 6 в цвет 2: 
Четвертым действием мы красим все вершины поддерева вершины 4 в цвет 1: 
Пятым действием мы красим все вершины поддерева вершины 7 в цвет 3: 
| |
|
|
C. Лыжная база
графы
Комбинаторика
снм
*2300
В Моржландии собираются построить лыжную базу. Пока проект находится на стадии строительства. Под строительство базы был выбран большой участок земли, на котором находится n лыжных перекрестков. Изначально эти перекрестки никак не соединены. В процессе строительства будет проложено m двусторонних лыжных дорог. Дороги строятся по очереди: вначале будет построена дорога с номером 1, потом дорога с номером 2, и так далее. Дорога с номером i соединяет перекрестки с номерами ai и bi. Трасса — это маршрут, обладающий следующими свойствами: - Маршрут замкнут, то есть он начинается и заканчивается в одном и том же перекрестке.
- Маршрут содержит хотя бы одну дорогу.
- Маршрут не проходит по одной дороге более одного раза, но при этом может проходить через любой перекресток сколько угодно раз.
Будем называть лыжной базой непустое множество дорог, которое можно разбить на одну или более трасс так, чтобы по каждой дороге этого множества проходила ровно одна трасса, при этом каждая трасса может состоять только из дорог выбранного множества. Лыжная база может быть несвязной. Две лыжные базы считаются различными, если они состоят из разных множеств дорог. После постройки каждой новой дороги правительство Моржландии хочет знать количество вариантов выбрать лыжную базу на основе некоторого подмножества из уже построенных дорог. Правительство просит вашей помощи в решении данной задачи. Выходные данные Выведите m строк: i-ая строка должна обозначать количество способов построить лыжную базу после окончания строительства дороги с номером i. Числа следует выводить по модулю 1000000009 (109 + 9). Примечание Пусть у нас 3 перекрестка и уже построены 4 дороги между перекрестками (как после построки всех дорог в примере): 1 и 3, 2 и 3, 2 дороги между перекрестками 1 и 2. Участок под постройку будет выглядеть следующим образом: Можно выбрать подмножество дорог 3мя способами: В первом и втором способах можно выбрать один маршрут, например, 1 - 2 - 3 - 1. В третьем случае можно выбрать один маршрут 1 - 2 - 1.
| |
|
|
F. Несбалансированность дерева
графы
Деревья
снм
Структуры данных
*2400
Задано дерево T, состоящее из n вершин. На каждой вершине записано число; на i-й — ai. Определим функцию I(x, y) — разница между максимальным и минимальным значением ai на простом пути между вершинами x и y. Ваша задача — вычислить . Выходные данные Выведите одно число — .
| |
|
|
E. Связные компоненты?
графы
поиск в глубину и подобное
снм
Структуры данных
*2100
Дан неориентированный граф, состоящий из n вершин и ребер. Вместо того, чтобы задавать ребра, которые присутствуют в графе, мы даем m неупорядоченных пар (x, y) таких, что между вершинами x и y не существует ребра, и если пара вершин не встречается во входных данных, то в графе есть ребро между ними. Необходимо найти количество связных компонент в графе и размер каждой компоненты. Связная компонента — это такой набор вершин X, что для любой пары вершин в компоненте существует хотя бы один путь, соединяющий их, и добавление любой новой вершины в X нарушает это правило. Выходные данные Сначала выведите k — количество связных компонент в графе. Затем выведите k чисел — размеры компонент. Эти числа должны идти в неубывающем порядке.
| |
|
|
F. SUM и REPLACE
Перебор
снм
Структуры данных
теория чисел
*2000
Обозначим за D(x) количество положительных делителей натурального числа x. К примеру, D(2) = 2 (2 делится на 1 и 2), D(6) = 4 (6 делится на 1, 2, 3 и 6). Вам дан массив a из n целых чисел. Нужно обрабатывать два вида запросов: - REPLACE l r — для каждого
заменить ai на D(ai); - SUM l r — посчитать
. Выведите ответ на каждый запрос SUM. Выходные данные Для каждого запроса SUM выведите ответ на него.
| |
|
|
G. Кратчайшие пути
битмаски
графы
снм
Структуры данных
*2900
Задан неориентированный граф со взвешенными ребрами. Длина пути между двумя вершинами — побитовое исключающее ИЛИ весов его ребер (если некоторое ребро посещается несколько раз, то в результат включается то же количество раз). Есть три вида запросов, которые необходимо обрабатывать: - 1 x y d — добавить ребро, соединяющее вершины x и y с весом d. Гарантируется, что до запроса не было ребра, соединяющего x и y;
- 2 x y — удалить ребро, соединяющее вершины x и y. Гарантируется, что в графе есть такое ребро и что граф останется связным после запроса;
- 3 x y — найти длину кратчайшего пути (не обязательно простого) от вершины x в вершину y.
Выведите ответы на все запросы типа 3. Выходные данные Выведите ответы на все запросы типа 3 в том порядке, в котором они были заданы.
| |
|
|
D. Спасение любви
графы
жадные алгоритмы
поиск в глубину и подобное
снм
Строки
*1600
Валя и Толя — идеальная пара, но даже у них бывают ссоры. Недавно Валя обиделась на своего кавалера, так как он пришел к ней в футболке, надпись на которой отличается от надписи на ее свитере. Теперь она не хочет с ним видеться, а Толя сидит целыми днями в своей комнате и плачет над ее фотографиями. Эта история так и осталась бы такой печальной, если бы в нее не вмешалась добрая швея-волшебница (бабушка Толи). Ее сердце разрывается, когда она видит молодых людей в ссоре, и поэтому она срочно хочет все исправить. Бабушка уже тайно забрала Валин свитер и Толину футболку, осталось только сделать надписи на них одинаковыми. Для этого она может за одну единицу маны купить заклинание, которое позволяет менять некоторые буквы на одежде. Ваша задача — рассчитать, какое минимальное количество маны придется потратить бабушке Толи для спасения любви молодых людей. Более формально, надписи на Валином свитере и Толиной футболке — это две строчки одинаковой длины n, состоящие только из строчных букв латинского алфавита. За одну единицу маны бабушка может купить заклинание вида (c1, c2) (где c1 и c2 — произвольные строчные буквы латинского алфавита), с помощью которого она может сколько угодно раз менять букву c1 на c2 (и наоборот) как на Валином свитере, так и на Толиной футболке. Вам требуется найти минимальное количество маны, позволяющее приобрести набор заклинаний, с помощью которого можно сделать надписи одинаковыми. Также вам необходимо вывести соответствующий набор заклинаний. Выходные данные В первой строке выведите одно целое число — минимальное количество маны t для спасения любви молодых. В следующих t строках выведите по две строчные буквы латинского алфавита через пробел — заклинания, которые нужно приобрести бабушке Толи. Заклинания и буквы в заклинаниях можно выводить в любом порядке. Если оптимальных ответов несколько, выведите любой. Примечание В первом примере достаточно купить два заклинания: («a»,«d») и («b»,«a»). Тогда первые буквы совпадут, когда мы поменяем букву «a» на «d». Вторые совпадут, когда поменяем «b» на «a». Третьи совпадут, когда поменяем сначала «b» на «a», потом «a» на «d».
| |
|
|
E. Счастливая страна
графы
дп
снм
*2500
Петя любит счастливые числа. Всем известно, что счастливыми являются натуральные числа, в десятичной записи которых содержатся только счастливые цифры 4 и 7. Например, числа 47, 744, 4 являются счастливыми, а 5, 17, 467 — не являются. Однажды Петя заснул. Ему приснилось, что он оказался президентом какой-то островной страны. Эта страна представляет собой острова, соединенные двусторонними дорогами. Между некоторыми островами не существует пути по дорогам, даже через промежуточные острова, поэтому страна разделена на несколько областей. Более формально: каждый остров находится ровно в одной области, между любыми двумя островами из одной области существует путь, между любыми двумя островами из разных областей не существует пути. Область называется счастливой, если количество островов в ней является счастливым числом. Как настоящий президент, первым делом Петя решил построить себе президентский дворец. Будучи фанатом счастливых чисел, Петя хочет разместить свой дворец в одной из счастливых областей. Однако, таких областей в стране изначально может не быть. В этом случае Петя может строить дополнительные дороги между различными областями, тем самым объединяя эти области. Найдите, какое минимальное количество дорог нужно построить, чтобы появилась счастливая область. Выходные данные Если решения не существует, выведите одно число «-1» (без кавычек). Иначе в первой строке выведите минимальное количество дорог r, которое нужно построить, чтобы получилась счастливая область.
| |
|
|
B. Махмуд, Эхаб и сообщение
жадные алгоритмы
реализация
снм
*1200
Махмуд хочет послать сообщение своему другу Эхабу. Их язык состоит из n слов, пронумерованных с 1 по n. У некоторых слов совпадают значения, поэтому существует k групп слов таких, что у всех слов в одной группе значение одинаковое. Махмуд знает, что стоимость посылки i-го слова равна ai. Каждое слово в сообщении Махмуд может оставить неизменным или заменить его другим словом с тем же значением. Можете ли вы помочь Махмуду определить минимальную стоимость посылки сообщения? Стоимость посылки сообщения равна сумме стоимостей отправки всех слов в сообщении. Выходные данные Единственная строка вывода должна содержать минимальную стоимость посылки сообщения после замены нескольких (возможно, ни одного) слова другими словами с таким же значением. Примечание В первом примере Махмуд должен заменить слово «second» на слово «loser», поскольку оно стоит меньше, и тогда стоимость посылки будет равна 100+1+5+1=107. Во втором примере Махмуд не должен совершать никаких замен, поэтому стоимость будет равна 100+1+5+10=116.
| |
|
|
G. Видимые черные области
геометрия
Деревья
снм
Структуры данных
*2800
У Пети есть многоугольник, состоящий из \(n\) вершин. Все стороны многоугольника Пети параллельны осям координат, а каждые две смежные стороны многоугольника Пети — перпендикулярны. Гарантируется, что многоугольник простой, то есть не имеет самопересечений и самокасаний. Вся внутренняя часть (границы не учитываются) многоугольника была покрашена Петей в черный цвет. Также у Пети есть прямоугольное окно, заданное своими координатами, через которое он смотрит на свой многоугольник. Прямоугольное окно задается своими координатами и не может быть перемещено. Стороны прямоугольного окна параллельны осям координат. Синим цветом изображена граница многоугольника, красным — окно. Ответ в этом случае равен 2. Определите количество черных связных областей многоугольника Пети, которые можно увидеть через прямоугольное окно. Выходные данные Выведите количество черных связных областей многоугольника Пети, которые можно увидеть через прямоугольное окно. Примечание Пример из условия соответствует картинке выше.
| |
|
|
E. Лидеры
графы
Деревья
поиск в глубину и подобное
снм
*2200
После революции в Берляндии новый диктатор столкнулся с неожиданной проблемой — страной надо как-то управлять. Диктатор является очень эффективным менеджером, однако не может раздавать приказы всему населению лично, поэтому он решил выбрать некоторое множество подконтрольных ему лидеров, которые и будут управлять людьми непосредственно. Однако оказалось, что лидерская эффективность может очень сильно варьироваться от человека к человеку, поэтому диктатор обратился за помощью к всемирно известным берляндским ученым. Ученые предложили инновационную идею — лидеры должны работать парами. Граф взаимоотношений — некоторый неориентированный граф с вершинами, соответствующими людям. Путь называется простым, если вершины в нем не повторяются. В результате многодневных и очень дорогих исследований было выяснено, что пара людей обладает наиболее высокими лидерскими качествами, если между ними в графе взаимоотношений есть простой путь с нечетным количеством ребер. Ученые решили называть такие пары различных людей лидерскими. Спецслужбы выдали ученым граф взаимоотношений, так что дело осталось за малым — надо научиться отвечать диктатору, являются ли лидерскими заданные пары людей. Помогите ученым справиться с этой задачей. Выходные данные Для каждого запроса ученых в отдельной строке выведите «Yes», если между парой людей существует простой нечетный путь, иначе выведите «No». Примечание Пояснение к примеру: 1) Между вершинами 1 и 2 есть всего 2 различных простых пути: 1-3-2 и 1-4-2. Оба состоят из четного количества ребер. 2) Вершины 1 и 3 соединены ребром, поэтому простой нечетный путь для них: 1-3. 5) Вершины 1 и 5 находятся в разных компонентах связности, между ними нет ни одного пути.
| |
|
|
E. Компоненты-циклы
графы
поиск в глубину и подобное
снм
*1500
Вам задан неориентированный граф, состоящий из \(n\) вершин и \(m\) ребер. Ваша задача — найти количество компонент связности, которые являются циклами. Вот несколько определений из теории графов. Неориентированный граф состоит из двух множеств: множества узлов (называемых вершинами) и множества рёбер. Каждое ребро соединяет пару вершин. Все ребра двунаправленные (то есть если вершина \(a\) соединена с вершиной \(b\), вершина \(b\) тоже соединена с вершиной \(a\)). Ребро не может соединять вершину саму с собой, также не может существовать более одного ребра между парой вершин. Две вершины \(u\) и \(v\) принадлежат одной компоненте связности тогда и только тогда, когда существует хотя бы один путь по ребрам, соединяющий \(u\) и \(v\). Компонента связности является циклом тогда и только тогда, когда все ее вершины могут быть переупорядочены следующим образом: - первая вершина соединена ребром со второй вершиной,
- вторая вершина соединена ребром с третьей вершиной,
- ...
- последняя вершина соединена ребром с первой вершиной,
- все описанные выше ребра цикла — различны.
Цикл содержит только вершины и ребра, описанные выше. По определению цикл содержит не менее трех вершин. Граф на рисунке содержит \(6\) компонент связности, \(2\) из них являются циклами: \([7, 10, 16]\) и \([5, 11, 9, 15]\). Выходные данные Выведите одно целое число — количество компонент связности, которые являются циклами. Примечание В первом тестовом примере только компонента \([3, 4, 5]\) является циклом. Второй пример соответствует рисунку из условия.
| |
|
|
D. Куро, НОД, побитовое исключающее ИЛИ, сумма и все-все-все
Бинарный поиск
битмаски
Деревья
дп
жадные алгоритмы
математика
Перебор
снм
Строки
Структуры данных
теория чисел
*2200
Куро играет в обучающую игру про числа. Основные математические операции в этой игре — наибольший общий делитель, побитовое исключающее ИЛИ и сумма двух чисел. Куро так любит эту игру, что проходит уровень за уровнем изо дня в день. К сожалению, Куро уезжает в отпуск и будет неспособна продолжить череду решений. Поскольку Кэти — надёжный человек, Куро попросил её прийти к нему домой в этот день и поиграть за него. Изначально дан пустой массив \(a\). Игр состоит из \(q\) запросов двух разных типов. Запросы первого типа просят Кэти добавить число \(u_i\) в массив \(a\). Запросы второго типа просят Кэти найти такое число \(v\), принадлежащее массиву \(a\), что \(k_i \mid GCD(x_i, v)\), \(x_i + v \leq s_i\), и \(x_i \oplus v\) максимально, где \(\oplus\) обозначает операцию побитового исключающего ИЛИ, \(GCD(c, d)\) обозначает наибольший общий делитель целых чисел \(c\) и \(d\), а \(y \mid x\) означает, что \(x\) делится на \(y\), или же вывести -1, если таких чисел в массиве нет. Поскольку вы программист, Кэти просит вас написать программу, которая будет автоматически и точно выполнять внутриигровые запросы, чтобы выполнить поручения Куро. Давайте поможем ей! Выходные данные Для каждого запроса типа \(2\) выведите запрашиваемое число \(v\) или -1, если таких чисел не найдено, в отдельной строке. Примечание В первом примере необходимо выполнить пять запросов: - Первый запрос просит вас добавить \(1\) в \(a\). Теперь \(a\) — \(\left\{1\right\}\).
- Второй запрос просит вас добавить \(2\) в \(a\). Теперь \(a\) — \(\left\{1, 2\right\}\).
- Третий запрос просит вас найти ответ с \(x = 1\), \(k = 1\) и \(s = 3\). И \(1\), и \(2\) удовлетворяют условиям на \(v\), так как \(1 \mid GCD(1, v)\) и \(1 + v \leq 3\). Поскольку \(2 \oplus 1 = 3 > 1 \oplus 1 = 0\), ответом на этот запрос будет \(2\).
- Четвёртый запрос просит вас найти ответ с \(x = 1\), \(k = 1\) и \(s = 2\). Только \(v = 1\) удовлетворяет условия \(1 \mid GCD(1, v)\) и \(1 + v \leq 2\), поэтому ответом на этот запрос будет \(1\).
- Пятый запрос просит вас найти ответ с \(x = 1\), \(k = 1\) и \(s = 1\). В \(a\) нет удовлетворяющих условиям элементов, поэтому мы выводим -1 как ответ на этот запрос.
| |
|
|
D. Акула
Деревья
Перебор
снм
Структуры данных
*1900
Уже давно ученые наблюдают занятное поведение акул. Акулы, как и многие другие живые существа, в поисках пищи чередуют перемещения на маленькие отрезки внутри одной локации с переходами на более длительные расстояния между локациями. Максу, начинающему биологу, досталась распечатка, содержащая перемещения акулы за каждый из \(n\) последовательных дней в течение года. Длины всех передвижений оказались различными. По этим данным Макс решил посчитать, какое же количество локаций посетила морская хищница. Он предположил, что существует такое число \(k\), что, если за один день акула переместилась на расстояние, строго меньшее \(k\), то она не поменяла локацию; если же акула переместилась на расстояние, большее или равное \(k\), то в этот день она перемещалась на новую локацию. При этом перемещение на новую локацию могло занять несколько дней, в каждый из которых акула переместилась на расстояние, не меньшее \(k\). Акула никогда не возвращается на старую локацию после того, как она ушла из нее. Таким образом, в последовательности из \(n\) дней можно выделить отрезки, в течение которых акула перемещалась на расстояния, меньшие \(k\): это соответствует одной локации. Аркадий хочет выбрать такое \(k\), чтобы длины всех таких отрезков были одинаковы. Найдите такое целое число \(k\), что количество локаций в перемещениях акулы максимально возможно. Если существует несколько таких \(k\), выведите минимальное. Выходные данные Выведите целое число \(k\) такое, что: - на каждой локации акула провела равное количество дней;
- среди вариантов, удовлетворяющих первому условию, число локаций максимально возможное;
- среди вариантов, удовлетворяющих первому и второму условию, \(k\) минимально возможное.
Примечание В первом тестовом примере перемещения по локации являются перемещения в \(1\)-й и \(2\)-й дни (первая локация), в \(4\)-й и \(5\)-й (вторая локация), в \(7\)-й и \(8\)-й (третья локация). Таким образом, всего локаций три. Во втором примере перемещений по локации является только перемещение во \(2\)-й день. Всего одна локация.
| |
|
|
C. AND Graph
битмаски
графы
поиск в глубину и подобное
снм
*2500
Дано множество размера \(m\), состоящее из целых неотрицательных чисел от \(0\) до \(2^{n}-1\) включительно. Построим на этих числах неориентированный граф следующим образом: соединим \(x\) и \(y\), если и только если \(x \& y = 0\). Здесь \(\&\) — операция побитового И. Посчитайте количество компонент связности в таком графе. Выходные данные Выведите одно целое число — количество компонент связности. Примечание Граф из первого примера: 
Граф из второго примера: 
| |
|
|
G. Подсчёт GCD
Деревья
дп
разделяй и властвуй
снм
теория чисел
*2400
Дано дерево из \(n\) вершин. На каждой вершине дерева записано число; на \(i\)-й вершине записано число \(a_i\). Определим функцию \(g(x, y)\) как наибольший общий делитель всех чисел, записанных на вершинах на простом пути от вершины \(x\) до вершины \(y\) (включая эти две вершины). Для каждого целого числа от \(1\) до \(2 \cdot 10^5\) подсчитайте количество таких пар \((x, y)\) \((1 \le x \le y \le n)\), что \(g(x, y)\) равен этому числу. Выходные данные Для каждого целого числа \(i\) от \(1\) до \(2 \cdot 10^5\) необходимо сделать следующее: если не существует таких пар \((x, y)\), что \(x \le y\) и \(g(x, y) = i\), не выводите ничего; иначе выведите два числа: \(i\) и количество описанных пар. Значения \(i\) нужно выводить в возрастающем порядке. Посмотрите примеры для лучшего понимания.
| |
|
|
Closing the Farm
графы
Поиск компонент связности
снм
Фермер Джон и его коровы планируют уехать на длинные каникулы,
и поэтому ФД хочет временно закрыть ферму.
Ферма состоит из \(N\) амбаров, соединённых \(M\) двунаправленными дорожками
между некоторыми парами амбаров (\(1 \leq N, M \leq 200,000\)). ФД закрывает
один амбар за раз. После того как амбар закрыт, все дорожки, прилегающие
к нему тоже становятся закрытыми и не могут больше использоваться.
ФД хочет знать в каждый момент времени (изначально и после каждого
закрытия), является ли его ферма "полностью связной" - то есть возможно
ли добраться от одного открытого амбара до любого другого открытого амбара
с помощью серии дорожек. Поскольку на ферме идёт ремонт, она может быть
не связной даже изначально.
ФОРМАТ ВВОДА (файл closing.in):
Первая строка ввода содержит числа \(N\) и \(M\). Каждая из следующих \(M\)
строк описывает дорожку , задавая пару амбаров, которые она соединяет
(амбары пронумерованы последовательно \(1 \ldots N\)). Последние \(N\) строк
задают перестановку \(1 \ldots N\) описывающую порядок, в котором будут
закрываться амбары.
ФОРМАТ ВЫВОДА (файл closing.out):
Вывод содержит \(N\) строк, каждая есть "YES" или "NO". Первая строка
отвечает на попрос была ли ферма полностью связанной изначально, а далее
строка \(i+1\) указывает, осталась ли ферма полностью связной после \(i\)-го
закрывания.
| |
|