Финальный раунд
"A" Терпение | |||||
---|---|---|---|---|---|
Ограничение по времени | 2 секунды | ||||
Ограничение по памяти | 256 мегабайт | ||||
Хулиганы Петя и Вася сидят на невыносимо скучном уроке. Для того, чтобы как-то развлечься, они решили поиграть с терпением учителя. Уровень недовольства учителя ребятами выражается целым числом x. Петя и Вася по очереди совершают различные мелкие и крупные шалости, Петя совершает шалость первым. После мелкой шалости уровень недовольства учителя увеличивается на 1, после крупной шалости — увеличивается в 2 раза. Тот ученик, после шалости которого недовольство учителя становится больше, чем n, получает выговор от учителя и приходит после уроков с родителями к директору. Естественно, ни Вася, ни Петя такому исходу не рады, и поэтому каждый из них действует оптимально, чтобы избежать этого. Ребята играют в эту игру каждый день. С каждым днем начальное недовольство учителя растет: в первый день оно равнялось 1, во второй день — 2, и так далее. В i-й день изначальное недовольство учителя учениками равно i. Всего в году ровно n учебных дней, то есть, в последний день учебы недовольство учителя равно n и любая шалость учеников мгновенно выводит его из себя. Отличнику Коле тоже очень скучно на уроке, ведь он уже знает все, что рассказывает учитель. Коля заметил странную игру Пети и Васи и легко выяснил, кто пойдет за родителями в каждый учебный день. Однажды Коля подметил, что Вася пошел за родителями ровно в k-й раз. Определите, в какой по счету учебный день это произошло? Например, пусть n = 4. В первый день начальное недовольство учителя равно 1. Какую бы шалость не совершил Петя, недовольство учителя станет равно 2. После этого Вася совершает крупную шалость и недовольство учителя становится равно 4. Теперь какую бы шалость не совершил Петя, он получит выговор и пойдет за родителями. Во второй учебный день начальное недовольство учителя равно 2. Теперь Петя совершает крупную шалость и вынуждает Васю получить выговор. В третий учебный день Петя добивается того же эффекта, совершив мелкую шалость. В последний же, четвертый учебный день, Петя получит выговор, поскольку он должен совершить шалость первым. Таким образом, если Коля видит, что Вася пошел за родителями в 1-й раз, можно сделать вывод, что сейчас 2-й учебный день, а если Вася пошел за родителями во 2-й раз, то сейчас 3-й учебный день. | |||||
Формат входных данных |
Первая строка содержит целое число T (1 ≤ T ≤ 105) — количество тестов. Каждая из следующих T строк содержат описание очередного теста: 2 целых числа n и k (1 ≤ n, k ≤ 1018). |
||||
Формат выходных данных |
Для каждого теста выведите единственное число: a — день, в который Вася пошел за родителями в k-й раз, либо −1, если такой ситуации произойти не может. Выводите каждое из чисел в отдельной строке. |
||||
Примеры |
|
"B" Белоснежка и n гномов | |||||
---|---|---|---|---|---|
Ограничение по времени | 2 секунды | ||||
Ограничение по памяти | 256 мегабайт | ||||
Белоснежка дружит с n гномами, которых она пронумеровала от 1 до n. Известно, что рост i-го гнома равен hi сантиметров, рост каждого гнома положителен и не превышает n. Принцесса считает непустое подмножество гномов симпатичным, если сумма их номеров совпадает с их суммарным ростом. Требуется выяснить, существует ли симпатичное множество гномов, и если такое есть — вывести пример такого множества. | |||||
Формат входных данных |
Первая строка содержит целое число t — количество тестов. Следующие 2t строк содержат t различных тестовых запросов. В первой строке запроса содержится n — количество гномов (1 ≤ n ≤ 106), во второй содержится n положительных чисел, не превосходящих n — рост гномов. Сумма n по всем запросам не превышает 106. |
||||
Формат выходных данных |
В случае существования ответа в первой строке нужно вывести количество гномов в симпатичном подмножестве, удовлетворяющем условию, а во второй строке нужно вывести через пробел номера выбранных жителей. В случае, если непустого симпатичного подмножества не существует, выведите −1. |
||||
Примеры |
|
"C" Быстрая-пребыстрая сортировка | |||||
---|---|---|---|---|---|
Ограничение по времени | 2 секунды | ||||
Ограничение по памяти | 256 мегабайт | ||||
Вам, должно быть, известен алгоритм быстрой сортировки. Рассмотрим некоторую его вариацию, сортирующую массив без повторяющихся элементов.
function qqsort(A: array of int): array of int if isSorted(A): return A middle = pick(A) aLess = elements of A less then middle aGreater = elements of A greater then middle return qqsort(aLess) + [middle] + qqsort(aGreater) Для сортировки массива делается следующее: сначала проверяется, является ли он уже отсортированным. Если является, дальнейшие действия не требуются. Иначе, выбирается некоторый элемент массива, остальные разбиваются на те, которые меньше его и те, которые больше, после чего запускается сортировка для этих новых массивов. В новых массивах элементы оказываются в том же порядке, в котором они шли в исходном массиве. Функция isSorted(a) проверяет, не отсортирован ли уже переданный ей аргументом массив. Функция pick возвращает некоторый элемент из массива, который ей передается в качестве аргумента. Она может вернуть любой из элементов массива. Известно, что от того, насколько правильно выбран разделяющий элемент, существенно зависит быстродействие сортировки. Соответственно, в зависимости от возвращаемых функцией pick значений, может меняться число действий, которые выполняются во время работы алгоритма. В качестве критерия минимизации будем использовать количество вызовов функции pick. Задан массив из n различных целых чисел от 1 до n. Определите, какого минимального числа вызовов функции pick можно добиться при его сортировке, если при каждом вызове pick разрешается выбрать возвращаемое значение. Например, если требуется отсортировать массив A = [1, 2, 6, 7, 5, 3, 4, 8, 9], то если первый вызов функции pick вернет число 5, массив aLess будет равен [1, 2, 3, 4], а массив aGreater — [6, 7, 8, 9]. Соответственно, рекурсивные вызовы qqsort сразу выйдут, поскольку в них вызовы isSorted вернут true и массив будет отсортирован. Это оптимально, в этом случае функция pick вызывалась лишь 1 раз. | |||||
Формат входных данных |
В первой строке задано количество тестов t. Далее, в 2t строках заданы сами тесты. В первой строке описания теста задано положительное число n — размер массива. Во второй строке задан сам массив ai (1 ≤ ai ≤ n, если i ≠ j, то ai ≠ aj). Суммарный размер массивов во всех тестах не превышает 106. |
||||
Формат выходных данных |
Для каждого теста выведите единственное число — минимальное число вызовов функции pick, которое может быть сделано при его сортировке с помощью функции qqsort. |
||||
Примеры |
|
"D" Робот | |||||
---|---|---|---|---|---|
Ограничение по времени | 2 секунды | ||||
Ограничение по памяти | 256 мегабайт | ||||
Боря участвует в соревновании по программированию роботов. В начальный момент времени робот расположен в левой верхней клетке прямоугольного поля размером n × m клеток. Цель робота — как можно быстрее попасть в правую нижнюю клетку. За один ход робот сначала перемещается из текущей в соседнюю с ней по стороне клетку поля. Каждая клетка покрашена в один из двух цветов: черный или белый. Известно, что левая верхняя и правая нижняя клетки поля покрашены в черный цвет. После каждого хода робота, если он стоит на клетке белого цвета, происходит следующее: равновероятно случайно выбирается одна из белых клеток поля и робот переставляется на нее. В частности, при этом может случиться, что будет выбрана та клетка, на которой и так стоит робот, в этом случае он остается на ней. Боря хочет выиграть соревнование, для этого ему нужно разработать оптимальную стратегию для робота. Ему известна схема поля, где для каждой клетки отмечено черная она, или белая. Теперь он пытается выяснить математическое ожидание числа ходов, которое потребуется роботу для достижения финиша при использовании оптимальной стратегии. Боря хочет знать ответ абсолютно точно, поэтому он пытается получить его в виде несократимой дроби. Помогите ему выяснить искомое математическое ожидание. | |||||
Формат входных данных |
Первая строка содержит целое число t — количество полей. Каждое поле описывается следующим образом. В первой строке записано два целых числа n и m — высота и ширина поля в клетках (1 ≤ n, m ≤ 103). В следующих n строках содержится по m символов. Если символ равен B, то соответствующая клетка черная, а если W, то белая. Суммарное количество клеток во всех полях не превышает 106. |
||||
Формат выходных данных |
Для каждого поля в отдельной строке выведите математическое ожидание числа ходов, необходимых, чтобы добраться из левой верхней клетки в правую нижнюю при оптимальной стратегии. Ответ необходимо вывести в виде несократимой дроби. |
||||
Примеры |
|
"E" Вакцинация | |||||
---|---|---|---|---|---|
Ограничение по времени | 2 секунды | ||||
Ограничение по памяти | 256 мегабайт | ||||
Министерство здравоохранения Байтландии провело масштабное исследование заболеваемости капибарным гриппом среди жителей страны. Учёные выяснили, что иммунитет человека против гриппа характеризуется целым неотрицательным числом. Каждый год 4 января в результате вспышки на Солнце иммунитет каждого человека уменьшается на k. При этом он не может стать отрицательным, если исходный иммунитет был меньше k, то иммунитет становится равен 0. В некоторые годы 2 января в Байтландии проводилась вакцинация всех жителей против гриппа. В результате вакцинации иммунитет каждого человека увеличивался на некоторую величину. В результате каждой вакцинации увеличение иммунитета одинаково для всех жителей, хотя, возможно, эта величина различна для разных вакцинаций. Чтобы лучше изучить болезнь, ученые решили собрать больше статистики. Помогите им вычислить иммунитет некоторых людей в некоторые годы их жизни. Про каждого человека известен год, в который он родился, год, в который необходимо узнать его иммунитет, а также его иммунитет при рождении. Будем считать, что все жители Байтландии родились 1 января соответствующего года, а узнать иммунитет требуется на 3 января. | |||||
Формат входных данных |
Первая строка содержит целое число t — количество тестов. Каждый тест задается следующим образом. В первой строке записано три целых числа n, m и k — количество вакцинаций, количество запросов и величина, на которую уменьшается иммунитет 4 января каждого года в результате солнечной вспышки (1 ≤ n, m ≤ 105, 1 ≤ k ≤ 109). Далее содержится описание вакцинаций: в следующих n строках содержится по два числа — год, в который была проведена вакцинация, а также величина, на которую при этом увеличился иммунитет каждого человека. Гарантируется, что годы приведены в строго возрастающем порядке. В следующих m строках содержится запросы: по три целых числа, обозначающие год рождения человека, год, в который необходимо узнать его иммунитет, а также начальный иммунитет человека. Все числа в тестах неотрицательные и не превышают 109. Гарантируется, что год, в который необходимо узнать иммунитет человека не меньше, чем год его рождения. Суммарное количество вакцинаций во всех тестах не превышает 200 000. Аналогично, суммарное количество людей не превышает 200 000. |
||||
Формат выходных данных |
Для каждого запроса в отдельной строке выведите иммунитет человека в соответствующий год. |
||||
Примеры |
|
"F" Расписание перелетов | |||||
---|---|---|---|---|---|
Ограничение по времени | 4 секунды | ||||
Ограничение по памяти | 256 мегабайт | ||||
Новое расписание рейсов компании BytelandAvia преподнесло сюрприз всем путешественникам, исследующим достопримечательности Байтландии. Как утверждают представители этой компании, с новым расписанием рейсов любой турист сможет быстро и просто определить минимальное количество часов, которое он потратит на перелет из одного города в другой. В Байтландии n городов, и авиакомпания обслуживает m регулярных рейсов, позволяющих добраться, возможно, с несколькими пересадками, из любого Байтландского города в любой другой. Рейс номер i соединяет города с номерами ai и bi и выполняется ровно один раз в сутки, состоящие в Байтландии из p часов. Время полета i-го рейса составляет li часов, а вылетает он в тот момент, когда с начала очередных суток прошло si часов. При этом, все рейсы являются двусторонними, то есть самолет из города ai в город bi и самолет из города bi в город ai вылетают и прилетают одновременно. Известно также, что самолеты летают строго по расписанию, что позволяет путешественнику, прилетевшему в город в некоторый момент времени, успеть на самолет, вылетающий из этого же города в тот же самый момент. При этом расписание рейсов Байтландии удовлетворяет следующему условию. Рассмотрим неориентированный граф, где вершинами являются города, они соединены ребром, если между городами есть прямой рейс. Тогда в этом графе каждая вершина принадлежит не более чем одному простому циклу, такие графы называются вершинными кактусами. Вам необходимо определить минимальное количество часов, которое уйдет у путешественника, пришедшего в начале очередных суток в аэропорт города x, на перелет в город y. Данную задачу требуется решить для нескольких различных путешественников. | |||||
Формат входных данных |
Первая строка содержит количество тестов t. Далее следуют описания тестов. В первой строке описания каждого теста даны целые числа n, m и p (1 ≤ n ≤ 104, 1 ≤ m, 1 ≤ p ≤ 109) — количество городов в стране, количество авиарейсов и продолжительность суток. Следующие m строк содержат описания рейсов. Описание каждого рейса состоит из четырех целых чисел a, b, l и s (1 ≤ a, b ≤ n, a ≠ b, 1 ≤ l ≤ 109, 0 ≤ s < p) — города, соединенные этим рейсом, его продолжительность и время вылета. Гарантируется, что никакая пара городов не соединена двумя и более рейсами. Следующая строка содержит одно целое число c (1 ≤ c ≤ 105) — количество путешественников, для которых необходимо найти минимальную продолжительность их пути. Следующие c строк содержат по два целых числа x и y (1 ≤ x, y ≤ n) — числа, необходимые для генерации номеров городов, которые интересуют очередного путешественника. Очередной путешественник собирается проехать из города ( x + ans - 1) mod n + 1 в город ( y + ans - 1) mod n + 1, где ans — ответ для предыдущего путешественника в этом тесте, если он существует, или же 0 в обратном случае. Гарантируется, что суммарное количество городов во всех тестах не превышает 104, а суммарное количество путешественников — 105. |
||||
Формат выходных данных |
Для каждого путешественника в каждом тестовом наборе выведите одно целое число — минимальное количество часов, которое он может потратить на поездку. |
||||
Примеры |
|