Финал Яндекс.Алгоритм 2018
A. Интеллектуальный вендинг
ограничение по времени на тест
2 секунды
ограничение по памяти на тест
512 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

В этот жаркий Санкт-Петербургский полдень стажёр Яндекса Аркадий сидел в офисе и вносил последние правки в свою дипломную работу. После нескольких часов тяжких трудов он решил развеяться и прогуляться до торгового автомата на первом этаже, чтобы купить бутылку своего любимого напитка Квас-Класс.

Стоит отметить, что в офисе установлен довольно необычный торговый автомат. Он принимает только монеты достоинством один рубль и купюры достоинством один миллион рублей, и при этом продаёт только бутылки напитка Квас-Класс ценой r рублей за штуку. Изначально у Аркадия есть b банкнот достоинством миллион рублей и c монет по одному рублю. В автомате изначально находятся d рублёвых монет, которыми он может давать сдачу. Процесс покупки одной бутылки напитка устроен следующим образом.

  1. Аркадий вставляет в автомат x банкнот и y монет, то есть общая загруженная сумма составляет z = 106·x + y.
  2. Затем он нажимает на кнопку совершения покупки. Если z оказывается меньше r, то автомат просит внести ещё денег.
  3. Если z больше либо равно r, то автомат пытается выдать Аркадию сдачу. Поскольку автомат может выдавать сдачу только монетами, то количество находящихся в нём монет в один рубль (при этом не учитываются монеты, вставленные для совершения именно этой покупки) должно быть не менее z - r. Если монет для выдачи сдачи недостаточно, то покупка не состоится.
  4. Если z ≥ r и в автомате достаточно монет для того, чтобы выдать Аркадию сдачу (или сдача вообще не требуется, то есть z = r), происходит покупка. Автомат забирает себе x банкнот и y монет (которые могут быть использованы для выдачи сдачи при следующих покупках), после чего возвращает Аркадию z - r монет и выдаёт бутылку желанного напитка.

Хотя Аркадий пришёл купить только одну бутылку, он всё же программист, так что ему интересно, какое максимально количество бутылок он смог бы приобрести, если бы действовал оптимально? Можете считать, что в автомат загружено заведомо достаточное количество бутылок напитка Квас-Класс (что, к сожалению, далеко не всегда выполнено в реальной жизни).

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

В первой строке входных данных записаны два целых числа b и c (0 ≤ b, c ≤ 109) — количество банкнот достоинством в один миллион рублей и количество монет в один рубль в распоряжении Аркадия.

Во второй строке записаны два целых числа r и d (1 ≤ r ≤ 109, 0 ≤ d ≤ 109) — цена одной бутылки напитка Квас-Класс и количество монет в торговом автомате до покупок Аркадия. Обратите внимание, что количество купюр внутри автомата значения не имеет.

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

Выведите одно целое число равное максимальному количеству бутылок напитка Квас-Класс, которые Аркадий сможет купить если будет действовать оптимально.

Примеры
Входные данные
21 1000000
1100000 0
Выходные данные
20
Входные данные
10 700000
350000 200000
Выходные данные
4
Примечание

В первом примере Аркадий сможет потратить все свои деньги.

Во втором примере Аркадий может сначала купить две бутылки используя только имеющиеся у него монеты. Затем он купит бутылку с помощью банкноты (в автомате к этому моменту находятся 900 000 монет для выдачи сдачи). В конце он сможет купить ещё одну бутылку.

B. НВП против НУП
ограничение по времени на тест
3 секунды
ограничение по памяти на тест
512 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Наибольшей возрастающей подпоследовательностью (НВП) массива a1, ..., an называется последовательность индексов 1 ≤ i1 < ... < ik ≤ n, такая что ai1 < ... < aik и значение k максимально возможное. Наибольшая убывающая подпоследовательность (НУП) определяется аналогично.

В самой свежей задаче для собеседований в Яндекс вам даётся перестановка p = (p1, ..., pn) чисел 1, 2, ..., n, в которой требуется выбрать НВП и НУП не имеющие общих элементов, или определить, что это невозможно сделать. Формально, требуется выбрать две последовательности индексов i1 < ... < ik и j1 < ... < jl, такие что:

  • ai1 < ... < aik;
  • bj1 > ... > bjl;
  • k равняется длине НВП в p;
  • l равняется длине НУП в p,
  • все индексы i1, ..., ik, j1, ..., jl различны.
Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 500 000) — размер перестановки p.

