1 / 64

Открытая олимпиада

Открытая олимпиада. Разбор задач. Перестроение. Автор задачи: Михаил Густокашин, МГУ Разработчик: Антон Полднев, МГУ. Частичные решения. Только буквы a, b, c (30 баллов). Перебор (30 баллов → 100 баллов). Паросочетания (60 баллов). Простое полное решение.

Download Presentation

Открытая олимпиада

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Открытая олимпиада Разбор задач

  2. Перестроение Автор задачи:Михаил Густокашин, МГУ Разработчик: Антон Полднев, МГУ

  3. Частичные решения • Только буквы a, b, c (30 баллов). • Перебор (30 баллов → 100 баллов). • Паросочетания (60 баллов).

  4. Простое полное решение Предположим, что буквы в строке отсортированы. Тогда можно просто циклически сдвинуть строку на  Соответственно, получим решение для произвольной строки: отсортировать буквы, запомнив их первоначальное положение, сделать циклический сдвиг на затем восстановить испорченный сортировкой порядок символов.

  5. Берляндолимпстрой Автор задачи: Михаил Пядёркин, МГУ Разработчик: Александр Тимин, МФТИ

  6. Постановказадачи • Естьмассивчисел. Онраззаменяетсянамассивсвоихпрефиксныхсумм • В некоторый ненулевой моментмыможемдобавить к какому-нибудьэлементучисло • Необходимо сделать так, чтобы в результатеитоговаясуммаувеличиласьровнона

  7. Решение на 30 баллов • Еслимызнаем,в какой момент и где мыдобавиливеличину, томызнаем, насколькоизмениласьитоговаясумма • Переберем элемент таблицы и значение после этого промоделируем процесс и получим 30 баллов

  8. Решение на60 баллов • От исходных чисел в массиве ничего не зависит, а величина прямо пропорциональна • Переберем момент, в который мы изменим число. Пустьпридобавленииединицыитоговаясуммаизменяетсяна. Тогда, еслиделитсяна, то – кандидатнаответ. • Средивсехтакихкандидатоввыбратьминимальный.

  9. Решениена 60 баллов • Как быстропосчитатьизменениеитоговойсуммыпридобавленииединицы? • В следующиймоментвремени у всехобъектов с не меньшимномеромстоимостьувеличитсяна 1 • Тогдаесли– изменениеитоговойсуммы, вызванноедобавлениемединицы в -тыйэлементмассива в моментвремени, то • Посчитатьэтоможнозаразмер таблицы – аналогично префикснымсуммам

  10. Решениена 100 баллов • Заметим, чтобыстро (экспоненциально)растут, а длятого, чтобыполучитькандидатанаответ, тонадо, чтобыбылонебольшеизменениясуммы • Возможныхпозицийтаких, что, мало. • Таккак> , > , токартинкавыглядиттак • Этопозволяетнамбыстроперебирать: идемснизу-вверх, справа-налево, когдачисло в строкеслишкомбольшое, тозаканчиваемобработкустроки • на самом деле равно

  11. Транспортные потоки Автор задачи: Ивлев Фёдор, МГУ Разработчики: Ахмедов Максим, МГУ Пядёркин Михаил, МГУ

  12. Решение на 20 баллов • Разберёмся, как может происходить изменение порядка следования автобусов • Предположим, автобус, отправлявшийся -ым от первой остановки, приехал на вторую остановку позже, чем надо, например, -ым, где .

  13. Решение на 20 баллов • Оставшиеся автобусы обязаны соблюсти расписание. • Первый из оставшихся автобусов приезжает как можно раньше, и ждёт первого времени, указанного на второй остановке. • Следующий прибывает тоже как можно раньше, и ждёт второго времени, указанного на остановке и так далее. • Необходимо, чтобы для всех от до было верно, что , условия для остальных автобусов выполняются гарантированно.

  14. Решение на 20 баллов. • Тем самым, все автобусы от додолжны успевать приехать на одну позицию раньше своей. • Найдем для каждой позиции из расписания максимальное подходящее – это будет ответ для -ого автобуса, отходящего от первой остановки, который мы обозначим • Общая сложность решения – .

  15. Решение на 40 баллов • Заметим, что массив можно строить за линейное время. • Назовём автобус «тормозящим», если он не успевает приехать на одну позицию раньше по расписанию, т. е. . • Заметим, что равняется такому минимальному , что автобус – «тормозящий», либо , если такого нет. • Находим все «тормозящие автобусы», за один проход строимзначения . • Общая сложность решения – .

  16. Решение на 60 баллов • Назовём для двух соседних остановок массив , построенный в предыдущих решениях, отображением. • Заметим, что выполняется . • Также для верно, что . • Обозначим за []отображение между и остановкой.

  17. Решение на 60 баллов • Для того, чтобы приехать как можно позже -ому автобусу с -ой остановки на -ую, ему нужно между каждой парой соседних остановок опаздывать по максимуму. • Иными словами, его позиция на-ой остановке определяется как • Иными словами, на-ю остановку он может приехать самое позднее -ым. • Картинка на следующем слайде.

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

  19. Решение на 60 баллов • Построим все отображения за время , как описано в решении на 40 баллов. • Ответ на один запрос можно найти за , проходя от -ой остановки до -ой,и считая текущую позицию по правилу . • Общая сложность решения – .

  20. Первое решение на 80 баллов • Задача свелась к тому, чтобы научиться быстро считать значение , где это композиция отображений на полуинтервалеот до . • Воспользуемся методом двоичных подъёмов. Посчитаем вспомогательные отображения –то есть, для каждой остановки посчитаем отображение из неё в остановку на расстоянии . • Это можно сделать по формуле

  21. Первое решение на 80 баллов • Теперь стало возможным отвечать на запрос за время методом двоичных подъёмов: будем перебирать длину очередного прыжка сверху вниз. Если на очередном шаге имеется возможность сделать прыжок, и не выйти при этом за , делаем его. • Время построениявспомогательных отображений – • Ответ на один запрос за время . • Общая сложность –

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

  23. Второе решение на 80 баллов • Дерево отрезков позволяет разбить отрезок на не более отрезков, на каждом из которых мы знаем отображение. Пройдём по ним и возьмём результат композиции этих отображений. • Построение дерева отрезков происходит за . • Ответ на один вопрос за . • Общая сложность решения –

  24. Полное решение • Ответим на все запросыoffline, т. е. разом. • Рассмотрим граф, где вершинами являются записи в расписании, т. е. пары , где – остановка, а – номер автобуса. Проведём ребро из вершины в вершину . • Заметим, что полученный граф выглядит как лес, где рёбра направлены от потомка к предку.

  25. Полное решение • Запрос можно переформулировать как «найти для вершины в лесу её -ого предка». • Структура запросов в пятой группе такова, что мы сразу знаем, какие запросы будут связаны с каждой вершиной. • Обойдём граф в глубину, поддерживая стек вершин. Тогда предок глубины для текущей вершины – это -ая сверху вершина в стеке. • Общая сложность решения – .

  26. Силовое поле Автор: Шестимеров Андрей, МГУ Разработчик: Ахмедов Максим, МГУ

  27. Решение на 30 баллов • Треугольник определяется тремя прямыми, на которых лежат его стороны. • Если на прямой лежат две точки, то на ней лежит сторона треугольника.Найдём эти прямые. • Мы можем посчитать количество точек, лежащих на прямой, как , где и – количество точек слева и справа от прямой. • Переберём все возможные пары точек, в пределах от до . Их, сделаем запрос про каждую прямую и найдем три нужные

  28. Решение на 60 баллов • Научимся проверять за один запрос, расположена ли в точке станция-ретранслятор. С помощью этого проверим все допустимые точки. • Проверить, есть ли в точке станция можно, проведя через точку “косую” прямую, на которой не лежат никакие другие целочисленные точки в квадрате с координатами от до . • Например, такой прямой для точки является прямая через точки и .

  29. Важное соображение • Можно найти -координаты всех точек. • Обозначим заколичество точек справа от вертикальной прямой . • Упорядочим точки по -координате. Обозначим -координату -ой (в нумерации с единицы) точки за . • Очевидно, функция – неубывающая. • Мы можем найти с помощью бинарного поиска по функцииравняется минимальному , удовлетворяющему условию • Тем самым, мы можем найти-координаты всех точек за запросов.

  30. Полное решение №1 • Найдём-координаты и -координаты всех точек. Тем самым по определим точек, среди которых находятся станции-ретрансляторы. Они образуют «сетку» на плоскости. • Станции-ретрансляторы на этой сетке образуют выпуклый многоугольник. Можно попытаться его «обойти» за , найдя при этом все вершины.

  31. Полное решение №1 • Будем обходить точки многоугольника против часовой стрелки. • Найдём с помощью косой прямой самую верхнюю, самую нижнюю, самую левую и самую правую вершину многоугольника. Они разбивают его на четыре дуги. • Стартуем из самой верхней вершины. Вплоть до самой левой вершины многоугольника -координата каждой очередной вершины будет всё меньше и меньше

  32. Полное решение №1 • Понимаем, есть ли на текущей горизонтальной прямой ещё точки слева с помощью косой прямой: пока над косой прямой больше точек, чем над текущей горизонталью, сдвигаемся вправо, иначе – вниз. • Аналогично обойдём оставшиеся три дуги. • Итоговое количество запросов – (в решении жюри ), что не превосходит запросов.

  33. Полное решение №2 • Мы умеем находить -координаты точек, или, что то же самое, проводить через каждую точку вертикальную прямую. • Заметим, что то же самое можно сделать и с косыми прямыми, параллельными вектору • По направлению перпендикулярно вертикальной прямой точки идут в таком же порядке, как и по направлению перпендикулярно косойпрямой. • Значит можно найти -ую точку многоугольника как пересечение -ой найденной вертикальной прямой с -ой найденной косой прямой.

  34. Полное решение №2 • Для бинарного поиска необходимо уметь брать – количество точек справа от -ой по порядку прямой. • Заметим, что раз уравнение такой прямой имеет вид , прямая однозначно задаётся значением , то есть точкой пересечения с координатной осью • Бинпоиск по косым прямым фактически будет бинпоиском по свободному коэффициенту уравнения косой прямой. Зафиксировав очередную прямую надо не забыть выбрать на ней две точки, с координатами от до , для этого нужно положить . Тогда .

  35. Полное решение №2 • Оценим количество запросов. • Количество косых прямых, пересекающих квадрат допустимых точек – , так как каждая прямая задаётся своим свободным коэффициентом в уравнении , а крайние положения прямой – при , где принимает значение порядка . • Тем самым общая сложность решения –.

  36. Небольшое улучшение решения №2 • Можно заметить, что на -ом шаге нас интересуют только косые прямые, пересекающие -ую вертикальную прямую, а их – штук.Бинпоиск по косым прямым можно пускать только среди них. • Получилось решение за , которое при данных ограничениях на и делает запросов.

  37. Соревнованиепораспилу Автор задачи: Глеб Евстропов, МГУ Разработчик: Александр Тимин, МФТИ

  38. Постановказадачи • Пусть обозначает общее число участников в -ом туре, задано • Нужно выбрать такие,что – максимальнои длякаждойпарысоседнихчисел, можновыбрать такиечто, ,

  39. Некотороенаблюдение • , • – делитель • Тоестьколичествоучастниковуменьшаетсякакминимумнаминимальныйделитель • Мы хотим, чтобыбылопроведенокакможнобольшетуров • То естьнамнадопостараться, чтобыучастникивыбываликакможномедленней

  40. Алгоритм • Если то мы можем провести один тур • Пустьу насестьучастников и этоминимальныйнетривиальный делитель • Тогдапроведемтурследующимобразом: подгрупппочеловек, в каждой подгруппе в следующийтур проходят • Выбыло, меньше человек в первом туре выбыть не может

  41. Доказательствокорректностив случае, если – четное • Пустьчетное. Тогдаегоминимальныйделитель – . • Тоесть в следующийтурпроходят человека – четноеколичество. • Общим числом туров (ответом задачи) в этом случае будет являться число. Большебытьнеможет, таккак в каждомтуревыбываеткакминимумдвачеловека.

  42. Доказательствокорректностив случае, если – нечетное • Пустьнечетное. Тогдаегоминимальныйделитель – нечетноечисло. • Тогда в следующийтурпройдетчеловек – четноеколичество • Дальшеколичествоучастниковвсегдачетное • Ответ: • На 100 баллов поискминимальногоделителятребуется производить за корень из

  43. Несостоявшийся программист Автор задачи: Александр Тимин, МФТИ Разработчик: Роман Андреев, СПбГУ

  44. Каждому набору соответствует подпоследовательность цифр числа , обладающая определёнными свойствами. Назовём такую подпоследовательность хорошей. Состоит только из цифр от 1 до 8. Возрастает. Заканчивается в последнем символе. Начинается не в первом символе. Между любыми соседними элементами есть хотя бы одна цифра. После каждого элемента стоит не 0. Число не начинается с нуля.

  45. Пример из условия

  46. — 60 баллов Если равно нулю, то ответ – ноль. Иначе, пусть— количество хороших последовательностей, заканчивающихся в -м элементе. если от 1 до 8, и 0 иначе. Найдём остальные , зная предыдущие. for i = 1..L: x = s[i] if x ≠ 0 and x ≠ 9 and (i = L or s[i + 1] ≠ 0): cnt[i] = (i > 0 and s[1] ≠ 0)? 1 : 0 for j = 1..i-2: if s[j] < x: cnt[i] = (cnt[i] + cnt[j]) modM

  47. — 100 баллов Пусть — общее количество хороших последовательностей, заканчивающихся на позиции или раньше, причём на цифру или меньшую и таких, после которых идёт не 0. Тогда при иот 1 до 8имеем: И, возможно, +1, если и В конце каждого шага насчитываемдля всех от 1 до 8

  48. Две башни Автор задачи: Андрей Шестимеров, МГУ Разработчик: Антон Полднев, МГУ

  49. Насколько большим может быть ответ? Каждая башня отнимает у каждого монстра хотя бы одну жизнь. Следовательно, все монстры с 1 и 2 жизнями умрут, зато каждый монстр с хотя бы 3 жизнями продвинется дальше предыдущего. Значит, оценка сверху на номер первого прорвавшегося монстра — . Тогда оценка на ответ — Например, на тесте 1000 0 500 501 1000 ответ — 3501.

  50. K, D ≤1 000 — 30 баллов Самое простое моделирование. Заведём массив от 0 до , в каждой ячейке которого будем хранить количество жизней монстра. На -м шаге за сдвинем всю армию вправо, в нулевую ячейку пишем . Если в -й ячейке >0, то — это ответ. Иначе для каждой башни за ищем самого правого живого монстра и убавляем ему жизнь. Время работы — .

More Related