Осенний кубок МИФИ 2025
A. Симуляция
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

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

Вам дан массив $$$a$$$ длины $$$n$$$. Необходимо рассчитать массив $$$b$$$ длины $$$n$$$ такой, что $$$b_i = a_i$$$, если для любого $$$j \lt i$$$ верно $$$a_j \ne a_i$$$, и $$$b_i = a_i + 1$$$ в противном случае.

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

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

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

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

В единственной строке выведите массив $$$b_1, b_2, \ldots, b_n$$$ – ответ на задачу.

Примеры
Входные данные
4
1 1 2 1
Выходные данные
1 2 2 2 
Входные данные
5
1 4 2 3 1
Выходные данные
1 4 2 3 2 

B. Исследование
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Изучая характеристики устройства одной из нейронных сетей, Марк выделил некоторый массив $$$a$$$, который он получил после преобразования параметров сети. Более того, он убедился, что этот массив некоторым образом связан с эффективностью сети. Однако он не уверен, как данный массив меняется при дальнейшем процессе обучения. Марк предполагает, что в процессе обучения массив может изменяться только $$$1$$$ типом операции. Для проверки он запустил процесс обучения и получил новый массив $$$b$$$. Теперь он просит вас помочь проверить его гипотезу.

Вам дан массив $$$a$$$. Над ним можно выполнить следующую операцию любое количество раз: выбрать элемент массива $$$x$$$ и вместо него вставить 2 элемента величины $$$x + 1$$$ в эту позицию. Длина массива при этом увеличивается на $$$1$$$.

Необходимо определить, возможно ли получить массив $$$b$$$.

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

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

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

Третья строка содержит $$$m$$$ целых чисел $$$b_1, b_2, \ldots, b_m\, (1\le b_i \le 10^9)$$$ — значения элементов массива $$$b$$$.

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

Если массив $$$b$$$ возможно получить из массива $$$a$$$, то выведите «Yes», иначе выведите «No».

Примеры
Входные данные
2 5
2 5
4 5 5 3 5
Выходные данные
Yes
Входные данные
3 4
1 2 3
2 2 3 2
Выходные данные
No

C. Настольный теннис
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Играя в настольный теннис Andrew-13 задумался, возможно ли завершить игру в точности после раунда $$$x$$$.

Обычный настольный теннис идёт, пока один из игроков не наберёт хотя бы 11 очков с преимуществом хотя бы в 2 очка по сравнению со вторым игроком, но игры с такими правилами могут быстро заканчиваться. Поэтому Andrew-13 решил рассмотреть теннис, где игра идёт, пока один из игроков не наберёт хотя бы $$$n$$$ очков с преимуществом хотя бы в $$$k$$$ очков.

Изначально у каждого игрока $$$0$$$ очков. Затем начинаются игровые раунды. Каждый раунд заканчивается победой одного из двух игроков(ничьей не бывает), который получает $$$+1$$$ очко. Как только у одного из игроков есть хотя бы $$$n$$$ очков и при этом у него хотя бы на $$$k$$$ очков больше, чем у соперника, игра заканчивается.

Вам необходимо определить для $$$t$$$ возможных параметров $$$n, k$$$ и $$$x$$$, может ли игра окончиться в точности после раунда $$$x$$$ (раунды нумеруются, начиная с $$$1$$$).

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

В первой строке входных данных содержится число $$$t\, (1 \le t \le 10^3)$$$ – количество возможных параметров.

В каждой из следующих $$$t$$$ строк содержится три числа $$$n, k, x$$$ $$$(1 \le n, k, x \le 10^9)$$$

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

Для каждого набора входных данных в отдельной строке выведите «Yes», если игра может закончиться в точности после раунда $$$x$$$, иначе выведите «No».

Пример
Входные данные
5
11 2 13
11 2 21
1 1 100
10 2 17
2 3 998244353
Выходные данные
Yes
No
No
Yes
Yes

D. Строковый автомат
ограничение по времени на тест
2 секунды
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

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

После некоторого времени вы разобрались в структуре автомата – в нём есть $$$n$$$ вершин и $$$m$$$ направленных рёбер между ними. На каждом ребре написана буква латинского алфавита, а некоторые вершины являются терминальными. В соответствующем графе могут быть петли и кратные рёбра.