Во второй строке записаны n различных целых чисел p1, p2, ..., pn (1 ≤ pi ≤ n).

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

Если ответ существует, то выведите его в четырёх строках. В первой строке выведите целое число k — размер НВП в перестановке p. Во второй строке выведите k чисел i1, ..., ik удовлетворяющих условиям 1 ≤ i1 < ... < ik ≤ n и ai1 < ... < aik. В следующих двух строках выведите описание НУП j1, ..., jl в аналогичном формате. Все индексы i1, ..., ik, j1, ..., jl должны быть различны.

Если ответа не существует, то выведите «IMPOSSIBLE» (без кавычек) в единственной строке вывода.

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

Во втором примере длины НВП и НУП равны 2. Приведём список всех возможных НВП: (1, 2), (3, 4) (указаны индексы элементов, а не их значения); также приведём список всех возможных НУП: (1, 3), (1, 4), (2, 3), (2, 4). Каждая НУП пересекается с каждой из НВП хотя бы по одному элементу, следовательно, ответа не существует.

C. Прогулки за едой
ограничение по времени на тест
2 секунды
ограничение по памяти на тест
512 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Евгений занимается в Яндексе анализом больших данных. Недавно он решил немного отдохнуть, взял отпуск, и уехал в замечательный образовательный центр на берегу Чёрного моря преподавать школьникам машинное обучение и анализ данных.

По вечерам он идёт на набережную, где расположены n неплохих ресторанов, пронумерованных целыми числами 1, 2, ..., n, при этом ресторан с номером i находится на позиции i вдоль набережной. Евгений начинает в позиции 0 с запасом в e единиц энергии. Изначально желудок Евгения пуст и он тратит одну единицу энергии на перемещение в соседнюю позицию (например из позиции 0 в позицию 1, где расположен ресторан с номером 1). В течение вечера может происходить следующее.

  1. Если в некоторый момент времени Евгений находится в позиции i и при этом он уже съел сегодня x единиц еды, то он может совершить операцию перемещения в позиции i - 1 или i + 1 потратив x + 1 единицу энергии.
  2. Если Евгений находится в позиции i от 1 до n включительно и ещё не заходил этим вечером в ресторан с номеров i, то он может пойти туда. Евгений знает, что в результате посещения этого ресторана он съест ровно ai единиц еды. На это действие Евгений не тратит энергии (жеванием можно пренебречь).
  3. Если в некоторый момент времени Евгений снова оказывается в позиции 0, то он может принять решение остановится и пойти обратно в образовательный центр. Это действие так же не требует затрат энергии.

Поскольку Евгений занимается машинным обучением и смежными областями, он попросил вас посчитать максимальное количество еды, которое он может съесть и затем вернуться в образовательный центр в точке 0 если будет действовать оптимально.

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

В первой строке входных данных записаны два целых числа n и e (1 ≤ n ≤ 200, 000, 1 ≤ e ≤ 107) — количество ресторанов на набережной и изначальный запас энергии Евгения.

Во второй строке записаны n целых чисел a1, a2, ..., an (0 ≤ ai ≤ 1 000 000), i-е из которых равняется точному количеству единиц еды, которое Евгений съест, если решит посетить ресторан i.

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

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

Примеры
Входные данные
5 100
1 1 1 1 1
Выходные данные
5
Входные данные
4 25
3 30 1 3
Выходные данные
6
Примечание

В первом примере у Евгения очень большой запас энергии, поэтому он просто идёт от позиции 0 к позиции 5 и посещает все рестораны на своём пути, а затем возвращается в образовательный центр.

Во втором примере оптимальной стратегией для Евгения будет сначала пойти в ресторан номер 4, затем посетить ресторан 1 и после этого вернуться в позицию 0.

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

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

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

