Яндекс.Алгоритм 2018, второй отборочный раунд
A. Замена букв
ограничение по времени на тест
6 секунд
ограничение по памяти на тест
512 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Дана непустая последовательность из букв «a», «b» и «c». Требуется посчитать количество способов выбрать две различные буквы в последовательности (то есть две разные по значению буквы, одинаковые буквы на разных позициях выбирать не разрешается) и поменять их местами, чтобы получившаяся последовательность была правильной.

Правильная последовательность букв определяется следующим образом:

  • Пустая последовательность является правильной.
  • Если A — правильная последовательность, то aAa, bAb и cAc также являются правильными.
  • Если A и B — правильные последовательности, то AB (конкатенация A и B) также правильная.
  • Последовательности, которые невозможно получить при помощи операций, описанных выше, не являются правильными.
Входные данные

В единственной строке записана непустая последовательность из символов «a», «b», «c». Длина последовательности не превосходит 100 000 символов.

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

Выведите одно число — количество спобов поменять местами две различные буквы, чтобы получившаяся последовательность была правильной.

Примеры
Входные данные
abba
Выходные данные
2
Входные данные
abcabc
Выходные данные
6
Входные данные
aaba
Выходные данные
0
Примечание

В первом примере заменой букв можно получить правильные последовательности «aabb» и «bbaa». Обратите внимание, что исходная последовательность уже может быть правильной, но оставлять её без изменений нельзя.

Во втором примере можно получить правильные последовательности «abbacc», «abccba», «accabb», «aacbbc», «bbcaac» и «cbaabc».

В третьем примере количество букв «a» нечётно, поэтому правильную последовательность получить нельзя.

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

Даны массив a длины n, и массив b длины m. Все элементы обоих массивов — цифры от 0 до 9 включительно. Составим по этим массивам таблицу c размера n × m, где элемент в i-й строке и j-м столбце определяется формулой ci, j = ai·109 + bj.

Рассмотрим всевозможные пути из клетки c1, 1 в клетку cn, m, состоящие только из перемещений вниз и вправо (то есть, из клетки ci, j можно переходить только в клетки ci + 1, j и ci, j + 1, если эти клетки находятся внутри таблицы). Среди всех этих путей выберите такой, что сумма чисел в посещённых клетках максимальна, и выведите эту сумму.

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

Первая строка содержит два целых числа n и m — размеры массивов a и b соответственно (1 ≤ n, m ≤ 100 000).

Во второй строке записано n целых чисел a1, ..., an (0 ≤ ai ≤ 9).

Во третьей строке записано m целых чисел b1, ..., bm (0 ≤ bj ≤ 9).

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

Выведите одно число — максимальную сумму чисел в клетках среди путей в таблице c, удовлетворяющих правилам выше.

Примеры
Входные данные
3 4
1 1 1
1 1 1 1
Выходные данные
6000000006
Входные данные
5 3
1 2 3 4 5
6 7 8
Выходные данные
25000000045
Входные данные
7 4
0 7 1 7 6 7 6
4 1 9 7
Выходные данные
55000000068
Примечание

Во втором примере оптимальный путь сначала идёт вниз от клетки (1, 1) до клетки (5, 1), а затем до упора направо до клетки (5, 3).

В третьем примере оптимальным ответом является путь

.

C. World of Darkraft 3
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
512 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Рома играет в новую версию World of Darkraft за персонажа-мага. Рома ценит своё игровое время и старается выполнять внутриигровые задания как можно эффективнее.

Сейчас Рома сражается с n монстрами. i-й из этих монстров имеет hi очков здоровья. Монстр погибает, если его очки здоровья становятся равными нулю или отрицательными (в этот момент Ромин персонаж получает опыт).

Запас маны Роминого персонажа составляет m единиц. Персонаж владеет двумя заклинанями: «Удар молнии» и «Кольцо льда».

  • «Удар молнии» наносит ds единиц урона выбранному монстру (то есть уменьшает количество его очков здоровья на ds), и одно применение этого заклинания стоит cs единиц маны.
  • «Кольцо льда» наносит da единиц урона всем ещё живым монстрам, и одно применение этого заклинания стоит ca единиц маны.

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

Рома хочет заработать как можно больше опыта за одно сражение. Помогите Роме определить максимальное количество монстров, которых он сможет победить.

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

В первой строке записано шесть целых чисел n, m, ds, cs, da и ca (1 ≤ n, m, ds, cs, da, ca ≤ 100) — количество монстров, запас маны персонажа, а также урон и стоимость заклинаний «Удар молнии» и «Кольцо льда» соответственно.

Во второй строке записано n целых чисел h1, h2, ..., hn — очки здоровья монстров (1 ≤ hi ≤ 100).

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

