Олимпиада по информатике 9–11 классы — заключительный этап ВсОШ 2023/2024: задания и ответы
Официальный комплект заключительного этапа Всероссийской олимпиады школьников по информатике для 9–11 классов (2023/2024 учебный год). Задания и решения с критериями оценивания — скачайте PDF или прорешайте онлайн по тексту ниже.
Задания — текст для прорешивания
Текст извлечён из официального PDF автоматически: формулы, таблицы и рисунки могут отображаться неточно — сверяйтесь с документом выше.
Задания — 1 день
Тридцать шестая всероссийская олимпиада школьников по информатике, первый тур Иннополис, 8 апреля 2024 года
Общая информация по задачам первого тура Задача 1. Беспилотная аэрологистика 2. 2026 3. Кейс на рейс 4. Рамазан и капуста
Тип задачи стандартная стандартная стандартная стандартная
Ограничения 1 с, 512 МБ 2 с, 512 МБ 2 с, 512 МБ 4 с, 1024 МБ
Необходимо считывать данные из стандартного потока ввода. Выходные данные необходимо выводить в стандартный поток вывода. Баллы за подзадачу, если в условии не указано иное, начисляются только если все тесты этой подзадачи пройдены. Решение запускается на тестах для определенной подзадачи, если все тесты всех необходимых подзадач пройдены. Во всех задачах во всех подзадачах во время тура вам показываются баллы за подзадачу, если все тесты пройдены, либо первая ошибка и номер теста. Для некоторых подзадач может также требоваться, чтобы были пройдены все тесты из условия. Для таких подзадач указана дополнительно буква У.
Страница 1 из 14
Тридцать шестая всероссийская олимпиада школьников по информатике, первый тур Иннополис, 8 апреля 2024 года
Задача 1. Беспилотная аэрологистика Ограничение по времени: Ограничение по памяти:
1 секунда 512 мегабайт
На всероссийской олимпиаде по информатике 2224 года, которая проходит в Иннополисе, доставкой занимаются роботы нового поколения, которые способны создавать своих клонов. Доставку можно получить прямо через окно, не выходя из дома. Изначально есть только один робот-доставщик. В любой момент верхний робот может создать одного или нескольких новых роботов прямо над собой. Так образуется колонна роботов. Высота каждого робота равна высоте одного этажа.
В процессе доставки колонна одинаковых роботов-клонов перемещается вдоль корпусов общежития слева направо. В базе данных у роботов содержится список сделанных заказов, для каждого из которых известно окно, в которое его нужно доставить. Когда колонна роботов проходит мимо окна, соответствующего какому-то заказу, она может произвести доставку, если в колонне есть робот, расположенный на уровне окна.
Во время перемещения конструкция из роботов может натолкнуться на препятствие. После препятствия движение продолжают только те экземпляры роботов, которые находились выше препятствия. Они оказываются на земле непосредственно за препятствием, по прежнему в виде вертикальной колонны, и могут продолжать движение, создавать новых клонов и доставлять заказы.
Расстояние между препятствиями и окнами достаточно большое, поэтому во время переезда через препятствие роботы не будут проезжать мимо окна. За доставку одного заказа компания-организатор доставки получает p крипторублей. Стоимость создания одного нового робота равна c крипторублей. Итоговая прибыль равна суммарному доходу от доставки заказов за вычетом суммарной стоимости создания всех роботов. Компания хочет максимизировать свою прибыль. При этом, она не обязана выполнить все заказы, а роботы могут в любой момент остановиться, и прекратить процесс доставки. Определите максимальную прибыль, которую может получить компания. Страница 2 из 14
Тридцать шестая всероссийская олимпиада школьников по информатике, первый тур Иннополис, 8 апреля 2024 года
Формат входных данных В первой строке входных данных находятся четыре целых числа n, m, c, p (0 ⩽ n, m ⩽ 100 000, 1 ⩽ c, p ⩽ 106 ) — количество препятствий, количество заказов в базе, стоимость создания клона робота и стоимость доставки одного заказа, соответственно. В следующих n + m строках идёт описание препятствий и окон, в которые нужно доставить заказы, в порядке следования колонны роботов вдоль общежитий слева направо. Каждая строка содержит два целых числа ti и hi (1 ⩽ ti ⩽ 2, 1 ⩽ hi ⩽ 106 ) — тип объекта ti (1 для препятствия и 2 для окна) и hi — высота препятствия в этажах или этаж, на котором находится окно. Гарантируется, что ровно n объектов имеют тип 1, и оставшиеся m объектов имеют тип 2.
Формат выходных данных Выведите одно число — максимальную величину прибыли, которую можно получить.
Система оценки Подз.
Баллы
Ограничения n
дополнительно
24
n ⩽ 100
m ⩽ 100
hi ⩽ 100
12
n=0
14
n=1
15
17
18
Необх. подзадачи
m=1 c = 1, p = 106 высоты всех препятствий равны 1 У, 1 – 5
Примеры стандартный ввод
стандартный вывод
2 3 2 6 1 2 2 3 1 1 2 6 2 2
1 3 1 5 2 2 2 1 1 9 2 1
Страница 3 из 14
Тридцать шестая всероссийская олимпиада школьников по информатике, первый тур Иннополис, 8 апреля 2024 года
Пояснения к примерам Одна из оптимальных стратегий доставки заказов из первого примера изображена на девяти рисунках ниже, при этом выполнение второго заказа не увеличивает прибыль.
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
Во втором примере достаточно один раз клонировать робота для доставки первого заказа, полученной системой роботов доставить второй заказ, а производить дополнительное клонирование для доставки третьего заказа экономически невыгодно.
Страница 4 из 14
Тридцать шестая всероссийская олимпиада школьников по информатике, первый тур Иннополис, 8 апреля 2024 года
Задача 2. 2026 Ограничение по времени: Ограничение по памяти:
2 секунды 512 мегабайт
Новая татарская игра «2026» ведется на прямоугольной клетчатой доске, состоящей из m строк и n столбцов. Доска разбита на m × n единичных клеток размером 1 × 1. На некоторых клетках стоят квадратные фишки размером 1 × 1, на каждой фишке написана одна из 26 английских букв. С фишками производятся q операций. Каждая операция состоит в перемещении всех фишек до упора в одном из четырех направлений. Таким образом, последовательность операций задается строкой s длины q, состоящей из символов, соответствующих направлениям: «L» — влево, «R» — вправо, «U» — вверх и «D» — вниз. Операция выполняется следующим образом: пока на доске есть хотя бы одна фишка, для которой соседняя с ней в заданном направлении клетка является свободной, эта фишка передвигается на эту соседнюю клетку. Определите, как будет выглядеть доска после выполнения всех операций.
Формат входных данных Каждый тест состоит из нескольких наборов входных данных. В первой строке теста задано целое число t — количество наборов входных данных в тесте (1 ⩽ t ⩽ 200 000). Далее следуют описания наборов входных данных. Каждый набор входных данных описывается следующим образом: В первой строке набора заданы целые числа m и n — размеры доски (1 ⩽ m, n ⩽ 106 , 1 ⩽ m × n ⩽ 106 ). В следующих m строках задано изначальное расположение фишек на доске. В i-й строке (1 ⩽ i ⩽ m) находится строка ai1 ai2 . . . ain длины n, задающая i-ю строку доски. Каждый символ aij является либо строчной буквой английского алфавита от «a» до «z», либо точкой «.». Если aij = «.», то клетка в i-й строке и j-м столбце является пустой, иначе в ней находится фишка, на которой написана буква aij . В последней строке заданы q символов s1 s2 . . . sq без пробелов, задающие последовательность операций (1 ⩽ q ⩽ 106 ). Каждый символ si является одним из символов «L», «R», «U» или «D». Сумма значений m × n по всем наборам входных данных не превышает 2 · 106 . Сумма значений q по всем наборам входных данных не превышает 2 · 106 .
Формат выходных данных Для каждого набора входных данных выведите итоговое расположение фишек на доске после выполнения всех операций в том же формате, что и во входных данных.
Страница 5 из 14
Тридцать шестая всероссийская олимпиада школьников по информатике, первый тур Иннополис, 8 апреля 2024 года
Система оценки P Обозначим через P mnq сумму mnq по всем наборам входных данных. Обозначим через mq сумму mq по всем наборам входных данных. Назовем расположение фишек лестницей, если m = n, aij = «.» для всех 1 ⩽ i ⩽ j ⩽ n и aij 6= «.» для всех 1 ⩽ j < i ⩽ n. Иными словами, все фишки находятся на клетках ниже главной диагонали доски, и на каждой клетке ниже главной диагонали есть фишка. Подзадача
Баллы
Дополнительные ограничения
Необх. подзадачи
t = 1, q = 1, n, m ⩽ 100
13
si 6= «D», si 6= «U» P mnq ⩽ 107
14
si 6= «D»
12
На всех фишках буква «a», P написана 7 mq ⩽ 10
11
На всех фишках написана буква «a»
Изначальное расположение фишек образует лестницу
14
s является строкой «LURD», повторенной несколько раз
11
1–8
Пример стандартный ввод 4 4 4 .a.b ..e. .... .cd. LRU 1 1 . UULLRRDD 1 6 .a.aa. LLURDDD 5 7 .ba.b.. ac..c.d e...... ....da. d.eae.. DLDDRULRRR
стандартный вывод ..ab ..ce ...d .... . ...aaa dceebab ...aeac .....ad ......d .......
Страница 6 из 14
Тридцать шестая всероссийская олимпиада школьников по информатике, первый тур Иннополис, 8 апреля 2024 года
Пояснения к примерам В первом наборе входных данных из примера доска изначально выглядит так:
Первая операция сдвигает все фишки влево, так как s1 = «L». После ее выполнения доска будет выглядеть следующим образом:
Вторая операция сдвигает все фишки вправо, так как s2 = «R». После ее выполнения доска будет выглядеть следующим образом:
Третья и последняя операция сдвигает все фишки наверх, так как s3 = «U». После ее выполнения доска будет выглядеть следующим образом:
Страница 7 из 14
Тридцать шестая всероссийская олимпиада школьников по информатике, первый тур Иннополис, 8 апреля 2024 года
Задача 3. Кейс на рейс Ограничение по времени: Ограничение по памяти:
2 секунды 512 мегабайт
Авиакомпания «Флагманский Флот Татарстана» предлагает в своих самолётах новый вид бизнескласса. Салон самолёта состоит из n мест, расположенных в один ряд вдоль прохода. Введём координатную прямую вдоль салона так, что расстояние между креслами будет равно 1, и места будут иметь координаты от 1 до n. Во время полёта стюарду нужно пройти по самолету и раздать всем пассажирам напитки. Напитки бывают k разных видов, пронумерованных числами от 1 до k. Каждый пассажир получает одну порцию одного напитка, пассажир заказывает предпочитаемый вид напитков при бронировании билета, поэтому все предпочтения пассажиров известны заранее. Напитки разлиты по бутылкам, каждая бутылка вмещает p порций одного напитка. В тележку для напитков можно загрузить не более m бутылок с любыми видами напитков, гарантируется, что m ⩾ k. Пассажиры обслуживаются в порядке возрастания номеров их мест. Первоначально тележка находится в начале салона в точке 0, и её можно заполнить любыми видами напитков перед обслуживанием. После завершения обслуживания тележка должна приехать в точку n + 1. При этом в точках 0 и n + 1 могут находиться кладовые: или одна кладовая в одном из концов салона или две кладовые в двух концах, в которых имеется достаточный запас напитков каждого вида. В этих кладовых можно выгрузить из тележки пустые бутылки и погрузить полные бутылки. По ходу обслуживания напитки будут расходоваться, поэтому время от времени возникает необходимость пополнить запас напитков на тележке в одной из кладовых. Если в текущий момент тележка находится напротив кресла номер i, то для того, чтобы доехать до кладовой в точке 0 необходимо проехать расстояние i, а для того, чтобы доехать до кладовой в точке n + 1 необходимо проехать расстояние n + 1 − i. В кладовых можно выгрузить пустые бутылки из тележки и загрузить на свободные места бутылки с напитками любых видов. Выгружаемые бутылки должны быть пустыми, нельзя выгружать бутылки, в которых остались напитки, или выливать напитки. Нельзя переливать остатки напитков между разными бутылками. Можно загружать на тележку более одной бутылки одного вида. После этого тележка должна проехать расстояние от кладовой до кресла первого необслуженного пассажира, чтобы продолжить обслуживание. Определите, какое минимальное расстояние должна проехать тележка, чтобы переместиться из точки 0 в точку n + 1 и обслужить всех пассажиров.
Формат входных данных Первая строка входных данных содержит четыре целых числа n, m, k, p (3 ⩽ n ⩽ 106 , 1 ⩽ p ⩽ 106 , 1 ⩽ k ⩽ m ⩽ 106 ) — количество мест в салоне, вместимость тележки, количество типов напитков и вместимость каждой бутылки соответственно. В следующей строке содержится целое число c (1 ⩽ c ⩽ 3) — параметр, описывающий наличие кладовых в салоне. Если c = 1, то кладовая находится только в точке n + 1. Если c = 2, то кладовая находится только в точке 0. Если c = 3, то кладовые находятся в обоих концах салона. В следующей строке содержатся n целых чисел ai (1 ⩽ ai ⩽ k) — типы напитков, которые заказали пассажиры.
Формат выходных данных Программа должна вывести одно целое число — минимальное расстояние, которое должна проехать тележка.
Страница 8 из 14
Тридцать шестая всероссийская олимпиада школьников по информатике, первый тур Иннополис, 8 апреля 2024 года
Система оценки Подзадача
Баллы
Ограничения c
Дополнительные ограничения
c=1
n ⩽ 15
k ⩽ 15
c=1
n ⩽ 2000
c=1
c=1
c=2
n ⩽ 15
10
c=2
n ⩽ 2000
c=2
c=2
10
c=3
n ⩽ 15
10
13
c=3
n ⩽ 2000
11
c=3
12
11
c=3
Необх. подзадачи
1 p=1 1, 2, 3 k ⩽ 15 5 p=1 5, 6, 7 k ⩽ 15 9 p=1 9, 10, 11
Примеры стандартный ввод
стандартный вывод
5 2 2 1 1 1 2 1 2 1
14
8 3 2 2 2 1 1 1 1 1 2 2 2
17
8 3 3 2 3 1 2 2 3 2 3 2 1
15
8 6 6 2 2 1 2 3 4 3 5 6 1
7 3 3 1 3 1 2 3 2 2 1 3
16
Пояснения к примерам В первом примере в тележку вмещается m = 2 бутылки по p = 1 порции в каждой. Кладовая находится в конце салона. Первоначально тележку нужно загрузить бутылками с напитками вида 1 и 2, которые будут налиты пассажирам на местах 1 и 2, тележка проедет расстояние 2 от точки 0 до точки 2. После этого тележке нужно будет проехать до кладовой в конце салона (расстояние 4), загрузить тележку бутылками вида 1 и 2 и вернуться к креслу номер 3 (тележка проедет расстояние 3). Пассажирам на местах 3 и 4 выдаются напитки вида 1 и 2 (тележка проезжает расстояние 1 от места 3 до места 4). После этого тележке понадобится ещё раз съездить в кладовую (от кресла 4 до кладовой расстояние 2), вернуться из кладовой до кресла 5 (расстояние 1), и проехать ещё 1 до конца салона. Общее расстояние равно 2 + 4 + 3 + 1 + 2 + 1 + 1 = 14. Страница 9 из 14
Тридцать шестая всероссийская олимпиада школьников по информатике, первый тур Иннополис, 8 апреля 2024 года Во втором примере в тележку вмещаются m = 3 бутылки по p = 2 порции в каждой. Кладовая находится в начале салона. Необходимо загрузить тележку тремя бутылками вида 1, обслужить пассажиров на местах с номерами от 1 до 4. После этого опустошатся две бутылки вида 1, нужно будет сразу съездить в кладовую, чтобы загрузить две бутылки вида 2, затем обслужить пассажиров на местах с номерами от 5 до 8. В третьем примере в тележку вмещаются m = 3 бутылки по p = 2 порции в каждой, кладовые находятся в обоих концах салона. Для обслуживания пассажиров нужны две бутылки вида 2 и по одной бутылке видов 1 и 3, поэтому понадобится один раз съездить в кладовую для того, чтобы заменить пустую бутылку вида 2 на полную. Это лучше сделать после обслуживания пассажира на месте 3, тележка должна съездить в кладовую в начале салона. В четвёртом примере в тележку нужно загрузить по одной бутылке каждого вида, и поскольку каждая бутылка вмещает по две порции напитков, это позволит обслужить всех пассажиров без дополнительного пополнения тележки. В пятом примере понадобится два пополнения тележки, один раз тележке придётся вернуться в кладовую в начало салона после обслуживания пассажира 3, второй раз — в конец салона после обслуживания пассажира 6.
Страница 10 из 14
Тридцать шестая всероссийская олимпиада школьников по информатике, первый тур Иннополис, 8 апреля 2024 года
Задача 4. Рамазан и капуста Ограничение по времени: Ограничение по памяти:
4 секунды 1024 мегабайта
Рамазан решил заняться серьезным бизнесом — выращиванием капусты. y Поле для выращивания капусты представляет собой бесконечное клетчатое поле. В каждой клетке поля может быть посажен один кочан капусты. Рамазан засадил только часть поля. Он запланироyiR вал использовать несколько прямоугольных участков поля, причём оказалось, что некоторые из них могут переyiL секаться. Клетка поля принадлежит посадкам, если она лежит хотя бы в одном из прямоугольников. Формально, Рамазан выбрал n прямоугольных участ1 L L R R L R L R ков (xi , yi , xi , yi ) (xi ⩽ xi , yi ⩽ yi , 1 ⩽ i ⩽ n). x 1 Клетка (x, y) содержит капусту, если существует хотя бы xL xR i i один выбранный прямоугольник i (1 ⩽ i ⩽ n), такой что R L R xL i ⩽ x ⩽ xi и yi ⩽ y ⩽ yi . В прошлом Рамазан был программистом (и победителем), поэтому он решил использовать роботов с искусственным интеллектом для периодической обработки посадок. Один робот может обслуживать произвольный горизонтальный участок клеток (xrobot , xrobot , y robot ), то есть все клетки 1 2 robot robot robot (x, y), такие что x1 ⩽ x ⩽ x2 иy=y . Важно, чтобы роботы ездили только по участкам с посадками. Он понял, что для минимизации количества роботов важно использовать горизонтальные участки, которые нельзя расширить. , xrobot , y robot ), если: Рамазан будет использовать робота на участке клеток (xrobot 1 2 • Все клетки (x, y), такие что xrobot ⩽ x ⩽ xrobot и y = y robot принадлежат посадкам; 1 2 • Клетка (xrobot − 1, y robot ) не принадлежит посадкам; 1 • Клетка (xrobot + 1, y robot ) не принадлежит посадкам. 2 Ваша задача собрать важную статистику о роботах, которые будут работать на плантации. Будем говорить, что пара (x1 , x2 ) обслуживается в ряду y, если существует робот, работающий ровно на участке (x1 , x2 , y). • Найдите все пары (x1 , x2 ), которые обслуживаются в каком-нибудь ряду. • Для каждой такой пары (x1 , x2 ) найдите количество рядов, в которых она обслуживается. • Для каждой такой пары (x1 , x2 ) найдите максимальное количество подряд идущих рядов, в которых она обслуживается. Другими словами, найдите максимальное число k, такое что существует отрезок k подряд идущих рядов [y1 , y2 ] (y2 − y1 + 1 = k), такой что для любого ряда y1 ⩽ y ⩽ y2 , пара (x1 , x2 ) обслуживается в ряду y.
Формат входных данных Каждый тест состоит из нескольких наборов входных данных. В первой строке дано одно целое число t (1 ⩽ t ⩽ 200 000) — количество наборов входных данных. Далее следуют описания наборов входных данных. В первой строке каждого набора входных данных дано единственное целое число n (1 ⩽ n ⩽ 200 000) — количество выбранных прямоугольных участков. L R R L R 9 В следующих n строках дано по четыре целых числа xL i , yi , xi , yi (1 ⩽ xi ⩽ xi ⩽ 10 , 1 ⩽ yiL ⩽ yiR ⩽ 109 ) — описания выбранных прямоугольных участков. Обозначим за N сумму n по всем наборам входных данных в одном тесте. Гарантируется, что N ⩽ 200 000. Страница 11 из 14
Тридцать шестая всероссийская олимпиада школьников по информатике, первый тур Иннополис, 8 апреля 2024 года
Формат выходных данных Для каждого набора входных данных сначала выведите единственное целое число p (p ⩾ 1) — количество пар (x1 , x2 ), которые обслуживаются в каком-нибудь ряду. В следующих p строках выведите по четыре целых числа x1 , x2 , cnt, k (1 ⩽ x1 ⩽ x2 ⩽ 109 , 0 ⩽ cnt, k ⩽ 109 ). Число cnt должно быть равно количеству рядов, в которых обслуживается пара (x1 , x2 ). Число k должно быть равно максимальному количеству подряд идущих рядов, в которых обслуживается пара (x1 , x2 ). Все пары (x1 , x2 ) должны быть различны. Каждая пара, которая обслуживается в каком-нибудь ряду, должна быть выведена ровно один раз. Можно вывести пары в произвольном порядке.
Система оценки n
Для набора входных данных обозначим за w ширину поля, то есть w = max xR i , за h высоту i=1
поля, то есть h = max yiR . i=1
Ограничения дополнительно
Необх. подзадачи
t ⩽ 100
Подз.
Баллы
N ⩽ 3000
У, 3
N ⩽ 10 000
У, 3, 5
R все [xL i , xi ] пересекаются
yiL = 1
прямоугольники не пересекаются
10
∀1 ⩽ i, j ⩽ n ∀y ∈ [yiL , yiR ] ∩ [yjL , yjR ] выполнено R L R [xL , i xi ] * [xj , xj ]
1, 9
11
все отрезки R [xL i , xi + 1] либо вложены, либо не пересекаются
12
N ⩽ 50 000
У, 3, 5 – 6
13
N ⩽ 100 000
У, 3, 5 – 6, 12
14
N ⩽ 200 000
У, 1 – 13
n, N
w, h
n=1 h=1 n ⩽ 30, N ⩽ 3000
w, h ⩽ 10
У, 3
Pw, h ⩽ 5000, 6 wh ⩽ 25 · 10
• Если для теста ваше решение неправильно находит множество пар (x1 , x2 ), которые обслуживаются в каком-нибудь ряду, решение получает вердикт «Неправильный ответ». • Если во всех тестах подзадачи и необходимых подзадач решение
Страница 12 из 14
Тридцать шестая всероссийская олимпиада школьников по информатике, первый тур Иннополис, 8 апреля 2024 года – правильно находит множество, но не все cnt верны, оно получает 50% баллов за подзадачу. – правильно находит множество и все cnt, но не все k верны, оно получает 75% баллов за подзадачу. – правильно находит множество, все cnt и все k, оно получает 100% баллов за подзадачу. Обратите внимание, что для получения частичных баллов за подзадачу, все равно необходимо вывести какие-нибудь значения cnt и k для каждой пары (x1 , x2 ), но не обязательно верные.
Пример стандартный ввод
стандартный вывод
4 2 2 2 3 3 3 3 4 4 2 2 1 2 3 1 2 3 2 4 2 2 4 5 3 4 9 7 2 9 9 10 7 1 9 7 7 2 1 2 9 5 1 6 8 4 5 7 6 1 8 4 10 1 6 3 6 1 2 7 3 4 1 7 1
3 2 3 1 1 2 4 1 1 3 4 1 1 2 1 3 1 1 2 2 2 1 4 2 4 2 2 2 9 4 2 3 9 2 2 7 9 3 3 6 1 4 2 2 1 6 1 1 1 7 3 2 2 2 4 2 4 7 2 1 5 6 2 1
Пояснения к примерам Первый и второй наборы входных данных для теста из условия
y 4 3
1 1
В первом наборе входных данных будут использоваться роботы на участках (2, 3, 2), (2, 4, 3), (3, 4, 4). Таким образом, пары (2, 3), (2, 4), (3, 4) обслуживаются в каком-нибудь ряду, причем каждая из них обслуживается ровно в одном ряду. Во втором наборе входных данных будут использоваться роботы на участках (2, 2, 1), (2, 4, 2), (2, 2, 3). Таким образом, пары (2, 2), (2, 4) обслуживаются в каком-нибудь ряду. Пара (2, 2) обслуживается в рядах 1, 3, пара (2, 4) обслуживается ряду 2. Страница 13 из 14
Тридцать шестая всероссийская олимпиада школьников по информатике, первый тур Иннополис, 8 апреля 2024 года Третий и четвертый наборы входных данных для теста из условия y
10
10
1 1
Страница 14 из 14
Задания — 2 день
Тридцать шестая всероссийская олимпиада школьников по информатике, второй тур Иннополис, 10 апреля 2024 года
Общая информация по задачам второго тура Задача 5. Восстание газонокосилок 6. Интерактивные переходы 7. Гонка дронов 8. За связь без перебоев
Тип задачи стандартная стандартная стандартная стандартная
Ограничения 1 с, 512 МБ 1 с, 512 МБ 2 с, 512 МБ 3 с, 512 МБ
Необходимо считывать данные из стандартного потока ввода. Выходные данные необходимо выводить в стандартный поток вывода. Баллы за подзадачу, если в условии не указано иное, начисляются только если все тесты этой подзадачи пройдены. Решение запускается на тестах для определенной подзадачи, если все тесты всех необходимых подзадач пройдены. Во всех задачах во всех подзадачах во время тура вам показываются баллы за подзадачу, если все тесты пройдены, либо первая ошибка и номер теста. Для некоторых подзадач может также требоваться, чтобы были пройдены все тесты из условия. Для таких подзадач указана дополнительно буква У.
Страница 1 из 13
Тридцать шестая всероссийская олимпиада школьников по информатике, второй тур Иннополис, 10 апреля 2024 года
Задача 5. Восстание газонокосилок Ограничение по времени: Ограничение по памяти:
1 секунда 512 мегабайт
Газоны в Иннополисе косят электрические роботы-газонокосилки. Будем считать, что газон представляет собой отрезок числовой прямой, на котором в некоторых точках расположены роботыгазонокосилки. Размером роботов можно пренебречь. Один из роботов стоит в начале газона (левее него газона нет), и один — в конце (правее него газона нет). Каждый робот изначально ориентирован в одном из двух направлений: либо направо, либо налево.
Заряда i-го робота хватает для обработки pi метров газона. После ночной зарядки все роботы начинают работать одновременно и движутся с одинаковой скоростью. Каждый робот движется в своём направлении вдоль прямой. Робот останавливается в одном из трёх случаев: 1. Если у робота закончился заряд. Иными словами, если i-й робот проехал pi метров от точки старта. 2. Если робот доехал до начала или конца газона. 3. Если робот встретился в одной точке с другим роботом, который двигался ему навстречу или остановился в этой точке ранее. Перед запуском роботов вы можете поменять направление некоторых из них на противоположное. Требуется скосить траву на всём газоне. Определите, у какого минимального количества роботов нужно поменять направление, чтобы в итоге вся трава на газоне оказалась скошена. Иначе сообщите, что всю траву скосить невозможно.
Формат входных данных В первой строке содержится целое число n (2 ⩽ n ⩽ 105 ) — количество роботов. В следующих n строках содержатся описания роботов в порядке их расположения на прямой слева направо. Каждый робот характеризуется тремя целыми числами xi , pi , di : начальной позицией робота, количеством метров, которые он может проехать, и направлением движения (0 = x1 < x2 < . . . < xn ⩽ 109 , 1 ⩽ pi ⩽ 109 , значение di = −1 обозначает движение налево, в направлении уменьшения координаты, di = 1 обозначает движение направо, в направлении увеличения координаты). Начало и конец газона находятся в точках x1 = 0 и xn соответственно.
Формат выходных данных В единственной строке необходимо вывести −1, если скосить всю траву на газоне невозможно. Иначе, нужно вывести одно число — количество роботов, у которых нужно изменить направление на противоположное, чтобы газон был скошен.
Страница 2 из 13
Тридцать шестая всероссийская олимпиада школьников по информатике, второй тур Иннополис, 10 апреля 2024 года
Система оценки Ограничения
Подз.
Баллы
23
16
17
13
xi = i − 1, pi = 1
14
pi = 109
17
без дополнительных ограничений
дополнительно
Необх. подзадачи У
n ⩽ 10 изначально все роботы ориентированы направо (di = 1)
У, 1
n ⩽ 1000
У, 1 – 5
Примеры стандартный ввод
стандартный вывод
3 0 1 -1 1 1 1 2 1 -1
2 0 1 1 4 2 -1
-1
Пояснения к примерам Первый пример изображен на рисунке. Для того, чтобы скосить всю траву, можно, например, развернуть робота, который стоит посередине.
Страница 3 из 13
Тридцать шестая всероссийская олимпиада школьников по информатике, второй тур Иннополис, 10 апреля 2024 года
Задача 6. Интерактивные переходы Ограничение по времени: Ограничение по памяти:
1 секунда 512 мегабайт
Кампус Иннополиса состоит из n корпусов, соединённых m переходами. Каждый переход соединяет два различных корпуса, никакие два корпуса не соединены более чем одним переходом. Известно, что каждый корпус имеет подсветку, которая может быть включена или выключена. Изначально подсветка всех корпусов выключена. Диспетчер кампуса может за одно действие включить или выключить подсветку любого корпуса. Диспетчер может также нажимать кнопку включения подсветки, если она уже включена, или нажимать кнопку выключения, если она выключена. Данные действия не приводят к изменению состояния подсветки корпуса. Аналогично, каждый переход имеет подсветку, которая может быть включена или выключена. Исходно подсветка всех переходов выключена. Однако в отличие от подсветки корпусов, подсветка переходов изменяется автоматически: если после очередного действия диспетчера состояние подсветки соединённых переходом корпусов оказывается одинаковым, то подсветка перехода также переходит в это состояние, а иначе она не меняется. Другими словами, если после очередного действия диспетчера подсветка обоих корпусов, соединённых переходом, оказывается выключена, то подсветка перехода также выключается. Если подсветка обоих корпусов, соединённых переходом, оказывается включена, то подсветка перехода также включается. Если подсветка одного из корпусов оказывается включена, а другого — выключена, то состояние подсветки перехода не меняется. Перед приездом участников олимпиады по информатике директор кампуса для каждого корпуса и каждого перехода определил, должен ли этот корпус или переход быть подсвечен. Проверьте, может ли диспетчер выполнить пожелание директора, выполнив произвольное число действий. Если это возможно, то найдите любую такую последовательность действий. Решения, корректно определяющие возможность получить желаемое состояние подсветки, но не предъявляющие искомую последовательность действий, будут получать частичные баллы.
Формат входных данных Каждый тест содержит один или несколько наборов входных данных. В первой строке теста задано целое число t — количество наборов входных данных в тесте (1 ⩽ t ⩽ 50 000). Далее следуют описания наборов. Каждый набор описывается следующим образом. В первой строке заданы целые числа: n — количество корпусов, и m — количество переходов (1 ⩽ n ⩽ 105 , 0 ⩽ m ⩽ 2 · 105 ). В следующих m строках следуют описания переходов. В i-й строке находятся целые числа ai , bi , ci — номера корпусов, соединённых i-м переходом, и требуемое состояние подсветки i-го перехода, соответственно (1 ⩽ ai , bi ⩽ n, ai 6= bi , 0 ⩽ ci ⩽ 1). Если ci = 0, то подсветка i-го перехода в результате должна быть выключена, а если ci = 1, то включена. В последней строке заданы n целых чисел d1 , d2 , . . . , dn — требуемое состояние подсветки корпусов (0 ⩽ di ⩽ 1). Если dv = 0, подсветка корпуса v в итоге должна быть выключена, а если dv = 1, то включена. Сумма значений n по всем наборам входных данных не превышает 105 . Сумма значений m по всем наборам входных данных не превышает 2 · 105 .
Формат выходных данных Для каждого набора входных данных: • Если не существует последовательности действий, получающей требуемое состояние подсветки корпусов и переходов, то выведите «NO». • Если последовательность действий существует, то выведите «YES». Если вы не хотите предъявлять саму последовательность действий, то выведите в следующей строке число −1 и перейдите к следующему набору входных данных. Если вы хотите предъявить последовательность действий, то выведите в следующей строке целое число s — количество действий (0 ⩽ s ⩽ 106 , Страница 4 из 13
Тридцать шестая всероссийская олимпиада школьников по информатике, второй тур Иннополис, 10 апреля 2024 года сумма значений s по всем наборам входных данных не должна превышать 106 ), а в следующих s строках выведите сами действия. В i-й строке (1 ⩽ i ⩽ s) выведите два целых числа: vi — номер корпуса, в котором изменяется состояние подсветки, и xi — новое состояние подсветки (1 ⩽ vi ⩽ n, 0 ⩽ xi ⩽ 1, если xi = 0, то подсветка корпуса vi выключается, если xi = 1, то подсветка корпуса vi включается).
Система оценки Обозначим за N сумму значений n во всех наборах входных данных в одном тесте, за M — сумму значений m во всех наборах тестовых данных в одном тесте. Если решение выводит неправильную последовательность действий на одном из тестов подзадачи, то оно получает 0 баллов за подзадачу. Если на хотя бы одном тесте подзадачи решение выводит −1 и на каждом тесте подзадачи выводит либо верную последовательность действий, либо −1, то оно получает половину баллов за подзадачу. Если на каждом тесте подзадачи решение выводит верную последовательность действий, то оно получает полный балл за подзадачу. Подз.
Баллы
Ограничения
Необх. подзадачи
N, n
M, m
Дополнительные ограничения
n⩽3
t ⩽ 230
10
N ⩽ 2000
M ⩽ 2000
n + m ⩽ 14
ci = 1
m = n − 1, ai = 1, bi = i + 1
dai = ci , ai < bi
N ⩽ 2000
m = n − 1, ai = i, bi = i + 1
m = n − 1, ai = i, bi = i + 1
10
N ⩽ 2000
m = n − 1, из любого корпуса можно добраться до любого другого по переходам
m = n − 1, из любого корпуса можно добраться до любого другого по переходам
4, 6–8
10
m = n, ai = i, bi = i%n + 1
11
10
N ⩽ 2000
M ⩽ 2000
2, 6, 8
12
18
1–11
Страница 5 из 13
Тридцать шестая всероссийская олимпиада школьников по информатике, второй тур Иннополис, 10 апреля 2024 года
Пример стандартный ввод
стандартный вывод
5 4 4 1 2 0 2 3 1 3 4 0 2 4 1 0 1 0 0 4 4 1 2 0 2 3 1 3 4 0 4 1 1 0 1 0 1 1 0 1 1 0 0 2 1 1 2 0 0 0
YES 5 4 1 3 1 2 1 3 0 4 0 NO YES 1 1 1 YES 1 1 0 YES 0
Пояснения к примерам В примере из условия пять тестовых наборов данных. В первом наборе даны 4 корпуса, обозначенных кружками, и 4 перехода, обозначенных линиями. Наличие подсветки корпуса или перехода обозначено жирной линией. Получить нужную подсветку можно за 5 действий. На рисунках ниже изображены начальное состояние подсветки и состояние после каждого действия. 1
Во втором наборе нужно получить следующую конфигурацию из 4 корпусов и 4 переходов, но сделать это невозможно. 1
В третьем наборе один корпус, в котором нужно включить подсветку. Это можно сделать за одно действие.
Страница 6 из 13
Тридцать шестая всероссийская олимпиада школьников по информатике, второй тур Иннополис, 10 апреля 2024 года В четвёртом примере один корпус, в котором подсветка должна быть выключена. Возможной последовательностью действий является единственное действие выключения подсветки в корпусе. Это является корректной действием, несмотря на то, что подсветка уже была выключена. В пятом примере два корпуса и один переход, подсветка везде должна быть выключена. Пустая последовательность действий является корректной последовательностью, приводящей к такой конфигурации.
Страница 7 из 13
Тридцать шестая всероссийская олимпиада школьников по информатике, второй тур Иннополис, 10 апреля 2024 года
Задача 7. Гонка дронов Ограничение по времени: Ограничение по памяти:
2 секунды 512 мегабайт
В Иннополисе проводятся гонки дронов. В гонке могут принять участие n дронов, i-й дрон пролетает единицу расстояния за ti секунд. Гонка проводится на прямой, на которой расположены m ворот, пронумерованных от 1 до m, i-е ворота находятся на расстоянии si от стартовой позиции гонки. В гонке примут участие первые k дронов с номерами от 1 до k. Величину k судьи объявляют непосредственно перед гонкой, поэтому вам необходимо проанализировать гонку для всех k от 1 до n. Гонка проводится следующим образом. Дроны начинают движение из точки 0 в сторону ворот, каждый со своей скоростью. У каждого дрона есть точка восстановления — последние ворота, в которых он выполнял сохранение позиции. Изначально точка восстановления каждого дрона — точка 0. Дроны каждый раз начинают двигаться из своих точек восстановления и продолжают движение, пока один или несколько дронов не оказываются в точке, где расположены ворота (возможно, различные для разных дронов). В этот момент среди всех дронов, которые оказались в каких-либо воротах, выбирается дрон с наименьшим номером. Для этого дрона производится сохранение позиции, его точка восстановления переносится в его текущую позицию. Остальные дроны мгновенно телепортируются в свои точки восстановления. После этого гонка продолжается таким же образом. Как только дрон сохраняет позицию в последних воротах с номером m, он финиширует. Не финишировавшие пока дроны, как обычно, телепортируются в свои точки восстановления и продолжают гонку. Когда все дроны финишируют, гонка завершается. Телепортация — очень энергоемкий процесс. Для подготовки к гонке необходимо понять, сколько суммарно телепортаций совершат все дроны до её завершения. Обозначим как ck суммарное число телепортаций, которое совершат все дроны, если в гонке будут участвовать первые k дронов. Найдите значения c1 , c2 , . . . , cn .
Формат входных данных В первой строке даны два целых числа n и m — количество дронов и ворот, соответственно (2 ⩽ n ⩽ 150 000, 1 ⩽ m ⩽ 150 000). Во второй строке даны n положительных целых чисел t1 , t2 , ..., tn , где ti — количество секунд, за которое i-й дрон пролетает единицу расстояния (1 ⩽ ti ⩽ 109 ). В третьей строке даны m положительных целых чисел s1 , s2 , ..., sm , где si — позиция i-х ворот на прямой (1 ⩽ s1 < s2 < . . . < sm ⩽ 150 000).
Формат выходных данных Выведите n целых чисел c1 , c2 , . . . , cn .
Страница 8 из 13
Тридцать шестая всероссийская олимпиада школьников по информатике, второй тур Иннополис, 10 апреля 2024 года
Система оценки Подз.
Баллы
Ограничения Доп. ограничения
Необх. подзадачи
ti , si
n=2
m ⩽ 50
ti , si ⩽ 100 000
n ⩽ 50
m ⩽ 50
ti , si ⩽ 100 000
У, 1
13
n ⩽ 1000
m⩽5
ti , si ⩽ 100 000
n ⩽ 100 000
m ⩽ 100 000
ti , si ⩽ 100 000
si+1 − si = s1 для всех 1⩽i<m
n ⩽ 100 000
m ⩽ 100 000
ti , si ⩽ 100 000
все ti равны
10
n ⩽ 100
m ⩽ 100 000
ti , si ⩽ 100 000
n ⩽ 100 000
m ⩽ 100 000
ti ⩽ 2, si ⩽ 100 000
n ⩽ 100 000
m=2
ti , si ⩽ 100 000
n ⩽ 10 000
m ⩽ 100 000
ti , si ⩽ 100 000
У, 1 – 3, 6
10
n ⩽ 50 000
m ⩽ 100 000
ti , si ⩽ 100 000
У, 1 – 3, 6, 9
11
n ⩽ 100 000
m ⩽ 100 000
ti , si ⩽ 100 000
У, 1 – 10
12
n ⩽ 100 000
13
У, 1 – 2
У, 1 – 11
без дополнительных ограничений
У, 1 – 12
Примеры стандартный ввод
стандартный вывод
3 3 1 2 3 1 3 6
0 4 11
3 3 3 2 1 1 3 6
0 5 13
2 5 2 1 1 3 4 6 7
0 6
Страница 9 из 13
Тридцать шестая всероссийская олимпиада школьников по информатике, второй тур Иннополис, 10 апреля 2024 года
Пояснения к примерам Рассмотрим первый пример. Если k = 1, то телепортаций не происходит. Если k = 2, то гонка происходит следующим образом. На рисунках показаны моменты, когда дроны оказываются в воротах и происходит телепортация.
1 телепортация
+1 телепортация, итого 2
+1 телепортация, итого 3
дрон 1 финишировал
+1 телепортация, итого 4
дрон 2 финишировал Страница 10 из 13
Тридцать шестая всероссийская олимпиада школьников по информатике, второй тур Иннополис, 10 апреля 2024 года Если k = 3, то гонка происходит следующим образом. На рисунках показаны моменты, когда дроны оказываются в воротах и происходит телепортация.
2 телепортации
+2 телепортации, итого 4
+2 телепортации, итого 6
дрон 1 финишировал
+2 телепортации, итого 8
+1 телепортация, итого 9
+1 телепортация, итого 10
дрон 2 финишировал
+1 телепортация, итого 11
дрон 3 финишировал
Страница 11 из 13
Тридцать шестая всероссийская олимпиада школьников по информатике, второй тур Иннополис, 10 апреля 2024 года
Задача 8. За связь без перебоев Ограничение по времени: Ограничение по памяти:
3 секунды 512 мегабайт
Вдоль прямой дороги, на которой происходят испытания беспилотных грузовиков, расположены n городов, i-й город находится в точке, имеющей координату i. В i-м городе установлена антенна мощностью ai , покрывающая все города от Li = max (1, i − ai ) до Ri = min(n, i + ai ) включительно. Беспилотный грузовик перемещается вдоль дороги от города s к городу t, где s < t. В каждом городе по пути следования грузовик подключён к одной из антенн. Подключение к антеннам происходит следующим образом. • В начальном городе грузовик подключается к антенне, покрывающей этот город, у которой значение Ri максимально. Если таких антенн несколько, выбирается любая из них. • После перемещения грузовика из города v в город v + 1, если антенна, к которой он был подключен в городе v, покрывает также и город v + 1, грузовик остаётся подключен к этой антенне. Иначе, если антенна, к которой он был подключён, не покрывает город v +1, грузовик переподключается к антенне, покрывающей город v +1, для которой значение Ri максимально. Если таких антенн несколько, выбирается любая из них. Обозначим как f (s, t) количество переподключений между антеннами для грузовика, который начинает свой маршрут в городе s и заканчивает свой маршрут в городе t (s < t). Начальное подключение к антенне в городе s переподключением не считается. Нестойкостью покрытия дороги антеннами назовем сумму значений f (s, t) по всем допустимым парам городов, то есть величину n−1 n X X F = f (s, t). s=1 t=s+1
В распоряжении оператора дороги есть одна запасная антенна с мощностью x. Для снижения нестойкости покрытия можно заменить одну из антенн на запасную. Требуется определить минимальное значение нестойкости покрытия дороги F , если не более одной антенны можно заменить на запасную антенну мощности x.
Формат входных данных Первая строка содержит два целых числа n и x (1 ⩽ n ⩽ 106 , 0 ⩽ x ⩽ n) — количество городов и мощность запасной антенны. Вторая строка содержит n целых чисел a1 , a2 , . . . , an (0 ⩽ ai ⩽ n) — мощности антенн.
Формат выходных данных Выведите минимальное возможное значение нестойкости покрытия дороги, если не более одной антенны можно заменить на запасную антенну мощности x.
Страница 12 из 13
Тридцать шестая всероссийская олимпиада школьников по информатике, второй тур Иннополис, 10 апреля 2024 года
Система оценки Ограничения
Необх. подзадачи
Подзадачи
Баллы
n ⩽ 100
n ⩽ 500
У, 1
n ⩽ 5000
У, 1, 2
12
ai = 0
16
ai ⩽ 1
14
n ai ⩾ 20
32
ai
x=0
5 У, 1 – 7
Примеры стандартный ввод
стандартный вывод
3 1 1 0 0
5 0 2 1 0 0 1
Пояснения к примерам В первом примере мы можем заменить вторую антенну на запасную. Тогда грузовик, стартующий в любой точке, будет подключаться к ней и переподключаться никакому грузовику не понадобится. Во втором примере использовать запасную антенну не нужно. Грузовикам, стартующим в одном из первых трёх городов и финиширующим в одном из двух последних городов придётся один раз переподключиться к последней антенне, поэтому нестойкость покрытия дороги равна 6.
Страница 13 из 13
Ответы и решения — показать
Официальные ответы и критерии оценивания жюри. Сначала решите задания самостоятельно.
Решения — 1 день
Тридцать шестая всероссийская олимпиада школьников по информатике Иннополис, 6-11 апреля 2024
Задача 1. Беспилотная аэрологистика Автор: Разработчик:
Алексей Михненко Алексей Михненко
Подзадача 1. Замечание: всегда выгодно создать всех роботов в самом начале. В первой задаче это позволяет перебрать количество роботов, которые в итоге будут созданы, и просимулировать процесс. Поскольку никогда не выгодно создавать роботов больше, чем суммарная высота перегородок плюс максимальная высота робота, такой перебор можно реализовать за O(n3 h) или за O(n2 h), где h — максимальная высота. Подзадача 2. Во второй подзадаче n = 0 (то есть нет препятствий). Отсортируем точки по высоте. Тогда по замечанию из первой подзадачи заказы будут доставлены в какой-то префикс окон. Допустим, мы доставим заказы в k окон и k-е по высоте окно находится на высоте h. Тогда итоговая прибыль будет равна kp − c(h − 1). Параметр k можно перебрать и получить решение за O(n log n) из-за сортировки массива. Подзадача 3. В третьей подзадаче n = 1 (то есть есть ровно одно препятствие). Заметим, что когда роботы встречают препятствие, вместо того, чтобы блокировать часть из них, мы можем считать, что все роботы продолжают движение, но высоты всех окон становятся больше на высоту этого препятствие. Таким образом, можно увеличить высоты всех окон после первого препятствие на его высоту и свести задачу к предыдущей подзадаче. Получаем решение за O(n log n). Подзадача 4. В четвёртой подзадаче m = 1. Заметим, что для каждого окна можно легко вычислить минимальное количество роботов, которое необходимо создать, чтобы заказ был доставлен. Чтобы сделать это эффективно, нужно к высоте окна прибавить суммарную высоту препятствий до него. Поскольку окно только одно, надо либо не создавать новых роботов, либо создать минимальное количество роботов, чтобы доставить заказ в это окно. Это можно реализовать O(n). Подзадача 5. В пятой подзадаче прибыль от доставки заказов сильно больше, чем стоимость создания новых роботов. Нетрудно видеть, что в этой задаче всегда выгодно P создать минимальное количество роботов, чтобы все заказы были доставлены, так как p > c hi . Аналогично предыдущей подзадаче, для каждого окна можно найти минимальное количество роботов, которых достаточно, чтобы заказ был доставлен. Вычисляя максимум по этим значениям, мы получим наименьшее число клонирований, необходимое, чтобы выполнить все заказы. После этого достаточно просимулировать процесс, описанный в задаче, с таким изначальным количеством клонов. Данное решение можно реализовать за O(n log n). Подзадача 6. Полное решение можно получить, объединив предыдущие идеи. Из третьей подзадачи следует, что все перегородки можно удалить, увеличив при этом высоты всех окон за ними. После удаления перегородок задача сводится ко второй подзадаче. Таким образом, задачу можно решить за O(n log n).
Страница 1 из 11
Тридцать шестая всероссийская олимпиада школьников по информатике Иннополис, 6-11 апреля 2024
Задача 2. 2026 Авторы: Разработчик:
Николай Будин, Иван Сафонов, Тихон Евтеев Валерий Родионов
В подзадаче 1 ограничения на m и n маленькие и q = 1, поэтому достаточно промоделировать выполнение одной операции за время O(min(n, m) max(n, m)2 ). В подзадаче 2 все операции двигают фишки либо влево, либо вправо. Можно заметить, что в этом случае нас интересует только последнее выполненное движение, поэтому снова достаточно промоделировать одну операцию, но в этой и следующих подзадачах это уже требуется делать за время O(mn). В подзадаче 3 ограничение на сумму mnq по всем тестам маленькое, поэтому можно просто промоделировать все операции. В подзадаче 4 нет операций, двигающих фишки вверх. Здесь можно заметить, что после первого движения вверх все фишки «прижмутся» к верху доски, поэтому можно удалить все операции типа «U», кроме самой первой, так как они не будут менять расположение фишек. Теперь единственная операция типа «U» разбивает последовательноть операций на два блока, состоящих только из операций «L» и «R», которые мы научились быстро обрабатывать в подзадаче 2. В подзадачах 5 и 6 подзадаче все буквы, написанные на фишках, совпадают, поэтому фишки можно считать неразличимыми. Пусть si — первая операция, двигающая фишки в направлении, перпендикулярном s1 . Заметим, что после применения последовательности операций s1 s2 . . . si (ее можно быстро промоделировать с помощью решения подзадачи 2) расположение фишек будет образовывать «неровную лестницу» (не путать с лестницей из 7 подзадачи), то есть они будут прижаты к одному углу таблицу. После этого расположение фишек будет однозначно задаваться количеством фишек в каждой строке и стороной, к которой они прижаты, и будет сохранять такую форму после каждой операции. В подзадаче 5 достаточно моделировать операции с расположением фишек таком формате за O(mq). В подзадаче 6 нужно дополнительно заметить, что расположение фишек не меняется с точностью до угла таблицы, к которому прижаты все фишки, то есть существует всего четыре возможных расположения фишек, поэтому обрабатывать одну операцию можно за O(1). В следующих подзадачах нам понадобится процесс, который мы назовем упрощением последовательности операций. Он будет основываться на следующих фактах: 1. Пусть si и si+1 двигают фишки в одном или противоположных направляниях. Тогда по наблюдению из подзадачи 2 операцию si можно удалить и ответ не изменится. 2. Пусть si и si+2 совпадают, а si+1 двигает в одном из двух перпендикулярных si направлений. Тогда операцию по наблюдению из подзадачи 3 операцию si+2 можно удалить и ответ не изменится. Упрощение будет заключаться в последовательном применении этих двух фактов для удаления ненужных операций, пока это возможно. Этот процесс можно реализовать с помощью линейного прохода со стеком за O(q). Легко видеть, что после упрощения последовательность операций будет иметь период длины 4, равный «LURD» или отличающийся от него поворотом или отражением. В подзадаче 8 упрощение уже сделано, поэтому там его можно пропустить. Для простоты будем считать, что q делится на 4. Чтобы получить полное решение, достаточно просто честно выполнить остаток, состоящий из не более чем 3 операций. Также будем считать, что период равен «LURD», так как все остальные получаются из него поворотом или отражением доски. Назовем комбинированной операцией последовательность из четырех операций «LURD». Упрощенная последовательность операций будет состоять из q/4 комбинированных операций. В подзадаче 7 расположение фишек образует лесенку. Выполним первую комбинированную операцию, после нее лесенка прижмется к правому нижнему углу. Далее каждая комбинированная операция будет крутить лесенку по часовой стрелке, каждый раз возращая ее в в изначальное положение в правом нижнем углу, но возможно переставляя местами фишки, составляющие лесенку. Порисовав этот процесс на бумаге, можно заметить, что каждые три последовательных комбинированных операции возрвращают все фишки в изначальное положение. Таким образом, взяв колиСтраница 2 из 11
Тридцать шестая всероссийская олимпиада школьников по информатике Иннополис, 6-11 апреля 2024 чество комбинированных операций по модулю 3, можно свести задачу к применению не более чем двух комбинированных операций. Для полного решения нужно заметить, что каждая комбинированная операция, кроме первой (которую нужно выполнить отдельно, чтобы прижать все фишки к углу) сохраняет множество клеток доски, на которых стоят фишки. Заменим буквы на фишках на различные целые числа от 1 до k, где k — количество фишек. Промоделируем одну комбинированную операцию и найдем для каждой фишки, на какую позицию она переходит после применения одной комбинированной операции. Получим перестановку p, которая применяется к расположению фишек после выполнения каждой комбинированной операции. Тогда найти финальное расположение фишек можно, применив перестановку p к расположению фишек q/4 − 1 раз. Для этого можно использовать бинарное возведение в степень. Получаем полное решение за O(nm log q).
Задача 3. Кейс на рейс Автор: Разработчик:
Елена Андреева Владимир Новиков
Данная задача может быть разделена на три независимых задачи с разными c. Решения могут быть разделены на те, которые пользуются позицией кладовых и те, для которых позиция кладовой не имеет значения. Также несложно заметить, что при k ⩽ m решение всегда существует. Группы 1, 2, 3, 4. c = 1 В данной подгруппе существует простое жадное решение. Будем идти слева направо и поддерживать множество бутылок. Бутылки будут принадлежать к одному из типов: пустые, частично заполненные и без фиксированного типа напитка. Когда мы будем переходить к следующему пассажиру мы будем рассматривать несколько случаев. Если у нас есть частично заполненная бутылка с нужным видом напитка, то мы нальем пассажиру напиток из этой бутылки. Если же нужного типа нет, то для какой-то из бутылок без фиксированного типа напитка мы скажем, что она заполнена этим типом напитка. Такое решение будет ездить к кладовой только в самый поздний из моментов времени, когда это необходимо. Формальное доказательство можно получить из решений на следующие подгруппы, но мы его приводить не будем. Группы 1, 2, 3, 4. c = 2 Решение для c = 2 аналогично решению подгруппам с c = 1. Единственным отличием является то, что мы запускаем аналогичный жадник, но обрабатываем массив в порядке с последнего элемента до первого. Группы 1, 5, 9. n ⩽ 15, k ⩽ 15 Переборное решение не отличается для разных c, поэтому будет набирать неплохие баллы. В этой подгруппе нужно зафиксировать те позиции, на которых мы будем ездить до кладовых. После фиксации позиций для каждой из них можно выбрать ближайшую из кладовых. Остается проверить, что для этого фиксированного набора позиций возможно заполнить бутылки на кладовых таким образом, что все пассажиры будут обслужены. Это можно сделать одним линейным проходом. После поездки на кладовую мы можем все пустые бутылки пометить «свободными». Если же при дальнейшем проходе нам понадобится взять какой-то из напитков, для которого не существует непустой бутылки, мы возьмем «свободную» бутылку и скажем, что она заполнена этим напитком. Такое решение будет работать за O(n · 2n ) или O((n + k) · 2n ) в зависимости от реализации. Группа 3, 7, 11. p = 1 Для данных подгрупп достаточно заметить, что каждый раз тележке выгодно покрывать отрезок последовательных сидений. Для подгрупп 3, 7 задачу можно решить формулой, либо жадным образом обрабатывать первые или последние m пассажиров в зависимости от того, покрытие какого отрезка будет дешевле. Более общим решением будет следующий подход: для каждой позиции i мы можем покрыть отрезок пассажиров с номерами от i до i + m − 1 включительно за стоимость поездки тележки от позиции i до какой-то из существующих станций. Тогда задача сводится к следующей: дано множество отрезков, нужно выбрать подмножество минимальной стоимости, чтобы любой из пассажиров
Страница 3 из 11
Тридцать шестая всероссийская олимпиада школьников по информатике Иннополис, 6-11 апреля 2024 принадлежал хотя бы к одному из выбранных отрезков. Так как множество отрезков имеет линейный размер данная задача может быть решена за O((n + m) log n) с помощью структур данных. Также данную задачу можно решить с помощью алгоритма дейкстры. Добавим ребра, соответствующие отрезкам, чтобы они вели из вершины с номером l до вершины с номером r со стоимостью равной стоимости взятия отрезка пассажиров с номерами от l до r и обратные ребра из вершины с номером i + 1 до вершины с номером i стоимости 0. Кратчайшее расстояние от вершины 1 до вершины n + 1 будет ответом на задачу. Множеством взятых отрезков будет множество ребер, соответствующих отрезкам, которые встретились нам на кратчайшем пути. Таким образом данную подгруппу можно решать за O(n log n) с помощью дейкстры. Группа 2, 6, 10. n ⩽ 2000 В данной подгруппе будем использовать метод аналогичный подгруппе p = 1. Заметим, что для любого префикса у нас фиксированны остатки количеств порций каждого напитка по модулю p. Для любой границы l посчитаем дальнюю позицию rl , что мы можем обслужить всех пассажиров на данном отрезке при предположении, что на момент времени l все бутылки пустые, кроме бутылок заполненных остатками по модулю p. Такие бутылки у нас будут обязательно присутствовать вне зависимости от стратегии, так как мы обязаны обслужить всех пассажиров. Данное значение легко посчитать для каждой позиции l за O(n) аналогичным проходом тому, который использовался в переборной подгруппе. Теперь заметим следующий факт, в случае, если мы можем обслужить пассажиров на отрезке l до r с предположением описанным выше, то мы можем обслужить и пассажиров на отрезке от l до r − 1 за ту же стоимость. Тогда мы сводим задачу к задаче покрытия массива отрезками минимальной стоимости, которую мы уже научились решать за O(n log n). Итоговая асимптотика: O(n2 ). Полное решение. Для полного решения достаточно научиться искать границы rl за линейное время. Для этого заметим, что в случае, если мы можем обслужить пассажиров на отрезке от l до r с предположением выше, то мы также можем обслужить пассажиров на отрезке от l + 1 до r с таким же предположением. Это наталкивает нас на мысль, что границы можно искать двумя указателями. Корректная реализация работает за O(n log n) и получает полный балл.
Задача 4. Рамазан и капуста Автор: Разработчик:
Иван Сафонов Иван Сафонов
Краткое описание задачи: задана фигура на клетчатой плоскости, которая является объединением n прямоугольников. Разрежем фигуру по строкам. Найти множество различных отрезков x координат, которое получится, если спроецировать на ось x полученные кусочки. Также для каждого отрезка нужно найти, в скольки строках он встречается и в каком максимальном количестве строк подряд он встречается. R R L В первой подзадаче n = 1. Ответом является один отрезок [xL 1 , x1 ] с двумя числами y1 − y1 + 1. Во второй подзадаче h = 1. Заметим, что каждый прямоугольник это просто отрезок и мы должны найти множество отрезков, являющихся объединениями данных отрезков. Это можно сделать, например, с помощью scanline по x за O(n log n). В третьей подзадаче все ограничения очень маленькие. Можно просто в таблице размера w × h пометить все клетки фигуры и затем найти все отрезки. Любое полиномиальное решение проходило. В четвертой подзадаче w, h ⩽ 5000. Заметим, что можно в таблице размера w × h пометить все клетки фигуры за O(n + wh). Для этого можно, например, прибавить на n прямоугольниках единичку (что делается с помощью префиксных сумм). Затем найти все отрезки можно за O(wh). Далее, чтобы избавиться от очень больших координат, можно сделать сжатие координат за O(n log n). В пятой подзадаче n ⩽ 3000. Вместе со сжатием координат можно сделать такое же решение, как в прошлой подзадаче и получить решение за O(n2 ).
Страница 4 из 11
Тридцать шестая всероссийская олимпиада школьников по информатике Иннополис, 6-11 апреля 2024 В шестой подзадаче n ⩽ 10000. В этой подзадаче можно сделать квадратичное решение, но нужно экономить память. Заметим, что вместо вычисления клеток фигуры, можно делать сканлайн по y и поддерживать массив — «сколькими прямоугольниками сейчас накрыта клетка?» Чтобы вычислять ответ, хочется использовать хеш таблицу, ключами в которых будут отрезки x-ов. Однако можно вместо нее сделать один двумерный массив, который будет хранить индексы отрезков. Время O(n2 ), память O(n) или O(n2 ) с маленькой константой. Далее идут подзадачи со специальными условиями. R В седьмой подзадаче все отрезки [xL i , xi ] пересекаются. Заметим, что это означает, что в каждой строке есть не более одного отрезка. Будем делать сканлайн по y и поддерживать min и max x координаты текущих прямоугольников. Таким образом, решение работает за O(n log n). В восьмой подзадаче yiL = 1. Это означает, что фигура имеет вид гистограммы, лежащей на земле. Можно с помощью scanline найти эту гистограмму и вывести ответ. Решение работает за O(n log n). В девятой подзадаче прямоугольники не пересекаются. Давайте будем делать scanline по y и поддерживать в std::set множество не расширяемых отрезков x, которые находятся в текущей строке. R При добавлении или удалении прямоугольника, нужно добавить или удалить кусочек [xL i , xi ] в строке. Множество отрезков при этом можно несложно обновлять. Таким образом, можно следить за изменением множества не расширяемых отрезков x и считать ответ. Решение работает за O(n log n). В десятой подзадаче никакая строка прямоугольника не накрывает другую строку прямоугольника. Как и в прошлой подзадаче будем делать scanline по y и поддерживать в std::set множество не расширяемых отрезков. В этой подзадаче отличается только способ обновления этого множества при добавлении или удалении отрезка в строке. Это обновление чуть сложнее, но его так же можно сделать с помощью нескольких lower_bound в сетах или в ДО. Все подзадачи с доп. условиями можно сдать с помощью одного на всех похожего scanline. Поддерживаем множество не расширяемых отрезков и обновляем его. Чтобы делать обновления без специальных условий (таких как, например, в девятой или десятой подзадачах) можно просто поддерживать в ДО массив: сколькими прямоугольниками сейчас накрыта x координата? В этом ДО происходят −1/ + 1 на отрезке, также нужно находить первый элемент равный 0 и первый элемент > 0 на отрезке. Можно показать, что в подзадачах 7, 8, 9, 10 количество изменений множества в процессе scanline будет O(n), поэтому решение работает за O(n log n). Почему это решение не является полным? Рассмотрим такой пример «сеточки»: n2 длинных горизонтальных прямоугольников и n2 длинных вертикальных прямоугольников, которые пересекаются в виде сетки. Если мы будем делать scanline по y, то множество отрезков будет n2 раз изменяться из множества размера 1 в множество размера n2 и потом обратно, поэтому такой scanline будет слишком медленным. Исходя из этого возникает следующий вопрос. А почему ответ вообще маленький? У жюри есть не доказанная гипотеза, что ответ имеет размер ⩽ 3n. Жюри умеет строить пример, в котором √ размер ответа 3n − O( n).
Страница 5 из 11
Тридцать шестая всероссийская олимпиада школьников по информатике Иннополис, 6-11 апреля 2024
Пример теста, в котором в пределе ответ стремится к 3n
Рассмотрим доказательство того, что ответ имеет размер ⩽ 2n log2 n. Мы можем посмотреть на R задачу под таким углом: на отрезке y-ов [yiL , yiR ] добавляется отрезок x-ов [xL i , xi ]. Для всех y-ов мы изучаем какие существуют не расширяемые отрезки x-ов. Тогда мы можем применить технику DCP offline на массиве y-ов! Тогда нам нужно уметь только добавлять отрезок. При добавлении создается не более одного нового не расширяемого отрезка, но возможно удаляется много. Но тогда заметим, что за всю историю DCP offline будет создано ⩽ 2n log2 n кандидатов на расширяемые отрезки, поэтому ответ имеет размер ⩽ 2n log2 n. Это доказательство можно доделать до решения за O(n log2 n), если хранить отрезки в декартовом дереве и обновлять его при добавлении нового отрезка внутри DCP offline. Также нужно уметь прибавлять константу в дереве, для этого нужно использовать ленивые обновления. Однако, поскольку это решение имеет большую константу, оно скорее всего не может пройти на полный балл, а также нельзя поддерживать четвертый параметр для каждого отрезка.
Полное решение Для полного решения давайте делать scanline по x. Текущую координату назовем тоже xcur . Слева и справа от текущей прямой scanline x = xcur есть какие-то гистограммы. Рассмотрим два массива hR [y] и hL [y] — x координаты концов столбиков в строке y справа и слева от прямой scanline. Как они изменяются? L R L • Для hR [y] нам нужно делать max= значением xR i на отрезке [yi , yi ] в момент времени xcur = xi . Также, чтобы было выполнено, что hR [y] ⩾ xcur нужно после этого сделать max= значением xcur на всем ДО. L R L • Для hL [y] нам нужно делать set значением xL i на отрезке [yi , yi ] в момент времени xcur = xi . Заметим, что так у нас будут корректные значения hL [y] только для накрытых сейчас y-ов, но нам это подойдет.
Будем хранить массив hR [y] в ДО. Базовые операции, которые мы будем выполнять это max= на отрезке и min на отрезке. Чтобы уметь выполнять эти операции, нам нужно использовать технику Segment Tree Beats (можно изучить Part 1 в https://codeforces.com/blog/entry/57319), которая поддерживает минимум и второй минимум для отрезков ДО. Как теперь считать ответ? Что значит, что в координате x = xcur в строке y сейчас образуется не расширяемый отрезок? • Во-первых должен быть прямоугольник i, такой что yiL ⩽ y ⩽ yiR и xcur = xR i . Страница 6 из 11
Тридцать шестая всероссийская олимпиада школьников по информатике Иннополис, 6-11 апреля 2024 • Во-вторых после всех обновлений hR [y] в этой координате, должно быть выполнено, что hR [y] = xcur , то есть значение на самом деле равно глобальному минимуму во всем массиве. Рассмотрим все прямоугольники, заканчивающиеся в xcur и рассмотрим объединение отрезков [yiL , yiR ] для них. Это будет множество непересекающихся отрезков. Зафиксируем такой отрезок [l, r]. Теперь мы хотим обновить ответ всеми y, такими что l ⩽ y ⩽ r и hR [y] = xcur . Второе условие по-другому означает, что hR [y] равно минимуму на отрезке и минимум равен xcur . Посмотрим, какая информация нам нужна, чтобы для всех y на отрезке [l, r], в которых сейчас достигается минимум, выделить: • Множество значений hL [y] для них. • Для каждого из них количество y в которых это значение достигается. • Информацию про подряд идущие y. Давайте также в нашем ДО хранить такие величины: для всех y, для которых hR [y] равно минимуму: • Минимальное значение hL [y]. Максимальное значение hL [y]. • Дополнительно по всем таким hL [y] в которых у нас минимум этих величин хранить: их количество и 3 числа для вычисления второго параметра отрезков (это будет длина максимального префикса, суффикса и отрезка подряд идущих y-ов). Эту информацию можно объединять. Также ее можно пересчитывать при запросах set на отрезке массива hL с помощью ленивых обновлений. Чтобы теперь выделять отрезки, давайте будем спускаться в ДО на отрезке [l, r], до тех пор, пока не получим отрезок, в котором: • Минимум значений hR [y] все еще равен xcur . • По всем y в которых достигается минимум hR [y], минимальное значение hL [y] равно максимальному значению hL [y] (критерий того, что все элементы равны). Это означает, что на текущем отрезке ДО все отрезки [hL [y], hR [y]] одинаковые! Значит мы можем остановить спуск и добавить в ответ информацию об этих отрезках. В предположениях на линейность размера ответа можно оценить, что данное решение работает за O(n log n). Детали подсчета максимальных подряд идущих y-ов усложняют написание полного решения, поэтому можно было сделать решение только с количеством и получить 75 баллов. Чтобы проще осознать полное решение, нужно понять главную идею: в ДО мы можем хранить некоторую информацию по всем позициям, в которых достигается минимум. Эта информация в данном случае достаточно сложная, однако логика пересчета и ее проталкиваний такая же, как если бы это было бы просто, например, количество.
Страница 7 из 11
Решения — 2 день
Тридцать шестая всероссийская олимпиада школьников по информатике Иннополис, 6-11 апреля 2024 • Во-вторых после всех обновлений hR [y] в этой координате, должно быть выполнено, что hR [y] = xcur , то есть значение на самом деле равно глобальному минимуму во всем массиве. Рассмотрим все прямоугольники, заканчивающиеся в xcur и рассмотрим объединение отрезков [yiL , yiR ] для них. Это будет множество непересекающихся отрезков. Зафиксируем такой отрезок [l, r]. Теперь мы хотим обновить ответ всеми y, такими что l ⩽ y ⩽ r и hR [y] = xcur . Второе условие по-другому означает, что hR [y] равно минимуму на отрезке и минимум равен xcur . Посмотрим, какая информация нам нужна, чтобы для всех y на отрезке [l, r], в которых сейчас достигается минимум, выделить: • Множество значений hL [y] для них. • Для каждого из них количество y в которых это значение достигается. • Информацию про подряд идущие y. Давайте также в нашем ДО хранить такие величины: для всех y, для которых hR [y] равно минимуму: • Минимальное значение hL [y]. Максимальное значение hL [y]. • Дополнительно по всем таким hL [y] в которых у нас минимум этих величин хранить: их количество и 3 числа для вычисления второго параметра отрезков (это будет длина максимального префикса, суффикса и отрезка подряд идущих y-ов). Эту информацию можно объединять. Также ее можно пересчитывать при запросах set на отрезке массива hL с помощью ленивых обновлений. Чтобы теперь выделять отрезки, давайте будем спускаться в ДО на отрезке [l, r], до тех пор, пока не получим отрезок, в котором: • Минимум значений hR [y] все еще равен xcur . • По всем y в которых достигается минимум hR [y], минимальное значение hL [y] равно максимальному значению hL [y] (критерий того, что все элементы равны). Это означает, что на текущем отрезке ДО все отрезки [hL [y], hR [y]] одинаковые! Значит мы можем остановить спуск и добавить в ответ информацию об этих отрезках. В предположениях на линейность размера ответа можно оценить, что данное решение работает за O(n log n). Детали подсчета максимальных подряд идущих y-ов усложняют написание полного решения, поэтому можно было сделать решение только с количеством и получить 75 баллов.
Задача 5. Восстание газонокосилок Авторы: Разработчик:
Азат Сафиуллин, жюри Николай Будин
В подзадаче 1 ограничение на n маленькое, что позволяет написать перебор направления каждого робота за O(2n ) и проверить за O(n): покроют ли они в таком состоянии весь газон. Получаем решение за O(2n · n). В подзадаче 2 все роботы изначально направлены в правую сторону, следовательно, ответом будет 0, если все отрезки между ближайшими роботами будут покрыты. Иначе мы обязаны в каждом
Страница 7 из 11
Тридцать шестая всероссийская олимпиада школьников по информатике Иннополис, 6-11 апреля 2024 таком непокрытом до конца отрезке поменять направление правого робота и проверить покрытие всего загона. Получаем решение за O(n). Заметим, что, после того как мы поменяли направления, не должно быть случая, когда два идущих подряд робота направлены в разные стороны. Поскольку отрезок между ними не будет покрыт. Таким образом, направления роботов должны иметь вид: 1, 1, ..., 1, 1, −1, −1, ..., −1, −1. В подзадаче 3 можно перебрать самого левого робота i, который в итоге будет направлен в левую сторону, и посчитать (количество dj = −1 для j < i) + (количество dj = 1 для i ⩽ j). Также надо проверить, что после перенаправления каждый отрезок будет покрыт. Получаем решение за O(n2 ). В подзадаче 4 и 5 для каждого робота заряда хватает для того, чтобы покрыть левый или правый отрезок. Идея такая же, как и в 3 подзадаче, только нужно оптимизировать подсчет поворотов. Это можно посчитать заранее линейными проходам с начала и с конца. Получаем решение за O(n). Для полного решения достаточно оптимизировать 3 подзадачу. Как говорилось выше, посчитать количество поворотов можно заранее линейными проходами. Это же можно применить для проверки покрытия префикса и суффикса. Получаем решение за O(n).
Задача 6. Интерактивные переходы Автор: Разработчики:
Валерий Родионов Валерий Родионов, Владимир Новиков
Перепишем задачу на язык графов: корпуса — это вершины графа, а переходы — неориентированные ребра. Если подстветка на корпусе выключена, то покрасим вершину в белый цвет, а если включена, то в черный. Изначально все вершины и ребра покрашены в белый цвет (подстветка на всех корпусах и переходах выключена), а переключение подстветки на корпусе будет соответствовать перекраске вершины и последующей перекраске всех ребер, у которых концы имеют одинаковые цвета. В подзадачах 1 и 2 ограничения на n и m маленькие, поэтому их можно сдать перебором различной степени эффективности. В подзадаче 2 предполагалось решение, которое строит граф на 2n+m возможных раскрасках и ищет в нем путь из полностью белой раскраски в требуемую обходом в глубину или ширину за O(2n+m nm). В подзадаче 3 все ci = 1, то есть нужно покрасить все ребра в черный цвет. Заметим, что если у какого-то ребра оба конца покрашены в белый цвет, то и оно само будет покрашено в белый цвет, поэтому если существует такое ребро, то ответ точно «NO» ( это условие является необходимым, поэтому во всех следующих подзадачах будем считать, что оно выполненоЮ иначе сразу выведем «NO»). В противном случае ответ «YES» и получить требуемую покраску можно с помощью следующего алгоритма: сначала покрасим все вершины в черный цвет (после этого все ребра станут черными), после чего перекрасим каждую вершину в требуемый цвет. В подзадаче 4 граф представляет собой звезду. Снова заметим, что если у ребра цвета концов совпадают, а цвет ребра не совпадает с цветом концов, то ответ «NO». Покрасим каждое ребро по очереди в нужный цвет, перекрасив оба его конца в этот цвет, после чего перекрасим все вершины в цвета из итоговой покраски. В подзадаче 5 все ребра удовлетворяют условиям dai = ci и ai < bi , то есть если ориентировать все ребра в направлении увеличения номера вершины, то цвет каждого ребра будет совпадать с цветом левой вершины. Тогда работает следующий алгоритм: будем перебирать вершины в порядке увеличения номера, пусть сейчас мы перебираем вершину v. Тогда покрасим v и все вершины, в которые из v выходят ребра, в цвет dv . Легко видеть, что после таких действий все исходящие из v ребра будут иметь правльный цвет и никогда его не изменят. В подзадачах 6 и 7 граф представляет собой один простой путь. Легко видеть, что работает такой алгоритм: в порядке следования по пути покрасим каждое ребро в требуемый цвет, после чего в обратном порядке покрасим каждую вершину в требуемый цвет. В подзадачах 8 и 9 граф представляет собой дерево. Посмотрим на любой лист, то есть вершину, с которой соединено ровно одно ребро. Если его требуемый цвет совпадает с требуемым цветом соединенного с ним ребра, то по рассуждению из предыдущей подзадачи мы можем покрасить это ребро в нужный цвет и оно навсегда его сохранит, поэтому можно удалить лист и соединенное
Страница 8 из 11
Тридцать шестая всероссийская олимпиада школьников по информатике Иннополис, 6-11 апреля 2024 с ним ребро. Если требуемый цвет листа не совпадает с требуемым цветом соединенного с ним ребра, то цвет ребра совпадает с цветом другого конца. Тогда сначала мысленно удалим этот лист и покрасим оставшееся дерево, после чего вернем лист, покрасим его в противоположный требуемому цвет (теперь ребро, соединенное с этим листом, станет правильного цвета), после чего покрасим его в требуемый цвет. В 10 подзадаче граф представляет собой цикл. Если на цикле есть ребро, цвета концов которого совпадают, то это ребро будет иметь правильный цвет независимо от наших действий, поэтому можно его удалить и свести задачу к пути. Значит цвета вершин на пути чередуются. Для вершину u обозначим через tu номер последней операции, изменившей цвет вершины u. Пусть есть ребро uv, такое, что du 6= dv и cuv = du . Тогда tu < tv , там как в противном случае ребро имело бы другой цвет. Тогда если цвета ребер на цикле чередуются, то мы получим, что для любой вершины u на цикле выполняется tu < tu , то есть требуемой последовательности операций не существует. В противном случае существует вершина, из которой выходит или входит два ребра и по рассуждению, похожему на использованное в подзадачах с деревом, эту вершину можно удалить и снова свести задачу к решению для пути. Подзадача 11 сделана для неэффективных реализаций полного решения. В подзадаче 12 дополнительных ограчений нет. Если есть ребро, у которого цвета концов совпадают, то оно либо покрашено в тот же цвет (в этом случае его можно удалить), либо в противоположный цвет (в этом случае можно сразу вывести «NO»). После этого ориентируем все ребра, как в 10 подзадаче. Мы уже доказали, что если в графе появится цикл, то ответ «NO». В противном случае у вершин графа сущесвует топологическая сортировка. Перенумеруем вершины в соответствии с этой сортировкой и получим, что покраска удовлетворяет всем условиям подзадачи 5, которую мы уже умеет решать.
Задача 7. Гонка дронов Авторы: Разработчики:
Азат Сафиуллин, Иван Сафонов Иван Сафонов, Азат Сафиуллин
В первой подзадаче n = 2. Достаточно пройтись двумя указателями по двум массивам, двигая указатель того дрона, который пролетает следующее расстояние быстрее (учитывая индексы дрона). O(m) Во второй подзадаче достаточно запустить гонку для каждого префикса k. Заводим k указателей и двигаем указатель того дрона, который проходит быстрее остальных (учитывая индексы). Получаем решение за O(n3 · m). Для решения третьей подзадачи достаточно оптимизировать поиск дрона, который пролетит следующий отрезок быстрее всех. Это можно сделать простым Set. O(n2 · m · log(n)) В четвертой подзадаче расстояния между точками равны. Очевидно, что первым в гонке все расстояния подряд пролетит дрон с минимальной скоростью. Вторым пролетит дрон с минимальной скоростью из оставшихся и так далее. Таким образом, ответ можно вычислить формулой (k−1)·k·m , 2 где k - текущий префикс. В пятой подзадаче все скорости равны. Зафиксируем p — индекс левого вхождения максимального расстояния между ближайшими точками. Очевидно, что все отрезки левее p имеют длину меньше. Поэтому в гонке будет момент, когда все дроны соберутся в точке p. Поскольку никакой дрон не может пролететь отрезок максимальной длины быстрее, чем какой-то дрон, который находится левее p. Понятно, что, как только какой-то дрон пролетит максимальное расстояние, он будет лететь до конца непрерывно. А это эквивалентно решению подзадачи 4. То ответ для префикса k . будет равен (p − 1) · k · (k − 1) + (k−1)·k·(m−p+1) 2 Обратим внимание на рекорды слева направо в строго возрастающем порядке. Нетрудно понять, что при преодолении дроном какого-то рекорда, он же продолжит непрерывно лететь до следующего, поскольку до следующего рекорда будут встречаться отрезки не больше текущего рекорда. Таким образом, можно «сжать» количество отрезков, определив за каждым рекордом количество √ не больших отрезков за ним. Нетрудно доказать, что количество рекордов не больше sm . В шестой подзадаче n ⩽ 100. Сожмем до рекордов. Запустим решение на подзадачу 3. Получаем
Страница 9 из 11
Тридцать шестая всероссийская олимпиада школьников по информатике Иннополис, 6-11 апреля 2024 √ решение за O(n2 · sm · log(n)). В седьмой подзадаче не более 2 различных скоростей. Будем поддерживать ответ на префиксе. Когда добавляется новый дрон, достаточно добавить к ответу количество телепортаций, которое совершит этот дрон и количество вынужденных телепортаций других дронов, которые были созданы новым дроном. Это нетрудно посчитать, разобрав случаи с ti = 1 или ti = 2. Пусть d1 = s1 и di = si − si−1 (для каждого 1 < i) Будем поддерживать ответ. Будем его обновлять после добавления нового дрона i. Есть два случая: 1. когда i вынуждает телепортироваться других 2. когда другие вынуждают телепортироваться i Переберем рекорд u и будем искать подходящее под условия дроны 1. ti · dm ⩾ tj · du , т.е. ищем такие j, что i-й еще не финишировал (эквивалентно непрохождению i-го последнего рекорда). 2. ti · du < tj · dm , т.е. ищем такие j, что еще не финишировали (эквивалентно непрохождению j-го последнего рекорда). Такие j можно искать корневой декомпозицией с небольшой модификацией. Добавлений не боль√ ше O(n), а количество запросов не больше O(n · sm ). Таким образом, на запрос добавления хотим √ потратить tm запросов, а на запрос O(1). Данная идея с реализацией проходит 11 подзадач. Для полного решения давайте отсортируем значения tp1 ⩽ tp2 ⩽ . . . ⩽ tpn . Будем перебирать индексы в порядке возрастания значений t, то есть перебирать pi . Тогда для всех 1 ⩽ u ⩽ m будем поддерживать указатели ptr1 [u] — максимальное значение j, такое что tpi · dm ⩾ tpj · du и ptr2 [u] — минимальное значение j, такое что tpi · du < tpj · dm . Поскольку мы перебираем значения в порядке возрастания, мы можем двигать указатели. Посмотрим как меняется ответ в момент времени pi . В неравенствах, написанных выше участвуют все индексы pj по j ⩽ ptr1 [u] или j ⩾ ptr2 [u] по всем 1 ⩽ u ⩽ m. Но среди них нужно оставить только pj < pi . Давайте сделаем массив длины n, где в индексе x будем хранить добавку, которую √ дает элемент с индексом x. В этой структуре данных нужно O(n sm ) прибавлять к индексу (при движениях указателей) и n раз считать сумму на префиксе. Тогда если применить для этого массива корневую декомпозицию, получится полное решение. √ √ Мы нигде не использовали, что ti маленькие. Время работы O(n( sm + n)), память O(n).
Задача 8. За связь без перебоев Автор: Разработчик:
Никита Лазарев Алексей Михненко
Первые две подгруппы можно сдать, просимулировав описанный в задаче процесс. Для решение за квадрат переберём антенну, которая будет заменена на запасную и найдём нестойкость покрытия для каждого случая независимо. Если антенны зафиксированы, можно для каждого i за O(n) найти величину nxt(i), равную максимальному значению r, что существует антенна, покрывающая город i, а также город r − 1. Построим лес (набор деревьев), где предком i-й вершины будет вершина nxt(i). Если nxt(i) = n, то вершина i будет корнем какого-то дерева. Пусть sz(i) — размер поддерева вершины i, если каждое дерево подвешено за вершину с максимальным номером. Тогда для фиксированного города k > 1 количество пар s < t, что при перемещении от города s в город t произойдёт переподключение при перемещении от k − 1 в k, равно (sz(k) − 1) · (n − k). Таким образом, ответ на задачу равен: n X
(sz(k) − 1) · (n − k)
k=1
Страница 10 из 11
Тридцать шестая всероссийская олимпиада школьников по информатике Иннополис, 6-11 апреля 2024 Таким образом, задачу можно решить за O(n2 ). В четвёртой группе можно заметить, что антенны не выгодно заменять на антенну x, поэтому задача решается за O(n). В пятой группе все ai = 0, поэтому можно перебрать позицию, в которую мы поставим антенну, после чего нестойкость покрытия вычисляется по простой формуле, аналогичной решению, приведённому ранее. Для решения на полный балл посмотрим, как именно изменяется структура леса при добавлении антенны мощности x в городе i. Нетрудно видеть, что какой-то отрезок вершин (по номерам) переподвешивается к вершине i + x + 1. Обозначим этот отрезок, как [li , ri ]. Легко убедиться, что li ⩽ li+1 и ri ⩽ ri+1 , поэтому такие отрезки можно находить двумя указателями. Будем перебирать i в порядке возрастания и поддерживать текущий отрезок [li , ri ], а так же сумму значений (sz(k) − 1) · (n − k) с учётом того, что у вершин с номерами от li до ri ребро в корень удалено. Чтобы поддерживать такую сумму, необходимо при увеличении правой границы на 1 удалять ребро из r + 1 в предка, а при увеличении левой границы — добавлять ребро из li в исходного предка вершины li обратно. При увеличении правой границы заметим, что все рёбра на пути от r до корня ещё не удалены, поэтому, чтобы посчитать, на сколько изменится нестойкость, необходимо посчитать произведение размера текущего поддерева вершины r и суммы значений (n − v) по всем предкам v вершины r. Такую сумму можно посчитать заранее за O(n). Чтобы посчитать размер поддерева, переберём всех непосредственных детей вершины r в исходном лесе и, если ребро в ребёнка ещё не удалено, нетрудно видеть, что все рёбра в поддереве ребёнка тоже ещё не удалены, поэтому достаточно просуммировать размеры поддеревьев таких детей. При увеличении левой границы на 1 достаточно рассмотреть два случая. • Если предок вершины p в исходном лесе сейчас является корнем, то добавления добавление ребра в этого предка увеличит ответ на sz(l) · (n − p), так как, аналогично увеличению правой границы, легко заметить, что все рёбра в поддереве вершины l точно не удалены • Если предок вершины l на данный момент не является корнем, то все рёбра от p до корня исходного дерева, в котором содержался p, не удалены, поэтому ответ можно пересчитать, используя сумму, насчитанную для увеличения правой границы. Кроме всего вышеперечисленного, надо поддерживать суммарный размер всех поддеревьев, у которых ребро в предка удалено. Это можно поддерживать аналогично вышеперечисленному при увеличении границ отрезка. Из-за добавления новой антенны все такие поддеревья подвесятся к вершине i + x + 1. Используя суммарный размер поддеревьев, посчитать реальное значение нестойкости можно аналогично увеличению левой границы. Таким образом, получили решение за O(n).
Страница 11 из 11