| | | |
|
F. Одно вхождение
разделяй и властвуй
Структуры данных
*2400
Дан массив \(a\), состоящий из \(n\) целых чисел, и \(q\) запросов к нему. \(i\)-й запрос обозначается двумя целыми числами \(l_i\) и \(r_i\). Для каждого запроса надо найти любое целое число, которое входит ровно один раз в подмассиве массива \(a\), начиная с индекса \(l_i\) и заканчивая индексом \(r_i\) (подмассивом называется непрерывный подотрезок массива). Например, если \(a = [1, 1, 2, 3, 2, 4]\), то в запросе \((l_i = 2, r_i = 6)\) нас интересует подмассив \([1, 2, 3, 2, 4]\), и возможные ответы на запрос — \(1\), \(3\) и \(4\); а в запросе \((l_i = 1, r_i = 2)\) нас интересует подмассив \([1, 1]\), и требуемого элемента не существует. Можете ли вы ответить на все запросы? Выходные данные Ответьте на каждый запрос следующим образом: Если не существует такого целого числа, которое входит в подмассив с индекса \(l_i\) по индекс \(r_i\) ровно один раз, выведите \(0\). Иначе выведите любое такое число.
| |
|
|
F. Соня и побитовое ИЛИ
битмаски
разделяй и властвуй
Структуры данных
*2600
У Сони есть массив \(a_1, a_2, \ldots, a_n\) из \(n\) чисел и неотрицательное целое число \(x\). Ей нужно выполнить \(m\) запросов двух типов: - \(1\) \(i\) \(y\): заменить \(i\)-й элемент на значение \(y\), то есть выполнить \(a_{i}\) := \(y\);
- \(2\) \(l\) \(r\): посчитать количество таких пар чисел (\(L\), \(R\)), что \(l\leq L\leq R\leq r\) и побитовое ИЛИ всех чисел подмассива \([L, R]\) не меньше \(x\) (обратите внимание, что \(x\) — константа для всех запросов).
Сможете ли вы помочь Соне выполнить все запросы? Побитовое ИЛИ — это бинарная операция над парой неотрицательных целых чисел. Для подсчета побитового ИЛИ двух чисел надо рассмотреть запись обоих чисел в двоичной системе счисления. Результат — это такое число, в двоичном представлении которого в каждом разряде стоит единица если единица находится в двоичной записи хотя бы одного из аргументов. Например, \(10\) OR \(19\) = \(1010_2\) OR \(10011_2\) = \(11011_2\) = \(27\). Выходные данные Для каждого запроса второго типа выведите количество подмассивов на отрезке, что побитовое ИЛИ их чисел не меньше \(x\). Примечание В первом примере задан массив [\(0\), \(3\), \(6\), \(1\)] и запросы: - на отрезке [\(1\ldots4\)] подходят пары (\(1\), \(3\)), (\(1\), \(4\)), (\(2\), \(3\)), (\(2\), \(4\)) и (\(3\), \(4\));
- на отрезке [\(3\ldots4\)] подходит пара (\(3\), \(4\));
- число на первой позиции изменяется на \(7\), после операции будет массив [\(7\), \(3\), \(6\), \(1\)];
- на отрезке [\(1\ldots4\)] подходят пары (\(1\), \(1\)), (\(1\), \(2\)), (\(1\), \(3\)), (\(1\), \(4\)), (\(2\), \(3\)), (\(2\), \(4\)) и (\(3\), \(4\));
- на отрезке [\(1\ldots3\)] подходят пары (\(1\), \(1\)), (\(1\), \(2\)), (\(1\), \(3\)) и (\(2\), \(3\));
- на отрезке [\(1\ldots1\)] подходит пара (\(1\), \(1\));
- число на третьей позиции изменяется на \(0\), после операции будет массив [\(7\), \(3\), \(0\), \(1\)];
- на отрезке [\(1\ldots4\)] подходят пары (\(1\), \(1\)), (\(1\), \(2\)), (\(1\), \(3\)) и (\(1\), \(4\)).
Во втором примере задан массив [\(6\), \(0\), \(3\), \(15\), \(2\)] и запросы: - на отрезке [\(1\ldots5\)] подходят пары (\(1\), \(3\)), (\(1\), \(4\)), (\(1\), \(5\)), (\(2\), \(4\)), (\(2\), \(5\)), (\(3\), \(4\)), (\(3\), \(5\)), (\(4\), \(4\)) и (\(4\), \(5\));
- число на четвертой позиции изменяется на \(4\), после операции будет массив [\(6\), \(0\), \(3\), \(4\), \(2\)];
- на отрезке [\(1\ldots5\)] подходят пары (\(1\), \(3\)), (\(1\), \(4\)), (\(1\), \(5\)), (\(2\), \(4\)), (\(2\), \(5\)), (\(3\), \(4\)) и (\(3\), \(5\));
- на отрезке [\(3\ldots5\)] подходят пары (\(3\), \(4\)) и (\(3\), \(5\));
- на отрезке [\(1\ldots4\)] подходят пары (\(1\), \(3\)), (\(1\), \(4\)), (\(2\), \(4\)) и (\(3\), \(4\)).
| |
|
|
E. Конфеты и Камни
дп
разделяй и властвуй
*2500
Мальчик Геральд и его тренер Миша играют в интересную игру. В начале игры имеются куча из n конфет и куча из m камней. Геральд и Миша ходят по очереди, первым ходит Миша. Миша на своем ходу проверят, сколько на данный момент Геральд съел конфет и камней. Пусть Геральд съел a конфет и b камней. Тогда Миша начисляет Геральду f(a, b) призовых очков. Геральд же на своем ходу съедает либо одну конфету из кучи с конфетами, либо один камень из кучи с камнями. Когда Миша обнаруживает, что Геральд съел все, кроме одной конфеты и одного камня, он последний раз начисляет очки и игра заканчивается. Опустошать ни ту, ни другую кучку Геральд не имеет права. Расскажите Геральду, как ему играть, чтобы получить наибольшее количество очков: требуется найти один из возможных оптимальных вариантов игры для Геральда. Выходные данные В первой строке выведите единственное число: максимальное количество призовых очков, которое может заработать Геральд. Во второй строке выведите строку из n + m - 2 символов, каждый из которых — это «C» или «S», i-ый символ должен быть «C», если на своем i-ом ходу Геральд должен съесть конфету, и «S», если камень. Примечание В первом тесте, если на первом ходу Геральд съест камень, то после него он получит одно очко, а если конфету — то ноль. Перед первым своим ходом Геральд получит в любом случае 0 очков, а после второго — в любом случае 1. Таким образом, максимальное количество очков, которое может получить Геральд равно 2, и для этого надо съесть сначала камень, потом конфету.
| |
|
|
E. Сезон дождей
Деревья
разделяй и властвуй
Структуры данных
*3200
К 3018 году Летняя Компьютерная Школа довольно сильно увеличилась в размерах. Новым местом проведения был выбран отель «Берендеетроник». База состоит из \(n\) домиков, между которыми есть \(n-1\) тропинок, и между любыми домиками есть путь. Все на базе было прекрасно, пока не начались дожди. Прогноз погоды обещает, что дожди будут идти \(m\) дней. Специальный отряд преподавателей смог вычислить, что по \(i\)-й тропинке, соединяющей некие домики \(u_i\) и \(v_i\), до дождей можно пройти за \(b_i\) секунд. Дождь же сильно размывает тропинку, и с каждым днем путь будет занимать на \(a_i\) секунд больше, иными словами, в \(t\)-й (с нуля) день после начала дождя прохождение тропинки будет занимать \(a_i \cdot t + b_i\) секунд. К сожалению, несмотря на все прилагаемые усилия, даже в 3018 году не все школьники встречают вечерку и мягкий отбой в своих домиках. Поскольку к жесткому отбою все обязаны уснуть, необходимо вычислить максимальное время пути между всеми парами домиков для каждого дня, и вывесить его на доску объявлений, чтобы каждый школьник знал последний момент, когда он бежать к себе домой. Посчитайте максимальное время пути между какой-либо парой домиков через \(t=0\), \(t=1\), ..., \(t=m-1\) дней после начала дождей. Выходные данные Выведите \(m\) чисел — значения самого длинного пути по базе через \(t=0, t=1, \ldots, t=m-1\) дней после начала дождя. Примечание Рассмотрим подробнее первый пример. В первые три дня (\(0 \le t \le 2\)) самый длинный путь проходит между вторым и третьим домиками, и его длина равна \(100+100=200\). В третий день (\(t=2\)) дорожка между домиками 1 и 4 становится по длине равной \(100\), и продолжает увеличиваться. Поэтому в дни с номерами \(t=2, 3, 4, 5\) самый длинный путь проходит между вершинами 4 и 1 или 2, и имеет длину \(180+10t\). Заметим, что в день \(t=2\) есть три тропинки длиной 100, и есть три максимальных пути одинаковой длины. В шестой день (\(t=5\)) тропинка между первым и пятым домиком по длине догоняет первые две, и становится равной 100. Таким образом, во все дни с \(t=5\) и далее самый длинный путь проходит между вершинами 4 и 5, и имеет длину \(80+30t\).
| |
|
|
F. Луч в трубе
дп
математика
разделяй и властвуй
Структуры данных
*2500
Вам задана зеркальная изнутри труба в виде двух несовпадающих прямых, параллельных оси \(Ox\). На каждой из прямых отмечены некоторые целочисленные точки — позиции сенсоров на стенках трубы. Вы собираетесь провести эксперимент с этой трубой и лазерным лучом. Для этого надо выбрать две целочисленные точки \(A\) и \(B\) на первой и второй прямой соответственно (координаты точек могут быть отрицательные): точка \(A\) будет отвечать за позицию лазера, а точка \(B\) — за направление лазерного луча. Лазерный луч представляет собой луч, стартующий в \(A\) и направленный в \(B\), который отражается от стенок трубы (независимо от того, есть в данной точке сенсор или нет). Сенсор регистрирует луч, если он попадает точно в позицию сенсора. Примеры использования лучей. Обратите внимания, что здесь два примера. Если использовать синий луч, то \(3\) сенсора (которые обозначены черными точками на сторонах трубы) зарегистрируют луч. А если красный, то только \(2\). Определите максимальное количество сенсоров, которые могут зарегистрировать луч, если вы можете выбрать целочисленные точки \(A\) и \(B\) на первой и второй прямой. Выходные данные Выведите максимальное количество сенсоров, которые могут зарегистрировать луч. Примечание Один из оптимальных способов представлен на иллюстрации парой \(A_2\) и \(B_2\).
| |
|
|
D. Петя и массив
разделяй и властвуй
Структуры данных
*1800
У Пети есть массив \(a\), состоящий из \(n\) целых чисел. Недавно он изучил префикс суммы и теперь умеет быстро считать сумму элементов на любом подотрезке своего массива. Под подотрезком понимается непустая последовательность подряд идущих элементов массива. Теперь ему стало интересно, сколько в его массиве подотрезков с суммой элементов меньше \(t\). Помогите Пете и определите это количество. Формально, нужно найти количество пар \(l, r\) (\(l \le r\)), что \(a_l + a_{l+1} + \dots + a_{r-1} + a_r < t\). Выходные данные Выведите количество подотрезков в массиве Пети с суммой элементов меньше \(t\). Примечание В первом примере у следующих отрезки сумма меньше \(4\): - \([2, 2]\), сумма на отрезке равна \(-1\)
- \([2, 3]\), сумма на отрезке равна \(2\)
- \([3, 3]\), сумма на отрезке равна \(3\)
- \([4, 5]\), сумма на отрезке равна \(3\)
- \([5, 5]\), сумма на отрезке равна \(-1\)
| |
|
|
G. Пестрая лента
разделяй и властвуй
Строки
строковые суфф. структуры
Структуры данных
хэши
*3500
Ильдар взял ленточку и покрасил её в несколько цветов. Формально, ленточка разбита на \(n\) клеточек, каждую из которых он покрасил в один из \(26\) цветов, которые можно обозначить строчными буквами латинского алфавита. Ильдар решил, что он выберет отрезок ленточки \([l, r]\) (\(1 \le l \le r \le n\)), который ему нравится, и вырежет его из ленточки. Таким образом получится новая ленточка, которую можно условно представить как строку \(t = s_l s_{l+1} \ldots s_r\). Теперь Ильдар играет в следующую игру — разрезает ленточку \(t\) на несколько новых ленточек и смотрит, сколько среди них различных. Формально, Ильдар выбирает \(1 \le k \le |t|\) индекcов \(1 \le i_1 < i_2 < \ldots < i_k = |t|\) и разрезает \(t\) на \(k\) ленточек-строк \(t_1 t_2 \ldots t_{i_1}, t_{i_1 + 1} \ldots t_{i_2}, \ldots, {t_{i_{k-1} + 1}} \ldots t_{i_k}\) и считает среди них количество различных. Внезапно Ильдара заинтересовал вопрос — а какое минимальное количество различных как строк из них может получиться, при условии что среди этих кусочков хотя бы один вид ленточек повторяется хотя бы два раза? Результатом игры Ильдар считает это число. Если не существует ни одного способа разрезать \(t\) таким образом, то результатом игры будет число -1. К сожалению, Ильдар ещё не выбрал, какой именно отрезок ему нравится, но у него есть \(q\) отрезков-предпочтений \([l_1, r_1]\), \([l_2, r_2]\), ..., \([l_q, r_q]\). Посчитайте для каждого из отрезков какой будет результат игры нём. Выходные данные Выведите \(q\) строк, где \(i\)-я из них содержит результат игры на строке \([l_i, r_i]\). Примечание Рассмотрим первый пример. Если Ильдар выберет отрезок \([1, 6]\), то он вырежет строку \(t = abcabc\). Если разрезать \(t\) на два кусочка \(abc\) и \(abc\), то строка \(abc\) повторится два раза, а количество различных строк из разрезания будет равно \(1\). Поэтому результат этой игры \(1\). Если Ильдар выберет отрезок \([4, 7]\), то он вырежет строку \(t = abcd\). Эту строку невозможно разрезать на строки так, что будет хотя бы строка, повторяющаяся хотя бы два раза. Поэтому результат этой игры \(-1\). Если Ильдар выберет отрезок \([3, 6]\), то он вырежет строку \(t = cabc\). Если разрезать \(t\) на три кусочка \(c\), \(ab\) и \(c\), то строка \(c\) повторится два раза, а количество различных строк будет равно \(2\). Поэтому результат этой игры \(2\).
| |
|
|
M. Algoland and Berland
геометрия
Конструктив
разделяй и властвуй
*3000
Once upon a time Algoland and Berland were a single country, but those times are long gone. Now they are two different countries, but their cities are scattered on a common territory. All cities are represented as points on the Cartesian plane. Algoland consists of \(a\) cities numbered from \(1\) to \(a\). The coordinates of the \(i\)-th Algoland city are a pair of integer numbers \((xa_i, ya_i)\). Similarly, Berland consists of \(b\) cities numbered from \(1\) to \(b\). The coordinates of the \(j\)-th Berland city are a pair of integer numbers \((xb_j, yb_j)\). No three of the \(a+b\) mentioned cities lie on a single straight line. As the first step to unite the countries, Berland decided to build several bidirectional freeways. Each freeway is going to be a line segment that starts in a Berland city and ends in an Algoland city. Freeways can't intersect with each other at any point except freeway's start or end. Moreover, the freeways have to connect all \(a+b\) cities. Here, connectivity means that one can get from any of the specified \(a+b\) cities to any other of the \(a+b\) cities using freeways. Note that all freeways are bidirectional, which means that one can drive on each of them in both directions. Mayor of each of the \(b\) Berland cities allocated a budget to build the freeways that start from this city. Thus, you are given the numbers \(r_1, r_2, \dots, r_b\), where \(r_j\) is the number of freeways that are going to start in the \(j\)-th Berland city. The total allocated budget is very tight and only covers building the minimal necessary set of freeways. In other words, \(r_1+r_2+\dots+r_b=a+b-1\). Help Berland to build the freeways so that: - each freeway is a line segment connecting a Berland city and an Algoland city,
- no freeways intersect with each other except for the freeway's start or end,
- freeways connect all \(a+b\) cities (all freeways are bidirectional),
- there are \(r_j\) freeways that start from the \(j\)-th Berland city.
Output For each of the \(t\) test cases, first print "YES" if there is an answer or "NO" otherwise. If there is an answer, print the freeway building plan in the next \(a+b-1\) lines. Each line of the plan should contain two space-separated integers \(j\) and \(i\) which means that a freeway from the \(j\)-th Berland city to the \(i\)-th Algoland city should be built. If there are multiple solutions, print any.
| |
|
|
G. Счастливые билеты
бпф
дп
разделяй и властвуй
*2400
Все автобусные билеты в Берляндии пронумерованы. Номер каждого билета состоит из \(n\) цифр (\(n\) четно). При этом в номерах билетов могут быть использованы только \(k\) цифр \(d_1, d_2, \dots, d_k\). Допустимо, что номера билетов Берляндии содержат один или более лидирующих нулей, если \(0\) может использоваться в номерах билетов. Например, если \(n = 4\) и в билетах можно использовать две цифры \(0\) и \(4\), то номера \(0000\), \(4004\), \(4440\) могут быть номерами билетов в Берляндии, а номера \(0002\), \(00\), \(44443\) — нет. Билет в Берляндии считается счастливым, если сумма первых \(n / 2\) цифр равна сумме последних \(n / 2\) цифр. Определите общее количество счастливых билетов в Берляндии. Так как это число может быть очень большим, выведите остаток от деления общего количества счастливых билетов на \(998244353\). Выходные данные Выведите остаток от деления общего количества счастливых билетов в Берляндии на \(998244353\). Примечание В первом примере всего \(6\) счастливых номеров билетов: \(1111\), \(1818\), \(1881\), \(8118\), \(8181\) и \(8888\). Во втором примере существует всего один номер билета, который допустим в Берляндии, он состоит из \(20\) цифр \(6\). Этот билет является счастливым, поэтому ответ \(1\).
| |
|
|
F. Ваня и бургеры
жадные алгоритмы
математика
разделяй и властвуй
Структуры данных
*2500
Ваня очень любит бургеры, а так же очень любит тратить деньги. На улице, где живет Ваня, находится \(n\) бургерных. У Вани есть \(q\) друзей, \(i\)-й друг предложил Ване встретиться у бургерной с номером \(l_i\) и прогуляться до бургерной \(r_i\) \((l_i \leq r_i)\). Во время прогулки с \(i\)-м другом Ваня может зайти во все бургерные с номерами \(x\) такими, что \(l_i \leq x \leq r_i\). Для каждой бургерной Ваня знает стоимость самого дорогого бургера \(c_i\) бурлей. Ваня хочет зайти в какое-то подмножество бургерных по пути, взять в каждой из них самый дорогой бургер и потратить как можно больше денег. Но есть небольшая проблема: карта Вани сломалась, и вместо того, чтобы снимать деньги после покупки, количество денег на карте меняется следующим образом. Пусть до покупки у Вани было \(d\) бурлей и Ваня потратил \(c\) бурлей в бургерной, тогда после этих действий у Вани на счете останется \(d \oplus c\) бурлей, где \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Сейчас на счету Вани \(2^{2^{100}} - 1\) бурлей и он уже собирается на прогулку. Помогите Ване узнать, какое максимальное количество денег он сможет потратить, если пойдет гулять с другом под номером \(i\). Количество бурлей, потраченных Ваней, определяется как разность между начальным количеством бурлей на счете Вани и конечным количеством бурлей на его счете. Выходные данные Выведите \(q\) строк, в \(i\)-й строке выведите максимальное количество денег, которое Ваня может потратить вместе с другом под номером \(i\). Примечание В первом тесте для того, чтобы потратить максимальное количество денег с первым и третьим другом, Ване достаточно зайти в первую бургерную. Со вторым другом Ване достаточно зайти в третью бургерную. Во втором тесте для третьего друга (который собирается прогуляться от первой до третьей бургерной) всего есть 8 вариантов потратить деньги — \(0\), \(12\), \(14\), \(23\), \(12 \oplus 14 = 2\), \(14 \oplus 23 = 25\), \(12 \oplus 23 = 27\), \(12 \oplus 14 \oplus 23 = 20\). Максимальное количество денег получается потратить, если зайти в первую и третью бургерную — \(12 \oplus 23 = 27\).
| |
|
|
C. Изобретательный щелчок
Бинарный поиск
математика
Перебор
разделяй и властвуй
*1700
Танос хочет уничтожить базу мстителей вместе с мстителями, которые там находятся. Представим базу как массив, в каждой ячейке которой может находиться сколько угодно мстителей, но каждый мститель находится ровно в одной ячейке. Длина базы является точной степенью \(2\). Танос хочет уничтожить базу, потратив минимум энергии. Он начинает со всей базы и за один шаг может сделать одно из следующего: - если текущая длина базы хотя бы \(2\), разделить базу на \(2\) равные половины и продолжить их уничтожать независимо, или
- сжечь текущую базу. Если на ней нет мстителей, это отнимает \(A\) единиц энергии, иначе это отнимает \(B \cdot n_a \cdot l\) единиц энергии, где \(n_a\) — число мстителей на этой базе, а \(l\) — длина текущей базы.
Выведите минимальное число единиц энергии, которое должен затратить Танос, чтобы уничтожить всю базу. Выходные данные Выведите одно целое число — минимальное число единиц энергии, которое должен затратить Танос, чтобы уничтожить базу. Примечание Рассмотрим первый пример. Один из вариантов для Таноса — сжечь базу \(1-4\) целиком, затратив \(2 \cdot 2 \cdot 4 = 16\) единиц энергии. В другом варианте он может разделить базу на две части \(1-2\) и \(3-4\). Для базы \(1-2\) он может либо сжечь ее целиком, затратив \(2 \cdot 1 \cdot 2 = 4\) единиц энергии, либо разделить ее на \(2\) части \(1-1\) и \(2-2\). Для базы \(1-1\) он может сжечь ее, затратив \(2 \cdot 1 \cdot 1 = 2\) единиц энергии. Для базы \(2-2\), он может сжечь ее, затратив \(1\) единицу энергии, так как на ней нет мстителей. Поэтому он может уничтожить базу \(1-2\) за \(2 + 1 = 3\) единицы энергии, что меньше, чем \(4\). Аналогично, необходимо \(3\) единицы энергии, чтобы уничтожить \(3-4\). Итого, можно уничтожить всю базу за \(6\) единиц энергии.
| |
|
|
F. Очередная задача про запросы к массиву
битмаски
математика
разделяй и властвуй
Структуры данных
теория чисел
*2400
Вам дан массив \(a_1, a_2, \ldots, a_n\). Необходимо выполнить \(q\) запросов следующих двух видов: - «MULTIPLY l r x» — для каждого \(i\) (\(l \le i \le r\)) нужно умножить \(a_i\) на \(x\).
- «TOTIENT l r» — вычислить \(\varphi(\prod \limits_{i=l}^{r} a_i)\) по модулю \(10^9+7\), где \(\varphi\) обозначает функцию Эйлера.
Функцией Эйлера целого положительного числа \(n\) (обозначается как \(\varphi(n)\)) называется количество целых чисел \(x\) (\(1 \le x \le n\)), таких что \(\gcd(n,x) = 1\). Выходные данные Для каждого запроса типа «TOTIENT» выведите ответ на него. Примечание В первом примере \(\varphi(1) = 1\) для первого запроса, \(\varphi(2) = 1\) для второго запроса и \(\varphi(6) = 2\) для третьего.
| |
|
|
F. Покупка блюд
разделяй и властвуй
Структуры данных
*2500
В городе живут \(m\) людей. Также в городе есть в продаже \(n\) блюд, где \(i\)-е блюде имеет цену \(p_i\), уровень \(s_i\) и симпатичность \(b_i\). У \(j\)-го человека есть доход \(inc_j\) и предпочтительная симпатичность \(pref_j\). Ни один человек никогда не купит блюдо, уровень которого ниже, чем его доход. Также, ни один человек не может позволить купить себе блюдо, с ценой выше, чем его доход. Иными словами, человек \(j\) может купить блюдо \(i\), если \(p_i \leq inc_j \leq s_i\). Также человек \(j\) может купить блюдо \(i\), только если \(|b_i-pref_j| \leq (inc_j-p_i)\). Иначе говоря, если цена блюда на \(k\) меньше, чем доход какого-то человека, то этот человек согласен на не более чем \(k\) абсолютную разницу между симпатичностью блюда и предпочитаемой симпатичностью этого человека. Выведите количество блюд, которые может купить каждый человек в городе. Выходные данные Выведите \(m\) целых чисел — количество блюд, которые может купить каждый человек, живущий в городе. Примечание В первом примере первый человек может купить блюдо \(2\), второй человек может купить блюда \(1\) и \(2\), а третий человек не может купить ни одного блюда. Во втором примере первый человек не может купить ни одного блюда, второй человек может купить блюда \(1\) и \(4\), а третий человек может купить блюда \(1\), \(2\) и \(4\).
| |
|
|
E. Беспалиндромные массивы
дп
Комбинаторика
разделяй и властвуй
*2200
Назовем массив \(b\) плохим если он содержит последовательный отрезок \(b_l, b_{l+1}, \dots, b_{r}\) нечетной длины больше \(1\) (\(l < r\) и \(r - l + 1\) нечетно) такой что \(\forall i \in \{0, 1, \dots, r - l\}\) \(b_{l + i} = b_{r - i}\). Если массив не плохой, то он хороший. Вам задан массив \(a_1, a_2, \dots, a_n\). Некоторые его элементы равны \(-1\). Посчитайте количество хороших массивов, которое вы можете получить, заменив все \(-1\) на какие-то числа от \(1\) до \(k\). Так как ответ может быть большим, выведите его по модулю \(998244353\). Выходные данные Выведите единственное число — количество хороших массивов, которые вы можете получить по модулю \(998244353\).
| |
|
|
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\) запросов.
| |
|
|
G. Двойное дерево
Деревья
кратчайшие пути
разделяй и властвуй
Структуры данных
*2700
Вам дан неориентированный граф специального вида. Он состоит из \(2n\) вершин, пронумерованных от \(1\) до \(2n\). Граф обладает следующими свойствами: - в нем ровно \(3n-2\) ребра: \(n\) ребер соединяют вершины с четными номерами и вершины с нечетными номерами, \(n - 1\) ребер соединяют вершины с нечетными номерами друг с другом, и \(n - 1\) ребер соединяют вершины с четными номерами друг с другом;
- для каждого ребра \((u, v)\) между вершинами с нечетными номерами существует ребро \((u + 1, v + 1)\), и наоборот;
- для каждого нечетного числа \(u \in [1, 2n - 1]\) существует ребро \((u, u + 1)\);
- граф является связным; более того, если мы удалим все четные вершины и ребра, инцидентные им, граф станет деревом (то же самое произойдет, если удалить все нечетные вершины).
Граф можно представить как два дерева с одинаковой структурой, и дополнительно \(n\) ребер, соединяющих соответствующие вершины в различных деревьях. Ребра графа являются взвешенными. Длина простого пути в этом графе определяется как сумма весов всех ребер, по которым проходит путь. Вам даны \(q\) запросов к графу; в каждом запросе требуется подсчитать длину кратчайшего пути между какой-то парой вершин. Можете ли вы справиться со всеми запросами? Выходные данные Выведите \(q\) целых чисел, \(i\)-е из которых должно быть ответом на \(i\)-й запрос. Примечание Граф в первом тесте выглядит следующим образом:
| |
|
|
E. Холодное тепло
битмаски
разделяй и властвуй
реализация
Структуры данных
*2400
Вам дан массив из \(n\) целых чисел \(a_1, a_2, \ldots, a_n\). Вам нужно выполнить \(q\) операций. В \(i\)-й операции у вас есть символ \(s_i\), который равен либо «<», либо «>», и число \(x_i\). Вы создаете новый массив \(b\) такой, что \(b_j = -a_j\), если \(a_j s_i x_i\) и \(b_j = a_j\) в противном случае (то есть, если \(s_i\) равен «>», то все знаки в \(a_j > x_i\) поменяются). После выполнения всех этих замен значения чисел в массиве \(a\) меняются на значения в \(b\). Вы хотите знать, как выглядит ваш массив после выполнения всех операций. Выходные данные Выведите \(n\) чисел \(c_1, c_2, \ldots, c_n\) — числа массива после выполнений всех операций. Примечание В первом примере массив изменяется следующим способом: - сначала: \([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]\)
- \(> 2\): \([-5, -4, -3, -2, -1, 0, 1, 2, -3, -4, -5]\)
- \(> -4\): \([-5, -4, 3, 2, 1, 0, -1, -2, 3, -4, -5]\)
- \(< 5\): \([5, 4, -3, -2, -1, 0, 1, 2, -3, 4, 5]\)
| |
|
|
D. Красивый массив
дп
жадные алгоритмы
Перебор
разделяй и властвуй
Структуры данных
*1900
Вам дан массив \(a\) состоящий из \(n\) целых чисел. Красота массива – это максимальная сумма какого-то последовательного подотрезка этого массива (этот подотрезок может быть пустым). Например красота массива [10, -5, 10, -4, 1] равна 15, а красота массива [-3, -5, -1] равна 0. Вы можете выбрать не более одного последовательного подотрезка массива \(a\) и домножить все элементы этого подотрезка на \(x\). Вы хотите максимизировать красоту массива после применения такой операции. Выходные данные Выведите одно число — максимальную красоту массива \(a\) после не более одного домножения непрерывного подотрезка этого массива на \(x\). Примечание В первом тестовом примере нужно домножить подотрезок [-2, 1, -6], после этого массив примет вид [-3, 8, 4, -2, 12] с красотой 22 ([-3, 8, 4, -2, 12]). Во втором примере нам не нужно домножать какой-либо подотрезок массива вообще. В третьем тестовом примере независимо от того, какой подотрезок мы домножим, красота массива будет равна 0.
| |
|
|
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]\).
| |
|
|
B. Lost Numbers
интерактив
математика
Перебор
разделяй и властвуй
*1400
Это интерактивная задача. Не забывайте о том, что ваша программа должна каждый раз после вывода запроса сбрасывать буфер вывода. Для сброса буфера вывода можно использовать fflush(stdout) в C++, system.out.flush() в Java, stdout.flush() в Python или flush(output) в Pascal. Если вы используете другой язык программирования, посмотрите в его документации, как выполняется эта операция. Также рекомендуем вам прочесть руководство по интерактивным задачам: https://cf.m27.workers.dev/blog/entry/45307. Жюри загадало некоторый массив \(a\), состоящий из \(6\) чисел. Существуют \(6\) особых чисел — \(4\), \(8\), \(15\), \(16\), \(23\), \(42\) — и каждое из них встречается в массиве \(a\) ровно один раз (то есть \(a\) — некоторая перестановка этих чисел). Вы не знаете ничего о их порядке в массиве, но вы можете отправить до \(4\) запросов. В каждом запросе вы выбираете два индекса \(i\) и \(j\) (\(1 \le i, j \le 6\), \(i\) и \(j\) не обязательно должны быть различны), и в ответ вы получите значение \(a_i \cdot a_j\). Можете ли вы отгадать массив \(a\)? Массив \(a\) в каждом тесте фиксирован заранее, тестирующая программа не пытается адаптировать его в зависимости от ваших запросов. Протокол взаимодействия До того, как ваша программа даст ответ на задачу, она может отправить до \(4\) запросов. Чтобы задать запрос, выведите одну строку следующего вида: \(?\) \(i\) \(j\), где \(i\) и \(j\) должны быть двумя целыми числами, удовлетворяющими условию \(1 \le i, j \le 6\). Строка, которую вы отправляете, должна заканчиваться символом перевода строки. После отправки запроса программа должна сбросить буфер вывода и прочитать ответ на запрос — строку, содержащую одно целое число \(a_i \cdot a_j\). Если вы отправите некорректный запрос (или отправите более \(4\) запросов), ответом будет строка 0. Если ваша программа получила такой ответ, она должна немедленно завершиться — иначе вы можете получить вердикт «Ошибка исполнения», «Превышено ограничение времени» или какой-нибудь другой, а не «Неправильный ответ». Чтобы дать ответ на задачу, ваша программа должна отправить строку \(!\) \(a_1\) \(a_2\) \(a_3\) \(a_4\) \(a_5\) \(a_6\) с символом перевода строки в конце. После этого она должна сбросить буфер вывода и завершиться. Примечание Если вы хотите отправить взлом по этой задаче, ваш тест должен содержать ровно шесть целых чисел \(a_1\), \(a_2\), ..., \(a_6\), разделенных пробелами. Каждое из \(6\) особых чисел должно встречаться в тесте ровно один раз. Тест должен заканчиваться символом конца строки.
| |
|
|
D. Небыстрое преобразование
математика
разделяй и властвуй
*2500
Пусть a — массив из n чисел, элементы которого пронумерованы от 1 до n, even — массив из чисел, номера которых в a четные (eveni = a2i, 1 ≤ 2i ≤ n), odd — массив из чисел, номера которых в а нечетные (oddi = a2i - 1, 1 ≤ 2i - 1 ≤ n). Тогда определим преобразование массива F(a) следующим образом: - если n > 1, F(a) = F(odd) + F(even), где операция « + » обозначает конкатенацию (склейку) массивов
- если n = 1, F(a) = a
Выберем в качестве a массив из n чисел 1, 2, 3, ..., n. Тогда b — результат применения преобразования к массиву a (то есть b = F(a)). Вам дано m запросов (l, r, u, v). Ваша задача — для каждого запроса найти сумму чисел bi, таких что l ≤ i ≤ r и u ≤ bi ≤ v. Ответы на запросы нужно выводить по модулю mod. Выходные данные Выведите m строк по одному целому числу в каждой — остатки от деления ответов на запросы на mod. Примечание Рассмотрим первый пример. Сначала построим массив b = F(a) = F([1, 2, 3, 4]). - Шаг 1. F([1, 2, 3, 4]) = F([1, 3]) + F([2, 4])
- Шаг 2. F([1, 3]) = F([1]) + F([3]) = [1] + [3] = [1, 3]
- Шаг 3. F([2, 4]) = F([2]) + F([4]) = [2] + [4] = [2, 4]
- Шаг 4. b = F([1, 2, 3, 4]) = F([1, 3]) + F([2, 4]) = [1, 3] + [2, 4] = [1, 3, 2, 4]
Итак b = [1, 3, 2, 4]. Рассмотрим первый запрос l = 2, r = 3, u = 4, v = 5. На второй и третьей позиции в массиве b нет чисел в диапазоне [4, 5], очевидно, что сумма ноль. Рассмотрим второй запрос l = 2, r = 4, u = 1, v = 3. Есть два числа на второй и третьей позиции, которые попадают в диапазон [1, 3], их сумма 5.
| |
|
|
E. Дерево или не дерево
графы
Деревья
разделяй и властвуй
реализация
Структуры данных
*2900
Дан неориентированный связный граф G из n вершин и n ребер. G не содержит петель и кратных ребер. Пусть у каждого ребра этого графа есть два состояния: включено и выключено. Изначально все ребра выключены. Также вам даны m запросов вида (v, u) — изменить состояние всех ребер на кратчайшем пути из вершины v в вершину u в графе G, если таких путей несколько, выбирается лексикографически наименьший. Более формально, рассмотрим все кратчайшие пути из вершины v в вершину u как последовательности вершин v, v1, v2, ..., u. Среди таких последовательностей выбирается лексикографически наименьшая. Требуется после каждого запроса сказать, сколько компонент связности в графе, вершины которого совпадают с вершинами графа G, а ребра совпадают с включенными ребрами графа G. Выходные данные Выведите m строк по одному целому числу в каждой — ответы на запросы. Примечание Рассмотрим первый пример. Будем синим выделять на рисунке включенные ребра. -
Граф до применения операций. В графе нет включенных ребер, поэтому 5 компонент связности есть изначально. -
Граф после запроса v = 5, u = 4. Видно, что в графе 3 компоненты, если рассматривать только включенные ребра. -
Граф после запроса v = 1, u = 5. Видно, что в графе 3 компоненты, если рассматривать только включенные ребра.
Лексикографическое сравнение двух последовательностей одинаковой длины (k чисел) происходит следующим образом. Последовательность x лексикографически меньше последовательности y если существует такое i (1 ≤ i ≤ k), что xi < yi, а для любого j (1 ≤ j < i) xj = yj.
| |
|
|
F. Ихаб и Большой Финал
графы
Деревья
интерактив
Конструктив
разделяй и властвуй
реализация
*2400
Это интерактивная задача. Вам дано дерево, состоящее из \(n\) вершин, с корнем в вершине \(1\). Дерево — это связный граф без циклов. Мы выбрали секретную вершину \(x\). Чтобы найти эту вершину, вы можете задавать запросы двух типов: - d \(u\) (\(1 \le u \le n\)). Мы ответим расстоянием между вершинами \(u\) и \(x\). Расстояние между двумя вершинами — это количество ребер в кратчайшем пути между ними.
- s \(u\) (\(1 \le u \le n\)). Мы ответим номер второй вершины на пути от \(u\) до \(x\). Тем не менее, есть одна хитрость. Если \(u\) не является предком \(x\), вы получите вердикт «Неправильный ответ»!
Вершина \(a\) называется предком вершины \(b\), если \(a \ne b\) и кратчайший путь от вершины \(1\) к вершине \(b\) проходит через вершину \(a\). Обратите внимание, что в этой задаче вершина не является предком сама себе. Можете ли вы найти \(x\), сделав не более \(36\) запросов? Скрытая вершина зафиксирована в каждом тесте заранее и не зависит от ваших запросов. Выходные данные Чтобы вывести ответ, выведите «! x» (без кавычек). Протокол взаимодействия Чтобы задать запрос, выведите в одном из двух следующих форматов: - d \(u\) (\(1 \le u \le n\)), или
- s \(u\) (\(1 \le u \le n\)).
После каждого вопроса вы должны прочитать ответ: либо расстояние, либо вторую вершину пути, как описано в легенде. Если мы ответим \(-1\) вместо корректного ответа, это означает, что вы превысили количество запросов, сделали неверный запрос или нарушили условие во втором типе запросов. Завершите вашу программу сразу после получения \(-1\), и вы получите вердикт Wrong answer. В противном случае вы можете получить другой вердикт, потому что ваше решение будет продолжать читать из закрытого потока. После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Взломы: Первая строка должна содержать два целых числа \(n\) и \(x\) (\(2 \le n \le 2 \cdot 10^5\), \(1 \le x \le n\)). Каждая из следующих \(n-1\) строк должна содержать два целых числа \(u\) и \(v\) (\(1 \le u,v \le n\)), которые значат, что между вершинами \(u\) и \(v\) есть ребро. Граф должен образовать дерево. Примечание В первом примере секретной вершиной является вершина \(5\). Сначала мы спросим о расстоянии между вершинами \(x\) и \(2\). Ответ \(3\), поэтому вершина \(x\) равна либо \(4\), либо \(5\). Затем мы спрашиваем о второй вершине на пути от вершины \(3\) к вершине \(x\). Обратите внимание, что вершина \(3\) является предком вершины \(5\). Мы получаем вершину \(5\) в качестве ответа. Наконец, мы сообщаем, что секретная вершина — это вершина \(5\).
| |
|
|
E. Минимальное покрытие отрезков
Деревья
дп
жадные алгоритмы
поиск в глубину и подобное
разделяй и властвуй
реализация
Структуры данных
*2200
Даны \(n\) отрезков в формате \([l; r]\) на числовой прямой. Также даны \(m\) запросов в формате \([x; y]\). Какое минимальное число отрезков надо взять так, чтобы каждая точка (не обязательно целочисленная) от \(x\) до \(y\) была покрыта хотя бы одним из них? Если нельзя выбрать отрезки так, чтобы каждая точка от \(x\) до \(y\) была покрыта, тогда выведите -1 на этот запрос. Выходные данные Выведите \(m\) целых чисел. \(i\)-е число должно быть ответом на \(i\)-й запрос: либо минимальное число отрезков необходимое, чтобы каждая точка (не обязательно целочисленная) от \(x_i\) до \(y_i\) была покрыта хотя бы одним из них, либо -1, если нельзя выбрать отрезки так, чтобы каждая точка от \(x_i\) до \(y_i\) была покрыта. Примечание В первом примере три запроса: - запрос \([1; 3]\) может быть покрыт отрезком \([1; 3]\);
- запрос \([1; 4]\) может быть покрыт отрезками \([1; 3]\) и \([2; 4]\). Нельзя покрыть \([1; 4]\) одним отрезком;
- запрос \([3; 4]\) может быть покрыт отрезком \([2; 4]\); Не важно, что покрыты какие-то точки вне данного запроса.
Во втором примере четыре запроса: - запрос \([1; 2]\) может быть покрыт отрезком \([1; 3]\). Обратите внимание, что можно выбрать любой из отрезков \([1; 3]\);
- запрос \([1; 3]\) может быть покрыт отрезком \([1; 3]\);
- запрос \([1; 4]\) не может быть покрыт никаким набором отрезков;
- запрос \([1; 5]\) не может быть покрыт никаким набором отрезков. Обратите внимание, что отрезки \([1; 3]\) и \([4; 5]\) вместе не покрывают \([1; 5]\), потому что даже нецелые точки должны быть покрыты. Здесь \(3.5\) не покрыта, например.
| |
|
|
F. Количество подперестановок
математика
Перебор
разделяй и властвуй
Структуры данных
хэши
*2500
У вас есть массив \(a_1, a_2, \dots, a_n\). Назовем подотрезок \(a_l, a_{l + 1}, \dots , a_r\) этого массива подперестановкой если он содержит все числа от \(1\) до \(r-l+1\) ровно по одному разу. Например, массив \(a = [2, 2, 1, 3, 2, 3, 1]\) содержит \(6\) подотрезков, являющихся подперестановками: \([a_2 \dots a_3]\), \([a_2 \dots a_4]\), \([a_3 \dots a_3]\), \([a_3 \dots a_5]\), \([a_5 \dots a_7]\), \([a_7 \dots a_7]\). Вам нужно посчитать количество подперестановок. Выходные данные В единственной строке выведите количество подперестановок массива \(a\). Примечание В первом тестовом примере \(7\) подперестановок: \([1, 4]\), \([3, 3]\), \([3, 6]\), \([4, 7]\), \([6, 7]\), \([7, 7]\) и \([7, 8]\). Во втором тестовом примере \(6\) подперестановок: \([1, 1]\), \([2, 2]\), \([2, 3]\), \([3, 4]\), \([4, 4]\) и \([4, 5]\).
| |
|
|
G. Очередная задача на разбиения
геометрия
дп
разделяй и властвуй
Структуры данных
*3000
Вам задан массив \(a_1, a_2, \dots, a_n\). Вам необходимо разделить его на \(k\) подотрезков (так, что каждый элемент принадлежит ровно одному подотрезку). Весом подотрезка \(a_l, a_{l+1}, \dots, a_r\) назовем значение \((r - l + 1) \cdot \max\limits_{l \le i \le r}(a_i)\). Весом разбиения — суммарный вес его подотрезков. Найдите разбиение минимального веса. Выходные данные Выведите единственное число — минимальный вес среди всех возможных разбиений. Примечание Оптимальное разбиение в первом примере: \(6\) \(1\) \(7\) \(\bigg|\) \(4\). Оптимальное разбиение во втором примере: \(6\) \(\bigg|\) \(1\) \(\bigg|\) \(7\) \(4\). Одно из оптимальных разбиений в третьем примере: \(5\) \(\bigg|\) \(1\) \(5\) \(\bigg|\) \(1\) \(\bigg|\) \(5\).
| |
|
|
B. Последовательность цифр (усложнённая версия)
Бинарный поиск
разделяй и властвуй
реализация
*1800
Выпишем подряд без каких-либо разделителей все целые числа от \(1\) и далее (то есть выпишем в одну строку). В результате получится последовательность цифр, которая начинается вот так: 123456789101112131415161718192021222324252627282930313233343536... Ваша задача вывести \(k\)-ю цифру в этой последовательности. Выходные данные Выведите \(k\)-ю цифру построенной бесконечной последовательности цифр.
| |
|
|
E. Алеся и дискретная математика
интерактив
разделяй и властвуй
*3200
Назовем функцию хорошей, если ее область определения — целые числа, и если для любого \(x\) из области определения верно, что если в \(x-1\) функция определена, то \(f(x) = f(x-1) + 1\) либо \(f(x) = f(x-1)\) Таня нашла \(n\) хороших функций \(f_{1}, \ldots, f_{n}\), которые определены во всех целых точках от \(0\) до \(10^{18}\) включительно, причем \(f_i(0) = 0\) и \(f_i(10^{18}) = L\) для всех \(i\) от \(1\) до \(n\). Также оказалось, что \(L\) делится на \(n\). Она предложила Алесе сыграть в игру. Алеся может за один вопрос узнать у Тани значение какой-то одной функции в какой-то одной точке. Для того, чтобы выиграть, ей надо для всех \(1 \leq i \leq n\) для \(i\)-й функции выбрать два целых числа \(l_{i}\) и \(r_{i}\) (\(0 \leq l_{i} \leq r_{i} \leq 10^{18}\)), что \(f_{i}(r_{i}) - f_{i}(l_{i}) \geq \frac{L}{n}\), где \(f_i(x)\) обозначает значение \(i\)-й функции в точке \(x\) . Причем надо выбрать такие пары чисел, чтобы никакая пара отрезков \([l_i, r_i]\) не пересекалась (но могут касаться). К сожалению, Таня не разрешает Алесе задать более \(2 \cdot 10^{5}\) вопросов. Помогите Алесе выиграть! Можно показать, что всегда можно выбрать такие \([l_i, r_i]\), которые удовлетворяют описанным выше условиям. Гарантируется, что Таня не изменяет функции в процессе игры, то есть интерактор не адаптивный. Выходные данные Когда вы найдете нужные \(l_i, r_i\), выведите \("!"\) и в следующих \(n\) строках по паре чисел, в \(i\)-й из них — \(l_i\) и \(r_i\). Протокол взаимодействия Чтобы узнать значение \(f_i(x)\), в одной строке через пробел выведите символ «?», а затем два целых числа \(i\) и \(x\) (\(1 \leq i \leq n\), \(0 \leq x \leq 10^{18}\)). Не забудьте сделать операцию 'flush', чтобы получить ответ. В ответ на это считайте целое число, равное значению \(i\)-й функции в точке \(x\). Вы можете задать не более \(2 \cdot 10^5\) вопросов. Для сброса буфера вывода (то есть для операции 'flush') сразу после вывода числа или ответа и перевода строки можно сделать: - fflush(stdout) в языке C++;
- System.out.flush() в Java;
- stdout.flush() в Python;
- flush(output) в Pascal;
- смотрите документацию для других языков.
Взломы: Для взлома можно использовать только тесты с \(1 \leq L \leq 2000\), для этого задайте тест в следующем формате. В первой строке должны находиться два целых числа \(n\) и \(L\) (\(1 \leq n \leq 1000\), \(1 \leq L \leq 2000\), \(L\) делится на \(n\)) — число функций и их значение в \(10^{18}\). В каждой из следующих \(n\) строк должны быть выведены \(L\) чисел \(l_1\), \(l_2\), ... , \(l_L\) (\(0 \leq l_j < 10^{18}\) для всех \(1 \leq j \leq L\) и \(l_j < l_{j+1}\) для всех \(1 < j \leq L\)), в \(i\)-й строке \(l_j\) значит что \(f_i(l_j) < f_i(l_j + 1)\). Примечание В примере у Пети \(5\) одинаковых функций, что \(f(0) = 0\), \(f(1) = 1\), \(f(2) = 2\), \(f(3) = 3\), \(f(4) = 4\), во всех остальных точках значение равно \(5\). Вася должен выбрать по два целых числа для каждой функции, что разность значений в этих точках, не менее \(\frac{L}{n}\) (что равно \(1\) в данном случае), и длина пересечения всех пар отрезков, образованных на этих числах, была нулевой. Один из возможных способов — это выбрать пары чисел \([0\), \(1]\), \([1\), \(2]\), \([2\), \(3]\), \([3\), \(4]\) и \([4\), \(5]\) для функций \(1\), \(2\), \(3\), \(4\) и \(5\) соответственно.
| |
|
|
E1. История одной страны (простая)
Перебор
разделяй и властвуй
сортировки
*2500
Эта задача отличается от следующей только ограничениями. На летние каникулы Петя приехал в Байтландию. Как оказалась, история этого государства весьма необычна. Изначально, до появления Байтландии, на её территории были расположены \(n\) различных стран. Каждое государство владело своей территорией, которую можно было представить на карте как прямоугольник, стороны которого параллельны осям координат, а вершины расположены в целочисленных точках. Никакие две страны не пересекались, однако они могли касаться сторонами. Иногда в результате агрессивных переговоров и мирных военных походов две страны объединялись в одну. Слияние происходило только в том случае, если после объединения их владений снова получалась прямоугольная территория. В конце концов осталось только одно государство — Байтландия. В начале времён территория каждой страны содержала внутри себя ровно один прямоугольный замок, где стороны этого замка параллельны осям координат, а вершины расположены в целочисленных точках. Допускается, что границы замка могли прилегать к границе соответствующей территории страны и к границам других замков. Удивительным образом, даже после всех переворотов, замки прекрасно сохранились. Но, к сожалению, это единственная информация, которая позволяет хоть как-то судить об изначальном расположении стран. Возможное формирование Байтландии. Замки отмечены синим цветом. Петя не смог смириться с тем, что не осталось никаких данных об изначальных странах. У него возникло подозрение, что вся эта история всего лишь вымысел. Он знает, что вы умный человек, и поэтому просит у вас помощи. Требуется выяснить, существует ли расположение изначальных государств, для которых может быть верна данная история, или нет. Выходные данные Если существуют расположения изначальных стран, для которых верна данная история, то выведите «YES», иначе выведите «NO». Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Примечание На картинках ниже изображено расположение замков в первом и втором примере.
| |
|
|
E. Казак Вус и поле
математика
разделяй и властвуй
реализация
*2500
У Казака Вуса есть поле с размерами \(n \times m\), которое состоит из «0» и «1». Он строит из этого поля бесконечное поле. Это он делает так: - Берет текущее поле и находит для него новое инвертированное поле. Другими словами, в новом поле будет «1» там, где был «0», а «0» там, где был «1».
- К начальному полю приписывает справа инвертированное поле.
- К начальному полю приписывает снизу инвертированное поле.
- К начальному полю приписывает справа снизу начальное поле.
- Повторяет все это.
Например, если начальное поле было таким: \(\begin{matrix} 1 & 0 & \\ 1 & 1 & \\ \end{matrix}\) После первой итерации оно станет таким: \(\begin{matrix} 1 & 0 & 0 & 1 \\ 1 & 1 & 0 & 0 \\ 0 & 1 & 1 & 0 \\ 0 & 0 & 1 & 1 \\ \end{matrix}\) После второй итерации оно станет таким: \(\begin{matrix} 1 & 0 & 0 & 1 & 0 & 1 & 1 & 0 \\ 1 & 1 & 0 & 0 & 0 & 0 & 1 & 1 \\ 0 & 1 & 1 & 0 & 1 & 0 & 0 & 1 \\ 0 & 0 & 1 & 1 & 1 & 1 & 0 & 0 \\ 0 & 1 & 1 & 0 & 1 & 0 & 0 & 1 \\ 0 & 0 & 1 & 1 & 1 & 1 & 0 & 0 \\ 1 & 0 & 0 & 1 & 0 & 1 & 1 & 0 \\ 1 & 1 & 0& 0 & 0 & 0 & 1 & 1 \\ \end{matrix}\) И так далее... Пронумеруем строки сверху вниз от \(1\) до бесконечности, а столбцы слева направо от \(1\) до бесконечности. Назовем подматрицей \((x_1, y_1, x_2, y_2)\) все числа, которые имеют координаты \((x, y)\), такие что \(x_1 \leq x \leq x_2\) и \(y_1 \leq y \leq y_2\). Казаку иногда нужно находить сумму всех чисел на подматрицах. Так как он очень занят сейчас, помогите ему найти ответы! Выходные данные Для каждого запроса выведите ответ. Примечание Первый пример объяснен в легенде.
| |
|
|
D. Tokitsukaze и странный прямоугольник
разделяй и властвуй
сортировки
Структуры данных
*2000
Дано \(n\) точек на плоскости, \(i\)-я из которых расположена в \((x_i, y_i)\). Tokitsukaze хочет нарисовать странную прямоугольную область и взять все точки в этой области. Странная область ограничена тремя прямыми, \(x = l\), \(y = a\) и \(x = r\), это ее левая, нижняя и правая сторона, соответственно, где \(l\), \(r\) и \(a\) могут являться любыми вещественными числами, удовлетворяющими \(l < r\). Верхняя сторона области неограничена, то есть можно считать, что она ограничена прямой, параллельной оси \(x\), и бесконечно удаленной. Странная прямоугольная область изображена на следующей иллюстрации. Точка \((x_i, y_i)\) находится в странной прямоугольной области тогда и только тогда, когда \(l < x_i < r\) и \(y_i > a\). К примеру, на иллюстрации выше \(p_1\) находится в области, а \(p_2\) — нет. Tokitsukaze хочет узнать, сколько существует различных непустых множеств, которые можно получить, выбирая все точки в некоторой странной прямоугольной области. Два множества считаются различными, если существует хотя бы одна точка в одном из них, которой нет во втором. Выходные данные Выведите единственное целое число — количество различных непустых множеств точек, которые она может получить. Примечание В первом примере существует только одно множество, содержащее \(k\) точек для \(k = 1, 2, 3\), поэтому общее число множеств равно \(3\). Во втором примере количества множеств размера \(k\) для \(k = 1, 2, 3\) равны \(3\), \(2\), \(1\) соответственно, и их сумма равна \(6\). В третьем примере, как показывает следующая иллюстрация, есть - \(2\) множества из одной точки;
- \(3\) множества из двух точек;
- \(1\) множество из четырех точек.
Исходя из этого, количество различных непустых множеств в этом примере равно \(2 + 3 + 0 + 1 = 6\).
| |
|
|
B. Динамический диаметр
*особая задача
Деревья
поиск в глубину и подобное
разделяй и властвуй
Структуры данных
Вам дано взвешенное неориентированное дерево с \(n\) вершинами, а также список из \(q\) обновлений. Каждое обновление меняет вес одного ребра. Ваша задача — вычислить диаметр дерева после каждого обновления. (Расстоянием между двумя вершинами называется сумма весов ребер на единственном простом пути между этими двумя вершинами. Диаметр дерева — наибольшее из этих расстояний.) Выходные данные Выведите \(q\) строк. Для всех возможных \(i\) строка \(i\) должна содержать диаметр дерева после \(i\)-го обновления. Система оценки Подзадача 1 (11 баллов): \(n,q \leq 100\) и \(w \leq 10,000\) Подзадача 2 (13 баллов): \(n,q \leq 5,000\) и \(w \leq 10,000\) Подзадача 3 (7 баллов): \(w \leq 10,000\), и все ребра дерева имеют вид \(\{1, i\}\) (То есть граф имеет вид «звезды» с центром в вершине 1.) Подзадача 4 (18 баллов): \(w \leq 10,000\), и все ребра дерева имеют вид \(\{i, 2i\}\) и \(\{i, 2i+1\}\) (То есть если мы подвесим дерево за вершину 1, то оно будет иметь вид сбалансированного бинарного дерева.) Подзадача 5 (24 балла): гарантируется, что после каждого обновления по крайней мере один из наидлиннейших простых путей проходит через вершину \(1\) Подзадача 6 (27 баллов): нет дополнительных ограничений Примечание Первый пример показан на рисунке ниже. Рисунок слева показывает изначальное дерево. Каждый следующий рисунок показывает ситуацию после очередного обновления. Вес обновленного ребра показан зеленым, а диаметр — красным. 
Первое обновление меняет вес \(3\)-го ребра, т.е. \(\{2, 4\}\), на \(1030\). Наибольшее расстояние между какой-либо парой вершин равно \(2030\) — расстояние между \(3\) и \(4\). Так как ответ равен \(2030\), то для второго обновления \(\)d'_2 = (1 + 2030) \bmod 3 = 0\(\) \(\)e'_2 = (1020 + 2030) \bmod 2000 = 1050\(\) Поэтому вес ребра \(\{1, 2\}\) меняется на \(1050\). Теперь наибольшее расстояние между вершинами \(\{1, 4\}\), оно равно \(2080\). Для третьего обновления имеем \(\)d'_3 = (1 + 2080) \bmod 3 = 2\(\) \(\)e'_3 = (890 + 2080) \bmod 2000 = 970\(\) Теперь, так как вес ребра \(\{2, 4\}\) уменьшается до \(970\), наиболее удаленная пара вершин, внезапно, \(\{1, 3\}\), а расстояние — \(2050\).
| |
|
|
J. Минимальная сумма
геометрия
разделяй и властвуй
сортировки
*1900
Вам задан набор из n векторов на плоскости. Для каждого вектора разрешается домножить любые его координаты на -1. Таким образом, каждый вектор vi = (xi, yi) можно преобразовать в один из следующих четырех векторов: - vi1 = (xi, yi),
- vi2 = ( - xi, yi),
- vi3 = (xi, - yi),
- vi4 = ( - xi, - yi).
Вам нужно найти два вектора из набора и определить, какие из их координат следует умножить на -1 таким образом, чтобы модуль суммы полученных векторов был минимально возможным. Более формально, требуется выбрать два вектора vi, vj (1 ≤ i, j ≤ n, i ≠ j) и два числа k1, k2 (1 ≤ k1, k2 ≤ 4), так чтобы значение выражения |vik1 + vjk2| было минимально. Выходные данные Выведите в первой строке четыре числа через пробел «i k1 j k2» — ответ на задачу. Если существует несколько вариантов с минимальным модулем суммы, можете вывести любой из них. Примечание Суммой двух векторов v = (xv, yv) и u = (xu, yu) называется вектор s = v + u = (xv + xu, yv + yu). Модулем вектора v = (x, y) называется число . Во втором примере существует несколько подходящих ответов, вот некоторые из них: (3 1 4 2), (3 1 4 4), (3 4 4 1), (3 4 4 3), (4 1 3 2), (4 1 3 4), (4 2 3 1).
| |
|
|
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
| |
|
|
D. Xor Spanning Tree
бпф
графы
разделяй и властвуй
*2400
In the galaxy far far away is the ancient interplanetary republic of Bubbleland, consisting of \(N\) planets. Between them, there are \(M\) bidirectional wormholes, each connecting a pair of planets. Bubbleland is a very centralized republic, having a capital planet Whiteplanet, from which any another planet can be reached using these wormholes. It is also guaranteed that no wormhole connects planet to itself and that no two different wormholes connect same pair of planets. We call a path that begins at one planet, visits other planets and each of them at most once and returns to starting point a tour. Interplanetary Safety Regulations guarantee that each planet belongs to at most one tour and that there are at most \(42\) tours. After many eons of usage, wormholes need to be repaired and each wormhole has the cost \(W_{i}\) which needs to be payed for reparation. Unfortunately, the Senate of Bubbleland is short on budget. Therefore, they have decided only to fix as many wormholes as they need in order to have all planets reachable from capital and to pay as little money as they have to for this repair. However the way in which the Senate calculates the cost is different. Cost of the set of reparations is binary xor of costs of each individual reparation, that is if reparations to be made have costs \(A_{1},A_{2},...,A_{k}\), the cost of entire set is \(A_{1} \oplus A_{2} \oplus ... \oplus A_{k}\). Now the Senate would like to know how much money do they have to pay and also the number of different ways to achieve that cost modulo \(1000000007\). Output Output two numbers, the smallest possible cost of entire reparation and the number of different valid reparations with that cost modulo \(1000000007\). Note We can repair wormholes \(1\),\(2\),\(3\),\(5\) and \(6\), paying \(5 \oplus 1\oplus 2 \oplus 3 \oplus 4=1\), one can check that this is the cheapest repair in which all of the planets are connected and the only valid repair with that cost.
| |
|
|
E. Product Tuples
бпф
разделяй и властвуй
*2500
While roaming the mystic areas of Stonefalls, in order to drop legendary loot, an adventurer was given a quest as follows. He was given an array \(A = {a_1,a_2,...,a_N }\) of length \(N\), and a number \(K\). Define array \(B\) as \(B(q, A) = \) { \(q-a_1, q-a_2, ..., q-a_N\) }. Define function \(F\) as \(F(B,K)\) being sum of products of all \(K\)-tuples of elements in array \(B\). For example, if the array \(B\) is \([2,3,4,5]\), and with \(K=3\), sum of products of all 3-tuples is \(\)F(B, 3) = 2*3*4+2*3*5+3*4*5+2*4*5\(\) He was then given a number Q, number of queries of two types: - Type 1: Given \(q\), \(i\), and \(d\) calculate \(F(B(q, A), K)\) where we make change to initial array as \(A[i] = d\).
- Type 2: Given \(q\), \(L\), \(R\), and \(d\) calculate \(F(B(q, A), K)\) where we make change to initial array as \(A[i] = A[i] + d\) for all \(i\) in range \([L, R]\) inclusive.
All changes are temporarily made to initial array, and don't propagate to following queries. Help the adventurer calculate the answer to a quest, and finally get that loot! Output Print \(Q\) lines, the answers to queries, modulo \(998244353\). Note In the first query array A = [1, 2, 3, 4, 5], B = [5, 4, 3, 2, 1], sum of products of 2-tuples = 85. In second query array A = [1, 2, 3, 4, 2], B = [5, 4, 3, 2, 4], sum of products of 2-tuples = 127 In third query array A = [1, 3, 4, 4, 5], B = [5, 3, 2, 2, 1], sum of products of 2-tuples = 63
| |
|
|
F. Стек-уничтожимые массивы
дп
разделяй и властвуй
Структуры данных
хэши
*2600
Давайте рассмотрим следующий процесс: изначально у вас есть пустой стек и массив \(s\) длины \(l\). Вы пытаетесь добавлять элементы массива в стек в порядке \(s_1, s_2, s_3, \dots s_{l}\). Причем если стек пустой или элемент на вершине стека не равен текущему, то вы просто добавляете текущий элемент на вершину стека. Иначе вы не добавляете элемент и более того, удаляете верхний элемент стека. Если после данного процесса стек окажется пустым, то массив \(s\) считается стек-уничтожимым. Примеры стек-уничтожимых массивов: - \([1, 1]\);
- \([2, 1, 1, 2]\);
- \([1, 1, 2, 2]\);
- \([1, 3, 3, 1, 2, 2]\);
- \([3, 1, 3, 3, 1, 3]\);
- \([3, 3, 3, 3, 3, 3]\);
- \([5, 1, 2, 2, 1, 4, 4, 5]\);
Давайте рассмотрим изменения стека более подробно при \(s = [5, 1, 2, 2, 1, 4, 4, 5]\) (элемент на вершине текста выделен жирным шрифтом). - после добавления \(s_1 = 5\) стек будет равен \([\textbf{5}]\);
- после добавления \(s_2 = 1\) стек будет равен \([5, \textbf{1}]\);
- после добавления \(s_3 = 2\) стек будет равен \([5, 1, \textbf{2}]\);
- после добавления \(s_4 = 2\) стек будет равен \([5, \textbf{1}]\);
- после добавления \(s_5 = 1\) стек будет равен \([\textbf{5}]\);
- после добавления \(s_6 = 4\) стек будет равен \([5, \textbf{4}]\);
- после добавления \(s_7 = 4\) стек будет равен \([\textbf{5}]\);
- после добавления \(s_8 = 5\) стек станет пустым.
Вам задан массив \(a_1, a_2, \ldots, a_n\). Вам нужно посчитать количество подотрезков этого массива, которые являются стек-уничтожимыми. Обратите внимание, что вам нужно ответить на \(q\) независимых запросов. Выходные данные На каждый запрос выведите одно число — количество стек-уничтожимых подотрезков массива \(a\). Примечание В первом запросе есть четыре стек-уничтожимых подотрезка: \(a_{1 \ldots 4} = [2, 1, 1, 2], a_{2 \ldots 3} = [1, 1], a_{2 \ldots 5} = [1, 1, 2, 2], a_{4 \ldots 5} = [2, 2]\). Во втором запросе только один стек-уничтожимый подотрезок — \(a_{3 \ldots 4}\). В третьем запросе есть восемь стек-уничтожимых подотрезков: \(a_{1 \ldots 8}, a_{2 \ldots 5}, a_{2 \ldots 7}, a_{2 \ldots 9}, a_{3 \ldots 4}, a_{6 \ldots 7}, a_{6 \ldots 9}, a_{8 \ldots 9}\).
| |
|
|
C2. Сбалансированные удаления (посложнее)
Бинарный поиск
жадные алгоритмы
Конструктив
разделяй и властвуй
реализация
сортировки
*1900
Это усложнённая версия задачи. В этой версии \(n \le 50\,000\). В трёхмерном пространстве заданы \(n\) различных точек, пронумерованных от \(1\) до \(n\). \(i\)-я точка имеет координаты \((x_i, y_i, z_i)\). Число точек \(n\) — чётное. Вы хотели бы удалить все \(n\) точек, используя последовательность из \(\frac{n}{2}\) щелчков. За один щелчок вы можете удалить любые две ещё не удалённые точки \(a\) и \(b\), которые образуют идеально сбалансированную пару. Пара точек \(a\) и \(b\) идеально сбалансирована, если никакая другая точка \(c\) (которая ещё не удалена) не лежит в пределах минимального ограничивающего точки \(a\) и \(b\) прямоугольного параллелепипеда с рёбрами, параллельными осям координат. Формально, точка \(c\) лежит внутри ограничивающего параллелепипеда точек \(a\) и \(b\) тогда и только тогда, когда \(\min(x_a, x_b) \le x_c \le \max(x_a, x_b)\), \(\min(y_a, y_b) \le y_c \le \max(y_a, y_b)\) и \(\min(z_a, z_b) \le z_c \le \max(z_a, z_b)\). Обратите внимание, что параллелепипед может быть вырожденным. Найдите способ удалить все точки за \(\frac{n}{2}\) щелчков. Выходные данные Выведите \(\frac{n}{2}\) пар целых чисел \(a_i, b_i\) (\(1 \le a_i, b_i \le n\)) — номера точек, удаляемых щелчком \(i\). Каждое целое число от \(1\) до \(n\) должно встретиться в выводе ровно один раз. Можно показать, что всегда возможно удалить все точки. Если есть несколько решений, выведите любое. Примечание В первом примере точки и их соответствующие параллелепипеды выглядят так (изображённые для простоты в двумерном пространстве, так как все точки лежат на плоскости \(z = 0\)). Обратите внимание, что порядок удаления точек важен: например, точки \(5\) и \(1\) не образуют идеально сбалансированную пару изначально, но начинают её образовывать после того, как удалена точка \(3\).
| |
|
|
M. SmartGarden
Конструктив
разделяй и властвуй
*2500
Berland Gardeners United Inc. hired you for the project called "SmartGarden". The main feature of this project is automatic garden watering. Formally the garden can be represented as a square of \(n \times n\) cells with rows numbered \(1\) to \(n\) from top to bottom and columns numbered \(1\) to \(n\) from left to right. Each cell of the garden contains either a plant or a slab. It's known that slabs are located on the main diagonal of the matrix representing the garden, and in the cells that are below the main diagonal and share a side with at least one cell of the main diagonal. All the remaining cells of the garden are filled with plants. Example of the garden for \(n=5\). During implementation of the project you created a smart robot that takes a list of commands as an input, which are processed one by one. Each command contains: - a list of horizontal lines (rows in the matrix representing the garden);
- a list of vertical lines (columns in the matrix representing the garden).
While executing each command robot waters only cells in the intersection of specified rows and specified columns. So, if you specify \(r\) rows and \(c\) columns, then exactly \(r \cdot c\) cells will be watered. In the demo for the customer you have tuned robot in such a way that it waters all the garden. To do that you prepared a single command containing all \(n\) rows and all \(n\) columns. Unfortunately, 5 hours before the demo for your customer it turned out that the CEO of Berland Gardeners United Inc. was going to take part in it. Moreover, most probably he will be standing on a garden slab during the demo! Now you need to create a list of commands for the robot so that it waters all the plants and doesn't water any cell containing a slab. Since it's only a beta version of "SmartGarden", the total number of commands shouldn't exceed \(50\). Create a program that, for a given size of the garden, will find a list of no more than \(50\) commands that allow the robot to water all the plants in the garden without watering the slabs. It is allowed to water a plant several times. Output In the first line print the total number of commands for the robot \(k\) (\(1 \le k \le 50\)). In the next \(2 \cdot k\) lines print all the commands. Each command should be specified by \(2\) lines. The first line of each command should describe rows in the command and the second line should describe columns in the command. Each of these \(2\) lines should have the following format: - the first number of the line should specify the total number of items \(x\) in the appropriate list;
- then \(x\) distinct numbers follow, where each number is in the range \(1 \dots n\) and describes a chosen row for the first line and a chosen column for the second line.
If there are multiple ways to water the garden, print any of them.
| |
|
|
G. Множество делителей
бпф
жадные алгоритмы
математика
разделяй и властвуй
теория чисел
*2600
Вам задано число \(x\), представленное в виде произведения \(n\) своих простых делителей \(p_1 \cdot p_2, \cdot \ldots \cdot p_n\). Пусть \(S\) — это множество всех положительных целых делителей числа \(x\) (включая \(1\) и само число \(x\)). Назовем множество (set) целых чисел \(D\) хорошим тогда (и только тогда), когда не существует пары \(a \in D\), \(b \in D\) таких, что \(a \ne b\) и \(a\) делит \(b\). Найдите хорошее подмножество \(S\) с максимально возможным размером. Так как ответ может быть очень большим, выведите размер подмножества по модулю \(998244353\). Выходные данные Выведите максимально возможный размер хорошего подмножества по модулю \(998244353\). Примечание В первом примере \(x = 2999999 \cdot 43 \cdot 2999957\) и одним из его максимальных хороших подмножеств является \(\{ 43, 2999957, 2999999 \}\). Во втором примере \(x = 2 \cdot 3 \cdot 2 \cdot 3 \cdot 2 \cdot 2 = 144\) и одним из его максимальных хороших подмножеств является \(\{ 9, 12, 16 \}\).
| |
|
|
F. Xor-множество
битмаски
математика
разделяй и властвуй
*3100
Вам заданы два множества: \(A\) и \(B\). Найдите сумму элементов в множестве \(C = \{x | x = a \oplus b, a \in A, b \in B\}\), по модулю \(998244353\), где \(\oplus\) означает операцию побитовое исключающее ИЛИ. Каждое число должно быть посчитано ровно один раз. Например, если \(A = \{2, 3\}\) и \(B = \{2, 3\}\) вы должны учесть число \(1\) только один раз, несмотря на то, что вы можете получить его как \(3 \oplus 2\) и как \(2 \oplus 3\). Таким образом, ответ в этом случае будет равен \(1 + 0 = 1\). Будем называть отрезком \([l; r]\) множество целых чисел вида \(\{l, l+1, \dots, r\}\). Множество \(A\) задано объединением \(n_A\) отрезков, множество \(B\) задано объединением \(n_B\) отрезков. Выходные данные Выведите одно целое число, сумму элементов в множестве \(C = \{x | x = a \oplus b, a \in A, b \in B\}\) по модулю \(998244353\). Примечание В первом примере можно заметить, что множество \(C = \{0,1,\dots,15\}\), что означает, что все числа от \(0\) до \(15\) могут быть представлены в виде \(a \oplus b\).
| |
|
|
D. Инвертирования в турнире
графы
математика
Перебор
разделяй и властвуй
*3200
Вам дан турнир — полный ориентированный граф. За одну операцию вы можете взять любую вершину \(v\) и поменять направления всех ребер с \(v\) на одном из концов (таким образом все ребра \(u \to v\) меняют направление на \(v \to u\) и наоборот). Вам нужно сделать турнир сильно связным за минимальное количество таких операций. А также, если это возможно, вам необходимо посчитать количество способов сделать турнир сильно связным за такое число операций (два способа отличаются, если для какого-то \(i\), вершина выбранная на \(i\)-й операции одного способа, отличается от вершины выбранной на \(i\)-й операции другого способа). Вам нужно найти остаток от деления этой величины на \(998\,244\,353\). Выходные данные Если невозможно сделать турнир сильно связным за такое количество операций, выведите «-1». Иначе, выведите два целых числа: минимальное количество операций, которое нужно, чтобы сделать турнир сильно связным и количество способов сделать турнир сильно связным за такое число операций, по модулю \(998\,244\,353\).
| |
|
|
E. Тесты для задачи D
Деревья
Конструктив
поиск в глубину и подобное
разделяй и властвуй
*2200
Нам было очень сложно придумать тесты для задачи D. Чтобы подготовить сильные тесты, нам пришлось решить следующую задачу. Для заданного неориентированного помеченного дерева, состоящего из \(n\) вершин, найдите набор отрезков, такой что: - концы каждого отрезка являются целыми числами от \(1\) до \(2n\), и каждое целое число от \(1\) до \(2n\) должно встречаться как конец ровно одного отрезка;
- все отрезки — невырожденные;
- для каждой такой пары чисел \((i, j)\), что \(i \ne j\), \(i \in [1, n]\) и \(j \in [1, n]\), вершины \(i\) и \(j\) соединены ребром тогда и только тогда, когда отрезки \(i\) и \(j\) пересекаются, но ни отрезок \(i\) не содержится полностью в отрезке \(j\), ни отрезок \(j\) полностью не содержится в отрезке \(i\).
А вы можете решить эту задачу? Выходные данные Выведите \(n\) пар целых чисел, \(i\)-я пара должна содержать два целых числа \(l_i\) и \(r_i\) (\(1 \le l_i < r_i \le 2n\)) — концы \(i\)-го отрезка. Все \(2n\) целых чисел, которые вы вывели, должны быть различными. Гарантируется, что ответ всегда существует.
| |
|
|
D. Dr. Evil Underscores
битмаски
Деревья
дп
жадные алгоритмы
Перебор
поиск в глубину и подобное
разделяй и властвуй
Строки
*1900
Сегодня Бакри в качестве дружеского подарка вручил Бадави \(n\) целых чисел \(a_1, a_2, \dots, a_n\) и дал ему задачку выбрать такой \(X\), что \(\underset{1 \leq i \leq n}{\max} (a_i \oplus X)\) принимает минимальное возможное значение, где \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Бадави, как обычно, ленится, поэтому вы решили помочь ему и найти минимальное возможное значение \(\underset{1 \leq i \leq n}{\max} (a_i \oplus X)\). Выходные данные Выведите одно целое число — минимальное возможное значение \(\underset{1 \leq i \leq n}{\max} (a_i \oplus X)\). Примечание В первом примере можно выбрать \(X = 3\). Во втором примере можно выбрать \(X = 5\).
| |
|
|
E. Разделение перестановки
разделяй и властвуй
Структуры данных
*2200
Вам задана перестановка \(p_1, p_2, \dots , p_n\) (перестановка — это массив, в котором все числа от \(1\) до \(n\) встречаются ровно один раз). Вес \(i\)-го элемента перестановки равен \(a_i\). Сначала вы делите вашу перестановку на два непустых множества — префикс и суффикс. Более формально, первое множество содержит элементы \(p_1, p_2, \dots , p_k\), второе — \(p_{k+1}, p_{k+2}, \dots , p_n\), где \(1 \le k < n\). После этого вы можете перемещать элементы между множествами. Точнее, вы можете выбрать элемент первого множества и переместить его во второе множество или наоборот. Вы заплатите \(a_i\) долларов за перемещение элемента \(p_i\). Ваша задача — сделать так, чтобы любой элемент первого множества был меньше любого элемента второго множества. Обратите внимание, что если одно из множеств пусто, то это условие выполняется. Например, если \(p = [3, 1, 2]\) и \(a = [7, 1, 4]\), то вам следует действовать следующим образом: разделить \(p\) на две части \([3, 1]\) и \([2]\), а затем переместить элемент, равный \(2\), в первое множество (это будет стоить \(4\)). А если \(p = [3, 5, 1, 6, 2, 4]\), \(a = [9, 1, 9, 9, 1, 9]\), то нужно делать так: разделить \(p\) на две части \([3, 5, 1]\) и \([6, 2, 4]\), а затем переместить элемент, равный \(2\), в первое множество (это стоит \(1\)), а элемент, равный \(5\) — во второе (это также стоит \(1\)). Посчитайте минимальное количество долларов, которое вам придется потратить. Выходные данные Выведите одно число — минимальное количество долларов, которое вам придется потратить.
| |
|
|
G. Сумма префиксных сумм
геометрия
Деревья
разделяй и властвуй
Структуры данных
*2700
Определим сумму префиксных сумм массива \([s_1, s_2, \dots, s_k]\) как \(s_1 + (s_1 + s_2) + (s_1 + s_2 + s_3) + \dots + (s_1 + s_2 + \dots + s_k)\). Вам задано дерево, состоящее из \(n\) вершин. В каждой вершине \(i\) записано целое число \(a_i\). Определим значение простого пути от вершины \(u\) до вершины \(v\) следующим образом: рассмотрим все вершины на пути от \(u\) до \(v\), выпишем числа, записанные на этих вершинах, в порядке их появления на пути, и вычислим сумму префиксных сумм получившейся последовательности. Ваша задача — найти максимальное значение по всем путям в дереве. Выходные данные Выведите одно целое число — максимальное значение по всем путям в дереве. Примечание Ответ в первом примере достигается, если выбрать путь из вершины \(3\) в вершину \(1\). Мы получаем последовательность \([3, 3, 7, 1]\), сумма префиксных сумм которой равна \(36\).
| |
|
|
F. Движущиеся точки
разделяй и властвуй
реализация
сортировки
Структуры данных
*1900
На координатной оси \(OX\) находятся \(n\) точек. \(i\)-я точка располагается в целочисленной координате \(x_i\) и имеет скорость \(v_i\). Гарантируется, что никакие две точки не располагаются в одной и той же координате. Все \(n\) точек двигаются с неизменной скоростью, координата \(i\)-й точки в момент времени \(t\) (\(t\) может быть нецелым) вычисляется как \(x_i + t \cdot v_i\). Рассмотрим две точки \(i\) и \(j\). Пусть \(d(i, j)\) равно минимально возможной дистанции между этими двумя точками по всем возможным моментам времени (даже нецелым). Это значит, что если две точки \(i\) и \(j\) совпадут в какой-то момент времени, значение \(d(i, j)\) будет равно \(0\). Ваша задача — посчитать значение \(\sum\limits_{1 \le i < j \le n}\) \(d(i, j)\) (сумму минимальных дистанций по всем парам точек). Выходные данные Выведите одно целое число — значение \(\sum\limits_{1 \le i < j \le n}\) \(d(i, j)\) (суммы минимальных дистанций по всем парам точек).
| |
|
|
F. Сила батальона
разделяй и властвуй
Структуры данных
Теория вероятностей
*2800
В Армии Байтляндии \(n\) офицеров. У каждого офицера есть некоторая сила. Сила \(i\)-го офицера равна \(p_{i}\). Так как война приближается, Генерал хотел бы узнать силу армии. Сила армии определяется очень странно в Байтляндии. Генерал выбирает случайное подмножество офицеров с этих \(n\) офицеров, и называет его батальоном. (Все \(2^n\) подмножеств \(n\) офицеров могут быть выбраны с равной вероятностью, включая пустое подмножество и множество всех офицеров). Сила батальона определяется следующим образом: Пусть силы выбранных офицеров равны \(a_{1},a_{2},\ldots,a_{k}\), где \(a_1 \le a_2 \le \dots \le a_k\). Сила этого батальона равняется \(a_1a_2 + a_2a_3 + \dots + a_{k-1}a_k\). (Если размер батальона \(\leq 1\), сила этого батальона равна \(0\)). Сила армии равна матожиданию силы батальона. Так как война очень длинная, силы офицеров могут измениться. А именно, будет \(q\) изменений. Каждое изменение будет иметь вид \(i\) \(x\), показывающий, что \(p_{i}\) стало равным \(x\). Вы должны найти силу армии в самом начале, а также после каждого из \(q\) изменений. Заметьте, что изменения необратимы. Вы должны найти силу по модулю \(10^{9}+7\). Более формально, пусть \(M=10^{9}+7\). Можно показать, что ответ можно выразить как несократимую дробь \(p/q\), где \(p\) и \(q\) целые и \(q\not\equiv 0 \bmod M\)). Выведите число, равное \(p\cdot q^{-1} \bmod M\). Другими словами, выведите число \(x\) такое, что \(0 \leq x < M\) и \(x ⋅ q \equiv p \bmod M\)). Выходные данные В первой строке, выведите начальную силу армии. В \(i\)-й из следующих \(q\) строк, выведите силу армии после \(i\)-о изменения. Примечание В первом примере, изначально есть четыре возможных батальона - {} Сила = \(0\)
- {\(1\)} Сила = \(0\)
- {\(2\)} Сила = \(0\)
- {\(1,2\)} Сила = \(2\)
Поэтому матожидание силы армии равно \(\frac{0+0+0+2}{4}\) = \(\frac{1}{2}\)После изменения \(p_{1}\) на \(2\), сила батальона {\(1,2\)} становится равной \(4\), поэтому сила армии становится равной \(1\). После изменения \(p_{2}\) на \(1\), сила батальона {\(1,2\)} опять становится \(2\), поэтому сила армии становится равной \(\frac{1}{2}\).
| |
|
|
F. Путешествия
графы
Деревья
разделяй и властвуй
Структуры данных
*3500
Где-то в дебрях, далеко-далеко находится святая земля, которая имеет форму дерева — связного неориентированного графа, состоящего из \(n\) вершин и \(n-1\) ребра. Вершины пронумерованы целыми числами от \(1\) до \(n\). Всего есть \(m\) путешественников, привлеченных красотой и процветанием этой земли. Каждый из них отправился в путешествие по ней. \(i\)-й путешественник проехал вдоль кратчайшего пути из \(s_i\) в \(t_i\). Во время этого путешествия, он прошел через все ребра, лежащие на кратчайшем пути из \(s_i\) в \(t_i\), который, как известно, единственный в дереве. Во время своих путешествий, некоторые путешественники познакомились с остальными. Некоторые из путешественников станут друзьями. Более точно, \(i\)-й и \(j\)-й путешественники станут друзьями, тогда и только тогда, когда было хотя бы \(k\) ребер, по которым прошли и \(i\)-й и \(j\)-й путешественники. Ваша задача состоит в том, чтобы найти количество пар путешественников \((i, j)\), удовлетворяющих следующим условиям: - \(1 \leq i < j \leq m\).
- \(i\)-й и \(j\)-й путешественники станут друзьями.
Выходные данные Выведите одно целое число — количество пар путешественников, удовлетворяющих описанным условиям. Примечание 
В первом тесте существует \(4\) пары, удовлетворяющие описанным условиям: \((1,2)\), \((1,3)\), \((1,4)\), \((3,4)\). - \(1\)-й путешественник и \(2\)-й путешественник оба пройдут по ребру \(6-8\).
- \(1\)-й путешественник и \(3\)-й путешественник оба пройдут по ребру \(2-6\).
- \(1\)-й путешественник и \(4\)-й путешественник оба пройдут по ребрам \(1-2\) и \(2-6\).
- \(3\)-й путешественник и \(4\)-й путешественник оба пройдут по ребру \(2-6\).
| |
|
|
C. Прекрасные тройки
битмаски
Конструктив
математика
Перебор
разделяй и властвуй
*2200
Рассмотрим бесконечную последовательность \(s\) натуральных чисел, построенную повторением следующих шагов: - Найдите лексикографически наименьшую тройку натуральных чисел \((a, b, c)\) такую, что Здесь тройка целых чисел \((a_1, b_1, c_1)\) считается лексикографически меньше тройки \((a_2, b_2, c_2)\), если последовательность \([a_1, b_1, c_1]\) лексикографически меньше последовательности \([a_2, b_2, c_2]\)
- Добавьте \(a\), \(b\), \(c\) в конец \(s\) в этом порядке.
- Вернитесь к первому шагу.
У вас есть целое число \(n\). Найдите \(n\)-й элемент \(s\). Вы должны ответить на \(t\) независимых тестовых случаев. Последовательность \(a\) лексикографически меньше последовательности \(b\), если в первой позиции, где \(a\) и \(b\) различны, в последовательности \(a\) элемент меньше, чем соответствующий элемент в \(b\). Выходные данные В каждой из строк \(t\) выведите ответ на соответствующий тестовый случай. Примечание Первые несколько элементов \(s\) это \(1, 2, 3, 4, 8, 12, 5, 10, 15, \dots \)
| |
|
|
E. X-OR
битмаски
интерактив
Конструктив
разделяй и властвуй
Теория вероятностей
*2700
Это интерактивная задача! У Ехаба есть загаданная перестановка \(p\) длины \(n\), состоящая из элементов от \(0\) до \(n-1\). По какой-то причине вы хотите выяснить перестановку. Для этого вы можете спросить у Ехаба \(2\) разных индекса \(i\) и \(j\), и он ответит \((p_i|p_j)\), где \(|\) обозначает операцию побитового ИЛИ. У Ехаба есть достаточно свободного времени, чтобы ответить на \(4269\) вопросов, и, несмотря на то, что ему несложно отвечать на так много вопросов, ему лень играть в ваши глупые игры, поэтому он заранее зафиксирует перестановку и не изменит ее в зависимости от ваших запросов. Можете ли вы угадать перестановку? Протокол взаимодействия Чтобы задать вопрос, выведите "? \(i\) \(j\)" (без кавычек, \(i \neq j\)) Затем вы должны считать ответ, который будет равен \((p_i|p_j)\). Если мы ответим \(-1\) вместо правильного ответа, это означает, что вы превысили количество запросов или сделали неверный запрос. Завершите программу сразу после получения \(-1\), и вы увидите вердикт Неправильный ответ. В противном случае вы можете получить произвольный вердикт, потому что ваше решение будет продолжать читать из закрытого потока. Чтобы дать ответ, выведите "! \(p_1\) \(p_2\) \(\ldots\) \(p_n\)" (без кавычек). Заметьте, что вывод ответа не считается одним из \(4269\) запросов. После вывода запроса не забудьте вывести перевод строки, и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Взломы: Первая строка должна содержать целое число \(n\) (\(3 \le n \le 2^{11}\)) — длину перестановки \(p\). Вторая строка должна содержать \(n\) целых чисел, разделенных пробелами \(p_1\), \(p_2\), \(\ldots\), \(p_n\) (\(0 \le p_i < n\)) — элементы перестановки \(p\). Примечание В первом примере перестановка равна \([1,0,2]\). Вы начинаете с вопроса \(p_1|p_2\), а Ехаб отвечает \(1\). Затем вы спрашиваете \(p_1|p_3\), а Ехаб отвечает \(3\). Наконец, вы спрашиваете о \(p_2|p_3\), а Ехаб отвечает \(2\). После этого вы угадываете перестановку.
| |
|
|
F. Яростный гром
разделяй и властвуй
реализация
Структуры данных
*2800
Вы воин, который собирается победить бога Тора. Тор бросил вам вызов, предложив вам решить следующую задачу: В ряд находится \(n\) конвееров, пронумерованных целыми числами от \(1\) до \(n\) слева направо. Каждый конвеер показывает один из двух символов «<» или «>». Начальное состояние конвеера \(i\) задается \(i\)-м символом строки \(s\). Всего есть \(n+1\) ямка. Они пронумерованы целыми числами от \(0\) до \(n\). Ямка \(0\) находится слева от конвеера \(1\), для всех \(i \geq 1\) ямка \(i\) находится справа от конвеера \(i\). Когда мячик попадает на конвеер с номером \(i\), он перемещается по следующим правилам: Если на конвеере \(i\) символ «<», тогда: - Если \(i=1\), то мячик падает в ямку \(0\).
- Если на конвеере \(i-1\) символ «<», то мячик перемещается на конвеер \(i-1\).
- Если на конвеере \(i-1\) символ «>», то мячик падает в ямку \(i-1\).
Если на конвеере \(i\) символ «>», тогда: - Если \(i=n\), то мячик падает в ямку \(n\).
- Если на конвеере \(i+1\) символ «>», то мячик перемещается на конвеер \(i+1\).
- Если на конвеере \(i+1\) символ «<», то мячик падает в ямку \(i\).
Вы должны ответить на следующие \(q\) запросов, каждый из которых задается парой целых чисел \(l, r\) (\(1 \leq l \leq r \leq n\)): - Сначала, на всех конвеерах \(l,l+1,...,r\) символ «<» изменяется на «>» и наоборот. Эти изменения сохраняются в следующих запросах.
- После этого, положите один мячик на каждый конвеер \(l,l+1,...,r\). Затем, каждый мячик упадет в какую-то ямку. Найдите максимальное количество мячиков, которое окажется в какой-то ямке. После ответа на запрос, мячики пропадают и не учитываются в следующих запросах.
Выходные данные Выведите \(q\) строк, в \(i\)-й строке выведите ответ на \(i\)-й запрос. Примечание - В первом запросе, состояния конвееров меняются на «>><<<». После этого, мы кладем по одному мячику на конвееры \(\{2,3,4\}\). Все три мячика упадут в ямку \(2\). Поэтому ответ равен \(3\).
- Во втором запросе, состояния конвееров меняются на «>>>>>». После этого, мы кладем по одному мячику на конвееры \(\{3,4,5\}\). Все три мячика упадут в ямку \(5\). Поэтому ответ равен \(3\).
- В третьем запросе, состояния конвееров меняются на «<<<<<». После этого, мы кладем по одному мячику на конвееры \(\{1,2,3,4,5\}\). Все пять мячиков упадут в ямку \(0\). Поэтому ответ равен \(5\).
- В четвертом запросе, состояния конвееров меняются на «>>><<». После этого, мы кладем по одному мячику на конвееры \(\{1,2,3\}\). Все три мячика упадут в ямку \(3\). Поэтому ответ равен \(3\).
- В пятом запросе, состояния конвееров меняются на «><<><». После этого, мы кладем по одному мячику на конвееры \(\{2,3,4\}\). Тогда два мячика упало в ямку \(1\) и один мячик упал в ямку \(4\). Поэтому ответ равен \(2\).
- В шестом запросе, состояния конвееров меняются на «<>><>». После этого, мы кладем по одному мячику на конвееры \(\{1,2,3,4,5\}\). Тогда три мячика упало в ямку \(3\), один мячик упал в ямку \(0\) и еще один мячик упал в ямку \(5\). Поэтому ответ равен \(3\).
| |
|
|
F. Омкар и моды
Бинарный поиск
интерактив
разделяй и властвуй
*2700
Рэй потерял свой массив и должен найти его, спросив Омкара. Омкар готов раскрыть, что массив обладает следующими качествами: - Массив содержит \(n\) (\(1 \le n \le 2 \cdot 10^5\)) элементов.
- Каждый элемент в массиве \(a_i\) является целым числом в диапазоне \(1 \le a_i \le 10^9.\)
- Массив отсортирован в порядке неубывания.
Рэй может отправить Омкару серию запросов. Запрос состоит из двух целых чисел, \(l\) и \(r\), таких, что \(1 \le l \le r \le n\). Омкар ответит двумя целыми числами, \(x\) и \(f\). \(x\) — мода подмассива от индекса \(l\) до индекса \(r\) включительно. Модой массива называют число, которое встречается в нем чаще всего. Если есть несколько чисел, которые встречаются наибольшее количество раз, модой считается наименьшее из них. \(f\) — это количество раз, которое \(x\) встречается в запрашиваемом подмассиве. Массив имеет \(k\) (\(1 \le k \le \min(25000,n)\)) различных элементов. Однако из-за грехов Рэя Омкар не скажет Рэю, чему равно \(k\). Рэю разрешено отправить не более \(4k\) запросов. Помогите Рэю найти его потерянный массив. Протокол взаимодействия Взаимодействие начинается с чтения \(n\). Затем вы можете сделать один тип запроса: - "\(? \enspace l \enspace r\)" (\(1 \le l \le r \le n\)) где \(l\) и \(r\) это границы подмассива, который вы хотите запросить.
Ответ на каждый запрос будет иметь вид "\(x \enspace f\)", где \(x\) — это мода подмассива, а \(f\) — количество раз, которое \(x\) встречается в подмассиве. - \(x\) удовлетворяет (\(1 \leq x \leq 10^9\)).
- \(f\) удовлетворяет (\(1 \leq f \leq r-l+1\)).
- Если вы делаете более \(4k\) запросов или нарушаете диапазон номеров в запросе, вы получите вывод "-1."
- Если вы прекратите работу после получения ответа "\(-1\)", вы получите вердикт "Неправильный ответ ". В противном случае вы можете получить произвольный вердикт, потому что ваше решение будет продолжать читать из закрытого потока.
Чтобы вывести ответ, выведите: - "\(! \enspace a_1 \enspace a_2 \enspace \ldots \enspace a_{n-1} \enspace a_n\)", который является восклицательным знаком, за которым следует массив с пробелом между каждым элементом.
После этого завершите программу. Этот запрос не учитывается в лимит запросов \(4k\). После вывода запроса не забудьте вывести перевод строки, и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Формат взломов Для взлома выведите \(1\) целое число в первой строке: \(n\) (\(1 \le n \le 2 \cdot 10^5\)). Во второй строке выведите \(n\) целых чисел \(a_1, a_2, \ldots, a_{n-1}, a_n\), разделенных пробелами. Среди них должно быть не более \(25000\) различных чисел и \(a_j \le a_{j+1}\) должно выполняться для всех \(j\) от \(1\) до \(n-1\). Примечание Первый запрос: \(l=1\) и \(r=6\). Мода равна \(2\), а \(2\) встречается \(2\) раза, поэтому \(x=2\) и \(f=2\). Обратите внимание, что \(3\) также встречается два раза, но выводится \(2\), потому что \(2\) меньше. Второй запрос: \(l=1\) и \(r=3\). Мода равна \(2\) и \(2\) встречается дважды в подмассиве с границами \([1,3]\). Третий запрос: \(l=4\) и \(r=6\). Мода равна \(3\) и \(3\) встречается дважды в подмассиве с границами \([4,6]\). Четвертый запрос: \(l=3\) и \(r=4\). Мода равна \(2\), и встречается один раз в подмассиве с границами \([3,4]\). Обратите внимание, что \(3\) также встречается всего один раз в этом диапазоне, но \(2\) меньше, чем \(3\).
| |
|
|
D. Максимальная сумма на четных позициях
дп
жадные алгоритмы
разделяй и властвуй
реализация
*1600
Вам задан массив \(a\), состоящий из \(n\) целых чисел. Индексы элементов массива начинаются с нуля (то есть первый элемент — это \(a_0\), второй — \(a_1\), и так далее). Вы можете развернуть не более одного подмассива (последовательного отрезка) этого массива. Напомним, что подмассив \(a\) с границами \(l\) и \(r\) равен \(a[l; r] = a_l, a_{l + 1}, \dots, a_{r}\). Ваша задача — развернуть такой подмассив, чтобы сумма элементов на четных позицияx получившегося массива была максимально возможной (то есть сумма элементов \(a_0, a_2, \dots, a_{2k}\) для целого числа \(k = \lfloor\frac{n-1}{2}\rfloor\) должна быть максимально возможной). Вам необходимо ответить на \(t\) независимых наборов тестовых данных. Выходные данные Для каждого набора тестовых данных выведите ответ на отдельной строке — максимально возможная сумма элементов на четных позициях после разворота не более одного подмассива (последовательного отрезка) \(a\).
| |
|
|
G. Пешки
жадные алгоритмы
разделяй и властвуй
Структуры данных
*2600
У вас есть шахматная доска состоящая из \(n\) строк и \(n\) столбцов. Строки пронумерованы снизу вверх от \(1\) до \(n\). Столбцы пронумерованы слева направо от \(1\) до \(n\). Поле находящееся на пересечении \(x\)-го столбца и \(y\)-й строки обозначается как \((x, y)\). Кроме того, \(k\)-й столбец является специальным столбцом. Изначально доска пуста. Есть \(m\) изменений; \(i\)-е изменение добавляет или удаляет одну пешку. Текущая доска называется хорошей если мы можем переместить все пешки на специальный столбец по следующим правилам: - Пешку на поле \((x, y)\) можно переместить на поля \((x, y + 1)\), \((x - 1, y + 1)\) или \((x + 1, y + 1)\);
- Вы можете сделать сколько угодно таких ходов;
- Пешки нельзя перемещать за пределы доски;
- В каждом поле не может находится более одной пешки.
Текущая доска может и не быть хорошей. Чтобы исправить это, вы можете добавить дополнительные строки. Эти строки добавляются сверху, т. е. они будут иметь номера \(n+1, n+2, n+3, \dots\). После каждого из \(m\) изменений выведите одно число — минимальное количество строк, которые нужно добавить, чтобы доска стала хорошей. Выходные данные После каждого изменения выведите число — минимальное количество строк, которые нужно добавить, чтобы доска стала хорошей.
| |
|
|
H. Обьединение множеств
Конструктив
разделяй и властвуй
*3300
Вам дана перестановка \(a_1, a_2, \dots, a_n\) чисел от \(1\) до \(n\). Также у вас есть \(n\) множеств \(S_1,S_2,\dots, S_n\), где \(S_i=\{a_i\}\). Наконец, у вас есть переменная \(cnt\), представляющая текущее количество наборов. Первоначально \(cnt = n\). Мы определяем два вида функций на множествах: \(f(S)=\min\limits_{u\in S} u\); \(g(S)=\max\limits_{u\in S} u\). Вы можете получить новое множество, объединив два множества \(A\) и \(B\), если они удовлетворяют \(g(A)<f(B)\) (обратите внимание, что старые множества не исчезают). Формально, вы можете выполнить следующую последовательность операций: Вам необходимо получить некоторые конкретные множества. Существуют \(q\) требований, каждое из которых задается двумя целыми числами \(l_i\), \(r_i\), что означает, что должно существовать множество \(S_{k_i}\) (\(k_i\) — это индекс набора, его нужно будет задать) равное \(\{a_u\mid l_i\leq u\leq r_i\}\), то есть множество, состоящее из всех \(a_i\) с индексами между \(l_i\) и \(r_i\). В конце должно выполняться \(cnt\leq 2.2\times 10^6\). Заметьте, что вы не должны минимизировать \(cnt\). Гарантируется, что решение при данных ограничениях существует. Выходные данные Гарантируется, что решение при данных ограничениях существует. Первая строка должна содержать одно целое число \(cnt_E\) \((n\leq cnt_E\leq 2.2\times 10^6)\), равное количеству множеств после всех операций. Должны следовать \(cnt_E-n\) строк, каждая строка должна содержать два целых числа \(u\), \(v\) (\(1\leq u, v\leq cnt'\), где \(cnt'\) — это значение \(cnt\) до этой операции) Это означает, что вы выбираете \(S_u\), \(S_v\) и выполняете операцию слияния. В операции должно быть выполнено \(g(S_u)<f(S_v)\). Последняя строка должна содержать \(q\) целых чисел \(k_1,k_2,\cdots,k_q\) \((1\leq k_i\leq cnt_E)\), представляющих, что набор \(S_{k_i}\) является \(i\)-м необходимым набором. Пожалуйста, обратите внимание на большое количество вывода. Примечание В первом примере: Изначально у нас есть \(S_1=\{1\},S_2=\{3\},S_3=\{2\}\). В первой операции, поскольку \(g(S_3)=2<f(S_2)=3\), мы можем объединить \(S_3,S_2\) в \(S_4=\{2,3\}\). Во второй операции, поскольку \(g(S_1)=1<f(S_3)=2\), мы можем объединить \(S_1,S_3\) в \(S_5=\{1,2\}\). В третьей операции, поскольку \(g(S_5)=2<f(S_2)=3\), мы можем объединить \(S_5,S_2\) в \(S_6=\{1,2,3\}\). Для первого требования \(S_4=\{2,3\}=\{a_2,a_3\}\) удовлетворяет ему, поэтому \(k_1=4\). Для второго требования \(S_6=\{1,2,3\}=\{a_1,a_2,a_3\}\) удовлетворяет этому, таким образом, \(k_2=6\) Обратите внимание, что неиспользуемые наборы, идентичные наборы, многократный вывод одного и того же набора и использование наборов, которые присутствуют изначально, разрешены.
| |
|
|
E. Перевернутые родословные
Деревья
дп
Конструктив
математика
разделяй и властвуй
*2800
Учёный Иван Иванович изучает перевёрнутые родословные. Перевёрнутая родословная представляет собой набор людей, про каждого из которых известны либо оба его родителя, либо не известен ни один родитель. Кроме того, известно, что у всех людей из родословной есть ровно один ребёнок, кроме одного человека, у которого детей вовсе нет. Поэтому, если пронумеровать людей целыми числами от \(1\) до \(n\), то можно обозначить за \(s_i\) номер ребёнка человека с номером \(i\) и сказать, что \(s_i = 0\) в случае, если у человека с номером \(i\) детей нет. Назовём человека \(a\) предком человека \(b\), если либо \(a = b\), либо если у \(a\) есть ребёнок, который является предком человека \(b\). Это значит, что человек \(a\) является предком для \(a\), \(s_a\), \(s_{s_a}\) и так далее. Будем считать, что произошёл перекос родословной с участием некоторого человека, если известны оба его родителя и количество известных предков одного из его родителей хотя бы вдвое больше, чем количество известных предков второго родителя. Иван Иванович посчитал количество перекосов родословной и получил число \(k\), но, конечно же, он делал это вручную и мог ошибиться. Помогите проверить Ивану Ивановичу его вычисления: скажите, существует ли родословная из \(n\) людей с \(k\) перекосами, и если существует, то приведите пример подобной родословной. Выходные данные В первой строке выведите «YES» (без кавычек), если существует родословная с \(n\) людьми и \(k\) перекосами, и «NO» (без кавычек) в противном случае. Если требуемая родословная существует, то во второй строке выведите \(n\) целых чисел \(s_1, s_2, \ldots, s_n\) (\(0 \leq s_i \leq n\)), задающих номера детей людей в родословной. Если искомых родословных несколько, выведите любую. Примечание В первом примере подойдет единственная родословная, которую можно составить из трёх человек (человек и два его родителя). Во втором примере подойдет следующая родословная: В человеке номер один происходит перекос, так как у одного его родителя один предок, а у второго — три.
| |
|
|
F2. Шахматные баталии (сложная версия)
разделяй и властвуй
Структуры данных
*2800
Обратите внимание, что различие между простой и сложной версиями задачи состоит в том, что в сложной версии недоступные клетки могут снова становиться доступными, а в простой версии не могут. Вы можете взламывать, только если обе версии решены. Ильдар и Ваня устали постоянно играть в шахматы, поэтому они придумали новую шахматную игру. Игра происходит на шахматном поле размером \(2n \times 2m\). Это поле имеет \(2n\) строк и \(2m\) столбцов. Клетки этого поля покрашены в черный и белый цвета шахматной раскраской. Более точно, клетка в \(i\)-й строке и \(j\)-м столбце имеет белый цвет, если \(i+j\) чётно, и чёрный цвет в противном случае. Игра устроена следующим образом. Ильдар помечает некоторые белые клетки поля как недоступные. После этого он предлагает Ване попробовать решить следующую задачу: может ли он на доступных белых клетках поля расставить \(n \times m\) шахматных королей так, что никакие два выставленных короля не бьют друг друга, то есть не стоят на клетках поля, соседних по стороне или углу. Конечно, Ильдар планирует сделать игру интересной и предложить Ване несколько сложных комбинаций недоступных клеток. Для этого он попросил у вас помощи. Чтобы перед игрой понять, как лучше всего действовать, он хочет потренироваться. Для этого, он берёт пустое поле и хочет \(q\) раз либо сделать какую-то доступную клетку недоступной, либо сделать какую-то недоступную клетку доступной. После каждого изменения он бы хотел знать, каким будет ответ на задачу для Вани для текущего множества недоступных клеток. Помогите Ильдару сделать игру интересной! Напишите программу, которая будет отвечать на его запросы. Выходные данные Выведите \(q\) строк. В \(i\)-й из этих строк выведите ответ на задачу для доски, полученной после \(i\) первых запросов Ильдара. Выведите «YES», если Ваня может так расставить шахматных королей на незанятые белые клетки поля, что никакие два короля не будут бить друг друга, и «NO», иначе. Примечание В первом примере, после второго запроса пешки будут стоять на клетках \((1, 1)\) и \((1, 5)\). Тогда Ваня может поставить три короля на клетки \((2, 2)\), \((2, 4)\) и \((2, 6)\). После третьего запроса пешки будут стоять на клетках \((1, 1)\), \((1, 5)\) и \((2, 4)\). Тогда отстается всего три пустые клетки \((2, 2)\), \((1, 3)\) и \((2, 6)\). Ваня не может поставить трех королей на эти клетки, потому что короли в клетках \((2, 2)\) и \((1, 3)\) бьют друг друга, так как эти клетки соседние по углу.
| |
|
|
D. а-хорошая строка
битмаски
дп
Перебор
разделяй и властвуй
реализация
*1500
Вам дана строка \(s[1 \dots n]\), состоящая из строчных латинских букв. Гарантируется, что \(n = 2^k\) для некоторого целого числа \(k \ge 0\). Строка \(s[1 \dots n]\) называется \(c\)-хорошей, если выполняется как минимум одно из следующих условий: - Длина строки \(s\) равна \(1\) и она состоит из единственного символа \(c\) (то есть \(s_1=c\));
- Длина строки \(s\) больше \(1\), первая половина строки состоит только из символа \(c\) (то есть \(s_1=s_2=\dots=s_{\frac{n}{2}}=c\)), а вторая половина строки (то есть строка \(s_{\frac{n}{2} + 1}s_{\frac{n}{2} + 2} \dots s_n\)) является \((c+1)\)-хорошей строкой;
- Длина строки \(s\) больше \(1\), вторая половина строки состоит только из символа \(c\) (то есть \(s_{\frac{n}{2} + 1}=s_{\frac{n}{2} + 2}=\dots=s_n=c\)), а первая половина строки (то есть строка \(s_1s_2 \dots s_{\frac{n}{2}}\)) является \((c+1)\)-хорошей строкой.
Например: «aabc» является 'a'-хорошей, «ffgheeee» является 'e'-хорошей. За один ход вы можете выбрать один индекс \(i\) от \(1\) до \(n\) и заменить \(s_i\) на любую строчную латинскую букву (любой символ от 'a' до 'z'). Ваша задача — найти минимальное количество ходов, необходимое, чтобы получить 'a'-хорошую строку из \(s\) (т.е. \(c\)-хорошую строку для \(c=\) 'a'). Гарантируется, что ответ всегда существует. Вам нужно ответить на \(t\) независимых наборов тестовых данных. Еще один пример 'a'-хорошей строки является следующим. Например, рассмотрим строку \(s = \)«cdbbaaaa». Это 'a'-хорошая строка, потому что: - вторая половина строки («aaaa») состоит только из символов 'a';
- первая половина строки («cdbb») — 'b'-хорошая строка, потому что:
- вторая половина строки («bb») состоит только из символов 'b';
- первая половина строки («cd») — 'c'-хорошая строка, потому что:
- первая половина строки («c») состоит из единственного символа 'c';
- вторая половина строки («d») — 'd'-хорошая строка.
Выходные данные Для каждого набора тестовых данных выведите ответ на него — наименьшее количество ходов, необходимое, чтобы получить 'a'-хорошую строку \(s\) (т.е. \(c\)-хорошую строку для \(c =\) 'a'). Гарантируется, что ответ существует.
| |
|
|
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 баллов) Без дополнительных ограничений.
Примечание Граф из данного примера:
| |
|
|
E. Очистите мультимножество
дп
жадные алгоритмы
разделяй и властвуй
Структуры данных
*2200
У вас есть мультимножество, содержащее несколько чисел. Изначально оно содержит \(a_1\) элементов равных \(1\), \(a_2\) элементов равных \(2\), ..., \(a_n\) элементов равных \(n\). Вы можете применять два типа операций: - выбрать два числа \(l\) и \(r\) (\(l \le r\)), а затем удалить один элемент, равный \(l\), один элемент, равный \(l + 1\), ..., и один элемент, равный \(r\) из мультимножества. Эта операция может быть применена, только если каждый элемент от \(l\) до \(r\) встречается хотя бы раз в мультимножестве;
- выбрать два числа \(i\) и \(x\) (\(x \ge 1\)), а затем удалить \(x\) элементов равных \(i\) из мультимножества. Эта операция может быть применена, только если в мультимножестве есть как минимум \(x\) элементов, равных \(i\).
За какое наименьшее количество операций можно удалить все элементы из мультимножества? Выходные данные Выведите одно число — наименьшее количество операций, за которое можно удалить все элементы из мультимножества.
| |
|
|
F. Два различных
Конструктив
разделяй и властвуй
*2300
Вам дано целое число \(n\). Вы должны найти список пар \((x_1, y_1)\), \((x_2, y_2)\), ..., \((x_q, y_q)\) (\(1 \leq x_i, y_i \leq n\)) который удовлетворяет следующему условию. Рассмотрим некоторую функцию \(f: \mathbb{N} \times \mathbb{N} \to \mathbb{N}\) (мы определяем \(\mathbb{N}\) как множество положительных целых чисел). Другими словами, \(f\) это функция, возвращающая положительное целое число по паре положительных целых чисел. Давайте рассмотрим массив \(a_1, a_2, \ldots, a_n\), где изначально \(a_i = i\). Вы сделаете \(q\) операций, в \(i\)-й из них вы сделаете: - присвоите \(t = f(a_{x_i}, a_{y_i})\) (\(t\) это временная переменная, она используется только для следующих двух присвоений);
- присвоите \(a_{x_i} = t\);
- присвоите \(a_{y_i} = t\).
Другими словами, вам нужно одновременно заменить \(a_{x_i}\) и \(a_{y_i}\) на \(f(a_{x_i}, a_{y_i})\). Обратите внимание, что в течение процесса значение \(f(p, q)\) всегда одинаково для заданных положительных целых чисел \(p\) и \(q\). В конце должно быть не больше двух различных чисел в массиве \(a\). Это должно быть выполнено для любой функции \(f\). Найдите любой возможный список пар. Количество пар должно не превосходить \(5 \cdot 10^5\). Выходные данные В первой строке выведите \(q\) (\(0 \leq q \leq 5 \cdot 10^5\)) — количество пар. В каждой из следующих \(q\) строк выведите по два целых числа. В \(i\)-й строке выведите \(x_i\), \(y_i\) (\(1 \leq x_i, y_i \leq n\)). Условие, описанное в тексте условия задачи, должно быть удовлетворено. Если есть несколько возможных ответов, выведите любой. Примечание В первом тесте после применения единственной операции массив \(a\) будет \([f(a_1, a_2), f(a_1, a_2), a_3]\). В нем всегда не больше двух различных чисел. Во втором тесте после применения двух операций массив \(a\) будет \([f(a_1, a_2), f(a_1, a_2), f(a_3, a_4), f(a_3, a_4)]\). В нем всегда не больше двух различных чисел.
| |
|
|
C. XOR-инверсии
битмаски
Деревья
дп
жадные алгоритмы
математика
разделяй и властвуй
сортировки
Строки
Структуры данных
*2000
Вам задан массив \(a\), состоящий из \(n\) неотрицательных целых чисел. Вы должны выбрать неотрицательное целое число \(x\) и сформировать массив \(b\) из \(n\) элементов по следующему правилу: для всех \(i\) от \(1\) до \(n\), \(b_i = a_i \oplus x\) (\(\oplus\) обозначает операцию побитового исключающего ИЛИ). Назовем инверсией в массиве \(b\) такую пару целых чисел \(i\) и \(j\), что \(1 \le i < j \le n\) и \(b_i > b_j\). Вы должны выбрать \(x\) таким образом, чтобы количество инверсий в массиве \(b\) было минимально возможным. Если таких \(x\) несколько — выведите минимальное из них. Выходные данные Выведите два целых числа: минимально возможное количество инверсией в массиве \(b\), и минимальное значение \(x\), при котором достигается такое количество инверсий. Примечание В первом примере из условия оптимально оставить массив без изменений, выбрав \(x = 0\). Во втором примере из условия при выборе \(x = 14\) получается следующий массив \(b\): \([4, 9, 7, 4, 9, 11, 11, 13, 11]\). В нем \(4\) инверсии: - \(i = 2\), \(j = 3\);
- \(i = 2\), \(j = 4\);
- \(i = 3\), \(j = 4\);
- \(i = 8\), \(j = 9\).
В третьем примере из условия при выборе \(x = 8\) получается следующий массив \(b\): \([0, 2, 11]\). В нем нет ни одной инверсии.
| |
|
|
G. Три вхождения
разделяй и властвуй
Структуры данных
хэши
*2500
Дан массив \(a\), состоящий из \(n\) целых чисел. Назовем подмассивом \(a[l..r]\) массив \([a_l, a_{l + 1}, \dots, a_r]\) (\(1 \le l \le r \le n\)). Назовем подмассив хорошим, если каждое число, которое принадлежит подмассиву, встречается в нем ровно три раза. Например, у массива \([1, 2, 2, 2, 1, 1, 2, 2, 2]\) три хороших подмассива: - \(a[1..6] = [1, 2, 2, 2, 1, 1]\);
- \(a[2..4] = [2, 2, 2]\);
- \(a[7..9] = [2, 2, 2]\).
Посчитайте количество хороших подмассивов массива \(a\). Выходные данные Выведите одно целое число — количество хороших подмассивов массива \(a\).
| |
|
|
C2. Армия покемонов (сложная версия)
дп
жадные алгоритмы
разделяй и властвуй
реализация
Структуры данных
*2100
Это сложная версия задачи. Различия между версиями заключаются в том, что в простой версии нет запросов обмена. Вы можете делать взломы только если обе версии задачи сданы. Пикачу — милый и дружелюбный покемон, живущий в стае диких пикачу. Однако недавно стало известно, что команда R хочет украсть всех этих покемонов! Тренер покемонов Андрей решил помочь Пикачу собрать армию для борьбы с командой R. В первую очередь Андрей посчитал всех покемонов: их оказалось ровно \(n\) штук. Затем он установил силу каждого покемона и так получилось, что \(i\)-й покемон имеет силу, равную \(a_i\), и силы всех покемонов различны. В качестве армии Андрей может выбрать любую непустую подпоследовательность покемонов. Иными словами, Андрей выбирает какой-то массив \(b\) из \(k\) индексов таких, что \(1 \le b_1 < b_2 < \dots < b_k \le n\), и его армия будет состоять из покемонов с силами \(a_{b_1}, a_{b_2}, \dots, a_{b_k}\). Сила армии вычисляется как знакопеременная сумма элементов подпоследовательности, то есть \(a_{b_1} - a_{b_2} + a_{b_3} - a_{b_4} + \dots\). Андрей экспериментирует с построением покемонов. Он \(q\) раз меняет двух покемонов местами, а именно, в \(i\)-й раз он менял местами покемонов с номерами \(l_i\) и \(r_i\). Андрею надо знать: какую максимальную силу армии он мог получить при начальной расстановке покемонов, а также после каждого изменения строя? Помогите Андрею и покемонам, иначе команде R удастся воплотить в жизнь свой коварный план! Выходные данные Для каждого набора входных данных выведите \(q+1\) число — максимально возможную силу армии до изменений и после каждого изменения. Примечание Рассмотрим третий набор входных данных: Изначально мы можем выбрать армию следующим образом: [1 2 5 4 3 6 7], при этом ее итоговая сила будет \(5-3+7=9\). После первого изменения выбор армии будет таким: [2 1 5 4 3 6 7], при этом ее итоговая сила будет \(2-1+5-3+7=10\). Далее выбор армии будет таким: [2 1 5 4 3 7 6], при этом ее итоговая сила будет \(2-1+5-3+7=10\). После третьего изменения армию можно выбрать так: [2 1 4 5 3 7 6], при этом ее итоговая сила будет \(2-1+5-3+7=10\). Далее выбор армии будет таким: [1 2 4 5 3 7 6], при этом ее итоговая сила будет \(5-3+7=9\). После всех запросов выбор армии будет таким: [1 4 2 5 3 7 6], при этом ее итоговая сила будет \(4-2+5-3+7=11\).
| |
|
|
C. Dušan's Railway
графы
Деревья
разделяй и властвуй
*3500
As you may already know, Dušan is keen on playing with railway models. He has a big map with cities that are connected with railways. His map can be seen as a graph where vertices are cities and the railways connecting them are the edges. So far, the graph corresponding to his map is a tree. As you already know, a tree is a connected acyclic undirected graph. He is curious to find out whether his railway can be optimized somehow. He wants to add so-called shortcuts, which are also railways connecting pairs of cities. This shortcut will represent the railways in the unique path in the tree between the pair of cities it connects. Since Dušan doesn't like repeating the railways, he has also defined good paths in his newly obtained network (notice that after adding the shortcuts, his graph is no more a tree). He calls a path good, if no edge appears more than once, either as a regular railway edge or as an edge represented by some shortcut (Every shortcut in a good path has length 1, but uses up all the edges it represents - they can't appear again in that path). Having defined good paths, he defines good distance between two cities to be the length of the shortest good path between them. Finally, the shortcutting diameter of his network is the largest good distance between any two cities. Now he is curious to find out whether it is possible to achieve shortcutting diameter less or equal than \(k\), while adding as few shortcuts as possible. Your solution should add no more than \(\mathbf{10 \cdot n}\) shortcuts. Output The first line of the output should contain a number \(t\) representing the number of the shortcuts that were added. Each of the following \(t\) lines should contain two integers \(u_i\) and \(v_i\), signifying that a shortcut is added between cities \(u_i\) and \(v_i\). Note Notice that adding a shortcut between all cities and city 1 will make a graph theoretic diameter become 2. On the other hand, the paths obtained that way might not be good, since some of the edges might get duplicated. In the example, adding a shortcut between all cities and city 1 doesn't create a valid solution, because for cities 5 and 10 the path that uses shortcuts 5-1 and 1-10 is not valid because it uses edges 1-2, 2-3, 3-4, 4-5 twice.
| |
|
|
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).
| |
|
|
B. Blue and Red of Our Faculty!
дп
разделяй и властвуй
*2600
It's our faculty's 34th anniversary! To celebrate this great event, the Faculty of Computer Science, University of Indonesia (Fasilkom), held CPC - Coloring Pavements Competition. The gist of CPC is two players color the predetermined routes of Fasilkom in Blue and Red. There are \(N\) Checkpoints and \(M\) undirected predetermined routes. Routes \(i\) connects checkpoint \(U_i\) and \(V_i\), for \((1 \le i \le M)\). It is guaranteed that any pair of checkpoints are connected by using one or more routes. The rules of CPC is as follows: - Two players play in each round. One player plays as blue, the other plays as red. For simplicity, let's call these players \(Blue\) and \(Red\).
- \(Blue\) will color every route in he walks on blue, \(Red\) will color the route he walks on red. Both players start at checkpoint number \(1\). Initially, all routes are gray.
- Each phase, from their current checkpoint, \(Blue\) and \(Red\) select a different gray route and moves to the checkpoint on the other end of the route simultaneously.
- The game ends when \(Blue\) or \(Red\) can no longer move. That is, there is no two distinct gray routes they can choose to continue moving.
Chaneka is interested in participating. However, she does not want to waste much energy. So, She is only interested in the number of final configurations of the routes after each round. Turns out, counting this is also exhausting, so Chaneka asks you to figure this out! Two final configurations are considered different if there is a route \(U\) in a different color in the two configurations. Output Output a single integer which denotes the number of final configurations after each round of CPC modulo \(10^9 + 7\) Note Every possible final configuration for the example is listed below: The blue-colored numbers give the series of moves \(Blue\) took, and the red-colored numbers give the series of moves \(Red\) took.
| |
|
|
F. Фруктовые последовательности
Бинарный поиск
дп
разделяй и властвуй
Структуры данных
*2400
Смотритель зоопарка покупает коробку фруктов чтобы накормить своего любимца кролика. Фрукты в коробке — это последовательность яблок и апельсинов, которая представляется бинарной строкой \(s_1s_2\ldots s_n\) длины \(n\). В ней \(1\) обозначает яблоко, а \(0\) обозначает апельсин. Поскольку у кролика аллергия на апельсины, смотритель зоопарка хочет найти наидлиннейшую подряд идующую подпоследовательность яблок. Пусть \(f(l,r)\) — это наибольшая длина подряд идущей подпоследовательности яблок в подстроке \(s_{l}s_{l+1}\ldots s_{r}\). Помогите смотрителю зоопарка найти \(\sum_{l=1}^{n} \sum_{r=l}^{n} f(l,r)\). Другими словами, найдите сумму \(f\) по всем подстрокам. Выходные данные Выведите единственное целое число: \(\sum_{l=1}^{n} \sum_{r=l}^{n} f(l,r)\). Примечание В первом тесте всего есть десять подстрок. Список этих подстрок (мы обозначаем \([l,r]\) как подстроку \(s_l s_{l+1} \ldots s_r\)): - \([1,1]\): 0
- \([1,2]\): 01
- \([1,3]\): 011
- \([1,4]\): 0110
- \([2,2]\): 1
- \([2,3]\): 11
- \([2,4]\): 110
- \([3,3]\): 1
- \([3,4]\): 10
- \([4,4]\): 0
Длины наибольших подряд идущих подпоследовательностей из единиц в этих подстроках \(0,1,2,2,1,2,2,1,1,0\) соответственно. Поэтому ответ \(0+1+2+2+1+2+2+1+1+0 = 12\).
| |
|
|
E. Юра может все
Бинарный поиск
битмаски
Конструктив
Перебор
разделяй и властвуй
*2500
Юра уверен, что он может все. Но сможет ли он решить эту задачу? У него есть массив \(a\), состоящий из \(n\) положительных целых чисел. Назовем подмассив \(a[l...r]\) хорошим, если одновременно соблюдены следующие условия: - \(l+1 \leq r-1\), т. е. подмассив имеет длину не менее \(3\);
- \((a_l \oplus a_r) = (a_{l+1}+a_{l+2}+\ldots+a_{r-2}+a_{r-1})\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ.
Другими словами, подмассив хороший, если побитовое исключающее ИЛИ (XOR) элементов в его концах равен сумме остальных элементов. Юрий хочет посчитать общее количество хороших подмассивов. Чему оно равно? Массив \(c\) является подмассивом массива \(d\), если \(c\) может быть получен из \(d\) удалением нескольких (возможно, ни одного или всех) элементов из начала и нескольких (возможно, ни одного или всех) элементов из конца. Выходные данные Выведите единственное целое число — количество хороших подмассивов. Примечание В примере есть \(6\) хороших подмассивов: - \([3,1,2]\) (дважды), потому что \((3 \oplus 2) = 1\);
- \([1,2,3]\) (дважды) потому что \((1 \oplus 3) = 2\);
- \([2,3,1]\), потому что \((2 \oplus 1) = 3\);
- \([3,1,2,3,1,2,3,15]\), потому что \((3 \oplus 15) = (1+2+3+1+2+3)\).
| |
|
|
C. Жадный шоппинг
Бинарный поиск
жадные алгоритмы
разделяй и властвуй
реализация
Структуры данных
*2600
Вам дан массив \(a_1, a_2, \ldots, a_n\) из целых чисел. Этот массив невозрастающий. Рассмотрим \(n\) магазинов, расположенных в ряд. Магазины пронумерованы целыми числами от \(1\) до \(n\) слева направо. Цена еды в \(i\)-м магазине равна \(a_i\) монет. Вы должны обработать \(q\) запросов двух видов: - 1 x y: для всех магазинов \(1 \leq i \leq x\) присвоить \(a_{i} = max(a_{i}, y)\).
- 2 x y: рассмотрим голодного мужчину с \(y\) монетами. Он посещает все магазины с \(x\)-го магазина по \(n\)-й, и если он может купить еду в текущем магазине, он покупает одну порцию этой еды. Найдите, какое количество порций еды он купит. Мужчина может покупать еду в магазине \(i\), если у него есть хотя бы \(a_i\) монет. После покупки количество его монет уменьшается на \(a_i\).
Выходные данные Для каждого запроса типа \(2\) выведите ответ в новой строке. Примечание В первом запросе голодный мужчина купит еду во всех магазинах с \(3\)-го по \(10\)-й. Во втором запросе голодный мужчина купит еду в магазинах \(4\), \(9\) и \(10\). После третьего запроса массив \(a_1, a_2, \ldots, a_n\) цен не поменяется и останется \(\{10, 10, 10, 6, 6, 5, 5, 5, 3, 1\}\). В четвертом запросе голодный мужчина купит еду в магазинах \(2\), \(3\), \(4\), \(5\), \(9\) и \(10\). После пятого запроса массив \(a\) цен станет \(\{10, 10, 10, 7, 6, 5, 5, 5, 3, 1\}\). В шестом запросе голодный мужчина купит еду в магазинах \(2\) и \(4\).
| |
|
|
C. Ксор дерево
Бинарный поиск
битмаски
Деревья
дп
разделяй и властвуй
Структуры данных
*2100
Для заданной последовательности попарно различных неотрицательных целых чисел \((b_1, b_2, \dots, b_k)\) мы определяем, является ли она хорошей следующим образом: - Рассмотрим граф на \(k\) вершинах, на которых написаны числа от \(b_1\) до \(b_k\).
- Для каждого \(i\) от \(1\) до \(k\) мы находим такое \(j\) (\(1 \le j \le k\), \(j\neq i\)), для которого значение \((b_i \oplus b_j)\) минимально среди всех таких \(j\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ. После этого мы проводим неориентированное ребро между вершинами с числами \(b_i\) и \(b_j\).
- Последовательность называется хорошей, если и только если получившийся граф является деревом (то есть он связан и не имеет простых циклов).
Возможно, что для некоторых чисел \(b_i\) и \(b_j\) вы попробуете добавить ребро между ними дважды. Тем не менее вы добавите это ребро только один раз. Ниже приведен пример (рисунок, соответствующий первому примеру). Последовательность \((0, 1, 5, 2, 6)\) не хорошая, так как мы не можем достичь \(1\) из \(5\). Однако, последовательность \((0, 1, 5, 2)\) является хорошей. Вам дана последовательность \((a_1, a_2, \dots, a_n)\) из попарно различных неотрицательных целых чисел. Вы хотите удалить из нее некоторые элементы (возможно, ни одного), чтобы сделать оставшуюся последовательность хорошей. Какое минимально возможное количество удалений необходимо для достижения этой цели? Можно показать, что для любой последовательности можно удалить некоторое количество элементов, оставив как минимум \(2\), так, что оставшаяся последовательность будет хорошей. Выходные данные Необходимо вывести ровно одно целое число — минимально возможное количество элементов, которые нужно удалить, чтобы сделать оставшуюся последовательность хорошей. Примечание Обратите внимание, что числа, которые вы удаляете, не влияют на процедуру проверки, является ли хорошей оставшаяся последовательность. Возможно, что для некоторых чисел \(b_i\) и \(b_j\) вы попробуете добавить ребро между ними дважды. Тем не менее вы добавите это ребро только один раз.
| |
|
|
D. Разделяй и суммируй
Бинарный поиск
Перебор
разделяй и властвуй
реализация
сортировки
Структуры данных
*1600
Майк получил в подарок на день рождения массив \(a\) длины \(n\) и решил протестировать, насколько он красивый. Массив пройдет \(i\)-й тест на красоту, если существует способ из изначального массива путем некоторого (возможно, нулевого) количества операций разреза получить массив с суммой элементов, равной \(s_i\). Операция разреза массива происходит следующим образом: - Вычисляется \(mid = \lfloor\frac{max(array) + min(array)}{2}\rfloor\), где \(max\) и \(min\) — это функции нахождения максимального и минимального элемента массива. Иными словами, \(mid\) равно сумме максимального и минимального элементов \(array\), деленной на \(2\) с округлением вниз.
- Далее массив разделяется на две части \(\mathit{left}\) и \(right\). В \(\mathit{left}\) попадают все элементы массива, которые имеют значение меньшее либо равное \(mid\), а в массив \(right\) попадают все элементы, которые больше \(mid\). Элементы в \(\mathit{left}\) и \(right\) сохраняют свой относительный порядок, который был в \(array\).
- Третьим шагом выбирается, какой из массивов \(\mathit{left}\) или \(right\) мы хотим оставить. Выбранный массив заменит собой текущий, а другой навсегда удалится.
Вам требуется помочь Майку определить результаты \(q\) тестов на красоту. Заметьте, что вы тестируете красоту массива \(a\), поэтому вы начинаете каждый тест на красоту с изначальным (заданным) массивом \(a\). Таким образом, первый разрез (если он необходим) всегда совершается над массивом \(a\). Выходные данные Для каждого набора входных данных выведите \(q\) строк, каждая из которых должна содержать «Yes», если соответствующий тест на красоту пройден, и «No» в противном случае. Примечание Объяснение первого набора входных данных: - Получить массив с суммой \(s_1 = 1\) мы можем следующим способом:
1.1 \(a = [1, 2, 3, 4, 5]\), \(mid = \frac{1+5}{2} = 3\), \(\mathit{left} = [1, 2, 3]\), \(right = [4, 5]\). Мы выбираем оставить массив \(\mathit{left}\). 1.2 \(a = [1, 2, 3]\), \(mid = \frac{1+3}{2} = 2\), \(\mathit{left} = [1, 2]\), \(right = [3]\). Мы выбираем оставить массив \(\mathit{left}\). 1.3 \(a = [1, 2]\), \(mid = \frac{1+2}{2} = 1\), \(\mathit{left} = [1]\), \(right = [2]\). Мы выбираем оставить массив \(\mathit{left}\) с суммой, равной \(1\). - Массив с суммой \(s_2 = 8\) можно показать, что получить невозможно.
- Получить массив с суммой \(s_3 = 9\) мы можем следующим способом:
3.1 \(a = [1, 2, 3, 4, 5]\), \(mid = \frac{1+5}{2} = 3\), \(\mathit{left} = [1, 2, 3]\), \(right = [4, 5]\). Мы выбираем оставить массив \(right\) с суммой, равной \(9\). - Массив с суммой \(s_4 = 12\) можно показать, что получить невозможно.
- Получить массив с суммой \(s_5 = 6\) мы можем следующим способом:
5.1 \(a = [1, 2, 3, 4, 5]\), \(mid = \frac{1+5}{2} = 3\), \(\mathit{left} = [1, 2, 3]\), \(right = [4, 5]\). Мы выбираем оставить массив \(\mathit{left}\) с суммой, равной \(6\).
Объяснение второго набора входных данных: - Массив с суммой \(s_1 = 1\) можно показать, что получить невозможно.
- Получить массив с суммой \(s_2 = 2\) мы можем следующим способом:
2.1 \(a = [3, 1, 3, 1, 3]\), \(mid = \frac{1+3}{2} = 2\), \(\mathit{left} = [1, 1]\), \(right = [3, 3, 3]\). Мы выбираем оставить массив \(\mathit{left}\) с суммой \(2\). - Массив с суммой \(s_3 = 3\) можно показать, что получить невозможно.
- Получить массив с суммой \(s_4 = 9\) мы можем следующим способом:
4.1 \(a = [3, 1, 3, 1, 3]\), \(mid = \frac{1+3}{2} = 2\), \(\mathit{left} = [1, 1]\), \(right = [3, 3, 3]\). Мы выбираем оставить массив \(right\) с суммой \(9\). - Мы можем получить \(s_5 = 11\) без операций разреза, потому что изначальная сумма уже была равна \(11\).
| |
|
|
G. Песни сирен
Комбинаторика
математика
разделяй и властвуй
Строки
строковые суфф. структуры
хэши
*2600
Кто по незнанию приближается к ним и слышит голос сирен, тот больше не возвращается.Гомер, Одиссея Во времена Ясона и Аргонавтов, было хорошо известно, что сирены используют свои песни, чтобы заманивать моряков к себе на погибель. Но немногие знали, что каждый раз сирены, когда зовут моряков по имени, те становятся слабее и более уязвимыми. Для целей этой задачи, и песни сирен, и имена моряков будем представлять строками, состоящими из строчных английских букв. Чем больше раз имя моряка появляется как непрерывная подстрока в песне, тем моряк в большей опасности. Ясон обнаружил, что сирены могут петь одну из \(n+1\) песен, которые имеют следующую структуру: пусть \(s_i\) (\(0 \leq i \leq n\)) будет \(i\)-й песней, а \(t\) — некоторой строкой длины \(n\), тогда для всех \(i < n\): \(s_{i+1} = s_i t_i s_i\). другими словами, \(i+1\)-я песня это конкатенация \(i\)-й песни, \(i\)-й буквы (в \(0\) индексации) строки \(t\), и \(i\)-й песни. К счастью, он также знает \(s_0\) и \(t\). Ясон интересуется, сколько раз имя моряка встречается в конкретной песне. Ответьте на \(q\) вопросов: дано имя моряка (\(w\)) и номер песни (\(i\)), выведите количество вхождений \(w\) в \(s_i\) как подстроки. Так как это число может быть довольно большим, выведите его по модулю \(10^9+7\). Выходные данные Выведите \(q\) строк, \(i\)-я из них должна содержать остаток по модулю \(10^9+7\) от числа вхождений \(w\) в \(s_k\). Примечание В первом примере песни сирен выглядят так: - Песня \(0\): aa
- Песня \(1\): aabaa
- Песня \(2\): aabaacaabaa
- Песня \(3\): aabaacaabaadaabaacaabaa
| |
|
|
F. Странное покрытие
разделяй и властвуй
*3500
Даны \(n\) точек на плоскости. Найдите минимальную сумму площадей двух прямоугольников, стороны которых параллельны осям координат, что каждая из данных точек содержится хотя бы в одном из этих прямоугольников. Обратите внимание, что точки могут лежать на границах прямоугольников, и прямоугольники могут иметь нулевую площадь. Выходные данные Для каждого набора входных данных выведите единственное число — минимальную суммарную площадь двух прямоугольников. Примечание В первых двух наборах входных данных ответом являются два прямоугольника нулевой площади. В третьем наборе входных данных ответом могут являться два прямоугольника \(1 \times 1\) с левыми нижними углами \((0,0)\) и \((9,9)\).
| |
|
|
E. Панорама города
дп
разделяй и властвуй
Структуры данных
*2100
Алиса в Нью-Йорке! Она хочет сделать несколько снимков знаменитых небоскребов и отправить набор фотографий Бобу. Алиса хочет составить наиболее красивый набор фотографий, и в этом ей требуется ваша помощь. В городе \(n\) зданий, расположенных в линию слева направо, \(i\)-е из них имеет положительную высоту \(h_i\). Высоты всех \(n\) зданий в городе различны. Кроме того, у каждого здания есть параметр красоты \(b_i\). Красота зданий может быть положительна или отрицательна (или равна нулю), потому что некоторые здания портят вид. Набор фотографий состоит из одной или более фотографий зданий. На каждом фото должно быть изображено одно или несколько зданий, расположенных подряд. Каждое здание должно попасть на ровно одно фото. Другими словами, если есть здание, которое не попало ни на одно фото, или присутствует более чем на одном фото, то такой набор фотографий считается некорректным. Красота одной фотографии равняется красоте \(b_i\) самого низкого здания на фотографии. Общая красота набора фотографий равна сумме красот всех фотографий в наборе. Помогите Алисе определить максимально возможную красоту корректного набора фотографий. Выходные данные Выведите одно число — максимальную красоту, которую может иметь корректный набор фотографий. Примечание В первом примере максимальная красота достигается, если Алиса сделает пять фотографий, каждая из которых содержит одно здание. Во втором примере Алиса может достичь максимальной красоты набора, равной \(10\), если сделает четыре фотографии: три содержат одно здание каждая (здания \(1\), \(2\) и \(5\)), их красоты равны \(-3\), \(4\) и \(7\) соответственно, и еще одна фотография содержит здания \(3\) и \(4\), ее красота равна \(2\). В третьем примере Алиса может просто сделать одно фото всего города. В четвертом примере Алиса может сделать следующие фотографии для достижения максимальной красоты набора: отдельно фотографии зданий \(1\), \(2\), \(8\), \(9\) и \(10\), а также одно фото зданий \(3\), \(4\), \(5\), \(6\) и \(7\) вместе.
| |
|
|
D. Трансформация перестановки
поиск в глубину и подобное
разделяй и властвуй
реализация
*1200
Перестановка — это последовательность длины \(n\) целых чисел от \(1\) до \(n\), в которой все числа встречаются ровно по одному разу. Например, \([1]\), \([3, 5, 2, 1, 4]\), \([1, 3, 2]\) — перестановки, а \([2, 3, 2]\), \([4, 3, 1]\), \([0]\) — нет. Поликарпу недавно подарили перестановку \(a[1 \dots n]\) длины \(n\). Поликарпу деревья нравятся больше, чем перестановки, поэтому он хочет превратить перестановку \(a\) в корневое бинарное дерево. Массив различных целых чисел он превращает в дерево следующим образом: - максимальный элемент массива становится корнем дерева;
- все элементы слева от максимума — образуют левое поддерево (которое строится по тем же правилам, но применяемым для левого участка массива), но если слева от максимума элементов нет, то у корня нет левого сына;
- все элементы справа от максимума — образуют правое поддерево (которое строится по тем же правилам, но применяемым для правого участка массива), но если справа от максимума элементов нет, то у корня нет правого сына.
Например, если он строит дерево по перестановке \(a=[3, 5, 2, 1, 4]\), то корнем будет элемент \(a_2=5\), левым поддеревом будет дерево, которое будет построено для подмассива \(a[1 \dots 1] = [3]\), а правым — для подмассива \(a[3 \dots 5] = [2, 1, 4]\). В итоге будет построено следующее дерево: Дерево, соответствующее перестановке \(a=[3, 5, 2, 1, 4]\). Другой пример: пусть перестановка имеет вид \(a=[1, 3, 2, 7, 5, 6, 4]\). В этом случае дерево выглядит так: Дерево, соответствующее перестановке \(a=[1, 3, 2, 7, 5, 6, 4]\). Обозначим за \(d_v\) глубину вершины \(a_v\), то есть количество ребер на пути от корня до вершины с номером \(a_v\). Заметьте, что глубина корня равна нулю. По заданной перестановке \(a\) для каждой вершины найдите значение \(d_v\). Выходные данные Для каждого набор входных данных выведите \(n\) значений — \(d_1, d_2, \ldots, d_n\).
| |
|
|
E. Фиб-дерево
Деревья
Перебор
поиск в глубину и подобное
разделяй и властвуй
теория чисел
*2400
Пусть \(F_k\) обозначает \(k\)-й член последовательности Фибоначчи, определенной следующим образом: - \(F_0 = F_1 = 1\)
- для любого целого \(n \geq 0\), \(F_{n+2} = F_{n+1} + F_n\).
Вам дано дерево с \(n\) вершинами. Напомним, что дерево — это связный неориентированный граф без циклов. Дерево называется Фиб-деревом, если его количество вершин равно \(F_k\) для некоторого \(k\), и выполняется хотя бы одно из следующих условий: - Дерево состоит только из \(1\) вершины;
- Вы можете разделить его на два Фиб-дерева, удалив некоторое ребро дерева.
Определите, является ли данное дерево Фиб-деревом. Выходные данные Выведите «YES», если данное дерево является Фиб-деревом, или «NO», если не является. Ответ можно вывести в любом регистре. Например, если ответ «YES», то вывод «Yes» или «yeS» также будет считаться правильным ответом. Примечание В первом примере можно удалить ребро \((1, 2)\), и дерево будет разбито на \(2\) дерева размера \(1\) и \(2\) соответственно. Любое дерево размера \(2\) является Фиб-деревом, так как его можно разбить на \(2\) дерева размером \(1\). Во втором примере, независимо от того, какое ребро мы удаляем, дерево будет разбито на \(2\) дерева размера \(1\) и \(4\). Поскольку \(4\) не равняется \(F_k\) ни для какого \(k\), это не Фиб-дерево. В третьем примере, вот один из возможных порядков удаления ребер, чтобы все деревья в процессе были Фиб-деревьями: \((1, 3), (1, 2), (4, 5), (3, 4)\).
| |
|
|
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\). Если корректных структур компании несколько, вы можете вывести любую из них. Примечание Одна из возможных структур в первом примере: 
| |
|
|
E. Замерзаем красиво
Бинарный поиск
Деревья
разделяй и властвуй
Структуры данных
*3000
Этой зимой в городе... ну вы поняли :-) Дорожную систему города XXXводска можно представить как n перекрестков, соединенных n - 1 двунаправленными дорогами так, что между любыми двумя перекрестками есть путь. Организаторы некоего мероприятия хотят выбрать место, где будут жить участники (перекресток v), и место, где будут проходить соревнования (перекресток u). При этом, с одной стороны, они хотят, чтобы участники гуляли по городу и смотрели окрестности (поэтому расстояние между v и u должно быть не меньше l), но не хотят, чтобы участники замерзли (поэтому расстояние между v и u должно быть не больше r). Помимо этого для каждой улицы известна ее красота — некоторое целое число от 0 до 109. Ваша задача — выбрать путь, удовлетворяющий ограничениям по длине, и обладающей наибольшей средней красотой. Средней красотой пути будем называть медиану последовательности красот всех дорог на пути. Более формально: пусть есть путь длины k. Пусть ai — неубывающая последовательность, содержащая в точности k элементов, в которой каждое число встречается ровно столько раз, сколько дорог с такой красотой встречается на этом пути. Медианой пути назовем число a⌊k / 2⌋, предполагая что используется индексация от нуля. ⌊x⌋ — число х, округленное вниз до ближайшего целого. Например, если a = {0, 5, 12}, то медиана равна 5, а если a = {0, 5, 7, 12}, то медианой окажется число 7. Гарантируется, что найдется хотя бы один путь с подходящим количеством дорог. Выходные данные Выведите два числа — номера перекрестков, в которых необходимо поселить участников и проводить соревнования, соответственно. Если оптимальных ответов несколько, выведите любой. Примечание В первом примере все дороги имеют одинаковую красоту, а значит, все пути положительной длины имеют одинаковую медиану. Таким образом, нам подойдет любой путь с длиной от 3 до 4 включительно. Во втором примере город выглядит следующим образом: 1 - 2 - 3 - 4 - 5 - 6. Последние две дороги более ценные, и нужно выбрать любой путь, который содержит обе и имеет подходящую длину. Это либо путь между 2 и 6, либо путь между 3 и 6.
| |
|
|
F. Сбалансируйте карты
геометрия
графы
Конструктив
разделяй и властвуй
реализация
Структуры данных
*3500
Сбалансированная скобочная последовательность определяется как целая последовательность целых чисел, которая может быть построена по следующим правилам: - Пустая последовательность сбалансирована.
- Если \([a_1,\ldots,a_n]\) и \([b_1,\ldots, b_m]\) сбалансированы, то их конкатенация \([a_1,\ldots,a_n,b_1,\ldots,b_m]\) сбалансирована.
- Если \(x\) — целое положительное число и \([a_1,\ldots,a_n]\) сбалансирована, то \([x,a_1,\ldots,a_n,-x]\) сбалансирована.
Положительные числа можно представить себе в виде открывающихся скобок, а отрицательные — в виде закрывающих скобок, где соответствующие скобки должны иметь одинаковый тип (абсолютное значение). Например, \([1, 2, -2, -1]\) и \([1, 3, -3, 2, -2, -1]\) сбалансированы, но \([1, 2, -1, -2]\) и \([-1, 1]\) не сбалансированы. Есть \(2n\) карт. Каждая карта имеет число на лицевой стороне и число на оборотной. Каждое целое число \(1,-1,2,-2,\ldots,n,-n\) встречается на лицевой стороне ровно одной карты и на оборотной стороне ровной одной карты (необязательно той же карты). Вы можете переупорядочить карты, как вам угодно. Вам не разрешено переворачивать карты, поэтому числа не могут перемещаться между лицевой и оборотной сторонами карты. Ваша задача — упорядочить карты так, чтобы последовательности, заданные числами на лицевых и оборотных сторонах, были сбалансированы, или сообщить, что это невозможно. Выходные данные В первой строке выведите «YES», если можно упорядочить карты, чтобы выполнялось условие. В противном случае выведите «NO». Вы можете выводить каждый символ в любом регистре. Если это возможно, в следующих \(2n\) строках выведите карты в таком порядке, чтобы и лицевая и оборотная части были сбалансированы. Если есть несколько решений, то можно вывести любое. Примечание В первом примере лицевые числа образуют сбалансированную последовательность \([1,4,-4,-1,5,3,2,-2,-3,-5]\), а оборотные числа создают сбалансированную последовательность \([3,-3,4,-4,1,-1,2,5,-5,-2]\). Во втором примере карты даются в таком порядке, что лицевые числа сбалансированы, а оборотные образуют несбалансированную последовательность \([1,2,-1,-2]\). Если бы мы поменяли местами вторую и третью карты, то сбалансировали бы оборотные числа и разбалансировали бы лицевые. Но нет такого порядка, который бы балансировал и то, и другое.
| |
|
|
G. Попробуй забронируй
разделяй и властвуй
Структуры данных
*3200
Василий владеет квартирой в центре Лондона. Он решил сдавать квартиру в течение следующих \(n\) дней, чтобы подзаработать денег. Так как квартира Василия находится в центре города, то ему сразу пришло целых \(m\) предложений вида \((l_i, r_i)\) обозначающего, что кто-то хочет забронировать квартиру со дня \(l_i\) до дня \(r_i\) включительно. Чтобы не тратить много времени на определение, выгодно ли ему соглашаться на предложение о съеме, Василий решил разработать алгоритм. Алгоритм обрабатывает все предложения в порядке их поступления и принимает очередное предложение \(i\) в случае, если выполняются следующие два условия: - \(r_i - l_i + 1 \ge x\).
- Все дни на отрезке от \(l_i\) до \(r_i\) не заняты ни одним из ранее принятых предложений.
Василий не определился со значением, которому будет равен \(x\), и просит у вас помощи. Он хочет, чтобы для всех \(x\) от \(1\) до \(n\) вы посчитали суммарное количество дней, в которые будет сдаваться квартира, если алгоритм будет использовать соответствующий параметр \(x\). Выходные данные Выведите \(n\) целых чисел. Число в \(i\)-й строке должно обозначать количество дней, на которое будет сдана квартира, если алгоритм будет использовать \(x\) равный \(i\). Примечание Описание отрезков из первого тестового примера для каждого \(x\): - \(x = 1\) — алгоритм одобрит предложения: \(1\) (2..3), \(3\) (1..1). Суммарное количество дней, на которое Василий сдаст квартиру — 3
- \(x = 2\) — алгоритм одобрит предложение \(1\) (2..3). Суммарное количество дней, на которое Василий сдаст квартиру — 2
- \(x = 3\) — алгоритм одобрит предложение \(2\) (3..5). Суммарное количество дней, на которое Василий сдаст квартиру — 3
- \(x = 4\) — алгоритм одобрит предложение \(4\) (1..5). Суммарное количество дней, на которое Василий сдаст квартиру — 5
- \(x = 5\) — алгоритм одобрит предложение \(4\) (1..5). Суммарное количество дней, на которое Василий сдаст квартиру — 5
- \(x = 6\) — алгоритм одобрит предложение \(5\) (1..6). Суммарное количество дней, на которое Василий сдаст квартиру — 6
| |
|
|
E. Игра в разделения
Бинарный поиск
дп
разделяй и властвуй
Структуры данных
*2500
Дан массив \(a\) из \(n\) целых чисел. Стоимость массива \(t\) вычисляется следующим образом: \(\)cost(t) = \sum_{x \in set(t) } last(x) - first(x),\(\) где \(set(t)\) есть множество всех различных значений в \(t\) без повторений, \(first(x)\), и \(last(x)\) индексы первого и последнего вхождения \(x\) в \(t\), соответственно. Другими словами, мы считаем сумму расстояний между первым и последним вхождением каждого значения. Вам нужно разделить \(a\) на \(k\) последовательных отрезков так, что каждый элемент \(a\) принадлежит ровно одному отрезку, а сумма стоимостей отрезков минимальна. Выходные данные Выведите минимальную возможную сумму стоимостей. Примечание В первом примере мы можем разделить массив на \([1,6,6,4]\) и \([6,6,6]\). Стоимость \([1,6,6,4]\) будет \((1-1) + (3 - 2) + (4-4) = 1\), а стоимость \([6,6,6]\) будет \(3-1 = 2\). Суммарная стоимость будет \(1 + 2 = 3\). Во втором примере разделим массив на \([5,5],[5],[5,2,3]\) и \([3]\). Суммарная стоимость будет \(1 + 0 + 0 + 0 = 1\).
| |
|
|
A. Огромное дерево Parsa
Деревья
дп
жадные алгоритмы
поиск в глубину и подобное
разделяй и властвуй
*1600
У Parsa есть огромное дерево на \(n\) вершинах. На каждой вершине \(v\) он записал два целых числа \(l_v\) и \(r_v\). Чтобы дерево Parsa выглядело еще более величественным, Nima хочет назначить число \(a_v\) (\(l_v \le a_v \le r_v\)) для каждой вершины \(v\) таким образом, чтобы красота дерева Parsa была максимальной. Восприятие красоты Nima довольно причудливо. Он определяет красоту дерева как сумму \(|a_u - a_v|\) по всем ребрам \((u, v)\) дерева. Поскольку дерево Parsa слишком велико, Nima не может самостоятельно максимизировать его красоту. Ваша задача — найти максимальную возможную красоту для дерева Parsa. Выходные данные Для каждого набора входных данных выведите максимальную возможную красоту для дерева Парса. Примечание Деревья в примере: В первом наборе входных данных одно из возможных назначений — \(a = \{1, 8\}\), что приводит к \(|1 - 8| = 7\). Во втором наборе входных данных одно из возможных назначений — \(a = \{1, 5, 9\}\), что приводит к красоте \(|1 - 5| + |5 - 9| = 8\).
| |
|
|
E. Финальное преследование
битмаски
графы
жадные алгоритмы
Конструктив
математика
разделяй и властвуй
*2700
В конечном счете вы победили Рэйзора и теперь считаетесь Самым Разыскиваемым уличным гонщиком. Сержант Кросс послал в смертельную погоню за вами целый полицейский отряд. К счастью, вы нашли укромное убежище, но все еще переживаете, что Кросс и его ребята в конце концов вас отыщут. Чтобы увеличить свои шансы на выживание, вы собираетесь перенастроить и перекрасить вашу BMW M3 GTR. Машину можно представлять как перенумерованный \(n\)-мерный гиперкуб. Простым \(n\)-мерным гиперкубом называется неориентированный невзвешенный граф, построенный рекурсивно следующим образом: - Возьмите два простых \((n-1)\)-мерных гиперкуба. Вершины одного из них должны быть пронумерованы числами от \(0\) до \(2^{n-1}-1\), а другого — от \(2^{n-1}\) до \(2^{n}-1\). Простой \(0\)-мерный гиперкуб — это одна вершина.
- Добавьте ребро между вершинами \(i\) и \(i+2^{n-1}\) для каждого \(0\leq i < 2^{n-1}\).
Перенумерованный \(n\)-мерный гиперкуб получается перестановкой номеров вершин простого \(n\)-мерного гиперкуба произвольным образом. Примеры простого и перенумерованного \(3\)-мерных гиперкубов представлены ниже: Заметьте, что перенумерованный \(n\)-мерный гиперкуб обладает следующими свойствами: - Он содержит в точности \(2^n\) вершин.
- Он содержит в точности \(n\cdot 2^{n-1}\) ребер.
- Каждая вершина соединена ровно с \(n\) другими вершинами.
- Он не содержит петель и кратных ребер.
Обозначим за \(P\) перестановку, использованную для получения перенумерованного \(n\)-мерного гиперкуба, описывающего вашу машину, из простого \(n\)-мерного гиперкуба. Прежде чем наводить беспорядок в функциональностях машины, вы хотите найти эту перестановку, чтобы, если что-то пойдет не так, суметь восстановить машину. Но это еще не все. У вас с собой есть \(n\) различных цветов, пронумерованных от \(0\) до \(n-1\). Вы хотите покрасить вершины перенумерованного \(n\)-мерного гиперкуба таким образом, чтобы для каждой вершины \(u\), удовлетворяющей \(0\leq u < 2^n\), и каждого цвета \(c\), удовлетворяющего \(0\leq c < n\), существовала хотя бы одна вершина \(v\), соседняя с \(u\) и покрашенная в цвет \(c\). Иными словами, из каждой вершины должно быть возможно перейти в вершину любого цвета ровно по одному ребру. Дан перенумерованный \(n\)-мерный гиперкуб, найдите любые допустимые перестановку \(P\) и покраску. Выходные данные Для каждого набора входных данных выведите две строки. В первой строке выведите любую перестановку \(P\) длины \(2^n\), которая может быть использована для получения перенумерованного \(n\)-мерного гиперкуба, данного во входных данных, из простого \(n\)-мерного гиперкуба. Два перенумерованных гиперкуба считаются одинаковыми, если они имеют одинаковый набор ребер. Если возможно несколько ответов, выведите любой из них. Во второй строке выведите покраску. Если не существует покраски, удовлетворяющей условиям, выведите \(-1\). В противном случае напечатайте одну строку, содержащую \(2^n\) целых чисел, разделенных пробелом. \(i\)-е число должно быть равно цвету вершины с номером \((i-1)\) в перенумерованном \(n\)-мерном гиперкубе. Если возможно несколько ответов, выведите любой из них. Примечание Покраска и перенумерованный гиперкуб для первого набора входных данных представлены ниже: Покраска и перенумерованный гиперкуб для второго набора входных данных представлены ниже: Перенумерованный гиперкуб для третьего набора дан в условии задачи. Однако, можно показать, что не существует покраски, удовлетворяющей всем условиям. Заметьте, что некоторые другие перестановки, например, \([0, 5, 7, 3, 1, 2, 4, 6]\) и \([0, 1, 5, 2, 7, 4, 3, 6]\) дадут этот же перенумерованный гиперкуб.
| |
|
|
F. Стабилизируй массив (НОД-версия)
Бинарный поиск
Перебор
разделяй и властвуй
Структуры данных
теория чисел
*1900
Задан массив из положительных целых чисел \(a = [a_0, a_1, \dots, a_{n - 1}]\) (\(n \ge 2\)). За один шаг массив \(a\) заменяется на другой массив длины \(n\), в котором каждый элемент это наибольший общий делитель (НОД) двух соседних элементов (самого элемента и его правого соседа; считайте, что правый сосед \((n - 1)\)-го элемента это \(0\)-й элемент). Формально говоря, по массиву \(a = [a_0, a_1, \dots, a_{n - 1}]\) строится новый массив \(b = [b_0, b_1, \dots, b_{n - 1}]\) такой, что \(b_i\) \(= \gcd(a_i, a_{(i + 1) \mod n})\), где \(\gcd(x, y)\) — это наибольший общий делитель \(x\) и \(y\), а \(x \mod y\) — это остаток от деления \(x\) на \(y\). За один шаг строится массив \(b\), а затем массив \(a\) заменяется массивом \(b\) (то есть осуществляется присваивание \(a\) := \(b\)). Например, если \(a = [16, 24, 10, 5]\), то \(b = [\gcd(16, 24)\), \(\gcd(24, 10)\), \(\gcd(10, 5)\), \(\gcd(5, 16)]\) \(= [8, 2, 5, 1]\). Таким образом, массив \(a = [16, 24, 10, 5]\) после одного шага станет равен \([8, 2, 5, 1]\). Для заданного массива \(a\) найдите минимальное количество шагов, после которых все значения \(a_i\) станут равными (то есть \(a_0 = a_1 = \dots = a_{n - 1}\)). Если изначально массив \(a\) уже состоял из одинаковых элементов, то считайте, что количество шагов равно \(0\). Выходные данные Выведите \(t\) чисел — ответы на наборы входных данных теста.
| |
|
|
B. У чисел есть друзья
Бинарный поиск
математика
разделяй и властвуй
Структуры данных
теория чисел
*1800
Британский математик Джон Литлвуд однажды высказался об индийском математике Сринивасе Рамануджане: «каждое натуральное число было его личным другом». Оказывается, натуральные числа могут также дружить друг с другом! Вам дан массив \(a\) из различных натуральных чисел. Будем называть подмассив \(a_i, a_{i+1}, \ldots, a_j\) группой друзей тогда и только тогда, когда существует целое число \(m \ge 2\) такое, что \(a_i \bmod m = a_{i+1} \bmod m = \ldots = a_j \bmod m\), где \(x \bmod y\) обозначает остаток от деления \(x\) на \(y\). Ваш друг Грегор хочет знать размер наибольшей группы друзей в \(a\). Выходные данные Ваш вывод должен состоять из \(t\) строк. Каждая строка должна содержать одно целое число — размер наибольшей группы друзей из \(a\). Примечание В первом наборе массив равен \([1,5,2,4,6]\). Наибольшая группа друзей здесь \([2,4,6]\), потому что все эти числа сравнимы с \(0\) по модулю \(2\), таким образом \(m=2\). В первом наборе массив равен \([8,2,5,10]\). Наибольшая группа друзей здесь \([8,2,5]\), потому что все эти числа сравнимы с \(2\) по модулю \(3\), таким образом \(m=3\). В третьем наборе наибольшая группа друзей равна \([1000,2000]\). Существует несколько возможных подходящих значений \(m\).
| |
|
|
E. Грегор и два маляра
графы
жадные алгоритмы
математика
разделяй и властвуй
Структуры данных
*3400
Два маляра, Амин и Бенджи, перекрашивают потолок в гостиной Грегора! Потолок можно представить как таблицу размера \(n \times m\). Для каждого \(i\) от \(1\) до \(n\) включительно маляр Амин нанес \(a_i\) слоев краски на весь \(i\)-й ряд. Для каждого \(j\) от \(1\) до \(m\) включительно маляр Бенджи нанес \(b_j\) слоев краски на весь \(j\)-й столбец. Таким образом, клетка \((i,j)\) оказалась покрашенной в \(a_i+b_j\) слоев краски. Грегор считает, что клетка \((i,j)\) плохо покрашена, если \(a_i+b_j \le x\). Определим плохо покрашенную область как максимальную по включению связную компоненту плохо покрашенных клеток, то есть такую связную компоненту плохо покрашенных клеток, что все клетки, соседние с этой компонентой, не являются плохо покрашенными. Две клетки являются соседними, если они имеют общую сторону. Грегор потрясен состоянием потолка, покрашенного малярами, и хочет знать количество плохо покрашенных областей. Выходные данные Выведите одно целое число — количество плохо покрашенных областей. Примечание Рисунок ниже иллюстрирует первый пример. Числа слева от каждого ряда представляют собой список \(a\), а числа над каждым столбцом — список \(b\). Числа внутри каждой клетки равны количеству слоев краски в этой клетке. Цветные клетки соответствуют плохо покрашенным клеткам. Красные и синие клетки соответственно образуют \(2\) плохо покрашенных области.
| |
|
|
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\). Четвертый тест показан в описании ко второму тесту.
| |
|
|
H. XOR и расстояния
битмаски
Деревья
разделяй и властвуй
*2900
Вам дан массив \(a\), состоящий из \(n\) различных элементов, и целое число \(k\). Каждый элемент в массиве это неотрицательное целое число, не превосходящее \(2^k-1\). Обозначим через XOR расстояние для числа \(x\) следующую величину: \(\)f(x) = \min\limits_{i = 1}^{n} \min\limits_{j = i + 1}^{n} |(a_i \oplus x) - (a_j \oplus x)|,\(\) где через \(\oplus\) обозначено побитовое исключающее ИЛИ. Для каждого целого числа \(x\) от \(0\) до \(2^k-1\) посчитайте \(f(x)\). Выходные данные Выведите \(2^k\) чисел. \(i\)-е из них должно равняться \(f(i-1)\). Примечание Рассмотрим первый пример: - для \(x = 0\), если мы применим XOR ко всем элементам массива с числом \(x\), мы получим массив \([6, 0, 3]\), и минимальный модуль разности между элементами равен \(3\);
- для \(x = 1\), если мы применим XOR ко всем элементам массива с числом \(x\), мы получим массив \([7, 1, 2]\), и минимальный модуль разности между элементами равен \(1\);
- для \(x = 2\), если мы применим XOR ко всем элементам массива с числом \(x\), мы получим массив \([4, 2, 1]\), и минимальный модуль разности между элементами равен \(1\);
- для \(x = 3\), если мы применим XOR ко всем элементам массива с числом \(x\), мы получим массив \([5, 3, 0]\), и минимальный модуль разности между элементами равен \(2\);
- для \(x = 4\), если мы применим XOR ко всем элементам массива с числом \(x\), мы получим массив \([2, 4, 7]\), и минимальный модуль разности между элементами равен \(2\);
- для \(x = 5\), если мы применим XOR ко всем элементам массива с числом \(x\), мы получим массив \([3, 5, 6]\), и минимальный модуль разности между элементами равен \(1\);
- для \(x = 6\), если мы применим XOR ко всем элементам массива с числом \(x\), мы получим массив \([0, 6, 5]\), и минимальный модуль разности между элементами равен \(1\);
- для \(x = 7\), если мы применим XOR ко всем элементам массива с числом \(x\), мы получим массив \([1, 7, 4]\), и минимальный модуль разности между элементами равен \(3\).
| |
|
|
I. Лестницы
бпф
дп
Комбинаторика
математика
разделяй и властвуй
*3400
Для перестановки \(p\) чисел от \(1\) до \(n\) мы можем задать лестничный массив \(a\) следующим образом: \(a_i\) равняется длине наибольшего подотрезка перестановки, который содержит позицию \(i\) и состоит из последовательных чисел в отсортированном порядке: \([x, x+1, \ldots, y-1, y]\) или \([y, y-1, \ldots, x+1, x]\) для некоторых \(x \leq y\). Например, для перестановки \(p = [4, 1, 2, 3, 7, 6, 5]\) получается лестничный массив \(a = [1, 3, 3, 3, 3, 3, 3]\). Вам дан массив \(a\). Ваша задача — посчитать количество перестановок, лестничный массив которых равен \(a\). Так как это количество может быть достаточно большим, посчитайте его по модулю \(998\,244\,353\). Обратите внимание, что количество может быть равно нулю. Выходные данные Выведите количество перестановок, лестничный массив которых равен \(a\). Так как это число может быть довольно большим, выведите его по модулю \(998\,244\,353\).
| |
|
|
E. Заурядные запросы
математика
разделяй и властвуй
Структуры данных
*2200
Недавно, на свой день рождения, Алиса получила массив \(a_1, a_2, \dots, a_n\). Массив ей очень понравился, как ее другу Бобу, которому Алиса его показала. Однако довольно скоро Боб, как любой хороший друг, попросил Алису выполнить \(q\) операций двух видов над ее массивом: - \(1\) \(x\) \(y\): присвоить элементу \(a_x\) значение \(y\) (или \(a_x = y\));
- \(2\) \(l\) \(r\): посчитать, сколько неубывающих подмассивов содержится в подмассиве \([a_l, a_{l+1}, \dots, a_r]\). Формально, нужно посчитать количество пар индексов \((p,q)\) таких, что \(l \le p \le q \le r\) и \(a_p \le a_{p+1} \le \dots \le a_{q-1} \le a_q\).
Помогите Алисе ответить на запросы Боба! Выходные данные Для каждого запроса \(2\)-го типа выведите одно целое число — ответ на данный запрос. Примечание Для первого запроса (\(l = 2\) и \(r = 5\)) неубывающие подмассивы \([p,q]\) — это \([2,2]\), \([3,3]\), \([4,4]\), \([5,5]\), \([2,3]\) и \([4,5]\).
| |
|
|
L. Longest Array Deconstruction
дп
разделяй и властвуй
сортировки
Структуры данных
*2100
Mr. Chanek gives you a sequence \(a\) indexed from \(1\) to \(n\). Define \(f(a)\) as the number of indices where \(a_i = i\). You can pick an element from the current sequence and remove it, then concatenate the remaining elements together. For example, if you remove the \(3\)-rd element from the sequence \([4, 2, 3, 1]\), the resulting sequence will be \([4, 2, 1]\). You want to remove some elements from \(a\) in order to maximize \(f(a)\), using zero or more operations. Find the largest possible \(f(a)\). Output Output an integer denoting the largest \(f(a)\) that can be obtained by doing zero or more operations. Note In the first example, \(f(A) = 3\) by doing the following operations. \([2,1,\textbf{4},2,5,3,7] \rightarrow [\textbf{2},1,2,5,3,7] \rightarrow [1,2,5,3,\textbf{7}] \rightarrow [1,2,\textbf{5},3] \rightarrow [1,2,3]\) In the second example, \(f(A) = 2\) and no additional operation is needed.
| |
|
|
D. Подпоследовательность
Деревья
дп
жадные алгоритмы
Перебор
разделяй и властвуй
*2900
У Алисы есть целочисленная последовательность \(a\) длины \(n\) и все ее элементы различны. Она выбирает из \(a\) подпоследовательность длины \(m\) и определяет ценность подпоследовательности \(a_{b_1},a_{b_2},\ldots,a_{b_m}\) как \(\)\sum_{i = 1}^m (m \cdot a_{b_i}) - \sum_{i = 1}^m \sum_{j = 1}^m f(\min(b_i, b_j), \max(b_i, b_j)),\(\) где \(f(i, j)\) обозначает \(\min(a_i, a_{i + 1}, \ldots, a_j)\). Алиса хочет, чтобы вы помогли ей максимизировать ценность выбираемой подпоследовательности. Последовательность \(s\) является подпоследовательностью \(t\), если \(s\) может быть получена из \(t\) удалением нескольких (возможно, ни одного или всех) элементов. Выходные данные Выведите максимальное значение, которое может получить Алиса. Примечание В первом примере Алиса может выбрать подпоследовательность \([15, 2, 18, 13]\), которая имеет ценность \(4 \cdot (15 + 2 + 18 + 13) - (15 + 2 + 2 + 2) - (2 + 2 + 2 + 2) - (2 + 2 + 18 + 12) - (2 + 2 + 12 + 13) = 100\). Во втором примере существует множество подпоследовательностей ценности \(176\), одна из них — \([9, 7, 12, 20, 18]\).
| |
|
|
F. Защитник детских мечт
битмаски
Конструктив
разделяй и властвуй
*2500
Даже если вы просто оставите их в покое, они разлетятся на куски сами по себе. Значит, кто-то должен их защищать, верно? Вы снова играете с Тьюсером в городе Лиюэ. Водя эксцентричного малыша по городу, вы заметили кое-что интересное в его структуре. Лиюэ можно представить в виде направленного графа, содержащего \(n\) вершин. Вершины пронумерованы от \(1\) до \(n\). Ребро из вершины \(a\) в вершину \(b\) существует тогда и только тогда, когда \(a < b\). Путь между вершинами \(a\) и \(b\) определяется как последовательность ребер таких, можно начать путь в \(a\), пройти по всем этим ребрам в соответствующем неправлении, и закончить в \(b\). Длина пути равна количеству ребер. Радужный путь длины \(x\) определяется как такой путь в графе, что среди этих \(x\) ребер существует по крайней мере 2 разных цвета. Любимое число Тьюсера — \(k\). Вам интересно следующее: если вам нужно обозначить каждое ребро цветом, то какое минимальное количество цветов понадобится для того, чтобы все пути длины \(k\) или больше были радужными? Тьюсер хочет удивить своего старшего брата картой Лиюэ. Он также хочет узнать допустимую раскраску ребер, которая использует минимальное количество цветов. Пожалуйста, помогите ему решить эту задачу! Выходные данные В первой строке выведите \(c\), минимальное количество цветов, необходимое для выполнения вышеуказанных требований. Во второй строке выведите допустимую раскраску ребер в виде массива из \(\frac{n(n-1)}{2}\) целых чисел от \(1\) до \(c\). В ней должно присутствовать ровно \(c\) различных цветов. Выведите ребра в порядке возрастания сначала по начальному вершине, затем по второй вершине. Например, если \(n=4\), то цвета ребер нужно выводить в таком порядке: (\(1\), \(2\)), (\(1\), \(3\)), (\(1\), \(4\)), (\(2\), \(3\)), (\(2\), \(4\)), (\(3\), \(4\)) Примечание Соответствующая конструкция для первого примера выглядит следующим образом: Невозможно удовлетворить ограничениям, используя менее \(2\) цветов. Соответствующая конструкция для второго примера выглядит следующим образом: Можно показать, что не существует конструкции, использующей менее \(3\) цветов.
| |
|
|
H. Омкар и туры
Деревья
разделяй и властвуй
сортировки
Структуры данных
*3300
Омкар устраивает туры по своей стране, Омкарландии! В Омкарландии \(n\) городов, и, что довольно любопытно, существует ровно \(n-1\) двунаправленных дорог, соединяющих города друг с другом. Гарантируется, что вы можете добраться до любого города из любого другого города через сеть дорог. Каждый город имеет значение удовольствия \(e\). У каждой дороги есть пропускная способность \(c\), обозначающее максимальное количество автомобилей, которое может на ней находиться, и соответствующая плата за проезд \(t\). Однако система взимания платы в Омкарландии имеет интересную особенность: если автомобиль проезжает по нескольким дорогам за одну поездку, он платит только самую высокую плату за проезд по любой отдельной дороге, по которой он проехал. (Другими словами, он платит \(\max t\) по всем дорогам, по которым они проехал). Если автомобиль не проезжает ни одной дороги, он платит \(0\) за проезд. Омкар решил принять \(q\) туристических групп. Каждая туристическая группа состоит из \(v\) автомобилей, стартующих из города \(x\). (Следует помнить, что туристическая группа с \(v\) автомобилями может передвигаться только по дорогам с пропускной способностью \(\geq v\)). Будучи организатором тура, Омкар хочет, чтобы его группы получили как можно больше удовольствия, но при этом он должен возместить своим группам расходы на проезд по дорогам, которые они должны заплатить. Таким образом, для каждой туристической группы Омкар хочет знать две вещи: во-первых, какое максимальное значение удовольствия имеет город \(y\) — город с максимальным значением удовольствия среди тех, до которых туристическая группа может добраться из своего начального города, и, во-вторых, сколько Омкар должен будет заплатить с каждого автомобиля, чтобы возместить расходы всей группы на поездку из \(x\) в \(y\)? (Эта поездка из \(x\) в \(y\) всегда будет проходить по кратчайшему пути из \(x\) в \(y\)). В случае, если существует несколько городов с максимальным значением удовольствия, Омкар позволит своей туристической группе выбрать, в какой из них они хотят поехать. Поэтому, чтобы подготовиться ко всем возможным сценариям, он хочет знать сумму денег на автомобиль, которая ему необходима, чтобы гарантировать, что он сможет возместить расходы группы независимо от того, какой город они выберут. Выходные данные Выведите \(q\) строк. \(i\)-я строка должна содержать два целых числа: максимально возможное значение удовольствия города, до которого может добраться \(i\)-я туристическая группа, и количество денег на автомобиль, которое необходимо Омкару, чтобы гарантировать возмещение расходов \(i\)-й туристической группы. Примечание Карта с первого примера показана ниже. Для вершин нежирные числа представляют индексы, а жирные — значения удовольствия. Для ребер нежирные цифры обозначают пропускную способность, а жирные — стоимость проезда. Для первого запроса туристическая группа размером \(1\), стартующая из города \(3\), может достичь городов \(1\), \(2\), \(3\), \(4\) и \(5\). Таким образом, наибольшее значение удовольствия, которого они могут достичь, равно \(3\). Если туристическая группа решит поехать в город \(4\), Омкар должен будет заплатить \(8\) за машину, что является максимумом. Для второго запроса туристическая группа размером \(9\), стартующая из города \(5\), может достичь только города \(5\). Таким образом, наибольшее достижимое значение удовольствия по-прежнему составляет \(3\), и Омкар заплатит \(0\) за автомобиль. Для третьего запроса туристическая группа размером \(6\), стартующая из города \(2\), может достичь городов \(2\) и \(4\). Наибольшее достижимое значение удовольствия снова равно \(3\). Если туристическая группа решит поехать в город \(4\), Омкар должен будет заплатить \(2\) за машину, что является максимумом. Карта второй выборки показана ниже: Для первого запроса, туристическая группа размером \(5\), стартующая из города \(1\), может достичь только города \(1\). Таким образом, их максимальная ценность удовольствия составляет \(1\), а стоимость, которую придется заплатить Омкару, равна \(0\) за автомобиль. Для второго запроса туристическая группа размером \(4\), стартующая из города \(1\), может добраться до городов \(1\) и \(2\). Таким образом, их максимальная ценность удовольствия составляет \(2\), а Омкар заплатит \(1\) за автомобиль. Для третьего запроса, туристическая группа размером \(3\), стартующая из города \(1\), может добраться до городов \(1\), \(2\) и \(3\). Таким образом, их максимальная ценность удовольствия составляет \(3\), и Омкар заплатит \(1\) за автомобиль. Для четвертого запроса туристическая группа размером \(2\), стартующая из города \(1\), может добраться до городов \(1\), \(2\), \(3\) и \(4\). Таким образом, их максимальная ценность удовольствия составляет \(4\), и Омкар заплатит \(1\) за автомобиль. Для пятого запроса туристическая группа размером \(1\), стартующая из города \(1\), может добраться до городов \(1\), \(2\), \(3\), \(4\) и \(5\). Таким образом, их максимальное удовольствие составляет \(5\), и Омкар заплатит \(1\) за машину.
| |
|
|
C. Оптимальная вставка
дп
жадные алгоритмы
разделяй и властвуй
сортировки
Структуры данных
*2300
У вас есть два массива \(a_1, a_2, \ldots, a_n\) и \(b_1, b_2, \ldots, b_m\), состоящие из целых чисел. Вы должны вставить все элементы массива \(b\) в массив \(a\) в произвольные места. В результате получится массив \(c_1, c_2, \ldots, c_{n+m}\) размера \(n + m\). Обратите внимание, что элементы массива \(a\) переставлять нельзя, но элементы массива \(b\) можно вставлять куда угодно (в начало, между двумя соседними элементами массива \(a\), в конец). Более того, элементы массива \(b\) могут стоять в получившемся массиве в любом порядке. Какое минимальное количество инверсий в массиве \(c\) может быть? Напомним, что инверсией называется пара индексов \((i, j)\), такая что \(i < j\) и \(c_i > c_j\). Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество инверсий, которое может получиться в массиве \(c\) при вставке. Примечание Варианты оптимальных вставок для всех наборов входных данных (элементы массива \(a\) подчеркнуты): - В первом наборе входных данных можно сделать \(c = [\underline{1}, 1, \underline{2}, 2, \underline{3}, 3, 4]\).
- Во втором наборе входных данных можно сделать \(c = [1, 2, \underline{3}, \underline{2}, \underline{1}, 3]\).
- В третьем наборе входных данных можно сделать \(c = [\underline{1}, 1, 3, \underline{3}, \underline{5}, \underline{3}, \underline{1}, 4, 6]\).
| |
|
|
D. Художественное разбиние
дп
разделяй и властвуй
теория чисел
*3000
Для двух положительных целых чисел \(l\) и \(r\) (\(l \le r\)) обозначим за \(c(l, r)\) количество пар целых чисел \((i, j)\) таких, что \(l \le i \le j \le r\) и \(\operatorname{gcd}(i, j) \ge l\). Здесь \(\operatorname{gcd}(i, j)\) обозначает наибольший общий делитель (НОД) чисел \(i\) и \(j\). У вас есть два целых числа \(n\) и \(k\), где \(1 \le k \le n\). Пусть \(f(n, k)\) обозначает минимум \(\sum\limits_{i=1}^{k}{c(x_i+1,x_{i+1})}\) по всем последовательностям из целых чисел \(0=x_1 \lt x_2 \lt \ldots \lt x_{k} \lt x_{k+1}=n\). Помогите YouKn0wWho найти \(f(n, k)\). Выходные данные Для каждого набора входных данных выведите одно целое число — \(f(n, k)\). Примечание В первом наборе входных данных YouKn0wWho может выбрать последовательность \([0, 2, 6]\). Тогда \(f(6, 2) = c(1, 2) + c(3, 6) = 3 + 5 = 8\), что является минимально возможным.
| |
|
|
F. Интересные отрезки
meet-in-the-middle
разделяй и властвуй
Структуры данных
*2800
У Василия есть массив неотрицательных чисел \(a_1, a_2, \dots, a_n\). Он хочет, чтобы вы помогли ему узнать количество отрезков \(l \le r\), которые проходят проверку. Проверка отрезка выполняется следующим образом: - Находится минимум и максимум среди чисел на отрезке массива от \(l\) до \(r\).
- Проверка считается пройденной, если в битовой записи минимума и максимума одинаковое количество единичных бит.
Выходные данные Выведите одно число — количество отрезков, прошедших проверку.
| |
|
|
C. Абракадабра
разделяй и властвуй
*2400
Поликарп исследует строку, которую он называет абракадабра. Эта строка строится по следующему алгоритму: - На первом шаге строка состоит из одного символа «a».
- На k-oм шаге Поликарп соединяет две копии строки, полученной на k - 1 шаге, а между ними вставляет k-й символ алфавита. Поликарп использует алфавит, состоящий из строчных латинских букв и цифр (всего 36 символов). Символы алфавита нумеруются следующим образом: 1-й символ — «a», 2-й — «b», ..., 26-й — «z», 27-й — «0», 28-й — «1», ..., 36-й — «9».
Рассмотрим алгоритм подробнее. На втором шаге Поликарп соединит две строки «a», вставив посередине символ «b», и получит строку «aba». На третьем шаге получится строка «abacaba», а на четвертом — «abacabadabacaba». Таким образом, строка, полученная на k-ом шаге, будет состоять из 2k - 1 символов. Поликарп записал строку, полученную после 30 шагов данного алгоритма, и выбрал из нее две непустые подстроки. Ваша задача состоит в том, чтобы найти длину наибольшей общей подстроки двух подстрок, выбранных Поликарпом. Подстрокой s[i... j] (1 ≤ i ≤ j ≤ |s|) строки s = s1s2... s|s| называется строка, равная sisi + 1... sj. Например, подстрока s[2...4] строки s = «abacaba» равна «bac». Сама строка является своей подстрокой. Наибольшей общей подстрокой двух строк s и t называется самая длинная строка, которая является подстрокой как s, так и t. Например, наибольшей общей подстрокой «contest» и «systemtesting» является строка «test». Общих подстрок наибольшей длины может существовать несколько. Выходные данные Выведите единственное число — длину наибольшей общей подстроки заданных подстрок. Если общих подстрок нет, выведите 0. Примечание В первом тесте первая подстрока равна «acab», вторая — «abac». У этих двух подстрок есть две наибольшие общие подстроки «ac» и «ab», нас же интересует только их длина — 2. Во втором тесте первая подстрока равна «a», вторая — «c». У этих двух подстрок нет ни одного общего символа, поэтому длина наибольшей общей подстроки — 0.
| |
|
|
F. Раскраска дерева
бпф
Комбинаторика
разделяй и властвуй
*2600
Дано корневое дерево из \(n\) вершин, пронумерованных от \(1\) до \(n\). Корень дерева — вершина под номером \(1\). Необходимо раскрасить все вершины дерева в \(n\) цветов (также пронумерованных от \(1\) до \(n\)) так, чтобы в каждый цвет была покрашена ровно одна вершина. Пусть \(c_i\) — цвет вершины \(i\), а \(p_i\) — родитель вершины \(i\) в корневом дереве. Раскраска называется красивой, если не существует такого \(k\) (\(k > 1\)), что \(c_k = c_{p_k} - 1\), то есть не существует вершины, цвет которой меньше цвета ее родителя ровно на \(1\). Посчитайте количество красивых раскрасок и выведите его по модулю \(998244353\). Выходные данные Выведите одно целое число — количество красивых раскрасок, взятое по модулю \(998244353\).
| |
|
|
H. Оленьи игры
Бинарный поиск
графы
Конструктив
кратчайшие пути
Потоки
разделяй и властвуй
Структуры данных
*3000
На северном полюсе проживают \(n\) оленей, и все они соревнуются за первые позиции в таблице лидеров на главной странице CodeNorses (популярный сайт по спортивным оленьим играм). Довольно примечательно, что лидерство в таблице зависит от вклада и напрямую не связано с уровнем навыков в самих оленьих играх, однако для оленей таблица все равно крайне важна. На текущий момент, у \(i\)-го оленя вклад равен \(a_i\). Вы хотите повлиять на таблицу лидеров с помощью нескольких операций. За одну операцию вы можете выбрать оленя и либо увеличить, либо уменьшить его вклад на \(1\). Отрицательные вклады разрешены. При этом у вас есть \(m\) ограничений на получившиеся вклады. Каждое ограничение задается упорядоченной парой \((u, v)\), означающей, что в финальный вклад оленя \(u\) должен быть меньше или равен финального вклада оленя \(v\). Ваша задача — сделать наименьшее количество операций так, чтобы все ограничения были выполнены. Выходные данные Выведите \(n\) целых чисел \(b_1,\ldots, b_n\) (\(-10^{15}\le b_i\le 10^{15}\)), где \(b_i\) будет равно финальному вкладу \(i\)-го оленя после применения всех операций. Если существует несколько решений с наименьшим количеством операций, выведите любое из них. Можно доказать, что всегда существует оптимальное решение с \(|b_i|\le 10^{15}\) для всех \(i\).
| |
|
|
H. Следи за малостью XOR
битмаски
дп
Комбинаторика
математика
разделяй и властвуй
Структуры данных
*3000
Вам дан массив целых чисел \(a_1, a_2, \ldots, a_n\) и целое число \(x\). Найдите количество непустых подмножеств индексов этого массива \(1 \leq b_1 < b_2 < \ldots < b_k \leq n\) таких, что для всех пар \((i, j)\), где \(1 \leq i < j \leq k\), выполняется неравенство \(a_{b_i} \oplus a_{b_j} \leq x\). Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Так как ответ может быть большим, выведите его по модулю \(998\,244\,353\). Выходные данные Выведите одно целое число: количество непустых подмножеств таких, что побитовое исключающее ИЛИ любых двух элементов не больше \(x\), по модулю \(998\,244\,353\).
| |
|
|
H. Перестановка и запросы
Перебор
разделяй и властвуй
Структуры данных
*2400
Дана перестановка \(p\) из \(n\) элементов. Перестановка из \(n\) элементов — это массив длины \(n\), в котором каждое целое число от \(1\) до \(n\) встречается ровно по одному разу. Например, \([1, 2, 3]\) и \([4, 3, 5, 1, 2]\) — это перестановки, но \([1, 2, 4]\) и \([4, 3, 2, 1, 2]\) — это не перестановки. Вам нужно выполнить \(q\) запросов. Есть два типа запросов: - \(1\) \(x\) \(y\) — поменять местами \(p_x\) и \(p_y\).
- \(2\) \(i\) \(k\) — вывести число, которым станет \(i\), если присвоить \(i = p_i\) \(k\) раз.
Выходные данные Для каждого запроса второго типа выведите одно целое число в новой строке — ответ на этот запрос. Примечание В первом примере \(p = \{5, 3, 4, 2, 1\}\). Первый запрос — вывести \(p_3\). Ответ — \(4\). Второй запрос — вывести \(p_{p_1}\). Ответ — \(1\). Третий запрос — поменять местами \(p_1\) и \(p_3\). Теперь \(p = \{4, 3, 5, 2, 1\}\). Четвёртый запрос — вывести \(p_{p_1}\). Ответ — \(2\).
| |
|
|
E1. Обновление котов (простая версия)
графы
Деревья
дп
Перебор
поиск в глубину и подобное
разделяй и властвуй
Структуры данных
*2500
Это простая версия задачи. Единственным различием между простой и сложной версиями задачи является наличие запросов удаления: они присутствуют лишь в сложной версии. Компания «Interplanetary Software, Inc.» вместе с компанией «Robots of Cydonia, Ltd.» разработала и выпустила роботов-котов. Эти электронные питомцы умеют мяукать, ловить мышей и всячески развлекать хозяина. Недавно разработчики из «Interplanetary Software, Inc.» решили выпустить обновление программного обеспечения для этих роботов. После обновления коты должны уметь решать задачи, связанные со скобочными последовательностями. Одна из таких задач приведена ниже. Сначала немного погрузимся в теорию скобочных последовательностей. Будем рассматривать строки, состоящие из символов «(», «)» и «.». Назовем строку правильной скобочной последовательностью (ПСП), если из нее можно получить пустую строку путем операций удаления одиночных символов «.» либо подряд идущих символов «()». Например, строка «(()(.))» является ПСП, т. к. с ней можно проделать следующую цепочку удалений: «(()(.))» \(\rightarrow\) «(()())» \(\rightarrow\) «(())» \(\rightarrow\) «()» \(\rightarrow\) «». Мы получили пустую строку, а это значит, что исходная строка является ПСП. В то же время, строка «)(» не является ПСП, поскольку к ней нельзя применить описанные выше операции удаления. Будем называть ПСП простой, если эта ПСП непуста, не начинается на «.» и не заканчивается на «.». Также будем считать, что подстрока строки \(s\) — это ее последовательный подотрезок. В частности, \(s[l\dots r] = s_ls_{l+1}\dots s_r\), где \(s_i\) — \(i\)-й символ строки \(s\). Теперь перейдем к формулировке задачи. Вам дана строка \(s\), изначально состоящая из символов «(» и «)». Необходимо отвечать на запросы следующего вида. Даны индексы \(l\) и \(r\) (\(1 \le l < r \le n\)), причем гарантируется, что подстрока \(s[l\dots r]\) — простая ПСП. Требуется найти количество подстрок в \(s[l\dots r]\), которые являются простыми ПСП. Иными словами, необходимо найти количество пар индексов \(i\), \(j\) таких, что \(l \le i < j \le r\) и \(s[i\dots j]\) является простой ПСП. Вы работаете в «Interplanetary Software, Inc.» и Вам поручили непростое задание: научить котов после обновления решать описанную выше задачу. Обратите внимание, что в данной версии задачи в строке не может появиться символ «.». Он нужен лишь для сложной версии задачи. Выходные данные Для каждого запроса выведите по одному целому числу в отдельной строке — количество подстрок, которые являются простыми ПСП. Ответы требуется выводить в том же, порядке, в котором приведены сами запросы. Примечание Рассмотрим пример из условия. Ответ на первый запрос равен \(3\), поскольку существует всего три требуемых подстроки: \(s[3\dots6]\), \(s[3\dots4]\) и \(s[5\dots6]\). Ответ на второй запрос равен \(4\). Подходящие подстроки — \(s[3\dots6]\), \(s[3\dots4]\), \(s[5\dots6]\) и \(s[2\dots7]\). Ответ на третий запрос равен \(1\). Подходящая подстрока — \(s[8\dots9]\). Ответ на четвертый запрос равен \(6\). Подходящие подстроки — \(s[3\dots6]\), \(s[3\dots4]\), \(s[5\dots6]\), \(s[2\dots7]\), \(s[8\dots9]\) и \(s[2\dots9]\).
| |
|
|
F. Совершенное паросочетание
Деревья
интерактив
разделяй и властвуй
Структуры данных
*2800
Вам задано дерево, состоящее из \(n\) вершин (пронумерованных от \(1\) до \(n\)) и \(n-1\) ребер (пронумерованных от \(1\) до \(n-1\)). Изначально все вершины, кроме вершины \(1\), неактивны. Вам предстоит обрабатывать запросы трех типов: - \(1\) \(v\) — активировать вершину \(v\). Гарантируется, что вершина \(v\) неактивна перед этим запросом, а один из ее соседей активен. После активации вершины выберите подмножество ребер дерева таким образом, чтобы каждая активная вершина была инцидентна ровно одному выбранному ребру, и каждая неактивная вершина не была инцидентна ни одному из выбранных ребер — другими словами, это подмножество должно является совершенным паросочетанием активной части дерева. Если такое подмножество ребер существует, выведите сумму индексов ребер в нем; в противном случае выведите \(0\).
- \(2\) — запросы этого типа будут задаваться только сразу после запроса типа \(1\), и таких запросов будет не более \(10\). Если ваш ответ на предыдущий запрос был \(0\), просто выведите \(0\); в противном случае выведите подмножество ребер для предыдущего запроса в следующем формате: сначала выведите количество ребер в подмножестве, затем выведите индексы выбранных ребер в порядке возрастания. Сумма индексов должна быть равна вашему ответу на предыдущий запрос.
- \(3\) — завершить программу.
Обратите внимание, что вы должны решить эту задачу в режиме online. Это означает, что вы не можете считать все входные данные сразу. Вы можете считать каждый запрос только после вывода ответа на предыдущий запрос. Используйте функции fflush в C++ и BufferedWriter.flush в Java после каждого вывода в вашей программе. Выходные данные Для каждого запроса типа \(1\) или \(2\) выведите ответ в отдельной строке в формате, описанном в условии. Не забывайте сбрасывать буфер вывода.
| |
|
|
E. Особые позиции
бпф
Комбинаторика
математика
разделяй и властвуй
*3300
Будучи школьником Стас очень грустил, когда рассадка в школьном автобусе не позволяла ему сесть рядом с другом, поэтому сейчас он вырос и начал писать программу, решающую эту проблему, и ему потребовалось решить такую задачу. Дан массив \(a\) длины \(n\). Также даны \(m\) различных позиций \(p_1, p_2, \ldots, p_m\) (\(1 \leq p_i \leq n\)). Затем равновероятно выбирается непустое подмножество этих позиций \(T\) и вычисляется \(\)\sum_{i=1}^{n} (a_i \cdot \min_{j \in T} \left|i - j\right|).\(\) Иными словами, для каждого индекса массива перемножаются \(a_i\) и расстояние до ближайшей выбранной в подмножество позиции, и эти величины суммируются. Найдите математическое ожидание этой величины. Это число нужно найти по модулю \(998\,244\,353\). Формально, пусть \(M = 998\,244\,353\). Можно показать, что ответ может быть представлен в виде несократимой дроби \(\frac{p}{q}\), где \(p\) и \(q\) целые числа и \(q \neq 0\) (mod \(M\)). Выведите целое число, равное \(p \cdot q^{-1}\) (mod \(M\)). Другими словами, выведите такое целое число \(x\), что \(0 \leq x < M\) и \(x \cdot q = p\) (mod \(M\)). Выходные данные Выведите единственное целое число — ответ на задачу. Примечание В первом примере: - Если взята только позиция \(1\), то итоговая величина равна \(1 \cdot 0 + 2 \cdot 1 + 3 \cdot 2 + 4 \cdot 3 = 20\).
- Если взята только позиция \(4\), то итоговая величина равна \(1 \cdot 3 + 2 \cdot 2 + 3 \cdot 1 + 4 \cdot 0 = 10\).
- Если взяты обе позиции, то итоговая величина равна \(1 \cdot 0 + 2 \cdot 1 + 3 \cdot 1 + 4 \cdot 0 = 5\).
Ответ на задачу \(\frac{20 + 10 + 5}{3} = \frac{35}{3} = 665\,496\,247\) (по модулю \(998\,244\,353\)).
| |
|
|
D. Бизнес-шоу
дп
кратчайшие пути
разделяй и властвуй
реализация
Структуры данных
*2800
Дима находится на шоу от бизнесмена Петра. В этом шоу Диме предстоит пройтись по дорожке, которая является прямоугольником \(3 \times n\), где строки пронумерованы от \(1\) до \(3\) сверху вниз, а столбцы от \(1\) до \(n\) слева направо. На клетке на пересечении строки \(i\) и столбца \(j\) написано число \(a_{i,j}\). Изначально у Димы есть баланс, равный нулю, и когда Дима наступает на клетку в \(i\)-й строке и \(j\)-м столбце, его баланс меняется на \(a_{i,j}\) рублей. Баланс может становиться отрицательным. Дима может заходить на любые клетки первой и третьей строки, но изначально клетки второй строки для него недоступны. Однако есть \(q\) предложений от бизнесмена Петра, которые могут сделать их доступными: \(i\)-е предложение позволяет разблокировать все клетки второй строки на отрезке с \(l_i\) по \(r_i\), заплатив за это \(k_i\) рублей. Дима может воспользоваться любым количеством таких предложений, а также разблокировать одну и ту же клетку несколько раз. Дима изначально стоит на клетке в клетке \((1, 1)\) и хочет попасть в клетку \((3, n)\). За один ход Дима может подвинуться на 1 вправо или вниз, то есть увеличить на 1 номер строки или столбца. Таким образом, всего в процессе пути Дима сделает \(n + 1\) ход, из которых ровно \(n - 1\) будет по горизонтали и \(2\) по вертикали. Выигрыш Димы будет равен финальному балансу после совершения всех ходов, то есть сумме чисел на всех посещённых клетках за вычетом стоимости всех использованных предложений. Ваша задача — определить максимальный возможный выигрыш Димы. Выходные данные Выведите одно число — максимальный возможный выигрыш Димы. Примечание В первом примере оптимально воспользоваться вторым предложением Петра за \(4\) рубля и пройти по клеткам \((1, 1)\), \((1, 2)\), \((1, 3)\), \((2, 3)\), \((3, 3)\), \((3, 4)\), заработав \(1 + 0 + 2 + 9 + 4 + 1 - 4 = 13\) рублей. Во втором примере оптимально воспользоваться вторым и третьим предложением Петра за \(2\) и \(3\) рубля соответственно, и пройти по клеткам \((1, 1)\), \((2, 1)\), \((2, 2)\), \((2, 3)\), \((2, 4)\), \((3, 4)\), \((3, 5)\), заработав \(-20 + 1 + 3 + 3 + 6 + 6 + 2 - 2 - 3= -4\) рубля.
| |
|
|
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\).
| |
|
|
H. Три минимума
бпф
дп
Комбинаторика
Конструктив
математика
разделяй и властвуй
*3500
Для набора различных чисел мы называем первым минимумом, вторым минимумом и третьим минимумом три наименьших значения (в возрастающем порядке). Перестановка \(p_1, p_2, \dots, p_n\) называется хорошей, если для всех пар \((l,r)\), удовлетворяющих \(1\le l < l+2 \le r\le n\), выполняется следующее условие. - Если \(\{p_l, p_r\}\) являются (не обязательно в таком порядке) первым и вторым минимумами среди \(p_l, p_{l+1}, \dots, p_r\), то третий минимум среди \(p_l, p_{l+1},\dots, p_r\) это либо \(p_{l+1}\), либо \(p_{r-1}\).
Вам дано целое число \(n\) и строка \(s\) длины \(m\), состоящая из символов «<» и «>». Вычислите количество хороших перестановок \(p_1, p_2,\dots, p_n\) таких, что для всех \(1\le i\le m\), - \(p_i < p_{i+1}\), если \(s_i =\) «<»;
- \(p_i > p_{i+1}\), если \(s_i =\) «>».
Так как ответ может быть большим, выведите его по модулю \(998\,244\,353\). Выходные данные Выведите одно целое число: количество хороших перестановок, удовлетворяющих ограничениям из условия, по модулю \(998\,244\,353\). Примечание В первом примере существуют \(5\) хороших перестановок, удовлетворяющих условиям, задаваемым строкой \(s\): \([4, 3, 2, 1, 5]\), \([5, 3, 2, 1, 4]\), \([5, 4, 2, 1, 3]\), \([5, 4, 3, 1, 2]\), \([5, 4, 3, 2, 1]\). Каждая из них - хорошая;
- удовлетворяет \(p_1 > p_2\);
- удовлетворяет \(p_2 > p_3\);
- удовлетворяет \(p_3 > p_4\).
Во втором примере существуют \(60\) перестановок таких, что \(p_1 < p_2\). Только \(56\) из них хорошие: перестановки \([1, 4, 3, 5, 2]\), \([1, 5, 3, 4, 2]\), \([2, 4, 3, 5, 1]\), \([2, 5, 3, 4, 1]\) не являются хорошими, потому что необходимое условие не выполнено для \((l, r)\) = \((1, 5)\). Например, для перестановки \([2, 4, 3, 5, 1]\), - первый и второй минимумы — это \(p_5\) и \(p_1\) соответственно (то есть \(\{p_l, p_r\}\) с точностью до порядка);
- третий минимум \(p_3\) (то есть ни \(p_{l+1}\), ни \(p_{r-1}\)).
В третьем примере есть \(23\) хорошие перестановки, удовлетворяющие ограничениям строки \(s\): \([1, 2, 4, 3, 6, 5]\), \([1, 2, 5, 3, 6, 4]\), \([1, 2, 6, 3, 5, 4]\), \([1, 3, 4, 2, 6, 5]\), \([1, 3, 5, 2, 6, 4]\), \([1, 3, 6, 2, 5, 4]\), \([1, 4, 5, 2, 6, 3]\), \([1, 4, 6, 2, 5, 3]\), \([1, 5, 6, 2, 4, 3]\), \([2, 3, 4, 1, 6, 5]\), \([2, 3, 5, 1, 6, 4]\), \([2, 3, 6, 1, 5, 4]\), \([2, 4, 5, 1, 6, 3]\), \([2, 4, 6, 1, 5, 3]\), \([2, 5, 6, 1, 4, 3]\), \([3, 4, 5, 1, 6, 2]\), \([3, 4, 5, 2, 6, 1]\), \([3, 4, 6, 1, 5, 2]\), \([3, 4, 6, 2, 5, 1]\), \([3, 5, 6, 1, 4, 2]\), \([3, 5, 6, 2, 4, 1]\), \([4, 5, 6, 1, 3, 2]\), \([4, 5, 6, 2, 3, 1]\).
| |
|
|
H. Три минимума
бпф
дп
Комбинаторика
Конструктив
математика
разделяй и властвуй
*3500
Для набора различных чисел мы называем первым минимумом, вторым минимумом и третьим минимумом три наименьших значения (в возрастающем порядке). Перестановка \(p_1, p_2, \dots, p_n\) называется хорошей, если для всех пар \((l,r)\), удовлетворяющих \(1\le l < l+2 \le r\le n\), выполняется следующее условие. - Если \(\{p_l, p_r\}\) являются (не обязательно в таком порядке) первым и вторым минимумами среди \(p_l, p_{l+1}, \dots, p_r\), то третий минимум среди \(p_l, p_{l+1},\dots, p_r\) это либо \(p_{l+1}\), либо \(p_{r-1}\).
Вам дано целое число \(n\) и строка \(s\) длины \(m\), состоящая из символов «<» и «>». Вычислите количество хороших перестановок \(p_1, p_2,\dots, p_n\) таких, что для всех \(1\le i\le m\), - \(p_i < p_{i+1}\), если \(s_i =\) «<»;
- \(p_i > p_{i+1}\), если \(s_i =\) «>».
Так как ответ может быть большим, выведите его по модулю \(998\,244\,353\). Выходные данные Выведите одно целое число: количество хороших перестановок, удовлетворяющих ограничениям из условия, по модулю \(998\,244\,353\). Примечание В первом примере существуют \(5\) хороших перестановок, удовлетворяющих условиям, задаваемым строкой \(s\): \([4, 3, 2, 1, 5]\), \([5, 3, 2, 1, 4]\), \([5, 4, 2, 1, 3]\), \([5, 4, 3, 1, 2]\), \([5, 4, 3, 2, 1]\). Каждая из них - хорошая;
- удовлетворяет \(p_1 > p_2\);
- удовлетворяет \(p_2 > p_3\);
- удовлетворяет \(p_3 > p_4\).
Во втором примере существуют \(60\) перестановок таких, что \(p_1 < p_2\). Только \(56\) из них хорошие: перестановки \([1, 4, 3, 5, 2]\), \([1, 5, 3, 4, 2]\), \([2, 4, 3, 5, 1]\), \([2, 5, 3, 4, 1]\) не являются хорошими, потому что необходимое условие не выполнено для \((l, r)\) = \((1, 5)\). Например, для перестановки \([2, 4, 3, 5, 1]\), - первый и второй минимумы — это \(p_5\) и \(p_1\) соответственно (то есть \(\{p_l, p_r\}\) с точностью до порядка);
- третий минимум \(p_3\) (то есть ни \(p_{l+1}\), ни \(p_{r-1}\)).
В третьем примере есть \(23\) хорошие перестановки, удовлетворяющие ограничениям строки \(s\): \([1, 2, 4, 3, 6, 5]\), \([1, 2, 5, 3, 6, 4]\), \([1, 2, 6, 3, 5, 4]\), \([1, 3, 4, 2, 6, 5]\), \([1, 3, 5, 2, 6, 4]\), \([1, 3, 6, 2, 5, 4]\), \([1, 4, 5, 2, 6, 3]\), \([1, 4, 6, 2, 5, 3]\), \([1, 5, 6, 2, 4, 3]\), \([2, 3, 4, 1, 6, 5]\), \([2, 3, 5, 1, 6, 4]\), \([2, 3, 6, 1, 5, 4]\), \([2, 4, 5, 1, 6, 3]\), \([2, 4, 6, 1, 5, 3]\), \([2, 5, 6, 1, 4, 3]\), \([3, 4, 5, 1, 6, 2]\), \([3, 4, 5, 2, 6, 1]\), \([3, 4, 6, 1, 5, 2]\), \([3, 4, 6, 2, 5, 1]\), \([3, 5, 6, 1, 4, 2]\), \([3, 5, 6, 2, 4, 1]\), \([4, 5, 6, 1, 3, 2]\), \([4, 5, 6, 2, 3, 1]\).
| |
|
|
H. Три минимума
бпф
дп
Комбинаторика
Конструктив
математика
разделяй и властвуй
*3500
Для набора различных чисел мы называем первым минимумом, вторым минимумом и третьим минимумом три наименьших значения (в возрастающем порядке). Перестановка \(p_1, p_2, \dots, p_n\) называется хорошей, если для всех пар \((l,r)\), удовлетворяющих \(1\le l < l+2 \le r\le n\), выполняется следующее условие. - Если \(\{p_l, p_r\}\) являются (не обязательно в таком порядке) первым и вторым минимумами среди \(p_l, p_{l+1}, \dots, p_r\), то третий минимум среди \(p_l, p_{l+1},\dots, p_r\) это либо \(p_{l+1}\), либо \(p_{r-1}\).
Вам дано целое число \(n\) и строка \(s\) длины \(m\), состоящая из символов «<» и «>». Вычислите количество хороших перестановок \(p_1, p_2,\dots, p_n\) таких, что для всех \(1\le i\le m\), - \(p_i < p_{i+1}\), если \(s_i =\) «<»;
- \(p_i > p_{i+1}\), если \(s_i =\) «>».
Так как ответ может быть большим, выведите его по модулю \(998\,244\,353\). Выходные данные Выведите одно целое число: количество хороших перестановок, удовлетворяющих ограничениям из условия, по модулю \(998\,244\,353\). Примечание В первом примере существуют \(5\) хороших перестановок, удовлетворяющих условиям, задаваемым строкой \(s\): \([4, 3, 2, 1, 5]\), \([5, 3, 2, 1, 4]\), \([5, 4, 2, 1, 3]\), \([5, 4, 3, 1, 2]\), \([5, 4, 3, 2, 1]\). Каждая из них - хорошая;
- удовлетворяет \(p_1 > p_2\);
- удовлетворяет \(p_2 > p_3\);
- удовлетворяет \(p_3 > p_4\).
Во втором примере существуют \(60\) перестановок таких, что \(p_1 < p_2\). Только \(56\) из них хорошие: перестановки \([1, 4, 3, 5, 2]\), \([1, 5, 3, 4, 2]\), \([2, 4, 3, 5, 1]\), \([2, 5, 3, 4, 1]\) не являются хорошими, потому что необходимое условие не выполнено для \((l, r)\) = \((1, 5)\). Например, для перестановки \([2, 4, 3, 5, 1]\), - первый и второй минимумы — это \(p_5\) и \(p_1\) соответственно (то есть \(\{p_l, p_r\}\) с точностью до порядка);
- третий минимум \(p_3\) (то есть ни \(p_{l+1}\), ни \(p_{r-1}\)).
В третьем примере есть \(23\) хорошие перестановки, удовлетворяющие ограничениям строки \(s\): \([1, 2, 4, 3, 6, 5]\), \([1, 2, 5, 3, 6, 4]\), \([1, 2, 6, 3, 5, 4]\), \([1, 3, 4, 2, 6, 5]\), \([1, 3, 5, 2, 6, 4]\), \([1, 3, 6, 2, 5, 4]\), \([1, 4, 5, 2, 6, 3]\), \([1, 4, 6, 2, 5, 3]\), \([1, 5, 6, 2, 4, 3]\), \([2, 3, 4, 1, 6, 5]\), \([2, 3, 5, 1, 6, 4]\), \([2, 3, 6, 1, 5, 4]\), \([2, 4, 5, 1, 6, 3]\), \([2, 4, 6, 1, 5, 3]\), \([2, 5, 6, 1, 4, 3]\), \([3, 4, 5, 1, 6, 2]\), \([3, 4, 5, 2, 6, 1]\), \([3, 4, 6, 1, 5, 2]\), \([3, 4, 6, 2, 5, 1]\), \([3, 5, 6, 1, 4, 2]\), \([3, 5, 6, 2, 4, 1]\), \([4, 5, 6, 1, 3, 2]\), \([4, 5, 6, 2, 3, 1]\).
| |
|
|
H. Три минимума
бпф
дп
Комбинаторика
Конструктив
математика
разделяй и властвуй
*3500
Для набора различных чисел мы называем первым минимумом, вторым минимумом и третьим минимумом три наименьших значения (в возрастающем порядке). Перестановка \(p_1, p_2, \dots, p_n\) называется хорошей, если для всех пар \((l,r)\), удовлетворяющих \(1\le l < l+2 \le r\le n\), выполняется следующее условие. - Если \(\{p_l, p_r\}\) являются (не обязательно в таком порядке) первым и вторым минимумами среди \(p_l, p_{l+1}, \dots, p_r\), то третий минимум среди \(p_l, p_{l+1},\dots, p_r\) это либо \(p_{l+1}\), либо \(p_{r-1}\).
Вам дано целое число \(n\) и строка \(s\) длины \(m\), состоящая из символов «<» и «>». Вычислите количество хороших перестановок \(p_1, p_2,\dots, p_n\) таких, что для всех \(1\le i\le m\), - \(p_i < p_{i+1}\), если \(s_i =\) «<»;
- \(p_i > p_{i+1}\), если \(s_i =\) «>».
Так как ответ может быть большим, выведите его по модулю \(998\,244\,353\). Выходные данные Выведите одно целое число: количество хороших перестановок, удовлетворяющих ограничениям из условия, по модулю \(998\,244\,353\). Примечание В первом примере существуют \(5\) хороших перестановок, удовлетворяющих условиям, задаваемым строкой \(s\): \([4, 3, 2, 1, 5]\), \([5, 3, 2, 1, 4]\), \([5, 4, 2, 1, 3]\), \([5, 4, 3, 1, 2]\), \([5, 4, 3, 2, 1]\). Каждая из них - хорошая;
- удовлетворяет \(p_1 > p_2\);
- удовлетворяет \(p_2 > p_3\);
- удовлетворяет \(p_3 > p_4\).
Во втором примере существуют \(60\) перестановок таких, что \(p_1 < p_2\). Только \(56\) из них хорошие: перестановки \([1, 4, 3, 5, 2]\), \([1, 5, 3, 4, 2]\), \([2, 4, 3, 5, 1]\), \([2, 5, 3, 4, 1]\) не являются хорошими, потому что необходимое условие не выполнено для \((l, r)\) = \((1, 5)\). Например, для перестановки \([2, 4, 3, 5, 1]\), - первый и второй минимумы — это \(p_5\) и \(p_1\) соответственно (то есть \(\{p_l, p_r\}\) с точностью до порядка);
- третий минимум \(p_3\) (то есть ни \(p_{l+1}\), ни \(p_{r-1}\)).
В третьем примере есть \(23\) хорошие перестановки, удовлетворяющие ограничениям строки \(s\): \([1, 2, 4, 3, 6, 5]\), \([1, 2, 5, 3, 6, 4]\), \([1, 2, 6, 3, 5, 4]\), \([1, 3, 4, 2, 6, 5]\), \([1, 3, 5, 2, 6, 4]\), \([1, 3, 6, 2, 5, 4]\), \([1, 4, 5, 2, 6, 3]\), \([1, 4, 6, 2, 5, 3]\), \([1, 5, 6, 2, 4, 3]\), \([2, 3, 4, 1, 6, 5]\), \([2, 3, 5, 1, 6, 4]\), \([2, 3, 6, 1, 5, 4]\), \([2, 4, 5, 1, 6, 3]\), \([2, 4, 6, 1, 5, 3]\), \([2, 5, 6, 1, 4, 3]\), \([3, 4, 5, 1, 6, 2]\), \([3, 4, 5, 2, 6, 1]\), \([3, 4, 6, 1, 5, 2]\), \([3, 4, 6, 2, 5, 1]\), \([3, 5, 6, 1, 4, 2]\), \([3, 5, 6, 2, 4, 1]\), \([4, 5, 6, 1, 3, 2]\), \([4, 5, 6, 2, 3, 1]\).
| |
|
|
H. Три минимума
бпф
дп
Комбинаторика
Конструктив
математика
разделяй и властвуй
*3500
Для набора различных чисел мы называем первым минимумом, вторым минимумом и третьим минимумом три наименьших значения (в возрастающем порядке). Перестановка \(p_1, p_2, \dots, p_n\) называется хорошей, если для всех пар \((l,r)\), удовлетворяющих \(1\le l < l+2 \le r\le n\), выполняется следующее условие. - Если \(\{p_l, p_r\}\) являются (не обязательно в таком порядке) первым и вторым минимумами среди \(p_l, p_{l+1}, \dots, p_r\), то третий минимум среди \(p_l, p_{l+1},\dots, p_r\) это либо \(p_{l+1}\), либо \(p_{r-1}\).
Вам дано целое число \(n\) и строка \(s\) длины \(m\), состоящая из символов «<» и «>». Вычислите количество хороших перестановок \(p_1, p_2,\dots, p_n\) таких, что для всех \(1\le i\le m\), - \(p_i < p_{i+1}\), если \(s_i =\) «<»;
- \(p_i > p_{i+1}\), если \(s_i =\) «>».
Так как ответ может быть большим, выведите его по модулю \(998\,244\,353\). Выходные данные Выведите одно целое число: количество хороших перестановок, удовлетворяющих ограничениям из условия, по модулю \(998\,244\,353\). Примечание В первом примере существуют \(5\) хороших перестановок, удовлетворяющих условиям, задаваемым строкой \(s\): \([4, 3, 2, 1, 5]\), \([5, 3, 2, 1, 4]\), \([5, 4, 2, 1, 3]\), \([5, 4, 3, 1, 2]\), \([5, 4, 3, 2, 1]\). Каждая из них - хорошая;
- удовлетворяет \(p_1 > p_2\);
- удовлетворяет \(p_2 > p_3\);
- удовлетворяет \(p_3 > p_4\).
Во втором примере существуют \(60\) перестановок таких, что \(p_1 < p_2\). Только \(56\) из них хорошие: перестановки \([1, 4, 3, 5, 2]\), \([1, 5, 3, 4, 2]\), \([2, 4, 3, 5, 1]\), \([2, 5, 3, 4, 1]\) не являются хорошими, потому что необходимое условие не выполнено для \((l, r)\) = \((1, 5)\). Например, для перестановки \([2, 4, 3, 5, 1]\), - первый и второй минимумы — это \(p_5\) и \(p_1\) соответственно (то есть \(\{p_l, p_r\}\) с точностью до порядка);
- третий минимум \(p_3\) (то есть ни \(p_{l+1}\), ни \(p_{r-1}\)).
В третьем примере есть \(23\) хорошие перестановки, удовлетворяющие ограничениям строки \(s\): \([1, 2, 4, 3, 6, 5]\), \([1, 2, 5, 3, 6, 4]\), \([1, 2, 6, 3, 5, 4]\), \([1, 3, 4, 2, 6, 5]\), \([1, 3, 5, 2, 6, 4]\), \([1, 3, 6, 2, 5, 4]\), \([1, 4, 5, 2, 6, 3]\), \([1, 4, 6, 2, 5, 3]\), \([1, 5, 6, 2, 4, 3]\), \([2, 3, 4, 1, 6, 5]\), \([2, 3, 5, 1, 6, 4]\), \([2, 3, 6, 1, 5, 4]\), \([2, 4, 5, 1, 6, 3]\), \([2, 4, 6, 1, 5, 3]\), \([2, 5, 6, 1, 4, 3]\), \([3, 4, 5, 1, 6, 2]\), \([3, 4, 5, 2, 6, 1]\), \([3, 4, 6, 1, 5, 2]\), \([3, 4, 6, 2, 5, 1]\), \([3, 5, 6, 1, 4, 2]\), \([3, 5, 6, 2, 4, 1]\), \([4, 5, 6, 1, 3, 2]\), \([4, 5, 6, 2, 3, 1]\).
| |
|
|
H. Три минимума
бпф
дп
Комбинаторика
Конструктив
математика
разделяй и властвуй
*3500
Для набора различных чисел мы называем первым минимумом, вторым минимумом и третьим минимумом три наименьших значения (в возрастающем порядке). Перестановка \(p_1, p_2, \dots, p_n\) называется хорошей, если для всех пар \((l,r)\), удовлетворяющих \(1\le l < l+2 \le r\le n\), выполняется следующее условие. - Если \(\{p_l, p_r\}\) являются (не обязательно в таком порядке) первым и вторым минимумами среди \(p_l, p_{l+1}, \dots, p_r\), то третий минимум среди \(p_l, p_{l+1},\dots, p_r\) это либо \(p_{l+1}\), либо \(p_{r-1}\).
Вам дано целое число \(n\) и строка \(s\) длины \(m\), состоящая из символов «<» и «>». Вычислите количество хороших перестановок \(p_1, p_2,\dots, p_n\) таких, что для всех \(1\le i\le m\), - \(p_i < p_{i+1}\), если \(s_i =\) «<»;
- \(p_i > p_{i+1}\), если \(s_i =\) «>».
Так как ответ может быть большим, выведите его по модулю \(998\,244\,353\). Выходные данные Выведите одно целое число: количество хороших перестановок, удовлетворяющих ограничениям из условия, по модулю \(998\,244\,353\). Примечание В первом примере существуют \(5\) хороших перестановок, удовлетворяющих условиям, задаваемым строкой \(s\): \([4, 3, 2, 1, 5]\), \([5, 3, 2, 1, 4]\), \([5, 4, 2, 1, 3]\), \([5, 4, 3, 1, 2]\), \([5, 4, 3, 2, 1]\). Каждая из них - хорошая;
- удовлетворяет \(p_1 > p_2\);
- удовлетворяет \(p_2 > p_3\);
- удовлетворяет \(p_3 > p_4\).
Во втором примере существуют \(60\) перестановок таких, что \(p_1 < p_2\). Только \(56\) из них хорошие: перестановки \([1, 4, 3, 5, 2]\), \([1, 5, 3, 4, 2]\), \([2, 4, 3, 5, 1]\), \([2, 5, 3, 4, 1]\) не являются хорошими, потому что необходимое условие не выполнено для \((l, r)\) = \((1, 5)\). Например, для перестановки \([2, 4, 3, 5, 1]\), - первый и второй минимумы — это \(p_5\) и \(p_1\) соответственно (то есть \(\{p_l, p_r\}\) с точностью до порядка);
- третий минимум \(p_3\) (то есть ни \(p_{l+1}\), ни \(p_{r-1}\)).
В третьем примере есть \(23\) хорошие перестановки, удовлетворяющие ограничениям строки \(s\): \([1, 2, 4, 3, 6, 5]\), \([1, 2, 5, 3, 6, 4]\), \([1, 2, 6, 3, 5, 4]\), \([1, 3, 4, 2, 6, 5]\), \([1, 3, 5, 2, 6, 4]\), \([1, 3, 6, 2, 5, 4]\), \([1, 4, 5, 2, 6, 3]\), \([1, 4, 6, 2, 5, 3]\), \([1, 5, 6, 2, 4, 3]\), \([2, 3, 4, 1, 6, 5]\), \([2, 3, 5, 1, 6, 4]\), \([2, 3, 6, 1, 5, 4]\), \([2, 4, 5, 1, 6, 3]\), \([2, 4, 6, 1, 5, 3]\), \([2, 5, 6, 1, 4, 3]\), \([3, 4, 5, 1, 6, 2]\), \([3, 4, 5, 2, 6, 1]\), \([3, 4, 6, 1, 5, 2]\), \([3, 4, 6, 2, 5, 1]\), \([3, 5, 6, 1, 4, 2]\), \([3, 5, 6, 2, 4, 1]\), \([4, 5, 6, 1, 3, 2]\), \([4, 5, 6, 2, 3, 1]\).
| |
|
|
H. Три минимума
бпф
дп
Комбинаторика
Конструктив
математика
разделяй и властвуй
*3500
Для набора различных чисел мы называем первым минимумом, вторым минимумом и третьим минимумом три наименьших значения (в возрастающем порядке). Перестановка \(p_1, p_2, \dots, p_n\) называется хорошей, если для всех пар \((l,r)\), удовлетворяющих \(1\le l < l+2 \le r\le n\), выполняется следующее условие. - Если \(\{p_l, p_r\}\) являются (не обязательно в таком порядке) первым и вторым минимумами среди \(p_l, p_{l+1}, \dots, p_r\), то третий минимум среди \(p_l, p_{l+1},\dots, p_r\) это либо \(p_{l+1}\), либо \(p_{r-1}\).
Вам дано целое число \(n\) и строка \(s\) длины \(m\), состоящая из символов «<» и «>». Вычислите количество хороших перестановок \(p_1, p_2,\dots, p_n\) таких, что для всех \(1\le i\le m\), - \(p_i < p_{i+1}\), если \(s_i =\) «<»;
- \(p_i > p_{i+1}\), если \(s_i =\) «>».
Так как ответ может быть большим, выведите его по модулю \(998\,244\,353\). Выходные данные Выведите одно целое число: количество хороших перестановок, удовлетворяющих ограничениям из условия, по модулю \(998\,244\,353\). Примечание В первом примере существуют \(5\) хороших перестановок, удовлетворяющих условиям, задаваемым строкой \(s\): \([4, 3, 2, 1, 5]\), \([5, 3, 2, 1, 4]\), \([5, 4, 2, 1, 3]\), \([5, 4, 3, 1, 2]\), \([5, 4, 3, 2, 1]\). Каждая из них - хорошая;
- удовлетворяет \(p_1 > p_2\);
- удовлетворяет \(p_2 > p_3\);
- удовлетворяет \(p_3 > p_4\).
Во втором примере существуют \(60\) перестановок таких, что \(p_1 < p_2\). Только \(56\) из них хорошие: перестановки \([1, 4, 3, 5, 2]\), \([1, 5, 3, 4, 2]\), \([2, 4, 3, 5, 1]\), \([2, 5, 3, 4, 1]\) не являются хорошими, потому что необходимое условие не выполнено для \((l, r)\) = \((1, 5)\). Например, для перестановки \([2, 4, 3, 5, 1]\), - первый и второй минимумы — это \(p_5\) и \(p_1\) соответственно (то есть \(\{p_l, p_r\}\) с точностью до порядка);
- третий минимум \(p_3\) (то есть ни \(p_{l+1}\), ни \(p_{r-1}\)).
В третьем примере есть \(23\) хорошие перестановки, удовлетворяющие ограничениям строки \(s\): \([1, 2, 4, 3, 6, 5]\), \([1, 2, 5, 3, 6, 4]\), \([1, 2, 6, 3, 5, 4]\), \([1, 3, 4, 2, 6, 5]\), \([1, 3, 5, 2, 6, 4]\), \([1, 3, 6, 2, 5, 4]\), \([1, 4, 5, 2, 6, 3]\), \([1, 4, 6, 2, 5, 3]\), \([1, 5, 6, 2, 4, 3]\), \([2, 3, 4, 1, 6, 5]\), \([2, 3, 5, 1, 6, 4]\), \([2, 3, 6, 1, 5, 4]\), \([2, 4, 5, 1, 6, 3]\), \([2, 4, 6, 1, 5, 3]\), \([2, 5, 6, 1, 4, 3]\), \([3, 4, 5, 1, 6, 2]\), \([3, 4, 5, 2, 6, 1]\), \([3, 4, 6, 1, 5, 2]\), \([3, 4, 6, 2, 5, 1]\), \([3, 5, 6, 1, 4, 2]\), \([3, 5, 6, 2, 4, 1]\), \([4, 5, 6, 1, 3, 2]\), \([4, 5, 6, 2, 3, 1]\).
| |
|
|
H. Три минимума
бпф
дп
Комбинаторика
Конструктив
математика
разделяй и властвуй
*3500
Для набора различных чисел мы называем первым минимумом, вторым минимумом и третьим минимумом три наименьших значения (в возрастающем порядке). Перестановка \(p_1, p_2, \dots, p_n\) называется хорошей, если для всех пар \((l,r)\), удовлетворяющих \(1\le l < l+2 \le r\le n\), выполняется следующее условие. - Если \(\{p_l, p_r\}\) являются (не обязательно в таком порядке) первым и вторым минимумами среди \(p_l, p_{l+1}, \dots, p_r\), то третий минимум среди \(p_l, p_{l+1},\dots, p_r\) это либо \(p_{l+1}\), либо \(p_{r-1}\).
Вам дано целое число \(n\) и строка \(s\) длины \(m\), состоящая из символов «<» и «>». Вычислите количество хороших перестановок \(p_1, p_2,\dots, p_n\) таких, что для всех \(1\le i\le m\), - \(p_i < p_{i+1}\), если \(s_i =\) «<»;
- \(p_i > p_{i+1}\), если \(s_i =\) «>».
Так как ответ может быть большим, выведите его по модулю \(998\,244\,353\). Выходные данные Выведите одно целое число: количество хороших перестановок, удовлетворяющих ограничениям из условия, по модулю \(998\,244\,353\). Примечание В первом примере существуют \(5\) хороших перестановок, удовлетворяющих условиям, задаваемым строкой \(s\): \([4, 3, 2, 1, 5]\), \([5, 3, 2, 1, 4]\), \([5, 4, 2, 1, 3]\), \([5, 4, 3, 1, 2]\), \([5, 4, 3, 2, 1]\). Каждая из них - хорошая;
- удовлетворяет \(p_1 > p_2\);
- удовлетворяет \(p_2 > p_3\);
- удовлетворяет \(p_3 > p_4\).
Во втором примере существуют \(60\) перестановок таких, что \(p_1 < p_2\). Только \(56\) из них хорошие: перестановки \([1, 4, 3, 5, 2]\), \([1, 5, 3, 4, 2]\), \([2, 4, 3, 5, 1]\), \([2, 5, 3, 4, 1]\) не являются хорошими, потому что необходимое условие не выполнено для \((l, r)\) = \((1, 5)\). Например, для перестановки \([2, 4, 3, 5, 1]\), - первый и второй минимумы — это \(p_5\) и \(p_1\) соответственно (то есть \(\{p_l, p_r\}\) с точностью до порядка);
- третий минимум \(p_3\) (то есть ни \(p_{l+1}\), ни \(p_{r-1}\)).
В третьем примере есть \(23\) хорошие перестановки, удовлетворяющие ограничениям строки \(s\): \([1, 2, 4, 3, 6, 5]\), \([1, 2, 5, 3, 6, 4]\), \([1, 2, 6, 3, 5, 4]\), \([1, 3, 4, 2, 6, 5]\), \([1, 3, 5, 2, 6, 4]\), \([1, 3, 6, 2, 5, 4]\), \([1, 4, 5, 2, 6, 3]\), \([1, 4, 6, 2, 5, 3]\), \([1, 5, 6, 2, 4, 3]\), \([2, 3, 4, 1, 6, 5]\), \([2, 3, 5, 1, 6, 4]\), \([2, 3, 6, 1, 5, 4]\), \([2, 4, 5, 1, 6, 3]\), \([2, 4, 6, 1, 5, 3]\), \([2, 5, 6, 1, 4, 3]\), \([3, 4, 5, 1, 6, 2]\), \([3, 4, 5, 2, 6, 1]\), \([3, 4, 6, 1, 5, 2]\), \([3, 4, 6, 2, 5, 1]\), \([3, 5, 6, 1, 4, 2]\), \([3, 5, 6, 2, 4, 1]\), \([4, 5, 6, 1, 3, 2]\), \([4, 5, 6, 2, 3, 1]\).
| |
|
|
B. Mike's Sequence
*особая задача
математика
разделяй и властвуй
реализация
You won't find this sequence on OEIS.
| |
|
|
E. МинимизатOR
битмаски
жадные алгоритмы
Перебор
разделяй и властвуй
реализация
Структуры данных
*2500
Дан массив \(a\) из \(n\) неотрицательных целых чисел, пронумерованных от \(1\) до \(n\). Назовём стоимостью массива \(a\) величину, равную \(\displaystyle \min_{i \neq j} a_i | a_j\), где \(|\) обозначает операцию побитового ИЛИ. Есть \(q\) запросов. Каждый запрос состоит из двух чисел \(l\) и \(r\) (\(l < r\)). Для каждого запроса необходимо вывести стоимость массива \(a_{l}, a_{l + 1}, \ldots, a_{r}\). Выходные данные Для каждого набора входных данных выведите \(q\) чисел, где \(j\)-е число равно стоимости массива \(a_{l_j}, a_{l_j + 1}, \ldots, a_{r_j}\). Примечание В первом наборе входных данных массив \(a\) выглядит так: \(110_2, 001_2, 011_2, 010_2, 001_2\). Поэтому ответы на запросы будут следующими: - \([1; 2]\): \(a_1 | a_2 = 110_2 | 001_2 = 111_2 = 7\);
- \([2; 3]\): \(a_2 | a_3 = 001_2 | 011_2 = 011_2 = 3\);
- \([2; 4]\): \(a_2 | a_3 = a_3 | a_4 = a_2 | a_4 = 011_2 = 3\);
- \([2; 5]\): \(a_2 | a_5 = 001_2 = 1\).
Во втором наборе входных данных массив \(a\) выглядит так: \(00_2, 10_2, 01_2, \underbrace{11\ldots 1_2}_{30}\) (\(a_4 = 2^{30} - 1\)). Поэтому ответы на запросы будут следующими: - \([1; 2]\): \(a_1 | a_2 = 10_2 = 2\);
- \([2; 3]\): \(a_2 | a_3 = 11_2 = 3\);
- \([1; 3]\): \(a_1 | a_3 = 01_2 = 1\);
- \([3; 4]\): \(a_3 | a_4 = 01_2 | \underbrace{11\ldots 1_2}_{30} = 2^{30} - 1 = 1073741823\).
| |
|
|
D. Волшебники и дороги
графы
жадные алгоритмы
Паросочетания
разделяй и властвуй
Структуры данных
*3000
В некоторой стране живут волшебники. Они любят строить города и дороги. Раньше в стране было k городов, j-ый (1 ≤ j ≤ k) был расположен в точке (xj, yj). Было решено наколдовать еще n - k городов. Причем i-ый (k < i ≤ n) город колдовался в точку с координатами (xi, yi): - xi = (a·xi - 1 + b) mod (109 + 9)
- yi = (c·yi - 1 + d) mod (109 + 9)
Здесь a, b, c, d — простые числа. Причем a ≠ c, b ≠ d. После постройки всех n городов, волшебники заметили удивительное свойство. Для любых двух различных городов с номерами i и j: xi ≠ xj и yi ≠ yj. Города построены, пора строить дороги! Было решено использовать самое сложное (и, конечно же, самое мощное) заклинание для постройки дорог. C использованием этого заклинания, между городами u, v (yu > yv) проводится дорога тогда и только тогда, когда для любого города w, лежащего строго внутри уголка на точках u, v (см. ниже), есть город s, не лежащий в уголке, который находится по x-координате строго между w и u и при этом ys > yv. Уголком на точках p2(x2, y2), p1(x1, y1) (y2 > y1) называется множество точек (x, y), для которых выполнено хотя бы одно из двух условий: - min(x1, x2) ≤ x ≤ max(x1, x2) и y ≥ y1
- y1 ≤ y ≤ y2 и (x - x2)·(x1 - x2) ≥ 0
На рисунке изображены примеры уголков Для того, чтобы опробовать заклинание, оно будет применено ко всем городам, лежащим по x-координате в отрезке [L, R]. После постройки дорог руководство страны хочет выбрать как можно больше пар городов, соединенных дорогой, так, что никакой город не лежит в двух или более парах. Вам предлагается для каждого из m предложенных вариантов выбора значений L, R посчитать максимальное количество таких пар после постройки дорог. Обратите внимание, что города, не лежащие в отрезке [L, R] по x-координате, никак не влияют на постройку дорог. Выходные данные Для каждой пары чисел Li, Ri выведите ответ на задачу в отдельной строке. Ответы для пар выводите в том порядке, в котором пары заданы во входных данных. Примечание В первом примере дороги соединяют города в цепочку в порядке возрастания x. Во втором примере оставшиеся 5 городов будут построены в точках (5, 11); (20, 263098); (65, 292514823); (200, 76958738); (605, 622120197).
| |
|
|
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\).
| |
|
|
F. Дороги против вора
битмаски
жадные алгоритмы
интерактив
Конструктив
математика
разделяй и властвуй
*2400
Это интерактивная задача. В городе есть \(n^2\) зданий, разделенных на сетку из \(n\) строк и \(n\) столбцов. Вам нужно построить дорогу произвольной длины \(D(A,B)\) между каждой парой соседних по стороне зданий \(A\) и \(B\). Из-за бюджетных и юридических ограничений длина каждой дороги должна быть положительным целым числом, а общая длина всех дорог не должна превышать \(48\,000\). В городе есть вор, который начнет с самого верхнего и самого левого здания (в первом ряду и первой колонке) и будет бродить по городу, время от времени крадя артефакты из некоторых зданий. Он может перемещаться из одного здания в другое соседнее здание, путешествуя по дороге, которая их соединяет. Вы не можете отследить, какие здания он посещает и по какому пути он идет, чтобы добраться до них. Но в городе есть один следящий механизм. Трекер может хранить одно целое число \(x\), которое изначально равно \(0\). Каждый раз, когда вор перемещается из здания \(A\) в соседнее здание \(B\) по дороге длиной \(D(A,B)\), трекер изменяет \(x\) на \(x\oplus D(A,B)\). Каждый раз, когда вор ворует из здания, трекер сообщает значение \(x\), хранящееся в нем, и сбрасывает его обратно на \(0\). Заранее известно, что вор обворует ровно \(k\) зданий, но значения, возвращаемые трекером, вы узнаете только после того, как кражи действительно произойдут. Ваша задача заключается в том, чтобы выбрать длины дорог таким образом, чтобы независимо от того, какой стратегии или маршрута придерживается вор, вы сможете точно сказать расположение всех зданий, где произошли кражи, по значениям, возвращаемым трекером. Протокол взаимодействия Сначала считайте единственную строку, содержащую два целых числа \(n\) \((2\leq n\leq 32)\) and \(k\) \((1\leq k\leq 1024)\) — количество строк и количество краж соответственно. Давайте обозначим \(j\)-е здание в \(i\)-й строке как \(B_{i,j}\). Затем выведите \(n\) строк, каждая из которых содержит \(n-1\) целое число. \(j\)-е число в \(i\)-й строке должно быть значением \(D(B_{i,j},B_{i,j+1})\). Затем выведите \(n-1\) строку, каждая из которых содержит \(n\) целых чисел. \(j\)-е число в \(i\)-й строке должно быть значением \(D(B_{i,j},B_{i+1,j})\). Помните, что суммарная длина дорог не должна превышать \(48\,000\). Затем ответьте на \(k\) вопросов. Сначала считайте значение \(x\), возвращаемое трекером. Потом выведите два целых числа, обозначающих номер строки и номер столбца здания, где произошла кража. После этого вы сможете ответить на следующий запрос (если такой есть). После вывода запросов не забудьте вывести символ перевода строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Взломы Вы не можете делать взломы по этой задаче. Примечание В примере \(n=2\) and \(k=4\). Вы выбираете построить дороги следующих длин: Вор действует следующим образом: - Начать в \(B_{1,1}\).
- Переместиться вправо в \(B_{1,2}\).
- Переместиться вниз в \(B_{2,2}\).
- Переместиться влево в \(B_{2,1}\).
- Переместиться вверх в \(B_{1,1}\).
- Переместиться вправо в \(B_{1,2}\).
- Украсть из \(B_{1,2}\).
- Переместиться влево в \(B_{1,1}\).
- Украсть из \(B_{1,1}\).
- Переместиться вниз в \(B_{2,1}\).
- Переместиться вправо в \(B_{2,2}\).
- Переместиться вверх в \(B_{1,2}\).
- Украсть из \(B_{1,2}\).
- Переместиться влево в \(B_{1,1}\).
- Переместиться вниз в \(B_{2,1}\).
- Украсть из \(B_{2,1}\).
Трекер отвечает следующим образом: - Изначально \(x=0\).
- Изменить \(x\) на \(x\oplus 1=0\oplus1=1\).
- Изменить \(x\) на \(x\oplus 4=1\oplus4=5\).
- Изменить \(x\) на \(x\oplus 8=5\oplus8=13\).
- Изменить \(x\) на \(x\oplus 2=13\oplus2=15\).
- Изменить \(x\) на \(x\oplus 1=15\oplus1=14\).
- Вернуть \(x=14\) и обнулить \(x=0\).
- Изменить \(x\) на \(x\oplus 1=0\oplus1=1\).
- Вернуть \(x=1\) и обнулить \(x=0\).
- Изменить \(x\) на \(x\oplus 2=0\oplus2=2\).
- Изменить \(x\) на \(x\oplus 8=2\oplus8=10\).
- Изменить \(x\) на \(x\oplus 4=10\oplus4=14\).
- Вернуть \(x=14\) и обнулить \(x=0\).
- Изменить \(x\) на \(x\oplus 1=0\oplus1=1\).
- Изменить \(x\) на \(x\oplus 2=1\oplus2=3\).
- Вернуть \(x=3\) и обнулить \(x=0\).
| |
|
|
H2. Максимизация пересечений (сложная версия)
разделяй и властвуй
сортировки
Структуры данных
*1500
Единственная разница между двумя версиями состоит в том, что в этой версии \(n \leq 2 \cdot 10^5\) и сумма по \(n\) по всем наборам входных данных теста не превосходит \(2 \cdot 10^5\). Терминал — это ряд из \(n\) равных отрезков, пронумерованных от \(1\) до \(n\) по порядку. Есть два терминала, один над другим. Вам дан массив \(a\) длины \(n\). Для всех \(i = 1, 2, \dots, n\) должен быть прямой провод из некоторой точки на отрезке \(i\) верхнего терминала в некоторую точку на отрезке \(a_i\) нижнего терминала. Например, на следующих рисунках показаны два возможных соединения, при \(n=7\) и \(a=[4,1,4,6,7,7,5]\). Пересечение происходит, когда два провода имеют общую точку. На картинке выше пересечения обведены красным. Какое максимальное количество пересечений может быть при оптимальном размещении проводов? Выходные данные Для каждого набора выведите единственное целое число — максимальное количество пересечений, при оптимальном расположении проводов. Примечание Первый пример показан на втором рисунке в условии. Во втором примере при единственно возможном соединении появляется пересечение двух проводов, поэтому ответ равен \(1\). В третьем тестовом примере единственно возможное соединение состоит из одного провода, поэтому ответ равен \(0\).
| |
|
|
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\).
| |
|
|
H. Сложный разрез
Конструктив
математика
поиск в глубину и подобное
разделяй и властвуй
*3400
Главный секрет киноиндустрии заключается в том, что известный фильм «Люси» основан на реальных событиях, а в главных ролях была именно Тётя Люсине. Спойлер: в конце фильма Люси(не) превращается в компьютер. Причём компьютер необычный, в нём есть информация про все секреты вселенной, но в виде бинарной строки. Эту бинарную строку вам и нужно расшифровать самым-самым естественным образом. Дана бинарная строка \(s\). Необходимо разбить её на произвольное количество непересекающихся подстрок так, чтобы сумма двоичных чисел, образованных этими подстроками, была точной степенью двойки, либо сказать, что это невозможно. Каждый символ \(s\) должен принадлежать ровно одной подстроке из разбиения. Выходные данные Для каждого набора входных данных выведите ответ на задачу следующим образом: - Если ответа не существует, выведите \(-1\).
- Если ответ существует, то сначала выведите число \(k\) — количество подстрок в разбиении. После этого выведите \(k\) непересекающихся подстрок, для \(i\)-й подстроки выведите два целых числа \(l_i, r_i\) (\(1 \le l_i, r_i \le |s|\)) — описание \(i\)-й подстроки.
Если существует несколько возможных разбиений, выведите любое. Примечание В первом наборе входных данных невозможно разбить строку так, чтобы получить степень двойки. Во втором наборе входных данных возможно следующее разбиение: - \(011_2 = 3_{10}\),
- \(0_2 = 0_{10}\),
- \(1_2 = 1_{10}\),
\(3 + 0 + 1 = 4\), \(4\) является степенью двойки.
| |
|
|
D. Максимум не меньше суммы
Бинарный поиск
Конструктив
разделяй и властвуй
реализация
Структуры данных
*1800
Вам дан массив \(a\) из \(n\) целых чисел. Вам нужно проверить, верно ли, что неравенство \(\)\max(a_i, a_{i + 1}, \ldots, a_{j - 1}, a_{j}) \geq a_i + a_{i + 1} + \dots + a_{j - 1} + a_{j}\(\) выполняется для всех пар индексов \((i, j)\), где \(1 \leq i \leq j \leq n\). Выходные данные Для каждого набора входных данных выведите «YES», если условие для данного массива выполнено, и «NO» в противном случае. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Примечание В примерах \(1\) и \(2\) данное неравенство выполняется для всех пар \((i, j)\). В примере \(3\) неравенство не выполняется для пары \((1, 2)\), так как \(\max(2, 3) < 2 + 3\).
| |
|
|
D. Разбиение на возрастающую и спадающую
дп
жадные алгоритмы
Перебор
разделяй и властвуй
Структуры данных
*2800
Назовем массив \(a\) из \(m\) целых чисел \(a_1, a_2, \ldots, a_m\) Decinc, если \(a\) можно сделать возрастающим, удалив из него убывающую подпоследовательность (возможно, пустую). - Например, если \(a = [3, 2, 4, 1, 5]\), мы можем удалить из \(a\) убывающую подпоследовательность \([a_1, a_4]\) и получить \(a = [2, 4, 5]\), которая является возрастающей.
Вам дана перестановка \(p\) чисел от \(1\) до \(n\). Найдите количество пар целых чисел \((l, r)\) с \(1 \le l \le r \le n\) таких, что \(p[l \ldots r]\) (подмассив \(p\) от \(l\) до \(r\)) является Decinc массивом. Выходные данные Выведите количество пар целых чисел \((l, r)\) таких, что \(p[l \ldots r]\) (подмассив \(p\) от \(l\) до \(r\)) является Decinc массивом. \((1 \le l \le r \le n)\) Примечание В первом примере все подмассивы являются Decinc. Во втором примере все подмассивы, кроме \(p[1 \ldots 6]\) и \(p[2 \ldots 6]\) являются Decinc.
| |
|
|
D. Граф перестановки
Бинарный поиск
жадные алгоритмы
Конструктив
кратчайшие пути
разделяй и властвуй
Структуры данных
*1900
Перестановкой является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)). Дана перестановка \([a_1,a_2,\dots,a_n]\) чисел \(1,2,\dots,n\). Для целых \(i\),\(j\), таких что \(1\le i<j\le n\), определим \(\operatorname{mn}(i,j)\) как \(\min\limits_{k=i}^j a_k\), а \(\operatorname{mx}(i,j)\) как \(\max\limits_{k=i}^j a_k\). Построим неориентированный граф на \(n\) вершинах, пронумерованных от \(1\) до \(n\). Для каждой пары \(1\le i<j\le n\), если одновременно \(\operatorname{mn}(i,j)=a_i\) и \(\operatorname{mx}(i,j)=a_j\), или одновременно \(\operatorname{mn}(i,j)=a_j\) и \(\operatorname{mx}(i,j)=a_i\), то между вершинами \(i\) и \(j\) проводится неориентированное ребро длины \(1\). Найдите в этом графе длину кратчайшего пути от вершины \(1\) до вершины \(n\). Можно доказать, что в таком графе вершины \(1\) и \(n\) всегда будут соединены каким-либо путём, так что кратчайший путь всегда существует. Выходные данные Для каждого набора входных данных выведите одно число — длину кратчайшего пути от \(1\) до \(n\).
| |
|
|
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\) не будут достижимы друг из друга.
| |
|
|
E. Долгий путь домой
геометрия
графы
дп
жадные алгоритмы
кратчайшие пути
разделяй и властвуй
Структуры данных
*2400
Олеся решила отправиться в путешествие по стране, состоящей из \(n\) городов (она живет в городе \(1\)). Между некоторыми городами страны есть двусторонние дороги. Для каждой дороги известно время, необходимое для того, чтобы по ней проехать. Также между каждой парой городов есть авиарейс, перелет из города \(u\) в город \(v\) занимает \((u - v)^2\) времени. Олеся недавно посмотрела «Чудо на Гудзоне» и несколько боится летать, поэтому она может воспользоваться не более чем \(k\) перелетами. Олеся хочет узнать минимальное время путешествия в каждый из \(n\) городов страны из города \(1\). Выходные данные Выведите \(n\) чисел, \(i\)-е из которых равно минимальному времени путешествия в город \(i\). Примечание В первом примере время путешествия до города 1 равно 0; чтобы добраться в город 2, можно воспользоваться авиаперелетом из 1 в 2 за 1 единицу времени; в город 3 можно добраться из города 1 по дороге за 1 единицу времени. Во втором примере время путешествия до города 1 равно 0. Чтобы добраться в город 2, можно воспользоваться авиаперелетом из 1 в 2, занимающим 1 единицу времени. Чтобы добраться в город 3 за 4 единицы времени, можно проехать из города 1 в город 2 по дороге за 3 единицы времени, а потом воспользоваться авиаперелетом из 2 в 3. Чтобы добраться в город 4, можно воспользоваться авиаперелетом из города 1 в город 2, а потом проехать из города 2 в город 4 по дороге за 5 единиц времени.
| |
|
|
E. Обмен и максимальный отрезок
битмаски
дп
поиск в глубину и подобное
разделяй и властвуй
Структуры данных
*2500
Задан массив длины \(2^n\). Элементы массива пронумерованы от \(1\) до \(2^n\). Надо обработать \(q\) запросов к массиву. В \(i\)-м запросе будет дано целое число \(k\) (\(0 \le k \le n-1\)). Чтобы обработать запрос, надо сделать следующее: - для каждого \(i \in [1, 2^n-2^k]\) в возрастающем порядке сделайте следующее: если \(i\)-й элемент уже менялся местами с каким-либо другим элементов в текущем запросе, пропустите его; иначе поменяйте местами \(a_i\) и \(a_{i+2^k}\);
- после этого выведите наибольшую сумму среди всех непрерывных подотрезков массива (включая пустой подотрезок).
Например, если массив \(a\) равен \([-3, 5, -3, 2, 8, -20, 6, -1]\), а \(k = 1\), то запрос обрабатывается так: - \(1\)-й элемент еще не менялся ни с кем местами, поэтому поменяем его местами с \(3\)-м элементом;
- \(2\)-й элемент еще не менялся ни с кем местами, поэтому поменяем его местами с \(4\)-м элементом;
- \(3\)-й элемент уже менялся местами;
- \(4\)-й элемент уже менялся местами;
- \(5\)-й элемент еще не менялся ни с кем местами, поэтому поменяем его местами с \(7\)-м элементом;
- \(6\)-й элемент еще не менялся ни с кем местами, поэтому поменяем его местами с \(8\)-м элементом.
Тогда массив становится равен \([-3, 2, -3, 5, 6, -1, 8, -20]\). Подотрезок с максимальной суммой — это \([5, 6, -1, 8]\), и ответ на запрос равен \(18\). Обратите внимание, что запросы изменяют массив, т. е. после выполнения запроса массив не возвращается в изначальное состояние, и следующий запрос будет применен к измененному массиву. Выходные данные На каждый запрос выведите одно целое число — наибольшую сумму среди всех непрерывных подотрезков массива (включая пустой подотрезок) после обработки запроса. Примечание Преобразование массива в примере: \([-3, 5, -3, 2, 8, -20, 6, -1] \rightarrow [-3, 2, -3, 5, 6, -1, 8, -20] \rightarrow [2, -3, 5, -3, -1, 6, -20, 8] \rightarrow [5, -3, 2, -3, -20, 8, -1, 6]\).
| |
|
|
D. Максимальное И
битмаски
жадные алгоритмы
поиск в глубину и подобное
разделяй и властвуй
сортировки
*1800
Вам даны два массива \(a\) и \(b\), состоящие из \(n\) целых чисел каждый. Определим функцию \(f(a, b)\) следующим образом: - определим массив \(c\) размера \(n\), где \(c_i = a_i \oplus b_i\) (\(\oplus\) обозначает операцию побитового исключающего ИЛИ);
- значением функции является \(c_1 \mathbin{\&} c_2 \mathbin{\&} \cdots \mathbin{\&} c_n\) (т.е. побитовое И всех элементов массива \(c\)).
Найдите максимальное значение функции \(f(a, b)\), если вы можете переупорядочить элементы массива \(b\) произвольным образом (также можно оставить первоначальный порядок). Выходные данные Для каждого набора входных данных выведите одно целое число — максимальное значение функции \(f(a, b)\), если вы можете переупорядочить элементы массива \(b\) произвольным образом.
| |
|
|
E. Максимумы и минимумы
Комбинаторика
разделяй и властвуй
Структуры данных
теория чисел
*2700
Вам дан массив целых положительных чисел \(a_1, a_2, \ldots, a_n\). Найдите количество пар индексов \((l, r)\) (\(1 \le l \le r \le n\)), которые проходят проверку. Проверка пары чисел выполняется следующим образом: - Находятся минимум и максимум среди чисел \(a_l, a_{l+1}, \ldots, a_r\).
- Проверка считается пройденной, если максимум делится на минимум.
Выходные данные Для каждого набора входных данных выведите единственное целое число — количество проходящих проверку пар чисел. Примечание Ниже запись \(x \mid y\) означает, что \(y\) делится на \(x\). В первом наборе входных данных существует всего одна пара индексов \((1, 1)\), для нее максимум равен \(1\), минимум также \(1\), \(1 \mid 1\), поэтому эта пара проходит проверку, а ответ равен \(1\). Во втором наборе входных данных \(3\) пары индексов: - \((1, 1)\): максимум равен \(2\), минимум равен \(2\), \(2 \mid 2\), проверка пройдена.
- \((1, 2)\): максимум равен \(4\), минимум равен \(2\), \(2 \mid 4\), проверка пройдена.
- \((2, 2)\): максимум равен \(4\), минимум равен \(4\), \(4 \mid 4\), проверка пройдена.
В третьем наборе входных данных \(3\) пары индексов: - \((1, 1)\): максимум равен \(2\), минимум равен \(2\), \(2 \mid 2\), проверка пройдена.
- \((1, 2)\): максимум равен \(3\), минимум равен \(2\), \(3\) не делится на \(2\), поэтому проверка не пройдена.
- \((2, 2)\): максимум равен \(3\), минимум равен \(3\), \(3 \mid 3\), поэтому проверка пройдена.
| |
|
|
F. Нули и единицы
битмаски
дп
математика
разделяй и властвуй
*2500
Пусть \(S\) — это строка Туэ-Морса. Другими словами, \(S\) — это пронумерованная с \(0\) бинарная строка бесконечной длины, построенная следующим образом: Вам даны два положительных числа \(n\) и \(m\). Найдите количество позиций, в которых отличаются строки \(S_0 S_1 \ldots S_{m-1}\) и \(S_n S_{n + 1} \ldots S_{n + m - 1}\). Выходные данные Для каждого набора входных данных выведите одно целое число — количество позиций, в которых отличаются данные строки. Примечание Строка \(S\) равна 0110100110010110.... В первом примере \(S_0\) это «0», а \(S_1\) это «1». Эти строки отличаются в \(1\) позиции. Во втором примере \(S_0 S_1 \ldots S_9\) это «0110100110», а \(S_5 S_6 \ldots S_{14}\) это «0011001011». Эти строки отличаются в \(6\) позициях.
| |
|
|
I. Хрустальные шары
геометрия
графы
дп
разделяй и властвуй
разделяй и властвуй
Структуры данных
теория чисел
*3500
В мире Compfestnesia Пак Чанек нашел секретное подземелье. Внутри него находится сундук с сокровищами, окруженный \(n\) статуями, расположенными по кругу. Статуи пронумерованы от \(0\) до \(n-1\), причем статуя \(i\) находится слева от статуи \(i+1\), а статуя \(n-1\) — слева от статуи \(0\). Пак Чанек заметил, что каждая статуя держит хрустальный шар с целым числом от \(0\) до \(m-1\) включительно. В хрустальном шаре статуи \(i\) содержится число \(a_i\). В подземелье есть инструкция, согласно которой, чтобы открыть сундук с сокровищами, все целые числа в хрустальных шарах должны быть равны \(0\). Для этого Паку Чанеку дается целое число \(k\), и он может выполнить ноль или более операций. За одну операцию Пак Чанек делает следующее: - Он выберет ровно \(k\) последовательных статуй. Другими словами, выберет статуи \(p, (p+1) \bmod n, (p+2) \bmod n, (p+3) \bmod n, \ldots, (p+k-1) \bmod n\) для некоторого выбранного индекса \(p\).
- Выполнит одно из следующих действий:
- Для каждой выбранной статуи заменит её значение \(a_i\) на \((a_i+1) \bmod m\).
- Для каждой выбранной статуи заменит её значение \(a_i\) на \((a_i-1) \bmod m\).
Помогите Паку Чанеку найти минимально возможное количество операций, чтобы открыть сундук с сокровищами. Выходные данные Если возможно выполнить ноль или более операций так, чтобы стало \(a_0=a_1=\ldots=a_{n-1}=0\), выведите минимальное требуемое количество операций. В противном случае выведите \(-1\). Примечание В первом примере Пак Чанек может выполнять следующие операции: - Выполнить операцию \(a_i := (a_i-1) \bmod m\) \(3\) раза для статуй \(1\), \(2\) и \(3\). Теперь \(a=[8,7,1,2,0]\).
- Выполнить операцию \(a_i := (a_i-1) \bmod m\) \(1\) раз для статуй \(3\), \(4\) и \(0\). Теперь \(a=[7,7,1,1,8]\).
- Выполнить операцию \(a_i := (a_i+1) \bmod m\) \(2\) раза для статуй \(4\), \(0\) и \(1\). Теперь \(a=[0,0,1,1,1]\).
- Выполнить операцию \(a_i := (a_i-1) \bmod m\) \(1\) раз для статуй \(2\), \(3\) и \(4\). Теперь \(a=[0,0,0,0,0]\).
| |
|
|
I. Хрустальные шары
геометрия
графы
дп
разделяй и властвуй
разделяй и властвуй
Структуры данных
теория чисел
*3500
В мире Compfestnesia Пак Чанек нашел секретное подземелье. Внутри него находится сундук с сокровищами, окруженный \(n\) статуями, расположенными по кругу. Статуи пронумерованы от \(0\) до \(n-1\), причем статуя \(i\) находится слева от статуи \(i+1\), а статуя \(n-1\) — слева от статуи \(0\). Пак Чанек заметил, что каждая статуя держит хрустальный шар с целым числом от \(0\) до \(m-1\) включительно. В хрустальном шаре статуи \(i\) содержится число \(a_i\). В подземелье есть инструкция, согласно которой, чтобы открыть сундук с сокровищами, все целые числа в хрустальных шарах должны быть равны \(0\). Для этого Паку Чанеку дается целое число \(k\), и он может выполнить ноль или более операций. За одну операцию Пак Чанек делает следующее: - Он выберет ровно \(k\) последовательных статуй. Другими словами, выберет статуи \(p, (p+1) \bmod n, (p+2) \bmod n, (p+3) \bmod n, \ldots, (p+k-1) \bmod n\) для некоторого выбранного индекса \(p\).
- Выполнит одно из следующих действий:
- Для каждой выбранной статуи заменит её значение \(a_i\) на \((a_i+1) \bmod m\).
- Для каждой выбранной статуи заменит её значение \(a_i\) на \((a_i-1) \bmod m\).
Помогите Паку Чанеку найти минимально возможное количество операций, чтобы открыть сундук с сокровищами. Выходные данные Если возможно выполнить ноль или более операций так, чтобы стало \(a_0=a_1=\ldots=a_{n-1}=0\), выведите минимальное требуемое количество операций. В противном случае выведите \(-1\). Примечание В первом примере Пак Чанек может выполнять следующие операции: - Выполнить операцию \(a_i := (a_i-1) \bmod m\) \(3\) раза для статуй \(1\), \(2\) и \(3\). Теперь \(a=[8,7,1,2,0]\).
- Выполнить операцию \(a_i := (a_i-1) \bmod m\) \(1\) раз для статуй \(3\), \(4\) и \(0\). Теперь \(a=[7,7,1,1,8]\).
- Выполнить операцию \(a_i := (a_i+1) \bmod m\) \(2\) раза для статуй \(4\), \(0\) и \(1\). Теперь \(a=[0,0,1,1,1]\).
- Выполнить операцию \(a_i := (a_i-1) \bmod m\) \(1\) раз для статуй \(2\), \(3\) и \(4\). Теперь \(a=[0,0,0,0,0]\).
| |
|
|
D. Маша и красивое дерево
графы
Деревья
поиск в глубину и подобное
разделяй и властвуй
сортировки
*1300
Девочка Маша гуляла в лесу и нашла полное бинарное дерево высоты \(n\) и перестановку \(p\) длины \(m=2^n\). Полное бинарное дерево высоты \(n\) — это такое корневое дерево, что каждая вершина кроме листьев имеет ровно двух сыновей, а длина пути от корня до любого из листьев равна \(n\). Ниже на картинке изображено полное бинарное дерево для \(n=2\). Перестановкой называется массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\). Например, [\(2,3,1,5,4\)] является перестановкой, а [\(1,2,2\)] не является (\(2\) встречается дважды), и [\(1,3,4\)] тоже не является перестановкой (\(n=3\), но в массиве есть \(4\)). Пронумеруем \(m\) листьев этого дерева слева направо. В листе с номером \(i\) записано значение \(p_i\) (\(1 \le i \le m\)). Например, если \(n = 2\), \(p = [3, 1, 4, 2]\), дерево будет выглядеть так: Маша считает дерево красивым, если значения в его листьях упорядочены слева направо по возрастанию. За одну операцию Маша может выбрать произвольную не являющуюся листом вершину дерева и поменять местами ее левого и правого сына (вместе с их поддеревьями). Например, если Маша применит эту операцию к корню рассмотренного выше дерева, оно приобретет следующий вид: Помогите Маше понять, сможет ли она за некоторое количество операций сделать дерево красивым. Если сможет, то выведите минимальное количество операций, чтобы сделать дерево красивым. Выходные данные Для каждого набора входных данных в отдельной строке выведите минимальное возможное количество операций, за которое Маша сможет сделать дерево красивым или -1, если это невозможно. Примечание Рассмотрим первый тест. В первом наборе входных данных можно действовать так (фиолетовым цветом выделена вершина, к которой на текущем шаге применяется операция): Можно показать, что нельзя сделать дерево красивым за меньшее число операций. Во втором наборе входных данных можно показать, что нельзя сделать дерево красивым. В третьем наборе входных данных дерево сразу является красивым.
| |
|
|
E. Очередная задача на подсчёт массивов
Бинарный поиск
Деревья
дп
математика
Потоки
разделяй и властвуй
Структуры данных
*2300
Позиция первого максимума на отрезке \([l; r]\) массива \(x = [x_1, x_2, \ldots, x_n]\) это наименьшее целое число \(i\), такое что \(l \le i \le r\) и \(x_i = \max(x_l, x_{l+1}, \ldots, x_r)\). Вам дан массив \(a = [a_1, a_2, \ldots, a_n]\) длины \(n\). Найдите количество массивов \(b = [b_1, b_2, \ldots, b_n]\) длины \(n\), удовлетворяющих следующим требованиям: - \(1 \le b_i \le m\) для всех \(1 \le i \le n\);
- для всех пар \(1 \le l \le r \le n\), позиция первого максимума на отрезке \([l; r]\) массива \(b\) равна позиции первого максимума на отрезке \([l; r]\) массива \(a\).
Так как это количество может быть очень большим, выведите его по модулю \(10^9+7\). Выходные данные Для каждого набора входных данных выведите одно число: количество массивов \(b\), удовлетворяющих требованиям выше, по модулю \(10^9+7\). Примечание В первом наборе входных данных следующие \(8\) массивов удовлетворяют требованиям из условия: - \([1,2,1]\);
- \([1,2,2]\);
- \([1,3,1]\);
- \([1,3,2]\);
- \([1,3,3]\);
- \([2,3,1]\);
- \([2,3,2]\);
- \([2,3,3]\).
Во втором наборе входных данных следующие \(5\) массивов удовлетворяют требованиям из условия: - \([1,1,1,1]\);
- \([2,1,1,1]\);
- \([2,2,1,1]\);
- \([2,2,2,1]\);
- \([2,2,2,2]\).
| |
|
|
E. Скобочная стоимость
Бинарный поиск
дп
жадные алгоритмы
разделяй и властвуй
Строки
Структуры данных
*2400
Деймон Таргариен решил перестать быть похожим на персонажа Metin2. Он превратил себя в прекраснейшую вещь — скобочную последовательность. Для последовательности скобок мы можем выполнять два вида операций: - Выберите одну из её подстрок\(^\dagger\) и циклически сдвиньте её вправо. Например, после циклического сдвига вправо «(())» станет «)(()»;
- Вставьте любую скобку, открывающую «(» или закрывающую «)», в любом месте последовательности.
Мы определяем стоимость скобочной последовательности как минимальное количество таких операций, чтобы сделать её правильной\(^\ddagger\). Для заданной скобочной последовательности \(s\) длины \(n\) найдите сумму стоимостей всех \(\frac{n(n+1)}{2}\) её непустых подстрок. Обратите внимание, что для каждой подстроки мы вычисляем стоимость независимо. \(^\dagger\) Строка \(a\) является подстрокой \(b\), если \(a\) может быть получена из \(b\) удалением нескольких (возможно, ни одного или всех) символов из начала и нескольких (возможно, ни одного или всех) символов из конца. \(^\ddagger\) Последовательность скобок называется правильной, если её можно превратить в правильное математическое выражение, добавив символы \(+\) и \(1\). Например, последовательности «(())()», «()» и «(()(()))» правильные, в то время как «)(», «(()» и «(()))(» не являются правильными. Выходные данные Для каждого набора входных данных выведите единственное целое число — сумму стоимостей всех подстрок \(s\). Примечание В первом наборе входных данных есть единственная подстрока «)». Её стоимость \(1\), потому что мы можем вставить «(» в начало этой подстроки и получить строку «()», то есть сбалансированную строку. Во втором наборе входных данных стоимость каждой подстроки длины один равна \(1\). Стоимость подстроки «)(» равна \(1\), потому что мы можем циклически сдвинуть ее вправо и получить строку «()». Стоимость строк « )()» и «()(» равна \(1\), потому что достаточно вставить по одной скобке в каждую из них. Стоимость подстроки «)()(» равна \(1\), потому что мы можем циклически сдвинуть её вправо и получить строку «()()». Таким образом, есть \(4 + 2 + 2 + 1 = 9\) подстрока стоимостью \(1\) и \(1\) подстрока из стоимостью \(0\). Таким образом, сумма стоимостей равна \(9\). В третьем наборе входных данных: - «(», стоимость равна \(1\);
- «()», стоимость равна \(0\);
- «())», стоимость равна \(1\);
- «)», стоимость равна \(1\);
- «))», стоимость равна \(2\);
- «)», стоимость равна \(1\).
Таким образом, сумма стоимостей равна \(6\).
| |
|
|
E. Декомпозиция
Бинарный поиск
дп
Перебор
разделяй и властвуй
Структуры данных
*2300
Для последовательности целых чисел \([x_1, x_2, \dots, x_k]\) обозначим декомпозицию следующим образом: Будем обрабатывать последовательность слева направо, поддерживая список ее подпоследовательностей. Когда мы обрабатываем элемент \(x_i\), мы приписываем его в конец первой подпоследовательности в списке, для которой побитовое И последнего ее элемента и \(x_i\) больше \(0\). Если такой подпоследовательности в списке нет, создадим новую подпоследовательность с единственным элементом \(x_i\) и запишем ее в конец списка подпоследовательностей. Например, рассмотрим декомпозицию последовательности \([1, 3, 2, 0, 1, 3, 2, 1]\): - обрабатываем элемент \(1\), список подпоследовательностей пуст. Ни к одной подпоследовательности нельзя приписать \(1\), поэтому мы создаем новую подпоследовательность \([1]\);
- обрабатываем элемент \(3\), список подпоследовательностей — \([[1]]\). Так как побитовое И \(3\) и \(1\) равно \(1\), элемент добавляется в первую подпоследовательность;
- обрабатываем элемент \(2\), список подпоследовательностей — \([[1, 3]]\). Так как побитовое И \(2\) и \(3\) равно \(2\), элемент добавляется в первую подпоследовательность;
- обрабатываем элемент \(0\), список подпоследовательностей — \([[1, 3, 2]]\). Ни к одной подпоследовательности нельзя приписать \(0\), поэтому мы создаем новую подпоследовательность \([0]\);
- обрабатываем элемент \(1\), список подпоследовательностей — \([[1, 3, 2], [0]]\). Ни к одной подпоследовательности нельзя приписать \(1\), поэтому мы создаем новую подпоследовательность \([1]\);
- обрабатываем элемент \(3\), список подпоследовательностей — \([[1, 3, 2], [0], [1]]\). Так как побитовое И \(3\) и \(2\) равно \(2\), элемент добавляется в первую подпоследовательность;
- обрабатываем элемент \(2\), список подпоследовательностей — \([[1, 3, 2, 3], [0], [1]]\). Так как побитовое И \(2\) и \(3\) равно \(2\), элемент добавляется в первую подпоследовательность;
- обрабатываем элемент \(1\), список подпоследовательностей — \([[1, 3, 2, 3, 2], [0], [1]]\). Элемент \(1\) нельзя приписать ни к одной из первых двух подпоследовательностей, но можно приписать к третьей.
В результате получается список подпоследовательностей \([[1, 3, 2, 3, 2], [0], [1, 1]]\). Пусть \(f([x_1, x_2, \dots, x_k])\) — количество подпоследовательностей, на которое декомпозируется последовательность \([x_1, x_2, \dots, x_k]\). А теперь — сама задача. Вам дана последовательность \([a_1, a_2, \dots, a_n]\), в которой каждый элемент — это целое число от \(0\) до \(3\). Пусть \(a[i..j]\) — это последовательность \([a_i, a_{i+1}, \dots, a_j]\). Вы должны посчитать \(\sum \limits_{i=1}^n \sum \limits_{j=i}^n f(a[i..j])\). Выходные данные Выведите одно целое число, равное \(\sum \limits_{i=1}^n \sum \limits_{j=i}^n f(a[i..j])\).
| |
|
|
G. Кохиа и скобки
бпф
математика
разделяй и властвуй
*3400
У Чию есть скобочная последовательность\(^\dagger\) \(s\) длины \(n\). Пусть \(k\) равно минимальному числу символов, которое Чию должна удалить из \(s\), чтобы сделать \(s\) правильной\(^\ddagger\). Теперь Косия хочет, чтобы вы посчитали количество способов удалить \(k\) символов из \(s\) так, чтобы \(s\) стала правильной, по модулю \(998\,244\,353\). Обратите внимание, что два способа удалить символы считаются различными, если и только если множества удаленных индексов различаются. \(^\dagger\) Скобочной последовательностью называется строка, состоящая только из символов «(» и «)». \(^\ddagger\) Скобочная последовательность называется правильной, если ее можно превратить в корректное математическое выражение, добавляя только символы + и 1. Например, последовательности (())(), (), (()(())) и пустая строка являются правильными, а )(, (() и (()))( — нет. Выходные данные Выведите одно целое число — количество способов удалить \(k\) символов из \(s\) так, чтобы \(s\) стала правильной, по модулю \(998\,244\,353\). Примечание В первом примере можно показать, что минимальное количество символов, которое нужно удалить, равно \(2\). Есть \(4\) способа удалить \(2\) символа так, чтобы \(s\) стала правильной, как показано ниже. Удаленные символы показаны красным. - \(\texttt{(} \color{Red}{\texttt{)}} \texttt{)} \color{Red}{\texttt{(}} \texttt{(} \texttt{)}\),
- \(\texttt{(} \texttt{)} \color{Red}{\texttt{)}} \color{Red}{\texttt{(}} \texttt{(} \texttt{)}\),
- \(\texttt{(} \color{Red}{\texttt{)}} \texttt{)} \texttt{(} \color{Red}{\texttt{(}} \texttt{)}\),
- \(\texttt{(} \texttt{)} \color{Red}{\texttt{)}} \texttt{(} \color{Red}{\texttt{(}} \texttt{)}\).
Во втором примере единственный способ сделать \(s\) сбалансированной — удалить единственную скобку, чтобы получить пустую скобочную последовательность, которая считается сбалансированной.
| |
|
|
F. Немота массива
битмаски
Деревья
разделяй и властвуй
Строки
Структуры данных
*2400
Дан массив \(a\), состоящий из \(n\) неотрицательных целых чисел. Немотой подмассива \(a_l, a_{l+1}, \ldots, a_r\) (для произвольных \(l \leq r\)) назовем величину \(\)\max(a_l, a_{l+1}, \ldots, a_r) \oplus (a_l \oplus a_{l+1} \oplus \ldots \oplus a_r),\(\) где \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Найдите максимальную немоту среди всех подмассивов. Выходные данные Для каждого набора входных данных выведите одно число — максимальную немоту среди всех подмассивов данного массива. Примечание В первом наборе входных данных рассмотрим подмассив \([3, 4, 5]\). В нем максимальное значение равно \(5\). Значит, его немота равна \(3 \oplus 4 \oplus 5 \oplus 5\) = \(7\). Это максимально возможное значение немоты по всем подмассивам. Во втором наборе входных данных подмассив \([47, 52]\) обеспечивает наибольшее значение немоты.
| |
|
|
G. Радиус взвешенного дерева
Деревья
разделяй и властвуй
реализация
Структуры данных
*2800
Вам задано дерево из \(n\) вершин и \(n - 1\) ребра. Первоначальный вес \(i\)-й вершины равен \(a_i\). Назовем расстоянием \(d_v(u)\) от вершины \(v\) до вершины \(u\) количество ребер на пути из \(v\) в \(u\). Заметим, что \(d_v(u) = d_u(v)\) и \(d_v(v) = 0\). Назовем взвешенным расстоянием \(w_v(u)\) от \(v\) до \(u\) значение \(w_v(u) = d_v(u) + a_u\). Заметим, что \(w_v(v) = a_v\) и \(w_v(u) \neq w_u(v)\), если \(a_u \neq a_v\). Аналогично обычному расстоянию, назовем эксцентриситетом \(e(v)\) вершины \(v\) наибольшее взвешенное расстояние от \(v\) до какой-либо вершины (включая саму \(v\)), или \(e(v) = \max\limits_{1 \le u \le n}{w_v(u)}\). Наконец, назовем радиусом \(r\) дерева наименьший из эксцентриситетов его вершин, или \(r = \min\limits_{1 \le v \le n}{e(v)}\). Вам нужно обработать \(m\) запросов следующего вида: - \(v_j\) \(x_j\) — присвоить \(a_{v_j} = x_j\).
После обработки каждого запроса выведите радиус \(r\) текущего дерева. Выходные данные Выведите \(m\) целых чисел — радиус \(r\) дерева после обработки каждого запроса. Примечание После первого запроса дерево выглядит следующим образом: Цветом на изображении отмечена вершина с наименьшим \(e(v)\), соответственно \(r = e(4) = 7\). Эксцентриситеты других вершин равны: \(e(1) = 8\), \(e(2) = 9\), \(e(3) = 9\), \(e(5) = 8\), \(e(6) = 8\). Дерево после второго запроса: Радиус \(r = e(1) = 4\). После третьего запроса радиус \(r = e(2) = 5\):
| |
|
|
I. Охота за сокровищами
разделяй и властвуй
Структуры данных
*3400
Определим значение красоты последовательности \(b_1,b_2,\ldots,b_c\) как максимальное значение \(\sum\limits_{i=1}^{q}b_i + \sum\limits_{i=s}^{t}b_i\), где \(q\), \(s\), \(t\) являются целыми числами и \(s > q\) или \(t\leq q\). Обратите внимание, что \(b_i = 0\), когда \(i<1\) или \(i>c\), \(\sum\limits_{i=s}^{t}b_i = 0\), когда \(s>t\). Например, если \(b = [-1,-2,-3]\), у нас может быть \(q = 0\), \(s = 3\), \(t = 2\), поэтому значение красоты равно \(0 + 0 = 0\). А если \(b = [-1,2,-3]\) и \(q = s = t = 2\), то значение красоты будет равно \(1 + 2 = 3\). Вам дана последовательность \(a\) длины \(n\), определите сумму красоты всех непустых подотрезков \(a_l,a_{l+1},\ldots,a_r\) (\(1\leq l\leq r\leq n\)) последовательности \(a\). Выведите ответ по модулю \(998\,244\,353\). Выходные данные Для каждого набора входных данных выведите строку, содержащую одно целое число — ответ по модулю \(998\,244\,353\). Примечание Во втором наборе входных данных для подпоследовательности \([-26,43,-41,34,13]\), когда \(q=5\), \(s=2\), \(t=5\), \(\sum\limits_{i=1}^{q}b_i + \sum\limits_{i=s}^{t}b_i = 23 + 49 = 72\). В третьем наборе входных данных имеется только одна непустая последовательная подпоследовательность \([74]\). Когда \(q=1\), \(s=1\), \(t=1\), \(\sum\limits_{i=1}^{q}b_i + \sum\limits_{i=s}^{t}b_i = 148\).
| |
|
|
F. Тимофей и черно-белое дерево
графы
Деревья
жадные алгоритмы
кратчайшие пути
математика
Перебор
поиск в глубину и подобное
разделяй и властвуй
*2100
Тимофей приехал в известную летнюю школу и нашел там дерево на \(n\) вершинах. Дерево — это связный неориентированный граф без циклов. Каждая вершина этого дерева, кроме \(c_0\), покрашена в белый цвет. Вершина \(c_0\) покрашена в черный цвет. Тимофей хочет покрасить все вершины этого дерева в черный цвет. Для этого он выполняет \(n - 1\) операцию. Во время \(i\)-й операции он выбирает белую вершину \(c_i\) и красит ее в черный цвет. Назовем позитивностью дерева минимальное расстояние между всеми парами различных черных вершин в нем. Расстоянием между вершинами \(v\) и \(u\) называется количество ребер на пути от \(v\) до \(u\). После каждой очередной покраски Тимофей хочет знать позитивность текущего дерева. Выходные данные Для каждого набора входных данных выведите в отдельной строке \(n - 1\) число. Число с номером \(i\) должно быть равно позитивности дерева, полученного первыми \(i\) покрасками. Примечание В первом наборе входных данных, после второй покраски, дерево выглядит так:  Расстояние между вершинами \(1\) и \(6\) равно \(3\), расстояние между вершинами \(4\) и \(6\) равно \(3\), расстояние между вершинами \(1\) и \(4\) равно \(2\). Позитивность такого дерева равна минимуму из этих расстояний, то есть \(2\). В третьем наборе входных данных, после четвертой покраски, дерево выглядит так:  Позитивность такого дерева равна \(2\).
| |
|
|
F2. Покраска графа (сложная версия)
бпф
графы
дп
Комбинаторика
Перебор
разделяй и властвуй
*2900
Единственное различие между простой и сложной версией — ограничение на \(n\). Дан полный неориентированный граф из \(n\) вершин. Полный граф — это такой граф, где между каждой парой вершин существует ровно одно ребро. Вы должны покрасить ребра этого графа в два цвета, синий и красный (каждое ребро должно быть покрашено в один из этих цветов). Назовем множество вершин \(S\) связным по красному цвету, если для каждой пары вершин \((v_1, v_2)\), такой, что \(v_1 \in S\) и \(v_2 \in S\), существует путь из \(v_1\) в \(v_2\), проходящий только по вершинам из \(S\) и по красным ребрам. Аналогично, назовем множество вершин \(S\) связным по синему цвету, если для каждой пары вершин \((v_1, v_2)\), такой, что \(v_1 \in S\) и \(v_2 \in S\), существует путь из \(v_1\) в \(v_2\), проходящий только по вершинам из \(S\) и по синим ребрам. Нужно раскрасить граф так, чтобы выполнялись следующие условия: - хотя бы одно ребро красное;
- хотя бы одно ребро синее;
- для каждого множества вершин \(S\), такого, что \(|S| \ge 2\), \(S\) связно по красному цвету или по синему цвету, но не по обоим цветам.
Посчитайте количество способов покрасить граф и выведите его по модулю \(998244353\). Выходные данные Выведите одно целое число — количество способов покрасить граф, взятое по модулю \(998244353\).
| |
|
|
F. Ребрендинг
Перебор
разделяй и властвуй
реализация
Структуры данных
*2600
Костя и Женя - создатели группы «Бумага» - после выпуска легендарного альбома решили создать новое музыкальное объединение «Дневные грузчики», для этого им нужно найти двух новых людей. Они пригласили на кастинг \(n\) человек. Кастинг продлится \(q\) дней. В \(i\)-й из дней Костя и Женя хотят найти двух человек на отрезке с \(l_i\) по \(r_i\), которые больше всего подходят их объединению. Так как «Дневные грузчики» занимаются современным искусством, музыкальные навыки им не важны и они смотрят лишь на внешние признаки: им хочется, чтобы разница роста двух людей была как можно меньше. Помогите им, и для каждого дня укажите минимальную разницу роста людей с кастинга на данном отрезке! Выходные данные Выведите \(q\) строк. В \(i\)-й строке должна быть минимальная разница роста между двумя кандидатами на отрезке в \(i\)-й день кастинга. Примечание В первом примере минимальная разность на отрезке \([1, 2]\) составляет \(2\), на отрезке \([2, 3]\) — \(1\), на отрезке \([1, 3]\) также \(1\). В третьем примере минимальную разность на отрезке \([4, 6]\) составляют числа \(3\) и \(5\) (\(5 - 3 = 2\)). На отрезке \([1, 2]\) минимальную разность имеют числа \(2\) и \(6\) (\(6 - 2 = 4\)). На отрезке \([3, 6]\) минимальную разность имеют числа \(1\) и \(3\) (\(3 - 1 = 2\)). На отрезке \([1, 3]\) минимальную разность образуют числа \(1\) и \(2\) (\(2 - 1 = 1\)).
| |
|
|
D. Подсчет факторизаций
дп
Комбинаторика
математика
разделяй и властвуй
теория чисел
*1900
Факторизация положительного целого числа \(m\) — это единственный способ записать его в виде \(\displaystyle m=p_1^{e_1}\cdot p_2^{e_2}\cdot \ldots \cdot p_k^{e_k}\), где \(p_1, p_2, \ldots, p_k\) — простые числа, \(p_1 < p_2 < \ldots < p_k\) и \(e_1, e_2, \ldots, e_k\) — положительные целые числа. Для каждого положительного целого числа \(m\), определим \(f(m)\) как мультимножество всех чисел в его факторизации, то есть \(f(m)=\{p_1,e_1,p_2,e_2,\ldots,p_k,e_k\}\) . Например, \(f(24)=\{2,3,3,1\}\), \(f(5)=\{1,5\}\) и \(f(1)=\{\}\). Вам задан список, состоящий из \(2n\) целых чисел \(a_1, a_2, \ldots, a_{2n}\). Подсчитайте, сколько положительных целых чисел \(m\) удовлетворяют условию \(f(m)=\{a_1, a_2, \ldots, a_{2n}\}\), поскольку это число может быть большим, выведите его по модулю \(998\,244\,353\). Выходные данные Выведите одно целое число — количество положительных целых чисел \(m\), удовлетворяющих условию \(f(m)=\{a_1, a_2, \ldots, a_{2n}\}\), по модулю \(998\,244\,353\). Примечание В первом примере два значения \(m\), такие что \(f(m)=\{1,2,3,3\}\): \(m=24\) и \(m=54\). Их факторизации: \(24=2^3\cdot 3^1\) и \(54=2^1\cdot 3^3\). Во втором примере пять значений \(m\), таких что \(f(m)=\{2,2,3,5\}\): \(200, 225, 288, 500\) и \(972\). В третьем примере не существует такого значения \(m\), что \(f(m)=\{1,4\}\). Ни \(1^4\), ни \(4^1\) не являются факторизациями, потому что \(1\) и \(4\) не являются простыми числами.
| |
|
|
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. Цены на бензин
Деревья
разделяй и властвуй
снм
Структуры данных
хэши
*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. Значит, после рождения четвёртой пары сыновей не существует способов выставить цены на бензин так, чтобы все проверки выполнялись и цены находились в необходимых диапазонах.
| |
|
|
F. Приближение диаметра
Бинарный поиск
графы
кратчайшие пути
разделяй и властвуй
*2700
У Джека есть граф из \(n\) вершин и \(m\) рёбер. Все рёбра двунаправлены и имеют единичную длину. Граф связен, то есть существует путь между любыми двумя его вершинами. Одну и ту же пару вершин может соединять несколько ребер. Граф может содержать петли, то есть рёбра, соединяющие вершину саму с собой. Расстояние между вершинами \(u\) и \(v\) обозначается как \(\rho(u, v)\) и равно минимально возможному количеству рёбер на пути между \(u\) и \(v\). Диаметр графа \(G\) определяется как максимальное расстояние между парой его вершин и обозначается как \(d(G)\). Формально, \(\)d(G) = \max_{1 \le u, v \le n}{\rho(u, v)}.\(\) Джек планирует последовательно применить к своему графу \(q\) модификаций. Каждая модификация добавляет ровно одно ребро. Обозначим через \(G_i\) граф Джека после первых \(i\) модификаций. Джек хочет вычислить \(q + 1\) значений \(d(G_0), d(G_1), d(G_2), \ldots, d(G_q)\). Джек подозревает, что нахождение точных диаметров \(q + 1\) графов может быть сложной задачей, поэтому ему подойдут приближённые ответы, отличающиеся от правильных ответов не более чем в два раза. Формально, Джек хочет найти последовательность целых положительных чисел \(a_0, a_1, a_2, \ldots, a_q\) такую, что \(\)\left\lceil \frac{d(G_i)}{2} \right\rceil \le a_i \le 2 \cdot d(G_i)\(\) для каждого \(i\). Взломы Вы не можете делать взломы в этой задаче. Выходные данные Выведите последовательность из \(q + 1\) целого положительного числа \(a_0, a_1, a_2, \ldots, a_q\). \(i\)-е из этих чисел должно отличаться от диаметра графа \(G_i\) не более чем в два раза. Примечание В первом примере последовательность значений диаметров \(d(G_0), d(G_1), d(G_2), \ldots, d(G_q)\) равна \(6, 6, 6, 3, 3, 3, 2, 2, 2\). Во втором примере входные данные содержат дополнительную строку, чтение которой можно не делать. Она не являются частью теста и будет использоваться для проверки правильности вашего ответа. Вывод на второй пример содержит правильные значения \(d(G_i)\).
| |
|
|
E1. Маршрутки на Венере (простая версия)
дп
Комбинаторика
разделяй и властвуй
*2200
Это простая версия задачи. Различия между версиями заключаются в ограничениях на \(n\) и \(k\). Вы можете делать взломы, только если все три версии задачи сданы. Максим — водитель маршрутки на планете Венера. Чтобы проехаться на маршрутке Максима, необходимо иметь билет. У каждого билета есть номер, состоящий из \(n\) цифр. Но, как известно, жители Венеры пользуются не десятичной системой счисления, а системой счисления по основанию \(k\). Поэтому можно считать, что номер билета — это последовательность из \(n\) целых чисел от \(0\) до \(k-1\) включительно. Жители Венеры считают билет счастливым, если на нем найдется цифра, равная сумме остальных цифр по модулю \(k\). Например, если \(k=10\), то билет \(7135\) является счастливым, поскольку \(7 + 1 + 5 \equiv 3 \pmod{10}\). С другой стороны, билет \(7136\) счастливым не является, поскольку ни одна цифра не равна сумме всех остальных по модулю \(10\). Однажды Максим, выполняя очередную поездку, задумался: а сколько всего существует счастливых билетов? При этом Максим понимает, что это число может быть очень велико, поэтому его интересует лишь остаток от деления ответа на некоторое простое число \(m\). Выходные данные Выведите одно целое число — количество счастливых билетов по модулю \(m\), т. е. остаток от деления ответа на \(m\). Примечание В первом примере существует всего четыре счастливых билета: \(000\), \(011\), \(101\) и \(110\).
| |
|
|
E2. Маршрутки на Венере (средняя версия)
дп
Комбинаторика
матрицы
разделяй и властвуй
*2500
Это средняя версия задачи. Различия между версиями заключаются в ограничениях на \(n\) и \(k\). Вы можете делать взломы, только если все три версии задачи сданы. Максим — водитель маршрутки на планете Венера. Чтобы проехаться на маршрутке Максима, необходимо иметь билет. У каждого билета есть номер, состоящий из \(n\) цифр. Но, как известно, жители Венеры пользуются не десятичной системой счисления, а системой счисления по основанию \(k\). Поэтому можно считать, что номер билета — это последовательность из \(n\) целых чисел от \(0\) до \(k-1\) включительно. Жители Венеры считают билет счастливым, если на нем найдется цифра, равная сумме остальных цифр по модулю \(k\). Например, если \(k=10\), то билет \(7135\) является счастливым, поскольку \(7 + 1 + 5 \equiv 3 \pmod{10}\). С другой стороны, билет \(7136\) счастливым не является, поскольку ни одна цифра не равна сумме всех остальных по модулю \(10\). Однажды Максим, выполняя очередную поездку, задумался: а сколько всего существует счастливых билетов? При этом Максим понимает, что это число может быть очень велико, поэтому его интересует лишь остаток от деления ответа на некоторое простое число \(m\). Выходные данные Выведите одно целое число — количество счастливых билетов по модулю \(m\), т. е. остаток от деления ответа на \(m\). Примечание В первом примере существует всего четыре счастливых билета: \(000\), \(011\), \(101\) и \(110\).
| |
|
|
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\)-й вышки.
| |
|
|
E. Полусумма
жадные алгоритмы
Перебор
разделяй и властвуй
*3400
Вам дано мультимножество неотрицательных целых чисел \(\{a_1, a_2, \dots, a_n\}\). Вы можете выбрать два элемента \(x\) и \(y\) из мультимножества, удалить их и вставить их полусумму \(\frac{x + y}{2}\) обратно в мультимножество. Вы повторяете описанное выше действие до тех пор, пока не останется только два числа \(A\) и \(B\). Каково максимально возможное значение их абсолютной разности \(|A-B|\)? Поскольку ответ не является целым числом, выведите его по модулю \(10^9+7\). Выходные данные Для каждого набора входных данных выведите одно целое число — ответ на задачу по модулю \(10^9+7\). Формально, пусть \(M = 10^9+7\). Можно показать, что ответ может быть представлен в виде несократимой дроби \(\frac{p}{q}\), где \(p\) и \(q\) — целые числа, и \(q \not \equiv 0 \pmod{M}\). Выведите целое число, равное \(p \cdot q^{-1} \bmod M\). Другими словами, выведите такое целое число \(x\), что \(0 \le x < M\) и \(x \cdot q \equiv p \pmod{M}\). Примечание В первом примере вы не можете выполнить никаких операций, поэтому ответ равен \(|7-3|=4\). Во втором примере одна из оптимальных последовательностей операций выглядит так: - Замените \(1\) и \(2\) на \(1.5\);
- Замените \(10\) и \(11\) на \(10.5\);
- Разница между \(1.5\) и \(10.5\) равна \(9\).
В третьем примере точный ответ равен \(\frac{3}{2}\), и \(500\,000\,005 \cdot 2 \equiv 3 \pmod{10^9+7}\).
| |
|
|
I. Тенцинг и ожерелье
дп
жадные алгоритмы
разделяй и властвуй
*3500
яркое, солнечное и невинное...... У Тенцинга есть красивое ожерелье. Ожерелье состоит из \(n\) жемчужин, пронумерованных от \(1\) до \(n\), с нитками, соединяющими жемчужины \(i\) и \((i \text{ mod } n)+1\) для всех \(1 \leq i \leq n\). Однажды Тенцинг захотел разделить ожерелье на несколько частей, перерезав несколько нитей. На каждой связной части ожерелья должно быть не более \(k\) жемчужин. Время, необходимое для разрезания каждой нити, может быть неодинаковым. Тенцинг должен потратить \(a_i\) минут, чтобы перерезать нить между жемчужинами \(i\) и \((i \text{ mod } n)+1\). Тенцинг хочет узнать минимальное время в минутах, которое требуется, чтобы разрезать ожерелье так, чтобы в каждой связной части было не более \(k\) жемчужин. Выходные данные Для каждого набора входных данных выведите минимально необходимое общее время в минутах. Примечание В первом наборе ожерелье будет разрезано на \(3\) части: \([1,2][3,4][5]\), поэтому общее время составит \(3\). Во втором наборе ожерелье будет разрезано на \(3\) части: \([5,1][2][3,4]\). Тенцинг разрежет нитки, соединяющие \((1,2), (2,3)\) и \((4,5)\), поэтому общее время составит \(a_1+a_2+a_4=7\).
| |
|
|
F2. Метрополитен в Омске (сложная версия)
Деревья
дп
математика
поиск в глубину и подобное
разделяй и властвуй
Структуры данных
*2300
Это сложная версия задачи. Единственное отличие между простой и сложной версией состоит в том, что в этой версии \(u\) может принимать любые возможные значения. Как известно, Омск — столица Берляндии. Как и в любой столице, в Омске есть хорошо развитая система метрополитена. Метрополитен Омска представляет из себя некоторое количество станций, соединённых туннелями, причём между любыми двумя станциями есть ровно один путь, проходящий по каждому из туннелей не более одного раза. Иными словами, метрополитен представляет собой дерево. Для развития метрополитена и привлечения жителей в Омске используется следующая система. Каждая станция имеет свой вес \(x \in \{-1, 1\}\). Если станция имеет вес \(-1\), то при посещении станции с жителя Омска взимается плата в \(1\) бурль. Если же вес станции равен \(1\), то житель Омска вознаграждается \(1\)-м бурлем. Пока что есть только одна станция с номером \(1\) и весом \(x = 1\). Каждый день происходит одно из следующих событий: - К станции с номером \(v_i\) присоединяется новая станция с весом \(x\), и ей присваивается номер, на единицу больший количества уже существующих станций.
- Лёша, живущий в Омске, задаётся вопросом: существует ли подотрезок\(\dagger\) (возможно, пустой) пути между вершинами \(u\) и \(v\) такой, что, проехав по нему, можно заработать ровно \(k\) бурлей (если \(k < 0\), то это означает, что на проезд придётся потратить \(k\) бурлей). Иначе говоря, Лёшу интересует, существует ли такой подотрезок пути, что сумма весов вершин в нем равна \(k\). Обратите внимание, что подотрезок может быть пустым, и тогда сумма равна \(0\).
Вы являетесь другом Лёши, поэтому Ваша задача — ответить на вопросы Лёши. \(\dagger\)Подотрезок — непрерывная последовательность элементов. Выходные данные Для каждого вопроса Лёши выведите «Yes» (без кавычек), если описанный в условии подотрезок существует, иначе выведите «No» (без кавычек). Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ). Примечание Пояснение к первому примеру. Ответ на второй вопрос «Yes», так как существует путь \(1\). В четвертом вопросе мы можем снова выбрать путь \(1\). В пятом запросе ответ «Yes», так как есть путь \(1-3\). В шестом запросе мы можем выбрать пустой путь, так как сумма весов на нем равна \(0\). Нетрудно показать, что нет путей, удовлетворяющих первому и третьему запросу.
| |
|
|
F. Вика и вики
Бинарный поиск
битмаски
дп
Комбинаторика
математика
разделяй и властвуй
*2400
На днях Вика изучала свой любимый интернет-ресурс — Википедию. На просторах Википедии она вычитала про интересную математическую операцию побитового исключающего ИЛИ, обозначаемую \(\oplus\). Вика стала изучать свойства этой загадочной операции. Для этого она взяла массив \(a\), состоящий из \(n\) целых неотрицательных чисел и применила одновременно ко всем его элементам следующую операцию: \(a_i = a_i \oplus a_{(i+1) \bmod n}\). Здесь \(x \bmod y\) обозначает остаток от деления \(x\) на \(y\). Элементы массива нумеруются, начиная с \(0\). Так как для полного изучения недостаточно проделать вышеописанные действия единожды, Вика повторяет их до тех пор, пока массив \(a\) не превратится в состоящий только из нулей. Определите, через сколько описанных выше действий все элементы массива \(a\) станут нулевыми. Если такой момент никогда не наступит, выведите \(-1\). Выходные данные Выведите единственное число — минимальное число действий, необходимое, чтобы сделать все элементы массива \(a\) нулевыми, или \(-1\), если массив \(a\) никогда не станет нулевым. Примечание В первом примере после одной операции массив \(a\) станет равен \([3, 3, 3, 3]\). Через ещё одну операцию он будет равен \([0, 0, 0, 0]\). Во втором примере массив \(a\) изначально состоит только из нулей. В третьем примере после одной операции массив \(a\) станет равен \([0]\).
| |
|
|
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}\).
| |
|
|
F. XOR-разделение
Бинарный поиск
битмаски
Деревья
жадные алгоритмы
разделяй и властвуй
Структуры данных
*2700
Для множества целых чисел \(S\) определим его стоимость как минимальное значение \(x \oplus y\) среди всех пар различных чисел из множества (\(\oplus\) обозначает оператор побитового исключающего ИЛИ). Если в множестве менее двух элементов, его стоимость равна \(2^{30}\). Вам дано множество целых чисел \(\{a_1, a_2, \dots, a_n\}\). Вы должны разделить его на два множества \(S_1\) и \(S_2\) таким образом, что каждый элемент принадлежит ровно одному из этих двух множеств. Стоимость разделения — это минимум из стоимостей \(S_1\) и \(S_2\). Найдите разделение с максимальной стоимостью. Выходные данные Выведите строку из \(n\) символов 0 и/или 1, описывающую разделение следующим образом: \(i\)-й символ строки должен быть 0, если \(a_i\) принадлежит \(S_1\), в противном случае этот символ должен быть 1. Если существует несколько оптимальных ответов — выведите любой из них.
| |
|
|
D. Более неправильно
интерактив
разделяй и властвуй
*2100
Это интерактивная задача. Жюри загадало перестановку\(^\dagger\) \(p\) длины \(n\). В один запрос можно выбрать два целых числа \(l\) и \(r\) (\(1 \le l < r \le n\)), заплатив за это \((r - l)^2\) монет. В ответ вы получите количество инверсий\(^\ddagger\) в подмассиве \([p_l, p_{l + 1}, \ldots p_r]\). Найдите индекс максимального элемента в \(p\), потратив не более \(5 \cdot n^2\) монет. Примечание: интерактор не является адаптивным: перестановка фиксируется до выполнения каких-либо запросов. \(^\dagger\) Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)). \(^\ddagger\) Количеством инверсий в массиве является количество пар индексов \((i,j)\) таких, что \(i < j\) и \(a_i > a_j\). Например, массив \([10,2,6,3]\) содержит \(4\) инверсии: \((1,2),(1,3),(1,4)\) и \((3,4)\). Протокол взаимодействия Взаимодействие для каждого набора входных данных начинается с чтения целого числа \(n\). Для формирования запроса выведите «? l r» (\(1 \le l < r \le n\)) без кавычек. После этого вы должны прочитать одно единственное целое число — ответ на ваш запрос. Если вместо ответа или допустимого значения \(n\) вы получите целое число \(-1\), то это означает, что ваша программа сделала некорректный запрос, превысила лимит запросов или дала неверный ответ на предыдущем наборе входных данных. При получении вердикта «Неправильный ответ» ваша программа должна немедленно завершиться. В противном случае можно получить произвольный вердикт, поскольку решение будет продолжать считывать данные из закрытого потока. Когда вы будете готовы дать окончательный ответ, выведите «! i» (\(1 \le i \le n\)) без кавычек — индекс максимума загаданной перестановки. После решения одного набора входных данных программа должна сразу же переходить к следующему. После решения всех наборов входных данных программа должна быть немедленно завершена. После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Взломы Для взлома используйте следующий формат: Первая строка содержит целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 2000\)) — длина скрытой перестановки \(p\). Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(p_1,p_2,\ldots, p_n\) (\(1 \le p_i \le n\)), причем \(p\) должно быть перестановкой. Сумма \(n\) по всем наборам входных данных не должна превышать \(2000\). Примечание В первом тесте взаимодействие происходит следующим образом: | Решение | Жюри | Объяснение | | 2 | Имеется \(2\) набора входных данных. | | 4 | В первом наборе входных данных загадана перестановка \([1,3,2,4]\) длины \(4\). | | ? 1 3 | 1 | Решение запрашивает количество инверсий в подмассиве \([1,3,2]\), заплатив \(4\) монеты, а жюри отвечает \(1\). | | ? 3 4 | 0 | Решение запрашивает количество инверсий в подмассиве \([2,4]\), заплатив \(1\) монету, а жюри отвечает \(0\). | | ! 4 | | Решение каким-то образом определило, что \(p_4 = 4\), и выводит это. Поскольку ответ правильный, жюри переходит к следующему набору входных данных. | | 2 | Во втором наборе входных данных загадана перестановка \([2,1]\) длины \(2\). | | ? 1 2 | 1 | Решение запрашивает количество инверсий в подмассиве \([2,1]\), заплатив \(1\) монету, а жюри отвечает \(1\). | | ! 1 | | Решение каким-то образом определило, что \(p_1 = 2\), и выводит это. Поскольку ответ верен и наборов входных данных больше нет, жюри и решение завершаются. | |
Обратите внимание, что пустые строки во входных и выходных данных примера сделаны для наглядности и не встречаются в реальном взаимодействии.
| |
|
|
G. Подсчет графов
графы
Деревья
жадные алгоритмы
Комбинаторика
разделяй и властвуй
снм
сортировки
*2000
Дано дерево, состоящее из \(n\) вершин. Дерево — это связный неориентированный граф без циклов. Каждое ребро дерева имеет свой вес, \(w_i\). Ваша задача — подсчитать количество различных графов, для которых одновременно выполняются четыре условия: - В графе нет петель и кратных ребер.
- Веса на ребрах графа целые числа и не превышают \(S\).
- Граф имеет ровно одно минимальное остовное дерево.
- Минимальное остовное дерево графа является заданным деревом.
Два графа считаются различными, если их наборы рёбер различны с учётом весов рёбер. Ответ может быть большим, выведите его по модулю \(998244353\). Выходные данные Для каждого теста выведите количество различных графов, удовлетворяющих условиям, по модулю \(998244353\). Примечание В первом примере существует единственный граф, который и является заданным деревом. Во втором примере заданное дерево выглядит так: Ниже изображены все возможные графы для второго примера, красным цветом выделено минимальное остовное дерево:
| |
|
|
F. Телепортация в Байтландии
графы
Деревья
кратчайшие пути
поиск в глубину и подобное
разделяй и властвуй
Структуры данных
*3200
В Байтландии есть \(n\) городов, некоторые пары которых соединены дорогами, по которым можно ездить в обе стороны. \(i\)-я дорога характеризуется сложностью проезда по ней \(w_i\). Время проезда по дороге со сложностью \(w_i\) равняется \(\lceil\frac{w_i}{c}\rceil\) часов, где \(c\) — навык вождения водителя. Транспортная система Байтландии представляет собой дерево. Иными словами, между любой парой городов существует ровно один путь, который проходит по каждому городу не более одного раза. В некоторых городах можно посетить курсы вождения. Если провести в таком городе, изучая курсы, \(T\) часов, то навык вождения \(c\) увеличивается в \(2\) раза. Заметьте, что значение \(T\) одинаково во всех городах, и курсы можно посещать в одном и том же городе несколько раз. Вам нужно ответить на \(q\) запросов: за какое минимальное время можно добраться из города \(a\) в город \(b\), если начать путь с навыком вождения \(c = 1\)? Выходные данные Для каждого запроса выведите одно целое число в отдельной строке — минимальное время, за которое можно добраться в соответствующем запросе. Примечание В первом наборе входных данных в первом запросе оптимально не проходить курсы вождения. Тогда минимальное время равно сложности дороги между городами \(1\) и \(2\), которое равно \(1\). Во втором наборе входных данных в первом запросе оптимально вначале пройти курсы вождения за \(3\) часа в городе \(1\) один раз, а потом поехать в город \(5\). Тогда всего путь займёт \(3 + \lceil\frac{5}{2}\rceil + \lceil\frac{10}{2}\rceil = 11\) часов.
| |
|
|
D. Медуза и Мику
дп
математика
разделяй и властвуй
Теория вероятностей
*2800
Имеется \(n + 1\) городов с номерами от \(0\) до \(n\), соединенные \(n\) дорогами. Дорога \(i\)-го города \((1 \leq i \leq n)\) соединяет города \(i-1\) и \(i\) двунаправленно. После того, как Медуза прилетела обратно в город \(0\), она обнаружила, что оставила свою фуфу Мику в городе \(n\). Каждая дорога имеет целый положительный уровень красоты. Обозначим красоту \(i\)-й дороги как \(a_i\). Медуза пытается найти свою фуфу. Из-за плохого чувства направления она не знает, в какую сторону идти. Каждый день она наугад выбирает дорогу, связанную с городом, в котором находится в данный момент, и идет по ней. Пусть \(s\) — сумма красот дорог, ведущих в текущий город. Для каждой дороги, связанной с текущим городом, Медуза пройдет ее с вероятностью \(\frac x s\), где \(x\) — красота дороги, и достигнет города, расположенного на другом конце дороги. Медуза стартует из города \(0\), и, только достигнув города \(n\), она может воссоединиться со своей фуфу. Вы хотите выбрать такую красоту дорог, чтобы ожидаемое количество дней, которые потребуются Медузе для поиска своей фуфу, было минимально возможным. Однако из-за ограниченного финансирования сумма красот всех дорог должна быть меньше или равна \(m\). Найдите минимальное ожидаемое количество дней, которое потребуется Медузе для возвращения своей фуфу, если красота дорог выбрана оптимально. Выходные данные Выведите минимальное ожидаемое количество дней, необходимое Медузе для возвращения своей фуфу, если красота дорог выбрана оптимально. Ваш ответ будет принят, если абсолютная или относительная погрешность не превышает \(10^{-9}\). Формально пусть ваш ответ будет \(a\), а ответ жюри - \(b\). Ваш ответ считается правильным, если \(\frac{|a-b|}{\max(1,|b|)} \leq 10^{-9}\). Примечание В первом примере оптимальным назначением красоты является \(a=[1, 2, 5]\). Ожидаемое количество дней, необходимое Медузе для возвращения своей фуфу, составляет \(5.2\).
| |
|
|
D. Сумма функций XOR
битмаски
дп
Комбинаторика
математика
разделяй и властвуй
*1700
Дан массив \(a\) длины \(n\), состоящий из неотрицательных целых чисел. Необходимо вычислить значение \(\sum_{l=1}^{n} \sum_{r=l}^{n} f(l, r) \cdot (r - l + 1)\), где \(f(l, r)\) равно \(a_l \oplus a_{l+1} \oplus \dots \oplus a_{r-1} \oplus a_r\) (символ \(\oplus\) обозначает побитовое исключающее ИЛИ). Так как ответ может быть очень большим, выведите его по модулю \(998244353\). Выходные данные Выведите одно целое число — значение \(\sum_{l=1}^{n} \sum_{r=l}^{n} f(l, r) \cdot (r - l + 1)\), взятое по модулю \(998244353\). Примечание В первом примере ответ равен \(f(1, 1) + 2 \cdot f(1, 2) + 3 \cdot f(1, 3) + f(2, 2) + 2 \cdot f(2, 3) + f(3, 3) = \) \(= 1 + 2 \cdot 2 + 3 \cdot 0 + 3 + 2 \cdot 1 + 2 = 12\).
| |
|
|
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]\).
| |
|
|
D. Единицы и двойки
Бинарный поиск
математика
разделяй и властвуй
Структуры данных
*1700
Вам дан массив \(a\) длины \(n\) в \(1\)-нумерации, каждый элемент которого равен \(1\) или \(2\). Обработайте \(q\) запросов следующих двух типов: - «1 s»: проверить, существует ли подотрезок\(^{\dagger}\) массива \(a\), сумма которого равна \(s\).
- «2 i v»: заменить \(a_i\) на \(v\).
\(^{\dagger}\) Массив \(b\) является подотрезком массива \(a\), если \(b\) может быть получен из \(a\) путем удаления нескольких (возможно, нуля или всех) элементов из начала и нескольких (возможно, нуля или всех) элементов из конца. В частности, массив является подотрезком самого себя. Выходные данные Для каждого запроса с \(\mathrm{op}=1\) выведите в отдельной строке «YES», если существует подотрезок \(a\), сумма которого равна \(s\), в противном выведите «NO». Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание Рассмотрим первый набор входных данных: - Ответом на первый запрос будет «YES», потому что \(a_1+a_2+a_3=2+1+2=5\).
- Ответ на второй запрос — «YES», потому что \(a_1+a_2+a_3+a_4=2+1+2+1=6\).
- Ответом на третий запрос будет «NO», так как нельзя найти ни одного подотрезка \(a\), сумма которого равна \(7\).
- После четвертого запроса массив \(a\) становится равным \([2,1,2,2,2]\).
- Ответом на пятый запрос будет «YES», так как \(a_2+a_3+a_4+a_5=1+2+2+2=7\).
| |
|
|
H1. Цикличный Хэмминг (простая версия)
бпф
дп
математика
Перебор
разделяй и властвуй
теория чисел
*3400
Это простая версия задачи. Единственное различие между двумя версиями заключается в ограничениях на \(k\). Делать взломы можно только в том случае, если решены обе версии задачи. В этой задаче все строки индексируются с \(0\). Для двух строк \(a\), \(b\) одинаковой длины \(p\) определим следующие термины: - Расстояние Хэмминга между \(a\) и \(b\), обозначаемое как \(h(a, b)\), определяется как количество позиций \(i\) таких, что \(0 \le i < p\) и \(a_i \ne b_i\).
- \(b\) является циклическим сдвигом \(a\), если существует некоторое число \(0 \leq k < p\) такое, что \(b_{(i+k) \bmod p} = a_i\) для всех \(0 \le i < p\). Здесь \(x \bmod y\) обозначает остаток от деления \(x\) на \(y\).
Даны две бинарные строки \(s\) и \(t\) длиной \(2^{k+1}\) каждая. Обе строки могут содержать пропущенные символы (обозначаются символом «?»). Ваша задача — подсчитать количество способов заменить отсутствующие символы в обеих строках на символы «0» или «1» таким образом, чтобы: - каждая строка \(s\) и \(t\) содержала ровно \(2^k\) вхождений каждого символа «0» и «1»;
- \(h(s, c) \ge 2^k\) для всех строк \(c\), являющихся циклическим сдвигом \(t\).
Поскольку результат может быть очень большим, выведите его по модулю \(998\,244\,353\). Выходные данные Выведите одно целое число — ответ на задачу по модулю \(998\,244\,353\). Примечание В первом примере можно проверить, что для всех циклических сдвигов \(c\) из \(t\) выполняется условие \(h(s, c) \ge 2^k\). В частности: - Для \(c = \mathtt{0101}\), \(h(s, c) = h(\mathtt{0110}, \mathtt{0101}) = 2 \ge 2^1\).
- Для \(c = \mathtt{1010}\), \(h(s, c) = h(\mathtt{0110}, \mathtt{1010}) = 2 \ge 2^1\).
Во втором примере существует циклический сдвиг \(c\) строки \(t\) такой, что \(h(s, c) < 2^k\) (в частности, \(c = \mathtt{0011}\), и \(h(s, c) = h(\mathtt{0011}, \mathtt{0011}) = 0\)). В третьем примере существует \(2\) возможных способа восстановления недостающих символов: - \(s = \mathtt{0101}\), \(t = \mathtt{0110}\);
- \(s = \mathtt{0011}\), \(t = \mathtt{0101}\).
В четвертом примере существует \(3\) возможных способа восстановления пропущенных символов: - \(s = \mathtt{00011110}\), \(t = \mathtt{01010101}\);
- \(s = \mathtt{00011011}\), \(t = \mathtt{01010101}\);
- \(s = \mathtt{00001111}\), \(t = \mathtt{01010101}\).
| |
|
|
F. Вова и побег из матрицы
кратчайшие пути
Перебор
поиск в глубину и подобное
разделяй и властвуй
*2600
Вова находится в матрице \(n \times m\). Строки этой матрицы пронумерованы числами от \(1\) до \(n\) сверху вниз, а столбцы пронумерованы числами от \(1\) до \(m\) слева направо. Клетка \((i, j)\) — это клетка на пересечении строки \(i\) и столбца \(j\) для \(1 \leq i \leq n\) и \(1 \leq j \leq m\). Часть клеток матрицы заблокирована препятствиями (все остальные клетки свободны). Вова находится в одной из свободных клеток. Гарантируется, что клетки \((1, 1)\), \((1, m)\), \((n, 1)\), \((n, m)\) (то есть углы матрицы) заблокированы. Вова может перейти из одной свободной клетки в другую свободную клетку, если у них есть общая сторона. Вова может выйти из матрицы из любой свободной клетки на границе матрицы, такие клетки называются выходами. Тип матрицы зависит от количества выходов, которые Вова может использовать, чтобы выйти из матрицы. Существуют матрицы трёх типов: - \(1\)-го типа: матрицы без выходов, которые Вова может использовать.
- \(2\)-го типа: матрицы ровно с одним выходом, который Вова может использовать, чтобы покинуть матрицу.
- \(3\)-го типа: матрицы с несколькими (двумя или более) выходами, которые Вова может использовать, чтобы покинуть матрицу.
До того как Вова начнёт перемещаться, Миша может создать больше препятствий и заблокировать часть свободных клеток. При этом Миша не может менять тип матрицы. Какое максимальное количество клеток может заблокировать Миша, не изменяя тип матрицы? Миша не может заблокировать клетку, в которой сейчас находится Вова. Выходные данные Для каждого набора входных данных выведите одно число: максимальное количество клеток, которые может заблокировать Миша. Примечание В первом наборе входных данных дана матрица \(3\)-го типа. Миша может заблокировать все клетки, кроме клеток \((1, 3)\), \((2, 3)\), \((2, 4)\). Существует \(9\) таких клеток и их блокировка не меняет тип матрицы. Во втором наборе входных данных дана матрица \(3\)-го типа. Блокировка любой клетки меняет тип матрицы на \(2\)-й: один из двух выходов становится недостижимым для Вовы. Поэтому, ответ \(0\). В третьем наборе входных данных дана матрица \(1\)-го типа. В ней нет свободных клеток (кроме клетки Вовы), поэтому Миша не может заблокировать ни одну клетку. В четвёртом наборе входных данных дана матрица \(2\)-го типа. Миша может заблокировать \(3\) клетки \((5, 2)\), \((6, 3)\), \((6, 4)\), не изменяя тип матрицы. В пятом наборе входных данных дана матрица \(3\)-го типа. Миша может заблокировать \(4\) клетки \((2, 2)\), \((3, 2)\), \((4, 2)\), \((5, 2)\) либо \(4\) клетки \((2, 4)\), \((3, 4)\), \((4, 4)\), \((5, 4)\), не изменяя тип матрицы.
| |
|
|
E. Фея
поиск в глубину и подобное
разделяй и властвуй
снм
*2900
В давние-давние времена жила добрая фея А. Однажды пришел к ней добрый молодец Б и попросил предсказать ему будущее. Посмотрев в магический шар, А сказала, что скоро молодец встретит самую красивую принцессу на свете и женится на ней. Затем она нарисовала на бумаге n точек и соединила некоторые из них отрезками, каждый из которых начинается в некоторой точке и заканчивается в некоторой другой точке. Нарисовав этот рисунок, она попросила молодца стереть с бумаги ровно один отрезок. Затем она попытается окрасить каждую точку в красный или синий цвет так, чтобы не существовало отрезка, оба конца которого окрашены в одинаковый цвет. Если у нее получится это сделать, то гадание сбудется. Б очень хочет, чтобы это случилось, и поэтому он просит Вас помочь ему. Найдите все отрезки, которые помогут ему встретить принцессу. Выходные данные В первую строку ответа выведите число k — количество отрезков в ответе. Во второй строке выведите k чисел, разделенные одним пробелом — номера этих отрезков в возрастающем порядке. Каждый номер нужно выводить ровно один раз. Отрезки нумеруются с 1 в том порядке, в котором они заданы во входных данных.
| |
|
|
F. Снова деревья и XOR-запросы
графы
Деревья
математика
поиск в глубину и подобное
разделяй и властвуй
реализация
Структуры данных
*2400
Вам дано дерево, состоящее из \(n\) вершин. На каждой вершине написано целое число; на \(i\)-й вершине написано число \(a_i\). Вам необходимо обработать \(q\) запросов. \(i\)-й запрос состоит из трех целых чисел \(x_i\), \(y_i\) и \(k_i\). Для этого запроса вы должны ответить, возможно ли выбрать набор вершин \(v_1, v_2, \dots, v_m\) (возможно, пустой) так, чтобы: - каждая вершина \(v_j\) находилась на простом пути между \(x_i\) и \(y_i\) (в том числе можно использовать концы пути);
- \(a_{v_1} \oplus a_{v_2} \oplus \dots \oplus a_{v_m} = k_i\), где \(\oplus\) обозначает оператор побитового исключающего ИЛИ.
Выходные данные Для каждого запроса выведите YES, если возможно сформировать набор вершин, удовлетворяющий ограничениям. В противном случае выведите NO. Каждую букву можно выводить в любом регистре.
| |
|
|
D2. Максимум и запросы (сложная версия)
битмаски
дп
жадные алгоритмы
разделяй и властвуй
*2500
Это сложная версия задачи. Единственное различие между двумя версиями — это ограничения на \(n\) и \(q\), а также ограничения по времени и памяти. Вы можете делать взломы, только если обе версии задачи решены. Теофанису очень нравится играть с битами чисел. У него есть массив \(a\) длины \(n\) и целое число \(k\). Он может совершить не более \(k\) операций с массивом, в каждой из которых он выбирает один элемент и увеличивает его на \(1\). Он нашел максимальное побитовое И, которое может иметь массив \(a\) после выполнения не более чем \(k\) операций. Теофанис приложил много усилий, чтобы найти это значение, и был очень доволен своим результатом. К сожалению, Адас, будучи злым человеком, решил поиздеваться над ним, неоднократно меняя значение \(k\). Помогите Теофанису, вычислив максимально возможное побитовое И для \(q\) различных значений \(k\). Выходные данные Для каждого запроса выведите одно целое число — максимальное побитовое И, которое может иметь массив \(a\) после выполнения не более чем \(k_i\) операций. Примечание В первом наборе входных данных, в первом запросе, мы добавляем \(1\) к первому и последнему элементу массива. Таким образом, массив становится равен \([2,3,7,6]\) с побитовым И, равным \(2\). Во втором наборе входных данных, в первом запросе, мы добавляем \(1\) к первому элементу, \(5\) ко второму и \(3\) к третьему, после чего все элементы становятся равны \(5\).
| |
|
|
D2. Присвоить максимум (сложная версия)
жадные алгоритмы
Конструктив
разделяй и властвуй
реализация
сортировки
Структуры данных
*1800
Это сложная версия задачи. Единственное различие между двумя версиями — это ограничение на \(n\) и ограничение по времени. Вы можете делать взломы, только если обе версии задачи решены. Вам даны два массива \(a\) и \(b\) длины \(n\). Вы можете выполнить следующую операцию несколько (возможно, ноль) раз: - выбрать \(l\) и \(r\) такие, что \(1 \leq l \leq r \leq n\).
- пусть \(x=\max(a_l,a_{l+1},\ldots,a_r)\).
- для всех \(l \leq i \leq r\), присвоить \(a_i := x\).
Определите, можно ли сделать массив \(a\) равным массиву \(b\). Выходные данные Для каждого набора входных данных выведите «YES» (без кавычек), если вы можете превратить \(a\) в \(b\) с помощью данных операций, и «NO» (без кавычек) в противном случае. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В первом наборе входных данных мы можем получить массив \(b\), применив единственную операцию: \((l,r)=(2,3)\). Во втором наборе входных данных можно показать, что мы не можем получить массив \(b\) ни при каком количестве операций. В третьем наборе входных данных массив \(b\) можно получить, применив две операции: \((l,r)=(2,5)\) и \((l,r)=(1,3)\). В четвертом и пятом наборах входных данных можно показать, что массив \(b\) не может быть получен ни при каком количестве операций.
| |
|
|
F. Поле не должно быть пустым
Перебор
разделяй и властвуй
Структуры данных
*2600
Вам дана перестановка\(^{\dagger}\) \(p\) длины \(n\). Мы называем индекс \(x\) хорошим, если для всех \(y < x\) выполняется условие \(p_y < p_x\), и для всех \(y > x\) выполняется условие \(p_y > p_x\). Обозначим \(f(p)\) как количество хороших индексов в \(p\). Вы можете выполнить следующую операцию: выберите \(2\) различных индекса \(i\) и \(j\) и поменяйте местами элементы \(p_i\) и \(p_j\). Найдите максимальное значение \(f(p)\) после применения вышеупомянутой операции ровно один раз. \(^{\dagger}\)Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)). Выходные данные Для каждого набора входных данных выведите одно целое число — максимальное значение \(f(p)\) после выполнения операции ровно один раз. Примечание В первом наборе входных данных \(p = [1,2,3,4,5]\) и \(f(p)=5\), что уже является максимально возможным. Но операцию нужно выполнить в любом случае. Мы можем получить \(f(p)=3\), выбрав \(i=1\) и \(j=2\), после чего \(p = [2,1,3,4,5]\). Во втором наборе входных данных мы можем преобразовать \(p\) в \([1,2,3,4,5]\), выбрав \(i=1\) и \(j=2\). Таким образом, \(f(p)=5\).
| |
|
|
K. Deck-Building Game
математика
разделяй и властвуй
*2500
You are playing a deck-building game with your friend. There are \(N\) cards, numbered from \(1\) to \(N\). Card \(i\) has the value of \(A_i\). You want to build two decks; one for you and one for your friend. A card cannot be inside both decks, and it is allowed to not use all \(N\) cards. It is also allowed for a deck to be empty, i.e. does not contain any cards. The power of a deck is represented as the bitwise XOR of the value of the cards in the deck. The power of an empty deck is \(0\). The game is balanced if both decks have the same power. Determine the number of ways to build two decks such that the game is balanced. Two ways are considered different if one of the decks contains at least one different card. Since the answer can be very large, calculate the answer modulo \(998\,244\,353\). Output Output an integer representing the number of ways to build two decks such that the game is balanced. Output the answer modulo \(998\,244\,353\). Note Explanation for the sample input/output #1 Denote \(S\) and \(T\) as the set of cards in your deck and your friend's deck, respectively. There are \(9\) ways to build the decks such that the game is balanced. - \(S = \{\}\) and \(T = \{\}\). Both decks have the power of \(0\).
- \(S = \{2, 3, 4\}\) and \(T = \{\}\). Both decks have the power of \(0\).
- \(S = \{\}\) and \(T = \{2, 3, 4\}\). Both decks have the power of \(0\).
- \(S = \{2, 4\}\) and \(T = \{3\}\). Both decks have the power of \(4\).
- \(S = \{3\}\) and \(T = \{2, 4\}\). Both decks have the power of \(4\).
- \(S = \{2, 3\}\) and \(T = \{4\}\). Both decks have the power of \(8\).
- \(S = \{4\}\) and \(T = \{2, 3\}\). Both decks have the power of \(8\).
- \(S = \{3, 4\}\) and \(T = \{2\}\). Both decks have the power of \(12\).
- \(S = \{2\}\) and \(T = \{3, 4\}\). Both decks have the power of \(12\).
Explanation for the sample input/output #2 The only way to make the game balanced is to have both decks empty. Explanation for the sample input/output #3 There are \(5\) ways to build the decks such that the game is balanced. - \(S = \{\}\) and \(T = \{\}\). Both decks have the power of \(0\).
- \(S = \{1, 2\}\) and \(T = \{\}\). Both decks have the power of \(0\).
- \(S = \{\}\) and \(T = \{1, 2\}\). Both decks have the power of \(0\).
- \(S = \{1\}\) and \(T = \{2\}\). Both decks have the power of \(1\).
- \(S = \{2\}\) and \(T = \{1\}\). Both decks have the power of \(1\).
| |
|
|
D. Схлопывание массива
Деревья
дп
разделяй и властвуй
Структуры данных
*2100
Вам дан массив \([p_1, p_2, \dots, p_n]\), где все элементы различны. Вы можете выполнить несколько (возможно, ни одной) операций с ним. В одной операции вы можете выбрать непрерывный подотрезок \(p\) и удалить все элементы из этого подотрезка, кроме минимального элемента в этом подотрезке. Например, если \(p = [3, 1, 4, 7, 5, 2, 6]\) и вы выберете подотрезок от \(3\)-го элемента до \(6\)-го элемента, полученный массив будет \([3, 1, 2, 6]\). Массив \(a\) называется достижимым, если его можно получить из \(p\) с помощью нескольких (возможно, нуля) вышеупомянутых операций. Вычислите количество достижимых массивов и выведите его по модулю \(998244353\). Выходные данные Для каждого теста выведите одно целое число — количество достижимых массивов, взятое по модулю \(998244353\).
| |
|
|
F. Приветствия
разделяй и властвуй
сортировки
Структуры данных
*1500
На числовой прямой находятся \(n\) человек; \(i\)-й человек находится в точке \(a_i\) и хочет попасть в точку \(b_i\). Для каждого человека \(a_i < b_i\), и начальные и конечные точки всех людей различны. (То есть все \(2n\) чисел \(a_1, a_2, \dots, a_n, b_1, b_2, \dots, b_n\) различны.) Все люди начнут двигаться одновременно со скоростью \(1\) единица в секунду, пока не достигнут своей конечной точки \(b_i\). Когда два человека встречаются в одной точке, они поздороваются один раз. Сколько будет приветствий? Обратите внимание, что человек все еще может поздороваться с другими людьми, даже если они достигли своей конечной точки. Выходные данные Для каждого набора входных данных выведите одно целое число, обозначающее количество приветствий, которые произойдут. Примечание В первом наборе входных данных два человека встретятся в точке \(3\) и поздороваются.
| |
|
|
G. Оптимизации из ЧелГУ
Деревья
дп
разделяй и властвуй
теория чисел
*3500
Вам дано дерево на \(n\) вершинах, вершины которого пронумерованы числами от \(1\) до \(n\). На каждом ребре записано некоторое целое число \(w_i\). Определим \(len(u, v)\) как количество ребер в простом пути между вершинами \(u\) и \(v\), \(gcd(u, v)\) как Наибольший Общий Делитель всех чисел, записанных на ребрах простого пути между вершинами \(u\) и \(v\). Например, \(len(u, u) = 0\) и \(gcd(u, u) = 0\) для любого \(1 \leq u \leq n\). Вам нужно найти наибольшее значение \(len(u, v) \cdot gcd(u, v)\) по всем парам вершин в дереве. Выходные данные Для каждого набора входных данных выведите единственное число равное наибольшему значению \(len(u, v) \cdot gcd(u, v)\) по всем парам вершин в дереве.
| |
|
|
E. ace5 и порядок задач
интерактив
Конструктив
разделяй и властвуй
реализация
сортировки
Теория вероятностей
*2200
Это интерактивная задача! В новом раунде было \(n\) задач, сложности от \(1\) до \(n\). Координатор, решив сделать первый раунд с неотсортированными по сложности задачами, переставил задачи, получив перестановку сложностей от \(1\) до \(n\). После этого координатор предложил ace5 угадать перестановку следующим образом. Координатор загадывает число \(x\) от \(1\) до \(n\). ace5 может делать запросы типа: \(?\ i\). Ответом будет: - \(>\), если \(a_i > x\), после этого \(x\) увеличивается на \(1\).
- \(<\), если \(a_i < x\), после этого \(x\) уменьшается на \(1\).
- \(=\), если \(a_i = x\), после этого \(x\) не меняется.
Задача ace5 — отгадать перестановку не более чем за \(40n\) запросов. Так как ace5 слишком занят написанием анонса, он поручил эту задачу Вам. Протокол взаимодействия Взаимодействие Вашей программы с программой жюри в каждом тестовом случае начинается со считывания целого положительного числа \(n\) (\(1 \leq n \leq 2000\)) — длины загаданной перестановки. Чтобы сделать запрос, выведите строку в формате «? i», где \(1 \leq i \leq n\). В качестве ответа вы получите: - «>», если \(a_i\) > \(x\), после этого \(x\) увеличится на \(1\).
- «<», если \(a_i\) < \(x\), после этого \(x\) уменьшится на \(1\).
- «=», если \(a_i\) = \(x\), после этого \(x\) не изменится.
Вы можете сделать не более \(40n\) запросов. Чтобы вывести ответ, необходимо напечатать «! a_1 a_2 ... a_n», где \(1 \leq a_i \leq n\), все они различны. Вывод ответа не считается за запрос. Если ваша программа сделает более \(40n\) запросов для одного набора входных данных, или сделает некорректный запрос, то ответом на запрос будет -1, после получения такого ответа ваша программа должна немедленно завершится, чтобы получить вердикт Неправильный ответ. Иначе она может получить любой другой вердикт. После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Гарантируется, что сумма \(n\) по всем тестовым случаям не превосходит \(2000\). Интерактор в этой задаче не является адаптивным. Взломы: Чтобы сделать взлом, используйте следующий формат: В первой строке находится одно целое число \(t\) — количество тестовых случаев. Описание каждого тестового случая должно состоять из двух строк. В первой строке находятся числа \(n\) и \(x\) (\(1 \leq x \leq n \leq 2000\)) — длина загаданной перестановки и изначальное значение числа \(x\). Во второй строке находятся \(n\) различных чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq n\)) — перестановка, которую должно загадать жюри в данном тестовом случае. Сумма \(n\) по всем запросам не должна превосходить \(2000\). Примечание В первом тесте загадана перестановка \(a\) = [\(2,4,1,5,3\)], и значение \(x\) изначально равно \(3\). Во втором тесте загадана перестановка \(a\) = [\(2,1\)], \(x\) изначально равен \(1\).
| |
|
|
G. Легендарный древесный гроссмейстер
Деревья
игры
Конструктив
разделяй и властвуй
*3500
В мире деревьев есть популярная игра для двух игроков, которая проводится на дереве с \(n\) вершинами, пронумерованными от \(1\) до \(n\). В этой игре ведущие турнира сначала выбирают вершину, которая будет корнем дерева, и выбирают другую вершину (возможно, ту же самую, что и корень), на которую кладут монету. Затем каждый игрок по очереди перемещает монету в любую дочернюю\(^\dagger\) вершину вершины, на которой в данный момент находится монета. Первый игрок, который не может сделать ход, проигрывает. Алиса хочет стать легендарным древесным гроссмейстером, поэтому она тратит много времени на изучение игры. Она записала матрицу \(s\) размером \(n\) на \(n\), где \(s_{i,j} = \mathtt{1}\), если первый игрок может выиграть, если корнем дерева выбрана вершина \(i\), а монета изначально была помещена на вершину \(j\). В противном случае \(s_{i, j} = \mathtt{0}\). Алиса — перфекционистка, поэтому она предполагает, что оба игрока играют идеально. Однако по дороге на турнир она случайно ударилась головой и забыла, как выглядит дерево. Определите, существует ли дерево, которое удовлетворяет выигрышным и проигрышным состояниям, представленным матрицей \(s\), и если существует, постройте подходящее дерево. \(^\dagger\) Вершина \(c\) является дочерней по отношению к вершине \(u\), если между \(c\) и \(u\) есть ребро, и \(c\) не лежит на единственном простом пути из корня в вершину \(u\). Выходные данные Если не существует дерева, удовлетворяющего выигрышным и проигрышным состояниям, представленным матрицей \(s\), выведите единственную строку, содержащую «NO». В противном случае, если существует дерево, удовлетворяющее матрице \(s\), выведите «YES» в первой строке, а затем \(n - 1\) строку, каждая из которых содержит два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\)), означающих, что дерево имеет ребро между вершинами \(u\) и \(v\). Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Если существует несколько деревьев, удовлетворяющих матрице \(s\), выведите любое из них. Примечание В первом наборе входных данных граф \(1\!-\!4\!-\!2\!-\!3\) удовлетворяет выигрышным и проигрышным состояниям, представленным матрицей \(s\). Например, \(s_{3,3} = 1\), так как первый игрок может переместить монету из \(3\rightarrow 2\), затем второй игрок перемещает монету из \(2\rightarrow 4\), и, наконец, первый игрок перемещает монету из \(4\rightarrow 1\). В этот момент у вершины \(1\) нет детей, поэтому второй игрок не может сделать ход и проигрывает. С другой стороны, \(s_{1,3} = 0\), так как если \(1\) является корнем, то у \(3\) нет детей, поэтому первый игрок не может сделать первый ход и проигрывает. Во втором наборе входных данных можно показать, что ни одно дерево не удовлетворяет матрице \(s\).
| |
|
|
G. Озорной стрелок
дп
Перебор
разделяй и властвуй
реализация
Структуры данных
*2200
Однажды непутёвый озорной стрелок по имени Шел попал на прямоугольное поле размером \(n \times m\), разбитое на единичные квадратики. В каждой из клеток либо стоит мишень, либо нет. С собой у Шел оказался только счастливый дробовик, из которого можно выстрелить в одну из четырёх сторон: вправо-вниз, влево-вниз, влево-вверх или вправо-вверх. При выстреле дробовик поражает все мишени в выбранном направлении, Манхэттенское расстояние до которых не больше фиксированной для дробовика константы \(k\). Манхэттенское расстояние между двумя точками \((x_1, y_1)\) и \((x_2, y_2)\) равно \(|x_1 - x_2| + |y_1 - y_2|\). Возможные области поражения для \(k = 3\). Цель Шел — поразить как можно большее количество мишеней. Помогите ему, пожалуйста, найти это значение. Выходные данные Для каждого набора входных данных в отдельной строке выведите одно число, которое равно максимально возможному количеству поражённых мишеней за один выстрел. Примечание Возможные оптимальные выстрелы для примеров из условия:
| |
|
|
E. Возрастающие подпоследовательности
битмаски
жадные алгоритмы
Конструктив
математика
разделяй и властвуй
*1800
Напомним, что возрастающая подпоследовательность массива \(a\) — это последовательность, которую можно получить из массива, удалив некоторые элементы, не изменяя порядок оставшихся элементов, и оставшиеся элементы строго возрастают (т.е. \(a_{b_1} < a_{b_2} < \dots < a_{b_k}\) и \(b_1 < b_2 < \dots < b_k\)). Обратите внимание, что пустая подпоследовательность также является возрастающей. Вам дано положительное целое число \(X\). Ваша задача — найти массив целых чисел длиной не более \(200\), такой, что у него ровно \(X\) возрастающих подпоследовательностей, или сообщить, что такого массива нет. Если есть несколько ответов, вы можете вывести любой из них. Если две подпоследовательности состоят из одинаковых чисел, но позиции элементов исходного массива, входящих в подпоследовательность, отличаются, то эти подпоследовательности считаются различными (например, у массива \([2, 2]\) две разных подпоследовательности, равных \([2]\)). Выходные данные Для каждого набора входных данных выведите ответ для него. Если невозможно найти требуемый массив, выведите -1 в первой строке. В противном случае выведите положительное целое число \(n\) в первой строке — длину массива. Во второй строке выведите \(n\) целых чисел — элементы искомого массив. Если есть несколько ответов, вы можете вывести любой из них. Все элементы массива должны находиться в диапазоне \([-10^9; 10^9]\).
| |
|
|
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\).
| |
|
|
E. Очередная очередная задача про перестановки
бпф
математика
разделяй и властвуй
*3400
Дана перестановка \(p\) длины \(n\). Найдите количество перестановок \(q\) длины \(n\), которые удовлетворяют следующему условию: - для каждого \(1 \le i < n\), \(\max(q_1,\ldots,q_i) \neq \max(p_1,\ldots,p_i)\).
Поскольку ответ может быть очень большим, выведите ответ по модулю \(998\,244\,353\). Выходные данные Для каждого набора входных данных выведите одно число — ответ по модулю \(998\,244\,353\). Примечание В первом наборе входных данных \(p = [2, 1]\). Единственной подходящей \(q\) является \([1, 2]\). Действительно, нам нужно выполнить неравенство \(q_1 \neq p_1\). Оно выполнено только для \(q = [1, 2]\). Во втором наборе входных данных \(p = [1, 2, 3]\). Так что \(q\) должна удовлетворять двум неравенствам: \(q_1 \neq p_1\) и \(\max(q_1, q_2) \neq \max(1, 2) = 2\). Можно доказать, что это выполняется только для следующих \(3\) перестановок: - \(q = [2, 3, 1]\): в этом случае \(q_1 = 2 \neq 1\) and \(\max(q_1, q_2) = 3 \neq 2\);
- \(q = [3, 1, 2]\): в этом случае \(q_1 = 3 \neq 1\) and \(\max(q_1, q_2) = 3 \neq 2\);
- \(q = [3, 2, 1]\): в этом случае \(q_1 = 3 \neq 1\) and \(\max(q_1, q_2) = 3 \neq 2\).
| |
|
|
E. Без палиндромов
жадные алгоритмы
Конструктив
математика
Перебор
разделяй и властвуй
реализация
Строки
хэши
*2000
Вам дана строка \(s\), состоящая из строчных латинских букв. Вам нужно разбить\(^\dagger\) эту строку на некоторое количество подстрок так, чтобы каждая подстрока не была палиндромом\(^\ddagger\). \(^\dagger\) Разбиение строки \(s\) — это упорядоченная последовательность некоторых \(k\) строк \(t_1, t_2, \ldots, t_k\), таких, что \(t_1 + t_2 + \ldots + t_k = s\), где \(+\) обозначает операцию конкатенации. \(^\ddagger\) Строка \(s\) называется палиндромом, если она читается одинаково как слева направо, так и справа налево. Например, \(\mathtt{racecar}\), \(\mathtt{abccba}\) и \(\mathtt{a}\) являются палиндромами, а \(\mathtt{ab}\), \(\mathtt{dokibird}\) и \(\mathtt{kurosanji}\) — нет. Выходные данные Для каждого набора входных данных выведите в отдельной строке «YES», если существует разбиение \(s\), части которого не являются палиндромами, или «NO», если такого разбиения не существует. Если ответ «YES», то во второй строке выведите целое число \(k\) — количество частей, на которое нужно разбить \(s\), чтобы каждая часть не была палиндромом. В третьей строке выведите \(k\) строк \(t_1, t_2, \ldots, t_k\), представляющих такое разбиение. Если таких разбиений несколько, выведите любое из них. Примечание В первом наборе входных данных, поскольку \(\mathtt{sinktheyacht}\) уже не является палиндромом, разбиение \([\mathtt{sinktheyacht}]\) является допустимым. Во втором наборе входных данных, поскольку любая подстрока строки \(s\) является палиндромом, не существует допустимых разбиений. В третьем наборе входных данных еще одно допустимое разбиение — \([\mathtt{uw},\mathtt{uo}, \mathtt{wou}, \mathtt{wu}]\).
| |
|
|
D. Нина и MEX
битмаски
дп
жадные алгоритмы
Конструктив
математика
Перебор
разделяй и властвуй
реализация
*2000
Нина дала вам массив целых чисел \(a_1, a_2, \ldots, a_n\) длины \(n\). Вы можете выполнить следующую операцию не более \(5\cdot 10^5\) раз (возможно, ноль): - Выбрать два целых числа \(l\) и \(r\) таких, что \(1 \le l \le r \le n\), вычислить \(x\) как \(\operatorname{MEX}(\{a_l, a_{l+1}, \ldots, a_r\})\), и одновременно присвоить \(a_l:=x, a_{l+1}:=x, \ldots, a_r:=x\).
Здесь \(\operatorname{MEX}\) множества целых чисел \(\{c_1, c_2, \ldots, c_k\}\) определяется как наименьшее неотрицательное целое число \(m\), которое не встречается в множестве \(c\). Ваша цель — максимизировать сумму элементов массива \(a\). Найдите максимальную сумму и постройте последовательность операций, которая достигает этой суммы. Обратите внимание, что вам не нужно минимизировать количество операций в этой последовательности, вам лишь нужно использовать не более \(5\cdot 10^5\) операций в вашем решении. Выходные данные В первой строке выведите два целых числа \(s\) и \(m\) (\(0\le m\le 5\cdot 10^5\)) — максимальную сумму элементов массива \(a\) и количество операций в вашем решении. В \(i\)-й из следующих \(m\) строк выведите два целых числа \(l\) и \(r\) (\(1 \le l \le r \le n\)), представляющие параметры \(i\)-й операции. Можно показать, что максимальная сумма элементов массива \(a\) всегда может быть получена не более чем за \(5 \cdot 10^5\) операций. Примечание В первом примере, после операции с \(l=1\) и \(r=2\) массив \(a\) становится равным \([2,2]\). Можно показать, что невозможно достичь большей суммы элементов \(a\), поэтому ответ \(4\). Во втором примере, начальная сумма элементов равна \(13\), а достичь большей суммы невозможно. В третьем примере массив \(a\) изменяется следующим образом: - после первой операции (\(l=3\), \(r=3\)), массив \(a\) становится равным \([1,100,0,1]\);
- после второй операции (\(l=3\), \(r=4\)), массив \(a\) становится равным \([1,100,2,2]\).
Можно показать, что большей суммы элементов \(a\) достичь невозможно, поэтому ответ \(105\).
| |
|
|
F1. Несоответствие частот (простая версия)
Бинарный поиск
Деревья
разделяй и властвуй
Структуры данных
Теория вероятностей
хэши
*2600
Это простая версия задачи. Единственное отличие между версиями — ограничение на \(k\). Вы можете делать взломы, только если обе версии задачи решены. Вам дано неориентированное дерево из \(n\) вершин. На каждой вершине \(v\) записано значение \(a_v\). Вы должны ответить на запросы, связанные с деревом. Вам дано \(q\) запросов. В каждом запросе дается \(5\) целых чисел, \(u_1, v_1, u_2, v_2, k\). Обозначим количество вершин со значением \(c\) на пути \(u_1 \rightarrow v_1\) как \(x_c\), а количество вершин со значением \(c\) на пути \(u_2 \rightarrow v_2\) как \(y_c\). Пусть существует \(z\) таких значений \(c\), что \(x_c \neq y_c\). Тогда выведите любые \(\min(z, k)\) таких значений в любом порядке. Выходные данные Для каждого запроса выведите ответ на отдельной строке. Для каждого запроса сначала выведите \(\min(z, k)\), а затем в той же строке выведите любые \(\min(z, k)\) значений, которые встречаются разное количество раз на путях, в любом порядке. Примечание Для \(1\) запроса первый путь: \(1 \rightarrow 2 \rightarrow 4\), на котором встречается мультинабор значений \(\{5, 2, 4\}\). На втором пути \(4 \rightarrow 2 \rightarrow 5\) мы имеем мультинабор \(\{4, 2, 3\}\). Два числа — \(3\) и \(5\) встречаются разное количество раз, поэтому мы выводим одно из них. Во \(2\) запросе пути совпадают, поэтому выводим \(0\). В \(3\) запросе первый путь — только вершина \(5\), что приводит к мультинабору \(\{3\}\), а второй путь — \(4 \rightarrow 2 \rightarrow 1 \rightarrow 3\) дает \(\{4, 2, 5, 3\}\). Числа \(5\), \(2\) и \(4\) встречаются разное количество раз.
| |
|
|
C. Нарисуйте дерево
геометрия
Деревья
Конструктив
разделяй и властвуй
сортировки
*2200
Даны дерево с n вершинами и n точек на плоскости, никакие три из которых не лежат на одной прямой. Вам надо нарисовать заданное дерево на плоскости, используя заданные точки в качестве вершин. То есть каждой вершине дерева нужно сопоставить ровно одну точку, и каждая точка должна быть сопоставлена какой-либо вершине. Если две вершины дерева соединены ребром, между соответствующими точками должен быть нарисован отрезок. Отрезки, соответствующие несмежным ребрам, не должны иметь общих точек. Отрезки, соответствующие смежным ребрам, должны иметь ровно одну общую точку. Выходные данные Выведите n различных целых чисел от 1 до n через пробел: i-ое число должно равняться номеру вершины, которую надо поместить в i-ую точку (точки нумеруются в порядке их перечисления во входных данных). Если существует несколько решений, выведите любое. Примечание Возможные ответы для примеров приведены ниже.
| |
|
|
E. Уникальный массив
Бинарный поиск
дп
жадные алгоритмы
разделяй и властвуй
Структуры данных
*2400
Задан целочисленный массив \(a\) размера \(n\). Подмассивом массива \(a\) назовем его непрерывную подпоследовательность (то есть массив \([a_l, a_{l+1}, \dots, a_r]\) для некоторых \(l\) и \(r\), удовлетворяющих условию \(1 \le l < r \le n\)). Назовем подмассив уникальным, если в нем есть целое число, которое встречается ровно один раз. Вы можете выполнять следующую операцию любое количество раз (возможно, ни разу): выберите элемент массива и замените его любым целым числом. Ваша задача — посчитать минимальное количество вышеописанных операций, чтобы все подмассивы массива \(a\) стали уникальными. Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество вышеописанных операций, чтобы все подмассивы массива \(a\) стали уникальными. Примечание Во втором наборе входных данных можно заменить \(1\)-й и \(3\)-й элемент, например, следующим образом: \([3, 4, 1, 4]\). В третьем наборе входных данных можно заменить \(4\)-й элемент, например, следующим образом: \([3, 1, 2, 3, 2]\).
| |
|
|
F. Множество
битмаски
дп
Комбинаторика
математика
Перебор
поиск в глубину и подобное
разделяй и властвуй
*2600
Определим бинарное кодирование конечного множества целых неотрицательных чисел \(T \subseteq \{0,1,2,\ldots\}\) как \(f(T) = \sum\limits_{i \in T} 2^i\). Например, \(f(\{0,2\}) = 2^0 + 2^2 = 5\) и \(f(\{\}) = 0\). Обратите внимание, что \(f\) — это биекция от всех таких множеств ко всем неотрицательным целым числам. Таким образом, \(f^{-1}\) также определено. Дано целое число \(n\) и \(2^n-1\) множество \(V_1,V_2,\ldots,V_{2^n-1}\). Найдите все множества \(S\), которые удовлетворяют следующим ограничениям: - \(S \subseteq \{0,1,\ldots,n-1\}\). Заметим, что \(S\) может быть пустым.
- Для всех непустых \(T \subseteq \{0,1,\ldots,n-1\}\) выполнено \(|S \cap T| \in V_{f(T)}\).
Для экономии входные и выходные данные будут заданы в терминах двоичных кодировок множеств. Выходные данные Первая строка вывода должна содержать целое число \(k\), обозначающее количество подходящих \(S\). В следующих \(k\) строках вы должны вывести \(f(S)\) для всех подходящих \(S\) в порядке возрастания. Примечание В первом примере одним из возможных \(S\) является \(f^{-1}(3) = \{0,1\}\). Все непустые подмножества \(T \subseteq \{0,1,2\}\) и соответствующие им \(|S \cap T|\), \(f(T)\) и \(V_f(T)\) имеют следующий вид: | \(T\) | \(|S\cap T|\) | \(f(T)\) | \(V_{f(T)}\) | | \(\{0\}\) | \(1\) | \(1\) | \(\{0,1,2,3\}\) | | \(\{1\}\) | \(1\) | \(2\) | \(\{0,1,2,3\}\) | | \(\{2\}\) | \(0\) | \(4\) | \(\{0,1,2,3\}\) | | \(\{0,1\}\) | \(2\) | \(3\) | \(\{0,1,2,3\}\) | | \(\{0,2\}\) | \(1\) | \(5\) | \(\{0,1,2,3\}\) | | \(\{1,2\}\) | \(1\) | \(6\) | \(\{0,1,2,3\}\) | | \(\{0,1,2\}\) | \(2\) | \(7\) | \(\{2,3\}\) |
| |
|
|
D. Инвертируемые скобочные последовательности
Бинарный поиск
Комбинаторика
разделяй и властвуй
реализация
Структуры данных
*2000
Правильная скобочная последовательность — это скобочная последовательность, которую можно превратить в корректное арифметическое выражение, вставив символы '1' и '+' между исходными символами. Например: - скобочные последовательности «()()» и «(())» — правильные (из них можно получить выражения «(1)+(1)» и «((1+1)+1)»);
- скобочные последовательности «)(», «(» и «)» — неправильные.
Давайте определим инверсию скобочной последовательности следующим образом: заменить все скобки '(' на ')', и наоборот (все скобки ')' на '('). Например, строки «()((» и «)())» являются инверсиями друг друга. Задана правильная скобочная последовательность \(s\). Ваша задача — посчитать количество таких пар целых чисел \((l,r)\) (\(1 \le l \le r \le |s|\)), что если заменить всю подстроку \(s\) с \(l\)-го символа по \(r\)-й символ (включительно) на ее инверсию, \(s\) все еще будет правильной скобочной последовательностью. Выходные данные Для каждого набора входных данных выведите одно целое число — количество пар \((l,r)\), удовлетворяющих условию задачи. Примечание В первом примере есть только одна пара: - \((2, 3)\): (()) \(\rightarrow\) ()().
Во втором примере подходящих пар нет. В третьем примере есть три подходящих пары: - \((2, 3)\): ()()() \(\rightarrow\) (())();
- \((4, 5)\): ()()() \(\rightarrow\) ()(());
- \((2, 5)\): ()()() \(\rightarrow\) (()());
| |
|
|
E. Количество k-хороших подотрезков
meet-in-the-middle
битмаски
дп
Комбинаторика
математика
Перебор
разделяй и властвуй
*2300
Обозначим за \(bit(x)\) количество единичных бит в двоичной записи неотрицательного целого числа \(x\). Назовем подотрезок массива \(k\)-хорошим, если он состоит только из чисел, в которых не более \(k\) единичных бит, то есть подотрезок \((l, r)\) массива \(a\) хороший, если для любого \(i\), такого, что \(l \le i \le r\) выполняется \(bit(a_{i}) \le k\). У вас есть массив \(a\) длины \(n\), состоящий из последовательных неотрицательных целых чисел начиная с \(0\), то есть \(a_{i} = i\) для \(0 \le i \le n - 1\) (в \(0\)-индексации). Вам необходимо посчитать количество \(k\)-хороших подотрезков в этом массиве. Поскольку ответ может быть очень большим, выведите его по модулю \(10^{9} + 7\). Выходные данные Для каждого набора входных данных в отдельной строке выведите одно целое число — количество \(k\)-хороших подотрезков по модулю \(10^{9} + 7\). Примечание Для первого набора входных данных \(a = [0, 1, 2, 3, 4, 5]\), \(k = 1\). Чтобы найти ответ, давайте запишем все числа в двоичной записи: \(\)a = [\color{green}{000}, \color{green}{001}, \color{green}{010}, \color{red}{011}, \color{green}{100}, \color{red}{101}]\(\) Отсюда видно, что числа \(3\) и \(5\) имеют \(2 \ge (k = 1)\) единичных бита в двоичной записи, поэтому в ответ должны войти все подотрезки, в которых нет ни \(3\), ни \(5\), это отрезки (в \(0\)-индексации): (\(0\), \(0\)), (\(0\), \(1\)), (\(0\), \(2\)), (\(1\), \(1\)), (\(1\), \(2\)), (\(2\), \(2\)), (\(4\), \(4\)).
| |
|
|
D. Дилемма обмена
жадные алгоритмы
Конструктив
математика
разделяй и властвуй
сортировки
Структуры данных
*1700
Даны два массива \(a\) и \(b\) длины \(n\), состоящих из различных целых положительных чисел, и мы хотим сделать массивы равными. Два массива \(x\) и \(y\) длины \(k\) называются равными, если для всех \(1 \le i \le k\) выполняется \(x_i = y_i\). За один ход можно выбрать некоторые индексы \(l\) и \(r\) в \(a\) (\(l \le r\)) и поменять местами \(a_l\) и \(a_r\), затем выбрать некоторые \(p\) и \(q\) (\(p \le q\)) в \(b\) такие, что \(r-l=q-p\), и поменять местами \(b_p\) и \(b_q\). Можно ли сделать массивы одинаковыми? Выходные данные Для каждого набора входных данных выведите «YES», если массивы \(a\) и \(b\) можно сделать одинаковыми. В противном случае выведите «NO». Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В первом наборе входных данных не нужно выполнять никаких операций, поскольку массивы уже равны. Для второго набора входных данных можно доказать, что не существует способа сделать массивы одинаковыми. В третьем наборе входных данных один из способов сделать массивы равными такой: на первом ходу выбрать \(l=1\), \(r=3\), \(p=1\), \(q=3\), на втором выбрать \(l=1\), \(r=2\), \(p=3\), \(q=4\).
| |
|
|
G1. Очень круглый спин (простая версия)
Деревья
дп
разделяй и властвуй
*2900
Это простая версия задачи. Разница между простой и сложной версиями задачи заключается только в допустимых символах в \(s\). В простой версии строка \(s\) содержит только символ ?. Вы можете делать взломы только в том случае, если обе версии задачи решены. Дана перестановка \(p\) длины \(n\). Также дана строка \(s\) длины \(n\), содержащая только символ ?. Для каждого \(i\) от \(1\) до \(n\): - Определим \(l_i\) как наибольший индекс \(j < i\) такой, что \(p_j > p_i\). Если такого индекса не существует, \(l_i := i\).
- Определим \(r_i\) как наименьший индекс \(j > i\) такой, что \(p_j > p_i\). Если такого индекса не существует, \(r_i := i\).
Изначально есть неориентированный граф с \(n\) вершинами (пронумерованными от \(1\) до \(n\)) и без рёбер. Затем для каждого \(i\) от \(1\) до \(n\) в граф добавляется одно ребро: - Если \(s_i =\) L, в граф добавляется ребро \((i, l_i)\).
- Если \(s_i =\) R, в граф добавляется ребро \((i, r_i)\).
- Если \(s_i =\) ?, в граф добавляется либо ребро \((i, l_i)\), либо ребро \((i, r_i)\) по вашему выбору.
Найдите максимально возможный диаметр\(^{\text{∗}}\) среди всех связных графов, которые вы можете получить. Выведите \(-1\), если невозможно получить ни один связный граф. Выходные данные Для каждого набора входных данных выведите одно целое число — максимальный диаметр среди всех связных графов, которые вы можете получить, или \(-1\), если таковых нет. Примечание Для первого набора входных данных ниже показаны примеры некоторых графов, которые можно получить (в вершинах написаны индексы): Во втором наборе входных данных у единственного связного графа диаметр равен \(1\).
| |
|
|
G2. Очень круглый спин (сложная версия)
Деревья
дп
разделяй и властвуй
*3500
Это сложная версия задачи. Разница между простой и сложной версиями задачи заключается только в допустимых символах в \(s\). Вы можете делать взломы только в том случае, если обе версии задачи решены. Дана перестановка \(p\) длины \(n\). Также дана строка \(s\) длины \(n\), содержащая только символы L, R и ?. Для каждого \(i\) от \(1\) до \(n\): - Определим \(l_i\) как наибольший индекс \(j < i\) такой, что \(p_j > p_i\). Если такого индекса не существует, \(l_i := i\).
- Определим \(r_i\) как наименьший индекс \(j > i\) такой, что \(p_j > p_i\). Если такого индекса не существует, \(r_i := i\).
Изначально есть неориентированный граф с \(n\) вершинами (пронумерованными от \(1\) до \(n\)) и без рёбер. Затем для каждого \(i\) от \(1\) до \(n\) в граф добавляется одно ребро: - Если \(s_i =\) L, в граф добавляется ребро \((i, l_i)\).
- Если \(s_i =\) R, в граф добавляется ребро \((i, r_i)\).
- Если \(s_i =\) ?, в граф добавляется либо ребро \((i, l_i)\), либо ребро \((i, r_i)\) по вашему выбору.
Найдите максимально возможный диаметр\(^{\text{∗}}\) среди всех связных графов, которые вы можете получить. Выведите \(-1\), если невозможно получить ни один связный граф. Выходные данные Для каждого набора входных данных выведите одно целое число — максимальный диаметр среди всех связных графов, которые вы можете получить, или \(-1\), если таковых нет. Примечание В первом наборе входных данных можно получить два связных графа (в вершинах написаны индексы): У графа слева диаметр равен \(2\), а у графа справа диаметр равен \(3\), поэтому ответ \(3\). Во втором наборе входных данных нельзя получить связный граф, поэтому ответ \(-1\).
| |
|
|
E. Сумма минимумов на подотрезках
Бинарный поиск
Перебор
разделяй и властвуй
реализация
Структуры данных
*2300
Для массива \([a_1,a_2,\ldots,a_n]\) длины \(n\) определим \(f(a)\) как сумму минимального элемента по всем подотрезкам этого массива. Иными словами, \(\)f(a)=\sum_{l=1}^n\sum_{r=l}^n \min_{l\le i\le r}a_i.\(\) Перестановка — это последовательность целых чисел от \(1\) до \(n\) длиной \(n\), содержащая каждое число ровно один раз. Вам дана перестановка \([a_1,a_2,\ldots,a_n]\). Для каждого \(i\) решите следующую задачу независимо: - Удалите \(a_i\) из \(a\), объединив оставшиеся части, получив \(b = [a_1,a_2,\ldots,a_{i-1},\;a_{i+1},\ldots,a_{n}]\).
- Вычислите \(f(b)\).
Выходные данные Для каждого набора выведите одну строку, содержащую \(n\) целых чисел. \(i\)-е целое число должно быть ответом при удалении \(a_i\). Примечание Во втором наборе входных данных \(a=[3,1,2]\). - При удалении \(a_1\), \(b=[1,2]\). \(f(b)=1+2+\min\{1,2\}=4\).
- При удалении \(a_2\), \(b=[3,2]\). \(f(b)=3+2+\min\{3,2\}=7\).
- При удалении \(a_3\), \(b=[3,1]\). \(f(b)=3+1+\min\{3,1\}=5\).
| |
|
|
F. Раскрась одновременно
графы
поиск в глубину и подобное
разделяй и властвуй
*3000
Задана матрица, состоящая из \(n\) строк и \(m\) столбцов. Вы можете выполнять над ней два типа действий: - покрасить весь столбец в синий;
- покрасить всю строку в красный.
Обратите внимание, что вы не можете выбирать, в какой цвет красить строку или столбец. За одну секунду можно выполнить как одно действие, так и несколько одновременно. Если сделать одно действие, то это будет бесплатно. Если же сделать \(k > 1\) действий одновременно, то на это придется потратить \(k^2\) монет. Когда несколько действий выполняются одновременно, для каждой клетки, которая затрагивается действиями обоих типов, цвет можно выбрать независимо. Требуется обработать \(q\) запросов. Перед каждым запросом все ячейки становятся бесцветными. Изначально ограничений на итоговый цвет клеток нет. В \(i\)-м запросе добавляется ограничение вида: - \(x_i~y_i~c_i\) — клетка в строке \(x_i\) в столбце \(y_i\) должна быть покрашена в цвет \(c_i\).
Таким образом, после \(i\) запросов существует \(i\) ограничений на необходимые цвета клеток матрицы. После каждого запроса выведите минимальную стоимость покраски в соответствии с ограничениями. Выходные данные Выведите \(q\) целых чисел — После каждого запроса выведите минимальную стоимость покраски в соответствии с ограничениями.
| |
|
|
E2. Поймай крота (сложная версия)
Бинарный поиск
Деревья
интерактив
поиск в глубину и подобное
разделяй и властвуй
Структуры данных
*2600
Это сложная версия задачи. Единственное отличие — это ограничение на количество запросов. Это интерактивная задача. Вам дано дерево из \(n\) вершин с вершиной \(1\) в качестве корневой. В одной из вершин спрятан крот. Чтобы найти его положение, вы можете выбрать вершину \(x\) (\(1 \le x \le n\)) и сделать запрос к жюри. После этого жюри вернет \(1\), если крот находится в поддереве вершины \(x\). В противном случае жюри вернет \(0\). Если жюри возвращает \(0\) и крот не находится в корневой вершине \(1\), крот переместится в вершину-родителя той вершины, в которой он находится в данный момент. Используя не более \(160\) операций, найдите текущую вершину, в которой находится крот. Протокол взаимодействия Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 5000\)). Следующая \(n-1\) строка описывает ребра дерева. Каждая строка содержит два целых числа, разделенные пробелом, \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\)), обозначающие ребро между вершинами \(u_i\) и \(v_i\). Гарантируется, что входные данные представляют собой дерево. Интерактор в этой задаче не является адаптивным. Другими словами, вершина, где изначально находится крот, зафиксирована в каждом наборе входных данных и не меняется во время взаимодействия. Чтобы сделать запрос, вам нужно выбрать вершину \(x\) (\(1 \le x \le n\)) и вывести строку следующего вида: После этого вы получите: - \(0\), если крот не находится в поддереве \(x\);
- \(1\), если крот находится в поддереве \(x\).
Вы можете сделать не более \(160\) запросов такого вида для каждого набора входных данных. Затем, если вы определили текущую вершину, где находится крот, выведите строку следующего вида: Обратите внимание, что эта строка не считается запросом и не учитывается при подсчете количества заданных запросов. После этого переходите к следующему набору входных данных. Если вы сделаете более \(160\) запросов во время взаимодействия, ваша программа должна немедленно завершиться, и вы получите вердикт Неправильный ответ. В противном случае вы можете получить произвольный вердикт, потому что ваше решение будет продолжать читать из закрытого потока. После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Взломы Чтобы сделать взлом, используйте следующий формат: Первая строка содержит количество наборов входных данных \(t\) (\(1 \le t \le 100\)). Далее следует описание наборов входных данных. Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(x\) (\(2 \le n \le 5000\), \(1 \le x \le n\)), описывающие размер дерева и начальное положение крота. Следующая \(n-1\) строка описывает ребра дерева. Каждая строка содержит два целых числа, разделенные пробелом, \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\)), обозначающие ребро между вершинами \(u_i\) и \(v_i\). Входные данные обязаны представлять собой дерево. Примечание В первом наборе входных данных крот изначально находится в вершине \(2\). Для запроса «? 2», жюри возвращает \(1\), потому что крот находится в поддереве вершины \(2\). После этого запроса крот не перемещается. Ответ \(2\) — это текущая вершина, где находится крот, поэтому ответ считается правильным. Во втором наборе входных данных крот изначально находится в вершине \(6\). Для запроса «? 2», жюри возвращает \(0\), потому что крот не находится в поддереве вершины \(2\). После этого запроса крот перемещается из вершины \(6\) в вершину \(5\). Для запроса «? 6», жюри возвращает \(0\), потому что крот не находится в поддереве вершины \(6\). После этого запроса крот перемещается из вершины \(5\) в вершину \(4\). Для запроса «? 4», жюри возвращает \(1\), потому что крот находится в поддереве вершины \(4\). После этого запроса крот не перемещается. Ответ \(4\) — это текущая вершина, где находится крот, поэтому ответ считается правильным. Обратите внимание, что приведенный пример предназначен только для понимания условия, и запросы в примере не гарантируют определение уникального положения крота.
| |
|
|
F. Многоугольные отрезки
дп
жадные алгоритмы
Перебор
разделяй и властвуй
Структуры данных
*2800
У вас есть массив \(a\) размера \(n\). Отрезок \([l, r](1 \le l < r \le n)\) называется многоугольным отрезком в том случае, если выполняются следующие условия: - \((r-l+1) \geq 3\);
- Используя \(a_l, a_{l+1}, \ldots, a_r\) в качестве длин сторон, эти стороны могут образовать многоугольник с \((r-l+1)\) стороной.
Обработайте \(q\) запросов двух типов: - «1 l r»: найти длину самого длинного отрезка среди всех многоугольных отрезков \([l_0,r_0]\), удовлетворяющих условию \(l \le l_0 \le r_0 \le r\). Если такого многоугольного отрезка нет, выведите вместо этого \(-1\);
- «2 i x»: присвоить \(a_i := x\).
Выходные данные Для каждого запроса, если подходящего отрезка нет, выведите в отдельной строке \(-1\). В противном случае выведите длину самого длинного отрезка, удовлетворяющего вышеприведенному условию. Примечание В первом запросе первого набора входных данных не существует многоугольного отрезка. Например, если взять отрезок \([1,3]\), нельзя сделать треугольник со сторонами \(a_1=3\), \(a_2=1\) и \(a_3=2\). Во втором запросе первого набора входных данных самый длинный многоугольный отрезок — \([1,4]\). Вы можете сделать четырехугольник со сторонами \(a_1=3\), \(a_2=1\), \(a_3=2\) и \(a_4=2\). Пример четырехугольника со сторонами \(3\), \(1\), \(2\) и \(2\).
| |
|
|
E. Прокачка персонажа
Бинарный поиск
Перебор
разделяй и властвуй
реализация
Структуры данных
*2200
Монокарп играет в компьютерную игру. Он начинает игру, будучи \(1\) уровня. Ему предстоит сразиться с \(n\) монстрами в порядке от \(1\) до \(n\). Уровень \(i\)-го из них равен \(a_i\). Когда Монокарп встречает очередного монстра, происходит следующее: - если уровень Монокарпа строго выше уровня монстра, то монстр спасается бегством;
- иначе Монокарп сражается с монстром.
После каждого \(k\)-го сражения с монстром (сбежавшие монстры не считаются) уровень Монокарпа увеличивается на \(1\). То есть, после \(k\) сражений с монстрами уровень становится равен \(2\), после \(2k\) — равен \(3\), после \(3k\) — равен \(4\) и так далее. Требуется обработать \(q\) запросов следующего вида: - \(i~x\): будет ли Монокарп сражаться с \(i\)-м монстром (или же этот монстр сбежит), если параметр \(k\) равен \(x\)?
Выходные данные На каждый запрос выведите «YES», если Монокарп сразится с \(i\)-м монстром в этом запросе, и «NO», если \(i\)-й монстр сбежит.
| |
|
|
E1. Удаление шаров с помощью слияния (лёгкая версия)
Бинарный поиск
жадные алгоритмы
Перебор
разделяй и властвуй
Структуры данных
*2200
Пейте воду. — Сунь-Цзы, Искусство стать здоровым программистом Это лёгкая версия задачи. Единственное отличие в том, что в этой версии \(x=n\). Вы можете делать взломы только в том случае, если обе версии задачи решены. Вам даны два целых числа \(n\) и \(x\) (\(x=n\)). В ряд выстроены \(n\) шаров, пронумерованных от \(1\) до \(n\) слева направо. Изначально на \(i\)-м шаре записано значение \(a_i\). Для каждого целого числа \(i\) от \(1\) до \(n\) мы определяем функцию \(f(i)\) следующим образом: - Предположим, что у вас есть множество \(S = \{1, 2, \ldots, i\}\).
- В рамках одной операции вам нужно выбрать целое число \(l\) (\(1 \leq l < i\)) из \(S\) такое, что \(l\) не является наибольшим элементом \(S\). Предположим, что \(r\) — наименьший элемент \(S\), значение которого больше \(l\).
- Если \(a_l > a_r\), то установить \(a_l = a_l + a_r\) и удалить \(r\) из \(S\).
- Если \(a_l < a_r\), то установить \(a_r = a_l + a_r\) и удалить \(l\) из \(S\).
- Если \(a_l = a_r\), вы выбираете целое число \(l\) или \(r\) для удаления из \(S\):
- Если вы решили удалить \(l\) из \(S\), вы устанавливаете \(a_r = a_l + a_r\) и удаляете \(l\) из \(S\).
- Если вы решили удалить \(r\) из \(S\), вы устанавливаете \(a_l = a_l + a_r\) и удаляете \(r\) из \(S\).
- \(f(i)\) обозначает количество целых чисел \(j\) (\(1 \le j \le i\)) таких, что можно получить \(S = \{j\}\), выполнив вышеописанную операцию ровно \(i - 1\) раз.
Для каждого целого числа \(i\) от \(x\) до \(n\) необходимо найти \(f(i)\). Выходные данные Для каждого набора входных данных выведите на отдельной строке \(n-x+1\) целых числа, разделенных пробелом, где \(j\)-е целое число равняется \(f(x+j-1)\). Примечание В первом наборе входных данных требуется вычислить \(f(5)\). Можно показать, что после \(4\) операций \(S\) может содержать \(2\), \(3\) или \(4\). Ниже показаны операции, необходимые для того, чтобы получить \(S = \{4\}\). - Изначально \(S = \{1, 2, 3, 4, 5\}\) и \(a = [1, 2, 3, 2, 1]\).
- Выбираем \(l = 1\). Тогда \(r = 2\). Так как \(a_1 < a_2\), зададим \(a_2 = 1 + 2\) и удалим \(1\) из \(S\). Теперь \(S = \{2, 3, 4, 5\}\) и \(a = [1, 3, 3, 2, 1]\).
- Выбираем \(l = 4\). Тогда \(r = 5\). Поскольку \(a_4 > a_5\), зададим \(a_4 = 2 + 1\) и удалим \(5\) из \(S\). Теперь \(S = \{2, 3, 4\}\) и \(a = [1, 3, 3, 3, 1]\).
- Выбираем \(l = 3\). Тогда \(r = 4\). Поскольку \(a_3 = a_4\), у нас есть выбор, удалить \(3\) или \(4\). Поскольку мы хотим сохранить \(4\), удалим \(3\). Итак, зададим \(a_4 = 3 + 3\) и удалим \(3\) из \(S\). Теперь \(S = \{2, 4\}\) и \(a = [1, 3, 3, 6, 1]\).
- Выбираем \(l = 2\). Тогда \(r = 4\). Поскольку \(a_2 < a_4\), зададим \(a_4 = 3 + 6\) и удалим \(2\) из \(S\). Наконец, \(S = \{4\}\) и \(a = [1, 3, 3, 9, 1]\).
Во втором наборе входных данных требуется вычислить \(f(7)\). Можно показать, что после \(6\) операций \(S\) может содержать \(2\), \(4\), \(6\) или \(7\).
| |
|
|
E2. Удаление шаров с помощью слияния (сложная версия)
Бинарный поиск
жадные алгоритмы
Перебор
разделяй и властвуй
реализация
Структуры данных
*2500
Пейте воду. — Сунь-Цзы, Искусство стать здоровым программистом Это сложная версия задачи. Единственное отличие в том, что в этой версии \(x=1\). Вы можете делать взломы только в том случае, если обе версии задачи решены. Вам даны два целых числа \(n\) и \(x\) (\(x=1\)). В ряд выстроены \(n\) шаров, пронумерованных от \(1\) до \(n\) слева направо. Изначально на \(i\)-м шаре записано значение \(a_i\). Для каждого целого числа \(i\) от \(1\) до \(n\) мы определяем функцию \(f(i)\) следующим образом: - Предположим, что у вас есть множество \(S = \{1, 2, \ldots, i\}\).
- В рамках одной операции вам нужно выбрать целое число \(l\) (\(1 \leq l < i\)) из \(S\) такое, что \(l\) не является наибольшим элементом \(S\). Предположим, что \(r\) — наименьший элемент \(S\), значение которого больше \(l\).
- Если \(a_l > a_r\), то установить \(a_l = a_l + a_r\) и удалить \(r\) из \(S\).
- Если \(a_l < a_r\), то установить \(a_r = a_l + a_r\) и удалить \(l\) из \(S\).
- Если \(a_l = a_r\), вы выбираете целое число \(l\) или \(r\) для удаления из \(S\):
- Если вы решили удалить \(l\) из \(S\), вы устанавливаете \(a_r = a_l + a_r\) и удаляете \(l\) из \(S\).
- Если вы решили удалить \(r\) из \(S\), вы устанавливаете \(a_l = a_l + a_r\) и удаляете \(r\) из \(S\).
- \(f(i)\) обозначает количество целых чисел \(j\) (\(1 \le j \le i\)) таких, что можно получить \(S = \{j\}\), выполнив вышеописанную операцию ровно \(i - 1\) раз.
Для каждого целого числа \(i\) от \(x\) до \(n\) необходимо найти \(f(i)\). Выходные данные Для каждого набора входных данных выведите на отдельной строке \(n-x+1\) целых числа, разделенных пробелом, где \(j\)-е целое число равняется \(f(x+j-1)\). Примечание Для первого набора входных данных ниже приведены возможные значения \(j\) для каждого \(f(i)\) от \(1\) до \(n\). - Для \(f(1)\) единственным возможным значением \(j\) является \(1\).
- Для \(f(2)\) единственным возможным значением \(j\) является \(2\).
- Для \(f(3)\) возможные значения \(j\): \(2\) и \(3\).
- Для \(f(4)\) возможные значения \(j\): \(2\) и \(3\).
- Для \(f(5)\) возможные значения \(j\): \(2\), \(3\) и \(4\).
| |
|
|
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)\).
| |
|
|
E1. Черепаха и инверсии (легкая версия)
дп
жадные алгоритмы
математика
Перебор
разделяй и властвуй
*2600
Это легкая версия данной задачи. Различия между версиями заключаются в ограничении на \(m\) и в том, что \(r_i < l_{i + 1}\) выполняется для каждого \(i\) от \(1\) до \(m - 1\) в легкой версии. Вы можете взломы только в том случае, если обе версии задачи решены. Черепаха дает вам \(m\) отрезков \([l_1, r_1], [l_2, r_2], \ldots, [l_m, r_m]\). Она считает, что перестановка \(p\) интересна, если существуют целые числа \(k_i\) для каждого отрезка (\(l_i \le k_i < r_i\)), такие что если она вычислит \(a_i = \max\limits_{j = l_i}^{k_i} p_j, b_i = \min\limits_{j = k_i + 1}^{r_i} p_j\) для каждого целого числа \(i\) от \(1\) до \(m\), то будет выполняться следующее условие: \(\)\max\limits_{i = 1}^m a_i < \min\limits_{i = 1}^m b_i\(\) Черепаха хочет, чтобы вы вычислили максимальное количество инверсий среди всех интересных перестановок длины \(n\), или сказали ей, если интересной перестановки не существует. Инверсией перестановки \(p\) называется пара целых чисел \((i, j)\) (\(1 \le i < j \le n\)) такая, что \(p_i > p_j\). Выходные данные Для каждого набора входных данных, если интересной перестановки не существует, выведите единственное целое число \(-1\). В противном случае выведите единственное целое число — максимальное количество инверсий. Примечание В третьем наборе входных данных интересная перестановка с максимальным количеством инверсий это \([5, 2, 4, 3, 1]\). В четвертом наборе входных данных интересная перестановка с максимальным количеством инверсий это \([4, 8, 7, 6, 3, 2, 1, 5]\). В этом случае мы можем задать \([k_1, k_2] = [1, 7]\). В пятом наборе входных данных интересная перестановка с максимальным количеством инверсий это \([4, 7, 6, 3, 2, 1, 5]\). В шестом наборе входных данных интересная перестановка с максимальным количеством инверсий это \([4, 7, 3, 6, 2, 5, 1]\).
| |
|
|
E2. Черепаха и инверсии (сложная версия)
дп
жадные алгоритмы
математика
Перебор
разделяй и властвуй
Структуры данных
*2700
Это сложная версия этой задачи. Различия между версиями заключаются в ограничении на \(m\) и условии \(r_i < l_{i + 1}\), которое выполняется для каждого \(i\) от \(1\) до \(m - 1\) в простой версии. Вы можете делать взломы только в том случае, если обе версии задачи решены. Черепаха дает вам \(m\) отрезков \([l_1, r_1], [l_2, r_2], \ldots, [l_m, r_m]\). Она считает, что перестановка \(p\) интересна, если существуют целые числа \(k_i\) для каждого отрезка (\(l_i \le k_i < r_i\)), такие что если она вычислит \(a_i = \max\limits_{j = l_i}^{k_i} p_j, b_i = \min\limits_{j = k_i + 1}^{r_i} p_j\) для каждого целого числа \(i\) от \(1\) до \(m\), то будет выполняться следующее условие: \(\)\max\limits_{i = 1}^m a_i < \min\limits_{i = 1}^m b_i\(\) Черепаха хочет, чтобы вы вычислили максимальное количество инверсий среди всех интересных перестановок длины \(n\), или сказали ей, если интересной перестановки не существует. Инверсией перестановки \(p\) называется пара целых чисел \((i, j)\) (\(1 \le i < j \le n\)), такая что \(p_i > p_j\). Выходные данные Для каждого набора, если интересной перестановки не существует, выведите одно целое число \(-1\). В противном случае выведите одно целое число — максимальное количество инверсий. Примечание В третьем наборе интересная перестановка с максимальным количеством инверсий это \([5, 2, 4, 3, 1]\). В четвертом наборе интересная перестановка с максимальным количеством инверсий это \([4, 3, 8, 7, 6, 2, 1, 5]\). В этом случае мы можем задать \([k_1, k_2, k_3] = [2, 2, 7]\). В пятом и шестом наборе можно доказать, что интересной перестановки не существует. В седьмом наборе интересная перестановка с максимальным количеством инверсий это \([4, 7, 6, 3, 2, 1, 5]\). В этом случае мы можем задать \([k_1, k_2, k_3, k_4] = [1, 6, 1, 6]\). В восьмом наборе интересная перестановка с максимальным количеством инверсий это \([4, 7, 3, 6, 2, 5, 1]\).
| |
|
|
D. Измените НОД
Бинарный поиск
Перебор
разделяй и властвуй
реализация
Структуры данных
теория чисел
*2400
Вам даны два массива \(a_1, a_2, \ldots, a_n\) и \(b_1, b_2, \ldots, b_n\). Вы должны выполнить следующую операцию ровно один раз: - выбрать любые индексы \(l\) и \(r\) такие, что \(1 \le l \le r \le n\);
- поменять местами \(a_i\) и \(b_i\) для всех \(i\) таких, что \(l \leq i \leq r\).
Найдите максимально возможное значение \(\text{gcd}(a_1, a_2, \ldots, a_n) + \text{gcd}(b_1, b_2, \ldots, b_n)\) после выполнения операции ровно один раз. Также найдите количество различных пар \((l, r)\), для которых достигается максимальное значение. Выходные данные Для каждого набора входных данных выведите два целых числа: максимальное значение \(\text{gcd}(a_1, a_2, \ldots, a_n) + \text{gcd}(b_1, b_2, \ldots, b_n)\) после выполнения операции ровно один раз, и количество подходящих пар. Примечание В первом, третьем и четвертом наборах входных данных ни в одном из массивов нельзя получить НОД больше \(1\), поэтому ответ — \(1 + 1 = 2\). Любая пара \((l, r)\) достигает одинаковый результат, например, в первом примере \(36\) такиз пар. В последнем наборе входных данных нужно выбрать \(l = 1\), \(r = 2\) для максимизации ответа. В этом случае НОД в первом массиве будет\(5\), а во втором — \(1\), поэтому ответ равен \(5 + 1 = 6\), а количество пар равно \(1\).
| |
|
|
C. Эри и расширение множеств
математика
разделяй и властвуй
Структуры данных
теория чисел
*2300
Пусть существует множество, содержащее различные положительные целые числа. Чтобы расширить множество и включить в него как можно больше целых чисел, Эри может выбрать два целых числа \(x\neq y\) из множества так, чтобы их среднее \(\frac{x+y}2\) также было целым числом и не содержалось в множестве, и добавить его в множество. Целые числа \(x\) и \(y\) при этом остаются в множестве. Назовем множество целых чисел последовательным, если, после сортировки элементов, разница между любой парой соседних элементов равна \(1\). Например, множества \(\{2\}\), \(\{2, 5, 4, 3\}\), \(\{5, 6, 8, 7\}\) являются последовательными, в то время как \(\{2, 4, 5, 6\}\), \(\{9, 7\}\) не являются. Эри любит последовательные множества. Пусть имеется массив \(b\), тогда Эри помещает все элементы из \(b\) в множество. Если после конечного числа описанных выше операций множество может стать последовательным, массив \(b\) называется великолепным. Обратите внимание, что если одно и то же целое число встречается в массиве несколько раз, мы помещаем его в множество один раз, так как множество всегда содержит различные положительные целые числа. У Эри есть массив \(a\) из \(n\) положительных целых чисел. Пожалуйста, помогите ему подсчитать количество пар целых чисел \((l,r)\) таких, что \(1 \leq l \leq r \leq n\) и подмассив \(a_l, a_{l+1}, \ldots, a_r\) является великолепным. Выходные данные Для каждого набора входных данных выведите одно целое число — количество великолепных подмассивов. Примечание В первом наборе входных данных массив \(a = [2, 2]\) имеет \(3\) подмассива: \([2]\), \([2]\) и \([2, 2]\). Для всех них множество содержит только одно целое число \(2\), поэтому оно всегда является последовательным. Все эти подмассивы являются великолепными, поэтому ответ равен \(3\). Во втором наборе входных данных рассмотрим подмассив \([3, 6, 10]\). Мы можем выполнить операции следующим образом: \(\)\{3,6,10\} \xrightarrow{x=6,y=10} \{3,6,8,10\} \xrightarrow{x=6,y=8} \{3,6,7,8,10\} \xrightarrow{x=3,y=7} \{3,5,6,7,8,10\}\(\) \(\)\xrightarrow{x=3,y=5} \{3,4,5,6,7,8,10\} \xrightarrow{x=8,y=10} \{3,4,5,6,7,8,9,10\}\(\) \(\{3,4,5,6,7,8,9,10\}\) является последовательным множеством, поэтому подмассив \([3, 6, 10]\) является великолепным.
| |
|
|
I. Стек и очередь
*особая задача
разделяй и властвуй
Структуры данных
Перед приемом к двум врачам выстроились \(2\) очереди пациентов. Первый врач принимает пациентов в обычном порядке очереди — кто раньше пришел, того он раньше и примет. А второй врач делает наоборот — принимает сначала тех, кто пришел позже всех. То есть, к первому врачу стоит очередь, а ко второму — стек. Один пациент может одновременно стоять и в очереди, и в стеке. Каждый пациент характеризуется временем, которое займет его визит ко врачу (время одинаковое для обоих врачей). Когда начнется прием, врачи будут принимать пациентов в порядке очереди и стека соответственно. Как только врач закончит с одним пациентом, он вызовет следующего. Но есть одна проблема: если пациент стоял и в очереди, и в стеке, и его вызвали сначала к одному врачу, а потом к другому, пока он не успел выйти от первого, начнется неразбериха. Допустимо, чтобы пациент пошел ко второму врачу в тот же момент времени, в который вышел от первого врача. Текущая конфигурация очереди и стека называется хорошей, если врачи могут принять всех пациентов, и при этом не возникнет неразбериха. Изначально очередь и стек пусты. Поступают запросы трех типов: - добавить пациента \(x\) в очередь;
- добавить пациента \(x\) в стек;
- пациент \(x\), стоявший в очереди, понимает, что он стоит не туда и перемещается в стек; при этом он перемещается на то место в стеке, как если бы он встал в стек в момент запроса, когда он встал в очередь.
Гарантируется, что после каждого запроса каждый пациент занимает не более одного места в очереди и не более одного места в стеке. После каждого запроса нужно узнать, является ли конфигурация хорошей. Выходные данные После каждого запроса выведите «YES», если текущая конфигурация является хорошей, и «NO» в противном случае. Примечание В первом тесте следующие конфигурации: - очередь: \([1]\); стек: \([]\); пациента \(1\) первый врач принимает \(10\) минут, начиная с минуты \(0\).
- очередь: \([1]\); стек: \([1]\); пациента \(1\) первый врач принимает во время \([0; 10)\) и второй во время \([0; 10)\). Так как пациент \(1\) должен одновременно быть у двух врачей, ответ «NO».
- очередь: \([1]\); стек: \([1, 2]\); пациента \(1\) первый врач принимает во время \([0; 10)\), а второй во время \([15; 25)\); пациента \(2\) второй врач принимает во время \([0, 15)\). Теперь пациент \(1\) успевает ко второму врачу после приема у первого.
Во втором тесте конфигурации после запроса \(4\) следующая конфигурация: - очередь: \([1, 2]\);
- стек: \([5, 3]\);
- пациент \(1\): первый врач \([0, 2)\), второй врач не принимает;
- пациент \(2\): первый врач \([2, 7)\), второй врач не принимает;
- пациент \(3\): первый врач не принимает, второй врач \([0, 1)\);
- пациент \(5\): первый врач не принимает, второй врач \([1, 6)\).
После запроса \(5\) следующая конфигурация: - очередь: \([1]\);
- стек: \([5, 2, 3]\);
- пациент \(1\): первый врач \([0, 2)\), второй врач не принимает;
- пациент \(2\): первый врач не принимает, второй врач \([1, 6)\);
- пациент \(3\): первый врач не принимает, второй врач \([0, 1)\);
- пациент \(5\): первый врач не принимает, второй врач \([6, 11)\).
После запроса \(6\) следующая конфигурация: - очередь: \([1, 2]\);
- стек: \([5, 2, 3]\);
- пациент \(1\): первый врач \([0, 2)\), второй врач не принимает;
- пациент \(2\): первый врач \([2, 7)\), второй врач \([1, 6)\);
- пациент \(3\): первый врач не принимает, второй врач \([0, 1)\);
- пациент \(5\): первый врач не принимает, второй врач \([6, 11)\).
Пациент \(2\) должен быть у двух врачей одновременно. После запроса \(7\) следующая конфигурация: - очередь: \([2]\);
- стек: \([1, 5, 2, 3]\);
- пациент \(1\): первый врач не принимает, второй врач \([11, 13)\);
- пациент \(2\): первый врач \([0, 5)\), второй врач \([1, 6)\);
- пациент \(3\): первый врач не принимает, второй врач \([0, 1)\);
- пациент \(5\): первый врач не принимает, второй врач \([6, 11)\).
Пациент \(2\) должен быть у двух врачей одновременно.
| |
|
|
H. Стрельба из лука Робина Гуда
жадные алгоритмы
разделяй и властвуй
Структуры данных
хэши
*1900
В такие времена стрельба из лука всегда была основным спортом дня, ведь йомены Ноттингемшира были лучшими стрелками из длинного лука во всей Англии, но в этом году шериф колебался... Шериф Ноттингема организовал турнир по стрельбе из лука. Это финальный раунд, и Робин Гуд играет против Шерифа! В ряд выставлено \(n\) мишеней, пронумерованных от \(1\) до \(n\). Когда игрок стреляет в мишень \(i\), его счет увеличивается на \(a_i\), и мишень \(i\) уничтожается. Игра состоит из ходов, и игроки поочередно делают свои ходы. Робин Гуд всегда начинает игру, затем Шериф и так далее. Игра продолжается до тех пор, пока все мишени не будут уничтожены. Оба игрока начинают со счетом \(0\). В конце игры игрок с наибольшим счетом выигрывает, а другой игрок проигрывает. Если оба игрока имеют одинаковый счет, это ничья, и никто не выигрывает и не проигрывает. На каждом ходу игрок может стрелять в любую мишень, которая еще не была поражена. Оба игрока играют оптимально, чтобы получить максимальный возможный счет. Шериф Ноттингема подозревает, что он может проиграть игру! Этого не должно произойти, вы должны помочь Шерифу. Шериф задаст \(q\) запросов, каждый из которых будет указывать \(l\) и \(r\). Это означает, что игра будет проводиться только с мишенями \(l, l+1, \dots, r\), так как остальные будут удалены Шерифом перед началом игры. Для каждого запроса \(l\), \(r\) определите, может ли Шериф не проиграть игру, когда рассматриваются только мишени \(l, l+1, \dots, r\). Выходные данные Для каждого запроса выведите «YES», если Шериф не проиграет игру, когда рассматриваются только мишени \(l, l+1, \dots, r\), и «NO» в противном случае. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.
| |
|
|
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] \}\}\). В третьем наборе входных данных оптимально составить одну группу, содержащую все отрезки, кроме второго.
| |
|
|
F. Мороженое в Бермарте
Деревья
дп
поиск в глубину и подобное
разделяй и властвуй
реализация
Структуры данных
*2700
В сети магазинов Бермарт продается мороженое. У каждого сорта мороженого есть два параметра: цена и вкусность. Изначально есть один магазин с номером \(1\), в котором ничего не продаётся. Требуется обработать \(q\) запросов следующих типов: - \(1~x\) — открывается новый магазин, в котором продаются те же сорта мороженого, что и в магазине \(x\). Он получает первый свободный порядковый номер. Порядок появления сортов мороженого в новом магазине тот же, что и в магазине \(x\).
- \(2~x~p~t\) — в магазине \(x\) в продаже появляется сорт мороженого с ценой \(p\) и вкусностью \(t\).
- \(3~x\) — в магазине \(x\) исчезает из продажи сорт мороженого, который там появился раньше всего.
- \(4~x~p\) — для магазина \(x\) надо найти максимальную суммарную вкусность поднабора сортов, которые там продаются, так, чтобы суммарная цена не превышала \(p\) (каждый сорт можно использовать в поднаборе не более одного раз).
Выходные данные На каждый запрос типа \(4\) выведите одно целое число — для магазина \(x\) найдите максимальную суммарную вкусность поднабора сортов, которые там продаются, так, чтобы суммарная цена не превышала \(p\) (каждый сорт можно использовать в поднаборе не более одного раз).
| |
|
|
D. Действительно, ещё одна задача о числах
Бинарный поиск
жадные алгоритмы
математика
разделяй и властвуй
реализация
Структуры данных
*1800
Three r there are's in strawberry. Вам дан массив \(b\) длины \(m\). Вы можете выполнить следующую операцию любое количество раз (возможно, нулевое): - Выбрать два различных индекса \(i\) и \(j\), где \(\bf{1\le i < j\le m}\) и \(b_i\) является чётным числом, поделить \(b_i\) на \(2\) и умножить \(b_j\) на \(2\).
Ваша задача — максимизировать сумму массива после выполнения любого количества таких операций. Поскольку она может быть большой, выведите эту сумму по модулю \(10^9+7\). Поскольку эта задача слишком простая, вам дается массив \(a\) длины \(n\), и вам нужно решить задачу для каждого префикса \(a\). Другими словами, обозначив максимальную сумму \(b\) после выполнения любого количества таких операций как \(f(b)\), вам нужно вывести \(f([a_1])\), \(f([a_1,a_2])\), \(\ldots\), \(f([a_1,a_2,\ldots,a_n])\) по модулю \(10^9+7\). Выходные данные Для каждого набора входных данных выведите \(n\) целых чисел, являющимися ответами для каждого префикса \(a\) по модулю \(10^9+7\). Примечание Для каждого префикса в первом наборе входных данных возможен следующий массив после применения операций: - \([1]\): сумма равна \(1\);
- \([1, 2]\): сумма равна \(3\);
- \([1, 1, 6]\): сумма равна \(8\);
- \([1, 1, 3, 8]\): сумма равна \(13\);
- \([1, 1, 3, 1, 40]\): сумма равна \(46\);
- \([1, 1, 3, 1, 5, 48]\): сумма равна \(59\);
- \([1, 1, 3, 1, 5, 3, 112]\): сумма равна \(126\);
- \([1, 1, 3, 1, 5, 3, 7, 128]\): сумма равна \(149\);
- \([1, 1, 3, 1, 5, 3, 7, 1, 1152]\): сумма равна \(1174\);
- \([1, 1, 3, 1, 5, 3, 7, 1, 9, 1280]\): сумма равна \(1311\).
| |
|
|
G2. Учись! (сложная версия)
дп
разделяй и властвуй
*3500
Это сложная версия задачи. Различия между версиями заключаются в ограничениях на \(n\) и сумму \(n\). В этой версии \(n \leq 3\cdot 10^5\), а сумма \(n\) не превосходит \(10^6\). Вы можете совершать взломы только в том случае, если решены обе версии задачи. Так-так-так, посмотрим, как Бесси распоряжается своими финансами. Похоже, она в финансовой яме! К счастью, чтобы решить эту проблему, она устраивается на работу в Moogle. Собеседования в Moogle требуют глубокого знания непонятных алгоритмов и сложных структур данных, но Бесси получила от легендарного гроссмейстера наводку на то, что именно ей нужно изучить. Бесси написала следующий код для бинарного поиска определенного элемента \(k\) в возможно несортированном массиве \([a_1, a_2,\ldots,a_n]\) с \(n\) элементами. let l = 1 let h = n
while l < h: let m = floor((l + h) / 2)
if a[m] < k: l = m + 1 else: h = m
return l
Бесси отправила свой код в задачу фермера Джона с \(m\) (\(1 \leq m \leq n\)) тестами. \(i\)-й тест имеет вид \((x_i, k_i)\) (\(1 \leq x, k \leq n\)). Гарантируется, что все \(x_i\) различны и все \(k_i\) различны. Тест \(i\) корректен, если выполняются следующие условия: - \(x_i\)-й элемент в массиве — \(k_i\).
- Если Бесси вызовет двоичный поиск, как показано в коде выше, для \(k_i\), то он вернет \(x_i\).
Возможно, не все \(m\) тестов будут корректны на одном и том же массиве, поэтому фермер Джон удалит некоторые из них, чтобы Бесси могла пройти все тесты. Пусть \(r\) — это минимальное количество тестов, которое нужно удалить, чтобы существовал массив \([a_1, a_2,\ldots,a_n]\), в котором \(1 \leq a_i \leq n\), чтобы все оставшиеся тесты были корректными. Помимо нахождения \(r\), фермер Джон хочет, чтобы вы подсчитали количество массивов \([a_1, a_2,\ldots,a_n]\), в которых \(1 \leq a_i \leq n\), таких, что существует способ удалить ровно \(r\) тестов так, чтобы все оставшиеся тесты были корректными. Поскольку это число может быть очень большим, выведите его по модулю \(998\,244\,353\). Выходные данные Для каждого набора входных данных выведите два целых числа: \(r\) — минимальное количество удаленных тестов, чтобы существовал массив, в котором все оставшиеся тесты корректны; и количество массивов, для которых можно удалить \(r\) тестов, чтобы все оставшиеся тесты были корректны, по модулю \(998\,244\,353\). Примечание Рассмотрим первый пример. В первом наборе входных данных массив \([1,2,2,3,4]\) удовлетворяет всем \(m\) тестам, поэтому минимальное количество тестов, которые должна удалить Бесси, равно \(0\). Обратите внимание, что это также единственный массив, который удовлетворяет всем \(m\) тестам. Во втором наборе входных данных минимальное количество тестов, которое Бесси должна удалить, равняется \(1\). Единственный тест, который Бесси может удалить, это \((2,5)\). Если Бесси удалит тест \((2,5)\), то массивами, удовлетворяющими оставшимся \(m-1\) тестам, будут \([2,2,3,1,4]\), \([2,2,3,2,4]\), \([2,2,3,3,4]\).
| |
|
|
G. Библиотека Магии
Бинарный поиск
интерактив
Конструктив
математика
разделяй и властвуй
теория чисел
*2200
Это интерактивная задача. На кафедре сверхъестественных явлений Оксенфуртской Академии открылась Библиотека Магии, в которую вошли труды величайших чародеев Редании — \(n\) (\(3 \leq n \leq 10^{18}\)) видов книг, пронумерованных от \(1\) до \(n\). У каждой книги номер вида обозначен на переплёте. Более того, книги каждого вида хранятся в библиотеке ровно в двух экземплярах! А библиотекарем назначили Вас. Однажды ночью Вы просыпаетесь от странного шума и видите существо, покидающее здание через окно. Из рюкзака таинственного вора торчали три толстых тома разных цветов. И перед тем как приступить к их поиску, Вы решили вычислить числа \(a\), \(b\) и \(c\), написанные на переплётах этих книг. Все три числа различны. Итак, в Вашем распоряжении неупорядоченное множество томов, в котором по одному тому с попарно различными числами \(a\), \(b\) и \(c\) и по два тома для всех чисел от \(1\) до \(n\), кроме \(a\), \(b\) и \(c\). И Вы хотите найти эти значения \(a\), \(b\) и \(c\). Так как Вы работаете не в простой библиотеке, а в Библиотеке Магии, то для проверки факта нахождения книг на своём месте Вы можете использовать только одно заклинание в виде запроса: - «xor l r» — Запрос побитового XOR-а с параметрами \(l\) и \(r\). Пусть \(k\) — количество таких томов в библиотеке, числа на которых больше либо равны \(l\) и меньше либо равны \(r\). Вы получите результат вычисления \(v_1 \oplus v_2 \oplus ... \oplus v_k\), где \(v_1 ... v_k\) — числа на переплётах этих томов, а \(\oplus\) обозначает операцию побитового исключающего ИЛИ.
Так как Ваши магические способности как библиотекаря сильно ограничены, Вы можете сделать не более \(150\) запросов. Протокол взаимодействия Взаимодействие для каждого набора входных данных начинается с чтения целого числа \(n\). Затем вы можете сделать до \(150\) запросов. Чтобы сделать запрос, выведите строку в формате «xor l r» (без кавычек) (\(1 \leq l \leq r \leq n\)). После каждого запроса считайте целое число — ответ на ваш запрос. Чтобы сообщить ответ, выведите строку в формате «ans a b c» (без кавычек), где \(a\), \(b\) и \(c\) — найденные вами числа для ответа на задачу. Вы можете вывести их в любом порядке. Интерактор не адаптивен, что означает, что ответ известен до того, как участник задаст запросы, и не зависит от запросов, заданных участником. После того как будет сделано \(150\) запросов, ответ на любой другой запрос будет равен \(-1\). Получив такой ответ, завершите программу, чтобы получить вердикт «WA» (Wrong answer). После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт «IL» (Idleness limit exceeded). Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Взломы Чтобы сделать взлом, используйте следующий формат. Первая строка должна содержать одно целое число \(t\) (\(1 \leq t \leq 300\)) — количество наборов входных данных. Единственная строка каждого набора должна содержать четыре целых числа \(n\), \(a\), \(b\) и \(c\) (\(3 \leq n \leq 10^{18}\), \(1 \le a, b, c \le n\)) — количество книг в библиотеке и номера украденных томов. Числа \(a\), \(b\) и \(c\) должны быть различными. Примечание В примере в первом наборе входных данных книги в библиотеке после пропажи выглядят вот так: 
Теперь рассмотрим ответы на запросы: - На запрос «xor 1 1» вы получаете результат \(1 \oplus 1 = 0\). Указанному в запросе условию удовлетворяет два тома — оба с номером \(1\).
- На запрос «xor 2 2» вы получаете результат \(2\), так как только один том удовлетворяет указанному условию.
- На запрос «xor 3 3» вы получаете результат \(3\).
- На запрос «xor 4 6» вы получаете результат \(4 \oplus 6 \oplus 4 \oplus 5 \oplus 6 = 5\).
Во втором наборе входных данных всего \(3\) вида книг, и нетрудно догадаться, что отсутствующие имеют номера \(1\), \(2\) и \(3\).
| |
|
|
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.
| |
|
|
E. Пары вершин
Бинарный поиск
Деревья
жадные алгоритмы
Перебор
поиск в глубину и подобное
разделяй и властвуй
реализация
Структуры данных
*2900
Дано дерево, состоящее из \(2n\) вершин. Напомним, что деревом называется связный неориентированный граф, в котором нет циклов. На каждой вершине написано одно целое число от \(1\) до \(n\). Каждое число от \(1\) до \(n\) написано ровно на двух различных вершинах. У каждой вершины также есть стоимость — вершина \(i\) стоит \(2^i\). Требуется выбрать в дереве такое подмножество вершин, что: - подмножество связно; то есть, из каждой вершины подмножества можно добраться до любой другой вершины подмножества, проходя только через вершины подмножества;
- каждое число от \(1\) до \(n\) написано хотя бы на одной вершине подмножества.
Среди всех таких подмножеств требуется найти такое, что суммарная стоимость вершин в нем минимальна. Обратите внимание, что не требуется минимизировать количество вершин в подмножестве. Выходные данные В первой строке выведите одно целое число \(k\) — количество вершин в подмножестве. Во второй строке выведите \(k\) различных целых чисел от \(1\) до \(2n\) — номера вершин в выбранном подмножестве. Вершины можно выводить в произвольном порядке. Примечание На данных изображениях нарисованы ответы на первые два примера. В скобках около номеров вершин подписаны числа, написанные на них. В первом примере есть такие валидные подмножества: \([2, 4, 5]\) (стоимость равна \(2^2 + 2^4 + 2^5 = 52\)), \([2, 4, 5, 6]\) (стоимость равна \(116\)), \([1, 6, 3]\) (стоимость равна \(74\)), \([2, 6, 3]\) (стоимость равна \(76\)) и многие другие. Во втором примере стоимость подмножества \([4, 6, 3, 1]\) равна \(90\).
| |
|
|
F. Кевин и математический класс
Деревья
дп
математика
Перебор
разделяй и властвуй
реализация
Структуры данных
*2500
Кевин — студент из Вечно Спящего Города, который в настоящее время посещает математический класс, где учитель задает ему упражнения на деление. На доске написаны две строки положительных целых чисел, каждая из которых содержит \( n \) чисел. Первая строка — это \( a_1, a_2, \ldots, a_n \), а вторая строка — \( b_1, b_2, \ldots, b_n \). Для каждого упражнения на деление Кевин может выбрать любой отрезок \( [l, r] \) и найти минимальное значение \( x \) среди \( b_l, b_{l+1}, \ldots, b_r \). Затем он изменит каждое \( a_i \) для \( l \leq i \leq r \) на округление вверх от \( a_i \), деленного на \( x \). Формально, он выбирает два целых числа \( 1 \leq l \leq r \leq n \), устанавливает \( x = \min_{l \leq i \leq r} b_i \), и изменяет все \( a_i \) для \( l \leq i \leq r \) на \( \lceil \frac{a_i}{x} \rceil \). Кевин может покинуть класс и вернуться домой, когда все \( a_i \) станут равны \( 1 \). Он стремится уйти и хочет узнать минимальное количество упражнений на деление, необходимых для достижения этого. Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество упражнений на деление, необходимых для выхода из класса. Примечание Для первого примера: \( [{\color{red}{5,4}},2]\xrightarrow[\min(b_1,b_2)=3]{\text{операция на отрезке }[1,2]}[{\color{red}{2,2,2}}]\xrightarrow[\min(b_1,b_2,b_3)=2]{\text{операция на отрезке }[1,3]}[1,1,1] \). Для второго примера: \( [{\color{red}{3,6,1}},3,2]\xrightarrow[\min(b_1,b_2,b_3)=3]{\text{операция на отрезке }[1,3]}[1,{\color{red}{2,1,3}},2]\xrightarrow[\min(b_2,b_3,b_4)=2]{\text{операция на отрезке }[2,4]}[1,1,1,{\color{red}{2,2}}]\xrightarrow[\min(b_4,b_5)=2]{\text{операция на отрезке }[4,5]}[1,1,1,1,1] \).
| |
|
|
F. Максимальное модульное равенство
математика
разделяй и властвуй
Структуры данных
теория чисел
*1700
Дан массив \(a\) длины \(n\) и \(q\) запросов вида \(l\), \(r\). Для каждого запроса найдите такое максимальное \(m\), что все числа \(a_l\), \(a_{l+1}\), ..., \(a_r\) равны по модулю \(m\). Иными словами, \(a_l \bmod m = a_{l+1} \bmod m = \dots = a_r \bmod m\), где \(a \bmod b\) — это остаток от деления \(a\) на \(b\). В частности, если число \(m\) может быть бесконечно большим, выведите \(0\). Выходные данные Для каждого запроса выведите максимальное значение \(m\), описанное в условии. Примечание В первом запросе первого примера \(6 \bmod 3 = 3 \bmod 3 = 0\), можно показать, что для больших \(m\) нужное условие выполняться не будет. В третьем запросе первого примера \(14 \bmod 4 = 2 \bmod 4 = 6 \bmod 4 = 2\), можно показать, что для больших \(m\) нужное условие выполняться не будет.
| |
|
|
C. Очаровательный звездочет
битмаски
дп
математика
разделяй и властвуй
*1500
I'm praying for owning a transparent heart; as well as eyes with tears more than enough... Ирис посмотрела на звезды, и в её голове возникла прекрасная задача. Она приглашает вас решить её, чтобы можно было предсказать метеоритный дождь. На небе есть \(n\) звезд, расположенных в ряд. У Ирис есть телескоп, с помощью которого она смотрит на них. Изначально Ирис наблюдает за звездами в отрезке \([1, n]\), и у неё есть значение удачи, равное \(0\). Ирис хочет найти центральную звезду для каждого отрезка \([l, r]\), за которым она наблюдает. Она использует следующую рекурсивную процедуру: - Сначала она вычисляет \(m = \left\lfloor \frac{l+r}{2} \right\rfloor\).
- Если длина отрезка (т.е. \(r - l + 1\)) чётная, Ирис разделяет его на два отрезка одинаковой длины \([l, m]\) и \([m+1, r]\) для дальнейшего наблюдения.
- В противном случае Ирис наведёт телескоп на звезду \(m\), и её значение удачи увеличится на \(m\); далее, если \(l \neq r\), Ирис продолжит наблюдать за двумя отрезками \([l, m-1]\) и \([m+1, r]\).
Ирис немного ленива. Она определяет свою лень целым числом \(k\): по мере продвижения наблюдения она не станет наблюдать за отрезком \([l, r]\), если его длина строго меньше \(k\). Пожалуйста, предскажите её итоговое значение удачи. Выходные данные Для каждого набора входных данных выведите одно целое число — итоговое значение удачи. Примечание В первом наборе входных данных, в начале Ирис наблюдает за отрезком \([1, 7]\). Поскольку у \([1, 7]\) нечётная длина, она наводит телескоп на звезду \(4\) и, следовательно, увеличивает своё значение удачи на \(4\). Затем отрезок разбивается на \(2\) новых отрезка: \([1, 3]\) и \([5, 7]\). Отрезок \([1, 3]\) снова имеет нечётную длину, поэтому Ирис прицеливается на звезду \(2\) и увеличивает своё значение удачи на \(2\). Затем он разбивается на \(2\) новых отрезка: \([1, 1]\) и \([3, 3]\), оба из которых имеют длину меньше \(2\), поэтому дальнейшее наблюдение не проводится. Что касается отрезка \([5, 7]\), то прогресс аналогичен, и значение удачи увеличивается на \(6\). Следовательно, итоговое значение удачи равняется \(4 + 2 + 6 = 12\). В последнем наборе входных данных, Ирис в итоге понаблюдает за всеми звёздами, и итоговым значением удачи будет \(1 + 2 + \cdots + 8\,765\,432 = 38\,416\,403\,456\,028\).
| |
|
|
D. Равные медианы
Бинарный поиск
дп
Комбинаторика
Перебор
разделяй и властвуй
Структуры данных
*2200
Массив \(b\) из \(m\) целых чисел называется хорошим, если после его сортировки выполняется \(b_{\left\lfloor \frac{m + 1}{2} \right\rfloor} = b_{\left\lceil \frac{m + 1}{2} \right\rceil}\). Другими словами, \(b\) является хорошим, если обе его медианы равны. В частности, если \(m\) нечетно, то \(\left\lfloor \frac{m + 1}{2} \right\rfloor = \left\lceil \frac{m + 1}{2} \right\rceil\), поэтому \(b\) гарантированно будет хорошим, если он имеет нечетную длину. Вам дан массив \(a\) из \(n\) целых чисел. Вычислите количество хороших подмассивов\(^{\text{∗}}\) в \(a\). Выходные данные Для каждого набора входных данных выведите одно целое число — количество хороших подмассивов в \(a\). Примечание В первом наборе входных данных каждый подмассив является хорошим, поскольку все его элементы равны \(1\). Во втором наборе входных данных примером хорошего подмассива является \(b = [10, 2, 3, 3]\). Если его отсортировать, то \(b = [2, 3, 3, 10]\), значит, \(b_{\left\lfloor \frac{4 + 1}{2} \right\rfloor} = b_{\left\lceil \frac{4 + 1}{2} \right\rceil} = b_2 = b_3 = 3\). Другим примером может быть \(b = [1, 10, 2]\). С другой стороны, \(b = [1, 10]\) не подходит, поскольку его две медианы равны \(1\) и \(10\), и они не равны.
| |
|
|
I. Кевин и Нивек
дп
разделяй и властвуй
*3500
Кевин и Нивек соревнуются за титул «Лучший Кевин». Их цель — определить победителя за \(n\) матчей. \(i\)-й матч может быть одного из двух типов: - Тип 1: Кевину нужно потратить \(a_i\) времени, чтобы победить Нивека и выиграть матч. Если Кевин не потратит на этот матч \(a_i\) времени, Нивек выиграет матч.
- Тип 2: Исход этого матча зависит от их исторических данных. Если количество побед Кевина больше или равно количеству побед Нивека до этого матча, то Кевин выиграет. В противном случае выиграет Нивек.
Кевин хочет узнать, какое минимальное количество времени ему нужно потратить, чтобы выиграть как минимум \(k\) матчей. Выведите ответы для \(k = 0, 1, \ldots, n\). Выходные данные Для каждого набора входных данных выведите \(n + 1\) целое число. \(i\)-е целое число представляет минимальное количество времени для победы по крайней мере в \(i-1\) матче. Примечание В первом наборе входных данных все матчи относятся к типу 2. Кевин автоматически выигрывает все матчи. Во втором наборе входных данных все матчи относятся к типу 1. Кевин может выбирать матчи в порядке возрастания \(a_i\). В третьем наборе входных данных: - Если Кевин потратит \(a_1\) времени на матч \(1\), он может выиграть матчи \(1, 2, 3, 4\).
- Если Кевин потратит \(a_5\) времени на матч \(5\), он может выиграть матч \(5\).
- Если Кевин потратит \(a_1\) времени на матч \(1\) и \(a_5\) времени на матч \(5\), он может выиграть все матчи.
| |
|
|
H. Бро считает себя избранным
дп
Комбинаторика
математика
матрицы
разделяй и властвуй
Структуры данных
*2200
Скибидус думает, что он избранный! Он доказал это, решив эту сложную задачу. Сможете ли вы? Дана двоичная строка\(^{\text{∗}}\) \(t\), \(f(t)\) определяется как минимальное количество смежных подстрок, каждая из которых состоит из одинаковых символов, на которые можно разбить \(t\). Например, \(f(\texttt{00110001}) = 4\), потому что \(t\) можно разбить как \(\texttt{[00][11][000][1]}\), где каждый сегмент в скобках состоит из одинаковых символов. Скибидус даёт вам двоичную строку \(s\) и \(q\) запросов. В каждом запросе один символ строки переворачивается (т.е. \(\texttt{0}\) меняется на \(\texttt{1}\), а \(\texttt{1}\) меняется на \(\texttt{0}\)), изменения сохраняются после обработки запроса. После каждого запроса выведите сумму по всем \(f(b)\), где \(b\) — это непустая подпоследовательность\(^{\text{†}}\) строки \(s\), по модулю \(998\,244\,353\). Выходные данные Для каждого набора входных данных выведите \(q\) целых чисел в одной строке — ответ после каждого запроса по модулю \(998\,244\,353\). Примечание В первом тестовом случае \(s\) становится \(\texttt{001}\) после первого запроса. Давайте посчитаем ответ для каждой подпоследовательности: - \(f(s_1) = f(\texttt{0}) = 1\)
- \(f(s_2) = f(\texttt{0}) = 1\)
- \(f(s_3) = f(\texttt{1}) = 1\)
- \(f(s_1 s_2) = f(\texttt{00}) = 1\)
- \(f(s_1 s_3) = f(\texttt{01}) = 2\)
- \(f(s_2 s_3) = f(\texttt{01}) = 2\)
- \(f(s_1 s_2 s_3) = f(\texttt{001}) = 2\)
Сумма этих значений равна \(10\), по модулю \(998\,244\,353\).
| |
|
|
C. Формуроса
дп
Разбор выражений
разделяй и властвуй
*2600
Байтляндский Институт Биологических Исследований (БИБИ) изучает свойства двух видов бактерий, названных 0 и 1. Даже под микроскопом бактерии этих двух видов очень трудно отличить. Вобщем-то, у ученых есть только один способ, который способен различать их — это растение под названием Формуроса. Если ученые поместят по образцу колоний бактерий на каждом листке Формуросы, активируется сложный процесс питания растения. Во время этого процесса цвет Формуросы изменится, в соответствии с, возможно, очень сложной логической формулой, включающей константы и операторы | (OR), & (AND) и ^ (XOR). Если результат подсчета формулы равен 0, то растение покраснеет, в противном случае посинеет. Например, если процесс питания Формуросы описывается формулой: (((?^?)|?)&(1^?)), то у Формуросы есть четыре листа (знаки «?» обозначают листья). Если мы положим образцы бактерий 0, 1, 0, 0 на соответствующие листья, результатом питательного процесса будет (((0^1)|0)&(1^0)) = 1, следовательно, растение посинеет. У ученых есть n колоний бактерий. Они не знают их типы; они знают наверняка только то, что не все колонии одного типа. Ученые хотят попытаться определить виды бактерий, с помощью нескольких экспериментов с Формуросой. Во время каждого эксперимента ученые должны поместить ровно по одному образцу на каждый лист растения. Тем не менее, они могут использовать несколько образцов из одной колонии в течение одного эксперимента; например, можно покрыть все листья растения бактериями из одной колонии! Смогут ли ученые определить вид каждой колонии, какими бы эти колонии ни были (если предположить, что не все колонии одинаковые)? Выходные данные Если всегда возможно определить вид каждой колонии, выведите «YES» (без кавычек). В противном случае выведите «NO» (без кавычек).
| |
|
|
C. Графы Доу
графы
дп
Конструктив
кратчайшие пути
разделяй и властвуй
*2600
Джон Доу решил, что в его честь должен быть назван какой-нибудь математический объект и изобрел графы Доу. Графы Доу — это семейство неориентированных графов, каждый из которых характеризуются единственным целым неотрицательным числом — порядком. Граф Доу порядка k обозначим за D(k), за |D(k)| обозначим количество вершин в графе D(k). Тогда определим графы Доу следующим образом: - D(0) состоит из единственной вершины, которая имеет номер 1.
- D(1) состоит из двух вершин с номерами 1 и 2, соединенных ребром.
- D(n) для n ≥ 2 получается из графов D(n - 1) и D(n - 2). D(n - 1) и D(n - 2) объединяются в один граф, при этом номера всех вершин графа D(n - 2) увеличиваются на |D(n - 1)| (например, вершина номер 1 графа D(n - 2) становится вершиной номер 1 + |D(n - 1)|). После этого в граф добавляются два ребра: первое — между вершинами с номерами |D(n - 1)| и |D(n - 1)| + 1, второе — между вершинами с номерами |D(n - 1)| + 1 и 1. Обратите внимание, что из определения графа D(n) следует, что D(n) является связным графом, вершины которого пронумерованы от 1 до |D(n)|.
На рисунке изображены, слева-направо, графы Доу порядка 1, 2, 3 и 4. Графы Доу, по мнению Джона, хороши прежде всего тем, что для них существует полиномиальный алгоритм поиска Гамильтонова пути. Однако от Вас требуется отвечать на запросы о нахождении кратчайшего по длине пути между вершинами ai и bi в графе D(n). Путь между парой вершин u и v в графе — это последовательность вершин x1, x2, ..., xk (k > 1) такая, что x1 = u, xk = v, и для любого i (i < k) вершины xi и xi + 1 связаны ребром графа. Длиной пути x1, x2, ..., xk называется число (k - 1). Выходные данные Для каждого запроса выведите в отдельной строке единственное целое число — длину кратчайшего пути между вершинами ai и bi. Ответы на запросы выводите в том порядке, в котором запросы заданы во входных данных.
| |
|
|
E. Быстрая Черепаха
битмаски
дп
разделяй и властвуй
*3000
У Джона Доу есть поле, представляющее собой прямоугольную таблицу размера n × m. Будем считать, что строки поля пронумерованы от 1 до n сверху вниз, а столбцы поля от 1 до m слева направо. Тогда клетка поля, стоящая на пересечении x-ой строки y-го столбца, имеет координаты (x; y). Известно, что некоторые клетки поля Джона покрашены в белый, а некоторые — в черный цвет. Так же у Джона есть черепаха, которая может двигаться по белым клеткам поля. Из белой клетки с координатами (x; y) черепаха Джона может попасть в клетку (x + 1; y) или (x; y + 1), если соответствующая клетка покрашена в белый цвет. Другими словами, черепаха может ходить только белым клеткам поля вправо или вниз. Черепаха не может выходить за пределы поля. В добавок ко всему у Джона есть q запросов, каждый из которых характеризуется четырьмя числами x1, y1, x2, y2 (x1 ≤ x2, y1 ≤ y2). Для каждого запроса Джон хочет узнать, сможет ли черепаха, стартовав в клетке c координатами (x1; y1), дойти до клетки с координатами (x2; y2), двигаясь только по белым клеткам поля. Выходные данные Для каждого из q запросов выведите в отдельной строке «Yes», если существует путь из клетки (x1; y1) в клетку (x2; y2), отвечающий требованиям, и «No» в противном случае. Ответы на запросы выводите в том порядке, в котором запросы заданы во входных данных.
| |
|
|
G. Тренировки
Конструктив
разделяй и властвуй
реализация
*1600
До ежегодного чемпионата Берляндии по футболу осталось совсем немного времени. Поэтому тренер «Мясгазочки» решил возобновить тренировки, прерванные по неопределенным причинам на неопределенный срок. Всего в «Мясгазочке» играет n футболистов. У каждого футболиста в команде есть номер — уникальное целое число от 1 до n. Для подготовки к чемпионату тренер Калич Евгеньевич решил провести некоторое количество тренировок. Над тем, как нужно проводить тренировки, Калич Евгеньевич думал долгими ночами своего отпуска. Он пришел к очень сложной схеме тренировок. Каждая тренировка состоит из одной игры, в которой участвуют все n игроков команды. Игроки некоторым образом разбиваются на две команды. При этом в командах может быть разное количество игроков, но в каждой из команд должно оказаться хотя бы по одному игроку. Тренер стремится к тому, чтобы после серии тренировок для каждой пары игроков существовала хотя бы одна тренировка, во время которой они играли в разных командах. Поскольку силы игроков ограничены, тренер хочет достигнуть цели за наименьшее число тренировок. Помогите ему составить расписание тренировок. Выходные данные В первой строке выведите m — наименьшее количество тренировок, которое придется провести тренеру. Затем выведите описания тренировок в m строках. В i-ой из этих строк выведите fi — количество игроков в первой команде во время i-й тренировки (1 ≤ fi < n), и fi чисел от 1 до n — номера игроков в первой команде. Все остальные игроки во время этой тренировки будут играть во второй команде. Числа в строке разделяйте пробелами. Номера игроков выводите в любом порядке. Если оптимальных решений несколько, выведите любое из них.
| |
|
|
E. Близкие вершины
Деревья
разделяй и властвуй
Структуры данных
*2700
Дано взвешенное дерево из n вершин. Каждое ребро имеет неотрицательный вес. Длиной пути между двумя вершинами дерева называется количество ребер в пути. Весом пути называется суммарный вес всех входящих в него ребер. Две вершины называются близкими, если существует путь между двумя этими вершинами длины не более l и также существует путь между ними веса не более w. Посчитайте количество пар вершин v, u (v < u), таких, что вершины v и u близкие. Выходные данные Выведите единственное целое число — количество близких пар. Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.
| |
|
|
C. Командир Ciel
Деревья
жадные алгоритмы
Конструктив
поиск в глубину и подобное
разделяй и властвуй
*2100
Лиса Ciel становится командиром Древоземелья. В Древоземелье, как это следует из названия, есть n городов, соединенных n - 1 ненаправленными дорогами, а между любыми двумя городами существует путь по дорогам Древоземелья. Лиса Ciel должна назначить каждому городу офицера. У каждого офицера есть ранг — буква от 'A' до 'Z'. Таким образом, имеется 26 различных рангов, самый высокий — 'A', самый низкий — 'Z'. У Ciel имеется достаточно офицеров каждого ранга. Но не все так просто, должно быть выполнено особое условие: если x, y — два различных города и у их офицеров одинаковые ранги, то на простом пути между x и y должен быть город z, имеющий офицера более высокого ранга. Таким образом, общение между офицерами одного ранга будет гарантированно проходить под присмотром офицера более высокого ранга. Помогите Ciel составить подходящий план назначения офицеров городам. Если это невозможно, выведите «Impossible!». Выходные данные Если подходящий план существует, выведите n символов, разделенных пробелами — i-ый символ обозначает ранг офицера в городе i. В противном случае, выведите «Impossible!». Примечание В первом примере для любых двух офицеров ранга 'B', офицер с рангом 'А' будет на пути между ними. То есть, такое решение подходит.
| |
|
|
E. Ciel и гондолы
дп
разделяй и властвуй
Структуры данных
*2600
Лиса Ciel зашла в парк аттракционов. И вот, она в очереди на колесо обозрения. В очереди стоит n людей (хотя нет, скорее лис): мы будем считать, что первая лиса стоит в начале очереди, а n-ая лиса стоит в хвосте очереди. Всего имеется k гондол, мы распределяем лис по гондолам следующим образом: - Когда подплывает первая гондола, q1 лис переходят из начала очереди в подплывшую гондолу.
- Затем, когда подплывает вторая гондола, q2 лис из начала оставшейся очереди переходит в эту гондолу.
... - Оставшиеся qk лис идут с последнюю (k-ую) гондолу.
Обратите внимание, что числа q1, q2, ..., qk должны быть положительные. Из условия следует, что и qi > 0. Вы знаете как лисам не хочется задерживаться в гондолах с незнакомцами. Итак, Ваша задача — найти оптимальный способ размещения (то есть определить оптимальную последовательность q), чтобы угодить всем. Для каждой пары лис i и j задано значение uij, обозначающее степень незнакомости. Можете считать, что uij = uji для всех i, j (1 ≤ i, j ≤ n) и что uii = 0 для всех i (1 ≤ i ≤ n). Тогда значение незнакомости в гондоле определяется как сумма значений незнакомости между всеми парами лис, которые находятся в этой гондоле. Общее значение незнакомости определяется как сумма значений незнакомости по всем гондолам. Помогите лисе Ciel найти минимальное возможное значение общей незнакомости при некотором оптимальном распределении лис по гондолам. Выходные данные Выведите целое число — минимальное возможное значение общей незнакомости. Примечание В первом примере можно распределить лис вот так: {1, 2} идут в одну гондолу, {3, 4, 5} идут в другую гондолу. Во втором примере оптимальное распределение таково: {1, 2, 3} | {4, 5, 6} | {7, 8}.
| |
|
|
D. Книга Зла
Деревья
дп
поиск в глубину и подобное
разделяй и властвуй
*2000
Паладин Манао напал на след древней Книги Зла в одной болотистой местности. Всего в этой местности расположено n населенных пунктов, пронумерованных числами от 1 до n. Из-за того, что передвигаться по местности очень сложно, люди вытоптали ровно n - 1 тропинок, каждая из которых соединяет некоторую пару населенных пунктов. По каждой из этих тропинок можно передвигаться в обоих направлениях. Из любого населенного пункта можно попасть в любой другой, перейдя по одной или нескольким тропинкам. Назовем расстоянием между двумя населенными пунктами наименьшее количество тропинок, которые надо пересечь, чтобы попасть из одного пункта в другой. Манао известно, что у искомой им Книги Зла радиус действия d. Это означает, что если Книга Зла находится в некотором населенном пункте, то ее пагубное влияние (например, явление привидений и оборотней) распространяется в населенных пунктах на расстоянии d или меньше от него. Манао услышал, что влияние Книги Зла было замечено в m населенных пунктах с номерами p1, p2, ..., pm. Заметим, что Книга возможно влияет и на другие населенные пункты, просто этого еще никто не заметил. Он хочет определить, в каких из населенных пунктов может находиться эта Книга. Помогите ему в этой непростой задаче. Выходные данные Выведите единственное число — количество населенных пунктов, в которых может находиться Книга Зла. Возможно, что информация, дошедшая до Манао, противоречива и не существует такого населенного пункта, где может находиться Книга. В таком случае выведите 0. Примечание Пример 1. Радиус действия Книги Зла равен 3-ем, а ее воздействие было замечено в населенных пунктах 1 и 2. Таким образом, она может находиться в населенных пунктах под номерами 3, 4 и 5.
| |
|
|
E. Ксюша и дерево
Деревья
разделяй и властвуй
Структуры данных
*2400
У программиста Ксюши есть дерево, состоящее из n вершин. Будем считать, что вершины дерева пронумерованы от 1 до n. Также будем считать, что первоначально вершина номер 1 покрашена в красный цвет, а остальные вершины покрашены в синий цвет. Расстоянием между двумя вершинами дерева v и u будем называть количество ребер в кратчайшем пути между v и u. Ксюше нужно научиться быстро выполнять запросы двух видов: - покрасить заданную синюю вершину в красный цвет;
- посчитать, какая красная вершина ближе всего к заданной и вывести кратчайшее расстояние до ближайшей красной вершины.
Ваша задача — написать программу, которая будет выполнять описанные запросы. Выходные данные Для каждого запроса второго типа выведите ответ на отдельной строке.
| |
|
|
E. Насосные станции
графы
Деревья
жадные алгоритмы
Перебор
поиск в глубину и подобное
Потоки
разделяй и властвуй
*2900
Безумный ученый Майк устроился на работу. Его задача — управлять системой насосных станций для перекачки воды. Система состоит из n насосных станций, которые пронумерованы целыми числами от 1 до n. Некоторые пары станций соединены двунаправленными трубами, по которым может течь вода в том или другом направлении (но одновременно только в одном). Для каждой трубы задана пропускная способность — наибольшее количество литров воды, которое может через нее протекать в течение одного часа. Каждая насосная станция может перекачивать входящую воду из одних станций в другие станции по трубам при условии, что за один час общее входящее в эту станцию количество литров воды равняется общему исходящему из этой станции количеству литров воды. В обязанности Майка входит перекачивание воды между станциями. Из станции a в станцию b по трубам (возможно, через другие станции) в течение одного часа можно пустить какое-то количество литров воды согласно правилам, описанным выше. В течение этого времени вода из других станций не может втекать в станцию a, и не может вытекать из станции b, при том из станции a может вытекать любое количество воды, и в станцию b может втекать любое количество воды. Если из станции a за час в общем было выкачано x литров воды, то Майк получает к зарплате x бублей. Чтобы получить зарплату, Майк по контракту должен работать n - 1 дней. В первый день он выбирает две станции v1 и v2, и в течение одного часа перекачивает определённое количество воды из v1 в v2. Далее в i-тый день Майк выбирает до этого ни разу не выбранную станцию vi + 1, и в течение одного часа перекачивает определенное количество воды из станции vi в станцию vi + 1. При этом количество перекачиваемой воды в i-тый день не зависит от количества перекачиваемой воды в (i - 1)-ый день. Для своих проектов Майку нужно заработать как можно больше бублей. Помогите Майку найти такую перестановку номеров станций v1, v2, ..., vn, при которой Майк может заработать наибольшую возможную зарплату. Выходные данные В первой строке выведите одно целое число — наибольшее значение зарплаты, которую может получить Майк. В второй строке через пробелы выведите перестановку из n чисел от 1 до n — номера станций последовательности v1, v2, ..., vn. Если существует несколько ответов, выведите любой.
| |
|
|
E. Пустые прямоугольники
разделяй и властвуй
*3000
Дана таблица n × m (n строк и m столбцов), в каждой ячейке которой стоит «0» или «1». Требуется посчитать количество прямоугольников со сторонами, параллельными сторонам таблицы и проходящими по границам ячеек, таких, что количество единиц в прямоугольнике равно k. Выходные данные Выведите единственное число — количество прямоугольников, количество единиц в которых равно k. Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.
| |
|
|
B. Весело считать прямоугольники
дп
Перебор
разделяй и властвуй
*1900
Дана таблица размера n × m, в каждой ячейке которой записано целое число: ноль или единица. Обозначим ячейку в i-ой строке и j-ом столбце как (i, j). Определим «прямоугольник» четверкой целых чисел a, b, c, d (1 ≤ a ≤ c ≤ n; 1 ≤ b ≤ d ≤ m). Прямоугольник задает множество ячеек таблицы {(x, y) : a ≤ x ≤ c, b ≤ y ≤ d}. Определим «хороший прямоугольник» как прямоугольник, включающий только ячейки с нулями. Вам надо ответить на следующие q запросов: посчитать количество хороших прямоугольников, у которых все ячейки содержатся в данном прямоугольнике. Выходные данные Для каждого запроса выведите ответ — единственное целое число на отдельной строке. Примечание В первом примере дана квадратная таблицы размера 5 × 5, а первый, второй и третий запросы представлены в следующем рисунке. - В первом запросе есть 10 хороших прямоугольников, пять размера 1 × 1, два — 2 × 1, два — 1 × 2 и один — 1 × 3.
- Во втором запросе есть всего один хороший прямоугольник размера 1 × 1.
- В третьем запросе есть 7 хороших прямоугольников, четыре размера 1 × 1, два размера 2 × 1 и один размера 3 × 1.
| |
|
|
F. Новогоднее дерево
Деревья
разделяй и властвуй
Структуры данных
*2400
Вы — программист, и у вас есть новогоднее дерево (нет, не елка) — дерево из четырех вершин: одна вершина степени три (имеет номер 1), связанная с тремя листами (имеют номера от 2 до 4). На новый год программисты обычно веселятся, вот и вы решили повеселиться, добавляя вершины в свое дерево. При этом одна операция добавления выглядит следующим образом: - Сначала выбирается некоторой лист дерева с номером v.
- Обозначим количество вершин в дереве на данный момент переменной n, тогда в дерево добавляются две вершины с номерами n + 1 и n + 2, а также ребро между вершинами v и n + 1 и ребро между вершинами v и n + 2.
Как и полагается, ваша задача не просто промоделировать процесс добавления вершин в дерево, но и после каждой операции добавления выводить диаметр текущего дерева. Вперед, на решение новогодней задачи! Выходные данные Выведите q целых чисел — диаметр текущего дерева после каждой операции.
| |
|
|
E. Гласные
дп
Комбинаторика
разделяй и властвуй
*2700
Яхубина устала от всех этих сложных языков, так что она решила изобрести новый, простой язык. Она уже составила словарь, сожержащий n 3-слов. 3-слово — это последовательность из ровно трех строчных букв из первых 24 букв английского алфавита (от a до x). Она решила, что некоторые буквы должны быть гласными, а остальные — согласными. Весь язык будет основываться на простом правиле: слово, которое содержит как минимум одну гласную, считается корректным. Яхубина забыла, какие буквы являются гласными, а какие — согласными, и хочет найти некоторые, возможно, корректные наборы гласных. Для этого она задает Яхубу вопросы. Каждый вопрос — это набор букв. Для каждого вопроса Яхубина хочет знать, сколько слов в словаре корректны, учитывая, что данный набор букв является гласными, а остальные буквы согласные. Яхубина хочет знать xor квадратов ответов на все возможные вопросы. Всего есть 224 вопросов (все подмножества множества первых 24 строчных букв английского алфавита). Помогите Яхубу найти это число. Выходные данные Выведите единственное число — xor квадратов ответов на все запросы.
| |
|
|
E. Лабиринт 2D
разделяй и властвуй
Структуры данных
*2200
Последняя разработка компании R2 в сфере 2D игр — это новый революционный алгоритм поиска кратчайшего пути в лабиринте 2 × n. Представьте лабиринт, который выглядит как прямоугольник 2 × n, разделенный на единичные квадраты. Каждый единичный квадрат — это либо свободная клетка, либо препятствие. За единицу времени некто может переместиться из свободной клетки лабиринта в любую соседнюю по стороне свободную клетку. Задача о кратчайшем пути формулируется следующим образом. Заданы две свободные клетки лабиринта, нужно определить, какое наименьшее время потребуется, чтобы дойти от одной до другой. К сожалению, разработанный алгоритм хорошо работает только для одного запроса на поиск кратчайшего пути, на практике же таких запросов возникает достаточно много. Вам, как главному программисту R2, поручено оптимизировать алгоритм поиска кратчайшего пути. Напишите программу, которая эффективно будет отвечать на запросы поиска кратчайшего пути в лабиринте 2 × n. Выходные данные Выведите m строк. В i-й строке выведите ответ на i-й запрос — величину кратчайшего пути, или -1, если из первой клетки запроса нельзя дойти до второй.
| |
|
|
C. Машмох и операция реверс
Комбинаторика
разделяй и властвуй
*2100
Бимоху, начальнику Машмоха, Машмох не нравился. Вот он его и уволил. Решил тогда Машмох новую работу не искать, а поступить в университет и поучаствовать в ACM. Машмох хочет попасть в команду Бамоха. Для этого ему дали (в качестве испытания) несколько задач по программированию и неделю на их решение. Машмох не шибко умудренный программист. В общем-то, он и не программист вовсе. Так что ничего он не решил, а попросил вас помочь ему с этими заданиями. Одно из них такое: Вам дан массив a длины 2n, а также m запросов. Запрос номер i характеризуется целым числом qi. В ответ на i-й запрос вы должны выполнить последовательность операций: - разбить массив на 2n - qi частей, где каждая часть — подмассив, состоящий из 2qi чисел; j-й подмассив (1 ≤ j ≤ 2n - qi) должен содержать элементы a[(j - 1)·2qi + 1], a[(j - 1)·2qi + 2], ..., a[(j - 1)·2qi + 2qi];
- выполнить реверс элементов каждого подмассива;
- склеить все подмассивы в один массив в том же порядке (этот массив станет новым массивом a);
- вывести количество инверсий в новом массиве a.
Вам дан исходный массив a и все запросы. Ответьте на все запросы. Обратите внимание, что изменения от запроса сохраняются для последующих запросов. Выходные данные Выведите m строк. В i-й строке выведите ответ (количество инверсий) на i-й запрос. Примечание При выполнении реверса массива x[1], x[2], ..., x[n] получается новый массив y[1], y[2], ..., y[n], где y[i] = x[n - i + 1] для каждого i. Количество инверсий массива x[1], x[2], ..., x[n] — это количество пар индексов i, j, таких, что: i < j и x[i] > x[j].
| |
|
|
D. Хитрая функция
геометрия
разделяй и властвуй
Структуры данных
*2200
Яхуб и Сорин — лучшие спортивные программисты в своем городе. Но ведь нельзя послать их обоих на важный контест. Поедет тот, кто решит одну-единственную задачу. Блатнаталаг, друг Яхуба, умудрился заполучить задачу до начала контеста. Он хочет, чтобы Яхуб прошел, и поэтому рассказал ему условие этой задачи. Вам дан массив a (1-индексированный), состоящий из n чисел. Определим функцию f(i, j) (1 ≤ i, j ≤ n) как (i - j)2 + g(i, j)2. Функция g считается следующим псевдо-кодом: int g(int i, int j) { int sum = 0; for (int k = min(i, j) + 1; k <= max(i, j); k = k + 1) sum = sum + a[k]; return sum; }
Требуется посчитать значение mini ≠ j f(i, j). Яхуб уже нашел решение задачи. А вы сможете? Выходные данные В единственной строке выведите ответ на задачу.
| |
|
|
E. Дерево Фурукава Нагисы
Бинарный поиск
Деревья
разделяй и властвуй
сортировки
*3000
Однажды Оказаки Томоя купил дерево на день рождения Фурукава Нагисы. Дерево было немного странное, у каждой вершины дерева было написано значение. Обозначим значение у i-й вершины переменной vi. Теперь Фурукава Нагиса и Оказаки Томоя хотят сыграть в игру с деревом. Пусть (s, e) — путь из вершины s к вершине e дерева, тогда можно записать последовательность значений вершин на пути (s, e) и обозначить эту последовательность как S(s, e). Определим функцию G от последовательности S(s, e) следующим образом. Предположим, что последовательность равна z0, z1...zl - 1, где l — длина последовательности. Определим G(S(s, e)) = z0 × k0 + z1 × k1 + ... + zl - 1 × kl - 1. Если путь (s, e) удовлетворяет , тогда путь (s, e) принадлежит Фурукава Нагисе, в противном случае он принадлежит Оказаки Томоя. Считать, у кого больше путей, слишком легко, поэтому ребята хотят поиграть во что-то посложнее. Фурукава Нагиса выдвинула гипотезу: - если пути (p1, p2) и (p2, p3) принадлежат ей, то и путь (p1, p3) тоже принадлежит ей;
- если пути (p1, p2) и (p2, p3) принадлежат Оказаки Томоя, то и путь (p1, p3) тоже принадлежит Оказаки Томоя.
Конечно, описанное выполняется не для всех троек (p1, p2, p3). Итак, теперь Фурукава Нагиса хочет узнать, сколько троек (p1, p2, p3) удовлетворяют ее условию — и это ваша задача. Выходные данные Выведите единственное целое число — количество троек, удовлетворяющих гипотезе Фурукава Нагисы.
| |
|
|
E. Ребенок и двоичное дерево
бпф
Комбинаторика
разделяй и властвуй
теория чисел
*3100
Наш ребенок обожает информатику, особенно двоичные деревья. Рассмотрим последовательность из n различных целых чисел: c1, c2, ..., cn. Ребенок называет двоичное корневое дерево со взвешенными вершинами хорошим тогда и только тогда, когда для каждой вершины v, вес v — это элемент множества {c1, c2, ..., cn}. Также наш ребенок считает, что вес дерева со взвешенными вершинами равняется сумме весов всех вершин. Задано число m, сможете ли вы для всех s (1 ≤ s ≤ m) посчитать количество хороших двоичных корневых деревьев со взвешенными вершинами с весом s? Для более глубокого понимания того, какие деревья считаются различными, пожалуйста, посмотрите примеры тестовых данных. Выведите ответ по модулю 998244353 (7 × 17 × 223 + 1, простое число). Выходные данные Выведите m строк, каждая строка должна содержать единственное целое число. В i-й строке должно быть записано количество хороших двоичных корневых деревьев со взвешенными вершинами с весом i. Выведите ответ по модулю 998244353 (7 × 17 × 223 + 1, простое число). Примечание В первом примере существует 9 хороших двоичных корневых деревьев со взвешенными вершинами, чей вес равняется ровно 3:
| |
|
|
C. Про покраску забора
дп
жадные алгоритмы
разделяй и властвуй
*1900
Бизон-Чемпион не только внимательный, но и очень трудолюбивый. Бизон-Чемпион решил покрасить свой старый забор в свой любимый оранжевый цвет. Забор представляет из себя n вертикальных досок, расположенных в ряд. Между соседними досками нет зазора. Доски нумеруются слева направо начиная с единицы, i-я доска имеет ширину 1 метр и высоту ai метров. Бизон-Чемпион купил в магазине кисть шириной 1 метр. Он умеет делать вертикальные и горизонтальные мазки этой кистью. Причем во время мазка кисть должна непрерывно и полностью касаться забора (смотрите пояснения примеров для лучшего понимания). Какое минимальное количество мазков придется сделать Бизону-Чемпиону, чтобы полностью покрасить забор? Обратите внимание, что разрешается красить один и тот же участок забора несколько раз. Выходные данные Выведите целое число — минимальное количество мазков, необходимых для покраски всего забора. Примечание В первом примере можно покрасить забор за три мазка кистью: первый проходит на высоте 1 горизонтально по всем доскам, второй — на высоте 2 горизонтально красит первую и вторую доски, а третий мазок (он может быть как горизонтальный, так и вертикальный) докрашивает четвертую доску. Во втором примере можно покрасить забор как двумя горизонтальными, так и двумя вертикальными мазками. В третьем примере всего одна доска, которую можно покрасить, используя один вертикальный мазок.
| |
|
|
F. Перестановка
разделяй и властвуй
Структуры данных
хэши
*2700
Вам дана перестановка чисел от 1 до n. Определите, существуют ли такие два целых числа a и b (1 ≤ a, b ≤ n; a ≠ b), что число (заметьте, что деление не целочисленное, а обычное) находится между a и b в заданной перестановке. Выходные данные Выведите «YES», если описанная пара чисел в перестановке встречается, или «NO» в противном случае (в обоих случаях без кавычек, регистр букв не имеет значения). Примечание Во втором примере 2 находится между 1 и 3. Кроме того, 4 находится между 3 и 5.
| |
|
|
D. Задача Пашмака и Пармиды
разделяй и властвуй
сортировки
Структуры данных
*1800
Пармида — умная девушка, в этом году она хочет принять участие в олимпиаде. Конечно, она хочет, чтобы ее парень тоже был умным! Девушка приготовила следующую тестовую задачу для Пашмака. Задана последовательность a, состоящая из n целых чисел: a1, a2, ..., an. Обозначим за f(l, r, x) количество таких индексов k, что: l ≤ k ≤ r и x = ak. Требуется посчитать количество таких пар индексов i, j (1 ≤ i < j ≤ n), что f(1, i, ai) > f(j, n, aj). Помогите Пашмаку с этой задачей. Выходные данные Выведите единственное целое число — ответ на задачу.
| |
|
|
E. Парковка
разделяй и властвуй
Структуры данных
*2800
Петя скучает на работе и от нечего делать разглядывает парковку у офиса. Парковка сверху выглядит как таблица n × m (ячейка таблицы соответствует одному парковочному месту). Некоторые места на парковке заняты, а остальные свободны. Петя наблюдает за тем, как на парковку одна за другой заезжают машины. После того, как очередная машина находит свое место на парковке, Петя ради развлечения подсчитывает, какой наибольший квадрат из свободных мест (т.е. квадратную подтаблицу) можно увидеть на парковке, если смотреть на нее сверху, и выписывает размер (длину стороны) этого квадрата в блокнот. Ваша задача — по состоянию парковки в начальный момент времени и данным о том, где паркуются прибывающие машины, восстановить то, что Петя записал себе в блокнот. Поскольку рабочий день еще в разгаре, с парковки никто не уезжает. Выходные данные Выведите k чисел — длину стороны максимального квадрата из свободных клеток в таблице после заезда очередной машины.
| |
|
|
F. Новогодние покупки
дп
разделяй и властвуй
*2700
Dohyun управляет продуктовым магазином. Он продает n товаров, пронумерованных целыми числами от 1 до n. i-й (1 ≤ i ≤ n) из них стоит ci долларов, и его покупка добавляет hi единиц счастья. Каждый товар можно держать на прилавке только p единиц времени, пока он не потеряет свежесть. Таким образом, Dohyun выставляет на прилавок i-й товар в момент времени ti, и покупатели могут купить этот товар только во время от ti до ti + (p - 1) включительно. Также покупателям не разрешается покупать один и тот же товар более одного раза. Я бы хотел посетить продуктовый магазин Dohyun'а и купить некоторые товары для новогодней вечеринки, максимизировав при этом своё счастье. Так как я очень занятой человек, я могу посетить магазин только один раз и очень ненадолго. Иными словами, если я зайду в магазин во время t, то я могу купить только товары, доступные во время t. Но я могу купить произвольное количество товаров, пока их стоимость не превзойдёт мой бюджет. Я не могу купить один и тот же товар более одного раза, согласно правилам магазина. Не требуется расходовать весь бюджет. Я написал список из q пар целых чисел (aj, bj), что означает, что я могу посетить магазин в момент времени aj, и потратить там не более bj долларов. Для каждой пары я бы хотел знать максимальное достижимое значение счастья по итогам посещения магазина. Но пар так много, что я не могу с ними справиться. Вы можете мне помочь? Выходные данные Для каждого варианта выведите единственную строку, содержащую максимальное количество счастья, достижимое путем покупки некоторых товаров. Примечание Рассмотрим первый пример. - В момент времени 1 доступен только 2-й товар. Можно купить 2-й товар за 3 доллара и мое счастье возрастет на 5.
- В момент времени 2 доступны 1-й, 2-й и 3-й товары. Я могу купить 1-й товар за 2 доллара и 2-й товар за 3 доллара. Мое счастье возрастет на 3 + 5 = 8.
- В момент времени 2 доступны 1-й, 2-й и 3-й товар. Я могу купить 1-й товар за 2 доллара и 3-й товар за 4 доллара. Моё счастье возрастет на 3 + 7 = 10.
- В момент времени 5 доступны 1-й, 3-й и 4-й товары. Я могу купить 1-й товар за 2 доллара и 4-й товар за 11 долларов. Моё счастье возрастет на 3 + 15 = 18. Обратите внимание, что мне не надо использовать весь бюджет в этом случае.
| |
|
|
E. Лиса и многоугольник
Конструктив
разделяй и властвуй
*2900
Лиса Ciel разработала игру-головоломку под названием «Многоугольник». В эту игру играют, используя триангуляции правильного n-угольника. Цель игры — преобразовать одну триангуляцию в другую, согласно определенным правилам.  Триангуляция n-угольника — это набор из n - 3 диагоналей, удовлетворяющих условию, что никакие две диагонали не имеют общих внутренних точек. Например, изначальное состояние игры может выглядеть как (a) на рисунке, данном выше, а требуемое может выглядеть как (c). На каждом шагу вы можете выбрать диагональ триангуляции (но не ребро!) и инвертировать эту диагональ. Объясним, что значит инвертировать. Допустим, вы хотите инвертировать диагональ a – b. Есть два треугольника со стороной a – b, обозначим их как a – b – c и a – b – d. В результате этой операции диагональ a – b заменяется диагональю c – d. Легко доказать, что после операции инвертирования получившийся набор диагоналей остается триангуляцией данного многоугольника. Итак, чтобы решить приведенную выше задачу, можно сперва инвертировать диагональ 6 – 3, заменив её на диагональ 2 – 4. Затем можно инвертировать диагональ 6 – 4 и получить в результате рисунок (c). Ciel только что доказала, что для любой начальной и конечной триангуляции у этой головоломки есть решение. Она хочет, чтобы вы решили задачу не более, чем за 20 000 шагов при условии n ≤ 1000. Выходные данные Сперва выведите целое число k (0 ≤ k ≤ 20, 000), количество шагов. Затем выведите k строк, в каждой строке должно следовать 2 целых числа, ai и bi — концы диагонали, которую вы хотите инвертировать на шаге номер i. Между собой ai и bi можно выводить в любом порядке. Если есть несколько возможных решений, выведите любое из них. Примечание Второй пример из условия обсуждается выше и показан на картинке.
| |
|
|
F. Монстры из пудинга
разделяй и властвуй
Структуры данных
*3000
В данной задаче речь пойдёт про упрощённую модель игры Pudding Monsters. Важным этапом разработки любой игры является создание игровых карт. Поле для игры в Pudding Monsters представляет собой квадратную сетку n × n, в n клетках которой расположены монстры, а в некоторых остальных — игровые объекты. Игровая механика заключается в том, что игрок должен перемещать монстров по полю, при этом, оказавшись рядом, два маленьких монстра склеиваются в одного большого (они ведь из пудинга, вы же помните?). Исследования показали, что самые интересные карты получаются, если исходно в каждой вертикали и каждой горизонтали расположено по монстру, а дальнейшая специфика карты уже задаётся правильной расстановкой остальных игровых объектов. Частым приёмом для упрощения процесса разработки является переиспользование имеющихся ресурсов. Например, имея большую карту n × n, можно выделить из неё квадратную часть меньшего размера k × k, содержащую k монстров, и предложить в качестве упрощённой версии оригинальной карты. Вас интересует, сколькими способами можно выделить из исходной карты квадратный фрагмент k × k (1 ≤ k ≤ n), содержащий ровно k монстров из пудинга. Определите это количество. Выходные данные Выведите количество различных квадратных фрагментов исходного поля, которые можно выделить в качестве самостоятельной карты.
| |
|
|
E. Тавас в пути
Деревья
разделяй и властвуй
Структуры данных
*3100
Тавас живет в Тавасполисе. В Тавасполисе n городов, пронумерованных от 1 до n, соединенных n - 1 двунаправленными дорогами. Между любыми двумя городами есть путь. Также у каждой дороги есть длина. Любимые строки Таваса — двоичные строки (содержащие только 0 и 1). Для любой двоичной строки типа s = s1s2... sk, определим T(s) — значение этой строки. T(s) вычисляется следующим способом: Предположим, что в строке s ровно m блоков цифр 1 (блок цифр 1 — это максимальная подстрока s, которая содержит только единицы) длинами x1, x2, ..., xm. Определим , где f — данная последовательность чисел (в частности, если m = 0, то T(s) = 0). Тавас любит запросы. Он просит Вас ответить на q запросов. В каждом запросе он дает вам числа v, u, l, а вам следует вывести следующее число: Рассмотрим дороги на пути из города v в город u: e1, e2, ..., ex. Построим бинарную строку b длины x, такую, что: bi = 1 тогда и только тогда, когда l ≤ w(ei), где w(e) — длина дороги e. Результатом запроса является строка T(b). Выходные данные Выведите ответ на каждый запрос на отдельной строке.
| |
|
|
F. Юра и разработчики
разделяй и властвуй
Структуры данных
*2800
У Юры есть команда из k разработчиков и список из n заданий, пронумерованных от 1 до n. Юра собирается выбрать некоторые задания, чтобы сделать их на этой неделе. Из-за странных традиций в компании Looksery, номера сделанных заданий должно быть отрезком последовательных целых чисел, содержащим не менее 2 чисел, то есть последовательность вида l, l + 1, ..., r для некоторых 1 ≤ l < r ≤ n. С каждым заданием i связано целое число ai, обозначающее количество человекочасов, необходимых для выполнения i-го задания. Разработчики не всегда бывают в себе уверены, и, в общем-то, боятся сложных заданий. Зная это, Юра решил взять самое сложное задание (то, на которое уйдет наибольшее количество человекочасов, из нескольких самых сложных заданий с одинаковы уровнем сложности он выбирает произвольное задание) и сделать его самому. Таким образом, если выбраны задания с номерами [l, r], то разработчикам остается самостоятельно завершить ровно r - l заданий. Каждый разработчик может провести любое целочисленное количество часов над любым заданием, но когда вся работа завершена, i-му заданию должно быть уделено ровно ai человекочасов. И наконец, проблема в том, что разработчик злится, когда он работает больше другого разработчика. Множество заданий [l, r] считается хорошим, если можно найти такое распределение работы, что все задания можно выполнить, а все разработчики работают одинаковое количество времени (количество работы, которую произведёт Юра, не имеет значения ни для него, ни для других разработчиков). Для примера предположим, что Юра выбрал задания со следующими сложностями: a = [1, 2, 3, 4], а у него в распоряжении три разработчика. Юра берет себе самое сложное, четвертое задание, а разработчикам дает задания со сложностями [1, 2, 3]. Если первый разработчик тратит час на первое задание и час на третье, второй разработчик тратит два часа на второе задание, а третий разработчик тратит два часа на третье задание, то когда вся работа будет завершена, окажется, что каждый разработчик работал ровно два часа, а над каждым заданием работали необходимое время. В качестве ещё одного примера скажем, что если бы на первое задание требовалось два часа, а не один, то тогда было бы невозможно распределить задания способом, описанным выше. Помимо работы Юра обожает решать задачи. Ему интересно, сколько есть пар (l, r) (1 ≤ l < r ≤ n), таких, что отрезок [l, r] является хорошим? Юра уже решил эту задачу, но времени написать код у него нет. Пожалуйста, помогите Юре и реализуйте решение этой задачи. Выходные данные Выведите единственное целое число — количество пар (l, r), удовлетворяющих условиям задачи. Примечание В первом примере существует три хороших отрезка с заданиями: - [1;3] — самое сложное задание требует 3 человекочаса, так что разработчикам остаются задания требующие 1 и 2. Одним из возможных распределений является следующие: один разработчик выполняет первое задание в течении часа, пока двое других выполняют второе. Тогда каждый разработчик будет занят ровно час.
- [1;4] — самое сложное задание требует 4 человекочаса, так что разработчикам остаются задания требующие 1, 2 и 3. Если первый разработчик потратит час на первое задание и час на третье, второй разработчик потратит два часа на второе и третий два часа на третье, тогда они выполнят все задания, и каждый отработает ровно 2 часа.
- [3;4] —- самое сложное задание требует 4 человекочаса, так что остается только задание, требующее 3 человекочаса. Чтобы его выполнить, каждый разработчик потратит по 1 часу.
| |
|
|
B. Эквивалентные строки
разделяй и властвуй
сортировки
Строки
хэши
*1700
Сегодня на спецкурсе «Строки» Геральд узнал новое определение эквивалентности строк. Две строки a и b равной длины называются эквивалентными в одном из двух случаев: - Они равны.
- Если разделить строку a на две одинаковые по длине половины a1 и a2, а строку b — на две одинаковые по длине половины b1 и b2, то окажется, что верно одно из двух:
- a1 эквивалентно b1, а a2 эквивалентно b2
- a1 эквивалентно b2, а a2 эквивалентно b1
В качестве домашнего задания преподаватель выдал ученикам две строки и попросил определить, эквиваленты ли они. Геральд уже сделал это домашнее задание. Сделайте и вы! Выходные данные Выведите «YES» (без кавычек), если эти две строки эквивалентны, и «NO» (без кавычек) в противном случае. Примечание В первом примере первую строку можно разделить на строки "aa" и "ba", вторую – на строки "ab" и "aa". "aa" эквивалентно "aa"; "ab" эквивалентно "ba", так как "ab" = "a" + "b", "ba" = "b" + "a". Во втором примере первую строку можно разделить на строки "aa" и "bb", которые эквивалентны только сами себе. Поэтому строка "aabb" эквивалентна только сама себе и строке "bbaa".
| |
|
|
D. Мишка и кавалерия
дп
разделяй и властвуй
Структуры данных
*3000
Вы бы хотели поучаствовать в конном сражении с мишками? Я — не очень. Лимак — мишка гризли. Он генерал ужасной армии Мишляндии. Как вы знаете, самая важная часть армии — это, конечно, кавалерия. Кавалерия Мишляндии состоит из n воинов и n лошадей. У i-го воина сила равна wi, а у i-й лошади сила равна hi. Воин со своей лошадью называется юнитом. Сила юнита равна произведению сил воина и лошади. Общая сила кавалерии равна сумме сил всех n юнитов. Правильное распределение воинов и лошадей делает кавалерию по-настоящему мощной. Изначально i-му воину принадлежит i-я лошадь. Вам дано q запросов. После каждого запроса два воина меняются друг с другом лошадьми. Генерал Лимак должен быть готов к любой возможной ситуации. Что, если бы воинам было запрещено скакать на своих лошадях? Поэтому после каждого запроса вам требуется найти максимальную возможную силу кавалерии, если мы рассматриваем только такие сопоставления воинов лошадям, что ни одному воину не достается его собственная лошадь (можно доказать, что для n ≥ 2 всегда есть не менее одного корректного распределения). Выходные данные Выведите q строк с ответами на запросы. В i-й строке выведите максимальную возможную силу кавалерии после первых i запросов. Примечание Разъяснения к первому примеру: Воины: 1 10 100 1000Лошади: 3 7 2 5 После первого запроса ситуация выглядит следующим образом: Воины: 1 10 100 1000Лошади: 3 5 2 7 Мы можем получить 1·2 + 10·3 + 100·7 + 1000·5 = 5732 (обратите внимание, что ни один всадник не сядет на свою собственную лошадь в таком случае). После второго запроса мы вернемся к изначальной ситуации и оптимальное распределение таково: 1·2 + 10·3 + 100·5 + 1000·7 = 7532. Разъяснение ко второму примеру. После первого запроса: Воины: 7 11 5Кони: 2 3 1 Оптимальное распределение — 7·1 + 11·2 + 5·3 = 44. После второго запроса — 7·3 + 11·2 + 5·1 = 48. В конце — 7·2 + 11·3 + 5·1 = 52.
| |
|
|
C. Точки на плоскости
геометрия
жадные алгоритмы
Конструктив
разделяй и властвуй
сортировки
*2100
На плоскости расположены n точек (xi, yi) с целочисленными координатами от 0 до 106. Расстоянием между двумя точках с номерами a и b назовем следующую величину: (расстояние, вычисляемое по такой формуле, называется манхеттенским расстоянием). Назовем гамильтоновым путем некоторую перестановку pi от 1 до n. Назовем длиной этого пути величину . Найдите какой-нибудь гамильтонов путь с длиной не более, чем 25 × 108. Обратите внимание, минимизировать длину гамильтонова пути не требуется. Выходные данные Выведите перестановку чисел pi от 1 до n — искомый гамильтонов путь. Перестановка должна удовлетворять неравенству . Если возможных ответов несколько, разрешается вывести любой. Гарантируется, что существует подходящая перестановка. Примечание В тесте из условия, суммарное расстояние равно: 
(|5 - 3| + |0 - 4|) + (|3 - 0| + |4 - 7|) + (|0 - 8| + |7 - 10|) + (|8 - 9| + |10 - 12|) = 2 + 4 + 3 + 3 + 8 + 3 + 1 + 2 = 26
| |
|
|
E. Пастушеские странности
Деревья
математика
разделяй и властвуй
снм
Структуры данных
*3000
В стране Бурении есть n пастбищ, но нет дорог, их соединяющих. Конечно, это ужасная ситуация, поэтому Кевин Сан планирует исправить её, построив m двунаправленных дорог. Каждая дорога соединит какую пару пастбищ. Для того чтобы перемещение по дорогам было более эффективным, он также планирует замостить некоторые из этих новых дорог булыжником. Кевин очень дотошен в вопросе мощения путей. Так как он любит нечётные числа, то хочет, чтобы к каждому пастбищу вело нечётное число мощеных дорог. Назовём замощение дорог солнечным, если каждому пастбищу инцидентно нечётное количество замощёных дорог. Кроме того, короткие дороги нравятся Кевину больше, чем длинные, поэтому он хочет, чтобы самая длинная мощёная дорога была как можно короче. После добавления очередной дороги Кевин хочет знать, может ли он добиться солнечного замощения дорог Бурении, и если это так, то надо найти минимальную возможную длину самой длинной дороги, которую он замостит. Выходные данные Выведите m целых чисел, i-е из которых обозначает минимальную возможную длину самой длинной дороги в солнечном замощении после добавления первых i дорог. Если не существует такого замощения, что каждое пастбище инцидентно нечётному количеству мощёных дорог, то выведите - 1. Обратите внимание, что каждый раз рассматривается только гипотетическое замощение — ваш ответ после добавления i-й дороги не должен никак зависеть от ваших предыдущих ответов. Примечание В первом примере после добавления i-й дороги пути Кевин должен вымостить следующие из них: - Никакой набор дорог не подходит.
- Дорога номер 1 (длина 4) и номер 2 (длина 8).
- Дорога номер 1 (длина 4) и номер 2 (длина 8).
- Дорога номер 3 (длина 2) и номер 4 (длина 3).
Во втором примере нет ни одного солнечного замощения.
| |
|
|
D. Королевство и его города
графы
Деревья
дп
поиск в глубину и подобное
разделяй и властвуй
сортировки
*2800
В королевстве К готовились к свадьбе дочери Короля. Однако, чтобы не ударить в грязь лицом перед будущими родственниками, Королю сперва необходимо провести реформу королевства. Так как Королю не терпится выдать свою дочь замуж, этот вопрос ему нужно решить как можно скорее. Королевство в данный момент состоит из n городов. Города соединены с помощью n - 1 двунаправленной дороги, причём из каждого города можно добраться до любого другого города. Поскольку в былые времена Королю приходилось много экономить, между любыми двумя городами есть ровно один простой путь. В чём же суть реформы? Выяснилось, что для максимально эффективного управления ключевые функции государственного аппарата необходимо вынести в различные города (назовем такие города важными). Однако из-за того, что существует риск атаки со стороны варваров, это необходимо сделать осторожно. Король составил несколько планов, каждый из которых описывается набором важных городов, и теперь интересуется, какой же план лучше. Варвары могут захватывать некоторые города, не являющиеся важными (уж те-то, разумеется, будут достаточно укреплены), после этого через захваченный город становится невозможно проехать. В частности, интересной характеристикой плана является минимальное количество городов, которое необходимо захватить варварам, чтобы все важные города оказались попарно изолированы друг от друга, то есть ни из какого важного города нельзя было доехать ни до какого другого важного города. Помогите Королю посчитать эту характеристику для каждого своего плана. Выходные данные Для каждого плана выведите единственное число — минимальное количество городов, которое потребуется захватить варварам, или - 1, если все попытки варваров изолировать важные города обречены на провал. Примечание В первом тесте в первом и третьем плане варварам достаточно захватить город 3. Во втором и четвёртом плане все попытки будут обречены на провал. Во втором тесте варварам достаточно захватить города 3 и 5.
| |
|
|
C. Доставка посылки
жадные алгоритмы
разделяй и властвуй
Структуры данных
*2200
Джонни управляет трактором и должен доставить посылку из одного города в другой. Оба города расположены на числовой прямой, при этом Джонни начинает в точке 0 и должен добраться до точки d. Топливный бак трактора Джонни вмещает не больше чем n литров топлива и изначально заполнен до предела. На то, чтобы проехать одну единицу расстояния, тратится ровно один литр топлива. Вдоль пути расположены m заправок, при этом i-я заправка находится в точке xi и продаёт бензин по pi долларов за литр. Количество бензина на каждой заправке не ограничено. Определите минимальное количество денег, которое придётся потратить Джонни, чтобы доставить посылку. Выходные данные Выведите единственно целое число — минимальное количество денег, которое придётся потратить, чтобы доставить посылку из точки 0 в точку d. Если доставить посылку невозможно, то выведите -1. Примечание В первом примере топливный бак вмещает 4 литра. Джонни может проехать 3 единицы расстояния до первой заправки, залить там в бак 2 литра (в баке будет 3 литра топлива), проехать ещё 3 единицы расстояния до третьей заправки, купить там 4 литра топлива и доехать до конца. Итого придётся потратить 2·5 + 4·3 = 22 долларов. Во втором примере Джонни никак не сможет доехать до пункта назначения, потому что у бака недостаточно объёма, чтобы доехать от последней заправки до точки d.
| |
|
|
E. Вор в магазине
бпф
дп
математика
разделяй и властвуй
*2400
Вор пробрался в магазин. Как всегда у него с собой любимый рюкзак. В рюкзаке может поместиться k предметов. В магазине присутствует n типов товаров, причём товаров каждого типа бесконечное количество. Стоимость единицы товара i-го типа равна ai. Вор жадный, поэтому решил набить рюкзак до отказа. Таким образом, он возьмёт с собой ровно k товаров, причём товары некоторых типов он может взять в нескольких экземплярах. Определите всевозможные суммы стоимостей товаров, которые могут оказаться в рюкзаке вора. Выходные данные В единственной строке выведите через пробел всевозможные суммы стоимостей товаров, которые могут оказаться в рюкзаке вора. Числа нужно выводить в порядке возрастания.
| |
|
|
F. Волшебная матрица
графы
Деревья
матрицы
Перебор
разделяй и властвуй
*2400
Вам задана матрица A размера n × n. Будем называть матрицу с неотрицательными элементами волшебной, если она симметрична (то есть aij = aji), aii = 0 и aij ≤ max(aik, ajk) для всех троек i, j, k. Заметим, что i, j, k не обязательно различны. Определите является ли матрица волшебной. Рекомендуется для ввода и вывода данных использовать функции scanf, printf в языке C++, поскольку они работают значительно быстрее чем cin, cout. Аналогично, рекомендуется использовать классы BufferedReader, PrintWriter вместо Scanner, System.out в языке Java. Выходные данные Выведите ''MAGIC" (без кавычек) если матрица A является магической. В противном случае выведите ''NOT MAGIC".
| |
|
|
F. Медведь и боулинг 4
Бинарный поиск
геометрия
разделяй и властвуй
Структуры данных
Тернарный поиск
*2500
Лимак — старый бурый медведь. Он часто играет в боулинг со своими друзьями. Сегодня он в отличном настроении и хочет побить свой собственный рекорд! За каждый бросок даётся некоторое целое (возможно отрицательное) количество очков. Очки за i-й бросок умножаются на число i и прибавляются к общей сумме. Таким образом, за k бросков с очками s1, s2, ..., sk в сумме даётся очков. Если бросков не было, общее количество очков равно 0. Лимак сделал n бросков и получил ai очков за i-й бросок. Он хочет максимизировать общее количество очков, поэтому ему в голову пришла интересная идея. Он может сказать, что некоторое количество первых бросков он разогревался и был рассредоточен во время некоторого количества последних бросков. Формально он может выкинуть некоторый префикс и некоторый суффикс последовательности очков a1, a2, ..., an. Разрешается выкидывать из рассмотрения все броски или же не выкидывать из вовсе. Общее количество очков вычисляется как будто выкинутых бросков не было. Таким образом, за первый невыкинутый бросок количество очков умножается на 1, за второй — на 2 и так далее до последнего невыкинутого броска. Какое максимальное количество очков может получить Лимак? Выходные данные Выведите максимальное суммарное количество очков, которое можно получить выкидыванием некоторых бросков. Примечание В первом примере Лимак должен выкинуть из рассмотрения первые два и последний броски. После этого останутся броски 1, - 3, 7, которые принесут ему 1·1 + 2·( - 3) + 3·7 = 1 - 6 + 21 = 16 очков.
| |
|
|
C. Двоичная табличка
битмаски
бпф
дп
математика
Перебор
разделяй и властвуй
*2600
Дана таблица из n строк и m столбцов. В каждой ячейке таблицы записано число 0 или 1. За один ход разрешается выбрать произвольную строку или столбец и инвертировать все значения, то есть 0 заменить на 1, а 1 на 0. Какого минимального количества единиц в таблице можно добиться, выполняя данные действия? Выходные данные Выведите одно число — минимальное возможное количество единиц после выполнения произвольной последовательности ходов.
| |
|
|
E. Красивые подмассивы
Деревья
разделяй и властвуй
Строки
Структуры данных
*2100
Однажды ZSCoder выписал массив целых чисел a с элементами a1, a2, ..., an. Будем называть подмассивом массива a последовательность al, al + 1, ..., ar для некоторой пары целых чисел (l, r) таких, что 1 ≤ l ≤ r ≤ n. ZSCoder считает подмассив красивым, если значение операции побитового исключающего или (xor) по всем элементам подмассива не меньше k. Помогите ZSCoder-у найти количество красивых подмассивов массива a! Выходные данные Выведите одно целое число c — количество красивых подмассивов массива a.
| |
|
|
F. Лена и запросы
геометрия
разделяй и властвуй
Структуры данных
*2500
Лена — программист. На работе она получила задачу. Рассмотрим некоторое, изначально пустое множество пар целых чисел. Лене нужно обработать n запросов одного из трёх типов: - Добавить пару чисел (a, b) в множество.
- Удалить пару чисел, добавленную в i-м запросе. Все запросы пронумерованы целыми числами от 1 до n.
- Для заданного целого числа q найти максимальное значение величины x·q + y среди всех пар (x, y) из множества.
Помогите Лене обработать запросы. Выходные данные Для запросов третьего типа выведите в отдельной строке искомое максимальное значение x·q + y. Если в множестве нет пар выведите "EMPTY SET".
| |
|
|
D. Дерево полураспада
дп
математика
разделяй и властвуй
Структуры данных
Теория вероятностей
*2500
В последнее время Петя очень увлекся физикой. Анна Викторовна, его учительница, заметив Петину тягу к знаниям дала ему увлекательную физическую головоломку — дерево полураспада. Дерево полураспада представляет собой полное двоичное дерево высоты h. Высота двоичного дерева — максимум среди расстояний (в ребрах) от корня дерева до его листьев. В процессе изучения, Петя добавляет в его вершины электроны, а также вызывает случайный распад дерева с помощью синхрофазотрона. Случайным распадом называется процесс при котором вдоль пути от корня к случайному листку удаляются все ребра. Вероятности выбора листьев равны между собой. Естественно, так как казенное имущество портить ученикам воспрещается, после каждого такого распада Петя возвращает все удаленные ребра на место. Распавшись, дерево разлагается на компоненты связности. Зарядом такой компоненты называется суммарное количество электронов в вершинах, что принадлежат ей. Потенциалом разрушенного дерева называется максимальный заряд среди его компонент связности. Каждый раз вызывая случайный распад дерева, Петя предварительно хочет знать каково математическое ожидание потенциала дерева после его разрушения. Выходные данные Для каждого запроса decay следует вывести математическое ожидание потенциала дерева после его разрушения. Абсолютная или относительная погрешность ответа не должна превышать 10 - 4.
| |
|
|
E. Путешествие по царству Снежной королевы
битмаски
графы
Перебор
разделяй и властвуй
*2800
Герда пустилась в путь по царству Снежной королевы. Дорожная сеть, по которой направляется Герда, представляет собой n перекрёстков, соединённых m дорогами. Дороги пронумерованы числами от 1 до m. Снежная королева догадывалась, что Кая могут найти, и наложила на них могучее заклятие. Теперь погодные условия на дороге с номером i таковы, что в какой бы момент времени, не превосходящий i, Герда ни оказалась на ней, она выедет с неё только в момент времени i. Если же она ступит на дорогу позже, чем в момент времени i, она так и не сможет с неё выехать. Герда выезжает в момент времени l с перекрёстка с номером s и едет во дворец Снежной королевы, расположенный на перекрёстке с номером t. Кроме того, в момент времени r + 1 Снежная королева возвращается в свой дворец и уже не пустит Герду внутрь, поэтому Герда должна добраться до дворца не позже, чем в момент времени r. Вам требуется по заданной сети для каждого из q запросов li, ri, si и ti ответить, сможет ли Герда добраться до дворца Снежной королевы. Выходные данные Для каждого тестового случая выведите «Yes» (без кавычек) или «No» (без кавычек) — сможет Герда добраться до дворца Снежной королевы или нет.
| |
|
|
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. 
| |
|
|
B. Игры Коровоконга
битмаски
интерактив
разделяй и властвуй
*1900
Это интерактивная задача. В секции «Протокол взаимодействия» вы найдёте информацию о том, как сбрасывать буфер вывода (делать операцию 'flush'). В этой задаче вам предстоит играть в игру с самим Коровоконгом, какое везение! Коровоконг загадал некоторую матрицу M размера n на n. Обозначим через Mi, j элемент, расположенный в i-й строке и j-м столбце данной матрицы. Строки и столбцы нумеруются от 1 до n. Элементы матрицы являются целыми числами от 0 до 109. Кроме того, гарантируется, что Mi, i = 0 для всех i от 1 до n. Ваша задача — вычислить минимальный элемент в каждой строке без учёта диагонального элемента. Формально, для каждого i требуется найти . Разумеется, чтобы это сделать, вам придётся задавать Коровоконгу вопросы. Каждый вопрос Коровоконгу является множеством индексов {w1, w2, ..., wk} для некоторого k от 1 до n. Коровоконг отвечает n числами, i-е из которых является минимумом в i-й строке по заданным позициям, то есть min1 ≤ j ≤ kMi, wj. Коровоконг считает, что вам вполне хватит 20 вопросов, чтобы отгадать все требуемые значения. Для того чтобы вывести ответ, требуется сначала напечатать - 1 в отдельной строке, после чего вывести n чисел ответа в следующей строке. i-е из этих чисел должно быть минимумом в i-й строке, если не учитывать i-й элемент. Не забывайте делать операцию 'flush' после вывода ответа. Вывод ответа не считается запросом. Вы получите вердикт Wrong Answer если: - Вопрос или ответ не соответствует описанному выше формату.
- Вы спросили строго больше 20 вопросов.
- Вопрос содержит повторяющиеся индексы.
- Параметр k в вашем запросе меньше 1 или больше n.
- Итоговый ответ не является правильным.
Вы получите вердикт Idleness Limit Exceeded, если не будете ничего выводить (а тестирующая программа будет ожидать ввода) или забудете сделать операцию 'flush' после какого-нибудь вывода (смотри ниже). Выходные данные Чтобы вывести ответ, выведите сначала -1 в отдельной строке. Далее выведите n целых чисел, i-е из которых должно равняться минимальному числу в i-й строке без учёта диагональных элементов. Не забывайте делать операцию 'flush'!. Протокол взаимодействия Чтобы задать вопрос Коровоконгу, выведите сначала целое число k в отдельной строке — размер множества индексов. В следующей строке выведите k целых чисел w1, w2, ... wk. Не забудьте сделать операцию 'flush', чтобы получить ответ. Ответ Коровоконга будет строкой, содержащей n целых чисел, i-е из которых будет равно минимальному значению Mi, wj по всем j от 1 до k. Вы можете задать не более 20 вопросов, в противном случае вы получите вердикт Wrong Answer. Для сброса буфера вывода (то есть для операции 'flush') сразу после вывода числа или ответа и перевода строки можно сделать: - fflush(stdout) в языке C++;
- System.out.flush() в Java;
- stdout.flush() в Python;
- flush(output) в Pascal;
- смотрите документацию для других языков.
Hacking Для взломов следуйте следующему формату: n M_{1,1} M_{1,2} ... M_{1,n} M_{2,1} M_{2,2} ... M_{2,n} ... M_{n,1} M_{n,2} ... M_{n,n}
Разумеется, взламываемому решению не будет доступен данный ввод. Примечание В первом примере Коровоконг загадал следующую матрицу: [ [0, 3, 2], [5, 0, 7], [4, 8 ,0], ]
Далее приведён протокол взаимодействия в более наглядном формате. Левый столбец соответствует ответам Коровоконга, а правый — возможным запросам участника. 3 3 1 2 3 0 0 0 1 3 2 7 0 2 1 2 0 0 4 1 2 3 0 8 1 1 0 5 4 -1 2 5 4
Второй пример показывает, что и недиагональные элементы могут быть равны нулю.
| |
|
|
E. Новый год и старая подпоследовательность
дп
матрицы
разделяй и властвуй
Структуры данных
*2600
Строка t называется красивой, если строка «2017» встречается в t в качестве подпоследовательности, а строка «2016» не встречается в t в качестве подпоследовательности. Например, строки «203434107» и «9220617» являются красивыми, а строки «20016», «1234» и «20167» не являются красивыми. Уродством строки называется минимальное количество символов, которые надо удалить, чтобы получить красивую строку. Если получить красивую строку удаляя символы невозможно, то её уродство равняется - 1. У Лимака есть строка s длины n, символы которой пронумерованы от 1 до n. Также у него есть q запросов. В i-м запросе выведите уродство подстроки (непрерывной подпоследовательности) s начинающейся с позиции номер ai и заканчивающейся в позиции номер bi (включительно). Выходные данные Для каждого запроса выведите уродство соответствующей подстроки. Примечание Рассмотрим первый пример. Далее запись ugliness(t) означает уродство строки t. - В первом запросе ugliness(«20166766») = 4, потому что потребуется удалить все четыре шестёрки.
- Во втором запросе ugliness(«2016676») = 3, поскольку потребуется удалить все три шестёрки.
- В третьем запросе ugliness(«0166766») = - 1, так как нельзя сделать данную строку красивый удалением какого-либо числа символов.
Во втором примере: - Во втором запросе ugliness(«01201666209167») = 2. Оптимальным ответом будет удалить первую цифру «2» и последнюю цифру «6», что даст строку «010166620917», которая является красивой.
- В третьем запросе ugliness(«016662091670») = 1. Оптимальным ответом является удалить последнюю цифр «6», что даст красивую строку «01666209170».
| |
|
|
G. Польшар и Много других шаров
бпф
дп
Комбинаторика
математика
разделяй и властвуй
теория чисел
*3200
Польшар стоит в ряд со многими другими шарами. Точнее, в ряд стоят ровно n шаров. Шары гордятся за свою родную землю — и хотят доказать, что она стронг. Шары решили начать с выборов ровно m групп шаров, каждая должна состоять либо из одного шара, либо из двух рядом стоящих. Каждый шар может состоять не более чем в одной группе. Шары хотят впечатлить своих врагов. Они просят вас посчитать количество таких разбиений на группы для каждого m, где 1 ≤ m ≤ k. Выведите отстаток от деления каждого из этих чисел на 998244353, враги все равно будут впечатлены. Выходные данные Выведите последовательность из k целых чисел. Число i должно быть равно искомому числу способов выбрать ровно i групп в соответствии с правилами Польшара. Примечание В первом примере можно разделить шары на группы следующим образом: {1}, {2}, {3}, {12}, {23}. {12}{3}, {1}{23}, {1}{2}, {1}{3}, {2}{3}. {1}{2}{3}. Поэтому нужно вывести 5 5 1.
| |
|
|
G. Может ли Баш выйти из положения?
графы
Деревья
разделяй и властвуй
Структуры данных
*3400
Вау! Вы отлично помогли команде Р поймать всех покемонов, посланных Башем. Мяут, член частью команды Р, уже выучил человеческий язык, и теперь хочет обучиться программированию. Он согласился освободить покемонов, если Баш ответит на его вопросы. В начале Мяут дает Башу взвешенное дерево из n вершин и последовательность a1, a2..., an, которая является перестановкой чисел 1, 2, ..., n. Теперь Мяут задает q запросов в одной из следующих форм: - 1 l r v значит, что Баш должен посчитать
, где dist(a, b) — длина кратчайшего пути от вершины a до вершины b в данном дереве. - 2 x значит, что Баш должен поменять местами ax и ax + 1 в заданной последовательности. Новая последовательность будет использоваться для следующих запросов.
Помогите Башу ответит на запросы! Выходные данные Для каждого запроса типа 1 выведите единственное число в отдельной строке — ответ на запрос. Примечание В примере запросы следующие: - 1 1 5 4
- 1 1 3 3
- 2 3
- 2 2
- 1 1 3 3
| |
|
|
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.
| |
|
|
B. Код для 1
Конструктив
поиск в глубину и подобное
разделяй и властвуй
*1600
Джон отважно боролся за спасение одичалых, атакованных белыми ходоками в Суровом Доме. По прибытию Сэм говорит, что хочет направиться в Старомест, чтобы тренироваться в Цитадели и стать мейстером. Так он сможет вернуться и занять место покойного Эймона, как мейстер Черного Замка. Джон согласился с предложением Сэма, и Сэм отправляется в свое путешествие в Цитадель. Однако становление учащимся Цитадели не так легко, и поэтому мейстеры в Цитадели предложили Сэму задачу, чтобы протестировать его соответствие требованиям. Изначально у Сэма есть список с единственным числом n. Далее он выполняет некоторые операции над этим списком. На каждой операции Сэм должен удалить любой такой элемент x, что x > 1, из списка, и вставить вместо него три новых элемента , , последовательно. Он должен делать эти операции до тех пор, пока все элементы в списке не равны 0 или 1. Теперь мейстеры хотят знать общее число единиц на позициях с l-й по r-ю в списке. Сэм хочет стать великим мейстером, но, к сожалению, он не может решить эту задачу. Можете ли вы помочь Сэму пройти тест на соответствие? Выходные данные Выведите общее число единиц на позициях с l-й по r-ю в получившемся списке. Примечание Рассмотрим первый тестовый пример: 
Список чисел со 2-й по 5-ю позиции содержит числа [1, 1, 1, 1]. Количество единиц равно 4. Второй тестовый пример: 
Список чисел с 3-й по 10-ю позиции содержит числа [1, 1, 1, 0, 1, 0, 1, 0]. Количество единиц равно 5.
| |
|
|
E. Верифицируем Королевство
Бинарный поиск
Деревья
интерактив
разделяй и властвуй
*3200
Эта задача является интерактивной. Жюри загадало полное корневое бинарное дерево с n листьями. Полное бинарное дерево — такое дерево, каждая вершина которого имеет либо 0, либо 2 ребенка. Вершины с 0 детьми называются листьями. Так как дерево полное бинарное, то всего в нем 2n - 1 вершина. Листья загаданного дерева имеют индексы от 1 до n. Вы хотите построить дерево, изоморфное дереву жюри. Чтобы это сделать, вы можете спрашивать некоторые вопросы. Вопрос состоит из трех различных листьев a1, a2, a3. Пусть глубина вершины равна кратчайшему расстоянию от вершины до корня дерева. Пусть LCA(a, b) означает вершину с максимальной глубиной такую, что эта вершина является общим предком вершин a и b. Пусть X = LCA(a1, a2), Y = LCA(a2, a3), Z = LCA(a3, a1). Жюри ответит вам, какая из вершин X, Y, Z имеет наибольшую глубину. Заметьте, что ответ определен однозначно, так как дерево бинарное. Формально, если наибольшую глубину имеет X (или Y, Z соответственно), жюри ответит строкой «X» (или «Y», «Z» соответственно). Вы можете задать не более 10·n вопросов. Выходные данные Чтобы вывести угаданное дерево, выведите число «-1» на отдельной строке. Следующая строка должна содержать 2n - 1 целых чисел. i-е из этих чисел должно равняться индексу родителя i-й вершины, или -1, если это корень. Ваш ответ будет считаться правильным, если ваше дерево изоморфно загаданному. В частности, листья не обязаны быть пронумерованы от 1 до n. Изоморфность означает, что существует такая перестановка π, что вершина i является родителем вершины j в загаданном дереве если и только если вершина π(i) является родителем вершины π(j) в вашем дереве. Протокол взаимодействия Чтобы задать вопросы, выведите три различных целых числа a1, a2, a3. Эти числа должны быть от 1 до n включительно. Программа жюри ответит единственным символом: «X», «Y» или «Z». Если ответ равен «X» (или «Y», «Z», соответственно), то пара (a1, a2) (или (a2, a3), (a3, a1), соответственно) имеет наиболее глубокий LCA среди всех трех пар. Вы можете задать не более 10·n вопросов, иначе вы получите вердикт Неправильный ответ. Когда вы будете готовы вывести ответ, выведите число «-1» на отдельной строке. Следующая строка должна содержать 2n - 1 целых чисел. i-е из этих чисел должно равняться индексу родителя i-й вершины, или -1, если это корень. Не забудьте сделать операцию flush после вывода ответа тоже. Вывод ответа не учитывается при подсчете количества вопросов. Вы получите вердикт Неправильный ответ, если - Ваш вопрос или ответ не соответствует формату, описанному в условии.
- Вы спросили строго больше 10·n вопросов.
- Ваш вопрос содержит повторяющиеся индексы.
- Ваше дерево не изоморфно дереву жюри.
Вы получите вердикт Решение «зависло», если не будете ничего выводить, или забудете сделать операцию flush после вывода вопроса или ответа (смотрите ниже информацию, как сделать flush). Чтобы выполнить операцию flush, можете использовать (сразу после вывода чисел и перевода строки): - fflush(stdout) в C++;
- System.out.flush() в Java;
- stdout.flush() в Python;
- flush(output) в Pascal;
- Смотрите документацию для других языков.
Если в любой момент ваша программа считывает -1 как ответ, она должна немедленно нормально завершиться (например, вызовом exit(0)). Вы получите вердикт Неправильный ответ, и это будет означать, что вы задали больше вопросов, чем разрешено, или сделали некорректный вопрос. Если вы проигнорируете это, то можете получить любой вердикт, так как ваша программа продолжит читать из закрытого потока ввода. Взломы Чтобы взломать кого-нибудь, используйте следующий формат. n p_1 p_2 ... p_{2n-1}
Это описывает дерево, где родителем вершины i является вершина pi (pi = - 1 or n < pi ≤ 2n - 1). Значение pi, равное -1 означает, что вершина i является корнем. Эти данные должны описывать корректное полное бинарное дерево. Конечно, взламываемая программа не будет иметь доступ к этим данным. Примечание В первом примере загаданное дерево выглядит так: 
Взаимодействие в более удобном формате:  Последняя строка также может быть равной 8 6 9 8 9 7 -1 6 7.
| |
|
|
F. Генерация тестов
бпф
дп
Комбинаторика
математика
разделяй и властвуй
теория чисел
*3400
Генерация тестов — непростое дело! Часто генерации случайных больших тестов недостаточно, чтобы обеспечить полноценную проверку решений на правильность. Например, рассмотрим задачу с одного из прошедших раундов Codeforces. Формат ее входных данных выглядит примерно так: В первой строке записано целое число n (1 ≤ n ≤ maxn) — количество элементов в множестве. Во второй строке в возрастающем порядке записано n различных целых чисел a1, a2, ..., an (1 ≤ ai ≤ maxa) — элементы множества. Если не обращать внимания на решение задачи, кажется, что сгенерировать хороший тест очень просто. Возьмем n = maxn, возьмем случайные различные ai от 1 до maxa, отсортируем... Далее вы поймете, что это не совсем так. Решение задачи выглядит следующим образом. Пусть g — наибольший общий делитель a1, a2, ..., an. Пусть x = an / g - n. Тогда правильное решение выводит «Alice», если x нечетно, и «Bob», если x четно. Рассмотрим два неверных решения задачи, отличающихся от правильного только формулой вычисления величины x. Первое вычисляет x по формуле x = an / g (без вычитания n). Второе вычисляет x по формуле x = an - n (без деления на g). Будем считать тест интересным, если на нем оба неверных решения выдают ответ, отличающийся от правильного. По данным значениям maxn, maxa и q найдите количество удовлетворяющих ограничениям интересных тестов к задаче и выведите его по модулю q. Выходные данные Выведите единственное число — количество удовлетворяющих ограничениям тестов, на которых оба приведенных неверных решения выдают ответ, отличающийся от правильного, по модулю q. Примечание В первом примере интересные тесты выглядят следующим образом: 1 1 1 3 2 4 6 2 4 6
| |
|
|
F. Пари Шерлока и Мориарти
геометрия
графы
Деревья
Конструктив
разделяй и властвуй
реализация
Структуры данных
*2800
Шерлок и Мориарти встретились для финальной битвы умов. Шерлок дал Мориарти правильный выпуклый n-угольник. Кроме того, он дал ему некоторые диагонали в этом многоугольнике, которые разделяют его на регионы. Гарантируется, что диагонали не пересекаются во внутренних точках. Шерлок посчитал для каждого региона его важность. Важность региона, образованного вершинами многоугольника с номерами a1, a2, ... , ax, равна 2a1 + 2a2 + ... + 2ax. Затем Шерлок упорядочил регионы в порядке увеличения важности. После этого он присвоил каждому региону уникальный номер от 1 до k, где k — количество регионов, а номер региона это его позиция в упорядоченном по важности списке. Шерлок хочет, чтобы Мориарти раскрасил регионы, используя не более чем 20 цветов так, чтобы все простые пути между двумя одноцветными регионами проходили через хотя бы один регион, покрашенный в цвет с номером меньше, чем номер цвета данных регионов. Простой путь между двумя регионами f и h это последовательность регионов r1, r2, ... rt такая, что r1 = f, rt = h, для каждого 1 ≤ i < t регионы ri и ri + 1 имеют общую сторону, а также ri = rj если и только если i = j. Мориарти не смог ответить и спросил решение у Шерлока. Помогите Шерлоку предоставить ответ Мориарти. Выходные данные Пусть число регионов равно k. Выведите k целых чисел, каждое от 1 до 20 — цвета регионов в порядке увеличения важности. Если существует несколько решение, выведите любое из них. Можно показать, что существует хотя бы одно решение. Примечание Во втором примере регионы будут в таком порядке: (1, 2, 3), (1, 3, 4), (1, 4, 5), (1, 5, 6), т. е. регион (1, 2, 3) будет первым, затем регион (1, 3, 4) и так далее. Мы можем покрасить регионы 1 и 3 в один цвет, так как регион 2 будет на пути из 1 в 3, и его цвет равен 1, что меньше, чем цвет регионов 1 и 3, который равен 2.
| |
|
|
C. Пока я срываюсь
разделяй и властвуй
Структуры данных
*2400
Рик и Морти хотят найти мистера PBH, и они не могут сделать это сами. Поэтому они нуждаются в мистерах Мисиксах. Они сгенерировали n мистеров Мисиксов, стоящих в линию и пронумерованных от 1 до n. У каждого из них имеется собственный цвет. i-й мистер Мисикс имеет цвет ai. Рик и Морти собирают свою армию и хотят разделить мистеров Мисиксов на некоторые отряды. Они не хотят, чтобы отряд был слишком разноцветным, поэтому каждый отряд должен иметь мистеров Мисиксов не более, чем k различных цветов. Также каждый отряд должен быть непрерывным отрезком мистеров Мисиксов на этой линии. Это значит, что для всех 1 ≤ i ≤ e ≤ j ≤ n, если мистер Мисикс номер i и мистер Мисикс номер j в одном и том же отряде, то и мистер Мисикс номер e должен быть в том же отряде. Также каждый отряд нуждается в собственной крепости, и постройка крепости стоит денег, поэтому они хотят найти минимальное количество отрядов, которое можно получить. Рик и Морти окончательно не выбрали точное значение k, поэтому для каждого k от 1 до n (включительно) необходимо узнать минимальное количество крепостей. Выходные данные В единственной строке выведите n целых чисел разделенных пробелом. i-е число должно быть равно минимальному количеству крепостей необходимых, если значение k равно i. Примечание Для первого тестового примера некоторые оптимальные пути разделения армии на отряды для каждого k: - [1], [3], [4], [3, 3]
- [1], [3, 4, 3, 3]
- [1, 3, 4, 3, 3]
- [1, 3, 4, 3, 3]
- [1, 3, 4, 3, 3]
Для второго тестового примера некоторые оптимальные пути разделения армии на отряды для каждого k: - [1], [5], [7], [8], [1], [7], [6], [1]
- [1, 5], [7, 8], [1, 7], [6, 1]
- [1, 5, 7], [8], [1, 7, 6, 1]
- [1, 5, 7, 8], [1, 7, 6, 1]
- [1, 5, 7, 8, 1, 7, 6, 1]
- [1, 5, 7, 8, 1, 7, 6, 1]
- [1, 5, 7, 8, 1, 7, 6, 1]
- [1, 5, 7, 8, 1, 7, 6, 1]
| |
|
|
D. Поиск прямых
интерактив
Конструктив
разделяй и властвуй
*3000
После очередного соревнования по спортивному программированию Рома решил попробовать себя в туризме. Его родная страна Ужляндия представляет собой декартову плоскость. Он планирует пройти по всем Главным Прямым Ужляндии. Как известно, все они имеют вид бесконечных прямых, параллельных осям координат (то есть выражаются уравнениями x = a или y = a, где a — целое число, называемое координатой прямой). Поскольку Рома потерял свою карту, ему сначала нужно узнать координаты всех прямых. Дядя Антон согласился ему помочь на таких условиях: - Изначально Рома не знает количество вертикальных и горизонтальных прямых, а также их координаты;
- Рома может называть целочисленные координаты точки на Ужляндии, а в ответ Антон будет говорить ему одно целое число — минимальное из расстояний от этой точки до каждой из Главных Прямых Ужляндии. Но, поскольку известно, что любая из этих прямых отдалена от точки пересечения координатных осей не более чем на 108, то и координаты точки, которые может назвать Рома, не должны превышать по абсолютному значению 108.
Так как дяде Антону нужно бежать на УОИ (Ужляндскую Олимпиаду по Информатике), он согласился ответить не более чем на 3·105 вопросов Ромы. Но вот беда! Рома не знает как выведать у дяди Антона нужные координаты. Помогите ему! Узнайте координаты всех Главных Прямых Ужляндии. Протокол взаимодействия Чтобы сделать запрос, вам нужно вывести «0 x y» (-108 ≤ x, y ≤ 108), где x и y — координаты точки. После каждого запроса нужно вывести перевод строки и сделать операцию «flush», после чего считать ответ — минимальное среди расстояний от точки запроса до Главных Прямых Ужляндии. Вы можете сделать не более 3·105 запросов. Когда вы будете готовы вывести ответ, выведите три строки: - В первой строке выведите «1 n m», где n — количество вертикальных прямых (то есть параллельных оси OY), а m — горизонтальных (то есть параллельных оси OX).
- Во второй строке выведите n чисел x1, x2, ..., xn — координаты вертикальных прямых.
- В третьей строке в таком же формате выведите m чисел y1, y2, ..., ym — координаты горизонтальных прямых.
Координаты прямых можно выводить в любом порядке. Чтобы сделать операцию «flush», сразу после вывода запроса и перевода строки нужно сделать: - fflush(stdout) в C++;
- System.out.flush() в Java;
- stdout.flush() в Python;
- flush(output) в Pascal;
- смотрите документацию для других языков.
Вы получите вердикт Wrong Answer, если сделаете больше запросов, чем можно, или если сделаете некорректный запрос. Вы получите вердикт Idleness Limit Exceeded, если не будете ничего выводить (а тестирующая программа будет ожидать ввода) или забудете сделать операцию «flush» после какого-нибудь вывода. Если ваша программа считает -1, она должна немедленно завершиться с нулевым кодом возврата (например, вызовом exit(0)). Это значит, что вы сделали слишком много запросов, или сделали некорректный запрос, и получите вердикт Wrong Answer. Если вы проигнорируете это, то можете получить другие вердикты, потому что ваша программа продолжит считывание из закрытого потока. Описание теста для взлома В первой строке теста должны быть записаны числа n и m (1 ≤ n, m ≤ 104). Во второй строке должно быть n различных чисел xi (-108 ≤ xi ≤ 108) — координаты вертикальных прямых. В третьей строке должно быть m различных чисел yi (-108 ≤ yi ≤ 108) — координаты горизонтальных прямых. Координаты можно задавать в любом порядке. Пример теста смотрите в замечании. Примечание В примере был тест 1 2 2 0 -3
Минимальные расстояния: - от (1, 2) к x = 2;
- от ( - 2, - 2) к y = - 3;
- от (5, 6) к x = 2;
- от ( - 2, 2) к y = 0.
| |
|
|
F. Улитка Юля
дп
разделяй и властвуй
Структуры данных
*3000
После тяжелой работы аналитику Игорю захотелось немного спокойствия. Он решил завести себе улитку. Для этого он купил аквариум, в середине которого стоял крошечный гладкий ствол дерева и поместил в аквариум улитку, которую он назвал Юля. Игорь заметил, что иногда Юля пытается подняться по стволу дерева, однако не может этого сделать, так как ствол гладкий. Чтобы помочь улитке, он подвесил на это дерево нитки, прицепив нижний конец i-й нитки на высоте li над землей, а верхний — на высоте ri. Так получилось, что верхние концы всех ниток располагаются на разной высоте, то есть все ri различны. Теперь Юля может сползать по стволу вниз, а также подниматься вверх от нижнего конца некоторой веревки до верхнего. Игорь остался доволен своей работой, и теперь, когда он хочет отвлечься от работы, он задается вопросами о возможных перемещениях улитки. А именно, его интересуют вопросы следующего вида: «Предположим, сейчас Юля сидит на стволе на высоте x. Как высоко на стволе дерева она сможет оказаться, если никогда не будет опускаться ниже высоты x и никогда не будет подниматься выше высоты y?» Обратите внимание, Юля не может сползать с веревки на ствол до того, как доберется до верха веревки, и Игоря интересует конечное положение Юли на стволе дерева. Игорь задается различными вопросами, и не всегда может самостоятельно на них ответить. Помогите Игорю, напишите программу, которая отвечает на соответствующие вопросы. Выходные данные Для каждого вопроса выведите одно целое число: максимальную высоту, на которую может подняться Юля. Примечание Иллюстрация к первому примеру слева, иллюстрация ко второму примеру — справа. Различные цвета веревок ничего не значат и служат лишь для ясности изображений.
| |
|
|
G. Олег и шахматы
Паросочетания
Потоки
разделяй и властвуй
Структуры данных
*3400
Обычный клиент банка Олег решает интересную шахматную задачу: расставить на шахматной доске n × n наибольшее число ладей, чтобы они не били друг друга. Напомним, что ладья, которая стоит в клетке (a, b), бьет ладью, стоящую в клетке (x, y), тогда и только тогда, когда a = x или b = y. К сожалению (или радости?) Олега ответ в этой задаче всегда получался равным n, поэтому вскоре задача ему наскучила. Он решил её усложнить, удалив некоторые клетки из шахматной доски. Удалив клетку, Олег подразумевает, что на нее нельзя ставить ладью, однако, бить «сквозь» удаленные клетки ладьи могут. Олег удаляет клетки группами, а именно, он раз за разом выбирает некоторый прямоугольник по сторонами, параллельными осям координат, и удаляет все клетки в нем. Формально, если он выбрал некоторый прямоугольник, левая нижняя и правая верхняя клетки которого имеют координаты (x1, y1) и (x2, y2), соответственно, то он удаляет все такие клетки (x, y) что x1 ≤ x ≤ x2 и y1 ≤ y ≤ y2. Гарантируется, что никакую клетку два раза Олег удалять не будет, то есть все выбранные прямоугольники не пересекаются. Эту версию задачи Олег решить не смог, а его друг, к которому он часто обращается за советами, — аналитик Игорь — сейчас очень занят на конференции, и не может помочь Олегу. Вы — последняя надежда Олега! Помогите ему: по заданному размеру доски и прямоугольникам, клетки в которых удалены, выясните, какое максимальное число ладей можно расставить на доске так, чтобы никакая ладья не била никакую другую. Выходные данные В единственной строке выведите максимальное число ладей, которое Олег сможет расставить на поле так, чтобы они не били друг друга. Примечание Ниже приведено изображения поля и пример расстановки ладей на нем в первом примере. 
| |
|
|
C. Найти машину
дп
Комбинаторика
разделяй и властвуй
*2600
После прекрасного вечера в ресторане пришло время Нуре и Лехе ехать по домам. Хакер, как истинный джентльмен, предложил подвезти девушку к её дому. Нура, конечно же, с удовольствием согласилась. Но вот незадача: Леха никак не может найти свою машину на огромной стоянке близ ресторана. За помощью он решил обратиться к сторожу. Формально стоянку можно представить как матрицу 109 × 109. Во всех клетках матрицы стоят машины, в каждой клетке - ровно одна машина. У всех машин есть номер, выраженный целым положительным числом. Пронумеруем столбцы и строки матрицы от 1 до 109 слева направо и сверху вниз соответственно. По стечению странных обстоятельств оказалось, что для каждой клетки (x, y) матрицы номер машины, стоящей в этой клетке, равен минимальному числу, которое еще не встречалось среди номеров машин, стоящих на клетках (i, y) и (x, j), 1 ≤ i < x, 1 ≤ j < y. Левый верхний фрагмент 5 × 5 парковки Леха хочет задать сторожу q запросов, которые помогут хакеру найти свою машину. В каждом запросе Леха дает сторожу пять целых чисел x1, y1, x2, y2, k. После этого сторож должен рассмотреть все клетки (x, y) матрицы, такие что x1 ≤ x ≤ x2 и y1 ≤ y ≤ y2, и если номер машины, стоящей в клетке (x, y), не превышает k, то прибавить этот номер к ответу на запрос. Для каждого запроса Леха просит сказать ему получившуюся сумму. Из-за того, что сумма может получиться достаточно большой, он просит вычислить её по модулю 109 + 7. Однако сторожу запросы показались невыполнимыми. Помогите бедняге ответить на все запросы Лехи. Выходные данные Выведите q строк — в первой строке ответ на первый запрос, во второй — на второй и так далее. Примечание Разберем подробнее все запросы (в каждом случае запрашиваемая подматрица выделена синим). В первом запросе (k = 1) Леха спрашивает лишь про верхнюю левую клетку парковки. В ней находится автомобиль с номером 1 и, следовательно, ответ на этот запрос — 1. 
Во втором запросе (k = 5) подходящими номерами являются 4, 1, 2, 3, 2, 1, ответом на запрос является 4 + 1 + 2 + 3 + 2 + 1 = 13. 
Во третьем запросе (k = 10000) Леха спрашивает про левый верхний фрагмент 5 × 5, при том, что k достаточно велико, поэтому все номера из подматрицы удовлетворяют запросу Лехи, искомая сумма равна 93. 
В четвертом запросе (k = 2) ни один из номеров автомобилей не удовлетворяет запросу Лехи, поэтому ответом на него является 0. 
| |
|
|
E. Удиви меня!
Деревья
математика
разделяй и властвуй
теория чисел
*3100
Устав от скучных свиданий, Леха и Нура решили сыграть в игру. Леха раздобыл дерево из n вершин, пронумерованных от 1 до n. Напомним, что дерево — это связный неориентированный граф без циклов. На каждой вершине v дерева записано некоторое число av. Совершенно случайно оказалось, что все значения, записанные на вершинах, различны и являются натуральными числами от 1 до n. Игра происходит следующим образом. Нура случайно и равновероятно выбирает некоторую вершину u дерева и передает ход Лехе. Леха, в свою очередь, случайно и равновероятно выбирает некоторую вершину v из оставшихся вершин дерева (v ≠ u). Как несложно догадаться, существует n(n - 1) вариантов выбора вершин игроками. Затем игроки вычисляют значение функции f(u, v) = φ(au·av) · d(u, v) от выбранных вершин, где φ(x) — функция Эйлера, а d(x, y) — кратчайшее расстояние между вершинами x и y в дереве. Совсем скоро игра наскучила Нуре, поэтому Леха, чтобы разрядить обстановку, решил посчитать математическое ожидание значения функции f по всем вариантам выбора вершин u и v в надежде хоть как-то удивить девушку. Леха просит вас помочь ему посчитать искомое математическое ожидание. Пусть данное значение представимо в виде несократимой дроби . Чтобы еще больше удивить Нуру, он хочет назвать ей значение . Помогите Лехе! Выходные данные В единственной строке выведите число, равное P·Q - 1 по модулю 109 + 7. Примечание Функция Эйлера φ(n) — это количество таких i, что 1 ≤ i ≤ n, что gcd(i, n) = 1, где gcd(x, y) — наибольший общий делитель чисел x и y. В первом примере существует 6 вариантов выбора вершин Лехой и Нурой: - u = 1, v = 2, f(1, 2) = φ(a1·a2)·d(1, 2) = φ(1·2)·1 = φ(2) = 1
- u = 2, v = 1, f(2, 1) = f(1, 2) = 1
- u = 1, v = 3, f(1, 3) = φ(a1·a3)·d(1, 3) = φ(1·3)·2 = 2φ(3) = 4
- u = 3, v = 1, f(3, 1) = f(1, 3) = 4
- u = 2, v = 3, f(2, 3) = φ(a2·a3)·d(2, 3) = φ(2·3)·1 = φ(6) = 2
- u = 3, v = 2, f(3, 2) = f(2, 3) = 2
Искомое математическое ожидание равно . Значение, которым Леха хочет удивить Нуру, равно 7·3 - 1 = 7·333333336 = 333333338 . Во втором примере математическое ожидание равно , следовательно, Лехе придется удивлять Нуру числом 8·1 - 1 = 8 .
| |
|
|
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.
| |
|
|
B. Кондитерская
Бинарный поиск
дп
разделяй и властвуй
Структуры данных
*2200
На днях Сластена решила опробовать себя в производстве сладостей и открыть собственную кондитерскую! Для этого она купила нужные ингредиенты и чудо-печку, которая способна выпекать несколько различных видов пирожных; и запустила производство. Сразу же возникли проблемы: расходы на содержание кондитерской быстро начали превышать выручку от проданных пирожных. Сластена смекнула, что надо менять ценовую политику, и решила исследовать рынок сладостей. Оказалось, что чем больше в коробке различных видов пирожных (назовем это число ценностью коробки с пирожными), тем больше денег за нее готовы предложить покупатели. Нужно срочно менять технологию производства! Но вот незадача: выбор конкретных видов пирожного печка делает сама, и Сластена никак не может повлиять на принцип ее действия. Однако, она знает, в каком порядке выйдут n пирожных из печки сегодня. Сластена сегодня должна упаковать ровно k коробок с пирожными, причем в каждую коробку она должна положить несколько (не меньше одного) пирожных, которые печка испекла подряд, так как коробка должна сразу же отправиться на прилавок. Сластена хочет максимизировать суммарную ценность всех коробок с пирожными. Помогите ей определить эту максимальную ценность. Выходные данные Выведите единственное число — максимально возможную суммарную ценность коробок с пирожными. Примечание В первом примере в распоряжении Сластены есть одна коробка. Оптимально расфасовать туда все доступные пирожные и получить два различных вида пирожных с суммарной ценностью 2. Во втором примере разумно положить первые два пирожных в первую коробку, а оставшиеся — во вторую. Таким образом мы получим два и три различных вида пирожных, которые обеспечивают суммарную стоимость 5.
| |
|
|
D. Красно-черная паутина
Деревья
разделяй и властвуй
реализация
Структуры данных
*2800
Сластене очень нравится наблюдать за жизнью обитателей тенистой рощи, находящейся неподалеку от Мармеладного замка. На этот раз ее вниманием завладел странный красно-черный желейный паук, восседающий в центре огромной паутины. Паутина странного паука представляет собой набор из n узлов, соединенных прочными нитями, каждая из которых покрашена либо в красный, либо в черный цвет. Используя эти нити, паук перемещается между узлами паутины, причем ни одна нить не соединяет узел с самим собой и для любых двух различных узлов существует единственная последовательность нитей, их соединяющая. Как настоящий энтузиаст, Сластена начала исследовать замечательные свойства паутины. После нескольких часов наблюдения Сластена заметила, что каждая нить имеет собственное значение клейкости x, что само по себе удивительный факт. Но больше всего Сластену интересует желейность данной паутины. Рассмотрим те из кратчайших путей между всеми парами узлов в паутине, на которых количество нитей каждого цвета отличается не более, чем вдвое. Для каждого такого пути посчитаем произведение клейкостей всех нитей на пути. Желейностью паутины Сластена называет произведение всех полученных величин по всем путям. Из путей, отличающихся только направлением движения, учитывается только один. Естественно, данное число очень большое, а Сластена большие числа не любит. Поэтому она просит вас посчитать желейность данной паутины и вывести ответ по модулю 109 + 7. Выходные данные Выведите единственное число — желейность паутины по модулю 109 + 7. Если не существует путей таких, что число красных и черных нитей отличается не более, чем вдвое, выведите 1. Примечание В первом примере существует 4 пары узлов, количество нитей двух цветов между которыми отличается не более, чем вдвое. Это пары (1, 3) с произведением клейкостей на пути 45, (1, 5) с произведением клейкостей на пути 45, (3, 4) с произведением клейкостей на пути 25 и (4, 5) с произведением клейкостей на пути 25. Желейность такой паутины равняется 1265625.
| |
|
|
E. Никита и игра
Бинарный поиск
графы
Деревья
поиск в глубину и подобное
разделяй и властвуй
*2800
Никита играет в новую компьютерную игру. Всего в игре m уровней. На каждом уровне появляется новый класс, который наследуется от класса yi (и yi является родителем нового класса). Таким образом, классы образуют дерево. Изначально существует только один класс с номером 1. Поменять класс на его соседа в дереве стоит 1 монету, причем обратно класс поменять нельзя. Стоимость смены класса a на класс b равна суммарной стоимости изменений классов на пути от a до b в дереве классов. Пусть на i-м уровне максимальная стоимость смены одного класса на другой равна x. Выведите для каждого уровня количество классов, для которых существует такой класс y, что смена с этого класса на y стоит x. Выходные данные Пусть на i -ом уровне максимальная стоимость смены одного класса на другой равна x. Выведите для каждого уровня количество классов, для которых существует такой класс y, что смена с этого класса на y стоит x.
| |
|
|
C. Goodbye Souvenir
разделяй и властвуй
Структуры данных
*2600
Не буду ни грустить, ни страдать от одиночества... пока всё не закончится. Нитка из n бусинок оставлена, как сообщение об уходе. Бусинки пронумерованы от 1 до n слева направо, каждая имеет форму, выраженную целым числом от 1 до n, включительно. Некоторые бусинки могут иметь одинаковую форму. Память формы x в некотором отрезке бусинок определена как разность между последней и первой позициями, где форма x встречается на этом отрезке. Память подотрезка бусинок равняется сумме памяти по всем формам, встречающимся на этом отрезке. Иногда формы бусинок меняются, и с ними меняются значения памяти. Иногда вам нужно находить память для некоторых подотрезков. Выходные данные Для каждого запроса выведите отдельную строку с величиной памяти данного отрезка. Примечание В начале формы бусинок имеют вид (1, 2, 3, 1, 3, 2, 1). Рассмотрим запросы и изменения формы по очереди: - 2 3 7: память на отрезке [3, 7] равна (7 - 4) + (6 - 6) + (5 - 3) = 5;
- 2 1 3: память на отрезке [1, 3] равна (1 - 1) + (2 - 2) + (3 - 3) = 0;
- 1 7 2: форма бусинки 7 меняется на 2. В результате формы бусинок будут выглядеть следующим образом: (1, 2, 3, 1, 3, 2, 2);
- 1 3 2: форма бусинки 3 меняется на 2. В результате формы бусинок будут выглядеть следующим образом: (1, 2, 2, 1, 3, 2, 2);
- 2 1 6: память на отрезке [1, 6] равна (4 - 1) + (6 - 2) + (5 - 5) = 7;
- 2 5 7: память на отрезке [5, 7] равна (7 - 6) + (5 - 5) = 1.
| |
|
|
E. Days of Floral Colours
бпф
дп
Комбинаторика
математика
разделяй и властвуй
*3400
Цветочные Часы находятся рядом с Зеркальным Озером много лет. Неспособные показывать время, они напоминают людям о его течении и о старых добрых днях. На окружности Цветочных Часов находятся 2n цветков, пронумерованных от 1 до 2n по часовой стрелке, каждый цветок имеет один из возможных n цветов. Есть ровно два цветка каждого цвета, расстояние между которыми либо не больше, чем 2, либо равняется n. Кроме того, если цветки u и v имеют одинаковый цвет, то цветок, расположенный напротив u, и цветок, расположенный напротив v, тоже имеют одинаковый цвет: симметрия — это прекрасно! Формально, расстояние между двумя цветками равно 1 плюс количество цветков на меньшей дуге между ними. Ниже показано возможная раскраска цветов при n = 6, которое описывает все возможные случаи. Красотой раскраски называется произведение длин отрезков цветков, разделенных всеми цветами такими, что противоположный цветок имеет тот же цвет. Другими словами, чтобы вычислить красоту, нужно удалить из круга все цветки, которые имеют тот же цвет, что и цветок напротив них. Тогда красота равна произведению длин всех оставшихся отрезков. Обратите внимание, отрезки длины 0 тоже считаются. Если цветков, которые имеют тот же цвет, что и цветок напротив них, нет, то красота равна 0. Например, красота раскраски выше равна 1 × 3 × 1 × 3 = 9: отрезками являются {2}, {4, 5, 6}, {8} и {10, 11, 12}. Возможно большое число различных раскрасок, удовлетворяющих всем ограничениям. Найдите сумму всех красот по всем возможным раскраскам по модулю 998 244 353. Две раскраски различны, если существует пара (u, v) (1 ≤ u, v ≤ 2n) такая, что цветы u и v имеют один цвет в одной из них, но не имеют один цвет в другой. Выходные данные Выведите одно целое число — сумму красот по всем возможным раскраскам цветом по модулю 998 244 353. Примечание При n = 3, следующие шесть раскрасок каждая имеет красоту, равную 2 × 2 = 4. Много других раскрасок, имею красоту, равную 0, например, изображенная на рисунке слева. Раскраска на рисунке справа некорректна, так как не выполняется условие симметричности.
| |
|
|
E. Выборы
битмаски
бпф
математика
Перебор
разделяй и властвуй
*2800
В Берляндии приближаются президентские выборы! Каждый с нетерпением ожидает этого события! В Берляндии есть n жителей и три кандидата — Алексей, Борис и Владимир. Так как выборы определят будущее страны на много лет, каждый из n жителей выберет один из шести возможных порядков на кандидатах случайно, равновероятно и независимо от остальных жителей. Для увеличения прозрачности процесса выборов правительство разработало функцию (т.е. функция принимает n булевых аргументов и возвращает булевый результат). Функция удовлетворяет следующему условию: f(1 - x1, 1 - x2, ..., 1 - xn) = 1 - f(x1, x2, ..., xn). Будет проведено три раунда выборов между каждой парой кандидатов: Алексеем и Борисом, Борисом и Владимиром, Владимиром и Алексеем. В каждом раунде xi будет равно 1, если i-й житель предпочитает первого кандидата второму (т.е. в его списке предпочтений первый кандидат находится раньше второго), и 0 иначе. После этого определяется величина y = f(x1, x2, ..., xn). Если y = 1, то первый кандидат считается победителем этого раунда, иначе, если y = 0, второй считается победителем раунда. Определим вероятность того, что есть кандидат, победивший в двух раундах, p. p·6n всегда целое число. Выведите это число по модулю 109 + 7 = 1 000 000 007. Выходные данные Одно число — ответ на задачу. Примечание В первом примере f(x1, x2, x3) = x1, т.е. результат полностью определятся первым жителем. Тогда первый кандидат в порядке предпочтений первого жителя победит в двух турах. Следовательно, p = 1 и ответ на задачу 1·63 = 216.
| |
|
|
D. Махмуд, Ехаб и бинарная строка
Бинарный поиск
интерактив
разделяй и властвуй
*2000
Махмуд и Ехаб проходят четвёртое испытание Доктора Зло. Доктор Зло загадал бинарную строку длины n. Известно, что в ней есть хотя бы один символ '0' и хотя бы один символ '1'. Теперь он хочет, чтобы Махмуд и Ехаб нашли позицию хотя бы одного сивола '0' и позицию хотя бы одного символа '1' в этой строке. Чтобы это сделать, они могут задать Доктору Зло не более 15 вопросов следующего вида. Они говорят Доктору Зло бинарную строку длины n, а Доктор Зло говорит им расстояние Хемминга между их строкой и его строкой. Расстоянием Хемминга между двумя бинарными строками равной длины называется количество позиций, в которых они различаются. Вы можете найти строгое опредение расстояния Хемминга ниже. Помогите Махмуду и Ехабу справиться с заданием Доктора Зло. Вы получите вердикт Wrong Answer если - Ваши запросы не будут соответствовать протоколу взаимодействия.
- Вы задали строго больше, чем 15 вопросов, при этом программа завершилась после превышения числа запросов. Учтите, что вы можете 15 раз задать Доктору Зло вопрос, а потом потратить ещё запрос, чтобы вывести ответ на задачу.
- Ответ на задачу неверен.
Вы получите вердикт Idleness Limit Exceeded, если вы ничего не выведите или забудете сбросить буфер вывода (более подробно о том, как сбросить буфер вывода, можно прочитать ниже). Если программа превышает максимальное число запросов, необходимо завершить её с кодом возврата 0, в противном случае вердикт может быть не Wrong Answer из-за чтения из закрытого потока. Выходные данные Чтобы вывести ответ на задачу, выведите "! pos0 pos1" (без кавычек), где pos0 и pos1 — это позиции какого-то символа '0' и какого-то символа '1' в строке (нумерация с 1). Не забудьте сбросить буфер вывода после вывода ответа! Протокол взаимодействия Чтобы задать вопрос, используйте формат "? s" (without quotes), где s строка, для которой вы хотите узнать расстояние Хемминга между ней и загаданной строкой. Не забудьте сбросить буфер вывода после вывода запроса! После каждого запроса на стандартный ввод будет подано одно целое число — расстояние Хемминга между строкой из запроса и загаданной строкой. Чтобы сбросить буфер вывода используйте: - fflush(stdout) в C++;
- System.out.flush() в Java;
- stdout.flush() в Python;
- flush(output) в Pascal;
- Обратитесь к документации для других языков.
Взломы. Для взлома выведите бинарную строку длиной не более 1000, содержащую хотя бы один символ '0' и хотя бы один символ '1'. Примечание Определение расстояния Хемминга: https://ru.wikipedia.org/wiki/Расстояние_Хемминга В первом тестовом примере загаданная строка равна 101. Первый запрос равен 000, поэтому расстояние Хемминга равно 2. Во втором запросе загаданная строка всё ещё равна 101 а строка из запроса равна 001, поэтому расстояние Хемминга равно 1. После нескольких запросов вы узнали, что символ на позиции 2 это '0', а символ на позиции 1 это '1', поэтому надо вывести "! 2 1".
| |
|
|
F. Яичная рулетка
meet-in-the-middle
битмаски
математика
Перебор
разделяй и властвуй
*3300
В Яичную рулетку играют два игрока. Изначально 2R сырых яйца и 2C вареных яйца кладутся в коробку в случайном порядке. Яйца все еще в скорлупе, поэтому невозможно отличить сырое яйцо от вареного. По одному игроки выбирают одно яйцо и разбивают его о свой лоб. Если яйцо было вареное, ничего особенного не произойдет, но если оно было сырое, то оно все испачкает. Такое продолжается до тех пор, пока один из игроков не разобьет R сырых яиц. В этот момент игра заканчивается, этот игрок объявляется проигравшим, а его соперник — победителем. Порядок, в котором ходят игроки, может быть представлен как строка из букв «A» и «B», где i-й символ обозначает игрока, который будет выбирать i-е яйцо. Традиционно игроки ходят по очереди, то есть, они следуют порядку «ABABAB...». Это не очень честно, так как второй игрок будет выигрывать чаще, чем первый. Мы хотим, чтобы вы нашли более честный порядок ходов. Определим нечестность порядка как модуль разности между вероятностью победы первого игрока и вероятностью победы второго игрока. Нам интересны порядки, в которых нечестность является минимально возможной. Мы считаем порядок корректным, если в нем одинаковое количество букв «A» и «B». Вам будет дана строка S длины 2(R + C), содержащая только символы «A», «B» и «?». Порядок подходит под S, если он отличается от S только в позициях, где S содержит «?». Среди корректных порядков, минимизирующих нечестность, сколько подходят под S? Выходные данные Выведите количество корректных порядков, которые минимизируют нечестность и подходят под S. Примечание В первом тесте из примере минимальная нечестность равна 0, а порядки, минимизирующие ее, это «ABBA» и «BAAB», но ни один из них не подходит под S. Заметьте, что порядок «ABBB» также имеет нечестность 0, но он не является корректным, так как не содержит одинаковое число «A» и «B». Во втором примере единственно подходящим порядком является «BBAAABABABBA».
| |
|
|
F. Очередная задача минимизации
дп
разделяй и властвуй
*2500
Дан массив из n чисел a1... an. Стоимостью подотрезка элементов в массиве назовем количество неупорядоченных пар различных позиций внутри подотрезка, содержащих одинаковые элементы. Разбейте массив на k непересекающихся непустых подотрезков таких, что сумма их стоимостей минимальна. Каждый элемент массива должен попасть ровно в один подотрезок. Выходные данные Выведите одно число — минимальную стоимость разбиения массива на подотрезки. Примечание В первом примере оптимально разбить последовательность на три подпоследовательности: [1], [1, 3], [3, 3, 2, 1]. Стоимости равны 0, 0 и 1, поэтому ответ равен 1. Во втором примере оптимально разбить подпоследовательность на две половины. Стоимость каждой половины равна 4. В третьем примере оптимально разбить следующим образом: [1, 2, 2, 2, 1], [2, 1, 1, 1, 2], [2, 1, 1]. Стоимости равны 4, 4, 1.
| |
|
|
D. Сортировка слиянием
Конструктив
разделяй и властвуй
*1800
Сортировка слиянием — один из самых известных алгоритмов сортировки. Основная функция этого алгоритма, сортирующая промежуток массива a с индексами из [l, r), может быть реализована следующим образом: - Если промежуток [l, r) уже отсортирован в неубывающем порядке (то есть, для каждого i, такого, что l ≤ i < r - 1, a[i] ≤ a[i + 1]), завершить вызов функции;
- Присвоить
; - Вызвать mergesort(a, l, mid);
- Вызвать mergesort(a, mid, r);
- Слить промежутки [l, mid) и [mid, r) воедино, после чего промежуток [l, r) будет отсортирован в неубывающем порядке. Функция слияния не вызывает никаких других функций.
В этой задаче массив 0-индексирован, и для сортировки всего массива нужно вызвать mergesort(a, 0, n). Количество вызовов функции mergesort очень важно, поэтому Иван решил вычислять его во время сортировки. К примеру, если a = {1, 2, 3, 4}, то будет сделан 1 вызов mergesort — mergesort(0, 4), который проверит, что массив отсортирован, и завершится. Если a = {2, 1, 3}, то количество вызовов равно 3: сначала вызывается mergesort(0, 3), в котором присваивается mid = 1 и вызывается calls mergesort(0, 1) и mergesort(1, 3), не проводящие никаких рекурсивных вызовов, так как подотрезки (0, 1) и (1, 3) уже отсортированы. Иван написал программу, которая считает число вызовов функции mergesort, но сейчас ему нужно протестировать её. Для этого необходимо найти массив a, такой, что a — перестановка первых n чисел (то есть размер a равен n, и каждое целое число из [1, n] встречается в массиве ровно один раз), и число вызовов mergesort при сортировке этого массива равно k. Помогите Ивану найти нужный массив! Выходные данные Если перестановка размера n, такая, что при её сортировке будет совершено ровно k вызовов mergesort, не существует, выведите - 1. Иначе выведите n целых чисел a[0], a[1], ..., a[n - 1] — элементы перестановки. Если решений несколько, выведите любое.
| |
|
|
D. Ор выше гор
Бинарный поиск
битмаски
Комбинаторика
разделяй и властвуй
Структуры данных
*2200
Рик и Морти очень любят ходить на горный хребет Высокоорный для того, чтобы поорать — эхо там просто невероятное. Не так давно они нашли интересное акустическое свойство этого хребта: если Рик и Морти начнут одновременно орать с разных гор, то их ор будет слышен между этими горами вплоть до высоты, равной побитовому ИЛИ высот гор, на которые они взошли, и всех гор между ними. Побитовое ИЛИ — это бинарная операция, которая определяется следующим образом. Рассмотрим записи чисел x и y в двоичной системе счисления (возможно с ведущими нулями) x = xk... x1x0 и y = yk... y1y0. Тогда z = x | y определяется следующим образом: z = zk... z1z0, где zi = 1, если xi = 1 или yi = 1, иначе zi = 0. Иными словами, нули в побитовом ИЛИ чисел находятся только в тех разрядах, в которых у обоих чисел находятся нули. Например, побитовое ИЛИ чисел 10 = 10102 и 9 = 10012 равняется 11 = 10112. В языках программирования C/C++/Java/Python данная операция обозначается как «|», а в Pascal как «or». Помогите Рику и Морти посчитать, сколькими способами они могут выбрать две различные горы так, что если они начнут орать с этих гор, ор их будет слышен выше этих гор и всех гор между ними. Формально говоря, требуется вычислить, сколько существует таких пар l и r (1 ≤ l < r ≤ n), что побитовое ИЛИ всех высот гор на отрезке от l до r включительно строго больше высоты любой горы на этом отрезке. Выходные данные Выведите одно число — искомое количество способов выбрать две различные горы. Примечание В первом примере все искомые способы — это пары гор со следующими номерами (горы нумеруются с единицы): (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)Во втором примере искомых пар не существует, поскольку для любой пары гор высота ора с них равна 3, и эта высота равна высоте любой из гор, следовательно она не выше их.
| |
|
|
E. Максимальная подпоследовательность
meet-in-the-middle
битмаски
разделяй и властвуй
*1800
Вам дан массив a, состоящий из n целых чисел и целое число m. Выберите последовательность позиций b1, b2, ..., bk (1 ≤ b1 < b2 < ... < bk ≤ n) такую, чтобы значение было максимально. Выбранная подследовательность может быть пустой. Подсчитайте максимальное возможное значение . Выходные данные Выведите максимальное возможное значение . Примечание В первом примере можно выбрать последовательность b = {1, 2}, чтобы сумма была равна 7 (равна 3 по модулю 4). Во втором примере можете выбрать последовательность b = {3}.
| |
|
|
D. Сколько деревьев?
дп
Комбинаторика
разделяй и властвуй
*1900
В одном старом-старом текстовом файле была записана Великая Мудрость. Эта Мудрость была настолько Великой, что расшифровать её не мог никто, даже Фонг, старейший из обитателей Мэйнфрейма. Но кое-что оттуда он сумел узнать. Например то, что Юзер запускает игры ради удовольствия — и тогда на город опускаются ужасные Игровые Кубы, несущие смерть тем модулям, которые не смогут в неё выиграть... Конечно, с появлением в Мэйнфрейме стража Боба многие модули перестали бояться Игровых Кубов. Ведь Боб (раз он ещё живой) ни разу не проиграл Юзеру, а он всегда лезет в Игровые Кубы, в силу того, что его так запрограммировали. Однако, бывают неприятные ситуации, когда Игровой Куб опускается на Затерянные Углы. Ведь именно там живёт злобный вирус Хексадесимал, которая... Ну... Очень странная. И очень любит поиграть. Вот и получается, что волей-неволей Бобу приходится сперва играть с ней, а потом ещё и с Юзером. В этот раз она придумала следующее развлечение: Боб должен прыгать через двоичные деревья поиска с n вершинами. Напомним, что двоичное дерево поиска — это такое двоичное дерево, у которого каждой вершине сопоставлен некоторый ключ, и для каждой вершины выполняется правило: ключ в текущем корне больше всех ключей в левом поддереве, но меньше всех ключей в правом поддереве. Все ключи — различные натуральные числа от 1 до n. У каждой вершины такого дерева может быть от нуля (в случае, когда вершина является листом) до двух потомков. В игре Хексадесимал все деревья различны, но высотой не менее h. В данной задаче под высотой подразумеватся максимальное количество вершин, лежащих на пути от корня к самому удалённому листу, включая корень и сам лист. Когда Боб перепрыгивает через дерево, дерево исчезает. Боб получит доступ к Кубу тогда, когда деревьев не останется. Он знает, сколько деревьев ему придётся перепрыгнуть в худшем случае. А Вы? Выходные данные Одно число — ответ на задачу. Гарантируется, что оно не превышает 9·1018.
| |
|
|
E. Палиндромы в дереве
битмаски
Деревья
разделяй и властвуй
Структуры данных
*2400
Дано дерево (связный ациклический граф) на n вершинах. Вершины пронумерованы от 1 до n и на каждой вершине записана буква английского алфавита от a до t. Путь в дереве называется палиндромным, если из букв, записанных на нём, можно составить палиндром (буквы можно произвольным образом переставлять). Для каждой вершины выведите количество палиндромных путей, проходящих через неё. Учтите, что путь из вершины u в вершину v и путь из вершины v в вершину u считаются одинаковыми, такие пути должны учитываться ровно один раз. Выходные данные Выведите n чисел, где i-е число обозначает количество палиндромных путей, проходящих через вершину i. Примечание В первом тестовом примере следующие пути являются палиндромными: 2 - 3 - 4 2 - 3 - 5 4 - 3 - 5 Кроме того, все пути, состоящие из одной вершины, являются палиндромными. А следующие пути палиндромными не являются: 1 - 2 - 3 1 - 2 - 3 - 4 1 - 2 - 3 - 5
| |
|
|
G. Сумма Фибоначчи
битмаски
бпф
дп
математика
разделяй и властвуй
*2600
Дан массив s, состоящий из n неотрицательных целых чисел. Набор из 5 чисел (a, b, c, d, e) назовём корректным если: - 1 ≤ a, b, c, d, e ≤ n
- (sa | sb) & sc & (sd ^ se) = 2i для некоторого целого i.
- sa & sb = 0
Здесь '|' обозначает побитовое ИЛИ, '&' обозначает побитовое И, '^' обозначает побитовое исключающее ИЛИ. Найдите сумму f(sa|sb) * f(sc) * f(sd^se) по всем корректным наборам (a, b, c, d, e), где f(i) обозначает i-е число Фибоначчи (f(0) = 0, f(1) = 1, f(i) = f(i - 1) + f(i - 2)). Так как ответ может быть очень большим выведите его остаток от деления на 109 + 7. Выходные данные Выведите требуемую сумму по модулю 109 + 7.
| |
|
|
E. Знакопеременное дерево
Деревья
дп
Комбинаторика
поиск в глубину и подобное
разделяй и властвуй
Теория вероятностей
*2300
Вам дано дерево с \(n\) вершинами, пронумерованными с \(1\) до \(n\). В вершине \(i\) записано значение \(V_i\). Если простой путь от вершины \(u_1\) до вершины \(u_m\) состоит из \(m\) вершин, а именно из \(u_1 \rightarrow u_2 \rightarrow u_3 \rightarrow \dots u_{m-1} \rightarrow u_{m}\), то знакопеременная сумма для этого пути \(A(u_{1},u_{m})\) определяется как \(A(u_{1},u_{m}) = \sum\limits_{i=1}^{m} (-1)^{i+1} \cdot V_{u_{i}}\). Путь может содержать \(0\) рёбер, т. е. \(u_{1}=u_{m}\). Вычислите сумму знакопеременных сумм для всех различных простых путей в дереве. Обратите внимание, пути ориентированны: два пути считаются различными, если у них различное начало или различный конец. Так как ответ может быть большим, выведите остаток от деления его на \(10^{9}+7\). Выходные данные Выведите сумму знакопеременных сумм по всем различным простым путям в дереве по модулю \(10^{9}+7\). Примечание Рассмотрим первый пример. Знакопеременная сумма для простого пути из вершины \(1\) в вершину \(2\): \(1 \rightarrow 2\) равна \(A(1,2) = 1 \cdot (-4)+(-1) \cdot 1 = -5\). Знакопеременная сумма для простого пути из вершины \(1\) в вершину \(3\): \(1 \rightarrow 3\) равна \(A(1,3) = 1 \cdot (-4)+(-1) \cdot 5 = -9\). Знакопеременная сумма для простого пути из вершины \(2\) в вершину \(4\): \(2 \rightarrow 1 \rightarrow 4\) равна \(A(2,4) = 1 \cdot (1)+(-1) \cdot (-4)+1 \cdot (-2) = 3\). Простой путь из вершины \(1\) в вершину \(1\) содержит только вершину \(1\), поэтому \(A(1,1) = 1 \cdot (-4) = -4\). Аналогично, \(A(2, 1) = 5\), \(A(3, 1) = 9\), \(A(4, 2) = 3\), \(A(1, 4) = -2\), \(A(4, 1) = 2\), \(A(2, 2) = 1\), \(A(3, 3) = 5\), \(A(4, 4) = -2\), \(A(3, 4) = 7\), \(A(4, 3) = 7\), \(A(2, 3) = 10\), \(A(3, 2) = 10\). Поэтому ответ равен \((-5) + (-9) + 3 + (-4) + 5 + 9 + 3 + (-2) + 2 + 1 + 5 + (-2) + 7 + 7 + 10 + 10 = 40\).
| |
|
|
B. Надмножество
Конструктив
разделяй и властвуй
*2300
Множество точек на плоскости называется хорошим, если для любых двух точек выполняется хотя бы одно из трех условий: - эти две точки лежат на одной горизонтали;
- эти две точки лежат на одной вертикали;
- внутри или на границе прямоугольника с углами в этих двух точках есть другие точки множества, помимо этих двух. Здесь имеется в виду прямоугольник со сторонами, параллельными осям координат, так называемый bounding box двух точек.
На плоскости задано множество из n точек. Найдите любое хорошее надмножество этого множества размером не более 2·105 точек. Выходные данные В первой строке выведите количество точек m (n ≤ m ≤ 2·105) в хорошем надмножестве, в следующих m строках выведите сами точки. Координаты точек не должны превосходить 109 по абсолютной величине. Обратите внимание, что минимизировать m не требуется, достаточно найти любое хорошее надмножество заданного множества, размер которого не превосходит 2·105. Все точки в надмножестве должны иметь целые координаты.
| |
|
|
E. Прибавления на отрезках
битмаски
дп
разделяй и властвуй
Структуры данных
*2200
Гриша пришел на контест и увидел там следующую задачу. Дан массив длины \(n\), изначально состоящий из нулей. Элементы массива пронумерованы от \(1\) до \(n\). К массиву было применено \(q\) операций. \(i\)-я операция задается тремя целыми числами \(l_i\), \(r_i\) и \(x_i\) (\(1 \leq l_i \leq r_i \leq n\)), (\(1 \leq x_i \leq n\)) и означает, что к элементам с номерами \(l_i, l_i + 1, \ldots, r_i\) прибавили число \(x_i\). Требуется найти максимум в массиве после применения всех этих операций. Но Гриша не из глупых! Он решил эту задачу очень быстро. Однако что-то в нем переклинило, и он задумался: «интересно, а какие значения может принять максимум в массиве после применения некоторого подмножества данных операций?». Помогите Грише, найдите все такие целые числа \(y\) от \(1\) до \(n\), что после применения некоторого (возможно, пустого) подмножества данных операций максимум в массиве равен \(y\). Выходные данные В первую строку выведите единственное число \(k\), обозначающее количество возможных целых чисел от \(1\) до \(n\), которым может быть равен максимум в массиве после применения некоторого (возможно, пустого) подмножества данных операций. В следующей строке выведите через пробел все \(k\) чисел от \(1\) до \(n\) — возможные значения максимума. Выводите эти числа в возрастающем порядке. Примечание Если в первом тестовом примере оставить только первый запрос, то максимум будет равен \(1\). Если оставить только второй запрос, то максимум будет равен \(2\). Если оставить первые два запроса, то максимум будет равен \(3\). Если оставить только третий запрос, то максимум будет равен \(4\). Но если оставить третий запрос и еще какой-то, максимум будет больше \(n\), поэтому его выводить не требуется. Во втором тестовом примере, оставив только первый запрос, можно получить \(1\). Оставив только второй, можно получить \(2\). А если оставить все запросы, максимум будет равен \(3\). В третьем тестовом примере можно получить максимумы так: - Можно получить максимум \(2\) оставив запросы: \((1)\).
- Можно получить максимум \(3\) оставив запросы: \((2)\).
- Можно получить максимум \(5\) оставив запросы: \((1, 2)\).
- Можно получить максимум \(6\) оставив запросы: \((3)\).
- Можно получить максимум \(8\) оставив запросы: \((1, 3)\).
- Можно получить максимум \(9\) оставив запросы: \((2, 3)\).
| |
|
|
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\) нужно выводить в возрастающем порядке. Посмотрите примеры для лучшего понимания.
| |
|
|
E. Number Clicker
meet-in-the-middle
графы
разделяй и властвуй
теория чисел
*2700
Аллен играет в Number Clicker на телефоне. Он начинает с целого числа \(u\) на экране. Каждую секунду он нажимает одну из трех кнопок: - Изменить \(u \to u+1 \pmod{p}\).
- Изменить \(u \to u+p-1 \pmod{p}\).
- Изменить \(u \to u^{p-2} \pmod{p}\).
Аллен хочет нажать на кнопки не более 200 раз так, чтобы получить на экране число \(v\). Помогите ему! Выходные данные В первой строке выведите одно целое число \(\ell\) — количество нажатий кнопок. Во второй строке выведите целые числа \(c_1, \dots, c_\ell\) — кнопки, которые должен нажать Аллен. Для всех \(1 \le i \le \ell\) должно выполняться \(1 \le c_i \le 3\). Можно показать, что ответ всегда существует. Примечание В первом примере число на экране меняется следующим образом: \(1 \to 2 \to 3\). Во втором примере число на экране меняется следующим образом: \(3 \to 2\).
| |
|
|
D. Циклы в произведении
Деревья
Комбинаторика
разделяй и властвуй
*2900
Рассмотрим дерево (то есть неориентированный связный граф без циклов) \(T_1\) и дерево \(T_2\). Определим их декартово произведение \(T_1 \times T_2\) следующим образом. Пусть \(V\) — множество вершин \(T_1\), а \(U\) — множество вершин \(T_2\). Тогда множеством вершин \(T_1 \times T_2\) является \(V \times U\), то есть множество упорядоченных пар вершин, где первая вершина из \(V\), а вторая из \(U\). Проведём ребра следующего вида: - Между \((v, u_1)\) и \((v, u_2)\) есть неориентированное ребро, если \(u_1\) и \(u_2\) смежны в графе \(U\).
- Аналогично между \((v_1, u)\) и \((v_2, u)\) есть неориентированное ребро, если \(v_1\) и \(v_2\) смежны в графе \(V\).
Обратите внимание на пояснения к примерам, они содержат картинки для произведения деревьев для тестов из примеров. Рассмотрим граф \(T_1 \times T_2\). Вычислите количество циклов в этом графе (не обязательно простых) длины \(k\). Выведите остаток при делении найденного количества на \(998244353\). Циклом называется последовательность вершин \(w_1\), \(w_2\), ..., \(w_k\), где \(w_i \in V \times U\), такая что любые две соседние вершины смежны, а также \(w_1\) смежно с \(w_k\). Циклы отличающиеся только циклическим сдвигом или направлением обхода всё равно считаются различными. Выходные данные Выведите одно число — количество циклов по модулю \(998244353\). Примечание Следующие три картинки иллюстрируют графы, которые получаются в результате произведения в тестах из условия. В первом примере список циклов длины \(2\) следующий: - «AB», «BA»
- «BC», «CB»
- «AD», «DA»
- «CD», «DC»
| |
|
|
Moo Decomposition
дп
Рекуррентные последовательности
разделяй и властвуй
Вам дана длинная строка \(S\) из символов M и O и целое число \(K \geq 1\).
Посчитайте количество способов разбить \(S\) на подпоследовательности так,
что каждая подпоследовательность MOOOO....O с ровно \(K\) O, по модулю \(10^9+7\).
Поскольку строка очень длинная, Вам она не дана точно. Вместо этого
Вам дано целое число \(L\) (\(1 \leq L \leq 10^{18}\)), и строка \(T\) длины \(N\)
(\(1 \leq N \leq 10^6\)). Строка \(S\) есть конкатенация \(L\) копий строки \(T\).
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(K\), \(N\), \(L\).
Вторая строка содержит строку \(T\) длины \(N\). Каждый символ или M или O.
Гарантируется, что количество декомпозиций \(S\) не равно 0.
ФОРМАТ ВВОДА (на экран / stdout):
Выведите количество разбиений строки \(S\), по модулю modulo \(10^9+7\).
| |
|
|
Cow Checkups
разделяй и властвуй
\(N\) (\(1 \leq N \leq 5 \cdot 10^5\)) коров Фермера Джона стоят по порядку,
Корова \(1\) в начале, корова \(N\) - в конце ряда. Коровы имеют различные разновидности.
ФД обозначил разновидности числами от \(1\) до \(N\). \(i\)-ая корова в ряду имеет разновидность
\(a_i\) (\(1 \leq a_i \leq N\)).
ФД везёт коров на проверку. Однако ветеринар будет выполнять проверку \(i\)-коровы
только если она имеет разновидность \(b_i\) (\(1 \leq b_i \leq N\)).
ФД ленив и не хочет полностью переупорядочивать своих коров. Он выполняет следующую операцию
ровно один раз.
- Выбирает два целых числа \(l\) и \(r\) таких что \(1 \leq l \le r \leq N\).
Реверсирует порядок коров между \(l\)-ой и \(r\)-ой коровами включительно.
ФД хочет измерить насколько эффективен его подход. Найдите сумму количеств
проверенных коров по всем \(N(N+1)/2\) возможным операциям.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит целое число \(N\).
Вторая строка содержит \(a_1, a_2, \ldots, a_N\).
Третья строка содержит \(b_1, b_2, \ldots, b_N\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Выведите одну строку с суммой количеств коров, которые будут проверены
по всем возможным операциям.
| |
|
|
Cowmistry
битмаски
разделяй и властвуй
математика
Беси нуждается в Вашей помощи.
Она должна создать микстуру из трёх различных компонент.
Некоторые из компонент нельзя смешивать друг с другом.
В частности, две компоненты с метками \(a\) и \(b\) могут присутствовать
в одной микстуре, только если \(a \oplus b \le K\) (\(1 \le K \le 10^9\)).
Замечание: Здесь, \(a\oplus b\) обозначает побитовое исключающее ИЛИ неотрицательных
целых чисел \(a\) и \(b\). Эта операция эквивалентна сложению соответствующих пар битов
по модулю 2 и игнорированию переноса. Например
\[0\oplus 0=1\oplus 1=0,\]
\[1\oplus 0=0\oplus 1=1,\]
\[5\oplus 7=101_2\oplus 111_2=010_2=2.\]
У Беси есть \(N\) (\(1\le N\le 2\cdot 10^4\)) ящиков с компонентами.
\(i\)-ый ящик содержит компоненты с номерами от \(l_i\) до \(r_i\) включительно
\((0\le l_i \le r_i \le 10^9)\). Никакие два ящика не содержат одинаковые компоненты.
Беси хочет узнать, сколько уникальных микстур из трёх различных компонент она может создать.
Две микстуры рассматриваются как различные, если хотя бы одна компонента есть в одной микстуре и
отсутствует в другой. Ответ выводите по модулю \(10^9 + 7\).
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит два целых числа \(N\) и \(K\).
Каждая из последующих \(N\) строк содержит два разделённых пробелом целых числа
\(l_i\) и \(r_i\). Гарантируется, что ящики даются в порядке возрастания содержимого.
а именно , \(r_i<l_{i+1}\) для каждого \(1\le i<N\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Количество микстур из трёх различных компонент, которые Беси может создать по модулю
\(10^9 + 7\).
SCORING
- В тестах 3-4 \(\max(K,r_N)\le 10^4\).
- В тестах 5-6 \(K=2^k-1\) для некоторого целого \(k\ge 1\).
- В тестах 7-11 \(\max(K,r_N)\le 10^6\).
- В тестах 12-16 \(N\le 20\).
- В тестах 17-21 нет дополнительных ограничений.
Автор: Benjamin Qi
| |
|
|
Tree Depth
дп
разделяй и властвуй
математика
На Новый год Фермер Джон решил подарить своим коровам праздничное двоичное дерево поиска
(BST)
Чтобы сгенерировать это BST, ФД начинает с перестановки
\(a=\{a_1,a_2,\ldots,a_N\}\)
целых чисел \(1\ldots N\), где \(N\le 300\).
Затем он выполняет следующий псевдокод с аргументами \(1\) and \(N\).
generate(l,r):
if l > r, return empty subtree;
x = argminl <= i <= r ai; // index of min ai in {al,...,ar}
return a BST with x as the root,
generate(l,x-1) as the left subtree,
generate(x+1,r) as the right subtree;
Например, перестановка \(\{3,2,5,1,4\}\) сгенерирует такое BST
4
/ \
2 5
/ \
1 3
Пусть \(d_i(a)\) обозначает глубину вершины \(i\) в дереве, соотвествующем \(a\),
то есть количество вершин на пути из \(a_i\) к корню.
В примере выше, \(d_4(a)=1, d_2(a)=d_5(a)=2,\) and \(d_1(a)=d_3(a)=3\).
Количество инверсий \(a\) равно количеству пар целых чисел \((i,j)\), таких
что \(1\le i<j\le N\) и \(a_i>a_j\).
Коровы знают, что \(a\), которую ФД использовал для генерации BST, имеет ровно
\(K\) инверсий \((0\le K\le \frac{N(N-1)}{2})\).
Среди всех перестановок \(a\), удовлетворяющих этому условию, вычислите
Остаток, когда \(\sum_ad_i(a)\) поделено на \(M\) для каждого \(1\le i\le N\).
ФОРМАТ ВВОДА (файл treedepth.in):
Единственная строка ввода содержит три разделённых одиночными пробелами
целых числа: \(N, K\), \(M\), за которыми идёт перевод строки.
\(M\) будет простым числом в интервале \([10^8,10^9+9]\).
ФОРМАТ ВЫВОДА (файл treedepth.out):
Выведите \(N\) разделённых одиночными пробелами целых чисел, обозначающих
\(\sum_ad_i(a)\pmod{M}\) для каждого \(1\le i\le N.\)
ОЦЕНИВАНИЕ (по группам) :
- Тесты 3-4 удовлетворяют \(N\le 8.\)
- Тесты 5-7 удовлетворяют \(N\le 20.\)
- Тесты 8-10 удовлетворяют \(N\le 50.\)
| |
|
|
Sort It Out
Жадный алгоритм
реализация
разделяй и властвуй
\(N\) (\(1 \leq N \leq 10^5\)) Є®а®ў ”Ґа¬Ґа „¦® (а §«Ёз® Ё¤ҐвЁдЁжЁа®ў ле
\(1 \ldots N\)), ўлбва®Ґл ў ап¤. ”„ «оЎЁв, Є®Ј¤ ҐЈ® Є®а®ўл ўлбва®Ґл Ї® ў®§а бв Ёо,
® ᥩз б нв® Ґ в Є.
”„ ўл§лў Ґв Є®а®ўл Ї® ®¤®©. Љ®Ј¤ Є®а®ў ўл§ў , ® Їа®ўҐапҐв, Ґб«Ё Є®а®ў
ҐЇ®б।б⢥® бЇа ў ®в Ґс Ё¬ҐҐв ¬ҐмиЁ© ID, в®Ј¤ ®Ё ¬Ґповбп ¬Ґбв ¬Ё.
‡ ⥬, Ґб«Ё Є®а®ў ҐЇ®б।б⢥® б«Ґў ®в Ґс Ё¬ҐҐв Ў®«миЁ© ID, ®Ё ¬Ґповбп
¬Ґбв ¬Ё. Љ®а®ў ®бв ў«Ёў Ґвбп ў в®зЄҐ, Є®Ј¤ Є®а®ў б«Ґў ®в Ґс Ё¬ҐҐв
¬ҐмиЁ© ®¬Ґа, Є®а®ў бЇа ў ®в Ґс Ё¬ҐҐв Ў®«миЁ© ®¬Ґа.
”„ е®зҐв ўлЎа вм Ї®¤¬®¦Ґбвў® Є®а®ў, Ё § ⥬ Їа®ЁвҐаЁа®ў вмбп Ї® н⮬г
Ї®¤¬®¦Ґбвўг, ўл§лў п Є ¦¤го Ё§ нвЁе Є®а®ў Ї® ®зҐаҐ¤Ё (ў Ї®ап¤ЄҐ ў®§а бв Ёп Ёе ID),
®Їпвм Ё ®Їпвм ¤® вҐе Ї®а, Ї®Є ўбҐ Є®а®ўл Ґ бв гв ®вб®авЁа®ў л.
Ќ ЇаЁ¬Ґа, Ґб«Ё ® ўлЎҐаҐв Ї®¤¬®¦Ґбвў® Є®а®ў б ID \(\{2, 4, 5\}\), в® ® б з «
ўл§®ўҐв Є®а®ўг \(2\), § ⥬ Є®а®ўг \(4\), § ⥬ Є®а®ўг \(5\). …б«Ё ўбҐ \(N\) Є®а®ў Ґйс
Ґ ®вб®авЁа®ў л, ® Ўг¤Ґв ўл§лў вм нвЁе Є®а®ў ®Їпвм Ё ®Їпвм, бЄ®«мЄ® 㦮 а §.
”„ е®зҐв ¬ЁЁ¬Ё§Ёа®ў вм а §¬Ґа нв®Ј® ¬®¦Ґбвў . Ѓ®«ҐҐ в®Ј®, Ї®бЄ®«мЄг ®
бзЁв Ґв зЁб«® \(K\) бз бв«Ёўл¬, Ї®¬®ЈЁвҐ Ґ¬г ®ЇаҐ¤Ґ«Ёвм \(K\)-®Ґ «ҐЄбЁЄ®Ја дЁзҐбЄЁ
¬ЁЁ¬ «м®Ґ Ї®¤¬®¦Ґбвў® ¬ЁЁ¬ «м®Ј® а §¬Ґа в Є®Ґ, зв® ўл§лў п Ї®б«Ґ¤®ў ⥫м®
Є®а®ў нв®Ј® Ї®¤¬®¦Ґб⢠㦮Ґ Є®«ЁзҐбвў® а § ¬®¦® ®вб®авЁа®ў вм ўбҐе Є®а®ў.
Џ®¤¬®¦Ґбвў® \(S\) Ё§ \(\{1,\dots,N\}\) §лў Ґвбп «ҐЄбЁЄ®Ја дЁзҐбЄЁ ¬ҐмиҐ,
祬 Ї®¤¬®¦Ґбвў® \(T\) Ґб«Ё бЇЁб®Є н«Ґ¬Ґв®ў ў \(S\) (ў Ї®ап¤ЄҐ ў®§а бв Ёп)
«ҐЄбЁЄ®Ја дЁзҐбЄЁ ¬ҐмиҐ, зҐ бЇЁб®Є н«Ґ¬Ґв®ў Ё§ \(T\) (ў Ї®ап¤ЄҐ ў®§а бв Ёп).
Ќ ЇаЁ¬Ґа, \(\{1, 3, 6\}\) «ҐЄбЁЄ®Ја дЁзҐбЄЁ ¬ҐмиҐ, 祬 \(\{1, 4, 5\}\).
ЋжҐЁў ЁҐ: ‚ вҐбв е \(3/16\) Ў ««®ў \(N \leq 6\) and \(K = 1\).
‚ ¤®Ї®«ЁвҐ«мле вҐбв е \(5/16\) Ў ««®ў, \(K = 1\).
‚ ¤®Ї®«ЁвҐ«мле вҐбв е \(8/16\) Ў ««®ў, Ґв ¤агЈЁе ®Ја ЁзҐЁ©.
”ЋђЊЂ’ ‚‚Ћ„Ђ (д ©« itout.in):
ЏҐаў п бва®Є ᮤҐа¦Ёв ®¤® 楫®Ґ зЁб«®, \(N\).
‚в®а п бва®Є ᮤҐа¦Ёв ®¤® 楫®Ґ зЁб«®, \(K\) ( \(1 \leq K \leq 10^{18}\)).
’аҐвмп бва®Є ᮤҐа¦Ёв \(N\) а §¤Ґ«сле ®¤Ё®зл¬Ё Їа®ЎҐ« ¬Ё 楫ле зЁбҐ«, ЇаҐ¤бв ў«пойЁе
ID Є®а®ў б«Ґў Їа ў®.
ѓ а вЁагҐвбп, Ўг¤Ґв Є Є ¬ЁЁ¬г¬ \(K\) Є®а४вле Ї®¤¬®¦Ґбвў.
”ЋђЊЂ’ ‚›‚Ћ„Ђ (д ©« itout.out):
ЏҐаў п бва®Є ўлў®¤ ᮤҐа¦Ёв а §¬Ґа ¬ЁЁ¬ «м®Ј® Ї®¤¬®¦Ґбвў .
Ћбв ўиЁҐбп бва®ЄЁ ¤®«¦л ᮤҐа¦ вм ID Є®а®ў ў \(K\)-®¬ «ҐЄбЁЄ®Ја дЁзҐбЄЁ
¬ЁЁ¬ «м®¬ Ї®¤¬®¦Ґб⢥ ¬ЁЁ¬ «м®Ј® а §¬Ґа ,Ї® ®¤®¬г ID ў бва®ЄҐ,
ў Ї®ап¤ЄҐ ў®§а бв Ёп.
Џђ€Њ…ђ ‚‚Ћ„Ђ:
4 1
4 2 1 3
Џђ€Њ…ђ ‚›‚Ћ„Ђ:
2
1
4
Њл зЁ Ґ¬ б ¬ ббЁў
\(\mathtt{\:4\:\; 2\:\; 1\:\; 3\:}\).
Џ®в®¬ ”„ ўл§лў Ґв Є®а®ўг б ID 1Ў Ї®«гзЁвбп ¬ ббЁў
\(\mathtt{\:1\:\; 4\:\; 2\:\; 3\:}\).
Џ®в®¬ ”„ ўл§лў Ґв Є®а®ўг б ID 4 Ї®«гзЁвбп ¬ ббЁў
\(\mathtt{\:1\:\; 2\:\; 3\:\; 4\:}\).
‚ нв®© в®зЄҐ ¬ ббЁў ®вб®авЁа®ў .
Problem credits: Spencer Compton
| |
|
|
E. Сортируем перестановки
дп
битмаски
разделяй и властвуй
Пусть у вас есть перестановка a1, a2, ..., an, состоящая из чисел от 1 до n. Предположим, что за одну секунду можно выбрать набор непересекающихся пар (u1, v1), (u2, v2), ..., (uk, vk) и одновременно поменять местами aui и avi для всех i (1 ≤ ui < vi ≤ n). Пары не должны пересекаться, то есть все 2k чисел ui, vj должны быть различны. Вы хотите отсортировать заданную перестановку по возрастанию как можно быстрее с помощью описанных операций. Вычислите количество способов, которыми это можно сделать. Два способа различны тогда и только тогда, когда существует такой момент времени t, что в этих способах в этот момент времени выбраны два различных множества пар (порядок пар не имеет значения). Если заданная перестановка уже отсортирована, на ее сортировку не требуется времени. Таким образом, количество способов сортировки равно 1. Для того, чтобы усложнить задачу, мы выкинули k чисел из перестановки. Теперь ровно k чисел перестановки a1, a2, ..., an еще не определены. Для каждого возможного способа расставить выкинутые числа в перестановке a, нужно посчитать описанное количество способов сортировки и вывести сумму этих значений по модулю 1000000007 (109 + 7). Выходные данные Выведите общую сумму количества способов по модулю 1000000007 (109 + 7).
| |
|
|
66165
Вычислительная геометрия
разделяй и властвуй
Ученики Школы №1232 обожают все праздники в году, так как школа всегда организует очень много всяких интересных активностей: конкурсов, викторин, квизов и так далее. И в очередном из праздников учителя захотели сделать интересную викторину: ученики находились на поле, когда начинала играть музыка, они перемещались в хаотичном порядке, когда заканчивала, через колонки называлось число K, что означало, что ученикам нужно было объединиться в группы из K человек, кто не успел, выбывали из игры. Далее игра снова продолжалась с теми учениками, которые остались.
Проблемой этой игры составлял выбор – с кем объединиться каждому ученику, так как абсолютно все ученики были дружелюбными и знали друг друга в школе.
Учителя всегда интересуются тем, как поведут себя ребята в стрессовой ситуации, потому запустили заранее дрон над полем, картинка с которого передавалась в программу, которая преобразовывала после окончания музыки снимок учеников сверху в набор координат в плоскости OXY. Далее находилась пара самых близких друг к другу двух учеников.
Напишите программу, которая на основании преобразованного снимка в координаты, выведет имена двух учеников, которые наиболее близки по расстоянию друг к другу на момент окончания музыки.
Входные данные
На первой строке подаётся целое число N (2 <= N <= 106).
Далее на N строках подаются данные каждого ученика: его имя, координата X, координата Y, все через пробел (координаты всегда целые).
Координаты в диапазоне от -104 до 104.
Выходные данные
Вывести на одной строке через пробел два имени учеников, которые наиболее приближены друг к другу на всём поле, чем все остальные. Имена выводить в алфавитном порядке.
Примечание:
·имена учеников всегда на английском языке для удобстваобработки;
·имена учеников всегда состоят только из одного слова итолько из букв латинского алфавита, без спецсимволов и прочих знаков;
·на одной координате не может быть двух учениководновременно;
·если пар подходящих для ответа несколько, то вывести ту,которая максимально приближена к координате (0;0);
·если и таких пар несколько, то вывести любую.
| |
|
|
Подарки
разделяй и властвуй
Дед Мороз предлагает Вове выбрать подарки на Новый год.
Перед мальчиком лежат \(n\) подарков в ряд. Каждый подарок характеризуется целым числом, у \(i\)-го подарка оно равно \(a_i\) — количество удовольствия, которое подарок принесёт Вове. Удовольствие может быть как положительным, так и отрицательным, а также равным нулю.
Дед Мороз предложил Вове выбрать два числа \(l\) и \(r\) таких, что \(1 \le l \le r \le n\), и взять все подарки с номерами от \(l\) до \(r\). Однако \(k\) подарков с максимальными характеристиками среди выбранных Вова должен отдать своей младшей сестре Маше. Остальные подарки Вова забирает себе.
Вова хочет выбрать числа \(l\) и \(r\) так, чтобы суммарное удовольствие от подарков, доставшихся именно ему, было максимальным. Общее удовольствие от набора подарков — это сумма значений \(a_i\) для подарков в наборе.
Помогите Вове выбрать числа \(l\) и \(r\) так, что \(1 \le l \le r \le n\), \(r - l + 1 \ge k\) и общее удовольствие от выбранных подарков без учёта подарков, доставшихся Маше, максимально.
Формат входных данных
В первой строке записаны два целых числа \(n\) и \(k\) (\(1 \le n \le 200\,000\), \(0 \le k \le \min(100, n)\)) — количество подарков перед Вовой и количество подарков, которые требуется отдать Маше.
Во второй строке заданы \(n\) целых чисел через пробел \(a_1, a_2, \ldots, a_n\) (\(-10^9 \le a_i \le 10^9\)) — количество удовольствия, приносимого подарками.
Формат выходных данных
Выведите единственное число — общее удовольствие от выбранных Вовой подарков без учёта тех, что достались Маше.
Замечание
В первом примере Вова ничего не должен отдавать Маше, поэтому он выберет \(l = 3\), \(r = 5\), и общее удовольствие от выбранных подарков будет равняться \(5 + (-1) + 7 = 11\).
Во втором примере Вова должен будет отдать Маше подарок с самым большим количеством удовольствия. Тогда он так же выберет \(l = 3\), \(r = 5\), однако общее удовольствие будет равняться \(5 + (-1) = 4\).
В третьем примере Вова должен отдать два подарка с наибольшими характеристиками. В таком случае одним из оптимальных вариантов будет выбрать \(l = 1\), \(r = 2\).
| |
|
|
Разделяй и властвуй
разделяй и властвуй
реализация
В тридесятом государстве ради сбора мытных денег (таможенных пошлин) с торговых людей царь Салтан указал сделать зáсеки – заградительный полосы, которые тянутся с севера на юг или с запада на восток и преграждают путь всякому пешему и конному.
Тридесятое государство имеет форму прямоугольника, стороны которого тянутся с запада на восток и с севера на юг. Картограф изобразил карту государства в виде прямоугольника на системе координат с центром O, совпадающим с юго-западным углом страны и осями, параллельными осям координат. Засеки на карте изображены в виде отрезков различной длины, параллельных осям координат. При этом оказалось, что никакие два отрезка не пересекаются и не лежат на одной прямой.
Для удобства управления своей страной царь Салтан повелел разделить ее на непересекающиеся прямоугольные области с соблюдением следующих условий:
1) каждая засека входит полностью в границы областей
2) число областей должно быть наименьшим, дабы уменьшить расходы на приказный люд.
Напишите программу, помогающую картографическому приказу построить искомое разбиение.
Входные данные
В первой строке находятся координаты северо-восточного угла страны, Во второй строке указано количество засек N (N≤1000). Каждая из следующих N строк содержит описание одной из засек в виде четверки числе x1, y1, x2, y2, что соответствует отрезку с концевыми точками (x1, y1) и (x2, y2). Все координаты являются неотрицательными целыми и не превосходят 10000.
Выходные данные
В первую строку выведите количество областей M в найденном разбиении. В последующих M строках должны находиться целочисленные координаты юго-западного и северо-восточного углов для каждой из областей разбиения. Числа внутри строки разделять пробелами.
| |
|
|
Футурама
разделяй и властвуй
С помощью изобретенной профессором машины Фарнсворт и Эми меняются телами с целью осуществить свои мечты: профессор жаждет острых ощущений, а Эми мечтает есть от пуза, не опасаясь за фигуру. Впоследствии выясняется, что обмен разумом между двумя телами возможен не более одного раза, и чтобы вернуться обратно в свои тела нужно произвести промежуточный обмен. Бендер предлагает свою помощь, однако, заполучив тело Эми, он тут же скрывается, чтобы под чужой личиной украсть корону императора Робо-Венгрии.
Эми, недовольная возможностями профессорского тела в плане обжорства, уговаривает поменяться Лилу. Фрай приходит в ужас. Лила обижена и обвиняет Фрая в том, что его заботит только ее внешность. Фрай в отместку меняется телами с Зойдбергом.
Бендер оказывается пойман при попытке ограбления, однако освобождается, убедив императора в том, что он - робот в теле человека. Узнав, что император втайне мечтает пожить немного жизнью простых людей, Бендер предлагает тому на время поменяться телами. Но так как Профессор уехал рисковать жизнью в теле Бендера, пришлось подсунуть императору вместо своего корпуса автоматизированное помойное ведро.
Фрай в теле Зойдберга и Лила в теле Профессора встречаются в ресторане, чтобы выяснить отношения. В конце концов они понимают, что любят друг друга вовсе не за внешность. При виде сцены их бурного примирения Эми, на этот раз уже в теле Гермеса, надолго теряет аппетит.
Бендер, поменявшись телами с правителем Робо-Венгрии, наслаждается жизнью на его яхте. Однако именно в этот вечер заговорщики совершают покушение на императора. Жизнь Бендеру спасает появление профессора Фарнсворта.
После того, как все герои решают свои личные проблемы, профессору с помощью Бубльгума Тэйта и Сладкого Клайда из команды "Ударники" удается вернуть всех в свои тела.
"Футурама". Десятый эпизод шестого сезона.
В очередной серии Футурамы было проведено несколько обменов разумами между телами героев,но, по крайней мере Бубльгум Тэйт и Сладкий Клайд в обменах не участвовали. Теперь необходимо вернутьразумы всех героев в свои тела. К сожалению, два тела могут участвовать только в одном обмене,поэтому обратные обмены для этого произвести невозможно. Например, если тело 1поменялось разумом с телом 2, а потом тело 1 поменялось разумом с телом 3,то в теле 1 находится разум третьего героя, в теле 2 - разум первого героя,а в теле 3 - второго.Теперь можно произвести обмен разумами только между телами 2 и 3, тогда разум второго героявернется в свое тело, а первому и третьему героям могут помочь только Тэйт с Клайдом.
Помогите героям Футурамы вернуться в свои тела.
Входные данные
Во входном файле записаны целые числа N (4 ≤ N ≤ 20) и M(1 ≤ M ≤ 100) - количество героев Футурамы и количество произведенных обменов разумами.Герои занумерованы числами от 1 до N, изначально разум каждого из героев находится в своем теле. В последующих M строчках записана последовательность совершенных обменов разумами. Каждый обмен описывается двумя различными числами - номерами тел, которые, в этом обмене меняются разумами. Бубльгум Тэйт и Сладкий Клайд, как наиболее разумные герои, имеют номера N−1 и N, и гарантируется, что в исходных обменах они не участвовали.
Решения, верно работающие в случаях, когда каждое тело участвовало в обмене не больше одного раза будут набирать не менее 40 баллов.
Выходные данные
Выведите план обменов для возвращения разумов героев в свои телав виде пар различных чисел - номеров тел которые участвовали в соответствующем обмене.Причем никакие два тела не должны обмениваться между собой разумами более одного раза,включая исходные обмены. Если обменов не требуется, то можно ничего не выводить.Если планов обменов несколько, то выведите любой из них (не обязательно минимальный).
Вернуть разумы героев в свои тела всегда возможно.
Примечание
Приведем таблицу положения героев в телах после каждого из обменов:
| Обмен |
Тело 1 |
Тело 2 |
Тело 3 |
Тело 4 |
| До обменов |
1 |
2 |
3 |
4 |
| 1-2 |
2 |
1 |
3 |
4 |
| 1-3 |
3 |
1 |
2 |
4 |
| 2-4 |
3 |
4 |
2 |
1 |
| 1-4 |
1 |
4 |
2 |
3 |
| 2-3 |
1 |
2 |
4 |
3 |
| 3-4 |
1 |
2 |
3 |
4 |
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
4 1
1 2 |
1 3
2 4
1 4
2 3
3 4 |
| |
|