Выведите одно число — максимальное количество монстров, которых сможет победить персонаж.

Примеры
Входные данные
3 5 1 1 3 3
4 1 5
Выходные данные
2
Входные данные
5 70 10 10 1 20
11 11 11 11 11
Выходные данные
5
Примечание

В первом примере персонаж может применить «Кольцо льда» один раз (в результате у первого монстра останется одно очко здоровья, у третьего — два очка, а второй монстр погибнет). После этого персонаж может два раза применить «Удар молнии» и убить еще одного монстра.

Во втором примере единственный способ убить всех монстров — это применить «Кольцо льда» один раз и «Удар молнии» по одному разу на каждого монстра.

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

В чемпионате Берляндии по многоборью участвуют n спортсменов. Соревнование состоит из k этапов, на каждом из которых участник может набрать любое вещественное число очков в диапазоне от 0 до 1.

Маленький мальчик Олег любит спортивную аналитику, и поэтому хочет осветить чемпионат в своём спортивном блоге. Олег ничего не знает ни про спортсменов, ни про ход соревнования. Зато Олег знаком с теорией вероятностей, поэтому он предполагает, что каждый спортсмен на каждом этапе набирает случайное число очков, равномерно распределенное на отрезке [0, 1]. Также Олег считает, что результаты всех спортсменов на всех этапах в совокупности независимы.

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

Обратите внимание, что в справедливой таблице один спортсмен может стоять выше другого, даже если он проиграл ему на всех этапах. Пусть, например, в соревновании из двух этапов очки спортсмена 1 равны (0.2, 0.2), очки спортсмена 2 равны (0.8, 0.8), а очки спортсмена 3 равны (0, 1). Тогда таблица (1, 3, 2) является справедливой, поскольку спортсмен 1 обогнал спортсмена 3 на первом этапе, а спортсмен 3 обогнал спортсмена 2 на втором; при этом спортсмен 1 проиграл спортсмену 2 на каждом из этапов.

Чемпионат еще не начался, но Олег уже хочет зарезервировать достаточно места на хостинге, чтобы все таблицы поместились на сервер. Для этого он просит вас посчитать математическое ожидание количества способов составить справедливую рейтинговую таблицу по итогам соревнований. Олег также хочет проверить свои навыки в теории чисел, поэтому он хочет получить ответ по модулю P = 998 244 353. Формально, если ответ на задачу представленный в виде несократимой дроби равен A / B, вам следует вывести такое целое число x, что 0 ≤ x < P и A ≡ B·x ± od P (гарантируется, что такое число x существует и единственно).

Математическое ожидание величины, принимающей целые значения, определяется как , где суммирование происходит по всем целым числам, а px — вероятность того, что величина принимает значение x.

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

В единственной строке записаны два целых числа n и k (1 ≤ n, k ≤ 1000) — количество спортсменов и этапов в соревновании соответственно.

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

Выведите одно число — среднее количество справедливых таблиц по модулю 998 244 353.

Примеры
Входные данные
10 1
Выходные данные
1
Входные данные
1 10
Выходные данные
1
Входные данные
2 2
Выходные данные
499122178
Входные данные
5 3
Выходные данные
778699985
Примечание

В первом примере для любого исхода существует ровно одна справедливая таблица — по убыванию очков в единственном этапе (кроме случая, когда несколько спортсменов набрали одинаковое количество очков, но вероятность этого равна нулю).

Во втором примере есть только один спортсмен, поэтому возможна только одна таблица.

В третьем примере ответ равен , а в четвёртом — .

E. Бонсай
ограничение по времени на тест
2 секунды
ограничение по памяти на тест
512 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Василий увлекается бонсай — искусством выращивания декоративных деревьев. У него есть два красивых дерева, но эстетическое чутьё Василия подсказывает ему, что эти деревья нужно сделать как можно более похожими.

Рассмотрим задачу формально. Представим каждое дерево в виде графа со специальной корневой вершиной. Вершины каждого дерева пронумерованы, начиная с единицы, и корнем каждого из деревьев является вершина, имеющая номер 1 среди вершин этого дерева. Графы являются связными и не содержат циклов. Ориентируем рёбра деревьев по направлению от корня. Рёбра, исходящие из каждой вершины, упорядочены (слева направо, если смотреть на дерево спереди) по возрастанию номеров вершин, в которые они исходят.