Автомат считает строку из латинских символов $$$подходящей$$$, если следующий процесс можно закончить в терминальной вершине.

Изначально $$$x = 1$$$ – текущее состояние. Далее символы строки рассматриваются по очереди. Если из текущей вершины нет перехода по очередному символу $$$s$$$, то процесс заканчивается, и строка считается неподходящей. Если переходы по символу $$$s$$$ есть, то состояние изменяется на одно из состояний, достижимых из $$$x$$$ по букве $$$s$$$.

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

Дополнительно пустая строка считается $$$подходящей$$$ вне зависимости от структуры автомата.

Необходимо определить максимальную длину строки, которая является $$$подходящей$$$.

Если длина конечна, то нужно вывести лексикографически минимальную строку максимальной длины.

Для строк одинаковой длины $$$S, T$$$ $$$(S \ne T)$$$ $$$S$$$ называется лексикографически меньше, чем $$$T$$$, если существует $$$i$$$, такое что для $$$j$$$ ($$$1 \le j \lt i$$$) $$$S_{j} = T_j$$$ и $$$S_{i} \lt T_i$$$.

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

В первой строке содержатся числа $$$n, m$$$ и $$$k$$$ ($$$1 \le n, m, k \le 5 \cdot 10^5$$$) – число вершин, рёбер в автомате и количество терминальных вершин.

Далее в $$$m$$$ строках содержатся по 3 числа $$$u, v, s$$$, означающие, что есть направленное ребро от $$$u$$$ к $$$v$$$ с буквой $$$s$$$ $$$(1 \le u,v \le n)$$$, $$$s$$$ – символ латинского алфавита.

В следующей строке содержится $$$k$$$ чисел $$$u_1, u_2, \ldots, u_k\, (1\le u_i \le n)$$$ – терминальные вершины.

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

В первой строке выведите «inf», если существует сколь угодно длинные $$$подходящие$$$ строки.

Иначе выведите длину самой длинной $$$подходящей$$$ строки, а в следующей строке выведите лексикографически минимальную строку, которая является $$$подходящей$$$.

Примеры
Входные данные
4 4 2
1 2 a
2 3 b
1 3 b
4 4 a
3 4
Выходные данные
2
ab
Входные данные
3 4 1
1 2 a
1 3 c
3 2 c
2 2 a
3
Выходные данные
1
c

E. Лист
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

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

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

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

Для того чтобы получить о нём информацию, вы можете делать запросы. В каждом запросе вы можете выбрать множества $$$S, T$$$, которые являются подмножествами {$$$1, 2, \ldots n$$$}. В ответ вы получите количество рёбер, начинающихся в одной из вершин множества $$$S$$$ и заканчивающихся в одной из вершин множества $$$T$$$(учитывая ориентацию рёбер). Множества $$$S$$$ и $$$T$$$ могут пересекаться.

Вы можете задать не более $$$n$$$ запросов. В любой момент вы можете вывести ответ на задачу – индекс вершины, которая является листом, или $$$-1$$$, если в графе нет ни одного листа.

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

В первой строке вводится число $$$t$$$ ($$$1 \le t \le 100$$$) – количество тестов.

В очередном тесте вводится число $$$n$$$ ($$$1 \le n \le 100$$$) – количество вершин в графе. Гарантируется, что сумма $$$n$$$ по всем тестовым данным не превосходит $$$1000$$$.

Далее ваша программа может выбрать множества $$$S$$$ = {$$$s_1, s_2, \ldots, s_k$$$} и $$$T$$$ = {$$$t_1, t_2, \ldots, t_r$$$} и вывести «? $$$k$$$ $$$s_1$$$ $$$s_2 \ldots s_k$$$ $$$r$$$ $$$t_1$$$ $$$t_2 \ldots t_r$$$». После этого вы получите количество рёбер, начинающихся в одной из вершин множества $$$S$$$ и заканчивающихся в одной из вершин множества $$$T$$$. Обратите внимание, что при выполнении запроса после последнего числа не должно быть лишних пробелов.

Как только программа готова дать ответ, вы можете вывести «! $$$x$$$», где $$$x$$$ равен $$$-1$$$, если листа не существует, или индексу листа в противном случае (индексация начинается с $$$1$$$). Далее программа должна приступить к обработке следующего теста или завершиться, если это был последний тест.

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

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

  • fflush(stdout) или cout.flush() в C++;
  • sys.stdout.flush() в Python;
