| | | |
|
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\)).
| |
|
|
F. Xor-пути
meet-in-the-middle
битмаски
дп
Перебор
*2100
Задано прямоугольное поле размера \(n \times m\). В каждой клетке записано целое число; число, записанное в клетке (\(i, j\)) равно \(a_{i, j}\). Ваша задача — посчитать количество путей из клетки (\(1, 1\)) в клетку (\(n, m\)), удовлетворяющих следующим условиям: - Из клетки можно перемещаться только вниз или только вправо. Более формально, из клетки (\(i, j\)) можно переместиться в клетку (\(i, j + 1\)) или в клетку (\(i + 1, j\)). Клетка, в которую совершается перемещение, не может находиться за пределами поля.
- Xor всех чисел на пути из клетки (\(1, 1\)) в клетку (\(n, m\)) должен быть равен \(k\) (xor это побитовое исключающее ИЛИ, эта операция представлена как '^' в Java или C++ и "xor" в Pascal).
Найдите количество подходящих путей для заданного поля. Выходные данные Выведите одно целое число — количество путей из (\(1, 1\)) в (\(n, m\)) с xor всех чисел на пути равным \(k\). Примечание Все пути из первого тестового примера: - \((1, 1) \rightarrow (2, 1) \rightarrow (3, 1) \rightarrow (3, 2) \rightarrow (3, 3)\);
- \((1, 1) \rightarrow (2, 1) \rightarrow (2, 2) \rightarrow (2, 3) \rightarrow (3, 3)\);
- \((1, 1) \rightarrow (1, 2) \rightarrow (2, 2) \rightarrow (3, 2) \rightarrow (3, 3)\).
Все пути из второго тестового примера: - \((1, 1) \rightarrow (2, 1) \rightarrow (3, 1) \rightarrow (3, 2) \rightarrow (3, 3) \rightarrow (3, 4)\);
- \((1, 1) \rightarrow (2, 1) \rightarrow (2, 2) \rightarrow (3, 2) \rightarrow (3, 3) \rightarrow (3, 4)\);
- \((1, 1) \rightarrow (2, 1) \rightarrow (2, 2) \rightarrow (2, 3) \rightarrow (2, 4) \rightarrow (3, 4)\);
- \((1, 1) \rightarrow (1, 2) \rightarrow (2, 2) \rightarrow (2, 3) \rightarrow (3, 3) \rightarrow (3, 4)\);
- \((1, 1) \rightarrow (1, 2) \rightarrow (1, 3) \rightarrow (2, 3) \rightarrow (3, 3) \rightarrow (3, 4)\).
| |
|
|
B. Замостите параллелепипед
битмаски
Комбинаторика
математика
Перебор
теория чисел
*2400
Вам дан прямоугольный параллелепипед с целыми положительными сторонами \(A\), \(B\) и \(C\). Найдите количество различных троек целых чисел (\(a\), \(b\), \(c\)) таких, что \(1\leq a\leq b\leq c\) и параллелепипед \(A\times B\times C\) можно замостить параллелепипедами \(a\times b\times c\). Обратите внимание, что все замощающие параллелепипеды должны быть ориентированы в одну сторону. Например, параллелепипед \(1\times 5\times 6\) можно разделить на параллелепипеды \(1\times 3\times 5\), но нельзя – на параллелепипеды \(1\times 2\times 3\). Выходные данные Для каждого теста выведите количество троек чисел, которые удовлетворяют всем условиям. Примечание В первом тесте параллелепипед со сторонами \((1, 1, 1)\) можно разделить только на параллелепипед со сторонами \((1, 1, 1)\). Во втором тесте параллелепипед со сторонами \((1, 6, 1)\) можно разделить на параллелепипеды со сторонами \((1, 1, 1)\), \((1, 1, 2)\), \((1, 1, 3)\) и \((1, 1, 6)\). В третьем тесте параллелепипед со сторонами \((2, 2, 2)\) можно разделить на параллелепипеды со сторонами \((1, 1, 1)\), \((1, 1, 2)\), \((1, 2, 2)\) и \((2, 2, 2)\).
| |
|
|
G. Разрешенные буквы
битмаски
графы
жадные алгоритмы
Паросочетания
Потоки
*2400
Поликарп недавно запустил свою новую идею для стартапа. Ниша довольно свободна, вектор развития звучит еще как многообещающе, поэтому он довольно легко нашел себе инвесторов для поддержки компании. Однако он так и не смог выбрать название стартапа! На самом деле, Поликарп придумал название, но некоторые изменения ему точно не помешают. Теперь он хочет поменять местами некоторые буквы, чтобы получить лучшее название. Буквы не обязательно должны стоять рядом. К тому же, каждый из инвесторов выбрал себе по позиции в названии и утвердил список букв, которые могут там стоять. Позиции, выбранные инвесторами попарно различны. Если некоторые позиции не выбраны ни одним инвестором, то там может стоять любая буква. Наконец, Поликарп уверен, что минимальное лексикографически название — лучшее название. (Ну так а почему, думаете, Google решил стать Alphabet?) Формально, вам дана строка, состоящая из строчных латинских букв от «a» to «f». Можно менять местами буквы на любых позициях произвольное количество раз (можно и ноль). Какое минимальное лексикографически название получить такое, что буква на каждой позиции в нем находится среди разрешенных букв? Если Поликарп не может получить ни одного корректного названия, то выведите «Impossible». Выходные данные Если Поликарп не может составить никакого корректного названия, то выведите «Impossible». В противном случае выведите минимальное лексикографически название, которое Поликарп может получить с помощью обменов букв в строке \(s\), такое, что буква на каждой позиции в нем находится среди разрешенных букв.
| |
|
|
G. Подходящая команда
битмаски
математика
теория чисел
*2700
Близится следующий сезон, поэтому Вы решили собрать команду из двух или трех человек. У Вас есть \(n\) кандидатов, \(i\)-й кандидат имеет ранг \(a_i\). Но у Вас есть какие-то странные ограничения: если Ваш ранг \(v\) и Вы выбрали кандидатов \(i\) и \(j\), то должно выполняться условие \(GCD(v, a_i) = X\) и \(LCM(v, a_j) = Y\). Вы очень опытный участник, поэтому Вы можете сделать свой ранг любым неотрицательным целым числом, однако \(X\) и \(Y\) связаны с Вашим днем рождения, поэтому они фиксированы. И вот Вы хотите узнать количество пар \((i, j)\) таких, что существует \(v\), что \(GCD(v, a_i) = X\) и \(LCM(v, a_j) = Y\). Разрешена ситуация \(i = j\), просто ваша команда будет состоять из двух участников. \(GCD\) — это наибольший общий делитель двух чисел, а \(LCM\) — наименьшее общее кратное. Выходные данные Выведите единственное число — количество пар \((i, j)\), что существует \(v\) такой, что \(GCD(v, a_i) = X\) и \(LCM(v, a_j) = Y\). Ситуация \(i = j\) разрешена. Примечание В первом примере следующие пары валидны: \(a_j = 1\) и \(a_i = [2, 4, 6, 8, 10, 12]\), либо \(a_j = 2\) и \(a_i = [2, 4, 6, 8, 10, 12]\). Ранг \(v\) в обоих случаях может быть равен \(2\). Во втором тесте следующие пары валидны: - \(a_j = 1\) и \(a_i = [1, 5, 7, 11]\);
- \(a_j = 2\) и \(a_i = [1, 5, 7, 11, 10, 8, 4, 2]\);
- \(a_j = 3\) и \(a_i = [1, 3, 5, 7, 9, 11]\);
- \(a_j = 6\) и \(a_i = [1, 3, 5, 7, 9, 11, 12, 10, 8, 6, 4, 2]\).
| |
|
|
D. Wu
битмаски
Перебор
Структуры данных
*1900
Чилден придумал легендарную историю и пытается продать свою подделку — ожерелье с «Wu» семье Касура. Но мистер Касура пытается разузнать всю правду из истории Чилдена. Поэтому он задаст несколько вопросов Чилдену о его так называемом «личном сокровище». Это «личное сокровище» представляет собой мультимножество \(S\) из \(m\) «01-строк». «01-строка» — строка, которая состоит из \(n\) символов «0» и «1». Например, если \(n=4\), то «0110», «0000», и «1110» являются «01-строками», но «00110» (в ней \(5\) символов, а не \(4\)) и «zero» (неразрешенные символы) не являются. Обратите внимание, что мультимножество \(S\) может содержать одинаковые элементы. Иногда мистер Касура будет давать «01-строку» \(t\) и спрашивать Чилдена количество строк \(s\) в мультимножестве \(S\) таких, что «Wu»-стоимость пары «01-строк» \((s, t)\) не больше чем \(k\). Миссис Касура и мистер Касура считают, что, если \(s_i = t_i\) (\(1\leq i\leq n\)), то «Wu»-стоимость пары символов равна \(w_i\), иначе — \(0\). «Wu»-стоимость пары «01-строк» равняется сумме всех «Wu»-стоимостей пар их символов. Заметьте, что длина каждой «01-строк» равняется \(n\). Например, если \(w=[4, 5, 3, 6]\), «Wu» от («1001», «1100») равно \(7\), потому что эти строки имеют одинаковые символы только в первой и третьей позициях, значит \(w_1+w_3=4+3=7\). Вам нужно помочь Чилдену ответить на запросы мистера Касуры. То есть найти количество строк в мультимножестве \(S\) таких, что «Wu»-стоимость пары не больше \(k\). Выходные данные Для каждого запроса выведите ответ на него. Примечание В первом примере мы имеем: «Wu» от («01», «00») равно \(40\). «Wu» от («10», «00») равно \(20\). «Wu» от («11», «00») равно \(0\). «Wu» от («01», «11») равно \(20\). «Wu» от («10», «11») равно \(40\). «Wu» от («11», «11») равно \(60\). В первом запросе пары («11», «00») и («10», «00») удовлетворяют условие поскольку «Wu» не больше \(20\). Во втором примере все пары удовлетворяют условие. В третьем примере пары («01», «11») и («01», «11») удовлетворяют условие. Обратите внимание, что поскольку строка «01» встречается два раза в мультимножестве, то ответ \(2\), а не \(1\). В четвертом примере, поскольку \(k\) увеличилось, то пара («10», «11») тоже удовлетворяет условие. В пятом примере, поскольку \(k\) увеличилось, то пара («11», «11») тоже удовлетворяет условие.
| |
|
|
G. X-мышь в общежитии
битмаски
математика
теория чисел
*2600
Общежитие состоит из \(m\) комнат, пронумерованных от \(0\) до \(m - 1\). Также в общежитии проживает \(x\)-мышь. \(x\)-мышь — это необычная мышь, так как \(x\)-мышь движется каждую секунду из комнаты \(i\) в комнату \(i \cdot x \mod{m}\) (фактически, телепортируется, так как не посещает никаких других комнат по дороге). Начальная позиция \(x\)-мыши неизвестна. На Вас возложили ответственность поймать эту необычную \(x\)-мышь, поэтому сейчас Вам интересно, какое минимальное количество ловушек Вы должны установить (одна ловушка в одной комнате), чтобы гарантированно ее поймать. Вы можете быть уверены, что если \(x\)-мышь посетит комнату с установленной в ней ловушкой, то она абсолютно точно будет поймана. Единственное сделанное Вами наблюдение: \(\text{GCD} (x, m) = 1\). Выходные данные Выведите единственное число — минимальное количество ловушек, которое Вам надо установить, чтобы гарантированно поймать \(x\)-мышь. Примечание В первом примере вы можете, например, установить ловушки в комнатах \(0\), \(2\), \(3\). Если \(x\)-мышь начнет в одной из этих комнат, то она сразу будет поймана. Если же \(x\)-мышь начнет путешествие в \(1\)-й комнате, то она будет поймана, когда переместится в комнату \(3\). Во втором примере мы можете поставить одну ловушку в комнату \(0\) и одну ловушку в любую другую комнату, так как если \(x\)-мышь начнет двигаться из любой комнаты в диапазоне \(1..m-1\) она посетит все комнаты из данного диапазона.
| |
|
|
E. Вася и хорошие последовательности
битмаски
дп
*2000
У Васи есть последовательность \(a\) состоящая из \(n\) целых чисел \(a_1, a_2, \dots, a_n\). За одну операцию Вася может выбрать число из последовательности и поменять местами два любых бита в его двоичной записи. Например из числа \(6\) \((\dots 00000000110_2)\) Вася может получить числа \(3\) \((\dots 00000000011_2)\), \(12\) \((\dots 000000001100_2)\), \(1026\) \((\dots 10000000010_2)\) и так далее. Вася может применять эту операцию любое количество раз (возможно, ни разу) к любому из заданных чисел. Вася считает последовательность чисел хорошей, если, применяя к ней описанную выше операцию, он может получить последовательность, побитовое исключающее ИЛИ всех элементов которой равно \(0\). Для заданной последовательности \(a_1, a_2, \ldots, a_n\) Вася хочет знать количество пар целых чисел \((l, r)\) таких, что \(1 \le l \le r \le n\) и последовательность \(a_l, a_{l + 1}, \dots, a_r\) является хорошей. Выходные данные В единственной строке выведите одно целое число — количество пар целых чисел \((l, r)\) таких, что \(1 \le l \le r \le n\) и последовательность \(a_l, a_{l + 1}, \dots, a_r\) является хорошей. Примечание В первом примере подходят пары \((2, 3)\) и \((1, 3)\). Для пары \((2, 3)\) числа можно изменить следующим образом: \(a_2 = 7 \rightarrow 11\), \(a_3 = 14 \rightarrow 11\) и \(11 \oplus 11 = 0\), где \(\oplus\) — операция побитового исключающего ИЛИ. Для пары \((1, 3)\) числа можно изменить следующим образом: \(a_1 = 6 \rightarrow 3\), \(a_2 = 7 \rightarrow 13\), \(a_3 = 14 \rightarrow 14\) and \(3 \oplus 13 \oplus 14 = 0\). Во втором примере подходят четыре пары: \((1, 2)\), \((2, 3)\), \((3, 4)\) и \((1, 4)\).
| |
|
|
F. Булевский компьютер
битмаски
бпф
математика
Перебор
*2800
У Алисы есть компьютер, который работает с \(w\)-битными целыми числами и имеет \(n\) регистров для чисел. Текущее содержимое регистров задано как массив \(a_1, a_2, \ldots, a_n\). Компьютер использует так называемые «супер функции», каждая из которых принимает два входных регистра и считает некую функцию, используя те два регистра. Учтите, что вы можете использовать один и тот же регистр как два входных аргумента. Каждая «супер функция» состоит из логических функций. Существует шесть логических функций: AND, OR, XOR, NOT AND, NOT OR и NOT XOR, которые обозначаются как «A», «O», «X», «a», «o», «x», соответственно. Каждая битовая функция принимает два входных бита. Их результаты с учетом входных данных \(b_1\), \(b_2\) приведены ниже: \(\begin{matrix} b_1 & b_2 & A & O & X & a & o & x \\ 0 & 0 & 0 & 0 & 0 & 1 & 1 & 1 \\ 0 & 1 & 0 & 1 & 1 & 1 & 0 & 0 \\ 1 & 0 & 0 & 1 & 1 & 1 & 0 & 0 \\ 1 & 1 & 1 & 1 & 0 & 0 & 0 & 1 \\ \end{matrix}\) «Супер функция», которая состоит из \(w\) логических операций, разделяет два входных числа \(x_1\) и \(x_2\) на \(w\) бит, выполняет \(i\)-ю логическую операцию с \(i\)-и битами двух входных чисел. После чего соединяет эти \(w\) бит и возвращает это число. Например, для \(4\)-битного компьютера мы можем иметь функцию «AXoA» (AND, XOR, NOT OR, AND). Для двух входных чисел: \(13 = 1101_2\) и \(10 = 1010_2\), функция вернет \(12 = 1100_2\), так как \(1\) AND \(1\) равно \(1\), \(1\) XOR \(0\) равно \(1\), NOT (\(0\) OR \(1\)) равно \(0\) и \(1\) AND \(0\) равно \(0\). Вам дан список всех \(m\) функций. Для каждой функции вам нужно найти количество упорядоченных пар переменных, которые на выходе дадут \(0\). Другими словами, найдите количество упорядоченных пар \((i,j)\), где \(1 \leq i,j \leq n\), таких что \(w_k(a_i, a_j) = 0\), где \(w_k\) — \(k\)-я функция, которую использует «супер функция». Выходные данные Выведите \(m\) строк. \(i\)-я строка должна содержать количество упорядоченных пар переменных, при которых \(i\)-я функция вернет ноль. Примечание В первом примере переменные в бинарной записи имеют вид \(1101\), \(1010\), \(0110\). Пары, которые вернут \(0\) — это \((13, 6)\), \((6, 13)\) и \((6, 6)\). Уже было описано в условии, что \(13 \oplus 10 = 10 \oplus 13 = 12\). При других числах \(13 \oplus 13 = 11\), \(10 \oplus 10 = 8\) и \(10 \oplus 6 = 6 \oplus 10 = 4\).
| |
|
|
E. Little C любит 3 III
битмаски
дп
математика
*3200
Little C очень любит число «3». Он любит все, что с ним связано. В данный момент его заинтересовала следующая задача: Даны два массива из \(2^n\) целых чисел: \(a_0,a_1,...,a_{2^n-1}\) и \(b_0,b_1,...,b_{2^n-1}\). Задача состоит в том, чтобы для каждого \(i (0 \leq i \leq 2^n-1)\), вычислить \(c_i=\sum a_j \cdot b_k\) (\(j|k=i\) и \(j\&k=0\), где "\(|\)" обозначает побитовую операцию ИЛИ и "\(\&\)" обозначает побитовую операцию И). Это замечательно, что можно доказать, что существует ровно \(3^n\) троек \((i,j,k)\), для которых \(j|k=i\), \(j\&k=0\) и \(0 \leq i,j,k \leq 2^n-1\). Поэтому Little C хочет решить эту отличную задачу (потому что она тесно связана с числом \(3\)) . Помогите ему вычислить все \(c_i\). Little C очень любит число \(3\), поэтому он лишь хочет знать все \(c_i \& 3\). Выходные данные Выведите одну строку, которая содержит \(2^n\) целых чисел, принадлежащих \([0,3]\) без пробелов — \(i\)-е из них должно обозначать \(c_{i-1}\&3\). (Очевидно, что \(c_{i}\&3\) принадлежит \([0,3]\)).
| |
|
|
G. Истоки и стоки
битмаски
Перебор
поиск в глубину и подобное
*2700
Задан ацикличный ориентированный граф, состоящий из \(n\) вершин и \(m\) ребер. Граф не содержит кратных ребер и петель. Вершина называется истоком, если в нее не входит ребер. Вершина называется стоком, если из нее не исходит ребер. Эти определения подразумевают, что некоторые вершины могут быть одновременно истоком и стоком. Количество истоков в графе равно количеству стоков, и это число не превосходит \(20\). К графу применяется следующий алгоритм: - если в графе нет истоков и стоков, то выйти;
- выбрать произвольный исток \(s\), произвольный сток \(t\), добавить ребро из \(t\) в \(s\) в граф и перейти к шагу \(1\) (эта операция удаляет \(s\) из истоков и \(t\) из стоков). Обратите внимание, что \(s\) и \(t\) могут быть одной и той же вершиной, тогда добавляется петля.
В конце проверяется, стал ли граф сильно связным (любая вершина достижима из любой другой). Ваша задача — проверить, что граф становится сильно связным вне зависимости от выбора истоков и стоков на втором шаге алгоритма. Выходные данные Выведите «YES», если граф становится сильно связным вне зависимости от выбора истоков и стоков на втором шаге алгоритма. В противном случае выведите «NO».
| |
|
|
E. Наибольшее паросочетание
битмаски
графы
дп
Перебор
поиск в глубину и подобное
*2400
Вам даны \(n\) блоков, каждый из которых выглядит как [color\(_1\)|value|color\(_2\)], при чём блок можно также перевернуть, чтобы получить [color\(_2\)|value|color\(_1\)]. Назовём последовательность блоков корректной, если касающиеся концы блоков совпадают по цветам. Например, последовательность из трёх блоков A, B и C является корректной, если левый цвет B совпадает с правым цветом A и правый цвет B совпадает с левым цветом C. Ценность последовательности равна сумме ценностей (value) отдельных блоков в ней. Найдите наибольшую возможную ценность корректной последовательности блоков, которую можно составить из какого-то подмножества данных блоков. Блоки в этом подмножестве можно произвольным образом перемещать и переворачивать. Каждый блок можно использовать не более одного раза в последовательности. Выходные данные Выведите ровно одно целое число — максимальная суммарная ценность блоков, образующих корректную последовательность. Примечание В первом примере возможно составить корректную подпоследовательность из всех блоков. Один из корректных способов следующий: [4|2|1] [1|32|2] [2|8|3] [3|16|3] [3|4|4] [4|1|2] Первый блок из входных данных ([2|1|4] \(\to\) [4|1|2]) и второй ([1|2|4] \(\to\) [4|2|1]) перевёрнуты. Во втором примере один из оптимальных ответов состоит только из первых трёх блоков упорядоченных следующим образом (второй или третий блок из входных данных перевёрнут): [2|100000|1] [1|100000|1] [1|100000|2] В третьем примере нельзя построить корректную последовательность содержающую два или более блока, поэтому оптимальный ответ состоит из одного первого блока, так как он имеет наибольшую ценность.
| |
|
|
B. Витамины
битмаски
дп
Перебор
реализация
*1200
В берляндском магазине есть \(n\) видов сока. Каждый сок характеризуется своей ценой \(c_i\), а также витаминами, которые в нём содержатся. В Берляндии есть всего три типа витаминов: витамин «A», витамин «B» и витамин «C». В каждом соке может быть один, два или все три витамина. Петя решил, что ему необходимо получить каждый из трёх витаминов. Определите минимальную стоимость соков, которые ему нужно для этого купить, либо сообщите, что это невозможно. Считается, что Петя получит витамин, если он купит хотя бы один сок, в котором этот витамин содержится, и выпьет его. Выходные данные Если Петя не сможет получить каждый из трёх витаминов, выведите -1. В противном случае выведите минимальную стоимость соков, которые Петя может купить, чтобы получить каждый из трёх витаминов. Примечание В первом примере Петя должен купить первый, второй и четвертый сок. Тогда он потратит \(5 + 6 + 4 = 15\) и получит все три витамина. Также он может купить только третий сок и получить все три витамина, но это невыгодно, так как третий сок стоит \(16\). Во втором примере Петя не сможет получить все три витамина, так как витамина «C» нет ни в одном соке.
| |
|
|
F. Сделай единицу
битмаски
дп
Комбинаторика
кратчайшие пути
математика
теория чисел
*2500
Януш — бизнесмен. Он владеет компанией «Янушзекс», которая производит игры для школьников. Последним хитом Янушзекс является крутая игра для одного человека «Сделай единицу». Игроку дана последовательность из \(n\) целых чисел \(a_i\). Разрешается выбрать любое подмножество из них и количество очков равно наибольшему общему делителю выбранных чисел. Игроку нужно выбрать наименьшее количество элементов, получив количество очков, равное \(1\). Теперь Януш интересуется, какое минимальное количество элементов нужно выбрать игроку в таком случае? Выходные данные Если нет ни одного подмножества данной последовательности с наибольшим общим делителем равным \(1\), то выведите -1. Иначе выведите ровно одно целое число — размер минимального множества с наибольшим общим делителем равным \(1\). Примечание В первом примере подмножество, соответствующее всей последовательности даёт наибольший общий делитель равный \(1\). Все меньшие подмножества дают наибольший общий делитель больший \(1\). Во втором примере наибольший общий делитель любого подмножества хотя бы \(2\).
| |
|
|
D. Двураскраски
битмаски
дп
*1700
Задана таблица, состоящая из \(2\) строк и \(n\) столбцов. Каждая ячейка данной таблицы должна быть раскрашена либо в черный, либо в белый цвет. Две ячейки являются соседями, если у них есть общая сторона и их цвет одинаков. Две ячейки \(A\) и \(B\) принадлежат одной и той же компоненте, если они являются соседями, или если существует сосед \(A\), который принадлежит к той же компоненте, что и \(B\). Назовем некоторую двураскраску красивой, если у нее ровно \(k\) компонент из ячеек. Посчитайте количество красивых двураскрасок. Это число может быть достаточно велико, поэтому выведите его по модулю \(998244353\). Выходные данные Выведите единственное целое число — количество красивых двураскрасок по модулю \(998244353\). Примечание Одна из возможных раскрасок в примере \(1\):
| |
|
|
C. Размещение
битмаски
дп
*2400
В 2500-ом году ежегодная церемония вручения дипломов в German University in Cairo (GUC) приближается к своему 500-летнему юбилею. Важной частью церемонии является размещение профессоров в зале, где происходит вручение дипломов. В GUC есть n профессоров. У каждого профессора свой уровень старшинства, и все уровни старшинства разные. Для простоты обозначим профессоров номерами от 1 до n, где 1 соответствует самому старшему, а n — самому младшему профессору. В зале, где проходит вручение дипломов, имеется n мест, по одному месту для каждого профессора. Некоторые места в этом зале предназначены для более старших профессоров. Конкретно, про m пар мест известно, что для пары мест (ai, bi) профессор, занимающий место ai должен быть старше профессора, занимающего место bi. Начиная с 2001 года в GUC ответственно подходят к соблюдению традиции размещения профессоров. Традиция гласит, что: - Порядок размещения меняется каждый год.
- В 2001 году было использовано лексикографически первое размещение.
- Каждый последующий год используется лексикографически следующее размещение.
Под размещением профессоров понимается список из n чисел, где первое число соответствует уровню старшинства профессора, занимающего место номер один, второе число соответствует уровню старшинства профессора, занимающего место номер два и так далее. Зная n, количество профессоров в GUC, текущий год y, и m пар ограничений на размещение, выведите порядок, в котором будет размещены профессора GUC на церемонии награждения в этом году. Выходные данные Выведите порядок размещения профессоров в году y. Если к этому году размещения, удовлетворяющие вышеописанным требованиям, закончатся, или заданные отношения старшинства противоречивы, выведите «The times have changed» (без кавычек). Примечание В первом примере лексикографически первым является порядок «1 2 3». В третьем примере после 3630800-го года допустимые порядки размещения закончатся. В четвертом примере не существует ни одного размещения удовлетворяющего всем ограничениям. Лексикографическое сравнение размещений реализует оператор < в современных языках программирования. Размещение a лексикографически меньше размещения b, если существует такое i (1 ≤ i ≤ n), что ai < bi, а для любого j (1 ≤ j < i) aj = bj.
| |
|
|
E. Сумма на отрезке
битмаски
дп
Комбинаторика
математика
*2300
Задано два целых числа \(l\) и \(r\) (\(l \le r\)). Ваша задача — посчитать сумму чисел от \(l\) до \(r\) (включая \(l\) и \(r\)) таких, что каждое число содержит не более \(k\) различных цифр, и вывести эту сумму по модулю \(998244353\). Например, если \(k = 1\), тогда вам необходимо посчитать все числа от \(l\) до \(r\) такие, что каждое число содержит только одинаковые цифры. Для \(l = 10, r = 50\) ответ равен \(11 + 22 + 33 + 44 = 110\). Выходные данные Выведите одно целое число — сумму чисел от \(l\) до \(r\) таких, что каждое число содержит не более \(k\) различных цифр, по модулю \(998244353\). Примечание В первом тестовом примере ответом является сумма чисел от \(l\) до \(r\), которая равна \(\frac{50 \cdot 51}{2} - \frac{9 \cdot 10}{2} = 1230\). Этот пример также разобран в условии задачи, но для \(k = 1\). Во втором тестовом примере ответом является просто сумма чисел от \(l\) до \(r\), которая равна \(\frac{2345 \cdot 2346}{2} = 2750685\). В третьем тестовом примере ответ равен \(101 + 110 + 111 + 112 + 113 + 114 + 115 + 116 + 117 + 118 + 119 + 121 + 122 + 131 + 133 + 141 + 144 + 151 = 2189\).
| |
|
|
D. Ехаб и еще одна очередная задача на xor
битмаски
интерактив
Конструктив
реализация
*2000
Это интерактивная задача! Ехаб играет в игру с Лагги. Ехаб имеет два загаданных числа \((a,b)\). Лагги может сказать пару чисел \((c,d)\) и Ехаб ответит: - 1 если \(a \oplus c>b \oplus d\).
- 0 если \(a \oplus c=b \oplus d\).
- -1 если \(a \oplus c<b \oplus d\).
Операция \(a \oplus b\) обозначает операцию побитовое исключающее «ИЛИ» чисел \(a\) и \(b\). Лагги нужно угадать \((a,b)\) не более, чем за 62 вопроса. Вам предлагается сыграть в эту игру. Вы играете за Лагги, а программа жюри - за Ехаба. Гарантируется, что \(0 \le a,b<2^{30}\). Выходные данные Чтобы вывести ответ, выведите "! a b" (без кавычек). Не забудьте сбросить буфер вывода после того, как выведете ответ. Протокол взаимодействия Чтобы задать вопрос, выведите "? c d" (без кавычек). \(c\) и \(d\) должны быть неотрицательными целыми числами, меньшими \(2^{30}\). Не забудьте сбросить буфер вывода после того, как зададите вопрос. После каждого вопроса вы должны считать ответ. Если программа жюри отвечает числом -2, это значит, что ваша программа задала больше, чем 62 запроса и должна завершиться. Чтобы сбросить буфер вывода вы можете использовать: - fflush(stdout) в C++.
- System.out.flush() в Java.
- stdout.flush() в Python.
- flush(output) в Pascal.
- Прибегните к документации других языков.
Взломы: Чтобы взломать решение другого участника, выведите два целых числа \(a\) и \(b\) \((0 \le a,b<2^{30})\). Примечание В примере из условия: Загаданные числа: \(a=3\), \(b=1\). В первом вопросе: \(3 \oplus 2 = 1\) и \(1 \oplus 1 = 0\), и ответ равен 1. Во втором вопросе: \(3 \oplus 1 = 2\) и \(1 \oplus 2 = 3\), и ответ равен -1. В третьем вопросе: \(3 \oplus 2 = 1\) и \(1 \oplus 0 = 1\), и ответ равен 0. После этого программа выводит ответ и завершается.
| |
|
|
G. Многомерные запросы
битмаски
Структуры данных
*2300
Задан массив \(a\), состоящий из \(n\) точек в \(k\)-мерном пространстве. Введем расстояние между двумя точками \(a_x\) и \(a_y\), как \(\sum \limits_{i = 1}^{k} |a_{x, i} - a_{y, i}|\) (также известное как манхэттенское расстояние). Необходимо обработать \(q\) запросов двух следующих типов: - \(1\) \(i\) \(b_1\) \(b_2\) ... \(b_k\) — выставить \(i\)-й элемент \(a\) равным точке \((b_1, b_2, \dots, b_k)\);
- \(2\) \(l\) \(r\) — найти максимальное расстояние между двумя точками \(a_i\) и \(a_j\), где \(l \le i, j \le r\).
Выходные данные Выведите ответ на каждый запрос второго типа.
| |
|
|
C. Степени двойки
битмаски
жадные алгоритмы
*1400
Положительное целое число \(x\) называется степенью двойки, если его можно представить как \(x = 2^y\), где \(y\) — неотрицательное целое число. Иными словами, степени двойки — это числа \(1, 2, 4, 8, 16, \dots\). Вам даны два положительных целых числа \(n\) и \(k\). Представьте \(n\) как сумму ровно \(k\) степеней двойки. Выходные данные Если невозможно представить \(n\) как сумму \(k\) степеней двойки, выведите NO. Иначе выведите YES, а затем — \(k\) положительных целых чисел \(b_1, b_2, \dots, b_k\), таких, что \(b_i\) являются степенями двойки, и \(\sum \limits_{i = 1}^{k} b_i = n\). Если ответов несколько, выведите любой из них.
| |
|
|
B. Пётр и кодовый замок
битмаски
дп
Перебор
*1200
Пётр недавно купил новую машину. Он только приехал на самую известную заправку города Санкт-Петербурга чтобы пополнить свой бензобак, как обнаружил, что бензобак защищён кодовым замком. Замок имеет шкалу в \(360\) градусов и указатель, который изначально указывает на ноль. Замок выглядит следующим образом: Петр позвонил в свой автосалон и узнал, что должен повернуть колесо замка ровно \(n\) раз, причём \(i\)-й поворот должен составлять ровно \(a_i\) градусов. После всех \(n\) поворотов указатель должен снова указать на ноль. Это немного озадачило Петра, так как он не знает, какие повороты следует сделать по часовой стрелке, а какие против. Так как есть много разных вариантов, помогите ему и узнайте, есть ли хотя бы один способ сделать все \(n\) поворотов так, чтобы указатель в конце снова указывал на ноль. Выходные данные Если можно осуществить все повороты так, что указатель будет указывать на ноль, то выведите «YES». Если же этого сделать нельзя, и Петру придётся купить новую машину, то выведите «NO». Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Примечание В первом примере можно сделать первый и второй поворот по часовой стрелке, а третий поворот против часовой стрелки. Во втором примере нельзя сделать все повороты так, чтобы указатель указывал после этого на ноль. В третьем примере Пётр может сделать все три поворота по часовой стрелке, тогда указатель повернётся на \(360\) градусов и будет снова указывать на ноль.
| |
|
|
F. Алексей и телешоу
битмаски
Комбинаторика
теория чисел
*2500
Алексей решил попытать счастья в телешоу. Однажды он сходил на викторину. После того, как он идеально ответил на вопросы «Как обычно называют псевдоним в интернете?» («Ум... может быть ник?»), «В честь какого известного изобретателя назвали единицу силы магнитного поля?» («Ум... Никола Тесла?»), он решил посетить гораздо более сложное телешоу: «Что в этом мультимножестве?!». Это телешоу устроено следующим образом: есть \(n\) мультимножеств, пронумерованных от \(1\) до \(n\). Каждое из них изначально пусто. Затем, происходят \(q\) запросов, где каждый запрос имеет один из четырёх следующих типов: - 1 x v — присвоить \(x\)-му мультимножеству мультимножество из одного элемента \(\{v\}\).
- 2 x y z — присвоить \(x\)-му мультимножеству объединение мультимножеств \(y\) и \(z\). For example: \(\{1, 3\}\cup\{1, 4, 4\}=\{1, 1, 3, 4, 4\}\).
- 3 x y z — присвоить \(x\)-му мультимножеству произведение \(y\)-го и \(z\)-го мультимножества. Произведение \(A \times B\) мультимножеств \(A\) и \(B\) определяется как \(\{ \gcd(a, b)\, \mid\, a \in A,\, b \in B \}\), где \(\gcd(p, q)\) обозначает наибольший общий делитель \(p\) и \(q\). Например, \(\{2, 2, 3\} \times \{1, 4, 6\}=\{1, 2, 2, 1, 2, 2, 1, 1, 3\}\).
- 4 x v — вас спрашивают, сколько раз число \(v\) встречается в мультимножестве \(x\). Так как викторина показал себя достаточно сложной в прошлом, то теперь нужно лишь сказать ответ на этот вопрос по модулю \(2\).
Обратите внимание, что \(x\), \(y\), и \(z\) в описании выше не обязательно различны. Для запросов \(2\)-го и \(3\)-го типа нужно сначала вычислить соответствующую сумму или произведение и лишь затем выполнить присвоение. Алексея смущают запутанные правила шоу. Помогите ему узнать ответы на все запросы \(4\)-го типа. Выходные данные Выведите строку из \(0\) и \(1\), имеющую длину равную количеству запросов \(4\)-го типа, \(i\)-й символ строки должен быть равен ответу на \(i\)-й запрос \(4\)-го типа. Примечание Мультимножества в тесте из примера выглядят следующим образом (\(i\) обозначает количество уже обработанных запросов). 
| |
|
|
H. Матеуш и бесконечная последовательность
битмаски
дп
Перебор
Строки
*3400
Последовательность Туе-Морса-Радецки-Матеуша (Туорса-Радевуша, для краткости) это бесконечная последовательность, получающаяся из конечной последовательности \(\mathrm{gen}\) длины \(d\) и целого числа \(m\), следующим образом: - В начале мы определяем \(M_0=(0)\).
- На \(k\)-м шаге, \(k \geq 1\), мы определяем \(M_k\) как конкатенацию \(d\) копий \(M_{k-1}\). Однако, каждая из них немного изменяется — в \(i\)-й из них (\(1 \leq i \leq d\)) каждый элемент \(x\) заменяется на \((x+\mathrm{gen}_i) \pmod{m}\).
Например, если \(\mathrm{gen} = (0, \color{blue}{1}, \color{green}{2})\) и \(m = 4\): - \(M_0 = (0)\),
- \(M_1 = (0, \color{blue}{1}, \color{green}{2})\),
- \(M_2 = (0, 1, 2, \color{blue}{1, 2, 3}, \color{green}{2, 3, 0})\),
- \(M_3 = (0, 1, 2, 1, 2, 3, 2, 3, 0, \color{blue}{1, 2, 3, 2, 3, 0, 3, 0, 1}, \color{green}{2, 3, 0, 3, 0, 1, 0, 1, 2})\), и так далее.
Как можно заметить, при условии, что первый элемент \(\mathrm{gen}\) равен \(0\), каждый последующий шаг порождает последовательность, префиксом которой является последовательность с предыдущего шага. Тогда мы можем определить бесконечную последовательность Туорса-Радевуша \(M_\infty\) как последовательность, получаемую бесконечным применением шага выше. Например, для параметров выше, \(M_\infty = (0, 1, 2, 1, 2, 3, 2, 3, 0, 1, 2, 3, 2, 3, 0, 3, 0, 1, \dots)\). Матеуш выбрал последовательность \(\mathrm{gen}\) и целое число \(m\), и с помощью них получил последовательность Туорса-Радевуша \(M_\infty\). Затем он выбрал два целых числа \(l\) и \(r\) и записал подпоследовательность этой последовательности: \(A := ((M_\infty)_l, (M_\infty)_{l+1}, \dots, (M_\infty)_r)\). Обратите внимание, что мы используем нумерацию с \(1\) для \(M_\infty\) и \(A\). У Матеуша есть его любимая последовательность \(B\) длины \(n\) и хочет узнать, насколько она большая относительно \(A\). Он говорит, что последовательность \(B\) мажорирует последовательность \(X\) длины \(n\) (обозначим как \(B \geq X\)), если для всех \(i \in \{1, 2, \dots, n\}\) выполняется \(B_i \geq X_i\). Теперь он спрашивает себя, сколько существует целых чисел \(x\) в отрезке \([1, |A| - n + 1]\) таких, что \(B \geq (A_x, A_{x+1}, A_{x+2}, \dots, A_{x+n-1})\). Так как обе последовательности очень большие, то ответить на вопрос, используя только бумагу и ручку, оказалось затруднительно. Не могли бы вы ему помочь? Выходные данные Выведите одно целое число — ответ на задачу. Примечание Последовательность Туорса-Радевуша в первом примере это стандартная последовательность Туе-Морса, так что последовательность \(A\) выглядит следующим образом: \(11010011001011010010\). Места, где \(B\) мажорирует последовательность \(A\) представлены на картинке:
| |
|
|
D. Простая задача
битмаски
графы
дп
*2200
Задан простой неориентированный граф. Выведите число простых циклов в нем. Цикл называется простым если не содержит повторяющихся вершин и ребер (т.е. каждая вершина и ребро содержатся в нем не более 1 раза). Выходные данные Выведите количество простых циклов в заданном графе.
| |
|
|
F. Вытянутая матрица
Бинарный поиск
битмаски
графы
дп
Перебор
*2000
Задана матрица \(a\), состоящая из \(n\) строк и \(m\) столбцов. В каждой ячейке записано целое число. Разрешается произвольно изменить порядок строк (в том числе и оставить начальный порядок), но не разрешается менять порядок ячеек в строке. После того, как был выбран некоторый порядок строк, матрица полностью обходится следующим образом: сначала посещаются все ячейки первого столбца с верхней строки до нижней, потом так же все ячейки второго столбца и так далее. Во время обхода выписывается последовательность чисел в ячейках в том же порядке, в котором они были посещены. Назовем эту последовательность \(s_1, s_2, \dots, s_{nm}\). Обход называется \(k\)-приемлемым, если для всех \(i\) (\(1 \le i \le nm - 1\)) \(|s_i - s_{i + 1}| \ge k\). Найдите такое максимальное целое число \(k\) такое, что существует порядок строк матрицы \(a\), который образует \(k\)-приемлемый обход. Выходные данные Выведите единственное целое число \(k\) — такое максимальное число, что существует порядок строк матрицы \(a\), который образует \(k\)-приемлемый обход. Примечание В первом примере можно переставить строки следующим образом, чтобы получить \(5\)-приемлемый обход: 5 3 10 8 4 3 9 9
Тогда последовательность \(s\) будет \([5, 10, 4, 9, 3, 8, 3, 9]\). Каждая пара соседних элементов отличается хотя бы на \(k = 5\). Во втором примере максимальное \(k = 0\), любой порядок \(0\)-приемлем. В третьем примере заданный порядок уже \(3\)-премлемый, можно его оставить.
| |
|
|
D. Слой профессионалов
битмаски
дп
*3100
Кардблаф - популярный вид спорта в Телеграме. Каждый игрок в Кардблаф когда-либо мечтал попасть в слой профессионалов. В слое профессионалов сейчас \(n\) судей и вы проходите туда отбор. У вас есть число \(k\) — ваше умение играть в Кардблаф. Каждый судья имеет число \(a_i\) — показатель неуверенности относительно того, брать вас или нет, а также опыт \(e_i\). Для того, чтобы убеждать судей, вам нужно играть с ними. С каждым судьёй вы можете сыграть только один раз. По результатам игры вы можете уменьшить неуверенность \(i\)-го судьи, разделив её на любой делитель \(a_i\) небольший \(k\). Если НОД всех показателей судей будет равен \(1\), то они придут к согласию и возьмут вас в слой профессионалов. Также вы хотели бы минимизировать время, потраченное на убеждение судей. Известно, что если вы сыграете с \(x\) судьями с суммарным опытом \(y\), то потратите \(x \cdot y\) секунд. Выведите минимальное время для вступление в слой профессионалов, если это возможно, и \(-1\), иначе. Выходные данные Выведите одно число - минимальное число секунд, если существует способ убедить судей, и \(-1\), иначе.
| |
|
|
E. Помочь Хиасату
meet-in-the-middle
битмаски
дп
Перебор
*2200
Хиасат недавно зарегистрировал новый аккаут на сайте NeckoForces и, как только его друзья об этом узнали, каждый из них захотел, чтобы его имя было названием хендла профиля Хиасата. К счастью для Хиасата, он может менять свой профиль в некоторые моменты времени. Также он знает моменты времени, когда его друзья будут заходить на его страницу. Формально, дана последовательность событий двух видов: - \(1\) — Хиасат может поменять свой хендл.
- \(2\) \(s\) — друг \(s\) посещает профиль Хиасата.
Друг \(s\) будет счастлив, если каждый раз, когда он посетит страницу Хиасата, его хендл будет равен \(s\). Хиасат просит вас помочь ему, выясните наибольшее количество счастливых друзей, которого можно добиться. Выходные данные Выведите одно целое число — наибольшее число счастливых друзей. Примечание В первом примере, оптимально поменять хендл на «motarack» в первом событие и на «light» в четвёртом. Таким образом, «motarack» и «light» будут счастливы, а «mike» — нет. Во втором примере можно выбрать «alice», «bob» или «tanyaromanova», и ровно этот друг и будет счастлив.
| |
|
|
C. Петя и пауки
битмаски
дп
снм
*2100
Маленький Петя любит заниматься дрессировкой пауков. У Пети есть доска размера n × m, в каждой клетке которой изначально сидит паук. Через одну секунду Петя быстро выбирает для каждого паука некоторое действие, и все они покорно выполняют свои команды. Всего есть 5 различных команд: остаться на месте или переползти из своей клетки в определенную из четырех соседних по стороне (то есть по одной команде на каждое из четырех возможных направлений). Петя дает команды таким образом, чтобы ни один паук не уполз за пределы доски. Допускается, что пауки могут ползти навстречу друг другу. Все пауки переползают одновременно, в одной клетке в итоге может оказаться более одного паука. Петя хочет знать, каким может быть максимальное возможное количество свободных от пауков клеток через одну секунду. Выходные данные В первой строке выведите максимальное число клеток, в которых нет пауков. Примечание В первом примере единственный возможный ответ: s Во втором примере один из возможных вариантов ответа: rdl rul
s обозначает команду «оставаться на месте», l, r, d, u обозначают команды соответственно «ползти влево», «ползти вправо», «ползти вниз», «ползти вверх».
| |
|
|
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\) для третьего.
| |
|
|
E. Расшифруй строку
битмаски
интерактив
китайская теорема об остатках
Конструктив
математика
*2200
Это интерактивная задача. Не забывайте о том, что ваша программа должна каждый раз после вывода запроса сбрасывать буфер вывода. Для сброса буфера вывода можно использовать fflush(stdout) в C++, system.out.flush() в Java, stdout.flush() в Python или flush(output) в Pascal. Если вы используете другой язык программирования, посмотрите в его документации, как выполняется эта операция. Также рекомендуем вам прочесть руководство по интерактивным задачам: https://cf.m27.workers.dev/blog/entry/45307. Вам дана строка \(t\), состоящая из \(n\) строчных латинских букв. Эта строка была получена следующим образом: сначала у жюри была строка \(s\), состоящая также из \(n\) строчных латинских букв. Затем к ней применили не более \(n\) (возможно, ни одной) операций. \(i\)-я операция обозначается двумя целыми числами \(a_i\) и \(b_i\) (\(1 \le a_i, b_i \le n\)), и означает обмен символов строки под номерами \(a_i\) и \(b_i\). Все операции были выполнены в том порядке, в котором они расположены в последовательности. Например, если \(s\) — xyz, и было выполнено \(2\) операции: \(a_1 = 1, b_1 = 2\); \(a_2 = 2, b_2 = 3\), то после первой операции текущая строка будет yxz, после второй — yzx, поэтому \(t\) — yzx. Ваше задание — восстановить исходную строку \(s\). К сожалению, о последовательности операций вы ничего не знаете (вы даже не знаете, была ли в ней хотя бы одна операция). Но вы можете использовать ту же самую последовательность обменов на любой строке, на которой вы хотите, если в этой строке ровно \(n\) символов, и все они — строчные латинские буквы. После применения последовательности операций на строке вы можете узнать, во что она превратилась. Можете ли вы восстановить исходную строку \(s\), использовав последовательность операций не более \(3\) раз? Строка \(s\) и последовательность операций в каждом тесте являются фиксированными; интерактор не пытается адаптировать тест под ваше решение. Выходные данные Чтобы дать ответ, ваша программа должна вывести одну строку \(!\) \(s\) с переводом строки в конце. После этого программа должна сбросить буфер вывода и завершиться. Протокол взаимодействия До того, как ваша программа даст ответ, она может отправить не более \(3\) запросов. Чтобы отправить запрос, выведите строку следующего формата: \(?\) \(s'\), где \(s'\) должна быть строкой из ровно \(n\) строчных латинских букв. Строка, которую вы отправляете, должна заканчиваться символов перевода строки. После отправки запроса программа должна сбросить буфер вывода и прочитать ответ на запрос — строку \(t'\), состоящую из \(n\) строчных латинских букв, которая будет являться результатом применения последовательности обменов к \(s'\). Ответ будет дан на отдельной строке, заканчивающейся символом перевода строки. Если вы зададите некорректный запрос (или же количество запросов превысит \(3\)), ответом будет строка 0. Если ваша программа получила такой ответ, она должна немедленно завершиться — иначе вы можете получить вердикт «Ошибка исполнения», «Превышено ограничение времени» или какой-нибудь другой, а не «Неправильный ответ». Примечание В примере рассматривается тест, который приводился в условии. Участник задает запрос со строкой baa, которая превращается в aab. Во втором запросе задается строка aba, которая превращается в baa. В третьем запросе задается строка aab, которая превращается в aba. Участник может понять, что изначально строка \(s\) была xyz. Замечание к фазе взломов: Чтобы отправить тест в фазу взломов, предоставьте его в следующем виде: В первой строке должна быть записана строка \(s\), которую вы загадываете, состоящая из \(n \in [1, 10000]\) строчных латинских букв. Во второй строке должно быть записано одно целое число \(k\) (\(0 \le k \le n\)) — количество операций в последовательности обменов. Затем должны следовать \(k\) строк, \(i\)-я из которых должна задавать \(i\)-ю операцию обмена двумя целыми числами \(a_i\) и \(b_i\) (\(1 \le a_i, b_i \le n\)). Например, тест из условия выглядел бы вот так: xyz 2 1 2 2 3
| |
|
|
F. Аккуратная строка
битмаски
дп
*2500
Задана строка длины \(n\). Каждый ее символ — это одна из \(p\) первых строчных латинских букв. Также задана матрица \(A\) из бинарных значений размера \(p \times p\). Матрица симметрична (\(A_{ij} = A_{ji}\)). \(A_{ij} = 1\) обозначает, что \(i\)-я и \(j\)-я латинские буквы могут быть соседями в строке. Назовем строку аккуратной, если все соседние символы в ней могут быть соседями (имеют 1 в соответствующей ячейке матрицы \(A\)). Разрешается делать следующую операцию. Выбрать некоторую букву, удалить все ее вхождения и соединить оставшиеся части строки, не меняя их порядок. Например, после удаления буквы 'a' из «abacaba» останется «bcb». Заданная строка аккуратная. Строка должна оставаться аккуратной после каждой сделанной операции. Разрешается делать произвольное число операций (возможно ноль). Какую самую короткую строку можно получить в результате? Выходные данные Выведите единственное целое число — длину самой короткой строки, которую можно получить, сделав произвольное количество операций (возможно ноль). Примечание В первом примере ни одна буква не может быть удалена из начальной строки. Во втором примере можно удалять буквы в порядке 'b', 'c', 'a'. Строки на промежуточных шагах будут: "abacaba" \(\rightarrow\) "aacaa" \(\rightarrow\) "aaaa" \(\rightarrow\) "". В третьем примере можно удалить букву 'b', и все. В четвертом примере можно удалять буквы в порядке 'c', 'b', но не в порядке 'b', 'c', так как две буквы 'c' не могут быть соседями.
| |
|
|
B. PFAST Inc.
битмаски
графы
Перебор
*1500
Когда мальчик Петя вырос и поступил в университет, он начал участвовать в соревнованиях АСМ. Позже он осознал, что ему не нравится формат этих соревнований из-за того, что в команде может быть только три человека (что не позволяло брать ему с собой на соревнования всех друзей, а также хорошо распределять задачи между участниками команды), поэтому он решил сделать свой формат соревнований PFAST Inc. — Petr and Friends Are Solving Tasks Corporation. В соответствии с форматом PFAST Inc. в команде может быть любое количество человек. Чтобы сделать этот формат соревнований популярным, он организовал свой турнир. Для создания команды, которую он будет готовить для соревнований по системе PFAST Inc., он выбрал несколько добровольцев (до 16 человек) и решил составить из них команду. Петя прекрасно понимает, что если в команде будет два человека, которые между собой не ладят, то команда будет выступать плохо. Составьте максимальную по числу человек команду, в которой все между собой ладят. Выходные данные В первой строке выходного файла должно содержаться единственное число k — количество человек в искомой команде. В следующих k строках должны содержаться имена участников искомой команды в лексикографическом порядке. При наличии нескольких решений выведите любое. Искомая команда не обязана содержать Петю.
| |
|
|
E. Медианная строка
битмаски
математика
Строки
теория чисел
*1900
Заданы две строки \(s\) и \(t\), обе состоят ровно из \(k\) строчных букв латинского алфавита, \(s\) лексикографически меньше \(t\). Рассмотрим список всех строк, состоящих ровно из \(k\) строчных латинских букв, лексикографически не меньших, чем \(s\) и не больше, чем \(t\) (включая \(s\) и \(t\)) в лексикографическом порядке. Например, для \(k=2\), \(s=\)«az» и \(t=\)«bf» список будет равен [«az», «ba», «bb», «bc», «bd», «be», «bf»]. Ваша задача — вывести медиану (средний элемент) этого списка. Для примера выше это будет «bc». Гарантируется, что количество строк, лексикографически не меньших, чем \(s\) и не больших, чем \(t\), нечетно. Выходные данные Выведите одну строку, состоящую ровно из \(k\) строчных букв латинского алфавита — медиану (средний элемент) списка строк длины \(k\), лексикографически не меньших, чем \(s\) и не больших, чем \(t\).
| |
|
|
C. Загадочная схема
битмаски
Перебор
Выходные данные Выведите целое число.
| |
|
|
C. Диаметр дерева
битмаски
графы
интерактив
*1700
Есть взвешенное дерево с \(n\) вершинами и \(n-1\) ребрами. Вершины пронумерованные от \(1\) до \(n\). Веса ребер — положительные целые числа не превышающее \(100\). Определим расстояние между двумя вершинами как сумму ребер на уникальном пути между ними. Вы хотели бы найти диаметр дерева. Диаметр — это максимальное расстояние между вершинами. К сожалению, дерево вам неизвестно, но вы можете задать несколько вопросов. В одном вопросе вы можете указать два непустых непересекающихся набора вершин \(p\) и \(q\), и вам скажут максимальное расстояние между одной вершиной в \(p\) и одной вершиной в \(q\). Другими словами, максимальное расстояние между \(x\) и \(y\), где \(x \in p\) и \(y \in q\). Задав не более \(9\) вопросов, вы должны найти максимальное расстояние между любой парой вершин. Протокол взаимодействия Во входных данных находятся несколько (не меньше одного) тестовых случаев. В первой строке находится одно целое число \(t\) (\(1 \le t \le 1\,000\)) — количество тестовых случаев. Далее следуют описания тестовых случаев. Первая строка описания тестового случая содержит одно целое число \(n\) (\(2 \leq n \leq 100\)) — количество вершин в дереве. Чтобы задать вопрос, выведите «\(k_1\ k_2\ a_1\ a_2\ \ldots\ a_{k_1}\ b_1\ b_2\ \ldots\ b_{k_2}\)» \((k_1, k_2 \geq 1\) и \(k_1+k_2 \leq n\)). Эти два множества не должны быть пусты и не должны пересекаться. В ответ считайте одно целое число \(\max_{p,q} dist(a_p, b_q)\). Если вы когда-либо получите \(-1\), немедленно завершите вашу программу, чтобы избежать других вердиктов. После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Когда вы будете готовы ответить, выведите «\(-1\ d\)», где \(d\) — максимальное кратчайшее расстояние по всем парам вершин. Вы можете задать не более \(9\) вопросов в каждом тесте. Формат для взломов Чтобы взломать, используйте следующий формат. Обратите внимание, что вы можете взламывать, используя только один тест. Первая строка должна содержать одно целое число \(t\) (\(t=1\)). Вторая строка должна содержать одно целое число \(n\) (\(2 \leq n \leq 100\)). Каждая из следующих \(n-1\) строк должна содержать три целых числа \(a_i, b_i, c_i\) (\(1\leq a_i, b_i\leq n\), \(1 \leq c_i \leq 100\)). Они описывают неориентированное ребро между вершинами \(a_i\) и \(b_i\) с весом \(c_i\). Эти ребра должны образовывать дерево. Примечание В первом примере первое дерево выглядит так:  В первом вопросе \(p = {1}\) и \(q = {2, 3, 4, 5}\). Максимальное расстояние между вершинами в \(p\) и вершинами \(q\) равно \(9\) (расстояние между вершинами \(1\) и \(5\)). Второе дерево — это дерево с двумя вершинами и ребром с весом \(99\) между ними.
| |
|
|
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]\)
| |
|
|
F. Foo Fighters
битмаски
Конструктив
*2700
Вам дано \(n\) объектов. У каждого объекта есть два целочисленных свойства: \(val_i\) — его цена — и \(mask_i\). Гарантируется, что изначально сумма цен всех объектов не равна нулю. Вы хотите выбрать некоторое целое положительное число \(s\). После этого все объекты модифицируется, причем \(i\)-й объект модифицируется следующим образом: - рассмотрим \(mask_i\) и \(s\) в двоичной системе счисления,
- вычислим побитовое «И» \(s\) и \(mask_i\) (\(s \,\&\, mask_i\)),
- если (\(s \,\&\, mask_i\)) содержит нечётное число единиц в двоичной записи, то \(val_i\) меняется на \(-val_i\). Иначе с \(i\)-м объектом ничего не происходит.
Нужно найти такое целое число \(s\), что если произвести модификацию, как описано выше, то сумма всех цен сменит знак (если она была отрицательной, то она должна стать положительной, и наоборот; не разрешается сумме становится нулём). При этом абсолютное значение суммы цен может стать любым. Выходные данные Выведите целое число \(s\) (\(1 \le s \le 2^{62} - 1\)) такое, что если его произвести модификацию, как описано выше, то сумма всех \(val_i\) сменит знак. В случае если существует несколько таких \(s\), выведите любое из них. Можно показать, что всегда существует хотя бы одно подходящее \(s\). Примечание В первом тестовом примере все объекты изменят свою стоимость кроме объекта с маской \(151\). Поэтому их сумма изменит знак: изначально \(24\), после модификаций — \(-28\). Во втором тестовом примере единственный объект поменяет свою стоимость. Поэтому сумма всех цен изменит знак.
| |
|
|
B. Дима и плохой XOR
битмаски
дп
Конструктив
Перебор
*1600
У лицеиста Димы из Кремляндии есть таблица \(a\) размера \(n \times m\), заполненная целыми неотрицательными числами. Он хочет в каждой строке выбрать ровно одно число так, чтобы побитовое исключающее ИЛИ выбранных чисел было строго больше нуля. Помогите ему! Формально, он хочет выбрать последовательность чисел \(c_1, c_2, \ldots, c_n\) (\(1 \leq c_j \leq m\)) так, чтобы выполнялось неравенство \(a_{1, c_1} \oplus a_{2, c_2} \oplus \ldots \oplus a_{n, c_n} > 0\), где \(a_{i, j}\) — элемент таблицы в \(i\)-й строке и \(j\)-м столбце. Здесь \(x \oplus y\) обозначает операцию побитового исключающего ИЛИ чисел \(x\) и \(y\). Выходные данные Если не существует способа выбрать в каждой строке таблицы одно число, чтобы их побитовое исключающее ИЛИ было строго больше нуля, выведите «NIE». В противном случае выведите «TAK», и в следующей строке выведите \(n\) целых чисел \(c_1, c_2, \ldots c_n\), разделенных пробелами, (\(1 \leq c_j \leq m\)), чтобы выполнялось неравенство \(a_{1, c_1} \oplus a_{2, c_2} \oplus \ldots \oplus a_{n, c_n} > 0\). Если существует более одного возможного ответа, вы можете вывести любой. Примечание В первом примере все числа в матрице равны \(0\), поэтому невозможно выбрать в каждой строке таблицы по одному числу так, чтобы их побитовое исключающее ИЛИ было строго больше нуля. Во втором примере выбранные числа \(7\) (первое число в первой строке) и \(10\) (третье число во второй строке), \(7 \oplus 10 = 13\), \(13\) больше чем \(0\), поэтому ответ найден.
| |
|
|
B. Кошачье преобразование фурфурье
битмаски
Конструктив
математика
поиск в глубину и подобное
*1300
Кошачье преобразование фурфурье это популярный алгоритм в программировании, использующийся при создании длинных кошек. Неко хочет применить этот алгоритм, чтобы создать идеальную длинную кошку. Предположим у нас есть кошка с целым числом \(x\). Идеальная длинная кошка это кошка с числом равным \(2^m - 1\) для некоторого неотрицательного \(m\). Например числа \(0\), \(1\), \(3\), \(7\), \(15\) подходят для идеальных длинных кошек. В кошачьем преобразовании фурфурье можно менять \(x\) используя следующие операции: - (Операция А): вы выбираете произвольное неотрицательное число \(n\) и заменяете \(x\) на \(x \oplus (2^n - 1)\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ.
- (Операция Ы): заменить \(x\) на \(x + 1\).
Первая применённая операция должна быть типа А, вторая операция — типа Ы, третья снова типа А, и так далее. Формально, если пронумеровать операции с единицы в порядке их выполнения, то операции с нечётным номером должны быть типа А, а операции с чётным номером — типа Ы. Неко хочет производит идеальных длинных кошек в промышленном масштабе, поэтому на одну кошку он может потратить не более \(40\) операций. Можете ли вы ему помочь и составить план операций, которые нужно проделать? Обратите внимание, что не требуется минимизировать число выполненных операций. Достаточно лишь, чтобы число операций не превосходило \(40\). Выходные данные В первой строке выведите одно целое число \(t\) (\(0 \le t \le 40\)) — количество операций, которое нужно применить. Затем для каждой операции с нечётным номером выведите соответствующее число \(n_i\) в ней. В частности, выведите \(\lceil \frac{t}{2} \rceil\) целых чисел \(n_i\) (\(0 \le n_i \le 30\)), обозначающих замену \(x\) на \(x \oplus (2^{n_i} - 1)\) в соответствующем шаге. В случае если существует несколько возможных ответов, выведите любой из них. Можно показать, что в ограничениях задачи существует хотя бы один возможный ответ. Примечание В первом примере один из возможных способов преобразовывать число выглядит следующим образом: \(39 \to 56 \to 57 \to 62 \to 63\). Или более подробно: - Выбираем \(n = 5\). \(x\) заменяется на \(39 \oplus 31\), то есть \(56\).
- Увеличиваем \(x\) на \(1\), тем самым он становится равным \(57\).
- Выбираем \(n = 3\). \(x\) заменяется на \(57 \oplus 7\), то есть \(62\).
- Увеличиваем \(x\) на \(1\), тем самым он становится равным \(63 = 2^6 - 1\).
Во втором и третьем примере число можно не преобразовывать.
| |
|
|
F1. Неко захватывает кошковселенную (упрощённая версия)
битмаски
дп
матрицы
*2800
Эта задача такая же как и следующая, но с меньшими ограничениями. Аки играет в новую видео-игру. В этой игре он управляет Неко, огромным котом, способным перемещаться между планетами кошковселенной. Кошковселенная состоит из \(n\) планет, пронумерованных от \(1\) до \(n\). В начале игры Аки выбирает планету, на которой изначально находится Неко. Затем Аки совершает \(k - 1\) ходов, где за один ход Аки перемещает Неко с текущей планеты \(x\) на какую-то планету \(y\), такую что: - Планета \(y\) ещё не посещена.
- \(1 \leq y \leq x + m\) (где \(m\) это фиксированная константа, заданная во входных данных)
Таким образом Неко посетит ровно \(k\) различных планет. Два способа посещений планет называются различными, если существует индекс \(i\), что \(i\)-я планета в первом способе отличается от \(i\)-й планеты во втором способе. Сколько всего существует способов посетить \(k\) планет таким образом? Так как ответ может быть достаточно большим, выведите его по модулю \(10^9 + 7\). Выходные данные Выведите ровно одно целое число — количество способов, которыми Неко может посетить \(k\) планет. Так как это число может быть достаточно большим, выведите его по модулю \(10^9 + 7\). Примечание В первом примере есть \(4\) способа для Неко посетить все планеты: - \(1 \rightarrow 2 \rightarrow 3\)
- \(2 \rightarrow 3 \rightarrow 1\)
- \(3 \rightarrow 1 \rightarrow 2\)
- \(3 \rightarrow 2 \rightarrow 1\)
Во втором примере есть \(9\) способов посетить ровно \(2\) планеты: - \(1 \rightarrow 2\)
- \(2 \rightarrow 1\)
- \(2 \rightarrow 3\)
- \(3 \rightarrow 1\)
- \(3 \rightarrow 2\)
- \(3 \rightarrow 4\)
- \(4 \rightarrow 1\)
- \(4 \rightarrow 2\)
- \(4 \rightarrow 3\)
В третьем примере \(m = 4\) и Неко может посетить все планеты в любом порядке, так что всего есть \(5! = 120\) способов всё посетить. В четвёртом примере Неко должен посетить только \(1\) планету (которая в частности будет начальной планетой маршрута), а значит есть \(100\) способов посетить одну планету.
| |
|
|
F2. Неко захватывает кошковселенную (усложнённая версия)
битмаски
дп
матрицы
*3000
Эта задача такая же как и предыдущая, но с большими ограничениями. Аки играет в новую видео-игру. В этой игре он управляет Неко, огромным котом, способным перемещаться между планетами кошковселенной. Кошковселенная состоит из \(n\) планет, пронумерованных от \(1\) до \(n\). В начале игры Аки выбирает планету, на которой изначально находится Неко. Затем Аки совершает \(k - 1\) ходов, где за один ход Аки перемещает Неко с текущей планеты \(x\) на какую-то планету \(y\), такую что: - Планета \(y\) ещё не посещена.
- \(1 \leq y \leq x + m\) (где \(m\) это фиксированная константа, заданная во входных данных)
Таким образом Неко посетит ровно \(k\) различных планет. Два способа посещений планет называются различными, если существует индекс \(i\), что \(i\)-я планета в первом способе отличается от \(i\)-й планеты во втором способе. Сколько всего существует способов посетить \(k\) планет таким образом? Так как ответ может быть достаточно большим, выведите его по модулю \(10^9 + 7\). Выходные данные Выведите ровно одно целое число — количество способов, которыми Неко может посетить \(k\) планет. Так как это число может быть достаточно большим, выведите его по модулю \(10^9 + 7\). Примечание В первом примере есть \(4\) способа для Неко посетить все планеты: - \(1 \rightarrow 2 \rightarrow 3\)
- \(2 \rightarrow 3 \rightarrow 1\)
- \(3 \rightarrow 1 \rightarrow 2\)
- \(3 \rightarrow 2 \rightarrow 1\)
Во втором примере есть \(9\) способов посетить ровно \(2\) планеты: - \(1 \rightarrow 2\)
- \(2 \rightarrow 1\)
- \(2 \rightarrow 3\)
- \(3 \rightarrow 1\)
- \(3 \rightarrow 2\)
- \(3 \rightarrow 4\)
- \(4 \rightarrow 1\)
- \(4 \rightarrow 2\)
- \(4 \rightarrow 3\)
В третьем примере \(m = 4\) и Неко может посетить все планеты в любом порядке, так что всего есть \(5! = 120\) способов всё посетить. В четвёртом примере Неко должен посетить только \(1\) планету (которая в частности будет начальной планетой маршрута), а значит есть \(100\) способов посетить одну планету.
| |
|
|
E. Волшебные перестановки
битмаски
графы
Конструктив
математика
Перебор
Структуры данных
*2400
Куро только что узнал о перестановках и этого его вдохновило придумать новый вид перестановок. Он выбрал \(n\) различных целых положительных чисел и сделал из них множество \(S\). Теперь он определяет волшебную перестановку следующим образом: - Это перестановка всех целых чисел от \(0\) до \(2^x - 1\), где \(x\) это какое-то неотрицательное целое число.
- Побитовое исключающее или любых двух соседних элементов перестановки лежит в множестве \(S\).
Так как Куро очень восхищённо относится к волшебным перестановкам, то он хочет создать самую длинную возможную волшебную перестановку. Иначе говоря, он хочет найти такое наибольшее неотрицательное целое число \(x\), что существует волшебная перестановка целых чисел от \(0\) до \(2^x - 1\). Поскольку он немного новичок в вопросе перестановок, он хочет чтобы вы ему помогли и нашли это \(x\), а также волшебную перестановку для этого \(x\). Выходные данные В первой строке выведите наибольшее неотрицательное целое число \(x\), такое что существует волшебная перестановка чисел от \(0\) до \(2^x - 1\). Затем выведите \(2^x\) целых чисел задающую волшебную перестановку чисел от \(0\) до \(2^x - 1\). В случае если существует несколько таких волшебных перестановок, выведите любую из них. Примечание В первом примере \(0, 1, 3, 2\) образует волшебную перестановку так как: - \(0 \oplus 1 = 1 \in S\)
- \(1 \oplus 3 = 2 \in S\)
- \(3 \oplus 2 = 1 \in S\)
Где \(\oplus\) обозначает операцию побитового исключающего ИЛИ.
| |
|
|
E. НОКи должны быть большими
битмаски
Конструктив
математика
Перебор
теория чисел
*2100
Даша-путешественница решила использовать все заработанные за несколько лет отчисления на шоппинг. А где же еще лучше магазины, чем в Нлогонии? Всего в Нлогонии \(n\) магазинов, пронумерованных от \(1\) до \(n\). В \(i\)-м из этих магазинов можно купить положительное целое число \(a_i\). В каждый из последних \(m\) дней Даша покупала по одному числу в некоторых магазинах. В каждый из этих дней лисенок Жулик покупал по одному числу во всех магазинах, в которых Даша не купила число в этот день. Дора считает, что Жулик соперничает с ней; она считает, что выиграла у Жулика в день \(i\), если и только если наименьшее общее кратное чисел, которые она купила в \(i\)-й день строго больше наименьшего общего кратного чисел, которые купил в \(i\)-й день Жулик. Наименьшем общем кратном (НОК) набора целых чисел называется наименьшее положительное целое число, делящееся на все числа из набора. К сожалению, Даша забыла, чему равны значения \(a_i\). Помогите Даше определить, существуют ли такие положительные целые числа \(a_i\), что она выигрывала у Жулика каждый день. Сами значения \(a_i\) находить не нужно. Обратите внимание, возможно, что некоторые значения \(a_i\) в решении совпадают. Выходные данные Выведите единственную строку, содержащую "possible", если существуют положительные целые числа \(a_i\) такие, что в каждый день наименьшее общее кратное чисел, купленных Дашей, было строго больше наименьшего общего кратного всех чисел, купленных Жуликом в тот же день. В противном случае выведите "impossible". Обратите внимание, вам не нужно находить сами подходящие числа. Примечание В первом примере возможные числа \(a_i\) равны \(3, 4, 3, 5, 2\). В первый день Даша покупает числа \(3, 4\) и \(3\), НОК которых равен \(12\), а Жулик покупает числа \(5\) и \(2\), НОК которых равен \(10\). Во второй день Дора покупает числа \(3, 5\) и \(2\), НОК которых равен \(30\), а Жулик покупает числа \(3\) и \(4\), НОК которых равен \(12\).
| |
|
|
C. И-достижимость
битмаски
дп
*2200
У жабы Пимпла есть массив целых чисел \(a_1, a_2, \ldots, a_n\). Скажем, что \(y\) достижимо из \(x\), если \(x<y\) и существует такой целочисленный массив \(p\), что \(x = p_1 < p_2 < \ldots < p_k=y\) и \(a_{p_i}\, \&\, a_{p_{i+1}} > 0\) для всех таких целых чисел \(i\), что \(1 \leq i < k\). Здесь \(\&\) обозначает операцию побитовое И. Вам дано \(q\) пар индексов, проверьте достижимость для каждой из них. Выходные данные Выведите \(q\) строк. В \(i\)-й из них выведите «Shi», если \(y_i\) достижимо из \(x_i\). Иначе выведите «Fou». Примечание В первом примере \(a_3 = 0\). Побитовое И с ним всегда будет равно нулю. \(a_2\, \&\, a_4 > 0\), поэтому \(4\) достижима из \(2\), а чтобы дойти от \(1\) до \(4\), вы можете воспользоваться \(p = [1, 2, 4]\).
| |
|
|
D. Ихаб и обычная задача на исключающее ИЛИ
битмаски
Конструктив
*1900
Даны два числа \(n\) и \(x\), найдите массив, который удовлетворяет следующим условиям: - для любого числа \(a_i\) в массиве выполняется \(1 \le a_i<2^n\),
- нет такого непустого подотрезка, на котором побитовое исключающее ИЛИ равно \(0\) или \(x\),
- длина массива \(l\) должна быть максимальна.
Последовательность \(b\) является подотрезком \(a\), если \(b\) может быть получена из \(a\) удалением нескольких (возможно, ни одного или всех) элементов из начала и нескольких (возможно, ни одного или всех) элементов из конца. Выходные данные В первую строку выведите максимальную длину массива \(l\). Если \(l\) положительное, во вторую строку выведите \(l\) целых чисел \(a_1\), \(a_2\), \(\dots\), \(a_l\) (\(1 \le a_i < 2^n\)) — числа массива \(a\). Если существует несколько решений, выведите любое из них. Примечание В первом примере побитовые исключающие ИЛИ на подмассивах равны \(\{6,7,4,1,2,3\}\).
| |
|
|
F. Две пиццы
битмаски
Перебор
*2100
Компания из \(n\) друзей хочет заказать ровно две пиццы. Известно, что всего в природе существует \(9\) ингредиентов для пиццы, которые обозначаются целыми числами от \(1\) до \(9\). У каждого из \(n\) друзей есть один или более любимых ингредиентов: у \(i\)-го из друзей количество любимых ингредиентов равно \(f_i\) (\(1 \le f_i \le 9\)) и любимые ингредиенты составляют последовательность \(b_{i1}, b_{i2}, \dots, b_{if_i}\) (\(1 \le b_{it} \le 9\)). На сайте сети ресторанов CodePizza есть \(m\) (\(m \ge 2\)) предложений различных пицц. Каждая пицца характеризуется набором из \(r_j\) ингредиентов \(a_{j1}, a_{j2}, \dots, a_{jr_j}\) (\(1 \le r_j \le 9\), \(1 \le a_{jt} \le 9\)), которые в неё входят, и своей ценой \(c_j\). Помогите друзьям выбрать ровно две пиццы таким образом, чтобы порадовать максимальное количество людей в компании. Известно, что человек радуется выбору, если каждый из его любимых ингредиентов встречается в составе хотя бы одной заказанной пиццы. Если существует несколько способов выбрать две пиццы так, чтобы порадовать максимальное количество друзей, то выберите тот из них, который минимизирует суммарную цену двух пицц. Выходные данные Выведите два целых числа \(j_1\) и \(j_2\) (\(1 \le j_1,j_2 \le m\), \(j_1 \ne j_2\)) — номера двух пицц в искомом наборе. Если решений несколько, выведите любое из них. Пиццы можно выводить в любом порядке.
| |
|
|
G1. Плейлист для Поликарпа (упрощённая версия)
битмаски
дп
Комбинаторика
*2100
Единственное отличие этой версии от усложнённой — это ограничения. Поликарп очень любит слушать музыку, поэтому он никогда не расстается с плеером, даже по пути из университета домой. Поликарп преодолевает расстояние от университета до дома ровно за \(T\) минут. В плеере у Поликарпа хранится \(n\) песен, причем каждая из них характеризуется двумя параметрами: \(t_i\) и \(g_i\), где \(t_i\) — длительность песни в минутах (\(1 \le t_i \le 15\)), \(g_i\) — её жанр (\(1 \le g_i \le 3\)). Поликарп хочет составить такой плейлист, чтобы всё время в пути от университета до дома, он мог слушать музыку и в момент прибытия домой плейлист кончился. Поликарп никогда не прерывает песни и всегда слушает их от начала и до конца. Таким образом, если он начал слушать \(i\)-ю песню, то на её прослушивание он потратит ровно \(t_i\) минут. Также Поликарп не любит, когда подряд играют две песни одинакового жанра или когда песни в его плейлисте повторяются. Помогите Поликарпу посчитать количество различных последовательностей песен (их порядок имеет значение), суммарной длительностью ровно \(T\), таких, что в них нет двух подряд идущих песен одинакового жанра и все песни в плейлисте различны. Выходные данные Выведите одно целое число — количество различных последовательностей песен, суммарной длительностью ровно \(T\), таких, что в них нет двух подряд идущих песен одинакового жанра и все песни в плейлисте различны. Так как ответ может быть большим, выводите его по модулю \(10^9 + 7\) (то есть остаток при делении количества на число \(10^9 + 7\)). Примечание В первом примере Поликарп может составить любой из \(6\)-ти вариантов плейлист перестановкой имеющихся песен: \([1, 2, 3]\), \([1, 3, 2]\), \([2, 1, 3]\), \([2, 3, 1]\), \([3, 1, 2]\) и \([3, 2, 1]\) (указаны номера песен). Во втором примере первая и вторая песни не могут идти подряд (так как имеют одинаковый жанр). Таким образом, Поликарп может составить плейлист одним из \(2\)-х возможных способов: \([1, 3, 2]\) и \([2, 3, 1]\) (указаны номера песен). В третьем примере Поликарп может составить следующие плейлисты: \([1, 2, 3]\), \([1, 3, 2]\), \([2, 1, 3]\), \([2, 3, 1]\), \([3, 1, 2]\), \([3, 2, 1]\), \([1, 4]\), \([4, 1]\), \([2, 3, 4]\) и \([4, 3, 2]\) (указаны номера песен).
| |
|
|
E. Посчитайте четырехугольники
битмаски
геометрия
Перебор
сортировки
Структуры данных
*2200
На плоскости нарисовано \(n\) отрезков; \(i\)-й отрезок соединяет две точки (\(x_{i, 1}\), \(y_{i, 1}\)) и (\(x_{i, 2}\), \(y_{i, 2}\)). Каждый отрезок невырожден и является либо горизонтальным, либо вертикальным — формально, для любого \(i \in [1, n]\) выполняется ровно одно из двух условий: \(x_{i, 1} = x_{i, 2}\) или \(y_{i, 1} = y_{i, 2}\) . Только отрезки разных типов могут пересекаться, т. е. горизонтальные отрезки не имеют общих точек, то же самое верно и для вертикальных. Четыре отрезка с индексами \(h_1\), \(h_2\), \(v_1\) и \(v_2\), такие, что \(h_1 < h_2\) и \(v_1 < v_2\), образуют прямоугольник при выполнение следующих условий: - отрезки \(h_1\) и \(h_2\) горизонтальные;
- отрезки \(v_1\) и \(v_2\) вертикальные;
- отрезок \(h_1\) пересекается с отрезком \(v_1\);
- отрезок \(h_2\) пересекается с отрезком \(v_1\);
- отрезок \(h_1\) пересекается с отрезком \(v_2\);
- отрезок \(h_2\) пересекается с отрезком \(v_2\).
Подсчитайте количество способов выбрать четыре отрезка так, чтобы они образовывали прямоугольник. Не забывайте, что условия \(h_1 < h_2\) и \(v_1 < v_2\) должны выполняться. Выходные данные Выведите число — количество способов выбрать четыре отрезка так, чтобы они образовывали прямоугольник. Примечание На следующих картинках нарисованы тестовые примеры:
| |
|
|
A. Вам заданы две бинарные строки...
битмаски
жадные алгоритмы
*1100
Вам заданы две бинарные строки \(x\) и \(y\), которые являются двоичными представлениями некоторых чисел (назовем их \(f(x)\) и \(f(y)\)). Вы можете выбрать целое число \(k \ge 0\), посчитать значение \(s_k = f(x) + f(y) \cdot 2^k\) и выписать двоичное представление \(s_k\) в обратном порядке (назовем его \(rev_k\)). Например, пусть \(x = 1010\) и \(y = 11\); вы выбрали \(k = 1\), и так как \(2^1 = 10_2\), то \(s_k = 1010_2 + 11_2 \cdot 10_2 = 10000_2\) и \(rev_k = 00001\). Для заданных \(x\) и \(y\), вам необходимо выбрать такое целое \(k\), что \(rev_k\) — лексикографически минимально (прочтите примечание, если не знаете, что означает «лексикографически»). Гарантируется, что при заданных ограничениях \(k\) существует и конечно. Выходные данные Выведите \(T\) целых чисел (по одному на запрос). Для каждого запроса выведите такое \(k\), что \(rev_k\) — лексикографически минимальное. Примечание Первый запрос разобран в условии. Во втором запросе выгодно выбрать \(k = 3\). \(2^3 = 1000_2\), а потому \(s_3 = 10001_2 + 110_2 \cdot 1000_2 = 10001 + 110000 = 1000001\) и \(rev_3 = 1000001\). Если, например, \(k = 0\), то \(s_0 = 10111\) и \(rev_0 = 11101\), а \(rev_3 = 1000001\) лексикографически меньше, чем \(rev_0 = 11101\). В третьем запросе \(s_0 = 10\) и \(rev_0 = 01\). Например, \(s_2 = 101\) и \(rev_2 = 101\). И \(01\) лексикографически меньше, чем \(101\). Цитата с английской Вики (вольный перевод): «Для того, чтобы определить, какая из двух строк идет первой в лексикографическом порядке, сначала сравнивают их первые буквы. Если они различаются, то первой идет строка, чья первая буква встречается в алфавите раньше. Если первые буквы совпадают, то сравниваются вторые буквы, и так далее. Если была достигнута ситуация, когда в одной строке больше нет букв, а в другой есть, то первая (более короткая) считается меньше.»
| |
|
|
B. Кратчайший цикл
битмаски
графы
кратчайшие пути
Перебор
*1900
Даны \(n\) целых чисел \(a_1, a_2, \dots, a_n\). Рассмотрим граф на \(n\) вершинах, в котором вершины \(i\), \(j\) (\(i\neq j\)) соединены тогда и только тогда, когда \(a_i\) И \(a_j\neq 0\), где И обозначает операцию побитового И. Найдите длину кратчайшего цикла в этом графе, или определите, что в графе нет циклов. Выходные данные Если в графе нет циклов, выведите \(-1\). Иначе выведите длину кратчайшего цикла. Примечание В первом примере, самым коротким циклом будет \((9, 3, 6, 28)\). Во втором примере, самым коротким циклом будет \((5, 12, 9)\). В графе нет циклов в третьем примере.
| |
|
|
E. XOR-угадайка
битмаски
интерактив
математика
*1900
Это интерактивная задача. Не забывайте о том, что ваша программа должна каждый раз после вывода запроса сбрасывать буфер вывода. Для сброса буфера вывода можно использовать fflush(stdout) в C++, system.out.flush() в Java, stdout.flush() в Python или flush(output) в Pascal. Если вы используете другой язык программирования, посмотрите в его документации, как выполняется эта операция. Также рекомендуем вам прочесть руководство по интерактивным задачам: https://cf.m27.workers.dev/blog/entry/45307. Мы загадали целое число \(x\), не меньше \(0\) и не больше \(2^{14} - 1\). Вы должны угадать это число. Для этого вы можете задать не более \(2\) запросов. Каждый запрос должен состоять из \(100\) целых чисел \(a_1\), \(a_2\), ..., \(a_{100}\) (каждое число должно быть не меньше \(0\) и не больше \(2^{14} - 1\)). В ответ на запрос мы выберем целое число \(i\) (\(1 \le i \le 100\)) и сообщим вам значение \(a_i \oplus x\) (побитовое исключающее ИЛИ чисел \(a_i\) и \(x\)). Все \(200\) чисел, которые вы используете в запросах, обязательно должны быть различны. Гарантируется, что значение \(x\) в каждом тесте зафиксировано, но выбор числа \(i\) в каждом запросе может зависеть от того, какие числа вы посылаете. Выходные данные Чтобы дать ответ на задачу, ваша программа должна отправить одну строку \(!\) \(x\) с переводом строки в конце. После этого программа должна сбросить буфер вывода и завершиться. Протокол взаимодействия До того, как ваша программа даст ответ, она может отправить не более \(2\) запросов. Чтобы отправить запрос, выведите строку следующего формата: \(?\) \(a_1\) \(a_2\) ... \(a_{100}\), где каждое \(a_j\) должно быть целым числом из отрезка \([0, 2^{14} - 1]\). Строка, которую вы отправляете, должна заканчиваться символов перевода строки. После отправки запроса программа должна сбросить буфер вывода и прочитать ответ на запрос — значение \(a_i \oplus x\) для некоторого \(i \in [1, 100]\). Никакое число не должно быть использовано в запросах дважды, ни в пределах одного и того же запроса, ни в разных запросах. Если вы зададите некорректный запрос (или же количество запросов превысит \(2\)), ответом будет число \(-1\). Если ваша программа получила такой ответ, она должна немедленно завершиться — иначе вы можете получить вердикт «Ошибка исполнения», «Превышено ограничение времени» или какой-нибудь другой, а не «Неправильный ответ». Примечание Пример взаимодействия не является корректным — вы должны отправить ровно \(100\) целых чисел в каждом запросе. Все остальное корректно. Взломы в этой задаче запрещены.
| |
|
|
F. Биты и выбор
битмаски
дп
жадные алгоритмы
поиск в глубину и подобное
*2600
Вам дан массив \(a\) из \(n\) целых чисел. Вам нужно найти наибольшее возможное значение \(a_{i} | ( a_{j} \& a_{k} )\) по всем таким тройкам \((i,j,k)\), что \(i < j < k\). Здесь \(\&\) обозначает операцию побитового И, а \(|\) обозначает операцию побитового ИЛИ. Выходные данные Выведите одно целое число — максимальное возможное значение выражения, описанного в условии. Примечание В первом примере единственная возможная тройка это \((1, 2, 3)\). Таким образом, ответ равен \(2 | (4 \& 6) = 6\). Во втором примере есть \(4\) возможные тройки: - \((1, 2, 3)\), значение которой \(2|(8\&4) = 2\).
- \((1, 2, 4)\), значение которой \(2|(8\&7) = 2\).
- \((1, 3, 4)\), значение которой \(2|(4\&7) = 6\).
- \((2, 3, 4)\), значение которой \(8|(4\&7) = 12\).
Таким образом максимальное значение равно \(12\).
| |
|
|
E1. Вращая столбцы (упрощенная версия)
битмаски
дп
жадные алгоритмы
Перебор
сортировки
*2000
Это более лёгкая версия следующей задачи, отличающаяся от неё только ограничениями. Вам дана прямоугольная матрица \(a\) размером \(n \times m\). За один ход вы можете выбрать произвольный столбец и циклически сдвинуть все элементы в этом столбце. Вы можете выполнять эту операцию произвольное (ноль или более) количество раз. Вы можете применять эту операцию для одного столбца произвольное количество раз. После того, как вы закончили, вы вычисляете для каждой строки наибольший элемент в ней. Предположим, для \(i\)-й строки он равен \(r_i\). Чему равно наибольшее значение \(r_1+r_2+\ldots+r_n\)? Выходные данные Выведите \(t\) целых чисел: ответы на все наборы входных данных, в порядке, в котором они заданы в тесте. Примечание В первом тестовом наборе можно сдвинуть третий столбец вниз на один, тогда будет \(r_1 = 5\) и \(r_2 = 7\). Во втором тестовом наборе можно ничего не делать, тогда будет \(r_1 = r_2 = 10\) и \(r_3 = 9\).
| |
|
|
E2. Вращая столбцы (усложнённая версия)
битмаски
дп
жадные алгоритмы
сортировки
*2500
Это сложная версия задачи, отличающаяся более высокими ограничениями. Вам дана прямоугольная матрица \(a\) размером \(n \times m\). За один ход вы можете выбрать произвольный столбец и циклически сдвинуть все элементы в этом столбце. Вы можете выполнять эту операцию произвольное (ноль или более) количество раз. Вы можете применять эту операцию для одного столбца произвольное количество раз. После того, как вы закончили, вы вычисляете для каждой строки наибольший элемент в ней. Предположим, для \(i\)-й строки он равен \(r_i\). Чему равно наибольшее значение \(r_1+r_2+\ldots+r_n\)? Выходные данные Выведите \(t\) целых чисел: ответы на все наборы входных данных, в порядке, в котором они заданы в тесте. Примечание В первом тестовом наборе можно сдвинуть третий столбец вниз на один, тогда будет \(r_1 = 5\) и \(r_2 = 7\). Во втором тестовом наборе можно ничего не делать, тогда будет \(r_1 = r_2 = 10\) и \(r_3 = 9\).
| |
|
|
G. Хорошее настроение
битмаски
Структуры данных
*3200
Недавно биологами было сделано удивительное открытие, позволяющее определять в каком настроении находится хамелеон. Для простоты будем считать, что туловище хамелеона имеет вид таблицы размером \(n \times m\), каждая клетка которой может быть зеленой или синей и изменять свой цвет. Будем обозначать за \((x, y)\) (\(1 \leq x \leq n\), \(1 \leq y \leq m\)) клетку, которая находится в строке с номером \(x\) и столбце с номером \(y\). Будем называть признаком хорошего настроения хамелеона такую четверку клеток, являющихся угловыми клетками некоторого прямоугольника внутри таблицы, что цвета клеток в противоположных углах совпадают, но при этом не все четыре клетки одного цвета. Более формально, это четверка клеток \((x_1, y_1)\), \((x_1, y_2)\), \((x_2, y_1)\), \((x_2, y_2)\) для некоторых \(1 \leq x_1 < x_2 \leq n\), \(1 \leq y_1 < y_2 \leq m\), что цвета \((x_1, y_1)\) и \((x_2, y_2)\) совпадают и цвета \((x_1, y_2)\) и \((x_2, y_1)\) совпадают, но при этом не все четыре клетки имеют одинаковый цвет. Было обнаружено, что если такая четверка клеток существует, то у хамелеона хорошее настроение; в противном случае настроение хамелеона плохое. Вас просят помочь учёным написать программу, которая определяет настроение хамелеона. Будем считать, что изначально хамелеон полностью зеленый, то есть все клетки таблицы имеют зеленый цвет. После этого окраска хамелеона может несколько раз измениться. За один раз цвет клеток некоторого отрезка одной строки таблицы может измениться на противоположный. Более формально, каждое изменение окраски хамелеона задается числами \(a\), \(l\), \(r\) (\(1 \leq a \leq n\), \(1 \leq l \leq r \leq m\)). При этом цвет всех клеток \((a, b)\), таких, что \(l \leq b \leq r\), меняется на противоположный. Напишите программу, которая после каждого изменения окраски будет сообщать настроение хамелеона. При этом, если настроение хамелеона хорошее, то программа должна сообщать любые подходящие \(x_1\), \(y_1\), \(x_2\), \(y_2\), такие, что четверка клеток \((x_1, y_1)\), \((x_1, y_2)\), \((x_2, y_1)\), \((x_2, y_2)\) является признаком хорошего настроения. Выходные данные Выведите \(q\) строк. В \(i\) строке выведите описание настроения хамелеона после первых \(i\) изменений окраски для всех \(1 \leq i \leq q\). Если настроение хамелеона плохое, то выведите единственное число \(-1\). Иначе выведите четыре целых числа \(x_1\), \(y_1\), \(x_2\), \(y_2\) (\(1 \leq x_1 < x_2 \leq n\), \(1 \leq y_1 < y_2 \leq m\)), таких что четверка клеток \((x_1, y_1)\), \((x_1, y_2)\), \((x_2, y_1)\), \((x_2, y_2)\) является признаком хорошего настроения хамелеона. Если возможных четвёрок несколько, разрешается вывести любую из них.
| |
|
|
E. Шарики
битмаски
дп
*2200
Монокарп выложил на стол слева направо \(n\) шариков, причем цвет \(i\)-го слева шарика равен \(a_i\). Он любит порядок, поэтому захотел, чтобы все шарики одного цвета образовывали непрерывные отрезки, причем для каждого цвета этот отрезок был ровно один. Иными словами, Монокарп хочет расположить шарики так, что для каждого цвета \(j\), если самый левый шарик цвета \(j\) находится в позиции \(l\), а самый правый — в позиции \(r\), то все шарики между позициями \(l\) и \(r\) должны иметь цвет \(j\). Такое расположение шариков Монокарп называет упорядоченным. Для упорядочивания шариков Монокарп может выполнять следующую операцию: выбрать пару соседних шариков и поменять их местами. Перед вами стоит задача определить минимальное количество операций, которые должен сделать Монокарп, чтобы упорядочить шарики на столе. Обратите внимание, что не важно, в каком именно порядке будут расположены отрезки, состоящие из одноцветных шариков, главное, чтобы все шарики одинакового цвета образовывали непрерывные отрезки, и для каждого цвета такой отрезок был ровно один. Выходные данные Выведите минимальное количество обменов соседних шариков, которые должен сделать Монокарп, чтобы упорядочить шарики на столе. Примечание В первом примере Монокарпу достаточно сделать три обмена. Сначала он может поменять местами третий и четвертый шарики, после этого последовательность шариков станет равна \([3, 4, 3, 2, 4, 2, 2]\). Затем Монокарп может поменять местами второй и третий шарики, после этого последовательность шариков станет равна \([3, 3, 4, 2, 4, 2, 2]\). После этого Монокарпу остается поменять местами четвертый и пятый шарики, после этого последовательность шариков станет равна \([3, 3, 4, 4, 2, 2, 2]\). Во втором примере ничего менять не нужно, так как все шарики уже лежат в удовлетворяющем Монокарпа порядке.
| |
|
|
C. Количество хороших подстрок
Бинарный поиск
битмаски
Перебор
*1700
Вам задана бинарная строка \(s\) (эта строка содержит только цифры \(0\) и \(1\)). Пусть \(f(t)\) — десятичное представление числа \(t\), записанного в двоичном виде (возможно с лидирующими нулями). Например \(f(011) = 3, f(00101) = 5, f(00001) = 1, f(10) = 2, f(000) = 0\) и \(f(000100) = 4\). Подстрока \(s_{l}, s_{l+1}, \dots , s_{r}\) хорошая, если \(r - l + 1 = f(s_l \dots s_r)\). Например, строка \(s = 1011\) имеет \(5\) хороших подстрок: \(s_1 \dots s_1 = 1\), \(s_3 \dots s_3 = 1\), \(s_4 \dots s_4 = 1\), \(s_1 \dots s_2 = 10\) и \(s_2 \dots s_4 = 011\). Вам нужно посчитать количество хороших подстрок строки \(s\). Вам нужно ответить на \(t\) независимых запросов. Выходные данные На каждый запрос выведите одно число — количество хороших подстрок строки \(s\).
| |
|
|
D. Леша и Ульяна
битмаски
математика
теория чисел
*1900
Мальчик Дима подарил Ульяне на день рождения множество \(B\), состоящее из положительных целых чисел. Однако он не учел, что Ульяна терпеть не может множества, а больше всего на свете любит двудольные графы! Ульяна уже была готова расстроиться, но её друг Леша сказал, что может построить неориентированный граф с помощью этого множества следующим образом: рассмотрим все целые числа как вершины графа и соединим ребрами все \(i\) и \(j\) такие, что \(|i - j|\) принадлежит \(B\). К сожалению, граф, построенный по множеству \(B\) не очень нравится Ульяне. Леша решил исправить ситуацию и хочет незаметно выкинуть из \(B\) несколько чисел так, чтобы граф, построенный на новом множестве был двудольным. Сложность этой задачи заключается в том, что граф, с которым придется работать Леше, содержит бесконечное число вершин и ребер! Одному с такой задачей не справиться, поэтому Леша просит Вас о помощи. Напишите программу, которая удаляет из \(B\) минимальное по размеру подмножество чисел так, чтобы граф, построенный на оставшемся множестве стал двудольным. Напомним, что граф называется двудольным, если вершины можно разбить на 2 множества так, что не существует ребер между вершинами из одного множествами. Выходные данные В первой строке выведите целое число \(k\) — количество удаляемых элементов множества, а во второй строке выведите \(k\) чисел через пробел — значения удаляемых элементов в любом порядке. Если возможных ответов несколько, выведите любой
| |
|
|
G. Граф и числа
meet-in-the-middle
битмаски
дп
Комбинаторика
Перебор
*2900
Вам задан неориентированный граф из \(n\) вершин и \(m\) ребер. Вы должны написать число на каждой вершине графа, каждое число должно быть равно \(0\) или \(1\). После этого на каждом ребре будет записана сумма чисел на двух вершинах, инцидентных этому ребру. Вы должны выбрать числа таким образом, чтобы было хотя бы одно ребро с числом \(0\), хотя бы одно ребро с числом \(1\) и хотя бы одно ребро с числом \(2\). Сколько способов так расставить числа? Два способа различны, если существует хотя бы одна вершина, на которой в разных способах записаны разные числа. Выходные данные Выведите одно целое число — количество способов так записать числа на вершинах, что есть хотя бы одно ребро с числом \(0\), хотя бы одно ребро с числом \(1\) и хотя бы одно ребро с числом \(2\).
| |
|
|
C. p-двоичные числа
битмаски
математика
Перебор
*1600
Васе нравятся любые числа, лишь бы они были целыми степенями двойки. Петя, в отличие от Васи, более консервативен, и ему нравится только одно число \(p\) (оно может быть положительным, отрицательным или нулём). Они решили объединить свои вкусы и изобрели \(p\)-двоичные числа вида \(2^x + p\), где \(x\) — неотрицательное целое число. Например, некоторые \(-9\)-двоичные («минус девять» двоичные) числа — это \(-8\) (минус восемь), \(7\) и \(1015\) (\(-8=2^0-9\), \(7=2^4-9\), \(1015=2^{10}-9\)). Теперь ребята используют \(p\)-двоичные числа, чтобы представлять всё вокруг. Они столкнулись с проблемой: для данного положительного целого \(n\), какое наименьшее количество \(p\)-двоичных чисел (не обязательно различных) им понадобится, чтобы представить \(n\) в виде их суммы? Возможно, что представления вообще не существует. Помогите им справиться с этой задачей. Например, при \(p=0\) число \(7\) можно представить как \(2^0 + 2^1 + 2^2\). А при \(p=-9\) число \(7\) можно представить одним числом \((2^4-9)\). Обратите внимание, что отрицательные \(p\)-двоичные числа разрешается использовать в сумме (пример есть в секции Примечание). Выходные данные Если \(n\) нельзя представить как сумму какого угодно количества \(p\)-двоичных чисел, выведите одно число \(-1\). В противном случае, выведите минимальное число слагаемых. Примечание \(0\)-двоичные числа — это обычные степени двойки, поэтому в первом примере мы можем представить \(24 = (2^4 + 0) + (2^3 + 0)\). Во втором примере мы можем представить \(24 = (2^4 + 1) + (2^2 + 1) + (2^0 + 1)\). В третьем примере мы можем представить \(24 = (2^4 - 1) + (2^2 - 1) + (2^2 - 1) + (2^2 - 1)\). Обратите внимание, что одинаковые слагаемые разрешены. В четвёртом примере мы можем представить \(4 = (2^4 - 7) + (2^1 - 7)\). Обратите внимание, что второе слагаемое отрицательное, и это разрешено. В пятом примере ни одного представления не существует.
| |
|
|
G. Получить 1
битмаски
дп
жадные алгоритмы
Конструктив
теория чисел
*3100
На доске написано \(n\) положительных чисел. Также выбрано положительное число \(k \geq 2\), и ни одно из написанных чисел не делится на \(k\). За одну операцию разрешается стереть с доски любые два числа \(x\) и \(y\) и записать вместо них \(f(x + y)\), где \(f(x)\) равно \(x\), если \(x\) не делится на \(k\), и \(f(x) = f(x / k)\) в противном случае. В конце на доске останется одно число. Возможно ли сделать это число равным \(1\)? Если это так, восстановите любую последовательность операций, которая к этому приводит. Выходные данные Если получить \(1\) в качестве последнего числа невозможно, выведите единственную строку «NO». В противном случае, в первой строке выведите «YES», а затем выведите \(n - 1\) строку с описанием операций. \(i\)-я из этих строк должна содержать два целых числа \(x_i\) и \(y_i\), которые необходимо заменить на \(f(x_i + y_i)\) на \(i\)-й операции. Если существует несколько подходящих последовательностей, выведите любую из них. Примечание Во втором примере: - \(f(8 + 7) = f(15) = f(5) = 5\);
- \(f(23 + 13) = f(36) = f(12) = f(4) = 4\);
- \(f(5 + 4) = f(9) = f(3) = f(1) = 1\).
| |
|
|
F. Очередной разворот подстроки
битмаски
дп
*2200
Вам задана строка \(s\), состоящая только из первых \(20\) строчных букв латинского алфавита ('a', 'b', ..., 't'). Напомним, что подстрокой \(s[l; r]\) строки \(s\) называется строка \(s_l s_{l + 1} \dots s_r\). Например, подстроками «codeforces» являются «code», «force», «f», «for», но не строки «coder» и «top». Вы можете произвести следующую операцию не более одного раза: выбрать какую-то подстроку \(s[l; r]\) и развернуть ее (то есть строка \(s_l s_{l + 1} \dots s_r\) превращается в \(s_r s_{r - 1} \dots s_l\)). Ваша задача — максимизировать длину максимальной подстроки \(s\), состоящей из различных (то есть уникальных) символов. Строка состоит из различных символов, если ни один символ этой строки не встречается более одного раза. Например, строки «abcde», «arctg» и «minecraft» состоят из различных символов, а строки «codeforces», «abacaba» не состоят из различных символов. Выходные данные Выведите одно целое число — максимально возможную длину максимальной подстроки \(s\), состоящей из различных символов, после переворота не более чем одной ее подстроки.
| |
|
|
E. Покупка клавиатуры
битмаски
дп
*2200
У вас есть пароль, который вы часто набираете — строка \(s\) длины \(n\), состоящая из первых \(m\) букв латинского алфавита. Из-за того, что вы много времени тратите на набор этого пароля, вы хотите купить новую клавиатуру. Клавиатура — это перестановка первых \(m\) букв латинского алфавита. Например, если \(m = 3\), то существует всего шесть различных клавиатур: abc, acb, bac, bca, cab и cba. Так как вы набираете пароль одним пальцем, вам нужно тратить время на перемещение этого пальца от одного символа пароля к другому. Время перемещения пальца от символа \(s_i\) к символу \(s_{i+1}\) равно дистанции между этими символами на клавиатуре. Суммарное потраченное время на набор пароля называется медлительностью. Формально, медлительность клавиатуры равна \(\sum\limits_{i=2}^{n} |pos_{s_{i-1}} - pos_{s_i} |\), где \(pos_x\) — позиция символа \(x\) на клавиатуре. Например, если \(s\) = aacabc, а клавиатура равна bac, то медлительность клавиатуры равна \(|pos_a - pos_a| + |pos_a - pos_c| + |pos_c - pos_a| + |pos_a - pos_b| + |pos_b - pos_c|\) = \(|2 - 2| + |2 - 3| + |3 - 2| + |2 - 1| + |1 - 3|\) = \(0 + 1 + 1 + 1 + 2 = 5\). До того как купить клавиатуру, вы хотите знать ее минимально возможную медлительность. Выходные данные Выведите одно число — минимально возможную медлительность клавиатуры. Примечание Первый тестовый пример разобран в условии. Во втором тестовом примере медлительность любой клавиатуры равна \(0\). В третьем тестовом одна из подходящих клавиатур — bacd.
| |
|
|
C. Баланс сумм
битмаски
графы
дп
поиск в глубину и подобное
*2400
У Уджана в коробках накопилось много чисел. Ему нравится баланс и порядок, поэтому он решил перераспределить числа. Всего есть \(k\) коробок, пронумерованных числами от \(1\) до \(k\). \(i\)-я коробка содержит \(n_i\) целых чисел. Числа могут быть и отрицательными. Все данные числа различны. Уджан ленивый, поэтому он выполнит следующее перераспределение ровно один раз. Вначале он выберет по одному числу из каждой коробки, всего \(k\) чисел. Затем он поместит выбранные числа по одному числу в каждую из коробок, так, что количество чисел в каждой коробке такое же, как и в начале. Учтите, что он может поместить число, которое он выбрал из одной коробки обратно в ту же коробку. Уджан будет рад, если сумма чисел во всех коробках станет одинаковая. Может ли он достичь этого, и сбалансировать таким образом все коробки, как все вещи и должны быть? Выходные данные Если Уджан не может достичь своей цели, выведите «No». В противоположном случае выведите сначала «Yes», и затем выведите \(k\) строк. \(i\)-я из этих строк должна содержать два целых числа \(c_i\) и \(p_i\). Эти числа должны означать то, что Уджан выберет число \(c_i\) из \(i\)-й коробки и поместит его в \(p_i\)-ю коробку. Если существует больше одного решения, выведите любое. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Примечание В первом примере Уджан может поместить число \(7\) во \(2\)-ю коробку, число \(2\) в \(3\)-ю коробку, число \(5\) в \(1\)-ю коробку, а число \(10\) оставить в той же \(4\)-й коробке. Тогда коробки будут содержать числа \(\{1,5,4\}\), \(\{3, 7\}\), \(\{8,2\}\) и \(\{10\}\). Сумма чисел в каждой коробке станет равна \(10\). Во втором примере невозможно выбрать и перераспределить числа данным способом. В третьем примере можно поменять местами числа \(-20\) и \(-10\), тогда сумма чисел в обеих коробках станет равна \(-10\).
| |
|
|
F. Даниэль и весенняя уборка
битмаски
дп
Комбинаторика
Перебор
*2300
В ходе проведения очередной весенней уборки, Даниэль нашел старый калькулятор, который ему очень понравился. Однако кажется, что что-то в нем сломано. Когда он хочет посчитать \(1 + 3\) c помощью калькулятора, он получает \(2\) вместо \(4\). Но при вычислении \(1 + 4\) ответ получается правильный, \(5\). Озадаченный таким поведением, он вскрыл калькулятор и нашел разгадку: полные сумматоры стали полусумматорами! Теперь, когда он хочет посчитать \(a + b\) при помощи калькулатора, он получает ксор-сумму \(a \oplus b\) (определение можно прочитать по ссылке: https://ru.wikipedia.org/wiki/Сложение_по_модулю_2). Но как он уже заметил ранее, калькулятор иногда выдает правильные ответы. Поэтому его интересует, при данных \(l\) и \(r\) сколько существует таких пар целых чисел \((a, b)\), для которых выполняются следующие условия: \(\)a + b = a \oplus b\(\) \(\)l \leq a \leq r\(\) \(\)l \leq b \leq r\(\) Даниэль Бармен, однако, сейчас направляется в бар, а вернется только через пару часов. Он советует вам решить эту задачу до его возвращения, или же вы будете забанены. Выходные данные Выведите \(t\) целых чисел, \(i\)-е число должно быть ответом на \(i\)-й набор входных данных. Примечание \(a \oplus b\) обозначает побитовое исключающее ИЛИ \(a\) и \(b\). В первом примере подходящие пары: \((1, 2)\), \((1, 4)\), \((2, 1)\), \((2, 4)\), \((3, 4)\), \((4, 1)\), \((4, 2)\), и \((4, 3)\).
| |
|
|
F. Сделай их похожими
meet-in-the-middle
битмаски
Перебор
хэши
*2400
Назовем два числа похожими, если в их двоичных представлениях одинаковое количество цифр равно \(1\). Например: - \(2\) и \(4\) похожи (двоичные представления — \(10\) и \(100\));
- \(1337\) и \(4213\) похожи (двоичные представления — \(10100111001\) и \(1000001110101\));
- \(3\) и \(2\) не похожи (двоичные представления — \(11\) и \(10\));
- \(42\) и \(13\) похожи (двоичные представления — \(101010\) и \(1101\)).
Вам задан массив из \(n\) целых чисел \(a_1\), \(a_2\), ..., \(a_n\). Вы должны выбрать неотрицательное целое число \(x\), после чего вы получите новый массив из \(n\) чисел \(b_1\), \(b_2\), ..., \(b_n\), где \(b_i = a_i \oplus x\) (\(\oplus\) обозначает операцию побитового исключающего ИЛИ). Можно ли получить такой массив \(b\), в котором все числа похожи друг на друга? Выходные данные Если нельзя выбрать такой \(x\), что все элементы в полученном массиве будут похожи друг на друга, выведите \(-1\). Иначе выведите любое неотрицательное целое число, не превосходящее \(2^{30} - 1\), которое можно использовать как \(x\) таким образом, что все числа в полученном массиве будут похожи друг на друга.
| |
|
|
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\).
| |
|
|
C. Сделай хорошим
битмаски
Конструктив
математика
*1400
Будем называть массив \(a_1, a_2, \dots, a_m\) неотрицательных целых чисел хорошим, если \(a_1 + a_2 + \dots + a_m = 2\cdot(a_1 \oplus a_2 \oplus \dots \oplus a_m)\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ. К примеру, массив \([1, 2, 3, 6]\) является хорошим, так как \(1 + 2 + 3 + 6 = 12 = 2\cdot 6 = 2\cdot (1\oplus 2 \oplus 3 \oplus 6)\). В то же время, массив \([1, 2, 1, 3]\) хорошим не является, так как \(1 + 2 + 1 + 3 = 7 \neq 2\cdot 1 = 2\cdot(1\oplus 2 \oplus 1 \oplus 3)\). Вам дан массив длины \(n\): \(a_1, a_2, \dots, a_n\). Добавьте к нему не более \(3\) элементов, чтобы он стал хорошим. Добавленные элементы не обязаны быть различными. Можно показать, что при данных ограничениях решение всегда существует. Если существует несколько возможных решений, выведите любое из них. Обратите внимание, что минимизировать количество добавленных элементов не требуется!. В частности если массив изначально уже хороший, то вы можете не добавлять элементов. Выходные данные Для каждого тестового случая выведите две строки. В первой строке, выведите единственное целое число \(s\) (\(0\le s\le 3\)) — количество элементов, которые вы хотите добавить. Во второй строке, выведите \(s\) целых чисел \(b_1, \dots, b_s\) (\(0\le b_i \le 10^{18}\)) — элементы, которые вы хотите добавить. Если существует несколько возможных решений, вы можете вывести любое из них. Примечание В первом тестовом случае из примера, сумма элементов массива равна \(12\), а их \(\oplus\) равен \(6\), поэтому условие уже выполнено. Во втором тестовом случае из примера, после добавления \(4, 4\), массив принимает вид \([8, 4, 4]\). Сумма элементов в нем равна \(16\), а их \(\oplus\) равен \(8\).
| |
|
|
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\).
| |
|
|
D. Задача Минимакс
Бинарный поиск
битмаски
дп
*2000
Вам заданы \(n\) массивов \(a_1\), \(a_2\), ..., \(a_n\); каждый массив состоит ровно из \(m\) целых чисел. Будем обозначать \(y\)-й элемент \(x\)-го массива как \(a_{x, y}\). Вы должны выбрать два массива \(a_i\) и \(a_j\) (\(1 \le i, j \le n\), допустима ситуация \(i = j\)). Из данных массивов строится новый массив \(b\) длины \(m\), такой что для каждого \(k \in [1, m]\) \(b_k = \max(a_{i, k}, a_{j, k})\). Ваша задача — выбрать \(i\) и \(j\) так, чтобы значение \(\min \limits_{k = 1}^{m} b_k\) было максимально возможным. Выходные данные Выведите два числа \(i\) и \(j\) (\(1 \le i, j \le n\), допустима ситуация \(i = j\)) — индексы выбранных массивов, таких что значение \(\min \limits_{k = 1}^{m} b_k\) — максимально возможное. Если существует несколько ответов — выведите любой из них.
| |
|
|
F. Игрушки Норы
битмаски
дп
Комбинаторика
*3500
Давным давно, семилетняя Нора любила играть в игрушки вместе со своим созданием ROBO_Head-02, не только для того чтобы развлечься, но и чтобы улучшить его способности. Однажды, приёмный отец Норы, Феникс Уайл, принёс Норе \(n\) коробок с игрушками. Перед тем как их распаковать, Нора решила устроить для ROBO небольшую игру. Она пронумеровала все \(n\) коробок используя \(n\) различных целых чисел \(a_1, a_2, \ldots, a_n\) и попросила ROBO выполнить ноль или более операций следующего вида: - Выбрать три различных индекса \(i\), \(j\) и \(k\), таких что \(a_i \mid a_j\) и \(a_i \mid a_k\). Иными словами, \(a_i\) делит и \(a_j\), и \(a_k\). Иначе говоря, \(a_j \bmod a_i = 0\), \(a_k \bmod a_i = 0\).
- Затем, Нора передаст \(k\)-ю коробку ROBO, а тот положит её наверх стопки с коробками рядом с ним. Изначально эта стопка пуста.
- После этого коробка \(k\) становится недоступной для любых дальнейших действий.
После девяти игр, это процесс весьма позабавил Нору. Она попросила ROBO посчитать количество возможных стопок с коробками, имеющие максимально возможный размер, которые могут получиться. Две стопки считаются различными, если существует хотя бы одна позиция, в которой они отличаются. Так как ROBO пока на очень ранней стадии развития, да и Нора достаточно молода, чтобы концентрироваться надолго, они оба заснули, не найдя ответа. Не могли бы вы им помочь? Так как количество таких стопок может быть достаточно большим, выведите его по модулю \(10^9 + 7\). Выходные данные Выведите количество различных максимальных по размеру стопок, которые могли получится у ROBO, по модулю \(10^9 + 7\). Примечание Обозначим содержимое стопки как последовательность \(b\), где самая нижняя коробка стопки находится на самой левой позиции. В первом примере возможно \(2\) различных стопки: - \(b = [6]\) (\([2, \mathbf{6}, 8] \xrightarrow{(1, 3, 2)} [2, 8]\))
- \(b = [8]\) (\([2, 6, \mathbf{8}] \xrightarrow{(1, 2, 3)} [2, 6]\))
Во втором примере возможно \(4\) различных стопки: - \(b = [9, 12]\) (\([2, 3, 4, \mathbf{9}, 12] \xrightarrow{(2, 5, 4)} [2, 3, 4, \mathbf{12}] \xrightarrow{(1, 3, 4)} [2, 3, 4]\))
- \(b = [4, 12]\) (\([2, 3, \mathbf{4}, 9, 12] \xrightarrow{(1, 5, 3)} [2, 3, 9, \mathbf{12}] \xrightarrow{(2, 3, 4)} [2, 3, 9]\))
- \(b = [4, 9]\) (\([2, 3, \mathbf{4}, 9, 12] \xrightarrow{(1, 5, 3)} [2, 3, \mathbf{9}, 12] \xrightarrow{(2, 4, 3)} [2, 3, 12]\))
- \(b = [9, 4]\) (\([2, 3, 4, \mathbf{9}, 12] \xrightarrow{(2, 5, 4)} [2, 3, \mathbf{4}, 12] \xrightarrow{(1, 4, 3)} [2, 3, 12]\))
В третьем примере ROBO не сможет сделать ничего. Поэтому возможна только \(1\) стопка, и это пустая стопка.
| |
|
|
D. Вокруг света
битмаски
графы
графы
Деревья
дп
Комбинаторика
математика
поиск в глубину и подобное
*3000
Ги-Мануэль и Тома планируют \(144\) кругосветных путешествия. Вам дан простой взвешенный неориентированный связный граф из \(n\) вершин и \(m\) рёбер со следующим ограничением: не существует простого цикла (т. е. цикла, проходящего через каждую вершину не больше раза) длины больше \(3\), проходящего через вершину \(1\). Стоимостью пути (необязательно простого) в этом графе является XOR весов всех рёбер, входящих в этот путь, причём каждое ребро считается столько, сколько раз через него проходит путь. Однако, путешествия стоимостью \(0\) их не устраивают. Вы можете выбрать любое подмножество рёбер, инцидентных вершине \(1\), и удалить их. Сколько существует таких множеств, что при их удалении в полученном графе нет нетривиального цикла (необязательно простого) стоимостью \(0\), проходящего через вершину \(1\)? Цикл называется нетривиальным, если существует ребро, через которое он проходит нечётное количество раз. Так как ответ может быть большим, выведите его по модулю \(10^9+7\). Выходные данные В единственной строке выведите ответ по модулю \(10^9+7\). Примечание На рисунках представлены графы из примеров. В первом примере в графе нет нетривиальных циклов со стоимостью \(0\), так что мы можем как удалить единственное ребро, инцидентное вершине \(1\), так и не удалять. Во втором примере если мы не удаляем ребро \(1-2\), то в графе будет цикл \(1-2-4-5-2-1\) со стоимостью \(0\); аналогично, если мы не удаляем ребро \(1-3\), то в графе будет цикл \(1-3-2-4-5-2-3-1\) со стоимостью \(0\). Единственный вариант — удалить оба ребра. В третьем примере подходят все подмножества, кроме тех двух, при которых остаются оба ребра \(1-3\) и \(1-4\).
| |
|
|
F. Keep talking and nobody explodes – easy
битмаски
Перебор
Разбор выражений
This is an unusual problem in an unusual contest, here is the announcement: http://cf.m27.workers.dev/blog/entry/73543 You have the safe lock which consists of 5 decimal digits. If you rotate some digit, it increases by one, except 9 which becomes 0. Initially, the lock contains number \(x\). To unlock the safe you must do the following operations in order (and be careful, don't mix up if and else statements). If sum of digits on positions 1 and 4 is greater than 10, rotate digit on position 1 by 3 times, else rotate digit on position 4 by 8 times. If sum of digits on positions 3 and 2 is greater than 8, rotate digit on position 4 by 9 times, else rotate digit on position 5 by 8 times. If digit on position 3 is odd, rotate digit on position 3 by 3 times, else rotate digit on position 3 by 4 times. If digit on position 5 is greater than digit on position 2, rotate digit on position 4 by 1 times, else rotate digit on position 2 by 7 times. If digit on position 1 is odd, rotate digit on position 1 by 3 times, else rotate digit on position 3 by 5 times. If digit on position 4 is odd, rotate digit on position 4 by 7 times, else rotate digit on position 1 by 9 times. If digit on position 4 is greater than digit on position 1, rotate digit on position 4 by 9 times, else rotate digit on position 4 by 2 times. If digit on position 1 is greater than digit on position 3, rotate digit on position 2 by 1 times, else rotate digit on position 3 by 1 times. If digit on position 5 is greater than digit on position 3, rotate digit on position 4 by 5 times, else rotate digit on position 5 by 8 times. If sum of digits on positions 1 and 3 is greater than 8, rotate digit on position 4 by 5 times, else rotate digit on position 2 by 5 times. If digit on position 1 is greater than digit on position 4, rotate digit on position 4 by 3 times, else rotate digit on position 2 by 3 times. If sum of digits on positions 3 and 1 is greater than 9, rotate digit on position 2 by 9 times, else rotate digit on position 2 by 2 times. If sum of digits on positions 4 and 3 is greater than 10, rotate digit on position 4 by 7 times, else rotate digit on position 5 by 7 times. If digit on position 3 is greater than digit on position 2, rotate digit on position 3 by 2 times, else rotate digit on position 4 by 6 times. If digit on position 1 is greater than digit on position 3, rotate digit on position 1 by 9 times, else rotate digit on position 2 by 9 times. If digit on position 3 is odd, rotate digit on position 3 by 9 times, else rotate digit on position 1 by 5 times. If sum of digits on positions 3 and 5 is greater than 9, rotate digit on position 3 by 4 times, else rotate digit on position 3 by 9 times. If digit on position 3 is greater than digit on position 1, rotate digit on position 5 by 1 times, else rotate digit on position 5 by 7 times. If digit on position 1 is greater than digit on position 3, rotate digit on position 2 by 9 times, else rotate digit on position 4 by 6 times. If sum of digits on positions 2 and 3 is greater than 10, rotate digit on position 2 by 2 times, else rotate digit on position 3 by 6 times. Output Output the number after applying all operations.
| |
|
|
D. Заполни сумку
битмаски
жадные алгоритмы
*1900
У вас есть сумка размера \(n\). Так же у вас есть \(m\) коробок. Размер \(i\)-й коробки \(a_i\), где \(a_i\) — целая неотрицательная степень двойки. Вы можете делить коробки на две части одинакового размера. Ваша задача — полностью заполнить сумку. Например, если \(n = 10\) и \(a = [1, 1, 32]\), то вам нужно разделить коробку размера \(32\) на две части размера \(16\), а затем разделить коробку размера \(16\). Таким образом, вы сможете заполнить сумку коробками размеров \(1\), \(1\) и \(8\). Посчитайте минимальное количество делений, которое придется сделать для заполнения сумки размера \(n\). Выходные данные На каждый набор входных данных выведите число — минимальное количество делений, которые придется сделать для заполнения сумки размера \(n\) (или \(-1\), если заполнить сумку невозможно).
| |
|
|
G. Курони и Антихайп
битмаски
графы
дп
Перебор
снм
*3500
Курони плохо разбирается в экономике. Поэтому он решил основать новую финансовую пирамиду под названием Антихайп. У него есть следующие правила: - Вы можете присоединиться к пирамиде бесплатно и получить \(0\) монет.
- Если вы уже являетесь участником Антихайпа, вы можете пригласить своего друга, который в настоящее время не является участником Антихайпа, и получить количество монет, равное вашему возрасту (за каждого приглашенного друга).
\(n\) людей недавно услышали об Антихайпе, возраст \(i\)-го человека - \(a_i\). Некоторые из них являются друзьями, но дружба сегодня — странная вещь: \(i\)-й человек является другом \(j\)-го человека тогда и только тогда, когда \(a_i \text{ AND } a_j = 0\), где \(\text{AND}\) обозначает операцию побитового И. На данный момент никто из \(n\) людей не является членом Антихайпа. Они хотят сотрудничать, чтобы присоединяться и приглашать друг друга в Антихайп таким образом, чтобы максимизировать их суммарную прибыль. Не могли бы вы помочь им? Выходные данные Выведите одно целое число — максимальную возможную суммарную прибыль всех \(n\) людей. Примечание Только первый и второй человек дружат. Второй может присоединиться к Антихайпу и пригласить первого, получив за это \(2\) монеты.
| |
|
|
C. Прибавление степеней
битмаски
жадные алгоритмы
математика
реализация
теория чисел
Тернарный поиск
*1400
Представим следующий алгоритм. Есть массив \(v_1, v_2, \dots, v_n\), изначально заполненный нулями. Несколько раз с массивом проделываются похожие операции — на \(i\)-м шаге (в \(0\)-индексации) вы можете: - либо выбрать любую позицию \(pos\) (\(1 \le pos \le n\)) и увеличить \(v_{pos}\) на \(k^i\);
- либо не выбирать позицию и пропустить шаг.
Вы можете выбирать, как алгоритм ведет себя на каждом шаге и когда он будет остановлен. Вопрос в следующем: можно ли сделать массив \(v\) равным некоторому массиву \(a\) (\(v_j = a_j\) для каждого \(j\)) после некоторого шага? Выходные данные Для каждого набора тестовых данных выведите либо YES (регистр не важен), если можно получить массив \(a\) после некоторого шага, либо NO (регистр не важен), если это невозможно. Примечание В первом наборе тестовых данных можно остановить алгоритм до \(0\)-го шага, или не выбирать никакую позицию и остановить алгоритм позже. Во втором наборе можно прибавить \(k^0\) к \(v_1\) и остановить алгоритм. В третьем наборе невозможно получить два элемента, равных \(1\), в массиве \(v\). В пятом наборе можно пропустить \(9^0\) и \(9^1\), прибавить \(9^2\) и \(9^3\) к \(v_3\), пропустить \(9^4\) и, наконец, прибавить \(9^5\) к \(v_2\).
| |
|
|
D. Новый год
битмаски
дп
реализация
*2500
Быть дедом Морозом очень сложно. Порой приходится сталкиваться с непростыми ситуациями. Сегодня дед Мороз пришел на праздник и перед ним выстроились \(m\) детей. Пронумеруем их от \(1\) до \(m\). Дед Мороз знает \(n\) заклинаний. Заклинание под номером \(i\) даёт по конфете каждому ребенку, чье место лежит в отрезке \([L_i, R_i]\). Каждое заклинание может быть использовано не более одного раза. Также известно, что если применить все заклинания, то каждый ребёнок получит не более \(k\) конфет. Детям вредно есть много сладкого, поэтому каждый ребёнок может съесть не более одной конфеты, а остальное отдаст маме и папе в равном количестве. Получается, если конфет малышу не подарить или подарить ему чётное число конфет, то он не съест ни одной конфеты и уйдет печальным. Остальные же дети (которые получили нечётное число конфет) будут счастливыми. Помогите деду Морозу узнать максимальное число детей, которых он может сделать счастливыми, произнеся некоторые из своих заклинаний. Выходные данные Выведите одно число — максимальное число детей, которых дед Мороз может сделать счастливыми. Примечание В первом примере деду Морозу следует применить первое и третье заклинание. В таком случае счастливыми окажутся все дети кроме третьего.
| |
|
|
E. Выбор команды
битмаски
дп
жадные алгоритмы
сортировки
*2300
Алиса, президент клуба FCB, хочет создать команду для участия в новом волейбольном турнире. Команда должна состоять из \(p\) игроков, играющих на \(p\) различных позициях. Она также понимает важность зрительской поддержки, поэтому она также хочет выбрать \(k\) болельщиков. В Байтляндии живет \(n\) человек. Алиса должна выбрать ровно \(p\) из них, каждый на отдельную позицию, и ровно \(k\) болельщиков из этих \(n\) человек. Она хочет максимизировать суммарную силу команды. У \(i\)-го из \(n\) человек есть целое число \(a_{i}\) — сила, которую он добавляет команде, если его выбирают как болельщика. Для каждого человека \(i\) и каждой позиции \(j\), Алиса знает \(s_{i, j}\) — силу, которую добавляет \(i\)-й человек команде, если он выбран как игрок на \(j\)-ю позицию. Каждый человек может быть выбран не более одного раза как игрок или болельщик. На каждую позицию нужно выбрать ровно одного человека. Так как Алиса занята, вы должны помочь ей выбрать игроков и болельщиков так, чтобы общая сила команды стала максимальной. Выходные данные Выведите единственное число \({res}\) — максимальную возможную силу команды. Примечание В первом примере, можно выбрать человека \(1\) игроком на \(1\)-ю позицию, а людей \(2\) и \(3\) болельщиками. Тогда общая сила команды будет равняться \(a_{2}+a_{3}+s_{1,1}\).
| |
|
|
B. Подарок
Бинарный поиск
битмаски
Конструктив
математика
сортировки
Структуры данных
*2100
На восьмое марта Катерине подарили массив чисел. Со временем ей стало скучно просто смотреть на него, и она решила посчитать некоторые его бесполезные характеристики. Со всеми, что она придумывала, ей это удавалось. Придумав очередную — xor попарных сумм чисел в массиве, она поняла, что не может придумать, как посчитать её для большого массива, и попросила вас помочь. А вы сможете? Более формально, вам нужно посчитать \(\) (a_1 + a_2) \oplus (a_1 + a_3) \oplus \ldots \oplus (a_1 + a_n) \\ \oplus (a_2 + a_3) \oplus \ldots \oplus (a_2 + a_n) \\ \ldots \\ \oplus (a_{n-1} + a_n) \\ \(\) Запись \(x \oplus y\) обозначает битовый XOR чисел (т.е. \(x\) ^ \(y\) для многих современных языков программирования). Об этой операции вы можете прочитать по ссылке в Wikipedia: https://tiny.cc/34xykz. Выходные данные Выведите одно число — xor попарных сумм чисел в данном массиве. Примечание В первом примере есть всего одна сумма: \(1 + 2 = 3\). Во втором примере есть три суммы: \(1 + 2 = 3\), \(1 + 3 = 4\), \(2 + 3 = 5\). В двоичной системе счисления это \(011_2 \oplus 100_2 \oplus 101_2 = 010_2\), то есть 2. \(\oplus\) означает операцию побитового xor. Чтобы определить \(x \oplus y\) рассмотрим двоичную запись чисел \(x\) и \(y\). Скажем, что \(i\)-й бит результата равен 1, если ровно один из \(i\)-х битов \(x\) и \(y\) равен 1. В противном случае \(i\)-й бит результата равен 0. Например, \(0101_2 \, \oplus \, 0011_2 = 0110_2\).
| |
|
|
D. Реалити-шоу
битмаски
дп
*2800
Одно известное реалити-шоу набирает участников для третьего сезона! Собеседование прошли \(n\) кандидатов, пронумерованных от \(1\) до \(n\). \(i\)-й кандидат обладает агрессивностью \(l_i\), и для того, чтобы взять этого кандидата, организаторам шоу придется потратить \(s_i\) рублей. Ведущая реалити-шоу листает досье всех кандидатов от \(i=1\) до \(i=n\) в порядке возрастания номеров, и для каждого из них она принимает решение, стоит ли взять этого кандидата в шоу. Если агрессивность кандидата \(i\) строго выше, чем агрессивность какого-либо из уже взятых кандидатов, то кандидата \(i\) она точно брать откажется. В противном случае ведущая может на свой выбор как взять кандидата в шоу, так и не взять. Ведущая хочет выбрать участников таким образом, чтобы максимизировать прибыль. Рассматриваемое реалити-шоу получает доход следующим образом. Для каждого значения агрессивности \(v\) указана доходность \(c_v\), которая может быть как положительной, так и отрицательной. Участники, попавшие в проект, поочередно выходят на сцену в порядке возрастания номеров. Как только участник с номером \(i\) выходит на сцену, происходит следующее: - Шоу зарабатывает \(c_{l_i}\) рублей, где \(l_i\) — изначальная агрессивность участника \(i\).
- Если оказывается, что на сцене находятся два участника с одинаковым значением агрессивности, то они немедленно начинают драку. В результате драке происходит следующее:
- проигравшего участника увозит скорая помощь, и он выбывает из проекта,
- агрессивность выигравшего участника возрастает на один, а шоу зарабатывает \(c_t\) рублей, где \(t\) — новое значение агрессивности.
- Драки на сцене продолжаются до тех пор, пока на сцене не останутся участники с различными значениями агрессивности.
Ведущая шоу хочет выбрать команду таким образом, чтобы максимизировать прибыль, которая определяется как суммарный доход от происходящего на сцене, минус суммарные затраты на приглашение участников (которые определяются как сумма \(s_i\) для выбранных участников). Помогите ведущей сделать шоу максимально прибыльным! Выходные данные Выведите одно целое число — максимальную прибыль шоу. Примечание В первом примере выгоднее всего взять кандидатов с номерами \(1, 2, 3, 5\). В таком случае шоу заплатит им за участие \(1 + 2 + 1 + 1 = 5\) рублей. На сцене же будет происходить следующее: - на сцене появится участник со значением агрессивности \(4\), шоу заработает \(4\) рубля;
- на сцене появится участник со значением агрессивности \(3\), шоу заработает \(3\) рубля;
- на сцене появится участник со значением агрессивности \(1\), шоу заработает \(1\) рубль;
- на сцене появится еще один участник со значением агрессивности \(1\), шоу заработает еще \(1\) рубль, начнется драка. Один из участников проиграет и покинет проект, а второй повысит свое значение агрессивности до \(2\). Шоу заработает на этом еще \(2\) рубля.
Таким образом, доход шоу составит \(4 + 3 + 1 + 1 + 2=11\) рублей, а суммарная прибыль будет равна \(11 - 5 = 6\) рублям. Во втором примере мы не можем пригласить обоих кандидатов, так как значение агрессивности второго кандидата больше, поэтому нам выгоднее взять кандидата с номером \(1\).
| |
|
|
D. Ехаб, XORминатор
битмаски
жадные алгоритмы
Конструктив
теория чисел
*1700
Для данных 2 чисел \(u\) и \(v\), найдите самые короткий массив такой, что побитовое исключающее ИЛИ его элементов равно \(u\), а сумма его элементов равна \(v\). Выходные данные Если нет массива, удовлетворяющего условию, выведите "-1 ". В противном случае: Первая строка должна содержать одно целое число, \(n\), равное длине нужного массива. Следующая строка должна содержать \(n\) положительных целых чисел, сам массив. Если есть несколько возможных ответов, выведите любой. Примечание В первом примере, \(3\oplus 1 = 2\) and \(3 + 1 = 4\). Заметьте, что подходящего массива меньшей длины не существует. Обратите внимание, что в четвертом примере массив пуст.
| |
|
|
F1. Мудрецы (упрощенная версия)
meet-in-the-middle
битмаски
дп
Перебор
*2600
Это упрощенная версия задачи. Две версии отличаются ограничением на число мудрецов и ограничением по времени. Вы можете взламывать по этой задаче только если обе версии решены. \(n\) мудрецов живут в красивом городе. Некоторые из них знают друг друга. Для всех возможных \(n!\) перестановок \(p_1, p_2, \ldots, p_n\) мудрецов, построим бинарную строку длины \(n-1\): для всех \(1 \leq i < n\) положим \(s_i=1\) если мудрецы \(p_i\) и \(p_{i+1}\) знают друг друга, и \(s_i=0\) иначе. Для всех \(2^{n-1}\) возможных бинарных строк, найдите число перестановок, при которых получается такая бинарная строка. Выходные данные Выведите \(2^{n-1}\) целых чисел, разделенных пробелами. Для каждого \(0 \leq x < 2^{n-1}\): - Рассмотрим такую строку \(s\) длины \(n-1\), что \(s_i = \lfloor \frac{x}{2^{i-1}} \rfloor \bmod 2\) для \(1 \leq i \leq n - 1\).
- \((x+1)\)-е число должно быть необходимому ответу для \(s\).
Примечание В первом тесте все мудрецы знакомы, соответственно для всех перестановок получается строка \(11\). Во втором тесте - Если \(p = \{1, 2, 3, 4\}\), строка будет равна \(101\), потому что мудрецы \(1\) и \(2\) знакомы, \(2\) и \(3\) не знакомы, \(3\) и \(4\) знакомы;
- Если \(p = \{4, 1, 2, 3\}\), строка будет равна \(110\), потому что мудрецы \(1\) и \(4\) не знакомы, \(1\) и \(2\) не знакомы, \(2\) и \(3\) не знакомы;
- Если \(p = \{1, 3, 2, 4\}\), строка будет равна \(000\), потому что мудрецы \(1\) и \(3\) не знакомы, \(3\) и \(2\) не знакомы, \(2\) и \(4\) не знакомы.
| |
|
|
F2. Мудрецы (усложненная версия)
битмаски
дп
математика
*3200
Это усложненная версия задачи. Две версии отличаются ограничением на число мудрецов и ограничением по времени. Вы можете взламывать по этой задаче только если обе версии решены. \(n\) мудрецов живут в красивом городе. Некоторые из них знают друг друга. Для всех возможных \(n!\) перестановок \(p_1, p_2, \ldots, p_n\) мудрецов, построим бинарную строку длины \(n-1\): для всех \(1 \leq i < n\) положим \(s_i=1\) если мудрецы \(p_i\) и \(p_{i+1}\) знают друг друга, и \(s_i=0\) иначе. Для всех \(2^{n-1}\) возможных бинарных строк, найдите число перестановок, при которых получается такая бинарная строка. Выходные данные Выведите \(2^{n-1}\) целых чисел, разделенных пробелами. Для каждого \(0 \leq x < 2^{n-1}\): - Рассмотрим такую строку \(s\) длины \(n-1\), что \(s_i = \lfloor \frac{x}{2^{i-1}} \rfloor \bmod 2\) для \(1 \leq i \leq n - 1\).
- \((x+1)\)-е число должно быть необходимому ответу для \(s\).
Примечание В первом тесте все мудрецы знакомы, соответственно для всех перестановок получается строка \(11\). Во втором тесте - Если \(p = \{1, 2, 3, 4\}\), строка будет равна \(101\), потому что мудрецы \(1\) и \(2\) знакомы, \(2\) и \(3\) не знакомы, \(3\) и \(4\) знакомы;
- Если \(p = \{4, 1, 2, 3\}\), строка будет равна \(110\), потому что мудрецы \(1\) и \(4\) не знакомы, \(1\) и \(2\) не знакомы, \(2\) и \(3\) не знакомы;
- Если \(p = \{1, 3, 2, 4\}\), строка будет равна \(000\), потому что мудрецы \(1\) и \(3\) не знакомы, \(3\) и \(2\) не знакомы, \(2\) и \(4\) не знакомы.
| |
|
|
F. Отрезки И
битмаски
дп
Комбинаторика
Структуры данных
*2500
Даны три целых числа \(n\), \(k\), \(m\) и \(m\) условий \((l_1, r_1, x_1), (l_2, r_2, x_2), \dots, (l_m, r_m, x_m)\). Посчитайте количество различных массивов \(a\), состоящих из \(n\) целых чисел, таких что: - \(0 \le a_i < 2^k\) для всех \(1 \le i \le n\);
- побитовое И чисел \(a[l_i] \& a[l_i + 1] \& \dots \& a[r_i] = x_i\) для всех \(1 \le i \le m\).
Два массива \(a\) и \(b\) считаются различными, если существует такая позиция \(i\), что \(a_i \neq b_i\). Это число может быть довольно велико, поэтому выведите его по модулю \(998244353\). Выходные данные Выведите одно целое число — количество различных массивов \(a\), для которых выполняются все приведенные выше условия, по модулю \(998244353\). Примечание Можете вспомнить, что такое побитовое И по ссылке. В первом примере ответом являются следующие массивы: \([3, 3, 7, 6]\), \([3, 7, 7, 6]\) и \([7, 3, 7, 6]\).
| |
|
|
G. Буквы и знаки вопроса
битмаски
дп
строковые суфф. структуры
*2800
Вам даны строка \(S\) и массив строк \([t_1, t_2, \dots, t_k]\). Каждая строка \(t_i\) состоит из строчных латинских букв от a до n; \(S\) состоит из строчных латинских букв от a до n и не более \(14\) знаков вопроса. У каждой строки \(t_i\) есть цена \(c_i\) — целое число. Стоимость некоторой строки \(T\) считается как \(\sum\limits_{i = 1}^{k} F(T, t_i) \cdot c_i\), где \(F(T, t_i)\) — количество вхождений \(t_i\) в \(T\) в качестве подстроки. К примеру, \(F(\text{aaabaaa}, \text{aa}) = 4\). Вы должны заменить все знаки вопроса в \(S\) на попарно различные строчные латинские буквы от a до n так, чтобы стоимость \(S\) была максимально возможной. Выходные данные Выведите одно целое число — максимальную стоимость \(S\) после замены всех знаков вопроса на попарно различные строчные латинские буквы от a до n.
| |
|
|
B. Dreamoon любит последовательности
битмаски
Комбинаторика
математика
*1700
Dreamoon очень любит последовательности. Поэтому он придумал задачу про последовательность, которую нельзя найти на OEIS: Вам дано два целых числа \(d, m\), вам нужно найти количество массивов \(a\), удовлетворяющих следующим ограничениям: - Длина \(a\) равна \(n\), \(n \ge 1\)
- \(1 \le a_1 < a_2 < \dots < a_n \le d\)
- Рассмотрим следующий массив \(b\) длины \(n\): \(b_1 = a_1\), \(\forall i > 1, b_i = b_{i - 1} \oplus a_i\), где \(\oplus\) это побитовое исключащее или (xor). После построения массива \(b\), должно выполняться ограничение \(b_1 < b_2 < \dots < b_{n - 1} < b_n\).
Так как количество возможных массивов может быть слишком большим, вам нужно найти его по модулю \(m\). Выходные данные Для каждого набора входных данных, выведите количество массивов \(a\), удовлетворяющих всем ограничениям, по модулю \(m\).
| |
|
|
C. ...И счастливо долго жили и они
*особая задача
битмаски
Выходные данные Выведите одно число.
| |
|
|
D. Прогулка по матрице
битмаски
Конструктив
математика
*1700
Боб играет в игру под названием «Прогулка по матрице» В этой игре игроку дается \(n \times m\) матрица \(A=(a_{i,j})\), то есть элемент в \(i\)-й строке в \(j\)-м столбце — \(a_{i,j}\). В начале игры игрок стоит на позиции \((1,1)\) со счетом \(a_{1,1}\). Чтобы достичь финиша, позиции \((n,m)\), игрок может ходить вправо или вниз, то есть из \((x,y)\) в \((x,y+1)\) или \((x+1,y)\), до тех пор, пока не выходит за пределы матрицы. Каждый шаг, однако, изменяет счет игрока на побитовое И текущего счета и значения клетки, в которую он переходит. Конечно же, Боб сразу решил вычислить максимальный счет, который он может набрать, с помощью недавно изученной им техники динамического программирования. Вот его алгоритм для данной задачи. Однако, он тут же понял, что его алгоритм неправильно находит максимальный счет для некоторой матрицы \(A\). Поэтому теперь он хочет для каждого неотрицательного целого числа \(k\) найти такую \(n \times m\) матрицу \(A=(a_{i,j})\), что - \(1 \le n,m \le 500\) (Боб ненавидит большие матрицы);
- \(0 \le a_{i,j} \le 3 \cdot 10^5\) для всех \(1 \le i\le n,1 \le j\le m\) (Боб ненавидит большие числа);
- разница между максимальным счетом, который он может набрать, и выводом алгоритма составляет ровно \(k\).
Можно показать, что для любого целого \(k\) такого, что \(0 \le k \le 10^5\), существует матрица, удовлетворяющая данным условиям. Помогите Бобу с этой задачей! Выходные данные В первой строке выведите два целых числа \(n\), \(m\) (\(1 \le n,m \le 500\)), обозначающие размеры матрицы. Затем выведите \(n\) строк по \(m\) целых чисел в каждой строке, \(a_{i,j}\) в \((i+1)\)-й строке, \(j\)-м столбце. Примечание В первом примере максимальный счет, который может набрать Боб, равен \(300000\), и вывод его алгоритма тоже \(300000\). Во втором примере максимальный счет, который Боб может набрать, равен \(7\&3\&3\&3\&7\&3=3\), когда вывод его алгоритма — это \(2\).
| |
|
|
G. Поиск подстроки
битмаски
бпф
Перебор
*2900
Дана перестановка \(p\), состоящая из \(26\) целых чисел от \(1\) до \(26\) (так как это перестановка, каждое число от \(1\) до \(26\) встречается в \(p\) ровно один раз), а также две строки \(s\) и \(t\), состоящие из строчных букв латинского алфавита. Подстрока \(t'\) строки \(t\) является вхождением строки \(s\), если выполняются следующие условия: - \(|t'| = |s|\);
- для каждого \(i \in [1, |s|]\) либо \(s_i = t'_i\), либо \(p_{idx(s_i)} = idx(t'_i)\), где \(idx(c)\) — номер символа \(c\) в латинском алфавите (\(idx(\text{a}) = 1\), \(idx(\text{b}) = 2\), \(idx(\text{z}) = 26\)).
Например, если \(p_1 = 2\), \(p_2 = 3\), \(p_3 = 1\), \(s = \text{abc}\), \(t = \text{abcaaba}\), три подстроки \(t\) являются вхождениями \(s\) (\(t' = \text{abc}\), \(t' = \text{bca}\) и \(t' = \text{aba}\)). Для каждой подстроки \(t\) с длиной, равной \(|s|\), проверьте, является ли она вхождением строки \(s\). Выходные данные Выведите строку из \(|t| - |s| + 1\) символов, каждый из которых должен быть либо 0, либо 1. \(i\)-й символ должен быть 1 тогда и только тогда, когда подстрока \(t\), начинающаяся с \(i\)-го символа и заканчивающаяся \((i + |s| - 1)\)-м символом (включительно), является вхождением строки \(s\).
| |
|
|
E1. Chiori и выбор кукол (простая версия)
битмаски
Комбинаторика
математика
Перебор
*2700
Это простая версия этой задачи. Единственное различие между простой и сложной версиями заключается в ограничениях на \(m\). Вы можете делать взломы, только если обе версии задачи сданы. Chiori очень любит куклы и сейчас она собирается украсить свою спальню! Так как Chiori коллекционирует куклы, всего у нее \(n\) кукол, \(i\)-я из этих кукол имеет неотрицательное целое число \(a_i\) (\(a_i < 2^m\), \(m\) дано). Chiori хочет выбрать некоторых кукол (возможно ноль) для украшения. Таким образом, всего существует \(2^n\) способов. Обозначим за \(x\) побитовую xor сумму значений у кукол, выбранных Chiori (в случае, если Chiori не выбрала ни одной куклы, \(x = 0\)). Значением способа выбора кукол назовем количество битов равных \(1\) в двоичном представлении \(x\). Более формально, это число также равно количеству индексов \(0 \leq i < m\), таких что \(\left\lfloor \frac{x}{2^i} \right\rfloor\) нечетно. Посчитайте для Chiori количество способов выбрать куклы со значением \(i\) для всех целых \(i\) от \(0\) до \(m\). Поскольку эти числа могут быть очень большими, вы должны посчитать их по модулю \(998\,244\,353\). Выходные данные Выведите \(m+1\) целое число \(p_0, p_1, \ldots, p_m\) — \(p_i\) равно количеству способов выбрать несколько кукол, так чтобы полученное значение выбора кукол оказалось равным \(i\) по модулю \(998\,244\,353\).
| |
|
|
E2. Chiori и выбор кукол (сложная версия)
битмаски
Комбинаторика
математика
Перебор
*3500
Это сложная версия этой задачи. Единственное различие между простой и сложной версиями заключается в ограничениях на \(m\). Вы можете делать взломы, только если обе версии задачи сданы. Chiori очень любит куклы и сейчас она собирается украсить свою спальню! Так как Chiori коллекционирует куклы, всего у нее \(n\) кукол, \(i\)-я из этих кукол имеет неотрицательное целое число \(a_i\) (\(a_i < 2^m\), \(m\) дано). Chiori хочет выбрать некоторых кукол (возможно ноль) для украшения. Таким образом, всего существует \(2^n\) способов. Обозначим за \(x\) побитовую xor сумму значений у кукол, выбранных Chiori (в случае, если Chiori не выбрала ни одной куклы, \(x = 0\)). Значением способа выбора кукол назовем количество битов равных \(1\) в двоичном представлении \(x\). Более формально, это число также равно количеству индексов \(0 \leq i < m\), таких что \(\left\lfloor \frac{x}{2^i} \right\rfloor\) нечетно. Посчитайте для Chiori количество способов выбрать куклы со значением \(i\) для всех целых \(i\) от \(0\) до \(m\). Поскольку эти числа могут быть очень большими, вы должны посчитать их по модулю \(998\,244\,353\). Выходные данные Выведите \(m+1\) целое число \(p_0, p_1, \ldots, p_m\) — \(p_i\) равно количеству способов выбрать несколько кукол, так чтобы полученное значение выбора кукол оказалось равным \(i\) по модулю \(998\,244\,353\).
| |
|
|
B. Назначение весов ребрам
битмаски
Деревья
жадные алгоритмы
Конструктив
математика
поиск в глубину и подобное
*1800
У вас есть невзвешенное дерево на \(n\) вершинах. Вы должны назначить положительный вес каждому ребру, чтобы выполнялось следующее условие: - Для каждых двух разных листов \(v_{1}\) и \(v_{2}\) этого дерева, побитовое исключающее ИЛИ весов всех ребер на простом пути между \(v_{1}\) и \(v_{2}\) должно быть равно \(0\).
Обратите внимание, что вы можете назначать очень большие натуральные числа (такие как \(10^{(10^{10})}\)). Гарантируется, что такое назначение всегда существует при данных ограничениях. Теперь определим \(f\) как количество различных весов среди назначенных весов. В этом примере назначение верно, потому что побитовое исключающее ИЛИ всех весов ребер между каждой парой листьев равно \(0\). Значение \(f\) здесь равно \(2\), потому что есть \(2\) различных веса ребер (\(4\) и \(5\)). В этом примере назначение не удовлетворяет условию, поскольку побитовое исключающее ИЛИ всех весов ребер между вершинами \(1\) и \(6\) (\(3, 4, 5, 4\)) не равно \(0\).
Чему равны минимальное и максимальное возможные значения \(f\) для данного дерева? Найдите и выведите оба. Выходные данные Выведите два целых числа — минимальное и максимальное возможное значения \(f\), которые могут быть получены из правильного назначения данного дерева. Обратите внимание, что такое назначение всегда существует при данных ограничениях. Примечание В первом примере возможные назначения для минимума и максимума показаны на рисунке ниже. Конечно, есть и другие назначения. Во втором примере возможные назначения для минимума и максимума показаны на рисунке ниже. Значение \(f\) для правильного назначения этого дерева всегда равно \(3\). В третьем примере возможные назначения для минимума и максимума показаны на рисунке ниже. Конечно, есть и другие назначения.
| |
|
|
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 \)
| |
|
|
B. Настя и табло
битмаски
графы
дп
жадные алгоритмы
*1700
Денис, справившийся с покупкой цветов и конфет (об этой истории вы узнаете в следующей задаче), поехал на встречу с Настей, чтобы предложить ей стать парой. И вот, они сидят вместе в кафе, болтают. Решительный Денис наконец-то предлагает быть им вместе, но... Но Настя не даёт никакого ответа. Как же сильно расстроился бедный парень. Так сильно, что он пнул какое-то табло с цифрами. Цифры отображаются таким же образом, как на электронных часах: каждая позиция для цифры состоит из \(7\) сегментов, которые могут быть включены или выключены, чтобы отображать различные цифры. На картинке показано, как изображаются все \(10\) десятичных цифр: После пинка некоторые палочки перестали работать, то есть некоторые палочки могли перестать гореть, если горели раньше. Но Денис запомнил, сколько палочек горело и сколько горит сейчас. Пусть сломалось ровно \(k\) палочек и известно, какие палочки горят сейчас. Денис задался вопросом: какое максимальное число может гореть на табло, если включить ровно \(k\) палочек (из тех которые сейчас выключены)? Разрешается, чтобы в числе были лидирующие нули. Выходные данные Выведите единственное число, состоящее из \(n\) разрядов – максимальное число, которое можно получить, если включить ровно \(k\) палочек или \(-1\), если невозможно так включить ровно \(k\) палочек, чтобы на табло получилась какая-то последовательность цифр. Примечание В первом тесте мы обязаны включить все \(7\) палочек и получить на табло одну цифру \(8\). Во втором тесте у нас включены палочки таким образом, что образуются единицы. За \(5\) дополнительно включённых палочек можно получить числа \(07\), \(18\), \(34\), \(43\), \(70\), \(79\), \(81\) и \(97\), из них выбираем максимальное — \(97\). В третьем тесте невозможно так включить ровно \(5\) палочек, чтобы на табло получилась какая-то последовательность цифр.
| |
|
|
F. Сделай возрастающим
битмаски
дп
Перебор
*3000
Дан массив \(a\), состоящий из \(n\) целых чисел. Вы можете применить несколько операций к этому массиву (возможно, ни одной). Во время каждой операции вы выбираете два индекса \(i\) и \(j\) (\(1 \le i, j \le n\); \(i \ne j\)), увеличиваете \(a_j\) на \(a_i\), а затем удаляете \(i\)-й элемент из массива (при этом индексы всех элементов правее удаляемого уменьшаются на \(1\), и размер массива \(n\) также уменьшается на \(1\)). Ваша цель — сделать массив \(a\) строго возрастающим, то есть должно выполняться условие \(a_1 < a_2 < \dots < a_n\) (где \(n\) — итоговый размер массива). Посчитайте минимальное количество операций, которое требуется, чтобы массив стал возрастающим. Выходные данные На каждый набор тестовых данных выведите ответ следующим образом: Сначала выведите \(k\) — минимальное количество операций, которые вы должны сделать. Затем выведите \(k\) строк, каждая из которых содержит два индекса \(i\) и \(j\) для соответствующей операции. Обратите внимание, что нумерация элементов меняется после удаления элемента из массива. Если существует несколько оптимальных последовательностей операций, выведите любую из них. Примечание В первом наборе тестовых данных \(a\) меняется следующим образом: \([2, 1, 3, 5, 1, 2, 4, 5] \rightarrow [2, 1, 3, 5, 1, 4, 7] \rightarrow [1, 3, 5, 1, 6, 7] \rightarrow [2, 3, 5, 6, 7]\).
| |
|
|
F. Строка-шпион
битмаски
дп
Конструктив
Перебор
Строки
хэши
*1700
Вам даны \(n\) строк \(a_1, a_2, \ldots, a_n\), все они имеют одинаковую длину \(m\). Строки состоят из строчных букв латинского алфавита. Найдите любую такую строку \(s\) длины \(m\), что каждая из заданных \(n\) строк отличается от \(s\) не более чем в одной позиции. Формально, для каждой заданной строки \(a_i\) должно существовать не более одной позиции \(j\), в которой \(a_i[j] \ne s[j]\). Заметим, что искомая строка \(s\) может как совпадать с одной из заданных строк \(a_i\), так и отличаться от всех заданных строк. Например, если вам даны строки abac и zbab, тогда ответом на задачу может быть строка abab, которая отличается от первой только последним символом, а от второй только первым. Выходные данные Выведите \(t\) ответов на наборы тестовых данных. Каждый ответ (если он существует) — это строка длины \(m\), состоящая из строчных латинских букв. Если существует несколько ответов, то выведите любой из них. Если ответа не существует, выведите «-1» («минус один», без кавычек). Примечание Первый набор тестовых данных примера разобран в условии. Во втором наборе ответа не существует.
| |
|
|
H. Двоичная медиана
Бинарный поиск
битмаски
Конструктив
Перебор
*2100
Рассмотрим все двоичные строки длины \(m\) (\(1 \le m \le 60\)), то есть строки, состоящие из символов 0 и 1. Например, 0110 является двоичной строкой, а 012aba — нет. Очевидно, что всего таких строк ровно \(2^m\). Строка \(s\) лексикографически меньше строки \(t\) (обе имеют одинаковую длину \(m\)), если в первой слева позиции \(i\), в которой они отличаются, верно \(s[i] < t[i]\). Именно такой способ сравнения строк используется в словарях и в большинстве современных языков программирования при их сравнении стандартным способом. Например, строка 01011 лексикографически меньше строки 01100, потому что первые два символа совпадают, а третий символ в первой строке меньше, чем во второй. Удалим из этого множества \(n\) (\(1 \le n \le \min(2^m-1, 100)\)) различных двоичных строк \(a_1, a_2, \ldots, a_n\), каждая длины \(m\). Таким образом, в множестве останется \(k=2^m-n\) строк. Отсортируем все строки полученного множества в порядке лексикографического возрастания (как в словаре). Пронумеруем все строки после сортировки от \(0\) до \(k-1\). Выведите строку, номер которой равен \(\lfloor \frac{k-1}{2} \rfloor\) (такой элемент называется медианой), где \(\lfloor x \rfloor\) является округлением числа вниз к ближайшему целому. Например, если \(n=3\), \(m=3\) и \(a=[\)010, 111, 001\(]\), то после удаления строк \(a_i\) и сортировки результат примет вид: \([\)000, 011, 100, 101, 110\(]\). Таким образом, искомая медиана равна 100. Выходные данные Выведите \(t\) ответов на наборы тестовых данных. Ответом является строка длины \(m\) — медиана оставшихся строк. Примечание Первый набор тестовых данных примера разобран в условии. Во втором наборе результат после удаления строк и сортировки равен \([\)001, 010, 101, 110\(]\). Следовательно, искомая медиана равна 010.
| |
|
|
C. Джонни и ожерелье Меган
Бинарный поиск
битмаски
графы
Конструктив
поиск в глубину и подобное
снм
*2500
У младшей сестры Джонни, Меган, недавно был день рождения. Её брат подарил ей коробочку, подписанную как: «Твое прекрасное ожерелье — сделай сама!». Коробочка содержит много частей ожерелья и магический клей. Каждая часть ожерелья представляет собой цепочку, соединяющую две жемчужины. Цвет каждой из жемчужин может быть представлен целым неотрицательным числом. Магический клей позволяет Меган склеивать две жемчужины (возможно, из одной части ожерелья) в одну. Красота соединения двух жемчужин цветов \(u\) и \(v\) определяется следующим образом: пусть \(2^k\) — максимальная степень двух, делящая \(u \oplus v\) — исключающее или \(u\) и \(v\). Тогда красота соединения равна \(k\). Если \(u = v\), вы можете считать, что красота равна \(20\). Каждая жемчужина может быть склеена с другой максимум один раз. Склеивание двух частей ожерелья объединяет их. Используя клей несколько раз, Меган может наконец получить свое ожерелье, которое является циклом, сделанным из соединенных последовательно частей ожерелья (так, что каждая жемчужина в ожерелье соединена с ровно одной другой жемчужиной). Красота такого ожерелья равна минимальной красоте соединений в нем. Девочка хочет использовать все доступные части ожерелья, чтобы получить ровно одно ожерелье, содержащее все части, с максимальной возможной красотой. Помогите ей! Выходные данные Первая строка должна содержать одно целое число \(b\), обозначающее максимальную возможную красоту ожерелья, собранного из всех данных частей. Следующая строка должна содержать \(2n\) различных целых чисел \(p_i\) \((1 \leq p_i \leq 2n)\) — индексы исходных жемчужин в порядке, в котором они должны быть расположены в ожерелье. Индексы жемчужин, принадлежащих одной части, должны быть расположены на соседних позициях в перестановке (поэтому \(1\,4\,3\,2\) не является корректным выводом, а \(2\,1\,4\,3\) и \(4\,3\,1\,2\) являются). Если существует несколько подходящих ответов, вы можете вывести любой. Примечание В первом примере следующие пары жемчужин объединяются: \((7, 9)\), \((10, 5)\), \((6, 1)\), \((2, 3)\) и \((4, 8)\). Красота соединений равна: \(3\), \(3\), \(3\), \(20\), \(20\), соответственно. Иллюстрация показывает эту конструкцию:
| |
|
|
B. Джонни и его хобби
битмаски
Перебор
*1200
Среди многочисленных хобби Джонни, есть два, казалось бы, безвредных: применение побитовых операций и прокрадывание в офис его отца. Как это обычно и бывает у маленьких детей, Джонни не подозревает, что комбинирование этих двух занятий может доставить ему много неприятностей. На столе его отца хранится множество \(S\), содержащее очень важные числа. В момент, когда Джонни узнал об этом, он решил, что это хорошая идея выбрать положительное целое число \(k\) и заменить все элементы \(s\) из множества \(S\) на \(s \oplus k\) (\(\oplus\) обозначает операцию исключающего или). Помогите Джонни выбрать такое \(k\), что его отец не заметит никакой разницы после того, как Джонни закончит играть (т.е. Джонни должен получить такое же множество, какое было изначально). Возможно, что ни одного такого числа не существует. Также, возможно, что существует несколько подходящих чисел. В таком случае, выведите минимальное из них. Обратите внимание, что порядок элементов в множестве не имеет значения, т.е. множество \(\{1, 2, 3\}\) равно множеству \(\{2, 1, 3\}\). Формально, требуется найти минимальное положительное целое число \(k\), такое что \(\{s \oplus k | s \in S\} = S\) или сообщить, что ни одного подходящего числа не существует. Например, если \(S = \{1, 3, 4\}\) и \(k = 2\), новое множество будет равно \(\{3, 1, 6\}\). Если \(S = \{0, 1, 2, 3\}\) и \(k = 1\), после игры множество останется таким же. Выходные данные Выведите \(t\) строк, \(i\)-я из них должна содержать ответ на \(i\)-й набор входных данных — минимальное положительное целое число \(k\), удовлетворяющее условиям, или \(-1\), если ни одного подходящего \(k\) не существует. Примечание В первом наборе входных данных, ответ \(1\), потому что это минимальное положительное целое число и оно удовлетворяет всем условиям.
| |
|
|
C. Джонни и ещё одно падение рейтинга
битмаски
жадные алгоритмы
математика
*1400
Последний контест, проведённый на любимой Джонни платформе по спортивному программированию, был встречен довольно позитивно. Однако, рейтинг Джонни снова упал! Он думает, что хотя задачи были неплохие, они не показывают истинный уровень участников. Теперь мальчик смотрит на рейтинги соседних участников, записанные в двоичной системе счисления. Он считает, что чем больше эти рейтинги различаются, тем более нечестно, что эти участники расположены на соседних позициях. Он определяет различие между двумя числами как количество позиций битов, на которых одно из чисел содержит ноль, а другое — единицу (мы считаем, что числа дополнены ведущими нулями до одинаковой длины). Например, различие между числами \(5 = 101_2\) и \(14 = 1110_2\) равно \(3\), так как \(0101\) и \(1110\) отличаются в \(3\) позициях. Джонни определяет нечестность контеста как сумму таких различий для всех пар соседних участников. Джонни только что прислал вам последовательность рейтингов и хочет, чтобы вы вычислили нечестность контеста. Вы заметили, что вы получили последовательные целые числа от \(0\) до \(n\). Это странно, но мальчик упорно твердит, что все правильно. Поэтому, помогите ему и вычислите желаемую нечестность для полученной последовательности чисел. Выходные данные Выведите \(t\) строк. Для каждого набора входных данных, вы должны вывести одну строку, содержащую одно целое число — нечестность контеста, если последовательность рейтингов равна \(0\), \(1\), ..., \(n - 1\), \(n\). Примечание Для \(n = 5\), мы вычисляем нечестность следующей последовательности (числа от \(0\) до \(5\), записанные в двоичной системе счисления и дополненные ведущими нулями до одинаковой длины): - \(000\)
- \(001\)
- \(010\)
- \(011\)
- \(100\)
- \(101\)
Различия равны \(1\), \(2\), \(1\), \(3\), \(1\), соответственно. Поэтому, нечестность равна \(1 + 2 + 1 + 3 + 1 = 8\).
| |
|
|
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\). После этого вы угадываете перестановку.
| |
|
|
G. Надежный пароль
битмаски
интерактив
Комбинаторика
Конструктив
математика
*2800
Это интерактивная задача. Ayush придумал еще один способ задать пароль для своего замка. В замке есть \(n\) слотов, в каждом слоте может находится любое неотрицательное целое число. Пароль \(P\) это последовательность из \(n\) целых чисел, \(i\)-й из которых соответствует \(i\)-му слоту замка. Чтобы задать пароль, Ayush придумал последовательность \(A\) из \(n\) целых чисел из отрезка \([0, 2^{63}-1]\). Затем, он определил \(i\)-й элемент \(P\) как побитовое ИЛИ всех чисел в массиве кроме \(A_i\). Вам нужно отгадать пароль. Чтобы задать запрос, вы можете выбрать непустое подмножество индексов массива и спросить побитовое ИЛИ всех элементов массива с индексами в этом подмножестве. Вы можете задать не более 13 запросов. Протокол взаимодействия Чтобы задать вопрос, в отдельной строке: - Сначала выведите «? c» (без кавычек), где \(c\) \((1 \leq c \leq n)\) обозначает размер подмножества запроса, после чего выведите \(c\) различных целых чисел из отрезка \([1, n]\), разделенных пробелами.
В ответ на каждый запрос, вы получите число \(x\) — побитовое ИЛИ чисел с выбранными индексами. Если вы спросили некорректное множество индексом или вы превысили количество запросов, тогда вы получите \(x = -1\). В таком случае вы должны немедленно завершить выполнение программы. Если вы угадали пароль, в отдельной строке выведите «!» (без кавычек), после чего выведите \(n\) целых чисел, разделенных пробелами — последовательность-пароль. Отгадывание пароля не считается в числе загаданных запросов. Интерактор не адаптивный. Массив \(A\) не меняется с запросами. После вывода запроса, не забывайте выводить конец строки и сбрасывать поток вывода. Иначе, вы получите верикт Превышен лимит бездействия. Чтобы сделать это, используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- читайте документацию для остальных языков.
Взломы Чтобы взломать решение, используйте следующий формат: В первой строке, выведите одно целое число \(n\) \((2 \le n \le 1000)\) — количество слотов в замке. Во второй строке выведите \(n\) целых чисел из отрезка \([0, 2^{63} - 1]\), разделенных пробелами — массив \(A\). Примечание Массив \(A\) в примере это \(\{{1, 2, 4\}}\). Первый элемент пароля это побитовое ИЛИ элементов \(A_2\) и \(A_3\), второй элемент это побитовое ИЛИ элементов \(A_1\) и \(A_3\), а третий элемент это побитовое ИЛИ элементов \(A_1\) и \(A_2\). Таким образом, пароль равен \(\{{6, 5, 3\}}\).
| |
|
|
D. AND, OR и сумма квадратов
битмаски
жадные алгоритмы
математика
*1700
Готтфрид узнал про двоичное представление чисел. Он придумал эту задачу и предложил её вам. Вам дан набор из \(n\) неотрицательных целых чисел \(a_1, \ldots, a_n\). Вы можете выполнять следующую операцию: выбрать два различных индекса \(1 \leq i, j \leq n\). Если перед операцией \(a_i = x\), \(a_j = y\), то после операции \(a_i = x~\mathsf{AND}~y\), \(a_j = x~\mathsf{OR}~y\), где \(\mathsf{AND}\) и \(\mathsf{OR}\) — операции побитового И и ИЛИ соответственно (для формального описания см. раздел Комментарии). Данную операцию можно применять любое количество раз (возможно, ноль). После того, как все операции выполнены, вычислим \(\sum_{i=1}^n a_i^2\) — сумму квадратов всех \(a_i\). Какую максимальную сумму квадратов можно получить? Выходные данные Выведите одно число — максимально возможная сумма квадратов после применения нескольких операций (возможно, ни одной). Примечание В первом примере нельзя сделать ни одной операции, поэтому ответ равен \(123^2\). Во втором примере мы можем получить набор \(1, 1, 7\), и \(1^2 + 1^2 + 7^2 = 51\). Если \(x\) и \(y\) записаны в двоичной системе с одинаковым числом бит (возможно, с ведущими нулями), то любой бит \(x~\mathsf{AND}~y\) равен \(1\) тогда и только тогда, когда оба соответствующих бита \(x\) и \(y\) равны \(1\). Аналогично, любой бит \(x~\mathsf{OR}~y\) равен \(1\) тогда и только тогда, когда хотя бы один из соответствующих битов \(x\) и \(y\) равен \(1\). Например, \(x = 3\) и \(y = 5\) можно представить как \(011_2\) и \(101_2\) (старший бит слева). Тогда \(x~\mathsf{AND}~y = 001_2 = 1\) и \(x~\mathsf{OR}~y = 111_2 = 7\).
| |
|
|
B. GameGame
битмаски
дп
жадные алгоритмы
игры
Конструктив
математика
*1900
Коала Коа и ее лучшая подруга хотят поиграть в игру. Игра начинается с массива \(a\) длины \(n\), состоящего из неотрицательных целых чисел. Коа и ее лучшая подруга ходят по очереди, и у каждой из них есть счет, изначально равный \(0\). Коа начинает. Ход в игре происходит следующим образом: - Во время своего хода игрок выбирает любой элемент массива и удаляет его из этого массива, ксоря его с текущим счетом игрока.
Более формально: если текущий счет игрока равен \(x\), а выбранный элемент равен \(y\), его новый счет будет равен \(x \oplus y\). Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ.. Обратите внимание, что после хода элемент \(y\) удаляется из \(a\). - Игра заканчивается, когда массив пуст.
В конце игры победителем становится игрок с максимальным счетом. Если оба игрока имеют одинаковый счет, то это ничья. Если оба игрока играют оптимально, выясните, выиграет ли Коа, проиграет или сыграет вничью. Выходные данные Для каждого набора входных данных выведите: - WIN, если Коа выиграет.
- LOSE, если Коа проиграет.
- DRAW, если игра закончится вничью.
Примечание В \(1\)-м наборе входных данных первого примера: \(a = [1, 2, 2]\). Здесь Коа выбирает \(1\), другой игрок должен выбрать \(2\), Коа выбирает оставшуюся \(2\). Счет для Коа составляет \(1 \oplus 2 = 3\), а для другого игрока — \(2\), поэтому Коа выигрывает.
| |
|
|
C. Трансформация строки 2
битмаски
графы
Деревья
дп
*3100
Обратите внимание, что единственная разница между Трансформация строки 1 и Трансформация строки 2 заключается в операции, которую делает Коа. В этой версии буква \(y\), которую выбирает Koa, может быть любой из первых \(20\) букв английского алфавита (для лучшего понимания прочитайте условие). Вы можете делать взломы по этим задачам независимо. Коала Коа имеет две строки \(A\) и \(B\) одинаковой длины \(n\) (\(|A|=|B|=n\)), состоящие из первых \(20\) строчных букв английского алфавита (то есть от a до t). В один ход Коа: - выбирает некоторое подмножество позиций \(p_1, p_2, \ldots, p_k\) (\(k \ge 1; 1 \le p_i \le n; p_i \neq p_j\) если \(i \neq j\)) из \(A\), такое что \(A_{p_1} = A_{p_2} = \ldots = A_{p_k} = x\) (т. е. все буквы на этой позиции равны некоторой букве \(x\)).
- выбирает любую букву \(y\) (из первых \(20\) строчных букв английского алфавита).
- делает все буквы в позициях \(p_1, p_2, \ldots, p_k\) равными \(y\). Более формально: для каждого \(i\) (\(1 \le i \le k\)) Коа устанавливает \(A_{p_i} = y\).
Обратите внимание, что вы можете изменять только буквы в строке \(A\). Коа хочет знать наименьшее число ходов, которые она должна сделать, чтобы сделать строки равными друг другу (\(A = B\)) или определить, что нет никакого способа сделать их равными. Помогите ей! Выходные данные Для каждого набора входных данных: Выведите в единственной строке минимальное количество ходов, которое Koa должна сделать, чтобы строки стали равны друг другу (\(A = B\)) или \(-1\), если нет никакого способа сделать их равными. Примечание - В \(1\)-м наборе входных данных Koa:
- выбирает позиции \(1\) и \(2\) и устанавливает \(A_1 = A_2 = \) b (\(\color{red}{aa}b \rightarrow \color{blue}{bb}b\)).
- выбирает позиции \(2\) и \(3\) и устанавливает \(A_2 = A_3 = \) c (\(b\color{red}{bb} \rightarrow b\color{blue}{cc}\)).
- В \(2\)-м наборе входных данных Koa:
- выбирает позиции \(1\) и \(4\) и устанавливает \(A_1 = A_4 = \) a (\(\color{red}{c}ab\color{red}{c} \rightarrow \color{blue}{a}ab\color{blue}{a}\)).
- выбирает позиции \(2\) и \(4\) и устанавливает \(A_2 = A_4 = \) b (\(a\color{red}{a}b\color{red}{a} \rightarrow a\color{blue}{b}b\color{blue}{b}\)).
- выбирает позицию \(3\) и устанавливает \(A_3 = \) c (\(ab\color{red}{b}b \rightarrow ab\color{blue}{c}b\)).
- В \(3\)-м наборе входных данных Koa:
- выбирает позицию \(1\) и устанавливает \(A_1 = \) t (\(\color{red}{a}bc \rightarrow \color{blue}{t}bc\)).
- выбирает позицию \(2\) и устанавливает \(A_2 = \) s (\(t\color{red}{b}c \rightarrow t\color{blue}{s}c\)).
- выбирает позицию \(3\) и устанавливает \(A_3 = \) r (\(ts\color{red}{c} \rightarrow ts\color{blue}{r}\)).
| |
|
|
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 баллов) Без дополнительных ограничений.
Примечание Граф из данного примера:
| |
|
|
D. 505
битмаски
дп
жадные алгоритмы
Конструктив
Перебор
реализация
*2000
Бинарная матрица называется хорошей, если каждая квадратная подматрица c четной длиной стороны содержит нечетное число единиц. Для данной бинарной матрицы \(a\), состоящей из \(n\) строк и \(m\) столбцов, определите минимальное количество ячеек, которые нужно изменить, чтобы сделать ее хорошей, или сообщите, что ее вообще нельзя сделать хорошей. Все вышеприведенные термины имеют свои обычные значения — обратитесь к разделу Примечания для их формальных определений. Выходные данные Выведите минимальное количество ячеек, которое нужно изменить, чтобы сделать \(a\) хорошей, или выведите \(-1\), если это вообще невозможно. Примечание В первом случае достаточно заменить \(a_{1,1}\) на \(0\) и \(a_{2,2}\) на \(1\). Вы можете проверить, что нет никакой возможности сделать матрицу во втором случае хорошей. Некоторые определения — - Бинарная матрица — это матрица, в которой каждый элемент равен \(1\) или \(0\).
- Подматрица описывается \(4\) параметрами — \(r_1\), \(r_2\), \(c_1\) и \(c_2\); здесь \(1 \leq r_1 \leq r_2 \leq n\) и \(1 \leq c_1 \leq c_2 \leq m\).
- Эта подматрица содержит все элементы \(a_{i,j}\), которые удовлетворяют как \(r_1 \leq i \leq r_2\) так и \(c_1 \leq j \leq c_2\).
- Подматрица называется квадратом четной длины, если\(r_2-r_1 = c_2-c_1\) и \(r_2-r_1+1\) делится на \(2\).
| |
|
|
E. Омкар и утка
битмаски
интерактив
Конструктив
математика
*2100
Это интерактивная задача Омкар только что наткнулся на утку! Утка ходит по сетке с \(n\) строками и \(n\) столбцами (\(2 \leq n \leq 25\)), так что сетка содержит в общей сложности \(n^2\) ячеек. Обозначим как \((x, y)\) ячейку в \(x\)-й строке сверху и \(y\)-м столбце слева. Прямо сейчас утка находится в ячейке \((1, 1)\) (ячейка в левом верхнем углу) и хочет дойти до ячейки \((n, n)\) (ячейка в правом нижнем углу), перемещаясь каждую секунду либо вниз на \(1\) ячейку, либо вправо на \(1\) ячейку. Так как Омкар считает, что утки это весело, он хочет поиграть с вами в игру, основанную на движении утки. Сначала для каждой ячейки \((x, y)\) в сетке вы скажете Омкару целое неотрицательное \(a_{x,y}\), не превышающее \(10^{16}\), а затем Омкар положит \(a_{x,y}\) неинтересных задач в ячейку \((x, y)\). После этого утка начнет свое путешествие с \((1, 1)\) до \((n, n)\). Для каждой ячейки \((x, y)\), которую утка посещает во время своего путешествия (включая ячейки \((1, 1)\) и \((n, n)\)), утка съест \(a_{x,y}\) неинтересных задач в этой ячейке. После того как утка завершит свое путешествие, Омкар измерит ее массу, чтобы определить общее количество \(k\) неинтересных задач, которые утка съела во время своего путешествия, а затем скажет вам \(k\). Ваша задача, зная \(k\), состоит в том, чтобы точно воспроизвести утиный путь, т.е. точно сказать Омкару, какие клетки утка посетила во время своего путешествия. Чтобы быть уверенным в вашем мастерстве в этой игре, Омкар заставит утку выполнить \(q\) различных путешествий (\(1 \leq q \leq 10^3\)). Обратите внимание, что все путешествия независимы: в начале каждого путешествия ячейка \((x, y)\) все так же будет содержать \(a_{x,y}\) неинтересных задач. Протокол взаимодействия Взаимодействие начнется со строки, содержащей одно целое \(n\) (\(2 \leq n \leq 25\)) — количество строк и столбцов в сетке. Считайте его. Затем ваша программа должна вывести \(n\) строк. \(x\)-я строка должна содержать \(n\) целых чисел \(a_{x,1}, a_{x,2}, \dotsc, a_{x,n}\), удовлетворяющих \(0 \leq a_{x,y} \leq 10^{16}\), где \(a_{x,y}\) — это количество неинтересных задач, которые Омкар должен поместить в ячейку \((x, y)\). После этого вы получите одно целое \(q\), количество путешествий, которые совершит утка. Затем последуют \(q\) запросов; каждый запрос будет состоять из одной строки, содержащей целое число \(k\) — количество неинтересных задач, которые утка съела в этой поездке. После каждого запроса, когда вы определили, что утка посетила ячейки \((x_1, y_1), (x_2, y_2), \dotsc, (x_{2n - 1}, y_{2n - 1})\) в таком порядке (всегда должно выполняться \((x_1, y_1) = (1, 1)\) и \((x_{2n - 1}, y_{2n - 1}) = (n, n)\)), нужно вывести \(2n - 1\) строк, в \(j\)-й из которых должно быть два целых числа \(x_j, y_j\). Обратите внимание, что если сумма на вашем пути равна \(k\), но ваш путь отличается от загаданного, то ваше решение все еще неверное! После вывода очередной строки не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Формат взломов Для взлома сначала выведите строку, содержащую \(n\), а затем другую строку, содержащую \(q\). Должно выполняться \(2 \leq n \leq 25\) и \(1 \leq q \leq 1000\). Затем выведите \(q\) путешествий, сделанных уткой в том же формате, как описано выше: для каждого путешествия, если утка посещала ячейки \((x_1, y_1), (x_2, y_2), \dotsc, (x_{2n - 1}, y_{2n - 1})\) в таком порядке, нужно вывести \(2n - 1\) строк, в \(j\)-й строке должны быть два целых числа \(x_j, y_j\). Должно выполняться \((x_1, y_1) = (1, 1)\) и \((x_{2n - 1}, y_{2n - 1}) = (n, n)\). Кроме того, для каждого \(j\) такого, что \(2 \leq j \leq 2n - 1\), должно быть верно, что \(1 \leq x_j, y_j \leq n\) и либо \((x_j, y_j) = (x_{j - 1} + 1, y_{j - 1})\) либо \((x_j, y_j) = (x_{j - 1}, y_{j - 1} + 1)\). Примечание Ниже проиллюстрированы три путешествия утки. \(1 + 2 + 3 + 2 + 10 + 3 + 2 = 23\) \(1 + 4 + 9 + 0 + 7 + 3 + 2 = 26\) \(1 + 2 + 3 + 6 + 10 + 3 + 2 = 27\)
| |
|
|
G. Омкар и пироги
битмаски
дп
кратчайшие пути
математика
поиск в глубину и подобное
*2900
У Омкара есть поднос для пирогов с \(k\) местами (\(2 \leq k \leq 20\)). Каждое место на подносе содержит либо шоколадный пирог, либо тыквенный пирог. Омкару не нравится, как пироги расположены в настоящее время, и у него есть другое идеальное расположение, которое он предпочел бы этому. Чтобы помочь Омкару, \(n\) эльфов построились в очередь на замену пирогов на подносе. \(j\)-й слева эльф способен поменять пироги на позициях \(a_j\) и \(b_j\) местами. Чтобы максимально приблизиться к своему идеальному расположению, Omkar может выбрать последовательный подотрезок эльфов и затем пропустить свой поднос через этот подотрезок, начиная слева. Однако, поскольку эльфы приложили столько усилий, чтобы собраться в строку, они просят, чтобы выбранный Омкаром подотрезок содержал как минимум \(m\) (\(1 \leq m \leq n\)) эльфов. Формально, Omkar может выбрать два целых числа \(l\) и \(r\), удовлетворяющих \(1 \leq l \leq r \leq n\) и \(r - l + 1 \geq m\), после чего сначала будут поменяны пироги в позициях \(a_l\) и \(b_l\), затем пироги в позициях \(a_{l + 1}\) и \(b_{l + 1}\) и т.д. пока, наконец, не будут поменяны местами пироги \(a_r\) и \(b_r\). Помогите Омкару выбрать подотрезок эльфов таким образом, чтобы количество позиций в итоговой расстановке Омкара, содержащих тот же тип пирога, что и в его идеальной расстановке, было максимально возможным. Обратите внимание, что поскольку Омкар обладает большим воображением, может случиться так, что количество пирогов каждого типа в его первоначальном расположении и в его идеальном расположении не совпадают. Выходные данные Выводите две строки. Первая строка должна содержать одно целое \(s\) (\(0 \leq s \leq k\)), равное количеству позиций, которые содержат один и тот же тип пирога в окончательном расположении Омкара и в идеальном расположении Омкара; \(s\) должно быть максимально возможным. Вторая строка должна содержать два целых числа \(l\) и \(r\), удовлетворяющих \(1 \leq l \leq r \leq n\) и \(r - l + 1 \geq m\), обозначающих, что Омкар должен пропустить свой поднос через подотрезок \(l, l + 1, \dots, r\), чтобы добиться конечного расположения в котором есть \(s\) позиций, в которых тот же тип пирога, что и в идеальном расположении. Если ответов несколько, то можно вывести любой из них. Примечание В первом примере, изменения будут проходить вот так: - Поменяйте \(1\) и \(3\): 11000 становится 01100
- Поменяйте \(3\) и \(5\): 01100 становится 01001
- Поменяйте \(4\) и \(2\): 01001 становится 00011
Окончательная расстановка такая же, как и у идеального пирога 00011, поэтому есть \(5\) позиций с тем же типом пирога, что и в оптимальной. Во втором примере, изменения будут идти вот так: - Поменяйте \(1\) и \(3\): 11000 становится 01100
- Поменяйте \(1\) и \(5\): 01100 становится 01100
- Поменяйте \(4\) и \(2\): 01100 становится 00110
- Поменяйте \(1\) и \(5\): 00110 становится 00110
Окончательная расстановка имеет \(3\) позиции с тем же типом пирога, что и идеальная расстановка 00011, это позиции \(1\), \(2\) и \(4\). В этом случае подотрезок эльфов \((l, r) = (2, 3)\) более оптимален, но этот подотрезок имеет только длину \(2\) и поэтому не удовлетворяет ограничению, заключающемуся в том, что подотрезок должен иметь длину не менее \(m = 3\).
| |
|
|
C. Boboniu и битовые операции
битмаски
дп
жадные алгоритмы
Перебор
*1600
Boboniu нравятся битовые операции, он решил поиграть с вами в игру. Boboniu дает вам две последовательности неотрицателных целых чисел \(a_1,a_2,\ldots,a_n\) and \(b_1,b_2,\ldots,b_m\). Для каждого \(i\) (\(1\le i\le n\)), вам нужно выбрать \(j\) (\(1\le j\le m\)) и определить \(c_i=a_i\& b_j\), где \(\&\) обозначает операцию побитовое И. Обратите внимание, что вы можете выбрать одинаковые \(j\) для разных \(i\). Найдите минимальное возможное \(c_1 | c_2 | \ldots | c_n\), где \(|\) обозначает операцию побитовое ИЛИ. Выходные данные Выведите одно целое число: минимальное возможное значение \(c_1 | c_2 | \ldots | c_n\). Примечание Для первого примера, рассмотрим \(c_1=a_1\& b_2=0\), \(c_2=a_2\& b_1=2\), \(c_3=a_3\& b_1=0\), \(c_4 = a_4\& b_1=0\). Следовательно, \(c_1 | c_2 | c_3 |c_4 =2\), и это минимальный возможный ответ.
| |
|
|
G. Соревнования по бегу
битмаски
бпф
математика
теория чисел
*2600
Скоро начинаются соревнования по бегу. Стадион, на котором планируется их проводить, может быть представлен несколькими отрезками на координатной плоскости: - два горизонтальных отрезка: один соединяет точки \((0, 0)\) и \((x, 0)\), другой соединяет точки \((0, y)\) и \((x, y)\);
- \(n + 1\) вертикальный отрезок, пронумерованные от \(0\) до \(n\). \(i\)-й отрезок соединяет точки \((a_i, 0)\) и \((a_i, y)\); \(0 = a_0 < a_1 < a_2 < \dots < a_{n - 1} < a_n = x\).
Например, на данной картинке изображен стадион с \(x = 10\), \(y = 5\), \(n = 3\) и \(a = [0, 3, 5, 10]\): Назовем кругом такой маршрут, который проходит по отрезкам, начинается и заканчивается в одно точке и никогда не пересекается сам с собой (единственные две совпадающие точки круга — это стартовая и финишная). Длина круга — это суммарное расстояние, пройденное по нему. Например, красный путь на картинке, обозначающей стадион — это круг длиной \(24\). Соревнование пройдет в \(q\) этапов. На \(i\)-м этапе длина круга равна \(l_i\), поэтому организаторам предстоит найти круг для каждого этапа такой, что его длина является делителем \(l_i\). Организаторы не хотят выбирать слишком маленькие круги, поэтому на каждом этапе требуется найти максимальный (по длине) подходящий круг. Помогите организаторам вычислить максимально возможные длины кругов для всех этапов. Другими словами, для каждого \(l_i\) найдите максимальное целое число \(L\) такое, что \(l_i \bmod L = 0\), и существует круг с длиной ровно \(L\). Если невозможно выбрать такой круг, то выведите \(-1\). Выходные данные Выведите \(q\) целых чисел. \(i\)-е число должно быть равно максимально возможной длине круга для \(i\)-го этапа, или \(-1\), если невозможно выбрать круг для данного этапа.
| |
|
|
G. Наемники
битмаски
дп
Комбинаторика
математика
Перебор
снм
*2600
Поликарп играет в (очередную) стратегическую компьютерную игру. В этой игре он управляет армией наемников. Поликарп хочет собрать свою армию для выполнения задания. Для найма доступны \(n\) наемников, и армия Поликарпа должна состоять из некоторого подмножества множества доступных наемников. \(i\)-го наемника можно выбрать только в том случае, если итоговое количество выбранных наемников не менее \(l_i\) (иначе этот наемник считает задание слишком опасным) и не более \(r_i\) (он не хочет делить добычу со слишком большим количеством других наемников). Кроме того, \(m\) пар наемников ненавидят друг друга, и из каждой такой пары можно взять на задание не более одного наемника. Сколько непустых подмножеств наемников Поликарп должен рассмотреть? Другими словами, посчитайте количество подмножеств наемников, которые не содержат пар наемников, ненавидящих друг друга, и размер которых принадлежит отрезку \([l_i, r_i]\) для каждого наемника из подмножества. Ответ может быть очень большим, поэтому посчитайте его по модулю \(998244353\). Выходные данные Выведите одно целое число — количество подмножеств, удовлетворяющих условию задачи, взятое по модулю \(998244353\).
| |
|
|
F. Reverse и Swap
Бинарный поиск
битмаски
Структуры данных
*2400
Вам задан массив \(a\) длины \(2^n\). Вам нужно обработать \(q\) запросов к нему. Каждый запрос одного из следующих \(4\) типов: - \(Replace(x, k)\) — присвоить элементу \(a_x\) значение \(k\);
- \(Reverse(k)\) — развернуть каждый подмассив \([(i-1) \cdot 2^k+1, i \cdot 2^k]\) для всех \(i\) (\(i \ge 1\));
- \(Swap(k)\) — поменять местами подмассивы \([(2i-2) \cdot 2^k+1, (2i-1) \cdot 2^k]\) и \([(2i-1) \cdot 2^k+1, 2i \cdot 2^k]\) для всех \(i\) (\(i \ge 1\));
- \(Sum(l, r)\) — вывести сумму элементов подмассива \([l, r]\).
Напишите программу, которая может достаточно быстро обрабатывать заданные запросы. Выходные данные Выведите ответы для каждого запроса \(Sum\). Примечание В первом примере, первоначально, массив \(a\) равен \(\{7,4,9,9\}\). После обработки первого запроса, массив \(a\) становится \(\{7,8,9,9\}\). После обработки второго запроса, массив \(a_i\) становится \(\{9,9,7,8\}\). Поэтому, ответ на третий запрос равен \(9+7+8=24\). Во втором примере, первоначально, массив \(a\) равен \(\{7,0,8,8,7,1,5,2\}\). Далее происходит следующее: - \(Sum(3, 7)\) \(\to\) \(8 + 8 + 7 + 1 + 5 = 29\);
- \(Reverse(1)\) \(\to\) \(\{0,7,8,8,1,7,2,5\}\);
- \(Swap(2)\) \(\to\) \(\{1,7,2,5,0,7,8,8\}\);
- \(Sum(1, 6)\) \(\to\) \(1 + 7 + 2 + 5 + 0 + 7 = 22\);
- \(Reverse(3)\) \(\to\) \(\{8,8,7,0,5,2,7,1\}\);
- \(Replace(5, 16)\) \(\to\) \(\{8,8,7,0,16,2,7,1\}\);
- \(Sum(8, 8)\) \(\to\) \(1\);
- \(Swap(0)\) \(\to\) \(\{8,8,0,7,2,16,1,7\}\).
| |
|
|
E. Ромские цифры
битмаски
жадные алгоритмы
математика
Строки
*2300
Ваш друг прислал вам строку \(S\), состоящую из \(n\) строчных английских букв. Оказывается, это число, записанное в ромской системе счисления. Знания о ромских числах давно утрачены, но сохранился алгоритм перевода ромских чисел в привычные нам. Пронумеруем символы \(S\) от \(1\) до \(n\) слева направо. Значение числа \(S\) обозначим как \(f(S)\), оно определяется следующим образом: - Если \(|S| > 1\), то выбирается произвольное значение \(m\) (\(1 \le m < |S|\)) и считается, что \(f(S) = -f(S[1, m]) + f(S[m + 1, |S|])\), где \(S[l, r]\) — это подстрока \(S\) с \(l\)-й позиции до \(r\)-й включительно.
- Иначе \(S = c\), где \(c\) — какая-то буква. В таком случае \(f(S) = 2^{pos(c)}\), где \(pos(c)\) — это позиция буквы \(c\) в английском алфавите (\(pos(\)a\() = 0\), \(pos(\)z\() = 25\)).
Обратите внимание, что \(m\) выбирается независимо на каждом шаге. Друг уверен, что правильно выбирая \(m\) на каждом шаге, можно получить \(f(S) = T\). Прав ли он? Выходные данные Выведите «Yes», если можно получить требуемое значение, иначе выведите «No». Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Примечание Во втором примере нельзя получить \(-7\). Но можно получить, например, \(1\) следующим образом: - Сперва выбираем \(m = 1\), тогда \(f(\)abc\() = -f(\)a\() + f(\)bc\()\)
- \(f(\)a\() = 2^0 = 1\)
- \(f(\)bc\() = -f(\)b\() + f(\)c\() = -2^1 + 2^2 = 2\)
- Итого \(f(\)abc\() = -1 + 2 = 1\)
| |
|
|
G. Нет игры - нет жизни
битмаски
игры
математика
матрицы
*2700
Рассмотрим следующую игру Алисы и Боба на ориентированном ациклическом графе. Каждая вершина может содержать произвольное количество фишек. Алиса и Боб совершают ходы по очереди. Первой ходит Алиса. Ход состоит в том, чтобы передвинуть ровно одну фишку по какому-то ребру, исходящему из вершины, в которой сейчас лежит фишка, в конец этого ребра. Проигрывает тот, кто не может сделать ход. Оба играют оптимально. Рассмотрим следующий процесс, происходящий каждую секунду на данном графе с \(n\) вершинами: - Целое число \(v\) выбирается случайно и равновероятно из \([1, n + 1]\).
- Если \(v \leq n\), в \(v\)-ю вершину графа добавляется фишка, а процесс переходит к шагу 1.
- Если \(v = n + 1\), Алиса и Боб играют в описанную выше игру на данном графе с текущим расположением фишек, определяется победитель этой игры. После чего, процесс завершается.
Найдите вероятность победы Алисы. Можно показать, что ответ можно представить в виде \(\frac{P}{Q}\), где \(P\) и \(Q\) — взаимно простые целые числа, \(Q \not\equiv 0 \pmod{998\,244\,353}\). Выведите значение \(P \cdot Q^{-1} \bmod 998\,244\,353\). Выходные данные В единственной строке выведите вероятность победы Алисы по модулю \(998\,244\,353\).
| |
|
|
D. XOR-пушка
битмаски
Конструктив
Перебор
*2000
У Аркадия есть неубывающий массив натуральных чисел \(a_1, a_2, \ldots, a_n\). Вы завидуете ему и хотите уничтожить это свойство. У вас есть так называемая XOR-пушка, которую вы можете использовать один или несколько раз. За один шаг вы можете выбрать два последовательных элемента в массиве, обозначим их за \(x\) и \(y\), удалить их из массива и на их место вставить число \(x \oplus y\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Обратите внимание, что длина массива уменьшается на один в результате этой операции. Вы не можете выполнить эту операцию, если длина массива стала единицей. Например, если массив равен \([2, 5, 6, 8]\), то вы можете выбрать \(5\) и \(6\) и заменить их на \(5 \oplus 6 = 3\). Массив становится равен \([2, 3, 8]\). Вы хотите, чтобы массив перестал быть неубывающим. Какое минимальное количество шагов вам для этого потребуется? Если массив остается неубывающим независимо от того, какие операции вы делаете, выведите \(-1\). Выходные данные Выведите одно целое число — минимальное необходимое число шагов. Если решения не существует, выведите \(-1\). Примечание В первом примере можно выбрать \(2\) и \(5\), и массив станет равным \([7, 6, 8]\). Во втором примере можно получить только массивы \([1, 1]\), \([3, 3]\) и \([0]\), которые все являются неубывающими. В третьем примере можно выбрать \(1\) и \(2\) и массив станет равным \([3, 4, 6, 20]\). Затем вы можете, например, выбрать \(3\) и \(4\) и массив станет равным \([7, 6, 20]\). Этот массив не является неубывающим.
| |
|
|
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]\). В нем нет ни одной инверсии.
| |
|
|
B. Камень и рычаг
битмаски
математика
*1200
«Плотину надо поднять. Рычагом. Я его дам.Канал нужно завалить. Камнем. Камень я не дам.» Данику срочно нужны рычаг и камень! Естественно, проще всего достать их у Ящера-Отшельника. Ящер дал Данику рычаг просто так, а вот для того, чтобы получить камень, Даник должен был решить следующую задачу: Дано целое положительное число \(n\), а также массив \(a\), содержащий целые положительные числа. Необходимо найти количество пар индексов \((i,j)\) таких, что \(i<j\) и \(a_i\) \(\&\) \(a_j \ge a_i \oplus a_j\), где \(\&\) обозначает операцию побитового И, в то время как \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Даник решил эту задачу. А сможете ли вы? Выходные данные Для каждого набора входных данных выведите одно целое неотрицательное число — ответ на задачу. Примечание В первом наборе входных данных подходит только одна пара чисел: \((4,7)\): для нее \(4\) \(\&\) \(7 = 4\), а \(4 \oplus 7 = 3\). Во втором наборе входных данных подходит любая пара чисел. В третьем наборе входных данных подходят две пары чисел: \((6,5)\) и \((2,3)\). В четвертом наборе входных данных нет подходящих пар.
| |
|
|
A. Ксорим
битмаски
жадные алгоритмы
математика
*800
Чтобы отпраздновать 5-ю годовщину Twice, Тзуйю и Сана решили поиграть в игру. Тзуйю подарила Сане два целых числа \(a\) и \(b\) и очень важный квест. Чтобы завершить квест, Сана должна вывести наименьшее возможное значение (\(a \oplus x\)) + (\(b \oplus x\)) по всем \(x\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Выходные данные Для каждого набора входных данных выведите наименьшее возможное значение данного выражения. Примечание Для первого набора входных данных Сана может выбрать \(x=4\), и значение будет (\(6 \oplus 4\)) + (\(12 \oplus 4\)) = \(2 + 8\) = \(10\). Можно показать, что это значение минимально возможное.
| |
|
|
I. Lookup Tables
битмаски
*3000
John has \(Q\) closed intervals of consecutive \(2K\)-bit numbers \([l_i, r_i]\) and one 16-bit value \(v_i\) for each interval. (\(0 \leq i < Q\)) John wants to implement a function F that maps \(2K\)-bit numbers to 16-bit numbers in such a way that inputs from each interval are mapped to that interval's value. In other words: \(\)F(x) = v_i, \; \textrm{for every } 0 \leq i < Q \; \textrm{, and every } x \in [l_i, r_i]\(\) The output of F for other inputs is unimportant. John wants to make his implementation of F fast so he has decided to use lookup tables. A single \(2K\)-bit lookup table would be too large to fit in memory, so instead John plans to use two K-bit lookup tables, LSBTable and MSBTable. His implementation will look like this: \(\) F(x) = \textrm{LSBTable}[\textrm{lowKBits}(x)] \; \& \; \textrm{MSBTable}[\textrm{highKBits}(x)]\(\) In other words it returns the "bitwise and" of results of looking up the K least significant bits in LSBTable and the K most significant bits in MSBTable. John needs your help. Given \(K\), \(Q\) and \(Q\) intervals \([l_i, r_i]\) and values \(v_i\), find any two lookup tables which can implement F or report that such tables don't exist. Output On the first line output "possible" (without quotes) if two tables satisfying the conditions exist, or "impossible" (without quotes) if they don't exist. If a solution exists, in the next \(2 \cdot 2^K\) lines your program should output all values of the two lookup tables (LSBTable and MSBTable) it found. When there are multiple pairs of tables satisfying the conditions, your program may output any such pair. On lines \(1 + i\) output \(\textrm{LSBTable}[i]\). (\(0 \leq i < 2^K\), \(0 \leq \textrm{LSBTable}[i] < 2^{16}\)). On lines \(1 + 2^K + i\) output \(\textrm{MSBTable}[i]\). (\(0 \leq i < 2^K\), \(0 \leq \textrm{MSBTable}[i] < 2^{16}\)). Note A closed interval \([a, b]\) includes both a and b. In the first sample, tables \(\textrm{LSBTable} = [1,3]\) and \(\textrm{MSBTable} = [1,3]\) satisfy the conditions: \(F[0] = \textrm{LSBTable}[0] \& \textrm{MSBTable}[0] = 1 \& 1 = 1\), \(F[1] = \textrm{LSBTable}[1] \& \textrm{MSBTable}[0] = 3 \& 1 = 1\), \(F[2] = \textrm{LSBTable}[0] \& \textrm{MSBTable}[1] = 1 \& 3 = 1\), \(F[3] = \textrm{LSBTable}[1] \& \textrm{MSBTable}[1] = 3 \& 3 = 3\). In the second sample, tables \(\textrm{LSBTable} = [3,3,2,2]\) and \(\textrm{MSBTable} = [0,3,0,1]\) satisfy all the conditions. In the third sample there are no two lookup tables which can satisfy the conditions.
| |
|
|
J. Bubble Cup hypothesis
битмаски
дп
Конструктив
математика
*2400
The Bubble Cup hypothesis stood unsolved for \(130\) years. Who ever proves the hypothesis will be regarded as one of the greatest mathematicians of our time! A famous mathematician Jerry Mao managed to reduce the hypothesis to this problem: Given a number \(m\), how many polynomials \(P\) with coefficients in set \({\{0,1,2,3,4,5,6,7\}}\) have: \(P(2)=m\)? Help Jerry Mao solve the long standing problem! Output For each test case \(i\), print the answer on separate lines: number of polynomials \(P\) as described in statement such that \(P(2)=m_i\), modulo \(10^9 + 7\). Note In first case, for \(m=2\), polynomials that satisfy the constraint are \(x\) and \(2\). In second case, for \(m=4\), polynomials that satisfy the constraint are \(x^2\), \(x + 2\), \(2x\) and \(4\).
| |
|
|
E. Ксумма
битмаски
Конструктив
математика
матрицы
теория чисел
*2500
У вас есть доска и изначально на ней написано только одно нечетное число \(x\). Ваша цель — написать на доске число \(1\). Вы можете писать новые числа на доску, используя две следующие операции. - Вы можете взять два числа (не обязательно разные), которые уже написаны на доске, и написать их сумму на доске. Два выбранных вами числа остаются на доске.
- Вы можете взять два числа (не обязательно разные), которые уже написаны на доске, и записать их побитовое исключающее ИЛИ (XOR) на доске. Два выбранных вами числа остаются на доске.
Выполните последовательность операций так, чтобы в конце число \(1\) находилось на доске. Выходные данные В первой строке выведите \(q\) — число выполняемых операций. Затем должны следовать \(q\) строк, каждая из которых описывает одну операцию. - Операция "сумма" описывается строкой "\(a\) + \(b\)", где \(a, b\) должны быть целыми числами, уже присутствующими на доске.
- Операция "'xor" описывается строкой "\(a\) ^\(b\)", где \(a, b\) должны быть целыми числами, уже присутствующими на доске.
Символ операции (+ или ^) должен быть отделен от \(a, b\) пробелами.Вы можете выполнить не более \(100,000\) операций (т.е. \(q\le 100,000\)), а все числа, записанные на доске, должны быть в диапазоне \([0, 5\cdot10^{18}]\). Можно доказать, что при таких ограничениях требуемая последовательность операций существует. Вы можете вывести любую подходящую последовательность операций.
| |
|
|
G. Очередное взвешивание графа
битмаски
графы
дп
математика
поиск в глубину и подобное
Потоки
*2600
Дан ориентированный ацикличный граф (ориентированный граф, не содержащий циклов) из \(n\) вершин и \(m\) дуг. \(i\)-я дуга ведет из вершины \(x_i\) в вершину \(y_i\) и имеет вес \(w_i\). Ваша задача — для каждой вершины \(v\) выбрать некоторое целое число \(a_v\), после чего на каждой дуге \(i\) записать такое число \(b_i\), что \(b_i = a_{x_i} - a_{y_i}\). Вы должны выбрать числа таким образом, чтобы: - все \(b_i\) были положительны;
- значение выражения \(\sum \limits_{i = 1}^{m} w_i b_i\) было минимально возможным.
Можно показать, что для любого ориентированного ацикличного графа с неотрицательными \(w_i\) такой способ выбрать числа существует. Выходные данные Выведите \(n\) целых чисел \(a_1\), \(a_2\), ..., \(a_n\) (\(0 \le a_v \le 10^9\)), которые необходимо записать на вершинах, чтобы все \(b_i\) были положительны, и значение выражения \(\sum \limits_{i = 1}^{m} w_i b_i\) было минимально возможным. Если ответов несколько — выведите любой. Можно показать, что ответ всегда существует, и хотя бы один из оптимальных ответов удовлетворяет ограничениям \(0 \le a_v \le 10^9\).
| |
|
|
D. Влиятельная Ксения
битмаски
Конструктив
математика
*2200
У Ксении есть массив \(a\), состоящий из \(n\) положительных целых чисел \(a_1, a_2, \ldots, a_n\). За одну операцию она может сделать следующее: - выбрать три различных индекса \(i\), \(j\), \(k\), а затем
- одновременно изменить каждое из \(a_i, a_j, a_k\) на \(a_i \oplus a_j \oplus a_k\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ.
Ксения хочет сделать все \(a_i\) равными за не более чем \(n\) операций или определить, что это невозможно. Она не стала бы просить вас о помощи, но, пожалуйста, помогите ей! Выходные данные В первой строке выведите YES или NO в зависимости от того, можно ли сделать все элементы равными за не более чем \(n\) операций. Если это возможно, выведите целое число \(m\) (\(0 \leq m \leq n\)), которое обозначает количество выполняемых операций. В каждой из следующих \(m\) строк выведите три различных целых числа \(i, j, k\), представляющих собой одну операцию. Если таких последовательностей операций много, то выведите любую. Обратите внимание, что вы не должны минимизировать количество операций. Примечание В первом примере массив становится равным \([4 \oplus 1 \oplus 7, 2, 4 \oplus 1 \oplus 7, 4 \oplus 1 \oplus 7, 2] = [2, 2, 2, 2, 2]\).
| |
|
|
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)\).
| |
|
|
E. Поступи нечестно и выиграй
битмаски
Деревья
игры
Структуры данных
*3500
Рассмотрим таблицу \((10^9+1) \times (10^9+1)\). Строки пронумерованы целыми числами от \(0\) до \(10^9\), и столбцы пронумерованы целыми числами от \(0\) до \(10^9\). Обозначим за \((x, y)\) клетку, расположенную в строке \(x\) в столбце \(y\). Давайте назовем клетку \((x, y)\) хорошей, если \(x \& y = 0\), где \(\&\) — это операция побитового И. Давайте построим граф, вершинами которого будут все хорошие клетки и проведем ребра между всеми парами соседних по стороне хороших клеток. Можно доказать, что этот граф является деревом — связным графом без циклов. Давайте подвесим это дерево за вершину \((0, 0)\), таким образом мы получим корневое дерево с корнем \((0, 0)\). Два игрока играют в игру. Изначально некоторые хорошие клетки черные, а остальные белые. Каждый игрок на своем ходе выбирает черную хорошую клетку и подмножество ее предков (возможно пустое) и инвертирует их цвета (с белого на черный и наоборот). Игрок, который не может сделать ход (потому что все хорошие клетки белые), проигрывает. Можно доказать, что эта игра конечна. Изначально все клетки белые. Вам дано \(m\) пар клеток. Для каждой пары клеток все клетки на простом пути между клетками в паре красятся в черный цвет. Обратите внимание, что эти цвета не инвертируются, а мы красим клетки в черный цвет. Sohrab и Mashtali собираются сыграть в эту игру. Sohrab будет первым игроком, а Mashtali вторым. Mashtali хочет победить и решил поступить нечестно. Он может сделать следующую операцию несколько раз перед тем как игра начнется: выбрать клетку и инвертировать цвета всех вершин на пути между ней и корнем дерева. Mammad, который наблюдает за ними, задался вопросом: «какое минимальное количество операций должен сделать Mashtali, чтобы иметь выигрышную стратегию?». Найдите ответ на этот вопрос для изначальной конфигурации цветов вершин дерева. Можно доказать, что хотя бы один способ поступить нечестно существует. Выходные данные Выведите единственное целое число — минимальное количество нечестных операций, которое второй игрок может сделать чтобы победить. Примечание В первом тесте вы можете сделать одну нечестную операцию с корнем дерева. После этого, второй игрок может победить, потому что он может использовать симметричную стратегию. Во втором тесте вы можете сделать нечестные операции в клетками \((0, 2), (0, 0), (3, 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\) вы попробуете добавить ребро между ними дважды. Тем не менее вы добавите это ребро только один раз.
| |
|
|
G. Коммунизм
битмаски
Деревья
дп
*3500
Обратите внимание на нестандартное ограничение по памяти в этой задаче. В параллельной вселенной сатану звали «Trygub». По этой причине символы из его имени были удалены из алфавита еще в древние времена. В правительстве есть \(n\) работников, стоящих в ряд и пронумерованных целыми числами от \(1\) до \(n\) слева направо. Категории их работы могут быть описаны строкой \(s\) длины \(n\), в которой символ \(s_i\) обозначает категорию работы \(i\)-о работника. Новый закон был принят для того, чтобы увеличить равенство между всеми работниками. Правительство решило сделать так, чтобы все работники имели одинаковую категорию работы, делая следующую операцию любое количество раз (возможно ноль). Есть зафиксированный рациональный параметр \(k=\frac ab\), обозначающий то, насколько просто убедить общественность. Он будет использоваться для того, чтобы определить успешность операции. За одну операцию правительство сначала выбирает категорию работы \(x\), такую что существует хотя бы один работник этой категории в текущий момент. Обозначим за \(i_1,\ldots, i_m\) (\(i_1<\ldots<i_m\)) позиции всех работников с категорией работы \(x\). Если \(k\cdot (i_m-i_1+1)\le m\), то правительство может выбрать любую категорию работы \(y\), для которой существует хотя бы один работник этой категории в текущий момент и поменять категорию всех работников с категорией работы \(x\) на \(y\). Если можно сделать так, чтобы все работники имели категорию работы \(x\), мы называем категорию работы \(x\) достижимой. Можете ли вы сказать правительству множество достижимых категорий работы? Выходные данные Выведите целое число \(c\), равное количеству достижимых категорий работы и затем \(c\) символов, разделенных пробелами — достижимые категории работы в лексикографическом порядке. Примечание Первая операция обязана выбрать категорию работы 'i', потому что все другие категории работы не удовлетворяют условию. Поэтому 'i' не будет достижимой. Ниже показано, как достичь 'c', 'm' и 'o'. Квадратные скобки обозначают отрезок, содержащий всех работников выбранной категории. Красный цвет выделяет эту категорию, синий цвет выделяет новую категорию после операции. - Получение 'c':
- (\(\texttt{com}\color{red}{\texttt{[i]}}\texttt{com} \rightarrow \texttt{com}\color{#1E90FF}{\texttt{[o]}}\texttt{com}\))
- (\(\texttt{c}\color{red}{\texttt{[o}}\texttt{m}\color{red}{\texttt{o}}\texttt{c}\color{red}{\texttt{o]}}\texttt{m} \rightarrow \texttt{c}\color{#1E90FF}{\texttt{[m}}\texttt{m}\color{#1E90FF}{\texttt{m}}\texttt{c}\color{#1E90FF}{\texttt{m]}}\texttt{m}\))
- (\(\texttt{c}\color{red}{\texttt{[mmm}}\texttt{c}\color{red}{\texttt{mm]}} \rightarrow \texttt{c}\color{#1E90FF}{\texttt{[ccc}}\texttt{c}\color{#1E90FF}{\texttt{cc]}}\))
- Получение 'm':
- (\(\texttt{com}\color{red}{\texttt{[i]}}\texttt{com} \rightarrow \texttt{com}\color{#1E90FF}{\texttt{[o]}}\texttt{com}\))
- (\(\texttt{c}\color{red}{\texttt{[o}}\texttt{m}\color{red}{\texttt{o}}\texttt{c}\color{red}{\texttt{o]}}\texttt{m} \rightarrow \texttt{c}\color{#1E90FF}{\texttt{[c}}\texttt{m}\color{#1E90FF}{\texttt{c}}\texttt{c}\color{#1E90FF}{\texttt{c]}}\texttt{m}\))
- (\(\color{red}{\texttt{[cc}}\texttt{m}\color{red}{\texttt{ccc]}}\texttt{m} \rightarrow \color{#1E90FF}{\texttt{[mm}}\texttt{m}\color{#1E90FF}{\texttt{mmm]}}\texttt{m}\))
- Получение 'o':
- (\(\texttt{com}\color{red}{\texttt{[i]}}\texttt{com} \rightarrow \texttt{com}\color{#1E90FF}{\texttt{[c]}}\texttt{com}\))
- (\(\color{red}{\texttt{[c}}\texttt{om}\color{red}{\texttt{cc]}}\texttt{om} \rightarrow \color{#1E90FF}{\texttt{[m}}\texttt{om}\color{#1E90FF}{\texttt{mm]}}\texttt{om}\))
- (\(\color{red}{\texttt{[m}}\texttt{o}\color{red}{\texttt{mmm}}\texttt{o}\color{red}{\texttt{m]}} \rightarrow \color{#1E90FF}{\texttt{[o}}\texttt{o}\color{#1E90FF}{\texttt{ooo}}\texttt{o}\color{#1E90FF}{\texttt{o]}}\))
| |
|
|
E1. Битовые запросы (упрощенная версия)
битмаски
интерактив
Конструктив
математика
*2000
Это упрощенная версия задачи. Две версии отличаются ограничением на число запросов. Вы можете взламывать по этой задаче только если обе версии решены. Это интерактивная задача. У Ridbit есть массив \(a\) из \(n\) целых хочет, и он хочет, чтобы Ashish его отгадал. \(n\) является степенью двойки. Ashish может спрашивать запросы трех видов. Они могут быть вида - AND \(i\) \(j\) — узнать побитовое И элементов \(a_i\) и \(a_j\) \((1 \leq i, j \le n\), \(i \neq j)\)
- OR \(i\) \(j\) — узнать побитовое ИЛИ элементов \(a_i\) и \(a_j\) \((1 \leq i, j \le n\), \(i \neq j)\)
- XOR \(i\) \(j\) — узнать побитовое исключающее ИЛИ элементов \(a_i\) и \(a_j\) \((1 \leq i, j \le n\), \(i \neq j)\)
Можете ли вы помочь Ashish определить элементы массива? В этой версии, каждый элемент имеет значение из отрезка \([0, n-1]\) (включительно) и Ashish может спросить не более \(n+2\) запросов. Протокол взаимодействия Чтобы сделать запрос, выведите одну из следующих строк (без кавычек): - «AND i j»;
- «OR i j»;
- «XOR i j»;
где \(i\) и \(j\) \((1 \leq i, j \le n\), \(i \neq j)\) обозначают индексы запроса. На каждый запрос вы получите в ответ одно целое число \(x\), которое означает значение ответа на ваш вопрос. Если ваш запрос некорректный, вы получите в ответ \(x = -1\). В таком случае вам требуется закончить выполнение программы. Когда вы угадали элементы массива, вам требуется вывести одну строку, содержащую «!» (без кавычек), после чего должны идти \(n\) разделенных пробелами целых чисел — элементы массива. Отгадывание массива не считается в числе сделанных запросов. Интерактор не является адаптивным. Массив \(a\) не меняется с запросами. После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Взломы Чтобы взломать решение, используйте следующий формат. В первой строке выведите одно целое число \(n\) \((4 \le n \le 2^{16})\) — длину массива. Она должна быть степенью двойки. В следующий строке должны быть записаны \(n\) разделенных пробелами целых чисел из отрезка \([0, n-1]\) — массив \(a\). Примечание Массив \(a\) в первом примере это \([0, 0, 2, 3]\).
| |
|
|
E2. Битовые запросы (усложенная версия)
битмаски
интерактив
Конструктив
математика
*2300
Это усложненная версия задачи. Две версии отличаются ограничением на число запросов. Вы можете взламывать по этой задаче только если обе версии решены. Это интерактивная задача. У Ridbit есть массив \(a\) из \(n\) целых хочет, и он хочет, чтобы Ashish его отгадал. \(n\) является степенью двойки. Ashish может спрашивать запросы трех видов. Они могут быть вида - AND \(i\) \(j\) — узнать побитовое И элементов \(a_i\) и \(a_j\) \((1 \leq i, j \le n\), \(i \neq j)\)
- OR \(i\) \(j\) — узнать побитовое ИЛИ элементов \(a_i\) и \(a_j\) \((1 \leq i, j \le n\), \(i \neq j)\)
- XOR \(i\) \(j\) — узнать побитовое исключающее ИЛИ элементов \(a_i\) и \(a_j\) \((1 \leq i, j \le n\), \(i \neq j)\)
Можете ли вы помочь Ashish определить элементы массива? В этой версии, каждый элемент имеет значение из отрезка \([0, n-1]\) (включительно) и Ashish может спросить не более \(n+1\) запросов. Протокол взаимодействия Чтобы сделать запрос, выведите одну из следующих строк (без кавычек): - «AND i j»;
- «OR i j»;
- «XOR i j»;
где \(i\) и \(j\) \((1 \leq i, j \le n\), \(i \neq j)\) обозначают индексы запроса. На каждый запрос вы получите в ответ одно целое число \(x\), которое означает значение ответа на ваш вопрос. Если ваш запрос некорректный, вы получите в ответ \(x = -1\). В таком случае вам требуется закончить выполнение программы. Когда вы угадали элементы массива, вам требуется вывести одну строку, содержащую «!» (без кавычек), после чего должны идти \(n\) разделенных пробелами целых чисел — элементы массива. Отгадывание массива не считается в числе сделанных запросов. Интерактор не является адаптивным. Массив \(a\) не меняется с запросами. После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Взломы Чтобы взломать решение, используйте следующий формат. В первой строке выведите одно целое число \(n\) \((4 \le n \le 2^{16})\) — длину массива. Она должна быть степенью двойки. В следующий строке должны быть записаны \(n\) разделенных пробелами целых чисел из отрезка \([0, n-1]\) — массив \(a\). Примечание Массив \(a\) в первом примере это \([0, 0, 2, 3]\).
| |
|
|
B. Найти массив
битмаски
жадные алгоритмы
Конструктив
*1400
Вам дан массив \([a_1, a_2, \dots, a_n]\) такой, что \(1 \le a_i \le 10^9\). Пусть \(S\) – сумма всех элементов массива \(a\). Назовем массив \(b\), состоящий из \(n\) целых чисел красивым, если: - \(1 \le b_i \le 10^9\) для всех \(i\) от \(1\) до \(n\);
- для каждой пары соседних целых чисел из массива \((b_i, b_{i + 1})\), либо \(b_i\) делит \(b_{i + 1}\), либо \(b_{i + 1}\) делит \(b_i\) (или оба числа делятся друг на друга);
- \(2 \sum \limits_{i = 1}^{n} |a_i - b_i| \le S\).
Ваша задача — найти красивый массив. Можно показать, что по крайней мере один красивый массив всегда существует. Выходные данные Для каждого набора входных данных выведите красивый массив \(b_1, b_2, \dots, b_n\) (\(1 \le b_i \le 10^9\)) на отдельной строке. Можно показать, что существует по крайней мере один красивый массив. Если ответов несколько, выведите любой из них.
| |
|
|
F. Максимальное правильное множество
битмаски
дп
математика
*3100
Назовем множество положительных целых чисел \(S\) правильным, если выполняются следующие два условия: - \(S \subseteq \{1, 2, \dots, n\}\);
- если \(a \in S\) и \(b \in S\), то \(|a-b| \neq x\) и \(|a-b| \neq y\).
Для заданных значений \(n\), \(x\) и \(y\) вам необходимо найти размер максимального правильного множества. Выходные данные Выведите одно целое число — размер максимального правильного множества.
| |
|
|
E. Аполлон против Пана
битмаски
математика
Перебор
*1800
Немногие знают, что Пан и Аполлон боролись не только за звание лучшего музыканта всех времен. Несколько тысячелетий спустя они также бросили друг другу вызов в математике (или скорее в быстрых вычислениях). Им предстояло решить следующую задачу: Рассмотрим \(x_1, x_2, \ldots, x_n\) — последовательность из \(n\) неотрицательных целых чисел. Вычислите следующее значение: \(\)\sum_{i=1}^n \sum_{j=1}^n \sum_{k=1}^n (x_i \, \& \, x_j) \cdot (x_j \, | \, x_k)\(\) Здесь \(\&\) обозначает побитовый И, а \(|\) обозначает побитовый ИЛИ. Пан и Аполлон смогли решить эту задачу за несколько секунд. А вы сможете? Для удобства, вычислите ответ по модулю \(10^9 + 7\). Выходные данные Выведите \(t\) строк, \(i\)-я должна содержать ответ на \(i\)-й набор входных данных.
| |
|
|
F. Кошмар Евклида
битмаски
графы
жадные алгоритмы
математика
поиск в глубину и подобное
снм
сортировки
*2100
Вы должно быть знаете, что Евклид был математиком. Ну, как оказалось, Морфей об этом тоже знал. Поэтому, когда он захотел разыграть Евклида, он послал ему соответствующий кошмар. В своем плохом сне, у Евклида был набор \(S\) из \(n\) \(m\)-мерных векторов над полем \(\mathbb{Z}_2\), и он мог их складывать. Другими словами, у него были вектора с \(m\) координатами, каждая координата равнялась либо \(0\), либо \(1\). Сложение векторов определяется следующим образом: пусть \(u+v = w\), тогда \(w_i = (u_i + v_i) \bmod 2\). Евклид может сложить любое подмножество векторов из \(S\) и сохранить получившийся \(m\)-мерный вектор над \(\mathbb{Z}_2\). В частности, он может сложить пустое подмножество векторов. В таком случае, все координаты получившегося вектора будут равны \(0\). Пусть \(T\) будет множеством всех векторов, которые могут быть получены как сумма некоторого подмножества векторов из \(S\). Теперь Евклид интересуется, каков размер \(T\), и может ли он использовать только какое-то подмножество \(S'\) множества \(S\), чтобы получить все вектора из \(T\). Как всегда и бывает в таких ситуациях, он не проснется до тех пор, пока не выяснит это. Пока что дела для философа обстоят довольно мрачно. Однако, появилась надежда, когда он заметил, что все вектора из \(S\) содержат максимум \(2\) координаты, равные \(1\). Помогите Евклиду вычислить \(|T|\), количество \(m\)-мерных векторов над \(\mathbb{Z}_2\), которые могут быть получены как сумма какого-то подмножества векторов из \(S\). Так как оно может быть довольно велико, выведите его по модулю \(10^9+7\). Также, вы должны найти \(S'\), минимальное такое подмножество \(S\), что все вектора из \(T\) могут быть получены как как сумма какого-то подмножества векторов из \(S'\). В случае, если существует несколько таких подмножеств с минимальным количеством элементов, выведите лексикографически минимальный по индексам взятых элементов. Рассмотрим два множества \(A\) и \(B\), такие что \(|A| = |B|\). Пусть \(a_1, a_2, \dots a_{|A|}\) и \(b_1, b_2, \dots b_{|B|}\) будут возрастающие массивы индексов элементов, взятых в \(A\) и в \(B\), соответственно. \(A\) лексикографически меньше, чем \(B\), если существует такое \(i\), что \(a_j = b_j\) для всех \(j < i\) и \(a_i < b_i\). Выходные данные В первой строке выведите два целых числа: остаток от деления \(|T|\) на \(10^9+7\), и \(|S'|\). Во второй строке выведите \(|S'|\) целых чисел — индексы элементов, входящих в \(S'\), в возрастающем порядке. Элементы \(S\) нумеруются с \(1\) в порядке, в котором они даны во входных данных. Примечание В первом примере нам даны три вектора: Оказывается, что мы может представить все вектора из \(2\)-мерного пространства используя эти вектора: - \(00\), сумма пустого подмножества векторов;
- \(01 = 11 + 10\), сумма первого и третьего векторов;
- \(10 = 10\), просто первый вектор;
- \(11 = 10 + 01\), сумма первого и второго векторов.
Поэтому, \(T = \{00, 01, 10, 11\}\). Мы можем выбрать любые два из трех векторов \(S\), и все еще будем способны получить все вектора из \(T\). В таком случае, мы выберем два первых вектора. Так как мы не можем получить все вектора из \(T\), используя только один вектор из \(S\), \(|S'| = 2\) и \(S' = \{10, 01\}\) (индексы \(1\) и \(2\)), как множество \(\{1, 2 \}\) — лексикографически минимально. Мы можем получить все вектора из \(T\), используя только вектора из \(S'\), как показано ниже: - \(00\), сумма пустого подмножества;
- \(01 = 01\), просто второй вектор;
- \(10 = 10\), просто первый вектор;
- \(11 = 10 + 01\), сумма первого и второго вектора.
| |
|
|
E. Немного похожи
битмаски
Перебор
Строки
строковые суфф. структуры
хэши
*2400
Назовем две строки \(a\) и \(b\) (обе длиной \(k\)) немного похожими, если они имеют один и тот же символ в некоторой позиции, то есть существует по крайней мере одно \(i \in [1, k]\) такое, что \(a_i = b_i\). Задана двоичная строка \(s\) длины \(n\) (строка из \(n\) символов 0 и/или 1) и целое число \(k\). Обозначим строку \(s[i..j]\) как подстроку \(s\), начинающуюся с \(i\)-го символа и заканчивающуюся \(j\)-м символом (то есть \(s[i..j] = s_i s_{i + 1} s_{i + 2} \dots s_{j - 1} s_j\)). Назовем двоичную строку \(t\) длины \(k\) красивой, если она немного похожа на все подстроки \(s\), имеющие длину ровно \(k\); то есть она немного похожа на \(s[1..k], s[2..k+1], \dots, s[n-k+1..n]\). Ваша задача — найти лексикографически наименьшую строку \(t\), которая является красивой, или сообщить, что такой строки не существует. Строка \(x\) лексикографически меньше строки \(y\), если \(x\) является префиксом \(y\) (и \(x \ne y\)), либо существует такое \(i\) (\(1 \le i \le \min(|x|, |y|)\)), что \(x_i < y_i\), и для любого \(j\) (\(1 \le j < i\)) \(x_j = y_j\). Выходные данные Для каждого набора входных данных выведите ответ следующим образом: - если невозможно построить красивую строку, выведите одну строку, содержащую слово NO (Примечание: именно в верхнем регистре, например, нельзя выводить No);
- в противном случае выведите две строки. Первая строка должна содержать слово YES (именно в верхнем регистре); вторая строка — лексикографически наименьшая красивая строка, состоящая из \(k\) символов 0 и/или 1.
| |
|
|
B. Странное определение
битмаски
графы
математика
теория чисел
хэши
*1900
Назовём два числа \(x\) и \(y\) смежными, если \(\frac{lcm(x, y)}{gcd(x, y)}\) — полный квадрат. К примеру, \(3\) и \(12\) являются смежными, а \(6\) и \(9\) — нет. Здесь \(gcd(x, y)\) обозначает наибольший общий делитель (НОД) чисел \(x\) и \(y\), а \(lcm(x, y)\) обозначает наименьшее общее кратное (НОК) чисел \(x\) и \(y\). У вас есть массив \(a\) размера \(n\), и каждую секунду происходит следующее: каждый элемент массива \(a_i\) заменяется на произведение всех смежных с ним чисел из массива (включая и сам элемент \(a_i\)). Пусть \(d_i\) — количество смежных с \(a_i\) чисел из массива (включая само число). Красота массива определяется как \(\max_{1 \le i \le n} d_i\). Вам даны \(q\) запросов, каждый из которых описывается числом \(w\). Для каждого запроса выведите красоту массива после \(w\) секунд. Выходные данные Для каждого запроса выведите одно число — красоту массива в соответствующий момент времени. Примечание В первом наборе входных данных исходный массив состоит из чисел \([6, 8, 4, 2]\). Элемент \(a_4=2\) в этом массиве является смежным с числами \(a_4=2\) (так как \(\frac{lcm(2, 2)}{gcd(2, 2)}=\frac{2}{2}=1=1^2\)) и \(a_2=8\) (так как \(\frac{lcm(8,2)}{gcd(8, 2)}=\frac{8}{2}=4=2^2\)). Таким образом, \(d_4=2\), и это максимальное значение \(d_i\) среди элементов данного массива. Во втором наборе входных данных исходный массив состоит из чисел \([12, 3, 20, 5, 80, 1]\). Элементы, смежные с \(12\), это \(\{12, 3\}\), смежные с \(3\) — \(\{12, 3\}\), смежные с \(20\) — \(\{20, 5, 80\}\), смежные с \(5\) — \(\{20, 5, 80\}\), смежные с \(80\) — \(\{20, 5, 80\}\), смежные с \(1\) — \(\{1\}\). Через одну секунду массив превращается в \([36, 36, 8000, 8000, 8000, 1]\).
| |
|
|
E. Сопоставление шаблонов
битмаски
графы
поиск в глубину и подобное
сортировки
Строки
Структуры данных
хэши
*2300
Вам даны \(n\) шаблонов \(p_1, p_2, \dots, p_n\) и \(m\) строк \(s_1, s_2, \dots, s_m\). Каждый шаблон \(p_i\) состоит из \(k\) символов, каждый из которых — это либо строчная латинская буква или символ подчеркивания. Все шаблоны попарно различны. Каждая строка \(s_j\) состоит из \(k\) строчных латинских букв. Строка \(a\) подходит под шаблон \(b\), если для каждого \(i\) от \(1\) до \(k\) либо \(b_i\) — это подчеркивание, либо \(b_i=a_i\). Вам требуется переупорядочить шаблоны таким образом, что первый шаблон, под который подходит \(j\)-я строка, — это \(p[mt_j]\). Разрешается не изменять порядок шаблонов. Можно ли осуществить такое переупорядочивание? Если можно, то выведите любой корректный порядок. Выходные данные Выведите «NO», если невозможно переупорядочить шаблоны так, чтобы первый шаблон, под который подходит \(j\)-я строка, был \(p[mt_j]\). В противном случае выведите «YES» в первой строке. Во второй строке выведите \(n\) различных целых чисел от \(1\) до \(n\) — порядок шаблонов. Если существует несколько ответов, выведите любой из них. Примечание Порядок шаблонов в первом примере после переупорядочивания: Тогда первая строка подходит под шаблоны ab__, _bcd, _b_d в таком порядке, первый из них равен ab__, который действительно \(p[4]\). Вторая строка подходит под шаблоны __b_ и ab__, первый из них __b_, который равен \(p[2]\). Последняя строка подходит под шаблоны _bcd и _b_d, первый из них _bcd, который равен \(p[5]\). Ответ на этот тест не единственный, другие корректные порядки существуют. Во втором примере cba не подходит под шаблон __c, а значит, корректного порядка не существует. В третьем примере в порядке (a_, _b) получается, что первый шаблон под который подходят обе строки — это \(1\), а в порядке (_b, a_) получается, что первый шаблон под который подходят обе строки — это \(2\). Значит, не существует такого порядка, что ответ равен \(1\) и \(2\).
| |
|
|
C. Непрерывный город
битмаски
Конструктив
*2500
Некоторое время назад Гомер жил в красивом городе. В нем есть \(n\) домов, пронумерованных от \(1\) до \(n\), а также \(m\) ориентированных дорог. Каждая дорога имеет положительную длину и всегда направлена от дома с меньшим индексом к дому с большим. Для каждых двух (разных) домов между ними есть максимум одна дорога. Гомер обнаружил, что для некоторых двух чисел \(L\) и \(R\) такой город может быть \((L, R)\)-непрерывным. Город называется \((L, R)\)-непрерывным, если выполняются два условия: - все пути от дома \(1\) до дома \(n\) имеют длину от \(L\) до \(R\) (включительно);
- для каждого целого \(L \leq d \leq R\) есть ровно один путь от дома \(1\) до дома \(n\) с длиной равной \(d\).
Путь от дома \(u\) к дому \(v\) — это последовательность \(u = x_0 \to x_1 \to x_2 \to \dots \to x_k = v\), где для каждого \(1 \leq i \leq k\) есть дорога от дома \(x_{i-1}\) к дому \(x_{i}\). Длина пути — это сумма длин всех дорог в пути. Два пути \(x_0 \to x_1 \to \dots \to x_k\) и \(y_0 \to y_1 \to \dots \to y_l\) считаются различными, если \(k \neq l\), или \(x_i \neq y_i\) для какого-то \(0 \leq i \leq \min\{k, l\}\). Переехав в другой город, Гомер запомнил только числа \(L\) и \(R\), но забыл число домов \(n\), число дорог \(m\), а также то, как дома соединены дорогами. Однако он считает, что количество домов должно быть не больше \(32\) (потому что город маленький). Как лучший друг Гомера, пожалуйста, скажите ему, может ли существовать \((L, R)\)-непрерывный город, или нет. Выходные данные Если невозможно найти \((L, R)\)-непрерывный город c не более \(32\) домами, выведите «NO». В противном случае в первой строке выведите «YES», а затем описание \((L, R)\)-непрерывного города. Вторая строка должна содержать два целых числа \(n\) (\(2 \leq n \leq 32\)) и \(m\) (\(1 \leq m \leq \frac {n(n-1)} 2\)), где \(n\) обозначает количество домов, а \(m\) — количество дорог. Затем должно следовать \(m\) строк. \(i\)-я из \(m\) строк должна содержать три целых числа \(a_i\), \(b_i\) (\(1 \leq a_i < b_i \leq n\)) и \(c_i\) (\(1 \leq c_i \leq 10^6\)), обозначающие направленную дорогу от дома \(a_i\) к дому \(b_i\) длиной \(c_i\). Требуется, чтобы для каждых двух домов было не более одной дороги, соединяющей их. Иначе говоря, для каждых \(1 \leq i < j \leq m\), либо \(a_i \neq a_j\), либо \(b_i \neq b_j\). Примечание В первом примере существует только один путь от дома \(1\) до дома \(n = 2\), а его длина составляет \(1\). Во втором примере есть три пути от дома \(1\) до дома \(n = 5\), а именно \(1 \to 2 \to 5\) длиной \(4\), \(1 \to 3 \to 5\) длиной \(5\), и \(1 \to 4 \to 5\) длиной \(6\).
| |
|
|
D. Странный источник минералов
Бинарный поиск
битмаски
Деревья
Перебор
Структуры данных
Теория вероятностей
*2900
В стране Гомера есть \(n\) городов с номерами от \(1\) до \(n\), которые образуют дерево. Иначе говоря, между этими \(n\) городами есть \((n-1)\) неориентированных дорог, и с каждого города можно попасть в любой другой по этим дорогам. Страна Гомера — индустриальная страна, и каждый из \(n\) городов в ней содержит некоторый минеральный ресурс. Минеральный ресурс города \(i\) обозначен как \(a_i\). Гомеру даны планы страны на \(q\) следующих лет. План \(i\)-го года описывается четырьмя параметрами \(u_i, v_i, l_i\) и \(r_i\), и он должен найти любой такой минеральный ресурс \(c_i\) такой, что выполняются два условия: - минеральный ресурс \(c_i\) встречается нечетное количество раз между городами \(u_i\) и \(v_i\);
- \(l_i \leq c_i \leq r_i\).
Так как вы лучший друг Гомера, он просит вас о помощи. Для каждого плана найдите любой такой минерал \(c_i\) или скажите, что его нет. Выходные данные Выведите \(q\) строк, \(i\)-я из которых содержит целое число \(c_i\), такое, что - \(c_i = {-1}\), если нет такого минерального ресурса, который соответствовал бы требуемому условию; или
- \(c_i\) — это номер выбранного минерального ресурса в \(i\)-м году. Выбранный минеральный ресурс \(c_i\) должен удовлетворять условиям \(i\)-го года, описанным выше в условии задачи. Если есть несколько подходящих \(c_i\), вы можете вывести любой из них.
Примечание В первых трех запросах четыре города находятся между городом \(3\) и городом \(5\), а именно: город \(1\), город \(2\), город \(3\) и город \(5\). В них представлены минеральные ресурсы \(1\) (появляется в городах \(3\) и \(5\)), \(2\) (появляется в городе \(2\)) и \(3\) (появляется в городе \(1\)). Следует отметить, что - Первый запрос заключается только в том, чтобы проверить, появляется ли минеральный источник \(1\) нечетное количество раз между городом \(3\) и городом \(5\). Ответ — нет, потому что минеральный источник \(1\) появляется дважды (четное число раз) между городом \(3\) и городом \(5\).
- Второй и третий запросы одинаковы, но они могут выбирать разные минеральные ресурсы. Вы можете выбрать любой из \(2\) и \(3\).
| |
|
|
D. Хранительница Бесконечного Зоопарка
битмаски
дп
жадные алгоритмы
Конструктив
математика
*1800
В Сингапурском зоопарке появилась новая достопримечательность: Бесконечный Зоопарк. Бесконечный Зоопарк может быть представлен графом с бесконечным числом вершин, обозначенных \(1,2,3,\ldots\). От вершины \(u\) до вершины \(u+v\) существует ориентированное ребро, если и только если \(u\&v=v\), где \(\&\) обозначает операцию побитового И. Других ребер в графе нет. Хранительница Зоопарка получила \(q\) запросов. В \(i\)-м запросе она спросит вас, может ли она добраться от вершины \(u_i\) до вершины \(v_i\) по ориентированным ребрам. Выходные данные Для \(i\)-го из \(q\) запросов выведите «YES» в единственной строке, если Хранительница Зоопарка может добраться от вершины \(u_i\) до вершины \(v_i\). В противном случае выведите «NO». Ответ можно вывести в любом регистре. Например, если ответ «YES», то вывод «Yes» или «yeS» также будет считаться правильным ответом. Примечание Ниже показан подграф на вершинах \(1,2,3,4,5,6\).
| |
|
|
D. Ход гения
битмаски
жадные алгоритмы
Конструктив
математика
*1900
Вам заданы три целых числа \(a\), \(b\) и \(k\). Найдите два двоичных числа \(x\) и \(y\) (\(x \ge y\)) такие, что: - и \(x\), и \(y\) состоят из \(a\) нулей и \(b\) единиц (в двоичной системе счисления);
- \(x - y\) в двоичной системе содержит ровно \(k\) единиц.
В \(x\) и \(y\) ведущие нули запрещены.Выходные данные В первой строке выведите «Yes», если можно найти два подходящих числа или «No» в противном случае. В случае, если ответ существует, во второй строке выведите число \(x\) в двоичной системе счисления, а в третьей строке выведите число \(y\) также в двоичной системе счисления. Если возможных ответов несколько, то выведите любой. Примечание В первом примере \(x = 101000_2 = 2^5 + 2^3 = 40_{10}\), \(y = 100001_2 = 2^5 + 2^0 = 33_{10}\), \(40_{10} - 33_{10} = 7_{10} = 2^2 + 2^1 + 2^0 = 111_{2}\). Отсюда видно, что в \(x-y\) содержатся ровно \(3\) единицы. Во втором примере \(x = 10100_2 = 2^4 + 2^2 = 20_{10}\), \(y = 10010_2 = 2^4 + 2^1 = 18\), \(x - y = 20 - 18 = 2_{10} = 10_{2}\). Ровно одна единица. В третьем примере из условия можно показать, что ответа нет.
| |
|
|
E. Огромный XOR
битмаски
жадные алгоритмы
Конструктив
математика
Строки
*2600
Даны два целых числа \(l\) и \(r\) в двоичном представлении. Пусть \(g(x, y)\) равняется побитовому исключающему ИЛИ всех целых чисел от \(x\) до \(y\) включительно (т. е. \(x \oplus (x+1) \oplus \dots \oplus (y-1) \oplus y\)). Определим \(f(l, r)\) как максимум по всем значениям \(g(x, y)\) при \(l \le x \le y \le r\). Выведите \(f(l, r)\). Выходные данные В единственной строке выведите значение \(f(l, r)\) в двоичном представлении без лишних ведущих нулей для данных \(l\) и \(r\). Примечание В примере из условия \(l=19\), \(r=122\). \(f(x,y)\) максимально и равно \(127\), например, при \(x=27\), \(y=100\).
| |
|
|
F. Заколдованная матрица
битмаски
интерактив
теория чисел
*2600
Это интерактивная задача. Есть матрица \(a\) размера \(n \times m\) (\(n\) строк и \(m\) столбцов), вам известны только числа \(n\) и \(m\). Строки матрицы пронумерованы от \(1\) до \(n\) сверху вниз, а столбцы от \(1\) до \(m\) слева направо. Клетка матрицы на пересечении строки \(x\) и столбца \(y\) обозначается как \((x, y)\). Необходимо найти количество пар \((r, c)\) (\(1 \le r \le n\), \(1 \le c \le m\), \(r\) — делитель \(n\), \(c\) — делитель \(m\)) таких, что если разбить матрицу на прямоугольники \(r \times c\) (высотой \(r\) строк и шириной \(c\) столбцов, каждая клетка принадлежит ровно одному прямоугольнику), все эти прямоугольники будут попарно равны между собой. Вам доступны следующие запросы: - ? \(h\) \(w\) \(i_1\) \(j_1\) \(i_2\) \(j_2\) (\(1 \le h \le n\), \(1 \le w \le m\), \(1 \le i_1, i_2 \le n\), \(1 \le j_1, j_2 \le m\)) — узнать, равны ли непересекающиеся подпрямоугольники матрицы \(a\) высотой \(h\) строк и шириной \(w\) столбцов, левая верхняя клетка первого из которых — \((i_1, j_1)\); левая верхняя клетка второго подпрямоугольника — \((i_2, j_2)\). Подпрямоугольники пересекаются, если у них есть хотя бы одна общая клетка. Если подпрямоугольники в вашем запросе будут иметь некорректные координаты (например, выходить за границы матрицы) или пересекаться, ваше решение будет считаться неверным.
Вы можете сделать не более \( 3 \cdot \left \lfloor{ \log_2{(n+m)} } \right \rfloor\) запросов. Все элементы матрицы \(a\) зафиксированы до запуска вашей программы и не зависят от ваших запросов. Выходные данные Когда будете готовы, выведите строку, содержащую восклицательный знак («!») и затем ответ на задачу — количество подходящих пар \((r, c)\). После этого ваша программа должна завершиться. Протокол взаимодействия Чтобы сделать запрос, выведите строку вида «? \(h\) \(w\) \(i_1\) \(j_1\) \(i_2\) \(j_2\)», в которой целые числа — высота, ширина и координаты верхних левых углов непересекающихся прямоугольников, про которые вы хотите узнать, равны они или нет. После каждого запроса считайте одно целое число \(t\) (\(t\) равно \(0\) или \(1\)). Если заданные подпрямоугольники равны, \(t=1\), иначе \(t=0\). В случае, если ваш запрос имеет неверный формат, или вы сделали более \(3 \cdot \left \lfloor{ \log_2{(n+m)} } \right \rfloor\) запросов, вы получите вердикт «Неправильный ответ». После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Гарантируется, что матрица \(a\) зафиксирована и не будет меняться в процессе взаимодействия. Формат взломов Для взломов необходимо использовать следующий формат. В первой строке находятся два целых числа \(n\) и \(m\) (\(1 \le n, m \le 1000\)) — количество строк и столбцов в матрице соответственно. В каждой из следующих \(n\) строк находятся по \(m\) целых чисел — элементы матрицы \(a\). Все элементы матрицы должны являться целыми числами между \(1\) и \(n \cdot m\) включительно. Примечание В тесте из примера матрица \(a\) размера \(3 \times 4\) следующая: 1 2 1 2 3 3 3 3 2 1 2 1
| |
|
|
A. Строка ABC
битмаски
Перебор
реализация
*900
Задана строка \(a\), состоящая из \(n\) символов, \(n\) четно. Для каждого \(i\) от \(1\) до \(n\) \(a_i\) является одним из 'A', 'B' или 'C'. Правильной скобочной последовательностью называется скобочная последовательность, которую можно преобразовать в корректное арифметическое выражение путем вставок между ее символами символов '1' и '+'. Например, скобочные последовательности «()()», «(())» — правильные (полученные выражения: «(1)+(1)», «((1+1)+1)»), а «)(» и «(» — нет. Вы хотите найти такую строку \(b\), которая состоит из \(n\) символов, что: - \(b\) является правильной скобочной последовательностью;
- если для некоторых \(i\) и \(j\) (\(1 \le i, j \le n\)) \(a_i=a_j\), тогда \(b_i=b_j\).
Другими словами, вы хотите заменить все вхождения 'A' скобками одного типа, затем все вхождения 'B' скобками одного типа и все вхождения 'C' скобками одного типа. Ваша задача — определить, существует ли такая строка \(b\). Выходные данные Для каждого набора входных данных выведите «YES», если существует такая строка \(b\), что: - \(b\) является правильной скобочной последовательностью;
- если для некоторых \(i\) и \(j\) (\(1 \le i, j \le n\)) \(a_i=a_j\), тогда \(b_i=b_j\).
Иначе выведите «NO». Вы можете вывести каждую букву в любом регистре (например, YES, Yes, yes, yEs будут распознаны как положительный ответ). Примечание В первом наборе входных данных одна из возможных строк \(b\) равна «(())()». Во втором наборе входных данных одна из возможных строк \(b\) равна «()()».
| |
|
|
B. Берляндский кроссворд
битмаски
жадные алгоритмы
Перебор
реализация
*1400
Берляндский кроссворд — это головоломка, которая решается на квадратном поле, состоящим из \(n\) строк и \(n\) столбцов. Изначально все ячейки белые. Чтобы решить головоломку, нужно раскрасить некоторые ячейки на границах поля в черный цвет так, чтобы: - ровно \(U\) ячеек в верхнем ряду были черными;
- ровно \(R\) ячеек в правом столбце были черными;
- ровно \(D\) ячеек в нижнем ряду были черными;
- ровно \(L\) ячеек в левом столбце были черными.
Обратите внимание, что можно ничего не красить в черный и оставить все клетки белыми. Ваша задача — проверить, существует ли решение у заданной головоломки. Выходные данные На каждый набор входных данных выведите «YES», если решение существует, и «NO» в противном случае. Вы можете вывести каждую букву в любом регистре (например, YES, Yes, yes, yEs будут распознаны как положительный ответ). Примечание Возможные решения на наборы входных данных \(1\), \(2\) и \(4\):
| |
|
|
D. Гений
битмаски
графы
дп
теория чисел
*2500
Обратите внимание на нестандартное ограничение по памяти. Есть \(n\) задач, пронумерованных целыми числами от \(1\) до \(n\). У \(i\)-й задачи есть сложность \(c_i = 2^i\), тэг \(tag_i\) и счёт \(s_i\). После задачи с номером \(i\) можно решить задачу с номером \(j\) только в том случае, если \(\text{IQ} < |c_i - c_j|\) и \(tag_i \neq tag_j\). После этого \(\text{IQ}\) меняется и становится равным \(\text{IQ} = |c_i - c_j|\) и вы набираете \(|s_i - s_j|\) очков. Первой можно решить любую задачу. Задачи можно решать в любом порядке, каждую сколько угодно раз. Изначально \(\text{IQ} = 0\). Найдите максимальное количество очков, которое можно набрать. Выходные данные Для каждого набора входных данных выведите одно число — максимальное количество очков, которое можно набрать. Примечание В первом наборе входных данных оптимальная последовательность решения задач такая: - \(1 \rightarrow 2\), после этого суммарный счёт равен \(5\) и \(\text{IQ} = 2\)
- \(2 \rightarrow 3\), после этого суммарный счёт равен \(10\) и \(\text{IQ} = 4\)
- \(3 \rightarrow 1\), после этого суммарный счёт равен \(20\) и \(\text{IQ} = 6\)
- \(1 \rightarrow 4\), после этого суммарный счёт равен \(35\) и \(\text{IQ} = 14\)
Во втором наборе входных данных оптимальная последовательность решения задач такая: - \(1 \rightarrow 2\), после этого суммарный счёт равен \(5\) и \(\text{IQ} = 2\)
- \(2 \rightarrow 3\), после этого суммарный счёт равен \(10\) и \(\text{IQ} = 4\)
- \(3 \rightarrow 4\), после этого суммарный счёт равен \(15\) и \(\text{IQ} = 8\)
- \(4 \rightarrow 1\), после этого суммарный счёт равен \(35\) и \(\text{IQ} = 14\)
В третьем наборе входных данных оптимальная последовательность решения задач такая: - \(1 \rightarrow 3\), после этого суммарный счёт равен \(17\) и \(\text{IQ} = 6\)
- \(3 \rightarrow 4\), после этого суммарный счёт равен \(35\) и \(\text{IQ} = 8\)
- \(4 \rightarrow 2\), после этого суммарный счёт равен \(42\) и \(\text{IQ} = 12\)
| |
|
|
B. Коробка
Бинарный поиск
битмаски
жадные алгоритмы
Структуры данных
*1300
У вас есть \(n\) прямоугольников, каждый имеет высоту \(1\). Ширина каждого прямоугольника — степень числа \(2\) (т. е. ее можно представить как \(2^x\) для некоторого неотрицательного целого \(x\)). У вас также есть двумерная коробка ширины \(W\). Обратите внимание, что \(W\) может быть степенью числа \(2\), а может и не быть. Точно известно, что \(W\) не меньше ширины наибольшего прямоугольника. Вы должны выбрать высоту этой коробки так, чтобы в нее можно было поместить все прямоугольники (при этом высоту необходимо минимизировать). Разрешается укладывать прямоугольники так, чтобы они не занимали все пространство коробки. Прямоугольники нельзя вращать, кроме того, они не должны пересекаться после укладки (то есть для каждой пары прямоугольников, уложенных в коробку, их площадь пересечения должна быть нулевой). Посмотрите пояснение для того, чтобы увидеть визуализацию условия задачи. Выходные данные Выведите \(t\) целых чисел. \(i\)-е число должно быть равно ответу на \(i\)-й набор входных — минимальной высоте коробки. Примечание Первый набор входных данных в примере разобран на следующей картинке: На этой картинке число внутри каждого прямоугольника — это его ширина. Ширина коробки равна \(16\) (см. обозначения в нижней части картинки). Минимальная высота коробки равна \(2\) (см. обозначения в левой части картинки). Во втором наборе входных данных можно расположить на каждом уровне по одному прямоугольнику ширины 8 и ширины 2, так потребуется всего три уровня (и высота коробки будет равна 3).
| |
|
|
F. Рождественская игра
битмаски
Деревья
дп
игры
математика
поиск в глубину и подобное
Структуры данных
*2500
Алиса и Боб собираются отмечать Рождество, играя в игру с деревом подарков. Дерево состоит из \(n\) вершин (пронумерованных от \(1\) до \(n\), вершина \(r\) является корнем). На \(i\)-й вершине висят \(a_i\) подарков. Перед началом игры выбирается некоторое целое число \(k\). Затем игра проходит следующим образом: - Алиса начинает игру, затем ходы совершаются обоими игроками по очереди;
- на каждом ходу текущий игрок выбирает некоторую вершину (например, \(i\)), которая находится на глубине хотя бы \(k\). Затем игрок снимает некоторое положительное целое число подарков, которые висят на этой вершине, — назовем его \(m\) \((1 \le m \le a_i)\);
- затем игрок вешает эти \(m\) подарков на \(k\)-го предка (назовем его \(j\)) \(i\)-й вершины (\(k\)-м предком вершины \(i\) назовем такую вершину \(j\), что \(i\) — потомок \(j\), а глубина \(j\) ровно на \(k\) меньше глубины \(i\)). Теперь количество подарков на \(i\)-й вершине \((a_i)\) уменьшилось на \(m\), а \(a_j\), соответственно, увеличилось на \(m\);
- Алиса и Боб играют оптимально. Тот, кто не может совершить ход, проигрывает.
Для каждого возможного корня дерева сообщите, кто выиграет игру — Алиса или Боб. Глубина вершины \(i\) в дереве с корнем \(r\) определяется, как количество ребер на простом пути из вершины \(r\) до вершины \(i\). Глубина корня \(r\) равна нулю. Выходные данные Выведите \(n\) целых чисел, где \(i\)-е число равно \(1\), если Алиса выиграет игру, если дерево подвешено за вершину \(i\), и \(0\) в противном случае. Примечание Посчитаем ответ для примера с корнем в 1 и в 2. Корень 1 Алиса всегда выигрывает в данном случае. Возможная игра между Алисой и Бобом выглядит так: - Алиса перемещает один подарок из вершины 4 в вершину 3.
- Боб перемещает четыре подарка из вершины 5 в вершину 2.
- Алиса перемещает четыре подарка из вершины 2 в вершину 1.
- Боб перемещает три подарка из вершины 2 в вершину 1.
- Алиса перемещает три подарка из вершины 3 в вершину 1.
- Боб перемещает три подарка из вершины 4 в вершину 3.
- Алиса перемещает три подарка из вершины 3 в вершину 1.
Боб не может сделать ход, а потому проигрывает. Корень 2 Боб всегда выигрывает в данном случае. Пример игры: - Алиса перемещает четыре подарка из вершины 4 в вершину 3.
- Боб перемещает четыре подарка из вершины 5 в вершину 2.
- Алиса перемещает шесть подарков из вершины 3 в вершину 1.
- Боб перемещает шесть подарков из вершины 1 в вершину 2.
Алиса не может сделать ход, а потому проигрывает.
| |
|
|
C. Сортировка матрицы
битмаски
жадные алгоритмы
Конструктив
Перебор
*2600
Даны две таблицы \(A\) и \(B\) размера \(n \times m\). Назовём сортировкой по столбцу следующее действие: выбирается столбец, и все строки упорядочиваются по значению в этом столбце, от строк, содержащих меньшие значения, к строкам с большими. В случае, если две строки имеют одинаковое значение в этом столбце, их порядок не меняется (такие сортировки называются стабильными). Подобное поведение сортировки по столбцу можно найти практически в любом офисном приложении для работы с таблицами. Петя работает в одном из таких приложений, и у него открыта таблица \(A\). Он хочет проделать ноль или более операций сортировки по столбцу, чтобы получить таблицу \(B\). Определите, может ли он это сделать, и если может, предложите ему алгоритм действий — последовательность столбцов, по которым нужно применить сортировку по столбцу. Обратите внимание, что не требуется минимизировать число действий. Выходные данные Если превратить таблицу \(A\) в таблицу \(B\) невозможно, выведите \(-1\). В противном случае выведите \(k\) (\(0 \le k \le 5000\)) — количество сортировок, которые нужно сделать. Затем выведите \(k\) целых чисел \(c_1, \ldots, c_k\) (\(1 \le c_i \le m\)) — номера столбцов, по которым нужно сделать сортировку. Можно доказать, что если Петя может осуществить желаемое, то \(5000\) действий ему хватит. Примечание Рассмотрим второй пример. После сортировки по первому столбцу таблица имеет вид \(\)\begin{matrix} 1&3&3\\ 1&1&2\\ 2&3&2. \end{matrix}\(\) После того, как мы отсортируем таблицу по второму столбцу, она станет \(\)\begin{matrix} 1&1&2\\ 1&3&3\\ 2&3&2, \end{matrix}\(\) что нам и нужно. В третьем тесте любая сортировка не меняет таблицу, так как все столбцы уже отсортированы.
| |
|
|
C. Завершите MST
битмаски
графы
Деревья
жадные алгоритмы
Перебор
поиск в глубину и подобное
снм
Структуры данных
*2500
Как преподаватель, Riko Hakozaki часто помогает ученикам в решении задач по различным предметам. Сегодня ее попросили помочь с задачей по программированию, которая заключается в следующем. Вам выдается неориентированный полный граф с \(n\) вершинами, где для некоторых ребер заданы положительные веса, а для остальных нет. Вам нужно назначить всем еще не назначенным рёбрам неотрицательные веса так, чтобы у получившегося графа XOR (побитовое исключающее ИЛИ) всех весов был равен \(0\). Определим уродство полного графа как вес его минимального остовного дерева, где вес остовного дерева равен сумме весов его рёбер. Нужно назначить веса так, чтобы уродство получившегося графа было как можно меньше. Напомним, что неориентированный полный граф с \(n\) вершинами содержит все рёбра \((u, v)\) с \(1 \le u < v \le n\); такой граф имеет \(\frac{n(n-1)}{2}\) рёбер. Она не знает, как решить эту задачу, поэтому просит вас решить ее за нее. Выходные данные Выведите в одной строке одно целое число — минимальное уродство среди всех возможных назначений весов с XOR суммой равной \(0\). Примечание На изображении ниже показан первый пример. Черные веса назначены предварительно, красные веса назначены нами, а минимальное остовное дерево состоит из синих ребер.
| |
|
|
G. Фишки на доске
битмаски
дп
игры
Перебор
Структуры данных
*2700
У Алисы и Боба есть доска из \(n\) строк и \(m\) столбцов. В каждой строке есть ровно одна фишка. Алиса и Боб играют в следующую игру. Они выбирают два целых числа \(l\) и \(r\), такие, что \(1 \le l \le r \le m\), и разрезают доску таким образом, что только столбцы с \(l\) по \(r\) (включительно) принадлежат доски. То есть все столбцы левее столбца \(l\) и все столбцы правее столбца \(r\) больше не являются частью доски. После разрезания доски они начинают свою игру на оставшейся части доски (от столбца \(l\) до столбца \(r\)). Они ходят по очереди, и первый игрок, который не может сделать ход, проигрывает. Первый ход делает Алиса, второй — Боб, третий — снова Алиса, и так далее. Во время своего хода игрок должен выбрать одну из фишек и сдвинуть ее на любое количество столбцов влево (то есть, если фишка была в столбце \(i\), ее можно переместить в любой столбец \(j < i\), а фишки в самом левом столбце двигать нельзя). Фишки не должны покидать выбранную часть доски. У Алисы и Боба есть \(q\) пар чисел \(L_i\) и \(R_i\). Для каждой такой пары они хотят определить, кто выиграет, если \(l = L_i\) и \(r = R_i\). Обратите внимание, что эти игры рассматриваются независимо (они не влияют на положение на доске в последующих играх), и оба игрока играют оптимально. Выходные данные Выведите строку из \(q\) символов. \(i\)-й символ должен быть A, если Алиса выигрывает при \(l = L_i\) и \(r = R_i\), или B, если выигрывает Боб.
| |
|
|
B. Последовательности И
битмаски
Комбинаторика
Конструктив
математика
*1400
Последовательность \(n\) (\(n \ge 2\)) неотрицательных целых чисел \(a_1, a_2, \dots, a_n\) называется хорошей, если для всех \(i\) от \(1\) до \(n-1\) выполняется следующее условие: \(\)a_1 \: \& \: a_2 \: \& \: \dots \: \& \: a_i = a_{i+1} \: \& \: a_{i+2} \: \& \: \dots \: \& \: a_n,\(\) где \(\&\) обозначает операцию побитового И. Вам дан массив \(a\) размера \(n\) (\(n \geq 2\)). Найдите количество перестановок \(p\) чисел от \(1\) до \(n\), для которых последовательность \(a_{p_1}\), \(a_{p_2}\), ... ,\(a_{p_n}\) является хорошей. Так как это число может быть большим, выведите его по модулю \(10^9+7\). Выходные данные Выведите \(t\) строк, где \(i\)-я строка содержит количество хороших перестановок в \(i\)-м наборе входных данных по модулю \(10^9 + 7\). Примечание В первом наборе входных данных все числа равны, поэтому все перестановки являются хорошими. Всего есть \(6\) перестановок чисел от \(1\) до \(3\): \([1,2,3]\), \([1,3,2]\), \([2,1,3]\), \([2,3,1]\), \([3,1,2]\), \([3,2,1]\). Во втором наборе входных данных можно показать, что хороших перестановок нет. В третьем наборе входных данных существуют \(36\) хороших перестановок. Например, перестановка \([1,5,4,2,3]\) дает последовательность \(s=[0,0,3,2,0]\). Она хорошая, так как - \( s_1 = s_2 \: \& \: s_3 \: \& \: s_4 \: \& \: s_5 = 0\),
- \( s_1 \: \& \: s_2 = s_3 \: \& \: s_4 \: \& \: s_5 = 0\),
- \( s_1 \: \& \: s_2 \: \& \: s_3 = s_4 \: \& \: s_5 = 0\),
- \( s_1 \: \& \: s_2 \: \& \: s_3 \: \& \: s_4 = s_5 = 0\).
| |
|
|
B. AND 0, большая сумма
битмаски
Комбинаторика
математика
*1200
Первыми словами маленького Бадави были «AND 0 большая сумма», поэтому он решил решить следующую задачу. Даны два целых числа \(n\) и \(k\), вычислите количество массивов длины \(n\), таких что: - все элементы массива это целые числа от \(0\) до \(2^k-1\) (включительно);
- побитовое И всех его элементов это \(0\);
- сумма его элементов максимальная возможная.
Так как ответ может быть очень большим, выведите его остаток от деления на \(10^9+7\). Выходные данные Для каждого набора входных данных выведите количество массивов, удовлетворяющих всем условиям. Так как ответ может быть большим, выведите его остаток от деления на \(10^9+7\). Примечание В первом примере подходят \(4\) массива: - \([3,0]\),
- \([0,3]\),
- \([1,2]\),
- \([2,1]\).
| |
|
|
H. Феникс и биты
битмаски
Перебор
сортировки
Структуры данных
*3500
Феникс любит играть с битами — особенно используя битовые операции AND, OR и XOR. У него есть \(n\) целых чисел \(a_1, a_2, \dots, a_n\) и \(q\) запросов, каждый одного из следующих типов: - заменить все числа \(a_i\), для которых \(l \le a_i \le r\), на \(a_i\) AND \(x\);
- заменить все числа \(a_i\), для которых \(l \le a_i \le r\), на \(a_i\) OR \(x\);
- заменить все числа \(a_i\), для которых \(l \le a_i \le r\), на \(a_i\) XOR \(x\);
- вывести количество различных чисел \(a_i\), для которых \(l \le a_i \le r\).
В каждом запросе Феникса \(l\), \(r\) и \(x\) заданы. Заметим, что он рассматривает значения чисел, а не их индексы. Выходные данные Выведите ответ для каждого запроса четвертого типа (\(t=4\)). Примечание В первом примере: - В первом запросе, \(2\) заменяется на \(2\) AND \(2 = 2\), и \(3\) заменяется на \(3\) AND \(2 = 2\). Множество чисел становится \(\{1, 2, 4, 5\}\).
- Во втором запросе, есть \(3\) различных числа от \(2\) по \(5\): \(2\), \(4\) и \(5\).
- В третьем запросе, \(2\) заменяется на \(2\) XOR \(3 = 1\), \(4\) заменяется на \(4\) XOR \(3 = 7\), и \(5\) заменяется на \(5\) XOR \(3 = 6\). Множество чисел становится \(\{1, 6, 7\}\).
- В четвертом запросе, есть \(2\) различных числа от \(1\) по \(6\): \(1\) и \(6\).
- В пятом запросе, \(1\) заменяется на \(1\) OR \(8 = 9\). Множество чисел становится \(\{6, 7, 9\}\).
- В шестом запросе, есть одно различное число от \(8\) по \(10\): \(9\).
| |
|
|
B. AGAGA XOOORRR
битмаски
дп
жадные алгоритмы
Перебор
*1500
Ехаб известен своей любовью к определенным операциям. Сейчас у него есть массив \(a\) длины \(n\), и он может делать на нем следующую операцию: - Он выбирает \(2\) соседних элемента; Ехаб удаляет их из массива и вставляет на их место одно число: их исключающее ИЛИ. Обратите внимание, длина массива уменьшается на один.
Теперь он спрашивает вас: возможно ли сделать все элементы массива равными? Так как он хочет сделать вашу жизнь сложнее, то вводит дополнительное ограничение: в массиве должно остаться хотя бы \(2\) элемента. Выходные данные Если Ехаб может сделать все элементы массива равными, применяя описанную операцию, так, чтобы в массиве осталось хотя бы \(2\) элемента, выведите «YES». Иначе выведите «NO». Примечание В первом примере мы можем удалить первые \(2\) элемента, \(0\) и \(2\), и вставить вместо них \(0 \oplus 2=2\). Получится массив \([2,2]\), в котором все элементы равны. Во втором примере ответа не существует.
| |
|
|
C. Ехаб снова делит массив
битмаски
дп
Конструктив
математика
*1700
Ехаб снова решил развлечься. У него есть массив \(a\) длины \(n\). Он называет массив хорошим, если его нельзя разбить на \(2\) непересекающихся подпоследовательности такие, что сумма элементов первой равна сумме элементов второй. Сейчас он хочет удалить минимальное количество элементов из \(a\) так, что оставшийся массив будет хорошим. Вы можете ему в этом помочь? Последовательность \(a\) является подпоследовательностью \(b\), если \(a\) может быть получена из \(b\) удалением нескольких (возможно, ни одного или всех) элементов. Разбить массив это разделить его на \(2\) подпоследовательности так, чтобы каждый элемент входил ровно в одну из них. Вы должны использовать все элементы по одному разу. Выходные данные Первая строка должна содержать минимальное количество элементов, которое нужно удалить. Вторая строка должна содержать индексы этих элементов, записанные через пробел. Если существует несколько решений, выведите любое из них. Можно показать, что решение всегда существует. Примечание В первом примере вы можете разбить массив на \([6,9]\) и \([3,12]\), так что необходимо удалить хотя бы \(1\) элемент. Удаление \(3\) подходит. Во втором примере массив уже хороший.
| |
|
|
F. Сундуки и ключи
битмаски
дп
Перебор
поиск в глубину и подобное
Потоки
*3200
Алиса и Боб играют в игру. У Алисы есть \(n\) сундуков с сокровищами (в \(i\)-м лежит \(a_i\) монет) и \(m\) ключей (\(j\)-й из которых она может продать Бобу за \(b_j\) монет). Сначала Алиса вешает некоторые замки на сундуки. Есть \(m\) типов замков, замок \(j\)-го типа можно открыть только \(j\)-м ключом. Чтобы повесить замок типа \(j\) на \(i\)-й сундук, Алиса должна заплатить \(c_{i,j}\) долларов. Алиса может повесить произвольное количество различных замков на каждый сундук (возможно, ноль). Затем Боб покупает у Алисы несколько ключей (возможно, ноль или все) и открывает все сундуки, которые он может открыть (он может открыть сундук, если у него есть ключи от всех замков на этом сундуке). Прибыль Боба — это разность между суммарным количеством монет в открытых сундуках и суммарным количеством монет, которые он тратит на покупку ключей у Алисы. Если прибыль Боба строго положительная (больше ноля), то он выигрывает игру. Иначе Алиса выигрывает игру. Алиса хочет повесить замки на некоторые сундуки так, чтобы она выиграла игру вне зависимости от ключей, которые Боб купит (Боб не может получить положительную прибыль). Разумеется, она хочет потратить как можно меньше долларов на покупку замков. Помогите ей определить, может ли она выиграть игру, а если может, то сколько долларов ей придется потратить на замки. Выходные данные Если Алиса не может гарантированно выиграть (как бы она ни выбирала замки, Боб всегда сможет получить положительную прибыль), то выведите \(-1\). Иначе выведите одно целое число — минимальное количество долларов, которые необходимо потратить Алисе, чтобы выиграть вне зависимости от действий Боба. Примечание В первом примере Алиса должна повесить замки \(1\) и \(3\) типов на первый сундук и замки \(2\) и \(3\) типов на второй сундук. Во втором примере Алиса должна повесить замки \(1\) и \(2\) типов на первый сундук и замок \(3\) типа на второй сундук.
| |
|
|
E. Сад
битмаски
графы
Деревья
дп
*2500
У Васи есть очень красивый загородный сад, который представляет собой прямоугольное поле размером n × m, разделенное на n·m квадратных клеток. В один прекрасный день Вася вспомнил, что ему нужно проложить дорожки между k важными клетками с постройками — для этого он может залить бетоном некоторые из клеток своего сада. Про каждую клетку сада известно число aij, которое означает количество цветов, растущих в клетке с координатами (i, j). При заливании бетоном все цветы, растущие в клетке, погибают. Вася хочет залить бетоном некоторые клетки так, чтобы выполнялись условия: - все k важных клеток обязательно должны быть залиты бетоном
- из каждой важной клетки до любой другой важной клетки существовал путь по залитым бетоном клеткам при условии, что соседними считаются клетки, имеющие общую сторону
- общее количество погибших растений должно быть минимально
Так как у Васи достаточно большой сад, то он просит Вас ему помочь. Выходные данные В первую строку выведите единственное целое число — минимальное количество погибших при строительстве растений. Далее выведите n строк по m символов в каждой — план сада, где символом «X» (заглавная латинская буква X) обозначайте залитую бетоном клеточку, а символом «.» (точка) — незалитую. Если решений несколько, выведите любое.
| |
|
|
D. Нравится - не нравится
битмаски
дп
Перебор
Теория вероятностей
*2400
К Василию в гости пришло \(n\) друзей-трейдеров. Они начали обсуждать разные валюты, которыми торговали, но вот незадача: далеко не всем его друзьям нравится каждая валюта, некоторые валюты они любят, а некоторые — нет. Для каждого друга Василия \(i\) известно, нравится ли ему валюта \(j\). Всего валют \(m\). Известно, что трейдерам не может нравится больше, чем \(p\) валют. Так как друзьям нужно найти что-то общее для обсуждения, им нужно найти максимальное по мощности (возможно пустое) подмножество валют такое, что найдется как минимум \(\lceil \frac{n}{2} \rceil\) друзей (округление в большую сторону), каждому из которых будут нравиться все валюты этого множества. Выходные данные Выведите строку длины \(m\), задающую максимальное по размеру подмножество валют, которые нравятся хотя бы половине друзей. Символом \(1\) должны быть обозначены валюты, которые принадлежат этому подмножеству. Если ответов несколько, то вы можете вывести любой подходящий. Примечание В первом тестовом примере только первая валюта нравится как минимум \(\lceil \frac{3}{2} \rceil = 2\) друзьям, поэтому легко показать, что ответ лучше составить нельзя. Во втором тестовом примере максимальный ответ содержит \(2\) валюты и будет нравится друзьям под номерами \(1\), \(2\) и \(5\). В этом тесте есть и другие валюты, которые нравятся хотя бы половине друзей, но с их помощью нельзя добиться большего размера множества.
| |
|
|
F. Любимая игра
битмаски
дп
*3300
Василий любит после завершения рабочего дня поиграть в свою любимую компьютерную игру. Игра происходит в двумерном мире, начиная с момента времени \(0\). Василий может выбрать любую клетку мира и появиться в ней. Далее каждую единицу времени Василий может остаться на своем прежнем месте или переместиться из текущей клетки (x, y) в одну из следующих: (x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1). Чтобы ускорить передвижение по миру в игре существует \(n\) вышек для перемещения, \(i\)-я вышка расположена в клетке (\(xa_i, ya_i\)). Чтобы иметь возможность мгновенно переместиться к вышке из любой точки мира, необходимо ее активировать. Активация вышки \(i\) происходит в момент, когда игрок находится в клетке (\(xa_i, ya_i\)), после этого вышка остается активной на протяжении всей игры. Также Василию известно, что в игре есть \(m\) квестов, \(i\)-й из которых можно выполнить мгновенно, находясь в момент времени \(t_i\) в клетке (\(xb_i, yb_i\)). Василий хочет узнать, какое максимальное количество квестов он сможет выполнить, если будет оптимально перемещаться по игровому миру. Выходные данные Выведите одно целое число — максимальное количество квестов, которое сможет выполнить Василий. Примечание В первом тестовом примере одной из возможных последовательностей действий Василия может быть следующая: - Начать в клетке \((3, 2)\)
- В момент времени \(1\) перемещается в клетку \((4, 2)\)
- В момент времени \(2\) перемещается в клетку \((5, 2)\). Посетив эту клетку, Василий активирует вышку номер \(3\).
- В момент времени \(3\) перемещается в клетку \((5, 1)\), где ему остается подождать еще \(1\) момент времени, чтобы выполнить \(2\) квест
- В момент времени \(5\) перемещается в клетку \((5, 2)\)
- В момент времени \(6\) перемещается в клетку \((5, 3)\)
- В момент времени \(7\) перемещается в клетку \((5, 4)\)
- В момент времени \(8\) перемещается в клетку \((5, 5)\)
- В момент времени \(9\) перемещается в клетку \((4, 5)\)
- В момент времени \(10\) перемещается в клетку \((3, 5)\). Переместившись в эту клетку Василий выполнит \(4\) квест
- В момент времени \(10\) мгновенно переместиться в ранее активированную вышку в клетке \((5, 2)\)
- В момент времени \(11\) перемещается в клетку \((6, 2)\). Переместившись в эту клетку Василий выполнит \(3\) квест
- Квест под номером \(1\) Василий не успеет выполнить, потому что вышка в клетке \((2, 3)\) не была активирована
| |
|
|
A. Потом было K
битмаски
*800
Дано целое число \(n\), найдите максимальное целое значение \(k\) такое, что следующие условие выполняется: \(n\) & (\(n-1\)) & (\(n-2\)) & (\(n-3\)) & ... (\(k\)) = \(0\), где & обозначает битовую операцию И.Выходные данные Для каждого набора входных данных выведите единственное число — требуемое целое число \(k\). Примечание В первом примере максимальное значение, для которого операция & дает 0, это 1. Во втором примере максимальное значение, для которого операция & дает 0, это 3. Никакое значение больше 3, например 4, не дает &, равное 0: - \(5 \, \& \, 4 \neq 0\),
- \(5 \, \& \, 4 \, \& \, 3 = 0\).
Таким образом, ответ равен 3.
| |
|
|
F. Бинго
битмаски
дп
Комбинаторика
математика
Теория вероятностей
*2600
В предвкушении VK Fest 2021 вы составили себе табличку из \(n\) строк и \(n\) столбцов, и в каждую ячейку этой таблички записали некоторое событие, связанное с фестивалем, которое может произойти или нет — например, удастся ли вам выиграть на фестивале приз, или пойдёт ли дождь. Алгоритмы предсказания ВКонтакте уже оценили для каждого события вероятность того, что оно произойдёт. Событие в строке \(i\) и столбце \(j\) произойдёт с вероятностью \(a_{i, j} \cdot 10^{-4}\). При этом все события совместно независимы друг от друга. Назовём табличку с событиями выигрышной, если найдётся такая линия, на которой произойдут все \(n\) событий. Линией считается любая горизонталь (ячейки \((i, 1), (i, 2), \ldots, (i, n)\) для некоторого \(i\)), любая вертикаль (ячейки \((1, j), (2, j), \ldots, (n, j)\) для некоторого \(j\)), главная диагональ (ячейки \((1, 1), (2, 2), \ldots, (n, n)\)) и побочная диагональ (ячейки \((1, n), (2, n - 1), \ldots, (n, 1)\)). Определите вероятность того, что ваша табличка окажется выигрышной, и выведите её по модулю \(31\,607\) (см. формат вывода). Выходные данные Выведите вероятность того, что табличка окажется выигрышной, по модулю \(31\,607\). Формально, пусть \(M = 31\,607\). Можно показать, что ответ может быть представлен в виде несократимой дроби \(\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}\). Примечание В первом примере любые два события образуют линию, поэтому табличка будет выигрышной, если произойдут любые два события. Вероятность этого равна \(\frac{11}{16}\), а \(5927 \cdot 16 \equiv 11 \pmod{31\,607}\).
| |
|
|
H. Подматрицы
*особая задача
битмаски
дп
Структуры данных
Вам дана матрица \(s\), содержащая \(n\) строк и \(m\) столбцов. Каждый элемент матрицы представляет собой одну из первых \(5\) латинских букв (в верхнем регистре). Для каждого \(k\) (\(1 \le k \le 5\)) посчитайте количество подматриц, содержащих ровно \(k\) различных букв. Напомним, что подматрица матрицы \(s\) — это матрица, которую можно получить из \(s\) после удаления нескольких (возможно, нуля) первых строк, нескольких (возможно, нуля) последних строк, нескольких (возможно, нуля) первых столбцов и нескольких (возможно, нуля) последних столбцов. Если некоторая подматрица может быть получена из \(s\) двумя или более способами, вы должны учесть эту подматрицу соответствующее количество раз. Выходные данные Для каждого \(k\) (\(1 \le k \le 5\)) выведите одно целое число — количество подматриц, содержащих ровно \(k\) различных букв.
| |
|
|
C. Машины соперников
битмаски
математика
Перебор
поиск в глубину и подобное
реализация
Теория вероятностей
*1900
После победы над соперником из Чёрного Списка вы получаете шанс вытянуть \(1\) из \(x\) доступных призовых карточек. Изначально \(x=3\) и доступны следующие карточки: Взятка, Освобождение от конфискации и Машина соперника. Изначально вероятность вытянуть их в случайной попытке равна \(c\), \(m\) и \(p\) соответственно. Также присутствует фактор изменчивости \(v\). Вы можете играть в гонки с соперником до тех пор, пока не вытяните карточку Машина соперника. Предположим, что вы выигрываете каждую гонку и получаете шанс тянуть призовую карточку. В каждом вытягивании вы достаете одну из \(x\) доступных карточек с соответствующей вероятностью. Пусть вы вытянули карточку и вероятность ее вытягивания до вашей попытки была равна \(a\). Тогда - Если это карточка Машина соперника, то игра для вас заканчивается и вы больше не можете участвовать в гонках.
- Иначе
- Если \(a\leq v\), то вероятность вытянутой карточки становится равной \(0\) и она перестает быть доступной для последующих вытягиваний, уменьшая \(x\) на \(1\). Более того, освободившаяся вероятность \(a\) распределяется равномерно среди оставшихся доступных карточек.
- Если \(a > v\), вероятность вытянутой карточки уменьшается на \(v\), и освободившаяся вероятность распределяется равномерно среди остальных доступных карточек.
Например, - Если \((c,m,p)=(0.2,0.1,0.7)\) и \(v=0.1\), то после вытягивания карточки Взятка новые вероятности будут равны \((0.1,0.15,0.75)\).
- Если \((c,m,p)=(0.1,0.2,0.7)\) и \(v=0.2\), то после вытягивания карточки Взятка новые вероятности будут равны \((\text{Недоступна},0.25,0.75)\).
- Если \((c,m,p)=(0.2, \text{Недоступна},0.8)\) и \(v=0.1\), то после вытягивания карточки Взятка новые вероятности будут равны \((0.1, \text{Недоступна} ,0.9)\).
- Если \((c,m,p)=(0.1,\text{Недоступна},0.9)\) и \(v=0.2\), то после вытягивания карточки Взятка новые вероятности будут равны \((\text{Недоступна},\text{Недоступна},1.0)\).
Вам хочется заполучить машину соперника. Для этого вы должны найти математическое ожидание количества гонок, которые нужно пройти, чтобы вытянуть карточку Машина соперника. Выходные данные Для каждого набора входных данных выведите одну строку, содержащую одно действительное число — математическое ожидание количества гонок, которые нужно пройти, чтобы вытянуть карточку Машина соперника. Ответ будет считаться верным, если его абсолютная или относительная ошибка не будет превосходить \(10^{-6}\). Формально, пусть ваш ответ равен \(a\), а ответ жюри – \(b\). Ваш ответ считается правильным, если \(\frac{|a - b|}{\max{(1, |b|)}} \le 10^{-6}\). Примечание Обозначим за C вытягивание карточки Взятка, за M — карточки Освобождение от конфискации, за P — карточки Машина соперника. В первом наборе входных данных возможные последовательности вытягиваний представлены ниже: - P с вероятностью \(0.6\);
- CP с вероятностью \(0.2\cdot 0.7 = 0.14\);
- CMP с вероятностью \(0.2\cdot 0.3\cdot 0.9 = 0.054\);
- CMMP с вероятностью \(0.2\cdot 0.3\cdot 0.1\cdot 1 = 0.006\);
- MP с вероятностью \(0.2\cdot 0.7 = 0.14\);
- MCP с вероятностью \(0.2\cdot 0.3\cdot 0.9 = 0.054\);
- MCCP с вероятностью \(0.2\cdot 0.3\cdot 0.1\cdot 1 = 0.006\);
Поэтому математическое ожидание количества гонок равно \(1\cdot 0.6 + 2\cdot 0.14 + 3\cdot 0.054 + 4\cdot 0.006 + 2\cdot 0.14 + 3\cdot 0.054 + 4\cdot 0.006 = 1.532\). Во втором наборе данных возможные последовательности вытягиваний представлены ниже - - P с вероятностью \(0.4\);
- CP с вероятностью \(0.4\cdot 0.6 = 0.24\);
- CMP с вероятностью \(0.4\cdot 0.4\cdot 1 = 0.16\);
- MP с вероятностью \(0.2\cdot 0.5 = 0.1\);
- MCP с вероятностью \(0.2\cdot 0.5\cdot 1 = 0.1\).
Поэтому математическое ожидание количества гонок равно \(1\cdot 0.4 + 2\cdot 0.24 + 3\cdot 0.16 + 2\cdot 0.1 + 3\cdot 0.1 = 1.86\).
| |
|
|
D1. ПРС и криминальный список (простая версия)
битмаски
интерактив
Конструктив
математика
*1700
Это простая версия задачи. Единственное различие между простой и сложной версиями заключается в том, что в этой версии \(k=2\). Вы можете делать взломы, только если решили обе версии этой задачи. Это интерактивная задача. Для каждого десятичного числа есть соответствующая ему \(k\)-ичная запись. Цифры числа, записанного в \(k\)-ичной системе счисления, будем называть \(k\)-цифрами. Определим \(k\)-ичный XOR двух \(k\)-цифр \(a\) и \(b\) как \((a + b)\bmod k\). \(k\)-ичный XOR двух \(k\)-ичных чисел равен числу, полученному попарным \(k\)-ичным XOR соответствующих \(k\)-цифр. \(k\)-ичный XOR двух десятичных чисел \(a\) и \(b\) обозначается \(a\oplus_{k} b\) и равен десятичному представлению \(k\)-ичного XOR \(a\) и \(b\), записанных в \(k\)-ичной системе счисления. Все числа, встречающиеся далее в условии, записаны в десятичной системе счисления, если не указано иное. В случае \(k = 2\), что всегда верно для этой версии задачи, \(k\)-ичный XOR — это то же самое, что побитовое исключающее ИЛИ. Вы взломали базу преступлений Полиции Рокпорт-Сити (ПРС), так же известную как Криминальный Список. Но, чтобы получить к ней доступ, вам нужен пароль. Вы его не знаете, но вполне уверены, что его значение лежит между \(0\) и \(n-1\) включительно. Вы решили угадать его. Вы можете сделать не более чем \(n\) попыток, далее система заблокируется. Система адаптивна – каждый раз, когда вы делаете неверную попытку, она меняет пароль. А именно, если до попытки пароль был равен \(x\) и вы попытались ввести другое число \(y\), то система поменяет пароль на число \(z\) такое, что \(x\oplus_{k} z=y\). Угадайте пароль и взломайте систему. Протокол взаимодействия Для каждого набора входных данных считайте два целых числа \(n\) и \(k\). Вам разрешено сделать не более \(n\) попыток угадать пароль. Для каждой попытки выведите одно целое число \(y\) (\(0\leq y\leq 2\cdot 10^7\)). Пусть текущий пароль равен \(x\). Считайте одно целое число \(r\). Если \(x=y\), вы считаете \(r=1\), и этот набор входных данных считается решенным. Далее вы должны продолжить решать оставшиеся наборы. Иначе вы считаете \(r=0\), и система поменяет пароль на число \(z\) такое, что \(x\oplus_{k} z=y\). После каждой попытки не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Если вы сделаете некорректную попытку или превысите лимит в \(n\) попыток, вы считаете \(r=-1\) вместо ответа и получите вердикт Неправильный ответ. В таком случае ваша программа должна немедленно завершается, чтобы избежать неопределенных вердиктов. Обратите внимание, что система адаптивна. Это значит, что изначальный пароль не зафиксирован в начале и может зависеть от ваших запросов. Гарантируется, что в любой момент времени существует хотя бы один начальный пароль, для которого согласуются все ответы на запросы. Взломы: Для взломов используйте следующий формат: Первая строка должна содержать одно целое число \(t\) (\(1\leq t\leq 10\,000\)) — количество наборов входных данных. Первая и единственная строка каждого набора должна содержать два целых числа \(n\) (\(1\leq n\leq 2\cdot 10^5\)) и \(k\) (\(k=2\)), равные соответственно количеству возможных попыток и основанию системы счисления. Оптимальный начальный пароль будет автоматически подобран системой. Сумма \(n\) по всем наборам входных данных не должна превышать \(2\cdot 10^5\). Примечание В этом наборе входных данных загаданный пароль равен \(2\). Первая попытка равна \(3\). Это не равно текущему паролю. Поэтому система возвращает ответ \(0\) и меняет пароль на \(1\), поскольку \(2\oplus_2 1=3\). Вторая попытка равна \(4\). Это не равно текущему паролю. Поэтому система возвращает ответ \(0\) и меняет пароль на \(5\), поскольку \(1\oplus_2 5=4\). Третья попытка равна \(5\). Это равно текущему паролю. Поэтому система возвращает ответ \(1\) и работа сделана. Заметьте, что начальный пароль был взят таким для наглядности объяснения. В действительности система может повести себя иначе, поскольку она адаптивна.
| |
|
|
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]\) дадут этот же перенумерованный гиперкуб.
| |
|
|
D. Взаимнорастущая последовательность
битмаски
жадные алгоритмы
Конструктив
*1300
Последовательность неотрицательных целых чисел \(a_1, a_2, \dots, a_n\) называется растущей, если для всех \(i\) от \(1\) до \(n - 1\) в двоичной записи \(a_i\) все единичные биты стоят на местах битов, которые тоже единичные, в двоичной записи \(a_{i + 1}\) (иными словами, \(a_i \:\&\: a_{i + 1} = a_i\), где \(\&\) обозначает побитовую операцию И). Если \(n = 1\), то последовательность является растущей. Например, следующие четыре последовательности являются растущими: - \([2, 3, 15, 175]\) — в двоичном виде это \([10_2, 11_2, 1111_2, 10101111_2]\);
- \([5]\) — в двоичном виде это \([101_2]\);
- \([1, 3, 7, 15]\) — в двоичном виде это \([1_2, 11_2, 111_2, 1111_2]\);
- \([0, 0, 0]\) — в двоичном виде это \([0_2, 0_2, 0_2]\).
Следующие три последовательности не являются растущими: - \([3, 4, 5]\) — в двоичном виде это \([11_2, 100_2, 101_2]\);
- \([5, 4, 3]\) — в двоичном виде это \([101_2, 100_2, 011_2]\);
- \([1, 2, 4, 8]\) — в двоичном виде это \([0001_2, 0010_2, 0100_2, 1000_2]\).
Рассмотрим две последовательности неотрицательных чисел \(x_1, x_2, \dots, x_n\) и \(y_1, y_2, \dots, y_n\). Назовём эту пару последовательностей взаимнорастущими, если последовательность \(x_1 \oplus y_1, x_2 \oplus y_2, \dots, x_n \oplus y_n\) является растущей, где \(\oplus\) является операцией побитового исключающего ИЛИ (то есть XOR). Задана последовательность целых чисел \(x_1, x_2, \dots, x_n\). Требуется найти такую лексикографически минимальную последовательность \(y_1, y_2, \dots, y_n\), что последовательности \(x_i\) и \(y_i\) являются взаимнорастущими. Последовательность \(a_1, a_2, \dots, a_n\) лексикографически меньше последовательности \(b_1, b_2, \dots, b_n\), если существует такое \(1 \le k \le n\), что для любых \(1 \le i < k\) выполнено \(a_i = b_i\), но \(a_k < b_k\). Выходные данные Для каждого набора данных выведите \(n\) целых чисел \(y_1, y_2, \dots, y_n\) (\(0 \le y_i < 2^{30}\)) — лексикографически минимальную последовательность, которая является взаимнорастущей с заданной последовательностью \(x_i\).
| |
|
|
D1. Грегор и нечетные коровы (простая версия)
битмаски
геометрия
математика
теория чисел
*2300
Это простая версия задачи. Единственное отличие от сложной версии заключается в том, что в данной версии все координаты — четные числа. Даны \(n\) столбов, расположенных в различных точках на плоскости. Гарантируется, что никакие три столба не лежат на одной прямой. На плоскости также есть бесконечное количество коров, по одной в каждой точке с целочисленными координатами. Грегор — член общества иллюминатов и хочет построить треугольный загон, соединив \(3\) различных существующих столба забором. Корова, находящаяся строго внутри загона, считается огражденной. Если ограждено нечётное число коров, и при этом площадь загона равна целому числу, то загон считается интересным. Найдите количество интересных загонов. Выходные данные Напечатайте одно целое число — количество интересных загонов. Два загона считаются различными, если они образованы различными множествами трех столбов. Примечание В первом примере существует только \(1\) загон. Этот загон является интересным, поскольку его площадь равна \(4\) и есть \(1\) пойманная корова, помеченная красным. Во втором примере есть \(3\) интересных забора. - \((0,0)\) — \((30,14)\) — \((2,10)\)
- \((2,16)\) — \((30,14)\) — \((2,10)\)
- \((30,14)\) — \((4,6)\) — \((2,10)\)
| |
|
|
E. Stringforces
Бинарный поиск
битмаски
дп
Перебор
Строки
*2500
Задана строка \(s\) длины \(n\). Каждый символ — это либо одна из первых \(k\) строчных латинских букв, либо знак вопроса. Требуется заменить каждый знак вопрос на одну из первых \(k\) строчных латинских букв таким образом, чтобы максимизировать следующее значение. Пусть \(f_i\) будет максимальной длиной подстроки строки \(s\), которая состоит целиком из \(i\)-й латинской буквы. Подстрока строки — это некоторый ее непрерывный подотрезок. Если \(i\)-я буква не встречается в строке, то \(f_i\) равно \(0\). Значение строки \(s\) — это минимальное значение среди \(f_i\) для всех \(i\) от \(1\) до \(k\). Какое наибольшее значение может иметь строка? Выходные данные Выведите одно целое число — наибольшее значение, которое может иметь строка, если заменить каждый знак вопроса на одну из первых \(k\) строчных латинских букв. Примечание В первом примере знаки вопроса можно заменить следующим образом: «aaaababbbb». \(f_1 = 4\), \(f_2 = 4\), поэтому ответ равен \(4\). Можно заменить и таким образом: «aaaabbbbbb». Тогда \(f_1 = 4\), \(f_2 = 6\), однако, минимум из них все еще равен \(4\). Во втором примере одна из возможных строк такая: «aabbccdda». В третьем примере хотя бы одна буква не встретится в строке, поэтому минимум из значений \(f_i\) всегда равен \(0\).
| |
|
|
D. Массив как разность
битмаски
графы
дп
Конструктив
математика
Перебор
поиск в глубину и подобное
*1800
Вам дана последовательность из \(n\) целых чисел \(a_1, \, a_2, \, \dots, \, a_n\). Существует ли последовательность из \(n\) целых чисел \(b_1, \, b_2, \, \dots, \, b_n\) такая, что выполняется следующее свойство? - Для каждого \(1 \le i \le n\) существуют два (не обязательно различных) индекса \(j\) и \(k\) (\(1 \le j, \, k \le n\)) такие, что \(a_i = b_j - b_k\).
Выходные данные Для каждого набора входных данных выведите строку, содержащую YES, если существует последовательность \(b_1, \, \dots, \, b_n\), удовлетворяющая требуемому свойству, и NO в противном случае. Примечание В первом наборе входных данных, последовательность \(b = [-9, \, 2, \, 1, \, 3, \, -2]\) удовлетворяет свойству. Действительно, имеет место следующее: - \(a_1 = 4 = 2 - (-2) = b_2 - b_5\);
- \(a_2 = -7 = -9 - (-2) = b_1 - b_5\);
- \(a_3 = -1 = 1 - 2 = b_3 - b_2\);
- \(a_4 = 5 = 3 - (-2) = b_4 - b_5\);
- \(a_5 = 10 = 1 - (-9) = b_3 - b_1\).
Во втором наборе входных данных достаточно выбрать \(b = [0]\), так как \(a_1 = 0 = 0 - 0 = b_1 - b_1\). В третьем наборе входных данных можно показать, что никакая последовательность \(b\) длины \(3\) не удовлетворяет свойству.
| |
|
|
G. Серьезный судья
битмаски
Перебор
поиск в глубину и подобное
сортировки
*3000
Андреа придумал, как он считает, новый алгоритм сортировки для массивов длины \(n\). Алгоритм работает следующим образом. Изначально имеется массив из \(n\) целых чисел \(a_1,\, a_2,\, \dots,\, a_n\). Затем выполняется \(k\) шагов. Для каждого \(1\le i\le k\) на \(i\)-м шаге сортируется подпоследовательность массива \(a\) с индексами \(j_{i,1}< j_{i,2}< \dots< j_{i, q_i}\), не меняя значений с остальными индексами. Таким образом, в результате подпоследовательность \(a_{j_{i,1}},\, a_{j_{i,2}},\, \dots,\, a_{j_{i,q_i}}\) отсортирована, а все остальные элементы \(a\) остались нетронутыми. Андреа, желая поделиться своим открытием с научным сообществом, отправил небольшую статью с описанием своего алгоритма в журнал «Анналы алгоритмов сортировки», а вы являетесь рецензентом статьи (то есть человеком, который должен оценить правильность статьи). Вы должны решить, является ли алгоритм Андреа правильным, то есть сортирует ли он любой массив \(a\) из \(n\) целых чисел. Выходные данные Если алгоритм Андреа верен, выведите ACCEPTED, иначе выведите REJECTED. Примечание Объяснение первого примера: Алгоритм состоит из \(3\) шагов. Первый сортирует подпоследовательность \([a_1, a_2, a_3]\), второй сортирует подпоследовательность \([a_2, a_3, a_4]\), третий сортирует подпоследовательность \([a_1,a_2]\). Например, если первоначально \(a=[6, 5, 6, 3]\), то алгоритм преобразует массив следующим образом (сортируемая подпоследовательность выделена красным цветом) \(\) [{\color{red}6},{\color{red}5},{\color{red}6},3] \rightarrow [5, {\color{red}6}, {\color{red}6}, {\color{red}3}] \rightarrow [{\color{red}5}, {\color{red}3}, 6, 6] \rightarrow [3, 5, 6, 6] \,.\(\) Можно доказать, что для любого начального массива \(a\), в конце алгоритма массив \(a\) будет отсортирован. Объяснение второго примера: Алгоритм состоит из \(3\) шагов. На первом сортируется подпоследовательность \([a_1, a_2, a_3]\), на втором — подпоследовательность \([a_2, a_3, a_4]\), на третьем — подпоследовательность \([a_1,a_3,a_4]\). Например, если первоначально \(a=[6, 5, 6, 3]\), то алгоритм преобразует массив следующим образом (сортируемая подпоследовательность выделена красным цветом) \(\) [{\color{red}6},{\color{red}5},{\color{red}6},3] \rightarrow [5, {\color{red}6}, {\color{red}6}, {\color{red}3}] \rightarrow [{\color{red}5}, 3, {\color{red}6}, {\color{red}6}] \rightarrow [5, 3, 6, 6] \,.\(\) Обратите внимание, что \(a=[6,5,6,3]\) является примером массива, который не сортируется алгоритмом. Объяснение третьего примера: Алгоритм состоит из \(4\) шагов. Первые \(3\) шага ничего не делают, так как сортируют подпоследовательности длиной \(1\), тогда как четвертый шаг сортирует подпоследовательность \([a_1,a_3]\). Например, если первоначально \(a=[5,6,4]\), алгоритм преобразует массив следующим образом (подпоследовательность, которая сортируется, выделена красным цветом) \(\) [{\color{red}5},6,4] \rightarrow [5,{\color{red}6},4] \rightarrow [5,{\color{red}6},4] \rightarrow [{\color{red}5},6,{\color{red}4}]\rightarrow [4,6,5] \,.\(\) Обратите внимание, что \(a=[5,6,4]\) - это пример массива, который не сортируется алгоритмом. Пояснение четвертого примера: Алгоритм состоит из \(2\) шагов. На первом этапе сортируются подпоследовательности \([a_2,a_3,a_4]\), на втором - весь массив \([a_1,a_2,a_3,a_4,a_5]\). Например, если изначально \(a=[9,8,1,1,1]\), алгоритм преобразует массив следующим образом (подпоследовательность, которая получает сортировку, выделена красным цветом) \(\) [9,{\color{red}8},{\color{red}1},{\color{red}1},1] \rightarrow [{\color{red}9},{\color{red}1},{\color{red}1},{\color{red}8},{\color{red}1}] \rightarrow [1,1,1,8,9] \,.\(\) Поскольку на последнем шаге сортируется весь массив, очевидно, что для любого начального массива \(a\) в конце алгоритма массив \(a\) будет отсортирован.
| |
|
|
C. Пенальти
битмаски
дп
жадные алгоритмы
Перебор
*1200
Рассмотрим упрощенную фазу пенальти в конце футбольного матча. Фаза пенальти состоит из не более чем \(10\) ударов: первый удар выполняет первая команда, второй удар выполняет вторая команда, третий удар выполняет первая команда, и так далее. Команда, забившая больше голов, выигрывает; если обе команды забили одинаковое количество голов, объявляется ничья (обратите внимание, что это противоречит официальным правилам футбола). Фазу пенальти останавливают, если одна команда забила больше мячей, чем другая команда может забить с учетом всех оставшихся ударов. Например, если после \(7\)-го удара возникла следующая ситуация: первая команда забила \(1\) мяч, а вторая команда забила \(3\) мяча, то фазу пенальти останавливают: первая команда уже не сможет забить \(3\) мяча за всю фазу пенальти. Вы знаете, кто выполняет какой удар, поэтому можете спрогнозировать результаты всех \(10\) ударов. Этот прогноз представлены строкой \(s\), состоящей из \(10\) символов. Каждый символ — 1, 0, или ?. Строка задает ваш прогноз следующим образом: - если \(s_i\) — 1, то игрок, выполняющий \(i\)-й удар, обязательно забьет гол;
- если \(s_i\) — 0, то игрок, выполняющий \(i\)-й удар, обязательно не забьет гол;
- если \(s_i\) — ?, то результат \(i\)-го удара может быть любым.
Основываясь на этом прогнозе, посчитайте минимально возможное количество ударов в фазе пенальти (то есть самый ранний момент, когда фаза пенальти может быть остановлена, если рассмотреть все возможные варианты, как она может проходить). Обратите внимание, что при остановке фазы пенальти ваши прогнозы на следующие удары не учитываются. Выходные данные Для каждого набора входных данных выведите одно целое число — минимально возможное количество ударов в фазе пенальти. Примечание Рассмотрим примеры: В первом примере, рассмотрим ситуацию, когда \(1\)-й, \(5\)-й и \(7\)-й забивают, а \(2\), \(3\), \(4\) и \(6\) не забивают. Тогда текущее количество голов для первой команды это \(3\), а для второй команды это \(0\), при этом рефери понимает, что вторая команда забьет не более \(2\) голов в оставшихся ударах. Таким образом, серия пенальти закончится после \(7\)-го удара. Во втором примере, серия пенальти не закончится, пока не будут совершены все \(10\) ударов. В третьем примере, если первая команда не забьет три своих первых удара, а вторая команда забьет три своих первых удара, то после \(6\)-го удара, первая команда забила \(0\) голов и вторая команда забила \(3\) гола. Рефери понимает, что первая команда может забить не более \(2\) голов в оставшихся ударах. Таким образом, серия пенальти закончится после \(6\)-го удара. В четвертом примере, несмотря на то, что вы можете предсказать всю серию пенальти, ее результат будет точно известен только после \(9\)-го удара.
| |
|
|
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\).
| |
|
|
B. Кобб
битмаски
жадные алгоритмы
математика
Перебор
*1700
Вам даны \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) и целое число \(k\). Найдите максимальное значение \(i \cdot j - k \cdot (a_i | a_j)\) среди всех пар \((i, j)\) целых чисел таких, что \(1 \le i < j \le n\). Здесь \(|\) обозначает операцию побитового ИЛИ. Выходные данные Для каждого тестового случая выведите одно целое число — максимально возможное значение \(i \cdot j - k \cdot (a_i | a_j)\). Примечание Пусть \(f(i, j) = i \cdot j - k \cdot (a_i | a_j)\). В первом наборе входных данных, - \(f(1, 2) = 1 \cdot 2 - k \cdot (a_1 | a_2) = 2 - 3 \cdot (1 | 1) = -1\).
- \(f(1, 3) = 1 \cdot 3 - k \cdot (a_1 | a_3) = 3 - 3 \cdot (1 | 3) = -6\).
- \(f(2, 3) = 2 \cdot 3 - k \cdot (a_2 | a_3) = 6 - 3 \cdot (1 | 3) = -3\).
Таким образом, максимум равен \(f(1, 2) = -1\). В четвертом наборе входных данных максимум равен \(f(3, 4) = 12\).
| |
|
|
C. Микаса
Бинарный поиск
битмаски
жадные алгоритмы
реализация
*1800
Вам даны два целых числа \(n\) и \(m\). Найдите \(\operatorname{MEX}\) последовательности \(n \oplus 0, n \oplus 1, \ldots, n \oplus m\). Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ. \(\operatorname{MEX}\) последовательности неотрицательных целых чисел — это наименьшее неотрицательное целое число, которое не встречается в этой последовательности. Например, \(\operatorname{MEX}(0, 1, 2, 4) = 3\), а \(\operatorname{MEX}(1, 2021) = 0\). Выходные данные Для каждого набора входных данных выведите одно целое число — ответ на задачу. Примечание В первом наборе входных данных последовательность равна \(3 \oplus 0, 3 \oplus 1, 3 \oplus 2, 3 \oplus 3, 3 \oplus 4, 3 \oplus 5\), или \(3, 2, 1, 0, 7, 6\). Наименьшее неотрицательное целое число, которое не присутствует в последовательности, т. е. \(\operatorname{MEX}\) последовательности — \(4\). Во втором наборе входных данных последовательность равна \(4 \oplus 0, 4 \oplus 1, 4 \oplus 2, 4 \oplus 3, 4 \oplus 4, 4 \oplus 5, 4 \oplus 6\), или \(4, 5, 6, 7, 0, 1, 2\). Наименьшее неотрицательное целое число, которое не присутствует в последовательности, т. е. \(\operatorname{MEX}\) последовательности — \(3\). В третьем наборе входных данных последовательность равна \(3 \oplus 0, 3 \oplus 1, 3 \oplus 2\), или \(3, 2, 1\). Наименьшее неотрицательное целое число, которое не присутствует в последовательности, т. е. \(\operatorname{MEX}\) последовательности — \(0\).
| |
|
|
D. Попробуй угадай
битмаски
интерактив
Конструктив
математика
*1800
Это интерактивная задача. Василий загадал некоторую последовательность чисел \(a_1, a_2, \dots, a_n\), но в целях безопасности он не хочет раскрывать вам ее полностью. Василий готов ответить не больше, чем на \(2 \cdot n\) следующих вопросов: - Чему равно значение побитового И двух элементов с индексами \(i\) и \(j\) (\(i \neq j\))
- Чему равно значение побитового ИЛИ двух элементов с индексами \(i\) и \(j\) (\(i \neq j\))
Вы можете задать любые интересующие вас вопросы Василию и должны узнать \(k\)-е наименьшее число последовательности. Формально \(k\)-е наименьшее число равно числу на \(k\)-й позиции в отсортированном по неубыванию массиве с 1-индексацией. Для примера, в массиве \([5, 3, 3, 10, 1]\) \(4\)-е наименьшее число будет равно \(5\), а \(2\)-е и \(3\)-е равны \(3\). Протокол взаимодействия В первой строке вам будет дано два целых числа \(n\) и \(k\) \((3 \le n \le 10^4, 1 \le k \le n)\) — количество элементов последовательности \(a\) и число \(k\). Затем вы можете задать не более \(2 \cdot n\) вопросов (операция «finish» за вопрос не считается). Каждая строка вашего вывода может быть одного из следующих типов: - «or i j» \((1 \le i, j \le n, i \neq j)\), где \(i\) и \(j\) — это индексы элементов, побитовый or которых вы хотите узнать.
- «and i j» \((1 \le i, j \le n, i \neq j)\), где \(i\) и \(j\) — это индексы элементов, побитовый and которых вы хотите узнать.
- «finish res», где \(res\) — это \(k\)-е наименьшее число в последовательности. После вывода такой строки необходимо завершить программу.
В ответ на первые два типа операций вы получите целое число \(x\) — результат интересующей вас операции для выбранных чисел. После вывода каждой строки не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт «Решение зависло». Для сброса буфера используйте: - fflush(stdout) в языке C++
- System.out.flush() в Java
- stdout.flush() в Python
- flush(output) в Pascal
- смотрите документацию для других языков
Если вы сделаете некорректный запрос, то в ответ вы получите \(-1\). После получения ответа \(-1\), вы должны немедленно завершить свою программу, чтобы получить вердикт «Неправильный ответ». Взломы Чтобы совершить взлом, вам потребуется использовать следующий формат: Первая строка должна содержать два целых числа \(n\) и \(k\) \((3 \le n \le 10^4, 1 \le k \le n)\) — количество элементов последовательности \(a\) и число \(k\). Вторая строка должна содержать \(n\) целых чисел \(a_1, a_2, \dots, a_n\) \((0 \le a_i \le 10^9)\) — описание последовательностии \(a\). Примечание В тестовом примере загаданная последовательность выглядит следующим образом: \([1, 6, 4, 2, 3, 5, 4]\). Ниже разобран протокол взаимодействия из примера. | Запрос (программа участника) | Ответ (интерактор) | Пояснение | | and 2 5 | 2 | \(a_2=6\), \(a_5=3\). Интерактор возвращает побитовый И данных чисел. | | or 5 6 | 7 | \(a_5=3\), \(a_6=5\). Интерактор возвращает побитовый ИЛИ данных чисел. | | finish 5 | | \(5\) является правильным ответом. Обратите внимание, что требуется найти значение, а не индекс k-го наименьшего числа. |
| |
|
|
F. Ставки на матчи
битмаски
графы
дп
Комбинаторика
математика
Теория вероятностей
*2500
Василий увлекается не только трейдингом, но и ставками на спортивные матчи. В матче участвует \(n\) спортивных команд. Каждая команда характеризуется силой \(a_i\). Каждые две команды \(i < j\) играют друг с другом ровно один раз. С вероятностью \(\frac{a_i}{a_i + a_j}\) побеждает команда \(i\), с вероятностью \(\frac{a_j}{a_i + a_j}\) побеждает команда \(j\). Команда называется победителем, если она прямо или косвенно победила все остальные команды. Команда \(a\) победила (прямо или косвенно) команду \(b\), если существует последовательность команд \(c_1\), \(c_2\), ... \(c_k\) такая, что \(c_1 = a\), \(c_k = b\) и команда \(c_i\) выиграла матч у команды \(c_{i + 1}\) для всех \(i\) от \(1\) до \(k - 1\). Обратите внимание, что возможно, что команда \(a\) победила команду \(b\), и в то же время команда \(b\) победила команду \(a\). Василий хочет, чтобы вы помогли ему определить математическое ожидание количества победителей. Выходные данные Выведите единственное целое число — математическое ожидание количества победителей турнира по модулю \(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}\). Примечание Чтобы лучше понять, в каких ситуациях возможно несколько победителей, рассмотрим второй тест: Одним из возможных результатов сыгранных матчей является следующий (\(a \rightarrow b\) означает, что \(a\) выиграла матч у \(b\)): - \(1 \rightarrow 2\)
- \(2 \rightarrow 3\)
- \(3 \rightarrow 1\)
- \(1 \rightarrow 4\)
- \(1 \rightarrow 5\)
- \(2 \rightarrow 4\)
- \(2 \rightarrow 5\)
- \(3 \rightarrow 4\)
- \(3 \rightarrow 5\)
- \(4 \rightarrow 5\)
Или более наглядно на рисунке: В данном варианте каждая команда из множества \(\{ 1, 2, 3 \}\) прямо или косвенно победила всех. То есть: - \(1\)-я победила всех, так как до остальных можно добраться следующим образом \(1 \rightarrow 2\), \(1 \rightarrow 2 \rightarrow 3\), \(1 \rightarrow 4\), \(1 \rightarrow 5\).
- \(2\)-я победила всех, так как до остальных можно добраться следующим образом \(2 \rightarrow 3\), \(2 \rightarrow 3 \rightarrow 1\), \(2 \rightarrow 4\), \(2 \rightarrow 5\).
- \(3\)-я победила всех, так как до остальных можно добраться следующим образом \(3 \rightarrow 1\), \(3 \rightarrow 1 \rightarrow 2\), \(3 \rightarrow 4\), \(3 \rightarrow 5\).
Следовательно, количество победителей равно \(3\).
| |
|
|
G. Врата в другой мир
битмаски
снм
Структуры данных
*3300
Как уже упоминалось, Василий любит играть в компьютерные игры. В одной из его любимых игр персонаж находится во вселенной, где каждая планета обозначается двоичным числом от \(0\) до \(2^n - 1\). На каждой из планет находятся врата, позволяющие перемещаться с планеты \(i\) на планету \(j\), если двоичная запись \(i\) отличается от двоичной записи \(j\) ровно в одном бите. Василий хочет проверить вас и посмотреть, как вы справитесь с обработкой следующих запросов в этом игровом мире: - Уничтожить планеты с номерами от \(l\) до \(r\) включительно. На такие планеты больше нельзя перемещаться.
- Узнать, можно ли с планеты \(a\) долететь до планеты \(b\), используя какое-то количество планетных врат. Гарантируется, что планеты \(a\) и \(b\) не являются уничтоженными.
Выходные данные На каждый запрос типа ask в отдельной строке необходимо вывести «1», если с планеты \(a\) можно долететь до планеты \(b\), и «0» иначе (без кавычек). Примечание Первый тест можно визуализировать следующим образом: Ответ на запрос ask 0 7 положительный. Далее после запроса block 3 6 граф будет выглядеть следующим образом (выделены уничтоженные вершины): Ответ на запрос ask 0 7 отрицательный, так как любой путь из вершины \(0\) в вершину \(7\) лежит через одну из уничтоженных вершин.
| |
|
|
C. Moamen и XOR
битмаски
дп
Комбинаторика
математика
матрицы
*1700
Moamen и Ezzat играют в игру. Они создают массив \(a\) длины \(n\), состоящий из неотрицательных целых чисел, где каждый элемент меньше \(2^k\). Moamen победит, если \(a_1 \,\&\, a_2 \,\&\, a_3 \,\&\, \ldots \,\&\, a_n \ge a_1 \oplus a_2 \oplus a_3 \oplus \ldots \oplus a_n\). Здесь \(\&\) обозначает операцию битового И, а \(\oplus\) обозначает операцию битового исключающего ИЛИ. Теперь Moamen хочет узнать, сколько существует таких массивов \(a\), где он побеждает? Так как ответ может быть очень большим, выведите его по модулю \(1\,000\,000\,007\) (\(10^9 + 7\)). Выходные данные Для каждого набора входных данных выведите одно целое число — количество различных массивов, в которых Moamen победит. Выведите результат по модулю \(1\,000\,000\,007\) (\(10^9 + 7\)). Примечание В первом примере \(n = 3\), \(k = 1\). В результате все возможные массивы — это \([0,0,0]\), \([0,0,1]\), \([0,1,0]\), \([1,0,0]\), \([1,1,0]\), \([0,1,1]\), \([1,0,1]\) и \([1,1,1]\). Moamen победит только в \(5\) из них: \([0,0,0]\), \([1,1,0]\), \([0,1,1]\), \([1,0,1]\), \([1,1,1]\).
| |
|
|
A. Mocha и математика
битмаски
Конструктив
математика
*900
Mocha — школьница старших классов. В школе она получила от учителей много знаний, особенно от учителя математики. Недавно Mocha узнала о двоичной системе счисления и заинтересовалась битовыми операциями. Сегодня у Mocha есть массив целых чисел \(a\) длины \(n\). За одну операцию она может выбрать произвольный отрезок \([l, r]\) и для всех значений \(i\) (\(0\leq i \leq r-l\)) одновременно заменить \(a_{l+i}\) на \(a_{l+i} \,\&\, a_{r-i}\), где \(\&\) обозначает операцию побитового И. Эта операция может быть выполнена произвольное количество раз. Например, если \(n=5\), исходный массив \([a_1,a_2,a_3,a_4,a_5]\), и Mocha выбирает отрезок \([2,5]\), то после применения операции массив будет равен \([a_1,a_2\,\&\, a_5, a_3\,\&\, a_4, a_4\,\&\, a_3, a_5\,\&\, a_2]\). Mocha хочет сделать максимальное значение в массиве как можно меньше. Помогите, как лучший друг, вычислить это минимально возможное значение максимума? Выходные данные Для каждого набора входных данных выведите одно целое число — минимально возможное значение максимума после применения некоторого количества операций. Примечание В первом наборе входных данных Mocha может выбрать отрезок \([1,2]\), и массив становится равным \([ 0, 0]\), так как первый элемент становится равен \(1\,\&\,2\), а второй — \(2\,\&\,1\). Во втором наборе входных данных Mocha может выбрать отрезок \([1,3]\), и массив становится равным \([ 1,1,1]\), где первый элемент равен \(1\,\&\,3\), второй элемент — \(1\,\&\,1\), а третий элемент — \(3\,\&\,1\).
| |
|
|
F1. Ближайшее красивое число (упрощённая версия)
Бинарный поиск
битмаски
жадные алгоритмы
Конструктив
Перебор
поиск в глубину и подобное
*1900
Это упрощённая версия задачи F2. Они отличаются только ограничениями (F1: \(k \le 2\), F2: \(k \le 10\)). Дано число \(n\). Найдите минимальное целое число \(x\) такое, что \(x \ge n\) и \(x\) является \(k\)-красивым числом. Число называется \(k\)-красивым, если в его десятичной записи, не содержащей лидирующих нулей, встречается не более \(k\) различных цифр. Например, если \(k = 2\), числа \(3434443\), \(55550\), \(777\) и \(21\) являются \(k\)-красивыми, а числа \(120\), \(445435\) и \(998244353\) — нет. Выходные данные Для каждого набора входных данных в отдельной строке выведите \(x\) — минимальное целое \(k\)-красивое число, так чтобы \(x \ge n\).
| |
|
|
F2. Ближайшее красивое число (усложнённая версия)
битмаски
дп
жадные алгоритмы
Конструктив
Перебор
поиск в глубину и подобное
*2100
Это усложнённая версия задачи F1. Они отличаются только ограничениями (F1: \(k \le 2\), F2: \(k \le 10\)). Дано число \(n\). Найдите минимальное целое число \(x\) такое, что \(x \ge n\) и \(x\) является \(k\)-красивым числом. Число называется \(k\)-красивым, если в его десятичной записи, не содержащей лидирующих нулей, встречается не более \(k\) различных цифр. Например, если \(k = 2\), числа \(3434443\), \(55550\), \(777\) и \(21\) являются \(k\)-красивыми, а числа \(120\), \(445435\) и \(998244353\) — нет. Выходные данные Для каждого набора входных данных в отдельной строке выведите \(x\) — минимальное целое \(k\)-красивое число, так чтобы \(x \ge n\).
| |
|
|
B. MIN-MEX разрез
битмаски
дп
жадные алгоритмы
Конструктив
*800
Бинарная строка — это строка, состоящая из символов \(0\) и \(1\). Определим \(\operatorname{MEX}\) бинарной строки как наименьшую из цифр \(0\), \(1\) или \(2\), которая не встречается в этой строке. Например, \(\operatorname{MEX}\) строки \(001011\) — это \(2\), потому что \(0\) и \(1\) встречаются хотя бы один раз. \(\operatorname{MEX}\) строки \(1111\) — это \(0\), потому что \(0\) и \(2\) не встречаются ни разу, и \(0 < 2\). Дана бинарная строка \(s\). Необходимо разбить её на произвольное количество подстрок так, чтобы каждая её цифра принадлежала ровно одной подстроке. Строку разрешается разбить на одну подстроку — эту строку целиком. Строка \(a\) является подстрокой \(b\), если \(a\) может быть получена из \(b\) удалением нескольких (возможно, ни одного или всех) символов из начала и нескольких (возможно, ни одного или всех) символов из конца. Какую минимальную сумму \(\operatorname{MEX}\) всех полученных подстрок можно получить? Выходные данные Для каждого набора входных данных выведите единственное целое число — наименьшую сумму \(\operatorname{MEX}\), которую можно получить, разбив \(s\) на подстроки оптимально. Примечание В первом наборе входных данных минимальная сумма равна \(\operatorname{MEX}(0) + \operatorname{MEX}(1) = 1 + 0 = 1\). Во втором наборе входных данных минимальная сумма равна \(\operatorname{MEX}(1111) = 0\). В третьем наборе входных данных минимальная сумма равна \(\operatorname{MEX}(01100) = 2\).
| |
|
|
C. MAX-MEX разрез
битмаски
дп
жадные алгоритмы
Конструктив
*1000
Бинарная строка — это строка, состоящая из символов \(0\) и \(1\). Би-таблица — это таблица, состоящая из ровно двух бинарных строк одинаковой длины. Определим \(\operatorname{MEX}\) би-таблицы как наименьшую из цифр \(0\), \(1\) или \(2\), которая не встречается в этой би-таблице. Например, \(\operatorname{MEX}\) для \(\begin{bmatrix} 0011\\ 1010 \end{bmatrix}\) — это \(2\), потому что \(0\) и \(1\) встречаются хотя бы один раз. \(\operatorname{MEX}\) для \(\begin{bmatrix} 111\\ 111 \end{bmatrix}\) — это \(0\), потому что \(0\) и \(2\) не встречаются ни разу, и \(0 < 2\). Дана би-таблица с \(n\) столбцами. Необходимо разбить её на произвольное количество би-таблиц (каждая состоит из последовательных столбцов) так, чтобы каждый её столбец принадлежал ровно одной би-таблице. Би-таблицу разрешается разбить на одну би-таблицу — её саму. Какую максимальную сумму \(\operatorname{MEX}\) всех полученных би-таблиц можно получить? Выходные данные Для каждого набора входных данных выведите единственное целое число — наибольшую сумму \(\operatorname{MEX}\), которую можно получить, разбив би-таблицу оптимально. Примечание В первом наборе входных данных би-таблицу можно разбить следующим образом: - \(\begin{bmatrix} 0\\ 1 \end{bmatrix}\), \(\operatorname{MEX}\) равен \(2\).
- \(\begin{bmatrix} 10\\ 10 \end{bmatrix}\), \(\operatorname{MEX}\) равен \(2\).
- \(\begin{bmatrix} 1\\ 1 \end{bmatrix}\), \(\operatorname{MEX}\) равен \(0\).
- \(\begin{bmatrix} 0\\ 1 \end{bmatrix}\), \(\operatorname{MEX}\) равен \(2\).
- \(\begin{bmatrix} 0\\ 0 \end{bmatrix}\), \(\operatorname{MEX}\) равен \(1\).
- \(\begin{bmatrix} 0\\ 0 \end{bmatrix}\), \(\operatorname{MEX}\) равен \(1\).
Сумма \(\operatorname{MEX}\) равна \(8\).
| |
|
|
B. MEXor массива
битмаски
жадные алгоритмы
*1000
Алиса вручила Бобу два целых числа \(a\) и \(b\) (\(a > 0\) и \(b \ge 0\)). Будучи крайне любознательным, Боб выписал массив из неотрицательных целых чисел с \(\operatorname{MEX}\) всех элементов, равным \(a\), и \(\operatorname{XOR}\) всех элементов, равным \(b\). Чему равна наименьшая возможная длина массива, выписанного Бобом? Напомним, что \(\operatorname{MEX}\) (Minimum EXcluded) массива — это наименьшее неотрицательное целое число, которого нет в данном массиве, а \(\operatorname{XOR}\) массива — это побитовое исключающее ИЛИ всех элементов данного массива. Выходные данные Для каждого набора данных, выведите одно (положительное) целое число — длину наикратчайшего возможного массива с \(\operatorname{MEX}\) \(a\) и \(\operatorname{XOR}\) \(b\). Можно показать, что данный массив всегда существует. Примечание В первом наборе входных данных один из кратчайших массивов с \(\operatorname{MEX}\) \(1\) и \(\operatorname{XOR}\) \(1\) равен \([0, 2020, 2021]\). Во втором наборе один из кратчайших массивов с \(\operatorname{MEX}\) \(2\) и \(\operatorname{XOR}\) \(1\) равен \([0, 1]\). Можно показать, что данные массивы имеют наименьшую возможную длину.
| |
|
|
C. Проблемные переносы
битмаски
дп
Комбинаторика
математика
*1600
Алиса только недавно изучила сложение. Однако она еще не полностью освоила концепт «переноса»: вместо того, чтобы переносить цифру в следующий разряд, она переносит ее через один разряд. Например, обычный способ подсчета суммы \(2039 + 2976\) показан ниже: Однако Алиса подсчитывает сумму следующим образом: А именно, она делает следующее: - складывает \(9\) и \(6\), получая \(15\), и переносит \(1\) на два разряда левее, т. е. в столбец «\(0\) \(9\)»;
- складывает \(3\) и \(7\), получая \(10\), и переносит \(1\) на два разряда левее, т. е. в столбец «\(2\) \(2\)»;
- складывает \(1\), \(0\), и \(9\), получая \(10\), и переносит \(1\) на два разряда левее, т. е. в столбец над знаком плюс;
- складывает \(1\), \(2\) и \(2\), получая \(5\);
- складывает \(1\), получая \(1\).
Таким образом, она получает неправильный результат \(15005\). Алиса пришла к Бобу и рассказала, что она сложила два целых числа и получила в результате \(n\). Но Боб знает, что Алиса сложила числа как умеет. Помогите Бобу посчитать количество упорядоченных пар положительных целых чисел таких, что при сложении методом Алисы получается число \(n\). Обратите внимание, что пары \((a, b)\) и \((b, a)\) считаются различными при \(a \ne b\). Выходные данные Для каждого набора входных данных выведите одно целое число — количество упорядоченных пар положительных целых чисел, таких что при сложении своим методом Алиса получит в результате \(n\). Примечание В первом наборе входных данных при сложении Алисой любой из следующих пар: \(1 + 9\), \(2 + 8\), \(3 + 7\), \(4 + 6\), \(5 + 5\), \(6 + 4\), \(7 + 3\), \(8 + 2\) или \(9 + 1\), она получит \(100\) в результате. Изображение, показывающее как Алиса сложит \(6 + 4\), показано ниже:
| |
|
|
E. Восстановление турнирной таблицы
meet-in-the-middle
битмаски
Перебор
реализация
хэши
*2600
\(2^k\) команд участвуют в плей-офф турнире. Турнир состоит из \(2^k - 1\) игры. Они проводятся следующим образом: во-первых, команды делятся на пары: команда \(1\) играет против команды \(2\), команда \(3\) играет против команды \(4\) (именно в таком порядке) и так далее (таким образом, в этой фазе будет сыграно \(2^{k-1}\) игры). Когда команда проигрывает игру, она выбывает, и каждая игра приводит к выбыванию одной команды (нет ничьих). После этого остается \(2^{k-1}\) команд. Если остается только одна команда, она объявляется чемпионом; в противном случае играется еще \(2^{k-2}\) игр: в первой из них победитель игры «\(1\) против \(2\)» играет против победителя игры «\(3\) против \(4\)», затем победитель игры «\(5\) против \(6\)» играет против победителя игры «\(7\) против \(8\)» и так далее. Этот процесс повторяется до тех пор, пока не останется только одна команда. Место команды в турнире зависит от того, в какой фазе турнира она выбыла: - команда-победитель турнира занимает место \(1\);
- команда, выбывшая в финале, занимает место \(2\);
- обе команды, выбывшие в полуфинале, занимают место \(3\);
- все команды, выбывшие в четвертьфинале, занимают место \(5\);
- все команды, выбывшие в 1/8 финала, занимают место \(9\), и так далее.
Например, на этой картинке показан возможный ход турнира при \(k = 3\), а также итоговые места команд при таком ходе турнира: После окончания турнира, который проходил по этим правилам, его результаты были закодированы следующим образом. Пусть \(p_i\) — место, которое заняла \(i\)-я команда. Хэш турнира \(h\) считается по формуле \(h = (\sum \limits_{i=1}^{2^k} i \cdot A^{p_i}) \bmod 998244353\), где \(A\) — некоторое заданное целое число. К сожалению, из-за сбоя системы почти вся информация о прошедшем турнире была утеряна. Остались только значения \(k\), \(A\) и \(h\). Вам нужно по этим трем числам восстановить, какое место заняла какая команда (если это вообще возможно). Выходные данные Если распределения команд по местам, удовлетворяющего всем требованиям, не существует, выведите \(-1\). Иначе выведите \(2^k\) чисел, \(i\)-е из которых должно быть равно \(p_i\) (месту, занятому \(i\)-й командой). Обратите внимание: ваш ответ должен быть корректным вариантом результатов турнира, проводимого по описанным правилам; кроме того, структура турнира является фиксированной (например, команды \(1\) и \(2\) всегда играют между собой в первой фазе турнира). Если существует несколько способов восстановить места, занятые командами, выведите любой из них. Примечание Турнир из первого примера описан на картинке в условии. Для третьего примера, если выбрать расстановку команд по местам \([1, 2, 3, 3]\) (команда \(1\) занимает место \(1\), команда \(2\) занимает место \(2\), команды \(3\) и \(4\) занимают место \(3\)), можно получить хэш турнира, равный \(7020100\) (при \(A = 100\)). Однако такое распределение мест не может быть результатом турнира, потому что команды \(1\) и \(2\) обязательно должны играть друг с другом в полуфинале, поэтому они не могут занять два первых места.
| |
|
|
E. Почини строку
*особая задача
битмаски
дп
жадные алгоритмы
*1700
Правильная скобочная последовательность — это скобочная последовательность, которую можно превратить в корректное арифметическое выражение, вставив символы «1» и «+» между исходными символами. Например: - скобочные последовательности «()()» и «(())» — правильные (из них можно получить выражения «(1)+(1)» и «((1+1)+1)»);
- скобочные последовательности «)(», «(» и «)» — неправильные.
Вам даны две строки \(s\) и \(a\), длина строки \(s\) равна \(n\), длина строки \(a\) равна \(n - 3\). Строка \(s\) — скобочная последовательность (т. е. каждый элемент этой строки — либо символ открывающей скобки, либо символ закрывающей скобки). Строка \(a\) — бинарная (т. е. каждый элемент этой строки — либо 1, либо 0). Строка \(a\) вводит ограничения на строку \(s\): для каждого \(i\), такого, что символ \(a_i\) — это 1, строка \(s_i s_{i+1} s_{i+2} s_{i+3}\) должна быть правильной скобочной последовательностью. Символы строки \(a\), равные 0, не вводят никаких ограничений. Изначально строка \(s\) может не удовлетворять этим ограничениям. Чтобы это исправить, можно проводить следующую операцию любое кол-во раз: заменить некоторый символ \(s\) скобкой другого типа (то есть можно менять открывающие скобки на закрывающие и наоборот). Определите, можно ли поменять некоторые символы в \(s\) таким образом, что она будет удовлетворять всем ограничениям, и если это возможно, посчитайте минимальное кол-во символов, которые надо заменить. Выходные данные Для каждого набора входных данных выведите одно целое число: минимальное количество символов, которое нужно поменять в \(s\), или \(-1\), если все ограничения выполнить невозможно.
| |
|
|
F1. Корней Корнеевич и XOR (простая версия)
битмаски
дп
жадные алгоритмы
*1800
Это более простая версия задачи с меньшими ограничениями. Корней Корнеевич откопал массив \(a\) длины \(n\). Корней Корнеевич недавно прочитал в книге про операцию побитового исключающего «ИЛИ» (XOR), поэтому он захотел поэкспериментировать с ней. Для этого он решил найти все целые \(x \ge 0\) такие, что существует возрастающая подпоследовательность массива \(a\), в которой побитовое исключающее «ИЛИ» ее чисел равно \(x\). Корней Корнеевич довольно быстро нашел все такие \(x\), и хочет проверить свой результат. Для этого он попросил вас решить эту задачу! Последовательность \(s\) является подпоследовательностью \(b\), если \(s\) может быть получена из \(b\) удалением нескольких (возможно, ни одного или всех) элементов. Последовательность \(s_1, s_2, \ldots , s_m\) называется возрастающей, если выполняется неравенство: \(s_1 < s_2 < \ldots < s_m\). Выходные данные В первой строке выведите единственное число \(k\) — количество найденных вами \(x\). Во второй строке выходных данных выведите \(k\) целых неотрицательных чисел в возрастающем порядке \(x_1, x_2, \ldots x_k\) (\(0 \le x_1 < \ldots < x_k\)) — найденные вами \(x\). Примечание В первом наборе входных данных: - Чтобы получить значение \(x = 0\) можно выбрать пустую подпоследовательность
- Чтобы получить значение \(x = 2\) можно выбрать подпоследовательность \([2]\)
- Чтобы получить значение \(x = 4\) можно выбрать подпоследовательность \([4]\)
- Чтобы получить значение \(x = 6\) можно выбрать подпоследовательность \([2, 4]\)
| |
|
|
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\) цветов.
| |
|
|
F. Странная НОП
битмаски
графы
дп
жадные алгоритмы
Строки
*2600
Вам даны \(n\) строк \(s_1, s_2, \ldots, s_n\), состоящих из строчных и заглавных латинских букв. Более того, каждый символ в каждой строке встречается не более двух раз. Найдите самую длинную общую подпоследовательность этих строк. Строка \(t\) является подпоследовательностью строки \(s\), если \(t\) может быть получена из \(s\) удалением нескольких (возможно, ни одного или всех) символов. Выходные данные Для каждого набора входных данных выведите ответ в двух строках. В первой строке выведите длину самой длинной общей подпоследовательности. Во второй — саму подпоследовательность. Если существует несколько самых длинных общих подпоследовательностей, выведите любую из них. Примечание В первом наборе входных данных одна из самых длинных общих подпоследовательностей это «A». Нет ни одной общей подпоследовательности длины \(2\). Во втором наборе входных данных множества символов строк не пересекаются, поэтому никакая непустая строка не может быть общей подпоследовательностью.
| |
|
|
C. Бакри и разделение
битмаски
графы
Деревья
дп
Конструктив
поиск в глубину и подобное
*1700
Бакри столкнулся с задачей, но поскольку ему лень ее решать, он просит вашей помощи. Вам дано дерево на \(n\) вершинах, \(i\)-й вершине присвоено значение \(a_i\) для каждого \(i\) от \(1\) до \(n\). Напомним, что дерево на \(n\) вершинах — это связный граф с \(n-1\) ребрами. Вы хотите удалить из дерева не менее \(1\), но не более \(k-1\) ребер так, чтобы выполнялось следующее условие: Возможно ли выполнить это условие? Выходные данные Для каждого набора входных данных вы должны вывести одну строку. Если вы можете удалить ребра в соответствии с условиями, написанными выше, выведите «YES» (без кавычек). В противном случае выведите «NO» (без кавычек). Вы можете вывести каждую букву «YES» и «NO» в любом регистре (верхнем или нижнем). Примечание Можно показать, что условие недостижимо для первого, третьего и пятого наборов входных данных. Во втором наборе входных данных можно просто удалить все ребра. Останется \(5\) компонент связности, каждая из которых содержит только одну вершину со значением \(3\), поэтому побитовое ИЛИ для каждой из них будет \(3\). В четвертом случае дерево изображено ниже: . Вы можете удалить ребро \((4,5)\). Побитовое ИЛИ первой компоненты будет равен \(a_1 \oplus a_2 \oplus a_3 \oplus a_4 = 1 \oplus 6 \oplus 4 \oplus 1 = 2\) (где \(\oplus\) обозначает побитовое ИЛИ). Побитовое ИЛИ второй компоненты будет равно \(a_5 = 2\).
| |
|
|
E. Скучающий Бакри
битмаски
жадные алгоритмы
математика
*2400
Бакри надоело решать задачи, связанные с xor, поэтому он попросил вас решить для него эту задачу. Вам дан массив \(a\) из \(n\) целых чисел \([a_1, a_2, \ldots, a_n]\). Назовем подмассив \(a_{l}, a_{l+1}, a_{l+2}, \ldots, a_r\) хорошим, если \(a_l \, \& \, a_{l+1} \, \& \, a_{l+2} \, \ldots \, \& \, a_r > a_l \oplus a_{l+1} \oplus a_{l+2} \ldots \oplus a_r\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ, \(\&\) обозначает операцию побитового И. Найдите длину самого длинного хорошего подмассива \(a\), или определите, что такого подмассива не существует. Выходные данные Выведите одно целое число — длину самого длинного хорошего подмассива. Если хороших подмассивов нет, выведите \(0\). Примечание В первом случае ответ равен \(2\), так как весь массив хороший: \(5 \& 6 = 4 > 5 \oplus 6 = 3\). В третьем случае ответ равен \(4\), и один из самых длинных хороших подмассивов - \([a_2, a_3, a_4, a_5]\): \(1\& 3 \& 3 \&1 = 1 > 1\oplus 3 \oplus 3\oplus 1 = 0\).
| |
|
|
B. Особые числа
битмаски
математика
*1100
Теофанису действительно нравятся последовательности положительных целых чисел, а потому его учитель (Yeltsa Kcir) предложил ему задачу про последовательность, которая состоит только из особых чисел. Назовем положительное число особым, если оно может быть представлено как сумма различных неотрицательных степеней числа \(n\). Например, для \(n = 4\) число \(17\) является особым, так как может быть представлено как \(4^0 + 4^2 = 1 + 16 = 17\), а вот \(9\) не является. Теофанис просит вас помочь ему найти \(k\)-е особое число, если они отсортированы в порядке возрастания. Так как данное число может быть слишком большим, выведите его по модулю \(10^9+7\). Выходные данные Для каждого набора входных данных выведите одно целое число — \(k\)-е особое число в порядке возрастания по модулю \(10^9+7\). Примечание При \(n = 3\), последовательность начинается с \([1,3,4,9...]\)
| |
|
|
F. ПСП
Бинарный поиск
битмаски
дп
Перебор
Структуры данных
*2400
Правильная скобочная последовательность (или, коротко, ПСП) — это скобочная последовательность, которую можно превратить в корректное арифметическое выражение, вставив символы «1» и «+» между исходными символами. Например: - скобочные последовательности «()()» и «(())» — правильные (из них можно получить выражения «(1)+(1)» и «((1+1)+1)»);
- скобочные последовательности «)(», «(» и «)» — неправильные.
Обозначим конкатенацию двух строк \(x\) и \(y\) как \(x+y\). Например, «()()» \(+\) «)(» \(=\) «()())(». У вас есть \(n\) скобочных последовательностей \(s_1, s_2, \dots, s_n\). Вы можете переставить эти строки в любом порядке (можно переставлять только сами строки, но не символы в них). Ваша задача — переставить строки в таком порядке, чтобы у строки \(s_1 + s_2 + \dots + s_n\) было как можно больше непустых префиксов, являющихся ПСП. Выходные данные Выведите одно число — максимальное количество непустых префиксов, являющихся ПСП, у строки \(s_1 + s_2 + \dots + s_n\), если вы переставите строки \(s_1, s_2, \dots, s_n\) оптимальным образом. Примечание В первом примере из условия можно склеить строки следующим образом: «(» \(+\) «)» \(=\) «()», у полученной строки будет один префикс, являющийся ПСП: «()». Во втором примере из условия можно склеить строки следующим образом: «(» \(+\) «)» \(+\) «()()())» \(+\) «(» \(=\) «()()()())(», у полученной строки будет четыре префикса, являющихся ПСП: «()», «()()», «()()()», «()()()()». В третьем и в четвертом примере всего по одной строке, поэтому поменять порядок строк невозможно.
| |
|
|
J. Bob's Beautiful Array
битмаски
жадные алгоритмы
Перебор
*2600
Bob really likes playing with arrays of numbers. That's why for his birthday, his friends bought him a really interesting machine – an array beautifier. The array beautifier takes an array \(A\) consisting of \(N\) integers, and it outputs a new array \(B\) of length N that it constructed based on the array given to it. The array beautifier constructs the new array in the following way: it takes two numbers at different indices from the original array and writes their sum to the end of the new array. It does this step \(N\) times - resulting in an output array of length \(N\). During this process, the machine can take the same index multiple times in different steps. Bob was very excited about the gift that his friends gave him, so he put his favorite array in the machine. However, when the machine finished, Bob was not happy with the resulting array. He misses his favorite array very much, and hopes to get it back. Given the array that the machine outputted, help Bob find an array that could be the original array that he put in the machine. Sometimes the machine makes mistakes, so it is possible that no appropriate input array exists for the array it has outputted. In such case, let Bob know that his array is forever lost. Output If an appropriate input array exists, print "YES", followed by the input array \(A_1\), \(A_2\), ..., \(A_N\) (\(-10^9 \leq A_i \leq 10^9\)) in the next line. Otherwise, print "NO".
| |
|
|
E. Рыбы
битмаски
дп
Теория вероятностей
*1900
В озере живет n рыб, пронумерованных от 1 до n. Каждый день ровно одна пара рыб встречается друг с другом, причем вероятности встречи каждой пары равны между собой. Если две рыбы с номерами i и j встретились, то первая съест вторую с вероятностью aij, а вторая первую –– с вероятностью aji = 1 - aij. Этот процесс продолжается, пока в озере остается хотя бы две рыбы. Для каждой рыбы посчитайте вероятность того, что она останется последней в озере. Выходные данные Выведите n вещественных чисел, разделенных пробелами, с точностью не менее 6 знаков после точки. Число с номером i должно быть равно вероятности того, что рыба с номером i останется последней в озере.
| |
|
|
J. Robot Factory
битмаски
поиск в глубину и подобное
*1400
You have received data from a Bubble bot. You know your task is to make factory facilities, but before you even start, you need to know how big the factory is and how many rooms it has. When you look at the data you see that you have the dimensions of the construction, which is in rectangle shape: N x M. Then in the next N lines you have M numbers. These numbers represent factory tiles and they can go from 0 to 15. Each of these numbers should be looked in its binary form. Because from each number you know on which side the tile has walls. For example number 10 in it's binary form is 1010, which means that it has a wall from the North side, it doesn't have a wall from the East, it has a wall on the South side and it doesn't have a wall on the West side. So it goes North, East, South, West. It is guaranteed that the construction always has walls on it's edges. The input will be correct. Your task is to print the size of the rooms from biggest to smallest. Output Once you finish processing the data your output consists of one line sorted from biggest to smallest room sizes.
| |
|
|
A. Уничтожение массива
битмаски
жадные алгоритмы
математика
теория чисел
*1300
Вам задан массив \(a_1, a_2, \ldots, a_n\), состоящий из неотрицательных целых чисел. Определим операцию «уничтожения» с целочисленным параметром \(k\) (\(1 \leq k \leq n\)) следующим образом: - Выбираем \(k\) различных индексов массива \(1 \leq i_1 < i_2 < \ldots < i_k \le n\).
- Вычисляем \(x = a_{i_1} ~ \& ~ a_{i_2} ~ \& ~ \ldots ~ \& ~ a_{i_k}\), где \(\&\) обозначает операцию побитового И (обратитесь к тексту в примечании для формального определения).
- Вычитаем \(x\) из всех \(a_{i_1}, a_{i_2}, \ldots, a_{i_k}\); остальные элементы массива оставляем без изменения.
Найдите все значения \(k\), для которых с помощью конечного количества операций уничтожения с параметром \(k\) можно сделать все элементы массива \(a\) равными \(0\). Можно показать, что для любого массива \(a\) существует хотя бы одно подходящее \(k\). Обратите внимание, что вы сначала выбираете значение \(k\) и только потом применяете операции уничтожения с первоначально выбранным параметром \(k\). Выходные данные Для каждого набора входных данных выведите все значения \(k\), для которых с помощью операций уничтожения (с заданным параметром \(k\)) можно сделать все элементы массива \(a\) равными \(0\). Выводите их в возрастающем порядке. Примечание В первом наборе входных данных: - При \(k = 1\) мы можем сделать четыре операции уничтожения с наборами индексов \(\{1\}\), \(\{2\}\), \(\{3\}\), \(\{4\}\). Так как \(\&\) одного элемента равен самому элементу, то при каждой операции \(x = a_i\), и \(a_i - x = a_i - a_i = 0\).
- При \(k = 2\) мы можем сделать две операции уничтожения с наборами индексов, например, \(\{1, 3\}\) и \(\{2, 4\}\): \(x = a_1 ~ \& ~ a_3\) \(=\) \(a_2 ~ \& ~ a_4\) \(=\) \(4 ~ \& ~ 4 = 4\). При каждой из этих операций \(x = 4\), а потому после первой операции \(a_1 - x = 0\) и \(a_3 - x = 0\), и после второй — \(a_2 - x = 0\) и \(a_4 - x = 0\).
- При \(k = 3\) невозможно сделать все \(a_i\) равными \(0\). Если мы сделаем любую операцию уничтожения в самом начале, то в нашем массиве три числа станут равными \(0\) и одно число останется равным \(4\). После этого любая операция уничтожения не будет изменять массив, потому что среди выбранных индексов будет хотя бы один, значение массива для которого уже равно \(0\).
- При \(k = 4\) мы можем сделать одну операцию уничтожения с набором индексов \(\{1, 2, 3, 4\}\), потому что \(x = a_1 ~ \& ~ a_2 ~ \& ~ a_3 ~ \& ~ a_4\) \(= 4\).
Во втором наборе входных данных при \(k = 2\) мы можем сделать следующие операции уничтожения: - Операция с индексами \(\{1, 3\}\): \(x = a_1 ~ \& ~ a_3\) \(=\) \(13 ~ \& ~ 25 = 9\). \(a_1 - x = 13 - 9 = 4\) и \(a_3 - x = 25 - 9 = 16\). Массив \(a\) после операции станет \([4, 7, 16, 19]\).
- Операция с индексами \(\{3, 4\}\): \(x = a_3 ~ \& ~ a_4\) \(=\) \(16 ~ \& ~ 19 = 16\). \(a_3 - x = 16 - 16 = 0\) и \(a_4 - x = 19 - 16 = 3\). Массив \(a\) после операции станет \([4, 7, 0, 3]\).
- Операция с индексами \(\{2, 4\}\): \(x = a_2 ~ \& ~ a_4\) \(=\) \(7 ~ \& ~ 3 = 3\). \(a_2 - x = 7 - 3 = 4\) и \(a_4 - x = 3 - 3 = 0\). Массив \(a\) после операции станет \([4, 4, 0, 0]\).
- Операция с индексами \(\{1, 2\}\): \(x = a_1 ~ \& ~ a_2\) \(=\) \(4 ~ \& ~ 4 = 4\). \(a_1 - x = 4 - 4 = 0\) и \(a_2 - x = 4 - 4 = 0\). Массив \(a\) после операции станет \([0, 0, 0, 0]\).
Формальное определение побитового «И» Определим операцию побитового «И» (\(\&\)). Пусть даны два целых неотрицательных числа \(x\) и \(y\), рассмотрим их двоичные записи (возможно с ведущими нулями): \(x_k \dots x_2 x_1 x_0\) и \(y_k \dots y_2 y_1 y_0\). Здесь \(x_i\) это \(i\)-й бит числа \(x\), а \(y_i\) это \(i\)-й бит числа \(y\). Пусть \(r = x ~ \& ~ y\) — результат операции \(\&\) над числами \(x\) и \(y\). Тогда двоичной записью \(r\) будет \(r_k \dots r_2 r_1 r_0\), где: \(\) r_i = \begin{cases} 1, ~ \text{if} ~ x_i = 1 ~ \text{and} ~ y_i = 1 \\ 0, ~ \text{if} ~ x_i = 0 ~ \text{or} ~ y_i = 0 \end{cases} \(\)
| |
|
|
D. Деревонумерация
битмаски
Деревья
жадные алгоритмы
игры
Конструктив
поиск в глубину и подобное
реализация
*2100
Eikooc и Sushi играют в игру. Игра проводится на дереве из \(n\) вершин, пронумерованных от \(1\) до \(n\). Напомним, что дерево с \(n\) вершинами это неориентированный связный граф с \(n-1\) ребрами. Игроки поочередно перемещают фишку по дереву. Eikooc делает первый ход, помещая фишку на любую вершину по своему выбору. Sushi делает следующий ход, затем Eikooc, затем Sushi, и так далее. В каждый ход после первого, игрок должен переместить фишку в какую-то вершину \(u\) такую, что: - Между вершинами \(u\) и \(v\) (на которой фишка находится данный момент), есть ребро
- \(u\) не была посещена ранее
- \(u \oplus v \leq min(u, v)\)
Здесь \(x \oplus y\) обозначает операцию побитового исключающего ИЛИ чисел \(x\) и \(y\). Оба игрока играют оптимально. Игрок, который не может сделать ход, проигрывает. Ниже приведены примеры, демонстрирующие правила игры. Предположим, Eikooc начинает игру, помещая фишку в вершину \(4\). Затем Sushi перемещает фишку в вершину \(6\), которая не была посещена и является соседней к \(4\). Также \(6 \oplus 4 = 2 \leq min(6, 4)\). На следующем ходу Eikooc перемещает фишку в вершину \(5\), которая не была посещена и является соседней к \(6\). Также, \(5 \oplus 6 = 3 \leq min(5, 6)\). У Sushi больше нет ходов для игры, поэтому она проигрывает. | Предположим, Eikooc начинает игру, помещая фишку в вершинул \(3\). Sushi перемещает фишку в вершину \(2\), которая не была посещена и является соседней к \(3\). Также \(3 \oplus 2 = 1 \leq min(3, 2)\). Eikooc не может переместить фишку в вершину \(6\), так как \(6 \oplus 2 = 4 \nleq min(6, 2)\). Поскольку у Eikooc нет ходов для игры, она проигрывает. | Перед началом игры Eikooc решает тайком перенумеровать вершины дерева в свою пользу. Формально, перенумерация — это перестановка \(p\) длины \(n\) (последовательность из \(n\) целых чисел, где каждое целое число от \(1\) до \(n\) встречается ровно один раз), где \(p_i\) обозначает новый номер вершины \(i\). Она хочет максимизировать количество вершин, которые она может выбрать в первый ход, для которых она сможет гарантировать себе победу. Помогите Eikooc найти любую перенумерацию, которая поможет ей в этом. Выходные данные Для каждого набора входных данных выведите любую подходящую перестановку — перестановку длины \(n\), которая максимизирует количество вершин, которые Eikooc может выбрать в первый ход и иметь выиграшную стратегию. Если таких перестановок несколько, вы можете вывести любую из них. Примечание В первом наборе входных данных у Eikooc есть только одна вершина. У Sushi не будет ходов после того, как Eikooc выберет эту вершину, и Eikooc выиграет. Во втором наборе входных данных \(1 \oplus 2 = 3 \nleq min(1, 2)\). Следовательно, после того, как Eikooc выберет любую из вершин, у Sushi не останется ходов, и Eikooc выиграет. И \(\{1, 2\}\), и \(\{2, 1\}\) являются допустимыми перенумерациями.
| |
|
|
E. Невнимательный Василий
битмаски
дп
матрицы
Структуры данных
*2400
Перед тем как стать успешным трейдером, Василий закончил университет. Во время его обучения произошел один случай, после которого Василий стал намного внимательнее слушать условия заданий для домашней работы. Далее приведено формальное условие домашнего задания в том виде, как его услышал Василий. Дана строка \(s\) длины \(n\), состоящая только из символов «a», «b» и «c». Есть \(q\) запросов вида (\(pos, c\)), который обозначает замену элемента строки \(s\) на позиции \(pos\) на символ \(c\). После каждого запроса требуется вывести минимальное количество символов в строке, которые нужно заменить, чтобы строка не содержала строку «abc» в качестве подпоследовательности. Правильной заменой символа является его изменение на символ «a», «b» или «c». Строка \(x\) называется подпоследовательностью строки \(y\), если \(x\) может быть получена из \(y\) с помощью удаления некоторых символов без изменения порядка оставшихся символов. Выходные данные Для каждого запроса выведите минимальное количество символов, которые необходимо заменить, чтобы строка не содержала «abc» как подпоследовательность. Примечание Рассмотрим состояния строки после каждого запроса: - \(s = \)«aaaaccccc». В этом случае строка не содержит «abc» как подпоследовательность, поэтому замен делать не требуется.
- \(s = \)«aaabccccc». В этом случае можно сделать 1 замену и получить, например, строку \(s = \)«aaaaccccc». Эта строка не содержит «abc» как подпоследовательность.
- \(s = \)«ababccccc». В этом случае можно сделать 2 замены и получить, например, строку \(s = \)«aaaaccccc». Эта строка не содержит «abc» как подпоследовательность.
- \(s = \)«ababacccc». В этом случае можно сделать 2 замены и получить, например, строку \(s = \)«aaaaacccc». Эта строка не содержит «abc» как подпоследовательность.
- \(s = \)«bbabacccc». В этом случае можно сделать 1 замену и получить, например, строку \(s = \)«bbacacccc». Эта строка не содержит «abc» как подпоследовательность.
- \(s = \)«bbababccc». В этом случае можно сделать 2 замены и получить, например, строку \(s = \)«bbacacccc». Эта строка не содержит «abc» как подпоследовательность.
- \(s = \)«bbabcbccc». В этом случае можно сделать 1 замену и получить, например, строку \(s = \)«bbcbcbccc». Эта строка не содержит «abc» как подпоследовательность.
- \(s = \)«baabcbccc». В этом случае можно сделать 2 замены и получить, например, строку \(s = \)«bbbbcbccc». Эта строка не содержит «abc» как подпоследовательность.
- \(s = \)«aaabcbccc». В этом случае можно сделать 2 замены и получить, например, строку \(s = \)«aaacccccc». Эта строка не содержит «abc» как подпоследовательность.
- \(s = \)«aaababccc». В этом случае можно сделать 2 замены и получить, например, строку \(s = \)«aaacacccc». Эта строка не содержит «abc» как подпоследовательность.
- \(s = \)«aaababccc». В этом случае можно сделать 2 замены и получить, например, строку \(s = \)«aaacacccc». Эта строка не содержит «abc» как подпоследовательность.
- \(s = \)«aaababbcc». В этом случае можно сделать 2 замены и получить, например, строку \(s = \)«aaababbbb». Эта строка не содержит «abc» как подпоследовательность.
| |
|
|
C. Divan и битовые операции
битмаски
дп
Комбинаторика
Конструктив
математика
*1500
Однажды Divan проанализировал последовательность \(a_1, a_2, \ldots, a_n\), состоящую из \(n\) целых неотрицательных чисел, следующим образом. Он рассмотрел все непустые подпоследовательности последовательности \(a\), вычислил побитовое исключающее ИЛИ её элементов, после чего просуммировал все полученные результаты, получив удобство последовательности \(a\). Напомним, что последовательность \(c\) является подпоследовательностью последовательности \(d\), если \(c\) может быть получена из \(d\) путем удаления нескольких элементов (возможно, ни одного). Например, \([1, \, 2, \, 3, \, 4]\), \([2, \, 4]\) и \([2]\) являются подпоследовательностями \([1, \, 2, \, 3, \, 4]\), а \([4, \, 3]\) и \([0]\) не являются. Divan очень гордился проведенным анализом, но теперь потерял и последовательность \(a\), и значение ее удобства! Однако Divan помнит значение побитового ИЛИ на \(m\) непрерывных подотрезках последовательности \(a\). Оказалось, что каждый элемент последовательности входит хотя бы в один из этих \(m\) отрезков. Divan просит вас найти удобство последовательности \(a\), используя информацию, которую он помнит. Если возможны несколько значений удобства, выведите любое. Так как ответ может быть большим, выведите его по модулю \(10^9 + 7\). Выходные данные Для каждого набора входных данных выведите любое возможное удобство последовательности \(a\) по модулю \(10^9 + 7\). Примечание В первом примере одной из последовательностей, которая подходит под ограничения, является \([0, 2]\). Рассмотрим все её непустые подпоследовательности: - \([0]\): побитовое исключающее ИЛИ равно \(0\);
- \([2]\): побитовое исключающее ИЛИ равно \(2\);
- \([0, 2]\): побитовое исключающее ИЛИ равно \(2\).
Суммируя полученные числа, получаем \(4\), что является ответом. Во втором примере одной из последовательностей, которая подходит под ограничения, является \([0, \, 5, \, 5]\). В третьем примере одной из последовательностей, которая подходит под ограничения, является \([5, \, 6, \, 7, \, 0, \, 2]\).
| |
|
|
B. И не ноль
битмаски
жадные алгоритмы
математика
*1300
Вам задан массив из всех целых чисел из отрезка \([l, r]\) включая границы. Например, если \(l = 2\) и \(r = 5\), массив будет равен \([2, 3, 4, 5]\). Какое наименьшее количество элементов вам нужно из него удалить, чтобы побитовое И массива перестало быть равно нулю? Побитовое И — бинарная операция, действие которой эквивалентно применению логического И к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях чисел. Выходные данные Для каждого набора входных данных выведите одно целое число — ответ на задачу. Примечание В первом наборе входных данных, массив равен \([1, 2]\). Сначала, побитовое И равно \(0\), так как \(1\ \& \ 2 = 0\). Однако, после удаления \(1\) (или \(2\)), массив станет равен \([2]\) (или \([1]\)), и его побитовое И будет равно \(2\) (или \(1\)). Можно доказать, что этот ответ оптимальный, то есть ответ равен \(1\). Во втором наборе, массив равен \([2, 3, 4, 5, 6, 7, 8]\). Сначала, побитовое И равно \(0\). Однако после удаления \(4\), \(5\) и \(8\), массив станет равен \([2, 3, 6, 7]\), и его побитовое И будет равно \(2\). Можно доказать, что этот ответ оптимальный, то есть ответ равен \(3\). Заметим, что возможны и другие способы удалить \(3\) элемента.
| |
|
|
D. (XO)R-ождественское дерево
битмаски
графы
Деревья
поиск в глубину и подобное
снм
*2200
Это была ночь перед рождеством, и пришло время Санте украсить свое Рождественское дерево. Это дерево состоит из \(n\) вершин, соединенных \(n-1\) ребром. На каждом ребре дерева расположена гирлянда, которую можно описать некоторым числом в двоичном представлении. Посмотреть на это дерево собралось \(m\) эльфов. Каждый эльф выбрал две вершины \(a\) и \(b\), и он смотрит только на гирлянды на простом пути между этими вершинами. В результате созерцания у эльфа появляется любимое число, равное побитовому исключающему ИЛИ значений на ребрах этого пути. Однако, Северный Полюс только начал восстанавливаться после недавней эпидемии ОРВИ. Из-за этого Санта успел забыть, как выглядели некоторые гирлянды, и проверить их он не может, потому что уже покинул Северный Полюс! К счастью, на помощь пришли эльфы: каждый из них сообщил Санте свою пару вершин \((a_i, b_i)\), и четность количества единичных битов в своем любимом числе. Другими словами, каждый эльф помнит, было ли количество \(1\)-ц в его любимом числе, записанном в двоичном виде, четным или нечетным. Помогите Санте проверить, могло ли существовать такое дерево, и если да, как оно могло выглядеть, и возможно вы войдете в историю! Выходные данные Для каждого набора входных данных, сначала выведите YES или NO (в любом регистре), в зависимости от того, существует ли дерево, соответствующее памяти Санты, или нет. Если ответ YES, выведите \(n-1\) строк по три целых числа в каждом: \(x\), \(y\) и \(v\) (\(1 \le x, y \le n\); \(0 \le v < 2^{30}\)) — ребро дерева и число, описывающее состояние гирлянды на нем. Множество ребер должно совпадать с множеством из входных данных, и если состояние гирлянды на ребре известно, то оно не должно измениться. Вы можете выводить ребра в любом порядке. Если существует несколько решений, выведите любое. Примечание Первый набор входных данных соответствует изображению из условия. Один из возможных ответов — это присвоить ребру \((1, 2)\) значение \(5\), а ребру \((2, 5)\) — значение \(3\). Этот способ подходит потому что: - Первый эльф рассматривает путь между вершинами \(2\) и \(3\). Его любимое число будет равно \(4\), а потому он помнит значение \(1\) (так как в двоичном представлении \(4\) нечетное количество битов \(1\)).
- Второй эльф рассматривает путь между вершинами \(2\) и \(5\). Его любимое число будет равно \(3\), а потому он помнит значение \(0\) (так как в двоичном представлении \(3\) четное количество битов \(1\)).
- Третий эльф рассматривает путь между вершинами \(5\) и \(6\). Его любимое число будет равно \(7\), а потому он помнит значение \(1\) (так как в двоичном представлении \(7\) нечетное количество битов \(1\)).
- Четвертый эльф рассматривает путь между вершинами \(6\) и \(1\). Его любимое число будет равно \(1\), а потому он помнит значение \(1\) (так как в двоичном представлении \(1\) нечетное количество битов \(1\)).
- Пятый эльф рассматривает путь между вершинами \(4\) и \(5\). Его любимое число будет равно \(4\), а потому он помнит значение \(1\) (так как в двоичном представлении \(4\) нечетное количество битов \(1\)).
Заметим, что существуют и другие возможные ответы.
| |
|
|
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\).
| |
|
|
F. Развороты
битмаски
Конструктив
математика
поиск в глубину и подобное
реализация
Строки
*2000
Вам даны два целых положительных числа \(x\) и \(y\). Вы можете совершать с числом \(x\) следующую операцию: записать его в двоичном виде без ведущих нулей, приписать справа \(0\) или \(1\), затем развернуть двоичную запись и превратить ее в десятичное число, которое окажется новым значением \(x\). Например: - \(34\) можно одной операцией превратить в \(81\): двоичная запись \(34\) — это \(100010\), если приписать справа \(1\), развернуть и убрать ведущие нули, можно получить \(1010001\), что является двоичной записью числа \(81\);
- \(34\) можно одной операцией превратить в \(17\): двоичная запись \(34\) — это \(100010\), если приписать справа \(0\), развернуть и убрать ведущие нули, можно получить \(10001\), что является двоичной записью числа \(17\);
- \(81\) можно одной операцией превратить в \(69\): двоичная запись \(81\) — это \(1010001\), если приписать справа \(0\), развернуть и убрать ведущие нули, можно получить \(1000101\), что является двоичной записью числа \(69\);
- \(34\) можно превратить в \(69\) за две операции: сначала превратить \(34\) в \(81\), а потом превратить \(81\) в \(69\).
Ваша задача — выяснить, можно ли превратить \(x\) в \(y\) за какое-то (возможно, нулевое) число операций. Выходные данные Выведите YES, если вы можете сделать \(x\) равным \(y\), или NO, если это невозможно. Примечание В первом примере не надо совершать никаких действий. Четвертый пример разобран в условии задачи.
| |
|
|
G. Подпоследовательности повсюду
битмаски
дп
Комбинаторика
*2400
Для последовательности строк \([t_1, t_2, \dots, t_m]\) введем функцию \(f([t_1, t_2, \dots, t_m])\), которая равна кол-ву различных строк (включая пустую строку), которые являются подпоследовательностями хотя бы одной строки \(t_i\). \(f([]) = 0\) (то есть значение такой функции для пустой последовательности строк равно \(0\)). Вам задана последовательность строк \([s_1, s_2, \dots, s_n]\). Каждая строка в этой последовательности состоит из строчных латинских букв и является отсортированной (то есть каждая строка начинается с нескольких (возможно, ни одного) символов a, затем идут несколько (возможно, ноль) символов b, ..., в конце идут несколько (возможно, ноль) символов z). Для каждой из \(2^n\) подпоследовательностей \([s_1, s_2, \dots, s_n]\), посчитайте значение функции \(f\) по модулю \(998244353\). Выходные данные Так как выводить \(2^{23}\) чисел довольно долго, представьте ответ следующим образом: Для каждой из \(2^n\) подпоследовательностей (мы обозначим подпоследовательность как \([s_{i_1}, s_{i_2}, \dots, s_{i_k}]\)) посчитайте \(f([s_{i_1}, s_{i_2}, \dots, s_{i_k}])\), возьмите это значение по модулю \(998244353\), а затем умножьте на \(k \cdot (i_1 + i_2 + \dots + i_k)\). Выведите XOR всех \(2^n\) чисел, которые у вас получатся. Индексы \(i_1, i_2, \dots, i_k\) в описании подпоследовательности заданы в \(1\)-индексации (то есть они от \(1\) до \(n\)).
| |
|
|
E. Тест по математике
битмаски
жадные алгоритмы
Перебор
*2200
Петя — учитель по математике. \(n\) его студентов написали тест, состоящий из \(m\) вопросов. Для каждого студента известно на какие вопросы он ответил верно, а на какие нет. Если студент правильно ответил на \(j\)-й вопрос, он получает \(p_j\) баллов (иначе он получает \(0\) баллов). Причем баллы за вопросы распределены так, что массив \(p\) является перестановкой чисел от \(1\) до \(m\). Для \(i\)-го студента Петя знает, что он ожидает получить \(x_i\) баллов за тест. Пете стало интересно, насколько неожиданными могут быть результаты. Петя считает, что неожиданность результатов для студентов равна \(\sum\limits_{i=1}^{n} |x_i - r_i|\), где \(r_i\) — количество баллов, которое \(i\)-й студент получил за тест. Ваша задача — помочь Пете, найти такую перестановку \(p\), для которой неожиданность результатов максимальна. Если оптимальных ответов несколько, выведите любой из них. Выходные данные Для каждого набора входных данных выведите \(m\) целых чисел — перестановку \(p\), для которой неожиданность результатов максимальна. Если оптимальных ответов несколько, выведите любой из них.
| |
|
|
G. Дерево минимального ора
битмаски
графы
жадные алгоритмы
поиск в глубину и подобное
снм
*1900
В последнее время Влад увлёкся остовными деревьями, так что его друзья не долго думая подарили ему на день рождения связный взвешенный неориентированный граф из \(n\) вершин и \(m\) рёбер. Влад определил орность остовного дерева как побитовое ИЛИ всех его весов и теперь его интересует, какова минимальная возможная орность, которой можно добиться, выбрав некоторое остовное дерево. Остовное дерево — связный подграф данного графа, не содержащий циклов. Иными словами вы хотите оставить \(n-1\) ребро, так чтобы граф остался связным и побитовое ИЛИ весов рёбер было как можно меньше. Вы должны найти само побитовое ИЛИ. Выходные данные Выведите \(t\) строк, каждая из которых содержит ответ на соответствующий набор входных данных — минимальную возможную орность остовного дерева.
| |
|
|
A. Древняя цивилизация
битмаски
жадные алгоритмы
математика
*800
Марсианские ученые исследуют Ганимед, один из многочисленных спутников Юпитера. Недавно на нем были обнаружены руины древней цивилизации. Ученые доставили на Марс несколько табличек с надписями на неизвестном науке языке. Было установлено, что жители Ганимеда использовали алфавит из двух букв, причем каждое слово имело фиксированную длину — ровно \(\ell\) букв. Поэтому ученые решили записывать каждое слово этого языка как целое положительное число от \(0\) до \(2^{\ell} - 1\). Первой букве алфавита соответствуют нули в двоичной записи числа, а второй букве алфавита — единицы. Одно и то же слово может иметь в языке разные формы. Тогда необходимо восстановить начальную форму слова. Ниже описано, как это делается. Назовем расстоянием между двумя словами количество позиций, в которых эти слова различаются. Например, расстояние между словами \(1001_2\) и \(1100_2\) (в двоичной записи) равно двум, т. к. они имеют разные буквы на второй и четвертой позициях, если считать слева направо. Будем в дальнейшем обозначать расстояние между словами \(x\) и \(y\) как \(d(x, y)\). Пусть слово имеет \(n\) форм, \(i\)-я из которых описывается целым числом \(x_i\). Все \(x_i\) не обязательно различны, т. к. две разные формы слова могут записываться одинаково. Рассмотрим некоторое слово \(y\). Тогда близость слова \(y\) равна сумме расстояний до каждой из форм исследуемого слова, т. е. сумме \(d(x_i, y)\) по всем \(1 \le i \le n\). Начальной формой является слово \(y\) с минимально возможной близостью. Вам необходимо помочь ученым и написать программу, которая находит начальную форму слова по всем его известным формам. Обратите внимание, что начальная форма не обязательно должна совпадать с какой-либо из известных \(n\) форм слова. Выходные данные Для каждого теста выведите одно целое число — начальную форму слова, т. е. такое \(y\) (\(0 \le y \le 2^\ell - 1\)), что сумма \(d(x_i, y)\) по всем \(1 \le i \le n\) минимально возможная. Обратите внимание, что \(y\) не обязано совпадать с каким-либо числом из \(x_i\). Если вариантов восстановить начальную форму слова несколько, выведите любой из них. Примечание Рассмотрим примеры из условия. В первом примере слова в двоичной записи записываются как \(x_1 = 10010_2\), \(x_2 = 01001_2\) и \(x_3 = 10101_2\). Пусть \(y = 10001_2\). Тогда \(d(x_1, y) = 2\) (различие в четвертой и пятой позиции), \(d(x_2, y) = 2\) (различие в первой и второй позиции), \(d(x_3, y) = 1\) (различие в третьей позиции). Получаем, что близость равна \(2 + 2 + 1 = 5\). Можно показать, что меньшего значения близости добиться невозможно. Во втором примере все формы слова одинаковы и равны \(18\) (\(10010_2\) в двоичной записи), поэтому начальная форма тоже равна \(18\). Как нетрудно догадаться, близость в таком случае равна нулю.
| |
|
|
D. Двоичные пауки
битмаски
Деревья
математика
реализация
сортировки
Структуры данных
*2300
На Марсе обитает необычный вид пауков — Двоичные пауки. Они плетут паутину, чтобы защищаться от врагов. Чтобы сплести паутину, пауки объединяются в пары. При этом, если у первого паука в паре \(x\) лапок, а у второго — \(y\) лапок, то у них выходит паутина прочностью \(x \oplus y\). Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Двоичные пауки живут большими группами. Сейчас Вы наблюдаете за группой из \(n\) пауков, причем \(i\)-й паук имеет \(a_i\) лапок. Когда группе пауков грозит опасность, то некоторые из них становятся защитниками. Защитники выбираются следующим образом. Во-первых, должно быть как минимум два паука-защитника. Во-вторых, любая пара из пауков-защитников должна уметь сплести паутину прочностью хотя бы \(k\). В-третьих, защитников должно быть как можно больше. Ученые долго исследовали поведение Двоичных пауков и выдвинули гипотезу, что они всегда могут выбрать защитников оптимальным образом, удовлетворяя при этом условиям выше. Вам предстоит проверить эту гипотезу на группе пауков. Для этого надо понять, сколько пауков должны стать защитниками. А поскольку Вы не являетесь Двоичным пауком, то Вы решили прибегнуть к помощи компьютера и написать программу, которая решает эту непростую задачу. Выходные данные В первой строке выведите целое число \(\ell\) (\(2 \le \ell \le n\)) — максимально возможное количество пауков-защитников. Во второй строке выведите через пробел \(\ell\) различных целых чисел \(b_i\) (\(1 \le b_i \le n\)) — номера пауков, которые станут защитниками. Если существует несколько способов выбрать защитников, то выведите любой из них. Увы, может получиться и так, что собрать защитников невозможно. В таком случае требуется вывести единственное число \(-1\). Примечание Рассмотрим пример из условия. В первом примере группа пауков выглядит следующим образом: Возьмем трех пауков: с двумя, десятью и \(16\)-ю лапками. Тогда нетрудно видеть, что каждая пара сможет сплести достаточно прочную паутину, т. к. \(2 \oplus 10 = 8 \ge 8\), \(2 \oplus 16 = 18 \ge 8\) и \(10 \oplus 16 = 26 \ge 8\). Данный вариант выбора не единственный: можно, к примеру, выбрать трех пауков с номерами \(3\), \(4\) и \(6\). Во втором примере никакая пара пауков не сможет сплести паутину прочностью \(1024\) или больше, поэтому ответ \(-1\).
| |
|
|
A. И-сопоставление
битмаски
Конструктив
*1500
Дан набор из \(n\) (\(n\) всегда равно степени \(2\)) элементов, содержащих все целые числа \(0, 1, 2, \ldots, n-1\) единожды. Найдите \(\frac{n}{2}\) пар элементов таких, что: - Каждый элемент набора принадлежит ровно одной паре.
- Сумма по всем парам побитового И элементов пары должна быть в точности равна \(k\). Формально, если \(a_i\) и \(b_i\) — элементы \(i\)-й пары, то должно выполняться \(\)\sum_{i=1}^{n/2}{a_i \& b_i} = k,\(\) где \(\&\) обозначает операцию побитового И.
Если существует несколько решений, найдите любое из них. Если решений не существует, выведите \(-1\). Выходные данные Для каждого набора входных данных, если решения не существует, выведите одну строку, содержащую \(-1\). В противном случае выведите \(\frac{n}{2}\) строк, \(i\)-я их них должна содержать \(a_i\) и \(b_i\) — элементы \(i\)-й пары. Если существует несколько решений, выведите любое. Порядок пар и элементов в парах не имеет значения. Примечание В первом наборе входных данных \((0\&3)+(1\&2) = 0\). Во втором наборе \((0\&2)+(1\&3) = 1\). В третьем наборе \((0\&1)+(2\&3) = 2\). В четвертом наборе решения не существует.
| |
|
|
B. Постройка крыши
битмаски
Конструктив
*1000
В 179-й школе наконец решили построить крышу над полем для игры в футбол. Уже известно, что для строительства потребуется последовательно поставить \(n\) вертикальных опор. При этом директор школы хочет, чтобы высоты всех опор образовывали перестановку \(p\) чисел от \(0\) до \(n - 1\), где \(p_i\) — высота \(i\)-й слева опоры \((1 \le i \le n)\). Вам, как заведующему строительством, известно, что стоимость постройки последовательности опор определяется как максимальное значение побитового исключающего ИЛИ высот всех пар соседних опор. Иными словами, стоимость постройки равна \(\max\limits_{1 \le i \le n - 1}{p_i \oplus p_{i + 1}}\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Найдите любую последовательность из высот опор \(p\) длины \(n\), стоимость постройки которой минимальна. Здесь перестановкой является массив, состоящий из \(n\) различных целых чисел от \(0\) до \(n - 1\) в произвольном порядке. Например, \([2,3,1,0,4]\) — перестановка, но \([1,0,1]\) не перестановка (\(1\) встречается в массиве дважды) и \([1,0,3]\) тоже не перестановка (\(n=3\), но в массиве встречается \(3\)). Выходные данные Для каждого набора входных данных выведите \(n\) чисел \(p_1\), \(p_2\), \(\ldots\), \(p_n\) — последовательность из высот опор, стоимость постройки которой минимальна. Если существует несколько решений, выведите любое из них. Примечание Для \(n = 2\) есть \(2\) возможные последовательности высот опор: - \([0, 1]\) — цена постройки равна \(0 \oplus 1 = 1\).
- \([1, 0]\) — цена постройки равна \(1 \oplus 0 = 1\).
Для \(n = 3\) есть \(6\) возможных последовательностей высот опор: - \([0, 1, 2]\) — цена постройки равна \(\max(0 \oplus 1, 1 \oplus 2) = \max(1, 3) = 3\).
- \([0, 2, 1]\) — цена постройки равна \(\max(0 \oplus 2, 2 \oplus 1) = \max(2, 3) = 3\).
- \([1, 0, 2]\) — цена постройки равна \(\max(1 \oplus 0, 0 \oplus 2) = \max(1, 2) = 2\).
- \([1, 2, 0]\) — цена постройки равна \(\max(1 \oplus 2, 2 \oplus 0) = \max(3, 2) = 3\).
- \([2, 0, 1]\) — цена постройки равна \(\max(2 \oplus 0, 0 \oplus 1) = \max(2, 1) = 2\).
- \([2, 1, 0]\) — цена постройки равна \(\max(2 \oplus 1, 1 \oplus 0) = \max(3, 1) = 3\).
| |
|
|
C. Странная контрольная
Бинарный поиск
битмаски
дп
математика
Перебор
*1600
Игорь учится в 11-м классе. Завтра ему предстоит написать контрольную работу по информатике у самого строгого преподавателя школы — Павла Денисовича. Игорь заранее знает, как будет проходить контрольная: изначально преподаватель даст каждому ученику, включая Игоря, два целых положительных числа \(a\) и \(b\) (\(a < b\)). Затем ученик может неограниченное количество раз производить с числами следующие операции: - \(a := a + 1\) (увеличить \(a\) на \(1\)),
- \(b := b + 1\) (увеличить \(b\) на \(1\)),
- \(a := a \ | \ b\) (заменить \(a\) на побитовое ИЛИ \(a\) и \(b\)).
Чтобы получить максимальный балл за контрольную работу, ученику необходимо за минимальное количество операций сделать \(a\) равным \(b\). Игорь заранее знает, какие числа даст ему учитель, и, конечно же, хочет получить максимальный балл за контрольную работу. Помогите ему понять, какое минимальное количество операций необходимо, чтобы сделать \(a\) равным \(b\). Выходные данные Для каждого набора входных данных выведите единственное число — за какое минимальное количество операций можно сделать \(a\) равным \(b\). Примечание В первом наборе оптимально применить третью операцию. Во втором наборе оптимально применить первую операцию три раза подряд. В третьем наборе оптимально применить вторую операцию и потом третью операцию.
| |
|
|
B. Гадание на массиве
битмаски
математика
*1400
Haha, try to solve this, SelectorUnlimited! — antontrygubO_o Ваши друзья Алиса и Боб практикуют гадания. Гадание производится следующим образом: есть хорошо всем известный массив \(a\) из \(n\) неотрицательных целых чисел, пронумерованных от \(1\) до \(n\). Клиент выбирает некоторое неотрицательное число \(d\), а затем последовательно применяет одну из двух операций для каждого \(i = 1, 2, \ldots, n\), в возрастающем порядке \(i\). Возможные операции таковы: - текущее число \(d\) заменяется на \(d + a_i\)
- текущее число \(d\) заменяется на \(d \oplus a_i\) (здесь и далее \(\oplus\) обозначает побитовое исключающее или)
Обратите внимание, что выбранная операция может быть разной для разных \(i\) и разных клиентов. Однажды Алиса выбрала \(d = x\), а Боб выбрал \(d = x + 3\). Каждый из них сходил к гадалке и в конце концов получил какое-то число. Заметьте, что Алиса и Боб выбирают операции независимо, иначе говоря, для каких-то \(i\) они могли выбирать как одну операцию, так и разные. Вы каким-то образом узнали, что то ли Алиса, то ли Боб в итоге получили число \(y\), но кто именно — неизвестно. Ваша задача — зная числа, с которых начали Алиса и Боб, узнать, кто же из них получил в итоге число \(y\). Гарантируется, что на тестах жюри ровно один из ваших друзей мог получить \(y\). Взломы Вы не можете делать взломы по этой задаче. Выходные данные Для каждого набора входных данных выведите «Alice» или «Bob» (без кавычек) — кто из друзей мог получить из своего начального числа число \(y\). Примечание В первом наборе входных данных Алиса могла получить \(9\) с помощью следующих операций: \(7 + 2 = 9\). Во втором наборе Алиса могла получить \(2\) с помощью таких операций: \((0 + 1) \oplus 3 = 2\). В третьем наборе Боб изначально имел число \(x+3 = 0+3=3\). Тогда он мог получить \(1\) таким образом: \((((3 + 1) + 2) \oplus 3) \oplus 4 = 1\).
| |
|
|
A. Минимальная OR сумма
битмаски
жадные алгоритмы
*800
Вам дан массив чисел \(a\) размера \(n\). Вы можете выполнить следующую операцию над массивом: - Выберите два различных целых числа \(i, j\) \((1 \leq i < j \leq n\)), замените \(a_i\) на \(x\) и \(a_j\) на \(y\). Чтобы не нарушать массив, должно выполняться \(a_i | a_j = x | y\), где \(|\) обозначает побитовое ИЛИ. Заметьте, что \(x\) и \(y\) это целые неотрицательные числа.
Пожалуйста, выведите минимальную сумму элементов массива, которую вы можете получить после выполнения вышеуказанной операции любое количество раз. Выходные данные Для каждого набора входных данных выведите в строке одно число — минимальную возможную сумму массива. Примечание В первом примере вы можете выполнить следующие операции для получения массива \([1, 0, 2]\): 1. выбираем \(i = 1, j = 2\), делаем \(a_1 = 1\) и \(a_2 = 2\), так как \(1 | 3 = 1 | 2\). Массив становится \([1, 2, 2]\). 2. выбираем \(i = 2, j = 3\), делаем \(a_2 = 0\) и \(a_3 = 2\), так как \(2 | 2 = 0 | 2\). Массив становится \([1, 0, 2]\). Мы можем доказать, что минимальная сумма равна \(1 + 0 + 2 = 3\). Во втором примере нам не нужны никакие операции.
| |
|
|
D. Бесконечный набор
битмаски
дп
математика
матрицы
Строки
теория чисел
*1800
Вам дан массив \(a\), состоящий из \(n\) различных целых положительных чисел. Рассмотрим бесконечное множество целых чисел \(S\), содержащее все целые числа \(x\), удовлетворяющие хотя бы одному из следующих условий: - \(x = a_i\) для некоторого \(1 \leq i \leq n\).
- \(x = 2y + 1\) и \(y\) находится в \(S\).
- \(x = 4y\) и \(y\) находится в \(S\).
Например, если \(a = [1,2]\), то \(10\) наименьших элементов в \(S\) будут равны \(\{1,2,3,4,5,7,8,9,11,12\}\) . Найдите количество элементов в \(S\), строго меньших, чем \(2^p\). Так как это число может быть слишком большим, выведите его по модулю \(10^9 + 7\). Выходные данные Выведите единственное целое число — количество элементов в \(S\), строго меньших \(2^p\). Не забудьте вывести его по модулю \(10^9 + 7\). Примечание В первом примере элементы меньше \(2^4\) равны \(\{1, 3, 4, 6, 7, 9, 12, 13, 15\}\). Во втором примере элементы меньше \(2^7\) равны \(\{5,11,20,23,39,41,44,47,79,80,83,89,92,95\}\).
| |
|
|
D. Два массива
битмаски
жадные алгоритмы
Комбинаторика
математика
Перебор
хэши
*2700
Стас перешел в новую школу «75-угольник», и на первом же уроке биологии начал умничать, за что его учитель попросил решить задачу по генетике, решение которой сам не знает. Вам дано \(n\) массивов, \(i\)-й из которых содержит \(m\) различных целых чисел — \(a_{i,1}, a_{i,2},\ldots,a_{i,m}\). Также дан массив положительных целых чисел \(w\) длины \(n\). Вам надо найти минимальное возможное значение выражения \(w_i + w_j\) среди всех пар целых чисел \((i, j)\) (\(1 \le i, j \le n\)) таких, что среди чисел \(a_{i,1}, a_{i,2},\ldots,a_{i,m}, a_{j,1}, a_{j,2},\ldots,a_{j,m}\) все числа различны. Выходные данные Выведите единственное число — ответ на задачу. Если ни одной подходящей пары \((i, j)\) не существует, выведите \(-1\). Примечание В первом тесте минимальное значение это \(5 = w_3 + w_4\), так как среди чисел \(\{2, 3, 4, 5\}\) все различны. Во втором тесте нет ни одной подходящей пары \((i, j)\).
| |
|
|
C. Факториалы и степени двойки
битмаски
дп
Конструктив
математика
Перебор
*1500
Число называется сильным, если оно является степенью двойки или факториалом. Другими словами, число \(m\) сильное, если существует неотрицательное целое число \(d\) такое, что \(m=2^d\) или \(m=d!\), где \(d!=1\cdot 2\cdot \ldots \cdot d\) (в частности, \(0! = 1\)). Например, \(1\), \(4\) и \(6\) являются сильными, потому что \(1=1!\), \(4=2^2\), \(6=3!\), а \(7\), \(10\) или \(18\) не являются. Вам дано положительное число \(n\). Найдите минимальное число \(k\) такое, что \(n\) можно представить в виде суммы \(k\) различных сильных чисел, или определите, что такого \(k\) не существует. Выходные данные Для каждого набора входных данных выведите ответ на отдельной строке. Если \(n\) не может быть представлено как сумма различных сильных чисел, выведите \(-1\). Иначе выведите одно положительное число — минимально возможное число \(k\). Примечание В первом примере \(7\) может быть представлена как \(7=1+6\), где \(1\) и \(6\) являются сильными. Так как \(7\) не является сильным числом, мы знаем, что минимальное значение \(k\) в этом случае \(k=2\). Во втором примере один из способов разложить \(11\) в сумму трех сильных чисел такой: \(11=1+4+6\). Можно показать, что нельзя представить \(11\) в виде суммы двух или менее сильных чисел. В третьем примере \(240\) может быть представлено как \(240=24+32+64+120\). Обратите внимание, что \(240=120+120\) не является корректным представлением, т. к. сильные числа должны быть различны. В четвертом примере \(17179869184=2^{34}\), поэтому \(17179869184\) является сильным числом, и минимальное \(k\) в этом случае \(k=1\).
| |
|
|
E. Совместимые числа
битмаски
дп
Перебор
поиск в глубину и подобное
*2200
Два целых числа x и y называются совместимыми, если результат их побитового «И» равен нулю, то есть a & b = 0. Например, числа 90 (10110102) и 36 (1001002) совместимы, так как 10110102 & 1001002 = 02, а числа 3 (112) и 6 (1102) несовместимы, так как 112 & 1102 = 102. Вам дан массив целых чисел a1, a2, ..., an. Требуется определить для каждого элемента массива, совместим ли этот элемент с каким-либо другим элементом из данного массива. В случае положительного ответа также требуется найти любой подходящей элемент. Выходные данные Выведите n целых чисел ansi. Если ai не совместимо ни с каким другим элементом данного массива a1, a2, ..., an, то ansi должно быть равно -1. Иначе ansi — любое такое число, что ai & ansi = 0, и при этом ansi содержится в массиве a1, a2, ..., an.
| |
|
|
D1. 388535 (упрощенная версия)
битмаски
математика
*1600
Это упрощенная версия этой задачи. Различия между ограничениями в версиях выделены красным цветом. Вы можете совершать взломы, только если решили обе версии. Марин и Годзё играют в прятки с массивом. Сначала Годзё выполняет следующую последовательность действий: - Во-первых, Годзё выбирает \(2\) целых числа \(l\) и \(r\) такие, что \(l \leq r\).
- Затем Годзё составляет массив \(a\) длины \(r-l+1\), который является перестановкой массива \([l,l+1,\ldots,r]\).
- Наконец, Годзё выбирает секретное целое число \(x\) и присваивает в элемент \(a_i\) значение \(a_i \oplus x\) для всех \(i\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ.
Марин даются значения \(l,r\) и финальный массив \(a\). Её цель — найти секретное число \(x\). Можете ли вы помочь Марин? Заметим, что значение \(x\) не всегда можно определить однозначно. В этом случае найдите любое возможное \(x\), которое приводит к заданному финальному значению массива \(a\). Выходные данные Для каждого набора входных данных выведите \(x\). Если ответов несколько, то выведите любой из них. Примечание В первом примере начальное значение массива имеет вид \([3, 2, 1, 0]\). Во втором примере начальное значение массива имеет вид \([0, 3, 2, 1]\). В третьем примере начальное значение массива имеет вид \([2, 1, 0]\).
| |
|
|
D2. 388535 (усложненная версия)
битмаски
математика
Перебор
Структуры данных
*2300
Это усложненная версия этой задачи. Различия между ограничениями в версиях выделены красным цветом. Вы можете совершать взломы, только если решили обе версии. Марин и Годзё играют в прятки с массивом. Сначала Годзё выполняет следующую последовательность действий: - Во-первых, Годзё выбирает \(2\) целых числа \(l\) и \(r\) такие, что \(l \leq r\).
- Затем Годзё составляет массив \(a\) длины \(r-l+1\), который является перестановкой массива \([l,l+1,\ldots,r]\).
- Наконец, Годзё выбирает секретное целое число \(x\) и присваивает в элемент \(a_i\) значение \(a_i \oplus x\) для всех \(i\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ.
Марин даются значения \(l,r\) и финальный массив \(a\). Её цель — найти секретное число \(x\). Можете ли вы помочь Марин? Заметим, что значение \(x\) не всегда можно определить однозначно. В этом случае найдите любое возможное \(x\), которое приводит к заданному финальному значению массива \(a\). Выходные данные Для каждого набора входных данных выведите \(x\). Если ответов несколько, то выведите любой из них. Примечание В первом примере начальное значение массива имеет вид \([7, 6, 5, 4]\). Во втором примере начальное значение массива имеет вид \([4, 7, 6, 5]\). В третьем примере начальное значение массива имеет вид \([3, 1, 2]\).
| |
|
|
B. Обращение битов
битмаски
жадные алгоритмы
Конструктив
Строки
*1300
Вам дана битовая строка длины \(n\). Вы должны сделать ровно \(k\) ходов. На каждом ходу вы должны выбрать один бит строки. Состояние всех битов кроме выбранного изменятся на противоположное (\(0\) станет \(1\), \(1\) станет \(0\)). Вам нужно вывести лексикографически максимальную строку, которую вы можете получить, используя все \(k\) ходов. Кроме того, для каждого бита выведите, сколько раз вы его выбираете для получения такой строки. Если есть несколько возможных решений, выведите любое из них. Битовая строка \(a\) лексикографически больше битовой строки \(b\) такой же длины, если и только если выполняется следующее: - в первой позиции, где \(a\) и \(b\) различны, в строке \(a\) находится \(1\), а в строке \(b\) — \(0\).
Выходные данные Для каждого набора входных данных выведите две строки. Первая строка должна содержать лексикографически максимальную строку, которую вы можете получить. Вторая строка должна содержать \(n\) целых чисел \(f_1, f_2, \ldots, f_n\), где \(f_i\) — количество раз, которое вы выбираете \(i\)-й бит. Сумма всех чисел должна быть равна \(k\). Примечание Рассмотрим первый пример. Ниже пошагово показано, как изменяется строка после каждого хода. - Выбирается бит \(1\): \(\color{red}{\underline{1}00001} \rightarrow \color{red}{\underline{1}}\color{blue}{11110}\).
- Выбирается бит \(4\): \(\color{red}{111\underline{1}10} \rightarrow \color{blue}{000}\color{red}{\underline{1}}\color{blue}{01}\).
- Выбирается бит \(4\): \(\color{red}{000\underline{1}01} \rightarrow \color{blue}{111}\color{red}{\underline{1}}\color{blue}{10}\).
Итоговая строка равна \(111110\), это лексикографически максимальная строка, которую можно получить.
| |
|
|
E. AND-MEX-прогулка
битмаски
графы
Конструктив
Перебор
поиск в глубину и подобное
снм
*2200
Вам дан неориентированный связный граф из \(n\) вершин и \(m\) взвешенных ребер. Прогулкой от вершины \(u\) до вершины \(v\) называется последовательность вершин \(p_1,p_2,\ldots,p_k\) (не обязательно различных), начинающаяся в вершине \(u\) и заканчивающаяся в вершине \(v\), такая что \(p_i\) и \(p_{i+1}\) соединены ребром для всех \(1 \leq i < k\). Определим длину прогулки следующим образом: выпишем веса ребер в порядке следования в массив. Затем выпишем побитовое И каждого непустого префикса этого массива. Длиной прогулки называется MEX этих значений. Более формально, пусть веса ребер это \([w_1,w_2,\ldots,w_{k-1}]\), где \(w_i\) — вес ребра между \(p_i\) и \(p_{i+1}\). Тогда длина прогулки равна \(\mathrm{MEX}(\{w_1,\,w_1\& w_2,\,\ldots,\,w_1\& w_2\& \ldots\& w_{k-1}\})\), где \(\&\) обозначает операцию побитового И. Вы должны обработать \(q\) запросов вида u v. Для каждого запроса найдите минимально возможную длину пути из \(u\) в \(v\). MEX (минимальное отсутствующее) множества чисел — наименьшее неотрицательное число, отсутствующее в этом множестве. Например: - MEX множества \(\{2,1\}\) равен \(0\), т. к. \(0\) отсутствует в множестве.
- MEX множества \(\{3,1,0\}\) равен \(2\), т. к. \(0\) и \(1\) присутствуют в множестве, а \(2\) — нет.
- MEX множества \(\{0,3,1,2\}\) равен \(4\), т. к. \(0\), \(1\), \(2\) и \(3\) присутствуют в множестве, а \(4\) отсутствует.
Выходные данные Для каждого запроса выведите одно целое число — ответ на запрос. Примечание Ниже находится пояснение к первому примеру. Граф из первого примера. Идна из возможных прогулок в первом запросе: \(\)1 \overset{5}{\rightarrow} 3 \overset{3}{\rightarrow} 2 \overset{1}{\rightarrow} 1 \overset{5}{\rightarrow} 3 \overset{1}{\rightarrow} 4 \overset{2}{\rightarrow} 5.\(\) Массив весов равен \(w=[5,3,1,5,1,2]\). Если мы возьмем побитовое И для всех префиксов, мы получим множество \(\{5,1,0\}\). MEX этого множества равен \(2\). Нельзя получить прогулку меньшей длины.
| |
|
|
B. Получение нуля
битмаски
графы
дп
жадные алгоритмы
кратчайшие пути
Перебор
поиск в глубину и подобное
*1300
Предположим, у вас есть целое число \(v\). За одну операцию вы можете: - либо присвоить \(v = (v + 1) \bmod 32768\)
- либо присвоить \(v = (2 \cdot v) \bmod 32768\).
Вам заданы \(n\) целых чисел \(a_1, a_2, \dots, a_n\). Какое минимальное количество операций необходимо, чтобы сделать каждое \(a_i\) равным \(0\)? Выходные данные Выведите \(n\) чисел: \(i\)-е число должно равняться минимальному количеству операций, чтобы сделать \(a_i\) равным \(0\). Примечание Рассмотрим каждый \(a_i\): - \(a_1 = 19\). Вы можете, сначала, увеличить его на единицу и получить \(20\), а потом умножить его на два \(13\) раз. Вы получите \(0\) за \(1 + 13 = 14\) шагов.
- \(a_2 = 32764\). Вы можете увеличить число на единицу \(4\) раза: \(32764 \rightarrow 32765 \rightarrow 32766 \rightarrow 32767 \rightarrow 0\).
- \(a_3 = 10240\). Вы можете умножить его на два \(4\) раза: \(10240 \rightarrow 20480 \rightarrow 8192 \rightarrow 16384 \rightarrow 0\).
- \(a_4 = 49\). Вы можете умножить его на два \(15\) раз.
| |
|
|
D. НОД-угадайка
битмаски
игры
интерактив
китайская теорема об остатках
Конструктив
математика
теория чисел
*2000
Это интерактивная задача. Загадано некоторое положительное целое число \(1 \le x \le 10^9\). За один запрос вы можете выбрать два положительных целых числа \(a \neq b\). В качестве ответа на этот запрос вы получите \(\gcd(x + a, x + b)\), где \(\gcd(n, m)\) обозначает наибольший общий делитель чисел \(n\) и \(m\). Чтобы угадать одно загаданное число \(x\), вы можете совершить не более \(30\) запросов. Протокол взаимодействия Загаданное число \(x\) зафиксировано до начала взаимодействия и не зависит от ваших запросов. Для угадывания каждого \(x\) вы можете сделать не более \(30\) запросов следующего вида: - «? a b» (\(1 \le a, b \le 2 \cdot 10^9\), \(a \neq b\)).
В ответ на этот запрос вы получите \(\gcd(x + a, x + b)\). Когда вы узнаете число \(x\), выведите одну строку следующего формата: - «! x» (\(1 \le x \le 10^9\)).
После этого переходите к решению следующего набора входных данных. Если вы сделаете более \(30\) запросов для одного \(x\), или запросы будут некорректными, взаимодействие будет немедленно прекращено, а ваша программа получит вердикт Неправильный ответ. После вывода запросов не забудьте выводить символ перевода строки и сбрасывать буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Взломы Для взломов используйте следующий формат: Первая строка должна содержать одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Первая и единственная строка каждого набора входных данных должна содержать единственное целое число \(x\) (\(1 \le x \le 10^9\)) — число \(x\), которое нужно угадать. Примечание Первое загаданное число равно \(4\), поэтому ответы на запрос следующие: «? 1 2» — \(\gcd(4 + 1, 4 + 2) = \gcd(5, 6) = 1\). «? 12 4» — \(\gcd(4 + 12, 4 + 4) = \gcd(16, 8) = 8\). Второе загаданное число равно \(10^9\), поэтому ответ на запрос следующий: «? 2000000000 1999999999» — \(\gcd(3 \cdot 10^9, 3 \cdot 10^9 - 1) = 1\). Эти запросы показаны только для лучшего понимания протокола взаимодействия, и их недостаточно, чтобы однозначно восстановить \(x\).
| |
|
|
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\).
| |
|
|
H. Максимальный AND
битмаски
жадные алгоритмы
математика
*1300
Пусть \(\mathsf{AND}\) обозначает побитовую операцию И, а \(\mathsf{OR}\) обозначает побитовую операцию ИЛИ. Вам дан массив \(a\) длины \(n\) и неотрицательное целое число \(k\). Вы можете выполнить не более чем \(k\) операций над массивом следующего типа: - Выбрать индекс \(i\) (\(1 \leq i \leq n\)) и заменить \(a_i\) на \(a_i\) \(\mathsf{OR}\) \(2^j\), где \(j\) - любое целое число от \(0\) до \(30\) включительно. Другими словами, в операции можно выбрать индекс \(i\) (\(1 \leq i \leq n\)) и установить \(j\)-й бит \(a_i\) в \(1\) (\(0 \leq j \leq 30\)).
Выведите максимально возможное значение \(a_1\) \(\mathsf{AND}\) \(a_2\) \(\mathsf{AND}\) \(\dots\) \(\mathsf{AND}\) \(a_n\) после выполнения не более чем \(k\) операций. Выходные данные Для каждого набора входных данных выведите единственную строку, содержащую максимально возможное \(\mathsf{AND}\) значение \(a_1\) \(\mathsf{AND}\) \(a_2\) \(\mathsf{AND}\) \(\dots\) \(\mathsf{AND}\) \(a_n\) после выполнения не более чем \(k\) операций. Примечание Для первого набора мы можем установить бит \(1\) (\(2^1\)) последних \(2\)-х элементов с помощью \(2\)-х операций, получив таким образом массив [\(2\), \(3\), \(3\)], значение \(\mathsf{AND}\) которого равно \(2\). Для второго набора мы не можем выполнить никаких операций, поэтому ответом будет только \(\mathsf{AND}\) всего массива, равное \(4\).
| |
|
|
E. Хемос на дереве
битмаски
Деревья
Конструктив
поиск в глубину и подобное
*2200
В последнем региональном соревновании Хемос со своей командой наконец-то отобрались на Финал ICPC, поэтому в честь этого достижения, а также из-за любви к деревьям он предлагает вам эту задачу, одноименную его команде «Hemose 3al shagra» (Хемос на дереве). Вам дано дерево из \(n\) вершин, где \(n\) — степень \(2\). Вам нужно назначить каждой вершине и каждому ребру целое число из диапазона \([1,2n -1]\) (включительно) так, чтобы все значения были различны. После назначения вы должны выбрать одну из вершин дерева в качестве корня так, чтобы максимальная стоимость среди всех простых путей от корня до всех вершин или ребер была минимально возможная. Стоимость пути между двумя вершинами \(u\) и \(v\) или между вершиной \(u\) и ребром \(e\) определяется как побитовое исключающее ИЛИ всех значений вершин и ребер на пути между ними, включая концы (обратите внимание, что в дереве есть только один простой путь между парой вершин или вершиной и ребром). Выходные данные Для каждого набора входных данных выведите в первой строке выбранный корень. Во второй строке выведите \(n\) целых чисел, где \(i\)-е число обозначает значение, выбранное для \(i\)-й вершине. В третьей строке выведите \(n-1\) целое число, где \(i\)-е число обозначает значение выбранное для \(i\)-го ребра. Ребра нумеруются в порядке присутствия во входных данных Если существует несколько решений, выведите любое из них. Примечание Дерево в первом наборе входных данных показано ниже. Стоимости путей следующие: - \(3\);
- \(3\oplus 7=4\);
- \(3\oplus 7\oplus 6=2\);
- \(3\oplus 2=1\);
- \(3\oplus 2\oplus 1=0\);
- \(3\oplus 2\oplus 1\oplus 4=4\);
- \(3\oplus 2\oplus 1\oplus 4\oplus 5=1\).
Максимальная стоимость равна \(4\). Можно показать, что не существует способа расставить числа и выбрать корень так, чтобы получилась меньшая максимальная стоимость. Дерево для второго набора показано ниже:
| |
|
|
F. Джи, видишь?
битмаски
дп
Комбинаторика
*2400
Во время подготовки к ICPC команда «Jee You See» наткнулась на одну простую комбинаторную задачу. После большого количества вердиктов «Неправильный ответ» они решили сдаться и разбить выключить компьютер. Теперь они нуждаются в вашей помощи, чтобы дорешать задачу. Вам даны 4 целых числа \(n\), \(l\), \(r\) и \(z\). Вычислите количество массивов \(a\) длины \(n\), состоящих из неотрицательных целых чисел таких, что: - \(l\le a_1+a_2+\ldots+a_n\le r\), а также
- \(a_1\oplus a_2 \oplus \ldots\oplus a_n=z\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ.
Так как ответ может быть большим, выведите его по модулю \(10^9+7\). Выходные данные Выведите количество подходящих массивов \(a\) по модулю \(10^9+7\). Примечание Следующие массивы подходят в первом примере: - \([1, 0, 0]\);
- \([0, 1, 0]\);
- \([3, 2, 0]\);
- \([2, 3, 0]\);
- \([0, 0, 1]\);
- \([1, 1, 1]\);
- \([2, 2, 1]\);
- \([3, 0, 2]\);
- \([2, 1, 2]\);
- \([1, 2, 2]\);
- \([0, 3, 2]\);
- \([2, 0, 3]\);
- \([0, 2, 3]\).
Следующие массивы подходят во втором примере: - \([2, 0, 0, 0]\);
- \([0, 2, 0, 0]\);
- \([0, 0, 2, 0]\);
- \([0, 0, 0, 2]\).
| |
|
|
E. Power или XOR?
битмаски
Комбинаторика
математика
теория чисел
*2500
Символ \(\wedge\) довольно неоднозначный, особенно когда используется без контекста. Иногда используется для обозначения возведения в степень (\(a\wedge b = a^b\)), а иногда используется для обозначения операции побитового исключающего ИЛИ (\(a\wedge b=a\oplus b\)). У вас неоднозначное выражение \(E=A_1\wedge A_2\wedge A_3\wedge\ldots\wedge A_n\). Вы можете заменить каждый \(\wedge\) символ на \(\texttt{Power}\) (возведение в степень) или на \(\texttt{XOR}\) (исключающее ИЛИ), чтобы получить однозначное выражение \(E'\). Значение выражения \(E'\) определяется по следующим правилам: - Все \(\texttt{Power}\) операции выполняются перед всеми \(\texttt{XOR}\) операциями. Иными словами, \(\texttt{Power}\) операция имеет приоритет перед \(\texttt{XOR}\) операциями. Например, \(4\;\texttt{XOR}\;6\;\texttt{Power}\;2=4\oplus (6^2)=4\oplus 36=32\).
- Последовательные возведения в степень выполняются слева направо. Например, \(2\;\texttt{Power}\;3 \;\texttt{Power}\;4 = (2^3)^4 = 8^4 = 4096\).
Вам дан массив \(B\) длины \(n\) и целое число \(k\). Массив \(A\) получается как \(A_i=2^{B_i}\) и выражение \(E\) получается как \(E=A_1\wedge A_2\wedge A_3\wedge\ldots\wedge A_n\). Вам нужно найти XOR значений всех возможных однозначных выражений \(E'\), которые могут быть получены из \(E\) и имеют хотя бы \(k\) \(\wedge\) символов, используемых как \(\texttt{XOR}\) операции. Поскольку ответ может быть очень большим, вам нужно найти его по модулю \(2^{2^{20}}\). Поскольку это число также может быть очень большим, вам нужно вывести его двоичное представление без лидирующих нулей. Если ответ равен \(0\), выведите \(0\). Выходные данные Выведите единственную строку, содержащую двоичную строку без лидирующих нулей, обозначающую ответ на задачу. Если ответ равен \(0\), выведите \(0\). Примечание Для всех примеров с \(1\) до \(3\), \(A = \{2^3,2^1,2^2\} = \{8,2,4\}\) и \(E=8\wedge 2\wedge 4\). В первом примере существует только одно возможное подходящее однозначное выражение \(E' = 8\oplus 2\oplus 4 = 14 = (1110)_2\). Во втором примере существуют три возможные подходящие однозначные выражения \(E'\): - \(8\oplus 2\oplus 4 = 14\)
- \(8^2\oplus 4 = 64\oplus 4= 68\)
- \(8\oplus 2^4 = 8\oplus 16= 24\)
XOR всех их значений равен \(14\oplus 68\oplus 24 = 82 = (1010010)_2\). Во третьем примере существуют четыре возможные подходящие однозначные выражения \(E'\): - \(8\oplus 2\oplus 4 = 14\)
- \(8^2\oplus 4 = 64\oplus 4= 68\)
- \(8\oplus 2^4 = 8\oplus 16= 24\)
- \((8^2)^4 = 64^4 = 2^{24} = 16777216\)
XOR всех их значений равен \(14\oplus 68\oplus 24\oplus 16777216 = 16777298 = (1000000000000000001010010)_2\). В четвёртом примере \(A=\{2,2\}\) и \(E=2\wedge 2\). Единственное возможное подходящее однозначное выражение \(E' = 2\oplus 2 = 0 = (0)_2\).
| |
|
|
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\).
| |
|
|
E. Типичная вечеринка в общаге
битмаски
дп
Комбинаторика
Строки
*2400
Сегодня в общаге праздник — приехал Олег, в честь чего девочки подарили ему строку. Олегу очень понравился подарок, поэтому он тут же придумал и предложил вам, лучшему его другу, следующую задачу. Вам дана строка \(s\) длины \(n\), которая состоит из первых \(17\) строчных букв латинского алфавита {\(a\), \(b\), \(c\), \(\ldots\), \(p\), \(q\)} и знаков вопроса. А также \(q\) запросов. Каждый запрос характеризуется набором попарно различных строчных первых \(17\) букв латинского алфавита, которые можно использовать чтобы заменить знаки вопроса в строке \(s\). Ответом на запрос является сумма количества различных подстрок, которые являются палиндромами, по всем строкам, которые можно получить из изначальной строки \(s\) путем замены знаков вопроса на разрешенные символы. Ответ необходимо посчитать по модулю \(998\,244\,353\). Обратите внимание! Две подстроки являются различными, когда отличаются их позиции начала и окончания в строке. Т. е. количество различных подстрок, которые являются палиндромами, для строки aba будет \(4\): a, b, a, aba. Рассмотрим примеры замены знаков вопроса на буквы. Например, из строки aba??ee при запросе {\(a\), \(b\)} можно получить строки ababaee или abaaaee но нельзя получить строки pizza, abaee, abacaba, aba?fee, aba47ee, или abatree. Напомним, что палиндромом называется строка, которая одинаково читается как слева направо, так и справа налево. Выходные данные На каждый запрос выведите одно число — суммарное количество подстрок-палиндромов во всех возможных строках, которые можно получить из строки \(s\), по модулю \(998\,244\,353\). Примечание Рассмотрим первый пример и первый запрос в нём. У нас может получится только одна строка по итогам замены знаков вопроса — abaaaba. В ней есть такие подстроки-палиндромы: - a — подстрока [\(1\); \(1\)].
- b — подстрока [\(2\); \(2\)].
- a — подстрока [\(3\); \(3\)].
- a — подстрока [\(4\); \(4\)].
- a — подстрока [\(5\); \(5\)].
- b — подстрока [\(6\); \(6\)].
- a — подстрока [\(7\); \(7\)].
- aa — подстрока [\(3\); \(4\)].
- aa — подстрока [\(4\); \(5\)].
- aba — подстрока [\(1\); \(3\)].
- aaa — подстрока [\(3\); \(5\)].
- aba — подстрока [\(5\); \(7\)].
- baaab — подстрока [\(2\); \(6\)].
- abaaaba — подстрока [\(1\); \(7\)].
В третьем запросе у нас может получится 4 строки: abaaaba, abababa, abbaaba, abbbaba.
| |
|
|
F. Формализм ради формализма
битмаски
дп
математика
*2600
Юра, будучи математиком, уже настолько преисполнился в своем познании, что он уже сто триллионов миллиардов лет решает формальные задачи, в которых нет ни капли легенды. Эта задача именно такая! Рассмотрим все целые неотрицательные числа из промежутка \([0, 10^{n})\). Для удобства дополним все числа ведущими нулями таким образом, чтобы любое число из данного промежутка состояло ровно из \(n\) десятичных цифр. Пусть имеется также некоторый набор пар \((u_i, v_i)\), где \(u_i\) и \(v_i\) — различные цифры от \(0\) до \(9\). Рассмотрим число \(x\), состоящее из \(n\) цифр. Пронумеруем цифры слева направо и обозначим их как \(d_1, d_2, \ldots, d_n\). За одну операцию разрешается поменять местами цифры \(d_i\) и \(d_{i + 1}\) тогда и только тогда, когда существует такая пара \((u_j, v_j)\), что верно хотя бы одно из условий: - \(d_i = u_j\) и \(d_{i + 1} = v_j\),
- \(d_i = v_j\) и \(d_{i + 1} = u_j\).
Назовем числа \(x\) и \(y\), состоящие из \(n\) цифр, эквивалентными, если из числа \(x\) можно получить число \(y\), пользуясь только операциями, описанными выше. В частности, любое число считается эквивалентным самому себе. Дано число \(n\) и набор из \(m\) пар цифр \((u_i, v_i)\). Найдите максимальное \(k\), такое что существует множество чисел \(x_1, x_2, \ldots, x_k\) (\(0 \le x_i < 10^{n}\)), для которого верно, что для любых \(1 \le i < j \le k\) число \(x_i\) не эквивалентно числу \(x_j\). Выходные данные Выведите одно число — максимальное число \(k\), такое что существует множество чисел \(x_1, x_2, \ldots, x_k\) (\(0 \le x_i < 10^{n}\)), для которого верно, что для любых \(1 \le i < j \le k\) число \(x_i\) не эквивалентно числу \(x_j\). Так как ответ может быть достаточно большим, выведите остаток от деления числа \(k\) на \(998\,244\,353\). Примечание В первом примере можно составить множество, состоящее из всех чисел от \(0\) до \(9\), так как никакие два числа не являются эквивалентными друг другу. Во втором примере существует единственная пара эквивалентных чисел: \(01\) и \(10\). В качестве ответа можно, например, взять множество всех чисел от \(0\) до \(99\), кроме числа \(1\).
| |
|
|
E. Двигающиеся фигуры
битмаски
дп
жадные алгоритмы
*2000
Вам дана доска размера \(2 \times n\) (\(2\) строки, \(n\) столбцов). В некоторых клетках доски находятся фигуры. Фигура представлена символом '*', а пустое место представлено символом '.'. Гарантируется, что на доске находится хотя бы одна фигура. За один ход вы можете выбрать любую фигуру и сдвинуть ее в любую соседнюю (по стороне) клетку доски (если эта клетка находится на доске). Это значит, что если фигура находится в первом ряду, вы можете сдвинуть ее влево, вправо или вниз (но она не должна покидать пределы доски). То же самое с фигурой во второй строке — вы можете сдвинуть ее влево, вправо или вверх. Если фигура попадает в клетку с другой фигурой, фигура в клетке назначения исчезает (то есть наша фигура ест ее). Ваша задача — найти минимальное количество ходов, необходимое для того, чтобы оставить ровно одну фигуру на доске. Вам необходимо ответить на \(t\) независимых наборов тестовых данных. Выходные данные Для каждого набора тестовых данных выведите одно целое число — минимальное количество ходов, необходимое для того, чтобы оставить ровно одну фигуру на доске.
| |
|
|
B. Сортировка с И
битмаски
Конструктив
сортировки
*1100
Вам дана перестановка \(p\) целых чисел от \(0\) до \(n-1\) (каждое из них встречается ровно один раз). Первоначально перестановка не отсортирована (то есть, \(p_i>p_{i+1}\) хотя бы для одного \(1 \le i \le n - 1\)). Перестановка называется \(X\)-сортируемой для некоторого неотрицательного целого числа \(X\), если можно отсортировать перестановку, выполнив операцию ниже некоторое конечное число раз: - Выберите два индекса \(i\) и \(j\) \((1 \le i \lt j \le n)\) такие, что \(p_i \& p_j = X\).
- Поменяйте местами \(p_i\) и \(p_j\).
Здесь \(\&\) обозначает операцию побитового И. Найдите максимальное значение \(X\) такое, что \(p\) является \(X\)-сортируемой. Можно показать, что всегда существует некоторое значение \(X\) такое, что \(p\) является \(X\)-сортируемой. Выходные данные Для каждого набора входных данных выведите одно целое число — максимальное значение \(X\) такое, что \(p\) является \(X\)-сортируемой. Примечание В первом наборе входных данных единственными \(X\), для которых перестановка является \(X\)-сортируемой, являются \(X = 0\) и \(X = 2\), максимальный из которых равен \(2\). Сортировка с использованием \(X = 0\): - Поменять местами \(p_1\) и \(p_4\), \(p = [2, 1, 3, 0]\).
- Поменять местами \(p_3\) и \(p_4\), \(p = [2, 1, 0, 3]\).
- Поменять местами \(p_1\) и \(p_3\), \(p = [0, 1, 2, 3]\).
Сортировка с использованием \(X = 2\): - Поменять местами \(p_3\) и \(p_4\), \(p = [0, 1, 2, 3]\).
Во втором наборе входных данных мы должны поменять местами \(p_1\) и \(p_2\), что возможно только при \(X = 0\).
| |
|
|
A. Идеальный класс битмасок Cirno
битмаски
Перебор
*800
Урок класса Cirno по созданию идеальных битовых масок только что начался! Cirno дала своим ученикам положительное целое число \(x\). В качестве задания ее ученики должны найти такое минимальное положительное целое число \(y\), которое удовлетворяет двум следующим условиям: \(\)x\ \texttt{and}\ y > 0\(\) \(\)x\ \texttt{xor}\ y > 0\(\) Где \(\texttt{and}\) — это побитовая операция И, а \(\texttt{xor}\) — это побитовая операция исключающее ИЛИ. Среди студентов была Mystia, которая была действительно сбита с толку всеми этими новыми битовыми операциями. Пожалуйста, помогите ей! Выходные данные Для каждого набора входных данных выведите единственное целое число — минимальное число \(y\). Примечание В первом наборе входных данных \(1\; \texttt{and}\; 3=1>0\), \(1\; \texttt{xor}\; 3=2>0\). Во втором наборе входных данных \(2\; \texttt{and}\; 3=2>0\), \(2\; \texttt{xor}\; 3=1>0\).
| |
|
|
B. Волшебный талисман Patchouli
битмаски
жадные алгоритмы
Конструктив
сортировки
*800
Patchouli является магическим талисманом. Изначально у него \(n\) магических жетонов. Их магическая сила может быть представлена положительными целыми числами \(a_1, a_2, \ldots, a_n\). Patchouli может выполнять следующие две операции с жетонами. - Слияние: Patchouli выбирает два жетона, убирает их и создает новый жетон с магической силой, равной сумме двух выбранных жетонов.
- Сокращение: Patchouli выбирает жетон с четным значением магической силы \(x\), удаляет его и создает новый жетон с магической силой, равной \(\frac{x}{2}\).
Жетоны наиболее эффективны, когда они имеют нечетное значение магической силы. Пожалуйста, помогите Patchouli найти минимальное количество операций, необходимых ему, чтобы все жетоны имели нечетное значение магической силы. Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество операций, которое нужно Patchouli, чтобы все жетоны имели нечетное значение магической силы. Можно показать, что при заданных ограничениях требуемая последовательность операций существует. Примечание В первом наборе входных данных \(a\) изначально состоит только из нечетных чисел. Во втором наборе входных данных выберите жетоны с магической силой \(1\) и \(2\) и выполните слияние. Теперь \(a=[1,3]\), оба нечетные числа. В третьем наборе входных данных сначала выберите жетоны с магической силой \(2\) и \(8\) и выполните слияние. Теперь \(a=[4,10]\). Дальше выберите жетон с магической силой \(10\) и выполните сокращение. Теперь \(a=[4,5]\). Выберите жетоны с магической силой \(4\) и \(5\) и выполните слияние. Теперь \(a=[9]\), а \(9\) — нечетное число. Можно показать, что вы не можете получить все магические силы нечетными числами менее чем за \(3\) хода, поэтому ответ равен \(3\).
| |
|
|
E. Бесконечность
битмаски
графы
Конструктив
Перебор
поиск в глубину и подобное
снм
*2500
После окончания университета Влад получил массив \(a_1,a_2,\ldots,a_n\) из \(n\) целых неотрицательных чисел. Он сразу же захотел построить граф, состоящий из \(n\) вершин, пронумерованных \(1, 2,\ldots, n\). Он решил добавлять ребро между \(i\) и \(j\) тогда и только тогда, когда \(a_i \& a_j > 0\), где \(\&\) обозначает операцию побитового И. Влад также хочет, чтобы такой граф был связным, что, к сожалению, может быть не так. Чтобы удовлетворить свое желание, он может выполнять следующие два типа операций над массивом: - Выбрать некоторый элемент \(a_i\) и увеличить его на \(1\).
- Выбрать некоторый элемент \(a_i\) и уменьшить его на \(1\) (разрешено, только если \(a_i > 0\)).
Можно доказать, что существует конечная последовательность таких операций, при которой граф станет связным. Не могли бы вы помочь Владу найти минимально возможное количество операций для этого, а также предоставить способ, как это сделать? Выходные данные Для каждого набора входных данных выведите в первой строке единственное целое число \(m\) — минимальное количество операций. Во второй строке выведите массив после допустимой последовательности операций, которые были выполнены так, что граф из задачи стал связным. Если решений несколько, выведите любое. Примечание В первом наборе входных данных граф уже связен. Во втором наборе входных данных мы можем дважды увеличить \(0\) и получить массив \([2,2]\). Поскольку \(2 \& 2 = 2 > 0\), граф связен. Можно показать, что одной операции недостаточно. В третьем наборе входных данных мы можем один раз уменьшить \(12\) и получить массив \([3,11]\). \(3 \& 11 = 3 > 0\), следовательно, граф связен. Необходимо выполнить одну операцию, так как граф вначале не связен.
| |
|
|
A. НИТ делает orz
битмаски
жадные алгоритмы
*800
Чтобы развлечь своих поклонников, гражданин НИТ решил дать им задачу, связанную с \(\operatorname{or} z\). А вы сможете её решить? Дан массив \(a\) в 1-индексации, состоящий из \(n\) целых чисел, а также целое число \(z\). Вы можете проделать следующую операцию любое количество (возможно, ноль) раз: - Выбрать целое \(i\), такое что \(1\le i\le n\). Затем одновременно присвоить \(a_i\) значение \((a_i\operatorname{or} z)\) и присвоить \(z\) значение \((a_i\operatorname{and} z)\). Другими словами, если \(x\) и \(y\) — текущие значения \(a_i\) и \(z\) соответственно, то нужно положить \(a_i\) равным \((x\operatorname{or}y)\), а \(z\) положить равным \((x\operatorname{and}y)\).
Здесь \(\operatorname{or}\) и \(\operatorname{and}\) обозначают операции побитового ИЛИ и побитового И соответственно. Найдите максимально возможное значение максимального элемента в \(a\) после некоторого (возможно, нулевого) количества операций. Выходные данные Для каждого набора входных данных выведите одно число — ответ на задачу. Примечание В первом наборе входных данных одной из оптимальных последовательностей действий является следующая: - Выполнить операцию для \(i=1\). Теперь \(a_1\) становится равным \((3\operatorname{or}3)=3\), а \(z\) становится равным \((3\operatorname{and}3)=3\).
- Выполнить операцию для \(i=2\). Теперь \(a_2\) становится равным \((4\operatorname{or}3)=7\), а \(z\) становится равным \((4\operatorname{and}3)=0\).
- Выполнить операцию для \(i=1\). Теперь \(a_1\) становится равным \((3\operatorname{or}0)=3\), а \(z\) становится равным \((3\operatorname{and}0)=0\).
После этих операций последовательность \(a\) становится равной \([3,7]\), и максимальное значение в ней равно \(7\). Можно доказать, что максимальное значение в \(a\) не может превосходить \(7\) ни при какой последовательности операций, так что ответ равен \(7\). В четвёртом наборе входных данных одной из оптимальных последовательностей действий является следующая: - Выполнить операцию для \(i=1\). Теперь \(a_1\) становится равным \((7\operatorname{or}7)=7\), а \(z\) становится равным \((7\operatorname{and}7)=7\).
- Выполнить операцию для \(i=3\). Теперь \(a_3\) становится равным \((30\operatorname{or}7)=31\), а \(z\) становится равным \((30\operatorname{and}7)=6\).
- Выполнить операцию для \(i=5\). Теперь \(a_5\) становится равным \((27\operatorname{or}6)=31\), а \(z\) становится равным \((27\operatorname{and}6)=2\).
| |
|
|
A. Путаница с исключающим ИЛИ
битмаски
Перебор
*800
У вас есть массив \(a\) из \(n-1\) целого числа. Пусть \(x\) равен побитовому исключающему ИЛИ всех элементов массива. Добавим число \(x\) в конец массива \(a\) (его длина станет равна \(n\)), а затем произвольным образом поменяем порядок всех элементов. Вам дан новый массив \(a\). Чему был равен \(x\)? Если есть несколько возможных значений \(x\), выведите любое. Выходные данные Для каждого набора входных данных выведите одно целое число — значение \(x\). Если существует несколько возможных значений \(x\), выведите любое из них. Примечание В первом примере один из возможных массивов \(a\) равен \(a=[2, 5, 4]\). Тогда \(x = 2 \oplus 5 \oplus 4 = 3\) (\(\oplus\) обозначает побитовое исключающее ИЛИ), и новый массив равен \([2, 5, 4, 3]\). После этого его элементы переставлены, чтобы получился \([4, 3, 2, 5]\). Во втором примере один из возможных массивов \(a\) равен \(a=[1, 10, 6, 10]\). Тогда \(x = 1 \oplus 10 \oplus 6 \oplus 10 = 7\), и новый массив равен \([1, 10, 6, 10, 7]\). После этого его элементы переставлены, чтобы получился \([6, 1, 10, 7, 10]\). В третьем примере все элементы массива равны \(6\), поэтому очевидно \(x=6\). В четвертом примере один из возможных массивов \(a\) равен \(a=[100, 100]\). Тогда \(x = 100 \oplus 100 = 0\), и новый массив равен \([100, 100, 0]\). После этого его элементы переставлены, чтобы получился \([100, 100, 0]\). (Обратите внимание, что после перестановки элементов массив может остаться таким же, как и был.)
| |
|
|
G. Длинная бинарная строка
meet-in-the-middle
битмаски
математика
матрицы
теория чисел
*2900
У вас есть бинарная строка \(t\) длины \(10^{100}\), и изначально все биты в строке равны \(\texttt{0}\). Вам также дана бинарная строка \(s\), и вы можете выполнять следующую операцию: - Выберите некоторую подстроку \(t\) и замените ее на побитовое исключающее ИЛИ этой подстроки со строкой \(s\).\(^\dagger\)
После некоторого количества операций в строке \(t\) ровно два бита должны быть равны \(\texttt{1}\); иными словами, должны существовать ровно два различных индекса \(p\) и \(q\) такие, что \(p\)-й и \(q\)-й биты строки \(t\) равны \(\texttt{1}\), а остальные биты равны \(\texttt{0}\). Найдите лексикографически максимальную \(^\ddagger\) строку \(t\), которая может получиться при выполнении этого условия, или определите, что таких строк получиться не может. \(^\dagger\) Формально, выберите индекс \(i\) такой, что \(0 \leq i \leq 10^{100}-|s|\). Для всех \(1 \leq j \leq |s|\), если \(s_j = \texttt{1}\), измените значение \(t_{i+j}\). То есть если \(t_{i+j}=\texttt{0}\), положите \(t_{i+j}=\texttt{1}\). Иначе, если \(t_{i+j}=\texttt{1}\), положите \(t_{i+j}=\texttt{0}\). \(^\ddagger\) Бинарная строка \(a\) лексикографически больше бинарной строки \(b\) такой же длины, если в первой позиции, где \(a\) и \(b\) различаются, строка \(a\) содержит \(\texttt{1}\), а строка \(b\) — \(\texttt{0}\). Выходные данные Если нельзя получить подходящую под условие строку \(t\), выведите -1. Иначе выведите два целых числа \(p\) и \(q\) (\(1 \leq p < q \leq 10^{100}\)) такие, что в лексикографически максимальной \(t\) \(p\)-й и \(q\)-й биты равны \(\texttt{1}\). Примечание В первом примере можно выполнить следующие операции. \(\)\texttt{00000}\ldots \to \color{red}{\texttt{1}}\texttt{0000}\ldots \to \texttt{1}\color{red}{\texttt{1}}\texttt{000}\ldots\(\) Во втором примере можно выполнить следующие операции. \(\)\texttt{00000}\ldots \to \color{red}{\texttt{001}}\texttt{00}\ldots \to \texttt{0}\color{red}{\texttt{011}}\texttt{0}\ldots\(\) В третьем примере можно выполнить следующие операции. \(\)\texttt{00000}\ldots \to \color{red}{\texttt{1111}}\texttt{0}\ldots \to \texttt{1}\color{red}{\texttt{0001}}\ldots\(\) Можно показать, что показанные выше строки \(t\) лексикографически максимальны. В четвертом примере нельзя сделать ни один бит равным \(\texttt{1}\), поэтому задача невыполнима.
| |
|
|
B. Почти троичная матрица
битмаски
Конструктив
матрицы
*900
Вам даны два чётных целых числа \(n\) и \(m\). Вам нужно найти любую бинарную матрицу \(a\) с \(n\) строками и \(m\) столбцами, в которой у каждой клетки \((i,j)\) есть ровно две соседние со значениями, отличными от \(a_{i,j}\). Две клетки матрицы считаются соседними тогда и только тогда, когда у них есть общая сторона. Более формально, клетка \((x,y)\) является соседней с \((x-1,y)\), \((x,y+1)\), \((x+1,y)\) и \((x,y-1)\). Можно доказать, что при данных ограничениях ответ всегда существует. Выходные данные Для каждого набора входных данных выведите \(n\) строк, каждая из которых содержит \(m\) чисел, равных \(0\) или \(1\) — бинарную матрицу, описанную в условии. Можно доказать, что при данных ограничениях ответ всегда существует. Примечание Белый цвет обозначает \(0\), чёрный цвет обозначает \(1\).  |  |  | | Бинарная матрица из первого набора входных данных | Бинарная матрица из второго набора входных данных | Бинарная матрица из третьего набора входных данных |
| |
|
|
G. Хороший ключ, плохой ключ
битмаски
дп
жадные алгоритмы
математика
Перебор
*1600
У вас есть \(n\) сундуков. \(i\)-й сундук содержит \(a_i\) монет. Вы должны открыть все \(n\) сундуков по порядку, начиная с сундука \(1\), заканчивая сундуком \(n\). Также существуют два вида ключей, которые вы можете использовать для открытия каждого сундука: - хороший ключ, который стоит \(k\) монет;
- плохой ключ, который бесплатен, но уменьшит вдвое количество монет в каждом неоткрытом сундуке, включая сундук, который собираются им открыть. Уменьшаясь вдвое, количество монет округляется вниз до ближайшего целого числа для каждого из сундуков. Иными словами, если используется плохой ключ, чтобы открыть сундук \(i\), количества монет в сундуках изменятся следующим образом: \(a_i = \lfloor{\frac{a_i}{2}\rfloor}\), \(a_{i+1} = \lfloor\frac{a_{i+1}}{2}\rfloor, \dots, a_n = \lfloor \frac{a_n}{2}\rfloor\);
- любой ключ (и хороший и плохой) ломается после использования, то есть является одноразовым.
Вам необходимо использовать \(n\) ключей, по одному на каждый сундук. Изначально у вас нет ключей и монет. Если вы хотите использовать хороший ключ, то его надо купить. В процессе вы можете уходить в минус — например, если у вас есть \(1\) монета, вы можете купить хороший ключ за \(k=3\) монеты, и у вас станет \(-2\) монеты. Найдите максимальное количество монет, которое вы сможете получить в итоге после открытия всех \(n\) сундуков по порядку от \(1\) до \(n\). Выходные данные Для каждого набора выведите одно число — максимальное количество монет, которое вы сможете получить после открытия сундуков с \(1\) по \(n\). Пожалуйста, обратите внимание, что ответ для некоторых наборов входных данных может не поместиться в 32-разрядный целочисленный тип, поэтому вы должны использовать по крайней мере 64-разрядный целочисленный тип в вашем языке программирования (например, long long для C++). Примечание В первом наборе одна из возможных стратегий следующая: - Купить хороший ключ за \(5\) монет, и открыть сундук \(1\), получив \(10\) монет. Ваш баланс станет \(0 + 10 - 5 = 5\) монет.
- Купить хороший ключ за \(5\) монет, и открыть сундук \(2\), получив \(10\) монет. Ваш баланс станет \(5 + 10 - 5 = 10\) монет.
- Использовать плохой ключ, и открыть им сундук \(3\). В результате использования плохого ключа, количество монет в сундуке \(3\) становится \(\left\lfloor \frac{3}{2} \right\rfloor = 1\), и количество монет в сундуке \(4\) становится \(\left\lfloor \frac{1}{2} \right\rfloor = 0\). Ваш баланс станет \(10 + 1 = 11\).
- Использовать плохой ключ, и открыть им сундук \(4\). В результате использования плохого ключа, количество монет в сундуке \(4\) станет \(\left\lfloor \frac{0}{2} \right\rfloor = 0\). Ваш баланс станет \(11 + 0 = 11\).
После открытия всех сундуков, у вас останется \(11\) монет. Можно доказать, что получить больше монет невозможно.
| |
|
|
E. Марк и профессор Коро
Бинарный поиск
битмаски
жадные алгоритмы
Комбинаторика
Перебор
Структуры данных
*2300
После просмотра одного аниме перед сном Марку снится, что он стоит в старом классе с меловой доской, на которой записана последовательность из \(n\) положительных целых чисел \(a_1, a_2,\dots,a_n\). Затем в класс заходит профессор Коро. Он может выполнять следующую операцию: - выбрать целое число \(x\) которое присутствует на доске хотя бы \(2\) раза,
- стереть эти \(2\) вхождения,
- записать число \(x+1\) на доску.
После чего профессор Коро задает марку вопрос: «Какое максимально возможное число может появиться на доске после некоторого количества таких операций?» Марк быстро отвечает на этот вопрос, но он всё ещё медленнее профессора Коро. Поэтому профессор Коро решает задать Марку дополнительные вопросы. Он будет менять изначальную последовательность чисел на доске \(q\) раз. Каждый раз он будет выбирать положительные целые числа \(k\) и \(l\), затем менять \(a_k\) на \(l\). После каждого такого изменения он будет спрашивать у Марка ответ на тот же самый вопрос. Помогите Марку ответить на вопросы быстрее профессора Коро! Обратите внимание, что изменения начальной последовательности на доске сохраняются. Изменения, внесенные в последовательность \(a\), будут так же применяться при обработке следующих изменений. Выходные данные Выведите \(q\) строк, \(i\)-я строка должна содержать единственное целое число — ответ после \(i\)-го изменения. Примечание В первом примере программа должна обработать \(4\) изменения. После первого обновления последовательность на доске выглядит как \([2,3,2,4,5]\). Одна из возможных последовательностей операций, достигающих числа \(6\), такая: - Изначально, на доске числа \([2,3,2,4,5]\).
- Удаляем два вхождения числа \(2\) и записываем \(3\), получая \([3,4,5,\color{red}{3}]\).
- Удаляем два вхождения числа \(3\) и записываем \(4\), получая \([4,5,\color{red}{4}]\).
- Удаляем два вхождения числа \(4\) и записываем \(5\), получая \([5,\color{red}{5}]\).
- Удаляем два вхождения числа \(5\) и записываем \(6\), получая \([\color{red}{6}]\).
Затем, во время второго изменения, массив станет равным \([2,3,2,4,3]\). В этот раз Марк не может достичь числа \(6\). Однако одна из последовательностей операций, приводящая к числу \(5\), такая: - Изначально, на доске числа \([2,3,2,4,3]\).
- Удаляем два вхождения числа \(2\) и записываем \(3\), получая \([3,4,3,\color{red}{3}]\).
- Удаляем два вхождения числа \(3\) и записываем \(4\), получая \([3,4,\color{red}{4}]\).
- Удаляем два вхождения числа \(4\) и записываем \(5\), получая \([3,\color{red}{5}]\).
Во время третьего изменения массив станет равным \([2,3,2,1,3]\). Один из возможных вариантов достичь числа \(4\) такой: - Изначально, на доске числа \([2,3,2,1,3]\).
- Удаляем два вхождения числа \(3\) и записываем \(4\), получая \([2,2,1,\color{red}{4}]\).
| |
|
|
F. Марк и онлайн-экзамен
битмаски
интерактив
Конструктив
Теория вероятностей
*2900
Марк администрирует онлайн-экзамен, состоящий из \(n\) вопросов с ответами «да» или «нет». Однако он потерял список правильных ответов. Ему необходим способ восстановить ответы до того, как его клиент придет в ярость. К счастью, у него есть доступ к системе оценки. Так, за один запрос вы можете ввести ответы ко всем \(n\) вопросам из экзамена и система оценки ответит, сколько введенных ответов верны. У Марка есть не так много времени, поэтому он может использовать систему оценки не более \(675\) раз. Помогите Марку определить правильные ответы ко всем вопросам экзамена. Обратите внимание, что правильные ответы к вопросам фиксированы и не будут меняться в зависимости от ваших запросов. Протокол взаимодействия После чтения \(n\) вы можете начинать делать запросы к системе оценки. Чтобы сделать запрос, выведите строку \(s\) длины \(n\), состоящую только из букв «T» и «F». - \(s_i = \)T означает, что предполагаемый ответ на \(i\)-й вопрос — «да».
- \(s_i = \)F означает, что предполагаемый ответ на \(i\)-й вопрос — «нет».
После успешного запроса вы должны прочитать целое число \(k\) (\(0\leq k\leq n\)) — количество верных ответов. Если вы прочитали \(n\), то вы нашли все ответы, и ваша программа должна завершиться. Если ваше решение прочитало \(k = -1\) вместо ответа системы оценки, это значит, что вы совершили некорректный запрос или достигли ограничения на количество запросов. Ваша программа должна немедленно завершиться после прочтения ответа \(-1\), вы получите вердикт Неправильный ответ. В противном случае вы можете получить любой вердикт, так как программа продолжит чтение из закрытого потока. После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Взломы Для взлома используйте следующий формат. Первая строка содержит целое число \(n\) (\(1\leq n\leq 1000\)) — количество вопросов. Вторая строка содержит строку \(s\) длины \(n\), состоящую только из букв «T» и «F» — правильные ответы на экзамене. Примечание Пустые строки в примерах нужны только для того, чтобы вы лучше понимали процесс взаимодействия. От вас не требуется их выводить. В первом примере экзамен состоит из \(3\) вопросов, ответы на которые «да», «да» и «нет» соответственно. - В первом запросе предполагаются ответы «нет», «да» и «да» соответственно. Верно угадан только один ответ — на \(2\)-й вопрос.
- Затем, во втором запросе, программа верно угадала все ответы.
Во втором примере экзамен состоит из \(4\) вопросов, ответы на которые «да», «нет», «да» и «да» соответственно. - В первом запросе нет верно угаданных ответов, поэтому ответ от программы жюри \(0\).
- Во втором запросе верно угаданы \(1\)-й, \(3\)-й, и \(4\)-й ответы, поэтому ответ системы \(3\).
- В третьем запросе программа верно угадала все ответы.
| |
|
|
F. Бугабу
битмаски
дп
Конструктив
теория чисел
*3500
Трансформация массива положительных целых чисел \(a_1,a_2,\dots,a_n\) определена как замена \(a\) на массив \(b_1,b_2,\dots,b_n\), получающийся операцией \(b_i=a_i\oplus a_{(i\bmod n)+1}\), где \(\oplus\) обозначает операцию побитового XOR (исключающего ИЛИ). Вам даны целые числа \(n\), \(t\) и \(w\). Мы считаем, что массив \(c_1,c_2,\dots,c_n\) (\(0 \le c_i \le 2^w-1\)) является бугабу тогда и только тогда, когда существует массив \(a_1,a_2,\dots,a_n\) такой, что после трансформации массива \(a\) ровно \(t\) раз массив \(a\) превращается в \(c\). Например, если \(n=6\), \(t=2\), \(w=2\), то массив \([3,2,1,0,2,2]\) — бугабу, потому что его можно получить, трансформировав массив \([2,3,1,1,0,1]\) \(2\) раза: \(\) [2,3,1,1,0,1]\to [2\oplus 3,3\oplus 1,1\oplus 1,1\oplus 0,0\oplus 1,1\oplus 2]=[1,2,0,1,1,3]; \\ [1,2,0,1,1,3]\to [1\oplus 2,2\oplus 0,0\oplus 1,1\oplus 1,1\oplus 3,3\oplus 1]=[3,2,1,0,2,2]. \(\) Массив \([4,4,4,4,0,0]\) не бугабу, потому что \(4 > 2^2 - 1\). Массив \([2,3,3,3,3,3]\) не бугабу, потому что он не может быть получен трансформацией одного массива \(2\) раза. Вам дан массив \(c\), значения на некоторых позициях которого неизвестны (вначале только \(m\) элементов известны, остальные — нет). Также есть \(q\) модификаций, где каждая модификация меняет какой-либо элемент \(c\). Модификация может изменить, известен ли элемент на какой-либо позиции или нет, а так же, возможно, переопределить элемент на позиции, которая уже известна. Вам нужно посчитать, сколько возможных массивов \(c\) (с произвольными элементами на неизвестных позициях) являются бугабу после каждой модификации. Выведите \(i\)-й ответ по модулю \(p_i\) (\(p_i\) — заданный массив из \(q\) элементов). Выходные данные Выведите \(q\) строк — ваши ответы. Примечание В первом примере \(n=3\), \(t=1\) и \(w=1\). Пусть \(?\) обозначает неизвестную позицию в массиве \(c\). В первом запросе \(c=[1,0,1]\). Единственный возможный массив \([1,0,1]\) — бугабу, потому что он может быть получен одной трансформацией из \([0,1,1]\). Поэтому ответ \(1\bmod 123\,456\,789 = 1\). Во втором запросе \(c=[1,1,1]\). Единственный возможный массив \([1,1,1]\) — не бугабу. Поэтому ответ \(0\bmod 111\,111\,111 = 0\). В третьем запросе \(c=[?,1,1]\). Есть два возможных массива: \([1,1,1]\) и \([0,1,1]\). Из них только \([0,1,1]\) является бугабу, потому что может быть получен одной трансформацией из \([1,1,0]\). Поэтому ответ \(1\bmod 987\,654\,321=1\). В четвертом запросе \(c=[?,1,?]\). Есть четыре возможных массива, из них \([0,1,1]\) и \([1,1,0]\) являются бугабу. \([1,1,0]\) может быть получен из \([1,0,1]\) одной трансформацией. Поэтому ответ \(2\bmod 555\,555\,555=2\).
| |
|
|
E. XOR дерево
битмаски
Деревья
жадные алгоритмы
поиск в глубину и подобное
снм
Структуры данных
*2400
Дано дерево из \(n\) вершин. На каждой вершине дерева записано число; на \(i\)-й вершине записано число \(a_i\). Напомним, что простой путь — это путь, посещающий каждую вершину не более одного раза. Назовем весом пути побитовое исключающее ИЛИ значений записанных на его вершинах. Скажем, что дерево хорошее, если в нем не существует ни одного простого пути с весом \(0\). Вы можете применить следующую операцию произвольное количество раз (возможно, ноль): выбрать вершину дерева и заменить значение записанное на ней на произвольное положительное целое число. Какое минимальное количество раз необходимо применить данную операцию, чтобы дерево стало хорошим? Выходные данные Выведите одно целое число — минимальное количество раз, которое необходимо применить операцию, чтобы дерево стало хорошим. Примечание В первом примере можно заменить значение на вершине \(1\) на \(13\), а значение на вершине \(4\) — на \(42\).
| |
|
|
F. Мультимножество строк
meet-in-the-middle
битмаски
бпф
графы
Деревья
дп
математика
Перебор
Потоки
*2500
Вам даны три целых числа \(n\), \(k\) и \(f\). Рассмотрим все бинарные строки (то есть все строки, состоящие из символов \(0\) и/или \(1\)) длины от \(1\) до \(n\). Для каждой такой строки \(s\) вы должны выбрать целое число \(c_s\) от \(0\) до \(k\). Мультимножество из бинарных строк длины ровно \(n\) считается красивым, если для каждой бинарной строки \(s\) длины от \(1\) до \(n\) выполняется следующее: количество строк в мультимножестве, для которых \(s\) является префиксом, не превосходит \(c_s\). Например, пусть \(n = 2\), \(c_{0} = 3\), \(c_{00} = 1\), \(c_{01} = 2\), \(c_{1} = 1\), \(c_{10} = 2\) и \(c_{11} = 3\). Мультимножество строк \(\{11, 01, 00, 01\}\) является красивым, так как: - для строки \(0\) существует \(3\) строки из мультимножества, для которых \(0\) — префикс, и \(3 \le c_0\);
- для строки \(00\) существует одна строка из мультимножества, для которой \(00\) — префикс, и \(1 \le c_{00}\);
- для строки \(01\) существует \(2\) строки из мультимножества, для которых \(01\) — префикс, и \(2 \le c_{01}\);
- для строки \(1\) существует одна строка из мультимножества, для которой \(1\) — префикс, и \(1 \le c_1\);
- для строки \(10\) существует \(0\) строк из мультимножества, для которых \(10\) — префикс, и \(0 \le c_{10}\);
- для строки \(11\) существует одна строка из мультимножества, для которой \(11\) — префикс, и \(1 \le c_{11}\).
А теперь — сама задача. Вы должны посчитать количество способов выбрать числа \(c_s\) для всех бинарных строк \(s\) длины от \(1\) до \(n\) таким образом, чтобы максимальный возможный размер красивого мультимножества был равен ровно \(f\). Выходные данные Выведите одно целое число — количество способов выбрать числа \(c_s\) для всех бинарных строк \(s\) длины от \(1\) до \(n\) таким образом, чтобы максимальный возможный размер красивого мультимножества был равен ровно \(f\). Так как ответ может быть очень большим, выведите его по модулю \(998244353\). Примечание В первом примере есть три способа выбрать значения \(c_s\): - \(c_0 = 0\), \(c_1 = 2\), тогда максимальное красивое мультимножество — \(\{1, 1\}\);
- \(c_0 = 1\), \(c_1 = 1\), тогда максимальное красивое мультимножество — \(\{0, 1\}\);
- \(c_0 = 2\), \(c_1 = 0\), тогда максимальное красивое мультимножество — \(\{0, 0\}\).
| |
|
|
C. XOR-треугольники
битмаски
дп
жадные алгоритмы
Конструктив
математика
Перебор
*2500
Вам дано целое положительно число \(n\). Так как \(n\) может быть большим, вам дано его представление в двоичной системе счисления. Вычислите количество троек целых чисел \((a,b,c)\) таких, что \(0 \leq a,b,c \leq n\), и значение \(a \oplus b\), \(b \oplus c\) и \(a \oplus c\) образуют стороны невырожденного треугольника. Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Выведите ответ по модулю \(998\,244\,353\). Три положительных числа \(x\), \(y\) и \(z\) образуют стороны невырожденного треугольника, если и только если \(x+y>z\), \(x+z>y\) и \(y+z>x\). Выходные данные Выведите одно число — количество троек \((a,b,c)\), удовлетворяющих условию, по модулю \(998\,244\,353\). Примечание В первом примере \(101_2=5\). - Тройка \((a, b, c) = (0, 3, 5)\) подходит, потому что \((a\oplus b, b\oplus c, c\oplus a) = (3, 6, 5)\) образуют стороны невырожденного треугольника.
- Тройка \((a, b, c) = (1, 2, 4)\) подходит, потому что \((a\oplus b, b\oplus c, c\oplus a) = (3, 6, 5)\) образуют стороны невырожденного треугольника.
\(6\) перестановок каждой из этих двух троек тоже подходят, поэтому ответ \(12\). В третьем примере \(11\,011\,111\,101\,010\,010_2=114\,514\). Полный ответ (без взятия по модулю) равен \(1\,466\,408\,118\,808\,164\).
| |
|
|
F. Потерянный массив
битмаски
дп
Комбинаторика
Конструктив
математика
*2900
Мои orz-дети, мы можем оптимизировать эту задачу с \(O(S^3)\) до \(O\left(T^\frac{5}{9}\right)\)! — Spyofgame, основатель религии Orz Давным-давно Spyofgame изобрел известный массив \(a\) (элементы которого нумеруются с \(1\)) длины \(n\), который содержал знания о мире и о жизни. После этого он превратил его в матрицу \(b\) (элементы которой нумеруются с \(0\)) размера \((n + 1) \times (n + 1)\), которая содержала знания о мире, о жизни, и о том, что за их пределами. Spyofgame превратил \(a\) в \(b\) по следующим правилам. - \(b_{i,0} = 0\) при \(0 \leq i \leq n\);
- \(b_{0,i} = a_{i}\) при \(1 \leq i \leq n\);
- \(b_{i,j} = b_{i,j-1} \oplus b_{i-1,j}\) при \(1 \leq i, j \leq n\).
Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ. В наши дни археологи нашли знаменитую матрицу \(b\). Однако многие ее элементы утеряны. Удалось прочесть лишь значения \(b_{i,n}\) для всех \(1 \leq i \leq n\) (обратите внимание, это некоторые элементы последнего столбца, а не строки). Археологи хотят восстановить возможный массив \(a\). Можете помочь им найти любой массив, который может быть массивом \(a\)? Выходные данные Если какой-то массив \(a\) подходит под данную информацию, выведите строку, содержащую \(n\) целых чисел \(a_1, a_2, \ldots, a_n\). Если существуют несколько решений, выведите любое из них. Если решения не существует, выведите одно целое число \(-1\). Примечание Если \(a = [1,2,3]\), то \(b\) будет следующей: | \(\bf{0}\) | \(\bf{1}\) | \(\bf{2}\) | \(\bf{3}\) | | \(\bf{0}\) | \(1\) | \(3\) | \(0\) | | \(\bf{0}\) | \(1\) | \(2\) | \(2\) | | \(\bf{0}\) | \(1\) | \(3\) | \(1\) | Значения \(b_{1,n}, b_{2,n}, \ldots, b_{n,n}\) равны \([0,2,1]\), что соответствует найденной археологами информации.
| |
|
|
D. 2+ стула
2-sat
битмаски
графы
жадные алгоритмы
*1900
У куратора из Омеги есть массив целых чисел \(a\) длины \(n\), и он может сказать вам только число \(n\) и \(q\) утверждений про массив, каждое из которых записывается как \(i, j, x\), что означает, что \(a_i \mid a_j = x\), где \(|\) обозначает операцию побитового ИЛИ. Найдите массив \(a\), если про него также известно, что он лексикографически минимален среди всех массивов, которые удовлетворяют условиям. Массив \(a\) лексикографически меньше массива \(b\) такой же длины, если и только если выполняется следующее: - в первой позиции, где \(a\) и \(b\) различны, в массиве \(a\) элемент меньше, чем соответствующий элемент в \(b\).
Выходные данные На одной строке выведите \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i < 2^{30}\)) — массив \(a\). Примечание В первом примере под условия подходят следующие массивы: - \([0, 3, 2, 2]\),
- \([2, 1, 0, 0]\),
- \([2, 1, 0, 2]\),
- \([2, 1, 2, 0]\),
- \([2, 1, 2, 2]\),
- \([2, 3, 0, 0]\),
- \([2, 3, 0, 2]\),
- \([2, 3, 2, 0]\),
- \([2, 3, 2, 2]\).
| |
|
|
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]\).
| |
|
|
D1. Xor-подпоследовательность (простая версия)
битмаски
Деревья
дп
Перебор
Строки
*1800
Это простая версия задачи. Единственное различие состоит в том, что в этой версии \(a_i \le 200\). Дан массив из \(n\) целых чисел \(a_0, a_1, a_2, \ldots a_{n - 1}\). Бряп захотел найти в данном массиве самую длинную хорошую подпоследовательность. Массив \(b = [b_0, b_1, \ldots, b_{m-1}]\), где \(0 \le b_0 < b_1 < \ldots < b_{m - 1} < n\), будем называть подпоследовательностью длины \(m\) массива \(a\). Подпоследовательность \(b = [b_0, b_1, \ldots, b_{m-1}]\) длины \(m\) называется хорошей, если выполняется следующее условие: - Для любого целого числа \(p\) (\(0 \le p < m - 1\)) выполняется условие: \(a_{b_p} \oplus b_{p+1} < a_{b_{p+1}} \oplus b_p\).
Здесь \(a \oplus b\) обозначает побитовое исключающее ИЛИ чисел \(a\) и \(b\). Например, \(2 \oplus 4 = 6\), а \(3 \oplus 1=2\). Так как Бряп не очень любознательная персона, он хочет знать лишь длину такой подпоследовательности. Помогите ему найти ответ на данную задачу. Выходные данные Для каждого набора входных данных единственное число — максимальную длину хорошей подпоследовательности. Примечание В первом наборе входных данных в качестве подпоследовательности мы можем выбрать оба элемента массива, так как \(1 \oplus 1 < 2 \oplus 0\). Во втором наборе входных данных мы можем взять элементы с индексами \(1\), \(2\) и \(4\) (в \(0\)-нумерации). Для них выполняется: \(2 \oplus 2 < 4 \oplus 1\) и \(4 \oplus 4 < 1 \oplus 2\).
| |
|
|
D2. Xor-подпоследовательность (сложная версия)
битмаски
Деревья
дп
Строки
Структуры данных
*2400
Это сложная версия задачи. Единственное различие состоит в том, что в этой версии \(a_i \le 10^9\). Дан массив из \(n\) целых чисел \(a_0, a_1, a_2, \ldots a_{n - 1}\). Бряп захотел найти в данном массиве самую длинную хорошую подпоследовательность. Массив \(b = [b_0, b_1, \ldots, b_{m-1}]\), где \(0 \le b_0 < b_1 < \ldots < b_{m - 1} < n\), будем называть подпоследовательностью длины \(m\) массива \(a\). Подпоследовательность \(b = [b_0, b_1, \ldots, b_{m-1}]\) длины \(m\) называется хорошей, если выполняется следующее условие: - Для любого целого числа \(p\) (\(0 \le p < m - 1\)) выполняется условие: \(a_{b_p} \oplus b_{p+1} < a_{b_{p+1}} \oplus b_p\).
Здесь \(a \oplus b\) обозначает побитовое исключающее ИЛИ чисел \(a\) и \(b\). Например, \(2 \oplus 4 = 6\), а \(3 \oplus 1=2\). Так как Бряп не очень любознательная персона, он хочет знать лишь длину такой подпоследовательности. Помогите ему найти ответ на данную задачу. Выходные данные Для каждого набора входных данных единственное число — максимальную длину хорошей подпоследовательности. Примечание В первом наборе входных данных в качестве подпоследовательности мы можем выбрать оба элемента массива, так как \(1 \oplus 1 < 2 \oplus 0\). Во втором наборе входных данных мы можем взять элементы с индексами \(1\), \(2\) и \(4\) (в \(0\) нумерации). Для них выполняется: \(2 \oplus 2 < 4 \oplus 1\) и \(4 \oplus 4 < 1 \oplus 2\).
| |
|
|
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\) произвольным образом.
| |
|
|
G. Чётный-нечётный XOR
битмаски
жадные алгоритмы
Конструктив
*1500
Дано целое число \(n\), найдите любой массив \(a\), состоящий из \(n\) различных неотрицательных целых чисел, меньших \(2^{31}\), такой, что побитовый XOR элементов на нечетных позициях равен побитовому XOR элементов на четных позициях. Выходные данные Для каждого набора входных данных выведите одну строку, содержащую \(n\) различных целых чисел, которые удовлетворяют условиям. Если ответов несколько, выведите любой. Примечание В первом наборе входных данных XOR на нечетных позициях равен \(4 \oplus 1 \oplus 0 \oplus 7 = 2\) и XOR на четных позициях \(2 \oplus 5 \oplus 6 \oplus 3= 2\).
| |
|
|
D. Deducing Sortability
Бинарный поиск
битмаски
математика
*2900
Let's say Pak Chanek has an array \(A\) consisting of \(N\) positive integers. Pak Chanek will do a number of operations. In each operation, Pak Chanek will do the following: - Choose an index \(p\) (\(1 \leq p \leq N\)).
- Let \(c\) be the number of operations that have been done on index \(p\) before this operation.
- Decrease the value of \(A_p\) by \(2^c\).
- Multiply the value of \(A_p\) by \(2\).
After each operation, all elements of \(A\) must be positive integers. An array \(A\) is said to be sortable if and only if Pak Chanek can do zero or more operations so that \(A_1 < A_2 < A_3 < A_4 < \ldots < A_N\). Pak Chanek must find an array \(A\) that is sortable with length \(N\) such that \(A_1 + A_2 + A_3 + A_4 + \ldots + A_N\) is the minimum possible. If there are more than one possibilities, Pak Chanek must choose the array that is lexicographically minimum among them. Pak Chanek must solve the following things: - Pak Chanek must print the value of \(A_1 + A_2 + A_3 + A_4 + \ldots + A_N\) for that array.
- \(Q\) questions will be given. For the \(i\)-th question, an integer \(P_i\) is given. Pak Chanek must print the value of \(A_{P_i}\).
Help Pak Chanek solve the problem. Note: an array \(B\) of size \(N\) is said to be lexicographically smaller than an array \(C\) that is also of size \(N\) if and only if there exists an index \(i\) such that \(B_i < C_i\) and for each \(j < i\), \(B_j = C_j\). Output Print \(Q+1\) lines. The \(1\)-st line contains an integer representing \(A_1 + A_2 + A_3 + A_4 + \ldots + A_N\). For each \(1 \leq i \leq Q\), the \((i+1)\)-th line contains an integer representing \(A_{P_i}\). Note In the first example, the array \(A\) obtained is \([1, 2, 3, 3, 4, 4]\). We can see that the array is sortable by doing the following operations: - Choose index \(5\), then \(A = [1, 2, 3, 3, 6, 4]\).
- Choose index \(6\), then \(A = [1, 2, 3, 3, 6, 6]\).
- Choose index \(4\), then \(A = [1, 2, 3, 4, 6, 6]\).
- Choose index \(6\), then \(A = [1, 2, 3, 4, 6, 8]\).
| |
|
|
F. Field Photography
битмаски
сортировки
Структуры данных
*2100
Pak Chanek is traveling to Manado. It turns out that OSN (Indonesian National Scientific Olympiad) 2019 is being held. The contestants of OSN 2019 are currently lining up in a field to be photographed. The field is shaped like a grid of size \(N \times 10^{100}\) with \(N\) rows and \(10^{100}\) columns. The rows are numbered from \(1\) to \(N\) from north to south, the columns are numbered from \(1\) to \(10^{100}\) from west to east. The tile in row \(r\) and column \(c\) is denoted as \((r,c)\). There are \(N\) provinces that participate in OSN 2019. Initially, each contestant who represents province \(i\) stands in tile \((i, p)\) for each \(p\) satisfying \(L_i \leq p \leq R_i\). So, we can see that there are \(R_i-L_i+1\) contestants who represent province \(i\). Pak Chanek has a variable \(Z\) that is initially equal to \(0\). In one operation, Pak Chanek can choose a row \(i\) and a positive integer \(k\). Then, Pak Chanek will do one of the two following possibilities: - Move all contestants in row \(i\) exactly \(k\) tiles to the west. In other words, a contestant who is in \((i, p)\) is moved to \((i, p-k)\).
- Move all contestants in row \(i\) exactly \(k\) tiles to the east. In other words, a contestant who is in \((i, p)\) is moved to \((i, p+k)\).
After each operation, the value of \(Z\) will change into \(Z \text{ OR } k\), with \(\text{OR}\) being the bitwise OR operation. Note that Pak Chanek can do operations to the same row more than once. Also note that Pak Chanek is not allowed to move contestants out of the grid. There are \(Q\) questions. For the \(j\)-th question, you are given a positive integer \(W_j\), Pak Chanek must do zero or more operations so that the final value of \(Z\) is exactly \(W_j\). Define \(M\) as the biggest number such that after all operations, there is at least one column that contains exactly \(M\) contestants. For each question, you must find the biggest possible \(M\) for all sequences of operations that can be done by Pak Chanek. Note that the operations done by Pak Chanek for one question do not carry over to other questions. Output Output \(Q\) lines, with the \(j\)-th line containing an integer that is the answer to the \(j\)-th question. Note For the \(1\)-st question, Pak Chanek can do the following operations to get \(M=2\): - Move all contestants in row \(2\) to the east by \(4\) tiles. \(Z\) changes into \(0 \text{ OR } 4 = 4\).
- Move all contestants in row \(1\) to the east by \(12\) tiles. \(Z\) changes into \(4 \text{ OR } 12 = 12\).
Now, columns \(14\) and \(15\) each contains exactly \(2\) contestants. For the \(2\)-nd question, Pak Chanek can do the following operations to get \(M=3\): - Move all contestants in row \(3\) to the east by \(4\) tiles. \(Z\) changes into \(0 \text{ OR } 4 = 4\).
- Move all contestants in row \(3\) to the west by \(1\) tiles. \(Z\) changes into \(4 \text{ OR } 1 = 5\).
- Move all contestants in row \(1\) to the east by \(5\) tiles. \(Z\) changes into \(5 \text{ OR } 5 = 5\).
- Move all contestants in row \(1\) to the east by \(5\) tiles. \(Z\) changes into \(5 \text{ OR } 5 = 5\).
Now, column \(11\) contains exactly \(3\) contestants. The following is an illustration of the example operations for the \(2\)-nd question. 
| |
|
|
B. Mainak и интересная последовательность
битмаски
Конструктив
математика
*1100
У Mainak есть два положительных целых числа \(n\) и \(m\). Mainak считает, что последовательность \(a_1, a_2, \ldots, a_n\) из \(n\) положительных целых чисел интересная, если для всех целых \(i\) (\(1 \le i \le n\)), побитовое исключающее ИЛИ всех элементов в \(a\), которые строго меньше \(a_i\), равно \(0\). Формально, \(p_i\) равно побитовому исключающему ИЛИ всех элементов в \(a\), которые строго меньше \(a_i\), тогда \(a\) является интересной последовательностью, если \(p_1 = p_2 = \ldots = p_n = 0\). Например, последовательность \([1,3,2,3,1,2,3]\), \([4,4,4,4]\), \([25]\) являются интересными, тогда как \([1,2,3,4]\) (\(p_2 = 1 \ne 0\)), \([4,1,1,2,4]\) (\(p_1 = 1 \oplus 1 \oplus 2 = 2 \ne 0\)), \([29,30,30]\) (\(p_2 = 29 \ne 0\)) не являются интересными. Здесь \(a \oplus b\) обозначает побитовое исключающее ИЛИ чисел \(a\) и \(b\). Найдите любую интересную последовательность \(a_1, a_2, \ldots, a_n\) такую, что сумма элементов в последовательности \(a\) равна \(m\), т.е. \(a_1 + a_2 \ldots + a_n = m\), или же сообщите, что не существует такой последовательности Заметьте, что побитовое исключающее ИЛИ пустой последовательности считается равным \(0\). Выходные данные Для каждого набора входных данных, если существует некоторая интересная последовательность, выведите «Yes» в первой строке, иначе выведите «No». Вы можете выводить каждую букву в любом регистре (например, «YES», «Yes», «yes», «yEs» будут распознаны как положительный ответ). Если ответ «Yes», выведите \(n\) положительных целых чисел \(a_1, a_2, \ldots, a_n\) (\(a_i \ge 1\)), образующих интересную последовательность такую, что \(a_1 + a_2 \ldots + a_n = m\). Если существует несколько решений, выведите любое. Примечание - В первом наборе входных данных \([3]\) является единственной интересной последовательностью длины \(1\), имеющей сумму \(3\).
- В третьем наборе входных данных не существует последовательности длины \(2\), имеющей сумму элементов \(1\), поэтому такой интересной последовательности тоже не существует.
- В четвёртом наборе входных данных \(p_1 = p_2 = p_3 = 0\), потому что побитовое исключающее ИЛИ пустой последовательности равно \(0\).
| |
|
|
G. Освещение
Бинарный поиск
битмаски
дп
Комбинаторика
математика
Перебор
*2700
Рассмотрим отрезок \([0, d]\) координатной прямой. В этом отрезке \(n\) фонарей и \(m\) интересных точек. Для каждого фонаря вы должны выбрать его мощность — целое число от \(0\) до \(d\) (включительно). Фонарь с координатой \(x\) освещает интересную точку с координатой \(y\), если \(|x - y|\) меньше либо равно мощности фонаря. Способ выбрать мощности для всех фонарей является корректным, если каждая интересная точка освещена хотя бы одним фонарем. Вам нужно обработать \(q\) запросов. Каждый запрос обозначается одним целым числом \(f_i\). Чтобы ответить на \(i\)-й запрос, вам нужно: - добавить фонарь в точку \(f_i\);
- посчитать количество корректных способов назначить мощность каждому фонарю, и вывести это количество по модулю \(998244353\);
- удалить только что добавленный фонарь.
Выходные данные Для каждого запроса выведите ответ на него по модулю \(998244353\).
| |
|
|
F. Почти отсортировано
битмаски
дп
Структуры данных
*2700
Дана перестановка \(p\) длины \(n\) и целое число \(k\). Рассмотрим перестановку \(q\) длины \(n\) такую, что для любых целых чисел \(i\) и \(j\), где \(1 \le i < j \le n\), выполняется \(\)p_{q_i} \le p_{q_j} + k.\(\) Найдите минимально возможное количество инверсий, которое может быть в перестановке \(q\). Перестановкой является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)). Инверсия в перестановке \(a\) — это пара индексов \(i\) и \(j\) (\(1 \le i, j \le n\)), такая, что \(i < j\), но \(a_i > a_j\). Выходные данные Выведите минимально возможное количество инверсий, которое может быть в перестановке \(q\). Примечание В первом примере единственный вариант перестановки \(q = [1]\) (\(0\) инверсий). Тогда \(p_{q_1} = 1\). Во втором примере единственный вариант с \(1\) инверсией — \(q = [1, 3, 2]\). Тогда \(p_{q_1} = 2\), \(p_{q_2} = 1\), \(p_{q_3} = 3\). В третьем примере один из возможных вариантов с \(6\) инверсиями — \(q = [3, 4, 5, 1, 2]\). Тогда \(p_{q_1} = 3\), \(p_{q_2} = 2\), \(p_{q_3} = 1\), \(p_{q_4} = 5\), \(p_{q_5} = 4\).
| |
|
|
C. Четные подмассивы
битмаски
математика
Перебор
теория чисел
хэши
*1700
Вам задан целочисленный массив \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\)). Определите количество подмассивов \(a\), у которых \(\operatorname{XOR}\) имеет четное количество делителей. Другими словами, определите количество пар индексов \((i, j)\) (\(i \le j\)) таких, что \(a_i \oplus a_{i + 1} \oplus \dots \oplus a_j\) имеет четное количество делителей. Например, числа \(2\), \(3\), \(5\) или \(6\) имеют четное количество делителей, а \(1\) и \(4\) — нечетное. Считайте, что для данной задачи \(0\) имеет нечетное количество делителей. Здесь \(\operatorname{XOR}\) (или \(\oplus\)) обозначает операцию побитового исключающего ИЛИ. Выведите количество подмассивов, но умноженное на 2022... Так, давайте закончим. Просто выведите сам ответ. Выходные данные Для каждого набора входных данных выведите количество подмассивов, \(\operatorname{XOR}\) которых имеет четное количество делителей. Примечание В первом наборе входных данных есть \(4\) подмассива, \(\operatorname{XOR}\) которых имеет четное количество делителей: \([3]\), \([3,1]\), \([1,2]\), \([2]\). Во втором наборе есть \(11\) подмассивов, \(\operatorname{XOR}\) которых имеет четное количество делителей: \([4,2]\), \([4,2,1]\), \([4,2,1,5]\), \([2]\), \([2,1]\), \([2,1,5]\), \([2,1,5,3]\), \([1,5,3]\), \([5]\), \([5,3]\), \([3]\). В третьем наборе нет подмассивов, \(\operatorname{XOR}\) которых имеет четное количество делителей, так как \(\operatorname{XOR}\) любого подмассива равен либо \(4\), либо \(0\).
| |
|
|
C1. Шейх (простая версия)
Бинарный поиск
битмаски
жадные алгоритмы
*1800
Это простая версия задачи. Единственное различие состоит в том, что в этой версии \(q = 1\). Вам дан массив целых чисел \(a_1, a_2, \ldots, a_n\). Стоимостью подотрезка массива \([l, r]\), \(1 \leq l \leq r \leq n\), назовем величину \(f(l, r) = \operatorname{sum}(l, r) - \operatorname{xor}(l, r)\), где \(\operatorname{sum}(l, r) = a_l + a_{l+1} + \ldots + a_r\), а \(\operatorname{xor}(l, r) = a_l \oplus a_{l+1} \oplus \ldots \oplus a_r\) (\(\oplus\) обозначает побитовое исключающее ИЛИ). У вас будет \(q = 1\) запрос. Каждый запрос задается парой чисел \(L_i\), \(R_i\), где \(1 \leq L_i \leq R_i \leq n\). Вам нужно найти подотрезок \([l, r]\), \(L_i \leq l \leq r \leq R_i\) с максимальным значением \(f(l, r)\). Если подходящих ответов несколько, то среди них нужно найти подотрезок с минимальной длиной, то есть минимальным значением \(r - l + 1\). Выходные данные Для каждого набора входных данных выведите \(q\) пар чисел \(L_i \leq l \leq r \leq R_i\), таких что значение \(f(l, r)\) максимально, а среди таких длина \(r - l + 1\) минимальна. Если существует несколько правильных ответов, выведите любой из них. Примечание В первом наборе входных данных \(f(1, 1) = 0 - 0 = 0\). Во втором наборе входных данных \(f(1, 1) = 5 - 5 = 0\), \(f(2, 2) = 10 - 10 = 0\). Заметим, что \(f(1, 2) = (10 + 5) - (10 \oplus 5) = 0\), но нам среди максимальных значений \(f(l, r)\) нужно найти подотрезок с минимальной длиной. Поэтому правильными ответами будут только отрезки \([1, 1]\) и \([2, 2]\). В четвертом наборе входных данных \(f(2, 3) = (12 + 8) - (12 \oplus 8) = 16\). В пятом наборе входных данных есть два правильных ответа, так как \(f(2, 3) = f(3, 4)\) и их длины равны.
| |
|
|
C2. Шейх (сложная версия)
Бинарный поиск
битмаски
жадные алгоритмы
Перебор
реализация
*2100
Это сложная версия задачи. Единственное различие состоит в том, что в этой версии \(q = n\). Вам дан массив целых чисел \(a_1, a_2, \ldots, a_n\). Стоимостью подотрезка массива \([l, r]\), \(1 \leq l \leq r \leq n\), назовем величину \(f(l, r) = \operatorname{sum}(l, r) - \operatorname{xor}(l, r)\), где \(\operatorname{sum}(l, r) = a_l + a_{l+1} + \ldots + a_r\), а \(\operatorname{xor}(l, r) = a_l \oplus a_{l+1} \oplus \ldots \oplus a_r\) (\(\oplus\) обозначает побитовое исключающее ИЛИ). У вас будет \(q\) запросов. Каждый запрос задается парой чисел \(L_i\), \(R_i\), где \(1 \leq L_i \leq R_i \leq n\). Вам нужно найти подотрезок \([l, r]\), \(L_i \leq l \leq r \leq R_i\) с максимальным значением \(f(l, r)\). Если ответов несколько, то среди них нужно найти подотрезок с минимальной длиной, то есть минимальным значением \(r - l + 1\). Выходные данные Для каждого набора входных данных выведите \(q\) пар чисел \(L_i \leq l \leq r \leq R_i\), таких что значение \(f(l, r)\) максимально, а среди таких длина \(r - l + 1\) минимальна. Если существует несколько правильных ответов, выведите любой из них. Примечание Во всех наборах входных данных рассматривается первый запрос. В первом наборе входных данных \(f(1, 1) = 0 - 0 = 0\). Во втором наборе входных данных \(f(1, 1) = 5 - 5 = 0\), \(f(2, 2) = 10 - 10 = 0\). Заметим, что \(f(1, 2) = (10 + 5) - (10 \oplus 5) = 0\), но нам среди максимальных значений \(f(l, r)\) нужно найти подотрезок с минимальной длиной. Поэтому правильными ответами будут только отрезки \([1, 1]\) и \([2, 2]\). В четвертом наборе входных данных \(f(2, 3) = (12 + 8) - (12 \oplus 8) = 16\). В пятом наборе входных данных есть два правильных ответа, так как \(f(2, 3) = f(3, 4)\) и их длины равны.
| |
|
|
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\) позициях.
| |
|
|
E. Робот-пылесос
битмаски
дп
*2400
Рассмотрим коридор, которой может быть представлен как матрица из \(2\) строк и \(n\) столбцов. Определим ячейку на пересечении \(i\)-й строки и \(j\)-го столбца как \((i, j)\). Расстояние между ячейками \((i_1, j_1)\) и \((i_2, j_2)\) равно \(|i_1 - i_2| + |j_1 - j_2|\). В клетке \((1, 1)\) стоит робот-пылесос. Некоторые клетки коридора чистые, остальные — грязные (клетка, в которой стоит робот, чистая). Вы хотите очистить коридор, поэтому вы планируете запустить робота для этой работы. После запуска робот делает следующее. Пока есть хотя бы одна грязная клетка, робот выбирает ближайшую (к текущей клетке) клетку среди грязных, перемещается туда и очищает ее (клетка перестает быть грязной). После очистки робот снова находит ближайшую к его текущей клетке грязную клетку, и так далее. Этот процесс повторяется, пока весь коридор не станет чистым. Однако в программе робота есть серьезная ошибка. Если в какой-то момент есть несколько ближайших (к текущей позиции робота) грязных клеток, то робот ломается. Вы хотите сами очистить коридор так, чтобы робот не сломался. До запуска робота вы можете очистить несколько (возможно, ноль) грязных клеток вручную. Однако вы не хотите делать много грязной работы сами, когда у вас есть такой замечательный, умный (хоть и неправильно запрограммированный) робот, чтобы это делать. Обратите внимание, что вы не можете сделать чистую клетку грязной. Посчитайте максимальное количество клеток, которые можно оставить грязными до запуска робота так, чтобы он не сломался. Выходные данные Выведите одно целое число — максимально возможное количество клеток, которые можно оставить грязными, до запуска робота так, чтобы он не сломался. Примечание В первом примере можно очистить клетку \((1, 2)\), так что путь робота — \((1, 1) \rightarrow (2, 1) \rightarrow (2, 2)\). Во втором примере можно оставить коридор как есть, так что путь робота — \((1, 1) \rightarrow (1, 2) \rightarrow (2, 2)\). В третьем примере можно очистить клетку \((1, 2)\), так что путь робота — \((1, 1) \rightarrow (2, 1) \rightarrow (2, 3) \rightarrow (2, 4) \rightarrow (1, 4)\). В четвертом примере коридор уже чистый. Может, вы уже запускали робота?
| |
|
|
F. Дизайн клавиатуры
битмаски
дп
Строки
строковые суфф. структуры
Структуры данных
*2600
У Монокарпа есть словарь из \(n\) слов, состоящих из первых \(12\) букв латинского алфавита. Слова пронумерованы от \(1\) до \(n\). Во всех парах соседних букв в слове буквы различны. Каждому слову \(i\) Монокарп сопоставил целое число \(c_i\) — как часто он использует это слово. Монокарп хочет выбрать такой дизайн клавиатуры, чтобы он помог ему проще печатать некоторые слова. Клавиатуру можно описать, как последовательность из \(12\) первых букв латинского алфавита, где каждая буква от a до l встречается ровно один раз. Слово можно легко напечатать на клавиатуре, если для каждой пары соседних символов в слове эти символы на клавиатуре тоже соседние. Оптимальность клавиатуры — это сумма \(c_i\) по всем словам \(i\), которые могут быть легко на ней напечатаны. Помогите Монокарпу создать дизайн клавиатуры с максимальной оптимальностью. Выходные данные Выведите последовательность из \(12\) первых букв латинского алфавита, где каждая буква от a до l встречается ровно один раз, определяющую оптимальную клавиатуру. Если ответов несколько, выведите любой из них.
| |
|
|
G. Кирилл и компания
битмаски
графы
дп
кратчайшие пути
Перебор
поиск в глубину и подобное
Потоки
*2200
Кирилл живёт на связном неориентированном графе из \(n\) вершин и \(m\) рёбер в вершине с номером \(1\). В один прекрасный вечер он собрал у себя \(f\) друзей, \(i\)-й друг живёт в вершине \(h_i\). Таким образом, в настоящий момент все друзья находятся в вершине \(1\), каждый должен добраться домой — \(i\)-й друг должен попасть в вершину \(h_i\). Вечер подошёл к концу и настала пора расходиться. Оказалось, что у \(k\) (\(k \le 6\)) из его друзей нет машин и им придётся идти пешком, если их никто не подвезёт. Один друг с машиной может подвезти любое количество друзей без машин, но только если он может подвезти их, проехав по одному из кратчайших путей до своего дома. Например, в графе ниже, друг из вершины \(h_i=5\) может подвезти друзей из следующих наборов вершин: \([2, 3]\), \([2, 4]\), \([2]\), \([3]\), \([4]\), но не может подвезти друга из вершины \(6\) или набор \([3, 4]\). Вершины в которых живут друзья без машин выделены зелёным, а с машинами — красным. Кирилл хочет, чтобы как можно меньшему числу друзей пришлось идти пешком. Помогите ему найти минимально возможное количество. Входные данные Первая строка входных данных содержит целое число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных в тесте. Первая строка набора содержит два целых числа \(n\) и \(m\) (\(2 \le n \le 10^4\), \(n-1 \le m \le min (10^4, \)\( \frac{n \cdot (n - 1)}{2} \)\()\)) — количество вершин и рёбер соответственно. Следующие \(m\) строк набора содержат описание рёбер, по два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \ne v\)) — номера вершин, соединённых ребром. Гарантируется, что в графе нет петель и кратных рёбер. Дальше следует строка набора, содержащая число \(f\) (\(1 \le f \le 10^4\)) — количество друзей Кирилла. Следующая строка набора содержит \(f\) целых чисел: \(h_1, h_2, \dots, h_f\) (\(2 \le h_i \le n\)) — вершины, в которых они живут. Некоторые вершины могут повторяться. Следующая строка набора содержит число \(k\) (\(1 \le k \le min(6, f)\)) — количество друзей без машин. Последняя строка каждого набора содержит \(k\) целых чисел: \(p_1, p_2, \dots, p_k\) (\(1 \le p_i \le f\), \(p_i < p_{i+1}\)) — номера друзей без машин. Гарантируется, что сумма \(n\) по всем наборам не превосходит \(10^4\), как и суммы \(m\) и \(f\). Выходные данные Выведите \(t\) строк, каждая из которых содержит ответ на соответствующий набор входных данных. В качестве ответа выведите единственное число — минимально возможное количество друзей, которым придётся идти пешком. Примечание Первый набор входных данных первого примера разобран в условии. Во втором наборе входных данных первого примера в вершине \(5\) живут два друга с машинами, один может подвезти друзей из вершин \(2\) и \(3\), а второй из вершины \(4\), не подвезут только друга из вершины \(6\).
| |
|
|
G. Оррэй
битмаски
жадные алгоритмы
математика
Перебор
сортировки
*1500
Вам дан массив \(a\), состоящий из \(n\) неотрицательных целых чисел. Определим массив префиксного ИЛИ \(b\) как массив \(b_i = a_1~\mathsf{OR}~a_2~\mathsf{OR}~\dots~\mathsf{OR}~a_i\), где \(\mathsf{OR}\) представляет собой битовую операцию ИЛИ. Другими словами, массив \(b\) формируется путем вычисления \(\mathsf{OR}\) каждого префикса \(a\). Вас попросили переставить элементы массива \(a\) таким образом, чтобы массив префиксных OR был лексикографически максимальным. Массив \(x\) лексикографически больше массива \(y\), если в первой позиции, где \(x\) и \(y\) отличаются, \(x_i > y_i\). Выходные данные Для каждого набора выведите \(n\) целых чисел — любую перестановку массива \(a\), при которой получается лексикографически максимальный массив префиксных OR.
| |
|
|
G. Антифибоначчиевый разрез
битмаски
дп
Комбинаторика
Конструктив
математика
Структуры данных
хэши
*3000
Обратите внимание на нестандартное ограничение памяти. Введем последовательность строк Фибоначчи следующим образом: \(f_0\) — строка 0, \(f_1\) — строка 1, \(f_i\) строится по формуле \(f_{i-1} + f_{i-2}\) при \(i>1\) (\(+\) обозначает конкатенацию строк). Например, \(f_2\) — 10, \(f_3\) — 101, \(f_4\) — 10110. Для строки \(s\) обозначим за \(g(s)\) количество способов разрезать эту строку на строки, из которых ни одна не является строкой Фибоначчи. Например, если \(s\) — 10110101, \(g(s) = 3\), так как существуют три способа разрезать строку: - 101101 \(+\) 01;
- 1011 \(+\) 0101;
- 1011 \(+\) 01 \(+\) 01.
Вам дана последовательность строк \(s_1, s_2, \dots, s_n\). Посчитайте \(g(s_1), g(s_1 + s_2), \dots, g(s_1 + s_2 + \ldots + s_n)\). Так как эти значения могут быть очень большими, выведите их по модулю \(998244353\). Выходные данные Выведите \(n\) целых чисел, \(i\)-е из которых равно \(g(s_1 + s_2 + \ldots + s_i) \bmod 998244353\).
| |
|
|
D. Очередная задача
Бинарный поиск
битмаски
Конструктив
Структуры данных
*1900
Вам дан массив \(a\) из \(n\) целых чисел \(a_1, a_2, a_3, \ldots, a_n\). Вы должны ответить на \(q\) независимых запросов, каждый из которых состоит из двух целых чисел \(l\) и \(r\). - Рассмотрим подмассив \(a[l:r]\) \(=\) \([a_l, a_{l+1}, \ldots, a_r]\). Вы можете применить следующую операцию к подмассиву любое количество раз (возможно, нулевое).
- Выберите два целых числа \(L\), \(R\) таких, что \(l \le L \le R \le r\) и \(R - L + 1\) является нечетным.
- Замените каждый элемент в подмассиве от \(L\) до \(R\) на XOR элементов в подмассиве \([L, R]\).
- Ответом на запрос является минимальное количество операций, необходимых для того, чтобы все элементы подмассива \(a[l:r]\) стали равны \(0\), или \(-1\), если невозможно сделать их все равными \(0\).
Более подробную информацию об операции XOR можно найти здесь. Выходные данные Для каждого запроса выведите одно целое число — ответ на этот запрос. Примечание В первом запросе, \(l = 3, r = 4\), подмассив = \([3, 3]\). Мы можем применять операцию только к подмассивам длины \(1\), что не изменит массив; следовательно, невозможно сделать все элементы равными \(0\). Во втором запросе, \(l = 4, r = 6\), подмассив = \([3, 1, 2]\). Мы можем выбрать весь подмассив \((L = 4, R = 6)\) и заменить все элементы на их XOR \((3 \oplus 1 \oplus 2) = 0\), получив подмассив \([0, 0, 0]\). В пятом запрос, \(l = 1, r = 6\), подмассив = \([3, 0, 3, 3, 1, 2]\). Мы можем выполнить следующие операции: - Выбираем \(L = 4, R = 6\), делая подмассив \([3, 0, 3, 0, 0, 0]\).
- Выбираем \(L = 1, R = 5\), делая подмассив \([0, 0, 0, 0, 0, 0]\).
| |
|
|
D. ConstructOR
битмаски
китайская теорема об остатках
Комбинаторика
Конструктив
математика
теория чисел
*2100
Вам даны три целых числа \(a\), \(b\), \(d\). Найдите целое число \(x\), удовлетворяющее следующим требованиям, или сообщите, что такого числа не существует: - \(0 \le x \lt 2^{60}\);
- \(a|x\) делится на \(d\);
- \(b|x\) делится на \(d\).
Здесь \(|\) обозначает операцию побитового ИЛИ. Выходные данные Для каждого набора входных данных выведите одно число: - если существует число \(x\), удовлетворяющее требованиям из условия, выведите \(x\);
- иначе, выведите \(-1\).
Если существует несколько решений, выведите любое из них. Примечание В первом наборе входных данных одно из возможных решений \(x=18\). Оно корректно, так как \(39|18=55\) и \(12|18=30\) делятся на \(d=5\). Во втором наборе входных данных одно из возможных решений \(x=14\). Оно корректно, так как \(8|14=6|14=14\) делится на \(d=14\). Можно показать, что в третьем и четвёртом наборах входных данных решений не существует.
| |
|
|
F. XOR-разворот циклического массива
битмаски
Конструктив
*3000
У вас есть массив \(a_0, a_1, \ldots, a_{n-1}\) длины \(n\). Изначально \(a_i = 2^i\) для всех \(0 \le i \lt n\). Обратите внимание, что элементы массива \(a\) нумеруются с нуля. Вы хотите развернуть этот массив (то есть сделать \(a_i\) равным \(2^{n-1-i}\) для всех \(0 \le i \lt n\)). Чтобы сделать это, вы можете сделать следующую операцию не более \(250\,000\) раз: - Выбрать целое число \(i\) (\(0 \le i \lt n\)) и заменить \(a_i\) на \(a_i \oplus a_{(i+1)\bmod n}\).
Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Найдите любую последовательность операций, после выполнения которой массив \(a\) окажется развёрнутым. Можно показать, что при данных ограничениях решение всегда существует. Выходные данные В первой строке выведите одно число \(k\) (\(0 \le k \le 250\,000\)) — количество использованных операций. Во второй строке выведите \(k\) чисел \(i_1,i_2,\ldots,i_k\) (\(0 \le i_j \lt n\)), которые обозначают, что на \(j\)-й операции вы выбрали число \(i_j\). Обратите внимание, что вам не требуется минимизировать количество операций. Примечание В примечании красным выделены элементы, находящиеся в позициях, к которым применяются операции. В первом наборе входных данных массив \(a\) изменится следующим образом: \([1,\color{red}{2}] \rightarrow [\color{red}{1},3] \rightarrow [2,\color{red}{3}] \rightarrow [2,1]\). Во втором наборе входных данных массив \(a\) изменится следующим образом: \([1,\color{red}{2},4] \rightarrow [\color{red}{1},6,4] \rightarrow [7,\color{red}{6},4] \rightarrow [\color{red}{7},2,4] \rightarrow [5,2,\color{red}{4}] \rightarrow [5,\color{red}{2},1] \rightarrow [\color{red}{5},3,1] \rightarrow [6,\color{red}{3},1] \rightarrow [\color{red}{6},2,1] \rightarrow [4,2,1]\).
| |
|
|
G. Любимая задача SlavicG-а
битмаски
графы
поиск в глубину и подобное
*1700
Вам задано взвешенное дерево с \(n\) вершинами. Деревом называется неориентированный связный граф без циклов. Дерево является взвешенным, если каждому его ребру сопоставлено число — его вес. Дерево неориентировано, не содержит корня. Так как деревья слишком скучны, вы решили повеселить себя игрой на дереве. За один ход вы можете переместиться из вершины в любого его соседа (такую вершину, в которую есть ребро из текущей). Вы начинаете игру, имея значение переменной \(x\) равное \(0\). Когда вы перемещаетесь по ребру \(i\), то \(x\) изменяет своё значение на \(x ~\mathsf{XOR}~ w_i\) (где — \(w_i\) вес \(i\)-го ребра). Ваша задача пройти от вершины \(a\) до вершины \(b\), но вы имеете право входить в вершину \(b\) только если \(x\) после этого станет равно \(0\). Другими словами, вы можете пройти по ребру \(i\), которое ведёт в \(b\) тогда и только тогда, когда \(x ~\mathsf{XOR}~ w_i = 0\). Как только вы попадаете \(b\), то игра заканчивается вашей победой. Есть дополнительное правило — не более одного раза за игру вы можете воспользоваться телепортом. Он перемещает вас мгновенно в любую вершину (отличную от \(b\)). Вы можете использовать телепорт из любой вершины (даже из \(a\)). Выведите «YES», если вы можете попасть в \(b\) из \(a\). Выведите «NO» в противном случае. Операция \(\mathsf{XOR}\) обозначает битовое исключающее ИЛИ. Выходные данные Для каждого набора входных данных выведите «YES», если вы можете достичь вершины \(b\), и «NO» в противном случае. Примечание Для первого набора входных данных мы можем перейти от вершины \(1\) в вершину \(3\), при этом \(x\) изменится с \(0\) на \(1\). Затем мы перейдем из \(3\) в \(2\), при этом \(x\) станет равным \(3\). Теперь мы можем телепортироваться в узел \(3\) и переместиться из узла \(3\) в узел \(4\), достигнув узла \(b\), так как в итоге \(x\) стало равно \(0\). Поэтому ответ равен «YES». Во втором наборе входных данных пример у нас нет ходов, так как мы не можем телепортироваться к узлу \(b\), а единственный ход, который у нас есть — это добраться до узла \(2\), что невозможно, поскольку \(x\) не будет равно \(0\). Таким образом, ответ равен «NO».
| |
|
|
A. Абсолютная максимизация
битмаски
жадные алгоритмы
Конструктив
математика
*800
Вам дан массив \(a\) длины \(n\). Вы можете применить следующую операцию несколько (возможно, ноль) раз: - Выбрать \(i\), \(j\), \(b\): Поменять местами \(b\)-й бит в бинарной записи \(a_i\) и \(a_j\).
В бинарной записи биты нумеруются справа (наименее значимый) налево (наиболее значимый). Учтите, что в начале любой бинарной записи имеется бесконечное число начальных нулевых битов. Например, поменять местами \(0\)-й бит для \(4=100_2\) и \(3=11_2\) даст в результате \(101_2=5\) и \(10_2=2\). Поменять местами \(2\)-й бит для \(4=100_2\) и \(3=11_2\) даст в результате \(000_2=0_2=0\) и \(111_2=7\). Найдите максимальное значение \(\max(a) - \min(a)\). Тут \(\max(a)\) означает максимальный элемент \(a\) и \(\min(a)\) означает минимальный элемент \(a\). Бинарная запись \(x\) — это \(x\) записанное в системе счисления с основанием \(2\). Например, \(9\) и \(6\) записанные в системе счисления с основанием \(2\) это \(1001\) и \(110\), соответственно. Выходные данные Для каждого набора входных данных выведите одно целое число — максимальное возможное значение \(\max(a) - \min(a)\). Примечание В первом примере может быть показано, что не надо делать никаких операций — максимальное значение \(\max(a) - \min(a)\) это \(1 - 0 = 1\). Во втором примере ни одна операция не может изменить массив — максимальное значение \(\max(a) - \min(a)\) это \(5 - 5 = 0\). В третьем примере изначально \(a = [1, 2, 3, 4, 5]\), мы можем применить операцию \(i = 2\), \(j = 5\), \(b = 1\). Массив станет равен \(a = [1, 0, 3, 4, 7]\). Может быть показано, что последующие операции не приведут к улучшению ответ. Таким образом, максимальное значение это \(\max(a) - \min(a) = 7 - 0 = 7\).
| |
|
|
A. Access Levels
битмаски
Паросочетания
Потоки
снм
*2400
BerSoft is the biggest IT corporation in Berland, and Monocarp is the head of its security department. This time, he faced the most difficult task ever. Basically, there are \(n\) developers working at BerSoft, numbered from \(1\) to \(n\). There are \(m\) documents shared on the internal network, numbered from \(1\) to \(m\). There is a table of access requirements \(a\) such that \(a_{i,j}\) (the \(j\)-th element of the \(i\)-th row) is \(1\) if the \(i\)-th developer should have access to the \(j\)-th document, and \(0\) if they should have no access to it. In order to restrict the access, Monocarp is going to perform the following actions: - choose the number of access groups \(k \ge 1\);
- assign each document an access group (an integer from \(1\) to \(k\)) and the required access level (an integer from \(1\) to \(10^9\));
- assign each developer \(k\) integer values (from \(1\) to \(10^9\)) — their access levels for each of the access groups.
The developer \(i\) has access to the document \(j\) if their access level for the access group of the document is greater than or equal to the required access level of the document. What's the smallest number of access groups Monocarp can choose so that it's possible to assign access groups and access levels in order to satisfy the table of access requirements? Output The first line should contain a single integer \(k\) — the smallest number of access groups Monocarp can choose so that it's possible to assign access groups and access levels in order to satisfy the table of access requirements. The second line should contain \(m\) integers from \(1\) to \(k\) — the access groups of the documents. The third line should contain \(m\) integers from \(1\) to \(10^9\) — the required access levels of the documents. The \(i\)-th of the next \(n\) lines should contain \(k\) integers from \(1\) to \(10^9\) — the access level of the \(i\)-th developer on each of the access groups. If there are multiple solutions, print any of them. Note In the first example, we assign the documents to different access groups. Both documents have level \(2\) in their access group. This way, we can assign the developers, who need the access, level \(2\), and the developers, who have to have no access, level \(1\). If they had the same access group, it would be impossible to assign access levels to developers \(1\) and \(3\). Developer \(1\) should've had a lower level than developer \(3\) in this group to not be able to access document \(1\). At the same time, developer \(3\) should've had a lower level than developer \(1\) in this group to not be able to access document \(2\). Since they can't both have lower level than each other, it's impossible to have only one access group. In the second example, it's possible to assign all documents to the same access group.
| |
|
|
E. Algebra Flash
meet-in-the-middle
битмаски
графы
Деревья
дп
математика
Перебор
*2500
Выпущена новая версия: Algebra Flash 2.2Список изменений: Благодарим вас за непрерывную поддержку игры! И это все? С небольшим разочарованием вы запускаете игру и нажимаете на новый режим. Написано «Цветные платформы». В ряд расположены \(n\) платформ, пронумерованных от \(1\) до \(n\). В игре доступны \(m\) цветов, пронумерованных от \(1\) до \(m\). \(i\)-я платформа раскрашена в цвет \(c_i\). Вы начинаете на платформе \(1\) и хотите добраться до платформы \(n\). За один ход вы можете прыгнуть с некоторой платформы \(i\) на платформы \(i + 1\) или \(i + 2\). Все платформы изначально деактивированы (включая платформы \(1\) и \(n\)). Для каждого цвета \(j\) можно заплатить \(x_j\) монет, чтобы активировать все платформы этого цвета. Вы хотите включить некоторые платформы так, чтобы можно было начать на активированной платформе \(1\), попрыгать по некотором активированным платформам и достичь платформы \(n\). Какое наименьшее количество монет потребуется для достижения этого? Выходные данные Выведите наименьшее количество монет, которое потребуется того, чтобы можно было начать на активированной платформе \(1\), попрыгать по некотором активированным платформам и достичь платформы \(n\).
| |
|
|
F. Кохиа и последовательность
битмаски
дп
Комбинаторика
математика
теория чисел
*3100
У Мари есть три целых числа \(n\), \(x\) и \(y\). Назовем массив \(a\) из \(n\) неотрицательных целых чисел хорошим, если он удовлетворяет следующим ограничениям: - \(a_1+a_2+\ldots+a_n=x\), и
- \(a_1 \, | \, a_2 \, | \, \ldots \, | \, a_n=y\), где \(|\) обозначает операцию побитового ИЛИ.
Значением хорошего массива называется значение \(a_1 \oplus a_2 \oplus \ldots \oplus a_n\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Косия хочет, чтобы вы нашли побитовое исключающее ИЛИ значений всех хороших массивов. Если хороших массивов не существует, выведите \(0\). Выходные данные Выведите одно целое число — побитовое исключающее ИЛИ значений всех хороших массивов. Примечание В первом примере есть \(12\) хороших массивов, они перечислены ниже. - \([0,2,3]\), \([0,3,2]\), \([2,0,3]\), \([2,3,0]\), \([3,0,2]\) и \([3,2,0]\): значение равно \(0 \oplus 2 \oplus 3 = 1\);
- \([1, 2, 2]\), \([2, 1, 2]\) and \([2, 2, 1]\): значение равно \(1 \oplus 2 \oplus 2 = 1\);
- \([1, 1, 3]\), \([1, 3, 1]\) and \([3, 1, 1]\): значение равно \(1 \oplus 1 \oplus 3 = 3\).
Поэтому побитовое исключющее ИЛИ значений всех хороших массивов равно \(\underbrace{1 \oplus \ldots \oplus 1}_{9\text{ раз}} \oplus 3 \oplus 3 \oplus 3 = 2\). Во втором примере нет хороших массивов. Ответ должен быть \(0\).
| |
|
|
F. Хоссам и минимум на отрезке
Бинарный поиск
битмаски
Деревья
Строки
Структуры данных
Теория вероятностей
хэши
*2500
Хоссам дал вам последовательность целых чисел \(a_1, \, a_2, \, \dots, \, a_n\) длины \(n\). Кроме того, он последовательно дает вам \(q\) запросов вида \((l, \, r)\). Для каждого запроса он хочет знать среди чисел \(a_l, \, a_{l + 1}, \, \dots, \, a_r\) такое минимальное число, что оно встречается в заданном отрезке последовательности нечетное количество раз. Вы должны посчитать ответ на каждый запрос, прежде чем отвечать на следующий. Выходные данные Для каждого запроса выведите минимальное число, которое встречается на заданном отрезке последовательности нечетное количество раз. Если такого числа не существует, выведите \(0\). Примечание В данном примере \(\)l_1 = 1, \, r_1 = 2,\(\) \(\)l_2 = 1, \, r_2 = 3,\(\) \(\)l_3 = 2, \, r_3 = 4,\(\) \(\)l_4 = 1, \, r_4 = 4,\(\) \(\)l_5 = 2, \, r_5 = 2,\(\) \(\)l_6 = 1, \, r_6 = 5.\(\)
| |
|
|
B. Садовник и массив
битмаски
Конструктив
*1300
У садовника Казимира Казимировича есть массив из \(n\) целых чисел \(c_1, c_2, \dots, c_n\). Он хочет проверить, найдется ли две различных подпоследовательности \(a\) и \(b\) исходного массива, для которых \(f(a) = f(b)\), где \(f(x)\) обозначает побитовое ИЛИ всех чисел в последовательности \(x\). Последовательность \(q\) является подпоследовательностью \(p\), если \(q\) может быть получена из \(p\) удалением нескольких (возможно, ни одного или всех) элементов. Две подпоследовательности считаются различными, если множества индексов входящих в них чисел различны, то есть значения элементов не учитываются при сравнении подпоследовательностей. Выходные данные Для каждого набора входных данных выведите «Yes», если найдется описанные две различных подпоследовательности, для которых \(f(a) = f(b)\), и «No» в противном случае. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание Можно показать, что в первом наборе входных данных двух различных подпоследовательностей \(a\) и \(b\), для которых \(f(a) = f(b)\), не существует. Во втором наборе входных данных можно взять такие подпоследовательности: подпоследовательность \(a\), сформированная элементом на позиции \(1\), и подпоследовательность \(b\), сформированная элементами на позициях \(1\) и \(2\). В третьем наборе входных данных можно взять такие подпоследовательности: подпоследовательность \(a\), сформированная элементами на позициях \(1\), \(2\), \(3\) и \(4\), и подпоследовательность \(b\), сформированная элементами на позициях \(2\), \(3\) и \(4\).
| |
|
|
C. Интересный ряд
битмаски
математика
*1600
Петя и его друг, робот Petya++, любят решать увлекательные математические задачи. Однажды Petya++ придумал числа \(n\) и \(x\) и написал на доске \(\)n\ \&\ (n+1)\ \&\ \dots\ \&\ m = x,\(\) где \(\&\) обозначает операцию побитового И. Затем он предложил своему другу Пете найти такое минимальное \(m\) (\(m \ge n\)), что равенство на доске выполняется. К сожалению, Петя не смог решить эту задачу в уме и решил прибегнуть к помощи компьютера. Он довольно быстро написал программу и нашел ответ. А справитесь ли вы с этой непростой задачей? Выходные данные Для каждого набора входных данных выведите одно целое число \(m\) — минимальное число такое, что равенство на доске будет выполняться. Если равенство не выполнится ни при каком \(m\), то выведите вместо этого \(-1\). Можно показать, что если требуемое \(m\) существует, то оно не превосходит \(5 \cdot 10^{18}\). Примечание В первом примере \(10\ \&\ 11 = 10\), но \(10\ \&\ 11\ \&\ 12 = 8\), поэтому ответ равен \(12\). Во втором примере \(10 = 10\), поэтому ответ равен \(10\). В третьем примере можно убедиться, что требуемого \(m\) не существует, поэтому необходимо вывести \(-1\).
| |
|
|
D. Цена дерева
битмаски
Деревья
дп
Комбинаторика
математика
поиск в глубину и подобное
Теория вероятностей
*1900
Дано дерево на \(n\) вершинах, корень дерева — вершина \(1\). В каждой вершине написано значение, изначально (в момент \(t=0\)) равное \(0\) или \(1\). В каждый целочисленный момент времени \(t>0\) значение вершины становится равно побитовому исключающему ИЛИ значений ее детей в момент времени \(t - 1\); значения листьев становятся равными \(0\), поскольку у них детей нет. Через \(S(t)\) обозначим сумму значений всех вершин в момент \(t\). Через \(F(A)\) обозначим сумму \(S(t)\) по всем значениям \(t\) в диапазоне \(0 \le t \le 10^{100}\), где \(A\) — некоторая изначальная расстановка \(0\) и \(1\) в дереве. Ваша задача — найти сумму \(F(A)\) по всем \(2^n\) изначальным расстановкам \(0\) и \(1\) в дереве. Выведите ответ по модулю \(10^9+7\). Выходные данные Для каждого набора входных данных выведите сумму по модулю \(10^9+7\). Примечание Найдём \(F(A)\) для расстановки \(A = [0,1,0,0,1,1]\) (\(A[i]\) означает значение вершины \(i\)). Состояние дерева в момент времени \(t = 0\) изображено ниже. В каждой вершине записаны два числа: ее номер, затем ее значение. \(S(0)\) в такой конфигурации равно \(3\). В момент \(t = 1\) конфигурация меняется на \([1,0,0,0,0,0]\). Дерево будет выглядеть так, как показано на рисунке ниже. Имеем \(S(1) = 1\). В момент \(t = 2\) конфигурация меняется на \([0,0,0,0,0,0]\). Дерево будет выглядеть так, как показано на рисунке ниже. Имеем \(S(2) = 0\). Для всех \(t>2\) граф остаётся неизменным, то есть \(S(t)=0\) для всех \(t > 2\). Поэтому изначальная расстановка \(A = [0,1,0,0,1,1]\) имеет значение \(F(A) = 3 + 1 = 4\). Выполнив аналогичный процесс для всех \(2^{6}\) возможных стартовых расстановок, получим ответ \(\textbf{288}\).
| |
|
|
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]\) обеспечивает наибольшее значение немоты.
| |
|
|
C. Гибкая строка
битмаски
Перебор
Строки
*1600
У вас есть строка \(a\) и строка \(b\). Обе строки имеют длину \(n\). В строке \(a\) содержится не более \(10\) различных символов. У вас также есть множество \(Q\). Изначально множество \(Q\) пусто. Вы можете применить следующую операцию к строке \(a\) любое количество раз: - Выберите индекс \(i\) (\(1\leq i \leq n\)) и строчный латинскую букву \(c\). Добавьте \(a_i\) в множество \(Q\) и замените \(a_i\) на \(c\).
Например, пусть строка \(a\) — это «\(\tt{abecca}\)». Мы можем выполнить следующие операции: - В первой операции, если выбрать \(i = 3\) и \(c = \tt{x}\), символ \(a_3 = \tt{e}\) будет добавлен к множеству \(Q\). Таким образом, множество \(Q\) будет равняться \(\{\tt{e}\}\), а строка \(a\) станет «\(\tt{ab\underline{x}cca}\)».
- Во второй операции, если выбрать \(i = 6\) и \(c = \tt{s}\), то символ \(a_6 = \tt{a}\) будет добавлен к множеству \(Q\). Таким образом, множество \(Q\) будет равняться \(\{\tt{e}, \tt{a}\}\), а строка \(a\) будет «\(\tt{abxcc\underline{s}}\)».
Со строкой \(a\) можно выполнить любое количество операций, но в конце множество \(Q\) должно содержать не более \(k\) различных символов. Учитывая это ограничение, вам нужно максимизировать количество пар целых чисел \((l, r)\) (\(1\leq l\leq r \leq n\)) таких, что \(a[l,r] = b[l,r]\). Здесь \(s[l,r]\) означает подстроку строки \(s\), начинающуюся с индекса \(l\) (включительно) и заканчивающуюся индексом \(r\) (включительно). Выходные данные Для каждого набора входных данных выведите в строке одно целое число — максимальное количество пар \((l, r)\), удовлетворяющих ограничениям. Примечание В первом наборе входных данных мы можем выбрать индекс \(i = 3\) и заменить его символом \(c = \tt{d}\). Все возможные пары \((l,r)\) будут удовлетворять условию. Во втором наборе мы не можем выполнить ни одну операцию. \(3\) удовлетворяющие условию пары \((l,r)\): - \(a[1,1] = b[1,1] =\) «\(\tt{a}\)»,
- \(a[1,2] = b[1,2] =\) «\(\tt{ab}\)»,
- \(a[2,2] = b[2,2] =\) «\(\tt{b}\)».
В третьем наборе мы можем выбрать индекс \(2\) и индекс \(3\) и заменить их символами \(\tt{c}\) и \(\tt{d}\) соответственно. Множество \(Q\) в конце будет равняться \(\{\tt{b}\}\) (размер равен \(1\), не превышает \(k\)). Все возможные пары \((l,r)\) будут подходить под условие.
| |
|
|
E. Дерево упало!
битмаски
Деревья
математика
поиск в глубину и подобное
*2500
Недавно на голову Боба с неба упало дерево. В дереве \(n\) вершин. В каждой вершине \(u\) дерева записано целое число \(a_u\). В дереве нет фиксированного корня, так как оно упало с неба. В настоящее время Боб изучает дерево. Чтобы внести некоторую изюминку, Алиса предлагает игру. Сначала Боб выбирает некоторую вершину \(r\) корнем дерева. После этого Алиса выберет вершину \(v\) и сообщит ее Бобу. Затем Боб выберет одну или несколько вершин из поддерева вершины \(v\). Его результат будет равен побитовому исключающему ИЛИ всех значений, записанных в выбранных им вершинах. Боб должен сказать, какой максимальный результат он может получить для заданных \(r\) и \(v\). Поскольку Боб не умеет решать задачи, он просит вас помочь ему найти ответ. Сможете ли вы ему помочь? Вам нужно найти ответ для нескольких комбинаций \(r\) и \(v\) для одного дерева. Напомним, что дерево — это связный неориентированный граф без циклов. Поддерево вершины \(u\) — это множество всех вершин \(y\) таких, что простой путь от \(y\) до корня проходит через \(u\). Обратите внимание, что вершина \(u\) входит в поддерево вершины \(u\). Выходные данные Для каждого набора входных данных для каждого запроса выведите строку, содержащую целое число, обозначающее максимальный результат, который может получить Боб. Примечание На каждом из приведенных ниже рисунков вершина, окрашенная в зеленый цвет — это вершина, выбранная Бобом, а вершина, окрашенный в красный цвет — это вершина, выбранная Алисой. Значения вершин помещены в синие ячейки рядом с вершинами. Рассмотрим первый пример. В первом запросе, если мы примем вершину \(4\) за корень, дерево будет выглядеть так, как показано на рисунке ниже: Дерево с корнем \(4\) в первом запросе. Вершинами в поддереве \(2\) являются: \([2,1,5,6,3]\). Среди них Боб может выбрать вершину \(3\), \(5\) и \(6\). Его результат будет следующим: \(a_3 \oplus a_5 \oplus a_6 = 8 \oplus 6 \oplus 1 = 15\). Он не может набрать больше этого значения. Во втором запросе, если сделать корнем \(3\), то дерево будет выглядеть так: Дерево с корнем \(3\) во втором запросе. Единственной вершиной в поддереве \(5\) является \(5\). Боб может выбрать только вершину \(5\). Его результатом будет \(a_5 = 6\). В третьем запросе, если корень — \(1\), то дерево выглядит следующим образом: Дерево с корнем \(1\) в третьем запросе. Вершинами в поддереве \(2\) являются: \([2,3,6,4]\). Среди них Боб может выбрать вершину \(2\), \(3\) и \(4\). Его результат будет следующим: \(a_2 \oplus a_3 \oplus a_4 = 12 \oplus 8 \oplus 25 = 29\). Он не может набрать больше этой суммы.
| |
|
|
F. Ксолдовские камни
битмаски
Деревья
дп
Конструктив
*2500
Миша был забанен в шахматах за использование компьютера. Он отправился на пенсию и решил стать ксолдуном. Однажды, гуляя в парке, Миша наткнулся на корневое дерево с вершинами, пронумерованными от \(1\) до \(n\). Корнем дерева является вершина с номером \(1\). Для всех \(1\le i\le n\) в вершине \(i\) лежат \(a_i\) камней. Миша недавно выучил новое заклинание на уроке ксолдовства и хочет его опробовать. Заклинание состоит из нескольких шагов: - Выбрать некоторую вершину \(i\) (\(1 \leq i \leq n\)).
- Вычислить побитовое исключающее ИЛИ \(x\) всех \(a_j\) таких, что вершина \(j\) лежит в поддереве вершины \(i\) (\(i\) принадлежит своему поддереву).
- В значения \(a_j\) для всех вершин \(j\) в поддереве \(i\) присвоить \(x\).
Миша может выполнить не более \(2n\) заклинаний и хочет, чтобы в дереве не осталось камней. Более формально, он хочет, чтобы выполнялось \(a_i=0\) для всех \(1\leq i \leq n\). Можете помочь ему выполнить заклинания? Деревом из \(n\) вершин называется связный ациклический граф из \(n-1\) ребра. Поддеревом вершины \(i\) является множество всех вершин \(j\) таких, что \(i\) лежит на простом пути от \(1\) (корня) к \(j\). В этой задаче \(i\) принадлежит собственному поддереву. Выходные данные Если нет подходящей последовательности заклинаний, выведите \(-1\). Иначе в первой строке выведите одно целое число \(q\) (\(0 \leq q \leq 2n\)) — количество заклинаний в вашем решении. Во второй строке выведите последовательность целых чисел \(v_1,v_2,\ldots,v_q\) (\(1 \leq v_i \leq n\)): \(i\)-е заклинание будет выполнено к поддереву вершины \(v_i\). Обратите внимание, что здесь важен порядок. Если существует несколько решений, выведите любое из них. Вам не нужно минимизировать число операций. Примечание Рисунок ниже объясняет третий пример. Показаны только первые \(4\) заклинания, так как последние \(2\) ничего не меняют. Первый рисунок показывает начальное дерево, число камней в каждой вершине написано над вершиной зеленым. Изменения от заклинаний показаны красным.
| |
|
|
D. Битовая угадайка
Бинарный поиск
битмаски
интерактив
Конструктив
*1800
Это интерактивная задача. Кира загадал некое положительное целое число \(n\), а Хаято требуется его угадать. Изначально Кира дает Хаято значение \(\mathrm{cnt}\) — количество единичных битов в двоичной записи \(n\). Для того чтобы угадать \(n\), Хаято может делать лишь операции одного типа: выбрать некоторое целое число \(x\) и вычесть его из \(n\). Обратите внимание, что после каждой операции число \(n\) изменяется. Кира не любит плохих запросов, поэтому если Хаято попробует вычесть число \(x\) большее, чем \(n\), то он проиграет Кире. После каждой операции Кира сообщает обновленное значение \(\mathrm{cnt}\) — количество единичных битов в двоичной записи обновленного значения \(n\). У Киры не так много терпения, поэтому Хаято должен угадать изначальное значение числа \(n\) за не более чем \(30\) запросов. Так как Хаято учится в начальной школе, он просит вашей помощи — напишите программу, которая угадывает число \(n\). Кира — честный человек, поэтому он зафиксирует значение \(n\) изначально и не станет как-то менять начальное число в зависимости от запросов Хаято. Протокол взаимодействия Для угадывания \(n\) вы можете не более \(30\) раз произвести описанную операцию. Для этого выведите строку в формете «- x» (\(1 \le x \le 10^9\)). После этой операции из \(n\) вычитается число \(x\), и поэтому значение \(n\) изменяется. Если число \(x\) оказалось больше, чем текущее число \(n\), то такой запрос считается некорректным. После каждой операции считайте одно неотрицательное целое число \(\mathrm{cnt}\) — количество единичных битов в двоичной записи текущего \(n\) после совершения операции. Когда вы узнаете число \(n\), выведите одну строку следующего формата: «! n» (\(1 \le n \le 10^9\)). После этого переходите к решению следующего набора входных данных или завершите программу, если таких нет. Если ваша программа сделает более \(30\) операций для одного набора входных данных, вычтет число \(x\) большее, чем \(n\), или сделает некорректный запрос, то ответом на запрос будет -1, после получения такого ответа ваша программа должна немедленно завершится, чтобы получить вердикт Неправильный ответ. Иначе она может получить любой другой вердикт. После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Взломы Чтобы сделать взлом, используйте следующий формат. Первая строка должна содержать одно целое число \(t\) (\(1 \leq t \leq 500\)). Каждый набор входных данных должен содержать одно целое число \(n\) (\(1 \leq n \leq 10^9\)) на отдельной строке. Примечание К примеру, количество единичных битов в числе \(6\) это \(2\), потому что двоичное представление \(6\) это \(110\). Для \(13\) количество единичных битов \(3\), так как \(13_{10} = 1101_2\). В первом примере \(n = 1\), поэтому на вход дается число \(1\). После вычитания из \(n\) единицы оно становится нулевым, поэтому и количество единичных битов у него \(0\). В третьем примере \(n = 3\), которое в двоичном представлении выглядит как \(3_{10} = 11_2\), следовательно на вход даётся количество единиц, то есть \(2\). После вычитания числа \(2\) мы имеем \(n = 1\), поэтому количество единичных битов теперь \(1\). После вычитания из \(n\) единицы оно становится равно нулю.
| |
|
|
F. Три стула
битмаски
дп
Комбинаторика
Перебор
сортировки
Структуры данных
теория чисел
*2300
Как-то раз Кира нашел \(n\) друзей из Морио и решил собрать их за одним столом, чтобы провести мирный разговор. Рост друга \(i\) равен \(a_i\). Так получилось, что рост каждого из друзей уникален. Но вот незадача, в доме Киры всего \(3\) стула, и всех друзей усадить явно не удастся! Поэтому Кира должен позвать только \(3\) друзей. Но все не так просто! Если рост самого низкого и самого высокого из приглашенных друзей не взаимно просты, то друзья будут подшучивать друг над другом, что сильно разозлит Киру. Кира заинтересовался, сколько есть способов позвать \(3\) друзей так, чтобы они не стали подшучивать друг над другом? Два способа считаются различными, если существует такой друг, что он приглашен в одном случае, и не приглашен в другом. Формально, если Кира позовет друзей с номерами \(i\), \(j\) и \(k\), то должно выполняться \(\gcd(\min(a_i, a_j, a_k), \max(a_i, a_j, a_k)) = 1\), где \(\gcd(x, y)\) обозначает наибольший общий делитель (НОД) чисел \(x\) и \(y\). Кира не очень силен в информатике, поэтому просит вас посчитать количество различных способов позвать друзей. Выходные данные В единственной строке выведите количество способов позвать друзей. Примечание В первом примере подходит одна способ — позвать друзей \(1\), \(2\) и \(3\). Здесь \(1 < 2 < 3\), и числа \(1\) и \(3\) взаимно просты.
| |
|
|
E. Распределение XOR
битмаски
жадные алгоритмы
Конструктив
математика
*2100
Вам дан массив из ровно \(n\) чисел \([1,2,3,\ldots,n]\), а также целые числа \(k\) и \(x\). Вам нужно разбить массив на ровно \(k\) непустых непересекающихся подпоследовательностей так, чтобы побитовое исключающее ИЛИ всех чисел в каждой подпоследовательности было равно \(x\), и каждое число находилось ровно в одной подпоследовательности. Обратите внимание, что нет никаких ограничений на длину каждой подпоследовательности. Последовательность \(a\) является подпоследовательностью \(b\), если \(a\) может быть получена из \(b\) удалением нескольких (возможно, ни одного или всех) элементов. Например, для \(n = 15\), \(k = 6\), \(x = 7\) корректно следующее разбиение: - \([6,10,11]\), \(6 \oplus 10 \oplus 11 = 7\),
- \([5,12,14]\), \(5 \oplus 12 \oplus 14 = 7\),
- \([3,9,13]\), \(3 \oplus 9 \oplus 13 = 7\),
- \([1,2,4]\), \(1 \oplus 2 \oplus 4 = 7\),
- \([8,15]\), \(8 \oplus 15 = 7\),
- \([7]\), \(7 = 7\),
где \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Следующее разбиение некорректно, так как не используются числа \(8\) и \(15\): - \([6,10,11]\), \(6 \oplus 10 \oplus 11 = 7\),
- \([5,12,14]\), \(5 \oplus 12 \oplus 14 = 7\),
- \([3,9,13]\), \(3 \oplus 9 \oplus 13 = 7\),
- \([1,2,4]\), \(1 \oplus 2 \oplus 4 = 7\),
- \([7]\), \(7 = 7\).
Следующее разбиение некорректно, так как \(3\) встречается дважды, а \(1\), \(2\) не используются: - \([6,10,11]\), \(6 \oplus 10 \oplus 11 = 7\),
- \([5,12,14]\), \(5 \oplus 12 \oplus 14 = 7\),
- \([3,9,13]\), \(3 \oplus 9 \oplus 13 = 7\),
- \([3,4]\), \(3 \oplus 4 = 7\),
- \([8,15]\), \(8 \oplus 15 = 7\),
- \([7]\), \(7 = 7\).
Выходные данные Для каждого набора входных данных, если ответ существует, выведите «YES» в первой строке. В \(i\)-й из следующих \(k\) строк сначала выведите целое число \(s_i\) — длину \(i\)-й подпоследовательности, затем выведите \(s_i\) целых чисел — саму \(i\)-ю подпоследовательность. Если ответов несколько, выведите любой. Обратите внимание, что вы можете вывести элементы подпоследовательности в любом порядке. В противном случае выведите «NO». Примечание В первом наборе входных данных мы строим следующие \(6\) подпоследовательностей: - \([6,10,11]\), \(6 \oplus 10 \oplus 11 = 7\),
- \([5,12,14]\), \(5 \oplus 12 \oplus 14 = 7\),
- \([3,9,13]\), \(3 \oplus 9 \oplus 13 = 7\),
- \([1,2,4]\), \(1 \oplus 2 \oplus 4 = 7\),
- \([8,15]\), \(8 \oplus 15 = 7\),
- \([7]\), \(7 = 7\).
Во втором наборе входных данных мы строим следующие \(4\) подпоследовательности: - \([1,4]\), \(1 \oplus 4 = 5\),
- \([2,7]\), \(2 \oplus 7 = 5\),
- \([3,6]\), \(3 \oplus 6 = 5\),
- \([5,8,9,10,11]\), \(5 \oplus 8 \oplus 9 \oplus 10 \oplus 11 = 5\).
Следующей разбиение также будет считаться правильным в этом наборе входных данных: - \([1,4]\), \(1 \oplus 4 = 5\),
- \([2,7]\), \(2 \oplus 7 = 5\),
- \([5]\), \(5 = 5\),
- \([3,6,8,9,10,11]\), \(3 \oplus 6 \oplus 8 \oplus 9 \oplus 10 \oplus 11 = 5\).
| |
|
|
F. XOR, деревья и запросы
битмаски
графы
Деревья
жадные алгоритмы
Конструктив
поиск в глубину и подобное
реализация
снм
*2500
Вам дано дерево с \(n\) вершинами. Вершины пронумерованы от \(1\) до \(n\). Вам нужно будет назначить каждому ребру вес. Пусть вес \(i\)-го ребра будет \(a_i\) (\(1 \leq i \leq n-1\)). Вес каждого ребра должен быть целым числом от \(0\) до \(2^{30}-1\), включительно. Вам дано \(q\) условий. Каждое условие состоит из трех целых чисел \(u\), \(v\) и \(x\). Это означает, что побитовое исключающее ИЛИ всех ребер на кратчайшем пути от \(u\) до \(v\) должно быть равно \(x\). Выясните, существуют ли числа \(a_1, a_2, \ldots, a_{n-1}\), удовлетворяющие заданным условиям. Если существуют, выведите такое решение, при котором \(a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1}\) будет наименьшим. Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Если существует несколько решений таких, что \(a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1}\) является наименьшим, выведите любое из них. Выходные данные Если не существует \(a_1\), \(a_2\), ..., \(a_{n-1}\), которые удовлетворяют заданным условиям, выведите «No». В противном случае в первой строке выведите «Yes». Затем в следующей строке выведите \(n-1\) целых чисел, где \(i\)-е целое число — это вес \(i\)-го ребра. Если существует несколько решений, то выведите такое решение, при котором \(a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1}\) будет наименьшим. Если существует несколько решений, при которых \(a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1}\) принимает наименьшее значение, выведите любое. При выводе «Yes» или «No» вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание Для первого примера не существует набора весов ребер, удовлетворяющего заданному условию. Для второго примера два условия означают, что \(a_1 \oplus a_2 \oplus a_3=2\) и \(a_4 \oplus a_5=7\). Может существовать несколько решений, например, \((a_1, a_2, a_3, a_4, a_5)=(1, 2, 1, 4, 3)\). Для третьего примера два условия означают, что \(a_1 \oplus a_2 \oplus a_3=3\) и \(a_1 \oplus a_4 \oplus a_5=5\). Существует множество решений, удовлетворяющих данному условию. \((a_1, a_2, a_3, a_4, a_5)=(1, 1, 3, 4, 0)\) удовлетворяет заданным условиям, но побитовое исключающее ИЛИ весов всех ребер равно \(7\), что не является наименьшим возможным значением \(a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1}\), поэтому это не является верным решением.
| |
|
|
D. Serval и сдвиг-сдвиг-сдвиг
битмаски
Конструктив
Перебор
реализация
*2200
У Serval есть два \(n\)-битных двоичных числа \(a\) и \(b\). Он хочет поделиться этими числами с Toxel. Так как Toxel больше нравится число \(b\), Serval решил изменить \(a\) на \(b\) с помощью нескольких (возможно, нуля) операций. За одну операцию Serval может выбрать любое положительное целое число \(k\) от \(1\) до \(n\), и заменить \(a\) на одно из следующих чисел: - \(a\oplus(a\ll k)\)
- \(a\oplus(a\gg k)\)
Другими словами, операция сдвигает каждый бит числа \(a\) налево или направо на \(k\) позиций, при этом переполненные биты удаляются, а недостающие биты дополняются \(0\). Побитовое исключающее ИЛИ результата сдвига и изначального \(a\) присваиваются обратно \(a\). У Serval нет много времени. Он хочет применить не более \(n\) операций, чтобы изменить \(a\) на \(b\). Пожалуйста, помогите ему найти последовательность операций, или определите, что невозможно изменить \(a\) на \(b\) за не более \(n\) операций. Вам не нужно минимизировать количество операций. В этой задаче \(x\oplus y\) обозначает побитовое исключающее ИЛИ чисел \(x\) и \(y\). \(a\ll k\) и \(a\gg k\) обозначают логический сдвиг влево и логический сдвиг вправо. Выходные данные Для каждого набора входных данных, если невозможно изменить \(a\) на \(b\) за не более \(n\) операций, выведите одно число \(-1\). Иначе, в первой строке выведите количество операций \(m\) (\(0\le m\le n\)). Если \(m>0\), во второй строке выведите \(m\) целых чисел \(k_{1},k_{2},\dots,k_{m}\) обозначающих операции. Если \(1\le k_{i}\le n\), это обозначает логический сдвиг влево \(a\) на \(k_{i}\) позиций. Если \(-n\le k_{i}\le-1\), это обозначает логический сдвиг вправо \(a\) на \(-k_{i}\) позиций. Если существует несколько решений, выведите любое из них. Примечание В первом наборе входных данных: Первая операция изменяет \(a\) на \(\require{cancel}00111\oplus\cancel{001}11\underline{000}=11111\). Вторая операция изменяет \(a\) на \(\require{cancel}11111\oplus\underline{00}111\cancel{11}=11000\). Биты с зачеркиванием — это биты с переполнением, которые удаляются. Биты с подчеркиванием являются дополненными битами. Во втором наборе входных данных \(a\) уже равно \(b\), поэтому никаких операций делать не нужно. В третьем наборе входных данных можно показать, что \(a\) невозможно изменить на \(b\).
| |
|
|
F. Serval и Brain Power
битмаски
дп
жадные алгоритмы
Перебор
реализация
Строки
*2700
Serval любит Brain Power и свою интеллектуальную задачу. Serval называет строку \(T\) мощной тогда и только тогда, когда \(T\) можно получить конкатенацией некоторой строки \(T'\) несколько раз. Формально говоря, \(T\) является мощной тогда и только тогда, когда существует строка \(T'\) и целое число \(k\geq 2\) такие, что \(\)T=\underbrace{T'+T'+\dots+T'}_{k\text{ раз}}\(\) Например, gogogo является мощной, потому что её можно получить конкатенацией go три раза, но power не является мощной. У Serval есть строка \(S\), состоящая из строчных латинских букв. Ему любопытно узнать о самой длинной мощной подпоследовательности \(S\), и ему достаточно, чтобы вы узнали её длину. Если все непустые подпоследовательности \(S\) не являются мощными, ответ считается равным \(0\). Строка \(a\) является подпоследовательностью строки \(b\), если \(a\) может быть получена из \(b\) удалением нескольких (возможно, ни одного или всех) символов. Выходные данные Выведите единственное целое число — длину самой длинной мощной подпоследовательности \(S\). Если все непустые подпоследовательности \(S\) не являются мощными, выведите \(0\). Примечание В первом примере все непустые подпоследовательности buaa перечислены ниже: - b
- u
- a (встречается дважды, buaa и buaa)
- bu
- ba (встречается дважды, buaa и buaa)
- ua (встречается дважды, buaa и buaa)
- aa
- bua (встречается дважды, buaa и buaa )
- baa
- uaa
- buaa
Так как aa \(=\) a \(+\) a, aa является мощной подпоследовательностью. Можно доказать, что aa является единственной мощной подпоследовательностью среди них. Поэтому ответ равен \(2\). Во втором примере самой длинной мощной подпоследовательностью является codcod из codeforcesround. Поэтому ответ равен \(6\).
| |
|
|
E. Влад и пара чисел
битмаски
Конструктив
*1400
Влад нашёл два положительных целых числа \(a\) и \(b\) (\(a,b>0\)). Он обнаружил, что \(a \oplus b = \frac{a + b}{2}\), где \(\oplus\) означает операцию побитового исключающего ИЛИ, а деление происходит без округления. Так как запомнить одно число проще, чем два, Влад запомнил только \(a\oplus b\), обозначим это число как \(x\). Помогите ему найти любые подходящие \(a\) и \(b\) или скажите, что такие не существуют. Выходные данные Выведите \(t\) строк, каждая из которых является ответом на соответствующий набор входных данных. В качестве ответа выведите \(a\) и \(b\) (\(0 < a,b \le 2^{32}\)), такие что \(x = a \oplus b = \frac{a + b}{2}\). Если вариантов несколько, выведите любой из них. Если подходящих пар не существует, выведите -1.
| |
|
|
D. Перестановки с неподвижным префиксом
Бинарный поиск
битмаски
математика
сортировки
Структуры данных
хэши
*1700
Заданы \(n\) перестановок \(a_1, a_2, \dots, a_n\), каждая длины \(m\). Напомним, что перестановка длины \(m\) — это последовательность из \(m\) различных целых чисел от \(1\) до \(m\). Назовем красотой перестановки \(p_1, p_2, \dots, p_m\) наибольшее такое \(k\), что \(p_1 = 1, p_2 = 2, \dots, p_k = k\). Если \(p_1 \neq 1\), то красота равна \(0\). Произведение двух перестановок \(p \cdot q\) — это такая перестановка \(r\), что \(r_j = q_{p_j}\). Для каждого \(i\) от \(1\) до \(n\) выведите наибольшую красоту перестановки \(a_i \cdot a_j\) по всем \(j\) от \(1\) до \(n\) (возможно, \(i = j\)). Выходные данные На каждый набор входных данных выведите \(n\) целых чисел. \(i\)-е значение должно быть равно наибольшей красоте перестановки \(a_i \cdot a_j\) по всем \(j\) (\(1 \le j \le n\)).
| |
|
|
G. Последовательные удаления
битмаски
графы
поиск в глубину и подобное
*2700
Задан простой неориентированный граф, состоящий из \(n\) вершин и \(m\) ребер. Вершины пронумерованы от \(1\) до \(n\). На \(i\)-й вершине написано значение \(a_i\). Вы будете удалять вершины из этого графа. Вершину \(i\) разрешается удалить только если ее степень равна \(a_i\). Когда вершина удаляется, все инцидентные ребра также удаляются, соответственно, уменьшая степени соседних неудаленных вершин. Корректная последовательность удалений — это такая перестановка \(p_1, p_2, \dots, p_n\) \((1 \le p_i \le n)\), что вершина \(p_i\) удаляется \(i\)-й по очереди, и каждое удаление разрешено. Пара вершин \((x, y)\) называется красивой, если существуют две корректные последовательности удалений таких, что в одной \(x\) удаляется раньше \(y\), а в другой \(y\) удаляется раньше \(x\). Посчитайте количество красивых пар \((x, y)\) таких, что \(x < y\). Выходные данные На каждый набор входных данных выведите одно целое число — количество красивых пар вершин.
| |
|
|
H. Обрезание дерева
битмаски
дп
поиск в глубину и подобное
*3200
Вам дано дерево с \(n\) вершинами. Герой \(k\) раз делает следующую операцию: - Выбрать некоторое ребро.
- Удалить его.
- Выбрать одну из двух оставшихся частей и удалить ее.
- Записать количество вершин в оставшейся части.
Вам дано изначальное дерево и последовательность выписанных чисел. Найдите количество способов сделать операции так, что выписанные числа совпадут с данными числами. Поскольку ответ может быть очень большим, найдите его по модулю \(998\,244\,353\). Два способа считаются различными, если в какой-то операции выбранное ребро или остающаяся часть различаются. Выходные данные Выведите единственное целое число — ответы на задачу по модулю \(998\,244\,353\). Примечание В первом тесте есть четыре возможных способа сделать операции: - Удалить ребро \((1, 2)\) и удалить вершину \(1\). Удалить ребро \((2, 3)\) и удалить вершину \(2\).
- Удалить ребро \((1, 2)\) и удалить вершину \(1\). Удалить ребро \((3, 2)\) и удалить вершину \(3\).
- Удалить ребро \((3, 2)\) и удалить вершину \(3\). Удалить ребро \((1, 2)\) и удалить вершину \(1\).
- Удалить ребро \((3, 2)\) и удалить вершину \(3\). Удалить ребро \((2, 1)\) и удалить вершину \(2\).
Во втором тесте есть два возможных способа сделать операции: - Удалить ребро \((4, 1)\) и удалить часть с вершиной \(4\). Удалить ребро \((2, 3)\) и удалить часть с вершиной \(2\).
- Удалить ребро \((4, 1)\) и удалить часть с вершиной \(4\). Удалить ребро \((3, 2)\) и удалить часть с вершиной \(3\).
| |
|
|
F. Даша и кошмары
meet-in-the-middle
битмаски
Строки
хэши
*1900
Отличница Даша учится в лучшем математическом лицее страны. Недавно таинственный незнакомец принёс в лицей \(n\) слов из маленьких латинских букв \(s_1, s_2, \ldots, s_n\). С того дня Дашу начали мучить кошмары. Рассмотрим некоторую пару целых чисел \(\langle i, j \rangle\) (\(1 \le i \le j \le n\)). Кошмаром называется строка, для которой верно: - Она получена склеиванием \(s_{i}s_{j}\);
- Её длина нечётна;
- Количество различных букв, входящих в неё, ровно \(25\);
- Количество каждой отдельной буквы, входящей в неё, нечётно.
Например, если \(s_i=\) «abcdefg» и \(s_j=\) «ijklmnopqrstuvwxyz», пара \(\langle i, j \rangle\) образует кошмар. Даша знает, что кошмары исчезнут, если их посчитать. Кошмаров слишком много, поэтому Даше нужна ваша помощь. Посчитайте количество различных кошмаров. Кошмары считаются различными, если различны соответствующие им пары \(\langle i, j \rangle\). Пары \(\langle i_1, j_1 \rangle\) и \(\langle i_2, j_2 \rangle\) считаются различными, если \(i_1 \neq i_2\) или \(j_1 \neq j_2\). Выходные данные Выведите единственное целое число — количество различных кошмаров. Примечание В первом тесте кошмары образуются парами \(\langle 1, 3 \rangle\), \(\langle 2, 5 \rangle\), \(\langle 3, 4 \rangle\), \(\langle 6, 7 \rangle\), \(\langle 9, 10 \rangle\).
| |
|
|
A. Очень красивое одеяло
битмаски
Конструктив
*1600
Кирилл хочет связать очень красивое одеяло, состоящее из \(n \times m\) одинакового размера квадратных лоскутков разных цветов. Каждому цвету он сопоставил некоторое неотрицательное целое число. Таким образом, в нашей задаче одеяло можно считать матрицей \(B\) размера \(n \times m\). Кирилл считает одеяло очень красивым, если для каждой подматрицы \(A\) размера \(4 \times 4\) матрицы \(B\) верно: - \(A_{11} \oplus A_{12} \oplus A_{21} \oplus A_{22} = A_{33} \oplus A_{34} \oplus A_{43} \oplus A_{44},\)
- \(A_{13} \oplus A_{14} \oplus A_{23} \oplus A_{24} = A_{31} \oplus A_{32} \oplus A_{41} \oplus A_{42},\)
где \(\oplus\) означает операцию побитового исключающего ИЛИ. Кирилл просит Вас помочь ему соткать очень красивое одеяло, причем насколько можно более разноцветным! Для этого он Вам дает два числа \(n\) и \(m\). Ваша задача — сгенерировать очень красивую матрицу \(B\) размера \(n \times m\), в которой количество различных чисел максимально. Выходные данные Для каждого набора входных данных в первой строке выведите одно целое число \(cnt\) \((1 \le cnt \le n \cdot m)\) — максимальное количество различных чисел в матрице. Затем выведите саму матрицу \(B\) \((0 \le B_{ij} < 2^{63})\) размера \(n \times m\). Если подходящих матриц несколько, разрешается вывести любую. Можно показать, что если существует матрица с оптимальным количеством различных чисел, то существует среди подходящих матриц такая \(B\), что \((0 \le B_{ij} < 2^{63})\). Примечание Разберем первый пример. Здесь есть всего 4 подматрицы размера \(4 \times 4\). Рассмотрим подматрицу, левый верхний угол которой совпадает с левым верхним углом самой матрицы \(B\): \( \left[ {\begin{array}{cccc} 9740 & 1549 & 9744 & 1553 \\ 1550 & 1551 & 1554 & 1555 \\ 10252 & 2061 & 10256 & 2065 \\ 2062 & 2063 & 2066 & 2067 \\ \end{array} } \right] \) \(9740 \oplus 1549 \oplus 1550 \oplus 1551\) \(=\) \(10256 \oplus 2065 \oplus 2066 \oplus 2067\) \(=\) \(8192\); \(10252 \oplus 2061 \oplus 2062 \oplus 2063\) \(=\) \(9744 \oplus 1553 \oplus 1554 \oplus 1555\) \(=\) \(8192\). Таким образом, выбранная подматрица подходит под условие. Аналогично можно удостовериться в том, что другие три подматрицы тоже подходят под условие.
| |
|
|
E. Маршрутизация
битмаски
графы
дп
Перебор
поиск в глубину и подобное
*2400
Ада управляет сетью, состоящей из \(n\) серверов и \(m\) прямых соединений между ними. Каждое прямое соединение между парой различных серверов позволяет осуществлять двустороннюю передачу информации между этими двумя серверами. Ада знает, что с помощью этих \(m\) прямых соединений возможна передача информации между любыми двумя серверами в этой сети (напрямую или через промежуточные серверы). Будем называть сервер \(v\) соседом сервера \(u\), если существует прямое соединение между этими двумя серверами. Аде нужно настроить в своей сети WRP (Weird Routing Protocol — Странный протокол маршрутизации). Для каждого сервера \(u\) ей нужно выбрать ровно одного соседа и назначить его вспомогательным сервером \(a(u)\). Рассмотрим процесс того, как будет работать маршрутизация после определения всех \(a(u)\). Предположим, сервер \(u\) хочет найти путь до сервера \(v\), отличного от \(u\). - Сервер \(u\) смотрит на все свои прямые соединения с другими серверами. Если он видит прямое соединение с сервером \(v\), он знает путь и процесс завершается.
- Если путь не был найден на первом шаге, сервер \(u\) запрашивает поиск пути у своего вспомогательного сервера \(a(u)\).
- Вспомогательный сервер \(a(u)\) следует этому процессу, начиная с первого шага.
- После того, как \(a(u)\) находит путь, он возвращает его \(u\). Затем сервер \(u\) строит результирующий путь как объединение прямого соединения между \(u\) и \(a(u)\) и пути от \(a(u)\) до \(v\).
Как видите, эта процедура либо создает правильный путь и завершается, либо работает вечно. Таким образом, для Ады крайне важно правильно настроить WRP своей сети. Ваша цель — назначить вспомогательный сервер \(a(u)\) для каждого сервера \(u\) в данной сети таким образом, чтобы WRP мог построить путь от любого сервера \(u\) к любому другому серверу \(v\), используя вышеупомянутую процедуру. Или же требуется определить, что такое назначение вспомогательных серверов невозможно. Выходные данные Если нет возможности назначить вспомогательный сервер \(a(u)\) для каждого сервера \(u\) таким образом, чтобы WRP смог найти путь от любого сервера \(u\) к любому другому серверу \(v\), выведите «No» в единственной строке вывода. В противном случае выведите «Yes» в первой строке вывода. Во второй строке выведите \(n\) целых чисел, \(i\)-е из которых должно быть равно \(a(i)\) – номеру вспомогательного сервера для сервера \(i\). Не забывайте, что должно быть прямое соединение между сервером \(i\) и сервером \(a(i)\). Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.
| |
|
|
H. Кодовый замок
битмаски
дп
*3300
У Лары есть сейф, который запирается кодовым замком в форме круга, состоящим из вращающейся стрелки, статической окружности вокруг стрелки, экрана ввода и кнопки ввода. Окружность замка разбита на \(k\) равных секторов, пронумерованных от \(1\) до \(k\) по часовой стрелке, вращающаяся стрелка всегда указывает на один из этих секторов. Каждому сектору соответствует одна из первых \(k\) букв английского алфавита, причём никаким двум секторам не соответствует одна и та же буква. Из-за ограничений устройства сейфа пароль от него представляет собой строку длины \(n\), состоящую из только первых \(k\) букв английского алфавита. Лара вводит пароль поворачивая стрелку замка и нажимая кнопку ввода. Изначально стрелка замка указывает на секцию \(1\), а экран ввода пуст, далее за одну секунду Лара может выполнить одно из следующих действий. - Повернуть стрелку на один сектор по часовой стрелке. Если стрелка указывала на сектор \(x < k\), то теперь она будет указывать на сектор \(x + 1\). Если же стрелка указывала на сектор \(k\), то теперь она будет указывать на сектор \(1\).
- Повернуть стрелку на один сектор против часовой стрелки. Если стрелка указывала на сектор \(x > 1\), то теперь она будет указывать на сектор \(x - 1\). Если стрелка указывала на сектор \(1\), то теперь она будет указывать на сектор \(k\).
- Нажать на кнопку ввода. В конец содержимого экрана ввода добавляется буква, соответствующая сектору, на который указывает сейчас стрелка.
Как только содержимое экрана ввода совпадёт с паролем, сейф откроется. Лара всегда действует таким образом, чтобы вводить свой пароль за минимально возможное время. Недавно Лара узнала, что сейф можно перепрограммировать. Она может взять первые \(k\) букв английского алфавита и переназначить их секторам в произвольном порядке. Теперь она хочет переназначить буквы таким образом, чтобы свести к минимуму количество секунд, необходимых ей для ввода пароля. Вычислите это минимально возможное количество секунд, а также вычислите количество способов расставить буквы по секторам, для которых это минимальное количество секунд будет достигаться. Два способа назначения букв секторам считаются различными, если существует хотя бы один сектор \(i\), которому в этих способах назначены разные буквы. Выходные данные В первой строке выведите минимально возможное количество секунд, за которое Лара введёт пароль и откроет сейф, если она оптимально расставит буквы по секторам. Во второй строке выведите количество способов оптимально расставить буквы. Примечание Начальные состояния оптимальных способов для первого примера показаны на рисунке ниже. Начальные состояния оптимальных способов для второго примера показаны на рисунке ниже. Начальные состояния оптимальных способов для третьего примера показаны на рисунке ниже.
| |
|
|
A. Нам нужен ноль
битмаски
Перебор
*800
Дан массив \(a\), состоящий из целых неотрицательных чисел. Вы можете выбрать целое число \(x\) и обозначить \(b_i=a_i \oplus x\) для всех \(1 \le i \le n\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Можно ли выбрать такое число \(x\), что значение выражения \(b_1 \oplus b_2 \oplus \ldots \oplus b_n\) будет равняться \(0\)? Можно показать, что если искомый \(x\) существует, то существует и такой подходящий \(x\) такой, что (\(0 \le x < 2^8\)). Выходные данные Для каждого набора входных данных выведите искомое целое число \(x\) (\(0 \le x < 2^8\)), если оно существует, или \(-1\) иначе. Примечание В первом наборе входных данных после применения операции с числом \(6\) массив \(b\) становится равен \([7, 4, 3]\), \(7 \oplus 4 \oplus 3 = 0\). В третьем наборе есть и другие ответы, например, число \(0\).
| |
|
|
G2. Последовательное сложение (сложная версия)
битмаски
дп
жадные алгоритмы
реализация
сортировки
*1100
Единственное различие между двумя версиями в том, что в этой версии ограничения выше. Изначально массив \(a\) содержит только число \(1\). Вы можете выполнить несколько операций, чтобы изменить массив. За одну операцию можно выбрать некоторую подпоследовательность \(^{\dagger}\) из \(a\) и вставить на любую позицию в \(a\) элемент, равный сумме всех элементов подпоследовательности. Вам дан массив \(c\). Проверьте, можно ли получить из массива \(a\) массив \(c\), выполнив некоторое количество (возможно, 0) операций над исходным массивом. \(^{\dagger}\) Последовательность \(b\) является подпоследовательностью последовательности \(a\), если \(b\) может быть получена из \(a\) удалением нескольких (возможно, нуля, но не всех) элементов. Другими словами, операция выглядит так: выберем \(k\) (\(1 \leq k \leq |a|\)) различных индексов \(i_1, i_2, \dots, i_k\) и вставим в любое место \(a\) новый элемент со значением, равным \(a_{i_1} + a_{i_2} + \dots + a_{i_k}\). Выходные данные Для каждого набора входных данных выведите «YES» (без кавычек), если такая последовательность операций существует, и «NO» (без кавычек) в противном случае. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание Для первого набора входных данных исходный массив \(a\) уже равен \([1]\), поэтому ответ «YES». Для второго набора входных данных после выполнения любого количества операций длина массива \(a\) станет хотя бы два, а в начальном массиве элемента \(2\) нет, поэтому получить массив \([2]\) невозможно, и ответ будет «NO». Для третьего набора входных данных мы можем выполнить следующие операции, чтобы получить массив \(c\): - Первоначально, \(a = [1]\).
- Выбрав подпоследовательность \([1]\) и вставив \(1\) в массив, \(a\) станет равным \([1, 1]\).
- Выбрав подпоследовательность \([1, 1]\) и вставив \(1+1=2\) в середину массива, \(a\) станет равным \([1, 2, 1]\).
- Выбрав подпоследовательность \([1, 2]\) и вставив \(1+2=3\) после первой \(1\) массива, \(a\) станет равным \([1, 3, 2, 1]\).
- Выбрав подпоследовательность \([1, 3, 1]\) и вставив \(1+3+1=5\) в начало массива, \(a\) станет равным \([5, 1, 3, 2, 1]\) (именно такой массив нам нужно было получить).
| |
|
|
D. Подсчёт XOR
битмаски
дп
Комбинаторика
математика
*2600
Вам даны два положительных целых числа \(n\) и \(m\). Найдите сумму всех возможных значений \(a_1\bigoplus a_2\bigoplus\ldots\bigoplus a_m\), где \(a_1,a_2,\ldots,a_m\) являются неотрицательными целыми числами такими, что \(a_1+a_2+\ldots+a_m=n\). Обратите внимание, что все возможные значения \(a_1\bigoplus a_2\bigoplus\ldots\bigoplus a_m\) должны быть посчитаны в сумме ровно один раз. Так как ответ может быть очень большим, выведите его по модулю \(998244353\). Здесь \(\bigoplus\) обозначает операцию побитового исключающего ИЛИ. Выходные данные Для каждого набора входных данных выведите сумму всех возможных значений \(a_1\bigoplus a_2\bigoplus\ldots\bigoplus a_m\) по всем наборам неотрицательных целых чисел \(a_1,a_2,\ldots,a_m\) с \(a_1+a_2+\ldots+a_m=n\). Так как ответ может быть очень большим, выведите его по модулю \(998244353\). Примечание В первом наборе входных данных у нас должно быть \(a_1=69\), поэтому это единственное возможное значение \(a_1\), следовательно, наш ответ — \(69\). Во втором наборе входных данных \((a_1,a_2)\) может быть равно \((0,5), (1,4), (2,3), (3,2), (4,1)\) или \((5,0)\), в которых \(a_1\bigoplus a_2\) равно \(5,5,1,1,5,5\) соответственно. Поэтому \(a_1\bigoplus a_2\) может быть равно \(1\) или \(5\), поэтому ответ равен \(1+5=6\). В третьем наборе входных данных \(a_1,a_2,\ldots,a_{10}\) должны быть все равны \(0\), поэтому \(a_1\bigoplus a_2\bigoplus\ldots\bigoplus a_{10}=0\). Поэтому ответ равен \(0\).
| |
|
|
E. Walk the Runway
битмаски
графы
дп
Перебор
реализация
сортировки
Структуры данных
*2400
Тур состоит из \(m\) идентичных подиумных шоу в разных городах. Всего есть \(n\) моделей, которые хотят участвовать в туре, пронумерованных от \(1\) до \(n\). У людей в разных городах разные взгляды на индустрию моды, поэтому они оценивают моделей по-разному. В частности, люди в городе \(i\) оценивают модель \(j\) рейтингом \(r_{i, j}\). Из желающих моделей вы выберете \(k\) моделей и некоторый их порядок, пусть эти модели в этом порядке имеют номера \(j_1, j_2, \dots, j_k\). В каждом городе на подиум выйдут эти \(k\) моделей в данном порядке. Чтобы сделать шоу захватывающим, в каждом городе рейтинги моделей должны строго возрастать в порядке их выхода на подиум. Более формально, для любого города \(i\) и индекса \(t\) (\(2 \leq t \leq k\)), рейтинги должны удовлетворять условию \(r_{i,j_{t - 1}} < r_{i,j_t}\). В конце концов, индустрия моды сфокусирована на деньгах, поэтому выбрав модель \(j\) для участия в туре, вы получите \(p_j\) прибыли. Вычислите, какую максимальную прибыль вы можете получить при правильном выборе моделей и порядка их выступления, при условии соблюдения всех ограничений. Выходные данные Выведите одно целое число — максимальную суммарную прибыль. Примечание В первом примере в тур приглашены \(3\) модели. Шоу состоит из моделей в следующем порядке \([1, 3, 4]\). Соответственные рейтинги в городах: - Город \(1\) — \([ 1, 3, 4 ]\).
- Город \(2\) — \([ 1, 2, 3 ]\).
- Город \(3\) — \([ 2, 4, 5 ]\).
Видно, что рейтинги моделей в каждом городе возрастают. Суммарная прибыль равна \(10 + 10 + 10 = 30\). Можно доказать, что невозможно достичь большей прибыли. Во втором примере мы можем пригласить в тур пятую модель, откуда получаем общую прибыль \(50\). Можно доказать, что невозможно достичь большей прибыли. В третьем примере мы приглашаем в тур единственную модель, откуда получаем прибыль \(1\,000\,000\,000\). В четвертом примере мы можем пригласить всех моделей и шоу будет состоять из моделей в следующем порядке \([ 5, 4, 3, 2, 1 ]\). Тогда общая прибыль будет равна \(5 \cdot 1\,000\,000\,000 = 5\,000\,000\,000\).
| |
|
|
C. Мистер совершенство
битмаски
жадные алгоритмы
реализация
*800
Виктор хочет стать «Мистером совершенство». Для этого ему нужно овладеть определенным набором навыков. Более точно, у него есть \(2\) навыка, которые ему нужно овладеть. У него также есть \(n\) книг. Чтение книги \(i\) занимает у него \(m_i\) минут и дает ему некоторые (возможно, ни одного) из двух необходимых навыков, представленных двоичной строкой длины \(2\). Какое минимальное количество времени потребуется, чтобы Виктор овладел обоими необходимыми навыками? Выходные данные Для каждого набора входных данных выведите одно целое число, обозначающее минимальное количество минут, необходимое для того, чтобы Виктор овладел обоими необходимыми навыками, и \(-1\), если невозможно овладеть двумя навыками после чтения любого количества книг. Примечание В первом тестовом случае мы можем использовать книги \(2\) и \(3\), с общим количеством потраченного времени, равным \(3 + 4 = 7\). Во втором тестовом случае мы можем использовать книги \(1\) и \(4\), с общим количеством потраченного времени, равным \(3 + 2 = 5\). В третьем тестовом случае у нас есть только один вариант, и это чтение книги \(1\) за общее количество потраченного времени, равное \(5\).
| |
|
|
H. Не вините меня
битмаски
дп
Комбинаторика
математика
*1700
К сожалению, автор задачи не смог придумать интересную историю, поэтому он просто просит вас решить следующую задачу. Дан массив \(a\), состоящий из \(n\) положительных целых чисел. Посчитайте количество подпоследовательностей, для которых побитовое \(\mathsf{AND}\) элементов в подпоследовательности имеет ровно \(k\) единичных битов в двоичном представлении. Ответ может быть большим, поэтому выведите его по модулю \(10^9+7\). Напомним, что подпоследовательность массива \(a\) - это последовательность, которую можно получить из \(a\), удалив некоторые (возможно, ни одного) элементы. Например, \([1, 2, 3]\), \([3]\), \([1, 3]\) являются подпоследовательностями \([1, 2, 3]\), но \([3, 2]\) и \([4, 5, 6]\) - нет. Обратите внимание, что \(\mathsf{AND}\) обозначает логическую операцию AND. Выходные данные Для каждого тестового случая выведите одно целое число - количество подпоследовательностей, у которых в двоичном представлении значение побитового \(\mathsf{AND}\) имеет ровно \(k\) установленных битов. Ответ может быть большим, поэтому выведите его по модулю \(10^9+7\).
| |
|
|
C. Галактики-близнецы
битмаски
Конструктив
математика
Перебор
Теория вероятностей
*2600
Известный во всем мире астрофизик Млейл ваГрасс Тайсок недавно прочитал о существовании скоплений галактик-близнецов. Прежде чем поделиться этими знаниями с широкой аудиторией в своем подкасте под названием S.tarT-ok, он хочет доказать их существование самостоятельно. Млейл осознает, что просторы Вселенной поражают воображение (почти так же поражают, как и его наблюдательность), и решает попытать счастья и найти новое скопление галактик-близнецов. Для этого он использует свой ТЛескоп для наблюдения за еще не исследованной человечеством частью ночного неба, в которой есть ровно \(2^{k + 1}\) галактик, расположенных в ряд. \(i\)-я из них состоит ровно из \(0 \le g_i < 4^k\) звезд. Скопление галактик — это любой непустой непрерывный подотрезок галактик. Более того, считается, что её признак равен побитовому исключающему ИЛИ всех значений \(g_i\) в этом диапазоне. Два скопления галактик считаются близнецами тогда и только тогда, когда они имеют равные признаки и их соответствующие отрезки не пересекаются. Напишите программу, которая для многих сценариев будет читать описание участка ночного неба, наблюдаемого Млейлем, и выводить расположение двух отрезков, принадлежащих некоторой паре галактик-близнецов, или единственное значение \(-1\), если такой пары не существует. Выходные данные Ответы для всех наборов входных данных должны содержаться в отдельных строках. Если существует пара галактик-близнецов, то выведите четыре целых числа \(a\), \(b\), \(c\) и \(d\), обозначающие их отрезки \([a, b]\) и \([c, d]\) (первый интервал не обязан начинаться раньше второго, но они должны быть непересекающимися). Если пары таких галактик не существует, выведите единственное значение \(-1\). Примечание В первом наборе входных данных мы выбираем интервалы \([2, 4]\) и \([6, 6]\) в качестве наших галактик-близнецов. Признак первого интервала равен \(15 \oplus 0 \oplus 7 = 8\), и признак второго интервала равен \(8\), так что эти скопления галактик действительно являются близнецами.
| |
|
|
F. Хороший граф
битмаски
графы
Паросочетания
поиск в глубину и подобное
реализация
*3500
Вам дан двудольный граф \(G\) с множеством вершин в левой доле \(L\), в правой доле \(R\) и \(m\) ребрами, соединяющими эти два множества. Мы знаем, что \(|L| = |R| = n\). Для любого подмножества \(S \subseteq L\), пусть \(N(S)\) обозначает множество всех соседей вершин в \(S\). Мы говорим, что подмножество \(S \subseteq L\) в графе \(G\) является строгим, если \(|S| = |N(S)|\). Мы говорим, что граф \(G\) является хорошим, если \(\forall_{S \subseteq L}, |S| \leq |N(S)|\). Ваша задача — проверить, является ли граф хорошим, и, если да, то оптимизировать его. Если граф не является хорошим, найдите подмножество \(S \subseteq L\) такое, что \(|S| > |N(S)|\). Однако, если граф хороший, ваша задача — найти хороший двудольный граф \(G'\) с тем же набором вершин \(L \cup R\), в котором \(\forall_{S \subseteq L}\) множество \(S\) является строгим в \(G\) тогда и только тогда, когда \(S\) строго в \(G'\). Если таких графов несколько, выберите один с наименьшим возможным числом ребер. Если таких графов по-прежнему несколько, выведите любой из них. Выходные данные Если граф \(G\), заданный на входе, не является хорошим, выведите в первой строке вывода одно слово «NO». Во второй строке вывода выведите число \(k\), а в третьей строке выведите \(k\) чисел \(l_1, l_2, \dots, l_k\), разделенные пробелами. Эти числа должны показать, что для множества \(S = \{l_1, l_2, \dots, l_k\}\) выполняется \(|S| > |N(S)|\). Однако, если граф \(G\), заданный на входе, хороший, выведите одно слово «YES» в первой строке вывода. Во второй строке вывода выведите число \(m'\), обозначающее количество ребер в новом, также хорошем графе \(G'\). Затем, в следующих \(m'\) строках, выведите ребра графа \(G'\) в том же формате, что и во входных данных. Примечание В первом тестовом примере граф \(G\) хороший; таким образом, мы ищем эквивалентный граф с такими же строгими множествами. Единственный строгий набор — это \(\{ 1, 2, 3 \}\), который остается строгим в результирующем графе. Более того, никакое другое множество не является строгим в полученном графе. Можно доказать, что не существует графа с менее чем \(6\) ребрами и такими же строгимимножествами. Во втором тестовом примере граф \(G\) не является хорошим. Множество \(\{ 2, 3 \}\) имеет только одного соседа — вершину \(6\). Таким образом, \(|\{ 2, 3 \}| > |\{ 6 \}|\), что доказывает, что входной граф не является хорошим.
| |
|
|
B. Бинарная кофейня
битмаски
Комбинаторика
математика
*1100
Как-то раз Тёма оказался в бинарной кофейне. Это очень популярное и необычное место. Кофейня предлагает посетителям \(k\) разных вкусных десертов. Десерты нумеруются от \(0\) до \(k-1\). Стоимость \(i\)-о десерта составляет \(2^i\) монет, ведь это бинарная кофейня! Тёма готов потратить не более \(n\) монет на дегустацию десертов. При этом ему неинтересно покупать любой десерт более одного раза, ведь для оценки вкуса достаточно и одного. Сколькими различными способами он может купить несколько десертов (возможно ноль) для дегустации? Выходные данные Выведите \(t\) целых чисел, \(i\)-е из которых должно быть равно ответу на \(i\)-й набор входных данных — количеству способов купить десерты для дегустации. Примечание Варианты для первого набора входных данных: {}, {1} Варианты для второго набора входных данных: {}, {1} Варианты для третьего набора входных данных: {}, {1}, {2} Варианты для четвёртого набора входных данных: {}, {1}, {2}, {1, 2}
| |
|
|
B. Тенцинг и книги
битмаски
жадные алгоритмы
математика
*1100
Тенцинг получил в подарок от фанатов \(3n\) книг. Книги расположены в \(3\) стопках по \(n\) книг в каждой стопке. У каждой книги есть неотрицательная целочисленная величина — сложность. Тенцинг хочет прочитать несколько (возможно, ни одной) книги. Изначально его знание равно \(0\). За один шаг Тенцинг выбирает непустую стопку, читает верхнюю книги в стопке и затем выкидывает ее. Если знание Тенцинга сейчас равно \(u\), то оно станет равно \(u|v\) после прочтения книги со сложностью \(v\). Здесь \(|\) обозначает операцию побитового ИЛИ. Тенцинг может прочитать произвольное количество книг и остановиться в любой момент. Любимое число Тенцинга равно \(x\). Можете определить, может ли его знание стать равным \(x\)? Выходные данные Для каждого набора входных данных выведите «Yes» (без кавычек), если Тенцинг может сделать свое знание равным \(x\), и «No» (без кавычек) в противном случае. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В первом примере Тенцинг может прочитать следующие \(4\) книги: - прочитать книгу со сложностью \(1\) сверху первой стопки. Знание становится равно \(0|1=1\).
- прочитать книгу со сложностью \(1\) сверху третьей стопки. Знание становится равно \(1|1=1\).
- прочитать книгу со сложностью \(2\) сверху первой стопки. Знание становится равно \(1|2=3\).
- прочитать книгу со сложностью \(5\) сверху второй стопки. Знание становится равно \(3|5=7\).
После чтения этих книг знание Тенцинга равно \(7\). В третьем примере Тенцинг может прочитать \(0\) книг, и его итоговое знание будет равно \(0\).
| |
|
|
H. Тенцинг и случайные вещественные числа
битмаски
графы
дп
математика
Теория вероятностей
*3000
Имеется \(n\) непрерывно распределённых случайных вещественных чисел от 0 до 1 включительно, которые обозначаются как \(x_1, x_2, \ldots, x_n\). Тенцинг имеет \(m\) условий. Каждое условие имеет вид \(x_i+x_j\le 1\) или \(x_i+x_j\ge 1\). Тенцинг хочет узнать вероятность того, что все условия выполнены, по модулю \(998~244~353\). Формально, пусть \(M = 998~244~353\). Можно показать, что ответ может быть представлен в виде несократимой дроби \(\frac{p}{q}\), где \(p\) и \(q\) — целые числа, и \(q \not \equiv 0 \pmod{M}\). Выведите целое число, равное \(p \cdot q^{-1} \bmod M\). Другими словами, выведите такое целое число \(x\), что \(0 \le x < M\) и \(x \cdot q \equiv p \pmod{M}\). Выходные данные Выведите вероятность того, что все условия выполнены, по модулю \(M = 998~244~353\). Примечание В первом примере условиями являются \(x_1+x_2 \le 1\) и \(x_3+x_3\ge 1\), и вероятность выполнения каждого условия равна \(\frac 12\), поэтому вероятность того, что они оба выполнены, равна \(\frac 12\cdot \frac 12=\frac 14\), по модулю \(998~244~353\) равно \(748683265\). Во втором примере ответ равен \(\frac 14\). В третьем примере ответ равен \(\frac 1{16}\). В четвертом случае сумма всех переменных должна быть равна \(2\), поэтому вероятность равна \(0\).
| |
|
|
C. Сумма в бинарном дереве
битмаски
Деревья
Комбинаторика
математика
*800
Ване очень нравится математика. Однажды, когда он решал очередную задачу по математике, он придумал интересное дерево. Это дерево строится следующим образом. Изначально в дереве есть только одна вершина с номером \(1\) — корень дерева. Затем, Ваня добавляет к ней двух детей, присваивая им последовательные номера — \(2\) и \(3\) соответственно. После этого, он будет добавлять детей к вершинам по возрастанию их номеров, начиная с \(2\), присваивая их детям минимальные не занятые номера. В итоге, у Вани получится бесконечное дерево с корнем в вершине \(1\), где каждая вершина будет иметь ровно два ребенка, а номера вершин будут расположены последовательно по слоям. Часть дерева Вани. Ване стало интересно, чему равна сумма номеров вершин на пути от вершины с номером \(1\) до вершины с номером \(n\) в таком дереве. Так как Ваня не любит считать, он попросил Вас помочь ему узнать эту сумму. Выходные данные Для каждого набора входных данных выведите одно целое число — искомую сумму. Примечание В первом наборе данных примера на пути от корня до вершины \(3\) лежат две вершины \(1\) и \(3\), для них сумма равна \(4\). Во втором наборе данных примера на пути от корня до вершины с номером \(10\) лежат вершины \(1\), \(2\), \(5\), \(10\), сумма их номеров равна \(1+2+5+10 = 18\).
| |
|
|
G. Дерево с весами
битмаски
Деревья
Конструктив
математика
матрицы
поиск в глубину и подобное
реализация
Структуры данных
теория чисел
*3000
Дано дерево на \(n\) вершинах, пронумерованных числами \(1,2,\dots,n\). \(i\)-е ребро соединяет вершины \(u_i\) и \(v_i\) и имеет некоторый неизвестный целый положительный вес \(w_i\). Вам также известны расстояния \(d_i\) между вершинами \(i\) и \(i+1\) для всех \(1 \le i \le n-1\) (это расстояние равно сумме весов рёбер на простом пути между вершинами дерева \(i\) и \(i+1\)). Найдите вес каждого ребра. Если существует несколько решений, выведите любое из них. Если не существует весов \(w_i\), согласующихся со всеми данными, выведите одно целое число \(-1\). Выходные данные Если решения не существует, выведите одно целое число \(-1\). В противном случае выведите \(n-1\) строку, содержащую веса \(w_1,\dots,w_{n-1}\). Если существует несколько решений, выведите любое из них. Примечание В первом примере дерево выглядит следующим образом: Во втором примере вес \(w_2\) не может быть равен \(0\), поскольку должен быть целым положительным числом. Поэтому решения нет. В третьем примере дерево выглядит следующим образом:
| |
|
|
G. Рудольф и CodeVid-23
битмаски
графы
дп
жадные алгоритмы
кратчайшие пути
*1900
Среди программистов распространился новый вирус «CodeVid-23». Рудольфу, как программисту, также не удалось избежать его. Всего есть \(n\) симптомов, пронумерованных от \(1\) до \(n\), которые могут появиться при заболевании. Изначально Рудольф имеет некоторые из них. Чтобы вылечиться он сходил в аптеку и купил \(m\) лекарств. Для каждого лекарства известно количество дней, которое его нужно принимать, а также набор симптомов, которые оно снимает. К сожалению, у лекарств часто бывают побочные эффекты. Поэтому для каждого из лекарств также известен набор симптомов, которые появляются при его приеме. Почитав инструкции Рудольф понял, что принимать больше одного лекарства одновременно очень вредно для организма. Рудольф хочет как можно быстрее встать на ноги. Поэтому он просит вас посчитать за какое минимальное количество дней он сможет избавиться от всех симптомов, или сказать, что это невозможно. Входные данные Первая строка содержит одно целое число \(t\) \((1 \le t \le 100)\) — количество наборов входных данных. Далее следуют описания наборов. Первая строка набора содержит два целых числа \(n, m\) \((1 \le n \le 10, 1 \le m \le 10^3)\) — количество симптомов и лекарств, соответственно. Вторая строка набора содержит строку длины \(n\), состоящую из символов \(0\) и \(1\) — описание симптомов Рудольфа. Если \(i\)-й символ строки равен \(1\), Рудольф имеет \(i\)-й симптом, иначе нет. Затем следуют \(3 \cdot m\) строк — описание лекарств. Первая строка каждого описания содержит целое число \(d\) \((1 \le d \le 10^3)\) — количество дней, которое нужно принимать лекарство. Следующие две строки описания содержат две строки длины \(n\), состоящие из символов \(0\) и \(1\) — описание симптомов, которые оно снимает, а также описание побочных эффектов. В первой из строк \(1\) на \(i\)-й позиции означает, что лекарство снимает \(i\)-й симптом, и \(0\) иначе. Во второй из строк \(1\) на \(i\)-й позиции означает, что после приема появляется \(i\)-й симптом, и \(0\) иначе. Разные лекарства могут иметь одинаковые наборы симптомов и побочных эффектов. Если лекарство снимает некоторый симптом, то его не будет среди побочных эффектов. Сумма \(m\) по всем наборам входных данных не превосходит \(10^3\). Выходные данные Для каждого набора входных данных в отдельной строке выведите одно целое число — минимальное количество дней, через которое Рудольф сможет избавиться ото всех симптомов. Если этого не случится никогда выведите \(-1\). Примечание В первом примере мы можем применить сначала лекарство номер \(4\), после него симптомы примут вид «00101». После этого лекарство номер \(2\), тогда симптомы полностью исчезнут, а количество дней будет равно \(5 + 3 = 8\). Ещё один вариант применения лекарств в порядке \(1, 3, 2\). В этом случае все симптомы также исчезнут, но количество дней будет равно \(3 + 3 + 3 = 9\). Во втором примере симптомов нет изначально, поэтому лечение займет \(0\) дней. В третьем примере нет вариантов полностью убрать симптомы.
| |
|
|
B. Одиссея Хамона
битмаски
жадные алгоритмы
*1000
Джонатан сражается с приспешниками-вампирами DIO. Всего их \(n\), а их силы равны \(a_1, a_2, \dots, a_n\). \(\def\and {{\,\texttt{&}\,}}\) Обозначим \((l, r)\) как группу, состоящую из вампиров с индексами от \(l\) до \(r\). Джонатан понимает, что сила любой такой группы находится в её самом слабом звене, то есть побитовом И. Более формально, уровень силы группы \((l, r)\) определяется как \(\)f(l,r) = a_l \and a_{l+1} \and a_{l+2} \and \ldots \and a_r.\(\) Здесь \(\and\) обозначает операцию побитового И. Поскольку Джонатан хочет быстро победить вампиров, он разделит вампиров на подряд идущие группы так, чтобы каждый вампир был в ровно одной группе, а сумма сил групп была минимальна. Среди всех подходящих способов разделить вампиров, он хотел бы найти способ с максимальным количеством групп. Учитывая силы каждого из \(n\) вампиров, найдите максимальное число групп среди всех возможных способов разделить вампиров с наименьшей суммой сил. Выходные данные Для каждого набора входных данных выведите одно целое число — максимальное количество групп среди всех возможных способов разделения вампиров с наименьшей суммой сил. Примечание В первом наборе входных данных оптимальным является принятие всех \(n\) вампиров за одну группу. Тогда, \(f(1,3) = 1 \and 2 \and 3 = 0\). Во втором наборе входных данных оптимальным является создание \(2\) групп, \((2,3,1)\) и \((5,2)\). Тогда, \(f(1,3) + f(4,5) = (2 \and 3 \and 1) + (5 \and 2) = 0 + 0 = 0\).
| |
|
|
C. Кто-нибудь хочет вампирские способности?
битмаски
дп
жадные алгоритмы
Перебор
*1400
ДИО знает, что Крестоносцы звёздной пыли определили его местоположение и собираются сразиться с ним. Чтобы сорвать их планы, он решает послать несколько пользователей стендов для борьбы с ними. Первоначально он призвал с собой \(n\) пользователей, причем сила \(i\)-го из них равна \(a_i\). Используя свои вампирические способности, он может делать следующее столько раз, сколько пожелает: К несчастью для ДИО, используя предсказательные способности Пурпурного отшельника, Крестоносцы знают, что он замышляет это, и они также знают силы первоначальных пользователей стендов. Помогите Крестоносцам найти максимально возможную силу пользователя стенда среди всех возможных способов вызовов. Выходные данные Для каждого набора входных данных выведите одно целое число, максимальную силу пользователя Стенда среди всех возможных способов вызовов. Примечание В первом наборе входных данных один из способов добавления новых пользователей Стендов выглядит следующим образом: - Выбрать \(i=n\). Теперь \(a\) становится \([0,2,5,1,1]\).
- Выбрать \(i=1\). Теперь \(a\) становится \([0,2,5,1,1,7]\). \(7\) — это максимальная сила пользователя стенда, которого может вызвать ДИО.
Во втором наборе входных данных, ДИО не нужно добавлять больше пользователей стенда, потому что \(3\) — это максимальная сила пользователя стенда, которого ДИО может вызвать.
| |
|
|
F. Личность босса
Бинарный поиск
битмаски
жадные алгоритмы
математика
поиск в глубину и подобное
сортировки
Структуры данных
*2500
Во время расследования происхождения Диаволо, Джорно получает от Полнареффа секретный код. Код можно представить в виде бесконечной последовательности целых положительных чисел: \(a_1, a_2, \dots \). Джорно сразу видит закономерность, лежащую в основе кода. Первые \(n\) чисел \(a_1, a_2, \dots, a_n\) являются известными. Для \(i > n\) значение \(a_i\) равно \((a_{i-n}\ |\ a_{i-n+1})\), где \(|\) обозначает операцию побитового ИЛИ. Части информации о Диаволо скрыты в \(q\) вопросах. Каждый вопрос связан с положительным целым числом \(v\), а ответом на него является наименьший индекс \(i\), такой, что \(a_i > v\). Если такого \(i\) не существует, то ответом будет \(-1\). Помогите Джорно ответить на вопросы! Выходные данные Выведите \(q\) чисел. Число \(i\) является ответом на \(i\)-й вопрос, заданный Джорно. Примечание В первом примере \(a = [2,1,3,3,\ldots]\). - Для первого вопроса, \(a_1=2\) – элемент с наименьшим индексом, больший чем \(1\).
- Для второго вопроса, \(a_3=3\) – элемент с наименьшим индексом, больший чем \(2\).
- Для третьего вопроса, нет индекса \(i\), такого что \(a_i > 3\).
.
| |
|
|
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]\).
| |
|
|
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. Если существует несколько оптимальных ответов — выведите любой из них.
| |
|
|
F. Лиза и марсиане
битмаски
Деревья
жадные алгоритмы
математика
Строки
*1800
Девочку Лизу похитили марсиане! Не беда, ведь она смотрела много телепередач про инопланетян, поэтому знает, что её ждёт. Назовём число марсианским, если оно является целым неотрицательным и строго меньше \(2^k\), например, при \(k = 12\), числа \(51\), \(1960\), \(0\) — марсианские, а числа \(\pi\), \(-1\), \(\frac{21}{8}\), \(4096\) — нет. Инопланетяне выдадут Лизе \(n\) марсианских чисел \(a_1, a_2, \ldots, a_n\). Затем они попросят её назвать любое марсианское число \(x\). После чего Лиза выберет в выданной последовательности пару чисел \(a_i, a_j\) (\(i \neq j\)) и посчитает \((a_i \oplus x) \& (a_j \oplus x)\). Операция \(\oplus\) означает Побитовое исключающее ИЛИ, операция \(\&\) означает Побитовое И. Например, \((5 \oplus 17) \& (23 \oplus 17) = (00101_2 \oplus 10001_2) \& (10111_2 \oplus 10001_2) = 10100_2 \& 00110_2 = 00100_2 = 4\). Лиза уверена, что чем больше окажется посчитанное значение, тем выше её шансы вернуться домой. Помогите девочке выбрать такие \(i, j, x\), чтобы максимизировать посчитанное значение. Выходные данные Для каждого набора входных данных выведите три целых числа \(i, j, x\) (\(1 \le i, j \le n\), \(i \neq j\), \(0 \le x < 2^k\)). Значение \((a_i \oplus x) \& (a_j \oplus x)\) должно быть максимально возможным. Если решений несколько, вы можете вывести любое. Примечание Первый набор входных данных: \((3 \oplus 14) \& (1 \oplus 14) = (0011_2 \oplus 1110_2) \& (0001_2 \oplus 1110_2) = 1101_2 = 1101_2 \& 1111_2 = 1101_2 = 13\). Второй набор входных данных: \((1 \oplus 0) \& (1 \oplus 0) = 1\). Третий набор входных данных: \((9 \oplus 4082) \& (13 \oplus 4082) = 4091\). Четвёртый набор входных данных: \((3 \oplus 7) \& (0 \oplus 7) = 4\).
| |
|
|
B. Заработать или разблокировать
битмаски
дп
Перебор
*2200
Андрей играет в игру Tanto Cuore.
У него есть колода из \(n\) карт со значениями \(a_1, \ldots, a_n\) сверху вниз. Каждая карта может быть либо заблокирована, либо разблокирована. Первоначально разблокирована только самая верхняя карта. Ходы происходят по очереди. В каждый ход Андрей выбирает незаблокированную карту из колоды. Пусть значение, записанное на этой карте, равно \(v\). Тогда он выполняет ровно одну из следующих двух операций: - Разблокировать первые \(v\) заблокированных карт в колоде сверху. Если в колоде меньше \(v\) заблокированных карт, то разблокировать все заблокированные карты.
- Заработать \(v\) очков победы.
В обоих случаях после выполнения операции он убирает карту из колоды. Игра заканчивается, когда все оставшиеся в колоде карты закрыты или в колоде больше нет карт. Какое максимальное количество очков победы может заработать Андрей? Выходные данные Выведите одно целое число — максимальное количество очков победы, которое может заработать Андрей. Примечание В первом примере колода в колоде сначала лежит разблокированная карта, потом заблокированная. Андрей использует первую карту, чтобы разблокировать вторую карту. Затем он использует вторую карту, чтобы заработать \(2\) победных очка. Во втором примере Андрей может использовать первую карту для разблокировки второй и третьей карт. Затем он использует вторую и третью карты, чтобы заработать \(4+5=9\) победных очков. В третьем примере Андрей не может разблокировать ни одну карту и получить победные очки с помощью первой карты.
| |
|
|
E2. ПерестановДерево (сложная версия)
битмаски
бпф
Деревья
дп
жадные алгоритмы
математика
поиск в глубину и подобное
реализация
*2700
Это сложная версия задачи. Различия между двумя версиями заключаются в ограничении на \(n\) и ограничении по времени. Делать взломы можно только в том случае, если решены обе версии задачи. Дано дерево с \(n\) вершинами с корнем в вершине \(1\). Для некоторой перестановки\(^\dagger\) \(a\) длины \(n\) пусть \(f(a)\) — количество пар вершин \((u, v)\) таких, что \(a_u < a_{\operatorname{lca}(u, v)} < a_v\). Здесь \(\operatorname{lca}(u,v)\) обозначает наименьшего общего предка вершин \(u\) и \(v\). Найдите максимально возможное значение \(f(a)\) по всем перестановкам \(a\) длины \(n\). \(^\dagger\) Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)). Выходные данные Выведите максимальное значение \(f(a)\). Примечание Дерево в первом примере: Одной возможной оптимальной перестановкой \(a\) является \([2, 1, 4, 5, 3]\) с \(4\)-мя подходящими парами вершин: - \((2, 3)\), так как \(\operatorname{lca}(2, 3) = 1\) и \(1 < 2 < 4\),
- \((2, 4)\), так как \(\operatorname{lca}(2, 4) = 1\) и \(1 < 2 < 5\),
- \((2, 5)\), так как \(\operatorname{lca}(2, 5) = 1\) и \(1 < 2 < 3\),
- \((5, 4)\), так как \(\operatorname{lca}(5, 4) = 3\) и \(3 < 4 < 5\).
Дерево в третьем примере: Дерево в четвёртом примере:
| |
|
|
F. Четыре масти
Бинарный поиск
битмаски
жадные алгоритмы
Потоки
*3200
Игра в берландский покер проводится следующим образом. Участвуют \(n+1\) человек: \(n\) игроков, пронумерованных от \(1\) до \(n\), и дилер. У дилера есть колода, содержащая карты четырех разных мастей (количество карт каждой масти необязательно одинаковое); количество карт в колоде нацело делится на \(n\). Дилер раздает все карты игрокам, что каждый игрок получает одинаковое количество карт, и все карты колоды розданы. После раздачи карт каждый игрок выбирает одну из четырех мастей (независимо) и сбрасывает все карты из своей руки, которые не принадлежат к выбранной им масти. Победителем игры становится игрок, у которого на руках осталось максимальное количество карт. Количество очков, которые получает победитель, равно \(x - y\), где \(x\) — количество карт в руке победителя, а \(y\) — максимальное количество карт среди всех других игроков; все остальные получают \(0\) очков. Обратите внимание, это означает, что если есть несколько игроков с максимальным количеством карт, каждый получает \(0\) очков. Поскольку каждый игрок хочет максимизировать свои шансы на победу, он выберет масть с максимальным количеством карт в своей руке. Монокарп — дилер. Он уже раздал несколько карт игрокам; \(i\)-й игрок получил \(a_{i,j}\) карт масти \(j\). Обратите внимание, что количество карт на руках игроков в данный момент необязательно должно быть одинаковым. У Монокарпа в колоде осталось \(b_1, b_2, b_3, b_4\) карт мастей \(1, 2, 3, 4\) соответственно. Он должен раздать их игрокам таким образом, чтобы после раздачи всех карт у каждого игрока стало одинаковое количество карт. Для каждого игрока подсчитайте максимальное количество очков, которое он может получить среди всех возможных способов раздачи оставшихся карт в соответствии с правилами игры. Выходные данные Выведите \(n\) целых чисел, \(i\)-е из них — максимальное количество очков, которое может получить \(i\)-й игрок среди всех возможных способов раздачи оставшихся карт.
| |
|
|
F. Волшебство спасёт мир
Бинарный поиск
битмаски
дп
Перебор
*1800
На границе миров открылся портал тёмных сил, и теперь всему миру грозит страшная угроза. Чтобы закрыть портал и спасти мир, нужно сперва победить \(n\) чудовищ, что последовательно вылезают из портала. Справиться с этим может только волшебница Вика. Она владеет двумя магическими силами — магией воды и магией огня. За секунду Вика может сгенерировать \(w\) единиц водяной маны и \(f\) единиц огненной маны. Мана понадобится ей для создания заклинаний. Изначально у Вики \(0\) единиц водяной маны и \(0\) единиц огненной маны. Каждое из \(n\) чудовищ, что вылезают из портала, имеет свою силу, выраженную натуральным числом. Чтобы победить \(i\)-е чудовище силы \(s_i\), нужно применить заклинание воды или заклинание огня не меньшей силы. Иначе говоря, Вика может потратить не менее единиц \(s_i\) водяной маны на заклинание воды, либо же не менее единиц \(s_i\) огненной маны на заклинание огня. Вика умеет создавать и применять заклинания мгновенно. Вика может применять любое количество заклинаний каждую секунду, пока у неё хватает на это маны. Волшебница хочет спасти мир как можно быстрее, подскажите, сколько времени ей на это понадобится. Выходные данные Для каждого набора входных данных выведите единственное целое число — минимальное время в секундах, за которое Вика сможет победить всех чудовищ. Примечание В первом наборе входных данных Вика может после первой секунды потратить \(2\) единицы огненной маны, чтобы убить первое чудовище. После этого у неё останется \(2\) единицы водяной маны и \(1\) единица огненной. После третьей секунды в её распоряжении будет \(6\) единиц водяной маны и \(7\) огненной маны. Этого хватит, чтобы сразу убить второе и третьей чудовище.
| |
|
|
F. Разделяй, считай XOR и властвуй
битмаски
дп
математика
*2600
Вам дан массив из \(n\) целых чисел \(a_1, a_2, \ldots, a_n\). За одну операцию вы разбиваете массив на две части: непустой префикс и непустой суффикс. Значение каждой части определяется как побитовое исключающее ИЛИ (XOR) всех элементов в ней. Затем отбросьте часть с меньшим значением. Если обе части имеют одинаковое значение, вы можете сами выбрать, какую часть отбросить. После этого массив становится равен оставшейся части. Операции выполняются, пока длина массива не станет равна \(1\). Для каждого \(i\) (\(1 \le i \le n\)) определите, можно ли достичь состояния, в котором остаётся только \(i\)-й элемент (в исходной нумерации). Формально, у вас есть два числа \(l\) и \(r\), изначально \(l = 1\) и \(r = n\). Текущее состояние массива есть \([a_l, a_{l+1}, \ldots, a_r]\). Пока \(l < r\), вы применяете следующую операцию: - Выбрать произвольное \(k\) из множества \(\{l, l + 1, \ldots, r - 1\}\). Пусть \(x = a_l \oplus a_{l + 1} \oplus \ldots \oplus a_k\) и \(y = a_{k + 1} \oplus a_{k + 2} \oplus \ldots \oplus a_{r}\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ.
- Если \(x < y\), то присвойте \(l = k + 1\).
- Если \(x > y\), то присвойте \(r = k\).
- Если \(x = y\), то или присвойте \(l = k + 1\), или \(r = k\).
Для каждого \(i\) (\(1 \le i \le n\)) определите, можно ли добиться равенств \(l = r = i\). Выходные данные Для каждого набора входных данных выведите строку длины \(n\), где \(i\)-й символ равен 1, если можно добиться \(l = r = i\), и 0 в противном случае. Примечание В первом тесте возможно добиться равенств \(l = r = i\) для всех \(i\) от \(1\) до \(n\): - при \(i=1\): \([1; 6] \rightarrow [1; 4] \rightarrow [1; 1]\);
- при \(i=2\): \([1; 6] \rightarrow [1; 3] \rightarrow [2; 3] \rightarrow [2; 2]\);
- при \(i=3\): \([1; 6] \rightarrow [1; 3] \rightarrow [3; 3]\);
- при \(i=4\): \([1; 6] \rightarrow [1; 4] \rightarrow [4; 4]\);
- при \(i=5\): \([1; 6] \rightarrow [5; 6] \rightarrow [5; 5]\);
- при \(i=6\): \([1; 6] \rightarrow [6; 6]\).
Отдельно рассмотрим случай \(i = 2\). Изначально \(l = 1\), \(r = 6\). - Мы можем выбрать \(k = 3\) и присвоить \(r = k = 3\), поскольку \((3 \oplus 2 \oplus 1) = 0 \ge 0 = (3 \oplus 7 \oplus 4)\);
- Затем мы можем выбрать \(k = 1\) и присвоить \(l = k + 1 = 2\), так как \(3 \le 3 = (2 \oplus 1)\);
- Наконец, мы можем выбрать \(k = 2\) и присвоить \(r = k = 2\), поскольку \(2 \ge 1\).
| |
|
|
C. Цепочка делителей
битмаски
Конструктив
математика
теория чисел
*1300
Дано целое число \(x\). Вам нужно уменьшить \(x\) до \(1\). Для этого вы можете выполнять следующую операцию несколько (возможно, ноль) раз: - выбрать \(d\), являющееся делителем \(x\), затем заменить \(x\) на \(x-d\), т.е. уменьшить \(x\) на \(d\). (Мы называем \(d\) делителем \(x\), если \(d\) — положительное целое число, для которого существует целое \(q\), такое что \(x = d \cdot q\).)
Кроме того, есть дополнительное ограничение: вам нельзя выбирать одно и то же значение \(d\) более двух раз. Например, для \(x=5\) следующая последовательность действий является недопустимой, поскольку в ней \(1\) использована более чем дважды: \(5\xrightarrow{-1}4\xrightarrow{-1}3\xrightarrow{-1}2\xrightarrow{-1}1\). Однако следующая последовательность действий является допустимой: \(5\xrightarrow{-1}4\xrightarrow{-2}2\xrightarrow{-1}1\). Выведите произвольную последовательность действий, которая уменьшает \(x\) до \(1\) не более чем за \(1000\) операций. Можно доказать, что такая последовательность всегда существует. Выходные данные Для каждого набора входных данных выведите две строки. В первой строке выведите целое число \(k\) (\(1 \le k \le 1001\)). Во второй строке через пробел выведите \(k\) целых чисел \(a_1,a_2,\ldots,a_k\), таких что: - \(a_1=x\);
- \(a_k=1\);
- для каждого \(2 \le i \le k\), величина \((a_{i-1}-a_i)\) является делителем \(a_{i-1}\). Каждое число может быть выбрано делителем не более чем дважды.
Примечание В первом наборе входных данных можно выполнить следующую последовательность операций: \(3\xrightarrow{-1}2\xrightarrow{-1}1\). В втором наборе входных данных можно выполнить следующую последовательность операций: \(5\xrightarrow{-1}4\xrightarrow{-2}2\xrightarrow{-1}1\). В третьем наборе входных данных можно выполнить следующую последовательность операций: \(14\xrightarrow{-2}12\xrightarrow{-6}6\xrightarrow{-3}3\xrightarrow{-1}2\xrightarrow{-1}1\).
| |
|
|
E. Угадайка
битмаски
Деревья
игры
математика
сортировки
Строки
Структуры данных
Теория вероятностей
*2100
У Кэрол есть последовательность \(s\) из \(n\) неотрицательных целых чисел. Она хочет сыграть с Алисой и Бобом в «Угадайку». Игра устроена следующим образом. Сначала Кэрол случайно выберет два целых индекса \(i_a\) и \(i_b\) из диапазона \([1, n]\) и обозначит \(a=s_{i_a}\), \(b=s_{i_b}\). Обратите внимание: \(i_a\) и \(i_b\) могут совпасть. Затем Кэрол сообщит: - значение \(a\) — Алисе;
- значение \(b\) — Бобу;
- значение \(a \mid b\) и Алису и Бобу, где \(|\) обозначает операцию побитового ИЛИ.
Обратите внимание: Кэрол не сообщит никакой информации об \(s\) ни Алисе, ни Бобу. Затем начинается процесс угадывания. Алиса и Боб ходят по очереди, причём первой ходит Алиса. Цель обоих игроков — выяснить, какое из утверждений верно: \(a < b\), \(a > b\), или \(a = b\). На своём ходу игрок может сделать одно из двух: - сказать «Я не знаю» и передать ход другому игроку;
- сказать «Я знаю», а затем сообщить ответ: «\(a<b\)», «\(a>b\)», или же «\(a=b\)»; после этого игра заканчивается.
Алиса и Боб слышат фразы друг друга и могут использовать их в своих рассуждениях. Оба игрока достаточно умны. Сказать «Я знаю» они могут только в том случае, если точно уверены в ответе. Найдите математическое ожидание числа шагов в такой игре. Выведите ответ по модулю \(998\,244\,353\). Формально, пусть \(M = 998\,244\,353\). Можно показать, что ответ может быть представлен в виде несократимой дроби \(\frac{p}{q}\), где \(p\) и \(q\) — целые числа, и \(q \not \equiv 0 \pmod{M}\). Выведите целое число, равное \(p \cdot q^{-1} \bmod M\). Другими словами, выведите такое целое число \(x\), что \(0 \le x < M\) и \(x \cdot q \equiv p \pmod{M}\). Выходные данные Для каждого набора входных данных выведите одно число — ответ на задачу по модулю \(998\,244\,353\). Примечание В первом наборе входных данных есть всего \(4\) возможные ситуации: - \(i_a=1\), \(i_b=1\), \(a=2\), \(b=2\), число шагов равно \(2\);
- \(i_a=1\), \(i_b=2\), \(a=2\), \(b=3\), число шагов равно \(3\);
- \(i_a=2\), \(i_b=1\), \(a=3\), \(b=2\), число шагов равно \(2\);
- \(i_a=2\), \(i_b=2\), \(a=3\), \(b=3\), число шагов равно \(3\).
Математическое ожидание числа шагов равно \(\frac{2+3+2+3}{4}=\frac{5}{2}=499122179\pmod{998244353}\). Рассмотрим первый случай, когда \(a=2\), \(b=2\). Процесс угадывания происходит следующим образом. На первом ходу Алиса думает так: «Я знаю, что \(a=2, a\mid b=2\). Можно сделать вывод, что \(b=0\) или \(b=2\), но какой из этих двух случаев имеет место — пока неясно». Поэтому она говорит: «Я не знаю». На втором ходу Боб думает так: «Я знаю, что \(b=2, a\mid b=2\). Можно сделать вывод, что \(a=0\) или \(a=2\). Однако если \(a=0\), то Алиса на своём ходу уже бы сказала, что \(a<b\). Но она этого не сказала. Значит, \(a=2\)». Поэтому он говорит: «Я знаю, \(a=b\)». Игра завершается. Во втором наборе входных данных, при \(a=0\), \(b=0\), Алиса сразу заключает, что \(a=b\). Ожидаемое число ходов равно \(1\).
| |
|
|
B. Палиндромный XOR
битмаски
Конструктив
Строки
*1100
Вам дана бинарная строка \(s\) длины \(n\) (строка - состоящая только из \(0\) и \(1\)). Число \(x\) является хорошим, если существует такая бинарная строка \(l\) длины \(n\), содержащая \(x\) единиц, что если каждый символ \(s_i\) заменить на \(s_i \oplus l_i\) (где \(\oplus\) обозначает операцию Побитового исключающего ИЛИ) то строка \(s\) станет палиндромом. Нужно вывести бинарную строку \(t\) длины \(n+1\), где \(t_i\) (\(0 \leq i \leq n\)) равно \(1\) если число \(i\) хорошее, и \(0\) иначе. Палиндром — это строка, которая читается одинаково как слева направо, так и справа налево. Например, строки 01010, 1111, 0110 — палиндромы. Выходные данные Для каждого набора входных данных выведите одну строку \(t\) длины \(n+1\) - ответ на задачу. Примечание Рассмотрим первый пример. - \(t_2 = 1\) так как можно выбрать \(l = \) 010100 тогда строка \(s\) станет равна 111111, что является палиндромом.
- \(t_4 = 1\) так как можно выбрать \(l = \) 101011.
- Можно показать, что для всех остальных \(i\) ответа не существует, поэтому остальные символы равны \(0\).
| |
|
|
B1. Конфетная вечеринка (простая версия)
битмаски
графы
жадные алгоритмы
Конструктив
математика
реализация
*1700
Это простая версия задачи. Единственное отличие состоит в том, что в этой версии каждый должен дать конфеты ровно одному человеку и получить конфеты ровно от одного человека. Обратите внимание, что посылка не может пройти обе версии задачи одновременно. Вы можете делать взломы, только если обе версии задачи решены. После экзамена Daniel и его друзья собираются устроить вечеринку. Все придут с конфетами. На вечеринке будут присутствовать \(n\) человек. Изначально у \(i\)-го человека есть \(a_i\) конфет. Во время вечеринки они будут обмениваться конфетами. Для этого они выстроятся в произвольном порядке и каждый из них сделает следующее ровно один раз: - Выберет целое число \(p\) (\(1 \le p \le n\)) и неотрицательное целое число \(x\), затем даст \(2^{x}\) конфет \(p\)-му человеку. Заметим, что человек не может отдать больше конфет, чем у него есть в данный момент (он мог получить конфеты от кого-то другого), и он не может отдать конфеты самому себе.
Daniel любит справедливость, поэтому он будет счастлив тогда и только тогда, когда каждый получит конфеты от ровно одного человека. В то же время его друг Tom любит среднее, поэтому он будет счастлив тогда и только тогда, когда у всех людей будет одинаковое количество конфет после всех обменов. Определите, существует ли способ обменяться конфетами так, чтобы Daniel и Tom были счастливы после обменов. Выходные данные Для каждого набора входных данных выведите «Yes» (без кавычек), если существует способ обменяться конфетами так, чтобы Daniel и Tom были счастливы, и выведите «No» (без кавычек) в противном случае. Вы можете вывести ответ в любом регистре (верхнем или нижнем). Например, строки «yEs», «yes», «Yes», и «YES» будут распознаны как положительный ответ. Примечание В первом наборе входных данных: - Первый человек даёт \(1\) конфету третьему человеку;
- Второй человек даёт \(2\) конфеты первому человеку;
- Третий человек даёт \(1\) конфету второму человеку.
Тогда у всех трёх человек есть по \(3\) конфеты. Во втором наборе входных данных: - Пятый человек даёт \(4\) конфеты первому человеку, и теперь у первого человека есть \(5\) конфет;
- Первый человек даёт \(2\) конфеты третьему человеку;
- Третий человек даёт \(2\) конфеты пятому человеку;
- Четвёртый человек даёт \(2\) конфеты второму человеку;
- Второй человек даёт \(1\) конфету четвёртому человеку.
Тогда у всех трёх людей есть по \(3\) конфеты. Обратите внимание, что вначале первый человек не может дать \(2\) конфеты третьему человеку, потому что у него есть только \(a_1=1\) конфета. Но после того, как пятый человек дал ему \(4\) конфеты, он может это сделать, потому что сейчас у него есть \(1+4=5\) конфет. В третьем наборе входных данных невозможно сделать так, чтобы у всех людей было одинаковое количество конфет. В четвёртом наборе входных данных первый человек даёт второму человеку \(1024\) конфеты, и второй также даёт \(1024\) конфеты первому человеку.
| |
|
|
B2. Конфетная вечеринка (сложная версия)
битмаски
дп
жадные алгоритмы
Конструктив
математика
реализация
*2100
Это сложная версия задачи. Единственное отличие состоит в том, что в этой версии каждый должен дать конфеты не более чем одному человеку и получить конфеты не более чем от одного человека. Обратите внимание, что посылка не может пройти обе версии задачи одновременно. Вы можете делать взломы, только если обе версии задачи решены. После экзамена Daniel и его друзья собираются устроить вечеринку. Все придут с конфетами. На вечеринке будут присутствовать \(n\) человек. Изначально у \(i\)-го человека есть \(a_i\) конфет. Во время вечеринки они будут обмениваться конфетами. Для этого они выстроятся в произвольном порядке и каждый из них сделает следующее не более одного раза: - Выберет целое число \(p\) (\(1 \le p \le n\)) и неотрицательное целое число \(x\), затем даст \(2^{x}\) конфет \(p\)-му человеку. Заметим, что человек не может отдать больше конфет, чем у него есть в данный момент (он мог получить конфеты от кого-то другого), и он не может отдать конфеты самому себе.
Daniel любит справедливость, поэтому он будет счастлив тогда и только тогда, когда каждый получит конфеты от не более чем одного человека. В то же время его друг Tom любит среднее, поэтому он будет счастлив тогда и только тогда, когда у всех людей будет одинаковое количество конфет после всех обменов. Определите, существует ли способ обменяться конфетами так, чтобы Daniel и Tom были счастливы после обменов. Выходные данные Для каждого набора входных данных выведите «Yes» (без кавычек), если существует способ обменяться конфетами так, чтобы Daniel и Tom были счастливы, и выведите «No» (без кавычек) в противном случае. Вы можете вывести ответ в любом регистре (верхнем или нижнем). Например, строки «yEs», «yes», «Yes», и «YES» будут распознаны как положительный ответ. Примечание В первом наборе входных данных второй человек даёт \(1\) конфету первому человеку, поэтому у всех людей есть по \(3\) конфеты. Во втором наборе входных данных четвёртый человек даёт \(1\) конфету второму человеку, пятый человек даёт \(2\) конфеты первому человеку, третий человек ничего не делает. После всех обменов у каждого есть по \(3\) конфеты. В третьем наборе входных данных невозможно сделать так, чтобы у всех людей было одинаковое количество конфет. В четвёртом наборе входных данных двум людям не нужно ничего делать.
| |
|
|
B. Дружные массивы
битмаски
жадные алгоритмы
математика
*1200
Вам даны два массива целых чисел — \(a_1, \ldots, a_n\) длины \(n\), и \(b_1, \ldots, b_m\) длины \(m\). Вы можете выбрать любой элемент \(b_j\) из массива \(b\) (\(1 \leq j \leq m\)), и для всех \(1 \leq i \leq n\) сделать \(a_i = a_i | b_j\). Вы можете сделать произвольное число таких операций. После всех операций будет посчитано число \(x = a_1 \oplus a_2 \oplus \ldots \oplus a_n\). Найдите наименьшее и наибольшее значения \(x\), которые могли получиться после произвольного набора набора операций. Выше \(|\) обозначает операцию побитового ИЛИ (OR), а \(\oplus\) — операцию побитового исключающего ИЛИ (XOR). Выходные данные На каждый набор входных данных выведите \(2\) числа — наименьшее и наибольшее возможное значение \(x\) после произвольного набора операций. Примечание В первом наборе входных данных при применении операции с элементом \(b_1 = 1\) массив \(a\) станет равен \([1, 1]\), и \(x\) будет равен \(0\). Если не применять никаких операций, то \(x = 1\). Во втором наборе входных данных если не применять никаких операций, то \(x = 2\). Если применить операцию с \(b_1 = 1\), то \(a = [1, 1, 3]\), и \(x = 3\).
| |
|
|
E. Очередная задача на MEX
битмаски
дп
кратчайшие пути
Перебор
*2300
Вам дан массив целых чисел \(a\) размера \(n\). Вы можете выбрать некое множество непересекающихся подотрезков данного массива (заметим, что некоторые элементы могут не попасть ни в один из отрезков, это не запрещено), для каждого выбранного подотрезка посчитать MEX его элементов, а затем посчитать побитовое исключающее ИЛИ (XOR) всех полученных значений MEX. Какое наибольшее значение XOR может получиться? MEX (minimum excluded, минимальное отсутствующее) массива — это наименьшее целое неотрицательное целое число, которое не принадлежит массиву. Например: - MEX массива \([2,2,1]\) равен \(0\), потому что \(0\) не принадлежит массиву.
- MEX массива \([3,1,0,1]\) равен \(2\), потому что \(0\) и \(1\) принадлежат массиву, а \(2\) — нет.
- MEX массива \([0,3,1,2]\) равен \(4\), потому что \(0\), \(1\), \(2\) и \(3\) принадлежат массиву, а \(4\) — нет.
Выходные данные На каждый набор входных данных выведите одно число — наибольший возможный XOR значений MEX элементов выбранных отрезков. Примечание В первом наборе входных данных максимальный XOR равен \(2\), если взять весь массив, \(\operatorname{MEX}([1, 0]) = 2\). Во втором наборе входных данных максимальный XOR равен \(6\), если выделить отрезки \([1, 2, 0]\) и \([7, 1, 2, 0, 2, 4, 3]\): - \(\operatorname{MEX}([1, 2, 0]) = 3\),
- \(\operatorname{MEX}([7, 1, 2, 0, 2, 4, 3]) = 5\),
таким образом, побитовое исключающее ИЛИ равно \(5 \oplus 3=6\). В третьем наборе входных данных максимальный XOR равен \(7\), если выделить отрезки \([1, 0]\) и \([7, 1, 2, 0, 2, 4, 3]\): - \(\operatorname{MEX}([1, 0]) = 2\),
- \(\operatorname{MEX}([7, 1, 2, 0, 2, 4, 3]) = 5\),
таким образом, побитовое исключающее ИЛИ равно \(5 \oplus 2 = 7\).
| |
|
|
E. Фанат структур данных
Бинарный поиск
битмаски
дп
Структуры данных
*1500
Вам дан массив целых чисел \(a_1, a_2, \ldots, a_n\), а также бинарная строка\(^{\dagger}\) \(s\), состоящая из \(n\) символов Августин — большой фанат структур данных. Поэтому он попросил вас реализовать структуру данных, способную ответить на \(q\) запросов. Запросы бывают двух типов: - «1 \(l\) \(r\)» (\(1\le l \le r \le n\)) — для всех \(l \le i \le r\) заменить символ \(s_i\) на противоположный. То есть, заменить все \(\texttt{0}\) на \(\texttt{1}\), а все \(\texttt{1}\) на \(\texttt{0}\).
- «2 \(g\)» (\(g \in \{0, 1\}\)) — вычислить значение побитового XORа чисел \(a_i\) по всем индексам \(i\) таким, что \(s_i = g\). Обратите внимание, что \(\operatorname{XOR}\) от пустого набора чисел считается равным \(0\).
Пожалуйста, помогите Августину ответить на все запросы! Например, если \(n = 4\), \(a = [1, 2, 3, 6]\), \(s = \texttt{1001}\), рассмотрим серию запросов: - «2 \(0\)» — нас интересуют индексы \(i\), для которых \(s_i = \tt{0}\), так как \(s = \tt{1001}\) — это индексы \(2\) и \(3\), а значит, ответом на запрос будет \(a_2 \oplus a_3 = 2 \oplus 3 = 1\).
- «1 \(1\) \(3\)» — нужно заменить символы \(s_1, s_2, s_3\) на противоположные, таким образом до запроса \(s = \tt{1001}\), а после запроса: \(s = \tt{0111}\).
- «2 \(1\)» — нас интересуют индексы \(i\), для которых \(s_i = \tt{1}\), так как \(s = \tt{0111}\) — это индексы \(2\), \(3\) и \(4\), а значит, ответом на запрос будет \(a_2 \oplus a_3 \oplus a_4 = 2 \oplus 3 \oplus 6 = 7\).
- «1 \(2\) \(4\)» — \(s = \tt{0111}\) \(\to\) \(s = \tt{0000}\).
- «2 \(1\)» — \(s = \tt{0000}\), индексов с \(s_i = \tt{1}\) нет, а значит, так как \(\operatorname{XOR}\) от пустого набора чисел считается равным \(0\), ответ на этот запрос: \(0\).
\(^{\dagger}\) Бинарная строка — это строка, содержащая только символы \(\texttt{0}\) или \(\texttt{1}\). Выходные данные Для каждого набора входных данных, и для каждого запроса типа \(2\) в нём, выведите ответ на соответствующий запрос. Примечание Разберём первый набор входных данных примера: - «2 \(0\)» — нас интересуют индексы \(i\), для которых \(s_i = \tt{0}\), так как \(s = \tt{01000}\) — это индексы \(1, 3, 4\) и \(5\), а значит, ответом на запрос будет \(a_1 \oplus a_3 \oplus a_4 \oplus a_5 = 1 \oplus 3 \oplus 4 \oplus 5 = 3\).
- «2 \(1\)» — нас интересуют индексы \(i\), для которых \(s_i = \tt{1}\), так как \(s = \tt{01000}\) — единственный подходящий индекс: \(2\), а значит, ответом на запрос будет \(a_2 = 2\).
- «1 \(2\) \(4\)» — нужно заменить символы \(s_2, s_3, s_4\) на противоположные, таким образом до запроса \(s = \tt{01000}\), а после запроса: \(s = \tt{00110}\).
- «2 \(0\)» — нас интересуют индексы \(i\), для которых \(s_i = \tt{0}\), так как \(s = \tt{00110}\) — это индексы \(1, 2\) и \(5\), а значит, ответом на запрос будет \(a_1 \oplus a_2 \oplus a_5 = 1 \oplus 2 \oplus 5 = 6\).
- «2 \(1\)» — нас интересуют индексы \(i\) для которых \(s_i = \tt{1}\), так как \(s = \tt{00110}\) — это индексы \(3\) и \(4\), а значит ответом на запрос будет \(a_3 \oplus a_4 = 3 \oplus 4 = 7\).
- «1 \(1\) \(3\)» — \(s = \tt{00110}\) \(\to\) \(s = \tt{11010}\).
- «2 \(1\)» — нас интересуют индексы \(i\), для которых \(s_i = \tt{1}\), так как \(s = \tt{11010}\) — это индексы \(1, 2\) и \(4\), а значит, ответом на запрос будет \(a_1 \oplus a_2 \oplus a_4 = 1 \oplus 2 \oplus 4 = 7\).
| |
|
|
B. Медуза и математика
битмаски
графы
дп
кратчайшие пути
Перебор
поиск в глубину и подобное
*2400
Медузе даны целые неотрицательные числа \(a\), \(b\), \(c\), \(d\) и \(m\). Первоначально \((x,y)=(a,b)\). Медуза хочет выполнить несколько операций так, чтобы получилось \((x,y)=(c,d)\). Одна операция заключается в выполенении одного из следующих действий: - \(x := x\,\&\,y\),
- \(x := x\,|\,y\),
- \(y := x \oplus y\),
- \(y := y \oplus m\).
Здесь \(\&\) обозначает побитовую операцию И, \(|\) обозначает побитовую операцию ИЛИ, \(\oplus\) обозначает побитовое исключающее ИЛИ. Медуза хочет узнать минимальное количество операций, после которого можно получить \((x,y)=(c,d)\). Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество операций. Если требуемые значения не достижимы, то вместо этого выведите \(-1\). Примечание В первом наборе входных данных мы можем выполнить операцию \(y = x \oplus y\). Во втором наборе входных данных получить \((x,y)=(1,2)\) с помощью какой-либо последовательности операций невозможно. В третьем наборе входных данных можно выполнить операцию \(x = x\,\&\,y\), а после \(y = y \oplus m\).
| |
|
|
C. Медуза и зеленое яблоко
битмаски
жадные алгоритмы
математика
теория чисел
*1400
У медузы есть \(n\) кусочков зеленого яблока. Каждый кусочек весит \(1~\text{кг}\). Медуза хочет разделить эти кусочки зеленого яблока поровну между \(m\) людьми. У Медузы есть волшебный нож. Каждый раз Медуза может выбрать один кусок зеленого яблока и разделить его на два меньших куска, причем каждый кусок будет иметь массу, равную половине массы исходного куска. Медуза хочет узнать минимальное количество операций, необходимых для того, чтобы она могла разделить кусочки зеленого яблока так, чтобы общий вес кусочков яблока, полученных каждым человеком, был одинаковым. Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество операций, необходимых для того, чтобы разделить все зеленые яблоки поровну между \(m\) людьми. Если это невозможно сделать с помощью конечного числа операций, то вместо этого выведите \(-1\). Примечание В первом наборе входных данных нам не нужно делить кусочки яблок. Каждый человек получит \(2\) кусочка по \(1~\text{кг}\), а общий вес кусочков яблок, полученных каждым человеком, составит \(2~\text{кг}\). Во втором наборе входных данных разделить яблоки поровну с помощью конечного числа операций невозможно. В третьем наборе входных данных мы можем разделить два яблока массой \(1~\text{кг}\), получив \(4\) кусочка массой \(0,5~\text{кг}\). Каждый человек получит \(1\) кусочек яблока массой \(0,5~\text{кг}\) и \(2\) кусочка яблока массой \(1~\text{кг}\). Общий вес кусочков яблок, полученных каждым человеком, составляет \(2,5~\text{кг}\). В четвертом наборе входных данных сначала делим все \(3\) кусочка массой \(1~\text{кг}\), получая \(6\) кусочков массой \(0,5~\text{кг}\). Затем еще разделим два кусочка массой \(0,5~\text{кг}\), получив \(4\) кусочка массой \(0,25~\text{кг}\). Каждый человек получит \(1\) кусочек яблока массой \(0,5~\text{кг}\) и \(1\) кусочек яблока массой \(0,25~\text{кг}\). Общий вес яблок, полученных каждым человеком, составляет \(0,75~\text{кг}\).
| |
|
|
E. Ива и Пав
Бинарный поиск
битмаски
жадные алгоритмы
Структуры данных
*1400
Ива дала Паву массив \(a\) из \(n\) элементов. Пусть \(f(l, r) = a_l \ \& \ a_{l+1} \ \& \dots \& \ a_r\) (здесь \(\&\) обозначает побитовое И). Обратите внимание, что \(f(l, r)\) не определено, если \(l>r\). Ива также дала Паву \(q\) запросов. Каждый запрос состоит из 2 чисел, \(k\) и \(l\), и она хочет, чтобы Пав нашел наибольший индекс \(r\) (\(l \le r \le n\)), такой что \(f(l, r) \ge k\). Пав хочет решить эту задачу быстро, потому что он не хочет расстроить Иву. Он нуждается в вашей помощи. Выходные данные Для каждого запроса выведите максимальный индекс \(r\) (\(l \le r \le n\)) такой, что \(a_l \ \& \ a_{l+1} \ \& \dots \& \ a_r \ \ge \ k\). Если такого \(r\) не существует, выведите \(-1\). Примечание В первом наборе примера \(n=5\), и массив \(a = [15, 14, 17, 42, 34]\) Первый запрос просит найти наибольший индекс \(r\), такой что \(f(1, r) \ge 7\). \(f(1,1) = 15, \ f(1, 2) = 14, \ f(1,3)=0 \ f(1, 4)=0 \ f(1, 5)=0\), поэтому ответ \(r=2\). Второй запрос просит найти \(f(2, r) \ge 15\). Поскольку такой \(r\) не существует, ответ \(-1\). Третий запрос просит найти \(f(4, r) \ge 5\). \(f(4, 4) = 42, \ f(4, 5) = 34\), поэтому ответ \(r=5\). Во втором наборе примера \(n=5\), и массив \(a= [7, 5, 3, 1, 7]\). Для первого запроса, \(f(1, r) \ge 7\). \(f(1, 1)=7, \ f(1, 2)=5, \ f(1, 3) = 1, \ f(1,4) = 1, \ f(1, 5)=1\), поэтому ответ на этот запрос \(1\). Для второго запроса, \(f(5, r) \ge 7\). \(f(5, 5) = 7\), поэтому ответ \(5\). Для третьего запроса, \(f(2, r) \ge 3\). \(f(2, 2) = 5, \ f(2, 3) = 1, \ f(2, 4) = 1, \ f(2, 5) = 1\), поэтому ответ \(2\).
| |
|
|
G. Дерево wxhtzdy ORO
Бинарный поиск
битмаски
Деревья
Перебор
поиск в глубину и подобное
реализация
Структуры данных
*2300
После (наконец-то) прохождения отбора на IOI 2023, wxhtzdy был очень счастлив и решил сделать то, что делают многие люди: попытаться угадать задачи, которые будут на IOI. В процессе этого он случайно создал задачу, которая, по его мнению, была очень крутой. Дано дерево (связный ациклический граф) с \(n\) вершинами и \(n-1\) ребром. Вершине \(i\) (\(1 \le i \le n\)) соответствует значение \(a_i\). Пусть \(g(u, v)\) - это побитовое ИЛИ значений всех вершин на кратчайшем пути от \(u\) до \(v\). Например, если мы хотим вычислить \(g(3, 4)\) на дереве из первого набора данных примера. На пути от \(3\) до \(4\) находятся вершины \(3\), \(1\), \(4\). Тогда \(g(3, 4) = a_3 \ | \ a_1 \ | \ a_4\) (здесь \(|\) обозначает побитовое ИЛИ). Также дано \(q\) запросов, и каждый запрос выглядит следующим образом: Вам даны \(x\) и \(y\). Рассмотрим все вершины \(z\) такие, что \(z\) находится на кратчайшем пути от \(x\) до \(y\) (включительно). Определим красоту вершины \(z\) как сумму количества ненулевых битов в \(g(x, z)\) и количества ненулевых битов в \(g(y, z)\). Вам нужно найти максимальную красоту среди всех вершин \(z\) на кратчайшем пути от \(x\) до \(y\). Так как его мозг очень устал после решения output only задачи на SIO (он должен был это сделать, чтобы пройти отбор на IOI), он хочет вашей помощи в этой задаче. Выходные данные Для каждого набора входных данных выведите \(q\) целых чисел, каждое из которых является ответом на соответствующий запрос. Примечание На изображении ниже показано дерево из первого набора входных данных второго примера. Дерево из первого набора входных данных второго примера. В первом запросе \(x=7\), \(y=5\). Самый короткий путь от \(7\) до \(5\) это \(7-4-2-1-5\). Давайте вычислим красоту вершины \(7\) на этом пути. У нас есть \(g(7,7)=a_7=10=(1010)_2\) и \(g(5,7)=a_5 \ | \ a_1 \ | \ a_2 \ | \ a_4 \ | \ a_7=10 \ | \ 4 \ | \ 7 \ | \ 4 \ | \ 10=15=(1111)_2\), поэтому ее красота равна \(2 + 4 = 6\). Теперь давайте вычислим красоту вершины \(4\) на этом пути. У нас есть \(g(7,4)=a_7 \ | \ a_4=10 \ | \ 4=14=(1110)_2\) и \(g(5,4)=a_5 \ | \ a_1 \ | \ a_2 \ | \ a_4=10 \ | \ 4 \ | \ 7 \ | \ 4=15=(1111)_2\), поэтому ее красота равна \(3 + 4 = 7\). Теперь давайте вычислим красоту вершины \(2\) на этом пути. У нас есть \(g(7,2)=a_7 \ | \ a_4 \ | \ a_2=10 \ | \ 4 \ | \ 7=15=(1111)_2\) и \(g(5,2)=a_5 \ | \ a_1 \ | \ a_2=10 \ | \ 4 \ | \ 7=15=(1111)_2\), поэтому ее красота равна \(4 + 4 = 8\). Теперь давайте вычислим красоту вершины \(1\) на этом пути. У нас есть \(g(7,1)=a_7 \ | \ a_4 \ | \ a_2 \ | \ a_1=10 \ | \ 4 \ | \ 7 \ | \ 4=15=(1111)_2\) и \(g(5,1)=a_5 \ | \ a_1=10 \ | \ 4=14=(1110)_2\), поэтому ее красота равна \(4 + 3 = 7\). Наконец, давайте вычислим красоту вершины \(5\) на этом пути. У нас есть \(g(7,5)=a_7 \ | \ a_4 \ | \ a_2 \ | \ a_1 \ | \ a_5=10 \ | \ 4 \ | \ 7 \ | \ 4 \ | \ 10=15=(1111)_2\) и \(g(5,5)=a_5=10=(1010)_2\), поэтому ее красота равна \(4 + 2 = 6\). Максимальная красота на этом пути у вершины \(2\), и она равна \(8\).
| |
|
|
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\).
| |
|
|
B. Объединение множеств
битмаски
жадные алгоритмы
Конструктив
Перебор
*1300
Даны \(n\) множеств \(S_{1}, S_{2}, \ldots, S_{n}\), состоящих из целых чисел. Назовём множество \(S\) доступным, если можно выбрать некоторые из множеств \(S_{1}, S_{2}, \ldots, S_{n}\) (возможно, ни одного) так, что \(S\) равно их объединению\(^{\dagger}\). Если ни одно из множеств \(S_{1}, S_{2}, \ldots, S_{n}\) не выбрано, то объединение равно пустому множеству. Найдите наибольшее возможное число элементов в доступном \(S\), таком что \(S \neq S_{1} \cup S_{2} \cup \ldots \cup S_{n}\). \(^{\dagger}\) Объединение множеств \(A_1, A_2, \ldots, A_k\) определяется как множество элементов, присутствующих по крайней мере в одном из этих множеств. Результат обозначается через \(A_1 \cup A_2 \cup \ldots \cup A_k\). Например, \(\{2, 4, 6\} \cup \{2, 3\} \cup \{3, 6, 7\} = \{2, 3, 4, 6, 7\}\). Выходные данные Для каждого набора входных данных выведите одно число — наибольшее возможное число элементов в доступном \(S\), таком что \(S \neq S_{1} \cup S_{2} \cup \ldots \cup S_{n}\). Примечание В первом наборе входных данных \(S = S_{1} \cup S_{3} = \{1, 2, 3, 4\}\) — самое большое доступное множество, не равное \(S_1 \cup S_2 \cup S_3 = \{1, 2, 3, 4, 5\}\). Во втором наборе входных данных можно выбрать \(S = S_{2} \cup S_{3} \cup S_{4} = \{2, 3, 4, 5, 6\}\). В третьем наборе входных данных можно выбрать \(S = S_{2} \cup S_{5} = S_{2} \cup S_{3} \cup S_{5} = \{3, 5, 6, 8, 9, 10\}\). В четвёртом наборе входных данных единственным доступным множеством является \(S = \varnothing\).
| |
|
|
D. XOR на дереве
битмаски
Деревья
дп
жадные алгоритмы
поиск в глубину и подобное
*1900
Дано дерево с \(n\) вершинами, пронумерованными от \(1\) до \(n\). В вершине \(i\) записано целое число \(a_{i}\) для каждого \(i = 1, 2, \ldots, n\). Ваша цель — сделать все \(a_{i}\) одинаковыми, выполнив несколько заклинаний (возможно, ни одного). Предположим, что корнем дерева выбрана некоторая вершина. Чтобы выполнить заклинание, можно выбрать произвольную вершину \(v\) и произвольное неотрицательное целое число \(c\). Затем для каждой вершины \(i\) в поддереве\(^{\dagger}\) \(v\) нужно заменить \(a_{i}\) на \(a_{i} \oplus c\). Стоимость такого заклинания равна \(s \cdot c\), где \(s\) — число вершин в поддереве. Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Пусть \(m_r\) — минимально возможная суммарная стоимость, за которую можно сделать все \(a_i\) равными, в случае если вершина \(r\) выбрана корнем дерева. Найдите \(m_{1}, m_{2}, \ldots, m_{n}\). \(^{\dagger}\) Пусть вершина \(r\) выбрана корнем дерева. Тогда вершина \(i\) принадлежит поддереву \(v\), если простой путь от \(i\) до \(r\) содержит \(v\). Выходные данные Для каждого набора входных данных выведите \(m_1, m_2, \ldots, m_n\) на отдельной строке. Примечание В первом наборе входных данных, чтобы найти \(m_1\), подвесим дерево за вершину \(1\). - На первом заклинании выберем \(v=2\) и \(c=1\). После выполнения этого заклинания \(a\) станет равным \([3, 3, 0, 1]\). Стоимость этого заклинания равна \(3\).
- На втором заклинании выберем \(v=3\) и \(c=3\). После выполнения этого заклинания \(a\) станет равным \([3, 3, 3, 1]\). Стоимость этого заклинания равна \(3\).
- На третьем заклинании выберем \(v=4\) и \(c=2\). После выполнения этого заклинания \(a\) станет равным \([3, 3, 3, 3]\). Стоимость этого заклинания равна \(2\).
Теперь все значения в массиве \(a\) одинаковы, а суммарная стоимость равна \(3 + 3 + 2 = 8\). Значения \(m_2\), \(m_3\), \(m_4\) находятся аналогично. Во втором наборе входных данных цель уже достигнута, поскольку в дереве всего одна вершина.
| |
|
|
E. Оглянись
битмаски
жадные алгоритмы
*1700
Вам дан массив целых чисел \(a_1, a_2, \ldots, a_n\). Вам нужно сделать его неубывающим за наименьшее количество операций. За одну операцию вы делаете следующее: - Выберите индекс \(1 \leq i \leq n\),
- Сделайте \(a_i = a_i \cdot 2\).
Массив \(b_1, b_2, \ldots, b_n\) является неубывающим, если \(b_i \leq b_{i+1}\) для всех \(1 \leq i < n\). Выходные данные Для каждого набора входных данных выведите наименьшее количество операций, которое нужно сделать, чтобы массив стал неубывающим. Примечание В первом наборе входных данных операции не нужно делать. Во втором наборе входных данных нужно выбрать \(i = 2\), после чего массив будет равен \([2, 2]\). В третьем наборе входных данных можно применить следующие операции: - Выбрать \(i = 3\), после чего массив будет равен \([3, 2, 2]\),
- Выбрать \(i = 3\), после чего массив будет равен \([3, 2, 4]\),
- Выбрать \(i = 2\), после чего массив будет равен \([3, 4, 4]\).
| |
|
|
E. I Wanna be the Team Leader
битмаски
дп
жадные алгоритмы
Конструктив
математика
сортировки
*2400
Монокарп является руководителем команды в крупной IT-компании. Его команде программистов поручены \(m\) проектов, пронумерованных от \(1\) до \(m\). У \(i\)-го проекта уровень сложности \(b_i\). В команде \(n\) программистов, пронумерованных от \(1\) до \(n\). У \(j\)-го программиста уровень стрессоустойчивости \(a_j\). Монокарп хочет назначить программистов на проекты таким образом, чтобы: - каждый программист был назначен на не более чем один проект;
- на каждый проект был назначен хотя бы один программист;
- пусть на \(i\)-й проект назначены \(k\) программистов; тогда все назначенные программисты должны иметь уровень стрессоустойчивости, больший или равный \(\frac{b_i}{k}\).
Помогите Монокарпу назначить программистов на проекты. Если есть несколько ответов, выведите любой из них. Выходные данные Если нельзя назначить программистов, выведите «NO». В противном случае, в первой строке выведите «YES». В \(i\)-й из следующих \(m\) строк выведите список программистов, назначенных на \(i\)-й проект: сначала количество программистов, затем их индексы в произвольном порядке. Если есть несколько ответов, выведите любой из них.
| |
|
|
D. XOR-конструктив
битмаски
Деревья
Конструктив
математика
строковые суфф. структуры
Структуры данных
*1900
Даны \(n-1\) целых чисел \(a_1, a_2, \dots, a_{n-1}\). Ваша задача — построить массив \(b_1, b_2, \dots, b_n\) такой, что: - каждое целое число от \(0\) до \(n-1\) встречается в \(b\) ровно один раз;
- для каждого \(i\) от \(1\) до \(n-1\), \(b_i \oplus b_{i+1} = a_i\) (где \(\oplus\) обозначает побитовое исключающее ИЛИ).
Выходные данные Выведите \(n\) целых чисел \(b_1, b_2, \dots, b_n\). Если существует несколько массивов, подходящих под условие задачи, вы можете вывести любой из них.
| |
|
|
D. НОД меньших
битмаски
дп
математика
Перебор
теория чисел
*2000
Пусть \(a\), \(b\) и \(c\) — целые числа. Определим функцию \(f(a, b, c)\) следующим образом. Упорядочить числа \(a\), \(b\), \(c\) таким образом, чтобы выполнялось \(a \le b \le c\). Затем вернуть \(\gcd(a, b)\), где \(\gcd(a, b)\) обозначает наибольший общий делитель (НОД) чисел \(a\) и \(b\). Иными словами, мы берем \(\gcd\) из \(2\) меньших значений и игнорируем наибольшее. Вам дан массив \(a\) длины \(n\). Вычислите сумму \(f(a_i, a_j, a_k)\) для всех \(i\), \(j\), \(k\) таких, что \(1 \le i < j < k \le n\). Более формально, вычислите \(\)\sum_{i = 1}^n \sum_{j = i+1}^n \sum_{k =j +1}^n f(a_i, a_j, a_k).\(\) Выходные данные Для каждого набора входных данных выведите одно число — сумму из условия. Примечание В первом наборе входных данных значения \(f\) следующие: - \(i=1\), \(j=2\), \(k=3\), \(f(a_i,a_j,a_k)=f(2,3,6)=\gcd(2,3)=1\);
- \(i=1\), \(j=2\), \(k=4\), \(f(a_i,a_j,a_k)=f(2,3,12)=\gcd(2,3)=1\);
- \(i=1\), \(j=2\), \(k=5\), \(f(a_i,a_j,a_k)=f(2,3,17)=\gcd(2,3)=1\);
- \(i=1\), \(j=3\), \(k=4\), \(f(a_i,a_j,a_k)=f(2,6,12)=\gcd(2,6)=2\);
- \(i=1\), \(j=3\), \(k=5\), \(f(a_i,a_j,a_k)=f(2,6,17)=\gcd(2,6)=2\);
- \(i=1\), \(j=4\), \(k=5\), \(f(a_i,a_j,a_k)=f(2,12,17)=\gcd(2,12)=2\)
- \(i=2\), \(j=3\), \(k=4\), \(f(a_i,a_j,a_k)=f(3,6,12)=\gcd(3,6)=3\);
- \(i=2\), \(j=3\), \(k=5\), \(f(a_i,a_j,a_k)=f(3,6,17)=\gcd(3,6)=3\);
- \(i=2\), \(j=4\), \(k=5\), \(f(a_i,a_j,a_k)=f(3,12,17)=\gcd(3,12)=3\);
- \(i=3\), \(j=4\), \(k=5\), \(f(a_i,a_j,a_k)=f(6,12,17)=\gcd(6,12)=6\).
Сумма по всем тройкам равна \(1+1+1+2+2+2+3+3+3+6=24\). Во втором наборе входных данных существует \(56\) способов выбора значений \(i\), \(j\), \(k\). Сумма по всем \(f(a_i,a_j,a_k)\) равна \(203\).
| |
|
|
B. ХранИЛИще
битмаски
жадные алгоритмы
Конструктив
Перебор
*1200
На Кипре стоит довольно жаркая погода. Поэтому Теофанис увидел в этом возможность создать компанию по производству мороженого. Он хранит мороженое в безопасности от других производителей мороженого, запирая его в больших складских помещениях. Однако он забыл пароль. К счастью, у замка есть специальная функция для забывчивых людей! Дана таблица \(M\) с \(n\) строками и \(n\) столбцами неотрицательных целых чисел, и, чтобы открыть замок, вам нужно найти массив \(a\) из \(n\) элементов такой, что: - \(0 \le a_i < 2^{30}\), и
- \(M_{i,j} = a_i | a_j\) для всех \(i \neq j\), где \(|\) обозначает операцию побитового ИЛИ.
Замок может иногда выдавать таблицы, для которых нет решения. В этом случае мороженое останется замороженным до конца времен. Сможете ли вы найти массив, чтобы открыть замок? Выходные данные Для каждого набора входных данных, если существует решение, выведите в отдельных строках YES и искомый массив, в противном случае выведите NO. Если существует несколько решений, выведите любое из них. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.
| |
|
|
D1. Максимум и запросы (простая версия)
Бинарный поиск
битмаски
жадные алгоритмы
Перебор
*1700
Это простая версия задачи. Единственное различие между двумя версиями — это ограничения на \(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. Максимум и запросы (сложная версия)
битмаски
дп
жадные алгоритмы
разделяй и властвуй
*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\).
| |
|
|
B. Button Pressing
битмаски
Конструктив
хэши
*2600
You are given \(N\) buttons (numbered from \(1\) to \(N\)) and \(N\) lamps (numbered from \(1\) to \(N\)). Each lamp can either be on or off. Initially, lamp \(i\) is on if \(A_i = 1\), and off if \(A_i = 0\). Button \(i\) is connected to lamp \(i - 1\) (if \(i > 1\)) and lamp \(i + 1\) (if \(i < N\)). In one move, you can press a button \(i\) only if lamp \(i\) is on. When a button is pressed, the state of the lamps connected to this button is toggled. Formally, the lamps will be on if it was off previously, and the lamps will be off if it was on previously. Note that lamp \(i\) is not connected to button \(i\), thus, the state of lamp \(i\) does not change if button \(i\) is pressed. After zero or more moves, you want lamp \(i\) to be on if \(B_i = 1\), and off if \(B_i = 0\). Determine if it is possible to achieve this task. Output For each test case, output YES in a single line if the final state of all lamps can be reached after zero or more moves, or NO otherwise. Note Explanation for the sample input/output #1 For the first test case, by pressing the buttons \(4, 2, 4, 3, 1, 2\) in sequence, the condition of the buttons changes as: \(0101 \rightarrow 0111 \rightarrow 1101 \rightarrow 1111 \rightarrow 1010 \rightarrow 1110 \rightarrow 0100\). For the second test case, you are unable to press any button, hence it is impossible to reach the final state.
| |
|
|
B. Сделать почти равными по модулю
битмаски
Конструктив
математика
теория чисел
*1200
Вам дан массив различных целых положительных чисел \(a_1, a_2, \dots, a_n\). Вы должны выполнить следующую операцию ровно один раз: - выбрать целое положительное число \(k\);
- для каждого \(i\) от \(1\) до \(n\) заменить \(a_i\) на \(a_i \text{ mod } k^\dagger\).
Найдите такое значение \(k\), такое что \(1 \leq k \leq 10^{18}\), чтобы массив \(a_1, a_2, \dots, a_n\) содержал ровно \(2\) различных значения после применения операции. Можно показать, что при ограничениях задачи хотя бы одно такое \(k\) всегда существует. Если существует несколько решений, выведите любое из них. \(^\dagger\) \(a \text{ mod } b\) обозначает остаток от деления \(a\) на \(b\). Например: - \(7 \text{ mod } 3=1\), так как \(7 = 3 \cdot 2 + 1\)
- \(15 \text{ mod } 4=3\), так как \(15 = 4 \cdot 3 + 3\)
- \(21 \text{ mod } 1=0\), так как \(21 = 21 \cdot 1 + 0\)
Выходные данные Для каждого набора входных данных выведите одно целое число: значение \(k\) (\(1 \leq k \leq 10^{18}\)) такое, что массив \(a_1, a_2, \dots, a_n\) будет содержать ровно \(2\) различных значения после применения операции. Примечание В первом наборе входных данных можно выбрать \(k = 7\). Массив станет равным \([8 \text{ mod } 7, 15 \text{ mod } 7, 22 \text{ mod } 7, 30 \text{ mod } 7] = [1, 1, 1, 2]\) и будет содержать ровно \(2\) различных значения (\(\{1, 2\}\)). Во втором наборе входных данных можно выбрать \(k = 30\). Массив станет равным \([0, 0, 8, 0, 8]\), то есть будет содержать ровно \(2\) различных значения (\(\{0, 8\}\)). Заметим, что выбор \(k = 10\) также будет корректным решением. В последнем наборе входных данных можно выбрать \(k = 10^{18}\). Массив станет равным \([2, 1]\) и будет содержать ровно \(2\) различных значения (\(\{1, 2\}\)). Заметим, что выбор \(k = 10^{18} + 1\) не будет корректным, так как должно выполняться \(1 \leq k \leq 10^{18}\).
| |
|
|
E. Несколько ламп
битмаски
Конструктив
математика
Перебор
теория чисел
*2400
У вас есть \(n\) ламп, пронумерованных от \(1\) до \(n\). Изначально все лампы выключены. У вас также есть \(n\) кнопок. Кнопка \(i\) переключает все лампы, чей индекс кратен \(i\). Когда лампа переключается, если она была выключена, то она включается, а если была включена, то выключается. Вы должны нажать несколько кнопок в соответствии со следующими правилами. - Вы должны нажать хотя бы одну кнопку.
- Вы не можете нажимать одну и ту же кнопку несколько раз.
- Вам даны \(m\) пар \((u_i, v_i)\). Если вы нажмете кнопку \(u_i\), вы также должны нажать кнопку \(v_i\) (либо до, либо после нажатия кнопки \(u_i\)). Обратите внимание, что если вы нажимаете кнопку \(v_i\), то вам не нужно нажимать кнопку \(u_i\).
Вы не хотите тратить слишком много электричества. Найдите способ нажимать кнопки так, чтобы в конце горело не более \(\lfloor n/5 \rfloor\) ламп, или выведите \(-1\), если это невозможно. Выходные данные Для каждого набора входных данных: - Если не существует набора кнопок, после нажатия на которые горят не более \(\lfloor n/5 \rfloor\) ламп, выведите одну строку, содержащую \(-1\).
- В противном случае выведите две строки. Первая строка должна содержать целое число \(k\) (\(1 \le k \le n\)) — количество нажатых кнопок. Вторая строка должна содержать \(k\) целых чисел \(b_1, b_2, \dots, b_k\) (\(1 \le b_i \le n\)) — индексы нажатых кнопок (в любом порядке). Индексы \(b_i\) должны быть различными, и в конце должно быть включено не более \(\lfloor n/5 \rfloor\) ламп.
Примечание В первом наборе входных данных требуется оставить включенными не более \(\lfloor 4/5 \rfloor\) ламп, а это значит, что ни одна лампа не может остаться включенной в конце. Можно показать, что при нажатии хотя бы одной кнопки в конце не может оказаться \(0\) включенных ламп. Во втором наборе входных данных можно нажать кнопки \(3\), \(5\), \(1\), \(2\). - Изначально все лампы выключены;
- после нажатия кнопки \(3\), лампы, чей индекс кратен \(3\) (т.е. \(3\)), переключаются, так что лампа \(3\) включается;
- после нажатия кнопки \(5\), лампы, чей индекс кратен \(5\) (т.е. \(5\)) переключаются, поэтому лампы \(3\), \(5\) включены;
- после нажатия кнопки \(1\), лампы, чей индекс кратен \(1\) (т.е. \(1\), \(2\), \(3\), \(4\), \(5\)) переключаются, поэтому становятся включенными лампы \(1\), \(2\), \(4\);
- после нажатия кнопки \(2\), лампы, чей индекс кратен \(2\) (т.е. \(2\), \(4\)) переключаются, поэтому остается включенной только лампа \(1\).
Это решение корректно, потому что - вы нажали хотя бы одну кнопку;
- вы нажали каждую кнопку не более одного раза;
- вы нажали кнопку \(u_2 = 5\), что означает, что вы должны были также нажать кнопку \(v_2 = 1\), и кнопка \(1\) была нажата;
- в конце горит только лампа \(1\).
В третьем наборе входных данных нажатие кнопок \(8\), \(9\), \(10\) включает только лампы \(8\), \(9\), \(10\).
| |
|
|
C. Игра с мультимножеством
Бинарный поиск
битмаски
жадные алгоритмы
Перебор
*1300
В этой задаче вам изначально дано пустое мультимножество. Вам нужно обработать два типа запросов: - ADD \(x\) — добавить элемент, равный \(2^{x}\), в мультимножество;
- GET \(w\) — сказать, возможно ли взять сумму некоторого подмножества текущего мультимножества и получить значение, равное \(w\).
Выходные данные Для каждого запроса GET выведите YES, если возможно выбрать подмножество с суммой, равной \(w\), или NO, если это невозможно.
| |
|
|
A. Выброс
битмаски
реализация
*800
Вам даны три цифры \(a\), \(b\), \(c\). Две из них равны, но третья отличается от остальных двух. Найдите значение, которое встречается ровно один раз. Выходные данные Для каждого набора входных данных выведите значение, которое встречается ровно один раз.
| |
|
|
B. Не совсем латинский квадрат
битмаски
Перебор
реализация
*800
Латинский квадрат — это сетка \(3 \times 3\), состоящая из букв \(\texttt{A}\), \(\texttt{B}\) и \(\texttt{C}\) таким образом, что: - в каждой строке буквы \(\texttt{A}\), \(\texttt{B}\) и \(\texttt{C}\) появляются по одному разу, и
- в каждом столбце буквы \(\texttt{A}\), \(\texttt{B}\) и \(\texttt{C}\) появляются по одному разу.
Например, один из возможных латинских квадратов показан ниже. \(\)\begin{bmatrix} \texttt{A} & \texttt{B} & \texttt{C} \\ \texttt{C} & \texttt{A} & \texttt{B} \\ \texttt{B} & \texttt{C} & \texttt{A} \\ \end{bmatrix} \(\)Вам дан латинский квадрат, но одна из букв была заменена вопросительным знаком \(\texttt{?}\). Найдите букву, которая была заменена. Выходные данные Для каждого набора входных данных выведите букву, которая была заменена. Примечание Правильные латинские квадраты для наборов входных данных примера показаны ниже: \(\)\begin{bmatrix} \texttt{A} & \texttt{B} & \texttt{C} \\ \texttt{C} & \color{red}{\texttt{A}} & \texttt{B} \\ \texttt{B} & \texttt{C} & \texttt{A} \\ \end{bmatrix} \quad \begin{bmatrix} \texttt{B} & \texttt{C} & \texttt{A} \\ \texttt{C} & \texttt{A} & \color{red}{\texttt{B}} \\ \texttt{A} & \texttt{B} & \texttt{C} \\ \end{bmatrix} \quad \begin{bmatrix} \color{red}{\texttt{C}} & \texttt{A} & \texttt{B} \\ \texttt{B} & \texttt{C} & \texttt{A} \\ \texttt{A} & \texttt{B} & \texttt{C} \\ \end{bmatrix}\(\)
| |
|
|
F. Постройте дерево
битмаски
Деревья
дп
Конструктив
*2500
Вам дан массив целых чисел \(l_1, l_2, \dots, l_n\) и целое число \(d\). Можно ли построить дерево, удовлетворяющее следующим трем условиям? - Дерево содержит \(n + 1\) вершину.
- Длина \(i\)-го ребра равна \(l_i\).
- (Взвешенный) диаметр дерева равен \(d\).
Выходные данные Для каждого набора входных данных выведите \(\texttt{Yes}\), если возможно построить дерево, удовлетворяющее всем условиям, и \(\texttt{No}\) в противном случае. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание Ниже приведены иллюстрации деревьев для первого и третьего наборов входных данных. Один из диаметров выделен путем окрашивания его ребер в красный цвет.
| |
|
|
C. XOR-расстояние
битмаски
жадные алгоритмы
математика
реализация
*1400
Вам даны целые числа \(a\), \(b\), \(r\). Найдите наименьшее значение величины \(|({a \oplus x}) - ({b \oplus x})|\) по всем \(0 \leq x \leq r\). \(\oplus\) это операция побитового исключающего ИЛИ, а \(|y|\) — абсолютная величина числа \(y\). Выходные данные Для каждого набора входных данных выведите одно число — наименьшее возможное значение. Примечание В первом тесте \(r = 0\), то есть \(x\) точно равен \(0\), поэтому ответ \(|{4 \oplus 0} - {6 \oplus 0}| = |4 - 6| = 2\). Во втором тесте: - при \(x = 0\), \(|{0 \oplus 0} - {3 \oplus 0}| = |0 - 3| = 3\);
- при \(x = 1\), \(|{0 \oplus 1} - {3 \oplus 1}| = |1 - 2| = 1\);
- при \(x = 2\), \(|{0 \oplus 2} - {3 \oplus 2}| = |2 - 1| = 1\).
Следовательно, ответ равен \(1\). В третьем тесте минимум достигается при \(x = 1\).
| |
|
|
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]\).
| |
|
|
D. Влад и разделение
битмаски
жадные алгоритмы
*1300
У Владислава есть \(n\) неотрицательных целых чисел, и он хочет разделить их все на несколько групп так, чтобы в любой группе любая пара чисел не имела совпадающих значений битов среди битов от \(1\)-го до \(31\)-го (то есть рассматриваем \(31\) младший бит двоичной записи). Для целого числа \(k\) пусть \(k_2(i)\) обозначает \(i\)-й бит в его двоичном представлении (справа налево, индексация с 1). Например, если \(k=43\), так как \(43=101011_2\), то \(43_2(1)=1\), \(43_2(2)=1\), \(43_2(3)=0\), \(43_2(4)=1\), \(43_2(5)=0\), \(43_2(6)=1\), \(43_2(7)=0\), \(43_2(8)=0, \dots, 43_2(31)=0\). Формально, для любых двух чисел \(x\) и \(y\) в группе должно выполняться условие \(x_2(i) \neq y_2(i)\) для всех \(1 \leq i < 32\). Какое минимальное количество групп Владу нужно, чтобы достичь своей цели? Каждое число должно попасть ровно в одну группу. Выходные данные Для каждого теста выведите одно целое число — минимальное количество групп, необходимое для удовлетворения условия. Примечание В первом наборе входных данных любые два числа имеют одинаковые биты среди последних \(31\) бит, поэтому нам нужно поместить каждое число в свою собственную группу. Во втором наборе входных данных \(a_1=0000000000000000000000000000000_2\), \(a_2=1111111111111111111111111111111_2\), таким образом, их можно поместить в одну группу, так как \(a_1(i) \ne a_2(i)\) для всех \(i\) от \(1\) до \(31\), включительно.
| |
|
|
E. Влад и нечётное упорядочение
Бинарный поиск
битмаски
дп
математика
реализация
Структуры данных
теория чисел
*1500
У Владислава есть \(n\) карт с номерами \(1, 2, \dots, n\). Он хочет выложить их в ряд следующим образом: - Сначала он выкладывает все карты с нечетными номерами от наименьшего к наибольшему.
- Затем он выкладывает все карты, которые являются удвоенными нечетными числами, от наименьшего к наибольшему (т.е., \(2\) умноженное на нечётное число).
- Затем он выкладывает все карты, которые являются нечетными числами, умноженными на \(3\), от наименьшего к наибольшему (т.е., \(3\) умноженное на нечётное число).
- Затем он выкладывает все карты, которые являются нечетными числами, умноженными на \(4\), от наименьшего к наибольшему (т.е., \(4\) умноженное на нечётное число).
- И так далее, пока все карты не будут выложены.
Какая карта будет \(k\)-й, которую он выложит в этом процессе? После того, как Влад положил карту, он не может использовать ее снова. Выходные данные Для каждого набора входных данных выведите одно целое число — \(k\)-ю карту, которую выложит Влад. Примечание В первых семи наборах входных данных примера \(n=7\). Влад выкладывает карты следующим образом: - Сначала — все карты с нечетными номерами в порядке \(1\), \(3\), \(5\), \(7\).
- Затем — все карты, которые являются удвоенными нечетными числами, в порядке \(2\), \(6\).
- Затем нет оставшихся карт, которые являются нечетными числами, умноженными на \(3\). (У Влада есть только по одной карте каждого числа.)
- Затем — все карты, которые являются нечетными числами, умноженными на \(4\), и есть только одна такая карта: \(4\).
- Больше карт не осталось, поэтому Влад останавливается.
Таким образом, порядок карт будет \(1\), \(3\), \(5\), \(7\), \(2\), \(6\), \(4\).
| |
|
|
F. Влад и избегание X
битмаски
дп
Перебор
поиск в глубину и подобное
реализация
*2200
У Владислава есть квадратное клетчатое поле размером \(7 \times 7\), где каждая клетка окрашена в черный или белый цвет. За одну операцию можно выбрать любую клетку и изменить её цвет (черный \(\leftrightarrow\) белый). Найдите минимальное количество операций, необходимых для того, чтобы гарантировать, что нет черных клеток, у которых все четыре диагональных соседа также черные.  На левом изображении показано, что изначально есть две черные клетки, нарушающие условие. Переворачивая одну клетку, поле будет соответствовать требованию. Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество операций, необходимых для того, чтобы гарантировать, что нет черных клеток, у которых все четыре диагональных соседа также черные. Примечание Первый набор входных данных изображен в условии. Второй набор входных данных изображен ниже: В третьем наборе входных данных поле уже удовлетворяет условию.
| |
|
|
E. Саша и веселая нарезка дерева
битмаски
графы
Деревья
дп
жадные алгоритмы
математика
Перебор
поиск в глубину и подобное
*2300
Саше за победу на очередной олимпиаде подарили дерево\(^{\dagger}\) из \(n\) вершин. Но, вернувшись домой после празднования очередной победы, он заметил его потерю. Саша помнит, что он покрасил некоторые рёбра этого дерева. При этом он точно знает, что для любой из \(k\) пар вершин \((a_1, b_1), \ldots, (a_k, b_k)\) он покрасил хотя бы одно ребро на простом пути\(^{\ddagger}\) между вершинами \(a_i\) и \(b_i\). Саша не помнит, сколько рёбер он точно покрасил, так что он просит вас сказать, какое минимальное количество рёбер он мог покрасить, чтобы выполнялось описанное выше условие. \(^{\dagger}\)Деревом называется неориентированный связный граф без циклов. \(^{\ddagger}\)Простой путь — это путь, проходящий через каждую вершину не более одного раза. Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество рёбер, которое мог покрасить Саша. Примечание В первом наборе входных данных Саша мог покрасить только одно ребро \((1, 2)\). Тогда на простом пути между вершинами \(1\) и \(3\) и вершинами \(4\) и \(1\) будет хотя бы одно покрашенное ребро. Во втором наборе входных данных Саша мог покрасить рёбра \((1, 6)\) и \((1, 3)\).
| |
|
|
D2. Сумма по всем подстрокам (сложная версия)
битмаски
дп
жадные алгоритмы
разделяй и властвуй
реализация
снм
Строки
*2100
Это простая версия задачи. Единственное отличие между версиями заключается в ограничениях на \(t\) и \(n\). Вы можете делать взломы только тогда, когда обе версии задачи решены. Для бинарного\(^\dagger\) шаблона \(p\) и бинарной строки \(q\) одинаковой длины \(m\), скажем, что строка \(q\) называется \(p\)-хорошей, если для каждого \(i\) (\(1 \leq i \leq m\)) существуют индексы \(l\) и \(r\) такие, что: - \(1 \leq l \leq i \leq r \leq m\), и
- \(p_i\) является модой\(^\ddagger\) строки \(q_l q_{l+1} \ldots q_{r}\).
Для шаблона \(p\) определим \(f(p)\) как минимально возможное количество \(\mathtt{1}\) в \(p\)-хорошей бинарной строке (такой же длины, как и шаблон). Вам дана бинарная строка \(s\) длины \(n\). Найдите \(\)\sum_{i=1}^{n} \sum_{j=i}^{n} f(s_i s_{i+1} \ldots s_j).\(\) Другими словами, вам нужно просуммировать значения \(f\) по всем \(\frac{n(n+1)}{2}\) подстрокам \(s\). \(^\dagger\) Бинарный шаблон — это строка, состоящая только из символов \(\mathtt{0}\) и \(\mathtt{1}\). \(^\ddagger\) Символ \(c\) является модой строки \(t\) длины \(m\), если число вхождений \(c\) в \(t\) не меньше \(\lceil \frac{m}{2} \rceil\). Например, \(\mathtt{0}\) является модой \(\mathtt{010}\), \(\mathtt{1}\) не является модой \(\mathtt{010}\), и оба символа \(\mathtt{0}\) и \(\mathtt{1}\) являются модами \(\mathtt{011010}\). Выходные данные Для каждого набора входных данных выведите сумму значений \(f\) по всем подстрокам \(s\). Примечание В первом наборе входных данных единственной \(\mathtt{1}\)-хорошей строкой является \(\mathtt{1}\). Таким образом, \(f(\mathtt{1})=1\). Во втором наборе входных данных \(f(\mathtt{10})=1\), так как \(\mathtt{01}\) является \(\mathtt{10}\)-хорошей, а \(\mathtt{00}\) не является \(\mathtt{10}\)-хорошей. Таким образом, ответ равен \(f(\mathtt{1})+f(\mathtt{10})+f(\mathtt{0}) = 1 + 1 + 0 = 2\). В третьем наборе входных данных \(f\) равна \(0\) для всех \(1 \leq i \leq j \leq 5\). Таким образом, ответ равен \(0\).
| |
|
|
F. Максимизируйте разницу
битмаски
Перебор
поиск в глубину и подобное
*2700
Для массива \(b\) из \(m\) целых неотрицательных чисел определим \(f(b)\) как максимальное значение \(\max\limits_{i = 1}^{m} (b_i | x) - \min\limits_{i = 1}^{m} (b_i | x)\) среди всех неотрицательных целых чисел \(x\), где \(|\) обозначает операцию побитового ИЛИ. Вам даны целые числа \(n\) и \(q\). Вы начинаете с пустого массива \(a\). Выполните следующие \(q\) запросов: - \(v\): добавить \(v\) в конец \(a\) и вывести \(f(a)\). Гарантируется, что \(0 \leq v < n\).
Запросы даны в измененном виде. Выходные данные Для каждого набора входных данных выведите \(q\) целых чисел, разделенных пробелами. \(i\)-е число должно равняться результату выполнения \(i\)-го запроса. Примечание В первом наборе входных данных в конце \(a=[1,2]\). Для \(i=1\) ответ всегда \(0\), независимо от \(x\). Для \(i=2\) мы можем выбрать \(x=5\). Во втором наборе входных данных итоговое значение \(a=[3,1,0,5]\).
| |
|
|
G. Магический рисунок королевской черепахи
битмаски
Комбинаторика
Конструктив
математика
Перебор
поиск в глубину и подобное
*2300
Черепаха Алиса в настоящее время разрабатывает коробку для печенья с предсказаниями, и она хотела бы включить в нее теорию Лоушу. Коробку можно рассматривать как таблицу размера \(n \times m\) (\(n, m \ge 5\)), где строки нумеруются \(1, 2, \dots, n\), а столбцы нумеруются \(1, 2, \dots, m\). Каждая клетка может быть либо пустой, либо содержать одно печенье с предсказанием одной из следующих форм: круг или квадрат. Клетка на пересечении \(a\)-й строки \(b\)-го столбца обозначается как \((a, b)\). Изначально вся таблица пуста. Затем Алиса выполняет \(q\) операций с коробкой для печенья. \(i\)-я операция (\(1 \le i \le q\)) выполняется следующим образом: указывается в настоящее время пустая клетка \((r_i,c_i)\) и форма (круг или квадрат), затем ставится печенье с предсказанием указанной формы в клетку \((r_i,c_i)\). Обратите внимание, что после \(i\)-й операции клетка \((r_i,c_i)\) больше не является пустой. Перед всеми операциями и после каждой из \(q\) операций Алиса задается вопросом, сколько существует способов разместить печенья с предсказанием во всех оставшихся пустых клетках, так чтобы было удовлетворено следующее требование: Не существует трёх последовательных клеток с печеньем одинаковой формы в одной строке, одном столбце или на одной диагонали. Формально: - Не существует \((i,j)\), удовлетворяющих \(1 \le i \le n, 1 \le j \le m-2\), таких, что в клетках \((i,j), (i,j+1), (i,j+2)\) есть печенье одинаковой формы.
- Не существует \((i,j)\), удовлетворяющих \(1 \le i \le n-2, 1 \le j \le m\), таких, что в клетках \((i,j), (i+1,j), (i+2,j)\) есть печенье одинаковой формы.
- Не существует \((i,j)\), удовлетворяющих \(1 \le i \le n-2, 1 \le j \le m-2\), таких, что в клетках \((i,j), (i+1,j+1), (i+2,j+2)\) есть печенье одинаковой формы.
- Не существует \((i,j)\), удовлетворяющих \(1 \le i \le n-2, 1 \le j \le m-2\), таких, что в клетках \((i,j+2), (i+1,j+1), (i+2,j)\) есть печенье одинаковой формы.
Все ответы должны быть выведены по модулю \(998\,244\,353\). Также обратите внимание, что после некоторых операций требование уже может не быть удовлетворено с уже размещенными печеньями, в этом случае, вы должны выводить \(0\). Выходные данные Для каждого набора входных данных выведите \(q+1\) строк. Первая строка вывода должна содержать ответ до операций, \(i\)-я строка (\(2 \le i \le q+1\)) должна содержать ответ после первых \(i-1\) операций. Все ответы должны быть взяты по модулю \(998\,244\,353\). Примечание Во втором примере, после размещения печенья в форме круга в клетках \((1,1)\), \((1,2)\) и \((1,3)\), Требование уже не удовлетворено. Поэтому вы должны вывести \(0\).
| |
|
|
D1. Разбиение XOR — сольная версия
битмаски
жадные алгоритмы
Конструктив
*2100
Это сольная версия задачи. Обратите внимание, что решение этой задачи может иметь или не иметь общих идей с решением игровой версии. Вы можете сдавать и получать баллы за каждую из версий независимо. Вы можете делать взломы только тогда, когда обе версии задачи решены. Дана целочисленная переменная \(x\), которая изначально имеет значение \(n\). Операция разбиения определена как: - Выберите значение \(y\) такое, что \(0 \lt y \lt x\) и \(0 \lt (x \oplus y) \lt x\).
- Обновите \(x\), приравняв его \(x = y\) либо \(x = x \oplus y\).
Определите, возможно ли преобразовать \(x\) в \(m\) за не более чем \(63\) операции, используя такую операцию разбиения. Если это возможно, предъявите последовательность операций для достижения \(x = m\). Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Выходные данные Для каждого набора тестовых данных выведите ваш ответ в следующем формате. Если невозможно достичь требуемого значения \(m\) за \(63\) операции, то выведите \(-1\) в единственной строке. Иначе, Первая строка должна содержать целое число \(k\) (\(1 \leq k \leq 63\)) — где \(k\) является количеством произведенных операций. Следующая строка должна содержать \(k+1\) целое число — последовательность, в виде которой переменная \(x\) изменяется с ходом операций разбиения. \(1\)-е и (\(k+1\))-ое числа должны равняться \(n\) и \(m\) соответственно. Примечание В первом тестовом случае \(n = 7\), для первой операции \(x = 7\), если мы выберем \(y = 3\), тогда \((7 \oplus 3) \lt 7\), следовательно мы можем обновить \(x\) сделав его равным \(3\) уже на первой операции, чему и равно \(m\). Во втором тестовом случае \(n = 4\), для первой операции \(x = 4\). Если мы выберем: - \(y = 1\) тогда \((4 \oplus 1) \gt 4\)
- \(y = 2\) тогда \((4 \oplus 2) \gt 4\)
- \(y = 3\) тогда \((4 \oplus 3) \gt 4\)
Следовательно мы не можем выполнить первую операцию и невозможно сделать \(x = 2\).
| |
|
|
D2. Разбиение XOR — игровая версия
битмаски
жадные алгоритмы
игры
интерактив
*2400
Это интерактивная задача. Это игровая версия задачи. Обратите внимание, что решение этой задачи может иметь или не иметь общих идей с решением сольной версии. Вы можете сдавать и получать баллы за каждую из версий независимо. Алиса и Боб играют в игру. Игра начинается с целого числа \(n\). Игроки совершают ходы по очереди. На каждом ходу игры происходит следующая последовательность событий: - Игрок, имеющий целое число \(p\), разбивает его на два целых числа \(p_{1}\) и \(p_{2}\), где \(0 \lt p_{1} \lt p\), \(0 \lt p_{2} \lt p\) и \(p_{1} \oplus p_{2} = p\).
- Если такие \(p_{1}\), \(p_{2}\) не существуют, то игрок проигрывает.
- Иначе, оппонент выбирает либо \(p_{1}\), либо \(p_{2}\).
- Игра продолжается с выбранным числом. Оппонент будет пытаться разбить его.
Ваша задача помочь Алисе выиграть. Вы можете выполнить не более \(63\) операций разбиения. Вы можете выбрать будет Алиса ходить первой или второй. Система будет играть за Боба. Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Протокол взаимодействия Для каждого тестового случая, взаимодействие начинается с чтения целого числа \(n\). После чтения \(n\), выведите отдельную строку, содержащую либо «first», либо «second», обозначив, каким вы хотите начать игру(первым или вторым соответственно). Во время хода Алисы вы должны вывести два положительных целых числа \(p_{1}\) и \(p_{2}\), такие что \(0 \lt p_{1} \lt p\), \(0 \lt p_{2} \lt p\) и \(p_{1} \oplus p_{2} = p\). Здесь \(p\) должно равняться одному из двух чисел выведенных Бобом на предыдущем ходу. Если до этого не было ходов, то \(p\) равняется \(n\). Если Алиса не может произвести операцию разбиения, выведите «0 0», после чего вы получите вердикт Неправильный ответ. Во время хода Боба, вы должны прочитать два положительных целых числа \(p_{1}\) и \(p_{2}\), такие что \(0 \lt p_{1} \lt p\), \(0 \lt p_{2} \lt p\) и \(p_{1} \oplus p_{2} = p\). Здесь \(p\) должно равняться одному из двух чисел выведенных Алисой на предыдущем ходу. Если до этого не было ходов, то \(p\) равняется \(n\). Если Боб не может произвести операцию разбиения, \(p_{1} = 0\) and \(p_2 = 0\), в случае чего вы должны перейти к решению следующего тестового случая. Если операция, совершенная Алисой, некорректна, интерактор выведет «-1 -1» и ваша программа должна завершиться незамедлительно, чтобы получить вердикт Неправильный ответ. Если Алиса совершает \(63\) хода и Боб все еще может совершить операцию разбиения с текущими числами, интерактор выведете «-1 -1», и ваша программа должна завершиться незамедлительно, чтобы получить вердикт Неправильный ответ. После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Вы не можете делать взломы в этой задаче. Примечание Пояснения по взаимодействию. | Интерактор / Боб | Алиса | Пояснение | | 4 | | \(t\) | | 1 | | \(n\) для первого тестового случая | | second | Алиса выбирает начать второй | | 0 0 | | Боб говорит, что не может разбить \(p = 1\) | | 3 | | \(n\) для второго тестового случая | | first | Алиса выбирает начать первой | | 1 2 | Алиса ломает \(p = 3\) на \(p_1 = 1\) и \(p_2 = 2\) | | 0 0 | | Боб говорит, что не может разбить ни \(p = 1\), ни \(p = 2\) | | 13 | | \(n\) для третьего тестового случая | | first | Алиса выбирает начать первой | | 10 7 | Алиса ломает \(p = 13\) на \(p_1 = 10\) и \(p_2 = 7\) | | 3 4 | | Боб ломает \(p = 7\) на \(p_1 = 3\) и \(p_2 = 4\) | | 1 2 | Алиса ломает \(p = 3\) на \(p_1 = 1\) и \(p_2 = 2\) | | 0 0 | | Боб говорит, что не может разбить ни \(p = 1\), ни \(p = 2\) | | 777777770001 | | \(n\) для четвертого тестового случая | | first | Алиса выбирает начать первой | | 777777770000 1 | Алиса ломает \(p = 777\,777\,770\,001\) на \(p_1 = 777\,777\,770\,000\) и \(p_2 = 1\) | | 0 0 | | Боб говорит, что не может совершить операцию разбиения |
Таблица лишь для пояснения формата взаимодействия и не отражает настоящего поведения интерактора. Обратите внимание, что в последнем тестовом случае Боб мог выбрать \(p_1\) и совершить операцию разбиения, но он сдался.
| |
|
|
E. Дистанционные курсы в ЦПМ
битмаски
жадные алгоритмы
математика
Перебор
Структуры данных
*2400
В Центре Помощи Магистрам наступил Новый год, а значит время добавить нововведение! Теперь ученикам даются дистанционные курсы, при этом всего есть \(n\) курсов. За \(i\)-й дистанционный курс ученик может получить оценку от \(x_i\) до \(y_i\). Но каждому ученику могут быть доступны не все курсы, а именно \(j\)-му ученику даются только курсы с номерами от \(l_j\) до \(r_j\), то есть дистанционные курсы с номерами \(l_j, l_j + 1, \ldots, r_j\). Создатели дистанционных курсов решили определять итоговую оценку особенным образом. Пусть \(j\)-й ученик получил оценки \(c_{l_j}, c_{l_j + 1}, \ldots, c_{r_j}\) за свои дистанционные курсы, тогда его итоговая оценка будет равна \(c_{l_j}\) \(|\) \(c_{l_j + 1}\) \(|\) \(\ldots\) \(|\) \(c_{r_j}\), где \(|\) обозначает операцию побитового ИЛИ. Так как чат-бот с решениями дистанционных курсов сломался, то ученики попросили вас помочь. Для каждого из \(q\) учеников скажите, какую максимальную итоговую оценку он может получить. Выходные данные Для каждого набора входных данных выведите \(q\) целых чисел, \(j\)-е из которых является максимальной итоговой оценкой, которую может получить \(j\)-й ученик. Примечание В первом наборе входных данных: - Максимальная оценка для первого ученика равна \(1\):
- На первом дистанционном курсе он получит оценку \(1\).
Таким образом, итоговая оценка равна \(1\). - Максимальная оценка для второго ученика равна \(5\):
- На первом дистанционном курсе он получит оценку \(1\).
- На втором дистанционном курсе он получит оценку \(4\).
Таким образом, итоговая оценка равна \(1\) \(|\) \(4\) \(=\) \(5\). - Максимальная оценка для третьего ученика равна \(4\):
- На втором дистанционном курсе он получит оценку \(4\).
Таким образом, итоговая оценка равна \(4\). Во втором наборе входных данных: - Максимальная оценка для первого ученика равна \(15\):
- На первом дистанционном курсе он получит оценку \(7\).
- На втором дистанционном курсе он получит оценку \(4\).
- На третьем дистанционном курсе он получит оценку \(8\).
Тем самым, итоговая оценка равна \(7\) \(|\) \(4\) \(|\) \(8\) \(=\) \(15\). - Максимальная оценка для второго ученика равна \(11\):
- На третьем дистанционном курсе он получит оценку \(9\).
- На четвертом дистанционном курсе он получит оценку \(2\).
Тем самым, итоговая оценка равна \(9\) \(|\) \(2\) \(=\) \(11\).
| |
|
|
A. Побитовая магия
битмаски
жадные алгоритмы
интерактив
Конструктив
математика
*1700
Это интерактивная задача. Загадана секретная последовательность \(p_0, p_1, \ldots, p_{n-1}\), являющаяся перестановкой чисел \(\{0,1,\ldots,n-1\}\). Вам нужно найти два индекса \(i\) и \(j\), таких что \(p_i \oplus p_j\) принимает максимальное значение, где \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Чтобы их найти, вы можете делать запросы. Каждый запрос устроен так: вы выбираете произвольные индексы \(a\), \(b\), \(c\) и \(d\) (\(0 \le a,b,c,d < n\)). Затем программа жюри вычисляет \(x = (p_a \mid p_b)\) и \(y = (p_c \mid p_d)\), где \(|\) обозначает операцию побитового ИЛИ. Наконец, вы узнаёте результат сравнения чисел \(x\) и \(y\). Другими словами, вам сообщают, какое из трёх условий выполнено: \(x < y\), \(x > y\) или \(x = y\). Найдите два индекса \(i\) и \(j\) (\(0 \le i,j < n\)), таких что \(p_i \oplus p_j\) максимально среди всех таких пар, сделав не более \(3n\) запросов. Если существует несколько пар индексов, удовлетворяющих условию, выведите любую из них. Протокол взаимодействия Первая строка каждого набора входных данных содержит единственное число \(n\) (\(2 \le n \le 10^4\)). В этот момент загадывается перестановка \(p_0, p_1, \ldots, p_{n-1}\). В этой задаче решение жюри неадаптивно. Иначе говоря, последовательность \(p\) фиксирована в каждом наборе входных данных и не будет меняться в процессе взаимодействия с программой участника. Чтобы сделать запрос, вам нужно выбрать четыре индекса \(a\), \(b\), \(c\) и \(d\) (\(0 \le a,b,c,d < n\)) и вывести строку следующего вида: После этого вы получите: - «<», если \((p_a \mid p_b) < (p_c \mid p_d)\);
- «=», если \((p_a \mid p_b) = (p_c \mid p_d)\);
- «>», если \((p_a \mid p_b) > (p_c \mid p_d)\).
Вы можете сделать не более \(3n\) запросов такого вида. Затем, если ваша программа нашла пару индексов \(i\) и \(j\) (\(0 \le i, j < n\)), такую что \(p_i \oplus p_j\) максимально, выведите строку следующего вида: Обратите внимание, что эта строка не считается запросом и не учитывается при подсчёте числа сделанных запросов. После этого переходите к обработке следующего набора входных данных. Если вы делаете больше \(3n\) запросов, ваша программа должна немедленно завершиться, в таком случае вы получите вердикт Wrong Answer. В противном случае вы можете получить произвольный вердикт, поскольку ваше решение продолжит читать из закрытого потока данных. После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^4\). Взломы Чтобы делать взломы, используйте следующий формат. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных. Далее следует описание наборов входных данных. Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 10^4\)). Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(p_0,p_1,\ldots,p_{n-1}\), которые задают перестановку чисел от \(0\) до \(n - 1\). Сумма значений \(n\) по всем наборам входных данных не должна превышать \(10^4\). Примечание В первом наборе входных данных загадана перестановка \(p=[0,3,1,2]\). На запрос «? 0 2 3 1» решение жюри выведет «<», поскольку \((p_0 \mid p_2) = (0 \mid 1) =1 < (p_3 \mid p_1) = (2 \mid 3) = 3\). На запрос «? 1 1 2 3» решение жюри выведет «=», поскольку \((p_1 \mid p_1) = (3\mid 3)= 3 = (p_2 \mid p_3) = (1 \mid 2)=3\). На запрос «? 1 2 0 3» решение жюри выведет «>», поскольку \((p_1 \mid p_2) = (3 \mid 1) = 3 > (p_0 \mid p_3) = (0\mid 2)=2\). Ответ \(i = 3\) и \(j = 2\) корректен: \((p_3 \oplus p_2) = (2 \oplus 1) = 3\), и это значение максимально среди всех пар \(p_i \oplus p_j\). Другим корректным ответом также является пара \(i=0\) и \(j=1\). Поскольку число запросов не превысило \(3n=12\), ответ считается верным. Во втором наборе входных данных \(n = 2\), значит, \(p\) есть либо \([0, 1]\), либо \([1, 0]\). В любом случае \(p_0 \oplus p_1 = 1\) максимально возможно.
| |
|
|
D. Битовый парадокс
Бинарный поиск
битмаски
жадные алгоритмы
Структуры данных
*3100
Даны два массива целых чисел \(a\) и \(b\) длины \(n\), а также фиксированное целое число \(v\). Отрезок \([l, r]\) назовём хорошим, если \((b_l \mid b_{l+1} \mid \ldots \mid b_r) \ge v\), где \(|\) обозначает операцию побитового ИЛИ. Далее, красота хорошего отрезка определяется как \(\max(a_l, a_{l+1}, \ldots, a_r)\). Вам даны \(q\) запросов двух типов: - «1 i x»: нужно выполнить присваивание \(b_i := x\);
- «2 l r»: найдите минимальную красоту среди всех хороших отрезков \([l_0,r_0]\), удовлетворяющих условию \(l \le l_0 \le r_0 \le r\). Если подходящих красивых отрезков нет, выведите \(-1\).
Обработайте все запросы. Выходные данные Для каждого набора входных данных выведите ответы на все запросы второго типа. Примечание В первом наборе входных данных \(a = [2, 1, 3]\), \(b = [2, 2, 3]\), \(v = 7\). Первый запрос является запросом второго типа, в нём \(l = 1\) и \(r = 3\). Самый большой доступный отрезок есть \([1, 3]\), но даже на нём побитовое ИЛИ равно \(b_1 \mid b_2 \mid b_3 = 3\), что меньше \(v\). Значит, не существует ни одного хорошего отрезка. Второй запрос просит заменить \(b_2\) на \(5\), так что массив \(b\) становится равен \([2, 5, 3]\). Третий запрос является запросом второго типа, в нём \(l = 2\) и \(r = 3\). Есть три возможных отрезка: \([2, 2]\), \([3, 3]\) и \([2, 3]\). Однако, \(b_2 = 5 < v\), \(b_3 = 3 < v\). Так что только последний отрезок является хорошим: для него \(b_2 \mid b_3 = 7\). Значит, ответ равен \(\max(a_2, a_3) = 3\). Четвёртый запрос является запросом второго типа, в нём \(l = 1\) и \(r = 3\). Есть три хороших отрезка: \([1, 2]\), \([2, 3]\) и \([1, 3]\). Их красоты равны \(2\), \(3\), \(3\) соответственно. Таким образом, ответ равен \(2\). Во втором наборе входных данных \(a = [5, 1, 2, 4]\), \(b = [4, 2, 3, 3]\), \(v = 5\). В первом запросе \(l = 1\) и \(r = 4\). Хорошими отрезками являются только следующие: \([1, 2]\), \([1, 3]\), \([1, 4]\). Их красоты равны \(5\), \(5\), \(5\) соответственно. Таким образом, ответ равен \(5\).
| |
|
|
B. Равный XOR
битмаски
Конструктив
*1100
Вам дан массив \(a\) длины \(2n\), в котором каждое целое число от \(1\) до \(n\) встречается ровно дважды. Вам также дано целое число \(k\) (\(1 \leq k \leq \lfloor \frac{n}{2} \rfloor \)). Вам нужно найти два массива \(l\) и \(r\) длины \(\mathbf{2k}\) каждый такие, что: - \(l\) является подмножеством\(^\dagger\) \([a_1, a_2, \ldots a_n]\)
- \(r\) является подмножеством \([a_{n+1}, a_{n+2}, \ldots a_{2n}]\)
- побитовый XOR элементов \(l\) равен побитовому XOR элементов \(r\); другими словами, \(l_1 \oplus l_2 \oplus \ldots \oplus l_{2k} = r_1 \oplus r_2 \oplus \ldots \oplus r_{2k}\)
Можно доказать, что всегда существует хотя бы одна пара \(l\) и \(r\). Если существует несколько решений, вы можете вывести любое из них. \(^\dagger\) Последовательность \(x\) является подмножеством последовательности \(y\), если \(x\) может быть получена из удалением нескольких (возможно, ни одного или всех) элементов \(y\) и перестановкой оставшихся элементов. Например, \([3,1,2,1]\), \([1, 2, 3]\), \([1, 1]\) и \([3, 2]\) являются подмножествами \([1, 1, 2, 3]\) а \([4]\) и \([2, 2]\) не являются подмножествами \([1, 1, 2, 3]\). Выходные данные Для каждого набора входных данных выведите две строки. В первой строке выведите \(2k\) чисел \(l_1, l_2, \ldots, l_{2k}\). Во второй строке выведите \(2k\) чисел \(r_1, r_2, \ldots r_{2k}\). Если существует несколько решений, вы можете вывести любое из них. Примечание В первом наборе входных данных можно выбрать \(l=[2,1]\) и \(r=[2,1]\). \([2, 1]\) является подмножеством \([a_1, a_2]\), \([2, 1]\) является подмножеством \([a_3, a_4]\), и \(2 \oplus 1 = 2 \oplus 1 = 3\). Во втором наборе \(6 \oplus 4 = 1 \oplus 3 = 2\).
| |
|
|
D. Подарок на день рождения
битмаски
жадные алгоритмы
Конструктив
Перебор
реализация
*1900
Совсем скоро у Ярика день рождения, и Марк решил подарить ему массив \(a\) длины \(n\). Марк знает, что Ярик очень любит битовые операции, а также у него есть любимое число \(x\), поэтому Марк хочет найти такое максимальное число \(k\), что можно выбрать такие пары чисел [\(l_1, r_1\)], [\(l_2, r_2\)], \(\ldots\) [\(l_k, r_k\)], что: - \(l_1 = 1\).
- \(r_k = n\).
- \(l_i \le r_i\) для всех \(i\) от \(1\) до \(k\).
- \(r_i + 1 = l_{i + 1}\) для всех \(i\) от \(1\) до \(k - 1\).
- \((a_{l_1} \oplus a_{l_1 + 1} \oplus \ldots \oplus a_{r_1}) | (a_{l_2} \oplus a_{l_2 + 1} \oplus \ldots \oplus a_{r_2}) | \ldots | (a_{l_k} \oplus a_{l_k + 1} \oplus \ldots \oplus a_{r_k}) \le x\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ, а \(|\) обозначает операцию побитового ИЛИ.
Если такого \(k\) не существует, то нужно вывести \(-1\). Выходные данные Для каждого набора входных данных в отдельной строке выведите одно целое число — максимальное подходящее число \(k\), и \(-1\), если такого \(k\) не существует. Примечание В первом наборе входных данных можно взять \(k\) равным \(2\) и выбрать два отрезка [\(1, 1\)] и [\(2, 3\)], \((1) | (2 \oplus 3) = 1\). Можно показать, что \(2\) — максимальный возможный ответ. Во втором наборе входных данных подходят отрезки [\(1, 1\)] и [\(2, 2\)], \((1) | (1) = 1\). Больше отрезков сделать нельзя. В третьем наборе входных данных нельзя выбрать \(2\) отрезка, так как \((1) | (3) = 3 > 2\), значит оптимальный ответ это \(1\).
| |
|
|
G. MST с паросочетанием
битмаски
Деревья
Паросочетания
Перебор
снм
*3100
Дан неориентированный связный граф, в котором \(n\) вершин. У каждого ребра этого графа есть вес; вес ребра между вершинами \(i\) и \(j\) равен \(w_{i,j}\) (или \(w_{i,j} = 0\), что означает, что между \(i\) и \(j\) нет ребра). Все веса — положительные целые числа. Также дано положительное целое число \(c\). Вы должны построить остовное дерево для этого графа, то есть выбрать ровно \((n-1)\) ребер графа так, чтобы можно было из любой вершины добраться до любой другой по выбранным ребрам. Стоимость остовного дерева — это сумма двух значений: - сумма весов всех выбранных ребер;
- максимальное паросочетание в остовном дереве (то есть максимальный размер множества ребер, такого, что каждое ребро принадлежит остовному дереву и каждой вершине инцидентно не более одного ребра из множества), умноженное на заданное число \(c\).
Найдите любое остовное дерево с минимальной стоимостью. Так как граф связный, у него существует хотя бы одно остовное дерево. Выходные данные Выведите одно целое число — минимальную стоимость остовного дерева. Примечание В первом примере минимальное остовное дерево состоит из ребер \((1, 3)\), \((2, 3)\) и \((3, 4)\). Максимальное паросочетание относительно него равно \(1\). Во втором примере минимальное остовное дерево состоит из ребер \((1, 2)\), \((2, 3)\) и \((3, 4)\). Максимальное паросочетание относительно него равно \(2\).
| |
|
|
F. 0, 1, 2, Tree!
битмаски
Деревья
жадные алгоритмы
Перебор
реализация
*1700
Найдите минимальную высоту корневого дерева\(^{\dagger}\) с \(a+b+c\) вершинами, которое удовлетворяет следующим условиям: - \(a\) вершин имеют ровно \(2\) потомка,
- \(b\) вершин имеют ровно \(1\) потомка, и
- \(c\) вершин имеют ровно \(0\) потомков (не имеют потомков).
Если такого дерева не существует, вы должны сообщить об этом.  Дерево выше с корнем в верхней вершине, и каждая вершина помечена числом потомков. Здесь \(a=2\), \(b=1\), \(c=3\), и высота равна \(2\). \(^{\dagger}\) Корневое дерево — это связный граф без циклов, с особой вершиной, называемой корнем. В корневом дереве, среди любых двух вершин, соединенных ребром, одна вершина является родителем (ближе к корню), а другая — потомком. Расстояние между двумя вершинами в дереве — количество ребер в кратчайшем пути между ними. Высота корневого дерева — это максимальное расстояние от вершины до корня. Выходные данные Для каждого набора входных данных, если такое дерево не существует, выведите \(-1\). В противном случае выведите одно целое число — минимальную высоту дерева, удовлетворяющего описанным условиям. Примечание Первый набор входных данных изображен в условии. Можно доказать, что высота не может быть меньше \(2\). Во втором наборе входных данных, можно сформировать дерево с одной вершиной и без ребер. Оно имеет высоту \(0\), что является оптимальным. В третьем наборе входных данных, можно сформировать дерево с двумя вершинами, соединенными одним ребром. Оно имеет высоту \(1\), что является оптимальным.
| |
|
|
G. Перемешивание песен
битмаски
графы
дп
поиск в глубину и подобное
реализация
Строки
хэши
*1900
У Владислава есть плейлист, состоящий из \(n\) песен, пронумерованных от \(1\) до \(n\). Песня \(i\) имеет жанр \(g_i\) и автора \(w_i\). Он хочет составить плейлист таким образом, чтобы каждая пара соседних песен либо имела одного и того же автора, либо была из того же жанра (или и то, и другое). Он называет такой плейлист захватывающим. И \(g_i\), и \(w_i\) являются строками, длины не более \(10^4\). Не всегда возможно составить захватывающий плейлист, используя все песни, поэтому процесс перемешивания происходит в два этапа. Сначала удаляются некоторое количество (возможно, нулевое) песен, а затем оставшиеся песни в плейлисте переставляются, чтобы сделать его захватывающим. Поскольку Владислав не любит, когда песни удаляются из его плейлиста, он хочет, чтобы составление плейлиста выполнялось с минимальным количеством удалений. Помогите ему найти минимальное количество удалений, которые необходимо выполнить, чтобы можно было переставить оставшиеся песни, чтобы сделать плейлист захватывающим. Выходные данные Для каждого теста выведите одно целое число — минимальное количество удалений, необходимых для того, чтобы получившийся плейлист можно было сделать захватывающим. Примечание В первом тесте плейлист уже захватывающий. Во втором тесте, если у вас есть песни в порядке \(4, 3, 1, 2\), это захватывающий плейлист, поэтому вам не нужно удалять никакие песни. В третьем тесте вы можете удалить песни \(4, 5, 6, 7\). Тогда плейлист с песнями в порядке \(1, 2, 3\) будет захватывающим.
| |
|
|
I. Темная материя
*особая задача
битмаски
геометрия
| |
|
|
H. Самая безбашенная оборона
битмаски
дп
Конструктив
кратчайшие пути
Паросочетания
Перебор
Потоки
*2300
Вы играете в очень популярную игру в жанре Tower Defense «Runnerfield 2». В ней игрок выставляет защитные башни, которые атакуют врагов, идущих от некоторой начальной точки до базы игрока. Вам дано клетчатое поле размера \(n \times m\), на котором уже расставлены \(k\) башен и проложен маршрут, через который будут идти враги. Клетка на пересечении \(x\)-й строки и \(y\)-го столбца обозначается как \((x, y)\). Каждую секунду башня наносит \(p_i\) единиц урона всем врагам в радиусе её действия. Например, если враг расположен в клетке \((x, y)\), а башня в \((x_i, y_i)\), и её радиус равен \(r\), тогда врагу будет нанесён урон \(p_i\), если \((x - x_i) ^ 2 + (y - y_i) ^ 2 \le r ^ 2\). Враги идут из клетки \((1, 1)\) в клетку \((n, m)\), посещая каждую клетку пути ровно один раз. Враг моментально перемещается на соседнюю по горизонтали или вертикали клетку, однако перед этим он проводит в текущей клетке одну секунду. Если в эту секунду его здоровье стало равно нулю или ниже нуля, то враг больше не может перемещаться. Игрок проигрывает, если враг смог добраться до клетки \((n, m)\) и может сделать ещё одно перемещение. По умолчанию все башни обладают нулевым радиусом действия, но игрок может сделать радиус башни равным целому числу \(r\) (\(r > 0\)) за это здоровье всех врагов увеличится на \(3^r\), однако каждое \(r\) может быть использовано не более чем для одной башни. Допустим, враг имел \(h\) единиц базового здоровья. Если радиусы башен \(2\), \(4\) и \(5\), то его здоровье в начале пути будет \(h + 3 ^ 2 + 3 ^ 4 + 3 ^ 5 = h + 9 + 81 + 243 = h + 333\). Выбор радиусов происходит один раз до появления врагов и не может быть изменён после начала игры. Найдите максимальное количество базового здоровья \(h\), при котором возможно установить радиусы так, чтобы игрок не проиграл при прохождении врага со здоровьем \(h\) (без учёта прибавок за радиусы башен). Выходные данные Для каждого набора входных данных в отдельной строке выведите максимальное количество базового здоровья \(h\), при котором возможно установить радиусы так, чтобы игрок не проиграл при прохождении врага со здоровьем \(h\) (без учёта прибавок за радиусы башен). Если невозможно выбрать радиусы даже для врага с \(1\) единицей базового здоровья, выведите «0». Примечание В первом примере нет смысла увеличивать радиус башни, так как она не сможет нанести достаточное количество урона монстру даже с \(1\) единицей здоровья. Во втором примере радиус башни равен \(1\), она наносит урон монстру в клетках \((1, 1)\) и \((2, 2)\). В третьем примере радиус башни равен \(2\), она наносит урон монстру на всех клетках пути. Если базовое здоровье врага \(1491\), то после прибавки за радиус башни его здоровье будет \(1491 + 3 ^ 2 = 1500\), что в точности будет равно урону, который ему нанесёт башня за три секунды. В четвёртом примере у башни \((1, 2)\) радиус \(1\), а у башни \((3, 1)\) радиус \(2\).
| |
|
|
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\).
| |
|
|
B. Битовая конструкция
битмаски
жадные алгоритмы
Конструктив
реализация
*1100
Даны целые неотрицательные числа \(n\) и \(k\). Постройте последовательность из \(n\) целых неотрицательных (т.е. \(\geq 0\)) чисел \(a_1, a_2, \ldots, a_n\) таких, что - \(\sum\limits_{i = 1}^n a_i = k\).
- Количество \(1\) в двоичной записи числа \(a_1 | a_2 | \ldots | a_n\) максимально, где \(|\) обозначает операцию побитового ИЛИ.
Выходные данные Для каждого набора входных данных выведите на отдельной строке последовательность \(a_1, a_2, \ldots, a_n\), удовлетворяющую приведенным выше условиям. Если существует несколько решений, выведите любое из них. Примечание В первом наборе входных данных нам нужно вывести ровно одно число, поэтому в качестве ответа мы можем вывести только \(5\). Во втором наборе входных данных мы выводим \(1, 2\). Они имеют сумму \(3\), а \(1 | 2 = (11)_2\) имеет две \(1\) в двоичном представлении. Можно показать, что большего количества единиц достичь нельзя. В четвертом наборе входных данных мы выводим \(3, 1, 1, 32, 2, 12\), что в сумме составляет \(51\), и \(3 | 1 | 1 | 32 | 2 | 12 = (101\,111)_2\) имеет пять \(1\) в двоичном представлении. Можно показать, что большего количества единиц достичь нельзя.
| |
|
|
D. Битовое неравенство
битмаски
дп
математика
Перебор
*1900
Вам дан массив \(a_1, a_2, \ldots, a_n\). Найдите количество троек чисел (\(x, y, z\)) таких, что: - \(1 \leq x \leq y \leq z \leq n\), и
- \(f(x, y) \oplus f(y, z) > f(x, z)\).
Определим \(f(l, r) = a_l \oplus a_{l + 1} \oplus \ldots \oplus a_{r}\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Выходные данные Для каждого набора входных данных выведите в отдельной строке одно целое число — количество подходящих троек. Примечание В первом наборе входных данных для массива \([6, 2, 4]\) есть 4 подходящие тройки чисел: - (\(1\), \(2\), \(2\)): \((a_1 \oplus a_2) \oplus (a_2) = 4 \oplus 2 > (a_1 \oplus a_2) = 4\)
- (\(1\), \(1\), \(3\)): \((a_1) \oplus (a_1 \oplus a_2 \oplus a_3) = 6 \oplus 0 > (a_1 \oplus a_2 \oplus a_3) = 0\)
- (\(1\), \(2\), \(3\)): \((a_1 \oplus a_2) \oplus (a_2 \oplus a_3) = 4 \oplus 6 > (a_1 \oplus a_2 \oplus a_3) = 0\)
- (\(1\), \(3\), \(3\)): \((a_1 \oplus a_2 \oplus a_3) \oplus (a_3) = 0 \oplus 4 > (a_1 \oplus a_2 \oplus a_3) = 0\)
Во втором наборе входных данных подходящих троек нет.
| |
|
|
B. Отсутствующая сумма подпоследовательности
битмаски
жадные алгоритмы
Конструктив
теория чисел
*1800
Даны два целых числа \(n\) и \(k\). Найдите последовательность \(a\) неотрицательных целых чисел размером не более \(25\), такую, что выполняются следующие условия. - Нет подпоследовательности \(a\) с суммой \(k\).
- Для всех \(1 \le v \le n\), где \(v \ne k\), существует подпоследовательность \(a\) с суммой \(v\).
Последовательность \(b\) является подпоследовательностью \(a\), если \(b\) может быть получена из \(a\) путем удаления нескольких (возможно, нуля или всех) элементов, не изменяя порядок оставшихся элементов. Например, \([5, 2, 3]\) является подпоследовательностью \([1, 5, 7, 8, 2, 4, 3]\). Можно показать, что при заданных ограничениях всегда существует решение. Выходные данные Первая строка вывода для каждого теста должна содержать одно целое число \(m\) (\(1 \le m \le 25\)) — размер выбранной вами последовательности. Вторая строка вывода для каждого теста должна содержать \(m\) целых чисел \(a_i\) (\(0 \le a_i \le 10^9\)) — элементы вашей выбранной последовательности. Если существует несколько решений, выведите любое из них. Примечание В первом примере нам просто нужна подпоследовательность, дающая в сумме \(1\), но не дающая в сумме \(2\). Таким образом, массив \(a=[1]\) подходит. Во втором примере все элементы больше \(k=1\), поэтому ни одна подпоследовательность не дает в сумме \(1\). Каждое другое целое число между \(1\) и \(n\) присутствует в массиве, поэтому существует подпоследовательность размера \(1\), дающая в сумме каждое из этих чисел.
| |
|
|
C. Дерево Фенвика
битмаски
Деревья
дп
Комбинаторика
математика
Перебор
Структуры данных
*2300
Пусть \(\operatorname{lowbit}(x)\) обозначает значение младшего двоичного бита \(x\), например, \(\operatorname{lowbit}(12)=4\), \(\operatorname{lowbit}(8)=8\). Для массива \(a\) длины \(n\), если массив \(s\) длины \(n\) удовлетворяет условию \(s_k=\left(\sum\limits_{i=k-\operatorname{lowbit}(k)+1}^{k}a_i\right)\bmod 998\,244\,353\) для всех \(k\), то \(s\) называется Деревом Фенвика массива \(a\). Обозначим его как \(s=f(a)\). Для целого положительного числа \(k\) и массива \(a\), \(f^k(a)\) определяется следующим образом: \(\) f^k(a)= \begin{cases} f(a)&\textrm{если }k=1\\ f(f^{k-1}(a))&\textrm{иначе.}\\ \end{cases} \(\) Вам дан массив \(b\) длины \(n\) и целое положительное число \(k\). Найдите массив \(a\), который удовлетворяет условию \(0\le a_i < 998\,244\,353\) и \(f^k(a)=b\). Можно доказать, что ответ всегда существует. Если существует несколько ответов, вы можете вывести любой из них. Выходные данные Для каждого набора входных данных выведите одну строку, содержащую корректный массив \(a\) длины \(n\). Примечание Из первого набора входных данных видно, что \(f^1([1,1,1,1,1,1,1,1])=[1,2,1,4,1,2,1,8]\). Во втором наборе входных данных видно, что \(f^2([1,2,3,4,5,6])=f^1([1,3,3,10,5,11])=[1,4,3,17,5,16]\).
| |
|
|
G3. Min-Fund Prison (Hard)
битмаски
графы
Деревья
дп
поиск в глубину и подобное
*2400
In the hard version, \(2 \leq \sum n \leq 10^5\) and \(1 \leq \sum m \leq 5 \times 10^{5}\) After a worker's strike organized by the Dementors asking for equal rights, the prison of Azkaban has suffered some damage. After settling the spirits, the Ministry of Magic is looking to renovate the prison to ensure that the Dementors are kept in check. The prison consists of \(n\) prison cells and \(m\) bi-directional corridors. The \(i^{th}\) corridor is from cells \(u_i\) to \(v_i\). A subset of these cells \(S\) is called a complex if any cell in \(S\) is reachable from any other cell in \(S\). Formally, a subset of cells \(S\) is a complex if \(x\) and \(y\) are reachable from each other for all \(x, y \in S\), using only cells from \(S\) on the way. The funding required for a complex \(S\) consisting of \(k\) cells is defined as \(k^2\). As part of your Intro to Magical Interior Design course at Hogwarts, you have been tasked with designing the prison. The Ministry of Magic has asked that you divide the prison into \(2\) complexes with \(\textbf{exactly one corridor}\) connecting them, so that the Dementors can't organize union meetings. For this purpose, you are allowed to build bi-directional corridors. The funding required to build a corridor between any \(2\) cells is \(c\). Due to budget cuts and the ongoing fight against the Death Eaters, you must find the \(\textbf{minimum total funding}\) required to divide the prison as per the Ministry's requirements or \(-1\) if no division is possible. Note: The total funding is the sum of the funding required for the \(2\) complexes and the corridors built. If after the division, the two complexes have \(x\) and \(y\) cells respectively and you have built a total of \(a\) corridors, the total funding will be \(x^2 + y^2 + c \times a\). Note that \(x+y=n\). Output Print the \(\textbf{minimum funding}\) required to divide the prison as per the Ministry's requirements or \(-1\) if no division is possible. Note In the first test case of the sample input, there is no way to divide the prison according to the Ministry's requirements. In the second test case, consider the corridor between cells \(1\) and \(5\) as the connection between the \(2\) complexes consisting of \(\{2, 3, 5, 6\}\) and \(\{1, 4\}\) cells respectively. There are no new corridors built. The total funding is \(4^2 + 2^2 = 20\). You can verify this is the minimum funding required.  In the third test case, build a corridor between \(2\) and \(4\). Consider the corridor between cells \(1\) and \(5\) as the connection between the \(2\) complexes consisting of \(\{3, 5, 6\}\) and \(\{1, 2, 4\}\) cells respectively. The total funding is \(3^2 + 3^2 + 7 \times 1 = 25\). You can verify this is the minimum funding required.  In the fourth test case, build a corridor between \(2\) and \(4\) and between \(5\) and \(7\). Consider the corridor between cells \(5\) and \(7\) as the connection between the \(2\) complexes consisting of \(\{1, 2, 4, 7\}\) and \(\{3, 5, 6\}\) cells respectively. The total funding is \(4^2 + 3^2 + 4 \times 2 = 33\). You can verify this is the minimum funding required.  Note for all test cases that there may be multiple ways to get the same funding but there is no other division which will have a more optimal minimum funding.
| |
|
|
B. Кот, Лиса и одинокий массив
Бинарный поиск
битмаски
жадные алгоритмы
математика
Структуры данных
*1300
Сегодня Кот и Лиса нашли массив \(a\), состоящий из \(n\) целых неотрицательных чисел. Определим одиночество массива \(a\) как наименьшее целое положительное число \(k\) (\(1 \le k \le n\)) такое, что для любых двух целых положительных чисел \(i\) и \(j\) (\(1 \leq i, j \leq n - k +1\)) выполняется \(\)a_i | a_{i+1} | \ldots | a_{i+k-1} = a_j | a_{j+1} | \ldots | a_{j+k-1},\(\) где \(x | y\) обозначает операцию побитового ИЛИ чисел \(x\) и \(y\). Другими словами, побитовое ИЛИ любых \(k\) подряд идущих элементов совпадает. Заметьте, что одиночество массива \(a\) определено корректно, так как при \(k = n\) условие выполняется. Кот и Лиса хотят узнать, насколько одинок массив \(a\). Помогите им вычислить одиночество найденного массива. Выходные данные Для каждого набора входных данных выведите одно целое число — одиночество данного массива. Примечание В первом примере одиночество массива с одним элементом равно \(1\), поэтому ответом будет \(1\). Во втором примере побитовое ИЛИ каждого подмассива длины \(k = 1\) равняется \(2\), поэтому одиночество всего массива равно \(1\). В седьмом примере верно, что \((0 | 1 | 3) = (1 | 3 | 2) = (3 | 2 | 2) = (2 | 2 | 1) = (2 | 1 | 0) = (1 | 0 | 3) = 3\), поэтому условие выполняется для \(k = 3\). Можно убедиться, что условие не выполняется при любом меньшем \(k\), поэтому ответ действительно равен \(3\).
| |
|
|
F. Запросы максимальной суммы НОД
битмаски
дп
Перебор
реализация
теория чисел
*3100
Для \(k\) целых положительных чисел \(x_1, x_2, \ldots, x_k\) значение \(\gcd(x_1, x_2, \ldots, x_k)\) является наибольшим общим делителем чисел \(x_1, x_2, \ldots, x_k\) — наибольшим целым числом \(z\) таким, что все числа \(x_1, x_2, \ldots, x_k\) делятся на \(z\). Вам даны три массива \(a_1, a_2, \ldots, a_n\), \(b_1, b_2, \ldots, b_n\) и \(c_1, c_2, \ldots, c_n\) длины \(n\), содержащие положительные целые числа. У вас также есть автомат, который позволяет вам менять местами \(a_i\) и \(b_i\) для любого \(i\) (\(1 \le i \le n\)). Каждый обмен стоит вам \(c_i\) монет. Найдите максимальное возможное значение \(\)\gcd(a_1, a_2, \ldots, a_n) + \gcd(b_1, b_2, \ldots, b_n)\text{,}\(\) которое вы можете получить, поменяв местами несколько элементов, и заплатив при этом не более \(d\) монет в сумме. Количество монет у вас меняется, поэтому найдите ответ на этот вопрос для каждого из \(q\) возможных значений \(d_1, d_2, \ldots, d_q\). Выходные данные Выведите \(q\) целых чисел — максимальное значение, которое можно получить для каждого из \(q\) возможных значений \(d\). Примечание В первом запросе из первого примера нам вообще не разрешается делать никаких обменов, поэтому ответом будет \(\gcd(1, 2, 3) + \gcd(4, 5, 6) = 2\). Во втором запросе одним из способов достижения оптимального значения является обмен \(a_2\) и \(b_2\), тогда ответом будет \(\gcd(1, 5, 3) + \gcd(4, 2, 6) = 3\). Во втором запросе из второго примера оптимально сделать обмены на позициях \(1\) и \(3\), тогда ответом будет \(\gcd(3, 3, 6, 9, 3) + \gcd(8, 4, 4, 8, 4) = 7\), и нам суммарно придется заплатить \(40\) монет.
| |
|
|
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\}\) |
| |
|
|
B. Бинарная покраска
битмаски
жадные алгоритмы
Конструктив
математика
*1100
Дано натуральное число \(x\). Найдите любую последовательность чисел \(a_0, a_1, \ldots, a_{n-1}\) такую, что: - \(1 \le n \le 32\),
- \(a_i\) равно \(1\), \(0\) или \(-1\) для всех \(0 \le i \le n - 1\),
- \(x = \displaystyle{\sum_{i=0}^{n - 1}{a_i \cdot 2^i}}\),
- Не существует \(0 \le i \le n - 2\) такого, что \(a_{i} \neq 0\) и \(a_{i + 1} \neq 0\).
Можно доказать, что под ограничениями задачи всегда существует как минимум одна подходящая последовательность. Выходные данные Для каждого набора входных данных на первой строке выведите число \(n\) (\(1 \le n \le 32\)) — длину последовательности \(a_0, a_1, \ldots, a_{n-1}\). На следующей строке выведите саму последовательность \(a_0, a_1, \ldots, a_{n-1}\). Если подходящих последовательностей несколько, вы можете вывести любую из них. Примечание В первом наборе входных данных, одной из подходящих последовательностей является \([1]\), так как \((1) \cdot 2^0 = 1\). Во втором наборе входных данных, одной из подходящих последовательностей является \([0,-1,0,0,1]\), так как \((0) \cdot 2^0 + (-1) \cdot 2^1 + (0) \cdot 2^2 + (0) \cdot 2^3 + (1) \cdot 2^4 = -2 + 16 = 14\).
| |
|
|
D. XORофикатор
битмаски
жадные алгоритмы
Перебор
хэши
*2300
Вам дана бинарная (состоящая из 0 и 1) матрица размера \(n \times m\). Также вам дан XORофикатор, который за одно применение умеет инвертировать все значения в выбранной строке (заменяет 0 на 1 и 1 на 0). Будем называть столбец матрицы особенным, если в нём ровно одна 1. Вам надо найти максимальное количество столбцов, которые можно сделать особенными одновременно, и сказать, в каких строках нужно для этого применить XORофикатор. Выходные данные Для каждого набора входных данных, выведите две строки. В первой строке выведите максимальное количество особенных столбцов, которых можно получить одновременно. Во второй строке выведите бинарную строку размера \(n\), где на \(i\)-й позиции стоит 0, если XORофикатор на \(i\)-й строке применять не нужно, и 1, если XORофикатор на \(i\)-й строке применять нужно. Если есть несколько подходящих конфигураций XORофикатора, вы можете вывести любую из них. Примечание В первом наборе входных данных можно применить XORофикатор ко второму ряду, тогда \(2\)-й, \(3\)-й и \(4\)-й столбцы будут особенными. Во втором наборе входных данных единственный столбец уже особенный, поэтому применять XORофикатор не надо.
| |
|
|
B. XOR последовательности
битмаски
жадные алгоритмы
*1000
Вам даны два различных целых неотрицательных числа \(x\) и \(y\). Рассмотрим две бесконечные последовательности \(a_1, a_2, a_3, \ldots\) и \(b_1, b_2, b_3, \ldots\), где - \(a_n = n \oplus x\);
- \(b_n = n \oplus y\).
Здесь \(x \oplus y\) обозначает операцию побитового исключающего ИЛИ чисел \(x\) и \(y\). Например, при \(x = 6\), первые \(8\) элементов последовательности \(a\) будут выглядеть следующим образом: \([7, 4, 5, 2, 3, 0, 1, 14, \ldots]\). Обратите внимание, что индексы элементов начинаются с \(1\). Ваша задача — найти длину наибольшего общего подотрезка\(^\dagger\) последовательностей \(a\) и \(b\). Другими словами, найдите такое максимальное целое число \(m\), что \(a_i = b_j, a_{i + 1} = b_{j + 1}, \ldots, a_{i + m - 1} = b_{j + m - 1}\) для некоторых \(i, j \ge 1\). \(^\dagger\)Подотрезком последовательности \(p\) называется последовательность \(p_l,p_{l+1},\ldots,p_r\), где \(1 \le l \le r\). Выходные данные Для каждого набора входных данных выведите одно целое число — длину наибольшего общего подотрезка. Примечание В первом наборе входных данных первые \(7\) элементов последовательностей \(a\) и \(b\) следующие: \(a = [1, 2, 3, 4, 5, 6, 7,\ldots]\) \(b = [0, 3, 2, 5, 4, 7, 6,\ldots]\) Можно показать, что не существуют такого целого положительного числа \(k\), что отрезок \([k, k + 1]\) встречается в \(b\) как подотрезок. Поэтому ответ равен \(1\). В третьем наборе входных данных первые \(20\) элементов последовательностей \(a\) и \(b\) следующие: \(a = [56, 59, 58, 61, 60, 63, 62, 49, 48, 51, 50, 53, 52, 55, 54, \textbf{41, 40, 43, 42}, 45, \ldots]\) \(b = [36, 39, 38, 33, 32, 35, 34, 45, 44, 47, 46, \textbf{41, 40, 43, 42}, 53, 52, 55, 54, 49, \ldots]\) Можно показать, что одним из наибольших общих подотрезков является подотрезок \([41, 40, 43, 42]\), длина которого равна \(4\).
| |
|
|
D. Исправление бинарной строки
битмаски
дп
жадные алгоритмы
Конструктив
Перебор
Строки
хэши
*1800
Вам дана бинарная строка \(s\) длины \(n\), состоящая из нулей и единиц. Вы можете сделать следующую операцию ровно один раз: - Выбрать целое число \(p\) (\(1 \le p \le n\)).
- Перевернуть подстроку \(s_1 s_2 \ldots s_p\). После выполнения этого шага строка \(s_1 s_2 \ldots s_n\) превратится в строку \(s_p s_{p-1} \ldots s_1 s_{p+1} s_{p+2} \ldots s_n\).
- После этого сделать циклический сдвиг строки \(s\) влево \(p\) раз. После выполнения этого шага изначальная строка \(s_1s_2 \ldots s_n\) превратится в строку \(s_{p+1}s_{p+2} \ldots s_n s_p s_{p-1} \ldots s_1\).
Например, если применить операцию к строке 110001100110 при \(p=3\), то после второго шага получится строка 011001100110, а после третьего шага 001100110011. Строка \(s\) называется \(k\)-правильной, если выполняются два условия: - \(s_1=s_2=\ldots=s_k\);
- \(s_{i+k} \neq s_i\) для любого \(i\) (\(1 \le i \le n - k\)).
Например, при \(k=3\) строки 000, 111000111 и 111000 являются \(k\)-правильными, а строки 000000, 001100 и 1110000 нет. Дано целое число \(k\), которое является делителем \(n\). Найдите целое число \(p\) (\(1 \le p \le n\)), после выполнения операции с которым строка \(s\) станет \(k\)-правильной или определите, что это невозможно. Обратите внимание, что если строка изначально является \(k\)-правильной, то к ней всё равно нужно применить ровно одну операцию. Выходные данные Для каждого набора входных данных выведите одно целое число — значение \(p\), чтобы сделать строку \(k\)-правильной, или \(-1\), если это невозможно. Если существует несколько решений, выведите любое из них. Примечание В первом наборе входных данных, если применить операцию при \(p=3\), то после второго шага операции строка станет равна 11100001, а после третьего 00001111. Эта строка является \(4\)-правильной. Во втором наборе входных данных можно показать, что не существует операции, после которой строка становится \(2\)-правильной. В третьем наборе входных данных, если применить операцию при \(p=7\), то после второго шага операции строка станет равна 100011100011, а после третьего 000111000111. Эта строка является \(3\)-правильной. В четвертом наборе входных данных после операции c любым \(p\) строка является \(5\)-правильной.
| |
|
|
G. Яся и таинственное дерево
битмаски
графы
Деревья
жадные алгоритмы
поиск в глубину и подобное
Строки
Структуры данных
*2300
Яся гуляла по лесу и совершенно случайно нашла дерево на \(n\) вершинах. Дерево — это связный неориентированный граф, в котором отсутствуют циклы. Рядом с деревом девочка нашла древний манускрипт, на котором записаны \(m\) запросов. Запросы бывают двух видов. Первый вид запросов описывается числом \(y\). Вес каждого ребра в дереве заменяется на побитовое исключающее «ИЛИ» веса этого ребра и числа \(y\). Второй вид описывается вершиной \(v\) и числом \(x\). Яся выбирает вершину \(u\) (\(1 \le u \le n\), \(u \neq v\)) и мысленно проводит в дереве двунаправленное ребро веса \(x\) из \(v\) в \(u\). Затем Яся находит простой цикл в получившемся графе и считает побитовое исключающее «ИЛИ» от всех рёбер на нём. Она хочет выбрать такую вершину \(u\), чтобы посчитанное значение было максимально. Это посчитанное значение и будет ответом на запрос. Можно показать существование и единственность такого цикла в указанных ограничениях (независимо от выбора \(u\)). Если ребро между \(v\) и \(u\) уже существовало, простым циклом будет путь \(v \to u \to v\). Обратите внимание, что запрос второго типа выполняется мысленно, то есть дерево после него никак не меняется. Помогите Ясе ответить на все запросы. Выходные данные Для каждого набора входных данных выведите ответы на запросы второго типа.
| |
|
|
B. Черепаха и бесконечная последовательность
битмаски
математика
*1300
Есть последовательность \(a_0, a_1, a_2, \ldots\) бесконечной длины. Изначально \(a_i = i\) для каждого неотрицательного целого \(i\). Каждый элемент последовательности будет одновременно изменяться через каждую секунду. \(a_i\) изменится на \(a_{i - 1} \mid a_i \mid a_{i + 1}\) для каждого положительного целого \(i\). \(a_0\) изменится на \(a_0 \mid a_1\). Здесь \(|\) обозначает побитовое ИЛИ. Черепаха должна найти значение \(a_n\) после \(m\) секунд. В частности, если \(m = 0\), то он должен найти начальное значение \(a_n\). Он устал вычислять так много значений, поэтому пожалуйста, помогите ему! Выходные данные Для каждого теста выведите одно целое число — значение \(a_n\) после \(m\) секунд. Примечание Через \(1\) секунду, \([a_0, a_1, a_2, a_3, a_4, a_5]\) станет \([1, 3, 3, 7, 7, 7]\). Через \(2\) секунды, \([a_0, a_1, a_2, a_3, a_4, a_5]\) станет \([3, 3, 7, 7, 7, 7]\).
| |
|
|
C. Черепаха и неполная последовательность
битмаски
жадные алгоритмы
Конструктив
математика
Перебор
реализация
*1800
Черепаха играла с последовательностью \(a_1, a_2, \ldots, a_n\), состоящей из положительных целых чисел. К сожалению, некоторые числа пропали во время игры. Теперь последовательность стала неполной. Может существовать произвольное количество индексов \(i\), таких что \(a_i\) становится \(-1\). Пусть новая последовательность будет \(a'\). Черепаха грустит. Но Черепаха помнит, что для каждого целого числа \(i\) от \(1\) до \(n - 1\), либо \(a_i = \left\lfloor\frac{a_{i + 1}}{2}\right\rfloor\), либо \(a_{i + 1} = \left\lfloor\frac{a_i}{2}\right\rfloor\) выполняется для исходной последовательности \(a\). Черепаха хочет, чтобы вы помогли ей завершить последовательность. Но иногда Черепаха ошибается, поэтому вам нужно сказать ей, если вы не можете завершить последовательность. Формально, вам нужно найти другую последовательность \(b_1, b_2, \ldots, b_n\), состоящую из положительных целых чисел, такую что: - Для каждого целого числа \(i\) от \(1\) до \(n\), если \(a'_i \ne -1\), то \(b_i = a'_i\).
- Для каждого целого числа \(i\) от \(1\) до \(n - 1\), либо \(b_i = \left\lfloor\frac{b_{i + 1}}{2}\right\rfloor\), либо \(b_{i + 1} = \left\lfloor\frac{b_i}{2}\right\rfloor\) выполняется.
- Для каждого целого числа \(i\) от \(1\) до \(n\), \(1 \le b_i \le 10^9\).
Если не существует последовательности \(b_1, b_2, \ldots, b_n\), которая удовлетворяет всем условиям выше, вам нужно сообщить \(-1\). Выходные данные Для каждого теста, если не существует последовательности \(b_1, b_2, \ldots, b_n\), которая удовлетворяет всем условиям, выведите одно целое число \(-1\). В противном случае выведите \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) — элементы последовательности \(b_1, b_2, \ldots, b_n\), которую вы нашли. Последовательность должна удовлетворять условию \(1 \le b_i \le 10^9\) для каждого целого числа \(i\) от \(1\) до \(n\). Если есть несколько ответов, выведите любой из них. Примечание В первом тесте, \([4, 2, 1, 2, 1, 2, 1, 3]\) также может быть ответом, в то время как \([4, 2, 5, 10, 5, 2, 1, 3]\) и \([4, 2, 1, 2, 1, 2, 1, 4]\) не могут. Во втором тесте, \([1, 2, 5, 2]\) также может быть ответом. С четвертого по шестой тесты, можно показать, что ответа нет, поэтому вы должны вывести \(-1\).
| |
|
|
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\)).
| |
|
|
F. Значения массивов
Бинарный поиск
битмаски
жадные алгоритмы
Структуры данных
*2500
У вас есть массив целых неотрицательных чисел \(a_1, a_2, \ldots, a_n\). Значение подотрезка длины \(\ge 2\): \(a[l, r] = [a_l, a_{l+1}, \ldots, a_r]\) — это минимальное значение \(a_i \oplus a_j\) такое, что \(l \le i < j \le r\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Вам нужно найти \(k\)-е наименьшее значение среди всех подотрезков длины \(\ge 2\). Выходные данные Для каждого набора входных данных в отдельной строке выведите \(k\)-ю порядковую статистику среди значений всех подотрезков длины хотя бы \(2\). Примечание В первом наборе входных данных мы имеем такие подотрезки и наименьшие значения побитового исключающего ИЛИ пары элементов: \([1,2]: 3\) \([2,3]: 1\) \([3,4]: 7\) \([4,5]: 1\) \([1,2,3]: 1\) \([2,3,4]: 1\) \([3,4,5]: 1\) \([1,2,3,4]: 1\) \([2,3,4,5]: 1\) \([1,2,3,4,5]: 1\) Упорядоченные значения: \(1, 1, 1, 1, 1, 1, 1, 1, 3, 7\). Таким образом, вторым наименьшим элементом будет \(1\).
| |
|
|
G. Ваша потеря
битмаски
Деревья
дп
Перебор
*3000
Вам дано дерево с \(n\) вершинами, пронумерованными от \(1\) до \(n\), а также массив длины \(n\). Значение \(i\)-й вершины — \(a_{i}\). Имеется \(q\) запросов. В каждом запросе даны 2 вершины с номерами \(x\) и \(y\). Рассмотрим путь от вершины с номером \(x\) до вершины с номером \(y\). Пусть путь представлен в виде \(x = p_0, p_1, p_2, \ldots, p_r = y\), где \(p_i\) — промежуточные вершины. Вычислите сумму \(a_{p_i}\oplus i\) по всем \(i\) таким, что \(0 \le i \le r\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Более формально, вычислите \(\)\sum_{i =0}^{r} a_{p_i}\oplus i\(\) Выходные данные Для каждого запроса выведите одно число — искомую сумму.
| |
|
|
C. Возрастающая последовательность с фиксированным ИЛИ
битмаски
жадные алгоритмы
Конструктив
*1300
Дано положительное целое число \(n\). Найдите самую длинную последовательность положительных целых чисел \(a=[a_1,a_2,\ldots,a_k]\), которая удовлетворяет следующим условиям, и выведите эту последовательность: - \(a_i\le n\) для всех \(1\le i\le k\).
- \(a\) строго возрастающая. То есть \(a_i>a_{i-1}\) для всех \(2\le i\le k\).
- \(a_i\,|\,a_{i-1}=n\) для всех \(2\le i\le k\), где \(|\) обозначает операцию побитового ИЛИ.
Выходные данные Для каждого набора входных выведите две строки. В первой строке выведите длину вашей сконструированной последовательности \(k\). Во второй строке выведите \(k\) положительных целых чисел, обозначающих последовательность. Если существует несколько самых длинных последовательностей, то вы можете вывести любую из них.
| |
|
|
D. Задачка на сетке
битмаски
дп
жадные алгоритмы
Перебор
реализация
*1800
Дан массив \(a\) размера \(n\). Есть сетка размером \(n \times n\). В \(i\)-й строке первые \(a_i\) ячеек черные, а остальные ячейки белые. Другими словами, через \((i,j)\) обозначим ячейку в \(i\)-й строке и \(j\)-м столбце, ячейки \((i,1), (i,2), \ldots, (i,a_i)\) черные, а ячейки \((i,a_i+1), \ldots, (i,n)\) белые. Вы можете выполнять следующие операции любое количество раз в любом порядке: - Покрасить подсетку размера \(2 \times 2\) в белый цвет;
- Покрасить всю строку в белый цвет. Обратите внимание, что вы не можете покрасить всю колонку в белый цвет.
Найдите минимальное количество операций, которое необходимо, чтобы покрасить все ячейки в белый цвет. Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество операций, которое необходимо, чтобы покрасить все ячейки в белый цвет. Примечание В первом наборе входных данных вам не нужно выполнять никаких операций. Во втором наборе входных данных вы можете выполнить следующие операции: - Покрасить \((1,1), (1,2), (2,1)\) и \((2,2)\) в белый цвет;
- Покрасить \((2,3), (2,4), (3,3)\) и \((3,4)\) в белый цвет;
- Покрасить \((3,1), (3,2), (4,1)\) и \((4,2)\) в белый цвет.
Можно доказать, что минимальное количество операций равно \(3\). В третьем наборе входных данных вы можете выполнить следующие операции: - Покрасить первую строку в белый цвет;
- Покрасить \((2,1), (2,2), (3,1)\) и \((3,2)\) в белый цвет.
Можно доказать, что минимальное количество операций равно \(2\).
| |
|
|
B. Восстановление И
битмаски
жадные алгоритмы
Конструктив
*1100
Вам дан массив \(b\) из \(n - 1\) целого числа. Массив \(a\) из \(n\) целых чисел называется хорошим, если \(b_i = a_i \, \& \, a_{i + 1}\) для всех \(1 \le i \le n-1\), где \(\&\) обозначает операцию побитового И. Постройте хороший массив или сообщите, что хороших массивов не существует. Выходные данные Для каждого набора входных данных выведите единственное целое число \(-1\), если хороших массивов не существует. В противном случае выведите через пробел \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i < 2^{30}\)) — элементы хорошего массива \(a\). Если существует несколько решений, вы можете вывести любое из них. Примечание В первом наборе входных данных \(b = [1]\). Возможным хорошим массивом является \(a=[5, 3]\), так как \(a_1 \, \& \, a_2 = 5 \, \& \, 3 = 1 = b_1\). Во втором наборе входных данных \(b = [2, 0]\). Возможным хорошим массивом является \(a=[3, 2, 1]\), так как \(a_1 \, \& \, a_2 = 3 \, \& \, 2 = 2 = b_1\) и \(a_2 \, \& \, a_3 = 2 \, \& \, 1 = 0 = b_2\). В третьем наборе входных данных \(b = [1, 2, 3]\). Можно показать, что хороших массивов не существует, поэтому ответом будет \(-1\). В четвертом наборе входных данных \(b = [3, 5, 4, 2]\). Возможный хороший массив — \(a=[3, 7, 5, 6, 3]\).
| |
|
|
D. Простая XOR раскраска
битмаски
графы
жадные алгоритмы
Конструктив
математика
теория чисел
*1900
Вам дан неориентированный граф с \(n\) вершинами, пронумерованными от \(1\) до \(n\). Между вершинами \(u\) и \(v\) существует ребро тогда и только тогда, когда \(u \oplus v\) является простым числом, где \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Раскрасьте все вершины графа в минимальное количество цветов так, чтобы ни одна пара вершин, непосредственно соединенных ребром, не была покрашена в один цвет. Выходные данные Для каждого набора входных данных выведите две строки. Первая строка должна содержать одно целое число \(k\) (\(1 \le k \le n\)) — минимально необходимое количество цветов. Вторая строка должна содержать \(n\) целых чисел \(c_1, c_2, \ldots, c_n\) (\(1 \le c_i \le k\)) — цвет каждой вершины. Если существует несколько решений, выведите любое из них. Примечание В первом наборе входных данных минимальное количество цветов равно \(1\), потому что дана только одна вершина. Во втором наборе входных данных минимальное количество цветов равно \(2\), потому что существует ребро, соединяющее \(1\) и \(2\) (\(1 \oplus 2 = 3\), что является простым числом). В третьем наборе входных данных минимальное количество цветов по-прежнему равно \(2\), потому что \(2\) и \(3\) могут быть окрашены одинаково, так как между \(2\) и \(3\) нет ребра (\(2 \oplus 3 = 1\), что не является простым числом). В четвертом наборе входных данных можно показать, что минимальное количество цветов равно \(3\). В пятом наборе входных данных можно показать, что минимальное количество цветов равно \(3\). В шестом наборе входных данных можно показать, что минимальное количество цветов равно \(4\).
| |
|
|
H. Игра в простые разделения
битмаски
бпф
дп
игры
математика
теория чисел
*3300
Алиса и Боб играют в игру с \(n\) кучками камней, где \(i\)-я кучка содержит \(a_i\) камней. Игроки делают ходы по очереди, причем Алиса ходит первой. На каждом ходу игрок выполняет следующие три шага: - Выбирает целое число \(k\) (\(1 \leq k \leq \frac n 2\)). Обратите внимание, что значение \(k\) может быть разным для разных ходов.
- Удаляет \(k\) куч камней.
- Выбирает еще \(k\) кучек камней и разделяет каждую кучку на две кучки. Количество камней в каждой новой куче должно быть простым числом.
Игрок, который не сможет сделать ход, проигрывает. Определите, кто выиграет, если оба игрока играют оптимально. Выходные данные Для каждого набора входных данных выведите «Alice» (без кавычек), если Алиса выиграет, и «Bob» (без кавычек) в противном случае. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «alIcE», «Alice» и «alice» будут считаться одинаковыми. Примечание В первом наборе входных данных есть \(2\) кучи камней с количествами камней \(2\) и \(1\) соответственно. Поскольку ни \(1\), ни \(2\) не могут быть разделены на два простых числа, Алиса не может сделать ход, поэтому Боб выигрывает. Во втором наборе входных данных есть \(3\) кучи камней с \(3\), \(5\) и \(7\) камнями соответственно. Алиса может выбрать \(k = 1\), удалить кучу из \(7\) камней, а затем разделить кучу из \(5\) камней на две кучи камней с простыми количествами \(2\) и \(3\). В итоге получится \(3\) кучки камней с \(3\), \(2\) и \(3\) камнями соответственно, в результате чего у Боба не остается ни одного допустимого хода, и Алиса выигрывает. В третьем наборе входных данных есть \(4\) кучи камней с \(4\), \(6\), \(8\) и \(10\) камнями соответственно. Алиса может выбрать \(k = 2\) и удалить две кучи камней \(8\) и \(10\). Далее она делит кучу камней \(4\) на две кучи камней с простыми количествами \(2\) и \(2\), а кучу камней \(6\) — на две кучи камней \(3\) и \(3\). После этого у Боба не остается допустимых ходов, и Алиса выигрывает. В четвертом наборе входных данных есть \(5\) куч камней, каждая из которых содержит \(8\) камней. Можно показать, что если оба игрока играют оптимально, то победит Боб.
| |
|
|
E. Xpinxor Grix
битмаски
дп
Конструктив
реализация
*2700
Дана матрица \(a\) размера \(n \times m\), каждая ячейка которой содержит неотрицательное целое число. Число, находящееся на пересечении \(i\)-й строки и \(j\)-го столбца матрицы, называется \(a_{i,j}\). Определим \(f(i)\) и \(g(j)\) как XOR всех чисел в \(i\)-й строке и \(j\)-м столбце соответственно. За одну операцию вы можете либо: - Выбрать любую строку \(i\), затем присвоить \(a_{i,j} := g(j)\) для каждого \(1 \le j \le m\); либо
- Выбрать любой столбец \(j\), затем присвоить \(a_{i,j} := f(i)\) для каждого \(1 \le i \le n\).
Пример применения операции к столбцу \(2\) матрицы. В этом примере, когда мы применяем операцию к столбцу \(2\), все элементы в этом столбце изменяются следующим образом: - \(a_{1,2} := f(1) = a_{1,1} \oplus a_{1,2} \oplus a_{1,3} \oplus a_{1,4} = 1 \oplus 1 \oplus 1 \oplus 1 = 0\)
- \(a_{2,2} := f(2) = a_{2,1} \oplus a_{2,2} \oplus a_{2,3} \oplus a_{2,4} = 2 \oplus 3 \oplus 5 \oplus 7 = 3\)
- \(a_{3,2} := f(3) = a_{3,1} \oplus a_{3,2} \oplus a_{3,3} \oplus a_{3,4} = 2 \oplus 0 \oplus 3 \oplus 0 = 1\)
- \(a_{4,2} := f(4) = a_{4,1} \oplus a_{4,2} \oplus a_{4,3} \oplus a_{4,4} = 10 \oplus 11 \oplus 12 \oplus 16 = 29\)
Вы можете применять операции любое количество раз. Затем мы вычислим \(\textit{красоту}\) финальной матрицы, суммируя абсолютные разности между всеми парами её соседних ячеек. Более формально, \(\textit{красота}(a) = \sum|a_{x,y} - a_{r,c}|\) для всех ячеек \((x, y)\) и \((r, c)\), если они соседние. Две ячейки считаются соседними, если они имеют общую сторону. Найдите минимальную \(\textit{красоту}\) среди всех достижимых матриц. Выходные данные Для каждого набора входных данных выведите одно целое число \(b\) — наименьшая возможная \(\textit{красота}\) матрицы. Примечание Обозначим \(r(i)\) как операцию первого типа, примененную к \(i\)-й строке, и \(c(j)\) как операцию второго типа, примененную к \(j\)-му столбцу. В первом наборе входных данных вы можете применить операцию \(c(1)\), которая присвоит \(a_{1,1} := 1 \oplus 3 = 2\). Затем мы получим эту матрицу: Во втором наборе входных данных вы можете применить операцию \(r(1)\), которая присвоит: - \(a_{1,1} := g(1) = 0 \oplus 5 = 5\)
- \(a_{1,2} := g(2) = 1 \oplus 4 = 5\)
- \(a_{1,3} := g(3) = 0 \oplus 4 = 4\)
Финальная матрица после выполнения операции: В третьем наборе входных данных лучший способ достичь минимальной \(\textit{красота}\) — применить три операции: \(c(3)\), \(r(2)\) и \(c(2)\). Финальная матрица:
| |
|
|
B. Веселая игра
битмаски
жадные алгоритмы
Конструктив
математика
*1100
Вова очень любит операцию побитового исключающего ИЛИ (будем обозначать ее \(\oplus\)). Недавно, когда он ложился спать, он придумал веселую игру. В начале игры Вова выбирает две бинарные последовательности \(s\) и \(t\) длины \(n\) и даёт их Ване. Бинарной последовательностью называется последовательность, состоящая только из чисел \(0\) и \(1\). Ваня может выбрать целые числа \(l, r\) такие, что \(1 \leq l \leq r \leq n\), и для всех \(l \leq i \leq r\) одновременно заменить \(s_i\) на \(s_i \oplus s_{i - l + 1}\), где \(s_i\) — это \(i\)-й элемент последовательности \(s\). Чтобы игра была интересной, в ней должна быть возможность победить. Ваня побеждает, если за неограниченное количество действий может получить из последовательности \(s\) последовательность \(t\). По последовательностям \(s\) и \(t\) определите, будет ли игра интересной. Выходные данные Для каждого набора входных данных выведите «Yes», если игра будет интересной, иначе выведите «No». Вы можете вывести каждую букву в любом регистре (например, «YES», «Yes», «yes», «yEs» будут распознаны как положительный ответ). Примечание В первом наборе входных данных Ваня не сможет изменить последовательность \(s\) с помощью единственного возможного действия выбора \(l = r = 1\). Во втором наборе входных данных последовательности \(s\) и \(t\) уже равны. В третьем наборе входных данных Ваня может действовать так: - Выбрать \(l = 3\) и \(r = 5\), тогда \(s\) станет равно \(\mathtt{101101010}\).
- Выбрать \(l = 5\) и \(r = 6\), тогда \(s\) станет равно \(\mathtt{101111010}\).
- Выбрать \(l = 7\) и \(r = 7\), тогда \(s\) станет равно \(\mathtt{101111110}\).
| |
|
|
E. Деревянная игра
битмаски
Деревья
жадные алгоритмы
математика
*2000
Вам дан лес из \(k\) корневых деревьев\(^{\text{∗}}\). Дровосек Тимофей хочет вырубить весь лес, применяя такую операцию: - Выбрать поддерево\(^{\text{†}}\) какой-либо вершины одного из деревьев и удалить его из дерева.
Тимофей очень любит битовые операции, поэтому он хочет, чтобы побитовое ИЛИ размеров поддеревьев, которые он удалял, было максимальным. Помогите ему и найдите, какой максимальный результат он может получить. Выходные данные Для каждого набора входных данных выведите одно целое число — максимальный результат, который можно получить. Примечание Во втором наборе входных данных деревья выглядят так: 
Первой операцией удалим все второе дерево. 
Второй операцией удалим вершину \(4\) из первого дерева. 
Третьей операцией удалим первое дерево. Результат равен \(6|1|3 = 7\) (\(|\) обозначает побитовое ИЛИ). В третьем наборе входных данных нужно удалить все дерево.
| |
|
|
G. Minecraft
битмаски
графы
дп
математика
Перебор
*2600
После победы в очередной игре в Bed Wars, Маша и Оля захотели отдохнуть и решили поиграть в новую игру. Маша дает Оле массив \(a\) длины \(n\) и число \(s\). Теперь задача Оли найти такое неотрицательное число \(x\), что \(\displaystyle\sum_{i=1}^{n} a_i \oplus x = s\). Но она очень устала после напряженного раунда, поэтому, пожалуйста, помогите ей в этом. Но такая задача показалась им слишком простой, поэтому они решили сделать числа большими (до \(2^k\)) и предоставить вам их двоичное представление. Выходные данные Для каждого набора входных данных в отдельной строке выведите строку длины \(k\), состоящую из нулей или единиц — битовую запись любого подходящего числа \(x\) (\(x \ge 0\)), начиная со старших битов, или \(-1\), если такого \(x\) не существует. Примечание В первом наборе входных данных \(s = 11, a = [14, 6, 12, 15]\), если \(x = 14\), то \(\displaystyle\sum_{i=1}^{n} a_i \oplus x = (14 \oplus 14) + (6 \oplus 14) + (12 \oplus 14) + (15 \oplus 14) = 0 + 8 + 2 + 1 = 11 = s\). Во втором наборе входных данных \(s = 41, a = [191, 158]\), если \(x = 154\), то \(\displaystyle\sum_{i=1}^{n} a_i \oplus x = (191 \oplus 154) + (158 \oplus 154) = 37 + 4 = 41 = s\).
| |
|
|
D. Падежи
битмаски
дп
Перебор
Строки
*2300
Вы лингвист, изучающий загадочный древний язык. Вы знаете, что - Его слова состоят только из первых \(c\) букв латинского алфавита.
- Каждое слово имеет падеж, который можно однозначно определить по его последней букве (разные буквы соответствуют разным падежам). Например, слова "ABACABA" и "ABA" (если они существуют) имеют одинаковый падеж в этом языке, потому что у них обоих одинаковое окончание 'A', в то время как "ALICE" и "BOB" принадлежат разным падежам. Если в языке нет падежа, соответствующего какой-либо букве, это означает, что слово не может заканчиваться на эту букву.
- Длина каждого слова составляет \(k\) или меньше.
У вас есть один текст, написанный на этом языке. К сожалению, поскольку язык действительно древний, пробелы между словами отсутствуют, и все буквы заглавные. Вам интересно, каково минимальное количество падежей может быть в этом языке. Можете ли вы это выяснить? Выходные данные Для каждого набора входных данных выведите одну строку, состоящую из одного целого числа, — минимальное количество падежей в языке. Примечание В первом наборе входных данных в языке должно быть пять падежей (для каждой из букв 'A', 'B', 'C', 'D', и 'E' должен быть падеж, который имеет соответствующее окончание). В четвертом наборе входных данных достаточно одного падежа с окончанием 'B'.
| |
|
|
G. Оптимизация решетки
meet-in-the-middle
битмаски
Перебор
хэши
*3400
Рассмотрим граф на сетке, состоящей из \(n\) строк и \(n\) столбцов. Пусть ячейка в строке \(x\) и столбце \(y\) будет обозначена как \((x,y)\). Существует направленное ребро из \((x,y)\) в \((x+1,y)\) с неотрицательным целым значением \(d_{x,y}\) для всех \(1\le x < n, 1\le y \le n\), а также существует направленное ребро из \((x,y)\) в \((x,y+1)\) с неотрицательным целым значением \(r_{x,y}\), для всех \(1\le x \le n, 1\le y < n\). Изначально вы находитесь в точке \((1,1)\) с пустым множеством \(S\). Вам нужно пройтись по ребрам и в конце концов достичь \((n,n)\). Каждый раз, когда вы проходите ребро, его значение будет добавляться в \(S\). Найдите максимальный MEX\(^{\text{∗}}\) множества \(S\), который можно получить, достигнув точки \((n,n)\). Выходные данные Для каждого набора входных данных выведите одно целое число — максимальное значение MEX для \(S\) при достижении \((n,n)\). Примечание В первом наборе входных данных граф решетки и один из оптимальных путей выглядят следующим образом: Во втором наборе входных данных граф сетки и один из оптимальных путей выглядят следующим образом:
| |
|
|
F. Запросы Светлячка
битмаски
математика
Потоки
Структуры данных
*1700
Светлячку дан массив \(a\) длины \(n\). Пусть \(c_i\) обозначает \(i\)-й циклический сдвиг\(^{\text{∗}}\) массива \(a\). Она создает новый массив \(b\) так, что \(b = c_1 + c_2 + \dots + c_n\), где \(+\) представляет собой конкатенацию\(^{\text{†}}\). Затем она задает вам \(q\) запросов. Для каждого запроса выведите сумму всех элементов в подмассиве \(b\), который начинается с \(l\)-го элемента и заканчивается \(r\)-м, включая оба конца. Выходные данные Для каждого запроса выведите ответ на новой строке. Примечание Для первого набора входных данных, \(b = [1, 2, 3, 2, 3, 1, 3, 1, 2]\).
| |
|
|
D. Инновационно новая задача
битмаски
дп
Перебор
*2600
Широко известный в узких кругах белорусский олимпиадник Леша решил немного подзаработать, чтобы купить себе квартиру площадью на один квадратный метр больше. Для этого он хочет составить и провести Super Rated Match (SRM) на сайте Torcoder.com. Но вот беда — суровый торкодерский координатор Иван не принимает ни одной Лешиной задачи, называя каждую обидным словом «боян». И вот после очередной предложенной задачи дело чуть не дошло до взаимной обиды. Вам предлагается выступить в роли справедливого судьи и определить, действительно ли задача является настолько инновационно новой, как уверен в этом Леша, или все-таки Иван прав, и похожая задача уже встречалась в прошедших SRM. Вам даны описания Лешиной задачи и задач из архива сайта Torcoder.com. Описание каждой задачи представляет собой последовательность слов. При этом гарантируется, что слова в Лешиной задаче не повторяются, в то время как описание задачи из архива может содержать произвольное количество повторяющихся слов. «Похожесть» Лешиной задачи на некоторую задачу из архива определим следующим образом. Среди всех перестановок слов предлагаемой задачи выберем ту, которая встречается в задаче из архива в качестве подпоследовательности. Если таких перестановок несколько, выберем ту, число инверсий в которой минимально. Тогда «похожесть» задачи можно записать в виде , где n — количество слов в задаче Леши, а x — количество инверсий в выбранной перестановке. Обратите внимание, что «похожесть» p — положительное число. Задачу назовем инновационно новой, если среди задач из архива Ивана не найдется ни одной задачи, которая содержит в себе в качестве подпоследовательности некоторую перестановку слов Лешиной задачи. Рассудите ребят, определив, является ли предлагаемая задача новой, либо указав задачу из архива, которая больше всего напоминает Лешину задачу. Выходные данные В случае, если Лешина задача является инновационно новой, выведите строку «Brand new problem!» (без кавычек). В противном случае в первой строке выведите номер задачи из архива, наиболее похожей на Лешину задачу. Если таких задач несколько, выведите ту, номер которой минимальный. Во второй строке выведите строку из символов [:, символа |, повторенного p раз, и символов :], где p — «похожесть» этой задачи на Лешину. Задачи нумеруются начиная с единицы в том порядке, в котором они заданы во входных данных. Примечание Напомним, что количество инверсий — это количество пар слов, которые в перестановке идут не в том порядке, в котором они шли в исходной задаче. Так, например, если исходная задача была «add two numbers», то перестановка «numbers add two» содержит две инверсии — пары слов «numbers» и «add», а также «numbers» и «two». Последовательность b1, b2, ..., bk называется подпоследовательностью последовательности a1, a2, ..., an, если найдется такой набор индексов 1 ≤ i1 < i2 < ... < ik ≤ n, что aij = bj. Иными словами, последовательность b может быть получена из a путем вычеркивания некоторых элементов. В первом тесте первая задача содержит в качестве подпоследовательности перестановку «find the palindrome next», в которой количество инверсий равно 1 (слова «palindrome» и «next»). Во втором тесте ни одна из задач не содержит в себе в качестве подпоследовательности перестановку слов задачи, предлагаемой Лешей.
| |
|
|
A. ЛНПП
Бинарный поиск
битмаски
жадные алгоритмы
Перебор
реализация
Строки
*800
Настоящее название этой задачи — «Лексикографически наибольшая подпоследовательность-палиндром» — слишком длинное, чтобы уместиться в заголовке страницы. Дана строка s, состоящая только из строчных латинских букв. Найдите ее лексикографически наибольшую подпоследовательность, являющуюся палиндромом. Непустую строку s[p1p2... pk] = sp1sp2... spk (1 ≤ p1 < p2 < ... < pk ≤ |s|) будем называть подпоследовательностью строки s = s1s2... s|s|, где |s| — длина строки s. Например, строки «abcb», «b» и «abacaba» являются подпоследовательностями строки «abacaba». Строка x = x1x2... x|x| лексикографически больше строки y = y1y2... y|y|, если либо |x| > |y| и x1 = y1, x2 = y2, ..., x|y| = y|y|, либо существует такое число r (r < |x|, r < |y|), что x1 = y1, x2 = y2, ..., xr = yr и xr + 1 > yr + 1. Символы в строках сравниваются как их ASCII-коды. Например, строка «ranger» лексикографически больше строки «racecar», а строка «poster» лексикографически больше строки «post». Строка s = s1s2... s|s| называется палиндромом, если она в точности совпадает со строкой rev(s) = s|s|s|s| - 1... s1. Иными словами, строка называется палиндромом, если она читается одинаково как слева направо, так и справа налево. Например, строками-палиндромами являются «racecar», «refer» и «z». Выходные данные Выведите лексикографически наибольшую подпоследовательность строки s, являющуюся палиндромом. Примечание Из всех различных подпоследовательностей строки «radar» палиндромами являются «a», «d», «r», «aa», «rr», «ada», «rar», «rdr», «raar» и «radar». Лексикографически наибольшей из них является «rr».
| |
|
|
A. Минимальное число операций
битмаски
жадные алгоритмы
математика
Перебор
теория чисел
*800
Даны два целых числа \(n\) и \(k\). За одну операцию вы можете вычесть из \(n\) любую степень \(k\). Формально, за одну операцию вы можете заменить \(n\) на \((n-k^x)\) для любого неотрицательного целого числа \(x\). Найдите минимальное число операций, необходимое, чтобы сделать \(n\) равным \(0\). Выходные данные Для каждого набора входных данных выведите минимальное число операций на отдельной строке. Примечание В первом наборе входных данных \(n = 5\) и \(k = 2\). Можно выполнить следующую последовательность операций: - Вычесть \(2^0 = 1\) из \(5\). После этого \(n\) принимает значение \(5 - 1 = 4\).
- Вычесть \(2^2 = 4\) из \(4\). После этого \(n\) принимает значение \(4 - 4 = 0\).
Можно доказать, что невозможно сделать \(n\) равным \(0\) меньше чем за \(2\) операции. Значит, \(2\) и есть ответ на задачу. Во втором наборе входных данных \(n = 3\) и \(k = 5\). Можно выполнить следующую последовательность операций: - Вычесть \(5^0 = 1\) из \(3\). После этого \(n\) принимает значение \(3 - 1 = 2\).
- Вычесть \(5^0 = 1\) из \(2\). После этого \(n\) принимает значение \(2 - 1 = 1\).
- Вычесть \(5^0 = 1\) из \(1\). После этого \(n\) принимает значение \(1 - 1 = 0\).
Можно доказать, что невозможно сделать \(n\) равным \(0\) меньше чем за \(3\) операции. Значит, \(3\) и есть ответ на задачу.
| |
|
|
C. Битовый баланс
битмаски
математика
расписания
реализация
Тернарный поиск
хэши
*1400
Даны три неотрицательных целых числа \(b\), \(c\) и \(d\). Найдите неотрицательное целое число \(a \in [0, 2^{61}]\), такое что \((a\, |\, b)-(a\, \&\, c)=d\), где \(|\) и \(\&\) обозначают операцию побитового ИЛИ и операцию побитового И соответственно. Если такое \(a\) существует, выведите его значение. Если решения не существует, выведите одно целое число \(-1\). Если существует несколько решений, выведите любое из них. Выходные данные Для каждого набора входных данных выведите значение \(a\) или \(-1\), если решения не существует. Обратите внимание, что \(a\) должно быть неотрицательным и не может превышать \(2^{61}\). Примечание В первом наборе входных данных \((0\,|\,2)-(0\,\&\,2)=2-0=2\). Так что \(a = 0\) является корректным ответом. Во втором наборе входных данных никакое значение \(a\) не удовлетворяет уравнению. В третьем наборе входных данных \((12\,|\,10)-(12\,\&\,2)=14-0=14\). Так что \(a = 12\) является корректным ответом.
| |
|
|
E. Матожидание квадрата
битмаски
дп
математика
Теория вероятностей
*2000
Дан массив, состоящий из \(n\) целых чисел \(a_1,a_2,\ldots,a_n\). Также дан массив \(p_1, p_2, \ldots, p_n\). Через \(S\) обозначим случайное мультимножество (т. е. оно может содержать равные элементы), которое строится следующим образом: - Изначально \(S\) пусто.
- Для каждого \(i\) от \(1\) до \(n\) добавить \(a_i\) в \(S\) с вероятностью \(\frac{p_i}{10^4}\). Обратите внимание, что каждый элемент добавляется независимо.
Пусть \(f(S)\) равно результату применения побитового исключающего ИЛИ ко всем элементам \(S\). Найдите математическое ожидание величины \((f(S))^2\). Выведите ответ по модулю \(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}\). Выходные данные Для каждого набора входных данных выведите математическое ожидание \((f(S))^2\) по модулю \(10^9 + 7\). Примечание В первом наборе входных данных \(a = [1, 2]\), и каждый элемент добавляется в \(S\) с вероятностью \(\frac{1}{2}\), поскольку \(p_1 = p_2 = 5000\) и \(\frac{p_i}{10^4} = \frac{1}{2}\). Поэтому есть всего \(4\) возможных исхода для \(S\), каждый из которых получается с вероятностью \(\frac{1}{4}\): - \(S = \varnothing\). В этом случае \(f(S) = 0\), \((f(S))^2 = 0\).
- \(S = \{1\}\). В этом случае \(f(S) = 1\), \((f(S))^2 = 1\).
- \(S = \{2\}\). В этом случае \(f(S) = 2\), \((f(S))^2 = 4\).
- \(S = \{1,2\}\). В этом случае \(f(S) = 1 \oplus 2 = 3\), \((f(S))^2 = 9\).
Значит, ответ равен \(0 \cdot \frac{1}{4} + 1 \cdot \frac{1}{4} + 4\cdot \frac{1}{4} + 9 \cdot \frac{1}{4} = \frac{14}{4} = \frac{7}{2} \equiv 500\,000\,007 \pmod{10^9 + 7}\). Во втором наборе входных данных \(a = [1, 1]\), \(a_1\) добавляется в \(S\) с вероятностью \(0.1\), а \(a_2\) добавляется в \(S\) с вероятностью \(0.2\). Есть всего \(3\) исхода для \(S\): - \(S = \varnothing\). В этом случае \(f(S) = 0\), \((f(S))^2 = 0\). Это происходит с вероятностью \((1-0.1) \cdot (1-0.2) = 0.72\).
- \(S = \{1\}\). В этом случае \(f(S) = 1\), \((f(S))^2 = 1\). Это происходит с вероятностью \((1-0.1) \cdot 0.2 + 0.1 \cdot (1-0.2) = 0.26\).
- \(S = \{1, 1\}\). В этом случае \(f(S) = 0\), \((f(S))^2 = 0\). Это происходит с вероятностью \(0.1 \cdot 0.2 = 0.02\).
Значит, ответ равен \(0 \cdot 0.72 + 1 \cdot 0.26 + 0 \cdot 0.02 = 0.26 = \frac{26}{100} \equiv 820\,000\,006 \pmod{10^9 + 7}\).
| |
|
|
E. Лучшая подпоследовательность
битмаски
графы
Паросочетания
поиск в глубину и подобное
Потоки
*2500
Задан целочисленный массив \(a\) размера \(n\). Скажем, что ценность массива равна его размеру минус количество единичных бит в побитовом ИЛИ всех элементов массива. Например, для массива \([1, 0, 1, 2]\) побитовое ИЛИ равно \(3\) (содержит \(2\) единичных бита), а ценность массива равна \(4-2=2\). Ваша задача — вычислить максимально возможную ценность некоторой подпоследовательности заданного массива. Выходные данные Для каждого набора входных данных выведите максимально возможную ценность некоторой подпоследовательности заданного массива.
| |
|
|
E1. Битовая игра (простая версия)
битмаски
игры
математика
Перебор
*2800
Это простая версия задачи. Единственное отличие заключается в том, что в этой версии вам нужно вывести победителя игры, а количество камней в каждой кучке фиксировано. Вы можете совершать взломы только если обе версии задачи решены. Алиса и Боб играют в знакомую игру, в которой они по очереди вынимают камни из \(n\) кучек. Изначально в \(i\)-й куче находится \(x_i\) камней, и она имеет значение \(a_i\). Игрок может забрать \(d\) камней из \(i\)-й кучи тогда и только тогда, когда выполняются оба следующих условия: - \(1 \le d \le a_i\), и
- \(x \, \& \, d = d\), где \(x\) — текущее количество камней в \(i\)-й куче, а \(\&\) обозначает операцию побитового И.
Алиса ходит первой. Игрок, который не может сделать ход, проигрывает. Вам даны значения \(a_i\) и \(x_i\) для каждой кучи. Определите, кто выиграет в данной игре, если оба игрока будут действовать оптимально. Выходные данные Для каждого набора входных данных выведите на отдельной строке имя победителя. Если победила Алиса, выведите «Alice», в противном случае выведите «Bob» (без кавычек). Примечание В первом наборе входных данных ни один из игроков не может взять ни одного камня из первой кучки, так как не существует значения \(d\), удовлетворяющего условиям. Из второй кучи в первый ход Алиса может вынуть от \(1\) до \(6\) камней. Независимо от того, какой ход сделает Алиса, Боб сможет вынуть остальные камни в свой ход. После хода Боба Алиса больше не может сделать ни одного хода, поэтому Боб выиграет. Для второго набора входных данных приведём один пример того, как может проходить игра. Алиса ходит первой и решает взять камни из первой кучи. Она не может взять \(17\) камней, потому что \(17 > 10\), что противоречит первому условию. Она не может взять \(10\) камней, потому что \(25 \, \& \, 10 = 8\), что противоречит второму условию. Один из вариантов — взять \(9\) камней; теперь в куче осталось \(16\) камней. В свой ход Боб решает взять камни из второй кучи; единственный вариант — взять все \(4\). Теперь ни из одной из первых двух куч больше нельзя взять ни одного камня, поэтому Алиса должна взять несколько камней из последней кучи. Она решает взять \(12\) камней, и Боб следует за ней, забирая последние \(2\) камня из этой кучи. Поскольку теперь у Алисы не осталось разрешённых ходов, Боб выигрывает. Можно показать, что независимо от того, какой стратегии придерживается Алиса, Боб всегда сможет выиграть, если будет играть оптимально.
| |
|
|
E2. Битовая игра (сложная версия)
битмаски
дп
математика
*3100
Это сложная версия задачи. Единственное отличие заключается в том, что в этой версии количество камней в каждой кучке не фиксировано, и вам нужно вывести количество вариантов игры, в которых выигрывает Боб. Вы можете совершать взломы только если обе версии задачи решены. Алиса и Боб играют в знакомую игру, в которой они по очереди вынимают камни из \(n\) кучек. Изначально в \(i\)-й куче находится \(x_i\) камней, и она имеет значение \(a_i\). Игрок может забрать \(d\) камней из \(i\)-й кучи тогда и только тогда, когда выполняются оба следующих условия: - \(1 \le d \le a_i\), и
- \(x \, \& \, d = d\), где \(x\) — текущее количество камней в \(i\)-й куче, а \(\&\) обозначает операцию побитового И.
Алиса ходит первой. Игрок, который не может сделать ход, проигрывает. Вам даны значения \(a_i\) для каждой кучи, но количество камней в \(i\)-й куче еще не определено. Для \(i\)-й кучи \(x_i\) может быть любым целым числом от \(1\) до \(b_i\) включительно. То есть можно выбрать массив \(x_1, x_2, \ldots, x_n\) такой, что условие \(1 \le x_i \le b_i\) выполняется для всех куч. Ваша задача — найти количество игр, в которых Боб выигрывает, если оба игрока играют оптимально. Две игры считаются различными, если количество камней хотя бы в одной кучке разное, то есть массивы \(x\) различаются хотя бы в одной позиции. Поскольку ответ может быть очень большим, выведите результат по модулю \(10^9 + 7\). Выходные данные Для каждого набора входных данных выведите одно целое число — количество игр, в которых Боб выигрывает, по модулю \(10^9 + 7\). Примечание В первом наборе входных данных, какие бы значения \(x_2\) и \(x_3\) мы ни выбрали, вторая и третья кучи всегда будут выбраны ровно один раз, прежде чем из них больше нельзя будет взять ни одного камня. Если \(x_1 = 2\), то ни один камень не может быть взят из нее, поэтому Боб сделает последний ход. Если \(x_1 = 1\) или \(x_1 = 3\), то на этой куче можно сделать ровно один ход, поэтому последний ход сделает Алиса. Таким образом, Боб выигрывает, если \(x = [2, 1, 1]\) или \(x = [2, 1, 2]\) или \(x = [2, 2, 1]\) или \(x = [2, 2, 2]\). Во втором наборе входных данных Боб выигрывает, если \(x_1 = 14\) или \(x_1 = 30\), убрав \(14 - k\) камней, где \(k\) — количество камней, убранных Алисой в свой ход. Боб также выигрывает в случае \(x_1 = 16\) или \(x_1 = 32\), поскольку у Алисы нет ни одного хода в начале.
| |
|
|
F. Приключения Алисы в сложении
битмаски
дп
Перебор
реализация
*2700
Обратите внимание на необычное ограничение по памяти. Чеширский Кот задал Алисе загадку: даны \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) и цель \(m\), существует ли способ вставить \(+\) и \(\times\) в круги выражения \(\)a_1 \circ a_2 \circ \cdots \circ a_n = m\(\) так, чтобы оно стало истинным? Мы следуем обычному порядку операций: \(\times\) выполняется перед \(+\). Алиса отлично играет в шахматы, но она не сильна в математике. Пожалуйста, помогите ей найти выход из Страны Чудес! Выходные данные Для каждого набора входных данных выведите «YES» (без кавычек), если возможно достичь цель, вставив \(+\) или \(\times\), и «NO» в противном случае. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание Возможные решения для первых четырех наборов входных данных приведены ниже. \(\)\begin{align*} 2 \times 1 + 1 \times 1 \times 2 &= 4 \\ 2 \times 1 + 1 + 1 \times 2 &= 5 \\ 2 \times 1 + 1 + 1 + 2 &= 6 \\ 2 + 1 + 1 + 1 + 2 &= 7 \\ \end{align*}\(\) В пятом наборе входных данных невозможно получить \(8\).
| |
|
|
H. Распространение сообщения
битмаски
дп
Комбинаторика
Перебор
*3500
Дан неориентированный граф с \(n\) вершинами и \(m\) рёбрами. Каждое ребро соединяет две вершины \((u, v)\) и каждый день появляется с вероятностью \(\frac{p}{q}\). Изначально в вершине \(1\) есть сообщение. В конце дня вершина имеет сообщение тогда и только тогда, когда сама она или хотя бы одна из смежных с ней вершин имела сообщение в прошлый день. Обратите внимание, что каждый день ребро выбирает своё появление независимо. Вычислите математическое ожидание количества дней, прежде чем все вершины получат сообщение, по модулю \(998\,244\,353\). Выходные данные Выведите одно целое число в единственной строке вывода — математическое ожидание количества дней, по модулю \(998\,244\,353\). Формально, пусть \(M = 998\,244\,353\). Можно показать, что точный ответ может быть представлен в виде несократимой дроби \(\frac{p}{q}\), где \(p\) и \(q\) — целые числа, и \(q \not \equiv 0 \pmod{M}\). Выведите целое число, равное \(p \cdot q^{-1} \bmod M\). Другими словами, выведите такое целое число \(x\), что \(0 \le x < M\) и \(x \cdot q \equiv p \pmod{M}\). Примечание В первом тесте ответ равен математическому ожиданию количества дней, прежде чем появится единственное ребро в графе, и оно равно \(\frac{1}{0.1}=10\). Во втором тесте ответ равен \(\frac{20}{9}\), прежде чем он будет взят по модулю \(998\,244\,353\). В третьем тесте единственная вершина уже имеет сообщение, поэтому ответ равен \(0\).
| |
|
|
C. Аля и перестановка
битмаски
Конструктив
математика
*1400
Але досталась сложная задача. К сожалению, она слишком занята баллотированием в студенческий совет. Пожалуйста, решите эту задачу за неё. Дано целое число \(n\). Постройте перестановку \(p\) целых чисел \(1, 2, \ldots, n\), которая максимизирует значение \(k\) (которое изначально равно \(0\)) после следующего процесса. Выполняется \(n\) операций, на \(i\)-й операции (\(i=1, 2, \dots, n\)): - Если \(i\) нечетно, то \(k=k\,\&\,p_i\), где \(\&\) обозначает операцию побитового И.
- Если \(i\) четно, то \(k=k\,|\,p_i\), где \(|\) обозначает операцию побитового ИЛИ.
Выходные данные Для каждого набора входных данных выведите максимальное значение \(k\) в первой строке и перестановку \(p_1, p_2,\ldots, p_n\) во второй строке. Если подходящих перестановок несколько, выведите любую из них. Примечание В первом наборе входных данных максимальное значение \(k\) получается следующим образом: Изначально \(k = 0\). - На \(1\)-й операции: \(1\) нечётно, поэтому Аля задает \(k\) равным \(k\&p_1 = 0\&2 = 0\).
- На \(2\)-й операции: \(2\) чётно, поэтому Аля задает \(k\) равным \(k|p_2 = 0|1 = 1\).
- На \(3\)-й операции: \(3\) нечетно, поэтому Аля задает \(k\) равным \(k\&p_3 = 1\&3 = 1\).
- На \(4\)-й операции: \(4\) четно, поэтому Аля задает \(k\) равным \(k|p_4 = 1|4 = 5\).
- На \(5\)-й операции: \(5\) нечетно, поэтому Аля задает \(k\) равным \(k\&p_5 = 5\&5 = 5\).
Итоговое значение \(k\) равно \(5\). Можно показать, что итоговое значение \(k\) не может превышать \(5\) для всех перестановок длины \(5\). Другой корректный ответ — \([2, 3, 1, 4, 5]\). Для второго набора входных данных максимальное значение \(k\) равно \(7\). Можно показать, что итоговое значение \(k\) не может быть больше \(7\) для всех перестановок длины \(6\). Другие корректные ответы: \([2, 4, 1, 6, 3, 5]\) и \([5, 2, 6, 1, 3, 4]\).
| |
|
|
F. XORофикатор 3000
битмаски
дп
теория чисел
*1900
Алиса уже много лет дарит подарки Бобу, а потому знает, что больше всего ему нравится делать побитовый XOR интересных чисел, при этом интересными Боб считает такие целые положительные числа \(x\), для которых выполнено \(x \not\equiv k (\bmod 2^i)\). Поэтому в этом году на его очередной день рождения она подарила ему сверхмощный «XORофикатор 3000», самую последнюю модель. Бобу подарок очень понравился, ведь благодаря нему он мог мгновенно делать XOR всех интересных чисел на любом отрезке от \(l\) до \(r\) включительно, а что, в самом деле, ещё нужно человеку для счастья? Но, к сожалению, прибор оказался настолько мощным, что в какой-то момент сделал XOR с самим собой и исчез. Боб был очень расстроен, и Алиса, чтобы хоть как-то подбодрить его, попросила вас написать свою версию «XORофикатора». Выходные данные Для каждого запроса выведите одно число — XOR всех чисел \(x\) на отрезке \([l, r]\) таких, что \(x \not\equiv k \mod 2^i\). Примечание В первом запросе на отрезке \([1, 3]\) интересными являются числа \(1\) и \(3\), поэтому ответом будет число \(1 \oplus 3 = 2\).
| |
|
|
G. Исследование Натлана
битмаски
дп
Комбинаторика
математика
Структуры данных
теория чисел
*2000
Вы исследуете потрясающий регион Натлан! Этот регион состоит из \(n\) городов, и каждый город имеет рейтинг привлекательности \(a_i\). Направленное ребро существует от города \(i\) к городу \(j\) тогда и только тогда, когда \(i < j\) и \(\gcd(a_i,a_j)\neq 1\), где \(\gcd(x, y)\) обозначает наибольший общий делитель (НОД) целых чисел \(x\) и \(y\). Начав с города \(1\), ваша задача — определить общее количество различных путей, которыми вы можете добраться до города \(n\), по модулю \(998\,244\,353\). Два пути различны тогда и только тогда, когда множество посещённых городов различно. Выходные данные Выведите общее количество различных путей, которыми вы можете добраться до города \(n\), по модулю \(998\,244\,353\). Примечание В первом примере пять путей следующие: - Город \(1\rightarrow\) Город \(5\)
- Город \(1\rightarrow\) Город \(2\rightarrow\) Город \(5\)
- Город \(1\rightarrow\) Город \(2\rightarrow\) Город \(3\rightarrow\) Город \(5\)
- Город \(1\rightarrow\) Город \(2\rightarrow\) Город \(4\rightarrow\) Город \(5\)
- Город \(1\rightarrow\) Город \(4\rightarrow\) Город \(5\)
Во втором примере два пути следующие: - Город \(1\rightarrow\) Город \(3\rightarrow\) Город \(5\)
- Город \(1\rightarrow\) Город \(2\rightarrow\) Город \(3\rightarrow\) Город \(5\)
| |
|
|
D. Divide OR Conquer
Бинарный поиск
битмаски
дп
реализация
Структуры данных
*2400
You are given an array \([a_1, a_2, \ldots a_n]\) consisting of integers between \(0\) and \(10^9\). You have to split this array into several segments (possibly one) in such a way that each element belongs to exactly one segment. Let the first segment be the array \([a_{l_1}, a_{l_1 + 1}, \ldots, a_{r_1}]\), the second segment be \([a_{l_2}, a_{l_2+ 1}, \ldots, a_{r_2}]\), ..., the last segment be \([a_{l_k}, a_{l_k+ 1}, \ldots, a_{r_k}]\). Since every element should belong to exactly one array, \(l_1 = 1\), \(r_k = n\), and \(r_i + 1 = l_{i+1}\) for each \(i\) from \(1\) to \(k-1\). The split should meet the following condition: \(f([a_{l_1}, a_{l_1 + 1}, \ldots, a_{r_1}]) \le f([a_{l_2}, a_{l_2+ 1}, \ldots, a_{r_2}]) \le \dots \le f([a_{l_k}, a_{l_k+1}, \ldots, a_{r_k}])\), where \(f(a)\) is the bitwise OR of all elements of the array \(a\). Calculate the number of ways to split the array, and print it modulo \(998\,244\,353\). Two ways are considered different if the sequences \([l_1, r_1, l_2, r_2, \ldots, l_k, r_k]\) denoting the splits are different. Output Print one integer — the number of ways to split the array, taken modulo \(998\,244\,353\). Note In the first two examples, every way to split the array is valid. In the third example, there are three valid ways to split the array: - \(k = 3\); \(l_1 = 1, r_1 = 1, l_2 = 2, r_2 = 2, l_3 = 3, r_3 = 3\); the resulting arrays are \([3]\), \([4]\), \([6]\), and \(3 \le 4 \le 6\);
- \(k = 2\); \(l_1 = 1, r_1 = 1, l_2 = 2, r_2 = 3\); the resulting arrays are \([3]\) and \([4, 6]\), and \(3 \le 6\);
- \(k = 1\); \(l_1 = 1, r_1 = 3\); there will be only one array: \([3, 4, 6]\).
If you split the array into two arrays \([3, 4]\) and \([6]\), the bitwise OR of the first array is \(7\), and the bitwise OR of the second array is \(6\); \(7 > 6\), so this way to split the array is invalid.
| |
|
|
C1. Shohag любит XOR (простая версия)
битмаски
математика
Перебор
теория чисел
*1200
Это простая версия задачи. Различия между двумя версиями выделены жирным шрифтом. Вы можете совершать взломы только в том случае, если решены обе версии задачи. У Shohag есть два целых числа \(x\) и \(m\). Помогите ему подсчитать количество целых чисел \(1 \le y \le m\) таких, что \(\mathbf{x \neq y}\) и \(x \oplus y\) является делителем\(^{\text{∗}}\) либо \(x\), либо \(y\), либо сразу обоих чисел. Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Выходные данные Для каждого набора входных данных выведите одно целое число — количество подходящих \(y\). Примечание В первом наборе входных данных, для \(x = 6\) существует \(3\) допустимых значения для \(y\) среди целых чисел от \(1\) до \(m = 9\) — числа \(4\), \(5\) и \(7\). - \(y = 4\) подходит, потому что \(x \oplus y = 6 \oplus 4 = 2\) и \(2\) является делителем как \(x = 6\), так и \(y = 4\).
- \(y = 5\) подходит, потому что \(x \oplus y = 6 \oplus 5 = 3\) и \(3\) является делителем \(x = 6\).
- \(y = 7\) подходит, потому что \(x \oplus y = 6 \oplus 7 = 1\) и \(1\) является делителем как \(x = 6\), так и \(y = 7\).
Во втором наборе входных данных для \(x = 5\) существует \(2\) допустимых значения для \(y\) среди целых чисел от \(1\) до \(m = 7\) — числа \(4\) и \(6\). - \(y = 4\) подходит, потому что \(x \oplus y = 5 \oplus 4 = 1\) и \(1\) является делителем как \(x = 5\), так и \(y = 4\).
- \(y = 6\) подходит, потому что \(x \oplus y = 5 \oplus 6 = 3\) и \(3\) является делителем \(y = 6\).
| |
|
|
C2. Shohag любит XOR (сложная версия)
битмаски
математика
Перебор
теория чисел
*1800
Это сложная версия задачи. Различия между двумя версиями выделены жирным шрифтом. Вы можете совершать взломы только в том случае, если решены обе версии задачи. У Shohag есть два целых числа \(x\) и \(m\). Помогите ему подсчитать количество целых чисел \(1 \le y \le m\) таких, что \(x \oplus y\) делится\(^{\text{∗}}\) либо на \(x\), либо на \(y\), либо сразу на оба числа. Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Выходные данные Для каждого набора входных данных выведите одно целое число — количество подходящих \(y\). Примечание В первом наборе входных данных для \(x = 7\) существует \(3\) допустимых значения \(y\) среди целых чисел от \(1\) до \(m = 10\) — числа \(1\), \(7\) и \(9\). - \(y = 1\) подходит, потому что \(x \oplus y = 7 \oplus 1 = 6\) и \(6\) делится на \(y = 1\).
- \(y = 7\) подходит, потому что \(x \oplus y = 7 \oplus 7 = 0\) и \(0\) делится как на \(x = 7\), так и на \(y = 7\).
- \(y = 9\) подходит, потому что \(x \oplus y = 7 \oplus 9 = 14\) и \(14\) делится на \(x = 7\).
| |
|
|
C. Упорядоченные перестановки
битмаски
жадные алгоритмы
Комбинаторика
Конструктив
математика
*1600
Рассмотрим перестановку\(^{\text{∗}}\) \(p_1, p_2, \ldots, p_n\) чисел от \(1\) до \(n\). Введём следующую сумму\(^{\text{†}}\): \(\)S(p) = \sum_{1 \le l \le r \le n} \min(p_l, p_{l + 1}, \ldots, p_r)\(\) Рассмотрим все перестановки длины \(n\) с максимальным значением \(S(p)\). Необходимо вывести \(k\)-ю из них в лексикографическом\(^{\text{‡}}\) порядке, или сообщить, что их меньше \(k\). Выходные данные Для каждого набора входных данных, если подходящих перестановок меньше \(k\), выведите \(-1\). Иначе выведите \(k\)-ю подходящую перестановку. Примечание Посчитаем искомую сумму для всех перестановок длины \(3\) в лексикографическом порядке: | Перестановка | Значение \(S(p)\) | | \([1, 2, 3]\) | \(10\) | | \([1, 3, 2]\) | \(10\) | | \([2, 1, 3]\) | \(9\) | | \([2, 3, 1]\) | \(10\) | | \([3, 1, 2]\) | \(9\) | | \([3, 2, 1]\) | \(10\) | В первом наборе необходимо вывести вторую подходящую перестановку длины \(3\). Посмотрев на таблицу, мы видим, что это перестановка \([1, 3, 2]\). Во втором наборе необходимо вывести третью подходящую перестановку длины \(3\). Посмотрев на таблицу, мы видим, что это перестановка \([2, 3, 1]\).
| |
|
|
C. Cube
битмаски
дп
поиск в глубину и подобное
*2000
You are given an \(n\times n\times n\) big three-dimensional cube that contains \(n^3\) numbers. You have to choose \(n\) of those numbers so that their sum is as small as possible. It is, however, forbidden to choose two numbers that are located in the same plane. That is, if we identify the positions in the cube by three Cartesian coordinates, then choosing two numbers from positions \((x,y,z)\) and \((x',y',z')\) is forbidden if \(x=x'\), \(y=y'\), or \(z=z'\). Output The output consists of a single number. It is the minimum sum of \(n\) numbers chosen from the cube according to the above rules.
| |
|
|
E. Преобразование матриц
битмаски
графы
жадные алгоритмы
Перебор
поиск в глубину и подобное
реализация
Структуры данных
*2300
Даны две матрицы \(A\) и \(B\) размером \(n \times m\), заполненные целыми числами от \(0\) до \(10^9\). Вы можете выполнять следующие операции над матрицей \(A\) в любом порядке любое количество раз: - &=: выбрать два целых числа \(i\) и \(x\) (\(1 \le i \le n\), \(x \ge 0\)) и заменить каждый элемент в строке \(i\) на результат побитового И между числом \(x\) и этим элементом. Формально, для каждого \(j \in [1, m]\) элемент \(A_{i,j}\) заменяется на \(A_{i,j} \text{ & } x\);
- |=: выбрать два целых числа \(j\) и \(x\) (\(1 \le j \le m\), \(x \ge 0\)) и заменить каждый элемент в столбце \(j\) на результат побитового ИЛИ между числом \(x\) и этим элементом. Формально, для каждого \(i \in [1, n]\) элемент \(A_{i,j}\) заменяется на \(A_{i,j} \text{ | } x\);
В разных операциях можно выбирать разные значения \(x\). Определите, возможно ли преобразовать матрицу \(A\) в матрицу \(B\) с помощью нескольких (возможно, нуля) указанных операций. Выходные данные Для каждого набора входных данных выведите Yes, если можно преобразовать \(A\) в \(B\), или No в противном случае. Каждую букву можно выводить в любом регистре. Примечание Рассмотрим второй набор входных данных и приведем последовательность операций, позволяющих получить из матрицы \(A\) матрицу \(B\): Изначально матрица выглядит так: \(\begin{bmatrix} 10&10\\ 42&42\\ \end{bmatrix}\) Применим операцию первого типа с параметрами \(i = 1\) и \(x = 0\). В результате получим матрицу: \(\begin{bmatrix} 0&0\\ 42&42\\ \end{bmatrix}\) Применим операцию первого типа с параметрами \(i = 2\) и \(x = 0\). В результате получим матрицу: \(\begin{bmatrix} 0&0\\ 0&0\\ \end{bmatrix}\) Применим операцию второго типа с параметрами \(j = 1\) и \(x = 21\). В результате получим матрицу: \(\begin{bmatrix} 21&0\\ 21&0\\ \end{bmatrix}\) Применим операцию второго типа с параметрами \(j = 2\) и \(x = 21\). В результате получим матрицу: \(\begin{bmatrix} 21&21\\ 21&21\\ \end{bmatrix}\) Таким образом, мы преобразовали матрицу \(A\) в матрицу \(B\).
| |
|
|
F. Ним
битмаски
дп
жадные алгоритмы
игры
Комбинаторика
кратчайшие пути
Перебор
реализация
*2700
Кратко напомним правила игры «Ним». Имеется \(n\) кучек камней, при этом в кучке \(i\) изначально лежит какое-то число камней. Два игрока по очереди выбирают непустую кучку и берут из нее произвольное положительное (строго больше \(0\)) количество камней. Проигрывает тот, кто не может сделать ход. Дан массив \(a\), состоящий из \(n\) целых чисел. Артем и Руслан решили играть в Ним на подотрезках массива. Каждый из \(q\) раундов определяется отрезком \((l_i, r_i)\), где элементы массива \(a_{l_i}, a_{l_i+1}, \dots, a_{r_i}\) рассматриваются как размеры кучек камней. До начала игры Руслан может удалить любое количество кучек из выбранного подотрезка. Однако хотя бы одна кучка должна остаться, поэтому в рамках одного раунда он может удалить не более \((r_i - l_i)\) кучек. Разрешается удалить \(0\) кучек. После удаления ребята играют в Ним на всех оставшихся кучках из этого отрезка. Все раунды независимы: удаления, произведенные в одном раунде, не влияют на исходный массив или другие раунды. Руслану нужно удалить как можно больше кучек так, чтобы Артем, который будет ходить первым, проиграл. Для каждого раунда определите: - максимальное количество кучек, которые Руслан может удалить;
- количество способов выбрать максимальное количество кучек для удаления.
Два способа считаются различными, если существует такая позиция \(i\), что в одном из способов кучка на позиции \(i\) удаляется, а во втором — нет. Поскольку количество способов может быть большим, выведите его по модулю \(998\,244\,353\). Если в каком-то раунде Руслан не может сделать так, чтобы Артем проиграл, выведите для этого раунда одно число -1. Выходные данные Для каждого раунда: - если Руслан может победить, выведите два целых числа — максимальное количество кучек, которые можно удалить, и количество способов удалить максимальное количество кучек, взятое по модулю \(998\,244\,353\);
- иначе выведите -1.
| |
|
|
J. Xorderable Array
битмаски
Структуры данных
*2600
You are given an array \(A\) of \(N\) integers: \([A_1, A_2, \dots, A_N]\). The array \(A\) is \((p, q)\)-xorderable if it is possible to rearrange \(A\) such that for each pair \((i, j)\) that satisfies \(1 \leq i < j \leq N\), the following conditions must be satisfied after the rearrangement: \(A_i \oplus p \leq A_j \oplus q\) and \(A_i \oplus q \leq A_j \oplus p\). The operator \(\oplus\) represents the bitwise xor. You are given another array \(X\) of length \(M\): \([X_1, X_2, \dots, X_M]\). Calculate the number of pairs \((u, v)\) where array \(A\) is \((X_u, X_v)\)-xorderable for \(1 \leq u < v \leq M\). Output Output a single integer representing the number of pairs \((u, v)\) where array \(A\) is \((X_u, X_v)\)-xorderable for \(1 \leq u < v \leq M\). Note Explanation for the sample input/output #1 The array \(A\) is \((1, 1)\)-xorderable by rearranging the array \(A\) to \([0, 0, 3]\). Explanation for the sample input/output #2 The array \(A\) is \((12, 10)\)-xorderable by rearranging the array \(A\) to \([13, 0, 7, 24, 22]\).
| |
|
|
C. Кевин и бинарные строки
битмаски
жадные алгоритмы
Перебор
реализация
Строки
*1200
Кевин обнаружил бинарную строку \(s\), которая начинается с 1 и передал её вам. Ваша задача — выбрать две непустые подстроки\(^{\text{∗}}\) строки \(s\) (которые могут пересекаться), чтобы максимизировать значение XOR этих двух подстрок. XOR двух бинарных строк \(a\) и \(b\) определяется как результат операции \(\oplus\), примененной к двум числам, полученным путем представления \(a\) и \(b\) как бинарных чисел, где самый левый бит является старшим. Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ (XOR). Выбранные вами строки могут содержать ведущие нули. Выходные данные Для каждого тестового случая выведите четыре целых числа \(l_1, r_1, l_2, r_2\) (\(1 \le l_1 \le r_1 \le |s|\), \(1 \le l_2 \le r_2 \le |s|\)) — в случае если две подстроки, которые вы выбрали, это \(s_{l_1} s_{l_1 + 1} \ldots s_{r_1}\) и \(s_{l_2} s_{l_2 + 1} \ldots s_{r_2}\). Если есть несколько решений, выведите любое из них. Примечание В первом наборе мы можем выбрать \( s_2=\texttt{1} \) и \( s_1 s_2 s_3=\texttt{111} \), и \( \texttt{1}\oplus\texttt{111}=\texttt{110} \). Можно доказать, что невозможно получить больший результат. Кроме того, \( l_1=3\), \(r_1=3\), \(l_2=1\), \(r_2=3 \) также является допустимым решением. Во втором наборе, \( s_1 s_2 s_3=\texttt{100} \), \( s_1 s_2 s_3 s_4=\texttt{1000} \), результат \( \texttt{100}\oplus\texttt{1000}=\texttt{1100} \), что является максимумом.
| |
|
|
I2. Кевин и загадка (сложная версия)
битмаски
бпф
математика
*3500
Это сложная версия задачи. Отличие между версиями заключается в том, что в этой версии вам необходимо найти количество хороших массивов. Вы можете делать взломы только в том случае, если решили все версии этой задачи. Кевин посещает Красную Церковь и нашел загадку на стене. Пусть для массива \( a \) величина \( c(l,r) \) обозначает количество различных чисел среди \( a_l, a_{l+1}, \ldots, a_r \). В частности, если \( l > r \), \( c(l,r) = 0 \). Вам дана строка \( s \) длиной \( n \), содержащая только \( \texttt{L} \) и \( \texttt{R} \). Назовем неотрицательный массив \( a \) хорошим, если для всех \( 1 \leq i \leq n \) выполняются следующие условия: - если \(s_i=\verb!L!\), то \(c(1,i-1)=a_i\);
- если \(s_i=\verb!R!\), то \(c(i+1,n)=a_i\).
Вам нужно найти количество хороших массивов \(a\). Поскольку ответ может быть большим, вам нужно вывести ответ по модулю \(998\,244\,353\). Выходные данные Для каждого набора входных данных выведите количество хороших массивов по модулю \(998\,244\,353\). Примечание Все массивы, удовлетворяющие условиям, можно найти в простой версии этой задачи.
| |
|
|
E. Сломанные запросы
Бинарный поиск
битмаски
интерактив
Конструктив
Перебор
реализация
*2400
Вы — волшебник, чье творение было уничтожено драконом. Вы полны решимости выследить его с помощью волшебного AOE-трекера. Но с ним, похоже, кто-то играет... Это интерактивная задача Есть скрытый бинарный массив \(a\) длины \(n\) (\(\mathbf{n}\) является степенью 2) и скрытое целое число \(k\ (2 \le k \le n - 1)\). Массив \(a\) содержит ровно одну 1 (а все остальные элементы равны 0). Для двух целых \(l\) и \(r\) (\(1 \le l \le r \le n\)) определим сумму диапазона \(s(l, r) = a_l + a_{l+1} + \cdots + a_r\). У вас есть волшебное устройство, которое принимает диапазоны и возвращает суммы диапазонов, но оно возвращает противоположный результат, когда диапазон имеет длину хотя бы \(k\). Формально, в одном запросе вы можете задать ему пару целых \([l, r]\), где \(1 \le l \le r \le n\), и он вернёт либо \(0\), либо \(1\), в соответствии со следующими правилами: - Если \(r - l + 1 < k\), то он вернёт \(s(l, r)\).
- Если \(r - l + 1 \ge k\), то он вернёт \(1 - s(l, r)\).
Найдите \(k\), используя не более \(33\) запросов. Устройство является неадаптивным. Это означает, что скрытые \(a\) и \(k\) фиксируются перед взаимодействием и не изменяются во время взаимодействия. Протокол взаимодействия Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных. Далее следует описание наборов входных данных. Первая строка каждого набора входных данных содержит одно целое положительное число \(n\) (\(4 \le n \le 2^{30}\)) — длину скрытого массива. Гарантируется, что \(\mathbf{n}\) — это степень 2; то есть \(n = 2^m\) для некоторого целого неотрицательного числа \(m\). Вы можете делать запросы следующим образом — выведите одну строку вида «\(\mathtt{?}\,l\,r\)», где \(1 \le l \le r \le n\). После этого считайте одно целое число: \(0\) или \(1\), как описано в условии. Если вы хотите дать ответ \(k\), выведите «\(\mathtt{!}\,k\)». Затем взаимодействие продолжается со следующим набором входных данных. Вывод ответа не учитывается при подсчете количества выполненных запросов. После вывода каждого запроса не забудьте вывести перевод строки и сбросить буфер вывода\(^{\text{∗}}\). В противном случае вы получите вердикт Решение «зависло». На любом шаге взаимодействия, если вы считали \(-1\) вместо корректных данных, ваше решение должно немедленно завершиться. Это означает, что ваше решение получит вердикт Неправильный ответ из-за некорректного запроса или любой другой ошибки. Если программа не завершится, вы можете получить любой вердикт, так как ваша программа продолжит чтение из закрытого потока. Взломы Формат взломов должен быть следующим: первая строка должна содержать одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее должно следовать описание наборов входных данных. Первая и единственная строка каждого набора входных данных должна содержать три целых числа \(n\), \(p\), и \(k\) (\(4 \le n \le 2^{30}\), \(1 \le p \le n\), \(2 \le k \le n - 1\)) — длина скрытого массива \(a\), позиция единственной 1 в \(a\) и скрытое \(k\). \(n\) должно быть степенью \(2\). Примечание В первом наборе входных данных \(k = 6\), а 1 в скрытом массиве находится на позиции 6, так что \(a = [0, 0, 0, 0, 0, 1, 0, 0]\). - Для запроса 3 5, поскольку \(5-3+1 = 3 < k\), устройство отвечает правильно. Поскольку значение 6 не входит в диапазон \([3, 5]\), устройство отвечает \(0\).
- Для запроса 1 8, поскольку \(8 - 1 + 1 = 8 \ge k\), устройство неправильно отвечает \(0\).
- Для запроса 4 8, поскольку \(8 - 4 + 1 = 5 < k\), устройство правильно отвечает \(1\).
- Для запроса 3 8, поскольку \(8 - 3 + 1 = 6 \ge k\), устройство неправильно отвечает \(0\).
Затем решение в примере выводит \(6\), что является правильным ответом. Во втором наборе входных данных \(k = 2\), а 1 в скрытом массиве находится на позиции 3, так что \(a = [0, 0, 1, 0]\). Обратите внимание, что в примере решению может не хватать информации для определения \(k\).
| |
|
|
F. MEX-ИЛИ-мания
битмаски
Перебор
реализация
снм
Структуры данных
*2700
Последовательность чисел \(b_1, b_2, \ldots, b_n\) является хорошей, если \(\operatorname{mex}(b_1, b_2, \ldots, b_n) - (b_1 | b_2 | \ldots | b_n) = 1\). Здесь \(\operatorname{mex(c)}\) обозначает MEX\(^{\text{∗}}\) набора чисел \(c\), а \(|\) обозначает операцию побитового ИЛИ. У Шохага есть целочисленная последовательность \(a_1, a_2, \ldots, a_n\). Он выполнит следующие \(q\) обновлений последовательности \(a\): - \(i\) \(x\) — увеличить \(a_i\) на \(x\).
После каждого обновления помогите Шохагу найти длину самого длинного хорошего подмассива\(^{\text{†}}\) массива \(a\). Выходные данные Для каждого набора входных данных выведите \(q\) строк — в \(i\)-й строке выведите длину самого длинного хорошего подмассива \(a\) после \(i\)-го обновления. Примечание В первом наборе входных данных после первого обновления массив становится \([0, 0, 1, 0, 1, 1]\). Весь массив является хорошим, так как \(\operatorname{mex}([0, 0, 1, 0, 1, 1]) - (0 | 0 | 1 | 0 | 1 | 1) = 2 - 1 = 1\). После второго обновления массив становится равен \([0, 0, 3, 0, 1, 1]\), и его подмассив \([0, 1, 1]\) имеет максимальную длину среди всех хороших подмассивов. Наконец, после третьего обновления массив становится равен \([0, 0, 3, 0, 1, 4]\), и два его подмассива \([0, 0]\) и \([0, 1]\) имеют максимальную длину среди всех хороших подмассивов.
| |
|
|
G. Змейки
битмаски
графы
дп
снм
*2100
Предположим, вы играете в игру, где игровое поле выглядит как полоска из \(1 \times 10^9\) квадратных ячеек, пронумерованных от \(1\) до \(10^9\). У вас есть \(n\) змеек (пронумерованных от \(1\) до \(n\)), которые нужно разместить в некоторых ячейках. Изначально каждая змейка занимает ровно одну ячейку, и вы не можете разместить более одной змейки в одной ячейке. После этого начинается игра. Игра длится \(q\) секунд. Каждую секунду происходит один из двух типов событий: - змейка \(s_i\) увеличивается: если змейка \(s_i\) занимала ячейки \([l, r]\), она увеличивается до отрезка \([l, r + 1]\);
- змейка \(s_i\) уменьшается: если змейка \(s_i\) занимала ячейки \([l, r]\), она уменьшается до отрезка \([l + 1, r]\).
Каждую секунду происходит ровно одно из событий. Если в любой момент времени какая-либо змея наткнется на какое-либо препятствие (либо на другую змею, либо на конец полосы), вы проигрываете. В противном случае вы выигрываете со счетом, равным максимальной ячейке, занятой какой-либо змеей на данный момент. Какой минимально возможный счет вы можете получить? Выходные данные Выведите одно целое число — минимально возможный счет. Примечание В первом тесте оптимальная стратегия заключается в том, чтобы разместить вторую змею в ячейке \(1\), третью змею — в \(2\), а первую — в \(3\). Максимальная занятая ячейка — ячейка \(4\), и это минимально возможный результат. Во втором тесте одна из оптимальных стратегий — следующая: нужно поставить - змейку \(2\) в позицию \(1\);
- змейку \(3\) в позицию \(4\);
- змейку \(5\) в позицию \(6\);
- змейку \(1\) в позицию \(9\);
- змейку \(4\) в позицию \(10\).
| |
|
|
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\).
| |
|
|
F1. Xor медиан (простая версия)
битмаски
дп
Комбинаторика
математика
Перебор
*2700
Это простая версия задачи. Отличие между версиями заключается в том, что в этой версии ограничения на \(t\), \(k\) и \(m\) ниже. Вы можете делать взломы только в том случае, если решили все версии этой задачи. Последовательность \(a\) из \(n\) целых чисел называется хорошей, если выполняется следующее условие: - Пусть \(\text{cnt}_x\) — количество вхождений \(x\) в последовательность \(a\). Для всех пар \(0 \le i < j < m\), по крайней мере одно из следующих условий должно быть истинным: \(\text{cnt}_i = 0\), \(\text{cnt}_j = 0\) или \(\text{cnt}_i \le \text{cnt}_j\). Другими словами, если и \(i\), и \(j\) присутствуют в последовательности \(a\), то число вхождений \(i\) в \(a\) меньше или равно числу вхождений \(j\) в \(a\).
Вам даны целые числа \(n\) и \(m\). Вычислите значение побитового XOR медиан\(^{\text{∗}}\) всех хороших последовательностей \(a\) длины \(n\), таких, что \(0\le a_i < m\). Обратите внимание, что значение \(n\) может быть очень большим, поэтому вместо него вам даётся его двоичное представление. Выходные данные Для каждого набора входных данных выведите одно целое число — побитовый XOR медиан всех хороших последовательностей \(a\) длины \(n\), где \(0\le a_i < m\) Примечание В первом наборе входных данных, \(n = 10_2 = 2\) и \(m = 3\). Существуют такие последовательности с элементами меньше \(m\): \([0, 0]\), \([0, 1]\), \([0, 2]\), \([1, 0]\), \([1, 1]\), \([1, 2]\), \([2, 0]\), \([2, 1]\), \([2, 2]\). Все они являются хорошими, поэтому ответ равен \(0 \oplus 0 \oplus 0 \oplus 0 \oplus 1 \oplus 1 \oplus 0 \oplus 1 \oplus 2 = 3\). Во втором наборе входных данных, \(n = 11_2 = 3\) и \(m = 3\). Некоторыми хорошими последовательностями являются \([2, 2, 2]\), \([1, 0, 1]\), и \([2, 0, 1]\). Однако последовательность \([2, 0, 0]\) не является хорошей, потому что \(\text{cnt}_0 = 2\), \(\text{cnt}_2 = 1\). Следовательно, если мы выберем \(i = 0\) и \(j = 2\), то \(i < j\) выполняется, а \(\text{cnt}_i \le \text{cnt}_j\) неверно.
| |
|
|
F2. Xor медиан (сложная версия)
битмаски
дп
Комбинаторика
математика
Перебор
*3000
Это сложная версия задачи. Отличие между версиями заключается в том, что в этой версии ограничения на \(t\), \(k\) и \(m\) выше. Вы можете делать взломы только в том случае, если решили все версии этой задачи. Последовательность \(a\) из \(n\) целых чисел называется хорошей, если выполняется следующее условие: - Пусть \(\text{cnt}_x\) — количество вхождений \(x\) в последовательность \(a\). Для всех пар \(0 \le i < j < m\), по крайней мере одно из следующих условий должно быть истинным: \(\text{cnt}_i = 0\), \(\text{cnt}_j = 0\) или \(\text{cnt}_i \le \text{cnt}_j\). Другими словами, если и \(i\), и \(j\) присутствуют в последовательности \(a\), то число вхождений \(i\) в \(a\) меньше или равно числу вхождений \(j\) в \(a\).
Вам даны целые числа \(n\) и \(m\). Вычислите значение побитового XOR медиан\(^{\text{∗}}\) всех хороших последовательностей \(a\) длины \(n\), таких, что \(0\le a_i < m\). Обратите внимание, что значение \(n\) может быть очень большим, поэтому вместо него вам даётся его двоичное представление. Выходные данные Для каждого набора входных данных выведите одно целое число — побитовый XOR медиан всех хороших последовательностей \(a\) длины \(n\), где \(0\le a_i < m\) Примечание В первом наборе входных данных, \(n = 10_2 = 2\) и \(m = 3\). Существуют такие последовательности с элементами меньше \(m\): \([0, 0]\), \([0, 1]\), \([0, 2]\), \([1, 0]\), \([1, 1]\), \([1, 2]\), \([2, 0]\), \([2, 1]\), \([2, 2]\). Все они являются хорошими, поэтому ответ равен \(0 \oplus 0 \oplus 0 \oplus 0 \oplus 1 \oplus 1 \oplus 0 \oplus 1 \oplus 2 = 3\). Во втором наборе входных данных, \(n = 11_2 = 3\) и \(m = 3\). Некоторыми хорошими последовательностями являются \([2, 2, 2]\), \([1, 0, 1]\), и \([2, 0, 1]\). Однако последовательность \([2, 0, 0]\) не является хорошей, потому что \(\text{cnt}_0 = 2\), \(\text{cnt}_2 = 1\). Следовательно, если мы выберем \(i = 0\) и \(j = 2\), то \(i < j\) выполняется, а \(\text{cnt}_i \le \text{cnt}_j\) неверно.
| |
|
|
C. Поездка на олимпиаду
битмаски
жадные алгоритмы
Конструктив
математика
*1500
В предстоящем году будет много командных олимпиад, поэтому преподавателям «Т-поколения» предстоит собрать команду из трех школьников для участия в них. Любые три школьника покажут достойный результат на любой командной олимпиаде. Но выиграть олимпиаду это еще пол дела, для начала нужно до нее добраться... У каждого школьника есть самостоятельность, выражаемая целым числом. В «Т-поколении» есть по одному школьнику с самостоятельностями от \(l\) до \(r\) включительно. Для команды из трех школьников с самостоятельностями \(a\), \(b\) и \(c\) значение их командной самостоятельности равно \((a \oplus b) + (b \oplus c) + (a \oplus c)\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Ваша задача — выбрать любую тройку школьников с максимально возможной командной самостоятельностью. Выходные данные Для каждого набора входных данных выведите три попарно различных целых числа \(a, b\) и \(c\), такие что \(l \le a, b, c \le r\) и значение выражения \((a \oplus b) + (b \oplus c) + (a \oplus c)\) максимально возможное. Если существует несколько троек с максимальным значением, можно вывести любую. Примечание В первом наборе входных данных единственная, с точностью до перестановки, подходящая тройка чисел (\(a, b, c\)) это (\(0, 1, 2\)). Во втором наборе входных данных одна из подходящих троек это (\(8, 7, 1\)), \((8 \oplus 7) + (7 \oplus 1) + (8 \oplus 1) = 15 + 6 + 9 = 30\), можно показать, что \(30\) — максимально возможное значение \((a \oplus b) + (b \oplus c) + (a \oplus c)\) при \(0 \le a, b, c \le 8\).
| |
|
|
D. Кевин и числа
битмаски
Структуры данных
*1600
Кевин написал на доске \(n\) целых чисел — набор \(a\). Кевин может выполнить следующую операцию любое число раз: - Выбрать на доске два целых числа \(x, y\), таких что \(|x - y| \leq 1\), стереть их, а затем написать на доске вместо них целое число \(x + y\).
Кевин хочет узнать, возможно ли преобразовать эти целые числа в набор \(b\) размера \(m\) с помощью некоторой последовательности операций. Два набора \(a\) и \(b\) считаются одинаковыми тогда и только тогда, когда их мультимножества совпадают. Другими словами, для любого числа \(x\) количество его вхождений в \(a\) должно равняться количеству его вхождений в \(b\). Выходные данные Для каждого набора входных данных выведите «Yes», если возможно преобразовать \(a\) в \(b\), и «No» в противном случае. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В первом наборе входных данных вы можете стереть \(4, 5\) и записать \(9\). Во втором наборе входных данных вы не можете стереть \(3, 6\). В третьем наборе входных данных возможна такая последовательность операций: - Стереть \(2, 2\) и записать \(4\). Теперь на доске записаны \(1, 2, 4\).
- Стереть \(1, 2\) и записать \(3\). Теперь на доске записаны \(3, 4\).
В четвертом наборе входных данных возможна такая последовательность операций: - Стереть \(1, 1\) и записать \(2\). Теперь на доске записаны \(2, 3, 3\).
- Стереть \(2, 3\) и записать \(5\). Теперь на доске записаны \(3, 5\).
| |
|
|
E. Кевин и И
битмаски
дп
жадные алгоритмы
математика
Перебор
сортировки
*2000
У Кевина есть целочисленная последовательность \(a\) длины \(n\). Также у Кевина есть \(m\) типов магии, где \(i\)-й тип магии может быть представлен целым числом \(b_i\). Кевин может выполнить не более \(k\) (возможно, ноль) магических операций: - Выбрать два индекса \(i\) (\(1\leq i\leq n\)) и \(j\) (\(1\leq j\leq m\)), а затем сделать \(a_i\) равным \(a_i\ \&\ b_j\). Здесь \(\&\) обозначает операцию побитового И.
Найдите минимально возможную сумму последовательности \(a\) после выполнения не более \(k\) операций. Выходные данные Для каждого набора входных данных выведите одно целое число — минимально возможную сумму последовательности \(a\) после выполнения не более \(k\) операций. Примечание В первом наборе входных данных возможна такая последовательность операций: - Сделать \(a_1\) равным \(a_1\ \&\ b_1\). Последовательность станет равна \([5]\).
- Сделать \(a_1\) равным \(a_1\ \&\ b_3\). Последовательность станет равна \([1]\).
Во втором наборе входных данных возможна такая последовательность операций: - Сделать \(a_1\) равным \(a_1\ \&\ b_3\). Последовательность станет равна \([1, 6]\).
- Сделать \(a_2\) равным \(a_2\ \&\ b_3\). Последовательность станет равна \([1, 2]\).
| |
|
|
H. Генератор галактик
битмаски
дп
Комбинаторика
*3500
В двумерной вселенной звезда может быть представлена как точка \((x,y)\) на двумерной плоскости. Две звезды соединены напрямую, если и только если их \(x\) или \(y\) координаты одинаковы, и между ними нет других звезд на отрезке. Определим галактику как связную компоненту, состоящую из звезд, соединенных напрямую или косвенно (через другие звезды). Для набора звезд его значение определяется как минимальное количество галактик, которое можно получить для этого набора, после выполнения следующей операции любое (возможно, нулевое) количество раз: в рамках операции вы можете выбрать точку \((x,y)\), в которой нет звезды. Если звезда, созданная в этой точке, может быть соединена напрямую как минимум с \(3\) звездами, то вы создаете в этой точке звезду. Вам дана матрица \(a\) размера \(n\times n\), состоящая из \(0\) и \(1\) и описывающая набор звёзд \(S\). Звезда находится в \((x,y)\) тогда и только тогда, когда \(a_{x,y}=1\). Вычислите сумму значений всех непустых подмножеств \(S\) по модулю \(10^9 + 7\). Выходные данные Для каждого набора входных данных выведите сумму значений всех непустых подмножеств \(S\) по модулю \(10^9 + 7\). Примечание В первом наборе входных данных \(S\) пусто. У \(S\) нет непустых подмножеств. Поэтому ответ \(0\). Во втором наборе входных данных \(S = \{(1,2),(2,1)\}\). У \(S\) есть \(3\) непустых подмножества. - \(\{(1,2)\}\) и \(\{(2,1)\}\) — в наборе только одна звезда, образующая \(1\) галактику.
- \(\{(1,2),(2,1)\}\) — две звезды в наборе не соединены, образуя \(2\) галактики.
Таким образом, ответ равен \(1+1+2=4\). В третьем наборе входных данных \(S = \{(1,2),(3,1),(3,3)\}\). У \(S\) есть \(7\) непустых подмножеств. - \(\{(1,2)\}\), \(\{(3,1)\}\) и \(\{(3,3)\}\) — в наборе только одна звезда, образующая \(1\) галактику.
- \(\{(1,2),(3,1)\}\) и \(\{(1,2),(3,3)\}\) — две звезды в наборе не соединены, образуя \(2\) галактики.
- \(\{(3,1),(3,3)\}\) — две звезды в наборе соединены, образуя \(1\) галактику.
- \(\{(1,2),(3,1),(3,3)\}\) — изначально звезда \((1,2)\) не входит в галактику, образованную \((3,1)\) и \((3,3)\). Вы можете выполнить операцию, создав звезду в \((3,2)\), соединяющую эти три звезды, образуя \(1\) галактику.
Таким образом, ответ равен \(1+1+1+2+2+1+1=9\).
| |
|
|
C. Битовые горки
битмаски
дп
Комбинаторика
математика
*2300
Вам дан массив \(a_1, a_2, \ldots, a_n\). А также три переменные \(P,Q,R\), изначально равные нулю. Вам необходимо поочерёдно обработать все числа \(a_1, a_2, \ldots, a_n\), в порядке от \(1\) до \(n\). Обрабатывая очередное \(a_i\), вы должны сделать ровно одно из трёх действий на выбор: - \(P := P \oplus a_i\)
- \(Q := Q \oplus a_i\)
- \(R := R \oplus a_i\)
\(\oplus\) обозначает операцию побитового исключающего ИЛИ. Выполняя действия, надо соблюдать главное правило: необходимо, чтобы после каждого действия все три числа \(P,Q,R\) не были попарно различны. Всего есть \(3^n\) способов произвести все \(n\) действий. Сколько из них не нарушают главное правило? Так как ответ может быть достаточно большим, найдите его по модулю \(10^9 + 7\). Выходные данные Для каждого набора входных данных выведите количество способов произвести все \(n\) действий, не нарушая главное правило, по модулю \(10^9 + 7\). Примечание В первом наборе входных данных 3 валидные последовательности операций: PPP, QQQ, RRR Во втором наборе входных данных 9 валидных последовательностей операций: PPPP, PPPQ, PPPR, QQQP, QQQQ, QQQR, RRRP, RRRQ, RRRR.
| |
|
|
D. Обход графа
битмаски
графы
Паросочетания
*2400
Вам задан взвешенный неориентированный граф. Ваша задача найти наименьшую длину такого цикла, который начинается (и заканчивается) в вершине 1 и проходит по каждому ребру хотя бы раз. Граф может содержать кратные ребра (т.е. несколько ребер между парой вершин) и петли (ребра из вершины в себя). Выходные данные Выведите искомую длину цикла или -1 если такой не существует.
| |
|
|
D. Патруль Битоникса
битмаски
Комбинаторика
математика
Перебор
поиск в глубину и подобное
*2900
Байтляндия пытается отправить космическую миссию на планету Bit-X. Их задачу усложняет то, что орбита планеты регулярно патрулируется Капитаном Битониксом, возглавляющим космические подразделения планеты Bit-X. Вокруг Bit-X есть n станций пронумерованных по часовой стрелке от 1 до n. Станции равномерно расположены по круговой орбите, то есть станции с номерами i и i + 1 (1 ≤ i < n), а также станции с номерами 1 и n, являются соседними. Расстояние между любой парой соседних станций равняется m космическим милям. Патрулирование Капитана Битоникса заключается в том, что от запрыгивает в свою ракету на одной из станций и летает по кругу, пролетая по меньшей мере одну космическую милю перед тем, как приземлится на некоторой станции (возможно, той, с которой он взлетал). Ракета Битоникса движется на энергии, получаемой от сжигания баков с топливом. После того, как Битоникс использует x-литровый бак с топливом и выбирает направление (по или против часовой стрелки), ракета пролетает ровно x космических миль по круговой орбите в выбранном направлении. Обратите внимание, что у ракеты нет тормозов; ракета не может остановиться, пока не опустошится бак с топливом. Например, предположим, что n = 3, m = 60, а у Битоникса есть баки с топливом на 10, 60, 90 и 100 литров. Если Битоникс стартует со станции номер 1 и использует 100-литровый бак, чтобы лететь по часовой стрелке, затем использует 90-литровый бак, чтобы лететь по часовой стрелке, а затем использует 10-литровый бак, чтобы лететь против часовой стрелки, то он приземлится на станции номер 1, совершив корректный патруль. Обратите внимание, что Битоникс не обязан использовать все доступные баки с топливом. В данном примере Битоникс также может просто использовать 60-литровый бак, чтобы долететь до станции 2 или 3. Однако, если бы n равнялось 3, m равнялось бы 60, а Битониксу были доступны только один бак на 10 литров и один бак на 100 литров, то он никак не смог бы совершить корректный патруль (он бы не смог приземлиться ровно на странции). Космическое агентство Байтляндии хочет уничтожить некоторые топливные баки Капитана Битоникса таким образом, чтобы он не мог совершить ни одного корректного патруля. Сколькими способами можно уничтожить некоторое подмножество топливных баков Капитана Битоникса таким образом, чтобы он не мог совершить ни одного корректного патруля? Найдите описанное количество способов и выведите остаток от его деления на 1000000007 (109 + 7). Выходные данные Выведите единственное число — количество различных подмножеств топливных баков Капитана Битоникса таких, что их уничтожение не позвонит ему совершать корректные патрули, по модулю 1000000007 (109 + 7). Примечание Все топливные баки различны, даже если объемы некоторых из них совпадают.
| |
|
|
B. Массив
битмаски
реализация
*1500
Задан массив a, состоящий из n целых чисел: a1, a2, ..., an. Требуется найти минимальный по включению отрезок [l, r] (1 ≤ l ≤ r ≤ n) такой, что среди чисел al, al + 1, ..., ar ровно k различных чисел. Отрезок [l, r] (1 ≤ l ≤ r ≤ n; l, r — целые) длины m = r - l + 1, удовлетворяющий заданному свойству, называется минимальным по включению, если не существует удовлетворяющего этому свойству отрезка [x, y] длины меньшей m такого, что 1 ≤ l ≤ x ≤ y ≤ r ≤ n. Обратите внимание, что отрезок [l, r] не обязан быть минимальным по длине среди всех отрезков удовлетворяющих заданному свойству. Выходные данные Выведите через пробел пару целых чисел l и r (1 ≤ l ≤ r ≤ n) такую, что отрезок [l, r] является ответом на задачу. Если искомого отрезка не существует, выведите «-1 -1» без кавычек. Если правильных ответов несколько, выведите любой. Примечание В первом примере среди чисел a1 и a2 ровно два различных. Во втором примере отрезок [2, 5] является минимальным по включению отрезком с тремя разными числами, но не является минимальным по длине среди таких отрезков. В третьем примере нет ни одного отрезка с четырьмя разными числами.
| |
|
|
D. Змейка
битмаски
графы
поиск в глубину и подобное
реализация
*2200
Напомним правила одной очень популярной игры, которая называется «Змейка» (эта игра также известна как «Удав», «Питон» или «Червяк»). Игровое поле представляет собой прямоугольную таблицу размера n × m. Некоторые клетки поля считаются непроходимыми (стены), все остальные клетки поля проходимы. Вы управляете змейкой, которая состоит из сегментов. Каждый сегмент занимает ровно одну проходимую клетку поля, причем в любой проходимой клетке находится не более одного сегмента. Все сегменты пронумерованы целыми числами от 1 до k, где k — длина змейки. Сегмент с номером 1 называется головой, а с номером k — хвостом. Для любого i (1 ≤ i < k) клетки поля, в которых находятся сегменты с номерами i и i + 1, являются соседними, то есть имеют общую сторону. В одной из проходимых клеток поля находится яблоко. Цель змейки — достичь яблока и съесть его (то есть сделать так, чтобы голова оказалась в той же клетке, где и яблоко). В процессе игры змейка двигается. За один ход змейка может переместить голову в одну из соседних клеток поля. При этом все остальные сегменты подтягиваются за головой. То есть каждый сегмент с номером i (1 < i ≤ k) перемещается в клетку, где только что находился сегмент с номером i - 1. Считайте, что перемещение всех сегментов, включая голову, происходит одновременно (смотри второй тестовый пример). Если после хода голова змейки оказывается в непроходимой клетке или в клетке, в которой находится другой сегмент, то змейка умирает. Поэтому такие ходы мы будем считать недопустимыми. Ваша задача — определить наименьшее количество допустимых ходов, необходимых для того, чтобы змейка достигла яблока. Выходные данные В выходной файл выведите единственное целое число — наименьшее количество ходов, необходимое для достижения яблока. Если яблока достичь невозможно, выведите -1.
| |
|
|
B. Таблица
битмаски
дп
Комбинаторика
математика
*1900
У Джона Доу есть таблица размером n × m. Джон Доу может нарисовать в некоторых ячейках таблицы точки, не более одной точки в одной ячейке таблицы. С помощью таких операций Джон Доу хочет добиться того, чтобы в любой квадратной подтаблице размера n × n количество точек было в точности равно k. Джону Доу стало интересно, сколькими различными способами можно заполнить эту таблицу точками так, чтобы описанное условие выполнялось. Поскольку это число может быть очень велико, Джон Доу просит узнать его остаток от деления на 1000000007 (109 + 7). Считайте, что Джон всегда рисует точку строго в центре некоторой ячейки. Два способа заполнения таблицы точками считаются различными, если существует ячейка таблицы, в которой в одном способе нарисована точка, а в другом — нет. Выходные данные В единственной строке выведите целое число — остаток от деления описанного количества способов на 1000000007 (109 + 7). Примечание Рассмотрим первый тестовый пример: Серая область принадлежит обоим квадратам 5 × 5. Поэтому, если в ней есть одна точка, то больше нигде точек быть не может. Если в одной из белых областей есть точка, то в другой тоже должна быть точка. Таким образом есть 20 вариантов, в которых точка стоит в серой области и 25 вариантов в которых в каждой из белых областей стоит по точке. Всего 45 вариантов.
| |
|
|
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» в противном случае. Ответы на запросы выводите в том порядке, в котором запросы заданы во входных данных.
| |
|
|
B. Friends
Бинарный поиск
битмаски
математика
Структуры данных
*2700
You have n friends and you want to take m pictures of them. Exactly two of your friends should appear in each picture and no two pictures should contain the same pair of your friends. So if you have n = 3 friends you can take 3 different pictures, each containing a pair of your friends. Each of your friends has an attractiveness level which is specified by the integer number ai for the i-th friend. You know that the attractiveness of a picture containing the i-th and the j-th friends is equal to the exclusive-or (xor operation) of integers ai and aj. You want to take pictures in a way that the total sum of attractiveness of your pictures is maximized. You have to calculate this value. Since the result may not fit in a 32-bit integer number, print it modulo 1000000007 (109 + 7). Output The only line of output should contain an integer — the optimal total sum of attractiveness of your pictures.
| |
|
|
E. XOR на отрезке
битмаски
Структуры данных
*2000
Вам задан массив a, состоящий из n целых чисел a1, a2, ..., an. С этим массивом разрешается выполнять две операции: - Вычислить сумму текущих элементов массива на отрезке [l, r], то есть посчитать значение al + al + 1 + ... + ar.
- Применить операцию xor с заданным числом x к каждому элементу массива на отрезке [l, r], то есть выполнить
. Эта операция изменяет ровно r - l + 1 элементов массива. Выражение означает применение побитовой операции xor к числам x и y. Данная операция существует во всех современных языках программирования, например, в языках C++ и Java она обозначена как «^», в Pascal — как «xor». Вам задан список из m операций указанного вида. От Вас требуется выполнить все заданные операции, для каждого запроса суммы требуется вывести полученный результат. Выходные данные Для каждого запроса типа 1 в отдельной строке выведите сумму чисел на требуемом отрезке. Ответы на запросы выводите в том порядке, в котором они заданы во входных данных. Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++, вместо него рекомендуется использовать потоки cin, cout, а также спецификатор %I64d.
| |
|
|
A. Новая функция
битмаски
*1600
У Поликарпа есть последовательность, состоящая из n целых неотрицательных чисел: a1, a2, ..., an. Определим функцию f(l, r) (l, r — целые, 1 ≤ l ≤ r ≤ n) для последовательности a как операцию побитового ИЛИ всех элементов последовательности с индексами от l до r. Формально: f(l, r) = al | al + 1 | ... | ar. Поликарп выписал на листок бумаги значения функции f(l, r) для всех l, r (l, r — целые, 1 ≤ l ≤ r ≤ n). Теперь он хочет узнать, сколько различных чисел у него получилось. Помогите Поликарпу, посчитайте количество различных значений функции f(l, r) для заданной последовательности a. Выражение x | y обозначает применение операции побитового ИЛИ к числам x и y. Данная операция есть во всех современных языках программирования, например, в языке C++ и Java она обозначается «|», в Pascal — «or». Выходные данные Выведите единственное целое число — количество различных значений функции f(l, r) для заданной последовательности a. Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d. Примечание В первом тестовом примере на листочке Поликарпа будет записано 6 чисел: f(1, 1) = 1, f(1, 2) = 3, f(1, 3) = 3, f(2, 2) = 2, f(2, 3) = 2, f(3, 3) = 0. Среди этих чисел ровно 4 различных числа: 0, 1, 2, 3.
| |
|
|
B. Безусловно счастливые числа
битмаски
Перебор
поиск в глубину и подобное
*1600
Поликарп любит счастливые числа. Всем известно, что счастливыми являются положительные целые числа, в десятичной записи (без лидирующих нулей) которых содержатся только счастливые цифры x и y. Например, если x = 4, а y = 7, то числа 47, 744, 4 являются счастливыми. Назовем целое положительное число a безусловно счастливым, если существуют такие цифры x и y (0 ≤ x, y ≤ 9), что в десятичной записи числа a (без лидирующих нулей) содержатся только цифры x и y. У Поликарпа есть целое число n. Он хочет узнать, сколько целых положительных чисел не превышающих n являются безусловно счастливыми. Помогите ему, посчитайте это количество. Выходные данные Выведите единственное целое число — сколько целых положительных чисел не превышающих n являются безусловно счастливыми. Примечание В первом тестовом примере все числа не превышающие 10 являются безусловно счастливыми. Во втором примере числа 102, 103, 104, 105, 106, 107, 108, 109, 120, 123 не являются безусловно счастливыми.
| |
|
|
D. Два множества
битмаски
математика
*2700
Маленький Петя очень любит числа. Недавно мама подарила ему набор из n целых неотрицательных чисел. Больше чем числа Петя любит только играть с маленькой Машей. Он тут же решил поделиться с ней частью своего нового набора. Чтобы вместе детям было еще веселее играть, Петя решил отдать Маше такой набор чисел, для которого выполняются следующие условия: - Обозначим через x1 xor всех чисел, которые остались у Пети, а через x2 — xor всех чисел, которые он отдал Маше. Значение (x1 + x2) должно быть как можно больше.
- Если существует несколько способов разделить набор чисел так, чтобы предыдущее условие выполнялось, то Петя минимизирует значение x1.
Под операцией xor подразумевается побитовое исключающее «ИЛИ», которое обозначается как «xor» в языке Pascal и «^» в C/C++/Java. Помогите Пете разделить набор требуемым образом. Если существует несколько подходящих разбиений, найдите любое. Обратите внимание, что после того, как Петя отдаст часть своих чисел Маше, у него их может не остаться вовсе. Возможна и обратная ситуация, когда Петя ничего не отдает Маше. В обоих случаях следует считать, что xor пустого набора чисел равен 0. Выходные данные Выведите n целых чисел через пробел, i-е из которых должно быть равно 1, если Петя оставляет себе i-е по порядку число из набора или 2, если Петя отдает соответствующее число Маше. Числа нумеруются в том же порядке, в котором они заданы во входных данных.
| |
|
|
B. Турнир
битмаски
жадные алгоритмы
Перебор
поиск в глубину и подобное
*1300
Совсем недавно в Берляндии завершился турнир по скоростному засыпанию «Соня-2010». В турнире приняло участие n сильнейших участников со всей страны. Турнир состоит из игр, каждая из которых является противостоянием двух участников. Таким образом, в процессе турнира было проведено n·(n - 1) / 2 игр, то есть каждый из участников встретился с каждым. Правила игры очень просты — кто первый засыпает, тот и победил. Ответственный секретарь должен был записать каждую игру в виде пары чисел «xi yi», где xi и yi — это порядковые номера участников игры, причем тот, кто записан первым является победителем игры (т.е. xi — победитель, а yi — проигравший). Ничьих в этой игре не бывает. Совсем недавно «Институт Изучения Сна» выяснил, что на самом деле каждый человек характеризуется величиной pj — скоростью засыпания в экстремальных условиях. Таким образом, при игре двух игроков побеждает тот, у кого эта величина меньше. Величина pj у каждого человека своя и не изменяется в течении жизни. Известно, что у всех участников турнира их pj различны. Также известно, что секретарь сделал записи результатов всех игр, кроме одной. Ваша задача написать программу, которая по заданным записям результатов игр определяет недостающую. Выходные данные Выведите пару чисел x y — недостающую запись. Если решений несколько, то выведите любое.
| |
|
|
D. Девочка и максимальный XOR
битмаски
дп
жадные алгоритмы
математика
реализация
*1700
Девочка очень любит задачи про битовые операции. Вот одна из них. Вам дано два целых числа l и r. Рассмотрим значения величины для всех пар целых чисел a и b (l ≤ a ≤ b ≤ r). Ваша задача — найти максимальное значение, среди всех рассматриваемых. Выражение обозначает применение операции побитового исключающего или к числам x и y. Данная операция есть во всех современных языках программирования, например, в языке C++ и Java она обозначается «^», в Pascal — «xor». Выходные данные В единственной строке выведите целое число — максимальное значение для всех пар чисел a, b (l ≤ a ≤ b ≤ r).
| |
|
|
D. Минимальное количество переменных
битмаски
дп
*2200
Вам задана последовательность положительных целых чисел a1, a2, ..., an. Все числа в последовательности различны. Зафиксируем набор переменных b1, b2, ..., bm. Изначально в каждой переменной bi (1 ≤ i ≤ m) хранится значение нуль. Рассмотрим следующую последовательность, состоящую из n операций. Первая операция состоит в том, чтобы присвоить какой-то переменной bx (1 ≤ x ≤ m) значение, равное a1. Каждая из следующих n - 1 операций состоит в том, чтобы присвоить какой-то переменной by значение, равное сумме значений, хранящихся в переменных bi и bj (1 ≤ i, j, y ≤ m). При этом значение, которое присваивается на t-ой операции, должно быть равно at. Для каждой операции числа y, i, j выбираются заново. Вам требуется найти минимальное количество переменных m такое, что с помощью этих переменных можно произвести описанную последовательность операций. Выходные данные В единственной строке выведите целое число — минимальное количество переменных m такое, что с помощью этих переменных можно произвести описанную последовательность операций. Если ни при каком значении m выполнить последовательность операций нельзя, выведите -1. Примечание В первом примере можно при помощи двух переменных b1 и b2 произвести следующую последовательность операций. - b1 := 1;
- b2 := b1 + b1;
- b1 := b1 + b2;
- b1 := b1 + b1;
- b1 := b1 + b2.
| |
|
|
E. Максимизация Сосиски
битмаски
Деревья
Структуры данных
*2200
Необъяснимый народ эти битландцы. У них свои проблемы и свои решения. Свои мысли и свои убеждения, свои ценности и свои идеалы. Свои тарелки и свои сосиски! В Битландии сосиска — это массив целых чисел! Аппетитность сосиски равна побитовому исключающему ИЛИ (операция xor) всех элементов сосиски. Как-то раз, когда Mr. Bitkoch (местный повар) уже закрывал свой ресторан BitRestaurant, BitHaval и BitAryo (самые известные жители Битландии) зашли в ресторан и заказали по сосиске. У Mr. Bitkoch осталась ровно одна сосиска. Поэтому он решил отрезать начало сосиски (сколько-то, возможно ноль, первых чисел массива) и отдать его BitHaval-у, BitAryo же достанется некоторый конец сосиски (сколько-то, возможно ноль, последних чисел массива). Обратите внимание, что оба куска сосиски одновременно или по отдельности могут быть пустыми. Конечно, отрезанные куски не должны пересекаться (никакой элемент массива не может содержаться в обоих кусках). Удовольствие, которое получат BitHaval и BitAryo от ужина, равно побитовому исключающему ИЛИ аппетитностей их сосисок. Аппетитность пустой сосиски равна нулю. Найдите способ отрезать BitHaval-у и BitAryo по куску сосиски, чтобы максимизировать их удовольствие от ужина. Выходные данные Выведите единственное целое число — максимальное удовольствие, которое могут получить BitHaval и BitAryo от ужина.
| |
|
|
D. Сумма перестановок
meet-in-the-middle
битмаски
дп
Комбинаторика
реализация
*1900
Перестановкой p называется упорядоченный набор чисел p1, p2, ..., pn, состоящий из n различных целых положительных чисел, каждое из которых не больше чем n. Обозначим i-ый элемент перестановки p через pi. Число n будем называть размером или длиной перестановки p1, p2, ..., pn. Петя решил ввести операцию суммы на множестве перестановок длины n. Пусть заданы две перестановки длины n: a1, a2, ..., an и b1, b2, ..., bn. Суммой перестановок a и b Петя назвал такую перестановку c длины n, у которой ci = ((ai - 1 + bi - 1) mod n) + 1 (1 ≤ i ≤ n). Операция обозначает взятие остатка от деления числа x на число y. Очевидно, что не для всех перестановок a и b будет существовать перестановка c, являющаяся их суммой. Из-за этого Петя расстроился и попросил Вас для заданного n посчитать количество таких пар перестановок a и b длины n, что существует перестановка c, являющаяся суммой a и b. Пара перестановок x, y (x ≠ y) и пара перестановок y, x считаются различными парами. Так как ответ может получиться достаточно большим, выведите его остаток от деления на 1000000007 (109 + 7). Выходные данные В единственной строке выведите целое неотрицательное число — количество таких пар перестановок a и b, что существует перестановка c, которая является суммой a и b, по модулю 1000000007 (109 + 7).
| |
|
|
C. Маска подсети
*особая задача
битмаски
Перебор
реализация
*1600
В задаче используется упрощенная модель адресов в TCP/IP, внимательно прочтите условие. Поликарп устроился на работу системным администратором. Как-то раз к нему в руки попали n IP-адресов. Каждый IP-адрес — это 32-битное число, представленное в виде четверки десятичных 8-битных чисел (без лидирующих нулей), записанных через точку. Например, запись 0.255.1.123 обозначает корректный IP-адрес, а записи 0.256.1.123 и 0.255.1.01 — нет. В данной задаче произвольная четверка 8-битных чисел является корректным IP-адресом. Поработав администратором, Поликарп узнал, что, зная IP-адрес, можно, используя маску подсети, получить адрес сети, которой принадлежит этот IP-адрес. Маска подсети — это IP-адрес, обладающий следующим свойством: если записать этот IP-адрес, как 32-битную строку, то он представим в виде «11...11000..000». Другими словами, в маске подсети сначала идет один или более единичный бит, а затем один или более нулевой бит (всего битов 32). Например, IP-адрес 2.0.0.0 не является корректной маской подсети, так как его 32-битная запись имеет вид 00000010000000000000000000000000. Для получения адреса сети IP-адреса нужно выполнить операцию побитового «и» («and») IP-адреса и маски подсети. Например, если маска подсети 255.192.0.0, а IP-адрес 192.168.1.2, то адрес сети равен 192.128.0.0. При побитовом «и» в записи результата бит равен 1 тогда и только тогда, когда у обоих операндов соответствующие биты единичные. Теперь Поликарп хочет найти все сети, которым принадлежат его IP-адреса. К сожалению, Поликарп потерял маску подсети. К счастью, Поликарп запомнил, что его IP-адреса принадлежали ровно k различным сетям. Помогите Поликарпу найти маску подсети, такую, что его IP-адреса будут принадлежать ровно k различным сетям. Если таких масок несколько, найдите ту, в битовой записи которой наименьшее количество единиц. Если таких масок не существует, сообщите об этом. Выходные данные В единственной строке выведите IP-адрес маски подсети, в формате описанном в условии, если требуемая маска подсети существует. Иначе выведите -1.
| |
|
|
E. Идем по оси
meet-in-the-middle
битмаски
дп
Комбинаторика
Конструктив
*2300
Яхуб хочет встретиться со своей подружкой Яхубиной. Они оба живут на оси Ox (горизонтальной оси координат). Яхуб живет в точке 0, а Яхубина живет в точке d. У Яхуба есть n целых положительных чисел a1, a2, ..., an. Сумма этих чисел равняется d. Предположим, что p1, p2, ..., pn — это перестановка чисел {1, 2, ..., n}. Затем, пусть b1 = ap1, b2 = ap2 и так далее. Будем называть массив b — «путь». Существует n! различных путей, один путь для каждой перестановки p. Яхуб запланировал поход к своей подружке следующим образом. Сначала он проходит b1 шагов по оси Ox, затем делает привал в точке b1. Затем он проходит еще b2 шагов по оси Ox и устраивает привал в точке b1 + b2. Аналогично, в j-ый раз (1 ≤ j ≤ n) он проходит еще bj шагов по оси Ox и делает привал в точке b1 + b2 + ... + bj. Яхуб очень суеверный человек. У него есть k несчастливых целых чисел. Яхуб называет путь «хорошим», если он никогда не делает привала в точке, соответствующей хотя бы одному из этих k чисел. Просто из любопытства посчитайте, сколько существует хороших путей по модулю 1000000007 (109 + 7). Выходные данные Выведите единственное целое число — ответ на дилемму Яхуба. Примечание В первом тесте посмотрим на шесть возможных путей: - [2, 3, 5]. Яхуб остановится в точках 2, 5 и 10. Среди них несчастливое число — 5.
- [2, 5, 3]. Яхуб остановится в точках 2, 7 и 10. Среди них несчастливое число — 7.
- [3, 2, 5]. Остановка в несчастливой точке 5.
- [3, 5, 2]. Такое расположение подходит.
- [5, 2, 3]. Два несчастливых привала (5 и 7).
- [5, 3, 2]. Яхуб не согласится, так как здесь есть привал в точке 5.
Во втором тесте заметьте, что два разных способа могут иметь идентичные наборы привалов. В конкретном случае, все шесть возможных способов имеют одни и те же остановки: [2, 4, 6], так что тут неудача не грозит Яхубу.
| |
|
|
D. Характеристики прямоугольников
Бинарный поиск
битмаски
Перебор
реализация
сортировки
*2100
Геральд обнаружил табличку, состоящую из n строк и m столбцов, в каждой клетке которой целое число. Как видный специалист по прямоугольным таблицам, он сейчас же посчитал характеристику этой таблицы, то есть, минимальное из чисел в углах этой таблицы. Однако полученная величина ему не понравилась — она показалась ему слишком уж маленькой. И чтобы сделать эту величину побольше, он решил немного обрезать таблицу: удалить несколько столбцов слева и несколько справа, а также несколько строк сверху и несколько — снизу. Найдите, какой максимальной может стать характеристика таблицы после такого обрезания. Учтите, что в таблице должно остаться хотя бы две строки и хотя бы два столбца. При этом количество обрезаемых с каждой из четырех сторон строк или столбцов может быть нулевым. Выходные данные Выведите единственное целое число — ответ на задачу. Примечание В первом тестовом примере Геральд ничего не может поделать со своим недовольством — в таблице всего две строки и два столбца. Во втором тестовом примере, как бы Геральд не обрезал таблицу, все равно хотя бы в одном из углов будет 0.
| |
|
|
E. Летний заработок
Бинарный поиск
битмаски
геометрия
Перебор
сортировки
*2500
Многие школьники ищут себе работу на лето, и вот, однажды, когда Геральд был еще школьником, он тоже решил поработать летом. Но так как Геральд был совсем необычным школьником, то и работу он нашел себе неожиданную. Некая Компания согласилась заплатить ему определенную сумму денег, если он нарисует им три одинаковых круга на плоскости, которые не будут пересекаться друг с другом (но могут касаться). Центры кругов он может выбирать только из n вариантов, предоставленных Компанией. Радиус кругов он волен выбирать сам (радиус всех трех кругов должен быть одинаковым); при этом, чем больше окажется этот радиус, тем больше ему заплатят. Помогите Геральду заработать как можно больше. Выходные данные Выведите единственное вещественное число — максимальный возможный радиус кругов. Ответ будет засчитан, если его относительная или абсолютная погрешность не превышает 10 - 6.
| |
|
|
E. Медведь Василий и покраска квадрата
битмаски
дп
Комбинаторика
реализация
*2700
У медведя Василия есть два любимых целых числа n и k, а также карандаш. Кроме того, у него есть k банок с акварельными красками различных цветов. Все банки пронумерованы некоторым образом от 1 до k включительно. В банке с номером i находится краска i-ого цвета. Изначально на координатной плоскости медведь нарисовал карандашом четыре отрезка. Все они имеют в качестве конца точку (0, 0), а качестве начала они имеют следующие точки: (0, 2n), (0, - 2n), (2n, 0), ( - 2n, 0). Далее для каждого i = 1, 2, ..., n медведь нарисовал два квадрата. Первый квадрат имеет следующие координаты вершин: (2i, 0), ( - 2i, 0), (0, - 2i), (0, 2i). Второй квадрат имеет следующие координаты вершин: ( - 2i - 1, - 2i - 1), ( - 2i - 1, 2i - 1), (2i - 1, - 2i - 1), (2i - 1, 2i - 1). После всего этого медведь нарисовал еще один квадрат: (1, 0), ( - 1, 0), (0, - 1), (0, 1). Все точки, упомянутые выше, образуют множество точек A. 
Пример полученного рисунка при n = 0 
Пример полученного рисунка при n = 2 Медведь решил покрасить полученный рисунок за k ходов, i-ый ход состоит из следующих этапов: - Медведь выбирает 3 различных точки в множестве А так, чтобы между любой парой выбранных точек на рисунке существовал отрезок. Внутри области, ограниченной выбранными точками и отрезками между ними, не должно быть точек, уже покрашенных некоторой акварельной краской.
- Медведь закрашивает в i-ый цвет область, ограниченную выбранными точками и отрезками.
Отметим, что после k-ого хода некоторые части рисунка могут остаться непокрашенными. Медведь попросил Вас определить количество различных способов покраски его рисунка. Способом покраски Василий называет последовательность трехэлементных множеств точек, выбранных им на каждом из ходов. Две последовательности множеств считаются различными, если существует такое число i (1 ≤ i ≤ k), что i-ые члены этих последовательностей не совпадают как множества. Так как искомое количество способов покраски может быть довольно большим, требуется найти лишь остаток от деления его на число 1000000007 (109 + 7). Выходные данные Выведите ровно одно число — ответ на задачу по модулю 1000000007 (109 + 7).
| |
|
|
D. Ксюша и доминошки
битмаски
дп
поиск в глубину и подобное
*2100
Ксюша очень любит пазлы, особенно ей нравятся пазлы, состоящие из доминошек. Посмотрите на рисунок, изображающий один из таких пазлов. Пазл представляет собой таблицу размера 3 × n клеток с запрещенными клетками (черные квадраты), на которой лежат доминошки (цветные прямоугольники на рисунке). Пазл считается корректным, если выполняются следующие условия: - каждая доминошка занимает ровно две не запрещенные клетки таблицы;
- никакие две доминошки не занимают одну и ту же клетку таблицы;
- ровно одна не запрещенная клетка таблицы не занята никакой доминошкой (на рисунке отмечена кружочком).
Чтобы решить пазл нужно за несколько ходов переместить пустую клетку из начального положения в некоторое заданное. Ходом считается перемещение доминошки на пустую клетку, так чтобы пазл оставался корректным. Горизонтальные доминошки могут быть перемещены только по горизонтали, а вертикальные только по вертикали. Поворачивать доминошки не разрешается. На рисунке изображен возможный ход. У Ксюши есть таблица размера 3 × n клеток с запрещенными клетками и помеченной кружочком клеткой. Также у Ксюши есть очень много одинаковых доминошек. Теперь Ксюша интересуется, сколько различных корректных пазлов она сможет составить, размещая доминошки на имеющейся таблице. Дополнительно Ксюша хочет, чтобы помеченная кружочком клетка была пустой в полученном пазле и чтобы в пазле существовал хотя бы один ход. Помогите Ксюше, посчитайте описанное количество пазлов. Так как описанное количество может быть достаточно большим, выведите его остаток от деления на число 1000000007 (109 + 7). Выходные данные Выведите единственное целое число — ответ на задачу по модулю 1000000007 (109 + 7). Примечание Два пазла считаются различными, если существует пара клеток, занятых в одном из них одной доминошкой, а в другом — нет.
| |
|
|
B. Игра со строками
битмаски
дп
игры
*2400
Задана таблица T размера n × n, состоящая из строчных латинских букв. Строка s считается хорошей, если в таблице существует корректный путь, соответствующий данной строке. Другими словами, хорошими считаются все строки, которые можно получить, двигаясь из левой верхней клетки таблицы только вправо и вниз. Далее — формальное определение этого понятия: Пронумеруем строки таблицы сверху вниз от 1 до n, колонки таблицы слева направо от 1 до n. Будем называть клеткой (r, c) — клетку таблицы T на r-той строке в c-той колонке. Данной клетке соответствует буква Tr, c. Назовем путем длины k последовательность клеток таблицы [(r1, c1), (r2, c2), ..., (rk, ck)]. Тогда следующие пути являются корректными: - Существует один корректный путь длины 1, то есть состоящий из одной клетки: [(1, 1)];
- Пусть [(r1, c1), ..., (rm, cm)] — корректный путь длины m, тогда пути [(r1, c1), ..., (rm, cm), (rm + 1, cm)] и [(r1, c1), ..., (rm, cm), (rm, cm + 1)] являются корректными путями длины m + 1.
Следует считать, что пути [(r1, c1), (r2, c2), ..., (rk, ck)] соответствует строка длины k: Tr1, c1 + Tr2, c2 + ... + Trk, ck. Два игрока играют в следующую игру: изначально записана пустая строка, затем игроки по очереди приписывают в конец строки по одной букве, после каждого хода (приписывания новой буквы) полученная строка должна являться хорошей. Игра заканчивается после 2n - 1 ходов. Победитель определяется следующим образом: - Если в полученной строке букв «a» строго больше, чем букв «b», то выигрывает первый игрок;
- Если в полученной строке букв «b» строго больше, чем букв «a», то выигрывает второй игрок;
- Если в полученной строке букв «a» и букв «b» одинаковое количество, то объявляется ничья.
Определите результат игры при оптимальной игре обоих игроков. Выходные данные В единственной строке выведите строку «FIRST», если выиграет первый игрок, «SECOND», если выиграет второй игрок и «DRAW», если игра закончится в ничью. Примечание Рассмотрим первый пример: Хорошими строками являются: a, ab, ac, abd, acd. Первый игрок в первый ход допишет к строке букву a, так как существует всего одна хорошая строка длины 1. Затем, второй игрок может приписать одну из букв b или c и тогда игра закончится соответственно со строками abd или acd. В первом случае будет ничья (в строке по одной букве a и b), во втором же случае выиграет первый игрок. Понятно, что в таком случае второму игроку выгодно выбрать букву b и получить ничью. Рассмотрим второй пример: Хорошие строки: x, xa, xay. Понятно, что игра закончится со строкой xay и победит первый игрок.
| |
|
|
D. Монеты и мешочки
битмаски
дп
жадные алгоритмы
Конструктив
*2700
Наверняка, в детстве вам рассказывали загадку про мешочки и монетки. Если нет, вот один из ее вариантов: У Коня есть три мешочка. В первом лежит одна монетка, во втором — одна монетка, а в третьем — три монетки. Всего у Коня во всех мешочках лежит три монетки. Как такое может быть? Ответ на эту загадку очень простой. А именно, в третьем мешочке лежат первые два и одна монетка. Данная задача — это обобщение детской загадки. Имеется n мешочков. Известно, что в первом мешочке находится a1 монет, во втором мешочке находится a2 монет, ..., в n-ом — an монет. Общее количество монет равно s. Найдите, как расположить мешочки и монетки в них таким образом, чтобы описанное выполнялось, или сообщите, что сделать это невозможно. Выходные данные Если ответа не существует, выведите -1. Иначе, выведите n строк. В i-ой строке выведите, что лежит в i-ом мешочке. Первое число в строке — ci (0 ≤ ci ≤ ai) — должно означать, сколько монеток лежит непосредственно в i-ом мешочке (монеты в мешочках, которые лежат в i-ом мешочке, не считаются). Второе число в строке — ki (0 ≤ ki < n) — должно означать, сколько мешочков лежит непосредственно в i-ом мешочке (мешочки, которые лежат внутри мешочков, которые лежат в i-ом мешочке, не считаются). Далее в строке должны следовать ki целых чисел — номера мешочков, которые лежат непосредственно в i-ом мешочке. В выведенном ответе общее количество монет должно быть равно s. Если для i-го мешочка в ответе посчитать общее количество монет, которое находится внутри него, то должно получаться ai. Никакой мешочек не должен лежать в более чем одном мешочке непосредственно. Допускается более одного уровня вложенности мешочков (смотрите второй тестовый пример). Если существует несколько правильных ответов, разрешается вывести любой. Примечание На рисунках снизу показаны два возможных решения одного и того же тестового примера из условия. Левый рисунок соответствует первому тестовому примеру, правый — второму тестовому примеру.
| |
|
|
D. Сережа и множества
битмаски
поиск в глубину и подобное
*2400
У Сережи есть m непустых множеств целых чисел A1, A2, ..., Am. По счастливой случайности оказалось, что данные множества являются разбиением множества всех целых чисел от 1 до n. Другими словами, для любого целого v (1 ≤ v ≤ n) существует ровно одно множество At такое, что . Кроме того у него есть целое число d. Сережа решил выбрать несколько множеств из имеющихся. Предположим, что i1, i2, ..., ik (1 ≤ i1 < i2 < ... < ik ≤ m) — это индексы выбранных множеств. Тогда определим массив целых чисел b равный объединению выбранных множеств, то есть . Будем считать, что массив b отсортирован по возрастанию. Элемент с номером j в этом массиве (j-ый по возрастанию) будем обозначать bj. Сережа считает, что его выбор множеств правильный, если выполняются условия: b1 ≤ d; bi + 1 - bi ≤ d (1 ≤ i < |b|); n - d + 1 ≤ b|b|.Сережа хочет найти k — минимальное количество выбранных множеств, чтобы его выбор был правильным. Помогите ему в этом. Выходные данные В единственной строке выведите ответ на задачу — минимальное значение k при правильном выборе.
| |
|
|
C. Окружение сокровищ
битмаски
кратчайшие пути
*2600
Вам задана карта — прямоугольная таблица. Каждая клетка таблицы — это: либо препятствие, либо сокровище с определенной стоимостью, либо бомба, либо пустая клетка. Также задано ваше начальное положение. Вы можете перейти из клетки в соседнюю по стороне клетку карты. При этом не разрешается выходить за пределы карты, приходить в клетки с сокровищами, препятствиями и бомбами. Для того, чтобы собрать сокровища, вы должны построить замкнутый путь (он должен начинаться и заканчиваться в стартовой клетке). Внутри этого замкнутого пути не должно быть клеток с бомбами. Пусть сумма стоимости сокровищ, находящихся внутри замкнутого пути, равна v, и при этом вы совершили k единичных переходов (из клетки в клетку), когда проходили этот путь, тогда такой путь принесет вам прибыль v - k рублей. Ваша задача построить замкнутый путь, внутри которого не содержится бомб, который принесет наибольшую прибыль. Обратите внимание, что путь может иметь самопересечения. Для определения того, лежит клетка внутри пути или нет используется следующий алгоритм: - Представьте себе, что клетки таблицы — это точки на плоскости (клетка таблицы на пересечении i-го столбца и j-ой строки является точкой (i, j)). А заданный вам путь — это замкнутая ломаная, проходящая через эти точки.
- Вам нужно определить: находится ли точка p таблицы, через которую не проходит ломаная, внутри ломаной.
- Проведем луч, начинающийся в точке p и не проходящий через другие точки таблицы (такой луч обязательно существует).
- Посчитаем сколько отрезков ломаной пересекает проведенный луч. Если это количество нечетно, считается, что точка p (а следовательно и клетка таблицы) находится внутри ломаной (пути). Иначе, считается, что она находится снаружи.
Выходные данные Выведите одно целое число — максимально возможную прибыль, которую вы можете получить. Примечание В первом тестовом примере ответ будет выглядеть следующим образом. Во втором тестовом примере ответ будет выглядеть следующим образом. В третьем тесте прибыль нельзя получить. В четвертом тесте прибыль нельзя получить, поскольку нельзя построить замкнутый путь более чем из одной клетки.
| |
|
|
C. Captains Mode
битмаски
дп
игры
*2200
Костя — профессиональный киберспортсмен, специализирующийся на дисциплине Dota 2. Недавно компания Valve, разработчик этой игры, выпустила новый патч, перевернувший баланс игры с ног на голову. Костя, являясь капитаном команды, понимает, что наибольшая ответственность лежит на нем, поэтому он хочет прибегнуть к анализу нововведений патча с математической точки зрения, чтобы выбирать наилучших героев для своей команды в каждом матче. В матче Dota 2 участвуют две команды, каждая из которых должна взять для себя некоторых героев, за которых впоследствии будут играть члены этой команды, причем запрещено выбирать одного и того же героя несколько раз, даже разными командами. На крупных киберспортивных турнирах, таких, в которых собирается участвовать команда Кости, матчи проходят в режиме Captains Mode. В этом режиме для выбора героев капитаны команд в определенном, заранее установленном порядке совершают одно из двух возможных действий: пик (pick) или бан (ban). - Пик — это выбор героя для своей команды. После того, как капитан команды сделал пик, герой, которого он выбрал, отправляется в его команду (за него впоследствии будет играть один из членов команды) и больше не может быть выбран ни одной из команд.
- Бан — это запрет героя. После бана герой не отправляется ни в одну из команд, однако он также больше не может быть выбран ни одной из команд.
Капитан команды может пропустить пик или бан. В случае пропуска пика в его команду добавляется случайный герой из тех, что были доступны на данный момент, а в случае пропуска бана не запрещается ни один герой, как будто этого бана и не было. Костя уже определил силу всех героев с учетом исправлений нового патча. Разумеется, Костя знает и порядок пиков и банов. Сила команды равна сумме сил входящих в нее героев, и обе команды, участвующие в матче, стремятся максимизировать разницу в силе в свою сторону. Помогите Косте определить, у какой команды в матче — у первой или у второй — преимущество, и насколько оно велико. Выходные данные Выведите единственное целое число — разность между силой первой команды и силой второй команды, если капитаны обоих команд будут действовать оптимально.
| |
|
|
D. Новогоднее письмо
битмаски
дп
Перебор
*2000
Во многих странах есть новогодняя традиция — писать письма дедушке Морозу со своими пожеланиями подарков на новый год. Вася — обыкновенный мальчик-программист. Как все обыкновенные мальчики, он в канун нового года собирается написать письмо дедушке Морозу. Вася уже придумал алгоритм, по которому он будет писать письмо. Сначала он выберет две строки s1 и s2, состоящие из прописных латинских букв. Далее мальчик составит строку sk, пользуясь рекуррентным соотношением sn = sn - 2 + sn - 1, операция '+' обозначает конкатенацию (то есть последовательную запись) строк в заданном порядке. После чего Вася запишет строку sk на листочек, положит его в письмо и пошлет письмо деду Морозу. Вася точно уверен: чтобы дед Мороз подарил ему самый лучший подарок, нужно чтобы в полученной строке sk подстрока AC встречалась ровно x раз (сокращение AC напоминает Васе о сданных задачах). Более того, Вася решил, что строка s1 должна иметь длину n, а строка s2 — длину m. Больше Вася ничего не решил. У Васи сейчас срочные новогодние дела, поэтому он просит вас выбрать для него две строки s1 и s2 требуемым образом. Помогите Васе. Выходные данные В первой строке выведите строку s1, состоящую из n заглавных латинских букв. Во второй строке выведите строку s2, состоящую из m заглавных латинских букв. Если существует несколько подходящих строк, разрешается вывести любую. Если требуемой пары строк не существует, выведите «Happy new year!» без кавычек.
| |
|
|
D. Медведь и прожекторы
битмаски
геометрия
дп
*2200
Жил-был один медведь на плоскости Oxy. Он очень боялся темноты, поэтому ночью не мог передвигаться по точкам плоскости, которые не освещены. Однажды медведь захотел ночью прогуляться от своего дома, который находится в точке (l, 0), до дома своего друга, который находится в точке (r, 0), по отрезку длины (r - l). Конечно, для осуществления прогулки нужно, чтобы каждая точка отрезка была освещена. Именно поэтому медведь позвонил своему другу (да-да посреди ночи) с очень деликатной просьбой. На плоскости Oxy расположены n прожекторов. Прожектор i находится в точке (xi, yi) и может освещать любой угол плоскости величиной ai градусов с вершиной в точке (xi, yi). Медведь попросил своего друга повернуть прожекторы так, чтобы он (медведь) смог в процессе своей прогулки по отрезку удалиться от дома, как можно дальше. Добрый друг согласился выполнить просьбу. А пока он выполняет ее, медведю очень интересно, на какое максимальное расстояние он сможет удалиться от дома? Помогите ему, найдите это расстояние. Считайте, что на плоскости нет никаких преград, и что нет никаких других источников света кроме прожекторов. Друг медведя не может поворачивать прожекторы во время прогулки медведя. Считайте, что после того как все прожекторы будут повернуты требуемым образом, медведь начнет прогулку, а друг пойдет спать. Выходные данные Выведите единственное вещественное число — ответ на задачу. Ответ будет считаться правильным, если его относительная или абсолютная погрешность не будет превышать 10 - 6. Примечание В первом примере одно из возможных решений такое: Во втором примере единственное решение такое: В третьем примере единственное решение такое:
| |
|
|
B. Лиса и минимальный путь
битмаски
графы
Конструктив
математика
реализация
*1900
Лисица Сиель хочет сделать задачку программистам на контест. Задача звучит так: «Дан простой неориентированный граф, состоящий из n вершин. Каждое его ребро имеет длину 1. Надо посчитать количество кратчайших путей между вершиной 1 и вершиной 2». Как и все авторы, она хочет, чтобы некоторые из выходных данных были особенными: например, ее день рождения или количество ее друзей. Можете ли вы помочь ей составить такой тест для задачи, чтобы ответ на него был ровно k? Выходные данные Выведите граф G с n вершинами (2 ≤ n ≤ 1000). Между вершинами графа 1 и 2 должно быть ровно k наикратчайших путей. В первой строке должно быть записано целое число n. Затем надо вывести матрицу смежности графа G, состоящую из n строк и n столбцов. Каждый элемент матрицы должен равняться 'N' или 'Y'. Если Gij равняется 'Y', то граф G имеет ребро, соединяющее вершину i и вершину j. Считайте, что вершины графа пронумерованы от 1 до n. Граф должен быть неориентированным и простым: должны выполняться условия Gii = 'N' и Gij = Gji. Также, должен быть хотя бы один путь между вершинами 1 и 2. Гарантируется, что ответ существует. Если есть несколько правильных ответов, можно вывести любой из них. Примечание В первом примере есть 2 кратчайших пути: 1-3-2 и 1-4-2. Во втором примере есть 9 кратчайших путей: 1-3-6-2, 1-3-7-2, 1-3-8-2, 1-4-6-2, 1-4-7-2, 1-4-8-2, 1-5-6-2, 1-5-7-2, 1-5-8-2.
| |
|
|
E. Инна и бинарная логика
Бинарный поиск
битмаски
Структуры данных
*2100
Вдоволь наслушавшись шуток о женской логике, Инна взяла и перешла на бинарную. У Инны есть массив a1, состоящий из n целых неотрицательных чисел: a1[1], a1[2], ..., a1[n]. Девочка любит развивать свою бинарную логику, для этого она выполняет упражнение, которое состоит из n этапов: на первом этапе Инна выписывает все элементы массива a1, на i-м (i ≥ 2) этапе девочка выписывает все элементы массива ai, который состоит из n - i + 1 целых чисел и k-е число которого равно ai[k] = ai - 1[k] AND ai - 1[k + 1]. Здесь операция AND обозначает операцию побитового И двух чисел. Дима решил проверить насколько хорошо Инна выполняет описанное упражнение. Для этого он просит Инну изменять массив и после каждого изменения говорить, чему будет равна сумма чисел, которые Инна выпишет в результате выполнения упражнения над текущим массивом. Помогите Инне ответить на все запросы Димы. Выходные данные Выведите m строк. Для каждого запроса на изменение массива выведите сумму всех чисел, которые выпишет Инна, если будет выполнять упражнение над текущим массивом, в отдельной строке.
| |
|
|
D. Роман и числа
битмаски
дп
Комбинаторика
Перебор
теория чисел
*2000
Роман — юный, но уже довольно известный в Ужляндии, математик. К сожалению, Сережа так не считает. Чтобы переубедить Сережу, Роман готов решить любую математическую задачу. Сережа, не долго думая, попросил Рому найти количество близких чисел к числу n по модулю m. Число x называется близким к числу n по модулю m, если: - его можно получить перестановкой цифр числа n,
- оно не имеет лидирующих нулей,
- остаток от деления числа x на m равен 0.
Роман — хороший математик, но поскольку различных вариантов ответа может быть очень много, ему будет трудно найти ответ. Поэтому он просит помощи у вас. Выходные данные В единственной строке выведите целое число — количество близких чисел к числу n по модулю m. Примечание В первом примере нам подходят числа: 104, 140, 410. Во втором примере подходит единственное число 232.
| |
|
|
D. 2048
битмаски
дп
*2000
Программисты компании R2 любят играть в 2048. Как-то раз они решили изобрести собственную упрощенную модификацию этой игры — 2k на полоске. Представьте бесконечную в одну сторону полоску, состоящую из единичных квадратов (сторона каждого равна высоте полоски). Каждый квадрат может быть пустой, а может содержать некоторое число. Изначально все квадраты пустые. Затем в бесконечности на одном из единичных квадратов появляется число 2, либо 4. После чего игрок один раз нажимает на кнопку, и появившееся число начинает двигаться в сторону начала полоски. Пусть некоторое число x движется к началу полоски, тогда оно остановится, если: - либо оно окажется в первом квадрате полоски;
- либо оно окажется в квадрате, перед которым находится квадрат с числом y (y ≠ x). Если же число x в какой-то момент времени окажется в квадрате с таким же числом, то два числа сложатся и превратятся в одно число 2x. Новое число 2x по тем же правилам продолжит двигаться в сторону начала полоски.
После окончательной остановки процесса передвижения чисел, в бесконечности появляется новое число 2 или 4, и все повторяется. Чтобы лучше понять процесс передвижения прочитайте пояснения к тестовым примерам. Наверное, вы уже поняли, что ход игры целиком и полностью завит от того, в какой последовательности появляются 2 и 4 в игре. Рассмотрим некоторую последовательность, в которой появляются 2 и 4 в игре. Считается, что эта последовательность победная, если в результате нее хотя бы в одном квадрате появится число не менее 2k. Смысл игры состоит в том, чтобы составить победную последовательность из n чисел. Но не все так просто, некоторые числа последовательности определены заранее. Задана последовательность, состоящая из чисел 0, 2, 4. Посчитайте, сколько существует способов заменить каждый 0 этой последовательности на 2 или 4, чтобы получить победную последовательность. Выходные данные Выведите единственное целое число — количество способов заменить нули на 2 или 4, чтобы получить победную последовательность. Так как это количество может быть достаточно большим, выведите его остаток от деления на 1000000007 (109 + 7). Примечание Рассмотрим первый тестовый пример. Начало полоски будет трансформироваться следующим образом: 2 → 4 → 8 → 8 2 → 8 4 → 8 4 2 → 16. Чтобы лучше понять процесс игры, можете посмотреть оригинальную игру на http://gabrielecirulli.github.io/2048/. Обратите внимание, что описанная игра на полоске немного отличается от оригинальной (когда два числа складываются в оригинальной игре, они не продолжают двигаться). Будьте осторожны, игра затягивает, а времени на контесте не так много!
| |
|
|
D. Хитрый Гена
битмаски
дп
жадные алгоритмы
сортировки
*1900
Мальчик Гена очень хочет попасть на финал «Russian Code Cup», ну или хотя бы получить футболку. Но предлагаемые на отборочном раунде задачи слишком сложные, поэтому он договорился с n друзьями, что они решат задачи за него. Участникам на отборочном раунде предлагают m задач. Про каждого своего друга Гена знает, какие задачи он умеет решать. Но друзья не согласны помогать Гене просто так: i-й друг требует за свою помощь в решении всех задач, которые он может решить, xi рублей, более того, он согласен писать код по задачам, только если к компьютеру Гены подключено не менее ki мониторов, а каждый монитор стоит b рублей. Гена экономный, поэтому он хочет потратить как можно меньше денег на решение всех задач отборочного раунда. Подскажите Гене, как ему поступить, чтобы потратить как можно меньше денег. Считайте, что изначально у компьютера Гены нет ни одного монитора. Выходные данные Выведите минимальное количество денег, которое нужно потратить Гене, чтобы решить все задачи. Или выведите -1, если этого нельзя добиться.
| |
|
|
B. Сережа и таблица
битмаски
жадные алгоритмы
*2200
У Сережи есть прямоугольная таблица a размера n × m, в каждой ячейке которой находится нуль или единица. Сережа хочет, чтобы его таблица обладала следующим свойством: каждая компонента связности из одинаковых значений образует прямоугольник, стороны которого параллельны сторонам таблицы. Прямоугольники должны быть заполненными, другими словами, если компонента образует прямоугольник h × w, то она должна состоять из ровно hw ячеек таблицы. Компонентой связности из одинаковых значений называется множество ячеек таблицы, удовлетворяющих свойствам: - значения во всех ячейках одинаковые;
- ячейки множества образуют связную область в таблице (две ячейки связны, если они являются соседними в какой-то строке или в каком-то столбце таблицы);
- невозможно добавить ни одной ячейки в множество, не нарушив предыдущие два свойства.
Может ли Сережа поменять значения не более k ячеек таблицы на противоположное, чтобы таблица обладала описанным свойством? Какое минимальное количество ячеек таблицы при этом нужно изменить? Выходные данные Выведите -1, если сделать задуманное невозможно. В противном случае выведите минимальное количество ячеек, в которых нужно поменять значение на противоположное, чтобы таблица удовлетворяла описанному свойству.
| |
|
|
C. Угадай дерево
битмаски
Деревья
дп
жадные алгоритмы
Конструктив
*2300
Яхуб и Яхубина пошли на пикник. Зашли они в густой лес. Не прошло и пяти минут, как Яхуб вспомнил про деревья в информатике. Более того, он придумал новую задачу, и Яхубине надо ее решить, а не то Яхуб ее не покормит. Яхуб спрашивает у Яхубины: можешь ли ты построить такое корневое дерево, что - каждая внутренняя вершина дерева (вершина, имеющая хотя бы одного сына) имеет по меньшей мере двух сыновей;
- у вершины i в поддереве содержится ci вершин?
Яхубина должна придумать описанное дерево. Она девушка умная и поняла, что, возможно, описанного дерева вовсе не существует. Тогда вся еда достанется Яхубу. Вы должны помочь Яхубине: определите, есть ли хотя бы одно дерево, удовлетворяющее ограничениям Яхуба. Требуемое дерево должно состоять из n вершин. Выходные данные Выведите в первой строке «YES» (без кавычек), если хотя бы одно дерево удовлетворяет ограничениям Яхуба, в противном случае выведите «NO» (без кавычек).
| |
|
|
D. Случайное задание
Бинарный поиск
битмаски
дп
Комбинаторика
математика
*2100
Однажды после сложной лекции старательная студентка Саша увидела исписанную парту в аудитории. Присмотревшись, она прочитала следующее: «Найдите такое целое положительное n, что среди чисел n + 1, n + 2, ..., 2·n есть ровно m чисел, в двоичной записи которых ровно k единиц.» Ее заинтересовало это задание, и она просит вас помочь ей его решить. Саша знает, что вы боитесь больших чисел, поэтому она гарантирует, что существует ответ не превышающий 1018. Выходные данные Выведите искомое число n (1 ≤ n ≤ 1018). Если ответов несколько — выведите любой.
| |
|
|
B. Ребенок и множество
битмаски
жадные алгоритмы
реализация
сортировки
*1500
В день детей ребенок пришел домой к Пиксу и все перевернул вверх дном. Пикс на него разозлился. В бардаке потерялось много всего, включая любимое множество Пикса. К счастью, Пикс помнит кое-что о своем множестве S: - его элементами были различные целые числа от 1 до limit;
- значение
равнялось sum; функция lowbit(x) равна 2k, где k обозначает позицию первой единицы в двоичном представлении числа x. Например, lowbit(100102) = 102, lowbit(100012) = 12, lowbit(100002) = 100002 (числа записаны в двоичном представлении). Помогите Пиксу. Найдите любое множество S, удовлетворяющее всем вышеперечисленным условиям? Выходные данные В первой строке выведите целое число n (1 ≤ n ≤ 105), обозначающее размер S. Затем выведите элементы множества S в любом порядке. Если есть несколько правильных ответов, выведите любой. Если подходящего множества не существует, выведите -1. Примечание В примере 1: lowbit(4) = 4, lowbit(5) = 1, 4 + 1 = 5. В примере 2: lowbit(1) = 1, lowbit(2) = 2, lowbit(3) = 1, 1 + 2 + 1 = 4.
| |
|
|
E. Валера и число
битмаски
дп
математика
Теория вероятностей
*2400
Валера — программист. Недавно Валера написал забавную программу. Ниже показан псевдокод этой программы: //входные данные: целые числа x, k, p a = x; for(step = 1; step <= k; step = step + 1){ rnd = [случайное целое число от 1 до 100]; if(rnd <= p) a = a * 2; else a = a + 1; }
s = 0;
while(остаток от деления a на 2 равен 0){ a = a / 2; s = s + 1; }
Теперь Валера интересуется, при заданных x, k и p чему равно математическое ожидание полученного числа s? Выходные данные Выведите требуемое математическое ожидание. Ваш ответ будет считаться правильным, если его абсолютная или относительная погрешность не превышает 10 - 6. Примечание Если вы не знакомы с термином математическое ожидание, то вы можете почитать про него по ссылке: http://ru.wikipedia.org/wiki/Математическое_ожидание
| |
|
|
A. Боря и Ханаби
битмаски
Перебор
реализация
*1700
Вы когда-нибудь играли в Ханаби? Если нет, то вам обязательно стоит попробовать! В этой задаче пойдет речь об упрощенной версии этой игры. Всего в игре 25 типов карт (5 различных цветов и 5 различных значений). У Бори на руках n карт. Игра несколько усложняется тем, что эти карты видят все, кроме него. Из информации, которая была доступна Боре на протяжении игры, он смог вычислить, какие именно карты у него есть, но он ничего не подозревает о порядке, в котором они лежат. Заметим, что у Бори может быть несколько одинаковых карт (и про каждый из 25 типов карт он знает, сколько именно у него карт этого типа). Цель других игроков — сделать так, чтобы про каждую свою карту Боря смог сказать, какого она цвета и какое число на ней написано. Для этого другие игроки могут делать подсказки. Подсказки бывают двух типов: по цвету и по значению. Подсказка по цвету происходит следующим образом. Игрок называет некоторый цвет и показывает на все карты этого цвета. Аналогично происходит и подсказка по значению. Игрок называет некоторое число и показывает на все карты, на которых написано это число. Определите, какое наименьшее количество подсказок должны сделать другие игроки, чтобы про каждую карту Боре стало понятно, какого она цвета и какое число на ней написано. Выходные данные Выведите единственно число — наименьшее количество подсказок, которые должны сделать другие игроки. Примечание В первом примере Боря и так знает про каждую карту, что она зеленая тройка. Во втором примере можно показать все четверки и все красные карты. В третьем примере нужно сделать подсказки про любые четыре цвета.
| |
|
|
D. Jzzhu и числа
битмаски
дп
Комбинаторика
*2400
У Jzzhu есть n неотрицательных целых чисел a1, a2, ..., an. Назовем последовательность индексов i1, i2, ..., ik (1 ≤ i1 < i2 < ... < ik ≤ n) группой размера k. Jzzhu интересно, сколько существует таких групп, что ai1 & ai2 & ... & aik = 0 (1 ≤ k ≤ n)? Помогите ему найти их количество по модулю 1000000007 (109 + 7). Операция x & y обозначает операцию побитового И двух чисел. Выходные данные Выведите единственное целое число — количество требуемых групп по модулю 1000000007 (109 + 7).
| |
|
|
E. Devu и цветы
битмаски
Комбинаторика
теория чисел
*2300
Devu хочет декорировать свой сад. Он приобрел n коробок с цветами, i-я коробка содержит fi цветов. Все цветы в одной коробке одного цвета (поэтому они неразличимы). Также среди коробок нет двух с одинаковыми цветами. Devu хочет выбрать ровно s цветов из коробок, чтобы украсить свой сад. Сколькими способами он может это сделать? Так как это число может быть очень большим, найдите его по модулю 1000000007 (109 + 7). Devu считает, что два способа различные, если в этих способах хотя бы из одной коробки выбрано разное количество цветов. Выходные данные Выведите целое число — количество способов выбрать s цветов по модулю 1000000007 (109 + 7). Примечание Пример 1. Есть два способа выбрать 3 цветка: {1, 2} и {0, 3}. Пример 2. Есть только один способ выбора 4 цветков: {2, 2}. Пример 3. Есть три способа выбора 5 цветков: {1, 2, 2}; {0, 3, 2}; {1, 3, 1}.
| |
|
|
B. Маленькая пони и ларец гармонии
битмаски
дп
Перебор
*2000
Принцесса Twilight пришла к Celestia в замок, где раньше жила Luna, чтобы исследовать ларец элементов гармонии. Последовательность положительных целых чисел bi называется гармонической тогда и только тогда, когда наибольший общий делитель любых двух ее элементов равен 1. Согласно древней книге, ключ от ларца — это гармоническая последовательность bi, минимизирующая значение выражения:  Вам дана последовательность ai. Помогите принцессе Twilight найти ключ от ларца. Выходные данные Выведите ключ — последовательность bi, которая минимизирует сумму, описанную выше. Если существует несколько правильных последовательностей, выведите любую.
| |
|
|
B. Федя и новая игра
битмаски
Конструктив
Перебор
реализация
*1100
Как только вы помогли Юре с Лешей заселиться, они пошли помогать своему другу Феде играть в новую компьютерную игру «Call of Soldiers 3». Всего в игре есть (m + 1) игроков и n видов солдат. Игроки «Call of Soldiers 3» пронумерованы от 1 до (m + 1), а виды солдат пронумерованы от 0 до n - 1. У каждого игрока есть армия, армия i-го игрока характеризуется целым неотрицательным числом xi. Рассмотрим битовое представление числа xi: если j-й бит числа xi равен единице, то в армии i-го игрока есть солдаты j-го вида. Федя — игрок с номером m + 1. Федя считает, что два игрока могут дружить, если их армии отличаются не более чем на k видов солдат (другими словами, битовые представления соответствующих чисел различаются не более чем в k битах). Помогите Феде посчитать, сколько игроков могут с ним дружить. Выходные данные Выведите единственное целое число — количество возможных друзей Феди.
| |
|
|
G. Уроки дизайна задач: увеличиваем ограничения
битмаски
бпф
Структуры данных
*2800
Помимо прочего, можно создавать сложные задачи так: рассматриваем простую задачу в качестве запроса и пытаемся найти алгоритм, способный решить ее быстрее, чем наивное решение. Задачи такого типа обычно появляются в OI контестах, как правило, они решаются структурами данных. Давайте попробуем придумать такую задачу. Например, возьмем «Задачу о подсчете расстояния Хэмминга»: для двух бинарных строк s и t одинаковой длины, расстояние Хэмминга между ними равняется количеству позиций, в которых их соответствующие символы различны. Например, расстояние Хэмминга между «00111» и «10101» равняется двум (различные символы выделены жирным). Давайте используем задачу о расстоянии Хэмминга как запрос: вам даны две строки, a и b, и несколько запросов. Каждый запрос будет иметь следующий вид: каково расстояние Хэмминга между двумя строками ap1ap1 + 1...ap1 + len - 1 и bp2bp2 + 1...bp2 + len - 1? Обратите внимание, что в этой задаче строки нуль-индексированные, иными словами, s = s0s1... s|s| - 1. Выходные данные Выведите q целых чисел — ответы на запросы.
| |
|
|
B. Dreamoon и WiFi
битмаски
дп
Комбинаторика
математика
Перебор
Теория вероятностей
*1300
Dreamoon стоит на отметке 0 на числовой прямой. Drazil отправляет ему на смартфон список команд через Wi-Fi, а Dreamoon следует им. Каждая команда относится к одному из двух типов: - Пройти на 1 единицу в положительном направлении, обозначается как «+»
- Пройти на 1 единицу в отрицательном направлении, обозначается как «-»
Но так как уровень сигнала Wi-Fi очень слабый, смартфон Dreamoon'а сообщает, что некоторые команды не поддаются распознаванию. Более того, Dreamoon знает, что даже некоторые из рапознанных команд могут быть неверными. Dreamoon решил выполнять каждую распознанную команду, а для нераспознанных команд бросать монетку (это значит, что он пойдёт на 1 единицу в положительном или отрицательном направлении с одинаковой вероятностью 0.5). Вам дан изначальный список команд, которые выслал Drazil, и список, который получил Dreamoon. Какова вероятность того, что Dreamoon окажется в том положении, к которому привели бы команды Drazil'а? Выходные данные Выведите требуемую вероятность. Ответ будет сраниваться с относительной или абсолютной погрешностью 10 - 9. Примечание В первом примере как s1, так и s2 приведут Dreamoon'а к одной и той же позиции + 1. Во втором примере s1 приведет Dreamoon'а к позиции 0, в то время как для s2 есть четыре варианта: {"+-++", "+-+-", "+--+", "+---"} с конечными позициями {+2, 0, 0, -2}, соответственно. Таким образом, есть 2 подходящих случая из 4, так что вероятность окончить путь в верной позиции равна 0.5. Для третьего примера, s2 может привести только к позициям {+1, -1, -1, -3}, таким образом, вероятность окончить путь в позиции + 3 равна 0.
| |
|
|
C. Игра со строками
битмаски
дп
Теория вероятностей
*2600
Вы играете в игру со своим другом. Ниже приведено описание этой игры. Ваш друг придумывает n различных строк одинаковой длины m и сообщает вам все строки. Далее он выбирает случайным образом одну из них. Он выбирает строки равновероятно, то есть вероятность выбора каждой из n строк равна . Вы хотите угадать, какую из строк выбрал ваш друг. Для того, чтобы угадать строку, загаданную другом, вам разрешается задавать другу вопросы. Каждый вопрос имеет следующую форму: «Какой символ стоит на позиции pos в загаданной тобой строке?». Строка считается угаданной, когда ответы на заданные вопросы однозначно определяют загаданную строку. После того, как строка становится угаданной, вы прекращаете задавать вопросы. У вас нет определённой стратегии, поэтому очередным вопросом вы каждый раз равновероятно выбираете одну из еще не названных позиций. Ваша задача — определить математическое ожидание количества вопросов, необходимых для того, чтобы угадать выбранную вашим другом строку. Выходные данные Выведите единственное число — искомое математическое ожидание. Ваш ответ будет считаться правильным, если его абсолютная или относительная погрешность не превышает 10 - 9.
| |
|
|
A. Биты
битмаски
Конструктив
*1700
Обозначим за количество единиц в двоичной записи целого неотрицательного числа x. Вам дано несколько запросов, каждый в виде пары целых чисел l и r. Для каждого запроса найдите такое x, что l ≤ x ≤ r, а максимально. Если таких чисел несколько, то требуется найти наименьшее из них. Выходные данные На каждый запрос выведите требуемое число в отдельной строке. Примечание Двоичные представления чисел от 1 до 10 выглядят следующим образом: 110 = 12 210 = 102 310 = 112 410 = 1002 510 = 1012 610 = 1102 710 = 1112 810 = 10002 910 = 10012 1010 = 10102
| |
|
|
D. Миша и XOR
битмаски
*2700
После дня рождения у Миши осталось много больших чисел, разбросанных по всей комнате. Пришло время уборки, и Мише нужно сложить их в корзину. Это задание он поручил своему ручному роботу, который согласился выполнить его при определенных условиях. Перед тем, как робот положит очередное число x в корзину, Миша должен ответить на вопрос, можно ли выбрать из уже лежащих в корзине чисел одно или несколько, XOR-сумма которых будет равняться x. В случае положительного ответа нужно также предъявить номера этих чисел. Если существует несколько вариантов выбора чисел, разрешается назвать любой. После ответа Миши робот кладет число в корзину. Изначально корзина пуста. Каждому положенному в корзину числу присваивается очередной номер. Первое положенное в корзину число получает номер 0, второе число получает номер 1 и так далее. Мише нужно срочно закончить уборку, но, к сожалению, у него плохо с арифметикой. Он просит вас ему помочь. Выходные данные Для каждого числа либо выведите в очередной строке 0, если число нельзя представить в виде XOR-суммы чисел, уже находящихся в корзине, либо выведите k — количество чисел в представлении и номера этих чисел. Числа разделяйте пробелами. Каждый номер может присутствовать в разложении не более одного раза. Примечание XOR-суммой чисел называется результат побитового сложения чисел по модулю 2.
| |
|
|
D. Лиса и прыжки
битмаски
дп
математика
Перебор
*1900
Лиса Ciel играет в игру. Она стоит на бесконечной длинной ленте с ячейками, пронумерованными целыми числами (положительными, отрицательными и нулем). В начале она стоит в ячейке 0. Также есть n карточек, каждая из которой характеризуется числом li и стоимостью ci. Если лиса заплатит ci долларов, то она сможет применить i-ю карточку. После применения i-й карточки лиса сможет совершать прыжки длины li, то есть, от ячейки x к ячейке (x - li) или ячейке (x + li). Лиса хочет научиться прыгать в любую ячейку на ленте (возможно, посетив некоторые промежуточные ячейки). Для достижения этой цели она хочет купить некоторое количество карточек, заплатив при этом как можно меньше денег. Если этого возможно добиться, посчитайте минимальную стоимость. Выходные данные Если невозможно купить некоторое количество карточек и получить возможность прыгнуть в любую ячейку, выведите -1. В противном случае, выведите минимальную стоимость покупки такого набора карточек. Примечание В первом примере недостаточно купить одну карточку: например, если купить карточку для прыжков длины 100, то нельзя прыгнуть ни в одну ячейку, номер которой не кратен 100. Оптимальный способ — купить первую и вторую карточку, тогда можно будет добраться до любой ячейки. Во втором примере, даже если купить все карточки, то вы не сможете прыгнуть ни в одну ячейку, номер которой не кратен 10, так что ответ — -1.
| |
|
|
C. Аукцион второй цены
битмаски
Теория вероятностей
*2000
В наши дни большинство интернет-рекламы не привязано к веб-странице статически. Что именно будет показано пользователю, который открыл веб-страницу, решается в период 100 миллисекунд после открытия веб-страницы. Обычно за каждое рекламное место на странице соревнуются несколько компаний, и победитель решается посредством аукциона. Каждая из этих компаний получает запрос с информацией о пользователе, веб-странице и рекламном месте, а в ответ они посылают в течение 100 миллисекунд цену, которую они готовы заплатить, чтобы показать рекламу на этом рекламном месте. Компания, которая предлагает наивысшую цену, выигрывает аукцион и получает право показать свою рекламу. Если несколько компаний предложили максимальную цену, победитель выбирается случайным образом. Компания, выигравшая аукцион, не всегда должна заплатить ровно столько, сколько она предложила. В большинстве случаев используется аукцион второй цены. Это значит, что победитель аукциона должен заплатить максимум из всех предложенных на аукционе цен, кроме своей. Рассмотрим такой аукцион. Есть n компаний, которые соревнуются за рекламное место. i-я из этих компаний заявит случайное целое количество микродолларов, равновероятно распределённое на отрезке от Li до Ri включительно. Иными словами, каждое целое значение от Li до Ri имеет одинаковую вероятность быть выбранным i-й компанией. Определите математическое ожидание цены, которую заплатит победитель при аукционе второй цены. Выходные данные Выведите ответ на задачу с абсолютной или относительной погрешностью не более чем 1e - 9. Примечание Рассмотрим первый пример. Первая компания заявляет случайное целое количество микродолларов из отрезка [4, 7]; вторая компания заявляет между 8 и 10, а третья компания заявляет 5 микродолларов. Вне зависимости от конкретных значений заявленных цен, вторая компания выиграет аукцион, но цена, которую ей придется заплатить, зависит от цены, заявленной первой компанией. С вероятностью 0.5 первая компания заявит не более 5 микродолларов, и второй максимум цены на аукционе будет 5. С вероятностью 0.25 она заявит 6 микродолларов, и с вероятностью 0.25 она заявит 7 микродолларов. Таким образом, математическое ожидание цены, которую придется заплатить второй компании, равно 0.5·5 + 0.25·6 + 0.25·7 = 5.75.
| |
|
|
E. Аня и кубики
meet-in-the-middle
Бинарный поиск
битмаски
дп
математика
Перебор
*2100
Аня очень любит складывать и наклеивать. Сегодня она решила заняться именно этим. У Ани есть n кубиков, лежащих в ряд и пронумерованных от 1 до n слева направо, с написанными на них натуральными числами. Также у нее есть k наклеек с восклицательными знаками. Известно, что количество наклеек не превышает количества кубиков. Аня может наклеить на кубик восклицательный знак и получить факториал числа, записанного на кубике. Например, если на кубике было написано 5, то после наклеивания будет 5!, что равно 120. Вам нужно помочь Ане посчитать, сколько существует способов оставить какое-то количество кубиков и наклеить на некоторые из них восклицательные знаки, использовав не более k восклицательных знаков, так, чтобы сумма чисел, написанных на кубиках (как отмеченных восклицательными знаками, так и нет), после наклеивания стала равна S. Аня может наклеить на один кубик не более одного восклицательного знака. Справитесь? Два способа будем считать одинаковыми, если совпадают номера оставленных кубиков, а также совпадают номера кубиков, на которые наклеены восклицательные знаки. Выходные данные Выведите в первую строку выходных данных единственное целое неотрицательное число — количество способов оставить какое-то количество кубиков и наклеить на некоторые из них восклицательные знаки так, чтобы сумма чисел стала равна заданному числу S. Примечание В первом тесте из условия единственный способ достичь желаемого — оставить оба кубика, и наклеить на каждый из них по восклицательному знаку. Во втором тесте из условия единственный способ достичь желаемого — оставить оба кубика, но не клеить восклицательный знак ни на один из них. В третьем тесте из условия можно оставить любой из трёх кубиков, при этом на него можно как клеить, так и не клеить восклицательный знак, поэтому существует шесть способов достичь желаемого.
| |
|
|
E. Тупики
битмаски
дп
*2500
В Бертауне наступили тяжелые времена. В городе слишком много дорог, и их содержание дорого обходится правительству. В Бертауне n перекрестков и m двусторонних дорог, причем от каждого перекрестка можно добраться до любого другого. Мэр хочет закрыть некоторые дороги так, чтобы всего осталось n - 1 дорога, и по-прежнему от каждого перекрестка можно было добраться до любого другого. Кроме этого, мэра заботит количество тупиков — таких перекрестков, из которых выходит всего одна дорога. Тупиков должно быть не слишком много, но и не слишком мало. Мэр и его помощники посовещались и решили, что после закрытия в карте дорог должно быть ровно k тупиков. Ваша задача — посчитать количество различных способов закрытия дорог, при которых: - Остается ровно n - 1 дорог.
- От каждого перекрестка можно добраться до любого другого.
- На получившейся карте ровно k тупиков.
Два способа считаются различными, если существует дорога, которая закрыта в первом способе и открыта во втором. Выходные данные Выведите одно число — искомое число способов.
| |
|
|
F. Упрощенный японский кроссворд
meet-in-the-middle
битмаски
дп
хэши
*2400
В этой задаче вам предстоит написать программу, решающую упрощенный японский кроссворд для полей не более 5 × 20. Упрощенный японский кроссворд — это головоломка, в которой надо построить такое поле (каждая клетка либо белая, либо черная), которое соответствует заданной информации для строк и столбцов. Для каждой строки и каждого столбца задано количество блоков из черных клеток. Ваша задача — построить такое поле, для которого все эти количества имеют место быть. Например, если размеры поля n = 3, m = 5, а количества блоков для строк это [2, 3, 2], а для столбцов — [1, 0, 1, 2, 1], то решение может выглядеть так: Гарантируется, что для каждого теста, на котором будет запущена ваша программа, хотя бы одно решение головоломки существует. Выходные данные Выведите любое из возможных решений. Ваш вывод должен содержать n строк по m символов в каждой из них. Белую ячейку следует обозначать символом «.», а черную — символом «*».
| |
|
|
B. Тавас и СаДДас
битмаски
Комбинаторика
Перебор
реализация
*1100
Тавас снова начал есть сухой кофе ложками! Кейон пожаловался на ужасный запах, но юноша не остановился. Тогда Кейон попросил своего умного друга СаДДаса наказать Таваса! СаДДас забрал наушники Таваса и сказал ему: "Верну их, если ты решишь следующую задачу." Задача звучит следующим образом: Вам дано счастливое число n. Счастливые числа — это положительные целые числа, содержащие в своей десятичной записи только счастливые цифры 4 и 7. Например, числа 47, 744, 4 счастливые, а 5, 17, 467 — нет. Если мы отсортируем все счастливые числа в возрастающем порядке, на какой позиции (при нумерации с единицы) будет стоять число n? Тавас не такой умный, как СаДДас, так что он попросил Вас сделать ему одолжение и решить эту задачу, чтобы он мог получить назад свои наушники. Выходные данные Выведите позицию, на которой n находится среди всех счастливых чисел.
| |
|
|
C. Запоминаем строки
битмаски
дп
*2500
У вас есть набор из n строк одинаковой длины, состоящих из строчных букв английского языка. Будем говорить, что набор строк просто запомнить, если для каждой строки существует некоторая позиция i и некоторая буква c английского алфавита, такие, что эта строка является единственной в наборе, имеющей букву c в позиции i. Например, набор строк {«abc», «aba», «adc», «ada»} нельзя просто запомнить. А набор {«abc», «ada», «ssa»} можно просто запомнить, поскольку: - первая строка является единственной строкой, имеющей символ c в позиции 3;
- вторая строка является единственной строкой, имеющей символ d в позиции 2;
- третья строка является единственной строкой, имеющей символ s в позиции 2.
Вы хотите немного изменить ваш набор так, чтобы его можно было просто запомнить. За aij монет вы можете изменить символ в j-й позиции в i-й строке на любой другую строчную букву английского алфавита. Определите, какое минимальное количество монет нужно заплатить за выполнение изменений, чтобы набор строк можно было просто запомнить. Выходные данные Выведите единственное число — ответ на задачу.
| |
|
|
C. Майк и пена
битмаски
дп
Комбинаторика
математика
теория чисел
*2300
Майк — бармен в баре Рико. В заведении Рико пивные стаканы кладутся на особую полку. Всего в баре n сортов пива, пронумерованных от 1 до n. Бокал с i-м сортом пива содержит ai миллилитров пены. Максим — босс Майка. Сегодня он сказал Майку выполнить q запросов. Изначально полка пустая. Каждый запрос представляет собой целое число x. Если пиво номер x уже есть на полке, то Майк должен забрать его с полки, в противном случае — положить его на полку. После каждого запроса Майк должен определить качество полки. Медведи — те ещё гики, так что они считают, что качество полки — это количество пар (i, j) стаканов на полке, таких, что i < j и , где — наибольший общий делитель чисел a и b. Майк устал. Поэтому он попросил вам помочь ему выполнить эти запросы. Выходные данные Для каждого запроса выведите ответ в отдельной строке.
| |
|
|
B. Подготовка олимпиады
битмаски
Перебор
*1400
У вас есть n задач. Сложность i-й из них вы оценили целым числом ci. Теперь вы хотите подготовить комплект задач для олимпиады, используя некоторые из придуманных задач. Комплект задач для олимпиады должен состоять не менее чем из двух задач. Вы считаете, что суммарная сложность задач олимпиады должна быть не менее l и не более r. Также вы считаете, что разница в сложности между самой легкой и самой тяжелой из выбранных задач должна быть не меньше x. Найдите количество способов выбрать комплект задач для олимпиады. Выходные данные Выведите количество способов выбрать подходящий комплект задач для олимпиады. Примечание В первом примере подходят два комплекта: состоящий из второй и третьей задачи, а также состоящий из всех трех задач. Во втором примере подходят два комплекта задач — комплект из задач сложностями 10 и 30, а также комплект из задач сложностями 20 и 30. В третьем примере подходит любой комплект, в котором одна задача имеет сложность 10, а вторая — сложность 20.
| |
|
|
D. Деревянные запросы
Бинарный поиск
битмаски
графы
Деревья
Конструктив
поиск в глубину и подобное
*2200
Роман посадил дерево из n вершин. В каждой вершине записана строчная английская буква. Вершина 1 является корнем дерева, у каждой из n - 1 оставшихся вершин есть предок в дереве, с которым вершина соединена ребром. Предком вершины i является вершина pi, причём номер предка всегда меньше, чем номер вершины (то есть, pi < i). Глубина вершины — это количество вершин на пути по рёбрам от корня до v. В частности, глубина корня равна 1. Скажем, что вершина u лежит в поддереве вершины v, если мы можем попасть из u в v, переходя из вершины в предка. В частности, вершина v лежит в своём поддереве. Рома даёт вам m запросов, i-й из которых задаётся двумя числами vi, hi. Рассмотрим вершины, лежащие в поддереве vi, и находящиеся на глубине hi. Определите, можно ли из букв, записанных в этих вершинах, составить строку, являющуюся палиндромом? Буквы, записанные в вершинах, можно переставить в произвольном порядке для составления палиндрома. Выходные данные Выведите m строк. В i-й строке выведите «Yes» (без кавычек), если в i-м запросе возможно составить палиндром из букв, написанных на вершинах, иначе выведите «No» (без кавычек). Примечание Строка s является палиндромом, если она одинаково читается слева направо и справа налево. В частности, пустая строка является палиндромом. Пояснение к тесту из условия. В первом запросе существует единственная вершина 1, подходящая под все условия, мы можем составить палиндром "z". Во втором запросе вершины 5 и 6 удовлетворяют условиям, на этих вершинах написаны буквы "с" и "d". Составить палиндром невозможно. В третьем запросе не существует ни одной вершины на глубине 1 в поддереве вершины 4. Мы можем составить пустой палиндром. В четвертом запросе не существует вершин в поддереве 6 на глубине 1. Мы можем составить пустой палиндром. В пятом запросе вершины 2, 3 и 4 удовлетворяют условиям, на этих вершинах написаны буквы a, с и с. Мы можем составить палиндром "cac"
| |
|
|
C. Клубы
битмаски
Паросочетания
Перебор
*2700
Обратите внимание на необычное ограничение по памяти в этой задаче. Сотрудники MDCS (Microsoft Development Center Serbia, сербского центра разработок Майкрософта) любят вечеринки. Обычно они ходят в ночные клубы в пятницу и субботу. Всего в MDCS работает N людей, а в городе всего есть N клубов. К сожалению, если в ночном клубе будет больше одного сотрудника Майкрософта, то уровень крутизны этой вечеринки возрастает до небес, и вечеринка заканчивается, так что владельцы клуба никогда не позволяют более, чем одному сотруднику Майкрософта войти в их клуб в течение недели (так, на всякий случай). Вы организуете ночную жизнь сотрудников Майкрософта и у Вас есть статистика о том, насколько каждому сотруднику нравятся вечеринки в пятницу и субботу, для всех клубов. Вам надо распределить людей по клубам, максимизируя общую сумму их довольства (они настолько довольны, насколько им нравится выбранный клуб), при этом половина людей должна пойти клубиться в пятницу, а другая половина — в субботу. Выходные данные Вывод должен содержать единственное целое число — максимальную возможную сумму счастья. Примечание Распределение людей по клубам в примере: Пятница: 1-й человек идет в 4-й клуб (4 единицы довольства), а 4-й человек идет в 1-й клуб (4 единицы довольства). Суббота: 2-й человек идет в 3-й клуб (81 единица довольства), а 3-й человек идет во 2-й клуб (78 единиц довольства). 4 + 4 + 81 + 78 = 167.
| |
|
|
A. Выращиваем бактерии
битмаски
*1000
Вы — большой любитель бактерий. Вам хочется вырастить немного бактерий в коробочке. Изначально коробочка пуста. Каждое утро можно положить любое количество бактерий в коробочку. Каждую ночь каждая бактерия делится на две бактерии. Когда-нибудь вы надеетесь увидеть ровно x бактерий в коробочке. Какое минимальное количество бактерий вам суммарно надо положить в коробочку для достижения этой цели? Выходные данные Единственная строка, содержащая одно целое число — ответ на задачу. Примечание В первом примере мы можем положить одну бактерию в коробочку утром первого для, а утром третьего дня в коробочке будет 4 бактерий. Теперь надо положить в коробочку ещё одну бактерию, в результате чего в коробочке окажется 5 бактерий. Мы суммарно добавили 2 бактерии в коробочку, так что ответ равен 2. Во втором примере мы можем положить одну бактерию утром первого дня, тогда утром четвёртого дня в коробочке будет 8 бактерий. Таким образом, ответ равен 1.
| |
|
|
D. Кефа и блюда
битмаски
дп
*1800
Когда Кефа пришел в ресторан и уселся за столик, официант сразу же принес ему меню. Там оказалось целых n блюд. Кефа знает, что ему нужно ровно m порций, чтобы насытиться. Но при этом он не хочет заказывать одно и то же дважды, чтобы попробовать максимальное количество блюд. Кефа знает, что i-е блюдо поднимет его удовлетворенность на ai. Но некоторые блюда плохо сочетаются друг с другом, а некоторые — наоборот хорошо. Кефа установил себе k правил поедания пищи следующего вида — если блюдо x съесть непосредственно перед блюдом y (т. е. между x и y не должно быть других блюд), то удовлетворенность Кефы увеличится на c. Конечно же наш попугай хочет получить максимально возможную удовлетворенность от похода в ресторан. Помогите ему в этом непростом деле! Выходные данные В единственной строке выходного файла выведите максимальную удовлетворенность, которую Кефа может получить от похода в ресторан. Примечание В первом тесте лучше всего съесть сначала второе блюдо, а потом первое. Тогда мы получим по единице удовлетворенности за каждое блюдо и еще единицу за правило. Во втором тесте подходят последовательности выбора 4 2 1 или 2 1 4. В обоих случаях мы получим удовлетворенность 7 за отдельные блюда, а также, выполнив правило 1, получаем еще дополнительную удовлетворенность 5.
| |
|
|
D. Три логотипа
битмаски
геометрия
Конструктив
математика
Перебор
реализация
*1700
Три компании решили заказать рекламный щит с изображениями своих логотипов. Рекламный щит представляет собой большую квадратную доску. Логотип каждой из компаний представляет собой прямоугольник ненулевой площади. Рекламодатели разместят рекламу только в том случае, если возможно расположить все три логотипа на щите без наложений так, что на нём не останется свободного места. При размещении логотипы можно поворачивать так, чтобы стороны были параллельны сторонам рекламного щита. Перед вами стоит задача определить, возможно ли разместить логотипы трех компаний на щите квадратной формы, не нарушив никакое из описанных правил. Выходные данные Если разместить все три логотипа на квадратном щите невозможно, выведите одно число "-1" (без кавычек). Если же это возможно, выведите в первую строку длину стороны квадрата n, в котором можно разместить все три логотипа. В следующих n строках должно содержаться по n заглавных латинских букв "A", "B" или "C". Наборы одинаковых букв должны образовывать сплошные прямоугольники, причем: - размеры прямоугольника, составленного из букв "A", должны быть равны размерам логотипа первой компании,
- размеры прямоугольника, составленного из букв "B", должны быть равны размерам логотипа второй компании,
- размеры прямоугольника, составленного из букв "C", должны быть равны размерам логотипа третьей компании.
Напомним, что логотипы компаний в процессе нанесения их на рекламный щит можно поворачивать. Пустых мест на щите остаться не должно. Если квадратный рекламный щит можно заполнить логотипами несколькими способами, разрешается вывести любой из них. Изучите тестовые примеры для лучшего понимания условия.
| |
|
|
E. Булева функция
битмаски
дп
Разбор выражений
*3000
В данной задаче рассматриваются булевы функции от четырех переменных A, B, С, D. Переменные A, B, C и D являются логическими и могут принимать значения 0 или 1. Будем задавать функцию с помощью следующей грамматики: <выражение> ::= <переменная> | (<выражение>) <оператор> (<выражение>) <переменная> ::= 'A' | 'B' | 'C' | 'D' | 'a' | 'b' | 'c' | 'd' <оператор> ::= '&' | '|' Здесь заглавными буквами A, B, C, D обозначаются переменные, а строчными — их отрицания. Например, если A = 1, то символу 'A' соответствует значение 1, а символу 'a' — значение 0. Символ '&' здесь соответствует операции логического И, символ '|' — операции логического ИЛИ. Вам дано выражение s, задающее функцию f, в котором некоторые операторы и переменные пропущены. Так же вам известны значения функции f(A, B, C, D) для некоторых n различных наборов значений переменных. Посчитайте количество способов восстановить пропущенные в выражении элементы так, чтобы получившееся выражение соответствовало известной информации о функии f в заданных наборах переменных. Так как величина результата может быть большой, выведите её остаток от деления на 109 + 7. Выходные данные В единственной строке выведите ответ на задачу. Примечание В первом примере двумя подходящими выражением являются 'C' и 'd'. Во втором примере выражения выглядят так: '(A)&(a)', '(A)&(b)', '(A)&(C)', '(A)&(D)'.
| |
|
|
E. Сэнди и Орешки
битмаски
Деревья
дп
*2600
Корневым деревом называется связный граф без циклов с выделенной вершиной. В рамках данной задачи будем считать, что корнем дерева всегда является вершина с номером 1. Наименьшим общим предком вершин u и v называется наиболее удалённая от корня дерева вершина, лежащая как на пути от корня до u, так и на пути от корня до v. Будем обозначать наименьшего общего предка вершин u и v как LCA(u, v). У белочки Сенди было корневое дерево, состоявшее из n вершин, в которых она хранила свои орешки. К несчастью, подводный шторм разрушил это дерево, и теперь Сенди никак не может его восстановить. Она смогла назвать m рёбер своего дерева и q троек чисел ai, bi и ci, про которые она полагает, что LCA(ai, bi) = ci. Помогите Сенди посчитать, сколько существует деревьев с корнем в вершине 1, про которые верна вся информация, названная Сенди. Если же она что-то напутала, и таких деревьев не существует, то выведите 0. Два корневых дерева считаются различными, если существует хотя бы одно ребро, принадлежащее одному из этих деревьев и не принадлежащее другому. Выходные данные Выведите количество деревьев размера n с корнем в вершине 1, таких что для них верна вся информация, которую помнит Сенди. Примечание Во втором примере правильный ответ выглядит так: В третьем примере возможны два правильных ответа: В четвёртом примере несложно заметить, что информация, предоставленная Сенди, противоречива.
| |
|
|
B. Новый год и старые свойства
битмаски
Перебор
реализация
*1300
2015 год почти подошёл к концу. Лимак — белый медвежонок, который недавно узнал о двоичной системе счисления. Он сразу заметил, что запись номера прошедшего года в двоичной системе счисления содержит ровно один ноль — 201510 = 111110111112. Обратите внимание, количество нулей в записи числа в десятичной системе счисления значения не имеет. Лимак выбрал некоторый интервал лет и теперь собирается посчитать количество лет из этого интервала, таких что их запись в двоичной системе счисления так же содержит ровно один ноль. А сможете ли вы сделать это быстрее? Считайте, что положительные целые числа всегда записываются без ведущих нулей. Выходные данные Выведите одно целое число — количество лет в данном интервале, запись которых в двоичной системе счисления содержит ровно один ноль. Примечание В первом примере интервал Лимака содержит числа 510 = 1012, 610 = 1102, 710 = 1112, 810 = 10002, 910 = 10012 и 1010 = 10102. Два из них (1012 и 1102) обладают описанным выше свойством.
| |
|
|
E. Новогодняя ёлка
битмаски
Деревья
Структуры данных
*2100
Новый год прошёл, но Resha решил не убирать ёлку, а немного переукрасить её. К нему пришли его друзья Kerim и Gural, чтобы помочь переукрасить ёлку. Ёлка представляет собой обычное неориентированное дерево из n вершин с корнем в вершине 1. Вам требуется обрабатывать запросы двух типов: - Перекрасить все вершины из поддерева вершины v в цвет c.
- Найти количество различных цветов в поддереве вершины v.
Выходные данные Для каждого запроса второго типа выведите одно целое число a — количество различных цветов в поддереве вершины, заданной в запросе. Числа нужно выводить в отдельных строках, в порядке появления запросов во входных данных.
| |
|
|
E. Игра с конфетами
битмаски
дп
игры
поиск в глубину и подобное
реализация
*2000
Карлсон опять прилетел в гости к Малышу. Дома у Малыша они нашли коробку конфет и большой торт со взбитыми сливками. Карлсон сразу же предложил Малышу честно поделить найденное. А именно — сыграть с ним в игру с конфетами, которую он придумал только что. Победитель в качестве приза получит торт. Коробка конфет имеет форму шестиугольника, внутри нее имеется 19 ячеек для конфет, в некоторых из них находятся конфеты. Игроки ходят по очереди. За ход разрешается съесть одну или несколько конфет, лежащих в соседних ячейках на одной линии, параллельной одной из сторон коробки. На картинке ниже показаны примеры допустимых и недопустимого ходов. Проигрывает игрок, который не может сделать ход. Карлсон ходит первым — ведь это он в гостях у Малыша, а не наоборот. Игроки играют оптимальным образом. Определите, кому достанется торт. Выходные данные Если торт достанется Карлсону — выведите «Karlsson» (без кавычек), иначе выведите «Lillebror» (опять же без кавычек).
| |
|
|
G. Яш и деревья
битмаски
математика
поиск в глубину и подобное
Структуры данных
теория чисел
*2800
Яш любит играть с деревьями, особенно если в этой игре замешаны простые числа. На его 20-й день рождения ему подарили корневое дерево, состоящее из n вершин, на котором он должен теперь отвечать на запросы. Услышав про деревья и простые числа, Яш так переполнился восхищением, что отвечать на запросы придётся теперь вам. Корнем дерева является вершина с номером 1. В каждой вершине записано некоторое целое число ai. Дополнительно нам дано целое число m. Поступают запросы двух типов: - Для данной вершины v и целого числа x — увеличить все ai в поддереве v на x.
- Для данной вершины v — найти количество таких простых чисел p, меньших m, что найдётся вершина u в поддереве вершины v и целое число k, такие что au = p + m·k.
Выходные данные Для каждого запроса второго типа выведите количество подходящих простых чисел.
| |
|
|
A. Азартный Ним
битмаски
математика
матрицы
Теория вероятностей
*2400
Кратко напомним правила игры Ним. Имеется n кучек камней, при этом в кучке i изначально лежит ai камней. Два игрока по очереди выбирают непустую кучку и берут из неё произвольное положительное количество камней. Проигрывает тот, кто не может сделать ход. Петя и Вася давно устали от обычного Нима, поэтому придумали свою версию игры и назвали её «Азартный Ним». У них есть n двусторонних карточек, на одной стороне i-й карточки написано число ai, а на другой bi. Перед началом игры карты выкладываются на стол, при этом каждая карта независимо от других равновероятно кладётся одной из двух сторон вверх. Получается некоторая последовательность c1, c2, ..., cn, где ci равно ai или bi. После этого Петя и Вася делают n кучек камней (при этом в кучке номер i лежит ci камней) и играют в Ним. Петя ходит первым. Известно, что и Петя и Вася играют в Ним оптимально. Найдите вероятность победы Пети. Ответ выведите как несократимую дробь. Выходные данные Выведите ответ в виде несократимой дроби p / q. Если вероятность победы Пети равна нулю, то выведите 0/1.
| |
|
|
C. Двоичная табличка
битмаски
бпф
дп
математика
Перебор
разделяй и властвуй
*2600
Дана таблица из n строк и m столбцов. В каждой ячейке таблицы записано число 0 или 1. За один ход разрешается выбрать произвольную строку или столбец и инвертировать все значения, то есть 0 заменить на 1, а 1 на 0. Какого минимального количества единиц в таблице можно добиться, выполняя данные действия? Выходные данные Выведите одно число — минимальное возможное количество единиц после выполнения произвольной последовательности ходов.
| |
|
|
C. Ваня и надпись
битмаски
Комбинаторика
реализация
Строки
*1500
Ваня шёл по улице и увидел надпись «Hide&Seek». Поскольку Ваня — программист, ему сразу пришла идея воспользоваться операцией & (побитовое И) для этих двух слов в 64-ричной системе счисления (0..9A..Za..z-_) и получить новое слово. Теперь Ваня придумал некоторую строку s и задался вопросом, сколько существует различных пар слов длины |s| (длина строки s), побитовое И которых равно данному слову s? Поскольку ответ может быть очень большим, Ваня просит вас вычислить его по модулю 109 + 7. Для перевода букв слова в 64-ричную систему счисления Ваня использует следующее соответствие знаков и чисел: - цифрам от «0» до «9» соответствуют числа от 0 до 9;
- буквам от «A» до «Z» соответствуют числа от 10 до 35;
- буквам от «a» до «z» соответствуют числа от 36 до 61;
- символу «-» соответствует число 62;
- символу «_» соответствует число 63.
Выходные данные Выведите единственное целое число — количество возможных пар слов, побитовое И которых равняется строке s, по модулю 109 + 7. Примечание Для подробного описания функции побитовое И можно посмотреть соответствующую статью в Википедии. В первом примере возможны 3 варианта: - z&_ = 61&63 = 61 = z
- _&z = 63&61 = 61 = z
- z&z = 61&61 = 61 = z
| |
|
|
E. Очередной турнир ситхов
битмаски
дп
математика
Теория вероятностей
*2200
Всем известны правила турнира ситхов. В турнире сражаются n участников. Турнир начинается со случайного выбора двух ситхов, который проводят первый бой. Как только один из них проигрывает, его место занимает другой, случайно выбранный еще не сражавшийся ситх. Надо ли говорить, что каждый бой турнира ситхов заканчивается смертью одного из соперников? Турнир заканчивается, когда в живых остается лишь один ситх. Джедай Иван случайно оказался в списке участников такого турнира. Однако его владение светлой стороной силы столь велико, что он способен влиять на исход выбора как участников, которые начнут турнир, так и каждого следующего участника поединка. Разумеется, он не станет упускать подвернувшийся шанс улучшить свое положение. Помогите ему рассчитать, насколько велики его шансы победить в турнире. Выходные данные Выведите единственное вещественное число — вероятность, с которой Джедай Иван останется в живых по итогам турнира. Абсолютная или относительная погрешность ответа не должна превышать 10 - 6.
| |
|
|
E. Путешествие по царству Снежной королевы
битмаски
графы
Перебор
разделяй и властвуй
*2800
Герда пустилась в путь по царству Снежной королевы. Дорожная сеть, по которой направляется Герда, представляет собой n перекрёстков, соединённых m дорогами. Дороги пронумерованы числами от 1 до m. Снежная королева догадывалась, что Кая могут найти, и наложила на них могучее заклятие. Теперь погодные условия на дороге с номером i таковы, что в какой бы момент времени, не превосходящий i, Герда ни оказалась на ней, она выедет с неё только в момент времени i. Если же она ступит на дорогу позже, чем в момент времени i, она так и не сможет с неё выехать. Герда выезжает в момент времени l с перекрёстка с номером s и едет во дворец Снежной королевы, расположенный на перекрёстке с номером t. Кроме того, в момент времени r + 1 Снежная королева возвращается в свой дворец и уже не пустит Герду внутрь, поэтому Герда должна добраться до дворца не позже, чем в момент времени r. Вам требуется по заданной сети для каждого из q запросов li, ri, si и ti ответить, сможет ли Герда добраться до дворца Снежной королевы. Выходные данные Для каждого тестового случая выведите «Yes» (без кавычек) или «No» (без кавычек) — сможет Герда добраться до дворца Снежной королевы или нет.
| |
|
|
D. Мультимножество Василия
Бинарный поиск
битмаски
Деревья
Структуры данных
*1800
У автора уже закончились истории про Василия, поэтому он просто написал формальную постановку задачи. У вас есть q запросов и мультимножество A, изначально содержащее только число 0. Запросы бывают трёх видов: - «+ x» —добавить в мультимножество A число x.
- «- x» —удалить одно вхождение числа x из мультимножества A. Гарантируется, что хотя бы одно число x в этот момент присутствует в мультимножестве.
- «? x» —вам даётся число x, требуется вычислить
, то есть максимальное значение побитового исключающего ИЛИ (также известно как XOR) числа x и какого-нибудь числа y из мультимножества A. Мультимножество — это множество, в котором разрешается несколько одинаковых элементов. Выходные данные На каждый запрос типа «?» выведите единственное целое число — максимальное значение побитового исключающего ИЛИ для числа xi и какого-либо числа из мультимножества A.
| |
|
|
D. Персистентный шкаф
битмаски
поиск в глубину и подобное
реализация
Структуры данных
*2200
Недавно в школе Алина узнала о том, что такое персистентные структуры данных: это структуры данных, которые при внесении в них каких-то изменений сохраняют все свои предыдущие состояния и доступ к этим состояниям. По приходу домой Алина решила придумать свою персистентную структуру данных. Долго раздумывать не пришлось: прямо перед ее кроватью располагается книжный шкаф. Он, по мнению Алины, весьма подходит в качестве персистентной структуры данных. Шкаф состоит из n полок, на каждой из которых есть ровно m позиций для книг. Полки в шкафу Алина нумерует от 1 до n, а позиции на полках — от 1 до m. Изначально шкаф пуст, то есть на каждой позиции на каждой полке книга отсутствует. Алина выписала подряд q операций, которые будут друг за другом производиться со шкафом. Каждая из операций может быть одного из четырех типов: - 1 i j — Поставить книгу в шкаф на позицию j на полке i, если ее там нет.
- 2 i j — Убрать книгу из шкафа с позиции j на полке i, если она там есть.
- 3 i — Поменять расположение книг на полке i на противоположное. Это означает, что со всех позиций на полке i, где книга присутствует, книгу следует убрать, а на все позиции на полке i, где книга отсутствует, книгу следует поставить.
- 4 k — Вернуть все книги в шкафу в то состояние, в котором они находились после выполнения k-й операции. В частности, k = 0 означает, что шкаф следует привести в изначальное состояние, то есть убрать книгу с каждой позиции на каждой полке.
После выполнения каждой операции Алину интересует количество книг в шкафу. Алина учится на отлично, поэтому она без труда нашла искомые количества. Интересно, а у вас получится? Выходные данные Для каждой операции выведите в отдельной строке количество книг в шкафу после её выполнения. Ответы выводите в хронологическом порядке. Примечание  Иллюстрация ко второму примеру из условия.
| |
|
|
E. Ядерный синтез
битмаски
дп
*2200
Среди физиков-ядерщиков популярна следующая головоломка. В реакторе находится набор из n атомов некоторых химических элементов. Под словосочетанием «номер атома» мы будем подразумевать номер элемента этого атома в периодической таблице химических элементов. Разрешается взять любые два различных атома и синтезировать из них один новый. При этом получается атом, номер которого равен сумме номеров исходных атомов. Операцию синтеза можно проводить несколько раз. Целью является получение нового набора из k атомов, заданного заранее. Сложность головоломки в том, что разрешается только сливать два атома в один, но не разделять один атом на несколько. Вам предлагается попробовать силы в решении данной головоломки. Выходные данные Если синтезировать нужные атомы невозможно, то выведите «NO» без кавычек. Иначе выведите в первой строке «YES», а в следующих k строках выведите способ получения каждого из k атомов в виде равенств. Каждое равенство имеет вид «x1+x2+...+xt->yi», где xj — символ элемента некоторого атома из начального набора, а yi — символ элемента некоторого атома из конечного набора. Каждый атом из входных данных должен встретиться в выходных данных ровно один раз. Порядок слагаемых в уравнениях, а так же порядок вывода уравнений не имеет значения. Если решений несколько — выведите любое. Чтобы лучше понять формат вывода — смотрите примеры. Примечание Реакции из первого примера имеют вид (слева снизу приписан номер атома): 


Для того, чтобы найти периодическую таблицу химических элементов, Вы можете использовать свою любимую поисковую систему. Набор претестов содержит каждый из первых 100 элементов периодической таблицы хотя бы по одному разу. Вы можете использовать эту информацию для проверки опечаток.
| |
|
|
E. День рождения Матвея
битмаски
графы
*3300
У Матвея сегодня день рождения. Так как он никогда не знает, какие подарки он хочет получить, его друзья, недолго думая, решили подарить ему строку s длины n. Эта строка состоит из первых восьми букв английского алфавита: «a», «b», «c», ..., «h». Первый вопрос, который может у вас возникнуть: кому может быть нужна какая-то строка? Но Матвей — необычный мальчик, он тут же придумал увлекательное занятие. Первым делом нужно составить неориентированный граф, в котором вершины — это различные позиции в строке, а рёбра существуют между любыми двумя различными позициями a и b (1 ≤ a, b ≤ n), для которых выполняется хотя бы одно из следующих условий: - a и b являются соседними позициями в строке, то есть |a - b| = 1.
- В позициях a и b записаны одинаковые символы, то есть sa = sb.
Далее, чтобы не было скучно, Матвей решил найти диаметр этого графа, то есть максимальное кратчайшее расстояние среди всех пар вершин, а также количество пар вершин, на которых это расстояние достигается. Матвей — очень опытный программист, поэтому быстро справился с этой задачей. Получится ли у вас? Выходные данные Выведите два целых числа — диаметр графа и количество пар вершин, расстояние между которыми равно диаметру. Примечание Рассмотрим второй тестовый пример. Максимальное расстояние — 2. Оно достигается для четырёх пар вершин : (1, 4), (2, 4), (4, 6) и (4, 7).
| |
|
|
G. Xor-матическое число графа
битмаски
графы
Деревья
математика
теория чисел
*2600
Вам дан неориентированный граф, состоящий из n вершин и m ребер. На каждом ребре написано целое неотрицательное число. Назовем тройку чисел (u, v, s) интересной, если 1 ≤ u < v ≤ n и между вершинами u и v существует путь (необязательно простой, то есть может содержать какие-то вершины и рёбра по несколько раз), такой что xor чисел, написанных на рёбрах этого пути, равен s. При вычислении значения s для какого-нибудь пути, каждое ребро участвует в xor столько раз, сколько раз оно встречает на данном пути. Нетрудно доказать, что таких троек конечное количество. Посчитайте сумму по модулю 109 + 7 значений числа s по всем интересным тройкам. Выходные данные Выведите единственное число, равное искомой сумме по модулю 109 + 7. Примечание В первом примере существует 6 интересных троек: - (1, 2, 1)
- (1, 3, 2)
- (1, 4, 3)
- (2, 3, 3)
- (2, 4, 2)
- (3, 4, 1)
Искомая сумма равна 1 + 2 + 3 + 3 + 2 + 1 = 12. В втором примере существует 12 интересных троек: - (1, 2, 1)
- (2, 3, 2)
- (1, 3, 3)
- (3, 4, 4)
- (2, 4, 6)
- (1, 4, 7)
- (1, 4, 8)
- (2, 4, 9)
- (3, 4, 11)
- (1, 3, 12)
- (2, 3, 13)
- (1, 2, 14)
Искомая сумма равна 1 + 2 + 3 + 4 + 6 + 7 + 8 + 9 + 11 + 12 + 13 + 14 = 90.
| |
|
|
F. Антон и школа
битмаски
Конструктив
математика
реализация
*2500
Антон учится в школе. Его любимый предмет — массивоведение. Этот предмет ему легко даётся, он обычно решает задачи по массивоведению очень быстро. Однажды, когда Антон в очередной раз справился со всеми задачами по массивоведению за десять минут, учительница дала ему задачу посложнее: даны два массива b и c длины n, и надо найти массив a такой, что 
где a and b обозначает операцию побитового И, а a or b обозначает операцию побитового ИЛИ. Хотя Антон обычно решает задачи по массивоведению очень быстро, эта задача оказалась ему не по зубам. Поэтому он решил обратиться к Вам за помощью. Помогите Антону решить эту задачу! Выходные данные Если решения не существует, выведите одно число - 1. Иначе в единственной строке выходных данных выведите через пробел n целых неотрицательных чисел ai — элементы массива a. Если решений несколько, разрешается вывести любое из них.
| |
|
|
B. Хлоя и последовательность
Бинарный поиск
битмаски
Конструктив
реализация
*1200
Хлоя, как и Владик, — спортивный программист. У нее не было проблем с тем, чтобы добраться до олимпиады, но на самой олимпиаде ей понадобилась ваша помощь! У нее не получается решить следующую задачу. Рассмотрим следующий алгоритм генерации последовательностей целых чисел. Первоначально имеется последовательность из одного элемента, равного 1. Далее производится (n - 1) шаг. На каждом шаге берется последовательность, полученная на предыдущем шаге, приписывается сама к себе в конец, а в середину вставляется символ с минимальным положительным, не использованным ранее, числом. Например, после первого шага получится последовательность [1, 2, 1], а после второго — [1, 2, 1, 3, 1, 2, 1]. Необходимо вывести значение элемента, стоящего на k-й позиции (элементы пронумерованы с 1) в итоговой последовательности, т. е. после (n - 1) шага. Помогите Хлое решить задачу! Выходные данные Выведите одно целое число — число, стоящее в итоговой последовательности на позиции k. Примечание В первом примере итоговая последовательность — [1, 2, 1, 3, 1, 2, 1]. Число, стоящее на второй позиции, равно 2. Во втором примере итоговая последовательность — [1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1]. Число на восьмой позиции — 4.
| |
|
|
E. Владик и карты
Бинарный поиск
битмаски
дп
Перебор
*2200
Владик заскучал по дороге домой и решил сыграть в следующую игру. Он взял n карт и положил их в ряд перед собой. На каждой карте Владика написано целое положительное число, не превосходящее 8. Он решил найти самую длинную подпоследовательность карт, для которой выполняются следующие условия: - количество вхождений каждого числа от 1 до 8 в подпоследовательности отличается не более, чем на 1 от количества вхождений любого другого числа. Более формально, если в подпоследовательности ck карт с числом k на них, то для всех
выполняется |ci - cj| ≤ 1. - если в подпоследовательности имеется карта с числом x, то все карты с числом x должны составлять непрерывный отрезок в этой подпоследовательности (но не обязательно быть непрерывным отрезком в исходной последовательности). Например, последовательность карт [1, 1, 2, 2] удовлетворяет данному условию, а [1, 2, 2, 1] — нет. Обратите внимание, что [1, 1, 2, 2] не удовлетворяет первому условию.
Помогите Владику и найдите максимальную длину подходящей подпоследовательности. Выходные данные Выведите одно целое число — длину максимальной подпоследовательности, в которой выполняются все условия. Примечание В первом примере числа на всех карточках равны, поэтому мы не сможем взять больше, чем одну карточку, поскольку нарушим первое условие.
| |
|
|
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
Второй пример показывает, что и недиагональные элементы могут быть равны нулю.
| |
|
|
C. Коровоконг покупает колоду карт
битмаски
дп
Перебор
*2400
У Коровоконга уже есть много колод карт, но в этот раз он увидел в магазине совершенно новую колоду из n красных и синих карт и сразу захотел её купить. Чтобы это сделать, придётся сыграть в игру с владельцем магазина. Игра состоит из последовательных ходов Коровоконга, на каждом ходу он совершает ровно одно из двух действий: - Взять фишки. Коровоконг получает 1 красную фишку и 1 синюю фишку (таким образом, в сумме он получает 2 фишки за одно действие).
- Покупка одной карты. Коровоконг выбирает какую-то карту и покупает её за фишки по правилам, описанным ниже.
Базовая стоимость i-й карты составляет ri красных фишек и bi голубых фишек. Допустим, у Коровоконга сейчас есть A красных карт и B синих карт, тогда покупка i-й карты потребует от Коровоконга max(ri - A, 0) красных фишек и max(bi - B, 0) синих фишек. Обратите внимание, при покупке у Коровоконга забирают соответствующее количество фишек, но сами карты всегда остаются с ним. Каждую карту можно купить ровно один раз. По данному описанию всех карт в колоде определите минимальное количество ходов, за которое Коровоконг может купить их все. Выходные данные Выведите одно целое число, означающее минимальное количество ходов, за которое можно получить все карты колоды. Примечание В первом примере Коровоконгу потребуется совершить четыре хода: - Взять фишки.
- Приобрести карту 1.
- Приобрести карту 2.
- Приобрести карту 3.
Обратите внимание, что на четвёртом ходу Коровоконг может купить карту 3, потому что у него уже есть одна красная и одна синяя карты и ему вообще не нужны фишки. Во втором примере следующая стратегия будет одной из оптимальных: - Взять фишки.
- Взять фишки.
- Приобрести карту 2.
- Взять фишки.
- Приобрести карту 3.
- Приобрести карту 1.
На пятом ходу, хотя у Коровоконга есть в запасе красная фишка, нет необходимости её тратить, потому что у него уже имеется красная карта.
| |
|
|
G. Новый год и пути в двоичном дереве
битмаски
дп
Комбинаторика
Перебор
*3200
Новогоднее дерево является бесконечным полным двоичным деревом, корнем которого является вершина с номером 1. У каждой вершины v есть ровно два сына: вершина с номером (2·v) и вершина с номером (2·v + 1). Полярные медведи очень любят украшать новогоднее дерево и Лимак конечно же не исключение. Поскольку он ещё только маленький медвежонок, ему разрешили украсить только некоторый простой путь между какой-то парой вершин. С другой стороны, ему разрешили самому выбрать какой именно путь украсить! Теперь он хочет знать количество неупорядоченных пар индексов (u, v) (u ≤ v), таких что сумма индексов на пути между u и v (включая крайние вершины) равняется s. Сможете ли вы помочь ему вычислить это количество? Выходные данные Выведите одно целое число, равное количеству неупорядоченных пар индексов вершин, определяющих простой путь с суммой индексов равной s. Примечание В примере из условия существует 4 пути с суммой индексов равной 10:
| |
|
|
E. Даша и циклическая таблица
битмаски
бпф
Деревья
Перебор
Строки
*2600
Даша увлекается всякими сложными головоломками — кубик Рубика 3 × 3 × 3, 4 × 4 × 4, 5 × 5 × 5 и тому подобное. На этот раз у неё есть циклическая таблица размера n × m клеток из строчных букв латинского алфавита. Каждая клетка таблицы имеет координаты (i, j) (0 ≤ i < n, 0 ≤ j < m). Цикличность этой таблицы заключается в том, что правее клетки (i, j) находится клетка , а ниже находится клетка . Также у Даши есть шаблон. Шаблоном является нециклическая таблица размера r × c клеток. Каждая клетка шаблона является либо строчной буквой латинского алфавита либо символом вопроса. Каждая клетка шаблона имеет координаты (i, j) (0 ≤ i < r, 0 ≤ j < c). Задачей головоломки является определение всех позиций вхождения шаблона в циклическую таблицу. Определим позицию вхождения шаблона в циклическую таблицу. Позиция (i, j) циклической таблицы является позицией вхождения, если для каждого (x, y), что 0 ≤ x < r и 0 ≤ y < c, выполняется одно из двух условий: - Клетка шаблона с координатами (x, y) является символом вопроса.
- Клетка циклической таблицы с координатами
равняется клетке шаблона с координатами (x, y). Даша прекрасно справилась с решением этой головоломки, впрочем как и со всеми остальными головоломками. Посмотрим, сможете ли вы это сделать. Выходные данные Выведите n строк. Каждая из этих n строк должна содержать по m символов. Каждый из этих символов должен быть равен '0' или '1'. На позиции j строки i (0-индексация) выходных данных должен находиться символ '1', если позиция (i, j) является позицией вхождения, иначе символ '0'.
| |
|
|
F. Польшар и Подарки
битмаски
дп
жадные алгоритмы
*2600
Рождество! Польшар и его друзья будут дарить друг другу подарки. Всего шаров n. Каждый шар должен подарить подарок ровно одному другому шару в соответствии с некоторой перестановкой p, pi ≠ i для всех i. К сожалению, шары забывчивы. Мы знаем, что ровно k шаров забудут принести свои подарки. Шар номер i получит подарок, если будут выполнены следующие два условия: - Шар номер i должен принести свой подарок.
- Шар x такой, что px = i, должен принести свой подарок.
Какое минимально и максимально возможное число шаров, которые не получат свой подарок, если ровно k шаров забудут принести свой подарок? Выходные данные Выведите два числа — минимально и максимально возможное число шаров, которые не получат подарков, соответственно. Примечание В первом примере, если первый и третий шары забудут принести подарок, то они же и будут единственными, кто не получит подарка. Поэтому минимальный ответ равен 2. Однако, если первый и второй шары забудут, то только пятый шар получит подарок. Поэтому максимальный ответ равен 4.
| |
|
|
D. Секрет фестиваля раскрыт
битмаски
дп
*2200
Руководители школ очарованы эволюционированием, произошедшим в специальном лагере. Поэтому им было интересно узнать секрет эволюционирования. Организаторы лагеря дали руководителям Покеблок — последовательность из n ингредиентов. Каждый ингредиент имеет тип 0 или 1. Организаторы сказали руководителям, что чтобы покемон типа k (k ≥ 2) эволюционировал, необходимо сделать k разрезов Покеблока, получая меньшие блоки. Пусть Покеблок это последовательность b0b1b2... bn - 1. Разрезы можно делать в n + 1 местах, то есть до b0, между b0 и b1, между b1 и b2, ..., между bn - 2 и bn - 1, и после bn - 1. n + 1 мест для разрезов выглядит так (| означает возможный разрез): | b0 | b1 | b2 | ... | bn - 2 | bn - 1 |Рассмотрим набор из k разрезов. Между каждой парой соседних разрезов находится бинарная строка, составленная из типов ингредиентов. Ингредиенты перед первым разрезом и после последнего не учитываются. Поэтому всего будет ровно k - 1 бинарных строк. Каждая строка может быть прочитана как число в двоичной системе счисления. Пусть m — это максимальное число среди полученных. Если все полученные числа положительны, и среди них встречаются все числа от 1 до m, то такой набор разрезов считается корректным. Например, пусть Покеблок имеет вид 101101001110 и мы сделали 5 разрезов: 10 | 11 | 010 | 01 | 1 | 10Полученные 4 бинарных подстроки: 11, 010, 01 и 1, они соответствуют числам 3, 2, 1 и 1 соответственно. В данном случае m = 3, потому что это максимальное среди чисел. Все числа положительные, и встречаются все числа от 1 до m. Поэтому этот набор разрезов — корректный набор 5 разрезов. Покемон типа k эволюционирует только если Покеблок разрезан набором из k разрезов. Возможно, существуют несколько наборов разрезов с одинаковым числом разрезов. Два корректных набора k разрезов считаются различными, если в одном наборе есть разрез, которого нет в другом наборе. Пусть f(k) — число корректных наборов k разрезов. Найдите значение . Так как число s может быть большим, выведите остаток от деления s на 109 + 7. Выходные данные Выведите единственное число — остаток от деления s на 109 + 7. Примечание В первом примере корректные наборы разрезов следующие: Размер 2: |1|011, 1|01|1, 10|1|1, 101|1|. Размер 3: |1|01|1, |10|1|1, 10|1|1|, 1|01|1|. Размер 4: |10|1|1|, |1|01|1|. Поэтому, f(2) = 4, f(3) = 4 и f(4) = 2. Значит, s = 10. Во втором примере единственный корректный набор разрезов следующий: Размер 2: |1|0. Поэтому, f(2) = 1 и f(3) = 0. Значит s = 1.
| |
|
|
C. Мутация
битмаски
дп
математика
*2700
Ученые планеты Олимпия проводят очередной эксперимент в области мутации примитивных организмов. Геном организма с этой планеты может быть представлен в виде строки из первых K заглавных букв английского алфавита. Для каждой пары типов генов было установлено риск возникновения заболевания ai, j, при условии что гены этих типов стоят подряд в геноме, где i — номер первого гена (нумерация начинается с 1), j — номер второго гена. Ген 'A' имеет номер 1, 'B' имеет номер 2 и так далее. Например, a3, 2 отвечает за пару 'CB'. Риск возникновения заболевания у организма равен сумме рисков для каждой пары соседних генов в геноме и измеряется он в рискограммах. Ученые уже получили базовый организм, из которого путем мутации могут быть получены другие организмы. Механизм мутации включает удаление всех генов определенных типов. Такое удаление дополнительно увеличивает риск возникновения заболевания, причем для каждого типа генов было определено число ti — на сколько увеличится риск заболевания организма, если все гены типа i будут удалены. Например, t4 отвечает за суммарный риск, добавляющийся при удалении всех генов типа 'D'. Цель ученых — посчитать количество различных организмов, которые можно получить из базового описанным выше путем, причем риск возникновения заболевания у которых не превышает T рискограмм. Два организма считаются разными, если строки задающие их геномы отличаются. Геном полученного организма должен состоять хотя бы из одного гена. Выходные данные Единственная строка выходного файла должна содержать одно целое число — искомое количество разных организмов с риском возникновения заболевания не более T рискограммов, которые могут быть получены из базового путем описанным в условии. Примечание Объяснение: возможно получить такие организмы (в скобках указано риски): BACAC (11), ACAC (10), BAA (5), B (6), AA (4).
| |
|
|
E. Махмуд и xor-поездка
битмаски
Деревья
дп
Конструктив
математика
поиск в глубину и подобное
Структуры данных
*2100
Махмуд и Ехаб живут в стране, в которой n городов, пронумерованных от 1 до n, соединенных n - 1 двунаправленными дорогами. Гарантируется, что из любого города можно добраться в любой другой используя только эти дороги. Про каждый город известна некоторая величина ai. Определим расстояние от города x до города y как xor чисел, известных про города на пути от x до y (включая как x, так и y). Другими словами, если мы выпишем все величины городов на пути от x до y в массив p длины l, то расстояние между ними будет равно , где — операция побитовый xor. Махмуд и Ехаб хотят выбрать два города и проехать от одного до другого. Номер города, в котором они стартуют, всегда не больше номера города, в котором они финишируют (они могут стартовать и закончить в одном и том же городе, тогда расстояние будет равно величине, известной про этот город). Они никак не могут выбрать эти два города, поэтому они попробуют каждый город как старт и каждый город с не меньшим индексом как финиш. Определите суммарное расстояние между всеми этими парами городов. Выходные данные Выведите одно число — суммарное расстояние между всеми возможными парами городов. Примечание Операция побитовый xor принимает два целых битовых числа одинаковой длины и выполняет логическую операцию xor на каждой паре соответсвующих бит. Результат в позиции равен 1, если и только если только первый бит 1 или только второй бит 1, и результат равен 0 если оба бита 0 или оба бита 1. Больше информации о побитовом xor можно найти здесь: https://ru.wikipedia.org/wiki/Битовые_операции#.D0.98.D1.81.D0.BA.D0.BB.D1.8E.D1.87.D0.B0.D1.8E.D1.89.D0.B5.D0.B5_.D0.98.D0.9B.D0.98_.28XOR.29. В первом тесте из примера возможные пути следующие: - из города 1 в него самого, расстояние 1,
- из города 2 в него самого, расстояние 2,
- из города 3 в него самого, расстояние 3,
- из города 1 в город 2, расстояние
, - из города 1 в город 3, расстояние
, - из города 2 в город 3, расстояние
. Суммарное расстояние равно 1 + 2 + 3 + 3 + 0 + 1 = 10.
| |
|
|
E. Игра Камней
битмаски
дп
игры
*2100
Сэм учит Джона игре под названием Игра Камней, чтобы заострить ум и помочь ему разработать стратегию сражения с белыми ходоками. Правила этой игры просты: - Игра начинается с n куч камней, пронумерованных от 1 до n. i-я куча содержит si камней.
- Игроки делают ходы по очереди. Ход рассматривается, как удаление некоторого числа камней из кучи. Удаление 0 камней не считается ходом.
- Игрок, который не может сделать ход, проигрывает.
Теперь Джон верит, что готов к бою, но Сэм так не думает. Чтобы доказать его аргумент, Сэм предлагает сыграть в модификацию игры. В модифицированной игре один и тот же ход не может быть сделан больше одного раза на куче. Например, если 4 камня удалены из кучи, то 4 камня больше не могут быть удалены из этой кучи опять. Сэм начинает игру и делает первый ход. Джон верит, что Сэм всего лишь пытается предотвратить его поход в бой. Джон хочет знать, может ли он выиграть, если оба игрока играют оптимально. Выходные данные Выведите единственную строку, содержащую «YES» (без кавычек), если Джон выиграет, иначе выведите «NO» (без кавычек). Примечание В первом примере Сэм удаляет все камни и Джон проигрывает. Во втором примере следующие ходы Сэма возможны:
В каждом из этих случаев Джон может сделать последний ход и выиграть: 
| |
|
|
D. k-Интересные пары чисел
*особая задача
meet-in-the-middle
битмаски
Перебор
*1700
У Васи есть последовательность, состоящая из n целых чисел. Вася считает пару чисел x и y k-интересной, если их двоичное представление отличается друг от друга ровно в k битах. Например, если k = 2, то пара чисел x = 5 и y = 3 является k-интересной, так как двоичные представления x=101 и y=011 отличаются ровно в двух битах. Васе стало интересно, сколько в его последовательности существует пар индексов (i, j) таких, что i < j и пара чисел ai и aj является k-интересной. Перед вами стоит задача помочь Васе и определить это количество. Выходные данные Выведите количество пар (i, j) таких, что i < j и пара чисел ai и aj является k-интересной. Примечание В первом примере существует 4 k-интересные пары: - (1, 3),
- (1, 4),
- (2, 3),
- (2, 4).
Во втором примере k = 0. Следовательно, числа в любой k-интересной паре должны быть равны между собой. Таким образом, для второго примера существует 6 k-интересных пар: - (1, 5),
- (1, 6),
- (2, 3),
- (2, 4),
- (3, 4),
- (5, 6).
| |
|
|
D. Властные Контакты
битмаски
дп
*2700
Вам дано n целых чисел a1, a2, ..., an. Обозначим этот список как T. Пусть f(L) — функция, аргументом которой является непустой список чисел L. Результатом функции является целое число, вычисленное по следующим правилам: - Сначала все числа из L дополняются ведущими нулями, чтобы они имели одинаковую длину, равную максимальной длине среди чисел в L.
- Затем строится строка, где символ номер i является минимальным из i-х символов в дополненных нулями исходных числах.
- Полученная строка понимается как число, записанное в десятичной системе счисления, которое и является результатом функции.
Например, f(10, 9) = 0, f(123, 321) = 121, f(530, 932, 81) = 30. Определим функцию  Здесь  означает подпоследовательность. Другими словами, G(x) — сумма квадратов сумм элементов непустых подпоследовательностей T, для которых функция f возвращает x, по модулю 1 000 000 007, в конце умноженная на x. Результат последнего умножения не берется по модулю. Вы хотите вычислить G(0), G(1), ..., G(999 999). Для уменьшения размера вывода вычислите одно число , где означает побитовое исключающее ИЛИ. Выходные данные Выведите единственное число — ответ на задачу. Примечание В первом примере ненулевые значения G равны: G(121) = 144 611 577, G(123) = 58 401 999, G(321) = 279 403 857, G(555) = 170 953 875. Побитовое исключающее ИЛИ этих чисел равно 292 711 924. Например, , потому что функция f над последовательностями [123] и [123, 555] производит результат 123. Во втором примере  В последнем примере , где — биномиальный коэффициент.
| |
|
|
G. Шерлок и зашифрованные данные
битмаски
дп
Комбинаторика
*2900
Шерлок нашел зашифрованые данные, которые, как он считает, могут помочь поймать Мориарти. Зашифрованные данные состоят из двух целых чисел l и r. Шерлок заметил, что эти числа записаны в шестнадцатеричной системе счисления. Шерлок берет каждое целое число от l до r, и выполняет над ним следующие операции: - Выписывает все различные цифры, которые присутствуют в этом числе в шестнадцатеричной записи. Например, для 101416 он выпишет 1, 0, 4.
- Затем он складывает соответствующие степени двойки для каждой выписанной цифры. В примере выше sum = 21 + 20 + 24 = 1910.
- Затем Шерлок изменяет исходное число, выполняя операцию побитового xor над исходным числом и полученной суммой. Например,
. Заметьте, что xor выполняется в двоичной системе счисления.
Другой пример: для числа 1e сумма равна sum = 21 + 214. Буквами a, b, c, d, e, f обозначаются шестнадцатеричные цифры 10, 11, 12, 13, 14, 15, соответственно. Шерлок хочет найти количество чисел в диапазоне от l до r (включительно), которые уменьшатся после выполнения описанных четырех шагов. Он хочет, чтобы вы посчитали для него ответ для q различных вариантов l и r. Выходные данные Выведите q строк, строка i должна содержать ответ на i-й вопрос Шерлока (в десятеричной системе счисления). Примечание Во втором тесте из примера: 1416 = 2010 sum = 21 + 24 = 18
Это число уменьшается. Можно проверить, что это единственное число между 1 и 1e, которое уменьшается после выполнения операций.
| |
|
|
B. Побитовая формула
битмаски
Перебор
поиск в глубину и подобное
Разбор выражений
реализация
*1800
Вася недавно прочитал о битовых операциях, которые используются в компьютерах: AND, OR и XOR. Он неплохо изучил их свойства и придумал новую игру. Изначально Вася выбирает разрядность m для своей игры, это значит, что все числа в игре будут состоять из m битов. Потом он просит Петю выбрать некоторое одно m-битное число. После этого Вася вычисляет значения n переменных. Каждой из переменных присваивается либо константное m-битное число, либо результат выполнения битовой операции, операндами которой могут являться уже определенные переменные или выбранное Петей число. После этого сумма очков, которую получает Петя, равна сумме значений всех переменных. Вася хочет узнать, какое число должен выбрать Петя, чтобы получить минимально возможное число очков, и какое число он должен выбрать, чтобы получить максимальное число очков. В обоих случаях, если у Пети есть несколько способов получить такую сумму, найдите минимальное число, которое он может выбрать. Выходные данные В первой строке выведите минимальное число, которое должен выбрать Петя, чтобы сумма значений всех переменных была минимальна, во второй строке — минимальное число, которое должен выбрать Петя, чтобы сумма значений всех переменных была максимальна. Оба числа выведите в виде двоичного m-битного числа. Примечание В первом тесте если Петя выбирает число 0112, то a = 1012, b = 0112, c = 0002, сумма их значений равна 8. Если же он выберет число 1002, то a = 1012, b = 0112, c = 1112, сумма их значений равна 15. Для второго теста минимальная и максимальная суммы переменных a, bb, cx, d и e равны 2 и не зависят от загаданного числа, поэтому минимальное число, которое может выбрать Петя — 0.
| |
|
|
F. Аксель и Марстон в Битландии
битмаски
графы
дп
матрицы
*2400
Два друга Аксель и Марстон вместе путешествуют по Битландии. В Битландии n городов, некоторые пары из которых соединены однонаправленными дорогами. Дороги в Битландии бывают пешеходные и велосипедные. В Битландии может быть несколько дорог между каждой парой городов, и бывают даже дороги из города в него же. Однако, никакие две дороги в Битландии не могут иметь одинаковые начало, конец и тип одновременно. Друзья находятся в городе 1 и хотят составить маршрут путешествия. Аксель любит ходить пешком, а Марстон предпочитает велосипед. Чтобы маршрут получился разнообразным и интересным для каждого из друзей, они выбирают порядок чередования типов пройденных дорог следующим образом: - Маршрут начинается с пешеходной дороги.
- Пусть известное начало маршрута записано в виде строки s из букв П (пешеходная дорога) и В (велосипедная дорога). Тогда к маршруту s дописывается строка
, где означает строку s, в которой тип каждой дороги заменен на противоположный (все пешеходные дороги на велосипедные, и наоборот).
Первые несколько шагов построения маршрута будут выглядеть так: П, ПВ, ПВВП, ПВВПВППВ, ПВВПВППВВППВПВВП, и так далее. Далее, друзья начинают движение в городе 1 по дорогам Битландии, каждый раз выбирая тип очередной дороги в соответствии с очередным символом маршрута. Если же подходящую дорогу выбрать не удается, друзья заканчивают свое путешествие и летят домой. Помогите друзьям определить максимально возможную продолжительность своего путешествия, если они будут следовать построенной последовательности типов дорог. Если друзья могут найти путь, состоящий более, чем из 1018 дорог, вместо длины выведите -1. Выходные данные Если друзья могут найти подходящий путь длины строго большей, чем 1018, выведите одно число -1. В противном случае выведите максимальную длину подходящего пути, то есть наибольшее количество дорог, которое могут пройти друзья. Примечание В первом примере путь длины 3 можно получить, пройдя один раз по дороге 1 из города 1 в город 2, после чего дважды по дороге 2 из города 2 в него же. Во втором примере мы можем получить путь сколь угодно большой длины, сперва пройдя по дороге 1, а после этого выбирая дорогу 2 или 3 в зависимости от очередного типа дороги.
| |
|
|
D. Кодовый замок
битмаски
дп
кратчайшие пути
*2800
Наконец лиса Кейл прибыла к своему замку! Она должна ввести код для входа в свой замок. Консоль ввода, подключенная к её замку, немного необычна. Консоль ввода — это прямоугольник размера 1 × n, разделенный на n одинаковых квадратных панелей. Они пронумерованы от 1 до n слева направо. Каждая панель имеет состояние ON (включено) или OFF (выключено). Изначально все панели выключены. Она может войти в её замок, тогда и только тогда, когда x1-я, x2-я, ..., xk-я панели находятся во включенном состоянии, а остальные панели находятся в выключенном состоянии. Ей дан массив a1, a2, ..., al. За каждый ход она может выполнять следующую операцию: выбрать индекс i (1 ≤ i ≤ l), выбрать последовательные ai панелей, и изменить состояния выбранных ai панелей (т.е. ON → OFF, OFF → ON). К сожалению, она забыла как набрать код, в условиях описанных правил. Помогите определить минимальное число операций, необходимых Кейл для того, чтобы войти в замок. Выходные данные Выведите наименьшее число ходов, необходимое для того, чтобы ввести код. Если это невозможно, выведите -1. Примечание Один из возможных способов ввести код в первом примере: на первом ходу выбрать 1-ую, 2-ую, 3-ую панели и изменить их состояния. На втором ходу можно выбрать 5-ую, 6-ую, 7-ую, 8-ую, 9-ую панели и изменить их состояния.
| |
|
|
D. Пути в полном бинарном дереве
битмаски
Деревья
*1900
Пусть T — полное бинарное дерево, состоящее из n вершин. Это означает, что ровно одна вершина является его корнем и у каждой вершины либо ровно два сына (левый и правый), либо нет сыновей (вершина является листом). Все листы полного бинарного дерева находятся на одинаковом расстоянии от корня. Очевидно, число n таково, что n + 1 обязательно является степенью числа 2. На рисунке ниже изображен пример полного бинарного дерева для n = 15. Вершины дерева будем нумеровать от 1 до n специальным образом. Нумерацию будем производить рекурсивным образом: сначала рекурсивно назначим номера вершинам левого поддерева (если оно есть), затем дадим очередной номер текущей вершине, а после этого рекурсивно назначим номера вершинам правого поддерева (если оно есть). Номера на рисунке выше назначены именно таким образом. Отметим, что описанный способ однозначно определяет номера вершин. Такой порядок обхода бинарного дерева называется симметричным. Напишите программу, которая по заданному числу n и q запросам возвращает ответ на каждый из них. Каждый из запросов — это целое число ui (1 ≤ ui ≤ n) и строка si, где ui — номер вершины, а si — описание пути из этой вершины. Строка si содержит исключительно буквы 'L', 'R' и 'U', которые обозначают переход к левому сыну, переход к правому сыну и переход к родительской вершине соответственно. Символы в строке si следует обрабатывать последовательно слева направо, считая стартовой вершину ui. Если переход невозможен, то его следует проигнорировать. Ответом на запрос является номер вершины, в которой будет завершен путь si. Например, если ui = 4 и si = «UURL», то ответом будет вершина 10. Выходные данные Выведите q чисел, i-е из них должно быть равно ответу на i-й запрос.
| |
|
|
F. Восстановление последовательности
битмаски
жадные алгоритмы
Структуры данных
*2800
Однажды у Зейна была хорошая последовательность a из n целых чисел a1, a2, ..., an, но он ее потерял. Последовательность называется хорошей, если и только если все ее элементы — целые неотрицательные числа, не превосходящие 109. Однако, Зейн помнит, что он играл с последовательностью, применяя к ней m операций. Было два типа операций: 1. Найти максимальное значение среди чисел с индексами i такими, что l ≤ i ≤ r, по данным l и r. 2. Присвоить значение d элементу последовательности с индексом k, по данным k и d. После того, как он поиграл с последовательностью, он восстановил массив до исходного состояния. Это значит, что пропали изменения в последовательности a, внесенные операциями типа 2. После этого Зейн потерял последовательность. К счастью, Зейн помнит все операции, их порядок, а также результат всех операций типа 1, которые оказались различными. Кроме этого, Зейн знает, что среди всех хороших последовательностей, которые произвели бы те же результаты после применения этих операций в соответствующем порядке, последовательность a имела наибольшую красоту. Красота последовательности — это побитовый OR всех элементов последовательности. Например, красота последовательности Зейна a равняется a1 OR a2 OR ... OR an. Зейн понимает, что не всегда возможно точно восстановить потерянную последовательность по данной информации, поэтому он будет доволен получить любую хорошую последовательность b, состоящую из n целых чисел b1, b2, ..., bn такую, что: 1. она даст такой же результат при применении данных операций; 2. имеет такую же красоту, как и последовательность Зейна a. Если такая последовательность существует, найдите ее. Иначе сообщите, что Зейн запомнил что-то неправильно. Выходные данные Если не существует подходящей хорошей последовательности, выведите «NO» (без кавычек) в единственной строке. Иначе, выведите «YES» (без кавычек) на первой строке, и n целых чисел b1, b2, ..., bn (0 ≤ bi ≤ 109) на второй строке. Если существует несколько ответов, выведите любой из них. Примечание В первом примере легко показать, что данная хорошая последовательность подходит. В частности, ее красота равна 19 OR 0 OR 0 OR 0 OR 1 = 19. Во втором примере ясно, что две операции противоречат друг другу, поэтому не существует подходящей хорошей последовательности.
| |
|
|
C. Нахождение порядка
битмаски
дп
*2000
Девочка Лена очень любит порядок и пытается везде его искать. Как-то раз она собиралась в университет и заметила, что в комнате ужасный беспорядок — все вещи из ее сумочки разбросаны по комнате. Конечно же, она захотела их собрать в сумочку. Беда только в том, что девочка не может нести более двух вещей одновременно и не может переносить сумочку. Также если она взяла вещь, то положить ее куда-нибудь кроме сумочки она не может — ей мешает врожденное чувство идеального порядка. Вам заданы координаты сумочки и координаты вещей в некоторой декартовой системе координат. Известно, что девочка проходит путь между двумя объектами за время равное квадрату длины отрезка соединяющего точки, в которых находятся объекты. Также известно, что изначально координаты девочки и сумочки совпадают. Требуется найти такой порядок действий, при котором девочка соберет все вещи в сумочку за минимальное время. Выходные данные В первую строку выведите единственное число минимальное время, требуемое девочке чтобы собрать все вещи. Во вторую строку выведите возможный оптимальный путь Лены. Каждая вещь обозначается своим порядковым номером при задании во входных данных (от 1 до n), а позиция сумочки обозначается числом 0. Путь должен начинаться и заканчиваться в позиции сумочки. Если решений несколько, выведите любое из них.
| |
|
|
F. Взаимно простые подпоследовательности
битмаски
Комбинаторика
теория чисел
*2000
Назовём непустую последовательность натуральных чисел a1, a2... ak взаимно простой, если наибольший общий делитель всех элементов последовательности равен 1. Дан массив a, состоящий из n натуральных чисел. Найдите количество его взаимно простых подпоследовательностей. Так как ответ может быть очень большим, выведите его по модулю 109 + 7. Обратите внимание: две подпоследовательности считаются различными, если различны выбранные индексы. К примеру, в массиве [1, 1] 3 различных подпоследовательности: [1], [1] и [1, 1]. Выходные данные Выведите единственное число — количество взаимно простых подпоследовательностей a по модулю 109 + 7. Примечание В первом примере взаимно простыми являются следующие подпоследовательности: - 1
- 1, 2
- 1, 3
- 1, 2, 3
- 2, 3
Во втором примере все подпоследовательности являются взаимно простыми.
| |
|
|
B. Охранник Сахир
битмаски
дп
Перебор
*1600
Некоторые люди не выключают свет, когда уходят из помещения, что ведет к бесполезной растрате энергии. Будучи охранником в университете, Сахир ждет, пока все студенты и профессора покинут здание, а затем идет и выключает везде свет. В здании n этажей и две лестницы слева и справа. На каждом этаже есть m комнат вдоль коридора, который соединяет левую и правую лестницы. Другими словами, здание можно представить как прямоугольник из n строк и m + 2 столбцов, где первый и последний столбец — лестницы, а m столбцов посередине — комнаты. Сахир сейчас стоит на первом этаже на левой лестнице. Он хочет выключить везде свет, при этом, он не хочет подниматься на этаж выше до того, как выключит весь свет на текущем этаже. Конечно, Сахир должен побывать в комнате, чтобы выключить в ней свет. Сахир тратит одну минуту на то, чтобы подняться по лестнице на один этаж или перейти в соседнюю команату/на лестницу из соседней комнаты или с лестницы на том же этаже. Выключение света в комнате, в которой Сахир находится, не отнимает у него времени. Помогите Сахиру найти минимальное время для выключения всего света в здании. Заметьте, что Сахир не должен возвращаться на исходную позицию, а также то, что он не обязан посещать комнаты, в которых свет и так выключен. Выходные данные Выведите одно число — минимально возможное время, необходимое для того, чтобы выключить весь свет. Примечание В первом примере Сахир сначала пойдет в комнату 1 на первом этаже, а затем — в комнату 2 на втором этаже, используя любую лестницу. Во втором примере он пойдет сначала в четвертую комнату на первом этаже, поднимется на один этаж по правой лестнице, зайдет в четвертую комнату на втором этаже, опять поднимется по правой лестнице, пойдет во вторую комнату на последнем этаже. В третьем примере он будет проходить по всему коридору на каждом этаже, чередуя лестницы.
| |
|
|
E. Выбор командира
битмаски
Деревья
Структуры данных
*2000
Как вы, может быть, помните по предыдущему раунду, Вова играет в стратегическую компьютерную игру Rage of Empires. Вове удалось создать большую армию, но он забыл о самом главном человеке в армии - командире. Сейчас он пытается нанять командира для своей армии. У каждого воина в армии Вовы есть свой характер, обозначаемый числом pi. У каждого командира два параметра — характер командира pj и лидерство lj (оба параметра — целые числа). Воин i уважает командира j только в том случае, если ( — побитовое исключающее ИЛИ чисел x и y). Изначально армия Вовы пуста. С ней происходит последовательность событий трёх типов: - 1 pi — один воин с характером pi присоединяется к армии;
- 2 pi — один воин с характером pi покидает армию;
- 3 pi li — Вова пытается нанять командира с характером pi и лидерством li.
Для каждого события третьего типа Вова хочет знать, сколько воинов (считая только тех, кто присоединился к армии и не покинул её до этого события) уважают командира, которого он пытается нанять. Выходные данные Для каждого события третьего типа выведите одно число — кол-во воинов, которые уважают командира, которого пытается нанять Вова в соответствующем событии. Примечание В первом тесте после первых двух событий армия Вовы состоит из двух воинов с характерами 3 и 4. Затем Вова пытается нанять командира с характером 6 и лидерством 3, и один воин уважает этого командира ( , и 2 < 3, но , и 5 ≥ 3). Затем воин с характером 4 уходит, и когда Вова снова пытается нанять того же командира, ни один воин не уважает его.
| |
|
|
E. Две подпоследовательности
битмаски
дп
*2800
На уроке информатики Валерий изучал сжатие данных. Учитель рассказал новый метод, который мы сейчас вам опишем. Пусть {a1, a2, ..., an} — данная последовательность строк, которую необходимо сжать. Здесь и далее будем считать, что все строки имеют одинаковую длину и состоят только из символов 0 и 1. Определим функцию сжатия: - f(пустая последовательность) = пустая строка
- f(s) = s.
- f(s1, s2) = наименьшая по длине строка, у которой один из префиксов равен s1, а один из суффиксов равен s2. Например, f(001, 011) = 0011, f(111, 011) = 111011.
- f(a1, a2, ..., an) = f(f(a1, a2, an - 1), an). Например, f(000, 000, 111) = f(f(000, 000), 111) = f(000, 111) = 000111.
Перед Валерой стоит серьезная задача — разделить данную последовательность {a1, a2, ..., an} на две подпоследовательности {b1, b2, ..., bk} и {c1, c2, ..., cm}, m + k = n, так, чтобы величина S = |f(b1, b2, ..., bk)| + |f(c1, c2, ..., cm)| приняла минимально возможное значение. Здесь |p| обозначает длину строки p. Обратите внимание, что запрещается менять относительный порядок строк в подпоследовательностях. Разрешается делать одну из подпоследовательностей пустой. Каждый элемент исходной последовательности должен принадлежать ровно одной из получившихся подпоследовательностей. Элементы подпоследовательностей b и c не обязательно должны идти подряд в исходной последовательности a, то есть они могут чередоваться (смотрите примеры 2 и 3). Помогите Валере найти минимальное возможное значение S. Выходные данные Выведите единственное число — минимально возможное значение S. Примечание Подробные ответы к тестам: - Оптимальный вариант: сделать одну из подпоследовательностей пустой, а вторую — равной всей данной последовательности. S = |f(01, 10, 01)| = |f(f(01, 10), 01)| = |f(010, 01)| = |0101| = 4.
- Оптимальный вариант: b = {000, 001}, c = {111, 110}. S = |f(000, 001)| + |f(111, 110)| = |0001| + |1110| = 8.
- Оптимальный вариант: b = {10101, 01010, 01000}, c = {11111, 10010}. S = |10101000| + |111110010| = 17.
| |
|
|
F. Охранники на складе
битмаски
дп
*2500
Поликарп — директор магазина в столице Берляндии. Недавно уровень преступности в столице возрос, поэтому Поликарп озаботился охраной склада своего магазина. Склад можно представить как матрицу из n строк и m столбцов. Каждый элемент матрицы — либо . (пустая клетка), либо x (стена). Поликарп хочет нанять некоторое количество охранников (возможно, ни одного) на склад. Каждый охранник будет стоять в какой-то клетке и наблюдать за клетками справа и снизу от него (до ближайшей стены). Формально, если охранник стоит в клетке (x0, y0), то он охраняет клетку (x1, y1), если выполняются все следующие условия: - (x1, y1) — пустая клетка;
- либо x0 = x1 и y0 ≤ y1, либо x0 ≤ x1 и y0 = y1;
- между клетками (x0, y0) и (x1, y1) нет стен. Между этими клетками могут быть охранники, т. е. охранники могут "смотреть" друг сквозь друга.
Охранники могут стоять только в пустых клетках (и охранять только пустые клетки). План охраны — некоторое множество клеток, в которых должны стоять охранники (естественно, два плана различны, если существует клетка, которая присутствует только в одном из планов). Поликарп называет план подходящим, если существует не более чем одна пустая клетка, которую никто не охраняет. Поликарп хочет узнать количество подходящих планов. Так как оно может быть очень большим, выведите его по модулю 109 + 7. Выходные данные Выведите количество подходящих планов по модулю 109 + 7. Примечание В первом примере есть три возможных плана: один охранник в клетке (1, 1), один охранник в клетке (1, 3), и два охранника в обеих клетках.
| |
|
|
C. Арпа и игра с Можтабой
битмаски
дп
игры
*2200
Можтаба и Арпа играют в игру. У них есть список из n чисел. На каждом ходу игрок может выбрать целое число pk (где p простое, а k — положительное целое) такое, что pk делит хотя бы одно число в списке. Затем для каждого числа в списке, делящегося на pk, обозначим его x, игрок удалит из списка число x и добавит в список. Игрок, который не может сделать корректного выбора числа p и k проигрывает. Можтаба начинает, и игроки по-очереди делают ходы. Определите, кто выиграет, если оба игрока играют оптимально. Выходные данные Если выиграет Можтаба, выведите «Mojtaba», иначе выведите «Arpa» (без кавычек). Вы можете вывести каждую из букв в любом регистре (строчную или заглавную). Примечание В первом примере Можтаба сразу не может сделать ход. Во втором примере Можтаба выберет p = 17 и k = 1, и список примет вид [1, 1, 1, 1]. В третьем примере если Можтаба выберет p = 17 и k = 1, то Арпа выберет p = 17 и k = 1 и выиграет, а если Можтаба выберет p = 17 и k = 2, то Арпа выберет p = 17 и k = 1 и выиграет.
| |
|
|
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.
| |
|
|
E. Медальон Салазара Слизерина
битмаски
дп
*2200
Гарри узнал от Дамблдора, что медальон Салазара Слизерина является крестражем. Этот медальон раньше находился в доме 12 на площади Гриммо, доме матери Сириуса Блэка. Он был украден оттуда и теперь находится в Министерстве Магии в офисе Долорес Амбридж, бывшей преподавателя Защиты от Темных искусств. Гарри, Рон и Гермиона проникли в Министерство. Когда они добрались в офис Амбридж, они увидели кодовый замок, который требует их сосчитать количество магических чисел от l до r включительно. Гарри помнит со времен занятий у Амбридж, что она определяет магическое число как число, которое, будучи переведенным в систему счисления с основанием b, имело четное число каждой из цифр от 0 до b - 1 в записи без ведущих нулей. Вам нужно ответить на q запросов замка. Каждый запрос задается тремя целыми числами bi, li и ri — основание и отрезок, для которых вам нужно посчитать количество магических чисел. Выходные данные Выведите q строк, на каждой выведите одно целое число — ответ на очередной запрос. Примечание В примере 1 для первого запроса переведя числа от 4 до 9 в систему счисления по основанию 2, мы получим: - 4 = 1002,
- 5 = 1012,
- 6 = 1102,
- 7 = 1112,
- 8 = 10002,
- 9 = 10012.
Среди них только 9 в системе счисления по основанию 2 имеет четное число 1 и 0. Поэтому ответ равен 1.
| |
|
|
E. Шестнадцатеричная дислексия
битмаски
графы
дп
Перебор
*3300
Копирование больших шестнадцатеричных строк (то есть чисел в системе счисления по основанию 16) вручную может вызывать много ошибок, но это не останавливает людей. Вы обнаружили ошибку в программе, которая, скорее всего, была вызвана ошибкой при копировании такой строки. Вы думаете, что тот, кто копировал строку, не изменил ни одной цифры, и не изменил длину, но, возможно, перепутал порядок цифр. Например, если исходная строка была 0abc, то, возможно, она была изменена в a0cb или 0bca, но не в abc или 0abb. К сожалению, у вас нет доступа ни к изначальной строке, ни к скопированной, но вы знаете длину этих строк и модуль их разницы (как чисел). Вам будет дана эта разница как шестнадцатеричная строка S, которая дополнена ведущими нулями до длины изначальной (и скопированной) строки. Определите наименьшее возможное численное значение исходной строки. Выходные данные Если описанное невозможно, выведите «NO» (без кавычек). Иначе выведите минимальную шестнадцатеричную строку, соответствующую минимально возможному исходному числу, включая все ведущие нули, дополняющие его до нужной длины. Выводите число в том же формате, что и во входных данных. Примечание Численное значение шестнадцатеричной строки вычисляется как сумма произведений каждой из цифр на последовательные степени числа 16, начиная с самой правой цифры, которая умножается на 160. Шестнадцатеричные цифры, большие 9, обозначаются строчными буквами: a = 10, b = 11, c = 12, d = 13, e = 14, f = 15. Например, численное значение 0f1e равно 0·163 + 15·162 + 1·161 + 14·160 = 3870, численное значение 00f1 равно 0·163 + 0·162 + 15·161 + 1·160 = 241, численное значение 100f равно 1·163 + 0·162 + 0·161 + 15·160 = 4111. Так как 3870 + 241 = 4111 и 00f1 — перестановка 100f, то 00f1 — корректный ответ на второй пример.
| |
|
|
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».
| |
|
|
C. Кволы
битмаски
дп
Конструктив
Перебор
*1500
Снарк и Филипп готовят задачи на предстоящие кволы. У них есть банк из n задач, они хотят выбрать из него любое непустое подмножество задач. На кволах будет участвовать k опытных команд. Для каждой задачи известно, для каких из этих команд эта задача баян, то есть, про каждую задачу и каждую команду известно, знает ли эта команда эту задачу, или нет. Определите, можно ли выбрать подмножество задач так, чтобы каждая из команд не знала хотя бы половину задач. Выходные данные Выведите «YES» (без кавычек), если можно выбрать непустой набор задач, удовлетворяющий ограничениям, и «NO» в противном случае. Вы можете выводить каждую букву как заглавной, так и строчной («YeS» и «yes» можно вывести вместо «YES»). Примечание В первом примере нельзя выбрать набор задач, так как первая команда знает все задачи. Во втором примере можно взять первую и третью задачи.
| |
|
|
D. Огромные строки
битмаски
дп
Перебор
реализация
Строки
*2200
Дано n строк s1, s2, ..., sn, состоящих из символов 0 и 1. Далее m раз создается новая строка как конкатенация уже имеющихся. Формально, на i-м шаге конкатенация saisbi записывается в новую строку sn + i (нумерация шагов ведется с 1). После каждой операции вам нужно найти максимальное положительное целое число k такое, что в полученной строке встречаются все возможные строки из 0 и 1 длины k (а таких различных строк 2k) как подстроки. Если такого k не существует, выведите 0. Выходные данные Выведите m строк, содержащие по одному целому числу — ответы на запросы после операций. Примечание В первой операции создается строка "0110". Для k = 1 две возможные бинарные строки длины k — это "0" и "1", они обе являются подстроками новой строки. Для k = 2 и больше существуют строки длины k, не встречающиеся в получившейся строке (для k = 2 такая строка — это "00"). Поэтому ответ равен 1. Во второй операции создается строка "01100". Теперь присутствуют все строки длины k = 2. В третьей операции создается строка "1111111111". В ней нет нулей, поэтому ответ равен 0.
| |
|
|
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. Данил и подработка
битмаски
Деревья
Структуры данных
*2000
Данил решил заработать денег, поэтому нашел подработку. Собеседование прошло хорошо, и его взяли на очень ответственную должность переключателя света. Данил будет работать в корневом дереве (связном неориентированном графе без циклов) из n вершин, корнем которого является вершина 1. В каждой вершине находится комната, в которой может гореть свет. В обязанности Данила входит переключение света во всех комнатах поддерева вершины. Это значит, что если в какой-то комнате поддерева горит свет, он должен выключить его, иначе он должен включить его. К сожалению (или к счастью), Данил очень ленивый. Он знает, что его начальник не собирается лично проверять выполнение работы. Вместо этого он будет присылать Данилу задания через личные сообщения на Workforces. Задания бывают двух типов: - pow v обозначает задание на переключение света в поддереве вершины v
- get v обозначает задание на подсчет количества комнат в поддереве v, в которых горит свет. Данил должен отправить начальнику ответ личным сообщением на Workforces.
Под поддеревом вершины v понимается все вершины, кратчайший путь от которых до корня дерева проходит через вершину v. В частности, сама вершина v лежит в поддереве вершины v. Данил не собирается выполнять свою работу. Вместо этого он просит написать вас программу, которая будет отвечать начальнику за него. Выходные данные На каждый запрос get v выведите одно целое число — количество комнат в поддереве v, в которых горит свет. Примечание Дерево до задания pow 1. Дерево после задания pow 1.
| |
|
|
A. Короткий код
битмаски
Конструктив
*1600
Петя выучил новый язык программирования CALPAS. Программа на этом языке всегда принимает на вход одно неотрицательное целое число и возвращает также неотрицательное целое число. В языке есть только три команды: применить побитовую операцию AND, OR или XOR с данной константой к текущему числу. Программа может содержать произвольную последовательность таких операций с произвольными константами от 0 до 1023. При выполнении программы команды поочередно (в заданном порядке) применяются к аргументу, и возвращается последнее получившееся число. Петя написал на этом языке программу, однако она получилась слишком длинной. Напишите программу на языке CALPAS, которая делает то же самое, что и Петина программа, и при этом состоит не более чем из 5 команд. Ваша программа должна возвращать тот же результат, что и Петина, для любого аргумента от 0 до 1023. Выходные данные Выведите число k (0 ≤ k ≤ 5) — длину вашей программы. В следующих k строках выведите команды в том же формате, что и во входных данных. Примечание Вы можете прочитать про битовые операции в https://ru.wikipedia.org/wiki/Битовые операции. Второй пример: Пусть программа приняла на вход число x. Тогда результатом Петиной программы будет ((x&1)&3)&5 = x&(1&3&5) = x&1. Таким образом, результаты программ всегда совпадают.
| |
|
|
D. Разведение магических существ
битмаски
*2900
Никита и Саша играют в компьютерную игру, в которой нужно разводить магических существ. Изначально у них есть k существ, занумерованных числами от 1 до k. У существ есть n различных характеристик. У Саши есть заклинание, позволяющее по двум существам создать новое. Каждая его характеристика будет равна максимуму из соответствующих характеристик использованных существ. У Никиты есть похожее заклинание, но в этом случае каждая характеристика нового существа равна минимуму из соответствующих характеристик использованных существ. Новое существо получает минимальный свободный номер. При этом существа можно использовать в заклинаниях несколько раз. Они применяют свои заклинания и интересуются некоторыми характеристиками своих новых существ. Помогите им узнать эти характеристики. Выходные данные На каждый запрос с ti = 3 выведите соответствующую характеристику. Примечание В первом примере Саша создаёт существо под номером 3 с характеристиками (2, 2). Никита создаёт существо под номером 4 и с характеристиками (1, 1). После этого они узнают первую характеристику у существа 3 и вторую характеристику у существа 4.
| |
|
|
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}.
| |
|
|
G. Xor-MST
битмаски
Конструктив
Структуры данных
*2300
Дан полный неориентированный граф из n вершин. Каждой вершине присвоено некоторое число ai. Вес ребра, соединяющего вершины i и j, равен ai xor aj. Найдите вес минимального остовного дерева в этом графе. Выходные данные Выведите одно число — вес минимального остовного дерева в заданном графе.
| |
|
|
C. Квадратные подмножества
битмаски
дп
Комбинаторика
математика
*2000
Как и Вася, Петя опоздал на пару. Преподаватель также дал ему дополнительное задание. Для некоторого массива a необходимо вычислить количество различных способов выбрать некоторое непустое подмножество его элементов так, чтобы их произведение было равно квадрату некоторого натурального числа. Два способа считаются различными если различаются множества индексов элементов, выбранных в первом и во втором способах. Так как ответ может быть очень большим, необходимо вычислить лишь остаток от деления ответа на 109 + 7. Выходные данные Выведите одно целое число — остаток от деления искомого количества способов на 109 + 7. Примечание В первом тесте произведение чисел выбираемых любым возможным способом равно 1. Так как 1 = 12, ответ равен 24 - 1 = 15. Во втором тесте можно получить произведение равное 16 одним способом и произведение равное 4 шестью способами. Поэтому ответ равен 6 + 1 = 7.
| |
|
|
D. Необычные последовательности
битмаски
дп
Комбинаторика
математика
теория чисел
*2000
Найдите количество различных последовательностей из строго положительных целых чисел a1, a2, ..., an (1 ≤ ai) таких, что gcd(a1, a2, ..., an) = x и . Так как ответ может быть большим, выведите остаток от его деления на 109 + 7. gcd здесь обозначает наибольший общий делитель. Выходные данные Выведите количество искомых последовательностей по модулю 109 + 7. Примечание В первом примере подходят последовательности: (3, 3, 3), (3, 6), (6, 3). Во втором примере не подходит ни одна последовательность.
| |
|
|
F. Замена подматриц
битмаски
дп
*2200
Вам дана матрица f, состоящая из 4 строк и n столбцов. Любой элемент матрицы — либо звездочка (*), либо точка (.). Над матрицей можно произвольное число раз производить следующую операцию: выбрать квадратную подматрицу f размера k × k (где 1 ≤ k ≤ 4) и заменить каждый элемент в выбранной подматрице на точку. Выбор подматрицы размера k × k стоит ak монет. Какое минимальное количество монет необходимо потратить, чтобы заменить все звездочки на точки? Выходные данные Выведите одно целое число — минимальное количество монет, требующихся для замены всех звездочек на точки. Примечание В первом примере можно потратить 8 монет для замены подматрицы 3 × 3 в верхнем левом углу и 1 монету для замены подматрицы 1 × 1 в нижнем правом углу. Во втором примере лучшим вариантом будет заменить подматрицу 4 × 4 из столбцов 2 – 5 и подматрицу 2 × 2 из строк 2 – 3 и столбцов 6 – 7. В третьем примере можно выбрать подматрицу 3 × 3 в верхнем левом углу и подматрицу 3 × 3 из строк 2 – 4 и столбцов 2 – 4.
| |
|
|
E. Новый год и перечисление подходящих
битмаски
дп
Комбинаторика
математика
*2500
Вам дано целое число m. Пусть M = 2m - 1. Вам дано множество из n целых чисел, обозначим его за T. Эти целые числа будут даны в двоичной системе счисления как n бинарных строк длины m. Множество целых чисел S называется «хорошим», если следующие условия выполняются. - Если
, то . - Если
, то -
- Все элементы S меньше либо равны M.
Здесь и обозначают побитовые операции исключающее ИЛИ и И, соответственно. Вычислите количество хороших множеств S по модулю 109 + 7. Выходные данные Выведите одно число: количество хороших множеств по модулю 109 + 7. Примечание Пример хорошего множества S: {00000, 00101, 00010, 00111, 11000, 11010, 11101, 11111}.
| |
|
|
B. Новогодняя ночь
битмаски
Конструктив
теория чисел
*1300
Поскольку Гриша весь год вел себя хорошо, в новогоднюю ночь его посетил Дед Мороз с мешком подарков! В мешке Деда Мороза содержатся n сладких конфет из той самой кондитерской, по одной конфете каждой возможной вкусности от 1 до n. Счастье Гриши напрямую зависит от того, какие именно конфеты он возьмет. Несмотря на то, что разумно предположить, что брать нужно наиболее вкусные конфеты, новогодняя магия переворачивает все с ног на голову: оказывается, важна не просто сумма вкусностей конфет, а их XOR-сумма! XOR-сумма последовательности целых чисел a1, a2, ..., am считается как побитовый XOR всех элементов последовательности: , здесь обозначает операцию побитового XOR; подробнее про побитовый XOR (операцию, также известную как побитовое исключающее ИЛИ) можно прочитать здесь. Дед Мороз заранее предупредил Гришу, что ему требуется посетить еще несколько мест, а потому Гриша волен выбрать не более k конфет из мешка Деда Мороза. Помогите Грише узнать, чему равна максимальная XOR-сумма, а вместе с ней и максимальное счастье, которое он может обрести при оптимальном выборе конфет. Выходные данные Выведите одно число — максимальную возможную XOR-сумму. Примечание В первом примере можно взять конфеты со вкусностями 1, 2 и 4. Их XOR-сумма равняется 7. Во втором примере можно взять все шесть конфет и получить XOR-сумму 7.
| |
|
|
C. Лимонад для вечеринки
битмаски
дп
жадные алгоритмы
*1600
Какая же новогодняя вечеринка обходится без лимонада! Вы, как обычно, ожидаете много гостей, и покупка лимонада уже стала приятной необходимостью. Ваш любимый магазин продает лимонад в бутылках n различных объемов по разным ценам. Бутылка типа i имеет объем 2i - 1 литров и стоит ci рублей. Количество бутылок каждого типа в магазине можно считать бесконечным. Вы хотите купить не менее L литров лимонада. Во сколько рублей вам это обойдется? Выходные данные Выведите единственное число — минимальное количество рублей, которое придется потратить, чтобы купить не менее L литров лимонада. Примечание В первом примере вам следует купить бутылку объемом 8 литров за 90 рублей и две бутылки объемом 2 литра за 30 рублей каждую. В сумме вы получите 12 литров лимонада всего за 150 рублей. Во втором примере, хоть вам и нужно всего 3 литра, дешевле всего купить одну восьмилитровую бутылку по акции за 10 рублей. В третьем примере выгоднее всего купить три литровые бутылки по 10 рублей каждая, получив требуемые три литра за 30 рублей.
| |
|
|
E. Логическое выражение
битмаски
дп
кратчайшие пути
*2400
Вам дана булева функция от трех переменных, заданная своей таблицей истинности. Требуется построить минимальное по длине выражение, равное этой функции. Выражение может содержать: - Операцию И ('&', ASCII код 38)
- Операцию ИЛИ ('|', ASCII код 124)
- Операцию НЕ ('!', ASCII код 33)
- Переменные x, y и z (ASCII коды 120-122)
- Круглые скобки ('(', ASCII код 40, и ')', ASCII код 41)
Если выражений несколько, требуется найти лексикографически минимальное. Операции имеют стандартный приоритет: самый большой приоритет у НЕ, затем идет И, а самый маленький приоритет у ИЛИ. Формально, выражение должно удовлетворять следующей грамматике: E ::= E '|' T | T T ::= T '&' F | F F ::= '!' F | '(' E ')' | 'x' | 'y' | 'z' Выходные данные Выведите n строк, в i-й должно содержаться выражение минимальной длины, равное i-й функции. Если выражений минимальной длины несколько, нужно вывести лексикографически минимальное. Выражения должны удовлетворять грамматике из условия и не должны содержать пробельных символов. Примечание Таблица истинности для второй функции: 
| |
|
|
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
| |
|
|
F. Подстроки в строке
битмаски
Перебор
Строки
строковые суфф. структуры
Структуры данных
*3000
Дана строка s, обработайте q запросов, каждый из которых имеет один из следующий типов: - 1 i c — Изменить i-й символ в строке на c.
- 2 l r y — Рассмотрим подстроку строки s, начинающуюся с символа с номером l и заканчивающуюся на символ с номером r. Выведите количество раз, которые y входит в неё как подстрока.
Выходные данные Для каждого запроса типа 2 выведите ответ в отдельной строке. Примечание В первом тестовом примере изначально строка aba встречается 3 раза как подстрока на подотрезке [1, 7]. После запроса первого типа строка становится равной ababcbaba и строка aba встречается только один раз как подстрока на отрезке [1, 7].
| |
|
|
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.
| |
|
|
B. Джейми и двоичная последовательность (изменена после раунда)
битмаски
жадные алгоритмы
математика
*2000
Джейми готовит раунд на Codeforces. Он придумал задачу, но не знает, как её решить. Помогите ему решить следующую задачу: Найдите k целых чисел таких, что суммы степеней двойки с такими показателями равны n и наибольшее число среди них минимально. Так как ответ может быть не единственен, найдите лексикографически максимальный ответ. Более формально, рассмотрим все последовательности целых чисел длины k (a1, a2, ..., ak) такие, что . Для каждой последовательности вычислим . Среди всех последовательностей с минимальным y выведите лексикографически наибольшую. Определения степеней двойки и лексикографического порядка смотрите в примечаниях. Выходные данные Выведите «No» (без кавычек), если требуемой последовательности не существует. Иначе выведите в первой строке «Yes» (без кавычек), а во второй строке k чисел через пробел — элементы последовательности. Гарантируется, что числа в ответе принадлежат отрезку [ - 1018, 1018]. Примечание В первом тестовом примере: 23 + 23 + 22 + 21 + 20 = 8 + 8 + 4 + 2 + 1 = 23 Последовательности (3, 3, 2, 0, 1) и (0, 1, 2, 3, 3) не являются правильным ответом, так как правильный ответ лексикографически больше, чем каждая из них. Последовательность (4, 1, 1, 1, 0) не является правильным ответом, так как в правильном ответе значение y меньше. Во втором тестовом примере можно показать, что требуемой последовательности не существует. В третьем тестовом примере . По определению: Если x > 0, то 2x = 2·2·2·...·2 (x раз). Если x = 0, то 2x = 1. Если x < 0, то . Лекксикографический порядок: Для двух последовательностей одинаковой длины (a1, a2, ... , ak) и (b1, b2, ... , bk) первая последовательность лексикографически меньше второй тогда и только тогда когда, ai < bi, для первого i такого, что ai и bi различаются.
| |
|
|
G. Список чисел
Бинарный поиск
битмаски
Комбинаторика
математика
Перебор
теория чисел
*2200
Обозначим за L(x, p) бесконечную последовательность таких целых чисел y, что gcd(p, y) = 1 и y > x (где gcd — наибольший общий делитель двух чисел), расположенных в порядке возрастания. Элементы L(x, p) пронумерованы, начиная с 1; например, 9, 13 и 15 — соответственно первый, второй и третий элементы L(7, 22). Напишите программу, обрабатывающую t запросов. Каждый запрос задаётся тремя целыми числами x, p и k, а ответ на запрос — k-й элемент последовательности L(x, p). Выходные данные Выведите t чисел, где i-е число — ответ на i-й запрос.
| |
|
|
F. Удаляем подстроки
битмаски
дп
жадные алгоритмы
*2700
Дана строка s, изначально состоящая из n строчных латинских букв. Над ней производятся k операций, где . В i-ю операцию необходимо удалить некоторую подстроку длиной ровно 2i - 1 из s. Выведите лексикографически минимальную строку, которую возможно получить после выполнения k операций. Выходные данные Выведите лексикографически минимальную строку, которую можно получить после выполнения k операций.
| |
|
|
G. Кратчайшие пути
битмаски
графы
снм
Структуры данных
*2900
Задан неориентированный граф со взвешенными ребрами. Длина пути между двумя вершинами — побитовое исключающее ИЛИ весов его ребер (если некоторое ребро посещается несколько раз, то в результат включается то же количество раз). Есть три вида запросов, которые необходимо обрабатывать: - 1 x y d — добавить ребро, соединяющее вершины x и y с весом d. Гарантируется, что до запроса не было ребра, соединяющего x и y;
- 2 x y — удалить ребро, соединяющее вершины x и y. Гарантируется, что в графе есть такое ребро и что граф останется связным после запроса;
- 3 x y — найти длину кратчайшего пути (не обязательно простого) от вершины x в вершину y.
Выведите ответы на все запросы типа 3. Выходные данные Выведите ответы на все запросы типа 3 в том порядке, в котором они были заданы.
| |
|
|
E. Махмуд, Эхаб, исключащее ИЛИ и минимальное остовное дерево
битмаски
графы
дп
математика
реализация
*1900
Выходные данные В единственной строке содержится одно целое число x — вес минимального остовного дерева данного графа. Примечание В первом примере: Вес минимального остовного дерева равен 1+2+1=4.
| |
|
|
F. Махмуд, Эхаб и ещё одна задача про исключающее ИЛИ
битмаски
дп
математика
матрицы
*2400
У Эхаба есть массив a из n целых чисел. Он любит операцию побитового исключающего ИЛИ, а ещё он любит надоедать Махмуду, поэтому он придумал для него задачу. Он дал Махмуду q запросов. В каждом из них он дал Махмуду два целых числа l и x и попросил его найти число подпоследовательностей первых l элементов массива таких, что побитовое исключающее ИЛИ всех этих чисел будет равно x. Можете ли вы помочь Махмуду ответить на запросы? Подпоследовательность может содержать не соседние элементы. Выходные данные Для каждого запроса, выведите ответ по модулю 109 + 7 в новой строке. Примечание Побитовое исключающее ИЛИ всех чисел пустого множества равно 0, а побитовое исключающее ИЛИ всех чисел множества из одного элемента равно этому элементу.
| |
|
|
B. Счастливые числа (упрощенная версия)
Бинарный поиск
битмаски
Перебор
*1300
Петя любит счастливые числа. Всем известно, что счастливыми являются натуральные числа, в десятичной записи которых содержатся только счастливые цифры 4 и 7. Например, числа 47, 744, 4 являются счастливыми, а 5, 17, 467 — не являются. Очень счастливыми называются счастливые числа, в которых содержится одинаковое количество цифр 4 и 7. Например, числа 47, 7744, 474477 являются очень счастливыми числами, а 4, 744, 467 — не являются. Однажды Пете встретилось натуральное число n. Найдите наименьшее очень счастливое число, которое не меньше n. Выходные данные В единственной строке выведите наименьшее очень счастливое число, которое больше или равно n. Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.
| |
|
|
C. Подсчет подпоследовательностей
битмаски
жадные алгоритмы
Конструктив
реализация
*1700
У Пикачу есть массив. Он выписал все непустые подпоследовательности своего массива на бумажный лист. Обратите внимание, что у массива длины n есть 2n - 1 непустых подпоследовательностей. Пикачу всегда был озорным, поэтому он удалил все подпоследовательности, в которых Максимальный_элемент_подпоследовательности - Минимальный_элемент_подпоследовательности ≥ d В итоге, у Пикачу осталось X подпоследовательностей. Но Пикачу случайно потерял свой массив и сейчас у Пикачу из-за этого серьезные проблемы. Он до сих пор помнит числа X и d и хочет построить любой массив, который удовлетворяет описанным условиям. Все числа в его новом массиве должны быть целыми, положительными и должны быть меньше, чем 1018. Обратите внимание, что количество элементов в выведенном массиве не должно превышать 104. Если невозможно построить ни одного такого массива, выведите - 1. Выходные данные Выведите две строки. В первой строке должно содержаться целое число n (1 ≤ n ≤ 10 000)— количество элементов в новом массиве Пикачу. Во второй строке должно содержаться n целых чисел через пробел — a1, a2, ... , an (1 ≤ ai < 1018). Если ответа не существует, выведите одно число -1. Если существуют несколько ответов, выведите любой. Примечание В первом тестовом примере, подпоследовательности, оставшиеся при удалении всех подпоследовательностей, в которых Максимальный_элемент_подпоследовательности - Минимальный_элемент_подпоследовательности ≥ 5 это [5], [5, 7], [5, 6], [5, 7, 6], [50], [7], [7, 6], [15], [6], [100]. Этих подпоследовательностей ровно 10. Таким образом, массив [5, 50, 7, 15, 6, 100] подходит. Похожим образом, во втором тестовом примере, подпоследовательности, оставшиеся при удалении всех подпоследовательностей, в которых Максимальный_элемент_подпоследовательности - Минимальный_элемент_подпоследовательности ≥ 2 это [10], [100], [1000], [10000]. Этих подпоследовательностей ровно 4. Таким образом, массив [10, 100, 1000, 10000] подходит.
| |
|
|
C. Шахматная доска
битмаски
Перебор
реализация
*1400
Однажды Магнус решил разыграть одну классическую шахматную партию. Но открыв чулан, Магнус пришел в ужас! Его любимая доска была разломлена на 4 части, каждая размера n на n, причем n обязательно нечетно. Хуже того, некоторые клетки имели неправильный цвет. j-я клетка i-й строки k-й части доски имеет цвет ak, i, j; 1 соответствует черному цвету, а 0 — белому. Магнусу стало интересно, какое минимальное количество клеток нужно перекрасить, чтобы из частей доски можно было составить правильную доску. В правильной доске любая пара соседних по стороне клеток должна иметь различный цвет, и размер правильной доски должен быть 2n на 2n. Части доски разрешено переставлять, но нельзя поворачивать или переворачивать. Выходные данные Выведите одно число — минимальное количество клеток, которые необходимо перекрасить, чтобы из них можно было составить правильную доску.
| |
|
|
D. Робот в подвале
битмаски
Перебор
реализация
*2700
Профессор опять потерял своего домашнего робота. После некоторых раздумий профессор понял, что робота он оставил в подвале. Подвал в доме профессора представляет собой прямоугольник n × m, разбитый на квадратные клетки 1 × 1. Некоторые клетки — стены, которые непроходимы, остальные клетки проходимы. Из любой проходимой клетки можно попасть в любую другую проходимую клетку, двигаясь через смежные по ребрам проходимые клетки. Одна из проходимых клеток является выходом из подвала. Робот находится ровно в одной из проходимых клеток, в том числе, он может находиться в клетке выхода. Профессору страшно идти ночью в темный подвал искать робота. Но у него есть план подвала, а также пульт дистанционного управления роботом. Профессор с помощью пульта может посылать сигналы роботу, чтобы он сдвигался на одну клетку влево, вправо, вверх или вниз. Получив сигнал, робот сдвигается в нужном направлении, если соседняя с ним клетка в данном направлении проходима. Иначе робот стоит на месте. Профессор выписал на листочек последовательность из k команд, которая, по его мнению, приведет робота к выходу из подвала, где бы он ни находился изначально. Он запрограммировал другого робота, чтобы тот нажимал на пульте нужные кнопки в соответствии с записью на листочке. Профессор уже было хотел запустить программу на выполнение и пойти спать, но тут его осенило. На выполнение каждой команды тратится электроэнергия, а профессор не хочет получить в конце месяца большой счет за электричество. Поэтому он хочет найти наименьший префикс в выписанной им последовательности, который гарантированно приведет робота к выходу после его выполнения. Именно с этой просьбой профессор тревожит вас в столь поздний час. Выходные данные В выходной файл выведите длину наименьшего префикса, который гарантированно приводит робота к клетке выхода. Другими словами, робот должен оказаться в клетке выхода после выполнения всех команд из префикса (в процессе выполнения команд робот мог приходить в клетку выхода, а затем уходить из нее, но нас интересует положение робота только в самом конце), где бы он ни находился в подвале изначально. Если профессор ошибся и никакой префикс (включая всю последовательность) не приводит робота к выходу, выведите «-1» (без кавычек). Если единственная проходимая клетка поля — выход, то выведите «0» (без кавычек).
| |
|
|
D. Куро, НОД, побитовое исключающее ИЛИ, сумма и все-все-все
Бинарный поиск
битмаски
Деревья
дп
жадные алгоритмы
математика
Перебор
снм
Строки
Структуры данных
теория чисел
*2200
Куро играет в обучающую игру про числа. Основные математические операции в этой игре — наибольший общий делитель, побитовое исключающее ИЛИ и сумма двух чисел. Куро так любит эту игру, что проходит уровень за уровнем изо дня в день. К сожалению, Куро уезжает в отпуск и будет неспособна продолжить череду решений. Поскольку Кэти — надёжный человек, Куро попросил её прийти к нему домой в этот день и поиграть за него. Изначально дан пустой массив \(a\). Игр состоит из \(q\) запросов двух разных типов. Запросы первого типа просят Кэти добавить число \(u_i\) в массив \(a\). Запросы второго типа просят Кэти найти такое число \(v\), принадлежащее массиву \(a\), что \(k_i \mid GCD(x_i, v)\), \(x_i + v \leq s_i\), и \(x_i \oplus v\) максимально, где \(\oplus\) обозначает операцию побитового исключающего ИЛИ, \(GCD(c, d)\) обозначает наибольший общий делитель целых чисел \(c\) и \(d\), а \(y \mid x\) означает, что \(x\) делится на \(y\), или же вывести -1, если таких чисел в массиве нет. Поскольку вы программист, Кэти просит вас написать программу, которая будет автоматически и точно выполнять внутриигровые запросы, чтобы выполнить поручения Куро. Давайте поможем ей! Выходные данные Для каждого запроса типа \(2\) выведите запрашиваемое число \(v\) или -1, если таких чисел не найдено, в отдельной строке. Примечание В первом примере необходимо выполнить пять запросов: - Первый запрос просит вас добавить \(1\) в \(a\). Теперь \(a\) — \(\left\{1\right\}\).
- Второй запрос просит вас добавить \(2\) в \(a\). Теперь \(a\) — \(\left\{1, 2\right\}\).
- Третий запрос просит вас найти ответ с \(x = 1\), \(k = 1\) и \(s = 3\). И \(1\), и \(2\) удовлетворяют условиям на \(v\), так как \(1 \mid GCD(1, v)\) и \(1 + v \leq 3\). Поскольку \(2 \oplus 1 = 3 > 1 \oplus 1 = 0\), ответом на этот запрос будет \(2\).
- Четвёртый запрос просит вас найти ответ с \(x = 1\), \(k = 1\) и \(s = 2\). Только \(v = 1\) удовлетворяет условия \(1 \mid GCD(1, v)\) и \(1 + v \leq 2\), поэтому ответом на этот запрос будет \(1\).
- Пятый запрос просит вас найти ответ с \(x = 1\), \(k = 1\) и \(s = 1\). В \(a\) нет удовлетворяющих условиям элементов, поэтому мы выводим -1 как ответ на этот запрос.
| |
|
|
D. Книжные полки
битмаски
дп
жадные алгоритмы
*1900
Мистер Кекс — типичный офисный работник в Байтландии. У него в офисе стоит одна большая книжная полка, на каждой книге на ней написана стоимость — целое положительное число. Он оценивает стоимость полки как сумму стоимостей книг на ней. Но случилось прекрасное, мистера Кекса повысили! И ему предстоит переезд в новый офис. Он узнал, что в его новом офисе будет не одна книжная полка, а \(k\) полок, и решил, что будет оценивать красоту \(k\) полок как побитовое И стоимостей всех полок. Также он решил, что не будет тратить время на перестановку книг, поэтому на первую полку он поместит сколько-то первых книг, на вторую сколько-то следующих, и так далее. Конечно, на каждую полку он поместит хотя бы одну книгу. Таким образом, он хочет расставить имеющиеся у него книги по \(k\) полкам так, чтобы красота этих полок была максимальна. Вычислите для него эту максимально возможную красоту. Выходные данные Выведите максимально возможную красоту \(k\) полок в новом офисе мистера Кекса. Примечание В первом тестовом примере можно воспользоваться следующим разбиением книг на полки: \(\)(9 + 14 + 28 + 1 + 7) \& (13 + 15) \& (29 + 2) \& (31) = 24.\(\) Во втором тестовом примере можно воспользоваться следующим разбиением книг на полки: \(\)(3 + 14 + 15 + 92) \& (65) \& (35 + 89) = 64.\(\)
| |
|
|
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)\).
| |
|
|
C. AND Graph
битмаски
графы
поиск в глубину и подобное
снм
*2500
Дано множество размера \(m\), состоящее из целых неотрицательных чисел от \(0\) до \(2^{n}-1\) включительно. Построим на этих числах неориентированный граф следующим образом: соединим \(x\) и \(y\), если и только если \(x \& y = 0\). Здесь \(\&\) — операция побитового И. Посчитайте количество компонент связности в таком графе. Выходные данные Выведите одно целое число — количество компонент связности. Примечание Граф из первого примера: 
Граф из второго примера: 
| |
|
|
B. Открытый протокол
битмаски
Перебор
*1900
Двум участникам предоставили по паре чисел от 1 до 9, так что ровно одно число встречается в обеих парах. Они хотят определить, какое число в их парах совпадает, используя канал связи, к которому у вас есть доступ, так, чтобы вы не могли определить это число. Оба участника передали друг другу множество пар чисел, которое включает пару, данную им. Каждая пара состоит из двух различных чисел. Определите, можете ли вы однозначно определить число, которое совпадает у двух участников, или верно ли, что оба участника могут определить это число, а вы — нет. Выходные данные Если вы можете однозначно определить число, которое совпадает, выведите это число. Иначе, если вы можете однозначно утверждать, что оба участника знают это число, а вы — нет, выведите \(0\). Иначе выведите \(-1\). Примечание В первом примере первый участник передал пары \((1,2)\) и \((3,4)\), а второй – \((1,5)\), \((3,4)\). Поскольку вы знаете, что реальные пары имеют ровно одно общее число, не может быть, чтобы оба участника видели \((3,4)\). Значит, числа у первого участника — \((1,2)\), а у второго — \((1,5)\), и вы однозначно знаете, что общее число — \(1\). Во втором примере либо у первого участника пара \((1,2)\), а у второго пара \((1,5)\), либо у первого пара \((3,4)\), а у второго пара \((6,4)\). В первом случае они оба знают что общее число — \(1\), а во втором они оба знают, что общее число — \(4\). У вас нет достаточной информации, чтобы отличить \(1\) от \(4\). В третьем примере у первого участника пара \((1,2)\), и он не может определить число, так как с его точки зрения у второго участника может быть либо \((1,3)\), и тогда общее число — \(1\), либо \((2,3)\), и тогда общее число — \(2\). Несмотря на то, что второй участник однозначно знает общее число, ни вы, ни первый участник не знаете его, следовательно правильный вывод для теста — \(-1\).
| |
|
|
C. Аккуратное маневрирование
битмаски
геометрия
Перебор
*2100
Два небольших космических корабля окружены двумя группами вражеских больших космических кораблей. Все происходит на плоскости, и одна группа вражеских кораблей расположена так, что все \(y\)-координаты их кораблей целочисленные, а \(x\)-координаты равны \(-100\), в то время как у второй группы вражеских кораблей тоже \(y\)-координаты целочисленны, но их \(x\)-координаты равны \(100\). Каждый корабль в обеих группах одновременно сделает два выстрела из лазера (такой выстрел – это бесконечный луч, который уничтожает любой корабль на своем пути): по одному точно в направлении каждого маленького космического корабля. Все выстрелы будут сделаны одновременно. Маленькие космические корабли смогут легко увернуться от этих выстрелов, и сейчас хотят расположить себя в каких-то позициях с \(x=0\) (и не обязательно целыми \(y\)), чтобы эти лучи уничтожили как можно больше вражеских кораблей. Найдите максимальное количество вражеских кораблей, которые можно так уничтожить, считая, что вражеские корабли не смогут увернуться. Выходные данные Выведите одно число — максимальное количество вражеских кораблей, которое можно уничтожить. Примечание В первом примере один корабль может расположиться в \((0, 2)\), а второй – в \((0, 7)\). Так все корабли в первой группе и \(6\) из \(9\) кораблей во второй группе будут уничтожены. Во втором примере один корабль может расположиться в \((0, 3)\), а второй – в любом месте, этого будет достаточно, чтобы уничтожить все вражеские корабли.
| |
|
|
Расчет асимптотики - 6
битмаски
Для приведенного ниже кода, найдите асимптотику:
for (int m=0; m<(1<<n); ++m)
for (int s=m; s; s=(s-1)&m)
... использование s и m ...
1) O(4^n) 2) O(log2(10)^n) 3) O(3^n) 4) O(2^n)
| |
|
|
C1. Уникальные подстроки - 1
Перебор с отсечением
битмаски
Вася программирует так интенсивно, что от его ударов по клавиатуре некоторые клавиши с буквами вывалились и не вставляются обратно — такие клавиши он складывал в особый ящик. Клавиатур Вася сломал немало, поэтому некоторые выпавшие клавиши могут встречаться в нескольких экземплярах.
Проводя весеннюю уборку, Вася наткнулся на ящик с клавишами и подсчитал, сколько раз встречается каждая клавиша. Теперь он хочет составить из этих клавиш одну строку и украсить ей интерьер своего кабинета. Вася считает, что чем больше различных подстрок длины k (последовательностей подряд идущих символов длины k) есть в этой строке, тем сильнее эта строка украсит интерьер. Помогите Васе с украшением.
Формат ввода
В первой строке задается количество наборов входных данных T. В этой задаче T всегда равно 1.
В первой строке каждого описания набора дано два целых числа m и k ( 1≤m≤3, 1≤k≤13 ) — число различных типов клавиш и требуемая длина различных подстрок.
В следующих m строках описываются клавиши. Каждое описание состоит из маленькой английской буквы Ci, написанной на клавише, и числа Ti — количества таких клавиш. Гарантируется, что суммарное количество клавиш не превосходит 16.
Формат вывода
Для каждого набора выведите строку, составленную из клавиш. Чем больше в ней различных подстрок длины k — тем выше будет балл.
| |
|
|
It's Mooin' Time II
битмаски
Фермер Джон старается описать свой любимый USACO-контест Эльзе, но она не понимает
почему ФД его так любит. ФД отвечает, моя любимая часть контеста - это когда
Беси говорит сейчас время мычать и мычит весь контест.
Эльза всё равно не поняла, поэтому ФД выгрузил контест как текстовый файл
и старается объяснить, что он значит. Контест определяется как массив из
\(N\) (\(1\le N\le 10^6\)) целых чисел \(a_1, a_2, \dots, a_N\) (\(1\le a_i\le N\)).
ФД определяет "МУУ" как массив из трёх целых чисел, из которых второе равно третьему, но не равно первому. Говорят, что МУУ случился во время контеста, если возможно удалить целые числа из массива так, что останется только МУУ.
Поскольку якобы Беси "мычала весь контест", помогите Эльзе посчитать количество
различных МУУ, которые случились во время контеста. Два МУУ считаются различными, если они не состоят из одних и тех же чисел, идущих в одном и то же порядке.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(N\).
Вторая строка содержит \(N\) разделённых одиночными пробелами целых чисел \(a_1,a_2,\dots,a_N\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Выведите количество различных МУУ, происшедших во время контеста.
**Заметим, что большие размеры целых чисел могут потребовать
использование 64-битных целых типов данных (как long long в С/С++).**
| |
|
|
It's Mooin' Time II
битмаски
Фермер Джон старается описать свой любимый USACO-контест Эльзе, но она не понимает
почему ФД его так любит. ФД отвечает, моя любимая часть контеста - это когда
Беси говорит сейчас время мычать и мычит весь контест.
Эльза всё равно не поняла, поэтому ФД выгрузил контест как текстовый файл
и старается объяснить, что он значит. Контест определяется как массив из
\(N\) (\(1\le N\le 10^6\)) целых чисел \(a_1, a_2, \dots, a_N\) (\(1\le a_i\le N\)).
ФД определяет "МУУ" как массив из трёх целых чисел, из которых второе равно третьему, но не равно первому. Говорят, что МУУ случился во время контеста, если возможно удалить целые числа из массива так, что останется только МУУ.
Поскольку якобы Беси "мычала весь контест", помогите Эльзе посчитать количество
различных МУУ, которые случились во время контеста. Два МУУ считаются различными, если они не состоят из одних и тех же чисел, идущих в одном и то же порядке.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(N\).
Вторая строка содержит \(N\) разделённых одиночными пробелами целых чисел \(a_1,a_2,\dots,a_N\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Выведите количество различных МУУ, происшедших во время контеста.
**Заметим, что большие размеры целых чисел могут потребовать
использование 64-битных целых типов данных (как long long в С/С++).**
| |
|
|
Friendship Editing
Динамика по подмножествам
битмаски
графы
У Фермера Джона есть \(N\) коров, помеченных числами от \(1\) до \(N\) (\(2\le N\le 16\)).
Отношение дружбы между этими коровами может быть смоделировано ненаправленным графом
с \(M\) (\(0\le M\le N(N-1)/2\)) ребрами. Две коровы являются друзьями, если и только если
между ними есть ребро в этом графе.
За одну операцию Вы можете добавить или удалить одно ребро в этом графе.
Посчитайте минимальное количество операций, которое требуется выполнить,
чтобы обеспечить следующее свойство в этом графе:
Если коровы \(a\) и \(b\) - друзья, тогда для любой другой коровы \(c\)
по крайней мере одна из коров \(a\) и \(b\) является другом коровы \(c\).
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(N\) и \(M\).
Каждая из следующих \(M\) строк содержит пару чисел \(a\) и \(b\) (\(1\le a<b\le N\)).
Никакая пара друзей не повторится.
ФОРМАТ ВЫВОДА (на экран / stdout):
Количество ребер, которые требуется удалить или добавить.
| |
|
|
All Pairs Similarity
битмаски
**Замечание:
Ограничение по памяти для этой задачи 512MB, в два раза больше чем по умолчанию.**
Каждой из \(N\) (\(1\le N\le 5\cdot 10^5\)) коров Фермера Джона назначена ненулевая
битовая строка длиной \(K\) (\(1\le K\le 20\)). Различным коровам может быть
назначена одинаковая битовая строка.
Сходство Жаккара двух битовых строк определяется как количество (?единичных) битов
в их пересечении, делённое на количество (?единичных) битов в их объединении.
Например, сходство Жаккара битовых строк \(\texttt{11001}\) и \(\texttt{11010}\)
равно \(2/4\).
Для каждой коровы выведите сумму сходств Жаккара её с битовыми строками
всех других коров, включая её саму, по модулю \(10^9+7\). Точнее если сумма
равна рациональному числу \(a/b\), где \(a\) и \(b\) целые числа, не имеющие общих
делителей, выведите уникальное целое число \(x\) в интервале \([0,10^9+7)\)
такое, что \(bx-a\) делится на \(10^9+7\).
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(N\) и \(K\).
Каждая из следующих \(N\) строк содержит целое число \(i\in (0,2^K)\),
представляющее корову, ассоциированную с \(K\)-битовым представлением числа \(i\).
ФОРМАТ ВЫВОДА (на экран / stdin):
Выведите сумму по модулю \(10^9+7\) для каждой коровы на отдельной строке.
| |
|
|
Field Day
битмаски
**Примечание. Ограничение по времени для решения этой задачи в Python – 15 секунд. Для других языков ограничение по времени по умолчанию составляет 2 секунды.**
Каждый из \(N\) амбаров фермера Джона (\(2\le N\le 10^5\)) выбрал команду из \(C\)
коров (\(1\le C\le 18\)) для участия в дне поля. Порода каждой коровы
либо Guernsey либо Holstein.
Разница между двумя командами определяется как количество позиций \(i\)
(\(1 \leq i \leq C\)), при котором породы коров на \(i\)-х позициях
отличаются. Для каждой команды \(t\) из \(1 \ldots N\) вычислите максимальную
разницу между командой \(t\) и любой другой командой.
ФОРМАТ ВВОДА (ввод поступает с терминала/стандартного ввода):
Первая строка содержит \(C\) и \(N\).
Каждая из следующих \(N\) строк содержит строку длины \(C\) из G и H. Каждая строка
соответствует команде.
ФОРМАТ ВЫВОДА (вывод на терминал / стандартный вывод):
Для каждой команды выведите максимальную разницу.
| |
|
|
Lights Off
битмаски
**Замечание: Время на тест в этой задаче 4s, в два раза больше обычного.**
Беси хочет пойти спать, ей нужно выключить все лампы. Как это сделать?
У Беси есть две битовые строки длиной \(N\) (\(2\le N\le 20\)), представляющие
последовательность лампочек и переключателей, соответственно. Каждая лампочка
включена(1) или выключена(0). Каждый переключатель активен(1) или неактивен(0).
Один *шаг* состоит из следующей последовательности операций:
- Переключить ровно один переключатель (сделать активным, если он неактивный
или наоборот).
- Для каждого активного переключателя переключить состояние соответствующей
лампочки (выключить, если она была включена или наоборот).
- Циклически сдвинуть переключатели вправо на один. А именно, если
битовая строка соответствующая переключателям была изначально \(s_0s_1\dots s_{N-1}\)
она превратится в строку \(s_{N-1}s_0s_1\dots s_{N-2}\).
Для каждого из \(T\) (\(1\le T\le 2\cdot 10^5\)) примеров описанной выше проблемы
посчитайте минимальное количество ходов выключить все лампочки.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(T\) и \(N\).
Каждая из следующих \(T\) строк содержит пару битовых строк длиной \(N\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Для каждой пары выведите минимальное количество требуемых ходов, чтобы
выключить все лампочки.
| |
|
|
Air Cownditioning II
Перебор
битмаски
реализация
Очень жаркое лето. Фермер Дон решил купить некоторое количество кондиционеров.
У ФД имеется \(N\) коров (\(1 \leq N \leq 20\)), которые живут в амбаре,
содержащем последовательность стойл, пронумерованные \(1 \ldots 100\). Корова \(i\)
занимает диапазон стойл, начиная с \(s_i\) и заканчивая в \(t_i\). Диапазоны стойл,
занимаемые коровами, не пересекаются. У коров различные требования к охлаждению.
Корова \(i\) должна быть охлаждена на количество \(c_i\). Это значает, что для всех стойл,
занимаемых коровой \(i\) температура должна быть уменьшена на \(c_i\) единиц.
Амбар содержит \(M\) кондиционеров, помеченных \(1 \ldots M\) (\(1 \leq M \leq 10\)).
\(i\)-ый кондиционер стоит \(m_i\) единиц денег, если работает и охлаждает воздух
(уменьшает температуру) в стойлах начиная в \(a_i\) и заканчивая в \(b_i\).
Если работает, \(i\)-ый кондиционер уменьшает температуру во всех стойлах этого
диапазона на величину \(p_i\) (\(1 \leq p_i \leq 10^6\)). Диапазоны стойл кондиционеров
могут перекрываться.
Определите минимальное количество денег, которое ФД должен потратить, чтобы
сделать температуру комфортабельной для всех коров во всех стойлах.
Гарантируется, что это возможно сделать.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка ввода содержит \(N\) и \(M\).
Последующие \(N\) строк описывают коров. \(i\)-ая из этих строк содержит \(s_i\),
\(t_i\), \(c_i\).
Последующие \(M\) строк описывают кондиционеры. \(i\)-ая из этих строк содержит
\(a_i\), \(b_i\), \(p_i\), \(m_i\).
Для всех тестов, кроме тех, что в примере, можете полагать, что \(M = 10\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Выведите одно целое число - минимальное количество денег, которое ФД должен потратить
чтобы сделать комфортабельной температуру для всех коров.
| |
|
|
Phone Numbers
дп
битмаски
реализация
Беси купила новый телефон. Кнопки на нём расположены так:
123
456
789
Беси может нажимать одну клавишу, две клавиши одновременно
(имеющие общую сторону, всего 12 комбинаций), 4 клавиши одновременно, которые
формируют квадрат (1245, 2356, 4578, or 5689).
Например, если телефонный номер 123659874, она может сэкономить время
следующим образом:
- Нажать 1 и 2 одновременно.
- Нажать 3.
- Нажать 6, 5, 9, 8 одноврменно.
- Нажать 7 и 4 одновременно.
Однако при нажатии нескольких клавиш одновременно, цифры могут
могут записаться в произвольном порядке. Например, после последнего нажатия
(7 и 4 одновременно) может получиться 123596847 или 213659874
По заданной последовательности цифр, вычислите количество телефонных номеров,
которые она может набрать, по модулю \(10^9+7\).
**Замечание: Время на тест для этой задачи 4s, в два раза больше чем обычно..**
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(T\) ( \(1\le T\le 10\)), количество независимых тестов.
Каждая из последующих \(T\) строк содержит непустую строку цифр от 1 до 9.
Гарантируется, что длина этой строки не превысит \(10^5\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Для каждого теста выведите количество телефонных номеров, которые Беси
может набрать по модулю \(10^9+7\).
| |
|
|
Redistributing Gifts
битмаски
дп
графы
У Фермера Джона есть \(N\) подарков помеченных числами \(1\ldots N\) для его
\(N\) коров, также помеченных числами \(1\ldots N\) (\(1\le N\le 18\))
Каждая корова имеет список предпочтений, который представляет собой
перестановку из всех \(N\) подарков, так что корова предпочитает подарок,
который появился в списке раньше подарку, который появился в списке позже.
ФД по лени просто назначил корове \(i\) подарок \(i\) для всех \(i\).
Теперь коровы собрались и решили переназначить подарки так, чтобы у каждой
коровы либо остался изначальный подарок, либо он был заменён на более
предпочитаемый подарок.
Имеется также дополнительное ограничение: подарок может быть переназначен
корове, если он изначально был назначен корове такого же типа (Holstein или
Guernsey)). Задано \(Q\) (\(1\le Q\le \min(10^5,2^N)\))длин \(N\) строк пород
для каждой из них вычислите количество переназначений, соответствующих ей.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(N\).
Каждая из следующих \(N\) строк содержит список предпочтений одной коровы.
Гарантируется, что каждая строка является перестановкой \(1\dots N\).
Следующая строка содержит \(Q\).
Каждая из последующих \(Q\) строк содержит строку пород, каждая имеет \(N\)
символов длину и состоит только из символов G и H. Никакая из строк пород
не появится более одного раза.
ФОРМАТ ВЫВОДА (на экран / 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
| |
|
|
Cowpatibility
битмаски
Две коровы потенциальные друзья, если они любят мороженое одного вкуса.
\(N\) коров (\(2 \leq N \leq 50,000\)) фермера Джона выписали по 5 любимых сортов
мороженого.
Каждый вкус мороженого отображается положительным целым ID не более чем \(10^6\).
Две коровы совместимы, если их списки содержат как минимум один общий вкус
мороженого.
Определите количество пар коров, которые не совместимы.
ФОРМАТ ВВОДА (файл cowpatibility.in):
Первая строка ввода содержит \(N\). Каждая из последующих \(N\) строк содержит 5
целых чисел (все различные) представляющие любимые вкусы мороженых одной
коровы.
ФОРМАТ ВЫВОДА (файл cowpatibility.out):
Выведите количество пар коров, которые не совместимы.
| |
|
|
Haywire
Перебор
битмаски
дп
N коров (4 <= N <= 12, N четное), построили примитивную систему для проводной коммуникации пар дружественных коров Каждая корова имеет ровно 3 друзей в амбаре и коровы должны занять один ряд в амбаре из N стойл. Провод длины L требуется, чтобы соединить друзей в стойлах на расстоянии L. Например, если друзья находятся в стойлах 4 и 7, то требуется провод длины 3, чтобы их соединить. Каждая пара коров должна быть соединена отдельным проводом. Определите минимальную длину провода, требуемую для организации такой сети наилучшим образом. PROBLEM NAME: haywire Формат входных данных * Строка 1: Цело число N. Коровы пронумерованы 1..N. * Строки 2..1+N: Каждая строка содержит три разделенных пробелом целых числа в диапазоне от 1 до N. Строка i+1 содержит числовые идентификаторы трех друзей коровы i. Если корова i дружит с коровой j, то и корова j дружит с коровой i. Формат выходных данных * Строка 1: Минимальная суммарная длина провода, чтобы соединить все пары дружественных коров. Примечание Лучшее упорядочивание коров есть 6, 5, 1, 4, 2, 3, и оно требует только 17 единиц длины провода.
| |
|
|
Cows in a Skyscraper
Динамика по подмножествам
битмаски
Задача о рюкзаке
Коровы любят соревноваться в беге по лестницам небоскребов. А вниз потом едут на лифте. Лифт имеет максимальную вместимость W (1 <= W <= 100,000,000) фунтов, а корова номер i весит Ci (1 <= Ci <= W) фунтов. Помогите Бесси определить минимальное количество спусков лифта, чтобы переместить вниз все N (1 <= N <= 18) коров. Сумма весов коров в каждом спуске не должна превышать W. PROBLEM NAME: skyscraper Формат входных данных * Строка 1: N W разделенные одним пробелом * Строки 2..1+N: Строка i+1 содержит целое число Ci, вес коровы i. Формат выходных данных * Строка 1: Минимальное целое, R, указывающее количество требуемых спусков. * Строки 2..1+R: Каждая строка описывает множество коров, которые были в лифте во время каждого из R спусков. Каждая строка начинается с количества коров в текущем спуске, а затем номера коров через пробел. Примечание Мы можем поместить в лифт корову 3 и любую из оставшихся коров. Но все другие коровы не помещаются даже по две. В решении представленном выше, в первом спуске участвуют коровы 1 и 3, Во втором - корова 2, в третьем - корова 4. Существует несколько правильных решений для данного ввода.
| |
|
|
Binary Sudoku
битмаски
Problem 2: Binary Sudoku [Brian Dean] Коровы Фермера Джона любят играть в интересный вариант популярной игры «Судоку». Их версия включает решетку 9*9, состоящую из подрешеток 3*3, как и обычная Судоку. Однако коровья версия использует только двоичные цифры: 000 000 000 001 000 100 000 000 000 000 110 000 000 111 000 000 000 000 000 000 000 000 000 000 000 000 000 Цель этой «Двоичной судоку» – переключить кк можно меньше битов, так чтобы в каждой из 9 строк, в каждом из 9 столбцов, в каждой из 9 подрешеток 3*3 выполнялось свойство «even parity» - то есть содержалось четное количество единиц. Для примера выше, достаточно сделать 3 переключения, чтобы получить такое решение: 000 000 000 001 000 100 001 000 100 000 110 000 000 110 000 000 000 000 000 000 000 000 000 000 000 000 000 По заданному начальному состоянию Двоичной Судоку, определите минимальное количество переключений, чтобы решить ее. PROBLEM NAME: bsudoku Формат входных данных * Строки 1..9: Каждая строка представляет собой 9 символов 0 или 1, задающих начальное положение двоичной судоку. Формат выходных данных * Строка 1: Минимальное количество переключений, которые требуется сделать, чтобы стало выполняться свойство «even parity» для всех строк, всех столбцов, и всех подрешеток. Примечание Требуется 3 переключения.
| |
|
|
Escaping the Farm
Перебор
битмаски
Коровы планируют сбежать от Фермера Джона на плоту, через реку. Проблема заключается в том, что плот может не выдержать всех желающих. N коров (1 <= N <= 20) имеют веса w1 ... wN. У коров плохо со сложением, они не умеют выполнять перенос. Вам требуется определить размер наибольшей группы коров, веса которых можно сложить без переноса при сложении. PROBLEM NAME: escape Формат входных данных * Строка 1: Количество коров, N (1 <= N <= 20). * Строки 2..N+1: Каждая строка содержит вес одной коровы, целое число от 1...100,000,000. Формат выходных данных * Строка 1: максимальное количество коров, чьи веса могут быть сложены без переноса. Примечание Три веса 522, 6, 7311, могут быть сложены без переноса. 522 6 + 7311 ------ 7839
| |
|
|
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).
| |
|
|
65998
битмаски
Перебор
Профессор Чадов и аспирант Шлёпов оптимизируют производство октогена. Одним из важных компонентов для создания этой мощной взрывчатки является азотная кислота. Чтобы как можно меньше таскать сосуды с кислотой, лаборанты попросили аспиранта Шлёпова написать программу, которая будет рассчитывать, какие емкости надо принести со склада в лабораторию, чтобы выполнялись несколько условий:
- Объем азотной кислоты должен быть не меньше требуемого для работы;
- Объем азотной кислоты в лаборатории должен быть минимально возможным;
- При прочих равных следует предпочесть переноску меньшего количества емкостей;
Напишите программу, которая поможет лаборантам.
Формат ввода
В первой строке программы вводится натуральное число N (N ≤ 20) – количество емкостей с кислотой. Во второй строке указывается натуральное число V (0 ≤ V ≤ 200 л) – ограничение по объему. Далее в N строчках вводится по одному натуральному числу vi (vi ≤ 20 л) – объем емкости под номером i.
Формат вывода
Вывести в одной строке через пробел в порядке возрастания объемы емкостей, которые надо отнести в лабораторию, уложившись в заданные условия. Если это невозможно, вывести 0.
| |
|
|
Поиск сокровищ
Динамическое программирование: один параметр
битмаски
реализация
Для поиска полезных ископаемых ученые разработали специальный сканер.
Представим область для поисков как таблицу из \(k\) строк и \(n\) столбцов. Нумерация строк идет от \(1\) до \(k\) сверху вниз, нумерация столбцов от \(1\) до \(n\) слева направо. В каждой клетке таблицы могут находиться полезные ископаемые.
Сканер работает следующим образом: он может быть запущен в столбце \(p\) и возвращает количество клеток в зоне сканирования, которые содержат полезные ископаемые. Зона сканирования включает все клетки столбца \(p\), верхние \(k-1\) клетку столбца \(p-1\), верхние \(k-2\) клетки столбца \(p-2\), и так далее. На рисунке показана зона сканирования для поля с \(k = 3\), \(n=5\) и всех значений \(p\).

Вам даны значения, которые вернул сканер для всех \(p\), обозначим за \(b_p\) значение в столбце \(p\). Будем называть таблицу, где для каждой клетки определено, находятся ли в ней полезные ископаемые, корректной, если для нее сканер возвращает верные значения. Например, если в примере выше сканер вернул значения \([2, 1, 2, 3, 2]\), то одна из корректных таблиц может выглядеть следующим образом (клетки, содержащие ископаемые, обозначены черным треугольником):

По заданным значениям, которые вернул сканер, определите количество корректных таблиц и выведите остаток от деления этого количества на число \(10^9+7\). Обратите внимание, что, возможно, сканер неисправен, и корректных таблиц вообще нет, тогда необходимо вывести \(0\).
Формат входных данных
В первой строке даны два числа \(n\), \(k\) — количество столбцов и строк, соответственно (\(1 \le n \le 200\), \(1 \le k \le 7\)).
Во второй строке даны \(n\) чисел \(b_1, b_2, \ldots, b_n\) — значения, которые вернул сканер (\(0 \le b_i \le k^2\)).
Формат выходных данных
Выведите единственное число — остаток от деления количества различных корректных таблиц на \(10^9 + 7\).
| |
|
|
Все на съезд!
Перебор
битмаски
реализация
В 2025 году в Берляндии впервые будет проводиться трёхдневный межпланетный съезд по вопросам проведения олимпиад по информатике. Доклады съезда разбиты на 12 секций, и теперь организаторам необходимо распределить секции по дням: в каждый день будут проводиться 4 секции.
Известно, что в съезде примут участие \(n\) человек. Каждый участник съезда выбрал 3 секции, которые он хочет посетить. Но поскольку в один день секции будут проводиться одновременно, каждый участник в один день может присутствовать не более чем на одной секции. Поэтому если в один день будут идти две или три секции, выбранные каким-то участником, то он всё равно сможет посетить только одну из них. Если же выбранные секции будут проходить в разные дни, участник сможет посетить их все.
Для того чтобы съезд принёс как можно больше пользы, необходимо составить расписание съезда таким образом, чтобы суммарное число секций, посещённых всеми участниками, было как можно больше. Помогите оргкомитету составить такое расписание.
Формат входных данных
Первая строка входных данных содержит целое число \(n\) (\(1 \leq n \leq 10\,000\)) — количество участников съезда.
В каждой из следующих \(n\) строк даны \(3\) попарно различных натуральных числа, не превосходящие \(12\), — номера секций, которые хочет посетить один из участников.
Формат выходных данных
Программа должна вывести \(3\) строки, в каждой из которых должны быть \(4\) числа через пробел — номера секций, проводимых в первый, второй и третий день съезда соответственно. Каждое из чисел от 1 до 12 должно встречаться в выводе ровно один раз. Если возможных оптимальных расписаний несколько, можно вывести любое из них.
Примечание
В примере из условия расписание составлено так, что второй и третий участник посетят все желаемые секции, а первый — две секции (\(5\) и одну из секций \(1\), \(6\)). Таким образом, суммарно будут посещены 8 секций. Можно показать, что этот результат улучшить нельзя.
| |
|
|
Красивые разбиения
meet-in-the-middle
битмаски
Напомним, что простое число — это целое число, которое делится ровно на два целых числа: на единицу и на себя. Последовательность простых чисел начинается с \(2, 3, 5, \ldots\).
Рассмотрим первые \(n\) простых чисел. Давайте разделим их на две части \(A\) и \(B\) так, чтобы каждое простое число принадлежало ровно одной из этих двух частей. Обозначим произведение всех простых чисел в \(A\) как \(a\), а произведение всех простых чисел в \(B\) как \(b\). Произведение чисел в пустом множестве будем считать равным \(1\). Будем называть разбиение красивым, если \(a < b\) и \(b-a\) минимальное возможное.
Дано \(n\), найдите красивое разбиение множества первых \(n\) простых чисел и выведите соответствующее значение \(a\).
Формат входных данных
Входные данные содержит целое число \(n\) на отдельной строке (\(1 \le n \le 30\)).
Формат выходных данных
Выведите значение \(a\) в красивом разбиении множества первых \(n\) простых чисел.
| |
|
|
Прямоугольный забег
битмаски
Задачи на моделирование
Разбор случаев
Жители Зожбурга очень любят спорт и в особенности бег. Бегать обычные марафоны им надоело, поэтому они решили организовать прямоугольный забег в стиле Minecraft. Для этого на центральной площади города оборудовали стадион с прямоугольным газоном и дорожками вокруг него. Жители Зожбурга считают, что главное — не победа, а участие, поэтому цель забега — сделать красивую фотографию, а не пробежать быстрее всех.
Центральная площадь Зожбурга представляет собой прямоугольник, разделенный на одинаковые единичные квадраты. Строки пронумерованы сверху вниз с единицы, столбцы слева направо с единицы. Каждый квадрат площади имеет координаты \(r\) и \(c\) — номер строки и столбца, соответственно.
На площади находится прямоугольный газон со сторонами, параллельными сторонам площади. Координаты левого верхнего углового квадрата газона \((R_L, C_L)\), координаты правого нижнего углового квадрата газона \((R_R, C_R)\). Вокруг газона оборудованы \(n\) дорожек для \(n\) бегунов. Дорожка \(i\) находится на расстоянии \(i\) от границы газона, на дорожке \(i\) находится бегун с номером \(i\). Бегун \(i\) стартует с квадрата с координатами \((r_i, c_i)\). Бегуны стартуют одновременно с одинаковой скоростью: через каждую секунду каждый спорстмен меняет текущий квадрат на своей дорожке на следующий квадрат на своей дорожке в направлении против часовой стрелки.
На прямоугольном газоне в квадрате \((R_p, C_p)\) стоит фотограф, цель которого — сделать красивую фотографию. Фотограф тестирует инновационную камеру с двойным объективом. Эта камера делает снимок одновременно в двух противоположных направлениях. Фотограф считает фотографию красивой, если все бегуны в момент, когда он делает снимок, находятся в одновременно в строке \(R_p\) или в стоблце \(C_p\). При этом благодаря инновационному свойству камеры они могут быть либо в одной строке с ним и справа и слева от него, либо в одном столбце с фотографом и выше и ниже него.
Ваша задача — узнать, через какое минимальное количество секунд \(t\) после старта забега фотограф сможет сделать красивую фотографию, или сказать, что красивая фотография в данных условиях не получится.
Формат входных данных
В первой строке входных данных находится число \(n\) (\(1 \le n \le 18\)) — количество бегунов. В следующей строке ввода даны шесть целых чисел \(R_L\), \(C_L\), \(R_R\), \(C_R\) (\(n + 1 \le R_L \le R_R \le 100 - n\), \(n + 1 \le C_L \le C_R \le 100 - n\)), \(R_p\) (\(R_L \le R_p \le R_R\)), \(C_p\) (\(C_L \le C_p \le C_R\)) — координаты левого верхнего квадрата газона, правого нижнего квадрата газона, координаты фотографа, соответственно. Гарантируется, что \(R_R - R_L + C_R - C_L\) делится на \(4\).
В следующих \(n\) строках даны два числа \(r_i\), \(c_i\) — стартовые координаты бегуна \(i\). Гарантируется, что стартовые координаты бегуна \(i\) находятся на дорожке \(i\), на каждой дорожке находится один бегун, дорожка \(i\) находится на расстоянии \(i\) от границы газона.
Формат выходных данных
Выведите единственное число \(t\) — через какое минимальное количество секунд \(t\) после старта забега фотограф сможет сделать красивую фотографию, или \(-1\), если фотографию сделать не получится.
Рисунок ко второму примеру.

Стартовое положение бегунов.

Положение бегунов через 3 секунды. Все бегуны находятся в строке \(R_p\), и фотограф делает красивое фото.
| |
|
|
Водопровод
Перебор
Обход в ширину
битмаски
Город Восточный постоянно страдает от недостатка воды. Для устранения этой проблемы была построена новая водопроводная труба. Строительство трубы началось с обоих концов одновременно, и спустя некоторое время половины соединились. Ну, почти. Первая половина трубы заканчивалась в точке (x1, y1), а вторая - в точке (x2, y2).
К сожалению, осталось лишь несколько отрезков трубы различной длины. Более того, из-за специфики местной технологии трубы могут быть проложены только в направлении с севера на юг или с востока на запад и соединяются, образуя или прямую, или угол 90 градусов. Требуется, зная длины отрезков труб L1, L2, ..., LK и количество отрезков каждой длины C1, C2, ..., CK, сконструировать трубу, соединяющую две заданные точки, или определить, что это невозможно.
Ограничения: 1 <= K <= 4, 1 <= x1, y1, x2, y2, Li <= 1000, 1 <= Ci <= 10, все числа целые.

Входные данные
В первой строке находятся числа x1, y1, x2, y2, K, затем 2K чисел: L1, L2, ..., LK, C1, C2, ..., CK.
Выходные данные
Вывести одно число - минимальное количество нужных отрезков труб или -1, если соединение невозможно.
| |
|
|
Сломанный индикатор
битмаски
Разбор случаев
У радиолюбителя Алексея есть девятисегментный жидкокристаллический индикатор, который может показывать цифры от \(0\) до \(9\) в виде цифр <<почтового индекса>> (см. рисунок):
После неудачного эксперимента индикатор повредился, и часть сегментов могла перегореть. Когда сегмент перегорает, индикатор теряет возможность показывать цифры, использующие этот сегмент.
Алексей уже выяснил, что индикатор всё ещё способен показать какие-то \(n\) цифр. Однако радиолюбитель не может проверить остальные цифры, равно как и каждый сегмент отдельно. Поэтому он просит вас помочь найти те цифры, которые гарантированно можно показать на этом индикаторе.
Формат входных данных
Первая строка входных данных содержит число \(n\) (\(1 \le n \le 10\)) — количество цифр, которые смог показать на индикаторе Алексей.
Следующие \(n\) строк содержат по одной цифре \(a_i\) (\(0 \le a_i \le 9\)) — сами цифры, которые Алексей смог показать. Гарантируется, что все \(a_i\) различны.
Формат выходных данных
Выведите элементы искомого множества в порядке возрастания, каждую цифру в отдельной строке.
| |
|
|
Объединенная армия
Динамическое программирование
битмаски
Задача на реализацию
Для борьбы с могучими рейнджерами Рита Репульса и Лорд Зедд решили объединить Глиняный и Зедд патрули. Для более эффективного нападения на Энджел Гроув они хотят построить свою армию в две шеренги. Количество солдат в первой шеренге равно количеству солдат во второй.
Рита любит два вопроса:
- «Правда ли, что ровно x из твоих соседей из Зедд патруля?»
- «Правда ли, что ровно y из твоих соседей из Глиняного патруля?»
Соседями в данном построении являются солдаты слева и справа в той же шеренге, а также солдат, который стоит на той же позиции, но в другой шеренге. Рита выбрала либо один из этих вопросов либо оба, и задала каждому солдату. Всем солдатам были заданы вопросы с одними и теми же значениями x и/или y.
Зордан с помощью своей магической силы все это время наблюдал за процессом построения. Он был очень удивлен тем, что ответы всех солдат были положительными. Однако, он помнит, что солдаты из Зедд патруля всегда говорят правду, а солдаты из Глиняного патруля обязательно солгут хотя бы на один вопрос.
Так как солдаты из Зедд патруля наиболее опасны по мнению Зордана, исходя из ответов, он хочет узнать какое наименьшее и наибольшее количество солдат из Зедд патруля могло быть в объединенной армии. Он обратился к вам за помощью!
Входные данные
В единственной строке входного файла содержатся три целых числа k, x, y — количество солдат в одной шеренге и числа из вопросов (1 ≤ k ≤ 105; -1 ≤ x, y ≤ 3).
Если x = -1, это означает, что Рита не задавала первый вопрос.
Если y = -1, это означает, что Рита не задавала второй вопрос.
Гарантируется, что Рита задала хотя бы один вопрос.
Выходные данные
Если для данных k, x и y не существует ни одного способа построения, выведите -1.
Иначе, первая строка выходного файла должна содержать одно число — наименьшее возможное количество солдат из Зедд патруля в армии.
В следующих двух строках должно содержаться по k символов «0» и «1» — описание шеренг:
- «0» означает, что в построении на соответствующей позиции стоит солдат из Глиняного патруля.
- «1» — солдат из Зедд патруля.
Вторая строка описывает первую шеренгу, третья — вторую. Не разделяйте символы пробелами.
Четвертая строка выходного файла должна содержать одно число — наибольшее возможное количество солдат из Зедд патруля в армии.
В пятой и шестой строках выведите описание возможного построения в таком случае в аналогичном формате.
Если существует несколько способов расставить солдат, разрешается вывести любой.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
2 0 -1 |
2
01
10
2
01
10 |
| 2 |
5 1 2 |
0
00000
00000
4
01010
01010 |
| 3 |
1 2 2 |
0
0
0
0
0
0 |
| 4 |
10 0 3 |
5
0100010010
0001000100
8
0101010100
0010101010 |
| |
|
|
Убрать циклы
битмаски
дп
графы
Мальчик Коля любит графы, но не любит циклы. У Коли есть несколько ориентированных не обязательно связных
графов. Графы могут содержать параллельные ребра, но не содержат петли. К сожалению, некоторые из них могут содержать
циклы.
Коля хочет развернуть некоторые ребра в каждом графе, чтобы избавиться от циклов. Разворотом ребра будем считать
замену ребра из вершины a в вершину b на противоположное ребро, которое будет направлено из вершины b в вершину a. При
этом Коля хочет развернуть наименьшее число ребер в каждом графе, чтобы получившиеся графы не содержали циклов.
Помогите Коле узнать, какое наименьшее число ребер ему нужно развернуть в каждом графе.
Входные данные
В первой строке входных данных содержится число t - число графов (1≤t≤8).
В первой строке описания каждого графа дано два числа n и m - число вершин и число ребер соответственно
(2≤n≤10, 1≤m≤1000).
В следующих m строках содержатся пары чисел ai, bi - описание ребер графа (1≤ ai, bi ≤ n, ai ≠ bi).
Для удобства, описания графов разделены пустыми строками. Пустой строки после последнего графа нет.
Гарантируется, что суммарное число вершин во всех графах не превосходит 50.
Выходные данные
Для каждого графа выведите одно число в отдельной строке - наименьшее число ребер, которые нужно развернуть, чтобы полученный граф не содержал циклов.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
4
2 2
1 2
2 1
4 2
1 4
4 3
3 3
1 2
2 3
3 1
3 5
1 2
2 3
3 1
2 3
1 3 |
1
0
1
1 |
Замечание
В первом графе нужно развернуть одно из ребер, чтобы убрать цикл. Во втором графе циклов изначально нет, так что
ничего разворачивать не надо. В третьем графе можно развернуть любое ребро, чтобы убрать цикл. В четвертом графе нужно
развернуть ребро (3,1) или ребро (1,2), чтобы новый граф не содержал циклов.
| |
|
|
Сложность
Хеш
реализация
битмаски
Федот — дизайнер, ему поручена ответственная работа по художественной укладке плитки черного и белого цвета. Его последнее задание — уложить черные и белые плитки в квадрате n × n.
Федот любит свою работу и всегда тщательно готовится к каждому проекту. Федот считает, что два квадрата похожи, если один из них можно получить из другого несколько раз заменив цвета в какой-то строке или столбце на противоположные.
Все эти квадраты являются похожими, и никакой другой не похож на них
Федот заметил, что клиенты никогда не смотрят на всю работу целиком, обычно поле их зрения ограничивается квадратом k × k. Для оценки эскизов он ввел специальную величину — сложность. Она равна числу пар не похожих друг на друга квадратов k × k, которые встречаются в картине.
Методом проб и ошибок Федот установил, что клиентам нравятся картины определенной сложности. Слишком большая сложность похожа на хаос, а слишком малая навевает скуку, считает Федот.
Прежде чем класть плитку, Федот подготовил несколько эскизов. Помогите Федоту вычислить их сложность.
Входные данные
Первая строка входного файла содержит два целых числа n и k (1 ≤ k ≤ n ≤ 500). Следуюшие n строк содержат описание эскиза. Каждая из них имеет длину n и состоит из символов b и w, которые соответствуют белому и черному цветам плиток.
Выходные данные
В первой строке выходного файла выведите одно целое число q — сложность картины.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
2 1
bw
wb |
0 |
| 2 |
3 2
bwb
wbb
bbw |
3 |
| |
|
|
Максимальная прибыть (ТЯжелая - 1, дубль 24755)
битмаски
Перебор
Вы работаете менеджером и составляете план работ на следующий месяц. Каждый месяц разделён на T равных единиц времени. Всего имеется n задач, которые необходимо сделать. Однако, вы понимаете, что, возможно, успеть сделать все задачи за месяц не получится и хотите составить оптимальный план, выбрав для выполнения некоторые из них.
Про каждую задачу известно время ti, которое нужно затратить, чтобы сделать её, а также прибыль pi, которую сделанная задача принесёт компании. Вы хотите включить в план некоторые задачи так, чтобы:
- Суммарное время, затраченное на выполнение задач, включённых в план, не превышало
T.
- Суммарная прибыль от выполнения этих задач была максимальна.
Составьте план, обладающий описанными выше свойствами и определите прибыль, получаемую в результате выполнения этого плана.
Обратите внимание на то, что единственный подходящий под условия план может не содержать ни одной задачи.
Входные данные
В первой строке находятся натуральные числа T (1 ≤ T ≤ 100 000) и n (1 ≤ n ≤ 10) - число единиц времени в месяце и число задач.
Следующие n строк содержат по два натуральных числа ti и pi (1 <= ti, pi <= 100 000) - время, которое необходимо затратить на выполнение i-й задачи и прибыль, которую можно получить, выполнив её.
Выходные данные
Выведите единственное число — максимальная прибыль, которую можно получить, составив план, удовлетворяющий написанным выше условиям.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
10 3
8 100
3 10
3 10 |
100 |
| 2 |
10 4
5 10
5 20
2 5
2 6 |
31 |
| |
|
|
Кедор и Гихаил
битмаски
Перебор
Разбор случаев
Меллерт Гихаил сегодня был в прекрасном настроении до того, как его одноклассник Фусков Кедор не заговорил о политике. Гихаил очень сильно разозлился, поэтому придумал задачу по информатике для Кедора, чтобы тот начал решать и наконец-то заткнулся.
Задача была такая: “Существует n логических функций, которые зависят от одного и того же множества переменных. Даны n чисел, битовое представление которых определяет таблицу истинности для каждой функции. Вам необходимо найти такой порядок расположения функций, чтобы из каждой функции логически следовала любая из последующих или сказать, что это невозможно. Если ответ существует, то необходимо найти лексикографически минимальный порядок. Можно показать, что размер множества переменных, от которого зависят функции, не влияет на решение задачи”.
Кедор – ваш лучший друг, а Гихаил – заклятый враг, поэтому вы решили помочь с решением задачи, а затем вместе с Кедором возобновить разговоры о политике, чтобы Гихаил от злости улетел на Луну.
Входные данные
В первой строке дано число n (1 <= n <= 10) – кол-во функций.
Во второй строке дано n чисел в диапазоне [0; 10^9] – таблицы истинности функций, переведенные в десятичную систему счисления.
Выходные данные
Если порядок существует, в первой строке выведите “YES”, во второй лексикографически минимальную перестановку из всех возможных. Если порядка нет, то выведите “NO”.
Пример
|
Ввод |
Вывод |
|
3
3 1 7
|
YES
2 1 3 |
|
2
1 2
|
NO
|
(с) Курбатов Е., 2017
| |
|
|
Максимальная прибыль
Задача о рюкзаке
битмаски
Вы работаете менеджером и составляете план работ на следующий месяц. Каждый месяц разделён на T равных единиц времени. Всего имеется n задач, которые необходимо сделать. Однако, вы понимаете, что, возможно, успеть сделать все задачи за месяц не получится и хотите составить оптимальный план, выбрав для выполнения некоторые из них.
Про каждую задачу известно время ti, которое нужно затратить, чтобы сделать её, а также прибыль pi, которую сделанная задача принесёт компании. Вы хотите включить в план некоторые задачи так, чтобы:
- Суммарное время, затраченное на выполнение задач, включённых в план, не превышало
T.
- Суммарная прибыль от выполнения этих задач была максимальна.
Составьте план, обладающий описанными выше свойствами и определите прибыль, получаемую в результате выполнения этого плана.
Обратите внимание на то, что единственный подходящий под условия план может не содержать ни одной задачи.
Входные данные
В первой строке находятся натуральные числа T (1 ≤ T ≤ 100 000) и n (1 ≤ n ≤ 10) - число единиц времени в месяце и число задач.
Следующие n строк содержат по два натуральных числа ti и pi (1 <= ti, pi <= 100 000) - время, которое необходимо затратить на выполнение i-й задачи и прибыль, которую можно получить, выполнив её.
Выходные данные
Выведите единственное число — максимальная прибыль, которую можно получить, составив план, удовлетворяющий написанным выше условиям.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
10 3
8 100
3 10
3 10 |
100 |
| 2 |
10 4
5 10
5 20
2 5
2 6 |
31 |
| |
|
|
Target Practice II
геометрия
битмаски
Замечание: время на тест 2.5 сек, по умолчанию 1.25.
Замечание: необходимо использовать 64-битные типы данных
(например "long long" в C/C++).
Фермер Джон тренирует своих коров стрельбе из лука следующим
упражнением на координатной плоскости.
Всего имеется \(N (1 \leq N \leq 4 \cdot 10^4)\) прямоугольных мишеней
со сторонами
параллельными осям координат и \(4N\) коров. Каждая корова должна быть назначена
различной вершине прямоугольника. В момент \(i\), для \(1 \leq i \leq N\):
- Цель \(i\) появляется.
- \(4\) коров, назначенные своим вершинам, стреляют по ним.
- Если выстрел коровы попадает во внутренность мишени, прежде чем он попадёт
в назначенную вершину или пройдёт мимо, корова не выполнила
упражнение.
- Мишень исчезает, чтобы освободить место для следующей мишени.
Каждая корова расположена на \(y\)-оси \((x = 0)\), и каждая мишень - это
прямоугольник, где мишень \(i\) имеет нижний левый угол в точке
\((X_1, y_1^{(i)})\) и правый верхний угол в точке \((x_2^{(i)}, y_2^{(i)})\).
Эти координаты также удовлетворяют условиям
\(1 \leq X_1 < x_2^{(i)}\leq 10^9\) и
\(1 \leq y_1^{(i)} < y_2^{(i)} \leq 10^9\)
(Замечание: \(X_1\) одно и то же для каждой мишени).
В дополнение, каждая корова имеет свой "фокусный угол", где она может работать.
Поэтому корова поворачивается на этот специфический угол, когда стреляет.
Полагая, что их стрела летит по прямой от их позиции к назначенной вершине
траектория стрелы \(i\)'-ой коровы может быть описана \(s_i\)
\((0 < |s_i| < 10^9)\), наклоном траектории.
ФД хочет минимизировать расстояние между самыми дальними коровами.
Если ФД оптимально назначит каждой корове её целевую вершину и оптимально
разместит их на оси \(y\), вычислите минимальное расстояние между самыми
дальними коровами или коровы всегда не выполнят упражнение.
Каждый тест содержит \(T\) (\(1 \leq T \leq 10\)) независимых подтестов.
Гарантируется, что сумма всех \(N\) по всем подтестам не превысит \(4\cdot 10^4\).
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(T\) ( \(1 \leq T \leq 10\)), количество независимых
подтестов. Каждый подтест задаётся следующим образом:
Первая строка подтеста содержит два целых числа \(N\) и \(X_1\),
количество мишеней и самую левую координату мишеней соответственно.
Затем следуют \(N\) строк, где \(i\)-ая строка содержит 3 целых числа
\(y_1^{(i)}\), \(y_2^{(i)}\), \(x_2^{(i)}\), - нижняя \(y\)-координата,
верхняя \(y\)-координата и правая \(x\)-координата \(i\)-ой мишени соответственно.
Последняя строка состоит из \(4N\) целых чисел \(s_1, s_2, \dots, s_{4N}\)
где \(s_i\) обозначает наклон траектории выстрела \(i\)-ой коровы.
ФОРМАТ ВЫВОДА (на экран / stdout):
Минимальное возможное расстояние между самыми дальними коровами или
\(-1\) если коровы всегда не справятся с упражнением.
| |
|