Первый квалификационный раунд
Задача A. Олимпиада.
Идея: Виталий Аксёнов.
Реализация: Виталий Аксёнов.
Разбор: Виталий Аксёнов.
Для того, чтобы решить задачу, можно заметить, что существует оптимальное решение, в котором у всех трёх данных прямоугольников один из углов общий.
Выполним перебор того, как положить каждое поле — вертикально или горизонтально. После того, как мы зафиксировали положение полей, достаточно просто посчитать площадь объединения прямоугольников. Ее можно посчитать следующим образом: S = S1 + S3 + S3 - S12 - S23 - S13 + S123, где Si — площадь i-го прямоугольника, Sij — площадь пересечения двух прямоугольников с номерами i и j, а S123 — площадь пересечения всех трех прямоугольников.
Задача B. Трапецоидная карта и трапеции.
Идея:Виталий Демьянюк.
Реализация:Виталий Демьянюк
Разбор:Виталий Демьянюк.
Обозначим длины меньшей и большей параллельных сторон трапеции за a и b соответственно, а за c — длину боковых сторон. Тогда трапецию можно составить только в том случае, когда a + 2c > b. Перебрав a, b и с, получаем решение за O(n3).
Заметим, что при фиксированном b и возрастающем c, уменьшается минимально возможное a. Будем перебирать b в порядке увеличения и, при фиксированном b, будем перебирать c также в порядке увеличения. При переборе c будем поддерживать указатель на минимально возможное a. Зная b, c, минимально возможное a и использовав простые комбинаторные формулы несложно вычислить количество наборов из четырех отрезков, образующих трапецию с заданными параметрами.
Также, нужно не забыть обработать случаями, в которых a = b, a = c, b = c и аккуратно следить за тем, чтобы в каждой четверке номера отрезков были попарно различными. Итоговая сложность равна O(n2).
Задача C. Хранение млурана.
Идея: Виталий Аксенов.
Реализация: Павел Кротков.
Разбор: Павел Кротков.
Реализуем сначала решение, работающее за линейное время. Будем рассматривать массы изотопов в порядке возрастания, начав с 1. Пусть k — текущее число, а 2t — минимальная степень двойки, большая k. В таком случае:
- если k является степенью двойки или 2t не лежит в множестве «критических чисел», изотоп массы k можно хранить на любом складе
- в противном случае, изотоп массы k можно хранить только на том складе, на котором нет изотопа массы 2t - k
Заметим, что ответ равен 2x + d, где d — количество степеней двойки, не меньших 1 и не больших n, а x — количество таких чисел, не являющихся степенями двойки, что минимальная большая их степень двойки не лежит в множестве «критических чисел». Значит, можно разбить все числа от 1 до n на log 2 n отрезков, границы которых — соседние степени двойки, после чего выбрать нужные отрезки и просуммировать их длины.
Задача D. Защита планеты.
Идея: Виталий Аксёнов.
Реализация: Николай Ведерников.
Разбор: Николай Ведерников.
Рассмотрим каждый метеорит и найдём времена входа и выхода в зону опасности. Для этого в уравнение сферы: x2+y2+z2= R2, подставим уравнение прямой, задающей траекторию движение метеорита, то есть x = x0+dx·t, y = y0+dy·t,z = z0+dz·t. У нас получится квадратное уравнение относительно времени. Корни и будут являться интересующими нас временами. В этой задаче могли возникнуть проблемы с точностью чисел с плавающей точкой, поэтому, если корень уравнения был достаточно близок к целому числу, его необходимо было округлить.
Добавим эти времена к запросам и отсортируем по возрастанию, если время совпадает, то сначала пойдут те времена, которые соответствуют времени входа, затем запросы, а в конце — времена выхода из зоны опасности. Заведем счетчик, который считает то, сколько у нас метеоритов в опасной зоне. Если текущее время — время входа, то увеличиваем его, если это запрос, то записываем ответ на этот запрос, иначе, уменьшаем ответ.
Время работы O((n + m)·log(n + m))
Задача E. Телепорты.
Идея: Анна Малова.
Реализация: Борис Минаев.
Разбор: Борис Минаев.
Для удобства, обозначим количество дорог, которые ведут в город i как сi. Нам, для начала, необходимо определить, существует ли, вообще, эффективный план путешествия. Во-первых, если есть два города i и j такие, что сi ≠ 0 и сj ≠ 0 и не существует пути между i и j, то план мы построить не можем. Следует заметить, что путь может содержать не только дороги, но и телепорты.
Пусть мы уже построили некоторый путь, который проходит через все дороги. Понятно, что для всех городов, которые не соединены телепортами, и которые не являются первым или последним городом на пути, сi должно быть четным. Если же два города i и j соединены телепортом, и они не являются ни первым, ни последним городом на пути, то сi должно быть равно сj.
Рассмотрим, что же происходит с городами, которые лежат на концах пути. Во-первых, если город i соединен телепортом с j и лежит на конце пути, то сi = сj + 1 (кроме случая, когда j также является концом пути). При этом, если путь начинается и заканчивается в городе i, то сi = сj + 2. Если же город не соединен телепортом с другим и находится на одном из концов пути, то его сi может быть нечетным.
В итоге, чтобы проверить существование пути, необходимо сделать следующее. Посчитаем для каждого города некоторую величину ai. Если город i соединен с j телепортом, то ai = max(0, ci - cj). В противном случае, ai = сi mod 2. Если сумма всех ai равна двум или нулю, то путь существует, иначе нет.
Построение плана посещения страны аналогично построению эйлеровго пути в обычном графе. Начинать поиск необходимо с вершины, у которой ai ≠ 0. Если же такой нет, то с любой, у которой сi ≠ 0. При переходе в очередную вершину, если она соединена с другой телепортом, необходимо просто перейти в нее и продолжить поиск пути дальше. Доказательство того, что путь действительно найдется полностью аналогично доказательству существования эйлерового пути в обычном графе.
Итоговая сложность равна O(n + m + k).