Василий может совершать два типа операций с любым из деревьев:

  • Удалить из дерева любой лист — вершину, из которой не исходит ни одного ребра. Корень дерева удалять ни в коем случае нельзя.
  • Выбрать два соседних ребра, исходящих из одной вершины, и аккуратно связать их верёвочкой. После этого Василий считает, что два данных ребра становятся одним ребром, а концы этих рёбер становятся одной вершиной, из которой исходят все рёбра, ранее исходившие из начал связанных рёбер. Порядок рёбер, исходящих из новой вершины определяется так: сперва все рёбра, исходившие из конца левого связанного ребра, а затем все рёбра, исходившие из конца правого связанного ребра. Относительный порядок рёбер при этом не меняется. Полученные в результате связывания вершины и рёбра считаются обычными вершинами и рёбрами и могут участвовать в дальнейших связываниях и удалениях.

Василий считает, что деревья стали одинаковыми, если можно построить взаимно-однозначные соответствия между рёбрами и между вершинами двух деревьев таким образом, что:

  • Из соответствующих друг другу вершин исходит одинаковое количество рёбер, и все эти рёбра сопоставлены друг другу согласно их порядку.
  • Для соответствующих друг другу рёбер их концы сопоставлены друг другу.

Из этих правил, в частности, следует, что корни деревьев всегда должны быть сопоставлены друг другу.

Разумеется, Василий хочет как можно меньше испортить исходные деревья. Какое минимальное количество операций ему придется совершить с деревьями, чтобы они стали одинаковыми?

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

В первой строке записано целое число n — количество вершин первого дерева (1 ≤ n ≤ 5000).

Во второй строке записаны целые числа p2, ..., pn (1 ≤ pi < i). Здесь число pi означает номер родителя некорневой вершины i — начала единственного ребра, входящего в i.

В третьей строке записано целое число m — количество вершин второго дерева (1 ≤ m ≤ 5000).

В четвертой строке записаны номера родителей вершин 2, ..., m второго дерева в том же формате, что описано выше.

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

Выведите одно число — минимальное количество операций, необходимое, чтобы сделать деревья одинаковыми.

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

В первом примере достичь цели можно за две операции, например, так: отрезать лист 3 в первом дереве, и связать рёбра (1, 2) и (1, 3) во втором дереве.

Во втором примере деревья уже одинаковые несмотря на то, что листья пронумерованы по-разному.

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

F. Альфред и Георг
ограничение по времени на тест
6 секунд
ограничение по памяти на тест
512 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Математики Альфред и Георг играют в игру. Они берут белый клетчатый листок размером n × m клеток. Сначала Альфред раскрашивает некоторые клетки в чёрный цвет, после чего Георг должен снова перекрасить все клетки в белый. Для этого Георг сколько угодно раз проделывает следующую операцию:

  • Поместить карандаш в левый нижний угол листка (будем считать, что это точка с координатами (0, 0)), после чего нарисовать путь в верхний правый угол листка (точку с координатами (n, m)). Путь должен проходить только по границам клеток, кроме того, передвигать карандаш можно только вправо и вверх, то есть из позиции (x, y) карандаш можно передвинуть только в позиции (x + 1, y) и (x, y + 1), если при этом карандаш не покинет пределом листка.
  • Перекрасить все клетки листка, расположенные под нарисованным путём, в противоположный цвет (то есть, все белые клетки под путём перекрасить в чёрный цвет, а все чёрные — в белый). После этого нарисованный путь стирается, и (если это необходимо) Георг переходит к следующей операции.

Пока Георг работает, Альфред пытается посчитать в уме, за какое минимальное число операций можно было бы закончить игру, начиная с исходного рисунка. Для самопроверки он попросил вас написать программу, которая бы находила ответ на этот вопрос.

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

В первой строке записано три целых числа n, m и k (1 ≤ n, m ≤ 500 000, 0 ≤ k ≤ 500 000) — размеры листка и количество закрашенных клеток соответственно.

Следующие k строк описывают закрашенные клетки. i-я из этих строк содержит два целых числа xi, yi — координаты левого нижнего угла i-й закрашенной клетки в системе координат, описанной выше (0 ≤ xi < n, 0 ≤ yi < m). Гарантируется, что закрашенные клетки не повторяются.

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

Выведите одно число — минимальное количество операций, нужное, чтобы завершить игру. Если перекрасить всю доску в белый цвет невозможно, выведите  - 1.

Примеры
Входные данные
2 2 3
0 0
1 0
1 1
Выходные данные
1
Входные данные
2 2 3
0 0
0 1
1 1
Выходные данные
2
Входные данные
2 2 3
1 0
0 1
1 1
Выходные данные
3
Примечание

В первом примере достаточно одного пути: (0, 0) → (0, 1) → (1, 1) → (1, 2) → (2, 2).

Во втором примере достаточно двух путей: (0, 0) → (1, 0) → (1, 1) → (2, 1) → (2, 2) и (0, 0) → (0, 2) → (2, 2).