Пример
Входные данные
2
3

1

2

2

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


? 1 1 2 2 3

? 2 1 2 2 2 3

! 1

! -1
Примечание

В первом примере в графе всего 2 ребра – 1→2 и 2→3.

Во втором примере граф пустой.

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

F. Скобочные последовательности
ограничение по времени на тест
2 секунды
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

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

Есть массив целых ненулевых чисел $$$a_1, a_2, \ldots, a_n$$$, положительное число $$$x$$$ в массиве соответствует $$$x$$$ открывающимся скобкам, а отрицательное – $$$-x$$$ закрывающимся. Например, массив [3, -2] соответствует ((()).

Подотрезок $$$a_l, a_{l+1}, \ldots, a_r$$$, где $$$(l \le r)$$$ называется $$$хорошим$$$, если можно переупорядочить его элементы и получить массив $$$b_1, b_2, \ldots, b_{r-l+1}$$$ такой, что соответствующая ему скобочная последовательность является сбалансированной и при этом среди любых двух подряд идущих элементов массива $$$b$$$ есть хотя бы одно отрицательное число.

Для данного массива $$$a$$$ вам необходимо посчитать число его $$$хороших$$$ подотрезков.

Скобочная последовательность называется сбалансированной, если её можно превратить в правильное математическое выражение, добавив символы + и 1.

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

В первой строке входных данных содержится единственное число $$$n$$$ $$$(1 \le n \le 5 \cdot 10^5)$$$.

Вторая строка содержит $$$n$$$ чисел $$$a_1, a_2, \ldots, a_n\, (1 \le |a_i| \le 10^9)$$$.

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

В единственной строке выведите одно число – ответ на задачу.

Пример
Входные данные
5
3 -1 2 -2 1
Выходные данные
2

G. Серия побед
ограничение по времени на тест
5 секунд
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Андрей и Саша любят играть в настольный теннис и уже сыграли множество партий. Так как игры по обычным правилам заканчивались очень быстро, они решили играть, пока у одного из них не будет $$$n$$$ очков и преимущество в $$$k$$$ очков.

Игра проходит следующим образом. Изначально у каждого игрока $$$0$$$ очков. Затем начинаются игровые раунды. Каждый раунд заканчивается победой одного из двух игроков(ничьей не бывает). Как только у одного из игроков есть хотя бы $$$n$$$ очков и при этом у него хотя бы на $$$k$$$ очков больше, чем у соперника, игра заканчивается.

Андрей и Саша сыграли между собой много игр. Однако информация о некоторых из них была утеряна. Андрей помнит, что всего было сыграно $$$g$$$ раундов, и из них он выиграл от $$$l$$$ до $$$l+13$$$ раундов. Если он выиграл $$$x$$$ раундов, можно считать, что вероятность победы Андрея в каждом раунде постоянна и равна $$$x/g$$$. Эта вероятность также не меняется по ходу следующих игр.

Андрею стало интересно, какова вероятность, что в игре он сможет выиграть $$$s$$$ раундов подряд независимо от исхода игры. Так как он не помнит точного значения $$$x$$$, он хочет посчитать эту вероятность для любого из допустимых $$$x$$$.

Ответ необходимо вывести по модулю $$$998244353$$$.

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

В первой строке содержатся 3 целых числа $$$n, k$$$ и $$$s$$$, ($$$1 \le n \le 3000$$$), ($$$1 \le k \le 300$$$), ($$$1 \le s \le 3000$$$).

Во второй строке содержатся 2 целых числа $$$g$$$ и $$$l$$$ ($$$100 \le g \le 10^8$$$), ($$$0 \le l \le g - 13$$$) – количество сыгранных раундов и минимальное число выигранных Андреем раундов.

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

В единственной строке выведите 2 числа $$$x$$$ и $$$p$$$ – выбранное вами число выигранных раундов ($$$l \le x \le l + 13$$$) и искомую вероятность для данного $$$x$$$ по модулю $$$998244353$$$.

Примеры
Входные данные
3 1 2
300 100
Выходные данные
100 242372086
Входные данные
100 50 50
652 356
Выходные данные
365 964566959