Алисе скучно, поэтому она развлекает себя тем, что открывает поисковик и вводит туда различные запросы. Изначально перед Алисой пустое текстовое поле. Каждый раз она изменяет предыдущий запрос ровно на одну букву, дописывая её в начало или в конец запроса по своему усмотрению. Алиса проделывает такую операцию ровно n раз.

В этом процессе Алисе нравится смотреть как на экране появляются все вхождения и как сильно может изменить их количество после добавления одного символа. Алиса хочет протестировать как поведёт себя поисковик если ему потребуется выводить очень много данных, поэтому она хочет выбрать такую последовательность приписываний букв в начало или конец строки, что суммарное количество вхождений всех строк-запросов в строку базы данных s будет максимально. Какое максимальное значение может получить Алиса?

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

В первой строке входных данных записано одно целое число n (1 ≤ n ≤ 200 000) — длина строки s.

Во второй строке записана сама строка s, состоящая из строчных букв английского алфавита.

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

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

Примеры
Входные данные
5
aaaaa
Выходные данные
15
Входные данные
6
abcabc
Выходные данные
9
Примечание

В первом примере последовательность "a"  →  "aa"  →  "aaa"  →  "aaaa"  →  "aaaaa" даёт результат в 15 = 5 + 4 + 3 + 2 + 1 вхождений.

Одной из оптимальных последовательностей во втором примере является "a"  →  "ab"  →  "abc"  →  "cabc"  →  "bcabc"  →  "abcabc", позволяя получить 9 = 2 + 2 + 2 + 1 + 1 + 1 вхождений в сумме.

E. Угадай меня, если сможешь
ограничение по времени на тест
2 секунды
ограничение по памяти на тест
512 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

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

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

  1. В начале Алиса называет некоторое число n и загадывает перестановку чисел от 1 до n обозначаемую p1, p2, ..., pn.
  2. Целью игры является сказать Алисе на какой позиции в изначальной перестановке находился элемент равный n.
  3. Единственная операция, доступная игроку, это выбрать некоторую позицию i. После этого Алиса увеличивает значение pi на один и сообщает количество различных элементов в текущем массива p1, p2, ..., pn.

В игре есть возможность выбрать из нескольких уровней сложности. На последнем уровне игроку требуется угадать позицию числа n в изначальной перестановке за не более чем 50·n запросов. Вы ведёте разработку собственного голосового помощника Бориса и хотите научить его играть в эту игру, чтобы можно было поместить два телефона друг напротив друга и наблюдать битву искусственных интеллектов.

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

В начале Алиса сообщает игроку значение числа n (1 ≤ n ≤ 1000). Затем игрок может не более 50·n раз сделать запрос вида «0 x», где 0 означает, что игрок делает запрос, а x является позицией в массиве от 1 до n включительно, и означает, что Алиса должна увеличить значение px на один и сообщить количество различных элементов в массиве p после этого действия.

Как только вы уверены в своём ответе (или у вас кончились доступные запросы) вам необходимо вывести «1 x», где 1 означает вывод ответа, а x является собственно ответом, то есть догадкой, что в начале игры было выполнено px = n. Ваша программа должна завершиться как только выведет ответ, в противном случае вы можете получить непредсказуемый результат проверки.

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

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


5
0 1
4
0 1
4
0 3
3
0 4
2
1 2
Строки, содержащие два числа, соответствуют возможному выводу вашей программы, а строки, содержащие одно число, соответствую выводу интерактора, то есть значениям, которые ваша программа должна считать.

F. Хеширование для ленивых
ограничение по времени на тест
7 секунд
ограничение по памяти на тест
512 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

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

Сегодня у Ивана есть массив из n различных целых положительных чисел a1, a2, ..., an, который он хочет положить в хеш-таблицу. Для этого он собирается выбрать некоторое значение m — количество корзин в хеш-таблице, а затем отправить число x в корзину . Таким образом, число a1 попадёт в корзину h(a1), a2 попадёт в корзину h(a2) и так далее.

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

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

В первой строке входных данных записано число n (1 ≤ n ≤ 2 000 000) — количество чисел в массиве Ивана. В следующей строке записаны n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 2 000 000). Гарантируется, что все элементы последовательности a различны.

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

Выведите одно целое число — минимальное значение m, такое что все числа будут различными.

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