| | | |
|
C. Подсчет покрытых точек
реализация
сортировки
Структуры данных
*1700
Задано \(n\) отрезков на координатной прямой; концы отрезков имеют целочисленные координаты. Отрезки могут вырождаться в точки. Отрезки могут пересекаться друг с другом, вкладываться и даже совпадать. Ваша задача: для каждого \(k \in [1..n]\) посчитать количество таких точек с целочисленными координатами, что количество отрезков, покрывающих эти точки, равно \(k\). Отрезок с границами \(l_i\) и \(r_i\) покрывает точку \(x\) тогда и только тогда, когда \(l_i \le x \le r_i\). Выходные данные Выведите \(n\) целых чисел через пробел \(cnt_1, cnt_2, \dots, cnt_n\), где \(cnt_i\) равно количеству таких точек, что количество отрезков, покрывающих эти точки, равно \(i\). Примечание Картинка, описывающая первый тестовый пример: 
Точки с координатами \([0, 4, 5, 6, 7, 8]\) покрыты одним отрезком, точки \([1, 2]\) покрыты двумя отрезками и точка \([3]\) покрыта тремя отрезками. Картинка, описывающая второй тестовый пример: 
Точки \([1, 4, 5, 6, 7]\) покрыты одним отрезком, точки \([2, 3]\) покрыты двумя отрезками и точек, покрытых тремя отрезками, нет.
| |
|
|
E1. Медиана на подотрезках (редакция для перестановок)
сортировки
*1800
Задана перестановка \(p_1, p_2, \dots, p_n\), то есть такой массив длины \(n\), что каждое число от \(1\) до \(n\) встречается в нём ровно один раз. Найдите количество таких пар индексов \((l, r)\) (\(1 \le l \le r \le n\)), что медиана последовательности \(p_l, p_{l+1}, \dots, p_r\) равна заданному числу \(m\). Медианой последовательности называется значение такого элемента, который находится в середине последовательности после её сортировки по неубыванию. Если последовательность имеет чётную длину, то имеется ввиду левый из двух средних элементов. Например, если последовательность \(a=[4, 2, 7, 5]\), то её медиана равна \(4\), так как после сортировки последовательность примет вид \([2, 4, 5, 7]\) и левый из двух средних элементов равен \(4\). Медиана последовательности \([7, 1, 2, 9, 6]\) равна \(6\), так как после сортировки \(6\) будет находится в середине последовательности. Напишите программу, которая найдет количество пар индексов \((l, r)\) (\(1 \le l \le r \le n\)), что медиана последовательности \(p_l, p_{l+1}, \dots, p_r\) равна заданному числу \(m\). Выходные данные Выведите количество искомых пар индексов. Примечание В первом примере искомые пары индексов: \((1, 3)\), \((2, 2)\), \((2, 3)\) и \((2, 4)\).
| |
|
|
E2. Медиана на подотрезках (редакция для общего случая)
сортировки
*2400
Задана последовательность целых чисел \(a_1, a_2, \dots, a_n\). Найдите количество таких пар индексов \((l, r)\) (\(1 \le l \le r \le n\)), что медиана последовательности \(a_l, a_{l+1}, \dots, a_r\) равна заданному числу \(m\). Медианой последовательности называется значение такого элемента, который находится в середине последовательности после её сортировки по неубыванию. Если последовательность имеет чётную длину, то имеется ввиду левый из двух средних элементов. Например, если последовательность \(a=[4, 2, 7, 5]\), то её медиана равна \(4\), так как после сортировки последовательность примет вид \([2, 4, 5, 7]\) и левый из двух средних элементов равен \(4\). Медиана последовательности \([7, 1, 2, 9, 6]\) равна \(6\), так как после сортировки \(6\) будет находится в середине последовательности. Напишите программу, которая найдет количество пар индексов \((l, r)\) (\(1 \le l \le r \le n\)), что медиана последовательности \(a_l, a_{l+1}, \dots, a_r\) равна заданному числу \(m\). Выходные данные Выведите количество искомых пар индексов. Примечание В первом примере искомые пары индексов: \((1, 3)\), \((1, 4)\), \((1, 5)\), \((2, 2)\), \((2, 3)\), \((2, 5)\), \((4, 5)\) и \((5, 5)\),
| |
|
|
B. Тренировка Поликарпа
жадные алгоритмы
реализация
сортировки
*1200
Поликарп тренирует свое умение решать задачи. У него есть список из \(n\) задач со сложностями \(a_1, a_2, \dots, a_n\) соответственно. Его план состоит в том, чтобы тренироваться ровно \(k\) дней. Каждый день он должен решать хотя бы одну задачу из своего списка. Поликарп решает задачи в том порядке, в котором они заданы в списке, и он не может пропустить какую-либо задачу из списка. Он должен решить ровно \(n\) задач ровно за \(k\) дней. Таким образом, каждый день Поликарп решает последовательность подряд идущих (последовательных) задач с самого начала списка. Он не может пропускать задачи или решать их несколько раз. В итоге за \(k\) дней он решит \(n\) задач. Полезность \(j\)-го дня тренировки Поликарпа равна максимальной сложности задачи среди всех задач, которые Поликарп решит в течение \(j\)-го дня (то есть если он решит задачи с номерами от \(l\) до \(r\) в течение какого-то дня, тогда полезность этого дня равна \(\max\limits_{l \le i \le r}a_i\)). Общая полезность его тренировки — это сумма полезностей по всем \(k\) дням его тренировки. Вы хотите помочь Поликарпу получить максимально возможную общую полезность среди всех доступных способов решить задачи. Ваша задача — распределить \(n\) задач по \(k\) дням таким образом, что это распределение удовлетворяет ограничениям, описанным выше, и общая полезность является максимально возможной. Например, если \(n = 8, k = 3\) и \(a = [5, 4, 2, 6, 5, 1, 9, 2]\), одним из возможных способов с максимальной общей полезностью является следующий: \([5, 4, 2], [6, 5], [1, 9, 2]\). Здесь общая полезность равна \(5 + 6 + 9 = 20\). Выходные данные В первой строке выведите максимально возможную общую полезность. Во второй строке выведите \(k\) натуральных чисел \(t_1, t_2, \dots, t_k\) (\(t_1 + t_2 + \dots + t_k\) должно равняться \(n\)), где \(t_j\) равно количеству задач, которое Поликарп решит в \(j\)-й день, чтобы достигнуть максимальной общей полезности его тренировки. Если существует несколько возможных решений, выведите любое из них. Примечание Первый тестовый пример описан в условии задачи. Во втором тестовом примере только один способ распределить задачи из списка и только одна возможная общая полезность. В третьем тестовом примере лучшим ответом является распределить задачи следующим образом: \([1, 2000], [2000, 2]\). Тогда суммарная полезность будет равна \(2000 + 2000 = 4000\).
| |
|
|
A. Перестановка массива
Комбинаторика
математика
сортировки
Структуры данных
*1300
Дан массив целых чисел. Вася может переставлять его числа местами. При этом он хочет, чтобы как можно больше чисел стояли там, где раньше стояли меньшие числа. Помогите ему найти максимальное количество таких чисел. Например, если нам дан массив \([10, 20, 30, 40]\), мы можем переставить числа так, что массив станет \([20, 40, 10, 30]\). При этом на первой и второй позициях числа стали больше (\(20>10\), \(40>20\)), а на третьей и четвёртой — нет, значит для такой перестановки число, которое хочет максимизировать Вася, равно \(2\). Ознакомьтесь с примечанием к первому тестовому примеру, там разобран ещё один показательный тест. Помогите Васе так переставить числа, чтобы количество позиций, в которых в новом массиве числа больше, чем в изначальном, было максимальным. Выходные данные Выведите одно целое число — максимальное число элементов массива, которые после перестановки будут стоять на позициях, где изначально стоял меньший элемент. Примечание В первом тесте одна из оптимальных перестановок — \([1, 5, 5, 3, 10, 1, 1]\). На позициях со второй по пятую значения увеличились, значит ответ для этой перестановки — 4. Во втором тесте при любой перестановке ни на одной позиции элемент не может стать больше, значит, ответ — 0.
| |
|
|
B. Поверните прямоугольники
жадные алгоритмы
сортировки
*1000
В ряд стоят \(n\) прямоугольников. Каждый из них вы можете либо повернуть на \(90\) градусов, либо оставить как есть. Если вы поворачиваете прямоугольник, то его высота станет шириной, а ширина — высотой. Заметьте, что вы можете повернуть любое количество прямоугольников, а так же вы можете повернуть все или не поворачивать ни один. Вы не можете менять порядок следования прямоугольников. Определите, можно ли повернуть прямоугольники так, что они станут идти в порядке невозрастания высоты. Иными словами, после всех поворотов высота следующего прямоугольника должна быть меньше или равна высоте предыдущего (если такой есть). Выходные данные Выведите «YES» (без кавычек), если можно так повернуть прямоугольники, что они станут идти в порядке невозрастания высоты, иначе выведите «NO». Вы можете выводить каждую из букв в любом регистре (строчную или заглавную). Примечание В первом тесте можно повернуть второй и третий прямоугольники, тогда высоты будут [4, 4, 3]. Во втором тесте нельзя сделать так, чтобы второй прямоугольник был не выше первого.
| |
|
|
D. Замок
Деревья
дп
жадные алгоритмы
сортировки
Теория вероятностей
*2300
Геральд находится в старинном замке из n залов, соединенных n - 1 переходами. Из любого зала можно добраться до любого другого единственным способом, то есть граф представляет собой дерево. Изначально, в момент времени 0, Геральд находится в зале номер 1. Также в некотором другом зале этого замка находится клад, который Геральд хочет найти. Где именно находится клад неизвестно, он может быть с одинаковой вероятностью в любом из остальных n - 1 залов. Узнать о местонахождении клада Геральд может только тогда, когда придет непосредственно в тот зал. Тогда Геральд сразу же видит клад, и этот момент считается моментом достижения его цели. Переходы между залами имеют различные длины. При этом, переходы считаются длинными, а залы — маленькими и хорошо освещенными, так что временем, которое Геральд находится в залах, можно пренебречь. Замок очень старый, поэтому переходы обваливаются сразу после того, как по ним пройдут два раза, неважно в какую сторону. Геральд может ходить по замку, пользуясь переходами, и будет ходить до тех пор, пока не найдет клад. Естественно, Геральд хочет найти его как можно быстрее. Иными словами, он хочет действовать так, чтобы среднее время нахождения клада было как можно меньше. Каждый переход можно использовать не более двух раз. Поэтому Геральд заранее выбирает такую стратегию, которая позволяет обойти все залы. Более формально, если клад окажется во втором зале, то Геральд найдет его в тот момент, когда первый раз окажется во втором зале — пусть это будет в момент t2. Если в третьем, то Геральд найдет его тогда, когда первый раз окажется в третьем зале. Пусть это произойдет в момент времени t3. И так далее. Таким образом, среднее время нахождения клада окажется равным . Выходные данные Выведите одно вещественное число: искомое матожидание времени поиска клада. Ответ должен отличаться от правильного не более чем на 10 - 6. Примечание В первой тесте в замке всего два зала, значит, клад находится во втором зале. Геральду потребуется одна минута, чтобы перейти из первого зала во второй. Во втором тесте из первого зала Геральд может перейти только в третий. Из третьего он может перейти в первый или второй, но в первом он уже был, и из него он не может никуда попасть. Значит, ему нужно пойти во второй зал. Оттуда ему надо идти в 4 зал, потому что остальные залы уже посещены. Если клад окажется в третьем зале, Геральд найдет его через минуту, если во втором — через две, если в четвертом — через три. Среднее время — 2 минуты. В третьем тесте Геральду нужно посетить 4 зала: второй, третий, четвертый и пятый. В них всех можно попасть только из первого зала. Значит, ему нужно поочередно заходить в эти 4 зала в один за другим и возвращаться обратно. В первом из этих залов Геральд окажется через минуту, во втором — через три, в третьем — через 5, в четвертом — через 7. Среднее время — 4 минуты.
| |
|
|
A. Ступени
жадные алгоритмы
реализация
сортировки
*900
Наташа собирается полететь на Марс. Ей необходимо построить ракету, которая собирается из нескольких ступеней в определённом порядке. Каждая из ступеней описывается одной строчной буквой латинского алфавита. Тем самым ракета описывается строкой — конкатенацией букв, соответствующих ступеням. Всего на складе есть \(n\) ступеней. Ракета должна содержать ровно \(k\) из них. Ступени в ракете должны быть упорядочены по весу. После ступени с некоторой буквой можно ставить только ступень с буквой, идущей хотя бы на две позиции позже в алфавите (то есть через одну букву или более). Например, после буквы 'c' нельзя ставить буквы 'a', 'b', 'c' и 'd', зато можно ставить 'e', 'f', ..., 'z'. Чтобы ракета летела максимально далеко, нужно, чтобы её вес был минимален. Вес ракеты равен сумме весов её ступеней. Ступень весит столько тонн, каков номер её буквы в алфавите. Иными словами, ступень 'a' весит одну тонну, 'b' весит две тонны, а 'z' — \(26\) тонн. Постройте ракету минимального веса или скажите, что ни одной ракеты построить нельзя. Каждую из ступеней на складе можно использовать не более одного раза. Выходные данные Выведите одно число — минимальный суммарный вес ракеты или -1, если ни одной ракеты построить нельзя. Примечание В первом примере условию удовлетворяют такие ракеты: - «adx» (вес равен \(1+4+24=29\));
- «ady» (вес равен \(1+4+25=30\));
- «bdx» (вес равен \(2+4+24=30\));
- «bdy» (вес равен \(2+4+25=31\)).
Минимальный вес имеет ракета «adx», следовательно ответ равен \(29\). Во втором примере искомая ракета — «belo». Её вес — \(2+5+12+15=34\). В третьем примере \(n=k=2\), поэтому ракета должна содержать обе ступени: 'a' и 'b'. Такая ракета не удовлетворяет условию, поскольку эти буквы стоят в алфавите рядом. Ответ — -1.
| |
|
|
A. Фотография неба
математика
Перебор
реализация
сортировки
*1500
Паша сделал фото своих любимых звёзд на небе. Его камера сфотографировала все звёзды на небе, которые лежали в некотором прямоугольнике со сторонами, параллельными осям координат. Более формально, она сделала фотографию всех точек с координатами \((x, y)\), для которых выполнено \(x_1 \leq x \leq x_2\) и \(y_1 \leq y \leq y_2\), где \((x_1, y_1)\) и \((x_2, y_2)\) — координаты левого нижнего и правого верхнего прямоугольника, который фотографируют. Площадь фотографируемого прямоугольника может быть нулевой. Сразу после фотографирования Паша выписал в блокнот координаты \(n\) своих любимых звёзд, попавших на фото. Эти точки не обязательно различны, так как в одной точке неба может быть несколько звёзд. Но потом, к сожалению, Павел потерял свою камеру и хочет купить новую, похожую на предыдущую. В частности, он хочет знать размер фотографии, снятой ранее. К сожалению, эта фотография тоже оказалась утеряна. Его записи в блокноте сохранились, но не осообо помогают — все координаты оказались перемешаны и невозможно определить, каким точкам соответствуют. Паша попросил вас определить, каков мог быть размер фотографии, не противоречащей его записям. Так как может быть несколько различных ответов, найдите размер фотографии с минимальной площадью. Выходные данные Выведите единственное число — минимальную площадь прямоугольника, который мог содержать все звёзды в записях Паши. Примечание В первом тестовом примере точки из записей Павла могут быть равными \((1, 3)\), \((1, 3)\), \((2, 3)\), \((2, 4)\). В таком случае, минимальная площадь прямоугольника, который их содержит равна \(1\) (прямоугольник с вершинами в \((1, 3)\) и \((2, 4)\)).
| |
|
|
C. Сжатие песен
сортировки
*1100
У Ивана на телефоне есть \(n\) песен. Размер \(i\)-й песни \(a_i\) байт. У Ивана также есть флеш-карта, которая может хранить не более \(m\) байт информации. Изначально его флеш-карта пустая. Иван хочет записать все \(n\) песен на свою флеш-карту. Он может сжимать некоторые из них. Если он сжимает \(i\)-ю песню, размер \(i\)-й песни уменьшается с \(a_i\) до \(b_i\) байт (\(b_i < a_i\)). Иван может сжать любое подмножество песен (возможно, пустое) и записать все песни на флеш-карту, если сумма их размеров не превышает \(m\). Он может сжимать любое подмножество песен (не обязательно подряд идущих). Иван хочет найти минимальное количество песен, которое необходимо сжать, чтобы все песни поместились на флеш-карте (то есть сумма их размеров была меньше либо равна \(m\)). Если невозможно записать все песни (даже если Иван сожмет все песни, которые у него есть), выведите «-1». Иначе выведите минимальное количество песен, которое Ивану необходимо сжать. Выходные данные Если невозможно сжать подмножество песен таким образом, что все песни поместятся на флеш-карту, выведите «-1». Иначе выведите минимальное количество песен, которое необходимо сжать. Примечание В первом тестовом примере Иван может сжать первую и третью песни, после этого сумма размеров будет равна \(8 + 7 + 1 + 5 = 21 \le 21\). Также Иван может сжать первую и вторую песни, тогда сумма размеров будет равна \(8 + 4 + 3 + 5 = 20 \le 21\). Заметьте, что сжатия какой-либо одной песни недостаточно, чтобы записать все песни на флеш-карту (например, после сжатия второй песни сумма размеров будет равна \(10 + 4 + 3 + 5 = 22 > 21\)). Во втором тестовом примере даже если Иван сожмет все песни, сумма размеров будет равна \(8 + 4 + 1 + 4 = 17 > 16\).
| |
|
|
D. Большой треугольник
Бинарный поиск
геометрия
сортировки
*2700
Есть странная особенность: если соединить между собой города Ростов, Таганрог, Шахты, то получится треугольник «Невероятно, но факт» В ЛКШ приезжают ученики из самых разных уголков России и зарубежья. Вы отметили на карте все города, откуда приехали участники ЛКШ. Затем, вы решили подготовить интересную инфографику на основе этой карты. Первое, что вы захотели сделать — это найти три города на этой карте, так чтобы получился треугольник площади ровно \(S\). Выходные данные Если решения не существует — выведите «No» (без кавычек). Иначе выведите «Yes» (без кавычек), после чего выведите три пары координат \((x, y)\) — координаты городов, образующих треугольник площади \(S\).
| |
|
|
A. Перекраска собачек
реализация
сортировки
*900
В комитете по стандартизации собачек паника — щенки из нового выводка умудрились родиться разноцветными! Всего в природе существует 26 различных цветов щенков и они обозначаются буквами от 'a' до 'z' включительно. Свод правил комитета запрещает даже малейшие отличия между щенками, а потому сотруднику Славе поручили перекрасить часть щенков в другие цвета, тем самым устранив досадные расхождения. К сожалению, излишняя бюрократия и ограниченный бюджет привели к тому, что перекрашивать щенков можно лишь одним образом: выбрать цвет \(x\) такой, что на текущий момент существуют хотя бы два щенка цвета \(x\) (иначе это будет признано нецелевыми расходами), и перекрасить всех щенков цвета \(x\) в произвольный цвет \(y\). По счастью, операцию покраски можно применять неограниченное количество раз (в том числе нулевое). Например, если количество щенков равно \(7\) и их цвета характеризуются строкой «abababc», то за одну операцию Слава может получить последовательности «zbzbzbc», «bbbbbbc», «aaaaaac», «acacacc» и другие. Однако, если текущая последовательность цветов равна «abababc», то выбрать \(x\)='c' прямо сейчас он не может, так как прямо сейчас только один щенок имеет цвет 'c'. Помогите Славе и комитету понять, можно ли стандартизировать щенков, покрасив их всех в один цвет. Выходные данные Если всех щенков можно перекрасить в один цвет, выведите «Yes». Если же хотя бы двум щенкам суждено остаться разноцветными, выведите «No». Выводите ответ без кавычек. Примечание В первом примере Слава может произвести следующие шаги: - взять всех щенков цвета 'a' (их всего две штуки) и перекрасить их всех в цвет 'b';
- взять всех щенков цвета 'd' (их всего две штуки) и перекрасить их всех в цвет 'c';
- взять всех щенков цвета 'b' (обратите внимание, их теперь три штуки) и перекрасить их в цвет 'c'.
Во втором примере невозможно перекрасить ни одного щенка. В третьем примере все щенки изначально имеют один и тот же цвет, поэтому перекрашивать никого не надо.
| |
|
|
C. Прямоугольники
геометрия
реализация
сортировки
*1600
На плоскости даны \(n\) прямоугольников, которые заданы координатами своих левого нижнего и правого верхнего углов. Известно, что некоторые \((n-1)\) из этих \(n\) прямоугольников имеют хотя бы одну общую точку. Точка принадлежит прямоугольнику, если она находится строго внутри прямоугольника или на его границе. Найдите любую точку с целыми координатами, которая принадлежит хотя бы \((n-1)\) прямоугольнику из заданных. Выходные данные Выведите два целых числа \(x\), \(y\) — координаты произвольной точки на плоскости, принадлежащей хотя бы \((n-1)\) прямоугольнику. Примечание Рисунок ниже показывает расположение прямоугольников в первом и втором тестах из примера. Возможные ответы выделены. Рисунок ниже показывает расположение прямоугольников в третьем и четвертом примерах.
| |
|
|
C. Максимальное пересечение
жадные алгоритмы
математика
сортировки
*1600
Заданы \(n\) отрезков на числовой прямой; границы каждого отрезка имеют целочисленные координаты. Некоторые отрезки могут вырождаться в точки. Отрезки могут пересекаться, вкладываться друг в друга или даже совпадать. Пересечение некоторой последовательности отрезков — это такое максимальное по включению множество точек (не обязательно имеющих целые координаты), что каждая точка лежит внутри каждого отрезка из последовательности. Если полученное множество не пусто, то оно всегда образует некоторый непрерывный отрезок. Длина пересечения — это длина полученного отрезка, либо \(0\), если пересечение — пустое множество. Например, пересечение отрезков \([1;5]\) и \([3;10]\) — это \([3;5]\) (длина \(2\)), пересечение отрезков \([1;5]\) и \([5;7]\) — это \([5;5]\) (длина \(0\)) и пересечение отрезков \([1;5]\) и \([6;6]\) — это пустое множество (длина \(0\)). Ваша задача — удалить ровно один отрезок из заданной последовательности таким образом, чтобы пересечение оставшихся \((n - 1)\) отрезков имело максимальную длину. Выходные данные Выведите одно целое число — максимально возможную длину пересечения \((n - 1)\) отрезка после удаления ровно одного отрезка из последовательности. Примечание В первом примере необходимо удалить отрезок \([3;3]\), пересечение станет \([2;3]\) (длина \(1\)). Удаление любого другого отрезка приведет к пересечению \([3;3]\) (длина \(0\)). Во втором примере необходимо удалить отрезок \([1;3]\) или отрезок \([2;6]\), пересечение станет \([2;4]\) (длина \(2\)) или \([1;3]\) (длина \(2\)), соответственно. Удаление любого другого отрезка приведет к пересечению \([2;3]\) (длина \(1\)). В третьем примере пересечение станет пустым множеством вне зависимости от удаленного отрезка. В четвертом примере вы получите пересечение \([3;10]\) (длина \(7\)) после удаления отрезка \([1;5]\) или же пересечение \([1;5]\) (длина \(4\)) после удаления отрезка \([3;10]\).
| |
|
|
D. Время грабить корованы
Перебор
сортировки
Структуры данных
*2100
Я джва года хочу такую задачу. Alex_KPR Как известно, самые умные существа на планете Земля — это, конечно, коровы. К этому выводу давно пришли марсианские инопланетяне, а также целый ряд других разумных цивилизаций из дальнего космоса. Иногда коровы собираются в корованы. Это, кажется, у них сезонное. Но именно в это время коровы становятся пассивными и слабо реагируют на внешние раздражители. Корован — идеальная мишень для марсианской исследовательской тарелки, самое время для крупномасштабных похищений, или, как говорят марсиане, ограблений. Говоря простым языком, корован — это множество коров, расположенных в ряд. Если пронумеровать всех коров в короване натуральными числами от 1 до n, то можно формализовать популярную модель похищения, известную как (a, b)-ограбление корована: сперва похищается корова с номером a, затем — с номером a + b, затем — с номером a + 2·b, и так далее, пока номер похищаемой коровы не превысит n. В процессе одного ограбления коровы не перенумеровываются. Инопланетяне с радостью бы расположили всех коров на борту своего гостеприимного судна, но, к сожалению, размер грузового отсека весьма и весьма ограничен. Исследователи, зная массу каждой коровы в короване, составили p сценариев (a, b)-ограбления. Теперь они хотят определить для каждого сценария в отдельности какая суммарная масса чистой говядины попадет на борт корабля. Все сценарии независимы, в процессе выполнения расчетов похищение коров не осуществляется. Выходные данные На каждый сценарий (a, b)-ограбления выведите суммарную массу коров, которые могут быть похищены в результате ограбления по этому сценарию. Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.
| |
|
|
C. Азартные игры
жадные алгоритмы
сортировки
*1300
У каждого из игроков A и B есть по списку, по \(n\) целых чисел в каждом. Они оба хотят максимизировать разность между своими очками и очками соперника. За один ход, игрок может либо добавить к своим очкам любой элемент из своего списка (если его список не пуст), затем этот элемент удаляется из списка. Или удалить элемента из списка его оппонента (если список его оппонента не пуст). В случае если в списке есть несколько одинаковых элементов, только один из них будет задействован в какой-то операции. Например, если список состоит из элементов \(\{1, 2, 2, 3\}\) и вы решили выбрать \(2\) для следующего хода, только один экземпляр \(2\) будет удалён (и добавлен к очкам, если это требуется). Игру начинает игрок А и игра заканчивается когда оба списка становятся пустыми. Найдите разницу между очками A и B, если оба игрока играют оптимально. Оптимальная игра обоих игроков означает, что оба игрока выбирают наилучшую из возможных стратегий для достижения наиболее выигрышного для себя исхода. В этой задаче это означает, что каждый игрок каждый раз делает такой ход, который максимизирует итоговую разницу его очков и противника при знании того, что противник делает тоже самое. Выходные данные Найдите разницу между очками A и B (\(A-B\)), если оба игрока играют оптимально. Примечание В первом примере, игра может выглядеть так: - A удаляет \(5\) из списка B.
- B удаляет \(4\) из списка A.
- A прибавляет к своим очкам \(1\), и удаляет ее из списка.
- B прибавляет к своим очкам \(1\), и удаляет ее из списка..
Таким образом, очки A равны \(1\), очки B равны \(1\) и разница \(0\). Есть также другие варианты оптимальной игры, например: - A удаляет \(5\) из списка B.
- B удаляет \(4\) из списка A.
- A удаляет \(1\) из списка B.
- B удаляет \(1\) из списка A.
Разница между очками также \(0\). Во втором примере, вне зависимости от ходов, в итоге каждый участник добавит к своим очкам одинаковое количество чисел, а значит очки у обоих игроков будут одинаковыми, поэтому разница \(0\).
| |
|
|
C. Безопасность сети
графы
математика
поиск в глубину и подобное
снм
сортировки
*2200
К компьютерной сети Метрополии подключены \(n\) серверов, каждому из которых назначен некоторый ключ шифрования, выбранный в диапазоне от \(0\) до \(2^k - 1\) включительно. Обозначим через \(c_i\) ключ шифрования, назначенный \(i\)-му серверу. Также некоторые \(m\) пар серверов напрямую соединены каналом передачи данных. Из-за особенностей используемых алгоритмов шифрования канал передачи данных безопасен, только если два соединённых этим каналом сервера используют различные ключи шифрования. Изначально ключи шифрования выбраны таким образом, что все каналы передачи данных безопасны. Вам стало известно, что по интернету активно распространяется новый вирус, который при заражении им какого-либо сервера Метрополии изменяет его ключ шифрования. А именно, в теле вируса хранится некоторое неизвестное вам число \(x\), выбранное в том же диапазоне, и если вирусом заразится сервер \(i\), то его ключ шифрования изменится с \(c_i\) на \(c_i \oplus x\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ. К сожалению, вы не знаете ни число \(x\), ни какие именно серверы Метрополии будут заражены опасным вирусом, поэтому решили посчитать количество вариантов, при которых безопасность каналов нарушена не будет. Формально, вам требуется найти количество пар \((A, x)\), где \(A\) — некоторое подмножество серверов (возможно пустое), а \(x\) — возможное значение внутреннего параметра вируса в диапазоне от \(0\) до \(2^k - 1\) включительно, таких что если вирус с параметром \(x\) заразит компьютеры из подмножества \(A\), а остальные компьютеры заражены не будут, то все каналы передачи данных останутся безопасными. Поскольку эта величина может быть достаточно большой, найдите остаток от её деления на \(10^9 + 7\). Выходные данные В единственной строке выходного файла выведите одно число — количество удачных исходов заражения какого-то подмножества компьютеров вирусом по модулю \(10^9 + 7\). Примечание Рассмотрим первый пример. Возможные значения числа \(x\), содержащегося в вирусе, равны \(0\), \(1\), \(2\) и \(3\). Для значений \(0\), \(2\) и \(3\) вирус может заразить любое подмножество серверов, что дает нам \(16\) исходов для каждого значения. Если же вирус содержит число \(1\), то он может заразить либо все серверы, либо ни одного. Таким образом, количество удачных исходов равно \(16 + 2 + 16 + 16 = 50\).
| |
|
|
A. Кража в магазине
жадные алгоритмы
реализация
сортировки
*800
В магазине компьютерной техники ночью произошла кража. До этого все клавиатуры, которые продавались в магазине, были пронумерованы по очереди, начиная с некоторого натурального числа \(x\). Например, если \(x = 4\) и в магазине продавалось \(3\) клавиатуры, то они имели номера \(4\), \(5\) и \(6\), а если \(x = 10\) и в магазине продавалось \(7\) клавиатур, то они имели номера \(10\), \(11\), \(12\), \(13\), \(14\), \(15\) и \(16\). После кражи в магазине осталось \(n\) клавиатур с номерами \(a_1, a_2, \dots, a_n\). Определите минимальное количество клавиатур, которые могли быть украдены, если никто из сотрудников магазина не помнит значение \(x\). Выходные данные Выведите минимальное количество клавиатур, которые могли быть украдены, если никто из сотрудников магазина не помнит значение \(x\). Примечание В первом примере, если \(x=8\), то минимальное количество клавиатур, украденных из магазина, равно \(2\). То есть были украдены компьютеры с номерами \(9\) и \(11\). Во втором примере, если \(x=4\), то ни одна клавиатура не была украдена из магазина.
| |
|
|
F. Множества листьев
графы
Деревья
жадные алгоритмы
поиск в глубину и подобное
снм
сортировки
Структуры данных
*2400
Вам дано неориентированное дерево, состоящее из \(n\) вершин. Назовём вершину листом, если она соединена ровно с одной другой вершиной. Под расстоянием между двумя вершинами будем понимать количество рёбер на кратчайшем пути между этими вершинами. Назовем некоторое множество листьев красивым, если максимальное расстояние между любой парой листьев из этого множества не превышает \(k\). Перед вами стоит задача разделить все листья дерева на непересекающиеся красивые множества. Определите минимальное количество множеств, которые можно получить в результате описанного разделения. Выходные данные Выведите минимальное количество красивых множеств в разбиении всех листьев. Примечание Картинка описывает разбиение дерева из первого примера.
| |
|
|
E. Тренируйcя усердно, выигрывай легко
жадные алгоритмы
Конструктив
математика
сортировки
*1900
Зиби является тренером команд по спортивному программированию. Всего есть \(n\) участников, которые хотят хорошо подготовиться к соревнованиям. Тренировочные контесты весьма необычны: в каждой команде есть ровно два человека, две задачи, и каждый участник будет писать ровно одну из них. Разумеется, два человека в одной команде будут писать разные задачи. Правила оценки тоже весьма необычны. Первая задача всегда задача на реализацию: нужно реализовать один весьма известный алгоритм и оценивается время и скорость его написания. Вторая задача — ужасная задача на геометрию, которую нужно сдать хотя бы за какое-нибудь разумное время. Здесь оценивается длина и сложность кода. После этого Зиби даёт некоторые штрафные очки каждому решению (возможно, отрицательные) и итоговый результат команды равен их сумме (чем меньше сумма, тем лучше). Мы знаем, что \(i\)-й участник наберёт ровно \(x_i\) очков, если будет писать первую задачу, и ровно \(y_i\), если будет писать вторую. Можно считать, что все участники знают способности друг друга и во время контеста распределят задачи таким образом, чтобы минимизировать их итоговый счёт. Напомним, каждый участник напишет ровно одну задачу за контест. Зиби хочет, чтобы все участники написали тренировочный контест друг с другом. Однако есть \(m\) пар участников, которые ни за что не хотят писать контест вместе. Тем не менее, тренер собирается провести тренировочный контест для всех возможных пар участников, которые не ненавидят друг друга. Для каждого участника тренеру интересно, какова будет сумма очков команд, в которых он примет участие. Выходные данные Выведите \(n\) целых чисел — суммарное количество очков для всех участников в том порядке, в котором они перечислены во входных данных. Примечание В первом примере может быть только одна команда, состоящая из участников \(1\) и \(3\). В данной команде оптимальное стратегией будет отдать первую задачу участнику \(3\), а вторую задачу участнику \(1\), это приведёт к сумме очков равной \(1 + 2 = 3\). Во втором примере все друг друга ненавидят, а значит не будет ни одной тренировки. Наверное в таком случае Зиби не станет почётным тренером...
| |
|
|
C. Мир Вещей
Перебор
реализация
сортировки
*2200
Каждый предмет в игре имеет уровень. Чем выше уровень — тем более высокие базовые параметры имеет вещь. Мы будем рассматривать только следующие базовые параметры: атака (atk), защита (def) и сопротивления к различным воздействиям (res). Каждая вещь принадлежит одному из классов. В данной задаче мы будем рассматривать только три таких класса: оружие (weapon), броня (armor), защитные сферы (orb). Кроме того, внутри каждого предмета скрыт целый мир. С помощью путешествий в мир данного предмета можно повышать его уровень. Также в Мире Вещей можно захватывать так называемых резидентов. Резиденты — это существа, которые живут внутри предметов. Каждый резидент дает некоторый бонус предмету, в котором он на данный момент находится. Мы будем рассматривать только резидентов типов: гладиатор (gladiator, увеличивает параметр atk предмета), часовой (sentry, увеличивает def) и целитель (physician, увеличивает res). Каждый предмет имеет параметр вместимости. Он означает максимальное количество резидентов, которые могут жить внутри предмета. Резидентов можно перемещать между предметами. За один момент времени можно взять любого резидента в любом предмете, и переместить его в какой-либо другой предмет, если там есть место для нового жителя. При этом вынимать резидентов из предметов наружу не разрешается — каждый резидент обязательно должен быть в каком-либо предмете в любой момент времени. У Лахарла есть некоторое количество предметов. Он хочет перераспределить резидентов между предметами таким образом, чтобы затем выбрать себе оружие, броню и защитную сферу для экипировки. При этом параметр оружия atk должен получиться максимально возможным. Из всех экипировок с максимальным параметром оружия atk параметр брони def должен быть максимальным. Из всех таких экипировок следует выбрать ту, в которой параметр защитной сферы res максимален. Значения параметров def и res у оружия, atk и res у брони и atk и def у защитной сферы Лахарлу безразличны. Найдите оптимальную экипировку, которую Лахарл может получить. Выходные данные В первой строке выведите имя оружия в оптимальной экипировке, затем количество резидентов в этом оружии, после чего выведите список имен резидентов. Во второй и третьей строке в аналогичном формате выведите имена брони и защитной сферы, а так же имена резидентов, находящихся в них. В качестве разделителей используйте одиночные пробелы. Если возможных решений несколько — выведите любое. Примечание Во втором примере свободного места в предметах нет, поэтому перемещать резидентов нельзя.
| |
|
|
C. Выбери героев
жадные алгоритмы
интерактив
реализация
сортировки
*1700
Если вы подумали, что Аркадий немного старомоден, так как играет в шашки, то вы не правы. Аркадий и его друзья также любят одну из современных компьютерных игр. Мы не будем обсуждать ее правила, для этой задачи важно лишь то, что каждый игрок должен в начале игры выбрать себе одного героя. Всего есть \(2\) команды по \(n\) игроков и \(2n\) героев, которых нужно распределить по игрокам. Команды по очереди выбирают героев: сначала первая команда выбирает одного героя в свою команду, затем вторая команда выбирает одного героя себе и так далее. Обратите внимание, что после того, как герой выбран, его больше не может выбрать ни та, ни другая команда. Друзья оценивают силу \(i\)-го героя как \(p_i\). Каждая команда хочет максимизировать суммарную силу своих героев. Однако, есть одно исключение: есть \(m\) пар героев, которые особенно сильны друг против друга, поэтому когда одна команда выбирает героя из пары, другая команда на своем ходу обязана выбрать другого героя из пары. Каждый герой входит максимум в одну такою пару. Это — интерактивная задача. Вам нужно написать программу, которая будет оптимально выбирать героев в одну команду, в то время как программа жюри будет играть за другую команду. Обратите внимание, что программа жюри может играть не оптимально, в таком случае вам необходимо использовать шанс и все равно максимизировать суммарную силу своей команды. Формально, если в какой-то момент у вас есть возможность набрать суммарную силу героев в \(q\) или больше, независимо от дальнейших ходов программы жюри, вы должны набрать \(q\) или больше для того, чтобы пройти тест. Протокол взаимодействия Когда очередь ходить ваша, выведите одно целое число \(x\) (\(1 \le x \le 2n\)) — индекс героя, которого вы выбираете. Обратите внимание, вы не можете выбрать героя, которого ранее выбрали вы либо другой игрок, и вы должны следовать правилу о специальных парах героев. Когда очередь ходить вашему сопернику, считайте одно целое число \(x\) (\(1 \le x \le 2n\)) — индекс героя, выбранного другой командой. Гарантируется, что выбранный герой не будет выбран ранее; гарантируется, что соперник будет следовать правилу о специальных парах героев. После последнего хода вы должны завершиться, не выводя ничего. После вывода хода не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Ход жюри \(-1\) означает, что ваша программа сделала некорректный ход. Ваша программа должна немедленно завершиться после прочтения ответа \(-1\), вы получите вердикт Неправильный ответ. В противном случае вы можете получить любой вердикт, так как программа продолжит чтение из закрытого потока. Примечание В первом примере первый ход ваш. В примере вы выбираете \(6\), другая команда обязана выбрать \(2\). Вы выбираете \(5\), другая команда выбирает \(4\). Наконец, вы выбираете \(3\), а другая команда выбирает \(1\). Во втором примере вы ходите вторыми. Соперник выбирает \(6\), вы выбираете \(5\), заставляя соперника выбрать \(1\). Затем вы выбираете \(4\), другая команда выбирает \(3\) и вы выбираете \(2\).
| |
|
|
D. Укрась яблоню
графы
Деревья
дп
жадные алгоритмы
Конструктив
поиск в глубину и подобное
сортировки
*1600
В саду Аркадия растет одна яблоня. Ее можно представить как множество точек развилок, соединенных ветками так, что между любыми двумя развилками существует ровно один путь по веткам. Развилки пронумерованы от \(1\) до \(n\), развилка номер \(1\) называется корнем. Поддеревом развилки \(v\) называется множество развилок \(u\) таких, что путь из \(u\) в корень проходит через \(v\). Обратите внимание, сама вершина \(v\) тоже входит в поддерево \(v\). Листом называется такая развилка, поддерево которой содержит только одну развилку. Скоро Новый год, поэтому Аркадий решил украсить яблоню. Он повесит по лампочке некоторого цвета на каждый лист и затем посчитает число счастливых развилок. Счастливой развилкой называется такая развилка \(t\), что все лампочки в поддереве \(t\) имеют различные цвета. Аркадий заинтересован в следующем вопросе: для каждого \(k\) от \(1\) до \(n\), какое минимальное число различных цветов лампочек необходимо, чтобы число счастливых развилок было не меньше \(k\)? Выходные данные Выведите \(n\) целых чисел. \(i\)-е из них должно быть равно минимальному количеству цветов, необходимых для того, чтобы число счастливых развилок было не меньше \(i\). Примечание В первом примере для \(k = 1\) и \(k = 2\) можно все лампочки сделать одного цвета: счастливыми будут развилки \(2\) и \(3\). Для \(k = 3\) нужно повесить лампочки разных цветов, тогда все развилки будут счастливыми. Во втором примере для \(k = 4\) можно, например, повесить лампочки цвета \(1\) в развилки \(2\) и \(4\), а лампочку цвета \(2\) в развилку \(5\). Тогда счастливыми будут развилки \(2\), \(3\), \(4\) и \(5\).
| |
|
|
B. Экспонат
жадные алгоритмы
реализация
сортировки
*1400
Вы пришли на выставку и один экспонат привлёк ваше внимание. Он состоит из \(n\) колонн, где \(i\)-я колонна состоит из \(a_i\) блоков стоящих на полу. Высота экспоната равна \(m\), а значит количество блоков в каждой колонне не превосходит \(m\). На потолке есть камера, которая снимает вид экспонат сверху, а также ещё одна камера расположена сбоку и снимает боковой вид этого экспоната. Выясните какое наибольшее количество блоков можно удалить так, чтобы вид ни из первой камеры, ни из второй не поменялся. Обратите внимание, что изначально все блоки «прижаты» к полу, однако не требуется, чтобы это было верно после удаления удаляемых блоков. На экспонат не действует гравитация, а значит ни один блок не упадёт вниз, даже если убрать блок под ним. Перемещать блоки вручную также не разрешается. Выходные данные Выведите одно целое число — наибольшее количество блоков, которое можно удалить. Примечание Следующие картинки иллюстрируют первый пример и его возможное решение. Синие клетки иллюстрируют удалённые блоки. Всего есть \(10\) синих клеток, а значит ответ \(10\).
| |
|
|
D. Телепередачи
жадные алгоритмы
реализация
сортировки
Структуры данных
*2000
Есть \(n\) телепередач, которые вы хотите посмотреть. Предположим, что всё время разбито на равные отрезки называемые «минутами». Тогда \(i\)-я телепередача идёт с \(l_i\)-й по \(r_i\)-ю минуту, оба конца включительно. Конечно, чтобы посмотреть телепередачу нужен телевизор, а также нельзя смотреть две телепередачи идущие одновременно на одном телевизоре. Из-за этого, возможно, в некоторые минуты вам понадобится более одного телевизора. В частности, если отрезки \([l_i, r_i]\) и \([l_j, r_j]\) пересекаются, то телепередачи \(i\) и \(j\) нельзя смотреть одновременно на одном телевизоре. После того как вы начали смотреть какую-то телепередачу на каком-то телевизоре её нельзя «переместить» на другой телевизор (это было бы слишком отвлекающим действием), а также нельзя начать смотреть другую телепередачу на том же телевизоре пока эта телепередача не закончится. К счастью, рядом с вами есть магазин по аренде телевизоров. Он сдаёт телевизор в аренду за \(x\) рупий и взимает \(y\) (\(y < x\)) рупий за каждую следующую минуту, в течении которой вы держите телевизор у себя. В частности, чтобы арендовать один телевизор на время \([a; b]\) нужно заплатить \(x + y \cdot (b - a)\) рупий. Считайте, что аренда и возврат телевизора не занимает времени и не отвлекает от просмотра других телепередач. Выясните минимальное возможное количество денег, которое нужно заплатить, чтобы посмотреть все телепередачи. Так как это значение может быть достаточно велико, выведите его по модулю \(10^9 + 7\). Выходные данные Выведите одно целое число — минимальную стоимость просмотра всех телепередач, взятую по модулю \(10^9 + 7\). Примечание В первом примере оптимально арендовать \(3\) телевизора и посмотреть: - Телепередачу \([1, 2]\) на первом телевизоре,
- Телепередачу \([4, 10]\) на втором телевизоре,
- Тепередачи \([2, 4], [5, 9], [10, 11]\) на третьем телевизоре.
Таким образом, стоимость аренды первого телевизора равна \(4 + 3 \cdot (2 - 1) = 7\), второго \(4 + 3 \cdot (10 - 4) = 22\) и треьего \(4 + 3 \cdot (11 - 2) = 31\), что в сумме составляет \(60\) рупий. Во втором примере оптимально посмотреть каждую телепередачу на отдельном телевизоре. В третьем примере тоже оптимально посмотреть каждую телепередачу на отдельном телевизоре. Обратите внимание, что ответ нужно вывести по модулю \(10^9 + 7\).
| |
|
|
B. Таксисты и Lyft
реализация
сортировки
*1200
Пало-Алто — необычный город, ведь он представляет собой бесконечную координатную прямую. Он известен еще тем, что там находится офис Lyft Level 5. Lyft стал настолько популярным, что его сейчас используют все \(m\) таксистов в городе, которые каждый день подвозят остальных жителей города — \(n\) пешеходов. Каждый житель (включая таксистов) Пало-Алто живёт в точке с уникальной координатой (нет такой пары жителей, что их координата одинаковая). Система Lyft очень умная: когда человек вызывает такси, то его вызов идет не ко всем таксистам, а только к тому, который является ближайшим к этому человеку, а если таких несколько, то к тому, у кого меньше текущая координата. Однажды утром таксистам стало интересно: а сколько же есть людей, от которых они могут получить первый вызов в этот день? Другими словами, надо для каждого таксиста \(i\) найти число \(a_{i}\) — количество пешеходов, для которых \(i\)-й таксист — ближайший, или, если таких таксистов несколько, имеет среди таковых наименьшую координату. Таксист не может подвезти самого себя или других таксистов. Выходные данные Выведите \(m\) чисел \(a_1, a_2, \ldots, a_{m}\), где \(a_i\) — ответ для \(i\)-го таксиста. Таксист имеет номер \(i\), если среди всех таксистов он живет в \(i\)-й по величине координате (смотрите примеры для лучшего понимания). Примечание В первом примере у нас всего один таксист, значит заказ от любого из \(n\) пешеходов будет идти к нему. Во втором примере первый таксист живет в точке с координатой \(2\), а второй — с координатой \(6\). Очевидно, что ближайший таксист к пешеходу, который живет на координате \(3\) — это первый, а к пешеходу, который живет на координате \(5\) — это второй. Пешеход, который живет в координате \(4\), имеет одинаковое расстояние как до первого, так и до второго таксиста, но поскольку первый таксист имеет меньшую координату, вызов от данного пешехода будет идти к первому таксисту. В третьем примере у нас один пешеход и ближайший к нему таксист — четвёртый.
| |
|
|
D. Вырезание массива
Бинарный поиск
сортировки
*1600
Вам дан массив \(s\) из \(n\) целых чисел. Вам нужно найти любой массив \(t\) длины \(k\), такой, что можно вырезать максимально возможное число копий \(t\) из \(s\). Вырезание копии \(t\) проводится следующим образом: для каждого элемента \(t_i\) массива \(t\) надо найти элемент, равный \(t_i\), в \(s\), после чего удалить его из \(s\). Если для какого-то \(t_i\) нельзя найти равный элемент в \(s\), то вырезать еще одну копию \(t\) нельзя. В обоих массивах элементы могут повторяться. К примеру, если \(s = [1, 2, 3, 2, 4, 3, 1]\) и \(k = 3\), то один из возможных ответов — следующий: \(t = [1, 2, 3]\). Этот массив \(t\) можно вырезать \(2\) раза. - Первую копию \(t\) можно вырезать следующим образом: \([1, \underline{\textbf{2}}, 3, 2, 4, \underline{\textbf{3}}, \underline{\textbf{1}}]\) (использовать выделенные элементы). После вырезания первой копии \(t\) массив \(s\) станет \([1, 3, 2, 4]\).
- Вторую копию \(t\) можно вырезать следующим образом: \([\underline{\textbf{1}}, \underline{\textbf{3}}, \underline{\textbf{2}}, 4]\). После вырезания второй копии \(t\) массив \(s\) станет \([4]\).
Вы должны найти такой массив \(t\), что можно вырезать максимально возможное количество копий \(t\) из \(s\). Если ответов несколько, выведите любой из них. Выходные данные Выведите \(k\) целых чисел — элементы массива \(t\), такие, что можно вырезать максимально возможное количество копий этого массива из \(s\). Если ответов несколько, выведите любой из них. Массив \(t\) может содержать повторяющиеся элементы. Все элементы \(t\) (\(t_1, t_2, \dots, t_k\)) должны удовлетворять следующему ограничению: \(1 \le t_i \le 2 \cdot 10^5\). Примечание Первый тест описан в условии. Во втором тесте ответ \([7, 3, 1, 3]\) (или любая его перестановка). Можно показать, что нельзя вырезать более \(2\) копий любого массива, удовлетворяющего условию задачи. В третьем примере можно вырезать массив \(t\) \(5\) раз.
| |
|
|
E. Тематические контесты
жадные алгоритмы
сортировки
*1800
Поликарп подготовил \(n\) задач по программированию, \(i\)-я задача имеет тему \(a_i\). Темы задач могут совпадать. Поликарп планирует провести серию тематических контестов. Задачи каждого из контестов будут полностью на какую-то одну тему, и темы всех контестов должны быть попарно различны. Он может использовать не все подготовленные задачи. Допустимо, что на какие-то темы не будут проведены контесты. Поликарп проведет контесты в несколько последовательных дней, по одному контесту в день. Он хочет провести контесты так, чтобы выполнялись условия: - количество задач в каждом контесте было ровно вдвое больше количества задач в предыдущем контесте (т.е. день назад), количество задач в первом контесте может быть любым;
- общее суммарное количество задач во всех контестах серии должно быть максимально.
Ваша задача найти максимальное суммарное количество задач, которые могут быть использованы в серии тематических контестов. Заметим, что максимизировать количество контестов не надо. Выходные данные Выведите одно целое число — максимальное суммарное количество задач в серии тематических контестов. Примечание В первом примере оптимальная серия контестов — \(2\) задачи на тему \(1\), \(4\) задачи на тему \(2\), \(8\) задач на тему \(10\). В втором примере оптимальная серия контестов — \(3\) задачи на тему \(3\), \(6\) задач на тему \(6\). В третьем примере Поликарп проведёт один контест из \(3\) задач на тему \(1337\). Таким образом, ответ равен \(3\).
| |
|
|
B. Типы данных
математика
сортировки
*1400
Туфтуф, младший брат Таттаха, недавно начал изучать программирование. Его старший брат — очень хороший программист, и заветная мечта Туфтуфа — перегнать его. Будучи студентом в GUC Туфтуф учится писать программы на языке Gava. Сегодня Туфтуф познакомился с беззнаковыми целыми типами данных. В языке Gava есть n беззнаковых целых типов данных. Их размеры (в битах): a1, a2, ... an. Тип данных номер i имеет размер ai бит, то есть в него помещается любое число от 0 до 2ai - 1 включительно. Туфтуф думает начать изучать другой язык программирования вместо Gava. Он решил, что бросит Gava, если выяснится, что существует такое целое число x, что x помещается в тип i (в ai бит), но при этом x·x не помещается в другой тип j (в aj бит), такой что ai < aj. Зная все ai определите, бросит ли Туфтуф изучать Gava. Выходные данные Выведите «YES» если Туфтуф бросит Gava и «NO» в противном случае. Примечание Во втором примере x = 7 (1112) помещается в 3 бита, но x2 = 49 (1100012) не помещается в 4 бита.
| |
|
|
F. Катя и наборы отрезков
интерактив
сортировки
Структуры данных
*2400
У Кати сегодня важный день, у неё экзамен по программированию. Как всегда, ей дали интересную задачу и она легко с ней справилась. А справитесь ли вы с этой задачей? Вам дано \(n\) упорядоченных наборов из отрезков. Каждый отрезок может быть представлен как пара целых чисел \([l, r]\), где \(l\leq r\). Каждый набор может содержать произвольное количество отрезков (даже \(0\)), возможно, что некоторые из них будут одинаковыми. Также у вас есть \(m\) запросов, каждый из которых в виде четырех целых чисел: \(a, b, x, y\). Для каждого запроса вам нужно проверить верно ли, что в каждом наборе с номером \(p\) (\(a\leq p\leq b\)), есть хотя бы один отрезок \([l, r]\), что целиком лежит на отрезке \([x, y]\), то есть \(x\leq l\leq r\leq y\). Найдите ответ для каждого запроса. Обратите внимание, что вам нужно решить эту задачу онлайн. То есть, вы получите новый запрос только после того, как ответите на предыдущий. Выходные данные Для каждого запроса в отдельной строке выведите ответ «yes», или «no». Протокол взаимодействия После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Примечание Для первого запроса утверждение не истинно, поскольку второй набор не содержит отрезка что лежит в отрезке \([2, 3]\). Для второго запроса первый набор содержит отрезок \([2, 3]\), а второй набор содержит отрезок \([2, 4]\). В третьем запросе первому набору подходит отрезок \([2, 3]\), второму набору подходит отрезок \([2, 4]\), а третьему набору отрезок \([2, 5]\). В четвертом запросе второй набор не содержит ни одного отрезка что лежит в отрезке \([3, 6]\). В пятом запросе второму набору подходит отрезок \([2, 4]\), третьему набору подходит отрезок \([2, 5]\), а четвертому набору подходит отрезок \([7, 9]\).
| |
|
|
D. Максимальное расстояние
графы
кратчайшие пути
снм
сортировки
*1800
Chouti устал от утомительного домашнего задания и решил открыть старую задачу, которую он придумал несколько лет назад. Дан связный неориентированный граф, состоящий из \(n\) вершин и \(m\) взвешенных ребер. Также есть \(k\) выделенных вершин: \(x_1, x_2, \ldots, x_k\). Определим стоимость пути как максимальный вес среди рёбер на пути, а расстояние между двумя вершинами как минимальную стоимость пути, их соединяющего. Для каждой выделенной вершины найдите другую выделенную вершину, которая является максимально далёкой от неё (в терминах абзаца выше, то есть соответствующее расстояние максимально возможное), и выведите расстояние между ними. Оригинальные ограничения очень маленькие, поэтому он подумал, что задача скучная. Теперь он увеличил ограничения и надеется, что вы можете решить эту задачу за него. Выходные данные В единственной строке выведите \(k\) целых чисел, где \(i\)-е из них должно равняться расстоянию между вершиной \(x_i\) и самой далёкой от неё выделенной вершиной. Примечание В первом примере, расстояние между вершинами \(1\) и \(2\) равно \(2\), потому что можно пройти по ребру веса \(2\), соединяющему их. Поэтому, расстояние до самой далекой точки от обеих вершин \(1\) и \(2\) равно \(2\). Во втором примере, расстояние между вершинами \(1\) и \(2\) и расстояние между вершинами \(1\) и \(3\) равны \(3\), а расстояние между вершинами \(2\) и \(3\) равно \(2\). В графе могут содержаться параллельные ребра и петли, как в первом примере.
| |
|
|
C. Мультипредметная олимпиада
жадные алгоритмы
сортировки
*1600
Мультипредметная олимпиада приближается! Соревнование проводится по \(m\) различным предметам, давая свободу выбора самим участникам. И теперь Александру (тренеру) необходимо собрать делегацию для поездки на олимпиаду среди своих воспитанников. У Александра на выбор есть \(n\) кандидатов. Для \(i\)-го человека Алекс знает предмет \(s_i\) на котором данный кандидат специализируется и \(r_i\) — уровень его навыка в данной специализации (этот уровень даже может быть отрицательным!). Правила олимпиады требуют, чтобы каждая делегация выбрала некоторое подмножество из предметов, в которых она будет соревноваться. Единственное ограничение состоит в следующем: в каждом выбранном предмете должно выступать одинаковое количество представителей одной делегации. Алекс решил, что каждый кандидат будет выступать только в предмете, в котором он специализируется. И теперь его волнует вопрос: кого он должен выбрать, чтобы максимизировать общую сумму навыков всех делегатов, или же лучше пропустить олимпиаду в этом году, если любая допустимая делегация имеет отрицательную сумму. (Конечно, у Александра нет лишних денег, поэтому все выбранные делегаты должны участвовать в олимпиаде). Выходные данные Выведите единственное число — максимальную возможную сумму навыков делегатов, которые образуют допустимую (по правилам олимпиады) делегацию, либо \(0\) если если любая допустимая делегация имеет отрицательную сумму. Примечание В первом примере выгодно выбрать кандидатов \(1\), \(2\), \(3\), \(4\), по двое во \(2\)-м и \(3\)-м предметах. Общая сумма равна \(6 + 6 + 5 + 5 = 22\). Во втором примере выгодно выбрать кандидатов \(1\), \(2\) и \(5\). По одному делегату в каждом предмете и общая сумма равна \(6 + 6 + 11 = 23\). В третьем примере невозможно получить неотрицательную сумму.
| |
|
|
B. Ехаб и вычитания
реализация
сортировки
*1000
Вам дан массив \(a\). Необходимо повторить следующую операцию \(k\) раз: найти минимальный ненулевой элемент в массиве, вывести его, а затем вычесть его из всех ненулевых элементов массива. Если все элементы нули, просто выведите 0. Выходные данные Выводите минимальные ненулевые элементы перед каждой операцией, по одному в строке. Примечание В первом примере: На первом шаге: массив равен \([1,2,3]\), и минимальный ненулевой элемент в нем это 1. На втором шаге: массив равен \([0,1,2]\), и минимальный ненулевой элемент в нем это 1. На третьем шаге: массив равен \([0,0,1]\), и минимальный ненулевой элемент в нем это 1. На четвертом и пятом шаге массив равен \([0,0,0]\), поэтому вы должны вывести 0. Во втором примере: На первом шаге: массив равен \([10,3,5,3]\), и минимальный ненулевой элемент в нем это 3. На втором шаге: массив равен \([7,0,2,0]\), и минимальный ненулевой элемент в нем это 2.
| |
|
|
D. Счастливая сортировка
Конструктив
сортировки
*2000
Петя любит счастливые числа. Всем известно, что счастливыми являются положительные целые числа, в десятичной записи которых содержатся только счастливые цифры 4 и 7. Например, числа 47, 744, 4 являются счастливыми, а 5, 17, 467 — не являются. Пете на день рождения подарили массив из n чисел. Сейчас он хочет отсортировать его по неубыванию. Но выполнять обычную сортировку скучно, поэтому Петя придумал ограничение: можно менять местами любые два числа, но только если хотя бы одно из них — счастливое. Ваша задача — отсортировать массив, учитывая заданное ограничение. Найдите любую возможную последовательность обменов, количество операций в которой не превышает 2n. Выходные данные В первой строке выведите число k (0 ≤ k ≤ 2n) — количество обменов в сортировке. В следующих k строках выведите по одной паре различных чисел — номера элементов, которые нужно обменять местами. Числа в массиве нумеруются начиная с единицы. Если сортировка невозможна, выведите единственное число -1. Если решений несколько, выведите любое. Обратите внимание, что минимизировать k не требуется. Подойдет любая сортировка, количество обменов в которой не превышает 2n.
| |
|
|
E. Новый год и оценка знакомых
Бинарный поиск
графы
жадные алгоритмы
математика
реализация
сортировки
Структуры данных
*2400
Боб — активный пользователь социальной сети Faithbug. В этой сети люди могут становиться взаимными друзьями. То есть, если \(a\) является другом \(b\), то \(b\) также является другом \(a\). Таким образом у каждого пользователя есть неотрицательное количество друзей. Сегодня утром кто-то анонимно отправил Бобу следующую ссылку: задача о реализации графа. Боб хочет узнать, кто это был. Для этого ему сначала нужно узнать, как выглядит эта сеть. Он исследовал профиль каждого человека в сети и записал количество его друзей. Однако он забыл записать количество своих друзей. Помогите ему узнать, сколько у него друзей. Поскольку возможных ответов может быть много, выведите все возможные количества. Выходные данные Выведите все возможные значения \(a_{n+1}\) — количества людей, с которыми Боб может быть друзями, в порядке возрастания. Если ни одного решения не существует, выведите \(-1\). Примечание В первом примере единственное решение заключается в том, чтобы каждый был другом каждому. Поэтому у Боба может быть только \(3\) друга. Во втором примере есть три возможных решения (кроме симметричных): - \(a\) — друг \(b\), \(c\) — друг \(d\), а у Боба нет друзей, или
- \(a\) — друг \(b\), а также и \(c\), и \(d\) — друзья Боба, или
- Боб — друг каждому.
Третий пример решить невозможно, так как второму человеку нужно быть другом каждому, но у первого нет друзей.
| |
|
|
B. Формирование команд
сортировки
*800
В университете учатся \(n\) студентов. Количество студентов четно. Умение \(i\)-го студента программировать равно \(a_i\). Тренер хочет сформировать \(\frac{n}{2}\) команд. Каждая команда должна состоять ровно из двух студентов, а каждый студент должен принадлежать ровно одной команде. Два студента могут сформировать команду только тогда, когда их умение программировать одинаково (иначе они не смогут понять друг друга и не смогут сформировать команду). Студенты могут решать задачи, чтобы улучшать их умение программировать. Одна решенная задача увеличивает умение программировать на один. Тренер хочет знать, какое минимальное количество задач студентам необходимо решить, чтобы сформировать ровно \(\frac{n}{2}\) команд (то есть каждая пара студентов должна формировать команду). Ваша задача — найти это количество. Выходные данные Выведите одно целое число — минимальное количество задач, которое необходимо решить студентам, чтобы сформировать ровно \(\frac{n}{2}\) команд. Примечание В первом тестовом примере оптимальными будут команды: \((3, 4)\), \((1, 6)\) и \((2, 5)\), где числа в скобках являются номерами студентов. Тогда для того, чтобы сформировать первую команду, третий студент должен решить \(1\) задачу, чтобы сформировать вторую команду, никто не должен решать задачи, и чтобы сформировать третью команду, второй студент должен решить \(4\) задачи, таким образом ответ равен \(1 + 4 = 5\). Во втором тестовом примере первый студент должен решить \(99\) задач, чтобы сформировать команду со вторым.
| |
|
|
B. Перестановка букв
жадные алгоритмы
Конструктив
сортировки
Строки
*900
Задана строка \(s\), состоящая только из строчных букв латинского алфавита. Вы можете переставлять буквы этой строки так, как угодно. Ваша задача заключается в том, чтобы получить хорошую строку при помощи перестановки букв заданной строки, либо сказать, что это невозможно сделать. Назовем строку хорошей, если она не является палиндромом. Палиндром — это строка, которая читается слева направо также, как и справа налево. Например, строки «abacaba», «aa» и «z» являются палиндромами, а строки «bba», «xd» — нет. Вам необходимо ответить на \(t\) независимых запросов. Выходные данные Выведите \(t\) строк. В \(i\)-й строке выведите ответ на \(i\)-й запрос: -1, если невозможно получить хорошую строку при помощи перестановки букв строки \(s_i\), иначе любую хорошую строку, которую можно получить из заданной (при помощи перестановки букв). Примечание В первом запросе невозможно переставить буквы таким образом, чтобы получить хорошую строку. Другие примеры (не все) корректных ответов на второй запрос: «ababaca», «abcabaa», «baacaba». В третьем запросе необязательно что-то делать, чтобы получить хорошую строку.
| |
|
|
C. Разбиение и объединение
сортировки
*1500
Задано \(n\) отрезков \([l_i, r_i]\) для всех \(1 \le i \le n\). Ваша задача — разделить все отрезки на две непустые группы таким образом, чтобы не существовало пары отрезков из разных групп, имеющих хотя бы одну общую точку, или же сказать, что это сделать невозможно. Каждый отрезок должен принадлежать ровно одной из групп. Чтобы оптимизировать процесс тестирования, будет дан мультитест. Выходные данные Для каждого запроса выведите \(n\) целых чисел \(t_1, t_2, \dots, t_n\) (\(t_i \in \{1, 2\}\)) — для каждого отрезка (в том же порядке, что и во входных данных) \(t_i\) равно \(1\), если \(i\)-й отрезок принадлежит первой группе, или же \(2\) иначе. Если существует несколько возможных ответов, вы можете вывести любой из них. Если ответа не существует, выведите \(-1\). Примечание В первом запросе первый и второй отрезки должны быть в разных группах, но точный порядок чисел не важен. Во втором запросе третий отрезок пересекается с первым и вторым отрезками, таким образом они должны находиться в одной группе, но другая группа при этом окажется пустой, поэтому ответ равен \(-1\). В третьем запросе мы можем распределить отрезки любым образом, которые делает группы непустыми, так что любой ответ из \(6\) возможных подходит.
| |
|
|
B. K-покраска массива
жадные алгоритмы
сортировки
*1400
Задан массив \(a\), состоящий из \(n\) целых чисел. Вам необходимо покрасить этот массив в \(k\) цветов таким образом, чтобы: - Каждый элемент массива должен быть покрашен в какой-то цвет;
- Для всех \(i\) от \(1\) до \(k\) существует хотя бы один элемент массива, покрашенный в \(i\)-й цвет;
- Для всех \(i\) от \(1\) до \(k\) все элементы, покрашенные в \(i\)-й цвет, должны быть различны.
Очевидно, что такой раскраски может не существовать. В этом случае выведите «NO». Иначе выведите «YES» и любую раскраску (то есть числа \(c_1, c_2, \dots c_n\), где \(1 \le c_i \le k\), а \(c_i\) означает цвет \(i\)-го элемента заданного массива), удовлетворяющую ограничениям, описанным выше. Если существует несколько возможных ответов, выведите любой. Выходные данные Если ответа не существует, выведите «NO». Иначе выведите «YES» и любую раскраску (то есть числа \(c_1, c_2, \dots c_n\), где \(1 \le c_i \le k\), а \(c_i\) означает цвет \(i\)-го элемента заданного массива), удовлетворяющую ограничениям, описанным выше. Если существует несколько возможных ответов, выведите любой. Примечание В первом тестовом примере также допустим ответ \(2~ 1~ 2~ 1\). Во втором тестовом примере также допустим ответ \(1~ 1~ 1~ 2~ 2\). Также существуют другие возможные ответы на оба тестовых примера.
| |
|
|
E. Монотонная перенумерация
Комбинаторика
сортировки
*1700
Дан массив \(a\), состоящий из \(n\) целых чисел. Назовем монотонной перенумерацией массива \(a\) такой массив \(b\), состоящий из \(n\) целых чисел, что выполняются все следующие условия: - \(b_1 = 0\);
- для каждой пары индексов \(i\) и \(j\), такой, что \(1 \le i, j \le n\), если \(a_i = a_j\), то \(b_i = b_j\) (обратите внимание: если \(a_i \ne a_j\), все равно возможно \(b_i = b_j\));
- для каждого индекса \(i \in [1, n - 1]\) либо \(b_i = b_{i + 1}\), либо \(b_i + 1 = b_{i + 1}\).
Например, если \(a = [1, 2, 1, 2, 3]\), то две монотонные перенумерации \(a\) — следующие: \(b = [0, 0, 0, 0, 0]\) и \(b = [0, 0, 0, 0, 1]\). Посчитайте количество различных монотонных перенумераций \(a\). Ответ может быть большим, поэтому выведите его остаток от деления на \(998244353\). Выходные данные Выведите одно целое число — количество монотонных перенумераций \(a\) по модулю \(998244353\).
| |
|
|
C. Лунный новый год и разделение чисел
жадные алгоритмы
математика
реализация
сортировки
*900
Приближается лунный новый год, а Боб все еще мучается со своей домашней работой — задачей о разделении чисел. Даны \(n\) положительных целых чисел \(a_1, a_2, \ldots, a_n\), где \(n\) всегда четно. Боб должен разделить эти числа на группы, причем каждая группа должна содержать хотя бы \(2\) числа. Предположим, что числа разделены на \(m\) групп, и сумма чисел в \(j\)-й группе равна \(s_j\). Цель Боба — минимизировать сумму квадратов \(s_j\), то есть \(\)\sum_{j = 1}^{m} s_j^2.\(\) Боб никак не может решить эту задачу. Можете ему помочь? Выходные данные Выведите одно целое число, равное минимальной возможной сумме \(s_j\), то есть \(\)\sum_{i = j}^{m} s_j^2,\(\) где \(m\) — число групп чисел. Примечание В первом примере одно из оптимальных решений — разделить эти \(4\) числа на \(2\) две группы: \(\{2, 8\}, \{5, 3\}\). Ответ равен \((2 + 8)^2 + (5 + 3)^2 = 164\). Во втором примере одно из оптимальных решений — разделить эти \(6\) чисел на \(3\) группы: \(\{1, 2\}, \{1, 2\}, \{1, 2\}\). Ответ равен \((1 + 2)^2 + (1 + 2)^2 + (1 + 2)^2 = 27\).
| |
|
|
C. Brutality
жадные алгоритмы
сортировки
*1300
Вы играете в новую часть знаменитого файтинга: Kortal Mombat XII. Вы хотите совершить brutality на персонаже вашего противника. Вы играете в игру на консоли нового поколения, поэтому на вашем геймпаде есть \(26\) кнопок. На каждой кнопке записана строчная буква латинского алфавита от 'a' до 'z'. Все буквы на кнопках попарно различны. Вам задана последовательность ударов, \(i\)-й удар наносит \(a_i\) единиц урона персонажу противника. Чтобы совершить \(i\)-й удар, вам необходимо нажать кнопку \(s_i\) на вашем геймпаде. Удары пронумерованы от \(1\) до \(n\). Вы знаете, что если вы нажмете какую-то кнопку больше, чем \(k\) раз подряд, то она сломается. Вы очень дорожите своим геймпадом и не хотите ломать никакую из его кнопок. Чтобы совершить brutality, вам необходимо нанести некоторые удары из заданной последовательности. Вы можете пропустить любой из них, но менять изначальный порядок ударов вам запрещено. Суммарный нанесенный урон равен сумме \(a_i\) по всем \(i\) среди ударов, которые не были пропущены. Заметьте, что если вы пропускаете удар, тогда счетчик последовательных нажатий кнопки не будет сброшен. Ваша задача — пропустить сколько-то ударов таким образом, чтобы нанести максимально возможный урон персонажу противника и не сломать ни одну из кнопок вашего геймпада. Выходные данные Выведите одно целое число \(dmg\) — максимально возможный урон персонажу противника, который вы можете нанести без поломки кнопок вашего геймпада. Примечание В первом тестовом примере вы можете выбрать удары с номерами \([1, 3, 4, 5, 6, 7]\) с суммарным уроном \(1 + 16 + 18 + 7 + 2 + 10 = 54\). Во втором тестовом примере вы можете выбрать все удары, таким образом максимальный урон равен \(2 + 4 + 1 + 3 + 1000 = 1010\). В третьем тестовом примере вы можете выбрать все удары кроме третьего, таким образом максимальный урон равен \(2 + 4 + 3 + 1000 = 1009\). В четвертом тестовом примере вы можете выбрать удары с номерами \([2, 3, 6, 8]\). Только таким способом вы можете достичь максимального суммарного урона \(15 + 2 + 8 + 16 = 41\). В пятом тестовом примере вы можете выбрать только удары с номерами \([2, 4, 6]\) с максимальным суммарным уроном \(18 + 19 + 15 = 52\). В шестом тестовом примере вы можете выбрать либо первый удар, либо второй удар (это не имеет значения) с суммарным уроном \(10\).
| |
|
|
F. Вася и бесконечные кредиты
графы
дп
Паросочетания
Потоки
сортировки
*2600
Вася решил купить себе шикарную новую машину. К сожалению, ему немного не хватает денег. Сейчас у него есть 0 бурлей. В местном банке есть \(n\) предложений по кредитам. Каждое предложение описывается тремя числами \(a_i\), \(b_i\) и \(k_i\). Предложения пронумерованы от \(1\) до \(n\). Если Вася пользуется \(i\)-м предложением, то банк выдает ему \(a_i\) бурлей в начале месяца, а потом забирает по \(b_i\) бурлей в конце каждого из \(k_i\) следующих месяцев (включая месяц, в который кредит был взят). Вася может брать предложения в любом порядке. В каждый месяц Вася может брать не более одного кредитного предложения. К тому же каждое кредитное предложение может быть использовано не более одного раза. Несколько кредитов могут быть активны в одно и то же время. Это подразумевает, что Вася платит банку сумму \(b_i\) по всем \(i\) активных кредитов в конце каждого из месяцев. Вася хочет купить машину в середине некоторого месяца. Он просто берет все деньги, которые у него есть на текущий момент, и покупает машину ровно этой цены. Васю не особо заботит, сколько он должен будет заплатить банку после покупки машины. Он просто уедет на своей машине из страны, так что банк не сможет его найти. Какая максимальная цена может быть у новой машины? Выходные данные Выведите одно целое число — максимальную цену машины. Примечание В первом примере оптимальная последовательность взятых кредитов такова: 4 \(\rightarrow\) 3. Количество бурлей у Васи меняется следующим образом: 5 \(\rightarrow\) 32 \(\rightarrow\) -86 \(\rightarrow\) .... Он забирает деньги в середине второго месяца (32 бурля) и покупает машину. Отрицательное число бурлей значит, что Вася должен заплатить банку эту сумму денег. Во втором примере оптимальная последовательность взятых кредитов такова: 3 \(\rightarrow\) 1 \(\rightarrow\) 2. Количество бурлей у Васи меняется следующим образом: 0 \(\rightarrow\) 300 \(\rightarrow\) 338 \(\rightarrow\) 1337 \(\rightarrow\) 236 \(\rightarrow\) -866 \(\rightarrow\) ....
| |
|
|
B. Лента
жадные алгоритмы
сортировки
*1400
У вас есть длинная палка, состоящая из \(m\) отрезков, пронумерованных от \(1\) до \(m\). Каждый отрезок имеет длину равную \(1\) сантиметру. Однако, некоторые отрезки сломались и требуют починки. У вас также есть бесконечно-длинная ремонтная лента. Вы хотели бы вырезать несколько кусочков из этой ленты так, чтобы покрыть все сломанные отрезки. В частности, если разместить кусок ленты целой длины \(t\) в позиции \(s\), то отрезки \(s, s+1, \ldots, s+t-1\) окажутся покрытыми. Разрешается покрывать не сломанные отрезки, также допускается, что какие-то кусочки ленты будут пересекаться. Как говорится, время — деньги, поэтому вы хотите покрыть все сломанные отрезки, вырезав не более \(k\) кусочков ленты. Какую минимальную суммарную длину этих кусочков нужно вырезать? Выходные данные Выведите минимальную суммарную длину кусочков ленты. Примечание В первом примере вы можете использовать кусок длины \(11\), чтобы покрыть сломанные отрезки \(20\) и \(30\), и ещё один кусок длины \(6\), чтобы покрыть \(75\) и \(80\), так что суммарная длина равна \(17\). Во втором примере вы можете вырезать кусок длины \(4\), чтобы покрыть сломанные отрезки \(1\), \(2\), \(4\), и два куска длины \(1\), чтобы покрыть \(60\) и \(87\).
| |
|
|
E. Магические камни
Конструктив
математика
сортировки
*2200
У Гриши есть \(n\) магических камней, пронумерованных от \(1\) до \(n\). Заряд \(i\)-го камня равняется \(c_i\). Иногда Грише становится скучно и он выбирает некоторый внутренний камень (иными словами, камень с индексом \(i\), где \(2 \le i \le n - 1\)), после чего синхронизирует его с соседними камнями. В результате этой операции камень теряет собственный заряд, но приобретает заряды соседних с них камней. То есть его заряд \(c_i\) превращается в \(c_i' = c_{i + 1} + c_{i - 1} - c_i\). У Андрея, друга Гриши, тоже есть \(n\) пронумерованных магических камней с зарядами \(t_i\). Грише интересно, существует ли такая последовательность (из нуля или более) операций синхронизации, которая переводит заряды камней Гриши в заряды соответствующих камней Андрея, то есть превращает \(c_i\) в \(t_i\) для всех \(i\)? Выходные данные Если существует (возможно, пустая) последовательность операций синхронизации, применение которой меняет заряды всех камней на искомые, выведите «Yes». В противном случае выведите «No». Примечание В первом примере можно действовать следующим образом (в \(1\)-индексации): - На первом шаге синхронизируем третий камень: \([7, 2, \mathbf{4}, 12] \rightarrow [7, 2, \mathbf{10}, 12]\).
- На второй шаге синхронизируем второй камень: \([7, \mathbf{2}, 10, 12] \rightarrow [7, \mathbf{15}, 10, 12]\).
Во втором примере любое действие со вторым камнем не изменит его заряд.
| |
|
|
B. Очередная задача про разбиение массива
жадные алгоритмы
Конструктив
сортировки
*1500
Массив \(b\) называется подмассивом массива \(a\), если он образует непрерывный подотрезок \(a\), то есть равен \(a_l\), \(a_{l + 1}\), \(\ldots\), \(a_r\) для некоторых \(l, r\). Пусть \(m\) — некоторая зафиксированная константа. Для любого массива, содержащего хотя бы \(m\) элементов, определим его симпатичность, как сумму \(m\) наибольших элементов этого массива. Например: - Если массив \(x = [4, 3, 1, 5, 2]\) и \(m = 3\), то \(3\) наибольших элемента \(x\) равны \(5\), \(4\) и \(3\), тем самым симпатичность \(x\) равна \(5 + 4 + 3 = 12\).
- Если массив \(x = [10, 10, 10]\) и \(m = 2\), то симпатичность \(x\) равна \(10 + 10 = 20\).
Вам дан массив \(a_1, a_2, \ldots, a_n\), значение константы \(m\) и целое число \(k\). Вам нужно разбить массив \(a\) на ровно \(k\) подмассивов таких, что: - Каждый элемент \(a\) принадлежит ровно одному подмассиву.
- Каждый подмассив содержит хотя бы \(m\) элементов.
- Суммарная симпатичность всех \(k\) подмассивов в разбиении является наибольшей возможной.
Выходные данные В первой строке выведите наибольшую возможную сумму симпатичностей подмассивов в разбиении. Во второй строке выведите \(k-1\) целых чисел \(p_1, p_2, \ldots, p_{k-1}\) (\(1 \le p_1 < p_2 < \ldots < p_{k-1} < n\)) определяющих разбиение массива. - В первый подмассив попадают элементы с индексами от \(1\) до \(p_1\).
- Во второй подмассив попадают элементы с индексами от \(p_1 + 1\) до \(p_2\).
- \(\ldots\).
- Все элементы с индексами от \(p_{k-1} + 1\) до \(n\) попадают в последний, \(k\)-й подмассив.
В случае если есть несколько оптимальных разбиений, выведите любое из них. Примечание В первом примере одно из оптимальных разбиений выглядит как \([5, 2, 5]\), \([2, 4]\), \([1, 1, 3, 2]\). - Симпатичность подмассива \([5, 2, 5]\) равна \(5 + 5 = 10\).
- Симпатичность подмассива \([2, 4]\) равна \(2 + 4 = 6\).
- Симпатичность подмассива \([1, 1, 3, 2]\) равна \(3 + 2 = 5\).
Таким образом, суммарная симпатичность равна \(10 + 6 + 5 = 21\). Во втором примере одно из оптимальных разбиений выглядит как \([4]\), \([1, 3]\), \([2, 2]\), \([3]\).
| |
|
|
B. Эмоции
жадные алгоритмы
математика
сортировки
*1000
В одной очень популярной коллекционной карточной онлайн-игре есть \(n\) эмоций (игра довольно популярна, поэтому не будем упоминать ее название). \(i\)-я эмоция делает оппонента счастливее на \(a_i\) единиц (все мы знаем, что эмоции в этой игре используются для того, чтобы делать оппонентов счастливее). Вы можете использовать некоторые эмоции \(m\) раз. Вы можете использовать любую эмоцию один раз, больше одного раза или не использовать вообще. Единственное ограничение заключается в том, что вы не можете использовать одну и ту же эмоцию более, чем \(k\) раз подряд (иначе оппонент подумает, что вы его троллите). Заметим, что две эмоции \(i\) и \(j\) (\(i \ne j\)) такие, что \(a_i = a_j\), являются различными. Вы хотите сделать оппонента настолько счастливым, насколько это возможно. Найдите максимально возможную величину счастья оппонента. Выходные данные Выведите одно целое число — максимальное счастье оппонента при условии, что вы будете использовать эмоции так, как описано в условии задачи. Примечание В первом примере можно использовать эмоции в соответствии со следующей последовательностью: \(4, 4, 5, 4, 4, 5, 4, 4, 5\).
| |
|
|
B. Алена и узкий холодильник
Бинарный поиск
жадные алгоритмы
Потоки
сортировки
*1300
Недавно Алена купила миниатюрный холодильник, который может быть представлен как таблица из \(h\) строк и \(2\) столбцов. Изначально в холодильнике лишь одна полка в самом низу, но Алена может установить любое число полок внутрь холодильника между любыми двумя рядами. Все полки имеют ширину в две клетки, не занимают места по вертикали, но разделяют холодильник на верхнюю и нижнюю части. Пример холодильника с \(h = 7\) и двумя полками. Полки показаны черным. Рисунок соответствует первому примеру. У Алены есть \(n\) бутылок молока, она хочет поставить их в холодильник. Высота \(i\)-й бутылки равна \(a_i\) клеток, а ширина любой бутылки равна \(1\) клетке. Алена может поставить бутылку на полку, если высота свободного пространства над этой полкой не меньше высоты бутылки. Она не может ставить бутылки друг на друга (если, конечно, между ними нет полки). Бутылки не могут занимать общие клетки в таблице. Алена хочет найти максимальное целое число \(k\) такое, что она может одновременно поставить бутылки с номерами \(1\), \(2\), ..., \(k\) в холодильник. Найдите это наибольшее \(k\). Выходные данные Выведите одно целое число \(k\) — максимальное целое число такое, что Алена может одновременно поставить бутылки с номерами \(1\), \(2\), ..., \(k\) в холодильник. Если Алена может поставить все бутылки, выведите \(n\). Легко понять, что Алена всегда может поставить хотя бы одну бутылку в холодильник. Примечание Один из оптимальных способов постановки бутылок в холодильник в первом примере показан на рисунке в условии. Один из оптимальных способов постановки бутылок в холодильник во втором примере показан на рисунке ниже. Один из оптимальных способов постановки бутылок в холодильник во третьем примере показан на рисунке ниже.
| |
|
|
D. Frets On Fire
Бинарный поиск
сортировки
*1800
Мияко приехала в гости в страну блох с укулеле. Она подружилась с блохами и исполняла им прекрасную музыку каждый день. В благодарность за это блохи изготовили для нее большое укулеле: всего не нем \(n\) струн, на каждой струне \((10^{18} + 1)\) лад, лады пронумерованы от \(0\) до \(10^{18}\). Блохи описывают это укулеле массивом \(s_1, s_2, \ldots, s_n\), что означает, что \(j\)-й лад на \(i\)-й струне издает ноту \(s_i + j\). Мияко скоро уедет из страны блох, но те попросили ее ответить на несколько вопросов. Каждый вопрос имеет следующий вид: «Сколько всего различных нот находятся на ладах с \(l\)-го по \(r\)-й (включительно), если рассматривать все струны?» У Мияко нет времени отвечать на вопросы. Найдите ответы, чтобы помочь ей! Формально, дана таблица из \(n\) строк и \((10^{18}+1)\) столбцов, где в ячейке в \(i\)-м ряду в \(j\)-м столбце (\(0 \le j \le 10^{18}\)) написано число \(s_i + j\). Вам нужно ответить на \(q\) запросов, в \(k\)-м запросе нужно вычислить число различных чисел в таблице в столбцах с \(l_k\)-го по \(r_k\)-й, включительно. Выходные данные Выведите одно целое число для каждого вопросы: число различных нот. Примечание В первом примере ноты на \(6\) струнах выглядят так: \(\) \begin{matrix} \textbf{Лад} & \textbf{0} & \textbf{1} & \textbf{2} & \textbf{3} & \textbf{4} & \textbf{5} & \textbf{6} & \textbf{7} & \ldots \\ s_1: & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & \dots \\ s_2: & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & \dots \\ s_3: & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & \dots \\ s_4: & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & \dots \\ s_5: & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & \dots \\ s_6: & 9 & 10 & 11 & 12 & 13 & 14 & 15 & 16 & \dots \end{matrix} \(\) На ладу \(7\) есть \(5\) различных нот: \(8, 10, 11, 12, 16\). На ладах \(0, 1, 2\) есть \(10\) различных нот: \(1, 2, 3, 4, 5, 6, 7, 9, 10, 11\).
| |
|
|
C. Азбука Морзе
Бинарный поиск
дп
сортировки
Строки
строковые суфф. структуры
Структуры данных
хэши
*2400
В азбуке Морзе каждая буква латинского алфавита определена как строка некоторый длины от \(1\) до \(4\), состоящая из точек и тире. В этой задаче мы будем обозначать точку как «0», а тире как «1». Так как существует \(2^1+2^2+2^3+2^4 = 30\) строк длины от \(1\) до \(4\), состоящих только из «0» и «1», не все из них соответствуют какой-то из \(26\) букв латинского алфавита. А именно, все строки из «0» и/или «1» длины не более \(4\) соответствуют разным буквы латинского алфавита, кроме следующих четырех строк, которые ничему не соответствуют: «0011», «0101», «1110» и «1111». Вы работаете на строке \(S\), которая изначально пуста. \(m\) раз далее либо точка, либо тире будут дописаны к \(S\), по одному символу за раз. Ваша задача — после каждого добавления к строке \(S\) найти количество непустых последовательностей букв латинского алфавита, которые представляются в азбуке Морзе как некоторая подстрока \(S\). Так как ответы могут быть очень большим, выводите их по модулю \(10^9 + 7\). Выходные данные Выведите \(m\) строк, \(i\)-я из которых должна содержать ответ после \(i\)-й модификации \(S\). Примечание Рассмотрим первый тестовый пример, после того, как к \(S\) будут дописаны все буквы, т.е. «111». Как вы можете видеть, «1», «11» и «111» соответствуют каким-то буквам латинского алфавита. Более точно, они переводятся в 'T', 'M', и в 'O', соответственно. Все слова, которые переводятся в подстроку строки \(S\) в азбуке Морзе, таким образом, равны: - «T» (переводится в «1»)
- «M» (переводится в «11»)
- «O» (переводится в «111»)
- «TT» (переводится в «11»)
- «TM» (переводится в «111»)
- «MT» (переводится в «111»)
- «TTT» (переводится в «111»)
Хоть это и не нужно в этой задаче, таблица переводов букв латинского алфавита в азбуку Морзе: здесь.
| |
|
|
C. День рождения
Бинарный поиск
жадные алгоритмы
сортировки
*1200
У ковбоя Влада день рождения! На праздник собрались \(n\) детей. Чтобы поздравить Влада, дети решили водить вокруг него хоровод. Среди детей, пришедших к Владу, есть и высокие, и низкие, поэтому если они встанут в хороводе как угодно, то рядом могут оказаться очень высокий и очень низкий ребёнок, и им будет трудно держаться за руки. Поэтому дети хотят встать в хоровод так, чтобы максимальная разность ростов двух соседних детей была бы минимальной возможной. Формально, пронумеруем детей от \(1\) до \(n\) по кругу, то есть для каждого \(i\) ребёнок с номером \(i\) является соседним с рёбенком с номером \(i+1\), а также ребёнок с номером \(1\), является соседом с ребёнок с номером \(n\). Тогда неудобством этого хоровода назовём максимальный модуль разности ростов детей, которые стоят рядом. Помогите детям определить в каком порядке им надо перестроиться, чтобы минимизировать неудобство получившегося хоровода. Выходные данные Выведите \(n\) целых чисел — роста детей в порядке, в котором они должны встать в хоровод. Вы можете начинать вывод с любого из детей в круге. В случае, если существует несколько возможных ответов — выведите любой из них. Примечание В первом примере неудобство хоровода равно \(1\), так как разности ростов между соседними детьми равны \(1\), \(1\), \(1\) и \(0\). Обратите внимание, что последовательности \([2, 3, 2, 1, 1]\), \([3, 2, 1, 1, 2]\) задают те же хороводы и отличаются лишь началом отсчёта. Во втором примере неудобство хоровода равно \(20\), так как разность ростов детей с ростами \(10\) и \(30\) равна \(20\).
| |
|
|
B. Скидки
жадные алгоритмы
сортировки
*900
Вы зашли в ближайший магазин, чтобы купить несколько плиток шоколада. В магазине продаются \(n\) плиток, \(i\)-я стоит \(a_i\) монет (и вы хотите купить их все). У вас есть \(m\) разных купонов, позволяющих покупать шоколадки на особых условиях. \(i\)-й купон позволяет купить \(q_i\) шоколадок, при этом заплатив только за \(q_i - 1\) наиболее дорогих из них (то есть самая дешевая из \(q_i\) шоколадок вам достанется бесплатно). Вы можете использовать только один купон; если вы используете купон \(i\), вы должны выбрать \(q_i\) шоколадок, которые вы купите по купону, а все остальные \(n - q_i\) плиток вы купите без каких-либо скидок. Чтобы понять, какой купон стоит использовать, вы хотите для каждого купона узнать, какое минимальное количество денег вам придется потратить, если вы используете его оптимально. Выходные данные Выведите \(m\) целых чисел, \(i\)-е из которых должно быть равно минимальному количеству монет, которые вы должны заплатить, если вы купите \(q_i\) шоколадок при помощи \(i\)-го купона, а все остальные — по их полной цене. Примечание Рассмотрим первый пример. Если мы используем первый купон, можно выбрать шоколадки под номерами \(1\), \(6\) и \(7\), и мы заплатим \(18\) монет за них и \(9\) монет за все остальные. Если мы используем второй купон, можно выбрать шоколадки под номерами \(1\), \(5\), \(6\) и \(7\), и мы заплатим \(25\) монет за них и \(5\) монет за все остальные.
| |
|
|
C. Сбалансированная команда
сортировки
*1200
Вы — университетский тренер. Всего в университете под Вашим надзором \(n\) студентов, умение программировать \(i\)-го студента равно \(a_i\). Вы хотите составить команду для нового соревнования по программированию. Как Вы знаете, чем больше студентов на соревновании — тем больше шансов победить! Поэтому Вы хотите составить максимальную по количеству студентов команду. Но Вы также знаете, что команда должна быть сбалансированной. Это означает, что умение программировать каждой пары студентов в команде должно отличаться не более, чем на \(5\). Ваша задача — найти максимально возможное количество студентов в сбалансированной команде. Выходные данные Выведите одно целое число — максимально возможное количество студентов в сбалансированной команде. Примечание В первом тестовом примере Вы можете создать команду с умениями \([12, 17, 15]\). Во втором тестовом примере Вы можете взять всех студентов в команду, потому что их умения программировать равны. В третьем тестовом примере Вы можете создать команду, состоящую из одного студента (и не можете создать команду, состоящую хотя бы из двух студентов).
| |
|
|
E. K сбалансированных команд
дп
сортировки
*1800
Вы — университетский тренер. Всего в университете \(n\) студентов под Вашим надзором, умение программировать \(i\)-го студента равно \(a_i\). Вы хотите составить \(k\) команд для другого нового соревнования по программированию. Как Вы знаете, чем больше студентов на соревновании — тем больше шансов победить! Поэтому Вы хотите составить не более \(k\) непустых команд (и хотя бы одну) таким образом, чтобы суммарное число студентов в них было максимально возможно. Но Вы также знаете, что каждая команда должна быть сбалансированной. Это означает, что умение программировать каждой пары студентов в каждой команде должно отличаться не более, чем на \(5\). Команды являются независимыми друг от друга (это означает, что разница в умении программировать двух студентов из двух разных команд не имеет значения). Возможно, что некоторые студенты не будут включены ни в какие команды вообще. Ваша задача — найти максимально возможное суммарное число студентов в не более, чем \(k\) (и хотя бы одной) непустых сбалансированных командах. Если Вы программируете на Python, рассмотрите возможность отправки решения на PyPy, а не на Python, когда будете отправлять свой код. Выходные данные Выведите одно целое число — максимально возможное суммарное число студентов в не более, чем \(k\) (и хотя бы одной) непустых сбалансированных командах.
| |
|
|
C. Настя транспонирует матрицу
Конструктив
сортировки
*1500
Настя пришла в школу на урок информатики, и известный в узких кругах учитель, который в данный момент преподает у Насти, задал ей такую задачу. Даны две матрицы \(A\) и \(B\), каждая размера \(n \times m\). Настя может сколько угодно раз применять к матрице \(A\) следующую операцию: взять любую квадратную подматрицу матрицы \(A\) и транспонировать её (то есть элемент подматрицы, стоявший в \(i\)-й строке и \(j\)-м столбце этой подматрицы, после операции транспонирования будет стоять в ней в \(j\)-й строке и в \(i\)-м столбце, при этом сама подматрица в уже транспонированном виде останется на том же месте в матрице \(A\)). Требуется ответить, можно ли из матрицы \(A\) получить матрицу \(B\). Пример описанной операции Так как Настя не хочет выполнять эти операции вручную, она просит вас ответить на этот вопрос. Квадратной подматрицей матрицы \(M\) называется матрица, образованная элементами на пересечении множества строк с номерами \(x, x+1, \dots, x+k-1\) матрицы \(M\) и множества столбцов с номерами \(y, y+1, \dots, y+k-1\) матрицы \(M\), где \(k\) — размер квадратной подматрицы. Иными словами, квадратная подматрица — это набор ячеек исходной матрицы, которые образуют сплошной (без пустот) квадрат со сторонами параллельными сторонам исходной матрицы. Выходные данные Выведите «YES» (без кавычек), если вышеуказанными действиями можно превратить матрицу \(A\) в матрицу \(B\), и «NO» (без кавычек), если нельзя. Примечание Рассмотрим третий пример из условия. Изначальная матрица \(A\) имеет вид \(\) \begin{bmatrix} 1 & 2 & 3\\ 4 & 5 & 6\\ 7 & 8 & 9 \end{bmatrix} \(\) Если выбрать как транспонируемую квадратную подматрицу всю матрицу, то после транспонирования получим \(\) \begin{bmatrix} 1 & 4 & 7\\ 2 & 5 & 8\\ 3 & 6 & 9 \end{bmatrix} \(\) Теперь транспонируем матрицу с углами в клетках \((2, 2)\) и \((3, 3)\). \(\) \begin{bmatrix} 1 & 4 & 7\\ 2 & \textbf{5} & \textbf{8}\\ 3 & \textbf{6} & \textbf{9} \end{bmatrix} \(\) Получим \(\) \begin{bmatrix} 1 & 4 & 7\\ 2 & 5 & 6\\ 3 & 8 & 9 \end{bmatrix} \(\) что, в свою очередь, и есть матрица \(B\).
| |
|
|
A. Небоскребы
реализация
сортировки
*1600
Даша очень любит приключения. На днях ей встретился удивительный город, представляющий из себя \(n\) улиц, направленных вдоль восточного направления, и \(m\) улиц, направленных вдоль южного направления, образующих естественным образом \(nm\) перекрестков. На любом пересечении \(i\)-й улицы, идущей на восток, и \(j\)-й улицы, идущей на юг, можно увидеть монументальной величины небоскреб. Загоревшись любопытством, Даша решила исследовать высоту городских строений. Проходя через перекресток на пересечении \(i\)-й и \(j\)-й улицы соответствующих направлений, Даша оглядывает две улицы, на которых находится. Узнав высоты всех небоскрёбов, которые находятся на этих двух улицах, Даша задаётся вопросом: как можно переназначить высоты всем небоскрёбам на этих двух улицах, чтобы максимальная высота была как можно меньше, а результат сравнения высот у любых двух небоскрёбов на одной улице не изменился. Сформулируем задачу формально. На каждом из \(nm\) перекрёстков Даша независимо от других перекрёстков решает задачу. Сейчас она видит \(n + m - 1\) небоскрёбов, и для каждого видит его настоящую высоту. При этом любые два небоскрёба можно сравнить по высоте и получить результат «больше», «меньше» или «равно». Теперь Даша хочет выбрать некоторое целое \(x\), после чего назначить каждому небоскрёбу целую положительную высоту от \(1\) до \(x\). При назначении высот Даша хочет сохранить относительный порядок в каждой из улиц. То есть результат сравнения высоты любых двух небоскрёбов на текущей улице восточного направления не должен измениться, и результат сравнения высоты любых двух небоскрёбов на текущей улице южного направления не должен измениться. При этом небоскрёбы, находящиеся только на текущей улице восточного направления не сравниваются с небоскрёбами, находящими на текущей улице южного направления, а небоскрёб, находящийся на пересечении, может сравниваться и с теми и с теми. Для каждого перекрёстка Даша хочет независимо вычислить минимальное возможное подходящее \(x\). Например, если выбранный перекрёсток и улицы ему соответствующие выглядят следующим образом: То можно заменить высоты небоскрёбов следующим образом (заметим, что все сравнения на меньше, больше или равно внутри улицы южного направления и внутри улицы восточного направления при этом не поменяются). Наибольшее использованное число равно \(5\), а значит ответом для этого перекрёстка было бы \(5\). Выходные данные Выведите \(n\) строк, по \(m\) целых положительных чисел, где число \(x_{i,j}\), находящееся на \(j\)-й позиции в \(i\)-й строке — это ответ на задачу в перекрестке на пересечении \(i\)-й улицы восточного направления и \(j\)-й улицы южного направления. Примечание В первом примере из условия ни на одном из перекрестков максимальную высоту уменьшить не получится, а значит можно просто не менять высоты. Во втором примере из условия имеем следующие ответы: - Для пересечения первой строки и первого столбца:
 - Для пересечения первой строки и второго столбца:
 - Для пересечения второй строки и первого столбца:
 - Для пересечения второй строки и второго столбца:
| |
|
|
C. Плейлист
Перебор
сортировки
Структуры данных
*1600
В вашем плейлисте есть \(n\) песен. \(i\)-я песня характеризуется двумя числами \(t_i\) и \(b_i\) — длиной и красотой соответственно. Удовольствие от прослушивания множества песен равно суммарной длине этих песен умноженной на минимальную красоту среди них. Например, удовольствие от прослушивания \(3\) песен с длинами \([5, 7, 4]\) и красотами \([11, 14, 6]\) равна \((5 + 7 + 4) \cdot 6 = 96\). Вам нужно выбрать не более \(k\) песен из вашего плейлиста так, чтобы максимизировать удовольствие от их прослушивания. Выходные данные Выведите одно число — максимальное удовольствие, которое вы можете получить. Примечание В первом тестовом примере вам нужно выбрать песни \({1, 3, 4}\), и удовольствие будет равно \((4 + 3 + 6) \cdot 6 = 78\). Во втором тестовом примере нужно просто выбрать песню под номером \(3\). Удоволоствие от неё будет равно \(100 \cdot 100 = 10000\).
| |
|
|
B. Удаления с меняющейся четностью
жадные алгоритмы
реализация
сортировки
*900
У Поликарпа есть массив \(a\), состоящий из \(n\) целых чисел. Он хочет поиграть в игру с этим массивом. Игра состоит из нескольких шагов. Во время первого хода он выбирает любой элемент и удаляет его (после первого хода массив содержит \(n-1\) элемент). Для каждого из следующих ходов он выбирает любой элемент с одним ограничением: его четность должна отличаться от четности элемента, удаленного во время прошлого хода. Другими словами, он меняет четности (четный-нечетный-четный-нечетный-... или нечетный-четный-нечетный-четный-...) удаляемых элементов. Поликарп останавливается, если не может совершить ход. Формально: - Если сейчас первый ход, он выбирает элемент и удаляет его;
- Если это второй или любой следующий ход:
- если последний удаленный элемент был нечетным, Поликарп выбирает любой четный элемент и удаляет его;
- если последний удаленный элемент был четным, Поликарп выбирает любой нечетный элемент и удаляет его.
- Если после какого-то хода Поликарп не может сделать ход, игра заканчивается.
Цель Поликарпа — минимизировать сумму неудаленных элементов массива после конца игры. Если Поликарп может удалить массив целиком, тогда сумма неудаленных элементов равна нулю. Помогите Поликарпу найти это значение. Выходные данные Выведите одно целое число — минимально возможную сумму неудаленных элементов массива после конца игры.
| |
|
|
C. Две перемешанные последовательности
Конструктив
сортировки
*1000
Были заданы две последовательности — одна из них была строго возрастающей, а другая — строго убывающей. Строго возрастающая последовательность — это последовательность целых чисел \([x_1 < x_2 < \dots < x_k]\). А строго убывающая последовательность — это последовательность целых чисел \([y_1 > y_2 > \dots > y_l]\). Заметьте, что пустая последовательность и последовательность, состоящая из одного элемента, могут являться как возрастающими, так и убывающими. Они были объединены в одну последовательность \(a\). После этого последовательность \(a\) была перемешана. Например, некоторыми возможными результирующими последовательностями \(a\) для возрастающей последовательности \([1, 3, 4]\) и убывающей последовательности \([10, 4, 2]\) являются последовательности \([1, 2, 3, 4, 4, 10]\) и \([4, 2, 1, 10, 4, 3]\). Эта перемешанная последовательность \(a\) задана во входных данных. Ваша задача — найти любые две подходящие изначальные последовательности. Одна из них должна быть строго возрастающей, а другая — строго убывающей. Заметьте, что пустая последовательность и последовательность, состоящая из одного элемента, могут являться как возрастающими, так и убывающими. Если входные данные противоречивы и невозможно разбить заданную последовательность \(a\) на убывающую и возрастающую последовательности, выведите «NO». Выходные данные Если входные данные противоречивы и невозможно разбить заданную последовательность \(a\) на убывающую и возрастающую последовательности, выведите «NO» в первой строке. Иначе выведите «YES» в первой строке и любые две подходящие последовательности. Заметьте, что пустая последовательность и последовательность, состоящая из одного элемента, могут являться как возрастающими, так и убывающими. Во второй строке выведите \(n_i\) — количество элементов в строго возрастающей последовательности. \(n_i\) может быть равно нулю, в том случае возрастающая последовательность пуста. В третьей строке выведите \(n_i\) целых чисел \(inc_1, inc_2, \dots, inc_{n_i}\) в возрастающем порядке их значений (\(inc_1 < inc_2 < \dots < inc_{n_i}\)) — строго возрастающую последовательность. Вы можете оставить эту строку пустой, если \(n_i = 0\) (или просто вывести пустую строку). В четвертой строке выведите \(n_d\) — количество элементов в строго убывающей последовательности. \(n_d\) может быть равно нулю, в том случае возрастающая последовательность пуста. В пятой строке выведите \(n_d\) целых чисел \(dec_1, dec_2, \dots, dec_{n_d}\) в убывающем порядке их значений (\(dec_1 > dec_2 > \dots > dec_{n_d}\)) — строго убывающую последовательность. Вы можете оставить эту строку пустой, если \(n_d = 0\) (или просто вывести пустую строку). \(n_i + n_d\) должны быть равны \(n\), а объединение выведенных последовательностей должно быть перестановкой заданной последовательности (в случае ответа «YES»).
| |
|
|
C. Crazy Diamond
Конструктив
сортировки
*1700
Вам дана перестановка \(p\) целых чисел от \(1\) до \(n\), где \(n\) чётно. Вы хотите отсортировать перестановку. Для этого вы можете проделать ноль и более операций следующего вида: - выбрать два индекса \(i\) и \(j\), такие что \(2 \cdot |i - j| \geq n\), и поменять \(p_i\) и \(p_j\).
Вы хотите отсортировать перестановку за не более чем \(5 \cdot n\) операций. Можно показать, что это всегда можно сделать. Обратите внимание, что не требуется минимизировать число операций. Выходные данные В первой строке выведите \(m\) (\(0 \le m \le 5 \cdot n\)) — количество свопов, которое нужно проделать. В каждой из следующих \(m\) строк выведите два целых числа \(a_i, b_i\) (\(1 \le a_i, b_i \le n\), \(|a_i - b_i| \ge \frac{n}{2}\)) — индексы элементов, которых нужно поменять в соответствующем обмене. Обратите внимание, что не требуется минимизировать число проделанных операций. Можно показать, что ответ всегда существует. Примечание В первом примере, если поменять элементы с индексами \(1\) и \(2\) массив станет отсортированным. Во втором примере обратите внимание на то что не нужно минимизировать число действий. В третьем примере, после того, как были поменяны местами элементы с индексами \(1\) и \(5\), массив выглядит так: \([4, 5, 3, 1, 2, 6]\). После того. как были поменяны местами элементы с индексами \(2\) и \(5\), так: \([4, 2, 3, 1, 5, 6]\). После того, как были поменяны местами элементы с индексами \(1\) и \(4\), массив становится отсортированным: \([1, 2, 3, 4, 5, 6]\).
| |
|
|
D. Dirty Deeds Done Dirt Cheap
жадные алгоритмы
сортировки
*1800
Вам дано \(n\) пар целых чисел \((a_1, b_1), (a_2, b_2), \ldots, (a_n, b_n)\). Все элементы в парах различны и лежат в диапазоне от \(1\) до \(2 \cdot n\) включительно. Назовём последовательность чисел \(x_1, x_2, \ldots, x_{2k}\) хорошей, если выполняется одно из двух: - \(x_1 < x_2 > x_3 < \ldots < x_{2k-2} > x_{2k-1} < x_{2k}\), или
- \(x_1 > x_2 < x_3 > \ldots > x_{2k-2} < x_{2k-1} > x_{2k}\).
Вам нужно выбрать какое-то подмножество различных индексов \(i_1, i_2, \ldots, i_t\) и их порядок так, что если записать все числа из соответствующих пар в одну последовательность (эта последовательность будет \(a_{i_1}, b_{i_1}, a_{i_2}, b_{i_2}, \ldots, a_{i_t}, b_{i_t}\)), то эта последовательность будет хорошей. Какое наибольшее по размеру подмножество пар можно выбрать? Вам также нужно построить соответствующую последовательность индексов \(i_1, i_2, \ldots, i_t\). Выходные данные В первой строке выведите целое число \(t\) — искомое число пар. В следующей строке выведите \(t\) различных целых чисел \(i_1, i_2, \ldots, i_t\) — индексы пар в том порядке, в котором получается хорошая последовательность. Примечание Итоговая последовательность в первом тесте из условия: \(1 < 7 > 3 < 5 > 2 < 10\). Итоговая последовательность во втором тесте из условия: \(6 > 1 < 3 > 2 < 5 > 4\).
| |
|
|
E. Earth Wind and Fire
жадные алгоритмы
Конструктив
математика
сортировки
*2300
На числовой прямой расположены \(n\) камней. Изначально \(i\)-й камень находится в точке с координатой \(s_i\). В одной точке может находиться более одного камня одновременно. Вы можете выполнить ноль или более операций следующего вида: - взять два камня с индексами \(i\) и \(j\) такими, что \(s_i \leq s_j\), выбрать целое число \(d\) (\(0 \leq 2 \cdot d \leq s_j - s_i\)) и заменить координату \(s_i\) на \((s_i + d)\), а координату \(s_j\) на \((s_j - d)\). Другими словами, подвинуть камни друг к другу.
Вы хотите подвинуть камни так, чтобы они находились в позициях \(t_1, t_2, \ldots, t_n\). Порядок камней не важен — требуется лишь, чтобы мультимножество координат камней в конце совпадало с мультимножеством, состоящим из \(t_1, t_2, \ldots, t_n\). Выясните, возможно ли сдвинуть камни требуемым образом, и если да, то найдите способ это сделать. Минимизировать число операций не нужно. Выходные данные В случае, если невозможно подвинуть камни требуемым образом, выведите «NO». Иначе на первой строке выведите «YES», на второй строке выведите количество операций \(m\) (\(0 \le m \le 5 \cdot n\)), которое нужно сделать. Вам не нужно минимизировать число операций. Затем выведите \(m\) строк, каждая из которых содержит три целых числа \(i, j, d\) (\(1 \le i, j \le n\), \(s_i \le s_j\), \(0 \leq 2 \cdot d \leq s_j - s_i\)), обозначающие операцию, которую нужно сделать. Можно показать, что если какой-то ответ существует, то существует и ответ, использующий не более чем \(5 \cdot n\) операций. Примечание Рассмотрим первый пример. - После первой операции позиции камней равны \([2, 2, 6, 5, 9]\).
- После второй операции позиции камней равны \([2, 3, 5, 5, 9]\).
- После третьей операции позиции камней равны \([2, 5, 5, 5, 7]\).
- После последней операции позиции камней равны \([4, 5, 5, 5, 5]\).
| |
|
|
B. Газонокосилка
жадные алгоритмы
сортировки
*1500
У вас есть сад, в котором растет трава и сорняки. Ваш сад представляет собой клетчатое поле размером n × m. Строки пронумерованы от 1 до n сверху вниз, а столбцы — от 1 до m слева направо. Каждая клетка обозначается парой (r, c), где r — номер строки, в которой расположены клетка, а c — номер столбца. Каждая клетка содержит либо траву, либо сорняк. Например, сад размера 4 × 5 может выглядеть следующим образом (пустые клетки обозначают траву): У вас есть газонокосилка, и вы хотите скосить все сорняки. Изначально вы и ваша газонокосилка находитесь в левом верхнем углу сада, то есть в клетке (1, 1). В каждый момент времени вы смотрите либо направо, либо налево. Изначально вы смотрите направо. За один ход вы можете сделать одно из двух: 1) Пойти на одну клетку в ту сторону, куда вы смотрите. - если вы смотрите направо: пойти из клетки (r, c) в клетку (r, c + 1)
- если вы смотрите налево: пойти из клетки (r, c) в клетку (r, c - 1)
2) Пойти на одну клетку вниз (то есть из клетки (r, c) в клетку (r + 1, c)) и развернуться в другую сторону. - если вы смотрели направо, вы будете смотреть налево
- если вы смотрели налево, вы будете смотреть направо
Вы не можете выходить за пределы поля. Чтобы скосить сорняк, вы должны оказаться в одной клетке с ним (при этом не имеет значения, в какую сторону вы смотрите). На это действие ход не тратится. Какое наименьшее количество ходов потребуется, чтобы скосить все сорняки? Выходные данные Выведите одно целое число — минимальное количество ходов, которое требуется, чтобы скосить все сорняки. Примечание В первом примере начальное состояние поля выглядит следующим образом: Одно из возможных решений:
| |
|
|
D. Стас и очередь в буфет
жадные алгоритмы
математика
сортировки
*1600
На перемене в буфете научного лицея Королевства Кремляндия образовалась очередь из \(n\) лицеистов, пронумерованных от \(1\) до \(n\). Изначально каждый ученик \(i\) стоит на позиции \(i\). Каждый ученик \(i\) характеризуется двумя числами — \(a_i\) и \(b_i\). Недовольство лицеиста \(i\) равняется произведению \(a_i\) на количество людей, стоящих слева от его позиции, прибавить произведение \(b_i\) на количество людей, стоящих справа от его позиции. Формально, недовольство ученика \(i\), который стоит на позиции \(j\), равняется \(a_i \cdot (j-1) + b_i \cdot (n-j)\). Директор поручил Стасу задание: переставить людей в очереди так, чтобы минимизировать суммарное недовольство. Хоть Стас и умеет решать подобные задачи, но эта ему не далась. Он обратился за помощью к вам. Выходные данные Выведите одно целое число — минимальное суммарное недовольство которого можно достичь, переставляя людей в очереди. Примечание В первом примере оптимально поставить людей в таком порядке: (\(3, 1, 2\)). Первый человек стоит на позиции \(2\), тогда его недовольство будет равно \(4 \cdot 1+2 \cdot 1=6\). Второй человек стоит на позиции \(3\), его недовольство будет равно \(2 \cdot 2+3 \cdot 0=4\). Третий человек стоит на позиции \(1\), его недовольство будет равно \(6 \cdot 0+1 \cdot 2=2\). Суммарное недовольство равно \(12\). Во втором примере необходимо поставить людей в таком порядке: (\(3, 2, 4, 1\)). Суммарное недовольство равно \(25\).
| |
|
|
E. Две команды
реализация
сортировки
Структуры данных
*1800
В ряд выстроены \(n\) студентов. Два тренера набирают две команды — первый тренер выбирает первую команду, а второй тренер выбирает вторую команду. Умение программировать \(i\)-го студента равно целому числу \(a_i\). Все умения программировать различны и лежат в отрезке от \(1\) до \(n\). Сначала первый тренер выбирает себе студента с максимальным умением программировать среди всех студентов, не взятых в какую-либо команду, а также \(k\) студентов, стоящих ближе всего слева от него и \(k\) студентов, стоящих ближе всего справа от него (если слева или справа стоит меньше, чем \(k\) студентов, все они будут взяты). Все выбранные студенты покидают ряд и присоединяются к первой команде. Затем второй тренер делает такой же ход (но все студенты, выбранные им, присоединяются ко второй команде). Затем опять первый тренер делает такой же ход, и так далее. Это продолжается до тех пор, пока есть хотя бы один студент, стоящий в ряду. Ваша задача — определить, какие студенты будут взяты в первую команду, а какие будут взяты во вторую команду. Выходные данные Выведите строку, состоящую из \(n\) символов; \(i\)-й символ должен быть равен 1, если \(i\)-й студент присоединится к первой команде и 2 в ином случае. Примечание В первом тестовом примере первый тренер выберет студента на позиции \(3\) и ряд станет пустым (все студенты пойдут в первую команду). Во втором тестовом примере первый тренер выберет студента на позиции \(4\) и ряд превратится в \([2, 1]\) (студенты с умениями программировать \([3, 4, 5]\) пойдут в первую команду). Затем второй тренер выберет студента на позиции \(1\) и ряд станет пустым (и студенты с умениями программировать \([1, 2]\) пойдут во вторую команду). В третьем тестовом примере первый тренер выберет студента на позиции \(1\) и ряд превратится в \([1, 3, 5, 4, 6]\) (студенты с умениями программировать \([2, 7]\) пойдут в первую команду). Затем второй тренер выберет студента на позиции \(5\) и ряд превратится в \([1, 3, 5]\) (студенты с умениями программировать \([4, 6]\) пойдут во вторую команду). Затем первый тренер выберет студента на позиции \(3\) и ряд превратится в \([1]\) (студенты с умениями программировать \([3, 5]\) пойдут в первую команду). И затем второй тренер выберет оставшегося студента (и студент с умением программировать \(1\) пойдет во вторую команду). В четвертом тестовом примере первый тренер выберет студента на позиции \(3\) и ряд превратится в \([2, 1]\) (студенты с умениями программировать \([3, 4, 5]\) пойдут в первую команду). Затем второй тренер выберет студента на позиции \(1\) и ряд станет пустым (и студенты с умениями программировать \([1, 2]\) пойдут во вторую команду).
| |
|
|
F. Магазин лопат
дп
жадные алгоритмы
сортировки
*2100
В магазине поблизости продается \(n\) лопат. \(i\)-я лопата стоит \(a_i\) бурлей. Миша хочет купить ровно \(k\) лопат. EКаждая лопата может быть куплена не более одного раза. Миша может покупать лопаты в несколько покупок. В течение одной покупки он выбирает любое подмножество оставшихся (еще не купленных) лопат и покупает это подмножество. Также в магазине есть \(m\) специальных предложений. \(j\)-е из них задано парой \((x_j, y_j)\) и означает, что если Миша купит ровно \(x_j\) лопат в течение одной покупки, то \(y_j\) самых дешевых из них он получит бесплатно (то есть он не будет платить за \(y_j\) самых дешевых лопат в течение текущей покупки). Миша может использовать любое предложение любое (возможно, нулевое) количество раз, но он не может использовать более одного предложения в течение одной покупки (но он может покупать лопаты без использования каких-либо предложений). Ваша задача — посчитать минимальную стоимость покупки \(k\) лопат, если Миша будет покупать их оптимальным образом. Выходные данные Выведите одно целое число — минимальную стоимость покупки \(k\) лопат, если Миша будет покупать их оптимальным образом. Примечание В первом тестовом примере Миша может купить лопаты на позициях \(1\) и \(4\) (обе со стоимостями \(2\)) в течение первой покупки и получить одну из них бесплатно при помощи первого или третьего специального предложения. И затем он может купить лопаты на позициях \(3\) и \(6\) (со стоимостями \(4\) и \(3\)) в течение второй покупки и получить вторую бесплатно при помощи первого или третьего специального предложения. Затем он может купить лопату на позиции \(7\) со стоимостью \(1\). Таким образом, общая стоимость равна \(4 + 2 + 1 = 7\). Во втором тестовом примере Миша может купить лопаты на позициях \(1\), \(2\), \(3\), \(4\) и \(8\) (цены равны \(6\), \(8\), \(5\), \(1\) и \(2\)) и получить три самые дешевые (со стоимостями \(5\), \(1\) и \(2\)) бесплатно. И затем он может купить лопаты на позициях \(6\), \(7\) и \(9\) (все со стоимостями \(1\)) без использования любых специальных предложений. Таким образом, общая стоимость равна \(6 + 8 + 1 + 1 + 1 = 17\). В третьем тестовом примере Миша может купить четыре самые дешевые лопаты без использования любых специальных предложений и получить общую стоимость \(17\).
| |
|
|
A. Разверни подстроку
реализация
сортировки
Строки
*1000
Вам дана строка \(s\), состоящая из \(n\) строчных букв латинского алфавита. Подстрока строки — это некоторый ее непрерывный подотрезок. Например, «acab» — подстрока строки «abacaba» (она начинается в позиции \(3\) и заканчивается в позиции \(6\)), но «aa» и «d» не являются подстроками этой строки. То есть подстрока строки \(s\) с позиции \(l\) по позицию \(r\) — это строка \(s[l; r] = s_l s_{l + 1} \dots s_r\). Вам нужно выбрать ровно одну подстроку данной строки и развернуть ее (то есть сделать \(s[l; r] = s_r s_{r - 1} \dots s_l\)), чтобы полученная строка оказалась лексикографически меньше исходной. Обратите внимание, что не обязательно минимизировать полученную строку. Если невозможно таким образом развернуть подстроку, выведите «NO». Иначе выведите «YES» и любую подходящую подстроку. Строка \(x\) лексикографически меньше строки \(y\), если либо \(x\) является префиксом \(y\) (и при этом \(x \ne y\)), либо существует такое \(i\) (\(1 \le i \le min(|x|, |y|)\)), что \(x_i < y_i\), и для любого \(j\) (\(1 \le j < i\)) \(x_j = y_j\). Здесь \(|a|\) обозначает длину строки \(a\). Лексикографическое сравнение строк реализует оператор < в современных языках программирования. Выходные данные Если невозможно развернуть подстроку так, чтобы в итоге получилась строка лексикографически меньше исходной, выведите «NO». Иначе выведите «YES» и два индекса \(l\) и \(r\) (\(1 \le l < r \le n\)), обозначающие начало и конец подстроки, которую вы хотите перевернуть. Если ответов несколько, выведите любой из них. Примечание В первом тесте после разворота подстроки получается строка «aacabba».
| |
|
|
B. Противные пары
жадные алгоритмы
поиск в глубину и подобное
реализация
сортировки
Строки
*1800
Задана строка, состоящая из строчных латинских букв. Пара соседних букв в строке считается противной, если данные буквы так же соседние в алфавите. Например, строка «abaca» содержит противные пары на позициях \((1, 2)\) — «'ab» и \((2, 3)\) — «ba». Буквы 'a' и 'z' не считаются соседними в алфавите. Можете ли вы так переставить местами буквы в данном строке, чтобы в ней не было противных пар? Выбирая новый порядок, помните, что нельзя добавлять в строку новые буквы или удалять уже имеющиеся. Также можно сохранить начальный порядок. Если существует несколько ответов, выведите любой из них. Также требуется ответить на \(T\) независимых запросов. Выходные данные Выведите \(T\) строк. В \(i\)-й строке должен быть записан ответ на \(i\)-й запрос. Если ответ на \(i\)-й запрос существует, то выведите строку с новым порядком букв такую, что она не содержит противных пар. Выбирая новый порядок, помните, что нельзя добавлять в строку новые буквы или удалять уже имеющиеся. Также можно сохранить начальный порядок. Если существует несколько ответов, выведите любой из них. Если ответа на запрос нет, выведите «No answer». Примечание В первом примере ответ «bdac» также корректен. Второй пример показывает, что только соседние буквы в алфавите неприемлемы. Одинаковые подходят. В третьем примере множество правильных ответов.
| |
|
|
C. Соединение точек
Бинарный поиск
жадные алгоритмы
сортировки
Тернарный поиск
*2000
Вам дан набор точек \(x_1\), \(x_2\), ..., \(x_n\) на числовой прямой. Две точки \(i\) и \(j\) могут быть соединены друг с другом при выполнении следующих условий: - Ни \(i\), ни \(j\) не соединены ни с какими другими точками;
- \(|x_i - x_j| \ge z\).
Какое максимальное количество пар точек вы можете соединить друг с другом? Выходные данные Выведите одно целое число — максимальное количество пар точек, которое вы можете соединить друг с другом. Примечание В первом примере вы можете соединить точку \(1\) с точкой \(2\) (\(|3 - 1| \ge 2\)), и точку \(3\) с точкой \(4\) (\(|7 - 3| \ge 2\)). Во втором примере вы можете соединить точку \(1\) с точкой \(3\) (\(|5 - 10| \ge 5\)).
| |
|
|
A. Праздник и конфеты
Бинарный поиск
жадные алгоритмы
Конструктив
математика
реализация
сортировки
*1500
На праздник пришло \(n\) мальчиков и \(m\) девочек. Каждый мальчик подарил каждой девочке некоторое целое количество конфет (возможно ноль). Пронумеруем мальчиков целыми числами от \(1\) до \(n\) и девочек целыми числами от \(1\) до \(m\). Для всех \(1 \leq i \leq n\) минимальное количество конфет, которое подарил мальчик с номером \(i\) какой-то девочке равно \(b_i\) и для всех \(1 \leq j \leq m\) максимальное количество конфет, которое получила девочка с номером \(j\) от какого-то мальчика равно \(g_j\). Более формально, Обозначим за \(a_{i,j}\) количество конфет, которое \(i\)-й мальчик подарил \(j\)-й девочке. Тогда \(b_i\) равно минимуму среди значений \(a_{i,1}, a_{i,2}, \ldots, a_{i,m}\) И \(g_j\) равно максимуму среди значений \(b_{1,j}, b_{2,j}, \ldots, b_{n,j}\). Вам стало интересно, какое минимальное суммарное количество конфет могли подарить мальчики, то есть вы хотите минимизировать сумму \(a_{i,j}\) по всем таким \((i,j)\), что \(1 \leq i \leq n\) и \(1 \leq j \leq m\). По числам \(b_1, \ldots, b_n\) и \(g_1, \ldots, g_m\) определите это число. Выходные данные Если не могло быть такой ситуации выведите \(-1\). Иначе выведите минимальное суммарное количество конфет, которое могли подарить мальчики и при этом все условия были бы выполнены. Примечание В первом тесте минимальное суммарное количество конфет, которое могли подарить мальчики равно \(12\). Такое могло быть, например, если первый мальчик подарит \(1\) и \(4\) конфеты, второй мальчик подарит \(3\) и \(2\) конфеты и третий мальчик подарит \(1\) и \(1\) конфету первой и второй девочке, соответственно. Легко видеть, что все условия выполнены и суммарно будет подарено \(12\) конфет. Во втором тесте мальчики не могли подарить конфеты так, чтобы условия были выполнены. В третьем тесте минимальное суммарное количество конфет, которое могли подарить мальчики равно \(4\). Такое могло быть, например, если первый мальчик подарит \(1\), \(1\), \(2\) конфет первой, второй и третьей девочке, соответственно, а второй мальчик не подарит никому конфет. Легко видеть, что все условия выполнены и суммарно будет подарено \(4\) конфеты.
| |
|
|
C. Восстановление перестановки
графы
жадные алгоритмы
Конструктив
математика
поиск в глубину и подобное
сортировки
Структуры данных
*2100
Вася написал в тетради некоторую перестановку \(p_1, p_2, \ldots, p_n\) чисел от \(1\) до \(n\), то есть для всех \(1 \leq i \leq n\) выполнено \(1 \leq p_i \leq n\), и все \(p_1, p_2, \ldots, p_n\) различны. После этого он записал \(n\) значений \(next_1, next_2, \ldots, next_n\). Значение \(next_i\) равно минимальному индексу \(i < j \leq n\), такому что \(p_j > p_i\). Если такого \(j\) не существует, то определим значение как \(next_i = n + 1\). Вечером Вася шел домой из школы, и из-за дождя тетрадь намокла. Теперь некоторые написанные числа невозможно разобрать. Перестановка, а также некоторые значения \(next_i\) полностью утеряны! Если для какого-то \(i\) значение \(next_i\) теперь неизвестно, то скажем, что \(next_i = -1\). Вам даны значения \(next_1, next_2, \ldots, next_n\) (возможно, некоторые числа теперь равны \(-1\)). Помогите Васе найти любую такую перестановку \(p_1, p_2, \ldots, p_n\) чисел от \(1\) до \(n\), что он может записать её в тетрадь, и все значения \(next_i\), не равные \(-1\), будут посчитаны правильно. Выходные данные Выведите \(T\) строк, в \(i\)-й ответ на \(i\)-й тестовый случай. Если таких перестановок \(p_1, p_2, \ldots, p_n\) чисел от \(1\) до \(n\), которые мог выписать Вася не существует, то выведите единственное число \(-1\). Иначе выведите \(n\) различных целых чисел \(p_1, p_2, \ldots, p_n\), разделённых пробелами (\(1 \leq p_i \leq n\)). Все определённые значения \(next_i\), не равные \(-1\), должны быть вычислены верно из перестановки \(p_1, p_2, \ldots, p_n\) по определению из условия задачи. Если существует несколько таких перестановок, найдите любую. Примечание В первом тестовом случае для перестановки \(p = [1, 2, 3]\) получится \(next = [2, 3, 4]\), так как каждый элемент перестановки меньше следующего. Можно заметить, что это единственная подходящая перестановка. Во третьем тестовом случае подойдет любая перестановка, так как все значения \(next_i\) неизвестны. В четвертом тестовом случае не существует ни одной подходящей перестановки, поэтому ответ \(-1\).
| |
|
|
B. Тренировки Поликарпа
жадные алгоритмы
сортировки
Структуры данных
*1000
Поликарп хочет потренироваться перед очередным важным соревнованием по программированию. В течение первого дня его тренировок он хочет решить ровно \(1\) задачу, в течение второго дня — ровно \(2\) задачи, в течение третьего дня — ровно \(3\) задачи, и так далее. В течение \(k\)-го дня он хочет решить ровно \(k\) задач. У Поликарпа есть список из \(n\) контестов, \(i\)-й контест состоит из \(a_i\) задач. В течение каждого дня Поликарп будет выбирать ровно один из контестов, который он еще не решал до этого, и решать его. Он решает ровно \(k\) задач из этого контеста. Остальные задачи исключаются из контеста. Если контестов, состоящих из не менее \(k\) задач, которые Поликарп еще не решал, в течение \(k\)-го дня нет, то Поликарп прекращает тренироваться. Как много дней Поликарп сможет тренироваться, если будет выбирать контесты оптимально? Выходные данные Выведите одно целое число — максимальное количество дней, которое Поликарп сможет тренироваться, если он будет выбирать контесты оптимально.
| |
|
|
E. Два массива и сумма функций
жадные алгоритмы
математика
сортировки
*1600
Задано два массива \(a\) и \(b\), оба длины \(n\). Давайте определим функцию \(f(l, r) = \sum\limits_{l \le i \le r} a_i \cdot b_i\). Ваша задача — переупорядочить элементы (выбрать произвольный порядок элементов) массива \(b\), чтобы минимизировать значение \(\sum\limits_{1 \le l \le r \le n} f(l, r)\). Так как ответ может быть очень большим, вам необходимо вывести его по модулю \(998244353\). Заметьте, что вы должны минимизировать ответ, а не его остаток. Выходные данные Выведите одно целое число — минимально возможное значение \(\sum\limits_{1 \le l \le r \le n} f(l, r)\) после перестановки элементов массива \(b\), взятое по модулю \(998244353\). Заметьте, что вы должны минимизировать ответ, а не его остаток.
| |
|
|
C. Легенда о двух королевствах
Бинарный поиск
сортировки
*1500
В легенде об образовании Векторляндии говорится о двух целых числах \(x\) и \(y\). Несколько веков назад король массивов поставил две отметки в точки \(|x|\) и \(|y|\) на числовой прямой, захватил всю землю между ними (включая границы) и назвал ее Массивляндией. Спустя много лет король векторов поставил две отметки в точки \(|x - y|\) и \(|x + y|\), захватил всю землю между ними (включая границы) и назвал ее Векторляндией. Все знают, что вся земля Массивляндии лежала внутри или на границе Векторляндии. Выражение \(|z|\) обозначает абсолютное значение числа \(z\). На экзамене по истории Жозе попался следующий вопрос: «Каковы значения \(x\) и \(y\)?». Жозе не знает ответа на этот вопрос, но он думает, что сузил количество вариантов ответа до \(n\) целых чисел \(a_1, a_2, \dots, a_n\). Он хочет узнать число таких неупорядоченных пар двух различных чисел из этих \(n\), что легенда могла быть верной, если \(x\) и \(y\) были равны этим числам. Возможно также, что Жозе неправ и никакая пара чисел не удовлетворяет легенде. Выходные данные Выведите одно целое число — число различных неупорядоченных пар \(\{x, y\}\), выбранных из вариантов Жозе, которые не противоречат легенде. Примечание Рассмотрим первый пример. Для пары \(\{2, 5\}\) ситуация показана на рисунке ниже. Границы Массивляндии находятся в точках \(|2| = 2\) и \(|5| = 5\), а границы Векторляндии — в точках \(|2 - 5| = 3\) и \(|2 + 5| = 7\): Видно, что такой случай противоречит легенде, потому что земля в отрезке \([2, 3]\) не принадлежит Векторляндии. Для пары чисел \(\{5, -3\}\) ситуация показана на рисунке ниже. Массивляндия находится на отрезке \([3, 5]\), а Векторляндия — на отрезке \([2, 8]\): В этом случае противоречия легенде нет, ведь Векторляндия полностью содержит Массивляндию. Можно также показать, что нет противоречия легенде и для пары \(\{2, -3\}\), то есть всего для двух пар. Во втором примере единственно возможная пара — это \(\{3, 6\}\), и легенда выглядит так: Обратите внимание, несмотря на то, что Массивляндия и Векторляндия имеют общую границу в точке \(3\), мы все равно считаем, что Массивляндия лежит полностью внутри Векторляндии.
| |
|
|
F. Скалярные запросы
Комбинаторика
математика
сортировки
Структуры данных
*2300
Вам задан массив \(a_1, a_2, \dots, a_n\). Все \(a_i\) попарно различные. Определим функцию \(f(l, r)\) следующим образом: - создадим массив \(b_1, b_2, \dots, b_{r - l + 1}\), где \(b_i = a_{l - 1 + i}\);
- отсортируем массив \(b\) в порядке возрастания;
- результатом функции \(f(l, r)\) назовем значение \(\sum\limits_{i = 1}^{r - l + 1}{b_i \cdot i}\).
Посчитайте \(\left(\sum\limits_{1 \le l \le r \le n}{f(l, r)}\right) \mod (10^9+7)\). Другими словами — сумму функций \(f\) для всех подотрезков массива \(a\) по модулю \(10^9+7\). Выходные данные Выведите единственное число — сумму функций \(f\) для всех подотрезков массива \(a\) по модулю \(10^9+7\). Примечание Описание первого примера: - \(f(1, 1) = 5 \cdot 1 = 5\);
- \(f(1, 2) = 2 \cdot 1 + 5 \cdot 2 = 12\);
- \(f(1, 3) = 2 \cdot 1 + 4 \cdot 2 + 5 \cdot 3 = 25\);
- \(f(1, 4) = 2 \cdot 1 + 4 \cdot 2 + 5 \cdot 3 + 7 \cdot 4 = 53\);
- \(f(2, 2) = 2 \cdot 1 = 2\);
- \(f(2, 3) = 2 \cdot 1 + 4 \cdot 2 = 10\);
- \(f(2, 4) = 2 \cdot 1 + 4 \cdot 2 + 7 \cdot 3 = 31\);
- \(f(3, 3) = 4 \cdot 1 = 4\);
- \(f(3, 4) = 4 \cdot 1 + 7 \cdot 2 = 18\);
- \(f(4, 4) = 7 \cdot 1 = 7\);
| |
|
|
A. Ихаб не может стать Таносом
жадные алгоритмы
Конструктив
сортировки
*1000
Вам дан массив \(a\) длины \(2n\). Возможно ли поменять числа местами так, чтобы сумма первых \(n\) чисел не была равна сумме последних \(n\) чисел? Выходные данные Если решения не существует, выведите «-1» (без кавычек). Иначе выведите \(2n\) целых чисел. Эти числа должны быть перестановкой массива \(a\). Вы можете не менять порядок чисел. Примечание В первом примере первые \(n\) чисел имеют сумму \(2+1+3=6\), а последнее \(n\) чисел сумму \(1+1+2=4\). Суммы разные. Во втором примере ответа не существует.
| |
|
|
B. Ихаб и странный человек
сортировки
*1200
Вам дан массив \(a\) длины \(n\). Вы можете выполнить следующую операцию с ним столько раз, сколько захотите: - Выберите любые два числа \(i\) и \(j\) \((1 \le i,j \le n)\), такие что сумма \(a_i+a_j\) нечетная, и поменяйте местами \(a_i\) и \(a_j\).
Какой лексикографически минимальный массив вы можете получить? Массив \(x\) лексикографически меньше чем массив \(y\), если есть такой индекс \(i\), что \(x_i<y_i\), и \(x_j=y_j\) для всех \(1 \le j < i\). Менее формально, в первой позиции \(i\), которая отличается, \(x_i<y_i\). Выходные данные Выведите \(n\) целых чисел через пробел — лексикографически минимальный массив, который вы можете получить. Примечание В первом примере вы можете поменять местами \(1\) и \(4\), так как \(1+4=5\) нечетное число.
| |
|
|
D. Разделение массива
жадные алгоритмы
сортировки
*1900
Вам заданы массив \(a_1, a_2, \dots, a_n\) и число \(k\). Вам нужно разделить массив на \(k\) непустых последовательных подотрезков. Каждый элемент в массиве должен быть покрыт ровно одним подотрезком. Пусть \(f(i)\) равно индексу подотрезка, которому принадлежит \(i\)-й элемент. Подотрезки нумеруются слева направо и от \(1\) до \(k\). Тогда цена конкретного разбиения будет равна \(\sum\limits_{i=1}^{n} (a_i \cdot f(i))\). Например, если \(a = [1, -2, -3, 4, -5, 6, -7]\), и мы разделили его на \(3\) подотрезка следующим способом: \([1, -2, -3], [4, -5], [6, -7]\), тогда цена разбиения будет равна \(1 \cdot 1 - 2 \cdot 1 - 3 \cdot 1 + 4 \cdot 2 - 5 \cdot 2 + 6 \cdot 3 - 7 \cdot 3 = -9\). Посчитайте максимальную цену, которую вы можете получить, разделив массив \(a\) на \(k\) непустых последовательных подотрезков. Выходные данные Выведите максимальную цену, которую вы можете получить, разделив массив \(a\) на \(k\) непустых последовательных подотрезков.
| |
|
|
D. Восстанавливай!
графы
жадные алгоритмы
поиск в глубину и подобное
сортировки
теория чисел
*1800
Авторы загадали массив \(a\), состоящий из \(n\) целых чисел; каждое число не меньше \(2\) и не больше \(2 \cdot 10^5\). Вы не знаете его, но Вы знаете массив \(b\), который был получен из массива \(a\) при помощи следующей последовательности операций: - Сначала весь массив \(b\) равен массиву \(a\);
- Затем для каждого \(i\) от \(1\) до \(n\):
- если \(a_i\) является простым числом, тогда число \(p_{a_i}\) добавляется в массив \(b\), где \(p\) — бесконечная последовательность простых чисел (\(2, 3, 5, \dots\));
- иначе (если \(a_i\) не является простым числом), наибольший делитель \(a_i\), не равный \(a_i\), добавляется в \(b\);
- Затем получившийся массив длины \(2n\) перемешивается и дается Вам во входных данных.
Здесь \(p_{a_i}\) означает \(a_i\)-е простое число. Первое простое число \(p_1 = 2\), второе простое число \(p_2 = 3\), и так далее. Ваша задача — восстановить любой подходящий массив \(a\), который формирует заданный массив \(b\). Гарантируется, что ответ существует (таким образом, массив \(b\) получен из какого-либо подходящего массива \(a\)). Если существует несколько возможных ответов, Вы можете вывести любой. Выходные данные В единственной строке выходных данных выведите \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(2 \le a_i \le 2 \cdot 10^5\)) в любом порядке — массив \(a\), из которого можно получить массив \(b\) при помощи последовательности ходов, описанных в условии задачи. Если существует несколько возможных ответов, Вы можете вывести любой.
| |
|
|
F. Уничтожай!
дп
реализация
сортировки
*2100
Вы играете в компьютерную игру, которая называется Splay the Sire. Сейчас Вы сражаетесь с финальным боссом игры. Битва с боссом состоит из \(n\) ходов. В течение каждого хода Вы получаете некоторое количество карт. Каждая карта имеет два параметра: ее цену \(c_i\) и урон \(d_i\). Вы можете играть какими-то картами в какой-то последовательности в течение каждого хода (Вы выбираете карты и точный порядок, в котором их поставите) до тех пор, пока суммарная стоимость карт, которыми Вы играете в течение хода, не превосходит \(3\). После игры некоторым (возможно, нулевым) количеством карт Вы заканчиваете ход, а все карты, которыми Вы не сыграли, пропадают. Заметьте, что вы можете использовать каждую карту не более одного раза. Ваш персонаж также нашел артефакт, который позволяет увеличить урон некоторых действий: каждая \(10\)-я карта, которую Вы играете, наносит двойной урон. Чему равен максимально возможный урон, который Вы можете нанести в течение \(n\) ходов? Выходные данные Выведите одно целое число — максимально возможный урон, который Вы можете нанести. Примечание В тестовом примере лучшая последовательность действий будет выглядеть следующим образом: В течение первого хода сыграть всеми тремя картами и нанести \(18\) единиц урона. В течение второго хода сыграть обеими картами и нанести \(7\) единиц урона. В течение третьего хода сыграть первой и третьей картами и нанести \(13\) единиц урона. В течение четвертого хода сыграть первой и третьей картами и нанести \(25\) единиц урона. В течение пятого хода сыграть единственной картой, которая нанесет двойной урон (\(200\)).
| |
|
|
C. Модный номер
жадные алгоритмы
Перебор
сортировки
Строки
*1900
Номер машины в Берляндии состоит ровно из n цифр. Номер называется красивым, если в нем есть хотя бы k одинаковых цифр. Вася хочет поменять цифры в номере своей машины так, чтобы он стал красивым. За замену одной из n цифр номера нужно заплатить сумму денег, равную модулю разности старой и новой цифры. Помогите Васе: найдите минимальную стоимость замены номера Васиной машины на красивый. Также требуется найти получившийся в итоге красивый номер. Если таких несколько, нужно вывести лексикографически наименьший. Выходные данные В первой строке выведите минимальное количество денег, которые потребуются Васе для замены номера. Во второй строке выведите новый номер машины. Если решений несколько, выведите лексикографически наименьшее. Примечание В первом примере замена второй цифры на «8» стоит |9 - 8| = 1. Замена пятой цифры на «8» стоит столько же. Замена шестой цифры стоит |6 - 8| = 2. В итоге Вася заплатит 1 + 1 + 2 = 4 чтобы получить красивый номер «888188». Лексикографическое сравнение строк реализует оператор < в современных языках программирования. Строка x лексикографически меньше строки y, если существует такое i (1 ≤ i ≤ n), что xi < yi, а для любого j (1 ≤ j < i) xj = yj. Сравниваемые строки в этой задаче всегда имеют длину n.
| |
|
|
D. Ирригация
Бинарный поиск
Деревья
реализация
сортировки
Структуры данных
*2200
Мальчика Мишу с юных лет волновали вопросы доставки воды. вот почему мама Миши отправила сына на ежегодную инновационную олимпиаду по ирригации (ИОИ). На этой олимпиаде школьники со всех концов Берляндии соревнуются в умении доставить воду для поливки растений самыми причудливыми способами. Проведение подобной олимпиады весьма затратно, поэтому спустя \(n\) первых проведений олимпиады было решено ввести правило, по которому будет определяться место проведения соревнования в следующий год. Город для проведения олимпиады выбирается следующим образом: всего в Берляндии есть \(m\) городов, пронумерованных от \(1\) до \(m\), готовых принять соревнование. Каждый год олимпиада проводится в городе, в котором она проводилась наименьшее число раз. Если таких городов несколько, то олимпиада проводится в городе с наименьшим номером среди городов с минимальным числом проведений олимпиады. Мишина мама очень волнуется за сына, поэтому её интересует, в каком городе будет проходить олимпиада в определённые годы. Единственная информация, которой располагает мама Миши, — места проведения олимпиады в первые \(n\) лет. Помогите маме Миши, и она попросит Мишу не залить вашу квартиру. Выходные данные Выведите \(q\) целых чисел. В строке с номером \(i\) выведите одно целое число — место проведения олимпиады в год \(k_i\). Примечание В первом примере Мишина мама интересуется о первых \(10\) годах после принятия нового правила, в эти года олимпиада пройдёт в городах 4, 3, 4, 2, 3, 4, 1, 2, 3, 4. Во втором примере после принятия нового правила олимпиада пройдёт в городах 2, 3, 1, 2, 3, 5, 1, 2, 3, 4, 5, 1.
| |
|
|
E1. История одной страны (простая)
Перебор
разделяй и властвуй
сортировки
*2500
Эта задача отличается от следующей только ограничениями. На летние каникулы Петя приехал в Байтландию. Как оказалась, история этого государства весьма необычна. Изначально, до появления Байтландии, на её территории были расположены \(n\) различных стран. Каждое государство владело своей территорией, которую можно было представить на карте как прямоугольник, стороны которого параллельны осям координат, а вершины расположены в целочисленных точках. Никакие две страны не пересекались, однако они могли касаться сторонами. Иногда в результате агрессивных переговоров и мирных военных походов две страны объединялись в одну. Слияние происходило только в том случае, если после объединения их владений снова получалась прямоугольная территория. В конце концов осталось только одно государство — Байтландия. В начале времён территория каждой страны содержала внутри себя ровно один прямоугольный замок, где стороны этого замка параллельны осям координат, а вершины расположены в целочисленных точках. Допускается, что границы замка могли прилегать к границе соответствующей территории страны и к границам других замков. Удивительным образом, даже после всех переворотов, замки прекрасно сохранились. Но, к сожалению, это единственная информация, которая позволяет хоть как-то судить об изначальном расположении стран. Возможное формирование Байтландии. Замки отмечены синим цветом. Петя не смог смириться с тем, что не осталось никаких данных об изначальных странах. У него возникло подозрение, что вся эта история всего лишь вымысел. Он знает, что вы умный человек, и поэтому просит у вас помощи. Требуется выяснить, существует ли расположение изначальных государств, для которых может быть верна данная история, или нет. Выходные данные Если существуют расположения изначальных стран, для которых верна данная история, то выведите «YES», иначе выведите «NO». Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Примечание На картинках ниже изображено расположение замков в первом и втором примере.
| |
|
|
E2. История одной страны (сложная)
жадные алгоритмы
Перебор
сортировки
*3000
Эта задача отличается от предыдущей только ограничениями. На летние каникулы Петя приехал в Байтландию. Как оказалась, история этого государства весьма необычна. Изначально, до появления Байтландии, на её территории были расположены \(n\) различных стран. Каждое государство владело своей территорией, которую можно было представить на карте как прямоугольник, стороны которого параллельны осям координат, а вершины расположены в целочисленных точках. Никакие две страны не пересекались, однако они могли касаться сторонами. Иногда в результате агрессивных переговоров и мирных военных походов две страны объединялись в одну. Слияние происходило только в том случае, если после объединения их владений снова получалась прямоугольная территория. В конце концов осталось только одно государство — Байтландия. В начале времён территория каждой страны содержала внутри себя ровно один прямоугольный замок, где стороны этого замка параллельны осям координат, а вершины расположены в целочисленных точках. Допускается, что границы замка могли прилегать к границе соответствующей территории страны и к границам других замков. Удивительным образом, даже после всех переворотов, замки прекрасно сохранились. Но, к сожалению, это единственная информация, которая позволяет хоть как-то судить об изначальном расположении стран. Возможное формирование Байтландии. Замки отмечены синим цветом. Петя не смог смириться с тем, что не осталось никаких данных об изначальных странах. У него возникло подозрение, что вся эта история всего лишь вымысел. Он знает, что вы умный человек, и поэтому просит у вас помощи. Требуется выяснить, существует ли расположение изначальных государств, для которых может быть верна данная история, или нет. Выходные данные Если существуют расположения изначальных стран, для которых верна данная история, то выведите «YES», иначе выведите «NO». Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Примечание На картинках ниже изображено расположение замков в первом и втором примере.
| |
|
|
D. Коробка с конфетами (легкая версия)
жадные алгоритмы
сортировки
*1400
Фактически эта задача является подзадачей задачи G из этого контеста. В коробке с конфетами находятся \(n\) конфет. Тип \(i\)-й конфеты равен \(a_i\) (\(1 \le a_i \le n\)). Вы хотите приготовить подарок, используя некоторые из этих конфет, со следующим ограничением: количества конфет каждого типа, находящегося в подарке, должны быть различны (то есть, например, подарок, имеющий две конфеты типа \(1\) и две конфеты типа \(2\) является плохим). Возможно, что некоторые типы конфет могут вообще не находиться в подарке. Также возможно, что не все конфеты каких-то типов будут взяты в подарок. Ваша задача — найти максимально возможный размер одного подарка, который Вы можете приготовить, используя конфеты, которые Вы имеете. Вам необходимо ответить на \(q\) независимых запросов. Если Вы программируете на Python, рассмотрите возможность отправки решения на PyPy, а не на Python, когда будете отправлять свой код. Выходные данные Для каждого запроса выведите одно целое число — максимально возможный размер одного подарка, который Вы можете составить, используя конфеты, которые Вы имеете в этом запросе, с учетом ограничения, описанного в условии задачи. Примечание В первом запросе Вы можете приготовить подарок, состоящий из двух конфет типа \(8\) и одной конфеты типа \(5\), суммарно состоящий из \(3\) конфет. Заметьте, что это не единственное возможное решение — взятие двух конфет типа \(4\) и одной конфеты типа \(6\) также является правильным.
| |
|
|
F. Возвращение Topforces
математика
Перебор
сортировки
*2100
Скоро на самой известной платформе по программированию (Topforces) будет проходить очень важное соревнование! У авторов есть набор из \(n\) задач и они должны выбрать не более трех из них в контест. Красота \(i\)-й задачи равна \(a_i\). Авторы хотят составить самый красивый контест (другими словами, суммарная красота выбранных задач должна быть максимально возможной). Но в подготовке контеста есть одна очень важная особенность: из-за некоторых предрассудков авторов красоты задач не могут делить друг друга. Иными словами, если красоты выбранных задач равны \(x, y, z\), тогда \(x\) не должен делиться ни на \(y\), ни на \(z\), \(y\) не должен делиться ни на \(x\), ни на \(z\) и \(z\) не должен делиться ни на \(x\), ни на \(y\). Если красоты выбранных задач равны \(x\) и \(y\), то \(x\) должен не делиться на \(y\) и \(y\) должен не делиться на \(x\). Любой контест, составленный из одной задачи, является хорошим. Ваша задача — найти максимально возможную суммарную красоту контеста, составленного из не более трех задач из заданного набора. Вам необходимо ответить на \(q\) независимых запросов. Если Вы программируете на Python, рассмотрите возможность отправки решения на PyPy, а не на Python, когда будете отправлять свой код. Выходные данные Для каждого запроса выведите одно целое число — максимально возможную суммарную красоту контеста, составленного из не более трех задач из заданного набора задач в этом запросе.
| |
|
|
G. Коробка с конфетами (усложненная версия)
жадные алгоритмы
реализация
сортировки
*2000
Эта задача — усложненная версия задачи D из этого же самого контеста с дополнительными ограничениями и заданиями. В коробке с конфетами находятся \(n\) конфет. Тип \(i\)-й конфеты равен \(a_i\) (\(1 \le a_i \le n\)). Вы хотите приготовить подарок, используя некоторые из этих конфет, со следующим ограничением: количества конфет каждого типа, находящегося в подарке, должны быть различны (то есть, например, подарок, имеющий две конфеты типа \(1\) и две конфеты типа \(2\) является плохим). Возможно, что некоторые типы конфет могут вообще не находиться в подарке. Также возможно, что не все конфеты каких-то типов будут взяты в подарок. Вы очень любите некоторые конфеты из коробки и не хотите их включать в подарок (вы бы предпочли сами их съесть). Для каждой конфеты задано число \(f_i\), которое равно \(0\), если вы хотите оставить \(i\)-ю конфету себе, или \(1\), если вы вполне можете отдать ее, и это не вызовет у вас никаких отрицательных эмоций. Возможно, что у двух конфет одного типа могут быть разные значения \(f_i\). Вы хотите собрать как можно больше конфет в подарок — но, с другой стороны, вы не хотите отдавать слишком много конфет из тех, которые бы предпочли съесть сами. Поэтому вы хотите посчитать максимальное число конфет, которое может быть включено в подарок, а среди всех способов выбрать максимальное число конфет в подарке — максимально возможное количество конфет с \(f_i = 1\). Вам необходимо ответить на \(q\) независимых запросов. Если Вы программируете на Python, рассмотрите возможность отправки решения на PyPy, а не на Python, когда будете отправлять свой код. Выходные данные Для каждого запроса выведите два целых числа: - максимальное количество конфет в подарке, соответствующем условию задачи;
- максимальное количество конфет с \(f_i = 1\) в подарке с максимально возможным количеством конфет.
Примечание В первом запросе можно собрать подарок из двух конфет типа \(4\) и одной конфеты типа \(5\). У всех этих конфет \(f_i = 1\).
| |
|
|
B1. Доктор Встречает Вейдера (лёгкая)
Бинарный поиск
сортировки
*1400
Хайди и Доктор Кто выскочили из ТАРДИС и обнаружили себя в EPFL в 2018 году. Они были окружены штормовиками, и к ним приближался Дарт Вейдер. Каким-то чудом им удалось сбежать на ближайшую базу повстанцев, но Доктор был сильно смущён происходящим. Хайди напомнила ему, что в прошлом году основной темой HC2 были Звёздные Войны. После чего Доктор всё понял и приготовился встретиться лицом к лицу со злом Империи. У повстанцев было \(s\) космических кораблей, каждый с некоторой силой атаки \(a\). Они хотят отправить свои корабли, чтобы разрушить некоторые базы империи и похитить достаточное количество золота и припасов, чтобы поддержать силы восстания. У Империи есть \(b\) баз, каждая с некоторой силой защиты \(d\) и некоторым количеством золота \(g\). Космический корабль может атаковать все базы, которые имеют силу защиты не превосходящую силу атаки корабля. Если космический корабль атакует базу, то он похищает всё золото, которое там находилось. Повстанцы не решили какой космический корабль отправить первым, так что они обратились за помощью к Доктору. Они бы хотели знать для каждого космического корабля максимальное количество золота, которое он может украсть. Выходные данные Выведите \(s\) целых чисел — для каждого корабля во входных данных выведите максимальное количество золота, которое он может украсть. Примечание Первый космический корабль может атаковать только первую базу. Второй космический корабль может атаковать первую и третью базу. Третий космический корабль может атаковать первую, вторую и третью базы.
| |
|
|
B2. Доктор встречает Вейдера (средняя)
графы
кратчайшие пути
Паросочетания
Потоки
сортировки
*2200
Благодаря помощи Доктора, повстанцам удалось украсть достаточно золота, чтобы запустить полномасштабную атаку на эмперию! Однако Дарт Вейдер ищет возможности отомстить и забрать назад своё золото. Повстанцы спрятали золото на различных базах по всей галактике. Дарт Вейдер и Империя собираются послать свои космические корабли в атаку на эти базы. Галактика может быть представлена как неориентированный граф из \(n\) планет (вершин) и \(m\) червоточин (рёбер), каждая соединяющая две планеты. Всего у империи есть \(s\) космических кораблей, а у повстанцев есть \(b\) баз, расположенных на различных планетах галактики. У каждого космического корабля есть его местоположение \(x\), обозначающее индекс планеты, на которой он находится, его сила атаки \(a\) и определённый уровень топлива \(f\). У каждой базы есть местоположение \(x\) и уровень защиты \(d\). Космический корабль может атаковать базу если выполнены оба следующих условия: - Сила атаки космического корабля больше или равна уровня защиты базы,
- Уровень топлива космического корабля больше или равен кратчайшему расстоянию (количество червоточин) между планетой космического корабля и планетой с базой
Вейдер очень требователен к своим атакующим формациям. Он требует, чтобы каждый космический корабль атаковал не более одной базы, и чтобы каждая база была атакована не более чем одним космическим кораблем. Вейдер знает, что повстанцы спрятали \(k\) золота в каждой базе, так что он назначит космическим кораблям базы для атаки таким образом, чтобы максимизировать число атакованных баз. Таким образом, для каждой атакованной базы повстанцы теряют по \(k\) золота. Однако повстанцы имеют возможность создать произвольное количество фейковых баз. С помощью Доктора, эти базы будут существовать за пределами пространства и времени, так что все корабли смогут достичь и атаковать их. Более того, фейковые базы всегда будут казаться очень заманчивыми, то есть они гарантировано будут атакованы каким-то кораблём. Разумеется, фейковые базы не содержат золота, но создание одной такой базы стоит \(h\) золота. Какое минимальное количество золота повстанцы потеряют, если они создадут оптимальное количество фейковых баз? Выходные данные Выведите одно целое число — минимальную цену в золоте. Примечание Один из способов минимизировать стоимость — это построить \(4\) фейковые базы, тем самым итоговая стоимость равна \(4 \times 3 = 12\). По одному имперскому кораблю будет назначено на атаку каждой фейковой базы, тем самым будет атаковано ноль настоящих баз.
| |
|
|
C1. Экзамен в БерГУ (упрощённая версия)
жадные алгоритмы
сортировки
*1200
Единственное отличие этой версии от усложнённой — это ограничения. В Берляндском государственном университете началась сессия. Многие студенты уже сдают экзамены. Совсем скоро Полиграф Полиграфович примет экзамен у группы из \(n\) студентов. Студенты будут сдавать экзамен подряд один за другим в порядке от \(1\)-го до \(n\)-го. Процесс сдачи происходит следующим образом: - \(i\)-й студент подходит к преподавательскому столу и тянет билет;
- если студент понимает, что билет для него слишком сложный, то он отказывается отвечать и уходит домой (этот процесс происходит настолько быстро, что считается, что на него не расходуется время);
- если студент посчитал, что билет несложный, то он тратит ровно \(t_i\) минут на сдачу экзамена, после чего он получает отметку и уходит домой.
Студенты сдают экзамен один за другим без перерывов. Полиграф Полиграфович в один момент времени принимает экзамен у одного студента. Длительность всего экзамена составляет \(M\) минут (\(\max t_i \le M\)), поэтому чем ближе студент находится к концу списка, тем больше вероятность того, что он не успеет сдать экзамен. Ваша задача состоит в том, чтобы для каждого студента \(i\) определить минимальное количество студентов, которые должны уйти домой, чтобы \(i\)-й студент гарантированно успел полностью сдать экзамен. Для каждого студента \(i\) ответ надо искать независимо, то есть если при нахождении ответа для студента \(i_1\) про какого-то студента \(j\) выяснилость, что он должен уйти, то при нахождении ответа для \(i_2\) (\(i_2>i_1\)) студент \(j\) не обязательно должен уйти домой. Выходные данные Выведите \(n\) чисел: \(i\)-е число должно быть равно минимальному количеству студентов, которые должны уйти с экзамена, чтобы \(i\)-й студент успел ответить (полностью). Примечание Пояснение к примеру 1. Обратите внимание, что сумма первых пяти длительностей сдач не превосходит \(M=15\) (сумма равна \(1+2+3+4+5=15\)). Таким образом, первые пять студентов могут сдавать экзамен даже если все студенты до них тоже сдают экзамен. Иными словами, первые пять чисел в ответе равны \(0\). Для того, чтобы \(6\)-й студент сдал экзамен необходимо, чтобы не менее \(2\)-х студентов до него отказались сдавать (например, \(3\)-й и \(4\)-й, тогда \(6\)-й закончит свою сдачу через \(1+2+5+6=14\) минут, что не превосходит \(M\)). Для того, чтобы \(7\)-й студент успел сдать экзамен необходимо, чтобы не менее \(3\)-х студентов до него отказались сдавать (например, \(2\)-й, \(5\)-й и \(6\)-й, тогда \(7\)-й закончит свою сдачу через \(1+3+4+7=15\) минут, что не превосходит \(M\)).
| |
|
|
D. Сортировка подотрезков
сортировки
Структуры данных
*2400
Вам заданы массивы \(a_1, a_2, \dots, a_n\) и \(b_1, b_2, \dots, b_n\). За одну операцию вы можете отсортировать в порядке неубывания подотрезок \(a[l \dots r]\) массива \(a\). Например, если \(a = [4, 2, 2, 1, 3, 1]\) и вы выбрали подотрезок \(a[2 \dots 5]\), тогда массив примет вид: \([4, 1, 2, 2, 3, 1]\). Вам нужно определить, можно ли превратить массив \(a\) в массив \(b\), применяя к нему описанную выше операцию любое (возможно нулевое) количество раз. Выходные данные На каждый запрос в отдельной строке выведите YES (в любом регистре) если возможно получить массив \(b\) и NO (в любом регистре) в обратном случае. Примечание В первом тестовом примере мы можем отсортировать подотрезок \(a_1 \dots a_5\), тогда массив \(a\) превратится в \([1, 1, 4, 4, 7, 5, 6]\), а затем отсортировать подотрезок \(a_5 \dots a_6\).
| |
|
|
B. Числа на окружности
жадные алгоритмы
математика
сортировки
*1100
Вам дано \(n\) чисел \(a_1, a_2, \ldots, a_n\). Возможно ли расставить их по окружности таким образом, чтобы каждое число было строго меньше суммы своих соседей? К примеру, для массива \([1, 4, 5, 6, 7, 8]\), расстановка слева удовлетворяет условию, в то время как расстановка справа нет, так как \(5\ge 4 + 1\) и \(8> 1 + 6\). Выходные данные Если решения не существует, в первой строке выведите «NO». Если оно существует, в первой строке выведите «YES». После чего, во второй строке выведите \(n\) чисел — элементы массива в порядке в котором они будут стоять на окружности. Первый и последний элементы, которые вы выведете, считаются соседями на окружности. Если существует несколько решений, выведите любое из них. Вы можете выводить круг, начиная с любого из чисел. Примечание Одна из возможных расстановок указана в первом примере: \(4< 2 + 3\); \(2 < 4 + 3\); \(3< 4 + 2\). Одна из возможных расстановок указана в втором примере. При любой расстановке чисел \(13, 8, 5\) на окружности в третьем примере, \(13\) будет иметь соседей \(8\) и \(5\), но \(13\ge 8 + 5\). В четвертом примере нет нужной расстановки.
| |
|
|
B. Перед экзаменом
Конструктив
реализация
сортировки
*1900
Через несколько минут Васе предстоит сдать первый в своей студенческой жизни экзамен — и не просто экзамен, а экзамен по математическому анализу. Разумеется, Вася сейчас думает только об одном: что его ждет при встрече с экзаменатором... К экзамену необходимо было выучить доказательства n теорем. Известно, что на экзамене будет k билетов, в каждом из которых содержится различных теорем. Каждая теорема при этом входит не более чем в один билет (то есть теорем не попадут ни в один билет). В ходе экзамена один и тот же билет может достаться нескольким студентам. Точное распределение теорем по билетам неизвестно, однако студенты, сдававшие экзамен до Васи, рассказали ему о содержании своих билетов. Сам Вася оценивает свой уровень знаний по i-ой теореме некоторым числом ai. Уровнем знаний по билету называется среднее арифметическое уровней знаний по всем теоремам из этого билета. Теперь на основе сведений, полученных от других студентов, Вася хочет определить минимально и максимально возможные уровни своих знаний по билету, который попадется ему на экзамене. К сожалению, у Васи уже нет времени на подсчеты, поэтому он попросил о помощи вас. Выходные данные Выведите два вещественных числа — минимальный и максимальный уровни знаний Васи по билету, который достанется ему на экзамене. Абсолютная или относительная погрешность не должна превосходить 10 - 6. Примечание Разберем первый пример. Уровни знаний Васи по тем билетам, содержание которых уже известно, составляют 6 и 15.5 соответственно. Из оставшихся трех теорем можно сформировать только один билет. Рассмотрев все возможные варианты содержания этого билета, можно понять, что при наиболее благоприятном исходе экзамена Васе достанется билет, содержащий теоремы 4 и 7 (уровень знаний 15.5), а при наименее благоприятном — теоремы 3 и 5 (уровень знаний 5). Операция ⌊ x⌋ обозначает взятие целой части вещественного числа x (округление вниз).
| |
|
|
D. Tokitsukaze и странный прямоугольник
разделяй и властвуй
сортировки
Структуры данных
*2000
Дано \(n\) точек на плоскости, \(i\)-я из которых расположена в \((x_i, y_i)\). Tokitsukaze хочет нарисовать странную прямоугольную область и взять все точки в этой области. Странная область ограничена тремя прямыми, \(x = l\), \(y = a\) и \(x = r\), это ее левая, нижняя и правая сторона, соответственно, где \(l\), \(r\) и \(a\) могут являться любыми вещественными числами, удовлетворяющими \(l < r\). Верхняя сторона области неограничена, то есть можно считать, что она ограничена прямой, параллельной оси \(x\), и бесконечно удаленной. Странная прямоугольная область изображена на следующей иллюстрации. Точка \((x_i, y_i)\) находится в странной прямоугольной области тогда и только тогда, когда \(l < x_i < r\) и \(y_i > a\). К примеру, на иллюстрации выше \(p_1\) находится в области, а \(p_2\) — нет. Tokitsukaze хочет узнать, сколько существует различных непустых множеств, которые можно получить, выбирая все точки в некоторой странной прямоугольной области. Два множества считаются различными, если существует хотя бы одна точка в одном из них, которой нет во втором. Выходные данные Выведите единственное целое число — количество различных непустых множеств точек, которые она может получить. Примечание В первом примере существует только одно множество, содержащее \(k\) точек для \(k = 1, 2, 3\), поэтому общее число множеств равно \(3\). Во втором примере количества множеств размера \(k\) для \(k = 1, 2, 3\) равны \(3\), \(2\), \(1\) соответственно, и их сумма равна \(6\). В третьем примере, как показывает следующая иллюстрация, есть - \(2\) множества из одной точки;
- \(3\) множества из двух точек;
- \(1\) множество из четырех точек.
Исходя из этого, количество различных непустых множеств в этом примере равно \(2 + 3 + 0 + 1 = 6\).
| |
|
|
E. Посчитайте четырехугольники
битмаски
геометрия
Перебор
сортировки
Структуры данных
*2200
На плоскости нарисовано \(n\) отрезков; \(i\)-й отрезок соединяет две точки (\(x_{i, 1}\), \(y_{i, 1}\)) и (\(x_{i, 2}\), \(y_{i, 2}\)). Каждый отрезок невырожден и является либо горизонтальным, либо вертикальным — формально, для любого \(i \in [1, n]\) выполняется ровно одно из двух условий: \(x_{i, 1} = x_{i, 2}\) или \(y_{i, 1} = y_{i, 2}\) . Только отрезки разных типов могут пересекаться, т. е. горизонтальные отрезки не имеют общих точек, то же самое верно и для вертикальных. Четыре отрезка с индексами \(h_1\), \(h_2\), \(v_1\) и \(v_2\), такие, что \(h_1 < h_2\) и \(v_1 < v_2\), образуют прямоугольник при выполнение следующих условий: - отрезки \(h_1\) и \(h_2\) горизонтальные;
- отрезки \(v_1\) и \(v_2\) вертикальные;
- отрезок \(h_1\) пересекается с отрезком \(v_1\);
- отрезок \(h_2\) пересекается с отрезком \(v_1\);
- отрезок \(h_1\) пересекается с отрезком \(v_2\);
- отрезок \(h_2\) пересекается с отрезком \(v_2\).
Подсчитайте количество способов выбрать четыре отрезка так, чтобы они образовывали прямоугольник. Не забывайте, что условия \(h_1 < h_2\) и \(v_1 < v_2\) должны выполняться. Выходные данные Выведите число — количество способов выбрать четыре отрезка так, чтобы они образовывали прямоугольник. Примечание На следующих картинках нарисованы тестовые примеры:
| |
|
|
F. Клуб анонимных геометров
геометрия
математика
сортировки
Структуры данных
*2500
Сегодня Денис проводит в ЛКШ клуб анонимных геометров. Он заготовил для клуба \(n\) выпуклых многоугольников, пронумерованных от \(1\) до \(n\). Он планирует предложить участникам клуба посчитать суммы Минковского этих многоугольников. А именно, он планирует дать \(q\) заданий, в \(i\)-м из них нужно посчитать сумму Минковского многоугольников с номерами от \(l_i\) до \(r_i\) включительно. Суммой Минковского двух множеств \(A\) и \(B\) называется множество \(C = \{a + b : a \in A, b \in B\}\). Можно доказать, что если \(A\) и \(B\) являются выпуклыми многоугольниками, то \(C\) тоже будет выпуклым многоугольником. Сумма двух выпуклых многоугольников Чтобы посчитать сумму Минковского \(p\) многоугольников (\(p > 2\)), нужно посчитать сумму Минковского первых \(p - 1\) многоугольников, а потом сумму Минковского результата и \(p\)-го многоугольника. Для того, чтобы было удобнее проверять правильность выполнения заданий, Денис решил подготовиться и посчитать количество вершин в сумме Минковского для каждого задания. Помогите ему сделать это. Выходные данные Для каждого задания выведите одно целое число — количество вершин в сумме Минковского многоугольников с номерами от \(l_i\) до \(r_i\). Примечание Пояснение к примеру: Первый, второй и третий многоугольники из тестового примера Суммы Минковского первого и второго, второго и третьего и всех трех многоугольников соответственно
| |
|
|
F. К-й путь
Конструктив
кратчайшие пути
Перебор
сортировки
*2200
Вам задан связный неориентированный взвешенный граф, состоящий из \(n\) вершин и \(m\) ребер. Вам необходимо вывести \(k\)-й минимальный кратчайший путь в этом графе (пути из вершины в саму себя не учитываются, пути из вершины \(i\) в вершину \(j\) и из вершины \(j\) в вершину \(i\) считаются за один). Более формально, если \(d\) — матрица кратчайших путей, где \(d_{i, j}\) равно длине кратчайшего пути между вершинами \(i\) и \(j\) (\(1 \le i < j \le n\)), то вам необходимо вывести \(k\)-й элемент в отсортированном массиве, состоящем из всех \(d_{i, j}\), где \(1 \le i < j \le n\). Выходные данные Выведите одно целое число — длину \(k\)-го минимального кратчайшего пути в заданном графе (пути из вершины в саму себя не учитываются, пути из вершины \(i\) в вершину \(j\) и из вершины \(j\) в вершину \(i\) считаются за один).
| |
|
|
A. Лестница своими руками
жадные алгоритмы
математика
сортировки
*900
Назовем \(k\)-ступенчатой лестницей следующую конструкцию: ровно \(k + 2\) деревянные доски, среди которых - две доски длиной хотя бы \(k+1\) — основные направляющие лестницы;
- \(k\) досок длиной хотя бы \(1\) — ступеньки лестницы.
Заметим, что ни направляющие, ни ступени не обязаны быть равны. Например, лестницы \(1\) и \(3\) — корректные \(2\)-ступенчатые лестницы, а лестница \(2\) — корректная \(1\)-ступенчатая. На первом изображении длины досок равны \([3, 3]\) для направляющих и \([1]\) для ступеньки. На втором изображении длины досок равны \([3, 3]\) для направляющих и \([2]\) для ступеньки. На третьем изображении длины досок равны \([3, 4]\) для направляющих и \([2, 3]\) для ступенек. У вас есть \(n\) досок. Длина \(i\)-й доски равна \(a_i\). У вас нет пилы и вы не можете распиливать доски. Зато есть молоток и гвозди, и вы можете собрать импровизированную «лестницу» из тех досок, что есть. Вопрос в следующем: чему равно максимальное \(k\) такое, что вы сможете собрать \(k\)-ступенчатую лестницу, используя некоторый поднабор из имеющихся досок? Выходные данные Выведите \(T\) чисел — по одному на запрос. \(i\)-е число обозначает максимальное \(k\) такое, что вы можете собрать \(k\)-ступенчатую лестницу из досок описанных в \(i\)-м запросе. Выведите \(0\), если невозможно собрать даже \(1\)-ступенчатую лестницу из заданных досок. Примечание Варианты лестниц для запросов \(1-3\) представлены на картинке выше: О качестве полученных лестниц:
| |
|
|
C. Разделение массива
жадные алгоритмы
сортировки
*1400
У вас есть отсортированный массив \(a_1, a_2, \dots, a_n\) (для любого индекса \(i > 1\) выполняется условие \(a_i \ge a_{i-1}\)) и число \(k\). Вам нужно разделить этот массив на \(k\) непустых последовательных подотрезков. Каждый элемент должен принадлежать ровно одному подотрезку. Пусть \(max(i)\) будет равно максимуму в \(i\)-м подотрезке, а \(min(i)\) будет равно минимуму в \(i\)-м подотрезке. Тогда цена разделения будет равна \(\sum\limits_{i=1}^{k} (max(i) - min(i))\). Например, если массив \(a = [2, 4, 5, 5, 8, 11, 19]\) и мы разделили его на \(3\) подотрезка следующим образом: \([2, 4], [5, 5], [8, 11, 19]\), тогда цена разделения будет равна \((4 - 2) + (5 - 5) + (19 - 8) = 13\). Посчитайте минимальную цену разделения массива \(a\) на \(k\) непустых последовательных подотрезков. Выходные данные Выведите минимальную цену, которую вы можете получить, разделив массив \(a\) на \(k\) непустых последовательных подотрезков. Примечание В первом тестовом примере можо разделить массив \(a\) следующим образом: \([4, 8, 15, 16], [23], [42]\).
| |
|
|
E. Культурный код
Бинарный поиск
дп
Комбинаторика
кратчайшие пути
сортировки
Структуры данных
*2300
В магазине неподалеку продаются известные русские деревянные игрушки под названием «матрешки», и вы бы хотели приобрести несколько штук. В магазине продается \(n\) различных матрешек. Любая матрешка — это фигурка объема \(out_i\) с пустотой внутри объемом \(in_i\) (конечно, \(out_i > in_i\)). У вас не так много свободного места в сумке, но, к счастью, вы знаете, что матрешки можно вкладывать друг в друга. Формально, назовем набор матрешек вкладываемым, если мы можем переупорядочить их таким образом, что первая матрешка вкладывается во вторую, вторая — в третью и так далее. Матрешка \(i\) вкладывается в матрешку \(j\), если \(out_i \le in_j\). Только последняя игрушка из вкладываемого набора будет занимать место в вашей сумке. Назовем пустотой вкладываемого набора общий объем пустого места внутри данной структуры. Очевидно, что она равна \(in_{i_1} + (in_{i_2} - out_{i_1}) + (in_{i_3} - out_{i_2}) + \dots + (in_{i_k} - out_{i_{k-1}})\), где \(i_1\), \(i_2\), ..., \(i_k\) — индексы выбранных матрешек в порядке их вкладывания. Наконец, назовем вкладываемый поднабор заданного набора достаточно большим, если в него нельзя добавить ни одной матрешки из набора так, чтобы не нарушить его вкладываемость. Вы хотели бы купить много матрешек, а потому выбираете достаточно большой вкладываемый поднабор. Но автора задачи сильно расстроит, если в вашей сумке будет потрачено зря слишком много места, поэтому вы выбираете достаточно большой вкладываемый поднабор, пустота которого минимально возможная среди всех достаточно больших поднаборов. И вот возник вопрос: как много различных поднаборов удовлетворяют всем требованиям (поднаборы достаточно большие, и нет другого достаточно большого поднабора с пустотой меньше заданного). Два поднабора считаются различными, если существует хотя бы один индекс \(i\) такой, что один поднабор содержит \(i\)-ю матрешку, а другой — нет. Так как ответ может быть очень большим — выведите его по модулю \(10^9 + 7\). Выходные данные Выведите единственное число — количество достаточно больших вкладываемых поднаборов таких, что пустота каждого такого поднабора минимально возможная. Так как ответ может быть очень большим, выведите его по модулю \(10^9 + 7\). Примечание В первом примере есть ровно \(6\) достаточно больших вкладываемых поднаборов с минимальной пустотой: - \(\{1, 5\}\): мы не можем добавить в него другие матрешки, не нарушая вкладываемость; пустота поднабора равна \(1\);
- \(\{1, 6\}\);
- \(\{2, 4, 5\}\);
- \(\{2, 4, 6\}\);
- \(\{3, 4, 5\}\);
- \(\{3, 4, 6\}\).
Других «хороших» поднаборов нет, потому что, например, поднабор \(\{6, 7\}\) не достаточно большой (в него можно добавить \(4\)-ю матрешку), а поднабор \(\{4, 6, 7\}\) имеет пустоту, равную \(2\).
| |
|
|
A. MP3
сортировки
*1600
При записи звука в цифровом виде фактически записываются отдельные отсчеты — значения интенсивности звука в отдельные моменты времени. Для хранения каждого такого значения используется целое неотрицательное число. Таким образом, можно считать, что звуковой файл — это массив из \(n\) целых неотрицательных чисел. Если в этом массиве ровно \(K\) различных значений, то для записи одного значения требуется \(k = \lceil \log_{2} K \rceil\) бит. Для записи всего файла потребуется \(nk\) бит памяти. Для сокращения объема памяти, занимаемой звуковым файлом, применяют сжатие. При этом уменьшается количество различных значений интенсивности звука. Для этого выбираются некоторые числа \(l \le r\), и все значения изменяются следующим образом: если число и так лежало в отрезке \([l;r]\), то оно не изменяется. Если число было меньше \(l\), то оно становится равным \(l\); а если было больше \(r\) — становится равным \(r\). Таким образом, теряются очень низкие и очень высокие интенсивности. Если некоторый элемент массива пришлось изменить при сжатии, скажем, что этот элемент пострадал. Требуется уместить данный звуковой файл на диск размера \(I\) байт, при этом минимизировав количество пострадавших элементов. Напомним, что в \(1\) байте \(8\) бит. \(k = \lceil log_{2} K \rceil\) — минимальное целое число такое, что \(K \le 2^{k}\). В частности, если \(K = 1\), то \(k = 0\). Выходные данные Выведите одно число — минимальное количество пострадавших элементов. Примечание В первом примере можно выбрать \(l=2, r=3\). После этого массив примет вид 2 2 2 3 3 3, количество различных значений будет \(K=2\), и звуковой файл поместится на диск. При этом пострадают два элемента. Во втором примере диск имеет больший размер и исходный файл помещается на него целиком. В третьем примере мы должны изменить обе 1 или обе 3.
| |
|
|
B. Социальное государство
Бинарный поиск
Перебор
сортировки
Структуры данных
*1600
В некотором государстве живёт \(n\) граждан. Количество денег у \(i\)-го из них равно \(a_{i}\). Государство внимательно следит за благосостоянием своих граждан. Если гражданин совершил покупку или заработал денег, то он обязан отправить в социальные службы справку об изменении баланса с указанием текущего количества денег. Иногда государство делает выплаты малоимущим гражданам: всем гражданам, у кого текущее количество денег строго меньше \(x\), выплачивают пособие такого размера, чтобы количество денег у них стало ровно \(x\). В таком случае гражданин не должен отправлять справку о изменении баланса. Вам известно начальное количество денег у каждого гражданина, а также лог всех действий в социальных службах: получение справок и выплаты малоимущим. Восстановите количество денег у каждого гражданина после всех событий. Выходные данные Выведите \(n\) чисел, разделённых пробелами, — балансы всех граждан после всех событий. Примечание Процесс изменения балансов в первом примере: 1 2 3 4 \(\rightarrow\) 3 3 3 4 \(\rightarrow\) 3 2 3 4 \(\rightarrow\) 3 2 3 4 Процесс изменения балансов во втором примере: 3 50 2 1 10 \(\rightarrow\) 3 0 2 1 10 \(\rightarrow\) 8 8 8 8 10 \(\rightarrow\) 8 8 20 8 10
| |
|
|
C. Паросочетание vs независимое множество
графы
жадные алгоритмы
Конструктив
сортировки
*2000
Дан неориентированный граф, состоящий из \(3 \cdot n\) вершин и \(m\) ребер. Требуется найти паросочетание, состоящее из \(n\) ребер, или независимое множество, состоящее из \(n\) вершин. Множество рёбер называется паросочетанием, если никакие два ребра этого множества не имеют общих вершин. Множество вершин называется независимым, если никакие две вершины этого множества не соединены ребром. Выходные данные Выведите ответы для каждого из \(T\) графов. Формат ответа для одного графа описан ниже. Если вы нашли паросочетание размера \(n\), то в первой строке выведите «Matching» (без кавычек), а во второй строке выведите \(n\) чисел, разделённых пробелами, — номера рёбер паросочетания. Рёбра нумеруются от \(1\) до \(m\) в порядке ввода. Если вы нашли независимое множество размера \(n\), то в первой строке выведите «IndSet» (без кавычек), а во второй строке выведите \(n\) чисел, разделённых пробелами, — номера вершин независимого множества. Если в графе нет ни того, ни другого, выведите «Impossible» (без кавычек). Номера рёбер или вершин можно выводить в произвольном порядке. Если существует несколько решений, вы можете вывести любое. В том числе, если в графе есть как паросочетание размера \(n\), так и независимое множество размера \(n\), то вы можете вывести любое из таких паросочетаний или любое из таких независимых множеств. Примечание Первые два графа из примера совпадают, однако в этом графе есть как паросочетание размера 1, так и независимое множество размера 1. Любое из таких паросочетаний и независимых множеств является правильным ответом. В третьем графе нет паросочетания размера 2, однако есть независимое множество размера 2. В этом графе также есть независимое множество размера 5: 2 3 4 5 6. Тем не менее, такой ответ не является верным, потому что вас просят найти независимое множество (или паросочетание) размера ровно \(n\). В четвёртом графе нет независимого множества размера 2, однако есть паросочетание размера 2.
| |
|
|
B. Правильное решение?
реализация
сортировки
*1100
Одним холодным зимним вечером Настя и ее старший брат Валера сидели дома возле теплого камина и обменивались интересными задачками. Когда наступила очередь Насти, она назвала брату число n и сказала: —Переставь цифры в этом числе так, чтобы в результате получилось наименьшее возможное число, в котором нет лидирующих нулей. —Да это же очень просто! — воскликнул Валера и сразу же выдал сестре ответ. Настя загадала случайное число и сама еще не знает, является ли ответ Валеры правильным. Вам необходимо срочно помочь девочке, потому что нетерпеливый Валера требует от нее скорого оглашения вердикта. Выходные данные Выведите OK, если Валера дал правильный ответ, или WRONG_ANSWER в противном случае.
| |
|
|
C. Фрукты
жадные алгоритмы
реализация
сортировки
*1100
Наступает пора весны, а это означает что на прилавках появляется большое количество фруктов. В один из солнечных дней мальчик Валерий решил пройтись по магазинам. Он составил список из m фруктов, которые хотел бы приобрести. В том случае, если Валера хотел купить несколько фруктов одного сорта, то он несколько раз заносил этот фрукт в свой список. Подойдя к фруктовому ларьку Ашота, мальчик заметил, что продавец еще не успел наклеить ценники на свой товар, а только лишь разложил их на прилавке. В скором времени, когда Ашот присвоит каждому фрукту его цену, Валера сможет подсчитать, сколько денег ему потребуется для приобретения всего желаемого из списка. Однако мальчик хочет заранее знать минимальную (в случае «самого удачного» для Валеры распределения ценников) и максимальную (в случае «самого неудачного» для Валеры распределения ценников) стоимости покупки. Выходные данные Выведите через пробел два числа a и b (a ≤ b) — минимальную и максимальную суммы, необходимые Валере для того, чтобы приобрести все фрукты из своего списка.
| |
|
|
D. Бал
сортировки
Структуры данных
*2400
На бал в королевском дворце пришли N дам. Каждая дама характеризуется тремя параметрами: красотой, умом и богатством. Королевский церемониймейстер знает, что дамы — существа особенные. А именно, если какая-то дама видит, что на балу присутствует другая дама, которая умнее, красивее и богаче ее, то она может выброситься с балкона королевского дворца. Ему известны параметры всех дам и он хочет выяснить, сколько в этот вечер будет потенциальных дам-самоубийц. Обозначим красоту i-й дамы за Bi, ум за Ii и размер состояния за Ri. Тогда i-я дама является потенциальной самоубийцей, если для какой-то дамы j выполняется Bi < Bj, Ii < Ij, Ri < Rj. Найдите число потенциальных самоубийц. Выходные данные Выведите ответ на задачу.
| |
|
|
J. Минимальная сумма
геометрия
разделяй и властвуй
сортировки
*1900
Вам задан набор из n векторов на плоскости. Для каждого вектора разрешается домножить любые его координаты на -1. Таким образом, каждый вектор vi = (xi, yi) можно преобразовать в один из следующих четырех векторов: - vi1 = (xi, yi),
- vi2 = ( - xi, yi),
- vi3 = (xi, - yi),
- vi4 = ( - xi, - yi).
Вам нужно найти два вектора из набора и определить, какие из их координат следует умножить на -1 таким образом, чтобы модуль суммы полученных векторов был минимально возможным. Более формально, требуется выбрать два вектора vi, vj (1 ≤ i, j ≤ n, i ≠ j) и два числа k1, k2 (1 ≤ k1, k2 ≤ 4), так чтобы значение выражения |vik1 + vjk2| было минимально. Выходные данные Выведите в первой строке четыре числа через пробел «i k1 j k2» — ответ на задачу. Если существует несколько вариантов с минимальным модулем суммы, можете вывести любой из них. Примечание Суммой двух векторов v = (xv, yv) и u = (xu, yu) называется вектор s = v + u = (xv + xu, yv + yu). Модулем вектора v = (x, y) называется число . Во втором примере существует несколько подходящих ответов, вот некоторые из них: (3 1 4 2), (3 1 4 4), (3 4 4 1), (3 4 4 3), (4 1 3 2), (4 1 3 4), (4 2 3 1).
| |
|
|
C. Максимальная медиана
Бинарный поиск
жадные алгоритмы
математика
сортировки
*1400
Вам дан массив \(a\) из \(n\) целых чисел, где \(n\) нечётно. Вы можете проделать с массивом следующую операцию: - Выбрать один из элементов массива (например \(a_i\)) и увеличить его на \(1\) (то есть заменить на \(a_i + 1\)).
Вы хотите сделать медиану массива максимально большой, используя не более \(k\) операций. Медианой нечётного по размеру массива называется средний элемент, если массив отсортировать по неубыванию. Например, медианой массива \([1, 5, 2, 3, 5]\) является \(3\). Выходные данные Выведите одно целое число — наибольшую возможную медиану после всех операций. Примечание В первом примере можно два раза увеличить второй элемент. Тогда массив будет равен \([1, 5, 5]\) и его медиана равна \(5\). Во втором примере можно один раз увеличить второе число, а также два раза увеличить третье и пятое. Тогда ответ будет равен \(3\). В третьем примере можно сделать четыре операции, чтобы увеличить первый, четвёртый, шестой и седьмой элемент, тогда массив будет равен \([5, 1, 2, 5, 3, 5, 5]\) и медиана будет равна \(5\).
| |
|
|
E. Боксёры
жадные алгоритмы
сортировки
*1500
Есть \(n\) боксёров, вес \(i\)-го равен \(a_i\). Каждый из них перед соревнованием может изменить свой вес не более чем на \(1\) (вес не может стать равным нулю, то есть должен остаться положительным). Вес — это всегда целое число. Необходимо выбрать наибольшую по количеству человек такую команду боксёров, что все веса боксёров в ней — различны. Напишите программу, которая для заданных текущих значений \(a_i\) найдет максимальное возможное количество боксёров в команде. Возможно, что после какого-то изменения вес какого-то боксера станет \(150001\) (но не больше). Выходные данные Выведите единственное целое число — максимальное возможное количество человек в команде. Примечание В первом примере боксёры не должны менять свои веса — можно просто из всех них составить команду. Во втором примере можно одного боксёра веса \(1\) увеличить на единицу (получить вес \(2\)), одного боксёра веса \(4\) уменьшить на единицу, а другого — увеличить на единицу (получив боксёров с весами \(3\) и \(5\) соответственно). Таким образом, можно получить команду, состоящую из боксёров с весами \(5, 4, 3, 2, 1\).
| |
|
|
A. Выберите два числа
математика
сортировки
*800
Вам дан массив \(A\), состоящий из \(n\) положительных целых чисел \(a_1, a_2, \dots, a_n\), а также массив \(B\), состоящий из \(m\) положительных целых чисел \(b_1, b_2, \dots, b_m\). Выберите какой-то элемент \(a\) массива \(A\) и какой-то элемент \(b\) массива \(B\) так, чтобы числа \(a+b\) не было ни в массиве \(A\), ни в массиве \(B\). К примеру, если \(A = [2, 1, 7]\), \(B = [1, 3, 4]\), то можно выбрать \(1\) с массива \(A\) и \(4\) с массива \(B\), так как числа \(5 = 1 + 4\) нет ни в \(A\), ни в \(B\). В то же время, выбрать \(2\) с \(A\) и \(1\) с \(B\) нельзя, так как \(3 = 2 + 1\) входит в \(B\). Можно показать, что такая пара чисел найдется. Если существует несколько решений, выведите любое из них. Выберите и выведите любые такие два числа. Выходные данные Выведите два числа \(a\) и \(b\) такие, что \(a\) входит в \(A\), \(b\) входит в \(B\), а \(a+b\) не входит ни в \(A\), ни в \(B\). Если существует несколько решений, выведите любое из них. Примечание В первом примере мы можем выбрать \(20\) с массива \([20]\) и \(20\) с массива \([10, 20]\). Числа \(40 = 20 + 20\) нет ни в одном из этих массивов. Хотя с второго массива можно выбрать и \(10\). Во втором примере мы можем выбрать \(3\) с массива \([3, 2, 2]\) и \(1\) с массива \([1, 5, 7, 7, 9]\). Числа \(4 = 3 + 1\) нет ни в одном из этих массивов. В третьем примере мы можем выбрать \(1\) с массива \([1, 3, 5, 7]\) и \(1\) с массива \([7, 5, 3, 1]\). Числа \(2 = 1 + 1\) нет ни в одном из этих массивов.
| |
|
|
E1. Вращая столбцы (упрощенная версия)
битмаски
дп
жадные алгоритмы
Перебор
сортировки
*2000
Это более лёгкая версия следующей задачи, отличающаяся от неё только ограничениями. Вам дана прямоугольная матрица \(a\) размером \(n \times m\). За один ход вы можете выбрать произвольный столбец и циклически сдвинуть все элементы в этом столбце. Вы можете выполнять эту операцию произвольное (ноль или более) количество раз. Вы можете применять эту операцию для одного столбца произвольное количество раз. После того, как вы закончили, вы вычисляете для каждой строки наибольший элемент в ней. Предположим, для \(i\)-й строки он равен \(r_i\). Чему равно наибольшее значение \(r_1+r_2+\ldots+r_n\)? Выходные данные Выведите \(t\) целых чисел: ответы на все наборы входных данных, в порядке, в котором они заданы в тесте. Примечание В первом тестовом наборе можно сдвинуть третий столбец вниз на один, тогда будет \(r_1 = 5\) и \(r_2 = 7\). Во втором тестовом наборе можно ничего не делать, тогда будет \(r_1 = r_2 = 10\) и \(r_3 = 9\).
| |
|
|
E2. Вращая столбцы (усложнённая версия)
битмаски
дп
жадные алгоритмы
сортировки
*2500
Это сложная версия задачи, отличающаяся более высокими ограничениями. Вам дана прямоугольная матрица \(a\) размером \(n \times m\). За один ход вы можете выбрать произвольный столбец и циклически сдвинуть все элементы в этом столбце. Вы можете выполнять эту операцию произвольное (ноль или более) количество раз. Вы можете применять эту операцию для одного столбца произвольное количество раз. После того, как вы закончили, вы вычисляете для каждой строки наибольший элемент в ней. Предположим, для \(i\)-й строки он равен \(r_i\). Чему равно наибольшее значение \(r_1+r_2+\ldots+r_n\)? Выходные данные Выведите \(t\) целых чисел: ответы на все наборы входных данных, в порядке, в котором они заданы в тесте. Примечание В первом тестовом наборе можно сдвинуть третий столбец вниз на один, тогда будет \(r_1 = 5\) и \(r_2 = 7\). Во втором тестовом наборе можно ничего не делать, тогда будет \(r_1 = r_2 = 10\) и \(r_3 = 9\).
| |
|
|
C. Мороженое
*особая задача
жадные алгоритмы
сортировки
*1700
Лето в Берляндии длится \(n\) дней, цена одной порции мороженого в \(i\)-й день равна \(c_i\). За лето Таня хочет съесть ровно \(k\) порций мороженого. При этом в \(i\)-й день она решила, что съест не менее \(a_i\) порций, но не более \(b_i\) (\(a_i \le b_i\)). Иными словами, пусть \(d_i\) равно количеству порций, сколько она съест в \(i\)-й день. Тогда \(d_1+d_2+\dots+d_n=k\) и \(a_i \le d_i \le b_i\) для каждого \(i\). Учитывая, что порции мороженого можно есть только в день покупки, найдите минимальную сумму денег, сколько Таня потратит на мороженое летом. Выходные данные Выведите минимальную сумму денег, которую Таня может потратить на мороженое летом. Если у Тани не существует способа так покупать и есть мороженое, чтобы удовлетворить все требования, то выведите -1. Примечание В первом примере Тане надо съесть \(3\) порции мороженого в первый день, \(1\) порцию мороженого во второй день и \(3\) порции мороженого в третий день. В таком случае, сумма потраченных денег равна \(3\cdot6+1\cdot4+3\cdot3=31\). Можно показать, что любой другой допустимый способ съесть ровно \(7\) порций мороженого потребует больших расходов.
| |
|
|
D2. Приравнивание делением (сложная версия)
математика
Перебор
сортировки
*1600
Единственное отличие между легкой и сложной версиями — количество элементов в массиве. Вам задан массив \(a\), состоящий из \(n\) целых чисел. За один ход вы можете выбрать любое \(a_i\) и разделить его на \(2\) с округлением вниз (иными словами, за один ход вы можете присвоить \(a_i := \lfloor\frac{a_i}{2}\rfloor\)). Вы можете совершать эту операцию любое (возможно, нулевое) количество раз с любым \(a_i\). Ваша задача — посчитать минимально возможное количество операций, необходимое для того, чтобы получить хотя бы \(k\) равных чисел в массиве. Не забудьте, что допустимо иметь \(a_i = 0\) после каких-то операций, таким образом, ответ всегда существует. Выходные данные Выведите одно целое число — минимально возможное количество операций, необходимое для того, чтобы получить хотя бы \(k\) равных элементов в массиве.
| |
|
|
G. Запросы на пути
графы
Деревья
разделяй и властвуй
снм
сортировки
*1800
Вам задано взвешенное дерево, состоящее из \(n\) вершин. Напомним, что деревом называется связный граф без циклов. Вершины \(u_i\) и \(v_i\) соединены ребром веса \(w_i\). Вам задано \(m\) запросов. \(i\)-й запрос задан целым числом \(q_i\). В этом запросе вам необходимо посчитать количество пар вершин \((u, v)\) (\(u < v\)) таких, что максимальный вес ребра на простом пути между \(u\) и \(v\) не превосходит \(q_i\). Выходные данные Выведите \(m\) целых чисел — ответы на запросы. \(i\)-е число должно равняться количеству пар вершин \((u, v)\) (\(u < v\)) таких, что максимальный вес ребра на простом пути между \(u\) и \(v\) не превосходит \(q_i\). Запросы пронумерованы от \(1\) до \(m\) в порядке входных данных. Примечание Картинка, соответствующая дереву из первого тестового примера: 
| |
|
|
E. Петя и конструктор
графы
Деревья
Конструктив
математика
сортировки
*2000
Недавно у Пети был день рождения. Его друзья знают, что Петя очень сильно любит головоломки, поэтому они подарили ему популярный конструктор «Электрик-\(n\)». Конструктор «Электрик-\(n\)» состоит из \(2n - 1\) проводов и \(2n\) лампочек. При этом каждая лампочка имеет свой уникальный номер, являющийся целыми числом от \(1\) до \(2n\), а все провода являются одинаковыми и неразличимы. Чтобы собрать конструктор требуется каждый из проводов использовать для соединения каких-то двух различных лампочек. Цепочкой в собранном конструкторе назовём последовательность из не менее чем двух различных лампочек, такую что любые две соседние в цепочке лампочки соединены проводом напрямую. Итоговая конфигурация конструктора является корректной, если сеть из проводов и лампочек имеет древовидную структуру, то есть любые две различные лампочки являются концами какой-нибудь цепочки. На протяжении нескольких дней Петя собирал различные конфигурации. Он обратил внимание на то, что иногда некоторые лампочки начинают светиться. После продолжительных экспериментов Петя выяснил, что лампочки с номерами \(2i\) и \(2i - 1\) горят тогда, когда цепочка между ними состоит ровно из \(d_i\) проводов. При этом выполнялось важное условие: значение \(d_i\) всегда было не больше \(n\). Сколько бы Петя не старался, у него так и не получилось найти конфигурацию, в которой бы светились все лампочки, поэтому он решил попросить помощи у вас. Требуется найти любую корректную конфигурацию, в которой горят все лампочки. Гарантируется, что это всегда возможно сделать. Выходные данные Выведите \(2n - 1\) строк. В \(i\)-й строке должны быть записаны два различных целых числа \(a_i\) и \(b_i\) (\(1 \leq a_i, b_i \leq 2n\), \(a_i \ne b_i\)), которые означают, что в вашей конфигурации лампочки с этими номерами соединены проводом. Если существует несколько правильных ответов, то разрешается вывести любой из них. Примечание Ответ на первый тест из условия. Ответ на второй тест из условия.
| |
|
|
F. Трудоустройство
жадные алгоритмы
сортировки
*2700
В мире давно происходит противостояние двух крупных компаний: «Cecsi» и «Poca Pola». Чтобы окончательно покончить со своим конкурентом, компания «Poca Pola» занялась сверхсекретным проектом, для которого в разных офисах им потребовалось суммарно \(n\) новых сторудников. После череды отборов, тестирований и собеседований было выбрано \(n\) подходящих кандидатов, и дело осталось за малым — их трудоустройством. Так как все кандидаты имеют одинаковые навыки и умения, абсолютно неважно, на какое именно рабочее место отправить каждого из них. Поэтому руководство компании «Poca Pola» решило распределить кандидатов между рабочими местами так, чтобы суммарное расстояние от дома кандидата до места его работы было бы минимально. Как известно, Земля круглая, поэтому весь мир представляется окружностью, на некоторых точках которой стоит суммарно \(m\) городов. Все города пронумерованы по часовой стрелке целыми числами от \(1\) до \(m\) так, что для любого \(i\) (\(1 \le i \le m - 1\)) города с номерами \(i\) и \(i + 1\) соседние, также соседними являются города \(1\) и \(m\). Перемещаться между городами можно только по поверхности Земли, причём из города можно перейти только в один из двух соседних с ним. Расстояние между двумя городами равно минимальному числу переходов из города в соседний, которое нужно совершить, чтобы добраться от одного города до другого. В частности, расстояние между городом и им же самим равно \(0\). Известно, что рабочие места компании «Poca Pola» находятся в городах \(a_1, a_2, \ldots, a_n\). Также для каждого кандидата известны города их жительства — \(b_1, b_2, \ldots, b_n\). Возможно, что несколько рабочих мест находятся в одном городе, а также возможно, что несколько людей живут в одном городе. Руководство компании «Poca Pola» слишком занято сверхсекретным проектом, поэтому вам было поручено распределить кандидатов по рабочим местам так, чтобы суммарное расстояние для всех кандидатов от города проживания до города, где он работает, было бы минимальным возможным. Выходные данные В первой строке выведите минимальное суммарное расстояние от кандидатов до назначенных им мест работы. Во второй строке выведите \(n\) различный целых чисел от \(1\) до \(n\), где \(i\)-е из них равно номеру кандидата, которого надо отправить на \(i\)-е рабочее место. Примечание В первом примере, расстояние от каждого кандидата до его работы равно \(1\) (от \(10\) до \(1\), от \(4\) до \(5\) и от \(6\) до \(5\)). Во втором примере: - На первую работу назначен второй кандидат, расстояние от \(3\)-го города до \(1\) равно \(2\).
- На вторую работу назначен третий кандидат, расстояние от \(6\)-го города до \(4\) равно \(2\).
- На третью работу назначен первый кандидат, расстояние от \(8\)-го города до \(8\) равно \(0\).
| |
|
|
B. Стрельба
жадные алгоритмы
реализация
сортировки
*900
Вася недавно начал тренироваться стрельбе из пистолета. Сегодня тренер предложил ему следующее задание. Он выставил на стол \(n\) банок в ряд. Банки пронумерованы слева направо от \(1\) до \(n\). Чтобы выполнить задание, Васе предстоит сбить каждую из банок ровно по одному разу. При этом порядок, в котором Вася будет сбивать банки, он выбирает самостоятельно. Вася знает, что прочность \(i\)-й банки равна \(a_i\). Это значит, что если Вася уже сбил \(x\) банок и сейчас начнет стрелять в \(i\)-ю банку, то, чтобы сбить эту банку, ему понадобится \((a_i \cdot x + 1)\) выстрел. Считайте, что если Вася начал стрелять в банку номер \(i\), то он будет стрелять в нее, пока он ее не собьет. Определите такой порядок стрельбы по банкам, что Вася сделает минимально возможное количество выстрелов, чтобы сбить каждую из \(n\) банок ровно по одному разу. Выходные данные В первую строку выведите минимальное количество выстрелов, которые должен сделать Вася, чтобы сбить каждую из \(n\) банок ровно по одному разу. Во вторую строку выведите последовательность из \(n\) различных целых чисел от \(1\) до \(n\) — номера банок в том порядке, в котором Вася должен по ним стрелять, чтобы минимизировать количество выстрелов. Если подходящих последовательностей несколько, разрешается вывести любую из них. Примечание В первом примере Вася может сначала стрелять в первую банку. Он собьет ее с первого выстрела, так как до этого не сбивал ни одну банку. После этого он должен стрелять в третью банку. Чтобы сбить ее, он потратит \(20 \cdot 1 + 1 = 21\) выстрел. После этого останется только вторая банка. Чтобы сбить ее, Вася сделает \(10 \cdot 2 + 1 = 21\) выстрел. Таким образом, суммарно Вася сделает \(1 + 21 + 21 = 43\) выстрела. Во втором примере не важно, в какой последовательности стрелять по банкам, так как они все имеют одинаковую прочность.
| |
|
|
A. Карточки
реализация
сортировки
Строки
*800
Когда Серёже было три года, ему подарили на день рождения набор карточек с буквами. С их помощью было записано словами любимое число мамы мальчика в двоичной системе счисления. Серёжа тотчас же принялся с ними играть, но так как не умел читать, перемешал их в случайном порядке. Папа решил привести в порядок карточки. Помогите ему восстановить исходное число при условии, что оно было максимально возможным. Выходные данные Выведите максимально возможное число в двоичной системе счисления. Выводите двоичные цифры, разделяя их пробелами. Лидирующие нули допустимы. Примечание В первом примере правильная последовательность букв — это «zero». Во втором примере правильная последовательность букв — это «oneonezero».
| |
|
|
F. Выбери квадрат
Бинарный поиск
сортировки
Структуры данных
*2400
Недавно Петя нашел игру «Выбери квадрат». В игре на бесконечном поле расположено \(n\) точек, пронумерованных целыми числами от \(1\) до \(n\). Точка номер \(i\) имеет координаты \((x_i, y_i)\) и стоимость \(c_i\). Необходимо выбрать квадрат, стороны которого параллельны осям координат, левый нижний и правый верхний угол лежат на прямой \(y = x\), и все углы имеют целые координаты. Счетом игры является разность суммарной стоимости точек, покрытых выбранным квадратом, и длины стороны квадрата. Сторона квадрата может быть нулевой длины. Петя просит вас помочь ему найти максимальный счет в игре, выбрав ровно один квадрат. Выходные данные В первой строке выведите максимальный счет, который можно набрать в игре, выбрав ровно один квадрат. Во второй строке выведите четыре целых числа \(x_1, y_1, x_2, y_2\) (\(0 \le x_1, y_1, x_2, y_2 \le 2 \cdot 10^9, x_1 = y_1, x_2 = y_2, x_1 \le x_2\)), разделенные пробелами — координаты левого нижнего и правого верхнего углов квадрата, которые необходимо выбрать Пете, чтобы набрать максимальный счет. Примечание Игровое поле, соответствующее первому тестовому примеру: 
| |
|
|
E. Раскрась дерево
Деревья
дп
сортировки
*2100
Вам задано взвешенное дерево, состоящее из \(n\) вершин. Напомним, что деревом называется связный граф без циклов. Вершины \(u_i\) и \(v_i\) соединены ребром веса \(w_i\). Определим \(k\)-раскраску дерева как присвоение каждой вершине ровно \(k\) цветов, таким образом, что каждый цвет используется не более двух раз. Считайте, что различных доступных цветов бесконечно много. Назовем ребро насыщенным в \(k\)-раскраске, если его концы имеют хотя бы один общий цвет (т.е. найдется цвет, который присвоен обоим концам ребра). Так же определим счет \(k\)-раскраски как сумму весов насыщенных ребер. Вам необходимо найти максимально возможный счет \(k\)-раскраски заданного дерева. Вам нужно ответить на \(q\) независимых запросов. Выходные данные На каждый запрос выведите одно целое число — максимально возможный счет \(k\)-раскраски заданного дерева. Примечание Дерево, соответствующее первому запросу в тестовом примере: 
Одна из возможных \(k\)-раскрасок в первом запросе: \((1), (1), (2), (2)\), тогда ребра номер \(1\) и \(3\) являются насыщенными и сумма их весов равна \(8\). Дерево, соответствующее второму запросу в тестовом примере: 
Одна из возможных \(k\)-раскрасок во втором запросе: \((1, 2), (1, 3), (2, 4), (5, 6), (7, 8), (3, 4), (5, 6)\), тогда ребра номер \(1\), \(2\), \(5\) и \(6\) являются насыщенными и сумма их весов равна \(14\).
| |
|
|
B. Сбалансированный тоннель
сортировки
Структуры данных
*1300
Рассмотрим тоннель на односторонней дороге. В течение некоторого дня \(n\) машин, пронумерованных от \(1\) до \(n\), въехали в тоннель и выехали из него ровно по одному разу. Все машины ехали через тоннель с постоянными скоростями. На въезде в тоннель установлена камера безопасности дорожного движения. Ещё одна такая же камера установлена на выезде из тоннеля. Идеальный баланс. Благодаря камерам известно, в каком порядке машины въезжали в тоннель и выезжали из него. Никакие две машины не въезжали и не выезжали одновременно. Правила дорожного движения запрещают обгоны внутри тоннеля. Если машина \(i\) обгоняет машину \(j\) внутри тоннеля, машина \(i\) должна быть оштрафована. Тем не менее, каждая машина может быть оштрафована не более одного раза. Если говорить формально, то пусть машина \(i\) точно обогнала машину \(j\), если машина \(i\) въехала в тоннель позже машины \(j\), а выехала из тоннеля раньше машины \(j\). Тогда машина \(i\) должна быть оштрафована тогда и только тогда, когда она точно обогнала хотя бы одну другую машину. Определите, сколько машин следует оштрафовать. Выходные данные Выведите число машин, которые должны быть оштрафованы. Примечание Первый пример изображён ниже: 
Машина \(2\) точно обогнала машину \(5\), а машина \(4\) точно обогнала машины \(1\), \(2\), \(3\) и \(5\). Машины \(2\) и \(4\) должны быть оштрафованы. Во втором примере машину \(5\) точно обогнали все другие машины. В третьем примере никого штрафовать не нужно.
| |
|
|
C2. Сбалансированные удаления (посложнее)
Бинарный поиск
жадные алгоритмы
Конструктив
разделяй и властвуй
реализация
сортировки
*1900
Это усложнённая версия задачи. В этой версии \(n \le 50\,000\). В трёхмерном пространстве заданы \(n\) различных точек, пронумерованных от \(1\) до \(n\). \(i\)-я точка имеет координаты \((x_i, y_i, z_i)\). Число точек \(n\) — чётное. Вы хотели бы удалить все \(n\) точек, используя последовательность из \(\frac{n}{2}\) щелчков. За один щелчок вы можете удалить любые две ещё не удалённые точки \(a\) и \(b\), которые образуют идеально сбалансированную пару. Пара точек \(a\) и \(b\) идеально сбалансирована, если никакая другая точка \(c\) (которая ещё не удалена) не лежит в пределах минимального ограничивающего точки \(a\) и \(b\) прямоугольного параллелепипеда с рёбрами, параллельными осям координат. Формально, точка \(c\) лежит внутри ограничивающего параллелепипеда точек \(a\) и \(b\) тогда и только тогда, когда \(\min(x_a, x_b) \le x_c \le \max(x_a, x_b)\), \(\min(y_a, y_b) \le y_c \le \max(y_a, y_b)\) и \(\min(z_a, z_b) \le z_c \le \max(z_a, z_b)\). Обратите внимание, что параллелепипед может быть вырожденным. Найдите способ удалить все точки за \(\frac{n}{2}\) щелчков. Выходные данные Выведите \(\frac{n}{2}\) пар целых чисел \(a_i, b_i\) (\(1 \le a_i, b_i \le n\)) — номера точек, удаляемых щелчком \(i\). Каждое целое число от \(1\) до \(n\) должно встретиться в выводе ровно один раз. Можно показать, что всегда возможно удалить все точки. Если есть несколько решений, выведите любое. Примечание В первом примере точки и их соответствующие параллелепипеды выглядят так (изображённые для простоты в двумерном пространстве, так как все точки лежат на плоскости \(z = 0\)). Обратите внимание, что порядок удаления точек важен: например, точки \(5\) и \(1\) не образуют идеально сбалансированную пару изначально, но начинают её образовывать после того, как удалена точка \(3\).
| |
|
|
B. Убей их всех
жадные алгоритмы
сортировки
*1300
Иван играет в старый шутер под названием «Heretic». Он застрял на одном из последних уровней этой игры, поэтому ему нужна помощь в убийстве монстров. Основная часть уровня представляет собой большой коридор (настолько большой и узкий, что его можно представить в виде бесконечной координатной прямой). Коридор разделен на две части; давайте считать, что точка \(x = 0\) разделяет эти части. Правая часть коридора заполнена \(n\) монстрами. Для каждого монстра задана его начальная координата \(x_i\) (поскольку все монстры находятся в правой части, все \(x_i\) положительны). Левая часть коридора заполнена ловушками-давилками. Если какой-то монстр попадает в левую часть коридора или в начало координат (то есть его текущая координата становится меньше или равна \(0\)), он мгновенно убивается ловушкой. Основным оружием, которое Иван использует для убийства монстров, является Жезл Феникса. Он может запустить снаряд, который взрывается при ударе, уничтожая каждого монстра, оказавшегося в точке взрыва, и разбрасывая всех остальных монстров. Предположим, что Иван запускает снаряд в точку \(c\). Тогда каждый монстр либо погибает от взрыва, либо отбрасывается. Пусть текущая координата какого-то монстра будет \(y\), тогда: - если \(c = y\), то монстр убит;
- если \(y < c\), то монстр отбрасывается на \(r\) влево, поэтому его текущая координата становится \(y - r\);
- если \(y > c\), то монстр отбрасывается на \(r\) вправо, поэтому его текущая координата становится \(y + r\).
Иван собирается убивать монстров следующим образом: выбирать некоторую целочисленную точку \(d\), запускать снаряд в эту точку, затем ждать, пока снаряд не взорвется, и все монстры, которых отбрасывает в левую часть коридора, не будут убиты ловушками-давилками, затем, если хотя бы один монстр еще жив, выбирать другую целую точку (возможно, ту, которая уже использовалась) и запускать снаряд туда, и так далее. Какое минимальное количество снарядов должен запустить Иван, чтобы убить всех монстров? Можете считать, что Иван оптимально выбирает цель, когда стреляет из Жезла Феникса. Вам нужно ответить на \(q\) независимых запросов. Выходные данные На каждый запрос выведите одно целое число — минимальное количество выстрелов из Жезла Феникса, чтобы убить всех монстров. Примечание В первом тестовом примере Иван действует следующим образом: - стреляет в точку \(3\), первый монстр умирает от ловушки-давилки в точке \(-1\), второй монстр умирает от взрыва, третьего монстра отбрасывает в точку \(7\);
- стреляет в точку \(7\), третий монстр умирает от взрыва.
Во втором тестовом примере Иван действует следующим образом: - стреляет в точку \(5\), первый и четвертый монстры умирают от взрыва, второго монстра отбрасывает в точку \(1\), третьего монстра отбрасывает в точку \(2\);
- стреляет в точку \(2\), первый монстр умирает от ловушки-давилки в точке \(0\), второй монстр умирает от взрыва.
| |
|
|
G. Адилбек и система полива
жадные алгоритмы
сортировки
Структуры данных
*2700
Адилбеку нужно полить свой сад. Он собирается сделать это с помощью сложной системы полива: ему нужно только доставить воду, а механизмы выполнят всю оставшуюся работу. Система полива потребляет один литр воды в минуту (если воды нет, она не работает). Она может вместить не более \(c\) литров воды. Адилбек уже налил в систему \(c_0\) литров воды. Он собирается начать поливать сад прямо сейчас и поливать его в течение \(m\) минут, а система полива должна содержать не менее одного литра воды в начале \(i\)-й минуты (для каждого \(i\) от \(0\) до \(m - 1\)). Адилбеку интересно, что он будет делать, если в системе полива кончится вода. Он позвонил \(n\) своим друзьям и спросил их, могут ли они принести воды. \(i\)-й друг ответил, что он может принести не более \(a_i\) литров воды; он придет в начале \(t_i\)-й минуты и выльет всю воду, которая у него есть, в систему (если система не может вместить такое количество воды, избыток воды выливается); а затем он попросит Адилбека заплатить \(b_i\) долларов за каждый литр воды, который он принес. Можете считать, что если друг прибывает в начале \(t_i\)-й минуты, а в начале той же минуты в системе заканчивается вода, друг наливает воду достаточно быстро, чтобы система не перестала работать. Конечно, Адилбек не хочет платить своим друзьям, но ему нужно поливать сад. Поэтому он должен сказать своим друзьям, сколько воды они должны принести. Формально Адилбек хочет выбрать \(n\) целых чисел \(k_1\), \(k_2\), ..., \(k_n\) таким образом, чтобы: - если друг \(i\) приносит ровно \(k_i\) литров воды, то система полива работает в течение всего времени, необходимого для полива сада;
- сумма \(\sum\limits_{i = 1}^{n} k_i b_i\) минимально возможна.
Помогите Адилбеку определить минимальную сумму, которую он должен заплатить своим друзьям, или определите, что Адилбеку не удастся поливать сад в течение \(m\) минут. Вам нужно ответить на \(q\) независимых запросов. Выходные данные На каждый запрос выведите одно целое число — минимальную сумму, которую Адилбек должен заплатить своим друзьям, или \(-1\), если Адилбеку не удастся поливать сад в течение \(m\) минут.
| |
|
|
B. 0-1 MST
графы
поиск в глубину и подобное
снм
сортировки
*1900
Уджан накопил много ненужного хлама в своих ящиках, значительная часть которого является тетрадями с записями по математике: настало время их разобрать. Сейчас он нашёл старую запылившуюся тетрадь по теории графов с описанием одного графа. Это неориентированный взвешенный граф с \(n\) вершинами. К тому же, это полный граф: каждая пара вершин соединена ребром. Вес каждого ребра равен либо \(0\), либо \(1\); к тому же, ровно \(m\) рёбер имеют вес \(1\), а все остальные рёбра имеют вес \(0\). Так как Уджан не очень сильно желает разбирать свои записи, он решил найти вес минимального остовного дерева данного графа. (Вес остовного дерева графа равняется сумме весов всех его рёбер.) Можете ли вы найти ответ за Уджана, чтобы он прекратил валять дурака? Выходные данные Выведите одно целое число, вес минимального остовного дерева в данном графе. Примечание Граф из первого примера показан на картинке ниже. Пунктирные рёбра имеют вес \(0\), все остальные рёбра имеют вес \(1\). Одно из возможных остовных деревьев покрашено в оранжевый цвет и имеет общий вес \(2\). Во втором примере, вес каждого ребра \(0\), поэтому вес любого остовного дерева равен \(0\).
| |
|
|
E. Минимизация разности
Бинарный поиск
жадные алгоритмы
Конструктив
сортировки
Тернарный поиск
*2000
В данной задаче вам задана последовательность \(a_1, a_2, \dots, a_n\), состоящая из \(n\) целых чисел. Вы можете изменять элементы последовательности. В ходе одной операции изменения, вы можете выбрать произвольную позицию в последовательности и увеличить или уменьшить элемент, находящийся в этой позиции, на единицу. Перед вами стоит задача определить минимально возможную разность между максимальным и минимальным элементами последовательности, которую можно достичь, произведя не более \(k\) описанных операций. Выходные данные Выведите минимально возможную разность между максимальным и минимальным элементами последовательности, которую можно достичь, произведя не более \(k\) операций, описанных в условии. Примечание В первом примере можно дважды увеличить на единицу второе число и дважды уменьшить на единицу третье число. Тогда получим последовательности \([3, 3, 5, 5]\), в которой разность между максимальным и минимальным элементами равна \(2\). При этом останется одна еще операция, но ее можно не использовать, так как не удастся сделать разность между максимальным и минимальным элементами меньше \(2\). Во втором примере можно не использовать ни одной операции, так как все элементы в последовательности одинаковые, а значит разность между максимальным и минимальным элементами равна \(0\).
| |
|
|
B. Выращивание дерева
жадные алгоритмы
математика
сортировки
*900
Садовод Лёша преподаёт школьникам олимпиадную информатику. На день учителя ребята подарили ему набор деревянных палочек, каждая из которых представляет собой отрезок целочисленной длины. Теперь Лёша хочет вырастить из них дерево. Дерево представляет собой ломаную на плоскости, состоящую из всех подаренных ему палочек. Ломаная начинается в точке \((0, 0)\). Строя ломаную, Лёша может присоединять палочки в любом порядке, располагая каждую горизонтально или вертикально (то есть параллельно оси \(OX\) или \(OY\)). При этом не разрешается, чтобы две подряд идущие палочки лежали одновременно горизонтально или вертикально. Смотрите картинки ниже для уточнения деталей. Лёша хочет сделать так, чтобы конец ломаной был как можно дальше от точки \((0, 0)\). Помогите ему вырастить дерево таким образом! Заметим, что ломаная, в форме которой Леша вырастит дерево, может иметь самопересечения и самокасания, однако можно доказать, что оптимальный ответ не содержит ни самопересечений, ни самокасаний. Выходные данные Выведите одно целое число — квадрат максимального расстояния от точки \((0, 0)\) до конечной точки дерева. Примечание На следующих изображениях нарисованы оптимальные деревья для примеров из условия. Квадрат расстояния в первом случае равен \(5 \cdot 5 + 1 \cdot 1 = 26\), а во втором \(4 \cdot 4 + 2 \cdot 2 = 20\).
| |
|
|
D2. Слишком много отрезков (сложная версия)
жадные алгоритмы
сортировки
Структуры данных
*1800
Единственное ограничение между простой и сложной версиями — ограничения. Вам задано \(n\) отрезков на координатной оси \(OX\). Отрезки могут пересекаться, вкладываться или даже совпадать. \(i\)-й отрезок равен \([l_i; r_i]\) (\(l_i \le r_i\)) и покрывает все такие целочисленные точки \(j\), что \(l_i \le j \le r_i\). Целочисленная точка называется плохой, если она покрыта строго больше, чем \(k\) отрезками. Ваша задача — удалить минимальное количество отрезков таким образом, чтобы плохих точек не осталось вообще. Выходные данные В первой строке выведите одно целое число \(m\) (\(0 \le m \le n\)) — минимальное количество отрезков, которое надо удалить, чтобы не осталось плохих точек. Во второй строке выведите \(m\) различных целых чисел \(p_1, p_2, \dots, p_m\) (\(1 \le p_i \le n\)) — индексы отрезков, которые вы удаляете, в любом порядке. Если существует несколько возможных ответов, вы можете вывести любой из них.
| |
|
|
D. Изменение зарплат
Бинарный поиск
жадные алгоритмы
сортировки
*1900
Вы являетесь главой большой фирмы. \(n\) человек работают на вас, и \(n\) нечетно (т.е. \(n\) не делится на \(2\)). Вам нужно распределить зарплаты вашим работникам. У вас есть \(s\) долларов для этого, и \(i\)-й работник должен получить зарплату от \(l_i\) до \(r_i\) долларов. Вам нужно так распределить зарплаты, чтобы максимизировать медианную зарплату. Чтобы найти медиану множества нечетного размера, вам нужно отсортировать все числа множества и взять то, которое находится ровно посередине. Например: - медиана множества \([5, 1, 10, 17, 6]\) равна \(6\),
- медиана множества \([1, 2, 1]\) равна \(1\).
Гарантируется, что вам хватит денег для выплаты минимальных зарплат, т.е. \(l_1 + l_2 + \dots + l_n \le s\). Обратите внимание, что вам не обязательно тратить все \(s\) долларов на зарплаты. Вам нужно ответить на \(t\) тестовых наборов. Выходные данные На каждый набор выведите одно число — максимальную медианную зарплату, которую вы можете получить. Примечание В первом наборе вы можете распределить зарплаты следующим образом: \(sal_1 = 12, sal_2 = 2, sal_3 = 11\) (\(sal_i\) равно зарплате \(i\)-го работника). Тогда медианная зарплата будет равна \(11\). Во втором наборе вам нужно платить \(1337\) долларов единственному работнику. В третьем наборе вы можете распределить зарплаты следующим образом: \(sal_1 = 4, sal_2 = 3, sal_3 = 6, sal_4 = 6, sal_5 = 7\). Тогда медианная зарплата будет равна \(6\).
| |
|
|
C. Поедание конфет
дп
жадные алгоритмы
математика
сортировки
*1500
Tsumugi купила \(n\) вкусных конфет в Light Music Club. Они пронумерованы целыми числами от \(1\) до \(n\), у \(i\)-й конфеты концентрация сахара описана целым числом \(a_i\). Yui любит конфеты, но она может есть не более \(m\) конфет каждый день, из соображений здоровья. Дни нумеруются в \(1\)-индексации (пронумерованы \(1, 2, 3, \ldots\)). Съесть конфету \(i\) в \(d\)-й день будет стоить \((d \cdot a_i)\) сахарного штрафа, так как со временем конфеты становятся более сладкими. Каждая конфета может быть съедена не более одного раза. Итоговый сахарный штраф равен сумме сахарных штрафов всех съеденных конфет. Предположим, что Yui выбирает ровно \(k\) конфет, и ест их в любом порядке, в каком захочет. Какой минимальный сахарный штраф она может получить? Так как Yui нерешительная девушка, она просит ответить вас на этот вопрос для всех \(k\) от \(1\) до \(n\). Выходные данные Вы должны вывести \(n\) целых чисел \(x_1, x_2, \ldots, x_n\) в отдельной строке, разделяя пробелами, где \(x_k\) это минимальный сахарный штраф который Yui может получить, съев ровно \(k\) конфет. Примечание Проанилизируем ответ для \(k = 5\) первого примера. Вот один из возможных способов съесть \(5\) конфет, чтобы минимизировать суммарный сахарный штраф: - День \(1\): конфеты \(1\) и \(4\)
- День \(2\): конфеты \(5\) и \(3\)
- День \(3\) : конфета \(6\)
Итоговый штраф равен \(1 \cdot a_1 + 1 \cdot a_4 + 2 \cdot a_5 + 2 \cdot a_3 + 3 \cdot a_6 = 6 + 4 + 8 + 6 + 6 = 30\). Мы можем доказать, что это минимальный возможный сахарный штраф, который Yui может получить если она съест \(5\) конфет, таким образом \(x_5 = 30\).
| |
|
|
D. Гармоничный граф
графы
жадные алгоритмы
Конструктив
поиск в глубину и подобное
снм
сортировки
*1700
Вам дан неориентированный граф из \(n\) вершин и \(m\) ребер. Вершины пронумерованы целыми числами от \(1\) до \(n\). Назовем граф гармоничным если и только если выполняется следующее свойство: - Для каждой такой тройки целых чисел \((l, m, r)\), что \(1 \le l < m < r \le n\), если есть путь из вершины \(l\) в вершину \(r\), тогда существует путь из вершины \(l\) в вершину \(m\).
Иначе говоря, в гармоничном графе, если из вершины \(l\) можно по ребрам дойти до вершины \(r\) (\(l < r\)), тогда также должно быть можно дойти до вершин \((l+1), (l+2), \ldots, (r-1)\). Какое минимальное число ребер надо добавить в граф, чтобы он стал гармоничным? Выходные данные Выведите минимальное количество ребер которое нужно добавить в граф, чтобы он стал гармоничным. Примечание В первом примере граф не гармоничный (например, при \(1 < 6 < 7\), из вершины \(1\) можно достичь вершину \(7\) по пути \(1 \rightarrow 2 \rightarrow 7\), но из вершины \(1\) нельзя достичь вершину \(6\)). Однако добавление ребра \((2, 4)\) достаточно, чтобы сделать его гармоничным. Во втором примере граф уже гармоничный.
| |
|
|
E. Покрытие антеннами
дп
жадные алгоритмы
сортировки
Структуры данных
*2200
Мэр Центрального Города решил модернизировать Центральную Улицу, представленную в этой задаче в виде оси \((Ox)\). На этой улице стоит \(n\) антенн, пронумерованных от \(1\) до \(n\). \(i\)-я антенна стоит в точке \(x_i\) и имеет изначальный радиус \(s_i\): Она покрывает все целые точки в интервале \([x_i - s_i; x_i + s_i]\). Возможно увеличить радиус любой антенны на \(1\), эта операция стоит \(1\) монету. Мы можем выполнять эту операцию сколько угодно раз (несколько раз для одной и той же антенны, если хотим). Чтобы модернизировать улицу, нам необходимо, чтобы все целые точки от \(1\) до \(m\) включительно были покрыты хотя бы одной антенной. Обратите внимание, что разрешается покрывать точки за пределами интервала \([1; m]\), однако, это не требуется. Какое минимальное количество монет требуется, чтобы добиться модернизации? Выходные данные Выведите одно целое число: минимальное количество монет, которое нужно, чтобы все позиции от \(1\) до \(m\) покрывались хотя бы одной антенной. Примечание В первом примере, одна из возможных стратегий это: - Увеличить радиус первой антенны на \(40\), чтобы он стал \(2 + 40 = 42\). Эта антенна будет покрывать интервал \([43 - 42; 43 + 42]\), который равен \([1; 85]\)
- Увеличить радиус второй антенны на \(210\), чтобы он стал \(4 + 210 = 214\). Эта антенна будет покрывать интервал \([300 - 214; 300 + 214]\), который равен \([86; 514]\)
- Увеличить радиус третьей антенны \(31\), чтобы он стал \(10 + 31 = 41\). Эта антенна будет покрывать интервал \([554 - 41; 554 + 41]\), равный \([513; 595]\)
Итоговая стоимость равна \(40 + 210 + 31 = 281\). Можно показать, что это минимальная стоимость, необходимая, чтобы интервал от \(1\) до \(595\) был покрыт хотя бы одной антенной. Обратите внимание, что точки \(513\) и \(514\) в этом решении покрыты двумя антеннами, но это не важно. — Во втором примере, первая антенна исходно покрывает интервал \([0; 2]\), так что нам не нужно ничего делать. Обратите внимание, что единственная позиция, которую вам нужно покрыть это \(1\); позиции \(0\) и \(2\) покрыты, но это не важно.
| |
|
|
E. Очередное разделение на команды
дп
жадные алгоритмы
сортировки
*2000
В вашем университете обучается \(n\) студентов. Умение программировать \(i\)-го студента равно \(a_i\). Как тренер, вы хотите разделить их на команды, чтобы приготовить к предстоящему финалу ICPC. Просто представьте, насколько хорош этот университет, если в нем есть \(2 \cdot 10^5\) студентов, готовых к финалу! Каждая команда должна состоять из хотя бы трех студентов. Каждый студент должен принадлежать ровно одной команде. Разнообразием команды называется разница между максимальным умением программировать какого-то студента, принадлежащего этой команде, и минимальным умением программировать какого-то студента, принадлежащего этой команде (другими словами, если команда состоит из \(k\) студентов с умениями программировать \(a[i_1], a[i_2], \dots, a[i_k]\), то разнообразность этой команды равна \(\max\limits_{j=1}^{k} a[i_j] - \min\limits_{j=1}^{k} a[i_j]\)). Суммарная разнообразность — это сумма разнообразностей по всем собранным команда. Ваша задача — минимизировать суммарную разнообразность разделения студентов и найти оптимальный способ их разделить. Выходные данные В первой строке выведите два целых числа \(res\) и \(k\) — минимально возможную разнообразность разделения и количество команд в вашем разделении соответственно. Во второй строке выведите \(n\) целых чисел \(t_1, t_2, \dots, t_n\) (\(1 \le t_i \le k\)), где \(t_i\) равно номеру команды, к которой принадлежит \(i\)-й студент. Если существует несколько возможных ответов, выведите любой. Заметьте, что нет необходимости минимизировать количество команд. Каждая команда должна состоять хотя бы из трех студентов. Примечание В первом тестовом примере есть только одна команда с умениями \([1, 1, 2, 3, 4]\), таким образом, ответ равен \(3\). Можно показать, что вы не можете достичь ответа лучше. Во втором тестовом примере есть две команды с умениями \([1, 2, 5]\) и \([12, 13, 15]\), таким образом, ответ равен \(4 + 3 = 7\). В третьем тестовом примере есть три команды с умениями \([1, 2, 5]\), \([129, 185, 581, 1041]\) и \([1580, 1909, 8150]\), таким образом, ответ равен \(4 + 912 + 6570 = 7486\).
| |
|
|
F. Приравнивание двух строк
Конструктив
сортировки
Строки
*2000
Задано две строки \(s\) и \(t\), обе длины \(n\) и обе состоят из строчных букв латинского алфавита. За один ход вы можете выбрать любую длину \(len\) от \(1\) до \(n\) и выполнить следующую операцию: - Выбрать любую непрерывную подстроку строки \(s\) длины \(len\) и перевернуть ее;
- в тот же момент выбрать любую непрерывную подстроку строки \(t\) длины \(len\) и также перевернуть ее.
Заметьте, что в течение одного хода вы переворачиваете ровно одну подстроку строки \(s\) и ровно одну подстроку строки \(t\). Также заметьте, что границы подстрок, которые вы переворачиваете в \(s\) и в \(t\), могут быть различны, единственное ограничение — вы должны переворачивать подстроки одинаковых длин. Например, если \(len=3\) и \(n=5\), то вы можете перевернуть \(s[1 \dots 3]\) и \(t[3 \dots 5]\), \(s[2 \dots 4]\) и \(t[2 \dots 4]\), но не \(s[1 \dots 3]\) и \(t[1 \dots 2]\). Ваша задача — сказать, можно ли сделать строки \(s\) и \(t\) одинаковыми после какой-то (возможно, пустой) последовательности ходов. Вам необходимо ответить на \(q\) независимых наборов входных данных. Выходные данные Для каждого набора входных данных выведите ответ на него — «YES» (без кавычек), если возможно сделать строки \(s\) и \(t\) равными после какой-то (возможно, пустой) последовательности ходов и «NO» иначе.
| |
|
|
C. Задоминированный подмассив
жадные алгоритмы
реализация
сортировки
Строки
*1200
Назовем массив \(t\) задоминированным значением \(v\) в следующем случае. Во-первых, массив \(t\) должен состоять хотя бы из \(2\) элементов. Теперь, давайте посчитаем количество вхождений каждого числа \(num\) в \(t\) и назовем данное значение \(occ(num)\). Тогда, \(t\) — задоминирована (числом \(v\)) тогда (и только тогда), когда \(occ(v) > occ(v')\) для любого другого числа \(v'\). Например, массивы \([1, 2, 3, 4, 5, 2]\), \([11, 11]\) и \([3, 2, 3, 2, 3]\) задоминированы (числами \(2\), \(11\) и \(3\) соответственно), но массивы \([3]\), \([1, 2]\) и \([3, 3, 2, 2, 1]\) — нет. Небольшая заметка: так как любой массив может быть задоминирован только одним числом, то мы можем не уточнять данное число и просто говорить, что массив либо задоминирован, либо нет. Вам задан массив \(a_1, a_2, \dots, a_n\). Определите его самый короткий задоминированный подмассив, либо скажите, что таких нет. Подмассив массива \(a\) — это последовательная часть массива \(a\), другими словами массив \(a_i, a_{i + 1}, \dots, a_j\) для некоторых \(1 \le i \le j \le n\). Выходные данные Выведите \(T\) чисел — по одному на набор входных данных. Для каждого набора выведите единственное целое число — длину самого короткого задоминированного подмассива либо \(-1\), если таких подмассивов нет. Примечание В первом наборе входных данных, нет подмассивов длины хотя бы \(2\), а потому ответ равен \(-1\). Во втором наборе, весь массив задоминирован (числом \(1\)) и это единственный задоминированный подмассив. В третьем наборе, подмассив \(a_4, a_5, a_6\) — самый короткий задоминированный подмассив. В четвертом наборе, все подмассивы длины больше, чем один, задоминированы.
| |
|
|
D. Очередная задача на сражение с монстрами
Бинарный поиск
дп
жадные алгоритмы
сортировки
Структуры данных
*1700
Вы играете в компьютерную игру. В этой игре вы являетесь главой партии из \(m\) героев, и вам нужно зачистить подземелье, в котором находится \(n\) монстров. Каждый монстр характеризуется своей силой \(a_i\). Каждый герой характеризуется своей силой \(p_i\) и выносливостью \(s_i\). Герои чистят подземелье день за днем. В начале каждого дня вы выбираете героя (ровно одного), который пойдет в подземелье в этот день. Когда герой заходит в подземелье, он начинает сражаться с первым монстром, не побежденным в прошлые дни (т. е. если уже было побеждено \(k\) монстров, то этот герой будет сражаться с монстром под номером \(k + 1\)). Когда герой сражается с монстром, возможно два варианта: - если сила монстра строго больше силы героя, то герой уходит из подземелья и день заканчивается;
- иначе монстр считается побежденным.
После победы над монстром герой либо продолжает сражаться с монстрами, либо уходит из подземелья. Он уходит, если он в этот день победил количество монстров, равное его выносливости (таким образом, \(i\)-й герой не может победить больше \(s_i\) монстров в течение одного дня), либо если все монстры побеждены — в противном случае герой сражается со следующим монстром. Когда герой покидает пещеру, текущий день заканчивается. Ваша задача — победить всех монстров. Какое минимальное количество дней вам понадобится для этого? Каждый день вы выбираете ровно одного героя; возможно, некоторые герои не будут сражаться вообще, а некоторые будут сражаться несколько раз. Выходные данные На каждый набор входных данных выведите одно число — минимальное количество дней, которое вам нужно потратить для победы над всеми монстрами (или \(-1\), если это невозможно).
| |
|
|
D. Игра с ловушками
Бинарный поиск
дп
жадные алгоритмы
сортировки
*1900
Вы играете в компьютерную игру, в которой руководите \(m\) солдатами. У каждого солдата есть своя ловкость \(a_i\). Уровень, который вы проходите, можно представить как отрезок прямой между точками \(0\) (где вы и ваш отряд изначально) и \(n + 1\) (где находится босс уровня). Уровень заполнен \(k\) ловушками. Каждая ловушка характеризуется тремя числами \(l_i\), \(r_i\) и \(d_i\). \(l_i\) — точка, в которой расположена ловушка, а \(d_i\) — опасность ловушки: когда солдат с ловкостью меньше \(d_i\) наступает на нее (то есть перемещается в точку \(l_i\)), ловушка сразу же убивает его. К счастью, вы можете разряжать ловушки: если вы дойдете до точки \(r_i\), вы можете разрядить ловушку, и она больше не будет представлять угрозу. На вас ловушки не действуют, только на ваших солдат. У вас есть \(t\) секунд на прохождение уровня — то есть на то, чтобы вы смогли доставить некоторых солдат к боссу. Перед началом уровня вы выбираете, каких солдат вы будете вести, а какие останутся вне уровня. После этого вам нужно привести всех выбранных солдат к боссу. Для этого вы можете совершать следующие действия: - если вы находитесь в точке \(x\), вы можете переместиться в \(x + 1\) или в \(x - 1\). Это действие тратит одну секунду;
- если вы находитесь в точке \(x\) и ваш отряд находится в точке \(x\), вы можете переместиться в \(x + 1\) или \(x - 1\) вместе с отрядом за одну секунду. Вы не можете совершать это действие, если оно опасно для солдат (то есть точка, в которую вы перемещаетесь, содержит неразряженную ловушку с величиной \(d_i\) больше ловкости какого-нибудь солдата в отряде). Это действие тратит одну секунду;
- если вы находитесь в точке \(x\) и существует ловушка \(i\) с \(r_i = x\), вы можете разрядить эту ловушку. Это действие не тратит времени.
Обратите внимание, что после каждого действия и ваша координата, и координата вашего отряда — целые числа. Вы должны выбрать максимальное количество солдат, которых вы сможете привести из точки \(0\) в точку \(n + 1\) не более чем за \(t\) секунд. Выходные данные Выведите одно целое число — максимальное количество солдат, которых можно привести к боссу не более чем за \(t\) секунд. Примечание В первом примере можно взять с собой солдат с ловкостью \(3\), \(4\) и \(5\). Пройти уровень можно следующим образом: - пойти в точку \(2\) без отряда;
- разрядить ловушку \(2\);
- пойти в точку \(3\) без отряда;
- разрядить ловушку \(3\);
- пойти в \(0\) без отряда;
- пойти в \(7\) с отрядом.
Весь план можно выполнить за \(13\) секунд.
| |
|
|
I. Intriguing Selection
интерактив
Конструктив
Перебор
реализация
сортировки
*2600
This is an interactive problem. You are the head coach of a chess club. The club has \(2n\) players, each player has some strength which can be represented by a number, and all those numbers are distinct. The strengths of the players are not known to you. You need to select \(n\) players who would represent your club in the upcoming championship. Naturally, you want to select \(n\) players with the highest strengths. You can organize matches between the players to do that. In every match, you pick two players, they play some games, and you learn which one of the two has higher strength. You can wait for the outcome of a match before deciding who will participate in the next one. However, you do not want to know exactly how those \(n\) players compare between themselves, as that would make the championship itself less intriguing. More formally, you must reach a state where there is exactly one way to choose \(n\) players with the highest strengths that is consistent with the outcomes of the matches you organized, but there must be at least two possible orderings of those \(n\) players by strength that are consistent with the outcomes of the matches you organized. Interaction Your program has to process multiple test cases in one run. First, it should read the integer \(t\) (\(t \ge 1\)) — the number of test cases. Then, it should process the test cases one by one. In each test case, your program should start by reading the integer \(n\) (\(3 \le n \le 100\)) — the number of players to select out of \(2n\) players. The sum of squares of the values of \(n\) over all test cases does not exceed \(10\,000\). Then your program can organize matches zero or more times. To organize a match, your program should print a match description formatted as ? \(i\) \(j\) — a question mark followed by two distinct numbers of players participating in the match. The players are numbered from 1 to \(2n\), inclusive. Remember to flush the output after printing the match description. Then your program should read the match outcome — it will be either the greater-than character (>), if the first player in the match description has higher strength, or the less-than character (<), if the second player in the match description has higher strength. Your program can organize at most \(4n^2\) matches. After it is done organizing matches, it should print the exclamation mark (!) and continue to the next test case, or exit gracefully if this was the last test case. Remember to flush the output after printing the exclamation mark. There must be exactly one way to choose \(n\) players with the highest strength that is consistent with the outcomes of the matches you organized, but there must be at least two possible orderings of those \(n\) players by their strength that are consistent with the outcomes of the matches you organized. The judging program picks some distinct numbers as the strengths of all players before your program starts organizing matches and uses them to answer the requests. Note In the example, the players in the first test case are sorted by strength in decreasing order. From the matches in the example output, we can deduce that players 1, 2, and 3 have the highest strength, but we do not know how the player 1 compares to the player 2.
| |
|
|
B. Равенство по модулю
Перебор
сортировки
*1500
Вам дано положительное целое число \(m\) и две последовательности положительных целых чисел: \(a=[a_1, a_2, \ldots, a_n]\) и \(b=[b_1, b_2, \ldots, b_n]\). Обе последовательности имеют одинаковую длину \(n\). Напомним, что перестановкой называется последовательность из \(n\) различных положительных чисел от \(1\) до \(n\). Например, следующие последовательности являются перестановками: \([1]\), \([1,2]\), \([2,1]\), \([6,7,3,4,1,2,5]\). Следующие последовательности перестановками не являются: \([0]\), \([1,1]\), \([2,3]\). Вам нужно найти неотрицательное целое число \(x\), увеличить все элементы \(a_i\) на \(x\), по модулю \(m\) (другими словами, вы заменяете \(a_i\) на \((a_i + x) \bmod m\)), чтобы было возможно переставить элементы последовательности \(a\), чтобы она стала равна \(b\), среди таких нужно найти минимально возможное \(x\). Иначе говоря, вам необходимо найти наименьшее неотрицательное целое число \(x\), для которого возможно найти какую-то перестановку \(p=[p_1, p_2, \ldots, p_n]\), что для всех \(1 \leq i \leq n\), \((a_i + x) \bmod m = b_{p_i}\), где \(y \bmod m\) — остаток при делении \(y\) на \(m\). Например, если \(m=3\), \(a = [0, 0, 2, 1], b = [2, 0, 1, 1]\), вы можете выбрать \(x=1\), и \(a\) будет равна \([1, 1, 0, 2]\), вы можете переставить элементы, чтобы получить \([2, 0, 1, 1]\), что равно последовательности \(b\). Выходные данные Выведите наименьшее неотрицательное целое число \(x\), для которого возможно найти какую-то перестановку \(p_1, p_2, \ldots, p_n\), что \((a_i + x) \bmod m = b_{p_i}\) для всех \(1 \leq i \leq n\).
| |
|
|
D. Странный прибор
интерактив
Конструктив
математика
сортировки
*1900
Это интерактивная задача. Мы загадали массив \(a\) из \(n\) попарно различных чисел (это значит, что нет одинаковых чисел). Вы можете узнавать информацию об этом массиве с помощью нового прибора, который вы заказали на Amazon. Данный прибор может отвечать на запрос следующего вида: в ответ на индексы \(k\) различных элементов массива, он вернет вам позицию и значение \(m\)-го по возрастанию среди них. К сожалению, инструкция к прибору потерялась при доставке. Вы помните \(k\), но не помните \(m\). Ваша задача — найти \(m\) с помощью запросов к данному прибору. Вы можете задать не более \(n\) запросов. Обратите внимание, что массив \(a\), а также число \(m\) зафиксированы перед началом взаимодействия и не зависят от ваших запросов. Иными словами, интерактор не адаптивен. Заметьте, что число запросов минимизировать не нужно, как и угадывать весь массив \(a\). Вам нужно только угадать \(m\). Протокол взаимодействия Вы начинаете взаимодействие, считав \(n\) и \(k\). Чтобы задать вопрос об элементах на позициях \(x_1, x_2, \dots, x_k\), в отдельной строке выведите \(?\) \(x_1\) \(x_2\) \(x_3\) ... \(x_k\) Числа в запросе должны удовлетворять условию \(1 \le x_i \le n\), и все \(x_i\) должны быть различными. Не забудьте сделать операцию 'flush', чтобы получить ответ. В ответ, вы получите два числа \(pos\) и \(a_{pos}\) — позиция в массиве \(a\) \(m\)-го в порядке возрастания элемента среди \(a_{x_1}, a_{x_2}, \dots, a_{x_k}\), и сам элемент на этой позиции. В случае, если ваш запрос не соответствует требованиям, или вы задали более \(n\) запросов, программа выведет \(-1\) и прекратит взаимодействие. Вы получите вердикт Неправильный ответ. Вам нужно завершить работу вашей программы, чтобы не получить другие вердикты. Когда вы определили \(m\), выведите \(!\) \(m\) После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Формат взломов Для взломов используйте следующий формат: Первая строка должна содержать три целых числа \(n, k, m\) (\(1 \le m \le k < n \le 500\)) — длина массива, количество чисел в запросе, и какое в порядке возрастания число возвращает прибор. В следующей строке выведите \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0\le a_i \le 10^9\)) — элементы массива. Они должны быть попарно различными. Примечание В примере, \(n = 4\), \(k = 3\), \(m = 3\), \(a = [2, 0, 1, 9]\).
| |
|
|
D. Порталы
дп
жадные алгоритмы
реализация
сортировки
Структуры данных
*2100
Вы играете в стратегическую компьютерную игру (да, у нас закончились идеи для легенд задач). В этой игре вы управляете огромной армией, и ваша задача — захватить \(n\) замков противника. Рассмотрим игровой процесс более подробно. Изначально у вас в управлении армия из \(k\) воинов. Противник контролирует \(n\) замков; для захвата \(i\)-го замка вам потребуется \(a_i\) воинов (считается, что каждый захват замка проводится без потерь, поэтому размер армии после захвата не меняется). После захвата каждого замка вы увеличиваете свою армию, нанимая воинов в новом замке — в \(i\)-м замке вы сможете нанять \(b_i\) воинов. Помимо захвата замков, в каждом из них можно оставить охрану (только после захвата): если вы оставляете хотя бы одного воина в замке, то этот замок будет считаться охраняемым. У каждого замка есть параметр важности \(c_i\), и успешность вашей стратегии определяется суммарной важностью всех охраняемых замков в конце игры. Оставлять охрану в замке можно двумя способами: - если вы находитесь в замке \(i\), вы можете оставить одного воина для охраны замка \(i\);
- замки связаны \(m\) односторонними порталами. Каждый портал характеризуется двумя номерами соединяемых замков \(u\) и \(v\) (для каждого портала \(u > v\)). Порталами можно пользоваться следующим способом: если вы находитесь в замке \(u\), вы можете отправить одного воина охранять замок \(v\) через портал.
Вы захватываете замки по очереди: сначала первый, потом второй, и так далее. После захвата замка \(i\), пока вы не захватили замок \(i + 1\), вы можете нанять воинов в замке \(i\), оставить охрану в замке \(i\), а также воспользоваться любым количеством порталов, ведущих из замка \(i\) в замки с меньшими номерами. После того, как вы захватите следующий замок, эти действия для замка \(i\) будут уже недоступны. Если в какой-то момент вам не хватает воинов для захвата следующего замка, вы проигрываете. Ваша цель — максимизировать суммарную важность всех охраняемых замков после захвата последнего замка (обратите внимание, что вы можете нанимать воинов в последнем замке после его захвата, оставлять в нем охрану и пользоваться порталами — суммарная важность всех охраняемых замков будет подсчитана после всех ваших действий). Можете ли вы разработать оптимальную стратегию захвата замков и оставления охраны? Выходные данные Если невозможно захватить все замки ни при каких обстоятельствах, выведите одно целое число \(-1\). Иначе выведите одно целое число — максимальную суммарную важность всех охраняемых замков в конце игры. Примечание Лучшая стратегия в первом примере — следующая: - захватить первый замок;
- нанять солдат в первом замке, теперь у вас \(11\) солдат;
- захватить второй замок;
- захватить третий замок;
- нанять солдат в третьем замке, теперь у вас \(13\) солдат;
- захватить четвертый замок;
- оставить одного воина в четвертом замке, теперь у вас \(12\) солдат.
Эта стратегия (и некоторые другие) дает в результате суммарную важность охраняемых замков, равную \(5\). Лучшая стратегия во втором примере — следующая: - захватить первый замок;
- нанять солдат в первом замке, теперь у вас \(11\) солдат;
- захватить второй замок;
- захватить третий замок;
- нанять солдат в третьем замке, теперь у вас \(13\) солдат;
- захватить четвертый замок;
- оставить одного воина в четвертом замке, теперь у вас \(12\) солдат;
- отправить одного воина в первый замок через третий портал, теперь у вас \(11\) солдат.
Эта стратегия (и некоторые другие) дает в результате суммарную важность охраняемых замков, равную \(22\). В третьем примере нельзя захватить последний замок: для этого нужны \(14\) воинов, но вы можете собрать не более \(13\) до захвата последнего замка.
| |
|
|
A. Три друга
жадные алгоритмы
математика
Перебор
сортировки
*900
Три друга хотят встретиться друг с другом. Изначально первый друг находится в позиции \(x = a\), второй друг находится в позиции \(x = b\), а третий находится в позиции \(x = c\) на координатной оси \(Ox\). За одну минуту каждый из друзей независимо от других друзей может изменить позицию \(x\) на \(1\) влево или на \(1\) вправо (то есть присвоить \(x := x - 1\) или \(x := x + 1\)), или даже не менять ее. Введем понятие суммарной попарной дистанции — суммы дистанций между каждой парой друзей. Пусть \(a'\), \(b'\) и \(c'\) — финальные позиции первого, второго и третьего друзей соответственно. Тогда суммарная попарная дистанция равна \(|a' - b'| + |a' - c'| + |b' - c'|\), где \(|x|\) — абсолютная величина (модуль) значения \(x\). Друзья интересуются, какой минимальной суммарной попарной дистанции они смогут достичь, если они будут двигаться оптимально. Каждый из друзей сдвинется не более одного раза. Таким образом, более формально, они хотят знать минимальную суммарную попарную дистанцию, которой они могут достичь спустя одну минуту. Вам необходимо ответить на \(q\) независимых наборов входных данных. Выходные данные Выведите ответ на каждый набор входных данных — минимальную суммарную попарную дистанцию (минимальную сумму дистанций между каждой парой друзей), если друзья изменят их позиции оптимально. Каждый из друзей сдвинется не более одного раза. Таким образом, более формально, вам необходимо найти минимальную суммарную попарную дистанцию, которой они могут достичь спустя одну минуту.
| |
|
|
B1. K по цене одного (простая версия)
дп
жадные алгоритмы
сортировки
*1400
Это простая версия этой задачи. Единственное отличие в ограничении на \(k\) — количество подарков в акции. В этой версии, \(k=2\). Вася пришел в магазин, чтобы купить подарки для своих друзей на Новый год. Оказалось, что ему очень повезло — именно сегодня в магазине проводится акция «\(k\) товаров по цене одного». Помните, что в этой задаче \(k=2\). Благодаря этой акции Вася может купить ровно \(k\) любых подарков, заплатив только за самый дорогой из них. Вася решил воспользоваться этой возможностью и купить как можно больше подарков для своих друзей на деньги, которые у него имеются. Более формально, для каждого подарка определена его цена \(a_i\) — количество монет, которое нужно потратить, чтобы приобрести этот подарок. Изначально, у Васи есть \(p\) монет. Он хочет приобрести максимальное количество подарков. Вася может сколько угодно раз выполнить одну из следующих операций. - Вася может купить один любой подарок с номером \(i\), если у него в настоящий момент достаточно монет (то есть \(p \ge a_i\)). После покупки этого подарка, количество монет у Васи уменьшится на величину \(a_i\), то есть становится \(p := p - a_i\).
- Вася может купить подарок с номером \(i\), а также выбрать еще ровно \(k-1\) подарков, цены которых не превосходят \(a_i\), если у него в настоящий момент достаточно монет (то есть \(p \ge a_i\)). Таким образом он покупает все эти \(k\) подарков, а его количество монет уменьшается на величину \(a_i\), то есть становится \(p := p - a_i\).
Обратите внимание, что каждый подарок можно приобрести не больше одного раза. Например, если в магазине сейчас есть \(n=5\) подарков, имеющих цены \(a_1=2, a_2=4, a_3=3, a_4=5, a_5=7\) соответственно, \(k=2\), а у Васи есть \(6\) монет, то он может купить суммарно \(3\) подарка. Подарок с номером \(1\) Вася купит, не используя акцию, и заплатит \(2\) монеты. Подарки с номерами \(2\) и \(3\) Вася купит используя акцию, и заплатит \(4\) монеты. Можно доказать, что приобрести больше подарков, имея шесть монет, Вася не может. Помогите Васе узнать максимальное количество подарков, которые он может приобрести. Выходные данные Для каждого набора данных в отдельной строке выведите одно целое число \(m\) — максимальное количество подарков, которые может купить Вася.
| |
|
|
B2. K по цене одного (усложнённая версия)
дп
жадные алгоритмы
сортировки
*1600
Это сложная версия этой задачи. Единственное отличие в ограничении на \(k\) —количество подарков в акции. В этой версии \(2 \le k \le n\). Вася пришел в магазин, чтобы купить подарки для своих друзей на Новый год. Оказалось, что ему очень повезло — именно сегодня в магазине проводится акция «\(k\) товаров по цене одного». Благодаря этой акции Вася может купить ровно \(k\) любых подарков, заплатив только за самый дорогой из них. Вася решил воспользоваться этой возможностью и купить как можно больше подарков для своих друзей на деньги, которые у него имеются. Более формально, для каждого подарка определена его цена \(a_i\) — количество монет, которое нужно потратить, чтобы приобрести этот подарок. Изначально, у Васи есть \(p\) монет. Он хочет приобрести максимальное количество подарков. Вася может сколько угодно раз выполнить одну из следующих операций. - Вася может купить один любой подарок с номером \(i\), если у него в настоящий момент достаточно монет (то есть \(p \ge a_i\)). После покупки этого подарка, количество монет у Васи уменьшится на величину \(a_i\), то есть становится \(p := p - a_i\).
- Вася может купить подарок с номером \(i\), а также выбрать еще ровно \(k-1\) подарков, цены которых не превосходят \(a_i\), если у него в настоящий момент достаточно монет (то есть \(p \ge a_i\)). Таким образом он покупает все эти \(k\) подарков, а его количество монет уменьшается на величину \(a_i\), то есть становится \(p := p - a_i\).
Обратите внимание, что каждый подарок можно приобрести не больше одного раза. Например, если в магазине сейчас есть \(n=5\) подарков, имеющих цены \(a_1=2, a_2=4, a_3=3, a_4=5, a_5=7\) соответственно, \(k=2\), а у Васи есть \(6\) монет, то он может купить суммарно \(3\) подарка. Подарок с номером \(1\) Вася купит, не используя акцию, и заплатит \(2\) монеты. Подарки с номерами \(2\) и \(3\) Вася купит используя акцию, и заплатит \(4\) монеты. Можно доказать, что приобрести больше подарков, имея шесть монет, Вася не может. Помогите Васе узнать максимальное количество подарков, которые он может приобрести. Выходные данные Для каждого набора данных в отдельной строке выведите одно целое число \(m\) — максимальное количество подарков, которые может купить Вася.
| |
|
|
C. Петя и экзамен
жадные алгоритмы
сортировки
*1800
Петя пришел на экзамен по математике и хочет решить как можно больше задач. Он подготовился и внимательно изучил правила, по которым проходит экзамен. Экзамен состоит из \(n\) задач, которые можно решать в течении \(T\) минут. Таким образом, экзамен начинается в момент времени \(0\), а заканчивается — в момент времени \(T\). Петя может уйти с экзамена в любой целочисленный момент времени от \(0\) до \(T\), включительно. Все задачи делятся на два типа: - простые задачи — на решение каждой простой задачи у Пети уходит ровно \(a\) минут;
- сложные задачи — на решение каждой сложной задачи у Пети уходит ровно \(b\) минут (\(b > a\)).
Таким образом, если в момент времени \(x\) Петя приступает к решению простой задачи, то она будет решена в момент времени \(x+a\). Аналогично, если в момент времени \(x\) Петя приступает к решению сложной задачи, то она будет решена в момент времени \(x+b\). Про каждую задачу Пете известно сложная она или простая. Помимо этого, для каждой задачи определен момент времени \(t_i\) (\(0 \le t_i \le T\)), в который она станет обязательной. Если Петя уходит с экзамена в момент времени \(s\) и есть такая задача \(i\), что \(t_i \le s\) и он её не решил, то считается, что за весь экзамен он получит \(0\) баллов. В противном случае (то есть, если он решил все такие задачи, для которых \(t_i \le s\)) он получит количество баллов, равное количеству решенных задач. Отметим, что уходя в момент времени \(s\) Петя может иметь решенными как «обязательные», так и «необязательные» задачи. Например, если \(n=2\), \(T=5\), \(a=2\), \(b=3\), первая задача является сложной и для неё \(t_1=3\) и вторая задача является простой и для неё \(t_2=2\), то: - если он уходит в момент времени \(s=0\), то он получит \(0\) баллов, так как не успеет решить ни одной задачи;
- если он уходит в момент времени \(s=1\), то он получит \(0\) баллов, так как не успеет решить ни одной задачи;
- если он уходит в момент времени \(s=2\), то он может получить \(1\) балл, решив задачу с номером \(2\) (решать её надо в промежуток от \(0\) до \(2\));
- если он уходит в момент времени \(s=3\), то он получит \(0\) баллов, так как к этому моменту времени обе задачи станут обязательными к решению, но решить их обе он не успеет;
- если он уходит в момент времени \(s=4\), то он получит \(0\) баллов, так как к этому моменту времени обе задачи станут обязательными к решению, но решить их обе он не успеет;
- если он уходит в момент времени \(s=5\), то он может получить \(2\) балла, решив все задачи.
Таким образом, ответ на этот тест равен \(2\). Помогите Пете определить максимальное количество баллов, которые он успеет набрать перед тем как уйдет с экзамена. Выходные данные Выведите ответы на \(m\) заданных наборов входных данных. Для каждого набора выведите одно целое число — максимальное количество баллов, которые он успеет набрать перед тем как уйдет с экзамена.
| |
|
|
B. Новый год и восходящая последовательность
Бинарный поиск
дп
Комбинаторика
реализация
сортировки
Структуры данных
*1400
Последовательность \(a = [a_1, a_2, \ldots, a_l]\) длиной \(l\) имеет восход, если существует пара таких индексов \((i, j)\), что \(1 \le i < j \le l\) и \(a_i < a_j\). Например, последовательность \([0, 2, 0, 2, 0]\) имеет восход из-за пары индексов \((1, 4)\), но последовательность \([4, 3, 3, 3, 1]\) не имеет восхода. Назовем конкатенацией двух последовательностей \(p\) и \(q\) такую последовательность, которая получится при последовательной записи сначала \(p\), затем \(q\) друг за другом, не меняя порядок элементов в них. Например, конкатенация последовательностей \([0, 2, 0, 2, 0]\) и \([4, 3, 3, 3, 1]\) равна последовательности \([0, 2, 0, 2, 0, 4, 3, 3, 3, 1]\). Конкатенация последовательностей \(p\) и \(q\) обозначается как \(p+q\). Кенгун считает, что последовательность с восходом приносит удачу. Поэтому он хочет сделать много таких последовательностей на новый год. У Кенгун есть \(n\) последовательностей \(s_1, s_2, \ldots, s_n\), которые могут иметь разную длину. Кенгун рассмотрит \(n^2\) всевозможных пар последовательностей \(s_x\) и \(s_y\) (\(1 \le x, y \le n\)) и проверит содержит ли конкатенация \(s_x + s_y\) восход или нет. Обратите внимание, что порядок выбора последовательностей в пару имеет значение. Кроме того, он может выбирать последовательность в пару к самой себе. Пожалуйста, посчитайте количество пар последовательностей (\(x, y\)) для заданного набора \(s_1, s_2, \ldots, s_n\), конкатенация \(s_x + s_y\) которых имеет восход. Выходные данные Выведите одно целое число, количество пар последовательностей, конкатенация которых имеет восход. Примечание В первом примере, следующие \(9\) последовательностей имеют восход: \([1, 2], [1, 2], [1, 3], [1, 3], [1, 4], [1, 4], [2, 3], [2, 4], [3, 4]\). Одинаковые по содержимому последовательности учитываются столько раз, сколько раз они встречаются как результат конкатенации.
| |
|
|
D. Новый год и конференция
Бинарный поиск
сортировки
Структуры данных
хэши
*2100
Наполненный оптимизмом, Хёнука проведет конференцию о том, каким будет этот новый год! На конференции будет \(n\) лекций. У Хёнука есть два возможных места \(a\) и \(b\) для проведения лекций. Для каждой из \(n\) лекций докладчик указал два временных интервала \([sa_i, ea_i]\) (\(sa_i \le ea_i\)) и \([sb_i, eb_i]\) (\(sb_i \le eb_i\)). Если конференция расположена в месте \(a\), лекция будет проходить с \(sa_i\) до \(ea_i\), а если конференция будет проходить в месте \(b\), лекция будет проходить с \(sb_i\) до \(eb_i\). Хёнука выберет одно из этих мест, и все лекции будут проводиться в этом месте. Две лекции пересекаются, если они имеют какой-либо общий момент времени. Формально лекция в интервале \([x, y]\) перекрывается с лекцией в интервале \([u, v]\) тогда и только тогда, когда \(\max(x, u) \le \min(y, v)\). Участник может посетить подмножество лекций \(s\), если лекции в \(s\) попарно не перекрываются (то есть никакие две не являются пересекающимися). Обратите внимание, что возможность участия может зависеть от того, выбрал ли Хёнука место \(a\) или место \(b\) для проведения конференции. Подмножество лекций \(s\) называется чувствительным к месту проведения, если для одного из мест участник может посетить \(s\), а для другого места участник не может посетить \(s\). Чувствительный к месту проведения набор проблематичен для участника, который заинтересован в посещении лекций в множестве \(s\), потому что участник не может быть уверен, будет ли время лекций перекрываться. Хёнука будет счастлив тогда и только тогда, когда не будет наборов, чувствительных к месту. Определите, будет ли Хёнука счастлив. Выходные данные Выведите «YES», если Хёнука будет счастлив. Иначе выведите «NO». Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Примечание Во втором примере подмножество лекций \(\{1, 3\}\) чувствительное к месту, потому что участник не может посетить место \(a\), но может посетить место \(b\). В первом и третьем примерах таких подмножеств не существует.
| |
|
|
E. Новый год и строительство замком
геометрия
Комбинаторика
математика
сортировки
*2500
Любимая видеоигра Кивона теперь проводит новогоднее мероприятие, чтобы мотивировать пользователей! Игра о строительстве и защите замка, поэтому Кивон задумался над следующей загадкой. В двумерной плоскости у вас есть набор \(s = \{(x_1, y_1), (x_2, y_2), \ldots, (x_n, y_n)\}\), состоящий из \(n\) различных точек. В множестве \(s\) нет трех точек на одной прямой. Мы можем защитить точку \(p \in s\), построив замок. Замок — это простой четырехугольник (многоугольник с \(4\) вершинами), который строго покрывает точку \(p\) (то есть точка \(p\) строго внутри четырёхугольника). Кивона интересует количество подмножеств \(s\) из \(4\)-х точек, которые можно использовать для построения замка, защищающего точку \(p\). Обратите внимание, что если одно подмножество может быть соединено более чем одним способом, чтобы покрыть точку, то оно считается только один раз. Пусть \(f(p)\) будет количеством подмножеств из \(4\)-х точек, которые могут покрыть точку \(p\). Пожалуйста, посчитайте сумму \(f(p)\) по всем точкам \(p \in s\). Выходные данные Выведите сумму \(f(p)\) по всем точкам \(p \in s\).
| |
|
|
E. Удали один отрезок
графы
Деревья
дп
Конструктив
Перебор
сортировки
Структуры данных
*2300
На координатной прямой \(Ox\) заданы \(n\) отрезков \([l_1, r_1]\), \([l_2, r_2]\), ..., \([l_n, r_n]\). Отрезок \([l, r]\) покрывает все точки от \(l\) до \(r\) включительно, то есть такие \(x\), что \(l \le x \le r\). Отрезки могут располагаться произвольным образом — вкладываться друг в друга, совпадать и т.п. Отрезки могут вырождаться в точку, то есть допустимо, что \(l_i=r_i\). Объединением набора отрезков называется такой минимальный набор отрезков, который покрывает в точности тот же набор точек, что и заданный набор. Например: - если \(n=3\) и отрезки имеют вид \([3, 6]\), \([100, 100]\), \([5, 8]\), то их объединение состоит из \(2\) отрезков: \([3, 8]\) и \([100, 100]\);
- если \(n=5\) и отрезки имеют вид \([1, 2]\), \([2, 3]\), \([4, 5]\), \([4, 6]\), \([6, 6]\) то их объединение состоит из \(2\) отрезков: \([1, 3]\) и \([4, 6]\).
Очевидно, что объединение — это набор непересекающихся отрезков. Требуется удалить ровно один отрезок из заданных \(n\) таким образом, чтобы количество отрезков в объединении оставшихся \(n-1\) было наибольшим. Например, если \(n=4\) и отрезки имеют вид \([1, 4]\), \([2, 3]\), \([3, 6]\), \([5, 7]\), то: - если из набора удалить первый отрезок, то останутся отрезки \([2, 3]\), \([3, 6]\), \([5, 7]\), объединение которых состоит из \(1\) отрезка;
- если из набора удалить второй отрезок, то останутся отрезки \([1, 4]\), \([3, 6]\), \([5, 7]\), объединение которых состоит из \(1\) отрезка;
- если из набора удалить третий отрезок, то останутся отрезки \([1, 4]\), \([2, 3]\), \([5, 7]\), объединение которых состоит из \(2\) отрезков;
- если из набора удалить четвертый отрезок, то останутся отрезки \([1, 4]\), \([2, 3]\), \([3, 6]\), объединение которых состоит из \(1\) отрезка.
Таким образом, в примере выше надо обязательно удалять третий отрезок, чтобы получить ответ \(2\). Напишите программу, которая найдет наибольшее количество отрезков, которые получатся в объединении \(n-1\) оставшегося, если можно удалить любой из заданных \(n\) отрезков. Обратите внимание, что если в заданном наборе есть несколько одинаковых отрезков, то удалить вы всё-равно можете ровно один из них. То есть набор отрезков после удаления одного будет содержать ровно \(n-1\) отрезок. Выходные данные Выведите \(t\) чисел — ответы на заданные \(t\) наборов входных данных в порядке их следования в тесте. Ответ равен максимальному количеству отрезков в объединении \(n-1\) отрезка из \(n\) заданных, если допускается удалить один любой отрезок.
| |
|
|
A. Гирлянда
дп
жадные алгоритмы
сортировки
*1800
Вадим очень любит наряжать новогоднюю ёлку, поэтому ему подарили невероятно красивую гирлянду. Она состоит из \(n\) лампочек, расположенных в ряд. На каждой лампочке написано число от \(1\) до \(n\), причем все числа различны и шли в произвольном порядке. Пока Вадим решал задачи, его домашний Карась снял с гирлянды некоторые лампочки. Теперь Вадим хочет вернуть их на место.  Вадим хочет повесить все лампочки обратно на гирлянду. Он считает сложностью гирлянды количество пар соседних лампочек, на которых написаны числа разной четности (то есть имеющие разные остатки при делении на \(2\)). Например, сложность гирлянды 1 4 2 3 5 равна \(2\), а сложность гирлянды 1 3 5 7 6 4 2, равна \(1\). Никто не любит сложности, поэтому Вадим хочет минимизировать количество таких пар. Найдите способ повесить снятые лампочки на гирлянду, чтобы минимизировать ее сложность. Выходные данные Выведите единственное число — минимальную сложность гирлянды. Примечание В первом примере надо расставить лампочки как 1 5 4 2 3. В этом случае сложность будет равна 2, так как рядом расположены пары лампочек \((5, 4)\) и \((2, 3)\). Во втором примере один из правильных ответов 1 7 3 5 6 4 2.
| |
|
|
B. Сбор посылок
реализация
сортировки
*1200
На складе есть робот и \(n\) посылок, которые он хочет собрать. Склад можно представить в виде координатной сетки. Изначально робот находится в точке \((0, 0)\). \(i\)-я посылка находится в точке \((x_i, y_i)\). Гарантируется, что в одной точке не могут находиться две посылки. Также гарантируется, что в точке \((0, 0)\) посылки нет. Робот наполовину сломан и может передвигаться только вверх ('U') и вправо ('R'). Другими словами, за один шаг робот может переместиться из точки \((x, y)\) в точку (\(x + 1, y\)) или в точку \((x, y + 1)\). Как сказано выше, робот хочет собрать все \(n\) посылок (в любом порядке). Он хочет сделать это за минимально возможное число шагов. Если существует несколько подходящих последовательностей шагов, робот хочет выбрать лексикографически минимальный путь. Строка \(s\) длины \(n\) лексикографически меньше, чем строка \(t\) длины \(n\) если существует такой индекс \(1 \le j \le n\), что для всех \(i\) от \(1\) до \(j-1\) \(s_i = t_i\) и \(s_j < t_j\). Это обычное сравнение строк, например, в словаре строки расположены в лексикографическом порядке. Большинство языков программирования сравнивают строки именно так. Выходные данные Для каждого набора входных данных выведите ответ. Если невозможно собрать все \(n\) посылок в каком-либо порядке, стартуя из точки (\(0,0\)), выведите «NO» первой строкой. Иначе выведите «YES» первой строкой. Затем выведите кратчайший путь (строку), состоящий из символов 'R' и 'U'. Среди всех таких путей нужно выбрать лексикографически минимальный. Заметьте, что в этой задаче «YES» и «NO» могут быть выведены только в верхнем регистре, то есть «Yes», «no» и «YeS» не принимаются. Примечание Для первого набора данных из указанного примера оптимальный путь RUUURRRRUU выглядит следующим образом:
| |
|
|
D. Сражение с монстрами
жадные алгоритмы
сортировки
*1500
В линию выстроены \(n\) монстров, пронумерованных числами с \(1\) по \(n\). У \(i\)-го монстра есть \(h_i\) очков здоровья (hp). Вы можете атаковать с силой, равной \(a\) hp, а ваш соперник может атаковать с силой, равной \(b\) hp. Вы и ваш соперник сражаетесь с этими монстрами. Сначала вы и ваш соперник идете к первому монстру и сражаетесь с ним до тех пор, пока он не будет мертв, затем вы и ваш соперник отправляетесь ко второму монстру и сражаетесь с ним до тех пор, пока и он не будет мертв, и так далее. Смерть монстра наступает, когда значение его hp становится меньшим или равным \(0\). Сражение с монстром происходит поочередно. - Вы атакуете монстра с силой \(a\) hp. Если он погибает после вашего удара, вы получаете одно очко и затем вы и соперник переходите к следующему монстру.
- Ваш соперник атакует монстра с силой \(b\) hp. Если монстр погибает после этой атаки, никто не получает очко и вы с соперником переходите к следующему монстру.
У вас есть некоторая секретная техника, с помощью которой можно заставить вашего соперника пропустить свой ход. Вы можете использовать эту технику не более, чем \(k\) раз всего (например, если есть два монстра и \(k=4\), то вы можете использовать эту технику \(2\) раза во время сражения с первым монстром и \(1\) один раз — со вторым, но не \(2\) раза с первым монстром и \(3\) раза со вторым). Ваша задача — определить максимальное число очков, которое вы можете получить, если будете использовать секретную технику оптимально. Выходные данные Выведите одно целое число — максимальное число очков, которое вы можете получить, если будете использовать секретную технику оптимально.
| |
|
|
E1. Покраска строки (простая версия)
графы
дп
жадные алгоритмы
Конструктив
сортировки
*1800
Это простая версия задачи. Задачи отличаются друг от друга, но простая версия почти является подзадачей сложной версии. Обратите внимание на то, что ограничения и формат вывода различаются. Дана строка \(s\), состоящая из \(n\) строчных латинских букв. Вам нужно раскрасить все её символы в один из двух цветов (каждый символ покрашен ровно в один цвет, одинаковые буквы могут быть покрашены как одним цветом, так и разными, т.е. вам нужно выбрать ровно один цвет для каждого индекса в \(s\)). После покраски вы можете поменять местами два любых соседних символа строки, которые раскрашены в разные цвета. Вы можете применить эту операцию произвольное (возможно, нулевое) количество раз. Цель — сделать строку отсортированной, т.е. все символы должны быть расположены в алфавитном порядке. Ваша задача — определить, возможно ли покрасить заданную строку так, что после покраски она может быть отсортирована с помощью какой-либо последовательности шагов. Обратите внимание: вам нужно восстановить только раскраску, но не последовательность шагов. Выходные данные Если невозможно раскрасить заданную строку так, что после покраски она может быть отсортирована после какой-либо последовательности шагов, выведите «NO» (без кавычек) первой строкой. В противном случае выведите «YES» первой строкой и любую корректную раскраску второй строкой (раскраской считается строка, состоящая из \(n\) символов, где \(i\)-й символ должен быть '0', если \(i\)-й символ покрашен в первый цвет и '1' иначе).
| |
|
|
F. Красоты Берляндии
Деревья
жадные алгоритмы
Конструктив
поиск в глубину и подобное
сортировки
*2100
В Берляндии есть \(n\) железнодорожных станций, которые соединены \(n-1\) участками железной дороги, по которым может ходить поезд в любом из двух направлений. Железнодорожная сеть связна, то есть представляет собой неориентированное дерево. У вас есть карта этой сети, таким образом для каждого участка железной дороги известно, какие станции он соединяет. У каждого из \(n-1\) участков есть целочисленный параметр красота пейзажа за окном, однако эти значения на карте не указаны и вам неизвестны. Все эти значения лежат в границах от \(1\) до \(10^6\), включительно. Вы произвели опрос \(m\) пассажиров: \(j\)-й пассажир сообщил три значения: - станция отправления \(a_j\);
- станция прибытия \(b_j\);
- минимальную из красот пейзажа за окном на пути следования из \(a_j\) в \(b_j\) (поезд ехал кратчайшим путём из \(a_j\) в \(b_j\)).
Вы хотите улучшить карту и на каждом участке железной дороги указать величину \(f_i\) — красота пейзажа за окном. Эти значения должны быть согласованы с опросом пассажиров. Выведите любой возможный набор значений \(f_1, f_2, \dots, f_{n-1}\), которые согласуется с опросами или укажите, что такой не существует. Выходные данные Если ответа не существует, то выведите единственное число -1. В противном случае выведите \(n-1\) целое число \(f_1, f_2, \dots, f_{n-1}\) (\(1 \le f_i \le 10^6\)), где \(f_i\) — возможная красота пейзажа за окном для \(i\)-й дороги. Если существует несколько возможных ответов, вы можете вывести любой из них.
| |
|
|
B. Мультфильмы
*особая задача
реализация
сортировки
Таня любит мультфильмы. В прокате ожидаются \(n\) мультфильмов, и \(i\)-й из них будет показываться в ее любимом кинотеатре со дня \(a_i\) по день \(b_i\) (\(1 \le a_i \le b_i \le 10^9\)). В кинотеатре действует особая акция: в любой день, в который в прокате идёт ровно один мультфильм, кинотеатр даёт существенную скидку на сеанс. Тане не важно, какой мультфильм посмотреть, но она хочет сэкономить, поэтому просит Вас найти любой такой день \(x\), что в этот день в прокате идёт ровно один мультфильм. Формально: для выбранного \(x\) должно быть верно, что существует ровно одно такое \(i\) (\(1 \le i \le n\)), что \(a_i \le x \le b_i\). Если ответов несколько, то выведите любой. Если такого дня не существует, то выведите -1. Выходные данные Для каждого из \(t\) наборов входных данных в порядке их записи в тесте выведите ответ. В качестве ответа на \(i\)-й набор выведите любое такое \(x\), что в день \(x\) в прокате идёт ровно один мультфильм. Если таких дней не существует, то выведите -1. Примечание Третий набор входных данных: в дни \(1\) и \(2\), первый и третий мультфильмы будут в прокате, а в дни \(3\) и \(4\) — второй и третий. Таким образом, нет такого дня, когда только один мультфильм будет в прокате. В четвертом тесте \(11\) также является возможным ответом.
| |
|
|
D. Распределение премий
*особая задача
Бинарный поиск
жадные алгоритмы
сортировки
Впервые стартап Поликарпа закончил год с прибылью! Теперь он собирается распределить \(k\) бурлей премии среди \(n\) сотрудников. Известно, что текущая заработная плата \(i\)-го сотрудника составляет \(a_i\), все значения \(a_i\) в компании — различны. Поликарп хочет распределить \(k\) бурлей суммарной премии между \(n\) сотрудниками и в этом месяце \(i\)-му из них выплатить не \(a_i\), а \(a_i+d_i\) (\(d_i \ge 0\), \(d_i\) — целое), где \(d_i\) — премиальная часть для \(i\)-го сотрудника. Конечно, \(d_1+d_2+\dots+d_n=k\). Поликарп руководствуется двумя принципами для выбора значений \(d_i\): - то, как соотносятся зарплаты между собой, не должно измениться: тот кто получал больше всех (\(a_i\) максимально), и при выплате с премией должен получать больше всех (\(a_i+d_i\) тоже максимально), тот, у кого зарплата была второй по величине, и при выплате с премией должен получать вторую по величине зарплату, и так далее;
- чтобы подчеркнуть, что годовая прибыль — общий результат, Поликарп хочет минимизировать максимальную выплату (то есть минимизировать максимальное значение \(a_i+d_i\)).
Помогите Поликарпу найти такие неотрицательные целые премии \(d_i\), что: - их сумма равна \(k\);
- для каждого сотрудника количество тех, кто получает больше него, осталось неизменным (то есть, если отсортировать сотрудников по \(a_i\) и по \(a_i+d_i\), то получится одинаковый порядок сотрудников);
- все \(a_i + d_i\) различны;
- максимальное из значений \(a_i+d_i\) — минимально.
Помогите Поликарпу и выведите любой возможных из вариантов \(d_1, d_2, \dots, d_n\). Выходные данные Выведите ответы на \(t\) заданных наборов входных данных в порядке их записи в тесте. Ответ выводите в виде последовательности неотрицательных целых чисел \(d_1, d_2, \dots, d_n\). Если ответов несколько, то выведите любой из них.
| |
|
|
F. Фанат кино
*особая задача
жадные алгоритмы
реализация
сортировки
Структуры данных
Последнее время Поликарп фанатеет от новинок кинематографа и старается их не пропускать! В ближайшее время выйдут \(n\) новых фильмов: \(i\)-й из них поступит в прокат в день \(a_i\) и закончит прокат в день \(b_i\). Это значит, что если Поликарп хочет посмотреть \(i\)-й фильм в кинотеатре, то должен это сделать в отрезок дней с \(a_i\) по \(b_i\) включительно. Возможно, у Поликарпа не будет возможности посмотреть фильм в кинотеатре, тогда он может сделать это и после дня \(b_i\), посмотрев его с помощью одного из онлайн-сервисов. Конечно, это нежелательный исход для Поликарпа, ведь весь мир уже успеет обсудить этот фильм в социальных сетях! В день Поликарп может посмотреть не более \(m\) фильмов. Помогите Поликарпу найти такое расписание просмотра фильмов, что каждый фильм будет просмотрен в кинотеатре. Если такое расписание не существует, то Поликарп хочет смотреть фильмы так, чтобы - для каждого фильма, который он не успеет посмотреть в кинотеатре найдём количество дней между окончанием его проката и днём, когда Поликарп сможет посмотрит фильм;
- максимальная из величин предыдущего пункта должна быть как можно меньше.
Выходные данные Выведите \(t\) ответов на заданные наборы входных данных в порядке их записи в тесте: \(i\)-й ответ должен состоять из двух строк. В первую строку ответа выведите целое число \(d\): - \(d=0\), если существует расписание, что все фильмы просмотрены во время проката;
- \(d>0\), если такого расписания не существует — в этом случае \(d\) равно минимальному значению максимума среди всех «опозданий» просмотров после проката.
Во вторую строку ответа выведите \(n\) положительных целых чисел \(t_1, t_2, \dots, t_n\), где \(t_i\) — номер дня, когда надо посмотреть \(i\)-й фильм, в оптимальном расписании. Если ответов несколько, то выведите любой из них.
| |
|
|
C. Последовательность
дп
сортировки
*2200
Маленький Петя очень любит играть. Больше всего он любит играть в такую игру: В начале выписывается последовательность из N чисел. Далее за один ход разрешается к любому числу прибавить 1 или отнять 1. Цель игры - за наименьшее количество ходов получить неубывающую последовательность. У Пети плохо с математикой, поэтому он попросил Вас ему помочь. Последовательность a называется неубывающей, если выполняется a1 ≤ a2 ≤ ... ≤ aN, где N — длина последовательности. Выходные данные На выходе должно быть одно число — искомое наименьшее количество ходов, требуемое для преобразования начальной последовательности в неубывающую.
| |
|
|
I. Сортировка массива
*особая задача
сортировки
*2300
Сортировка массивов чисел традиционно считается прерогативой языков высокого уровня. Но так ли это сложно на самом деле? Отсортируйте заданный массив в порядке неубывания элементов. Выходные данные Выведите элементы отсортированного массива, разделенные пробелами.
| |
|
|
B. Разделение на классы
жадные алгоритмы
реализация
сортировки
*1000
Напомним, что медиана массива \([a_1, a_2, \dots, a_{2k+1}]\) из нечетного количества элементов определяется следующим образом: пусть \([b_1, b_2, \dots, b_{2k+1}]\) — числа массива в отсортированном порядке. Тогда медиана этого массива равна \(b_{k+1}\). В классе \(2n\) учеников, уровень навыков \(i\)-го ученика равен \(a_i\). Не гарантируется, что все уровни навыков учеников различны. Уровень навыков класса будем считать равным медиане уровней навыков учеников класса. Как директор школы, вы хотели бы разделить всех учеников на \(2\) класса так, чтобы в каждом классе было нечетное количество учеников (не делящееся на \(2\)). Количества учеников в классах могут быть равными или различными, на ваш выбор. Каждый ученик должен попасть ровно в один класс. Среди таких разделений вы хотите выбрать то, в котором модуль разности между уровнями навыков классов минимален. Какой минимальный модуль разности вы можете получить? Выходные данные Для каждого набора входных данных выведите минимальный возможный модуль разности между уровнями навыков двух классов нечетных размеров. Примечание В первом наборе входных данных примера есть лишь один способ разделить учеников — по одному в классе. Модуль разности уровней навыков будет равен \(|1 - 1| = 0\). Во втором наборе входных данных примера одним из возможных разделений является такое: сделать первый класс из учеников с уровнями навыков \([6, 4, 2]\), тогда уровень навыков этого класса будет равна \(4\), и второй с \([5, 1, 3]\), тогда уровень навыков этого класса будет равна \(3\). Модуль разности будет равен \(|4 - 3| = 1\). Заметим, что вы не можете разделить классы так: \([2, 3]\), \([6, 5, 4, 1]\) или \([]\), \([6, 5, 4, 1, 2, 3]\), потому что так классы содержат чётное число учеников. \([2]\), \([1, 3, 4]\) тоже невозможно, так как студенты с навыками \(5\) и \(6\) не попадут ни в один класс. В третьем наборе входных данных примера вы можете разделить следующим образом: \([3, 4, 13, 13, 20], [2, 5, 8, 16, 17]\) или \([3, 8, 17], [2, 4, 5, 13, 13, 16, 20]\). Оба разделения дают минимальный возможный модуль разности.
| |
|
|
C. Кондиционер
дп
жадные алгоритмы
реализация
сортировки
*1500
Гильдонг — владелец ресторана Пулькоги. Ресторан пользуется большим спросом, и часто посетители хотят забронировать столик до посещения. Гильдонг так старается угодить всем посетителям, что он даже запомнил предпочитаемые диапазоны температуры всех посетителей! Смотря на список бронирований, он хочет удовлетворить всех посетителей, контролируя температуру ресторана. В ресторане стоит кондиционер, у которого есть три состояния: выключенное, нагрев, и охлаждение. Когда кондиционер выключен, температура в ресторане не изменяется. Когда включен нагрев, температура увеличивается на 1 каждую минуту. Наконец, когда включено охлаждение, температура уменьшается на 1 каждую минуту. Гильдонг может переключать состояние сколько угодно раз, в любые целочисленные минуты. Кондиционер исходно выключен. Каждый посетитель характеризуется тремя значениями: \(t_i\) — момент визита (в минутах) \(i\)-го посетителя, \(l_i\) — нижняя граница предпочитаемого диапазона температур, and \(h_i\) — верхняя граница предпочитаемого диапазона температур. Каждый посетитель удовлетворен, если температура находится в их предпочтительном диапазоне в момент их посещения ресторана. Формально, \(i\)-й посетитель удовлетворён, если и только если в минуту \(t_i\) температура находится в отрезке от \(l_i\) до \(h_i\), включительно. Вам дана исходная температура, список времен посещения посетителей и их предпочитаемые диапазоны температуры, помогите ему удовлетворить всех посетителей. Выходные данные Для каждого набора входных данных выведите «YES» если возможно удовлетворить потребности всех посетителей. В противном случае, выведите «NO». Вы можете выводить все буквы в любом регистре (верхнем или нижнем). Примечание В первом наборе входных данных примера Гильдонг может контролировать кондиционер, чтобы удовлетворить всех посетителей, следующим образом: - В \(0\)-ю минуту, поменяйте состояние на нагрев (температура 0).
- Во \(2\)-ю мунуту, поменяйте состояние на выключенное (температура 2).
- В \(5\)-ю минуту, поменяйте состояние на нагрев (температура 2, \(1\)-й посетитель уже удовлетворен).
- В \(6\)-ю минуту, поменяте состояние на выключенное (температура 3).
- В \(7\)-ю минуту, поменяйте состояние на охлаждение (температура 3, \(2\)-й посетитель удовлетворен).
- В \(10\)-ю минуту, температура будет 0, что удовлетворит последнего посетителя.
В третьем наборе входных данных примера поменяйте состояние на выключенное в \(0\)-ю муинуту и оставьте его таким. Тогда все посетители будут удовлетворены. Обратите внимание, что момент посещения \(1\)-го посетителя совпадает с моментом посещения \(2\)-го посетителя. Во втором и четвертом наборах входных данных примера Гильдонгу придется оставить хотя бы одного посетителя неудовлетворенным.
| |
|
|
A. Курони и подарки
жадные алгоритмы
Конструктив
Перебор
сортировки
*800
У Курони есть \(n\) дочерей. В качестве подарков им он купил \(n\) ожерелий и \(n\) браслетов: - \(i\)-е ожерелье имеет яркость \(a_i\), где все \(a_i\) попарно различны (то есть все \(a_i\) имеют различные значения);
- \(i\)-й браслет имеет яркость \(b_i\), где все \(b_i\) попарно различны (то есть все \(b_i\) имеют различные значения).
Курони хочет дать ровно одно ожерелье и ровно один браслет каждой из своих дочерей. Чтобы все они выглядели уникально, общие яркости обоих подарков, вручаемых каждой дочери, должны быть попарно различными. Формально, если \(i\)-я дочь получает ожерелье с яркостью \(x_i\) и браслет с яркостью \(y_i\), то суммы \(x_i + y_i\) должны быть попарно различными. Помогите Курони раздать подарки. Например, если яркости равны \(a = [1, 7, 5]\) и \(b = [6, 1, 2]\), то мы можем распределить подарки следующим образом: - Дать третье ожерелье и первый браслет первой дочери, чтобы получить общую яркость \(a_3 + b_1 = 11\).
- Дать первое ожерелье и третий браслет второй дочери, чтобы получить общую яркость \(a_1 + b_3 = 3\).
- Дать второе ожерелье и второй браслет третьей дочери, чтобы получить общую яркость \(a_2 + b_2 = 8\).
А вот пример неправильного распределения: - Дать первое ожерелье и первый браслет первой дочери, чтобы получить общую яркость \(a_1 + b_1 = 7\).
- Дать второе ожерелье и второй браслет второй дочери, чтобы получить общую яркость \(a_2 + b_2 = 8\).
- Дать третье ожерелье и третий браслет третьей дочери, чтобы получить общую яркость \(a_3 + b_3 = 7\).
Это распределение неправильное, так как общие яркости подарков, полученных первой и третьей дочерью равны. Не расстраивайте их так! Выходные данные Для каждого набора входных данных в первой строке выведите \(n\) целых чисел \(x_1, x_2, \dots, x_n\), обозначающих, что \(i\)-я дочь получит ожерелье с яркостью \(x_i\). Во второй строке выведите \(n\) целых чисел \(y_1, y_2, \dots, y_n\), обозначающих, что \(i\)-я дочь получит браслет с яркостью \(y_i\). Суммы \(x_1 + y_1, x_2 + y_2, \dots, x_n + y_n\) должны быть попарно различными. Числа \(x_1, \dots, x_n\) должны быть равны числам \(a_1, \dots, a_n\) в каком-то порядке, а числа \(y_1, \dots, y_n\) должны быть равны числам \(b_1, \dots, b_n\) в каком-то порядке. Можно показать, что решение всегда существует. Если существует несколько решений, вы можете вывести любое из них. Примечание В первом наборе входных данных достаточно дать \(i\)-е ожерелье и \(i\)-й браслет \(i\)-й дочери. Соответствующие суммы будут равняться \(1 + 8 = 9\), \(8 + 4 = 12\), и \(5 + 5 = 10\). Второй набор входных данных описан в условии.
| |
|
|
D. Корова и поля
Бинарный поиск
графы
жадные алгоритмы
кратчайшие пути
поиск в глубину и подобное
сортировки
Структуры данных
*1900
Бесси пасется на ферме, состоящей из \(n\) полей, соединенных с помощью \(m\) двусторонних дорог. Сейчас она находится на поле \(1\), и вернется домой на поле \(n\) в конце дня. Кор-федерация Коровников приказала Фермеру Джону построить одну дополнительную двустороннюю дорогу. У фермы есть \(k\) особых полей, и было решено построить дорогу между двумя различными особыми полями. Фермер Джон может построить дорогу даже между полями, которые уже соединены дорогой. Уже после постройки дороги, Бесси вернется по кратчайшему пути от поля \(1\) к полю \(n\). Так как Бесси нужно больше тренироваться, Фермер Джон должен максимизировать длину данного кратчайшего пути. Помогите ему! Выходные данные Выведите единственное число — максимально возможную длину кратчайшего пути из \(1\) в \(n\) после того, как Фермер Джон построит одну дорогу оптимально. Примечание Граф из первого примера изображен ниже. Особые поля отмечены красным. Для Фермера Джона оптимально построить дорогу между полями \(3\) и \(5\), тогда кратчайший путь из \(1\) в \(5\) будет равен \(3\). Граф из второго примера изображен ниже. Фермер Джон должен построить дорогу между полями \(2\) и \(4\), тогда кратчайший путь из \(1\) в \(5\) будет равен \(3\).
| |
|
|
E. Еще одна задача о ферзях
сортировки
*1700
Ферзь (перс. ferzin — визирь, советник) — самая сильная шахматная фигура. В современных шахматах ферзь может перемещаться на любое число полей по вертикали, горизонтали и диагонали, объединяя возможности ладьи и слона (при условии, что на его пути нет фигур). На шахматной доске размера n × n стоят m ферзей. Известны позиции каждого из ферзей, i-й ферзь находится в клетке (ri, ci), где ri — номер строки доски (пронумерованы сверху вниз от 1 до n), а ci — номер столбца доски (пронумерованы слева направо от 1 до n). Позиции никакой пары ферзей не совпадают. Для каждого ферзя можно посчитать количество других ферзей, которые находятся под его боем. Для фиксированного направления ферзь держит под боем лишь первую фигуру в этом направлении на его пути от его положения. Очевидно, что для каждого ферзя это число может быть любым от 0 до 8, включительно. Выведите последовательность t0, t1, ..., t8, где ti — количество ферзей, которые держат под боем ровно i других ферзей. Выходные данные Выведите искомую последовательность t0, t1, ..., t8, разделяя числа пробелами.
| |
|
|
A. Рекомендации
жадные алгоритмы
сортировки
Структуры данных
*1700
Рекомендации новостей ВКонтакте ежедневно подбирают для каждого пользователя интересные публикации из \(n\) категорий. Каждая публикация принадлежит ровно к одной категории. Алгоритм массовых рекомендаций позволяет подобрать \(a_i\) новостей \(i\)-й категории. Результаты последнего A/B теста показали, что пользователи активнее читают рекомендованные новости, если ни в каких двух категориях не рекомендовано одинаковое количество новостей. Алгоритм одиночного поиска рекомендуемой новости конкретной категории позволяет найти одну новость категории \(i\) за \(t_i\) секунд. Сколько минимально суммарно времени понадобится для того, чтобы добавить новости к уже сформированным алгоритмом массовых рекомендаций публикациям так, чтобы ни в каких двух категориях не было равное количество новостей? Уже подготовленные рекомендации нельзя исключить из предлагаемых пользователю. Выходные данные Выведите одно целое число — минимальное суммарное время работы алгоритма одиночного поиска. Примечание В первом тестовом примере можно добавить три публикации второго типа, на поиск которых уйдет 6 секунд. Во втором тестовом примере все категории новостей уже содержат разное количество публикаций.
| |
|
|
B. WeirdSort
поиск в глубину и подобное
сортировки
*1200
Вам задан массив \(a\) длины \(n\). Кроме того, вам задано множество различных позиций \(p_1, p_2, \dots, p_m\), где \(1 \le p_i < n\). Позиция \(p_i\) означает, что вы можете поменять местами элементы \(a[p_i]\) и \(a[p_i + 1]\). Вы можете применить эту операцию любое количество раз для каждой из заданных позиций. Ваша задача — определить, возможно ли отсортировать заданный массив в неубывающем порядке (\(a_1 \le a_2 \le \dots \le a_n\)), используя только разрешенные обмены местами. Например, если \(a = [3, 2, 1]\) и \(p = [1, 2]\), то сначала мы можем поменять местами элементы \(a[2]\) и \(a[3]\) (т.к. позиция \(2\) содержится в заданном множестве \(p\)). Получим массив \(a = [3, 1, 2]\). Затем поменяем местами \(a[1]\) и \(a[2]\) (позиция \(1\) также содержится в \(p\)). Получим массив \(a = [1, 3, 2]\). Наконец, снова поменяем местами \(a[2]\) и \(a[3]\) и получим массив \(a = [1, 2, 3]\), отсортированный в порядке неубывания. Вы можете заметить, что если \(a = [4, 1, 2, 3]\) и \(p = [3, 2]\), то отсортировать массив невозможно. Вам требуется ответить на \(t\) независимых наборов тестовых данных. Выходные данные Для каждого набора тестовых данных выведите ответ на него — «YES» (без кавычек), если возможно отсортировать заданный массив в неубывающем порядке (\(a_1 \le a_2 \le \dots \le a_n\)), используя только разрешенные обмены местами. Иначе выведите «NO».
| |
|
|
F. Движущиеся точки
разделяй и властвуй
реализация
сортировки
Структуры данных
*1900
На координатной оси \(OX\) находятся \(n\) точек. \(i\)-я точка располагается в целочисленной координате \(x_i\) и имеет скорость \(v_i\). Гарантируется, что никакие две точки не располагаются в одной и той же координате. Все \(n\) точек двигаются с неизменной скоростью, координата \(i\)-й точки в момент времени \(t\) (\(t\) может быть нецелым) вычисляется как \(x_i + t \cdot v_i\). Рассмотрим две точки \(i\) и \(j\). Пусть \(d(i, j)\) равно минимально возможной дистанции между этими двумя точками по всем возможным моментам времени (даже нецелым). Это значит, что если две точки \(i\) и \(j\) совпадут в какой-то момент времени, значение \(d(i, j)\) будет равно \(0\). Ваша задача — посчитать значение \(\sum\limits_{1 \le i < j \le n}\) \(d(i, j)\) (сумму минимальных дистанций по всем парам точек). Выходные данные Выведите одно целое число — значение \(\sum\limits_{1 \le i < j \le n}\) \(d(i, j)\) (суммы минимальных дистанций по всем парам точек).
| |
|
|
B. Bogosort
Конструктив
сортировки
*1000
Вам задан массив \(a_1, a_2, \dots , a_n\). Массив хороший, если для каждой пары индексов \(i < j\) выполняется условие \(j - a_j \ne i - a_i\) . Можете ли вы переставить местами элементы массива так, чтобы он стал хорошим (если исходный массив хороший — можно оставить старый порядок)? Например, если \(a = [1, 1, 3, 5]\), то перемешанные массивы \([1, 3, 5, 1]\), \([3, 5, 1, 1]\) и \([5, 3, 1, 1]\) — хорошие, но перемешанные массивы \([3, 1, 5, 1]\), \([1, 1, 3, 5]\) и \([1, 1, 5, 3]\) — нет. Гарантируется, что всегда возможно перемешать массив так, чтобы он стал хорошим. Выходные данные На каждый набор входных данных выведите перемешанный массив \(a\), являющийся хорошим.
| |
|
|
B. Преобразование строки
Конструктив
Перебор
реализация
сортировки
Строки
*1400
У Васи есть строка \(s\) длины \(n\). Он решает применить к ней следующее преобразование: - Выберите целое \(k\), (\(1 \leq k \leq n\)).
- Для \(i\) от \(1\) до \(n-k+1\), переверните подстроку \(s[i:i+k-1]\) строки \(s\). К примеру, если строка \(s\) равна qwer и \(k = 2\), то строка пройдет следующую последовательность изменений:
- qwer (начальная строка)
- wqer (после переворачивания первой подстроки длины \(2\))
- weqr (после переворачивания второй подстроки длины \(2\))
- werq (после переворачивания последней подстроки длины \(2\))
Следовательно, получившаяся строка после преобразования \(s\) с \(k = 2\) равна werq. Вася хочет выбрать такое \(k\), чтобы строка, полученная в результате преобразования, была лексикографически минимальной возможной среди всех выборов \(k\). Среди всех таких \(k\) он хочет выбрать наименьшее. Так как он занят посещением Felicity 2020, он просит вашей помощи. Строка \(a\) лексикографически меньше строки \(b\), если и только если выполняется один из следующих пунктов: - \(a\) — префикс \(b\), но \(a \ne b\);
- в первой позиции, где \(a\) и \(b\) различны, в строке \(a\) находится буква, которая встречается в алфавите раньше, чем соответствующая буква в \(b\).
Выходные данные Для каждого набора входных данных выведите две строки: В первой строке выведите лексикографически минимально возможную строку \(s'\), получающуюся как результат преобразования. Во второй строке выведите подходящее значение \(k\) (\(1 \leq k \leq n\)), которое вы выбрали для преобрразования. Если несколько значений \(k\) дают лексикографически минимальную строку, выведите минимальное \(k\) среди них. Примечание В первом наборе тестовых данных примера, преобразование строки abab даст следующие результаты:
| |
|
|
E. Выбор команды
битмаски
дп
жадные алгоритмы
сортировки
*2300
Алиса, президент клуба FCB, хочет создать команду для участия в новом волейбольном турнире. Команда должна состоять из \(p\) игроков, играющих на \(p\) различных позициях. Она также понимает важность зрительской поддержки, поэтому она также хочет выбрать \(k\) болельщиков. В Байтляндии живет \(n\) человек. Алиса должна выбрать ровно \(p\) из них, каждый на отдельную позицию, и ровно \(k\) болельщиков из этих \(n\) человек. Она хочет максимизировать суммарную силу команды. У \(i\)-го из \(n\) человек есть целое число \(a_{i}\) — сила, которую он добавляет команде, если его выбирают как болельщика. Для каждого человека \(i\) и каждой позиции \(j\), Алиса знает \(s_{i, j}\) — силу, которую добавляет \(i\)-й человек команде, если он выбран как игрок на \(j\)-ю позицию. Каждый человек может быть выбран не более одного раза как игрок или болельщик. На каждую позицию нужно выбрать ровно одного человека. Так как Алиса занята, вы должны помочь ей выбрать игроков и болельщиков так, чтобы общая сила команды стала максимальной. Выходные данные Выведите единственное число \({res}\) — максимальную возможную силу команды. Примечание В первом примере, можно выбрать человека \(1\) игроком на \(1\)-ю позицию, а людей \(2\) и \(3\) болельщиками. Тогда общая сила команды будет равняться \(a_{2}+a_{3}+s_{1,1}\).
| |
|
|
B. Подарок
Бинарный поиск
битмаски
Конструктив
математика
сортировки
Структуры данных
*2100
На восьмое марта Катерине подарили массив чисел. Со временем ей стало скучно просто смотреть на него, и она решила посчитать некоторые его бесполезные характеристики. Со всеми, что она придумывала, ей это удавалось. Придумав очередную — xor попарных сумм чисел в массиве, она поняла, что не может придумать, как посчитать её для большого массива, и попросила вас помочь. А вы сможете? Более формально, вам нужно посчитать \(\) (a_1 + a_2) \oplus (a_1 + a_3) \oplus \ldots \oplus (a_1 + a_n) \\ \oplus (a_2 + a_3) \oplus \ldots \oplus (a_2 + a_n) \\ \ldots \\ \oplus (a_{n-1} + a_n) \\ \(\) Запись \(x \oplus y\) обозначает битовый XOR чисел (т.е. \(x\) ^ \(y\) для многих современных языков программирования). Об этой операции вы можете прочитать по ссылке в Wikipedia: https://tiny.cc/34xykz. Выходные данные Выведите одно число — xor попарных сумм чисел в данном массиве. Примечание В первом примере есть всего одна сумма: \(1 + 2 = 3\). Во втором примере есть три суммы: \(1 + 2 = 3\), \(1 + 3 = 4\), \(2 + 3 = 5\). В двоичной системе счисления это \(011_2 \oplus 100_2 \oplus 101_2 = 010_2\), то есть 2. \(\oplus\) означает операцию побитового xor. Чтобы определить \(x \oplus y\) рассмотрим двоичную запись чисел \(x\) и \(y\). Скажем, что \(i\)-й бит результата равен 1, если ровно один из \(i\)-х битов \(x\) и \(y\) равен 1. В противном случае \(i\)-й бит результата равен 0. Например, \(0101_2 \, \oplus \, 0011_2 = 0110_2\).
| |
|
|
D. Пара тем
Бинарный поиск
сортировки
Структуры данных
*1400
На следующей лекции в университете нужно обсудить две темы. \(i\)-я тема интересна на \(a_i\) единиц для преподавателя и на \(b_i\) единиц для студентов. Пара тем \(i\) и \(j\) (\(i < j\)) называется хорошей, если \(a_i + a_j > b_i + b_j\) (т.е. эта пара тем более интересна преподавателю). Ваша задача — найти количество хороших пар тем. Выходные данные Выведите одно целое число — количество хороших пар тем.
| |
|
|
D. Досуг в школе №41
графы
жадные алгоритмы
игры
Конструктив
Перебор
реализация
сортировки
*2100
В средней школе №41 учатся \(n\) детей. Всем известно, что они хорошие математики. Однажды на перемене ребята решили провести исследование. Они выстроились в один ряд и повернули головы налево или направо. Дети проделывали следующую операцию: каждую секунду несколько пар соседних в ряду детей, смотрящих друг на друга, могли одновременно развернуться в противоположную сторону. Таким образом, ребенок, смотрящий на правого соседа, повернется налево, и наоборот для второго ребенка. Более того, каждую секунду хотя бы одна пара соседних детей проделывала подобную операцию. Процесс заканчивается, когда нет пары соседних детей смотрящих друг на друга. Дано число детей \(n\), изначальная расстановка детей в ряду и целое положительное число \(k\). Необходимо найти последовательность действий детей, завершающий процесс ровно за \(k\) секунд. Более формально, на каждый из \(k\) ходов нужно вывести номера детей, которые повернутся налево во время хода. Для примера, дети могут действовать с конфигурацией приведенной ниже и \(k = 2\) следующим образом: На первом ходу развернутся две пары: \((1, 2)\) и \((3, 4)\). После этого получается такая конфигурация: На втором ходу развернется только пара \((2, 3)\). В итоговой конфигурации никакая пара детей не смотрит друг на друга. Хорошая работа. Если решение существует, то гарантируется что дети совершат не более чем \(n^2\) разворотов. Выходные данные Если решения не существует, выведите \(-1\). Иначе, вывод должен состоять из \(k\) строк. Каждая строка должна начинаться с положительного целого числа \(n_i\) (\(1\le n_i \le \frac{n}{2}\)) — количества пар детей, которые развернутся на этом ходу. Далее в этой же строке должно следовать \(n_i\) попарно различных чисел — номера детей, которые повернут голову налево во время этого хода. После проведения всех разворотов, не должно быть пары соседних детей, смотрящих друг на друга. Если существует более одного решения, выведите любое из них. Примечание Первый тест описывает пару детей смотрящих друг на друга. За один ход они развернутся. Во втором тесте дети не могут сделать ни одного хода. В итоге они не смогут закончить за \(k>0\) ходов. Третий тест описан в условии.
| |
|
|
F. Катя и несовершенства
жадные алгоритмы
математика
реализация
сортировки
теория чисел
*2200
У Кати есть множество \(S\) состоящее из \(n\) чисел \(\{1, \dots, n\} \). Катя считает, что уродливость множества \(M \subseteq S\) равна максимуму из \(gcd(a, b)\), по всем парам \((a, b)\) таким, что и \(a\) и \(b\) лежат в \(M\), и \(a \neq b\). Катя очень аккуратная девушка, поэтому для каждого \(k \in \{2, \dots, n\}\) она хочет найти подмножество имеющее наименьшую уродливость среди всех подмножеств \(S\) размера \(k\). Подмножеств заданного размера с минимальной уродливостью может быть больше одного, но вам не стоит беспокоиться по этому поводу. Катя найдет нужное ей подмножество сама. От вас ей нужно узнать лишь минимальную возможную уродливость для каждого \(k\) определенного выше, назовем ее \(I_k\). Пожалуйста, помогите Кате найти \(I_2\), \(I_3\), ..., \(I_n\). Выходные данные Вам нужно вывести только одну строку содержащую \(n - 1\) число: \(I_2\), \(I_3\), ..., \(I_n\). Примечание Ответ на первый пример 1, так как \(gcd(1, 2) = 1\). Во втором примере существуют подмножества \(S\) размеров \(2, 3\) с уродливостью 1. Например, \(\{2,3\}\) и \(\{1, 2, 3\}\).
| |
|
|
B. Средний класс
жадные алгоритмы
сортировки
*1100
Давным-давно Берляндия была маленькой страной, в которой проживало только \(n\) человек. Каждый из них имел некоторое количество сбережений: у \(i\)-го человека было \(a_i\) бурлей. Правительство считало человека богатым, если у него было хотя бы \(x\) бурлей. Чтобы увеличить количество богатых людей в Берляндии, решили провести несколько реформ. Каждая реформа выглядела следующим образом: - правительство выбирает некоторое подмножество людей (возможно, всех);
- правительство забирает все сбережения у выбранных людей и перераспределяет их среди выбранных людей поровну.
Например, представим сбережения как список \([5, 1, 2, 1]\): если правительство выбирает \(1\)-го и \(3\)-го человека, то оно, сначала заберет у них все \(5 + 2 = 7\) бурлей, а потом вернет каждому по \(3.5\) бурлей. В результате сбережения примут вид \([3.5, 1, 3.5, 1]\). Много информации было потеряно с того времени, поэтому мы не знаем, сколько реформ было проведено и на ком. Все, что мы можем — это попросить вас посчитать максимально возможное количество богатых людей после некоторого (возможно нулевого) количества реформ. Выходные данные Выведите \(T\) чисел — по одному на набор входных данных. Для каждого набора выведите максимально возможное количество богатых людей после некоторого (возможно нулевого) количества реформ. Примечание Первый пример описан в условии задачи. Во втором примере правительство, например, могло провести следующие реформы: \([\underline{11}, \underline{9}, 11, 9] \rightarrow [10, 10, \underline{11}, \underline{9}] \rightarrow [10, 10, 10, 10]\). В третьем примере правительство не сможет сделать даже одно человека богатым. В четвертом примере правительство могло выбрать всех людей в реформе: \([\underline{9}, \underline{4}, \underline{9}] \rightarrow [7\frac{1}{3}, 7\frac{1}{3}, 7\frac{1}{3}]\).
| |
|
|
C. Составление двух команд
Бинарный поиск
жадные алгоритмы
реализация
сортировки
*1100
Под вашим контролем находятся \(n\) студентов и вам нужно составить ровно две команды, состоящие из некоторого подмножества ваших студентов. У каждого студента есть свой собственный навык, навык \(i\)-го студента обозначен числом \(a_i\) (у различных студентов могут быть одинаковые навыки). Итак, о командах. Во-первых, эти две команды должны быть одинакового размера. Есть еще два требования: - Первая команда должна состоять из студентов с различными навыками (то есть нет одинаковых навыков среди студентов первой команды).
- Вторая команда должна состоять из студентов с одинаковыми навыками (то есть все навыки среди студентов второй команды равны между собой).
Отметим, что допустимо, что какой-то студент первой команды имеет такой же навык, как и студент второй команды. Рассмотрим несколько примеров (перечислены навыки для команд): - \([1, 2, 3]\), \([4, 4]\) не являются подходящей парой команд, потому что их размеры должны быть одинаковыми;
- \([1, 1, 2]\), \([3, 3, 3]\) не являются подходящей парой команд, потому что первая команда не должна включать студентов с одинаковыми навыками;
- \([1, 2, 3]\), \([3, 4, 4]\) не являются подходящей парой команд, потому что вторая команда должна включать студентов с одинаковыми навыками;
- \([1, 2, 3]\), \([3, 3, 3]\) — подходящая пара команд;
- \([5]\), \([6]\) — тоже подходящая пара команд.
Ваша задача — найти максимально возможный размер команд \(x\), для которого возможно составить подходящую пару команд, где каждая команда имеет размер \(x\) (в первой команде все навыки различны, во второй — все навыки равны между собой). Студент не может входить более чем в одну команду. Вам нужно ответить на \(t\) независимых наборов входных данных. Выходные данные Для каждого набора тестовых данных выведите ответ на него — максимально возможный размер команд \(x\), для которого возможно составить подходящую пару команд, где каждая команда имеет размер \(x\). Примечание В первом наборе тестовых данных примера возможно составить две команды размера \(3\): первая команда может иметь вид \([1, 2, 4]\), вторая команда может иметь вид \([4, 4, 4]\). Заметим, есть и другие способы выбрать две команды размера \(3\), которые соответствуют требованиям выше.
| |
|
|
A. Linova и королевство
Деревья
дп
жадные алгоритмы
поиск в глубину и подобное
сортировки
*1600
Написание легких романов является очень важной частью жизни Linova. Прошлой ночью ей приснилось сказочное королевство. Linova написала легкий роман про это королевство, как только проснулась. Конечно, она стала его королевой. Всего есть \(n\) городов и \(n-1\) двусторонняя дорога, соединяющая некоторые пары городов королевства. Из любого города вы можете попасть в любой другой город, пройдя по некоторым дорогам. Города пронумерованы от \(1\) до \(n\) и город \(1\) является столицей королевства. Таким образом, структура королевства является деревом. Как королева, Linova планирует выбрать ровно \(k\) городов для развития индустрии, тогда как в остальных городах будет развиваться туризм. Столица также может быть как индустриальным, так и туристическим городом. Раз в год в столице будет проходить встреча. Для участия во встрече, каждый индустриальный город посылает участника. Все посланники приедут в столицу по кратчайшему пути (который как известно единственный в дереве). Путешествие по туристическим городам очень приятно. Для каждого посланника, его уровень счастья равен количеству туристических городов на его пути. Для того, чтобы люди любили королеву, Linova хочет выбрать \(k\) городов так, чтобы максимизировать сумму уровней счастья всех посланников. Можете ли вы посчитать максимальную возможную сумму для нее? Выходные данные Выведите строку, содержащую единственное целое число — максимальную возможную сумму уровней счастья всех посланников, которую можно достичь. Примечание 
В первом тесте, Linova может выбрать города \(2\), \(5\), \(6\), \(7\) для развития индустрии, тогда уровень счастья посланника из города \(2\) будет равен \(1\), уровни счастья посланников из городов \(5\), \(6\), \(7\) будут равны \(2\). Таким образом, сумма уровней счастья будет равна \(7\) и можно доказать, что это максимальная возможная сумма, которая может быть. 
Во втором тесте, выбрав города \(3\) и \(4\) для развития индустрии можно достичь суммы \(3\), но обратите внимание, что Linova планирует выбрать ровно \(k\) городов для развития индустрии, поэтому максимальная сумма равна \(2\).
| |
|
|
B. Xenia и разноцветные камушки
Бинарный поиск
жадные алгоритмы
математика
сортировки
*1700
Xenia девочка, рожденная дворянкой. От скуки и одиночества, Xenia вынуждена сама искать какие-то способы развлечься. Недавно Xenia купила \(n_r\) красных камушков, \(n_g\) зеленых камушков и \(n_b\) голубых камушков. Каждый камушек имеет некоторый вес. Сейчас она хочет выбрать три камушка. Xenia любит разноцветные вещи, поэтому она выберет ровно один камушек каждого цвета. Xenia любит баланс, поэтому она хочет выбрать камушки с как можно меньшей разнице в весе. Более точно, если положить веса выбранных камушков за \(x\), \(y\) и \(z\), Xenia хочет выбрать камушки, так, чтобы значение \((x-y)^2+(y-z)^2+(z-x)^2\) было как можно меньше. Как ее лучший друг, можете ли вы помочь ей? Выходные данные Для каждого тестового случая выведите целое число — минимальное возможное значение, которое Xenia может получить. Примечание В первом тестовом случае, Xenia купила следующие камушки: 
Если она возьмет красный камушек с весом \(7\), зеленый камушек с весом \(6\) и голубой камушек с весом \(4\), она получит самый сбалансированный выбор со значением \((x-y)^2+(y-z)^2+(z-x)^2=(7-6)^2+(6-4)^2+(4-7)^2=14\).
| |
|
|
B. Отсортированные разности соседних
Конструктив
сортировки
*1200
У вас есть массив из \(n\) чисел \(a_{1}, a_{2}, \ldots, a_{n}\). Переставьте эти числа так, чтобы они удовлетворяли \(|a_{1} - a_{2}| \le |a_{2} - a_{3}| \le \ldots \le |a_{n-1} - a_{n}|\), где \(|x|\) обозначает абсолютное значение \(x\). Гарантируется, что для данных ограничений всегда можно найти такую перестановку. Обратите внимание, что элементы в \(a\) не обязательно попарно различны. Другими словами, некоторые элементы \(a\) могут быть одинаковыми. Вы должны ответить на \(t\) независимых тестовых случаев. Выходные данные Для каждого тестового случая выведите перестановку массива \(a\), которая удовлетворяет данному условию. Если существует несколько допустимых перестановок, выведите любую из них. Примечание В первом тестовом случае, для данной перестановки, мы имеем \(|a_{1} - a_{2}| = 0 \le |a_{2} - a_{3}| = 1 \le |a_{3} - a_{4}| = 2 \le |a_{4} - a_{5}| = 2 \le |a_{5} - a_{6}| = 10\). Существуют также другие ответы, к примеру "5 4 5 6 -2 8". Во втором тестовом случае, для данной перестановки, мы имеем \(|a_{1} - a_{2}| = 1 \le |a_{2} - a_{3}| = 2 \le |a_{3} - a_{4}| = 4\). Существуют также другие ответы, к примеру "2 4 8 1".
| |
|
|
D. Наборы входных данных
Бинарный поиск
жадные алгоритмы
Конструктив
сортировки
Структуры данных
*1900
Итак, вы решили провести свой раунд на Codeforces. Приготовили задачи: условия, решения, чекеры, валидаторы, тесты... И тут внезапно ваш координатор просит вас заменить все ваши тесты в самой простой задачи на наборы входных данных! Изначально каждый тест в данной задаче — это просто массив. Максимальный размер массива равен \(k\). Для простоты будем считать, что содержимое массива не важно. У вас есть \(n\) тестов; \(i\)-й тест — это массив размера \(m_i\) (\(1 \le m_i \le k\)). Ваш координатор просит вас распределить все ваши массивы по нескольким наборам входных данных. Каждый набор может включать в себя несколько массивов. Однако, в каждом наборе входных данных должно быть не больше \(c_1\) массивов размера больше или равного \(1\) (\(\ge 1\)), не больше \(c_2\) массивов размера больше или равного \(2\), \(\dots\), не больше \(c_k\) массивов размера больше или равного \(k\). Также \(c_1 \ge c_2 \ge \dots \ge c_k\). Теперь ваша задача — составить новые наборы входных данных так, чтобы: - каждый из изначальных массивов встречается ровно в одном наборе входных данных;
- для каждого набора тестовых данных выполняются приведенные условия;
- количество наборов тестовых данных минимально возможно.
Выведите минимальное количество наборов тестовых данных, которое можно достичь, а также размеры массивов в каждом наборе входных данных. Выходные данные В первой строке выведите одно целое число \(ans\) (\(1 \le ans \le n\)) — минимальное количество наборов входных данных, которое можно достичь. Каждая из следующих \(ans\) строк должна содержать описание набора входных данных в следующем формате: \(t\) \(a_1\) \(a_2\) \(\dots\) \(a_{t}\) (\(1 \le t\le n\)) — в наборе входных данных содержится \(t\) массивов, \(a_i\) — это размер \(i\)-го массива в этом наборе входных данных. Каждый из изначальных массивов должен содержаться в ровно одном наборе входных данных. В частности, это подразумевает, что сумма всех значений \(t\) по всем \(ans\) наборам входных данных должна быть равна \(n\). Обратите внимание, что ответ существует всегда, потому что \(c_k \ge 1\) (а следовательно \(c_1 \ge 1\)). Если существует несколько решений, выведите любое из них. Примечание В первом примере не существует способа распределить все тесты по меньше, чем \(3\), наборам входных данных. Данный ответ удовлетворяет всем условиям: в каждом наборе входных данных не больше \(4\) массивов размера больше или равного \(1\) и не больше \(1\) массива размера больше или равного \(2\) и \(3\). Обратите внимание, что существует несколько правильных ответов на данный тест. Например, наборы входных данных с размерами \([[2], [1, 2], [3]]\) тоже будут правильными. Однако, наборы тестовых данных с размерами \([[1, 2], [2, 3]]\) будут неправильными, потому что во втором наборе входных данных есть \(2\) массива размера больше или равного \(2\). Обратите внимание на разницу между третьим и четвертым примером. В третьем примере можно собрать до \(5\) массивов размера больше или равного \(1\) в набор входных данных, поэтому одного набора достаточно. А в четвертом примере можно иметь не больше \(1\) массива. Поэтому каждый массив приходится выделять в отдельный набор входных данных.
| |
|
|
E. Распределение весов
графы
жадные алгоритмы
кратчайшие пути
Перебор
сортировки
*2100
Вам задан неориентированный невзвешенный граф, состоящий из \(n\) вершин и \(m\) ребер (который представляет карту Бертауна), а также массив цен \(p\) длины \(m\). Гарантируется, что между каждой парой вершин (районов) существует путь. Майк планирует совершить путешествие из вершины (района) \(a\) в вершину (район) \(b\), а затем из вершины (района) \(b\) в вершину (район) \(c\). Он может посещать один и тот же район дважды или даже большее число раз. Но есть небольшая проблема: власти города хотят ввести цену за использование дорог, таким образом, что если кто-то проходит по ней, то он должен заплатить цену, соответствующую этой дороге (он платит каждый раз, когда проходит по дороге). Список используемых цен \(p\) готов и они просто хотят распределить его между всеми дорогами в городе таким образом, что каждая цена из массива соответствует ровно одной дороге. Вы являетесь хорошим другом Майка (и, внезапно, мэром Бертауна) и хотите помочь сделать его путешествие настолько дешевым, насколько это возможно. Таким образом, ваша задача заключается в том, чтобы распределить цены между дорогами таким образом, что если Майк выберет оптимальный путь, то цена его путешествия будет минимально возможной. Заметьте, что вы не можете перераспределять цены после после начала путешествия. Вам необходимо ответить на \(t\) независимых наборов тестовых данных. Входные данные Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных. Первая строка набора тестовых данных содержит пять целых чисел \(n, m, a, b\) и \(c\) (\(2 \le n \le 2 \cdot 10^5\), \(n-1 \le m \le min(\frac{n(n-1)}{2}, 2 \cdot 10^5)\), \(1 \le a, b, c \le n\)) — количество вершин, количество ребер и районы в путешествии Майка. Вторая строка набора тестовых данных содержит \(m\) целых чисел \(p_1, p_2, \dots, p_m\) (\(1 \le p_i \le 10^9\)), где \(p_i\) равно \(i\)-й цене из массива. Следующие \(m\) строк набора тестовых данных описывают ребра: ребро \(i\) предствалено парой целых чисел \(v_i\), \(u_i\) (\(1 \le v_i, u_i \le n\), \(u_i \ne v_i\)), которые означают индексы вершин, соединенных ребром. Гарантируется, что в графе не существует петель и кратных ребер, то есть для каждой пары (\(v_i, u_i\)) в списке ребер не существует других пар (\(v_i, u_i\)) или (\(u_i, v_i\)), а также для каждой пары \((v_i, u_i)\) выполняется условие \(v_i \ne u_i\). Гарантируется, что заданный граф является связным. Гарантируется, что сумма \(n\) (также как и сумма \(m\)) не превосходит \(2 \cdot 10^5\) (\(\sum n \le 2 \cdot 10^5\), \(\sum m \le 2 \cdot 10^5\)). Выходные данные Выведите ответ на каждый набор тестовых данных — минимально возможную цену путешествия Майка, если вы распределите цены между ребрами оптимально. Примечание Одно из возможных решение первого набора тестовых данных из примера: 
Одно из возможных решение второго набора тестовых данных из примера: 
| |
|
|
A. Отель Гильберта
математика
сортировки
теория чисел
*1600
Отель Гильберта это очень необычный отель, потому что количество комнат в нем бесконечно! Для каждого целого числа существует ровно одна комната с таким номером, включая ноль и отрицательные числа. Не менее странно то, что сейчас отель полностью заполнен, что означает, что в каждой комнате находится ровно один гость. Менеджер отеля, сам Давид Гильберт, решил переместить гостей, потому что у него есть предположение, что за счет этого образуются свободные места. Для любого целого числа \(k\) и положительного целого числа \(n\) обозначим за \(k\bmod n\) остаток при делении числа \(k\) на число \(n\). Более формально, \(r=k\bmod n\) это наименьшее неотрицательное целое число такое, что \(k-r\) делится на \(n\). Всегда выполнено, что \(0\le k\bmod n\le n-1\). Например, \(100\bmod 12=4\) и \((-1337)\bmod 3=1\). Процесс перемещения гостей выглядит следующим образом: есть массив, состоящий из \(n\) целых чисел \(a_0,a_1,\ldots,a_{n-1}\). Тогда для всех целых чисел \(k\) гость из комнаты с номером \(k\) перемещается в комнату с номером \(k+a_{k\bmod n}\). Определите, верно ли, что после этого процесса перемещения в каждой комнате по-прежнему находится ровно один гость. Это означает, что нет пустых комнат и комнат, в которых больше одного гостя. Выходные данные Для каждого тестового случая выведите единственную строку, содержащую «YES», если в каждой комнате после перемещения находится ровно один гость, и «NO» иначе. Вы можете выводить каждый символ в любом регистре. Примечание В первом тестовом случае номер комнаты каждого гостя увеличился на \(14\), поэтому по-прежнему в каждой комнате находится ровно один гость. Во втором тестовом случае гости в комнатах с четными номерами перемещаются в комнату с номером, на \(1\) большим исходного; гости в комнатах с нечетными номерами перемещаются в комнату с номером, на \(1\) меньшим исходного. Можно показать, что по-прежнему в каждой комнате находится ровно один гость. В третьем тестовом случае каждый четвертый гость перемещается в комнату с номером, на \(1\) большим исходного, а остальные гости перемещаются в комнату с номером, на \(5\) большим. Можно показать, что по-прежнему в каждой комнате находится ровно один гость. В четвертом тестовом случае гости, исходно находящиеся в комнатах \(0\) и \(1\), перемещаются в комнату с номером \(3\). В пятом тестовом случае гости, находящиеся в комнатах \(1\) и \(2\), перемещаются в комнату с номером \(2\).
| |
|
|
C. Весенняя уборка
*особая задача
жадные алгоритмы
сортировки
*1600
Таня планирует разобрать свой книжный шкаф. В шкафу есть \(n\) полок для книг, на \(i\)-й полке лежит \(a_i\) книг. Таня будет довольна, если на каждой полке будет лежать не более \(k\) книг. Таня может совершать одну из двух операций, чтобы достичь желаемого: - Выбрать ровно одну книжную полку и убрать все книги с нее в кладовку (то есть выбрать некоторое \(i\) и присвоить \(a_i := 0\)). На эту операцию она тратит \(x\) секунд.
- Взять все книги со всех \(n\) полок и распределить их по всем \(n\) полкам равномерно (определение этого понятия написано ниже). На эту операцию она тратит \(y\) секунд.
Рассмотрим последовательность \(a\) из \(n\) целых чисел. Тогда ее равномерное распределение — это такая последовательность \(b\) из \(n\) целых чисел, что сумма \(b\) равна сумме \(a\), а значение \(max(b) - min(b)\) минимально возможное. Например, если массив \(a=[5, 4, 3]\), то его равномерное распределение — это \(b=[4, 4, 4]\). Если \(a=[1, 2, 3, 4]\), то его равномерное распределение — это \(b=[2, 3, 3, 2]\) (или любая другая перестановка этого массива). Ваша задача — найти минимальное количество секунд, за которое Таня сможет получить книжный шкаф с не более чем \(k\) книгами на каждой полке. Выходные данные Для каждого набора входных данных выведите ответ — минимальное количество секунд, необходимые Тане, чтобы получить книжный шкаф такой, что на каждой полке стоит не более \(k\) книг. Примечание В первом наборе входных данных примера будет оптимальным совершить первую операцию над пятой книжной полкой. Таким образом, массив \(a\) станет равен \([1, 2, 2, 3, 5] \rightarrow [1, 2, 2, 3, 0]\). Во втором наборе входных данных примера будет оптимальным совершить первую операцию над второй книжной полкой, а затем совершить вторую операцию. Таким образом, массив \(a\) станет равен \([1, 5, 1, 5, 5] \rightarrow [1, 0, 1, 5, 5] \rightarrow [2, 2, 3, 3, 2]\). В третьем наборе входных данных примера будет оптимальным совершить вторую операцию. Таким образом, массив \(a\) станет равен \([1, 2, 5, 3, 5] \rightarrow [4, 3, 3, 3, 3]\). В четвертом наборе входных данных примера будет оптимальным совершить первую операцию над первой и второй книжными полками. Таким образом, массив \(a\) станет равен \([4, 4, 1, 1] \rightarrow [0, 0, 1, 1]\). В пятом наборе входных данных примера будет оптимальным использовать вторую операцию. Таким образом, массив \(a\) станет равен \([4, 4, 1, 1] \rightarrow [2, 3, 2, 3]\).
| |
|
|
B. Феникс и красота
жадные алгоритмы
Конструктив
сортировки
Структуры данных
*1400
Феникс любит красивые массивы. Он считает массив красивым, если все его подмассивы длины \(k\) имеют равную сумму. Подмассив массива — это последовательность подряд идущих элементов массива. У Феникса есть массив \(a\) длины \(n\). Он хочет вставить несколько (возможно, ноль) целых чисел в свой массив, чтобы он стал красивым. Вставляемые числа должны иметь значения от \(1\) по \(n\) включительно. Числа можно вставлять куда угодно (даже перед первым или после последнего элемента). Феникс не пытается минимизировать количество вставленных чисел. Выходные данные Для каждого набора входных данных, если невозможно получить крассивый массив, выведите -1. Иначе, выведите две строки. В первой строке выведите длину красивого массива \(m\) (\(n \le m \le 10^4\)). Вам не нужно минимизировать \(m\). Во второй строке выведите \(m\) целых чисел через пробел (\(1 \le b_i \le n\)) — красивый массив, который Феникс сможет получить вставляя несколько (возможно, ноль) целых чисел в свой массив \(a\). Вы можете выводить числа, которых не было в массиве \(a\) первоначально. Если существует несколько решений, выведите любое. Гарантируется, что если мы можем сделать массив \(a\) красивым, то мы всегда сможем добиться этого при итоговой длине не более \(10^4\). Примечание В первом наборе входных данных, мы можем сделать массив \(a\) красивым, если вставим число \(1\) в позицию \(3\) (между двумя числами \(2\)). Теперь все подмассивы длины \(k=2\) будут иметь одинаковую сумму \(3\). Существует много других возможных решений, например: - \(2, 1, 2, 1, 2, 1\)
- \(1, 2, 1, 2, 1, 2\)
Во втором наборе, массив уже красивый: все подмассивы длины \(k=3\) имеют одинаковую сумму \(5\). В третьем наборе, можно показать, что невозможно вставить числа так, чтобы сделать массив \(a\) красивым. В четвертом наборе, предложенный массив \(b\) является красивым — все его подмассивы длины \(k=4\) имеют равную сумму \(10\). Также существуют и другие решения.
| |
|
|
C. Феникс и распределение
жадные алгоритмы
Конструктив
сортировки
Строки
*1600
У Феникса есть строка \(s\), состоящая из строчных букв латинского алфавита. Он хочет распределить все буквы своей строки по \(k\) непустым строкам \(a_1, a_2, \dots, a_k\) так, что каждая буква из \(s\) попадет ровно в одну из строк \(a_i\). Строки \(a_i\) не обязаны быть подстроками \(s\). Феникс может распределить буквы \(s\) и переупорядочить их внутри каждой строки \(a_i\) так как захочет. Например, если \(s = \) baba и \(k=2\), Феникс может распределить буквы своей строки множеством способов, в том числе: - ba и ba
- a и abb
- ab и ab
- bb и aa
Однако получить такие варианты он не может: - baa и ba
- b и ba
- baba и пустая строка (\(a_i\) должны быть непустыми)
Феникс хочет разделить свою строку \(s\) на \(k\) строк \(a_1, a_2, \dots, a_k\) так, чтобы минимизировать лексикографически максимальную строку среди них, т. е. минимизировать \(max(a_1, a_2, \dots, a_k)\). Помогите ему найти оптимальное распределение и выведите минимально возможное значение \(max(a_1, a_2, \dots, a_k)\). Строка \(x\) лексикографически меньше, чем строка \(y\), если либо \(x\) является префиксом \(y\) (и \(x \ne y\)), либо существует такой индекс \(i\) (\(1 \le i \le min(|x|, |y|))\), что \(x_i\) < \(y_i\) и для всех \(j\) \((1 \le j < i)\) \(x_j = y_j\). Здесь \(|x|\) обозначает длину строки \(x\). Выходные данные Выведите \(t\) ответов — по одному на набор входных данных; \(i\)-й ответ — минимально возможный \(max(a_1, a_2, \dots, a_k)\) в \(i\)-м наборе. Примечание В первом наборе входных данных, одно из оптимальных решений — разбить baba на ab и ab. Во втором наборе входных данных, одно из оптимальных решений — разбить baacb на abbc и a. В третьем наборе, одно из оптимальных решений — разбить baacb на ac, ab и b. В четвертом наборе, одно из оптимальных решений — разбить aaaaa на aa, aa и a. В пятом наборе, одно из оптимальных решений — разбить aaxxzz на az, az, x и x. В шестом наборе, одно из оптимальных решений — разбить phoenix на ehinopx.
| |
|
|
A. Замена
жадные алгоритмы
реализация
сортировки
*1300
Маленький Петя очень любит массивы из n целых чисел, каждое из которых лежит в диапазоне от 1 до 109, включительно. Недавно мама подарила ему один такой массив. Пете он сразу не понравился. Он решил выбрать ровно одно число из массива и заменить его на другое целое число, которое также лежит в диапазоне от 1 до 109, включительно. Нельзя менять число само на себя или же не менять ни одного числа вовсе. После этой замены Петя отсортировал массив по неубыванию. Теперь он хочет узнать, какое наименьшее число могло стоять на каждой позиции после замены и сортировки. Выходные данные Выведите n целых чисел через пробел — минимальные возможные значения каждого из элементов массива после выполнения одной замены и сортировки.
| |
|
|
B. Два массива и обмены
жадные алгоритмы
сортировки
*800
Вам даны два массива \(a\) и \(b\), оба состоят из \(n\) положительных (больших нуля) целых чисел. Также вам задано число \(k\). За один ход вы можете выбрать два индекса \(i\) и \(j\) (\(1 \le i, j \le n\)) и поменять местами \(a_i\) и \(b_j\) (i.e. \(a_i\) становится \(b_j\) и наоборот). Заметьте, что \(i\) и \(j\) могут совпадать или отличаться (в частности, обмен \(a_2\) с \(b_2\) или обмен \(a_3\) с \(b_9\) оба считаются приемлемыми ходами). Ваша задача — назвать максимальную возможную сумму, которую вы можете получить в массиве \(a\), если вы сделаете не более \(k\) таких ходов (обменов). Вам нужно ответить на \(t\) независимых наборов тестовых данных. Выходные данные Для каждого набора тестовых данных выведите ответ на него — максимальную возможную сумму, которую вы можете получить в массиве \(a\), если вы можете совершить не более \(k\) обменов. Примечание В первом наборе тестовых данных примера вы можете поменять местами \(a_1 = 1\) и \(b_2 = 4\) и тогда получите \(a=[4, 2]\) и \(b=[3, 1]\). Во втором наборе тестовых данных примера вам не нужно ничего менять. В третьем наборе тестовых данных примера вы можете поменять местами \(a_1 = 1\) и \(b_1 = 10\), \(a_3 = 3\) и \(b_3 = 10\) и \(a_2 = 2\) и \(b_4 = 10\), и получить \(a=[10, 10, 10, 4, 5]\) и \(b=[1, 9, 3, 2, 9]\). В четвертом наборе тестовых данных примера вы не можете ничего поменять. В пятом наборе тестовых данных примера вы можете поменять местами массивы \(a\) и \(b\) и получить \(a=[4, 4, 5, 4]\) и \(b=[1, 2, 2, 1]\).
| |
|
|
D. Построение массива
Конструктив
сортировки
Структуры данных
*1600
Вам задана массив \(a\) длины \(n\), состоящий из нулей. Вы выполняете \(n\) действий с этим массивом: в течение \(i\)-го действия происходит следующая последовательность операций:
- Выбирается максимальный по длине подмассив (последовательный подотрезок), состоящий только из нулей, среди всех таких отрезков выбирается самый левый;
- Пусть этот отрезок равен \([l; r]\). Если \(r-l+1\) нечетно (не делится на \(2\)), то присваивается \(a[\frac{l+r}{2}] := i\) (где \(i\) — номер текущего действия), иначе (если \(r-l+1\) четно) присваивается \(a[\frac{l+r-1}{2}] := i\).
Рассмотрим массив \(a\) длины \(5\) (изачально \(a=[0, 0, 0, 0, 0]\)). Тогда он меняется следующим образом:
- Сначала мы выбираем отрезок \([1; 5]\) и присваиваем \(a[3] := 1\), таким образом \(a\) становится равен \([0, 0, 1, 0, 0]\);
- затем мы выбираем отрезок \([1; 2]\) и присваиваем \(a[1] := 2\), таким образом \(a\) становится равен \([2, 0, 1, 0, 0]\);
- затем мы выбираем отрезок \([4; 5]\) и присваиваем \(a[4] := 3\), таким образом \(a\) становится равен \([2, 0, 1, 3, 0]\);
- затем мы выбираем отрезок \([2; 2]\) и присваиваем \(a[2] := 4\), таким образом \(a\) становится равен \([2, 4, 1, 3, 0]\);
- и наконец мы выбираем отрезок \([5; 5]\) и присваиваем \(a[5] := 5\), таким образом \(a\) становится равен \([2, 4, 1, 3, 5]\).
Ваша задача — найти массив \(a\) длины \(n\) после выполнения всех \(n\) действий. Заметьте, что ответ существует и единственен.
Вам необходимо ответить на \(t\) независимых наборов тестовых данных.
Выходные данные
Для каждого набора тестовых данных выведите ответ — массив \(a\) длины \(n\) после выполнения \(n\) действий, описанных в условии задачи. Заметьте, что ответ существует и единственен.
| |
|
|
F. Призыв существ
дп
жадные алгоритмы
Конструктив
Паросочетания
Потоки
сортировки
*2500
Поликарп играет в компьютерную игру. В этой игре игроки призывают армии магических существ и сражаются с армиями существ других игроков. Поликарп может призвать \(n\) разных существ, \(i\)-е существо изначально имеет силу \(a_i\); кроме того, когда Поликарп призывает его, оно увеличивает на \(b_i\) силу всех ранее призванных существ (исключая себя). Поликарп может призывать существ в любом порядке. Однако под контролем Поликарпа может находиться не более \(k\) существ одновременно. Поэтому, помимо призыва существ, он может уничтожать ранее призванных существ. Каждое существо может быть призвано (а, значит, и уничтожено) не более одного раза. Цель Поликарпа — собрать максимально сильную армию существ. Он хочет, чтобы после всех его действий суммарная сила всех призванных (но не уничтоженных) им существ была максимально возможной. Помогите Поликарпу составить оптимальную последовательность действий, чтобы собрать максимально сильную армию! Выходные данные Для каждого набора тестовых данных выведите оптимальную последовательность действий в следующем формате: Сначала выведите \(m\) — количество действий, которые должен совершить Поликарп (\(0 \le m \le 2n\)). После этого выведите \(m\) целых чисел \(o_1\), \(o_2\), ..., \(o_m\), где \(o_i\) описывает \(i\)-е действие следующим образом: если \(i\)-е действие — это «призвать существо \(x\)», то \(o_i = x\), а если \(i\)-е действие — это «уничтожить существо \(x\)», то \(o_i = -x\). Каждое существо может быть призвано не более одного раза и не может быть уничтожено, если оно еще не призвано (или уже уничтожено). После каждого действия под контролем Поликарпа должно быть не более \(k\) существ. Если оптимальных последовательностей действий несколько, выведите любую из них. Примечание Рассмотрим пример из условия. В первом наборе тестовых данных можно сначала вызвать существо \(2\) с силой \(7\), затем призвать существо \(1\), которое увеличит силу предыдущего существа на \(3\), после этого уничтожить существо \(1\) и поставить существо \(5\). В итоге у Поликарпа будут два существа с силой \(10\). Во втором наборе тестовых данных у Поликарпа не может быть более одного существа под контролем, поэтому достаточно выбрать самое сильное существо и призвать его. В третьем наборе тестовых данных Поликарп может призвать всех существ, никого не уничтожая.
| |
|
|
B. Юные следопыты
дп
жадные алгоритмы
сортировки
*1200
Отряд юных следопытов отправился в учебную экспедицию навстречу своим первым приключениям. И возглавляет их старший следопыт Рассел. Вот герои зашли в лес, разбили лагерь и дальше решили разделиться на группы, чтобы исследовать как можно больше интересных мест. Рассел должен был выбрать состав групп, но столкнулся с одной проблемой... Многие юные следопыты неопытны, и отправлять их маленькими группами — не всегда хорошая идея. Даже сам Рассел недавно стал старшим следопытом и нечасто бывал в экспедициях. Каждый следопыт характеризуется своей неопытностью — целым положительным числом \(e_i\). Рассел решил, что юный следопыт с неопытностью \(e\) может идти лишь в группе, количество следопытов в которой не меньше \(e\). Теперь задача Рассела — определить, какое наибольшее число групп следопытов он сможет организовать. При этом может получиться, что некоторые следопыты не войдут в состав ни одной группы, это не страшно, ведь и в лагере для них найдется работа. Рассел очень переживает за успех экспедиции, и потому попросил вас помочь ему. Выходные данные Выведите \(T\) чисел, каждое на отдельной строке. В \(i\)-й строке выведите наибольшее число групп, которое можно организовать в \(i\)-м тестовом случае. Примечание В первом примере можно сформировать три группы, в каждой из которых будет один следопыт. Это возможно, так как неопытность всех трех следопытов равна \(1\), что не меньше, чем размер их групп. Во втором примере можно сформировать две группы. В первой группе окажутся следопыты с неопытностью \(1\), \(2\) и \(3\), а во второй группе — два следопыта с неопытностью \(2\). Этот способ — не единственный возможный. Можно, например, сформировать одну группу из трех следопытов с неопытностью \(2\), а также еще одну группу, в которой будет всего один следопыт с неопытностью \(1\). При таком разбиении на группы следопыт с неопытностью \(3\) не войдет в состав ни одной группы.
| |
|
|
E. Реставрационное расстояние
Бинарный поиск
жадные алгоритмы
математика
сортировки
Тернарный поиск
*2100
Вам нужно отреставрировать стену. Стена состоит из \(N\) столбиков кирпичей, высота \(i\)-го столбика изначально равна \(h_{i}\), высота измеряется количеством кирпичей. После реставрации все \(N\) столбиков должны иметь одинаковую высоту. Вам доступны следующие операции: - положить кирпич на верх одного из столбиков, стоимость этой операции равна \(A\);
- убрать кирпич с верха одного из непустых столбиков, стоимость этой операции равна \(R\);
- переложить один кирпич с верха одного из непустых столбиков на верх другого столбика, стоимость этой операции равна \(M\).
Вы не можете создавать дополнительные столбики или игнорировать какие-то из существующих столбиков, даже если их высота стала равна \(0\). За какую минимальную суммарную стоимость возможно провести реставрацию, то есть сделать высоты всех столбиков равными? Выходные данные Выведите одно целое число — минимальную суммарную стоимость реставрации стены.
| |
|
|
B. Марья Ивановна нарушает самоизоляцию
жадные алгоритмы
сортировки
*1000
Марье Ивановне, самой активной бабушке двора, надоело сидеть дома. Она решила организовать обряд против коронавируса. У неё есть \(n\) подруг-бабушек (сама Марья Ивановна в это количество не входит). Бабушка с номером \(i\) готова прийти на обряд при условии, если в момент её появления во дворе кроме неё там будет как минимум \(a_i\) других бабушек. Обратите внимание, что бабушки могут приходить во двор одновременно. Формально, бабушка \(i\) готова прийти, если количество бабушек пришедших ранее или одновременно с ней больше или равно \(a_i\). Бабушки собираются во дворе так. - Изначально во дворе находится только Марья Ивановна (то есть количество бабушек во дворе равно \(1\)). Все остальные \(n\) бабушек пока сидят по домам.
- На очередном шаге Марья Ивановна выбирает подмножество бабушек, ни одна из которых ещё не вышла во двор. Каждой из них она обещает, что когда бабушка выйдет, во дворе будет не менее \(a_i\) других бабушек (включая Марью Ивановну). Марья Ивановна может звонить сразу нескольким соседкам. В таком случае выбранные бабушки выйдут во двор одновременно.
- Вы не можете обманывать бабушек, то есть ситуация, когда \(i\)-я бабушка, после выхода во двор обнаружит, что сейчас во дворе строго меньше \(a_i\) других бабушек (кроме неё самой, но включая Марью Ивановну), запрещена. Обратите внимание, что если несколько бабушек появились во дворе одновременно, то они каждая из них видит в том числе остальных в момент выхода.
Ваша задача — найти, какое максимальное количество бабушек (включая себя) Марья Ивановна может собрать во дворе для проведения обряда «обкуривания от Короны-Вируса». Ведь чем больше людей в одном месте во время карантина, тем эффективнее обряд! Рассмотрим пример: если \(n=6\) и \(a=[1,5,4,5,1,9]\), то: - на первом шаге Марья Ивановна может позвать бабушек с номерами \(1\) и \(5\), каждая из них будет видеть двух бабушек в момент выхода во двор (заметим, что \(a_1=1 \le 2\) и \(a_5=1 \le 2\));
- на втором шаге Марья Ивановна может позвать бабушек с номерами \(2\), \(3\) и \(4\), каждая из них будет видеть пять бабушек в момент выхода во двор (заметим, что \(a_2=5 \le 5\), \(a_3=4 \le 5\) и \(a_4=5 \le 5\));
- бабушку номер \(6\) позвать во двор не получится — следовательно, ответ на для такого примера равен \(6\) (сама Марья Ивановна и еще \(5\) суммарно вышедших бабушек).
Выходные данные Для каждого набора входных данных выведите единственное целое число \(k\) (\(1 \le k \le n + 1\)) — максимальное возможное количество бабушек во дворе. Примечание В первом наборе входных данных примера Марья Ивановна на первом шаге может позвать всех бабушек. Тогда каждая из них увидит пять бабушек, когда выйдет. Иными словами, ни одна не уйдёт домой. Поэтому во дворе будет Марья Ивановна и пять других бабушек. Во втором наборе входных данных примера никто не сможет находиться во дворе, поэтому Марья Ивановна останется там одна. Третий набор входных данных примера подробно разобран выше. В четвёртом тестовом случае Марья Ивановна на первом шаге может позвать бабушек с номерами \(1\), \(2\) и \(3\). Если на втором шаге Марья Ивановна позовёт только \(4\)-ю или только \(5\)-ю, то когда эта бабушка выходила бы во двор, то она бы увидела четверых бабушек, то есть Марья Ивановна по отдельности позвать \(4\)-ю и \(5\)-ю не может. Если она позовёт сразу обеих — \(4\)-ю и \(5\)-ю, то когда они будут выходить, то увидят по \(4+1=5\) бабушек. Несмотря на то, что \(4\)-ю бабушку это устраивает, \(5\)-ю — этот вариант не устраивает. Следовательно, позвать одновременно \(4\)-ю и \(5\)-ю Марья Ивановна тоже не может. То есть во дворе будет только Марья Ивановна и три бабушки из первого шага.
| |
|
|
B. Честный тренер
жадные алгоритмы
сортировки
*800
Перед вами стоит \(n\) спортсменов. Спортсмены пронумерованы от \(1\) до \(n\) слева направо. Про каждого спортсмена вы знаете его силу — спортсмен с номером \(i\) имеет силу \(s_i\). Вы хотите разделить всех спортсменов на две команды. В каждой команде должен быть хотя бы один спортсмен, и каждый спортсмен должен быть ровно в одной команде. Вы хотите, чтобы самый сильный спортсмен из первой команды по силе как можно меньше отличался от самого слабого спортсмена из второй команды. Формально, вы хотите разделить спортсменов на две команды \(A\) и \(B\) так, чтобы величина \(|\max(A) - \min(B)|\) была как можно меньше, где \(\max(A)\) — максимальная сила спортсмена из команды \(A\), а \(\min(B)\) — минимальная сила спортсмена из команды \(B\). Например, если \(n=5\) и силы спортсменов равны \(s=[3, 1, 2, 6, 4]\), то одно из возможных разделений на команды имеет вид: - первая команда: \(A = [1, 2, 4]\),
- вторая команда: \(B = [3, 6]\).
В этом случае величина \(|\max(A) - \min(B)|\) будет равна \(|4-3|=1\). Этот пример иллюстрирует один из способов оптимального разбиения на две команды. Выведите минимальное значение \(|\max(A) - \min(B)|\). Выходные данные Для каждого набора тестовых данных выведите одно целое число — минимальное значение величины \(|\max(A) - \min(B)|\) при оптимальном разбиении всех спортсменов на команды. Каждый из спортсменов должен оказаться членом ровно одной из двух команд. Примечание Первый набор тестовых данных разобран в условии. Во втором наборе одно из оптимальных разбиений имеет вид \(A=[2, 1]\), \(B=[3, 2, 4, 3]\), поэтому ответ равен \(|2-2|=0\).
| |
|
|
C. Похожие пары
жадные алгоритмы
Конструктив
Паросочетания
сортировки
*1100
Назовем два числа \(x\) и \(y\) похожими, если они имеют одинаковую четность (одинаковый остаток при делении на \(2\)), или если \(|x-y|=1\). Например, в каждой из пар \((2, 6)\), \((4, 3)\), \((11, 7)\) числа похожи между собой, а в парах \((1, 4)\), \((3, 12)\) — нет. Вам дан массив \(a\) из \(n\) (число \(n\) четно) целых положительных чисел. Проверьте, существует ли такое разбиение массива на пары, что каждый элемент массива принадлежит ровно одной паре, и в каждой паре числа похожи между собой. Например для массива \(a = [11, 14, 16, 12]\) существует разбиение на пары \((11, 12)\) и \((14, 16)\). Числа в первой паре похожи, потому что модуль их разности равен единице, а во второй паре — потому что они оба четные. Выходные данные Для каждого набора тестовых данных выведите: - YES, если разбиение существует;
- NO, если разбиения не существует.
Буквы в словах YES и NO можно выводить в любом регистре. Примечание Первый набор тестовых данных примера разобран в условии. Во втором наборе два заданных числа не являются похожими. В третьем наборе подходит любое разбиение.
| |
|
|
A. Джонни и вклад
графы
жадные алгоритмы
Конструктив
сортировки
*1700
Сегодня Джонни хочет увеличить свой вклад. Его план подразумевает написание \(n\) блогов. Один блог покрывает одну тему, но одна тема может быть покрыта несколькими блогами. Также, некоторые блоги связаны друг с другом ссылками. Каждая пара блогов, связанных ссылкой, должна покрывать две разные темы. Потому что иначе читатели могут заметить, что блоги разделены только для того, чтобы набрать больше вклада. Множество блогов и двусторонние ссылки между некоторыми парами из них называются сетью блогов. Всего есть \(n\) различных тем, пронумерованных от \(1\) до \(n\), упорядоченных по пониманию Джонни. Структура сети блогов уже приготовлена. Теперь Джонни должен написать все блоги в некотором порядке. Он ленивый, поэтому каждый раз перед написанием блога, он смотрит на все уже написанные соседние блоги (связанные ссылкой с текущим) и выбирает тему с минимальным номером, которая еще не покрыта соседними блогами. Можно заметить, что такая стратегия всегда позволит ему выбрать тему, потому что максимальное количество соседних блогов равно \(n - 1\). Например, если уже написанные, соседние с текущим, блоги покрывают темы с номерами \(1\), \(3\), \(1\), \(5\) и \(2\), Джонни выберет тему номер \(4\) для текущего блога, потому что темы номер \(1\), \(2\) и \(3\) уже покрыты соседними блогами, а тема номер \(4\) — нет. Как хороший друг, вы провели некоторые исследования и предсказали наилучшую темы для каждого блога. Не могли бы вы сказать Джонни, в каком порядке он должен писать блоги, чтобы в результате его стратегии каждый блог покрывал выбранную вами тему? Выходные данные Если решение не существует, выведите \(-1\). Иначе, выведите \(n\) различных целых чисел \(p_1, p_2, \ldots, p_n\) \((1 \leq p_i \leq n)\), которые обозначают номера блогов в том порядке, в котором Джонни должен их написать. Если существует несколько решений, выведите любое. Примечание В первом примере, Джонни начинает с написания блога номер \(2\), у него пока еще нет написанных соседних блогов, поэтому Джонни выбирает тему номер один. Потом он пишет блог номер \(1\), у него есть ссылка на уже написанный второй блог, поэтому Джонни выбирает вторую тему. Наконец, он пишет блог номер \(3\), у него есть ссылки на блоги номер \(1\) и \(2\), поэтому Джонни выбирает третью тему. Второй пример: Не существует ни одной перестановки, удовлетворяющей всем условиям. Третий пример: Сначала Джонни пишет блог номер \(2\), который получает тему \(1\). Затем, он пишет блог \(5\), который тоже получает тему \(1\), потому из него нет ссылки на единственный уже написанный блог (номер \(2\)). Затем, он пишет блог \(1\), он получает тему \(2\), потому что из него есть ссылка на блог \(2\) с темой \(1\). Затем, он пишет блог \(3\), из него есть ссылка на блог \(2\), поэтому он получает тему \(2\). Наконец, он пишет блог \(4\), из него есть ссылка на блог \(5\), поэтому он получает тему \(2\).
| |
|
|
B. Джонни и гроссмейстер
жадные алгоритмы
математика
реализация
сортировки
*1900
Джонни недавно нашел новый отличный туториал: «Как стать гроссмейстером?». В туториале говорится много странных и неожиданных для Джонни вещей, таких как то, что он должен быть терпеливым или что очень важно решать много все более и более сложных задач. Мальчик нашел онлайн архив с задачами, разделенными по темам. Он выбрал \(p^{k_i}\) задач из \(i\)-й категории (\(p\) — его любимое число). Он хочет решить все эти задачи за две недели (терпение еще слишком сложно для Джонни, поэтому он смотрит только на простые задачи, которые могут быть решены за такой период). Теперь наш будущий гроссмейстер должен решить, какие темы покрыть на первой неделе, а какие на второй. Помогите ему распределить темы таким образом, чтобы нагрузка была равномерной. Формально, дано \(n\) чисел \(p^{k_i}\), мальчик хочет разделить их на два непересекающихся набора, минимизировав разность между суммами чисел в наборах. Найдите минимальное значение модуля такой разности. Выведите остаток от деления результата на \(10^{9}+7\). Выходные данные Выведите одно целое число — остаток от деления ответа на \(1\,000\,000\,007\). Примечание Вы должны минимизировать модуль разности, а не остаток модуля разности. Например, если минимальная разность равна \(2\), но существует также разбиение, при котором разность равна \(10^9 + 8\), ответ равен \(2\), а не \(1\). В первом наборе входных данных числа равны: \(4\), \(8\), \(16\), \(16\) и \(8\). Мы можем разделить их на два набора: \({4, 8, 16}\) и \({8, 16}\). Тогда модуль разности между суммами чисел в наборах будет равен \(4\).
| |
|
|
F. Снова обмены
Конструктив
реализация
сортировки
*2100
Ayush, Ashish и Vivek заняты подготовкой задачи для следующего Codeforces раунда и им нужно помочь проверить тесты на корректность. Каждый набор входных данных состоит из \(n\) и двух массивов \(a\) и \(b\), длины \(n\). Если после скольки-то (возможно, нуля) операций описанных ниже, массив \(a\) может стать равен массиву \(b\), тест считается корректным. Иначе, он некорректный. Возможные операции на массиве \(a\) следующие: - выберите целое число \(k\) \((1 \le k \le \lfloor\frac{n}{2}\rfloor)\)
- поменяйте местами префикс длины \(k\) с суффиксом длины \(k\)
Например, если массив \(a\) исходно равен \(\{1, 2, 3, 4, 5, 6\}\), после выполнения операции с \(k = 2\), он превратится в \(\{5, 6, 3, 4, 1, 2\}\). Вам дано несколько наборов входных данных, помогите определить про каждый из них, корректный он или некорректный. Выходные данные Для каждого набора входных данных, выведите «Yes», если данный ввод корректный. Иначе, выведите «No». Вы можете выводить все символы в любом регистре. Примечание В первом наборе входных данных можно поменять местами префикс \(a[1:1]\) с суффиксом \(a[2:2]\), чтобы получить \(a=[2, 1]\). Во втором наборе входных данных \(a\) уже равен \(b\). В третьем наборе входных данных невозможно получить \(3\) в \(a\). В четвертом наборе входных данных сначала можно поменять местами префикс \(a[1:1]\) с суффиксом \(a[4:4]\), чтобы получить \(a=[2, 2, 3, 1]\). После этого можно поменять местами префикс \(a[1:2]\) с суффиксом \(a[3:4]\), чтобы получить \(a=[3, 1, 2, 2]\). В пятом наборе входных данных невозможно превратить \(a\) в \(b\).
| |
|
|
D. Задача на доске
жадные алгоритмы
Конструктив
реализация
сортировки
*1800
Поликарп написал на доске некоторую строку \(s\) из строчных букв латинского алфавита ('a'-'z'). Эта строка вам известна и задана во входных данных. После этого он стёр какие-то буквы из строки \(s\), а оставшиеся буквы он переписал в произвольном порядке. В результате он получил некоторую новую строку \(t\). Её вам и предстоит найти по некоторой дополнительной информации. Предположим, что длина строки \(t\) равна \(m\), а символы пронумерованы слева направо от \(1\) до \(m\). В таком случае вам задана последовательность из \(m\) целых чисел: \(b_1, b_2, \ldots, b_m\), где \(b_i\) равно сумме расстояний \(|i-j|\) от индекса \(i\) до всех таких индексов \(j\), что \(t_j > t_i\) (считайте, что 'a'<'b'<...<'z'). Иными словами, для вычисления \(b_i\) Поликарп находит все такие индексы \(j\), что в индексе \(j\) находится буква, которая стоит позже в алфавите чем \(t_i\), и суммирует все значения \(|i-j|\). Например, если \(t\)=«abzb», то: - так как \(t_1\)='a', то все остальные индексы содержат буквы, которые позже в алфавите, то есть: \(b_1=|1-2|+|1-3|+|1-4|=1+2+3=6\);
- так как \(t_2\)='b', то только индекс \(j=3\) содержит букву, которая позже в алфавите, то есть: \(b_2=|2-3|=1\);
- так как \(t_3\)='z', то индексов \(j\), что \(t_j>t_i\) не существует: \(b_3=0\);
- так как \(t_4\)='b', то только индекс \(j=3\) содержит букву, которая позже в алфавите, то есть: \(b_4=|4-3|=1\).
Таким образом, если \(t\)=«abzb», то \(b=[6,1,0,1]\). По заданной строке \(s\) и массиву \(b\) найдите любую возможную строку \(t\), для которой выполняются следующие два требования одновременно: - \(t\) получается из \(s\) путём стирания некоторых букв (возможно, нуля) и потом записи оставшихся в произвольном порядке;
- по строке \(t\) получается заданный во входных данных массив \(b\), если его построить по правилам, которые описаны выше.
Выходные данные Выведите \(q\) строк: \(k\)-я из них должна содержать ответ (строку \(t\)) на \(k\)-й набор входных данных. Гарантируется, что ответ на каждый набор входных данных существует. Если ответов несколько, то выведите любой. Примечание В первом наборе входных данных подходят такие строки \(t\): «aac», «aab». Во втором наборе входных данных подходят такие строки \(t\): «a», «b», «c». В третьем наборе входных данных подходит только строка \(t\) равная «aba», но символ 'b' может быть со второй или с третьей позиции.
| |
|
|
F2. Летающая сортировка (сложная версия)
Бинарный поиск
дп
жадные алгоритмы
сортировки
Структуры данных
*2400
Это сложная версия задачи. В этой версии в заданном массиве могут встречаться одинаковые числа и ограничения на \(n\) больше, чем в простой версии задачи. Вам дан массив \(a\) из \(n\) целых чисел (в массиве могут быть одинаковые элементы). Вы можете производить над элементами массива следующие операции: - выбрать любой индекс \(i\) (\(1 \le i \le n\)) и переместить элемент \(a[i]\) в начало массива;
- выбрать любой индекс \(i\) (\(1 \le i \le n\)) и переместить элемент \(a[i]\) в конец массива.
Например, если \(n = 5\), \(a = [4, 7, 2, 2, 9]\), то можно применить следующую последовательность операций: - После применения операции первого типа ко второму элементу массив \(a\) станет равным \([7, 4, 2, 2, 9]\);
- После применения операции второго типа ко второму элементу массив \(a\) станет равным \([7, 2, 2, 9, 4]\).
Вы можете проводить операции любого типа произвольное количество раз в любом порядке. Найдите минимальное суммарное количество операций первого и второго типа, которые сделают массив \(a\) отсортированным по неубыванию. Иными словами, сколько минимум операций надо применить, чтобы массив удовлетворял неравенствам \(a[1] \le a[2] \le \ldots \le a[n]\)? Выходные данные Для каждого набора тестовых данных выведите одно целое число — минимальное суммарное количество операций первого и второго типа, которые сделают массив отсортированным по неубыванию. Примечание В первом тестовом наборе нужно переместить две двойки в начало массива. Следовательно, искомая последовательность операций может иметь вид: \([4, 7, 2, 2, 9] \rightarrow [2, 4, 7, 2, 9] \rightarrow [2, 2, 4, 7, 9]\). Во втором тестовом наборе нужно переместить единицу в начало массива, а восьмерку — в конец. Искомая последовательность операций имеет вид: \([3, 5, 8, 1, 7] \rightarrow [1, 3, 5, 8, 7] \rightarrow [1, 3, 5, 7, 8]\). В третьем тестовом наборе массив уже отсортирован.
| |
|
|
C. ПриятеЛи
жадные алгоритмы
математика
сортировки
*1400
Ли наконец стал мастером на Codeforces, и потому решил сходить за подарками своим друзьям. Он приобрел \(n\) целых чисел, и теперь настало время распределить их между друзьями... У Ли есть \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) в своем рюкзаке, а также у него \(k\) друзей. Ли хочет распределить все целые числа из рюкзака между друзьями так, чтобы \(i\)-му другу досталось ровно \(w_i\) чисел и каждое число досталось ровно одному другу. Назовем уровнем счастья друга сумму максимального и минимального числа, которое он получит. Ли хочет сделать друзей как можно более счастливыми, другими словами, он хочет максимизировать суммарный уровень счастья друзей. Конечно же, Ли просит вас помочь ему посчитать этот максимальный суммарный уровень счастья. Выходные данные Для каждого набора входных данных выведите по одному числу — максимальный суммарный уровень счастья, который сможет достигнуть Ли. Примечание В первом наборе входных данных, Ли нужно отдать наибольшее число первому другу (его уровень счастья будет равен \(17 + 17\)) и остальные числа — второму (его уровень счастья будет равен \(13 + 1\)). В втором наборе, Ли нужно отдать \(\{10, 10, 11\}\) и первому и второму другу, тогда суммарный уровень счастья будет равен \((11 + 10) + (11 + 10)\) В третьем наборе, у Ли четыре друга и четыре числа. Не важно, как он распределит числа между ними.
| |
|
|
E. ВыживатеЛи
жадные алгоритмы
поиск в глубину и подобное
реализация
сортировки
Структуры данных
*2400
Ли приобрел некоторой еды на обед, но приглашать друзей Ли на обед смертельно опасно. Ли напуган, он не хочет умирать, хотя бы пока не увидит Online IOI 2020... Всего есть \(n\) различных видов еды и \(m\) лучших друзей Ли. У Ли есть \(w_i\) тарелок \(i\)-го вида еды, и у каждого друга Ли есть два любимых вида еды: любимые блюда \(i\)-го друга — это \(x_i\) и \(y_i\) (\(x_i \ne y_i\)). Ли начнет вызывать своих друзей по одному. Каждый, кого вызвали, пойдет на кухню и попытается съесть по одной тарелке каждого из его любимых видов еды. Каждый друг зайдет на кухню ровно один раз. Но проблема в следующем: если друг съест хотя бы одну тарелку еды (суммарно), то он станет абсолютно безвреден. Но если другу нечего есть (не осталось ни \(x_i\), ни \(y_i\)), то он съест самого Ли \(\times\_\times\). Ли может выбрать, в каком порядке приглашать друзей, а потому Ли хочет понять, может ли он пережить ужин или нет. Также его интересует непосредственно сам порядок. Выходные данные Если Ли может пережить обед, выведите ALIVE (регистр букв не важен), иначе выведите DEAD (регистр не важен). Также, если он может пережить обед, выведите порядок, в котором Ли следует вызывать друзей. Если существует несколько возможных порядков, выведите любой из них. Примечание В первом примере, любой из следующих порядков друзей будет корректным: \([1, 3, 2]\), \([3, 1, 2]\), \([2, 3, 1]\), \([3, 2, 1]\). Во втором примере, Ли следует вызвать второго друга первым (тогда он съест тарелку еды \(1\)), а потом и первого друга (этот друг съесть тарелку еды \(2\)). Если же Ли вызовет сначала первого друга, то он съесть по одной тарелке еды \(1\) и \(2\), а следовательно другому другу ничего не останется.
| |
|
|
C. История
сортировки
*1500
Поликарп очень любит учиться в школе и всегда добросовестно выполняет домашнее задание. У Поликарпа никогда не было проблем с естественно-научными дисциплинами, поскольку прапрапрадедом Поликарпа был великий физик Зейнштейн. Но вот с историей у Поликарпа всегда были проблемы. Всем известно, что в мировой истории произошло ровно n событий: i-ое событие продолжалось с ai по bi годы включительно (ai < bi). Поликарпу не составило никакого труда выучить даты начала и конца каждого из n событий истории (ему от прапрапрадеда генетически передалась также великолепная память). Но учитель дал задание не просто выучить даты начала и конца всех событий, а также выяснить для каждого события существует ли другое событие, включающее его. По мнению учителя Поликарпа событие j включает в себя событие i, если aj < ai и bi < bj. Ваша же задача проще: найдите количество событий, которые включены в какое-либо другое событие. Выходные данные Выведите единственное число — ответ на задачу. Примечание В первом примере пятое событие содержится в четвёртом. Аналогично четвёртое событие содержится в третьем, третье — во втором, а второе — в первом. Во втором примере все события (кроме первого) содержатся в первом. В третьем примере всего одно событие, поэтому ответ равен 0.
| |
|
|
E1. Астеризм (простая версия)
Бинарный поиск
Комбинаторика
математика
Перебор
сортировки
теория чисел
*1900
Это простая версия задачи. Различие между версиями заключается в ограничениях на \(n\) и \(a_i\). Вы можете делать взломы, только если обе версии этой задачи сданы. Сначала Aoi придумал следующую идею для задачи по программированию: Yuzu девочка, которая коллекционирует конфеты. Изначально, у нее есть \(x\) конфет. Также есть \(n\) врагов, пронумерованных целыми числами от \(1\) до \(n\). Враг \(i\) имеет \(a_i\) конфет. Yuzu хочет получить перестановку \(P\). Перестановкой называется массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\), расположенных в некотором порядке. Например, \(\{2,3,1,5,4\}\) это перестановка, а \(\{1,2,2\}\) это не перестановка (число \(2\) встречается в массиве дважды) и \(\{1,3,4\}\) тоже не является перестановкой (потому что \(n=3\), но в массиве есть число \(4\)). После этого, она проведет \(n\) дуэлей с врагами по следующим правилам: - Если Yuzu сейчас имеет не меньше конфет, чем враг \(P_i\), она побеждает в дуэли и получает \(1\) конфету. Иначе, она проигрывает дуэль и ничего не получает.
- Конфета, которую получает Yuzu в случае победы, будет использоваться в следующих дуэлях.
Yuzu хочет победить во всех дуэлях. Сколько существует возможных перестановок \(P\), для которых это произойдет? Эта задача была простой и неинтересной для Akari, друга Aoi. И Akari придумал следующую задачу, на основе описанной идеи: Давайте определим \(f(x)\) как количество возможных перестановок для целого числа \(x\). Вам дано число \(n\), массив \(a\) и простое число \(p \le n\). Назовем целое положительное число \(x\) хорошим, если значение \(f(x)\) не делится на \(p\). Найдите все хорошие числа \(x\). Решите задачу, предложенную Akari. Выходные данные В первой строке выведите количество хороших чисел \(x\). Во второй строке выведите все хорошие числа \(x\) в возрастающем порядке. Гарантируется, что количество хороших чисел \(x\) не превосходит \(10^5\). Примечание В первом тесте \(p=2\). - Если \(x \le 2\) тогда нет ни одной перестановки, подходящей для Yuzu. Поэтому \(f(x)=0\) для \(x \le 2\). Заметим, что \(0\) делится на \(2\), поэтому ни одно число \(x \leq 2\) не хорошее.
- Если \(x = 3\), то \(\{1,2,3\}\) единственная подходящая для Yuzu перестановка. Тогда, \(f(3)=1\), а значит число \(3\) хорошее.
- Если \(x = 4\), то \(\{1,2,3\} , \{1,3,2\} , \{2,1,3\} , \{2,3,1\}\) это все перестановки, подходящие для Yuzu. Тогда, \(f(4)=4\), значит число \(4\) не хорошее.
- Если \(x \ge 5\) , все \(6\) перестановок подходят Yuzu. Тогда, \(f(x)=6\) для всех \(x \ge 5\). Значит ни одно число \(x \ge 5\) не хорошее.
Значит единственное хорошее число это \(3\). В третьем тесте для всех целых положительных \(x\) значение \(f(x)\) делится на \(p = 3\).
| |
|
|
E2. Астеризм (сложная версия)
Бинарный поиск
дп
Комбинаторика
математика
сортировки
теория чисел
*2300
Это сложная версия задачи. Различие между версиями заключается в ограничениях на \(n\) и \(a_i\). Вы можете делать взломы, только если обе версии этой задачи сданы. Сначала Aoi придумал следующую идею для задачи по программированию: Yuzu девочка, которая коллекционирует конфеты. Изначально, у нее есть \(x\) конфет. Также есть \(n\) врагов, пронумерованных целыми числами от \(1\) до \(n\). Враг \(i\) имеет \(a_i\) конфет. Yuzu хочет получить перестановку \(P\). Перестановкой называется массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\), расположенных в некотором порядке. Например, \(\{2,3,1,5,4\}\) это перестановка, а \(\{1,2,2\}\) это не перестановка (число \(2\) встречается в массиве дважды) и \(\{1,3,4\}\) тоже не является перестановкой (потому что \(n=3\), но в массиве есть число \(4\)). После этого, она проведет \(n\) дуэлей с врагами по следующим правилам: - Если Yuzu сейчас имеет не меньше конфет, чем враг \(P_i\), она побеждает в дуэли и получает \(1\) конфету. Иначе, она проигрывает дуэль и ничего не получает.
- Конфета, которую получает Yuzu в случае победы, будет использоваться в следующих дуэлях.
Yuzu хочет победить во всех дуэлях. Сколько существует возможных перестановок \(P\), для которых это произойдет? Эта задача была простой и неинтересной для Akari, друга Aoi. И Akari придумал следующую задачу, на основе описанной идеи: Давайте определим \(f(x)\) как количество возможных перестановок для целого числа \(x\). Вам дано число \(n\), массив \(a\) и простое число \(p \le n\). Назовем целое положительное число \(x\) хорошим, если значение \(f(x)\) не делится на \(p\). Найдите все хорошие числа \(x\). Решите задачу, предложенную Akari. Выходные данные В первой строке выведите количество хороших чисел \(x\). Во второй строке выведите все хорошие числа \(x\) в возрастающем порядке. Гарантируется, что количество хороших чисел \(x\) не превосходит \(10^5\). Примечание В первом тесте \(p=2\). - Если \(x \le 2\) тогда нет ни одной перестановки, подходящей для Yuzu. Поэтому \(f(x)=0\) для \(x \le 2\). Заметим, что \(0\) делится на \(2\), поэтому ни одно число \(x \leq 2\) не хорошее.
- Если \(x = 3\), то \(\{1,2,3\}\) единственная подходящая для Yuzu перестановка. Тогда, \(f(3)=1\), а значит число \(3\) хорошее.
- Если \(x = 4\), то \(\{1,2,3\} , \{1,3,2\} , \{2,1,3\} , \{2,3,1\}\) это все перестановки, подходящие для Yuzu. Тогда, \(f(4)=4\), значит число \(4\) не хорошее.
- Если \(x \ge 5\) , все \(6\) перестановок подходят Yuzu. Тогда, \(f(x)=6\) для всех \(x \ge 5\). Значит ни одно число \(x \ge 5\) не хорошее.
Значит единственное хорошее число это \(3\). В третьем тесте для всех целых положительных \(x\) значение \(f(x)\) делится на \(p = 3\).
| |
|
|
D. Массив с нулевым остатком
математика
сортировки
*1400
Вам задан массив \(a\), состоящий из \(n\) положительных целых чисел. Изначально у вас есть целое число \(x = 0\). За один ход вы можете совершить одну из следующих двух операций: - Выбрать ровно один индекс \(i\) от \(1\) до \(n\) и увеличить \(a_i\) на \(x\) (\(a_i := a_i + x\)), затем увеличить \(x\) на \(1\) (\(x := x + 1\)).
- Просто увеличить \(x\) на \(1\) (\(x := x + 1\)).
Первая операция может быть применена не более одного раза для каждого \(i\) от \(1\) до \(n\). Ваша задача — найти минимальное количество ходов, необходимое, чтобы получить такой массив, что каждый его элемент без остатка делится на \(k\) (значение \(k\) задано). Вам нужно ответить на \(t\) независимых наборов тестовых данных. Выходные данные Для каждого набора тестовых данных выведите ответ на него — минимальное количество ходов, необходимое, чтобы получить такой массив, что каждый его элемент без остатка делится на \(k\). Примечание Рассмотрим первый набор тестовых данных примера: - \(x=0\), \(a = [1, 2, 1, 3]\). Надо просто увеличить \(x\);
- \(x=1\), \(a = [1, 2, 1, 3]\). Надо добавить \(x\) ко второму элементу и увеличить \(x\);
- \(x=2\), \(a = [1, 3, 1, 3]\). Надо добавить \(x\) к третьему элементу и увеличить \(x\);
- \(x=3\), \(a = [1, 3, 3, 3]\). Надо добавить \(x\) к четвертому элементу и увеличить \(x\);
- \(x=4\), \(a = [1, 3, 3, 6]\). Надо просто увеличить \(x\);
- \(x=5\), \(a = [1, 3, 3, 6]\). Надо добавить \(x\) к первому элементу и увеличить \(x\);
- \(x=6\), \(a = [6, 3, 3, 6]\). Мы получили необходимый массив.
Заметьте, что вы не можете добавить \(x\) к одному и тому же элементу больше, чем один раз.
| |
|
|
E1. Чтение книг (простая версия)
жадные алгоритмы
сортировки
Структуры данных
*1600
Простая и сложная версии на самом деле являются разными задачами, поэтому прочитайте условия обеих задач полностью и внимательно. Летние каникулы начались, поэтому Алиса и Боб хотят играть и веселиться, но... Их мама не согласна с этим. Она говорит, что они должны прочитать какое-то количество книг перед всеми развлечениями. Алиса и Боб прочитают каждую книгу вместе, чтобы быстрее закончить это задание. В семейной библиотеке есть \(n\) книг. \(i\)-я книга характеризуется тремя целыми числами: \(t_i\) — количество времени, которое Алиса и Боб должны потратить, чтобы прочитать ее, \(a_i\) (равное \(1\), если Алисе нравится \(i\)-я книга, и \(0\), если не нравится), и \(b_i\) (равное \(1\), если Бобу нравится \(i\)-я книга, и \(0\), если не нравится). Поэтому им нужно выбрать какие-то книги из имеющихся \(n\) книг таким образом, что: - Алисе нравятся не менее \(k\) книг из выбранного множества и Бобу нравятся не менее \(k\) книг из выбранного множества;
- общее время, затраченное на прочтение этих книг минимизировано (ведь они дети и хотят начать играть и веселиться как можно скорее).
Множество, которое они выбирают, одинаковое и для Алисы и для Боба (они читают одни и те же книги), и они читают все книги вместе, таким образом, суммарное время чтения равно сумме \(t_i\) по всем книгам, которые находятся в выбранном множестве. Ваша задача — помочь им и найти любое подходящее множество книг или определить, что такое множество найти невозможно. Выходные данные Если подходящего решения не существует, выведите число -1. Иначе выведите целое число \(T\) — минимальное суммарное время, необходимое для прочтения подходящего множества книг.
| |
|
|
E2. Чтение книг (сложная версия)
жадные алгоритмы
реализация
сортировки
Структуры данных
Тернарный поиск
*2500
Простая и сложная версии на самом деле являются разными задачами, поэтому прочитайте условия обеих задач полностью и внимательно. Летние каникулы начались, поэтому Алиса и Боб хотят играть и веселиться, но... Их мама не согласна с этим. Она говорит, что они должны прочитать ровно \(m\) книг перед всеми развлечениями. Алиса и Боб прочитают каждую книгу вместе, чтобы быстрее закончить это задание. В семейной библиотеке есть \(n\) книг. \(i\)-я книга характеризуется тремя целыми числами: \(t_i\) — количество времени, которое Алиса и Боб должны потратить, чтобы прочитать ее, \(a_i\) (равное \(1\), если Алисе нравится \(i\)-я книга, и \(0\), если не нравится), и \(b_i\) (равное \(1\), если Бобу нравится \(i\)-я книга, и \(0\), если не нравится). Поэтому им нужно выбрать ровно \(m\) книг из имеющихся \(n\) книг таким образом, что: - Алисе нравятся не менее \(k\) книг из выбранного множества и Бобу нравятся не менее \(k\) книг из выбранного множества;
- общее время, затраченное на прочтение этих \(m\) книг минимизировано (ведь они дети и хотят начать играть и веселиться как можно скорее).
Множество, которое они выбирают, одинаковое и для Алисы и для Боба (они читают одни и те же книги), и они читают все книги вместе, таким образом, суммарное время чтения равно сумме \(t_i\) по всем книгам, которые находятся в выбранном множестве. Ваша задача — помочь им и найти любое подходящее множество книг или определить, что такое множество найти невозможно. Выходные данные Если подходящего решения не существует, выведите целое число -1. Если решение существует, выведите \(T\) первой строкой — минимальное суммарное время, необходимое для прочтения подходящего множества книг. Второй строкой выведите \(m\) различных целых чисел от \(1\) до \(n\) в любом порядке — индексы книг, включенных в выбранное вами множество. Если существует несколько подходящих ответов, вы можете вывести любой из них.
| |
|
|
F. Сортировка циклическими сдвигами
Конструктив
Перебор
реализация
сортировки
*2400
Вам задан массив \(a\), состоящий из \(n\) целых чисел. За один ход вы можете выбрать некоторый индекс \(i\) (\(1 \le i \le n - 2\)) и сдвинуть отрезок \([a_i, a_{i + 1}, a_{i + 2}]\) циклически вправо (т.е. заменить отрезок \([a_i, a_{i + 1}, a_{i + 2}]\) на \([a_{i + 2}, a_i, a_{i + 1}]\)). Ваша задача — отсортировать заданный массив за не более чем \(n^2\) таких операций или сказать, что это невозможно. Вам нужно ответить на \(t\) независимых наборов тестовых данных. Выходные данные Для каждого набора тестовых данных выведите ответ: -1 единственной строкой, если невозможно отсортировать заданный массив, используя операции, описанные в условии задачи, или количество операций \(ans\) первой строкой и \(ans\) целых чисел \(idx_1, idx_2, \dots, idx_{ans}\) (\(1 \le idx_i \le n - 2\)), где \(idx_i\) — индекс левой границы отрезка для \(i\)-й операции. Вы должны вывести индексы в порядке применения операций.
| |
|
|
D. Заменить на MEX
Конструктив
Перебор
сортировки
*1900
Вам дан массив из \(n\) целых чисел от \(0\) до \(n\) включительно. За одну операцию вы можете выбрать любой элемент массива и заменить его на MEX всех элементов массива (этот MEX может измениться после операции). Например, если текущий массив равен \([0, 2, 2, 1, 4]\), то вы можете выбрать второй элемент и заменить его на MEX существующих элементов — \(3\). Массив станет равным \([0, 3, 2, 1, 4]\). Вы должны сделать массив неубывающим, используя не более \(2n\) операций. Можно показать, что это всегда возможно. Обратите внимание, что вы не должны минимизировать количество операций. Если есть много решений, вы можете найти любое из них. – Напомним, что массив \(b[1 \ldots n]\) является неубывающим тогда и только тогда, когда \(b_1 \le b_2 \le \ldots \le b_n\). Напомним, что MEX массива равен наименьшему неотрицательному целому числу, которое не принадлежит массиву. Например: - MEX для \([2, 2, 1]\) равен \(0\), поскольку \(0\) не принадлежит массиву.
- MEX для \([3, 1, 0, 1]\) равен \(2\), поскольку \(0\) и \(1\) принадлежат массиву, а \(2\) — нет.
- MEX для \([0, 3, 1, 2]\) равен \(4\), поскольку \(0\), \(1\), \(2\) и \(3\) принадлежат массиву, а \(4\) — нет.
Стоит отметить, что MEX массива длины \(n\) всегда находится между \(0\) и \(n\) включительно. Выходные данные Для каждого набора входных данных вы должны вывести две строки: Первая строка должна содержать одно целое число \(k\) (\(0 \le k \le 2n\)) — количество операций, которые вы выполняете. Вторая строка должна содержать \(k\) целых чисел \(x_1, \ldots, x_k\) (\(1 \le x_i \le n\)), где \(x_i\) — индекс элемента, с котором вы выполняете операцию \(i\). Если есть много решений, вы можете найти любое из них. Пожалуйста, помните, что минимизировать \(k\) не требуется. Примечание В первом наборе входных данных массив уже не убывает (\(2 \le 2 \le 3\)). Объяснение второго набора входных данных (элемент, изменяемый каждой операцией, окрашен красным): - \(a = [2, 1, 0]\) ; начальный MEX равен \(3\).
- \(a = [2, 1, \color{red}{3}]\) ; новый MEX равен \(0\).
- \(a = [\color{red}{0}, 1, 3]\) ; новый MEX равен \(2\).
- Итоговый массив неубывающий: \(0 \le 1 \le 3\).
Объяснение третьего набора входных данных: - \(a = [0, 7, 3, 1, 3, 7, 7]\) ; начальный MEX равен \(2\).
- \(a = [0, \color{red}{2}, 3, 1, 3, 7, 7]\) ; новый MEX равен \(4\).
- \(a = [0, 2, 3, 1, \color{red}{4}, 7, 7]\) ; новый MEX равен \(5\).
- \(a = [0, 2, 3, 1, \color{red}{5}, 7, 7]\) ; новый MEX равен \(4\).
- \(a = [0, 2, 3, \color{red}{4}, 5, 7, 7]\) ; новый MEX равен \(1\).
- Итоговый массив неубывающий: \(0 \le 2 \le 3 \le 4 \le 5 \le 7 \le 7\).
| |
|
|
E. Сортировка инверсиями
жадные алгоритмы
Конструктив
сортировки
*2500
У Madeline есть массив \(a\) состоящий из \(n\) целых чисел. Пара \((u, v)\) образует инверсию в массиве \(a\) если - \(1 \le u < v \le n\).
- \(a_u > a_v\).
Madeline только что обнаружила магический листочек, который позволяет ей написать два индекса \(u\) и \(v\) и поменять местами значения \(a_u\) и \(a_v\). Будучи скучающим, она решила написать список пар \((u_i, v_i)\) со следующими условиями: - Все пары в списке различны и каждая из них является инверсией в массиве \(a\).
- Все пары которые образуют инверсию в массиве \(a\) присутствуют в списке.
- Начиная с данного массива, если поменять местами числа стоящие в позициях \(u_1\) и \(v_1\), потом числа стоящие в позициях \(u_2\) и \(v_2\), и так далее, то после всех этих операций массив \(a\) будет отсортирован в порядке неубывания.
Создайте такой список или скажите что сделать это невозможно. Если есть несколько решений, вы можете найти любое из них. Выходные данные Выведите -1 если нет подходящего списка. В противном случае выведите \(m\) (\(0 \le m \le \dfrac{n(n-1)}{2}\)) — количество пар в списке. \(i\)-я из следующих \(m\) строк должна состоять из двух целых чисел \(u_i, v_i\) (\(1 \le u_i < v_i\le n\)). Если есть несколько решений, вы можете найти любое из них. Примечание В первом примере массив будет изменен следующим образом \([3,1,2] \rightarrow [2,1,3] \rightarrow [1,2,3]\). Во втором примере \([1,8,1,6] \rightarrow [1,6,1,8] \rightarrow [1,1,6,8]\). В третем примере массив уже отсортирован.
| |
|
|
C. Выбор цветов для букета
Бинарный поиск
дп
жадные алгоритмы
Перебор
поиск в глубину и подобное
сортировки
Структуры данных
*2000
Володя хочет красиво поздравить свою жену с годовщиной их свадьбы и собирается подарить ей букет из ровно \(n\) цветов. Придя в цветочный магазин, Володя обнаружил, что букет можно составлять из цветов \(m\) различных видов, причём количество цветов каждого вида не ограничено. Володя знает, что от первого цветка \(i\)-го вида в букете его супруга становится счастливее на \(a_i\), а от каждого следующего цветка такого вида она становится счастливее на \(b_i\). То есть, если в букете \(x_i > 0\) цветов вида \(i\), то за цветы этого вида жена Володи становится счастливее на \(a_i + (x_i - 1) \cdot b_i\) (а в случае, если цветов типа \(i\) в букете не будет, счастье жены Володи из-за цветов этого типа не изменится). Как любой любящий муж, Володя хочет как можно сильнее порадовать свою супругу. Поэтому ему хочется знать, на какую максимальную величину может увеличиться её счастье от букета из \(n\) цветов, набранного из доступных в магазине цветов. Выходные данные Для каждого набора входных данных в единственной строке выведите одно число — максимальное увеличение счастья, которое может получить жена Володи от букета из \(n\) цветов. Примечание В первом примере если взять 1 цветок первого типа и 3 цветка второго типа, то итоговое увеличение счастья от букета будет равно \(5 + (1 + 2 \cdot 4) = 14\). В втором примере если взять 2 цветка первого типа, 2 цветка второго типа и 1 цветок третьего типа, то итоговое увеличение счастья от букета будет равно \((5 + 1 \cdot 2) + (4 + 1 \cdot 2) + 3 = 16\).
| |
|
|
D. Новые электрички
Бинарный поиск
Перебор
сортировки
Структуры данных
*2300
Каждый день на планете Кирнес курсирует множество поездов. День на этой планете состоит из \(h\) часов. Каждый час состоит из \(m\) минут, причём \(m\) обязательно чётное. Известно, что на данный момент \(n\) товарных поездов ежедневно отправляются с вокзала: \(i\)-й товарный поезд отправляется каждый день в \(h_i\) часов и \(m_i\) минут. Правительство планеты решило запустить пассажирское сообщение. Было решено пустить ровно по две электрички каждый час. Это означает, что первая за день электричка отправится с вокзала в \(0\) часов и \(t\) минут, причем \(0 \le t < {m \over 2}\), вторая электричка отправится через \(m \over 2\) минут после этого и так далее. Для безопасной посадки пассажиров электричка должна прибыть на вокзал за \(k\) минут до отправления. В то время, как пассажиры садятся в электричку, никакой товарный поезд не должен отправляться с вокзала, однако товарный поезд может отправиться в момент начала посадки на электричку и в момент её отправления. Обратите внимание, что если электричка отправляется в \(0\) часов \(t\) минут и \(t < k\), то платформа вокзала будет занята последние \(k - t\) минут предыдущего дня. Схематичный пример корректного способа запустить электрички. Здесь \(h=2\) (следовательно, количество электричек равно \(2h=4\)), количество поездов \(n=6\). Электрички обозначены красным цветом (обратите внимание, что промежутки между ними одинаковы). Поезда обозначены синим цветом. Отрезки времени длины \(k\) до каждой электрички выделены красным. Обратите внимание, что внутри этих отрезков нет поездов. Разумеется, не всегда можно составить корректное расписание электричек вместе со всеми товарными поездами. Тогда необходимо отменить некоторые товарные поезда, чтобы появилась возможность пустить электрички с соблюдением всех транспортных норм. Найдите такое время \(t\) для запуска первой электрички, чтобы количество товарных поездов, которые потребуется отменить, было минимальным. Выходные данные Выведите два числа: минимальное количество отменённых товарных поездов и \(t\) — время запуска первой за день электрички в минутах. Во второй строке через пробел выведите номера отменяемых товарных поездов. Примечание В первом примере первую электричку надо отправить в 0:00. Тогда поезд в 16:00 отправится сразу после электрички, а электричку в 17:30 надо будет подать на платформу сразу после отправления товарного поезда в 17:15. Во втором примере подать электричку на платформу надо за 16 минут до отправления. Сделать это без отмены какого-то товарного поезда не получится: если отправлять электричку в \(t \in [1, 15]\), то в 16:00 электричка уже должна быть на платформе, а с нее в это время отправляется первый товарный поезд. Если \(t = 0\) или \(t \in [16, 29]\), то второй товарный поезд в 17:15 не сможет уехать с платформы, потому что на ней уже будет стоять следующая электричка. Если отменить второй поезд, то можно выбрать \(t = 0\), тогда поезда будут отправляться в 0 и 30 минут каждый час, а столкновения с первым товарным поездом не будет. Также можно отменить только первый поезд и выбрать, например, \(t = 13\).
| |
|
|
C. Грибные гномы - 2
Бинарный поиск
сортировки
Структуры данных
Теория вероятностей
*2200
Гуляя как-то раз по лесу, Наташа встретила маленького грибного гномика. Гномик рассказал ей следующую историю: Как известно, сила грибных гномов заключена в волшебных грибах, которые растут в их родном лесу. В этом лесу растет n деревьев и m волшебных грибов: i-ое дерево растет в точке на прямой с координатой ai и имеет высоту hi, j-ый гриб растет в точке с координатой bj и имеет волшебную силу zj. Но однажды заклятые враги грибных гномов — дикие грибожуи — наслали на их родной лес ужасный шторм, в результате которого некоторые деревья начали падать и давить волшебные грибы. Верховный оракул грибных гномов заранее посчитал для каждого дерева вероятность того, что дерево упадет влево, вправо или останется стоять. Если дерево с координатой x и высотой h падает влево, то все грибы, попадающие в полуинтервал [x - h, x), погибают; если дерево падает вправо, погибают грибы в полуинтервале (x, x + h]. Выживают лишь те грибы, на которые не упадет ни одного дерева. Зная, что все деревья падают независимо друг от друга (т.е. всевозможные события относительно различных деревьев взаимно независимы, и, кроме того, деревья никак не мешают другим деревьям падать в произвольном направлении), верховный оракул также смог быстро посчитать, каково будет матожидание суммарной силы выживших после шторма грибов, что в итоге спасло грибных гномов от неминуемой гибели. Наташу, как неплохого олимпиадного программиста, заинтересовала эта история, и она решила придумать, как же можно быстро посчитать матожидание суммы сил выживших грибов. Выходные данные Выведите одно вещественное число — матожидание суммарной волшебной силы выживших грибов. Ответ принимается с относительной или абсолютной точностью 10 - 4. Примечание Считается, что гриб с координатой x попадает в полуинтервал [l, r) тогда и только тогда, когда l ≤ x < r. Аналогично, гриб с координатой x попадает в полуинтервал (l, r] тогда и только тогда, когда l < x ≤ r. В первом тесте гриб выживает с вероятностью 50% в зависимости от того, куда упадет единственное дерево. Во втором тесте гриб выживает только тогда, когда на него не упадет ни одно из двух деревьев, что происходит с вероятностью 50% × 50% = 25%. Претест №12 — большой тест с 105 деревьями и одним грибом.
| |
|
|
C. Собери команды
дп
жадные алгоритмы
Перебор
реализация
сортировки
*1400
У вас есть \(n\) программистов, которых вы хотите распределить по командам. Навык \(i\)-го программиста равен \(a_i\). Вы хотите собрать из них максимальное количество команд. Для команд есть одно ограничение: количество программистов в команде, умноженное на минимальный навык среди всех программистов этой команды, должно быть как минимум \(x\). Каждый программист может находиться максимум в одной команде. Некоторые программисты могут остаться без команды. Посчитайте максимальное количество команд, которое вы можете собрать. Выходные данные На каждый набор входных данных выведите одно число — максимальное количество команд, которое вы можете собрать.
| |
|
|
C. Гениальный шифр
жадные алгоритмы
Конструктив
Паросочетания
реализация
сортировки
*2500
В игре «Гениальный шифр» есть два игрока — Алиса и Боб. У Алисы есть секретный код, который Боб хочет отгадать. Код определяется последовательностью из \(n\) цветов. Всего существует \(n+1\) цвет, они пронумерованы целыми числами от \(1\) до \(n+1\). После того как Боб сделал свою догадку, Алиса говорит ему некоторую информацию о том, насколько его код правильный, в виде двух целых чисел \(x\) и \(y\). Первое число \(x\) равно количеству индексов, в которых цвет кода Боба совпал с правильным цветом в коде Алисы. Второе число \(y\) равно размеру пересечения двух кодов, как мультимножеств. Другими словами, если Боб может поменять порядок цветов в его догадке, \(y\) равно максимальному количеству правильных индексов, которое он сможет получить. Например, допустим \(n=5\), код Алисы будет \([3,1,6,1,2]\) и догадка Боба будет \([3,1,1,2,5]\). В позициях \(1\) и \(2\) цвета совпали, тогда как в других позициях нет. Поэтому \(x=2\). И два кода имеют четыре общих цвета \(1,1,2,3\), поэтому \(y=4\). Обычные линии обозначают совпадающие цвета на одинаковых позициях. Пунктирные линии обозначают одинаковые цвета на разных позициях. Тогда \(x\) равно количеству обычных линий и \(y\) равно количеству всех линий. Вам дан код-догадка Боба и два значения \(x\) и \(y\). Можете ли вы найти какой-то возможный загаданный код Алисы, такой что числа \(x\) и \(y\) будут правильными? Выходные данные Для каждого набора входных данных в первой строке выведите «YES», если существует решение или «NO», если не существует ни одного секретного кода Алисы, соответствующего данной ситуации. Вы можете вывести каждый символ в любом регистре (верхнем или нижнем). Если ответ «YES», на следующей строке выведите \(n\) целых чисел \(a_1,\ldots,a_n\) (\(1\le a_i\le n+1\)) — секретный код Алисы, где \(a_i\) равно \(i\)-у цвету этого кода. Если существует несколько возможных решений, выведите любое. Примечание Первый набор входных данных описан в условии. Во втором наборе в входных данных \(x=3\), потому что цвета совпадают на позициях \(2,4,5\). И \(y=4\), потому что цвета \(1,1,1,2\) общие у двух кодов. В третьем наборе входных данных \(x=0\), потому что цвета не совпадают ни в одной из позиций. Но \(y=4\), потому что цвета \(3,3,5,5\) общие у двух кодов. В четвертом наборе входных данных можно показать что ни одного подходящего секретного кода Алисы не существует.
| |
|
|
E. Оригами
геометрия
математика
сортировки
*3300
После того, как вы получили 13 вердиктов time-limit-exceeded по ужасной геометрической задаче, вы решили сделать расслабляющий перерыв и позаниматься оригами. Есть лист бумаги в форме простого многоугольника с \(n\) вершинами. Многоугольник может быть невыпуклым, но мы все знаем, что настоящий лист бумаги для оригами имеет свойство, что любая горизонтальная прямая пересекает границу многоугольника не больше, чем в двух точках. Если вы согнете лист бумаги вдоль вертикальной прямой \(x=f\), какой будет площать полученной фигуры? Когда вы сгибаете лист, часть бумаги слева от прямой симметрично отражается с правой стороны. Ваша задача ответить на \(q\) независимых запросов для значений \(f_1,\ldots,f_q\). Выходные данные Для каждого запроса выведите площадь \(A_i\) бумаги, которая будет, если согнуть лист бумаги вдоль прямой \(x=f_i\). Ваш ответ будет считаться правильным, если его абсолютная или относительная погрешность не превосходит \(10^{-4}\). Формально, пусть ваш ответ будет \(a\), а ответ жюри будет \(b\). Ваш ответ будет принят тогда и только тогда, когда \(\frac{|a - b|}{\max{(1, |b|)}} \le 10^{-4}\). Примечание В первом тесте, если сделать сгиб в \(f=-5\): Во втором тесте, если сделать сгиб в \(f=1\): В третьем тесте, если сделать сгиб в \(f=-1\):
| |
|
|
A. Трансформация строки 1
графы
Деревья
жадные алгоритмы
снм
сортировки
Строки
*1700
Обратите внимание, что единственная разница между Трансформация строки 1 и Трансформация строки 2 заключается в операции, которую делает Коа. В этой версии буква \(y\), которую выбирает Koa, должна быть строго больше по алфавиту, чем \(x\) (для лучшего понимания прочитайте условие). Вы можете делать взломы по этим задачам независимо. У Коалы Коа есть две строки \(A\) и \(B\) одинаковой длины \(n\) (\(|A|=|B|=n\)), состоящие из первых \(20\) строчных букв английского алфавита (то есть от a до t). В один ход Коа: - выбирает некоторое подмножество позиций \(p_1, p_2, \ldots, p_k\) (\(k \ge 1; 1 \le p_i \le n; p_i \neq p_j\) если \(i \neq j\)) из \(A\), такое что \(A_{p_1} = A_{p_2} = \ldots = A_{p_k} = x\) (т. е. все буквы на этой позиции равны некоторой букве \(x\)).
- выбирает букву \(y\) (из первых \(20\) строчных букв английского алфавита) такую, что \(y>x\) (т. е. буква \(y\) в алфавитном порядке строго больше, чем \(x\)).
- делает все буквы в позициях \(p_1, p_2, \ldots, p_k\) равными \(y\). Более формально: для каждого \(i\) (\(1 \le i \le k\)) Коа устанавливает \(A_{p_i} = y\).
Обратите внимание, что вы можете изменять только буквы в строке \(A\).
Коа хочет знать наименьшее число ходов, которые она должна сделать, чтобы сделать строки равными друг другу (\(A = B\)) или определить, что нет никакого способа сделать их равными. Помогите ей! Выходные данные Для каждого набора входных данных: Выведите в единственной строке минимальное количество ходов, которое Koa должна сделать, чтобы строки стали равны друг другу (\(A = B\)) или \(-1\), если нет никакого способа сделать их равными. Примечание - В \(1\)-м наборе входных данных Коа:
- выбирает позиции \(1\) и \(2\) и устанавливает \(A_1 = A_2 = \) b (\(\color{red}{aa}b \rightarrow \color{blue}{bb}b\)).
- выбирает позиции \(2\) b \(3\) и устанавливает \(A_2 = A_3 = \) c (\(b\color{red}{bb} \rightarrow b\color{blue}{cc}\)).
- Во \(2\)-м наборе входных данных Коа не может сделать строку \(A\) равной строке \(B\).
- В \(3\)-м наборе входных данных Коа:
- выбирает позицию \(1\) и устанавливает \(A_1 = \) t (\(\color{red}{a}bc \rightarrow \color{blue}{t}bc\)).
- выбирает позицию \(2\) и устанавливает \(A_2 = \) s (\(t\color{red}{b}c \rightarrow t\color{blue}{s}c\)).
- выбирает позицию \(3\) и устанавливает \(A_3 = \) r (\(ts\color{red}{c} \rightarrow ts\color{blue}{r}\)).
| |
|
|
D. Переставьте
графы
жадные алгоритмы
Конструктив
Перебор
сортировки
*2800
Коала Коа имеет матрицу \(A\) из \(n\) строк и \(m\) столбцов. Элементы этой матрицы — различные целые числа от \(1\) до \(n \cdot m\) (каждое число от \(1\) до \(n \cdot m\) встречается в матрице ровно один раз). Для любой матрицы \(M\) из \(n\) строк и \(m\) столбцов определим следующее: - \(i\)-я строка \(M\) определяется как \(R_i(M) = [ M_{i1}, M_{i2}, \ldots, M_{im} ]\) для всех \(i\) (\(1 \le i \le n\)).
- \(j\)-й столбец \(M\) определяется как \(C_j(M) = [ M_{1j}, M_{2j}, \ldots, M_{nj} ]\) для всех \(j\) (\(1 \le j \le m\)).
Коа определяет \(S(A) = (X, Y)\) как спектр \(A\), где \(X\) — множество максимумов в строках \(A\), а \(Y\) — множество максимумов в столбцах \(A\) соответственно. Более формально: - \(X = \{ \max(R_1(A)), \max(R_2(A)), \ldots, \max(R_n(A)) \}\)
- \(Y = \{ \max(C_1(A)), \max(C_2(A)), \ldots, \max(C_m(A)) \}\)
Коа просит вас найти некоторую матрицу \(A'\) из \(n\) строк и \(m\) столбцов такую, чтобы каждое число от \(1\) до \(n \cdot m\) встречалось в матрице ровно один раз, и выполнялись следующие условия: - \(S(A') = S(A)\)
- \(R_i(A')\) является битоническим для всех \(i\) (\(1 \le i \le n\))
- \(C_j(A')\) является битоническим для всех \(j\) (\(1 \le j \le m\)).
Массив \(t\) ( \(t_1, t_2, \ldots, t_k\)) называется битоническим, если он сначала возрастает, а затем спадает. Более формально: \(t\) является битоническим, если существует некоторая позиция \(p\) (\(1 \le p \le k\)) такая, что: \(t_1 < t_2 < \ldots < t_p > t_{p+1} > \ldots > t_k\). Помогите Коа найти такую матрицу, или определить, что ее не существует. Выходные данные Если такой матрицы не существует, в отдельной строке выведите \(-1\). В противном случае вы должны вывести \(n\) строк, каждая из которых должная состоять из \(m\) целых чисел, разделенных пробелом — описание \(A'\). \(j\)-е число в \(i\)-й строке обозначает элемент \(A'_{ij}\). Каждое число от \(1\) до \(n \cdot m\) должно встречаться в \(A'\) ровно один раз, каждая строка и столбец в \(A'\) должны быть битоническими и должно выполняться \(S(A) = S(A')\). Если ответов несколько, выведите любой. Примечание Проанализируем первый пример: Для матрицы \(A\): - Строки:
- \(R_1(A) = [3, 5, 6]; \max(R_1(A)) = 6\)
- \(R_2(A) = [1, 7, 9]; \max(R_2(A)) = 9\)
- \(R_3(A) = [4, 8, 2]; \max(R_3(A)) = 8\)
- Столбцы:
- \(C_1(A) = [3, 1, 4]; \max(C_1(A)) = 4\)
- \(C_2(A) = [5, 7, 8]; \max(C_2(A)) = 8\)
- \(C_3(A) = [6, 9, 2]; \max(C_3(A)) = 9\)
- \(X = \{ \max(R_1(A)), \max(R_2(A)), \max(R_3(A)) \} = \{ 6, 9, 8 \}\)
- \(Y = \{ \max(C_1(A)), \max(C_2(A)), \max(C_3(A)) \} = \{ 4, 8, 9 \}\)
- Поэтому \(S(A) = (X, Y) = (\{ 6, 9, 8 \}, \{ 4, 8, 9 \})\)
Для матрицы \(A'\): - Строки:
- \(R_1(A') = [9, 5, 1]; \max(R_1(A')) = 9\)
- \(R_2(A') = [7, 8, 2]; \max(R_2(A')) = 8\)
- \(R_3(A') = [3, 6, 4]; \max(R_3(A')) = 6\)
- Столбцы:
- \(C_1(A') = [9, 7, 3]; \max(C_1(A')) = 9\)
- \(C_2(A') = [5, 8, 6]; \max(C_2(A')) = 8\)
- \(C_3(A') = [1, 2, 4]; \max(C_3(A')) = 4\)
- Заметим, что каждый из этих массивов является битоническим.
- \(X = \{ \max(R_1(A')), \max(R_2(A')), \max(R_3(A')) \} = \{ 9, 8, 6 \}\)
- \(Y = \{ \max(C_1(A')), \max(C_2(A')), \max(C_3(A')) \} = \{ 9, 8, 4 \}\)
- Поэтому \(S(A') = (X, Y) = (\{ 9, 8, 6 \}, \{ 9, 8, 4 \})\)
| |
|
|
B. Смесь
*особая задача
геометрия
математика
сортировки
Структуры данных
*2900
Серж, шеф-повар знаменитого ресторана «Соль, Перец & Чеснок» пытается получить свою первую звезду Мишлен. Его уведомили, что сегодня вечером его ресторан посетит секретный эксперт. Несмотря на то, что имя эксперта не разглашено, Серж знает его вкусовые предпочтения, а также, какое блюдо он закажет. Кроме прочего, он знает, что эксперту нравится исключительно точная пропорция соли, перца и чеснока в его блюде. Серж хранит у себя несколько бутылок со смесями соли, перца и чесночного порошка на особой полке на кухне. Он знает точное количество каждого ингредиента в каждой бутылке в килограммах. Серж может использовать любое количество бутылок смесей (или ровно одну из них напрямую), чтобы получить смесь нужных пропорций для своего блюда. К счастью, количество смеси, которой нужно добавить к блюду, настолько мало, что количества смеси в каждой бутылке всегда будет достаточно. Однако, числа, описывающие пропорции, могут быть весьма большими. Серж хочет узнать, возможно ли получить любимую смесь эксперта из доступных бутылок, и если да — чему равняется наименьшее количество бутылок, нужных для этого. Более того, множество бутылок на полке может меняться со временем, так как Серж получает новые бутылки и одалживает свои другим поварам. Поэтому он хотел бы узнать ответ на свой вопрос после каждого такого изменения. Например, допустим, что любимая смесь эксперта является \(1:1:1\) и на полке находятся три бутылки со смесями: \(\) \begin{array}{cccc} \hline \text{Mixture} & \text{Соль} & \text{Перец } & \text{Чесночный порошок} \\ \hline 1 & 10 & 20 & 30 \\ 2 & 300 & 200 & 100 \\ 3 & 12 & 15 & 27 \\ \hline \end{array} \(\) Количество ингредиента в бутылке, кг Чтобы получить нужную смесь, достаточно использовать одинаковое количество смесей из бутылок 1 и 2. Если бутылка 2 отсутствует, то больше нет возможности получить нужную смесь. Напишите программу, которая поможет Сержу решить эту задачу! Выходные данные Выведите \(N\) строк. В \(j\)-й строке (\(1 \leq j \leq N\)) выведите число \(x_j\), наименьшее количество бутылок, которое нужно использовать для приготовления любимой смеси эксперта с нужной пропорцией соли, перца и чесночного порошка, при условии, что на полке доступны только бутылки после первых \(j\) изменений. Если же такую смесь нельзя приготовить, просто выведите \(0\). Система оценки Подзадачи: - (13 баллов) \(N \leq 50\), \(0 < S_i+P_i+G_i \leq 10^2\)
- (17 баллов) \(N \leq 500\), \(0 < S_i+P_i+G_i \leq 10^3\)
- (30 баллов) \(N \leq 5000\), \(0 < S_i+P_i+G_i \leq 10^4\)
- (40 баллов) Без дополнительных ограничений.
Примечание Обратите внимание, что в данном примере бутылки \(1\) и \(3\) содержат одинаковое количество соли, перца и чесночного порошка.
| |
|
|
E. Дядя Богдан и Проекции
геометрия
сортировки
Структуры данных
*2700
Возвращаясь на берег, дядя Богдан зачастую посещает компьютерный клуб «Скала», чтобы порешать там задачи в приятной компании. Однажды, Дядя Богдан встретился там с одним старым знакомым. Этот знакомый задал ему необычную задачу... На плоскости с декартовой системой координат даны \(n\) непересекающихся горизонтальных отрезков с концами в целых точках. Все отрезки находятся строго над осью \(OX\). Вы можете выбрать произвольный вектор с координатами (\(a\), \(b\)), где \(b < 0\) и координаты — вещественные числа, и спроектировать все отрезки на ось \(OX\) вдоль этого вектора. При этом полученные проекции должны не пересекаться, но, возможно, могут касаться. Вам нужно найти минимально возможную разницу между координатой \(x\) правого конца самой правой проекции и координатой \(x\) левого конца самой левой проекции. Выходные данные Выведите минимальную разницу, которую можно получить. Ваш ответ будет считаться правильным, если его абсолютная или относительная погрешность не превосходит \(10^{-6}\). Формально, пусть ваш ответ равен \(a\), а ответ жюри равен \(b\). Ваш ответ будет зачтен, если и только если \(\frac{|a - b|}{\max{(1, |b|)}} \le 10^{-6}\). Примечание Если в первом примере спроектировать отрезки вдоль вектора \((1, -1)\), который изображен на рисунке, то мы получим ответ \(12-3=9\), и можно доказать, что меньше получить нельзя. Во втором примере оптимально проектировать вдоль вектора \((1, -3)\). Ответ: \(8\frac{2}{3}-2\frac{1}{3}=6\frac{1}{3}\)
| |
|
|
F. Двухцветные отрезки
дп
Паросочетания
сортировки
Структуры данных
*2600
Вам задано \(n\) отрезков \([l_1, r_1], [l_2, r_2], \dots, [l_n, r_n]\). Каждый отрезок одного из двух цветов: \(i\)-й отрезок покрашен в цвет \(t_i\). Назовем пару отрезков \(i\) и \(j\) плохой, если выполняются два условия: - \(t_i \ne t_j\);
- отрезки \([l_i, r_i]\) и \([l_j, r_j]\) пересекаются, касаются или вкладываются, т. е. существует целое число \(x\), такое, что \(x \in [l_i, r_i]\) и \(x \in [l_j, r_j]\).
Определите, какое максимальное количество отрезков из заданных можно выбрать так, чтобы среди выбранных не было ни одной плохой пары. Выходные данные Выведите максимальное количество отрезков, которые можно выбрать так, чтобы среди выбранных отрезков не было ни одной плохой пары.
| |
|
|
C. Пинки Пай поедает пирожные
жадные алгоритмы
Конструктив
математика
сортировки
*1700
Пинки Пай купила пакет пирожных с разными начинками! Но оказалось, что не все пирожные различаются начинкой между собой, то есть в пакете есть какие-то пирожные с одинаковой начинкой. Пинки Пай ест пирожные по одному подряд. Она любит веселиться, поэтому решила не просто поедать пирожные, а стараться не есть пирожные с одной начинкой слишком часто. Для этого она хочет, чтобы минимальное расстояние между съеденными пирожными с одинаковой начинкой было как можно больше. При этом расстоянием между двумя пирожными Пинки Пай решила назвать количество съеденных пирожных между ними. Пинки Пай может поедать пирожные в любом порядке. Ей не терпится скорее съесть все пирожные, поэтому она просит вас помочь посчитать наибольшее минимальное расстояние между съеденными пирожными с одинаковой начинкой среди всех возможных порядков поедания! Пинки Пай собирается покупать еще пакеты с пирожными, поэтому просит вас решить задачу для нескольких пакетов! Выходные данные Для каждого пакета в отдельной выведите одно целое число — наибольшее минимальное расстояние между съеденными пирожными с одинаковой начинкой среди всех возможных порядков поедания пирожных из этого пакета. Примечание Для первого пакета Пинки Пай может есть пирожные в следующем порядке (по начинкам): \(1\), \(6\), \(4\), \(7\), \(1\), \(6\), \(4\) (таким образом, минимальное расстояние будет равно \(3\)). Для второго пакета Пинки Пай может есть пирожные в следующем порядке (по начинкам): \(1\), \(4\), \(6\), \(7\), \(4\), \(1\), \(6\), \(4\) (таким образом, минимальное расстояние будет равно \(2\)).
| |
|
|
A. Boboniu общается с Du
дп
жадные алгоритмы
сортировки
*1800
Слышали ли вы когда-нибудь о мессенджере QQ? В групповых чатах QQ администратор может заглушить пользователя на несколько дней. В групповом чате Boboniu, есть человек, которого зовут Du Yi, который любит подшучивать над Boboniu каждый день. Du будет общаться в чате на протяжении \(n\) дней. В \(i\)-й день: - Если Du может разговаривать, он подшутит над Boboniu с фактором веселья \(a_i\). Но, после этого, он может быть заглушен, в зависимости от настроения Boboniu.
- Иначе, Du не будет ничего делать.
Настроение Boboniu это константа \(m\). В \(i\)-й день: - Если Du может разговаривать и \(a_i>m\), тогда Boboniu разозлится и заглушит его на \(d\) дней, это означает, что Du не сможет говорить в дни \(i+1, i+2, \cdots, \min(i+d,n)\).
- Иначе, Boboniu не будет ничего делать.
Итоговой фактор веселья это сумма факторов веселья в дни, когда Du мог разговаривать. Du попросил вас найти наибольший возможный фактор веселья по всем перестановкам \(a\). Выходные данные Выведите одно целое число: максимальный итоговый фактор веселья по всем перестановкам \(a\). Примечание В первом примере, вы можете переставить \(a'=[15, 5, 8, 10, 23]\). Тогда история общения Du будет выглядеть следующим образом: - Подшутить над Boboniu с фактором веселья \(15\).
- Быть заглушенным.
- Быть заглушенным.
- Подшутить над Boboniu с фактором веселья \(10\).
- Подшутить над Boboniu с фактором веселья \(23\).
Таким образом, итоговый фактор веселья равен \(48\).
| |
|
|
D. Boboniu и Jianghu
Деревья
дп
жадные алгоритмы
сортировки
*2800
После того как Boboniu закончил строительство своего Jianghu, он занимался кунг-фу на этих горах каждый день. Boboniu разработал карту для своих \(n\) гор. Он использовал \(n-1\) дорогу чтобы соединить все \(n\) гор. Все горы связны с помощью дорог. Для \(i\)-й горы, Boboniu оценил скучность кунг-фу на ней как \(t_i\). Он также оценил высоту каждой горы как \(h_i\). Путь это такая последовательность гор \(M\), что для всех \(i\) (\(1 \le i < |M|\)), существует дорога между \(M_i\) и \(M_{i+1}\). Boboniu считает путь испытанием если для всех \(i\) (\(1\le i<|M|\)), \(h_{M_i}\le h_{M_{i+1}}\). Boboniu хочет разделить все \(n-1\) дорог на несколько испытаний. Обратите внимание, что каждая дорога должна встречаться ровно в одном испытании, но гора может встречаться в нескольких испытаниях. Boboniu хочет минимизировать суммарную скучность всех испытаний. Скучность испытания \(M\) это сумма скучностей всех гор в ней, т.е. \(\sum_{i=1}^{|M|}t_{M_i}\). Он попросил вас найти минимальную возможную суммарную скучность всех испытаний. В награду за вашу работу, вы станете охранником в его Jianghu. Выходные данные Выведите одно целое число: минимальную возможную суммарную скучность всех испытаний. Примечание В первом примере: На картинке, чем светлее точка, тем выше гора, которую она представляет. Одно из лучших разделений это: - Испытание \(1\): \(3 \to 1 \to 2\)
- Испытание \(2\): \(5 \to 2 \to 4\)
Суммарно скучность для Boboniu равна \((30 + 40 + 10) + (20 + 10 + 50) = 160\). Можно показать, что это является минимальной возможной скучностью.
| |
|
|
D. Радужные прямоугольники
сортировки
Структуры данных
*3300
Shrimpy Duc это пухлый и жадный мальчик, который всегда голоден. После бесчисленных попыток найти еду, чтобы утолить его нескончаемый голод, Shrimpy Duc нашел конфеты M&M, лежащие на поле \(L \times L\). Есть \(n\) конфеток M&M на этом поле, \(i\)-я из них находится в точке \((x_i + 0.5, y_i + 0.5),\) и имеет цвет \(c_i\), один из возможных \(k\) цветов (размерами M&Ms можно пренебречь). Shrimpy Duc хочет украсть прямоугольник M&Ms, а именно, он хочет выбрать прямоугольник с целочисленными координатами внутри поля, и украсть все M&Ms в нем. Ему необязательно красть все конфеты, однако, он хочет украсть хотя бы одну конфету каждого цвета. Иначе говоря, он хочет посчитать количество таких прямоугольников, в которых левая нижняя вершина находится в \((X_1, Y_1)\), правая верхняя в \((X_2, Y_2)\), они являются точками с целочисленными координатами, удовлетворяющие условиям \(0 \le X_1 < X_2 \le L\) и \(0 \le Y_1 < Y_2 \le L\), что для каждого \(1 \le c \le k\) существует хотя бы одна M&M с цветом \(c\), которая лежит в этом прямоугольнике. Сколько существует таких прямоугольников? Это число может быть большим, так что вам достаточно найти его по модулю \(10^9 + 7\). Выходные данные Выведите одно целое число — количество прямоугольников, удовлетворяющих условиям Shrimpy Duc, по модулю \(10^9 + 7\). Примечание Поле для первого примера: 
| |
|
|
B. Степенная последовательность
математика
Перебор
сортировки
теория чисел
*1500
Назовем последовательность положительных чисел \(a_0, a_1, ..., a_{n-1}\) степенной последовательностью, если найдется такое положительное целое число \(c\), что для всех \(0 \le i \le n-1\), \(a_i = c^i\). Вам дана последовательность из \(n\) положительных чисел \(a_0, a_1, ..., a_{n-1}\), вам разрешается: - Переупорядочить последовательность (иначе говоря, выбрать перестановку \(p\) из \(\{0,1,...,n - 1\}\) и заменить \(a_i\) на \(a_{p_i}\)), и затем
- Выполнить следующую операцию любое количество раз: выбрать индекс \(i\) и заменить \(a_i\) на \(a_i - 1\) или \(a_i + 1\) (иначе говоря, уменьшить или увеличить \(a_i\) на \(1\)) за стоимость \(1\).
Найдите минимальную стоимость, необходимую для превращения \(a_0, a_1, ..., a_{n-1}\) в степенную последовательность. Выходные данные Выведите минимальную стоимость, необходимую для превращения \(a_0, a_1, ..., a_{n-1}\) в степенную последовательность. Примечание В первом примере сначала можно переупорядочить \(\{1, 3, 2\}\) в \(\{1, 2, 3\}\), затем увеличить \(a_2\) до \(4\) за стоимость \(1\), чтобы получить степенную последовательность \(\{1, 2, 4\}\).
| |
|
|
B. Игра с удалением подстрок
жадные алгоритмы
игры
сортировки
*800
Алиса и Боб играют в игру. У них есть бинарная строка \(s\) (каждый символ бинарной строки — либо \(0\), либо \(1\)). Алиса ходит первой, потом Боб, потом снова Алиса, и так далее. В свой ход игрок должен выбрать несколько (не менее одного) последовательных одинаковых символов в \(s\) и удалить их. Например, если текущая строка — \(10110\), существует \(6\) возможных ходов (удаляемые символы выделены жирным): - \(\textbf{1}0110 \to 0110\);
- \(1\textbf{0}110 \to 1110\);
- \(10\textbf{1}10 \to 1010\);
- \(101\textbf{1}0 \to 1010\);
- \(10\textbf{11}0 \to 100\);
- \(1011\textbf{0} \to 1011\).
После удаления символов те символы, которые стояли слева и справа от удаленного блока, становятся последовательными. Т. е. следующая последовательность операций возможна: \(10\textbf{11}0 \to 1\textbf{00} \to 1\). Игра заканчивается, когда строка становится пустой. Счет каждого игрока равен кол-ву символов \(1\), которые он удалил. Каждый игрок хочет набрать максимально возможное количество очков. Посчитайте, сколько очков наберет Алиса. Выходные данные Для каждого набора входных данных выведите ответ на него — счет Алисы в конце игры (количество символов \(1\), которые она удалит). Примечание Вопросы по поводу оптимальной стратегии будут игнорироваться.
| |
|
|
D. Цветные прямоугольники
дп
жадные алгоритмы
сортировки
*1800
Даны три мультимножества пар цветных палок: - \(R\) пар красных палок, у первой пары длины равны \(r_1\), у второй пары длины равны \(r_2\), \(\dots\), у \(R\)-й пары длины равны \(r_R\);
- \(G\) пар зеленых палок, у первой пары длины равны \(g_1\), у второй пары длины равны \(g_2\), \(\dots\), у \(G\)-й пары длины равны \(g_G\);
- \(B\) пар синих палок, у первой пары длины равны \(b_1\), у второй пары длины равны \(b_2\), \(\dots\), у \(B\)-й пары длины равны \(b_B\).
Вы собираете прямоугольники из этих пар палок следующим образом: - взять пару палок одного цвета;
- взять пару палок другого цвета, отличного от первого;
- прибавить площадь полученного прямоугольника к суммарной площади.
В итоге получатся такие прямоугольники, что противоположные стороны у них одного цвета, а соседние стороны различных цветов. Каждая пара палок может быть использована не более одного раза, некоторые пары можно не использовать. Не разрешается разбивать пару палок на отдельные палки. Какую максимальную суммарную площадь можно получить? Выходные данные Выведите максимально возможную суммарную площадь построенных прямоугольников. Примечание В первом примере можно построить один из следующих прямоугольников: красный и зеленый со сторонами \(3\) и \(5\), красный и синий со сторонами \(3\) и \(4\) и зеленый и синий со сторонами \(5\) и \(4\). Лучшая площадь из них равна \(4 \times 5 = 20\). Во втором примере лучшие прямоугольники: красный/синий \(9 \times 8\), красный/синий \(5 \times 5\), зеленый/синий \(2 \times 1\). Суммарная площадь равна \(72 + 25 + 2 = 99\). В третьем примере лучшие прямоугольники: красный/зеленый \(19 \times 8\) и красный/синий \(20 \times 11\). Суммарная площадь равна \(152 + 220 = 372\). Обратите внимание, что больше прямоугольников нельзя построить, потому что не разрешается иметь обе взятые пары одного цвета.
| |
|
|
E. Два типа заклинаний
Бинарный поиск
жадные алгоритмы
математика
реализация
сортировки
Структуры данных
*2200
Поликарп играет в компьютерную игру (да, опять). В этой игре он сражается с монстрами при помощи заклинаний. Есть два типа заклинаний: огненный шар силы \(x\) наносит \(x\) урона монстру, а молния силы \(y\) наносит \(y\) урона монстру и удваивает урон следующего заклинания. Каждое заклинание может быть использовано только один раз, но Поликарп может применять их в любом порядке. Например, предположим, что Поликарп знает три заклинания: огненный шар силы \(5\), молнию силы \(1\) и молнию силы \(8\). Всего есть \(6\) способов выбрать порядок заклинаний: - первое, второе, третье. В таком случае вы нанесете \(5 + 1 + 2 \cdot 8 = 22\) урона;
- первое, третье, второе. В таком случае вы нанесете \(5 + 8 + 2 \cdot 1 = 15\) урона;
- второе, первое, третье. В таком случае вы нанесете \(1 + 2 \cdot 5 + 8 = 19\) урона;
- второе, третье, первое. В таком случае вы нанесете \(1 + 2 \cdot 8 + 2 \cdot 5 = 27\) урона;
- третье, первое, второе. В таком случае вы нанесете \(8 + 2 \cdot 5 + 1 = 19\) урона;
- третье, второе, первое. В таком случае вы нанесете \(8 + 2 \cdot 1 + 2 \cdot 5 = 20\) урона.
Изначально Поликарп знает \(0\) заклинаний. Его набор заклинаний меняется \(n\) раз, каждый раз он либо учит новое заклинание, либо забывает старое. После каждого изменения выведите максимально количество урона, которое можно нанести при помощи имеющихся заклинаний. Выходные данные После каждого изменения выведите максимально количество урона, которое можно нанести при помощи имеющихся заклинаний.
| |
|
|
A. Удалить наименьшее
жадные алгоритмы
сортировки
*800
Вам дан массив \(a\), состоящий из \(n\) положительных (больших нуля) целых чисел. За один ход вы можете выбрать два индекса \(i\) и \(j\) (\(i \ne j\)) таких, что абсолютная разность между \(a_i\) и \(a_j\) не превосходит единицу (\(|a_i - a_j| \le 1\)), и удалить наименьший из этих двух элементов. Если два элемента равны, вы можете удалить любой из них (но только один). Ваша задача — определить, возможно ли получить массив, состоящий только из одного элемента, применив несколько (возможно, ноль) таких ходов, или нет. Вам нужно ответить на \(t\) независимых наборов тестовых данных. Выходные данные Для каждого набора тестовых данных выведите ответ на него: «YES», если возможно получить массив, состоящий только из одного элемента, применив несколько (возможно, ноль) ходов, описанных в условии задачи, или «NO» в обратном случае. Примечание В первом наборе тестовых данных примера мы можем применить следующую последовательность ходов: - выбрать \(i=1\) и \(j=3\), а затем удалить \(a_i\) (таким образом, \(a\) превратится в \([2; 2]\));
- выбрать \(i=1\) и \(j=2\), а затем удалить \(a_j\) (таким образом, \(a\) превратится в \([2]\)).
Во втором наборе тестовых данных примера мы можем выбирать любые возможные \(i\) и \(j\) в течение любого хода и удалять любой элемент из пары. В третьем наборе тестовых данных примера не существует способа избавиться от \(2\) и \(4\).
| |
|
|
E2. Деление весов (сложная версия)
Бинарный поиск
Деревья
жадные алгоритмы
поиск в глубину и подобное
сортировки
*2200
Простая и сложная версии на самом деле являются разными задачами, поэтому прочитайте условия обеих задач внимательно. Вам задано взвешенное корневое дерево, вершина \(1\) — корень этого дерева. Также каждое ребро имеет свою собственную стоимость. Дерево — это связный граф без циклов. У корневого дерева есть специальная вершина, называемая корнем. Предком вершины \(v\) называется последняя отличная от \(v\) вершина на пути от корня к вершине \(v\). Потомками вершины \(v\) называются все вершины, для которых \(v\) является предком. Вершина называется листом, если у нее нет потомков. Взвешенное дерево — это такое дерево, в котором у каждого ребра есть некоторый вес. Вес пути — это сумма весов всех ребер на этом пути. Вес пути от вершины до самой себя равен \(0\). Вы можете совершить последовательность из нуля или более ходов. В течение одного хода вы можете выбрать ребро и поделить его вес на \(2\) с округлением вниз. Более формально, в течение одного хода вы выбираете какое-то ребро \(i\) и делите его вес на \(2\) с округлением вниз (\(w_i := \left\lfloor\frac{w_i}{2}\right\rfloor\)). Каждое ребро \(i\) имеет свою стоимость \(c_i\), которая равна либо \(1\), либо \(2\) монетам. Каждый ход с ребром \(i\) стоит \(c_i\) монет. Ваша задача — найти минимальную суммарную стоимость, необходимую для того, чтобы сделать сумму весов путей от корня до каждого листа не превосходящей \(S\). Другими словами, если \(w(i, j)\) — это вес пути от вершины \(i\) до вершины \(j\), то вам необходимо сделать \(\sum\limits_{v \in leaves} w(root, v) \le S\), где \(leaves\) — это список всех листьев. Вам необходимо ответить на \(t\) независимых наборов тестовых данных. Выходные данные Для каждого набора тестовых данных выведите ответ на него: минимальную суммарную стоимость, необходимую, чтобы сделать сумму весов путей от корня до каждого листа не превосходящей \(S\).
| |
|
|
F. Очередное подмножество отрезков
графы
дп
сортировки
Структуры данных
*2300
Вам даны \(n\) отрезков на координатной оси \(OX\). \(i\)-й отрезок имеет границы \([l_i; r_i]\). Все точки \(x\), для которых выполняется условие \(l_i \le x \le r_i\), принадлежат \(i\)-му отрезку. Ваша задача — выбрать такое максимальное по размеру (количеству отрезков) подмножество заданного множества отрезков, что каждая пара отрезков в этом подмножестве либо не пересекается либо же один из них лежит внутри другого. Два отрезка \([l_i; r_i]\) и \([l_j; r_j]\) не пересекаются, если у них нет общих точек. Например, отрезки \([1; 2]\) и \([3; 4]\), \([1; 3]\) и \([5; 5]\) не пересекаются, а отрезки \([1; 2]\) и \([2; 3]\), \([1; 2]\) и \([2; 2]\) пересекаются. Отрезок \([l_i; r_i]\) лежит внутри отрезка \([l_j; r_j]\), если \(l_j \le l_i\) и \(r_i \le r_j\). Например, отрезки \([2; 2]\), \([2, 3]\), \([3; 4]\) и \([2; 4]\) лежат внутри отрезка \([2; 4]\), а \([2; 5]\) и \([1; 4]\) — нет. Вам необходимо ответить на \(t\) независимых наборов тестовых данных. Выходные данные Для каждого набора тестовых данных выведите ответ: максимально возможный размер такого подмножества заданного множества отрезков, что каждая пара отрезков в этом подмножестве либо не пересекается, либо же один из них лежит внутри другого.
| |
|
|
D. Новогодний контест
жадные алгоритмы
сортировки
*1800
Пока Геральд накрывает стол, Александр отправляет открытки, а Сергей и его двойники создают армию (клонов) снеговиков, Геннадий пишет новогодний контест. Новогодний контест начинается в 18:00 31 декабря и заканчивается в 6:00 1 января. На контесте предлагается n задач. Штрафное время по каждой сданной задаче начисляется как расстояние от момента ее сдачи до Нового года в минутах. Например, задача, сданная в 21:00 получает штрафное время 180, так же как задача, сданная в 3:00. Общее штрафное время считается как сумма штрафных времен по всем сданным задачам. Разрешается сдавать задачу ровно в момент окончания контеста 6:00. Геннадий открыл задачи ровно в 18:00 и за первые 10 минут контеста успел оценить их сложность. Он полагает, что потратит на решение i-ой задачи ai минут. Отправить решение на проверку Геннадий сможет в любой момент времени после завершения его написания. Вероятно, ему придется отрываться от решения одной задачи, чтобы отправить на проверку решение по другим. Временем отправки решения можно пренебречь, то есть считать его равным нулю. Генндий может одновременно отправить несколько решений. Кроме того, он может в любой момент перейти от решения одной задачи к другой, а потом вернуться к первой задаче с того же места, на котором закончил. При этом суммарное время решения i-ой задачи составит также ai минут. Разумеется, Геннадий не совершает штрафных попыток, и все его решения проходят с первого раза. Он может приступать к решению задач начиная с 18:10. Помогите Геннадию выбрать из стратегий, при которых он решит максимальное возможное количество задач, ту, при которой его общее штрафное время будут минимальным. Выходные данные Выведите два целых числа — количество решенных Геннадием задач и общее штрафное время при оптимальной стратегии. Примечание В примере одна из возможных оптимальных стратегий Геннадия такова. В 18:10 он начинает решать первую задачу и решает ее через 30 минут (в 18:40). В 18:40 он начинает решать вторую задачу. До Нового года остается 320 минут, поэтому Геннадий не успевает закончить решение второй задачи до Нового года. В 0:00 он отрывается от решения второй задачи и сдает первую, и сразу же возвращается к решению второй задачи. В 0:10 он дописывает решение по второй задаче и сдает его, получая 10 минут штрафного времени. Заметим, что так как общая продолжительность контеста 720 минут и 10 минут Геннадий уже потратил на чтение задач, он вообще не успеет решить за контест третью задачу. Да, такие задачи бывают. Соревнования по описанным правилам ежегодно проходят на сайте http://b23.ru/3wvc
| |
|
|
F. Новогодняя снежинка
геометрия
сортировки
*2600
В то время как Геральд ..., иначе говоря, в канун Нового года, Константин приготовил необыкновенный подарок для Прекрасной Дамы. Это волшебная новогодняя снежинка, способная исполнить любое заветное желание. Новогодняя снежинка состоит из маленьких ледяных кристаллов, которые можно приближенно считать точками на плоскости. Вся прелесть новогодней снежинки в том, что она имеет центр симметрии. Это такая точка, что для каждого кристалла снежинки найдется другой кристалл, симметричный ему относительно этой точки. Один из кристаллов может располагаться непосредственно в центре симметрии. Пока Константин выбирал снежинку среди миллионов других снежинок, не менее симметричных и не менее волшебных, потом преодолевал нелегкий путь через сугробы к дому своей возлюбленной и с замиранием сердца ждал несколько долгих мгновений, перед тем как Прекрасная Дама отворила дверь, некоторые кристаллы снежинки растаяли и, естественно, исчезли. Константин уверен, что таких кристаллов было не более k, потому что он обращался со снежинкой очень аккуратно. Теперь он готов продемонстрировать Прекрасной Даме всю мощь нанотехнологий и восстановить симметрию снежинки. Вам даны координаты уцелевших кристаллов снежинки, заданные в нанометрах. Ваша задача — определить все возможные положения изначального центра симметрии. Выходные данные В первой строке выведите целое число c — количество возможных центров симметрии. Следующие c строк должны содержать описания центров. Каждый центр симметрии описывается парой координат «x y», разделенных пробелом. Координаты выводите с абсолютной погрешностью, не превосходящей 10 - 6. Центры симметрии разрешается выводить в любом порядке. Все выводимые точки должны быть различны. В случае если существует бесконечное количество возможных центров симметрии, выведите одно число «-1».
| |
|
|
C. Просто массив
Конструктив
математика
сортировки
теория чисел
*1300
Вам задан массив \(a_1, a_2, \dots, a_n\), в котором все \(a_i\) — целые и больше \(0\). За одну операцию вы можете выбрать две различные позиции \(i\) и \(j\) (\(1 \le i, j \le n\)). Если \(gcd(a_i, a_j)\) равен минимуму всего массива \(a\), то вы можете поменять местами \(a_i\) и \(a_j\). \(gcd(x, y)\) означает наибольших общий делитель (НОД) чисел \(x\) и \(y\). Вам нужно сделать массив \(a\) неубывающим, используя заданную операцию произвольное количество раз (возможно, ни разу). Определите, возможно ли это. Массив \(a\) — неубывающий, тогда и только тогда, когда \(a_1 \le a_2 \le \ldots \le a_n\). Выходные данные Для каждого набора, выведите «YES», если возможно сделать массив \(a\) неубывающим, используя описанную выше операцию, или «NO» в противном случае. Примечание В первом и третьем наборах, массив уже неубывающий. Во втором наборе, мы можем сначала свапнуть \(a_1\) и \(a_3\), а потом \(a_1\) и \(a_5\), и получим неубывающий массив. В четвертом наборе, невозможно сделать массив неубывающим, используя заданную операцию.
| |
|
|
D. Максимально распределенное дерево
Деревья
дп
жадные алгоритмы
математика
поиск в глубину и подобное
реализация
сортировки
теория чисел
*1800
Вам задано дерево, состоящее из \(n\) вершин. Вы должны сопоставить каждому из \(n-1\) ребер этого дерева целое число таким образом, чтобы выполнялись следующие условия: - каждое число должно быть целым и строго больше \(0\);
- произведение всех \(n-1\) чисел должно быть равно \(k\);
- количество \(1\)-ц среди всех \(n-1\) чисел должно быть минимально возможным.
Назовем \(f(u,v)\) сумму чисел на простом пути из вершины \(u\) в вершину \(v\). Также, назовем \(\sum\limits_{i=1}^{n-1} \sum\limits_{j=i+1}^n f(i,j)\) как индекс распределения дерева. Определите максимально возможный индекс распределения, который можно получить. Так как ответ может быть слишком большим, выведите его по модулю \(10^9 + 7\). В данной задаче, так как число \(k\) может быть слишком большим, задана факторизация \(k\) на простые числа. Выходные данные Выведите максимально возможный индекс распределения. Так как ответ может быть слишком большим, выведите его по модулю \(10^9+7\). Примечание В первом наборе входных данных, один из возможных ответов изображен на рисунке ниже: В данном случае, \(f(1,2)=1\), \(f(1,3)=3\), \(f(1,4)=5\), \(f(2,3)=2\), \(f(2,4)=4\), \(f(3,4)=2\), и сумма этих \(6\) чисел равна \(17\). Во втором наборе входных данных, один из возможных ответов изображен ниже: В этом случае, \(f(1,2)=3\), \(f(1,3)=1\), \(f(1,4)=4\), \(f(2,3)=2\), \(f(2,4)=5\), \(f(3,4)=3\), и сумма этих \(6\) чисел равна \(18\).
| |
|
|
E. Разбиваем квадрат
геометрия
реализация
сортировки
Структуры данных
*2400
У вас есть квадрат размера \(10^6 \times 10^6\) на координатной плоскости с вершинами в точках \((0, 0)\), \((0, 10^6)\), \((10^6, 0)\) и \((10^6, 10^6)\). Вы собираетесь нарисовать несколько отрезков на плоскости. Все отрезки либо горизонтальные, либо вертикальные и пересекаются хотя бы с одной стороной квадрата. Сейчас вас интересует: на какое количество частей разобьется данный квадрат после того, как будут нарисованы все отрезки. Напишите программу, подсчитывающую количество частей. Выходные данные Выведите количество частей, на которые разбивается квадрат после того, как нарисованы все отрезки. Примечание Пример выглядит следующим образом:
| |
|
|
A. Fancy Fence
*особая задача
математика
реализация
снм
сортировки
Структуры данных
*1800
Everybody knows that Balázs has the fanciest fence in the whole town. It's built up from \(N\) fancy sections. The sections are rectangles standing closely next to each other on the ground. The \(i\)th section has integer height \(h_i\) and integer width \(w_i\). We are looking for fancy rectangles on this fancy fence. A rectangle is fancy if: - its sides are either horizontal or vertical and have integer lengths
- the distance between the rectangle and the ground is integer
- the distance between the rectangle and the left side of the first section is integer
- it's lying completely on sections
What is the number of fancy rectangles? This number can be very big, so we are interested in it modulo \(10^9+7\). Output You should print a single integer, the number of fancy rectangles modulo \(10^9+7\). So the output range is \(0,1,2,\ldots, 10^9+6\). Scoring \( \begin{array}{|c|c|c|} \hline \text{Subtask} & \text{Points} & \text{Constraints} \\ \hline 1 & 0 & \text{sample}\\ \hline 2 & 12 & N \leq 50 \: \text{and} \: h_i \leq 50 \: \text{and} \: w_i = 1 \: \text{for all} \: i \\ \hline 3 & 13 & h_i = 1 \: \text{or} \: h_i = 2 \: \text{for all} \: i \\ \hline 4 & 15 & \text{all} \: h_i \: \text{are equal} \\ \hline 5 & 15 & h_i \leq h_{i+1} \: \text{for all} \: i \leq N-1 \\ \hline 6 & 18 & N \leq 1000\\ \hline 7 & 27 & \text{no additional constraints}\\ \hline \end{array} \)Note The fence looks like this:  There are 5 fancy rectangles of shape:  There are 3 fancy rectangles of shape:  There is 1 fancy rectangle of shape:  There are 2 fancy rectangles of shape:  There is 1 fancy rectangle of shape: 
| |
|
|
B. Roads
*особая задача
геометрия
сортировки
*2900
The government of Treeland wants to build a new road network. There are \(2N\) cities in Treeland. The unfinished plan of the road network already contains \(N\) road segments, each of which connects two cities with a straight line. No two road segments have a common point (including their endpoints). Your task is to determine \(N-1\) additional road segments satisfying the following conditions: - Every new road segment must connect two cities with a straight line.
- If two segments (new or old) have a common point, then this point must be an endpoint of both segments.
- The road network connects all cities: for each pair of cities there is a path consisting of segments that connects the two cities.
Output The standard output must contain \(N-1\) lines, each of them containing four integers, \(x_1, y_1, x_2, y_2\), where \((x_1,y_1)\) and \((x_2, y_2)\) are the coordinates of the cities that are the endpoints of a new road segment. If there are multiple solutions, your program may output any of them. Scoring \( \begin{array}{|c|c|l|} \hline \text{Subtask} & \text{Points} & \text{Constraints} \\ \hline 1 & 0 & \text{samples}\\ \hline 2 & 15 & \text{all input segments are vertical.} \\ \hline 3 & 15 & \text{each pair of input segments are parallel.} \\ \hline 4 & 15 & \text{each input segment is either horizontal or vertical.} \\ \hline 5 & 15 & N \le 10\,000 \\ \hline 6 & 40 & \text{no additional constraints}\\ \hline \end{array} \) Note 
| |
|
|
A. The Potion of Great Power
*особая задача
2-sat
Бинарный поиск
графы
интерактив
сортировки
Структуры данных
*2400
Once upon a time, in the Land of the Shamans, everyone lived on the Sky-High Beanstalk. Each shaman had a unique identifying number \(i\) between \(0\) and \(N-1\), and an altitude value \(H_i\), representing how high he lived above ground level. The distance between two altitudes is the absolute value of their difference. All shamans lived together in peace, until one of them stole the formula of the world-famous Potion of Great Power. To cover his/her tracks, the Thief has put a Curse on the land: most inhabitants could no longer trust each other... Despite the very difficult circumstances, the Order of Good Investigators have gained the following information about the Curse: - When the Curse first takes effect, everyone stops trusting each other.
- The Curse is unstable: at the end of each day (exactly at midnight), one pair of shamans will start or stop trusting each other.
- Unfortunately, each shaman will only ever trust at most \(D\) others at any given time.
They have also reconstructed a log of who trusted whom: for each night they know which pair of shamans started/stopped trusting each other. They believe the Thief has whispered the formula to an Evil Shaman. To avoid detection, both of them visited the home of one of their (respective) trusted friends. During the visit, the Thief whispered the formula to the Evil Shaman through the window. (Note: this trusted friend did not have to be home at the time. In fact, it's even possible that they visited each other's houses – shamans are weird.) Fortunately, whispers only travel short distances, so the Order knows the two trusted friends visited (by the Thief and the Evil Shaman) must live very close to each other. They ask you to help with their investigation. They would like to test their suspicions: what if the Thief was \(x\), the Evil Shaman was \(y\), and the formula was whispered on day \(v\)? What is the smallest distance the whispered formula had to travel? That is, what is the minimum distance between the apartments of some shamans \(x'\) and \(y'\) (i.e. \(\min\left(\left|H_{x'} - H_{y'}\right|\right)\)), such that \(x'\) was a trusted friend of \(x\) and \(y'\) was a trusted friend of \(y\) on day \(v\)? They will share all their information with you, then ask you a number of questions. You need to answer each question immediately, before receiving the next one. Interaction The interaction will begin with a line containing \(N\), \(D\), \(U\) and \(Q\) \((2 \leq N \leq 100000\), \(1 \leq D \leq 500\), \(0 \leq U \leq 200000\), \(1 \leq Q \leq 50000)\) – the number of shamans, the maximum number of trusted friends a shaman can have at any given point, the number of days, and the number of questions. On the next line \(N\) space separated integers will follow, the \(i\)th \((1\leq i \leq N)\) of which being \(H_{i-1}\) \((0\leq H_{i-1} \leq 10^9)\), the altitude of shaman \(i-1\). On the next \(U\) lines there will be two integers each, on the \(i\)th (\(1 \leq i \leq U\)) \(A_i\) and \(B_i\) \((0 \leq A_i, B_i < N\) and \(A_i \neq B_i)\), which represents a pair of shamans who started or stopped trusting each other at the end of day \(i-1\). That is, if \(A_i\) and \(B_i\) trusted each other on day \(i-1\), they did not trust each other on day \(i\), or vice versa. Read all of these integers. The interactor now will ask you \(Q\) question, so the following interaction should happen \(Q\) times: - Read \(3\) integers describing the current query: \(x,y\) and \(v\) (\(x \neq y\), \(0 \leq x,y < N\) and \(0 \leq v \leq U\)), where \(x\) is the suspected Thief, \(y\) is the suspected Evil Shaman, and \(v\) is the suspected day..
- Then print the answer to this query on a single line, i.e. you should print the minimum distance the whispered formula had to travel from some trusted friend \(x'\) of \(x\) to a trusted friend \(y'\) of \(y\).
- In case someone trusted both \(x\) and \(y\) (i.e. \(x'=y'\)), you should print \(0\).
- If \(x\) or \(y\) had no trusted friends, print \(10^9\).
After printing each line do not forget to output end of line and flush the output. Otherwise, you will get Idleness limit exceeded. To do this, use: - fflush(stdout) or cout.flush() in C++;
- System.out.flush() in Java;
- flush(output) in Pascal;
- stdout.flush() in Python;
- see documentation for other languages.
Scoring \( \begin{array}{|c|c|c|} \hline \text{Subtask} & \text{Points} & \text{Constraints} \\ \hline 1 & 0 & \text{samples}\\ \hline 2 & 17 & Q,U \leq 1000 \\ \hline 3 & 14 & v=U \: \text{for all questions} \\ \hline 4 & 18 & H_i \in \left\{0,1\right\} \: \text{for all shamans} \: i \\ \hline 5 & 21 & U,N \leq 10000\\ \hline 6 & 30 & \text{no additional constraints}\\ \hline \end{array} \) Note Example queries:  Evolution of friendships: 
| |
|
|
B. Максимальное произведение
дп
жадные алгоритмы
Перебор
реализация
сортировки
*1200
Вам дан массив целых чисел \(a_1,a_2,\ldots,a_n\). Найдите максимум \(a_ia_ja_ka_la_t\) по всем пятеркам индексов \((i, j, k, l, t)\) (\(i<j<k<l<t\)). Выходные данные Для каждого набора входных данных выведите единственное целое число — ответ на задачу. Примечание В первом наборе входных данных выбор \(a_1,a_2,a_3,a_4,a_5\) является наилучшим: \((-1)\cdot (-2) \cdot (-3)\cdot (-4)\cdot (-5)=-120\). Во втором наборе входных данных выбор \(a_1,a_2,a_3,a_5,a_6\) является наилучшим: \((-1)\cdot (-2) \cdot (-3)\cdot 2\cdot (-1)=12\). В третьем наборе входных данных выбор \(a_1,a_2,a_3,a_4,a_5\) является наилучшим: \((-1)\cdot 0\cdot 0\cdot 0\cdot (-1)=0\). В четвертом наборе входных данных выбор \(a_1,a_2,a_3,a_4,a_6\) является наилучшим: \((-9)\cdot (-7) \cdot (-5)\cdot (-3)\cdot 1=945\).
| |
|
|
D. Прожекторы
Бинарный поиск
дп
Перебор
реализация
сортировки
Структуры данных
*2000
Есть \(n\) грабителей в координатах \((a_1, b_1)\), \((a_2, b_2)\), ..., \((a_n, b_n)\) и \(m\) прожекторов в координатах \((c_1, d_1)\), \((c_2, d_2)\), ..., \((c_m, d_m)\). За один ход вы можете подвинуть всех грабителей направо (увеличить \(a_i\) всех грабителей на единицу) или подвинуть всех грабителей вверх (увеличить \(b_i\) всех грабителей на единицу). Обратите внимание, что вы должны либо увеличить все \(a_i\), либо все \(b_i\), вы не можете увеличить \(a_i\) некоторых грабителей и \(b_i\) некоторых других грабителей за одну операцию. Прожектор \(j\) освещает грабителя \(i\), если \(a_i \leq c_j\) и \(b_i \leq d_j\). Конфигурация грабителей называется безопасной, если ни один прожектор не освещает ни одного грабителя (то есть нет такой пары \(i,j\), что прожектор \(j\) освещает грабителя \(i\)). Какое минимальное количество ходов нужно сделать, чтобы грабители оказались в безопасной конфигурации? Выходные данные Выведите единственное целое число: минимальное количество ходов, необходимое, чтобы грабители оказались в безопасной конфигурации. Примечание В первом тесте вы можете подвинуть всех грабителей направо три раза. После этого будет один грабитель в координатах \((3, 0)\). Конфигурация грабителей будет безопасной, потому что единственный прожектор не освещает грабителя, так как он в координатах \((2, 3)\), а \(3 > 2\). Во втором тесте вы можете подвинуть всех грабителей направо два раза и вверх два раза. После этого грабители будут в координатах \((3, 8)\), \((8, 3)\). Легко увидеть, что такая конфигурация безопасна. Можно доказать, что невозможно получить безопасную конфигурацию, используя не больше, чем \(3\) хода.
| |
|
|
E. Избегайте разноцветных циклов
графы
Деревья
жадные алгоритмы
снм
сортировки
Структуры данных
*2400
Вам дано \(m\) множеств \(A_1, A_2, \ldots, A_m\), состоящих из целых чисел; элементы этих множеств — целые числа от \(1\) до \(n\) включительно. Есть два массива положительных целых чисел \(a_1, a_2, \ldots, a_m\) и \(b_1, b_2, \ldots, b_n\). За одну операцию вы можете удалить элемент \(j\) из множества \(A_i\) и заплатить за это \(a_i + b_j\) монет. Вы можете сделать несколько (возможно, ноль) операций (после этого некоторые множества могут стать пустыми). После этого вы построите неориентированный граф, где каждое ребро будет иметь цвет. Граф будет иметь \(n\) вершин. Для каждого множества \(A_i\) вы добавите ребро \((x, y)\) цвета \(i\) для всех \(x, y \in A_i\) и \(x < y\). Некоторые пары вершин могут быть соединены больше чем одним ребром, но такие ребра будут иметь разные цвета. Мы называем цикл \(i_1 \to e_1 \to i_2 \to e_2 \to \ldots \to i_k \to e_k \to i_1\) (\(e_j\) это какое-то ребро, соединяющее вершины \(i_j\) и \(i_{j+1}\) этого графа) разноцветным, если цвета всех ребер этого цикла различны. Найдите минимальное количество монет, которое нужно заплатить, чтобы получить граф без разноцветных циклов. Выходные данные Выведите единственное целое число — минимальное количество монет, которое нужно заплатить, чтобы получить граф без разноцветных циклов. Примечание В первом тесте можно сделать следующие операции. - Удалить элемент \(1\) из множества \(1\). Вы должны заплатить \(a_1 + b_1 = 5\) монет за эту операцию.
- Удалить элемент \(1\) из множества \(2\). Вы должны заплатить \(a_2 + b_1 = 6\) монет за эту операцию.
Суммарно вы заплатите \(11\) монет. После этих операций первое и второй множества будут равны \(\{2\}\), а третье множество будет равно \(\{1, 2\}\). Поэтому построенный граф будет содержать одно ребро \((1, 2)\) цвета \(3\). Во втором тесте можно сделать следующие операции. - Удалить элемент \(1\) из множества \(1\). Вы должны заплатить \(a_1 + b_1 = 11\) монет за эту операцию.
- Удалить элемент \(4\) из множества \(2\). Вы должны заплатить \(a_2 + b_4 = 13\) монет за эту операцию.
- Удалить элемент \(7\) из множества \(3\). Вы должны заплатить \(a_3 + b_7 = 13\) монет за эту операцию.
- Удалить элемент \(4\) из множества \(4\). Вы должны заплатить \(a_4 + b_4 = 16\) монет за эту операцию.
- Удалить элемент \(7\) из множества \(6\). Вы должны заплатить \(a_6 + b_7 = 13\) монет за эту операцию.
Суммарно вы заплатите \(66\) монет. После этих операций будут следующие множества: - \(\{2, 3\}\);
- \(\{1\}\);
- \(\{1, 3\}\);
- \(\{3\}\);
- \(\{3, 4, 5, 6, 7\}\);
- \(\{5\}\);
- \(\{8\}\).
Вы построите такой граф: 
В нем нет разноцветных циклов.
| |
|
|
E. Две платформы
Бинарный поиск
дп
сортировки
*1800
На плоскости находится \(n\) точек. Точка \(i\) имеет координаты \((x_i, y_i)\). У вас есть две горизонтальные платформы, обе длины \(k\). Каждая платформа может быть размещена в любом месте на плоскости, но она должна быть размещена горизонтально (на одной и той же \(y\)-координате) и иметь целочисленные границы. Если левая граница платформы равна \((x, y)\), то правая граница равна \((x + k, y)\), и все точки между границами (включая границы) принадлежат платформе. Обратите внимание, что платформы могут иметь общие точки (пересекаться), а также не обязательно размещать обе платформы на одной \(y\)-координате. После размещения обеих платформ на плоскости все точки начинают падать вниз, уменьшая \(y\)-координату. Если в какой-то момент точка сталкивается с какой-либо платформой, то она останавливается и считается сохраненной. Точки, которые никогда не сталкиваются ни с какой платформой, теряются. Ваша задача — найти максимальное количество точек, которые вы можете сохранить, если вы разместите обе платформы оптимально. Вам необходимо ответить на \(t\) независимых наборов тестовых данных. Для лучшего понимания, пожалуйста, ознакомьтесь с разделом Примечание ниже, чтобы увидеть картинку для первого набора тестовых данных примера. Выходные данные Выведите ответ на каждый набор тестовых данных: максимальное количество точек, которые вы можете сохранить, если вы разместите обе платформы оптимально. Примечание Картинка, соответствующая первому набору тестовых данных примера: 
Синие точки представляют собой точки из входных данных, красные отрезки — платформы. Одним из возможных способов является размещение первой платформы между точками \((1, -1)\) и \((2, -1)\), а второй платформы — между точками \((4, 3)\) и \((5, 3)\). Векторы обозначают, как будут падать точки. Можно заметить, что единственная точка, которую мы не можем сохранить — это точка \((3, 7)\), поэтому она будет падать бесконечно и в итоге будет потеряна. Можно доказать, что мы не можем добиться лучшего ответа. Также обратите внимание, что точка \((5, 3)\) вообще не падает, потому что она уже находится на платформе.
| |
|
|
A. Веселая шутка
реализация
сортировки
Строки
*800
Вот и прошли новогодние праздники. Для Деда Мороза и его коллег пришло время отдыха и приема гостей. Когда встречаются два «Новогодних Деда», то их помощники в честь такого знаменательного события вырезают из картона буквы имен гостя и хозяина, и вывешивают над парадным входом. Однажды ночью, когда все легли спать, кто-то снял все буквы имен наших персонажей. Затем он, возможно, перемешал эти буквы, и положил в одну кучку перед дверью. Наутро так и не удалось найти виновника беспорядка, но всех заинтересовал еще один вопрос: можно ли из букв, сложенных перед дверью, заново составить имена гостя и хозяина? То есть нужно проверить, что не останется лишних, и не придется вырезать дополнительные буквы. Помогите «Новогодним Дедам» и их друзьям разобраться с этой проблемой, если вам даны обе надписи, висевшие над парадной дверью вечером, и буквы в кучке, найденной перед парадной дверью утром. Выходные данные Выведите «YES» без кавычек, если из букв в кучке можно составить имена «Новогодних Дедов», и «NO» без кавычек в противном случае. Примечание В первом примере: из букв, записанных в последней строке можно составить имена, записанные в первых двух, и не останется лишних букв. Во втором примере: в кучке не хватает буквы «P» и лишняя буква «L». В третьем примере: лишняя буква «L».
| |
|
|
C. Очередь
жадные алгоритмы
Конструктив
сортировки
*1800
В Главном Банке Берляндии в очереди в кассу стоят n человек, каждый знает свой рост hi, а также росты остальных людей в очереди. Каждый из них мысленно запомнил число ai — сколько людей, которые выше ростом и стоят в очереди раньше. Проходит некоторое время, и кассир уходит на обеденный перерыв, а люди из очереди рассаживаются на стулья в зале ожидания в произвольном порядке. Когда обеденный перерыв закончился, то выясняется, что никто из них не помнит точного порядка людей в очереди, но каждый помнит свое число ai. Ваша задача — если это возможно, восстановить порядок людей в очереди. Может быть, что допустимых порядков несколько, но вам требуется найти любой из них. Также требуется вывести возможный набор чисел hi — росты людей в очереди, так чтобы числа ai были корректны. Выходные данные Если не существует ни одного допустимого порядка людей в очереди, то выведите единственную строку, содержащую «-1» (без кавычек). В противном случае в n строках выведите людей в формате «namei hi», где hi — целое число от 1 до 109 (включительно), предполагаемый рост человека с именем namei. Людей выводите в порядке очереди от начала к концу. Числа hi не обязаны быть уникальными.
| |
|
|
C. Простота исполнения
Бинарный поиск
дп
Перебор
реализация
сортировки
*1900
После боя с Шикамару Таюя решила, что ее флейта слишком предсказуемая, и поменяла ее на гитару. У гитары Таюи \(6\) струн и бесконечное количество ладов, пронумерованных с \(1\). Если зажать лад номер \(j\) на \(i\)-й струне, то получится нота \(a_{i} + j\). Таюя хочет сыграть мелодию из \(n\) нот. Ноты можно сыграть, используя различные комбинации струны и лада. Простота исполнения зависит от разности максимального и минимального номера используемых ладов. Чем эта величина меньше, тем проще исполнить технику. Требуется определить минимальную возможную разность. Например, если \(a = [1, 1, 2, 2, 3, 3]\), а последовательность нот — \(4, 11, 11, 12, 12, 13, 13\) (что соответствует второму примеру), то можно сыграть первую ноту на первой струне, а все остальные ноты на шестой струне. Тогда максимальный лад будет \(10\), минимальный \(3\), и разница составит \(10 - 3 = 7\), как показано на рисунке. Выходные данные Необходимо вывести минимальную возможную разность номеров используемых ладов. Примечание В первом примере оптимальным будет сыграть первую ноту на первой струне, вторую ноту на второй струне, третью ноту на шестой струне, четвертую ноту на четвертой струне, пятую ноту на пятой струне, шестую ноту на третьей струне. Тогда для исполнения каждой ноты будет использоваться лад \(100\), а разница составит \(100 - 100 = 0\). Во втором примере оптимальным будет, например, сыграть вторую ноту на первой струне, а все остальные ноты на шестой струне. Тогда максимальный лад будет \(10\), минимальный \(3\), и разница составит \(10 - 3 = 7\).
| |
|
|
C. XOR-инверсии
битмаски
Деревья
дп
жадные алгоритмы
математика
разделяй и властвуй
сортировки
Строки
Структуры данных
*2000
Вам задан массив \(a\), состоящий из \(n\) неотрицательных целых чисел. Вы должны выбрать неотрицательное целое число \(x\) и сформировать массив \(b\) из \(n\) элементов по следующему правилу: для всех \(i\) от \(1\) до \(n\), \(b_i = a_i \oplus x\) (\(\oplus\) обозначает операцию побитового исключающего ИЛИ). Назовем инверсией в массиве \(b\) такую пару целых чисел \(i\) и \(j\), что \(1 \le i < j \le n\) и \(b_i > b_j\). Вы должны выбрать \(x\) таким образом, чтобы количество инверсий в массиве \(b\) было минимально возможным. Если таких \(x\) несколько — выведите минимальное из них. Выходные данные Выведите два целых числа: минимально возможное количество инверсией в массиве \(b\), и минимальное значение \(x\), при котором достигается такое количество инверсий. Примечание В первом примере из условия оптимально оставить массив без изменений, выбрав \(x = 0\). Во втором примере из условия при выборе \(x = 14\) получается следующий массив \(b\): \([4, 9, 7, 4, 9, 11, 11, 13, 11]\). В нем \(4\) инверсии: - \(i = 2\), \(j = 3\);
- \(i = 2\), \(j = 4\);
- \(i = 3\), \(j = 4\);
- \(i = 8\), \(j = 9\).
В третьем примере из условия при выборе \(x = 8\) получается следующий массив \(b\): \([0, 2, 11]\). В нем нет ни одной инверсии.
| |
|
|
B. Два массива
жадные алгоритмы
математика
сортировки
*1100
У RedDreamer есть массив \(a\), состоящий из \(n\) неотрицательных целых чисел. Также у RedDreamer есть свое несчастливое число — \(T\). Обозначим неудачливость массива \(b\) длины \(m\) как \(f(b)\) — количество пар целых чисел \((i, j)\), в которых \(1 \le i < j \le m\) и \(b_i + b_j = T\). RedDreamer должен покрасить каждый элемент массива \(a\) в один из двух цветов — белый или черный (цвет каждого элемента выбирается независимо от остальных элементов), а после этого создать два массива \(c\) и \(d\) таким образом, что все белые элементы принадлежат \(c\), а все черные — \(d\) (возможно, что один из этих массивов окажется пустым). RedDreamer хочет покрасить массив так, чтобы значение \(f(c) + f(d)\) было минимально возможным. Например: - если \(n = 6\), \(T = 7\) и \(a = [1, 2, 3, 4, 5, 6]\), можно покрасить \(1\)-й, \(4\)-й и \(5\)-й элемент в белый цвет, а все остальные — в черный. Тогда \(c = [1, 4, 5]\), \(d = [2, 3, 6]\), и \(f(c) + f(d) = 0 + 0 = 0\);
- если \(n = 3\), \(T = 6\) и \(a = [3, 3, 3]\), можно покрасить \(1\)-й элемент в белый цвет, а все остальные — в черный. Тогда \(c = [3]\), \(d = [3, 3]\), и \(f(c) + f(d) = 0 + 1 = 1\).
Помогите RedDreamer раскрасить массив оптимальным образом! Выходные данные Для каждого набора тестовых данных выведите \(n\) целых чисел: \(p_1\), \(p_2\), ..., \(p_n\) (\(p_i\) равняется либо \(0\), либо \(1\)), описывающих раскраску. Если \(p_i\) равняется \(0\), то элемент \(a_i\) — белый и принадлежит массиву \(c\), в противном случае он — черный и принадлежит массиву \(d\). Если существует несколько ответов, при которых достигается минимальное значение \(f(c) + f(d)\), выведите любой из них.
| |
|
|
B. Отрицательные префиксы
жадные алгоритмы
сортировки
*1300
Задан массив \(a\), состоящий из \(n\) целых чисел. Каждая позиция массива \(i\) (\(1 \le i \le n\)) либо заблокирована, либо разблокирована. Разрешается взять все значения на разблокированных позициях, переупорядочить их произвольным образом и вернуть их на разблокированные позиции. Не разрешается удалять значения, добавлять новые или переупорядочивать значения на заблокированных позициях. Например, если \(a = [-1, 1, \underline{3}, 2, \underline{-2}, 1, -4, \underline{0}]\), подчеркнутые позиции заблокированы. Можно получить следующие массивы: - \([-1, 1, \underline{3}, 2, \underline{-2}, 1, -4, \underline{0}]\);
- \([-4, -1, \underline{3}, 2, \underline{-2}, 1, 1, \underline{0}]\);
- \([1, -1, \underline{3}, 2, \underline{-2}, 1, -4, \underline{0}]\);
- \([1, 2, \underline{3}, -1, \underline{-2}, -4, 1, \underline{0}]\);
- и некоторые другие.
Пусть \(p\) будет последовательностью префиксных сумм массива \(a\) после переупорядочения. То есть \(p_1 = a_1\), \(p_2 = a_1 + a_2\), \(p_3 = a_1 + a_2 + a_3\), \(\dots\), \(p_n = a_1 + a_2 + \dots + a_n\). Пусть \(k\) будет максимальным \(j\) (\(1 \le j \le n\)) таким, что \(p_j < 0\). Если нет таких \(j\), что \(p_j < 0\), то \(k = 0\). Ваша цель — переупорядочить значения таким образом, чтобы \(k\) было минимально возможным. Выведите массив \(a\) после переупорядочения такой, что значение \(k\) для него минимально возможно. Если существует несколько ответов, то выведите любой из них. Выходные данные Выведите \(n\) целых чисел — массив \(a\) после переупорядочения. Значение \(k\) (максимальное такое \(j\), что \(p_j < 0\) (или \(0\), если таких \(j\) нет)) должно быть минимально возможно. Для каждой заблокированной позиции выведенное число должно совпадать с начальным. Значения на всех разблокированных позициях должны быть перестановкой начальных значений. Если существует несколько ответов, то выведите любой из них. Примечание В первом наборе входных данных можно переставить все значения как угодно, но любое переупорядочение приведет к \(k = 0\). Например, для переупорядочения \([1, 2, 3]\), \(p=[1, 3, 6]\), поэтому нет такого \(j\), что \(p_j < 0\). Таким образом, \(k = 0\). Во втором наборе не разрешается переупорядочивать элементы вообще. Поэтому массив в выводе должен совпадать с данным массивом. В третьем наборе префиксные суммы в выведенном массиве равны \(p = [-8, -14, -13, -9, -5, 2, 0]\). Максимальное \(j\) равно \(5\), поэтому \(k = 5\). Невозможно переупорядочить так, чтобы было \(k < 5\). В четвертом наборе \(p = [-4, -4, -3, 3, 6]\). В пятом наборе \(p = [-1, 3, 10, 2, 12, 11]\).
| |
|
|
D1. День рождения Сажи (простая версия)
Бинарный поиск
жадные алгоритмы
Конструктив
сортировки
*1000
Это простая версия задачи. Различие между версиями заключается в том, что в простой версии все \(a_i\) различны. Вы можете делать взломы, только если обе версии задачи сданы. Сегодня у Сажи день рождения, и она пойдёт в магазин покупать ледяные сферы. Все \(n\) ледяных сфер стоят в магазине в ряд на одной полке и пронумерованы целыми числами от \(1\) до \(n\) слева направо. У каждой ледяной сферы есть цена — положительное целое число. В этой версии задачи цены всех сфер различны. Ледяная сфера считается дешёвой, если она стоит строго меньше, чем две соседние: ближайшая справа и ближайшая слева. Крайняя слева и крайняя справа ледяные сферы не считаются дешёвыми. Сажа сначала выберет все дешёвые ледяные сферы, а потом купит только их. Вы можете прийти в магазин до Сажи и переставить ледяные сферы так, как хотите. Узнайте, какое максимальное количество ледяных сфер Сажа может купить, и покажите, как для этого нужно переставить сферы. Выходные данные В первой строке выведите максимальное количество ледяных сфер, которое может купить Сажа. Во второй строке выведите цены ледяных сфер в том порядке, в котором их нужно поставить на полку. Если возможных ответов несколько, выведите любой из них. Примечание Если расставить сферы, как \((3, 1, 4, 2, 5)\), то Сажа купит сферы за \(1\) и за \(2\), так как они будут дешёвыми. При этом расставить ледяные сферы так, чтобы Сажа купила \(3\) сферы, невозможно.
| |
|
|
D2. День рождения Сажи (сложная версия)
Бинарный поиск
жадные алгоритмы
Конструктив
Перебор
сортировки
*1500
Это сложная версия задачи. Различие между версиями заключается в том, что в простой версии все \(a_i\) различны. Вы можете делать взломы, только если обе версии задачи сданы. Сегодня у Сажи день рождения, и она пойдёт в магазин покупать ледяные сферы. Все \(n\) ледяных сфер стоят в магазине в ряд на одной полке и пронумерованы целыми числами от \(1\) до \(n\) слева направо. У каждой ледяной сферы есть цена — положительное целое число. Некоторые сферы могут иметь одинаковую цену. Ледяная сфера считается дешёвой, если она стоит строго меньше, чем две соседние: ближайшая справа и ближайшая слева. Крайняя слева и крайняя справа ледяные сферы не считаются дешёвыми. Сажа сначала выберет все дешёвые ледяные сферы, а потом купит только их. Вы можете прийти в магазин до Сажи и переставить ледяные сферы так, как хотите. Узнайте, какое максимальное количество ледяных сфер Сажа может купить, и покажите, как для этого переставить сферы. Выходные данные В первой строке выведите максимальное количество ледяных сфер, которое может купить Сажа. Во второй строке выведите цены ледяных сфер в том порядке, в котором их нужно поставить на полку. Если возможных ответов несколько, выведите любой из них. Примечание В тесте из условия невозможно расставить ледяные сферы так, чтобы Сажа купила \(4\) из них. Если расставить сферы в порядке \((3, 1, 4, 2, 4, 2, 5)\), то Сажа купит одну сферу за \(1\) и две сферы по \(2\).
| |
|
|
A. Сортировка кубов
математика
сортировки
*900
Господи, вы же просто ящики с ногами! Это же ваше единственное назначение — жать на кнопки! Как можно не уметь то, для чего вы были созданы?О, как смешно! Мы тут уже двенадцать часов торчим, а вы всё еще не закончили. Не понимаю, чего это вам так весело. У вас один час! Решите задачу! Уитли решил попробовать себя в создании тестовых камер. Он создал отличную камеру, но в ней не хватало лишь одной детали — кубов. В камеру необходимо было доставить \(n\) кубов. \(i\)-й куб имеет объем \(a_i\). Уитли необходимо расставить кубы так, чтобы они были отсортированы в порядке неубывания объема. Строго говоря, для каждого \(i>1\) должно выполняться условие \(a_{i-1} \le a_i\). Для этого Уитли может менять местами две соседние кубы, то есть для любого \(i>1\) можно поменять местами кубы на позициях \(i-1\) и \(i\). Проблема в том, что Уитли нетерпелив. Если ему придется сделать больше, чем \(\frac{n \cdot (n-1)}{2}-1\) операций обмена, он не захочет делать столь нудную работу. Уитли надо узнать: можно ли расставить кубы в порядке неубывания обьема, соблюдая все условия? Выходные данные Для каждого набора входных данных выведите в отдельной строке одно слово: «YES» (без кавычек), если кубы могут быть отсортированы при заданных условиях, и «NO» (без кавычек) иначе. Примечание В первом наборе входных данных возможно отсортировать все кубы, используя \(7\) операций обмена. Во втором наборе входных данных все кубы уже отсортированы. В третьем наборе входных данных мы можем сделать \(0\) обменов, однако кубы еще не отсортированы, поэтому отсортировать мы их не можем.
| |
|
|
D. Спасти Нибель!
Комбинаторика
сортировки
Структуры данных
*1800
Преодолев множество сложных испытаний, Ори и Сейн наконец-то зажгли Укрытый Светильник и нашли Печать Гумон, ключ к Руинам Форлорна! Когда же они наконец вставили Печать в дверь... ничего не произошло. Ори очень этому удивился, но Сейн быстро все объяснил: хитрые Гумон решили наложить дополнительную защиту на дверь. На двери расположено \(n\) светильников, наполненных светом Древа Духов. Сейн точно знает: \(i\)-й светильник горит в моменты времени с \(l_i\) по \(r_i\) включительно. Чтобы открыть дверь, необходимо выбрать такие \(k\) светильников, что они все горят одновременно в какой-то момент времени. Пока Сейн решает, какие же \(k\) светильников выбрать, Ори стало интересно: а сколько всего существует способов выбрать \(k\) светильников так, чтобы дверь открылась? Может получиться и так, что Сейн что-то напутал, и таких \(k\) светильников просто не существует. Так как это число может быть очень большим, выводите его остаток от деления на \(998\,244\,353\). Выходные данные Выведите одно целое число — ответ на задачу по модулю \(998\,244\,353\). Примечание В первом примере всего девять подходящих наборов из \(k\) ламп: \((1, 2, 3)\), \((1, 2, 4)\), \((1, 2, 5)\), \((1, 2, 6)\), \((1, 3, 6)\), \((1, 4, 6)\), \((2, 3, 6)\), \((2, 4, 6)\), \((2, 6, 7)\). Во втором примере \(k=1\), поэтому подходит каждый светильник. В третьем примере нет двух светильников, горящих одновременно, поэтому ответ 0. В четвертом примере все светильники горят в момент времени \(3\), поэтому ответ 1. В пятом примере всего семь наборов из \(k\) ламп: \((1, 2)\), \((1, 3)\), \((2, 3)\), \((2, 4)\), \((3, 4)\), \((3, 5)\), \((4, 5)\).
| |
|
|
D. Возвращение домой
графы
кратчайшие пути
сортировки
*2300
Юра в свой выходной достаточно уже погулял по городу и решил возвращаться домой. Чтобы возвращение домой прошло безопасно, ему нужно вернуться как можно быстрее. А для этого Юра будет использовать точки быстрого перемещения, которые расположены по всему городу. Давайте расчертим весь город на \(n \times n\) квадратных регионов. Юре нужно добраться из региона с координатами \((s_x,s_y)\) в регион с координатами \((f_x,f_y)\). За одну минуту Юра может переместиться в любой соседний по стороне регион, то есть он может двигаться в четырех направлениях. Также в городе есть \(m\) точек для быстрого перемещения. Их координаты вам (и Юре, конечно) известны. Юра может мгновенно переместиться к точке быстрого перемещения, если сейчас он находится в клетке с той же самой координатой по \(x\) или по \(y\). Помогите Юре посчитать, какое минимальное время потребуется ему для возвращения домой. Выходные данные В единственной строке выведите минимальное время для возвращения домой. Примечание В первом примере Юра должен попасть в \((5, 5)\) из \((1, 1)\). Он может это сделать за \(5\) минут, сначала использовав вторую точку быстрого перемещения (потому что ее \(y\) координата равна \(y\) координате Юры), а затем пройдя пешком \((4, 1) \to (4, 2) \to (4, 3) \to (5, 3) \to (5, 4) \to (5, 5)\).
| |
|
|
G. Years
сортировки
Структуры данных
*1300
During one of the space missions, humans have found an evidence of previous life at one of the planets. They were lucky enough to find a book with birth and death years of each individual that had been living at this planet. What's interesting is that these years are in the range \((1, 10^9)\)! Therefore, the planet was named Longlifer. In order to learn more about Longlifer's previous population, scientists need to determine the year with maximum number of individuals that were alive, as well as the number of alive individuals in that year. Your task is to help scientists solve this problem! Output Print two integer numbers separated by blank character, \(y\) — the year with a maximum number of people alive and \(k\) — the number of people alive in year \(y\). In the case of multiple possible solutions, print the solution with minimum year. Note You can assume that an individual living from \(b\) to \(d\) has been born at the beginning of \(b\) and died at the beginning of \(d\), and therefore living for \(d\) - \(b\) years.
| |
|
|
M. Ancient Language
графы
сортировки
*2200
While exploring the old caves, researchers found a book, or more precisely, a stash of mixed pages from a book. Luckily, all of the original pages are present and each page contains its number. Therefore, the researchers can reconstruct the book. After taking a deeper look into the contents of these pages, linguists think that this may be some kind of dictionary. What's interesting is that this ancient civilization used an alphabet which is a subset of the English alphabet, however, the order of these letters in the alphabet is not like the one in the English language. Given the contents of pages that researchers have found, your task is to reconstruct the alphabet of this ancient civilization using the provided pages from the dictionary. Output Output a string representing the reconstructed alphabet of this ancient civilization. If the book found is not a dictionary, output "IMPOSSIBLE" without quotes. In case there are multiple solutions, output any of them.
| |
|
|
D. Ненулевые отрезки
жадные алгоритмы
Конструктив
сортировки
Структуры данных
*1500
У Коли есть массив целых чисел \(a_1, a_2, \dots, a_n\). Числа в массиве могут быть и положительными, и отрицательными, но так как Коля не любит число \(0\), то таких чисел в его массиве нет. Коле не нравится, что сумма элементов на некоторых подотрезках его массива может быть равна \(0\). Под подотрезком массива следует понимать некоторую непустую последовательность подряд идущих элементов массива. Вы должны помочь Коле и сделать так, чтобы в его массиве не было подотрезков с суммой элементов равной \(0\). Для этого вы можете вставлять в его массив произвольные целые числа между любыми соседними элементами массива (числа могут быть любые: положительные, отрицательные, \(0\), любые по абсолютной величине, даже не представимые в стандартных типах данных во многих языках программирования). Определите минимальное количество произвольных целых чисел, которые нужно добавить в массив Коли таким образом, чтобы после этого в массиве не было подотрезков с суммой элементов равной \(0\). Выходные данные Выведите минимальное количество произвольных целых чисел, которые нужно добавить в массив Коли таким образом, чтобы после этого в массиве не было подотрезков с суммой элементов равной \(0\). Примечание В первом примере есть один подотрезок, сумма элементов которого равна \(0\). Он начинается со второго элемента и заканчивается в четвертом элементе. Достаточно добавить один элемент, чтобы в массиве не было подотрезков с суммой элементов равной нулю. Например, можно добавить число \(1\) между вторым и третьим элементами массива. Во втором примере изначально нет подотрезков с суммой элементов равной \(0\), поэтому никаких чисел в массив добавлять не нужно.
| |
|
|
A. Избегая ноля
математика
сортировки
*900
Вам дан массив из \(n\) целых чисел \(a_1,a_2,\dots,a_n\). Вы должны создать массив из \(n\) целых чисел \(b_1,b_2,\dots,b_n\) такой, что: - Массив \(b\) — это перестановка массива \(a\), т.е. он содержит одни и те же значения, и каждое из них встречается одинаковое количество раз в этих массивах. Другими словами, мультимножества \(\{a_1,a_2,\dots,a_n\}\) и \(\{b_1,b_2,\dots,b_n\}\) должны быть равны.
Например, если \(a=[1,-1,0,1]\), то \(b=[-1,1,1,0]\) и \(b=[0,1,-1,1]\) — это перестановки \(a\), но \(b=[1,-1,-1,0]\) и \(b=[1,0,2,-3]\) — это не перестановки \(a\). - Для всех \(k=1,2,\dots,n\) сумма первых \(k\) элементов \(b\) не равна нулю. Формально, для всех \(k=1,2,\dots,n\) должно выполняться \(\)b_1+b_2+\cdots+b_k\not=0\,.\(\)
Если массив \(b_1,b_2,\dots, b_n\) с необходимыми свойствами не существует, необходимо вывести NO. Выходные данные Для каждого набора входных данных, если не существует массива \(b_1,b_2,\dots,b_n\) с требуемыми свойствами, выведите одну строку со словом NO. В противном случае выведите строку со словом YES, а затем строку с \(n\) целыми числами \(b_1,b_2,\dots,b_n\). Если существует более одного массива \(b_1,b_2,\dots,b_n\), удовлетворяющего требуемым свойствам, то можно вывести любой из них. Примечание Пояснение первого набора входных данных: Массив с нужными свойствами равен \(b=[1,-2,3,-4]\). Для этого массива все выполняется: - Первый элемент \(b\) равен \(1\).
- Сумма первых двух элементов \(b\) равна \(-1\).
- Сумма первых трех элементов \(b\) равна \(2\).
- Сумма первых четырех элементов \(b\) равна \(-2\).
Пояснение второго набора входных данных: Поскольку все значения в \(a\) равны \(0\), любая перестановка \(b\) массива \(a\) будет иметь все элементы, равные \(0\), и поэтому для нее явно не сможет быть выполнено второе свойство из условия (например, потому что \(b_1=0\)). Следовательно, в данном случае ответом будет NO. Пояснение третьего набора входных данных:. Массив с нужными свойствами равен \(b=[1, 1, -1, 1, -1]\). Для этого массива все выполняется: - Первый элемент \(b\) равен \(1\).
- Сумма первых двух элементов \(b\) равна \(2\).
- Сумма первых трех элементов \(b\) равна \(1\).
- Сумма первых четырех элементов \(b\) равна \(2\).
- Сумма первых пяти элементов \(b\) равна \(1\).
Пояснение четвертого набора входных данных: Массив с нужными свойствами равен \(b=[-40,13,40,0,-9,-31]\). Для этого массива все выполняется: - Первый элемент \(b\) равен \(-40\).
- Сумма первых двух элементов \(b\) равна \(-27\).
- Сумма первых трех элементов \(b\) равна \(13\).
- Сумма первых четырех элементов \(b\) равна \(13\).
- Сумма первых пяти элементов \(b\) равна \(4\).
- Сумма первых шести элементов \(b\) равна \(-27\).
| |
|
|
B. Шахматный мошенник
жадные алгоритмы
реализация
сортировки
*1400
Вам нравится играть в шахматные турниры онлайн. В своем последнем турнире вы сыграли \(n\) игр. В этой задаче, каждая шахматная партия заканчивается либо победой, либо поражением (ничьих не бывает). Когда вы проигрываете партию, вы получаете \(0\) очков. Когда вы выигрываете, вы получаете \(1\) или \(2\) очка: если вы выиграли и предыдущую партию, вы получаете \(2\) очка, в противном случае вы получаете \(1\) очко. Если вы выиграли самую первую игру турнира, вы получаете \(1\) очко (так как не существует "предыдущей игры"). Итоги \(n\) игр записываются в строку \(s\) длиной \(n\): \(i\)-й символ \(s\) — W, если вы выиграли \(i\)-ю игру, и L, если вы проиграли \(i\)-ю игру. После окончания турнира вы замечаете баг на сайте, который позволяет вам изменить результат не более \(k\) игр (то есть, не более \(k\) раз вы можете изменить один символ L на W, или W на L). Так как ваша единственная цель — улучшение вашего шахматного рейтинга, вы решили сжульничать и использовать данный баг. Вычислите максимальное количество очков, которое вы можете получить с помощью жульничества оптимальным способом. Выходные данные Для каждого теста выведите одно целое число — максимальное количество очков, который вы можете получить, обманув оптимальным способом. Примечание Пояснение первого набора входных данных. Изначально ваш счет равен \(2\). Действительно, вы выиграли первую игру, за что вы получили \(1\) очко, а также выиграли третью, за что вы получили еще \(1\) очко (а не \(2\), потому что вы проиграли вторую игру). Лучшим способом сжульничать является изменение исхода второй и четвертой игры. При этом вы выигрываете первые четыре партии (строка исходов становится WWWWL). Следовательно, ваш новый счет будет равен \(7=1+2+2+2\): \(1\) очко за первую партию и по \(2\) очка за вторую, третью и четвертую партию. Пояснение второго набора входных данных.. Изначально ваш счет равен \(3\). Действительно, вы выиграли четвертую игру, за что вы получили \(1\) очко, а также выиграли пятую игру, так что вы получили \(2\) очка (так как вы выиграли и предыдущую игру). Лучшим способом сжульничать является изменение исхода первой, второй, третьей и шестой игры. При этом Вы выигрываете все игры (строка исходов становится WWWWWW). Следовательно, новый счет будет равен \(11 = 1+2+2+2+2+2\): \(1\) очко за первую партию и \(2\) очка за все остальные партии.
| |
|
|
E. Морковка для кроликов
Бинарный поиск
жадные алгоритмы
математика
сортировки
Структуры данных
*2200
В зоопарке Сингапура есть несколько кроликов. Чтобы накормить их, смотритель зоопарка купил \(n\) морковок, имеющих длины \(a_1, a_2, a_3, \ldots, a_n\). Кролики очень быстро размножаются. У смотрителя зоопарка сейчас есть \(k\) кроликов и недостаточно морковок, чтобы прокормить их всех. Чтобы решить эту проблему, он решил разрезать морковки так, чтобы суммарно получилось \(k\) кусков. По некоторой причине длины всех получившихся морковок должны быть положительными целыми числами. Кролику очень сложно кушать длинную морковку, поэтому время, которое требуется, чтобы съесть морковку длины \(x\), равно \(x^2\). Помогите смотрителю зоопарка разделить его морковки и найдите минимальное суммарное время, которое потребуется кроликам, чтобы их съесть. Выходные данные Выведите одно целое число: минимальное суммарное время, которое потребуется кроликам, чтобы съесть морковки при каком-то их разделении. Примечание Для первого теста оптимальные размеры морковок это \(\{1,1,1,2,2,2\}\). Время, которое потребуется, чтобы съесть эти морковки, равно \(1^2+1^2+1^2+2^2+2^2+2^2=15\). Для второго теста оптимальные размеры морковок это \(\{4,5,5,5\}\). Время, которое потребуется, чтобы съесть эти морковки, равно \(4^2+5^2+5^2+5^2=91\).
| |
|
|
B. Бочки
жадные алгоритмы
реализация
сортировки
*800
Перед вами в ряд выстроены \(n\) бочек, пронумерованные слева направо, начиная с единицы. В \(i\)-й бочке налито \(a_i\) литров воды. Вы можете переливать воду из одной бочки в другую. В ходе одного переливания вы можете выбрать две разные бочки с номерами \(x\) и \(y\) (бочка \(x\) должна быть непустой) и перелить любое возможное количество воды из бочки \(x\) в бочку \(y\) (возможно, всю воду). Считайте, что каждая бочка имеет бесконечную емкость, то есть в бочку можно налить сколько угодно воды. Определите максимальную разность между бочкой с наибольшим количество воды и бочкой с наименьшим количеством воды, если вы можете сделать не более \(k\) переливаний. Несколько примеров: - если у вас есть четыре бочки, в каждой из которых по \(5\) литров воды, и \(k = 1\), вы можете вылить \(5\) литров из второй бочки в четвертую, тогда количества литров воды в бочках будут равны \([5, 0, 5, 10]\), и разность между максимальным и минимальным равна \(10\);
- если все бочки — пустые, вы не сможете сделать ни одного переливания, и разность между максимальным и минимальным количеством будет равна \(0\).
Выходные данные Для каждого набора входных данных, выведите максимальную разность между бочкой с наибольшим количество воды и бочкой с наименьшим количеством воды, если вы можете сделать не более \(k\) переливаний.
| |
|
|
C. Шеф Монокарп
дп
жадные алгоритмы
математика
Паросочетания
Потоки
сортировки
*1800
Шеф Монокарп только что поставил \(n\) блюд на плиту. Он знает, что оптимальное время готовки \(i\)-го блюда равно \(t_i\) минут. В любую положительную целую минуту \(T\) Монокарп может снять не более одного блюда с плиты. Если достать \(i\)-е блюдо в некоторую минуту \(T\), то его испорченность будет равна \(|T - t_i|\) — модуль значения разности между \(T\) и \(t_i\). Как только блюдо снято с плиты, его уже нельзя поставить обратно. Монокарп должен снять все блюда с плиты. Какую минимальную суммарную испорченность он может получить? Выходные данные На каждый набор входных данных выведите одно целое число — минимальную суммарную испорченность блюд, которую может получить Монокарп, когда снимет все блюда с плиты. Помните, что Монокарп может снимать блюда только в положительные целые минуты и не более одного в минуту. Примечание В первом наборе входных данных Монокарп может снять блюда в минуты \(3, 1, 5, 4, 6, 2\). Тогда суммарная испорченность будет равна \(|4 - 3| + |2 - 1| + |4 - 5| + |4 - 4| + |6 - 5| + |2 - 2| = 4\). Во втором наборе входных данных Монокарп может снять блюда в минуты \(4, 5, 6, 7, 8, 9, 10\). В третьем наборе входных данных Монокарп может снять блюдо в минут \(1\). В четвертом наборе входных данных Монокарп может снять блюда в минуты \(5, 1, 2, 4, 3\). В пятом наборе входных данных Монокарп может снять блюда в минуты \(1, 3, 4, 5\).
| |
|
|
B. Валерий против всех
жадные алгоритмы
Конструктив
сортировки
Структуры данных
*1000
Вам дан массив \(b\) длиной \(n\). Определим другой массив \(a\), также длиной \(n\), в котором \(a_i = 2^{b_i}\) (\(1 \leq i \leq n\)). Валерий утверждает, что любые два непересекающихся подмассива \(a\) имеют разную сумму элементов. Вы хотите определить, ошибается ли он. Более формально, необходимо определить, существуют ли четыре целых числа \(l_1,r_1,l_2,r_2\), которые удовлетворяют следующим условиям: - \(1 \leq l_1 \leq r_1 \lt l_2 \leq r_2 \leq n\);
- \(a_{l_1}+a_{l_1+1}+\ldots+a_{r_1-1}+a_{r_1} = a_{l_2}+a_{l_2+1}+\ldots+a_{r_2-1}+a_{r_2}\).
Если такие четыре целых числа существуют, вы докажете, что Валерий ошибается. Существуют ли они? Массив \(c\) является подмассивом массива \(d\), если \(c\) может быть получен из \(d\) удалением нескольких (возможно, ни одного или всех) элементов из начала и нескольких (возможно, ни одного или всех) элементов из конца. Выходные данные Для каждого набора входных данных, если в \(a\) есть два непересекающихся подмассива, которые имеют одинаковую сумму, выведите YES в отдельной строке. В противном случае выведите NO в отдельной строке. Также обратите внимание, что каждая буква может быть в любом регистре. Примечание В первом случае \(a = [16,8,1,2,4,1]\). Значения \(l_1 = 1\), \(r_1 = 1\), \(l_2 = 2\) и \(r_2 = 6\) подходят, потому что \(16 = (8+1+2+4+1)\). Во втором случае можно проверить, что такие подмассивы выбрать невозможно.
| |
|
|
B. Спасение города
дп
жадные алгоритмы
математика
сортировки
*1300
Бертаун это город, в котором находятся \(n\) зданий, расположенных вдоль одной прямой. Служба безопасности города обнаружила, что некоторые здания заминированы. Была составлена карта, представляющая из себя строку длиной \(n\), где \(i\)-й символ равен «1», если под зданием номер \(i\) находится мина и «0» в противном случае. Лучший сапер Бертауна умеет активировать мины так, чтобы здания над ними не пострадали. Когда мина под зданием с номером \(x\) активируется, она взрывается и активирует две соседние мины под зданиями с номерами \(x-1\) и \(x+1\) (если мины под зданием не было, то ничего не происходит). Таким образом, достаточно активировать одну любую мину на непрерывном отрезке из мин, чтобы активировать все мины этого отрезка. За ручную активацию одной мины сапер берет \(a\) монет. Он может повторять эту операцию сколько угодно раз. Также сапер может сам поместить мину под здание, где ее не было. За такую операцию он берет \(b\) монет. Он также может повторять эту операцию сколько угодно раз. Операции сапер может проводить в любом порядке. Вы хотите взорвать все мины в городе, чтобы сделать его безопасным. Найдите минимальное количество монет, которое придется заплатить саперу, чтобы после его действий в городе не осталось мин. Выходные данные Для каждого набора тестовых данных выведите одно целое число — минимальное количество монет, которое придется заплатить саперу. Примечание Во втором наборе тестовых данных, если мы поместим мину под четвертое здание и после этого активируем ее, то активируются все мины на поле. Стоимость таких операций равна шести, \(b=1\) монета за помещение мины и \(a=5\) монет за активацию.
| |
|
|
C. Дилемма о доставке
Бинарный поиск
жадные алгоритмы
сортировки
*1400
Петя готовится к своему дню рождения. Он решил, что на праздничном столе будут \(n\) разных блюд, пронумерованных от \(1\) до \(n\). Так как Петя не любит готовить, он хочет заказать эти блюда в ресторанах. К сожалению, все блюда готовятся в разных ресторанах и поэтому Пете нужно забрать свои заказы из \(n\) разных мест. Чтобы ускорить этот процесс, он хочет заказать доставку курьером в некоторых ресторанах. Таким образом, для каждого блюда есть два варианта как Петя сможет его получить: - блюдо привезет курьер из ресторана \(i\), в этом случае курьер прибудет через \(a_i\) минут,
- Петя самостоятельно сходит в ресторан \(i\) и заберет блюдо, на это он потратит \(b_i\) минут.
У каждого ресторана есть свои курьеры и они начинают доставку заказа в тот же момент, как Петя выходит из дома. Иными словами все курьеры работают параллельно. Петя должен посетить все рестораны в которых он не выбрал доставку, делает он это последовательно. Например, если Петя хочет заказать \(n = 4\) блюд и \(a = [3, 7, 4, 5]\), а \(b = [2, 1, 2, 4]\), то он может заказать доставку из первого и четвертого ресторана, а во второй и третий сходить самостоятельно. Тогда курьер первого ресторана привезет заказ через \(3\) минуты, курьер четвертого ресторана привезет заказ через \(5\) минут, а Петя заберет оставшиеся блюда за \(1 + 2 = 3\) минуты. Таким образом, через \(5\) минут все блюда окажутся у Пети дома. Найдите минимальное время, через которое все блюда могут оказаться у Пети дома. Выходные данные Для каждого набора тестовых данных выведите одно целое число — минимальное время, через которое все блюда могут оказаться у Пети дома.
| |
|
|
B. Разбивай и суммируй
Комбинаторика
математика
сортировки
*1900
Вам задан массив \(a\) длины \(2n\). Рассмотрим разбиение массива \(a\) на две подпоследовательности \(p\) и \(q\) длины \(n\) (каждый элемент массива \(a\) должен попасть ровно в одну подпоследовательность: в \(p\) или в \(q\)). Отсортируем \(p\) по неубыванию, а \(q\) — по невозрастанию, и получим последовательности \(x\) и \(y\), соответственно. Тогда назовём стоимостью разбиения \(f(p, q) = \sum_{i = 1}^n |x_i - y_i|\). Вам необходимо найти сумму \(f(p, q)\) по всем корректным разбиениям массива \(a\). Так как это число может быть слишком большим, требуется посчитать остаток от деления его на \(998244353\). Выходные данные Выведите одно целое число — ответ на задачу по модулю \(998244353\). Примечание Два разбиения массива считаются различными, если отличаются наборы индексов элементов, входящих в подпоследовательность \(p\). В первом примере существует два корректных разбиения массива \(a\): - \(p = [1]\), \(q = [4]\), тогда \(x = [1]\), \(y = [4]\), \(f(p, q) = |1 - 4| = 3\)
- \(p = [4]\), \(q = [1]\), тогда \(x = [4]\), \(y = [1]\), \(f(p, q) = |4 - 1| = 3\).
Во втором примере существует шесть корректных разбиений массива \(a\): - \(p = [2, 1]\), \(q = [2, 1]\) (в подпоследовательность \(p\) выбраны элементы с индексами \(1\) и \(2\) исходного массива);
- \(p = [2, 2]\), \(q = [1, 1]\);
- \(p = [2, 1]\), \(q = [1, 2]\) (в подпоследовательность \(p\) выбраны элементы с индексами \(1\) и \(4\) исходного массива);
- \(p = [1, 2]\), \(q = [2, 1]\);
- \(p = [1, 1]\), \(q = [2, 2]\);
- \(p = [2, 1]\), \(q = [2, 1]\) (в подпоследовательность \(p\) выбраны элементы с индексами \(3\) и \(4\)).
| |
|
|
A. Переупорядочивание массива
жадные алгоритмы
сортировки
*800
Даны массивы \(a\) и \(b\) длины \(n\), состоящие из целых чисел, и целое число \(x\). Определите, можно ли переупорядочить элементы массива \(b\) так, чтобы \(a_i + b_i \leq x\) было выполнено для всех \(i\) (\(1 \le i \le n\)). Выходные данные Для каждого набора входных данных выведите Yes, если можно переупорядочить элементы массива \(b\) так, чтобы неравенство \(a_i + b_i \leq x\) было выполнено для всех \(i\) (\(1 \le i \le n\)), или No в противном случае. Каждый символ можно выводить в любом регистре. Примечание В первом наборе входных данных можно сделать массив \(b\) равным \([1, 2, 1]\). Тогда \(1 + 1 \leq 4\); \(2 + 2 \leq 4\); \(3 + 1 \leq 4\). Во втором наборе можно сделать массив \(b\) равным \([5, 2]\). Тогда \(1 + 5 \leq 6\); \(4 + 2 \leq 6\). В третьем наборе, как не переставляй элементы массива \(b\), в любом случае \(a_4 + b_4 = 4 + b_4 > 4\). В четвёртом наборе существует лишь одна перестановка массива \(b\), но она не подходит, поскольку \(5 + 5 > 5\).
| |
|
|
A. Рюкзак
жадные алгоритмы
Конструктив
сортировки
*1300
У вас есть рюкзак вместимостью \(W\). У вас также есть \(n\) предметов, вес \(i\)-го из них равен \(w_i\). Вы хотите поместить некоторые из этих предметов в рюкзак таким образом, чтобы их общий вес \(C\) составлял как минимум половину его вместимости, но (очевидно) не превышал ее. Формально, \(C\) должно удовлетворять: \(\lceil \frac{W}{2}\rceil \le C \le W\). Выведите список предметов, которые вы поместите в рюкзак, или определите, что удовлетворить условиям невозможно. Если есть несколько возможных списков предметов, удовлетворяющих условиям, то можно вывести любой. Обратите внимание, что вы не должны максимизировать сумму весов элементов в рюкзаке. Выходные данные Для каждого набора входных данных, если нет решения, выведите одно целое число \(-1\). Если есть решение, состоящее из \(m\) предметов, выведите \(m\) в первой строке и \(m\) целых чисел \(j_1\), \(j_2\), ..., \(j_m\) (\(1 \le j_i \le n\), где все \(j_i\) попарно различны) во второй строке — индексы предметов, которые вы хотели бы упаковать в рюкзак. Если есть несколько возможных списков предметов, удовлетворяющих условиям, то можно вывести любой. Обратите внимание, что вы не должны максимизировать сумму весов элементов в рюкзаке. Примечание В первом наборе входных данных, вы можете взять предмет весом \(3\) и полностью заполнить рюкзак. Во втором наборе входных данных, все предметы больше, чем рюкзак. Следовательно, ответ \(-1\). В третьем наборе входных данных вы заполните рюкзак ровно наполовину.
| |
|
|
A. Избежать Trygub
Конструктив
сортировки
*800
Строка \(b\) является подпоследовательностью строки \(a\), если \(b\) может быть получена из \(a\) удалением нескольких (возможно нуля или всех) символов. Например, «xy» подпоследовательность «xzyw» и «xy», но не «yx». Вам дана строка \(a\). Ваша задача переставить символы \(a\), так что «trygub» не будет подпоследовательностью получившейся строки. Другими словами, вы должны найти строку \(b\), которая является перестановкой символов строки \(a\) и «trygub» не является подпоследовательностью \(b\). У нас есть замечательное, верное доказательство того, что любая строка может быть переупорядочена так, чтобы не содержать «trygub» в качестве подпоследовательности, но условие этой задачи слишком короткое для его изложения. Выходные данные Для каждого набора входных данных выведите строку \(b\) длины \(n\), которая является перестановкой символов строки \(a\) и «trygub» не является ее подпоследовательностью. Если существует несколько возможных строк \(b\), вы можете вывести любую. Примечание В первом наборе входных данных «bugyrtnotna» не содержит «trygub» как подпоследовательность. Она содержит все символы «trygub», но не в правильном порядке, поэтому это не подпоследовательность. Во втором наборе входных данных мы можем не менять порядок символов, потому что это не требуется. В третьем наборе входных данных «bruhtrywatchinggura» содержит «trygu» как подпоследовательность, но не содержит «trygub».
| |
|
|
B. Кубики
Бинарный поиск
жадные алгоритмы
математика
сортировки
*1400
Вас попросили присмотреть за вашим племянником, который любит играть с кубиками необычным способом. У него есть \(n\) коробок и в \(i\)-й коробке лежит \(a_i\) кубиков. Его игра состоит из двух ходов: - он выбирает произвольную коробку \(i\);
- он пытается переложить все кубики из \(i\)-й коробки в другие коробки.
Если у него получится сделать равное количество кубиков в каждой из оставшихся \(n - 1\) коробок, то он обрадуется, а если не получится — расстроится. Заметьте, что ваш племянник может перекладывать кубики только из выбранной коробки; он не может перекладывать кубики из других коробок. Вы не хотите, чтобы ваш племянник расстраивался, поэтому вы решили доложить несколько дополнительных кубиков в некоторые коробки так, что независимо от того, какую коробку \(i\) он выберет, он не расстроится. Какое минимальное количество кубиков вам нужно доложить? Выходные данные Для каждого набора входных данных, выведите одно целое число — минимальное количество кубиков, которое вам нужно доложить. Можно доказать, что ответ всегда существует, то есть количество кубиков конечное. Примечание В первом наборе входных данных, вы можете, например, положить один дополнительный блок в первую коробку и сделать \(a = [4, 2, 2]\). Если ваш племянник выберет коробку с \(4\) кубиками, то он переложит два кубика во вторую коробку и два кубика в третью. Если же он выберет коробку с \(2\) кубиками, то оно переложит эти два кубика в другую коробку с \(2\) кубиками. Во втором наборе, вам не нужно докладывать кубики, потому что независимо от того, какую коробку он выберет, он всегда сможет выровнять количество кубиков в других коробках. В третьем наборе, вам нужно доложить хотя бы \(3\) кубика. Например, вы можете положить \(2\) кубика в первую коробку и \(1\) кубик в третью. Вы получите \(a = [2, 3, 1]\).
| |
|
|
E. Два разбора
дп
жадные алгоритмы
Перебор
сортировки
*2500
Только что завершился Берляндский региональный отбор к ICPC. Было \(m\) участников, пронумерованных от \(1\) до \(m\), которые решали \(n\) задач, пронумерованных от \(1\) до \(n\). Сейчас будет проходить разбор. Два автора задач готовы разобрать по \(k\) последовательных задач каждый. Авторы выбирают отрезки из \(k\) последовательных задач независимо друг от друга. Отрезки могут совпадать, пересекаться или не пересекаться вообще. \(i\)-й участник хочет послушать разбор всех последовательных задач с \(l_i\) по \(r_i\). Каждый участник всегда выбирает слушать разбор только того автора, который расскажет большее количество интересных ему задач. Пусть это количество будет равно \(a_i\). Никто не может слушать разбор обоих авторов, даже если их отрезки не пересекаются. Авторы задач хотят выбрать отрезки из \(k\) последовательных задач для себя так, чтобы сумма \(a_i\) по всем участникам была как можно больше. Выходные данные Выведите одно целое число — наибольшую возможную сумму \(a_i\) по всем участникам. Примечание В первом примере первый автор может рассказать разбор по задачам с \(1\) по \(3\), а второй — с \(6\) по \(8\). Тогда последовательность \(a_i\) будет \([3, 2, 3, 3, 3]\). Обратите внимание, что последний участник не может послушать обоих авторов, он выбирает только того, кто расскажет ему больше интересующих его задач. Во втором примере первый может рассказать задачи с \(2\) по \(4\), а второй — с \(4\) по \(6\). В третьем примере первый может рассказать задачи с \(1\) по \(1\), а второй — с \(2\) по \(2\). Или с \(4\) по \(4\) и с \(3\) по \(3\). Любая пара различных задач даст одинаковую сумму \(2\). В четвертом примере первый может рассказать задачи с \(1\) по \(5\) и второй тоже с \(1\) по \(5\).
| |
|
|
D. Последовательность и обмены
дп
жадные алгоритмы
сортировки
*1600
Вам задана последовательность \(a\), состоящая из \(n\) целых чисел \(a_1, a_2, \dots, a_n\), а также целое число \(x\). Ваша задача заключается в том, чтобы сделать последовательность \(a\) отсортированной (последовательность отсортирована, если выполняется условие \(a_1 \le a_2 \le a_3 \le \dots \le a_n\)). Чтобы отсортировать последовательность, вы можете выполнять следующую операцию любое количество раз (возможно, ноль): выбрать целое число \(i\) такое, что \(1 \le i \le n\) и \(a_i > x\), поменять местами значения \(a_i\) и \(x\). Например, если \(a = [0, 2, 3, 5, 4]\), \(x = 1\), возможна следующая последовательность операций: - выбрать \(i = 2\) (это возможно, так как \(a_2 > x\)), получим \(a = [0, 1, 3, 5, 4]\), \(x = 2\);
- выбрать \(i = 3\) (это возможно, так как \(a_3 > x\)), получим \(a = [0, 1, 2, 5, 4]\), \(x = 3\);
- выбрать \(i = 4\) (это возможно, так как \(a_4 > x\)), получим \(a = [0, 1, 2, 3, 4]\), \(x = 5\).
Вычислите минимальное количество операций, которые необходимо выполнить, чтобы \(a\) стала отсортированной, или сообщите, что это невозможно. Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество операций, которые необходимо выполнить, чтобы сделать \(a\) отсортированной, или \(-1\), если это невозможно.
| |
|
|
D. Разделяй и суммируй
Бинарный поиск
Перебор
разделяй и властвуй
реализация
сортировки
Структуры данных
*1600
Майк получил в подарок на день рождения массив \(a\) длины \(n\) и решил протестировать, насколько он красивый. Массив пройдет \(i\)-й тест на красоту, если существует способ из изначального массива путем некоторого (возможно, нулевого) количества операций разреза получить массив с суммой элементов, равной \(s_i\). Операция разреза массива происходит следующим образом: - Вычисляется \(mid = \lfloor\frac{max(array) + min(array)}{2}\rfloor\), где \(max\) и \(min\) — это функции нахождения максимального и минимального элемента массива. Иными словами, \(mid\) равно сумме максимального и минимального элементов \(array\), деленной на \(2\) с округлением вниз.
- Далее массив разделяется на две части \(\mathit{left}\) и \(right\). В \(\mathit{left}\) попадают все элементы массива, которые имеют значение меньшее либо равное \(mid\), а в массив \(right\) попадают все элементы, которые больше \(mid\). Элементы в \(\mathit{left}\) и \(right\) сохраняют свой относительный порядок, который был в \(array\).
- Третьим шагом выбирается, какой из массивов \(\mathit{left}\) или \(right\) мы хотим оставить. Выбранный массив заменит собой текущий, а другой навсегда удалится.
Вам требуется помочь Майку определить результаты \(q\) тестов на красоту. Заметьте, что вы тестируете красоту массива \(a\), поэтому вы начинаете каждый тест на красоту с изначальным (заданным) массивом \(a\). Таким образом, первый разрез (если он необходим) всегда совершается над массивом \(a\). Выходные данные Для каждого набора входных данных выведите \(q\) строк, каждая из которых должна содержать «Yes», если соответствующий тест на красоту пройден, и «No» в противном случае. Примечание Объяснение первого набора входных данных: - Получить массив с суммой \(s_1 = 1\) мы можем следующим способом:
1.1 \(a = [1, 2, 3, 4, 5]\), \(mid = \frac{1+5}{2} = 3\), \(\mathit{left} = [1, 2, 3]\), \(right = [4, 5]\). Мы выбираем оставить массив \(\mathit{left}\). 1.2 \(a = [1, 2, 3]\), \(mid = \frac{1+3}{2} = 2\), \(\mathit{left} = [1, 2]\), \(right = [3]\). Мы выбираем оставить массив \(\mathit{left}\). 1.3 \(a = [1, 2]\), \(mid = \frac{1+2}{2} = 1\), \(\mathit{left} = [1]\), \(right = [2]\). Мы выбираем оставить массив \(\mathit{left}\) с суммой, равной \(1\). - Массив с суммой \(s_2 = 8\) можно показать, что получить невозможно.
- Получить массив с суммой \(s_3 = 9\) мы можем следующим способом:
3.1 \(a = [1, 2, 3, 4, 5]\), \(mid = \frac{1+5}{2} = 3\), \(\mathit{left} = [1, 2, 3]\), \(right = [4, 5]\). Мы выбираем оставить массив \(right\) с суммой, равной \(9\). - Массив с суммой \(s_4 = 12\) можно показать, что получить невозможно.
- Получить массив с суммой \(s_5 = 6\) мы можем следующим способом:
5.1 \(a = [1, 2, 3, 4, 5]\), \(mid = \frac{1+5}{2} = 3\), \(\mathit{left} = [1, 2, 3]\), \(right = [4, 5]\). Мы выбираем оставить массив \(\mathit{left}\) с суммой, равной \(6\).
Объяснение второго набора входных данных: - Массив с суммой \(s_1 = 1\) можно показать, что получить невозможно.
- Получить массив с суммой \(s_2 = 2\) мы можем следующим способом:
2.1 \(a = [3, 1, 3, 1, 3]\), \(mid = \frac{1+3}{2} = 2\), \(\mathit{left} = [1, 1]\), \(right = [3, 3, 3]\). Мы выбираем оставить массив \(\mathit{left}\) с суммой \(2\). - Массив с суммой \(s_3 = 3\) можно показать, что получить невозможно.
- Получить массив с суммой \(s_4 = 9\) мы можем следующим способом:
4.1 \(a = [3, 1, 3, 1, 3]\), \(mid = \frac{1+3}{2} = 2\), \(\mathit{left} = [1, 1]\), \(right = [3, 3, 3]\). Мы выбираем оставить массив \(right\) с суммой \(9\). - Мы можем получить \(s_5 = 11\) без операций разреза, потому что изначальная сумма уже была равна \(11\).
| |
|
|
E1. Близкие наборы (простая версия)
Бинарный поиск
Комбинаторика
математика
сортировки
*1500
Это простая версия этой задачи. Единственное различие между простой и сложной версиями заключается в ограничениях на \(k\) и \(m\) (в этой версии \(k=2\), \(m=3\)). Также в этой версии задачи НЕ НУЖНО выводить ответ по какому-либо модулю. Вам задана последовательность \(a\) длины \(n\), состоящая из целых чисел от \(1\) до \(n\). Среди чисел могут быть одинаковые. Найдите количество наборов из \(m = 3\) элементов, таких что максимальное число в наборе отличается от минимального не больше, чем на \(k = 2\). Формально, в этой задаче вам нужно найти количество троек индексов \(i < j < z\), таких что \(\)\max(a_i, a_j, a_z) - \min(a_i, a_j, a_z) \le 2.\(\) Например, если \(n=4\) и \(a=[1,2,4,3]\), то существуют две такие тройки (\(i=1, j=2, z=4\) и \(i=2, j=3, z=4\)). Если же \(n=4\) и \(a=[1,1,1,1]\), то все четыре возможные тройки подходят. Выходные данные Выведите \(t\) ответов на наборы входных данных. Каждый ответ — это количество упорядоченных троек элементов, таких что максимальное число в тройке отличается от минимального не больше, чем на \(2\). Обратите внимание, что в отличии от сложной версии задачи, здесь не нужно выводить ответ по какому-либо модулю. Необходимо вывести точное значение ответа.
| |
|
|
E2. Близкие наборы (сложная версия)
Бинарный поиск
Комбинаторика
математика
реализация
сортировки
*1700
Это сложная версия этой задачи. Единственное различие между простой и сложной версиями заключается в ограничениях на \(k\) и \(m\). В этой версии задачи нужно выводить ответ по модулю \(10^9+7\). Вам задана последовательность \(a\) длины \(n\), состоящая из целых чисел от \(1\) до \(n\). Среди чисел могут быть одинаковые. Найдите количество наборов из \(m\) элементов, таких что максимальное число в наборе отличается от минимального не больше, чем на \(k\). Формально, вам нужно найти количество наборов из \(m\) индексов \(i_1 < i_2 < \ldots < i_m\), таких что \(\)\max(a_{i_1}, a_{i_2}, \ldots, a_{i_m}) - \min(a_{i_1}, a_{i_2}, \ldots, a_{i_m}) \le k.\(\) Например, если \(n=4\), \(m=3\), \(k=2\), \(a=[1,2,4,3]\), то существуют две такие тройки (\(i=1, j=2, z=4\) и \(i=2, j=3, z=4\)). Если же \(n=4\), \(m=2\), \(k=1\), \(a=[1,1,1,1]\), то все шесть возможных пар подходят. Поскольку ответ может быть достаточно большим, вам нужно посчитать его по модулю \(10^9 + 7\) (остаток при делении на число \(10^9 + 7\)). Выходные данные Выведите \(t\) ответов на наборы входных данных. Каждый ответ — это количество наборов из \(m\) элементов по модулю \(10^9 + 7\), таких что максимальное число в наборе отличается от минимального не больше, чем на \(k\).
| |
|
|
E. План лекций
графы
Деревья
Конструктив
поиск в глубину и подобное
реализация
снм
сортировки
*2400
Иван — учитель по программированию. В течение учебного года он планирует прочитать \(n\) лекций на \(n\) различных тем. Каждая тема должна быть использована ровно в одной лекции. Иван хочет выбрать, какую тему он будет объяснять во время \(1\)-й, \(2\)-й, ..., \(n\)-й лекции — формально он хочет выбрать некоторую перестановку целых чисел от \(1\) до \(n\) (назовем эту перестановку \(q\)). \(q_i\) — это номер темы, которую Иван объяснит во время \(i\)-й лекции. Для каждой темы (за исключением ровно одной) существует обязательная предшествующая тема (для \(i\)-й темы предшествующая тема — \(p_i\)). Иван не может читать лекцию по теме, не прочитав лекцию по ее предшествующей теме. Существует по крайней мере один допустимый порядок тем в соответствии с этими предварительными ограничениями. Правильный порядок тем может помочь студентам лучше понять лекции. У Ивана есть \(k\) специальных пар тем \((x_i, y_i)\) таких, что он знает, что студенты лучше поймут \(y_i\)-ю тему, если лекция по ней будет проводиться сразу после лекции по \(x_i\)-й теме. Иван хочет удовлетворить ограничениям на каждую такую пару, то есть для каждого \(i \in [1, k]\) должно существовать некоторое \(j \in [1, n - 1]\) такое, что \(q_j = x_i\) и \(q_{j + 1} = y_i\). Теперь Иван хочет знать, существует ли порядок тем, удовлетворяющий всем этим ограничениям, и если хотя бы один из них существует, найти любой из них. Выходные данные Если не существует порядка тем, удовлетворяющих всем ограничениям, выведите \(0\). В противном случае выведите \(n\) попарно различных целых чисел \(q_1\), \(q_2\), ..., \(q_n\) (\(1 \le q_i \le n\)) — порядок тем, удовлетворяющих всем ограничениям. Если ответов несколько, выведите любой из них.
| |
|
|
D. Тринадцатый подвиг Геракла
Деревья
жадные алгоритмы
сортировки
Структуры данных
*1500
Вы вероятно слышали про двенадцать подвигов Геракла, однако знаете ли вы про тринадцатый? Принято считать, что ему потребовалась дюжина лет, чтобы выполнить двенадцать подвигов, то есть в среднем год, чтобы выполнить каждый из них. Поскольку в наши дни время течет быстрее, у вас есть минуты, а не месяцы, чтобы решить эту задачу. Справитесь ли вы? В этой задаче вам дано дерево с \(n\) вершинами, каждая из которых имеет вес. Дерево — это связный граф с \(n - 1\) ребром. Определим \(k\)-раскраску дерева как назначение одного из \(k\) цветов каждому из его ребер. Обратите внимание, что вы не обязаны использовать все \(k\) цветов. Подграф цвета \(x\) состоит из тех ребер исходного графа, которым был назначен цвет \(x\), и только тех вершин, которые смежны с хотя бы одним из таких ребер. Поэтому в таком подграфе нет вершин степени \(0\). Весом компоненты связности назовем сумму весов её вершин. Весом подграфа назовем максимальный из весов компонент связности этого подграфа. Вес пустого подграфа будем считать равным \(0\). Определим вес \(k\)-раскраски как сумму весов подграфов всех \(k\) цветов. Дано дерево, для каждого \(k\) от \(1\) до \(n - 1\) вычислите максимальный возможный вес \(k\)-раскраски. Выходные данные Для каждого набора входных данных в отдельной строке выведите \(n - 1\) целое число, где \(i\)-е число должно равняться максимальному весу \(i\)-раскраски дерева. Примечание Оптимальные \(k\)-раскраски дерева из первого набора входных данных следующие: В \(1\)-раскраске все ребра имеют одинаковый цвет. Подграф цвета \(1\) содержит все ребра и вершины исходного графа. Поэтому его вес равен \(3 + 5 + 4 + 6 = 18\). В оптимальной \(2\)-раскраске ребрам \((2, 1)\) и \((3,1)\) назначен цвет \(1\). Ребру \((4, 3)\) — цвет \(2\). Подграф цвета \(1\) состоит из одной компоненты связности (вершины \(1, 2, 3\)) и его вес равен \(3 + 5 + 4 = 12\). Подграф цвета \(2\) состоит из двух вершин и одного ребра. Его вес равен \(4 + 6 = 10\). В оптимальной \(3\)-раскраске всем ребрам назначены разные цвета. Поэтому подграф каждого цвета содержит одно ребро. Их веса следующие: \(3 + 4 = 7\), \(4 + 6 = 10\), \(3 + 5 = 8\).
| |
|
|
F. Кошмар Евклида
битмаски
графы
жадные алгоритмы
математика
поиск в глубину и подобное
снм
сортировки
*2100
Вы должно быть знаете, что Евклид был математиком. Ну, как оказалось, Морфей об этом тоже знал. Поэтому, когда он захотел разыграть Евклида, он послал ему соответствующий кошмар. В своем плохом сне, у Евклида был набор \(S\) из \(n\) \(m\)-мерных векторов над полем \(\mathbb{Z}_2\), и он мог их складывать. Другими словами, у него были вектора с \(m\) координатами, каждая координата равнялась либо \(0\), либо \(1\). Сложение векторов определяется следующим образом: пусть \(u+v = w\), тогда \(w_i = (u_i + v_i) \bmod 2\). Евклид может сложить любое подмножество векторов из \(S\) и сохранить получившийся \(m\)-мерный вектор над \(\mathbb{Z}_2\). В частности, он может сложить пустое подмножество векторов. В таком случае, все координаты получившегося вектора будут равны \(0\). Пусть \(T\) будет множеством всех векторов, которые могут быть получены как сумма некоторого подмножества векторов из \(S\). Теперь Евклид интересуется, каков размер \(T\), и может ли он использовать только какое-то подмножество \(S'\) множества \(S\), чтобы получить все вектора из \(T\). Как всегда и бывает в таких ситуациях, он не проснется до тех пор, пока не выяснит это. Пока что дела для философа обстоят довольно мрачно. Однако, появилась надежда, когда он заметил, что все вектора из \(S\) содержат максимум \(2\) координаты, равные \(1\). Помогите Евклиду вычислить \(|T|\), количество \(m\)-мерных векторов над \(\mathbb{Z}_2\), которые могут быть получены как сумма какого-то подмножества векторов из \(S\). Так как оно может быть довольно велико, выведите его по модулю \(10^9+7\). Также, вы должны найти \(S'\), минимальное такое подмножество \(S\), что все вектора из \(T\) могут быть получены как как сумма какого-то подмножества векторов из \(S'\). В случае, если существует несколько таких подмножеств с минимальным количеством элементов, выведите лексикографически минимальный по индексам взятых элементов. Рассмотрим два множества \(A\) и \(B\), такие что \(|A| = |B|\). Пусть \(a_1, a_2, \dots a_{|A|}\) и \(b_1, b_2, \dots b_{|B|}\) будут возрастающие массивы индексов элементов, взятых в \(A\) и в \(B\), соответственно. \(A\) лексикографически меньше, чем \(B\), если существует такое \(i\), что \(a_j = b_j\) для всех \(j < i\) и \(a_i < b_i\). Выходные данные В первой строке выведите два целых числа: остаток от деления \(|T|\) на \(10^9+7\), и \(|S'|\). Во второй строке выведите \(|S'|\) целых чисел — индексы элементов, входящих в \(S'\), в возрастающем порядке. Элементы \(S\) нумеруются с \(1\) в порядке, в котором они даны во входных данных. Примечание В первом примере нам даны три вектора: Оказывается, что мы может представить все вектора из \(2\)-мерного пространства используя эти вектора: - \(00\), сумма пустого подмножества векторов;
- \(01 = 11 + 10\), сумма первого и третьего векторов;
- \(10 = 10\), просто первый вектор;
- \(11 = 10 + 01\), сумма первого и второго векторов.
Поэтому, \(T = \{00, 01, 10, 11\}\). Мы можем выбрать любые два из трех векторов \(S\), и все еще будем способны получить все вектора из \(T\). В таком случае, мы выберем два первых вектора. Так как мы не можем получить все вектора из \(T\), используя только один вектор из \(S\), \(|S'| = 2\) и \(S' = \{10, 01\}\) (индексы \(1\) и \(2\)), как множество \(\{1, 2 \}\) — лексикографически минимально. Мы можем получить все вектора из \(T\), используя только вектора из \(S'\), как показано ниже: - \(00\), сумма пустого подмножества;
- \(01 = 01\), просто второй вектор;
- \(10 = 10\), просто первый вектор;
- \(11 = 10 + 01\), сумма первого и второго вектора.
| |
|
|
D. Firecrackers
Бинарный поиск
сортировки
*1700
Consider a long corridor which can be divided into \(n\) square cells of size \(1 \times 1\). These cells are numbered from \(1\) to \(n\) from left to right. There are two people in this corridor, a hooligan and a security guard. Initially, the hooligan is in the \(a\)-th cell, the guard is in the \(b\)-th cell (\(a \ne b\)). One of the possible situations. The corridor consists of \(7\) cells, the hooligan is in the \(3\)-rd cell, the guard is in the \(6\)-th (\(n = 7\), \(a = 3\), \(b = 6\)). There are \(m\) firecrackers in the hooligan's pocket, the \(i\)-th firecracker explodes in \(s_i\) seconds after being lit. The following events happen each second (sequentially, exactly in the following order): - firstly, the hooligan either moves into an adjacent cell (from the cell \(i\), he can move to the cell \((i + 1)\) or to the cell \((i - 1)\), and he cannot leave the corridor) or stays in the cell he is currently. If the hooligan doesn't move, he can light one of his firecrackers and drop it. The hooligan can't move into the cell where the guard is;
- secondly, some firecrackers that were already dropped may explode. Formally, if the firecracker \(j\) is dropped on the \(T\)-th second, then it will explode on the \((T + s_j)\)-th second (for example, if a firecracker with \(s_j = 2\) is dropped on the \(4\)-th second, it explodes on the \(6\)-th second);
- finally, the guard moves one cell closer to the hooligan. If the guard moves to the cell where the hooligan is, the hooligan is caught.
Obviously, the hooligan will be caught sooner or later, since the corridor is finite. His goal is to see the maximum number of firecrackers explode before he is caught; that is, he will act in order to maximize the number of firecrackers that explodes before he is caught. Your task is to calculate the number of such firecrackers, if the hooligan acts optimally. Output For each test case, print one integer — the maximum number of firecrackers that the hooligan can explode before he is caught. Note In the first test case, the hooligan should act, for example, as follows: - second 1: drop the second firecracker, so it will explode on the \(5\)-th second. The guard moves to the cell \(5\);
- second 2: move to the cell \(2\). The guard moves to the cell \(4\);
- second 3: drop the first firecracker, so it will explode on the \(4\)-th second. The guard moves to the cell \(3\);
- second 4: move to the cell \(1\). The first firecracker explodes. The guard moves to the cell \(2\);
- second 5: stay in the cell \(1\). The second firecracker explodes. The guard moves to the cell \(1\) and catches the hooligan.
| |
|
|
A. Странный день рождения
Бинарный поиск
дп
жадные алгоритмы
сортировки
*1300
На свой день рождения Петя пригласил \(n\) друзей, у \(i\)-го друга есть параметр \(k_i\). Каждому из приглашенных друзей Петя хочет подарить ровно один подарок. В магазине есть \(m\) различных подарков, которые Петя может купить, каждый подарок можно купить не более одного раза. Подарок номер \(j\) стоит \(c_j\) рублей (\(1 \le c_1 \le c_2 \le \ldots \le c_m\)). Для \(i\)-го друга Петя может либо купить ему подарок \(j \le k_i\), что будет стоить Пете \(c_j\) рублей, либо заплатить другу \(c_{k_i}\) рублей вместо подарка. Помогите Пете определить наименьшую возможную стоимость проведения праздника. Выходные данные Для каждого набора входных данных выведите минимальное число рублей, которое понадобится Пете для приобретения всех подарков. Примечание В примере есть два набора входных данных. В первом у Пети есть \(5\) друзей и \(4\) возможных подарка. Ответ \(30\) достигается, если подарить: - \(5\) рублей первому другу.
- подарок стоимости \(12\) рублей второму другу.
- подарок стоимости \(5\) рублей третьему другу.
- подарок стоимости \(3\) рубля четвертому другу.
- \(5\) рублей пятому другу.
Во втором у Пети есть \(5\) друзей и \(5\) возможных подарков. Ответ \(190\) достигается, если подарить: - подарок стоимости \(10\) рублей первому другу.
- подарок стоимости \(40\) рублей второму другу.
- \(90\) рублей третьему другу.
- \(40\) рублей четвертому другу.
- \(10\) рублей пятому другу.
| |
|
|
D. Четно-нечётная игра
дп
жадные алгоритмы
игры
сортировки
*1200
Во время своих новогодних каникул Алиса и Боб играют в следующую игру, используя массив \(a\) из \(n\) целых чисел: - Игроки ходят по очереди, первой ходит Алиса.
- Каждый ход игрок выбирает любой элемент и удаляет его из массива.
- Если Алиса выбрала четное число, то она прибавляет его в свой результат. Если же число было нечетным, результат Алисы не меняется.
- Аналогично, если Боб выбрал нечетное число, то он прибавляет его в свой результат. Если же число было четным, то результат Боба не меняется.
Если в массиве не осталось чисел, то игра заканчивается. Побеждает тот игрок, результат которого больше. Если результаты игроков равны, то объявляется ничья. Например, если \(n = 4\) и \(a = [5, 2, 7, 3]\), то игра могла пройти следующим образом (существуют и другие варианты): - Первым ходом Алиса выбрала число \(2\) и получила два очка. Ее результат теперь равен \(2\). Массив \(a\) становится равным \([5, 7, 3]\).
- Вторым ходом Боб выбрал число \(5\) и получил пять очков. Его результат теперь равен \(5\). Массив \(a\) становится равным \([7, 3]\).
- Третьим ходом Алиса выбрала число \(7\) и не получила очков. Ее результат теперь равен \(2\). Массив \(a\) становится равным \([3]\).
- Последним ходом Боб выбрал число \(3\) и получил три очка. Его результат теперь равен \(8\). Массив \(a\) становится пустым.
- Так как у Боба на конец игры больше очков, он объявлется победителем.
Вам интересно, кто победит если оба игрока будут играть оптимально. Обратите внимание, что в массиве могут быть повторяющиеся числа. Выходные данные Для каждого набора входных данных в отдельной строке выведите: - «Alice», если при оптимальной игре выиграет Алиса;
- «Bob», если при оптимальной игре выиграет Боб;
- «Tie», если при оптимальной игре будет объявлена ничья.
| |
|
|
E. Правильная расстановка
Бинарный поиск
дп
сортировки
Структуры данных
*1700
Поликарп пригласил \(n\) друзей на встречу Нового года. Во время торжества он решил сделать общую фотографию всех своих друзей. Каждый друг может стоять или лечь на бок. Каждый друг характеризуется двумя значениями \(h_i\) (его рост) и \(w_i\) (его ширина). На фото \(i\)-й друг будет занимать прямоугольник \(h_i \times w_i\) (если он стоит) или \(w_i \times h_i\) (если он лежит). Друга с номером \(j\) можно разместить перед \(i\)-м другом на фотографии, если его прямоугольник ниже и уже, чем прямоугольник \(i\)-го друга. Формально должно быть выполнено хотя бы одно из следующих условий: - \(h_j < h_i\) и \(w_j < w_i\) (оба друга стоят или оба лежат);
- \(w_j < h_i\) и \(h_j < w_i\) (один из друзей стоит, а другой лежит).
Например, если \(n = 3\), \(h=[3,5,3]\) и \(w=[4,4,3]\), то: - первого друга можно поставить перед вторым: \(w_1 < h_2\) и \(h_1 < w_2\) (один из них стоит, а другой лежит);
- третьего друга можно поставить перед вторым: \(h_3 < h_2\) и \(w_3 < w_2\) (оба друга стоят или оба лежат).
В других случаях человек на переднем плане будет перекрывать человека на заднем плане. Помогите Поликарпу для каждого \(i\) найти любой \(j\), такой, что перед \(i\)-м другом может быть расположен \(j\)-й друг (т.е. хотя бы одно из условий выше было выполнено). Обратите внимание, что вам не нужно находить расположение всех людей для общей фотографии. Вам нужно, чтобы каждый друг \(i\) нашел любого другого друга \(j\), который может оказаться перед ним. Думайте об этом, как о решении \(n\) независимых подзадач. Выходные данные Для каждого набора входных данных в отдельной строке выведите \(n\) целых чисел, где \(i\)-е число является номером друга, которого можно поставить перед \(i\)-м. Если такого друга не существует, то выведите -1. Если существует несколько ответов, выведите любой. Примечание Первый набор входных данных разобран в условии. Во третьем наборе входных данных следующие варианты ответы тоже являются верными: - \([-1, -1, 1, 2]\);
- \([-1, -1, 1, 1]\);
- \([-1, -1, 2, 1]\).
| |
|
|
F. Новогодняя головоломка
дп
жадные алгоритмы
Паросочетания
Перебор
сортировки
*2100
Каждый год Дед Мороз дарит подарки всем детям. Однако в каждой стране есть свои традиции, и этот процесс происходит по разному. Например в Берляндии нужно решить новогоднюю головоломку. Поликарпу досталась следующая задача: дана клетчатая полоска размером \(2 \times n\), некоторые клетки на ней заблокированы. Нужно проверить, можно ли замостить все незаблокированные клетки с помощью дощечек \(2 \times 1\) и \(1 \times 2\). Например, если \(n = 5\) и полоска имеет следующий вид (черные клетки заблокированы): То ее можно замостить, например, используя две вертикальных и две горизонтальных, как на картинке ниже (разные дощечки обозначаются разным цветом). А если \(n = 3\) и полоска имеет следующий вид: То замостить свободные клетки невозможно. Поликарп легко справился с этой задачей и получил свой новогодний подарок. А сможете ли вы решить ее? Выходные данные Для каждого набора входных данных в отдельной строке выведите: - «YES», если можно ли замостить все незаблокированные клетки с помощью дощечек \(2 \times 1\) и \(1 \times 2\);
- «NO» в противном случае.
Вы можете выводить «YES» и «NO» в любом регистре (например, строки yEs, yes, Yes и YES будут распознаны как положительный ответ). Примечание Первые два набора входных данных разобраны в условии. В третьем наборе входных данных полоска выглядит следующим образом Несложно убедиться, что свободные клетки на ней нельзя замостить
| |
|
|
A. Замена элементов
жадные алгоритмы
математика
реализация
сортировки
*800
У вас есть массив \(a_1, a_2, \dots, a_n\). Все \(a_i\) являются целыми положительными числами. За один шаг вы можете выбрать три различных индекса \(i\), \(j\) и \(k\) (\(i \neq j\); \(i \neq k\); \(j \neq k\)) и присвоить \(a_i\) сумму \(a_j\) и \(a_k\), т. е. сделать \(a_i = a_j + a_k\). Можете ли вы сделать все \(a_i\) меньше или равными \(d\), используя вышеописанную операцию произвольное количество раз (возможно, ноль)? Выходные данные Для каждого набора входных выведите YES, если можно сделать все элементы \(a_i\) меньше или равными \(d\), используя описанную выше операцию, или NO в противном случае. Вы можете вывести каждую букву в любом регистре (например, YES, Yes, yes, yEs будут распознаны как положительный ответ). Примечание В первом примере можно доказать, что мы не можем сделать все \(a_i \le 3\). Во втором примере все \(a_i\) уже меньше или равны \(d = 4\). В третьем примере мы можем, например, выбрать \(i = 5\), \(j = 1\), \(k = 2\) и сделать \(a_5 = a_1 + a_2 = 2 + 1 = 3\). Массив \(a\) станет \([2, 1, 5, 3, 3]\). После этого мы можем сделать \(a_3 = a_5 + a_2 = 3 + 1 = 4\). Массив станет \([2, 1, 4, 3, 3]\) и все элементы меньше или равны \(d = 4\).
| |
|
|
C. Уничтожение массива
жадные алгоритмы
Конструктив
Перебор
реализация
сортировки
Структуры данных
*1700
Вы нашли бесполезный массив целых чисел \(a\) длины \(2n\). Так как он оказался Вам не нужен, Вы решили выкинуть все элементы \(a\). Это было бы просто, но оказалось, что выкидывать числа надо, соблюдая следующие правила: - Сначала Вы выбираете натуральное число \(x\).
- Затем Вы \(n\) раз повторите следующую операцию:
- выбрать два числа с суммой \(x\)
- выкинуть их из \(a\) и заменить \(x\) на максимальное из этих двух чисел.
Например, если изначально \(a = [3, 5, 1, 2]\), то Вы можете выбрать \(x = 6\) и выкинуть второе и третье число в \(a\), сумма которых равна \(5 + 1 = 6\). После этого \(x\) станет равно \(5\), а в массиве останутся числа \(3\) и \(2\), которые Вы можете выкинуть на следующей операции. Обратите внимание, что Вы выбираете \(x\) только в начале и не можете изменить его между операциями. Напишите программу, чтобы определить, как выбросить все элементы \(a\). Выходные данные Для каждого набора входных данных в первой строке выведите YES если возможно выкинуть все элементы массива. Иначе выведите NO. Если Вы вывели YES в следующей строке выведите значение \(x\), которое Вы выбираете в начале. В следующих \(n\) строках выведите по два числа — числа, которые Вы выбираете на очередной операции. Примечание Первый набор входных данных был описан в условии. Во втором и третьем наборах входных данных можно показать, что нельзя выкинуть все элементы массива \(a\).
| |
|
|
D. Очистка телефона
Бинарный поиск
дп
сортировки
*1800
Поликарп часто пользуется своим смартфоном. Он уже установил на него \(n\) приложений. Приложение с номером \(i\) занимает \(a_i\) единиц памяти. Недавно Поликарпу потребовалось установить новое приложение на свой смартфон. Однако, для установки требуется освободить хотя бы \(m\) единиц памяти (удаляя некоторые приложения). Конечно же, некоторые приложения для Поликарпа важнее, чем другие. Он придумал следующую систему оценки — каждому приложению он сопоставил целое число \(b_i\): - \(b_i = 1\) — обычное приложение;
- \(b_i = 2\) — важное приложение.
По такой системе оценки, его телефон имеет \(b_1 + b_2 + \ldots + b_n\) очков удобства. Поликарп считает, что если он удалит приложения с номерами \(i_1, i_2, \ldots, i_k\), то он освободит \(a_{i_1} + a_{i_2} + \ldots + a_{i_k}\) единиц памяти и потеряет \(b_{i_1} + b_{i_2} + \ldots + b_{i_k}\) очков удобства. Например, если \(n=5\), \(m=7\), \(a=[5, 3, 2, 1, 4]\), \(b=[2, 1, 1, 2, 1]\), то Поликарп может удалить следующие наборы приложений (ниже перечислены не все варианты): - приложения с номерами \(1, 4\) и \(5\). В таком случае он освободит \(a_1+a_4+a_5=10\) единиц памяти и потеряет \(b_1+b_4+b_5=5\) очков удобства;
- приложения с номерами \(1\) и \(3\). В таком случае он освободит \(a_1+a_3=7\) единиц памяти и потеряет \(b_1+b_3=3\) очков удобства.
- приложения с номерами \(2\) и \(5\). В таком случае он освободит \(a_2+a_5=7\) единиц памяти и потеряет \(b_2+b_5=2\) очков удобства.
Помогите Поликарпу, выберите набор приложений, удалив которые он освободит хотя бы \(m\) единиц памяти и потеряет минимальное количество очков удобства или укажите, что не существует такого набора. Выходные данные Для каждого набора входных данных в отдельной строке выведите: - -1, если не существует набора приложений, удаление которых освободит хотя бы \(m\) единиц памяти;
- минимальное количество очков удобства, которые Поликарп потеряет, если такой набор существует.
Примечание В первом наборе входных данных оптимально удалить приложения с номерами \(2\) и \(5\), освободив \(7\) единиц памяти. \(b_2+b_5=2\). Во втором наборе входных данных удалив единственное приложение Поликарп сможет очистить только \(2\) единицы памяти из \(3\) необходимых. В третьем наборе входных данных оптимально удалить приложения с номерами \(1\), \(2\), \(3\) и \(4\), освободив \(10\) единиц памяти. \(b_1+b_2+b_3+b_4=6\). В четвертом наборе входных данных оптимально удалить приложения с номерами \(1\), \(3\) и \(4\), освободив \(12\) единиц памяти. \(b_1+b_3+b_4=4\). В пятом наборе входных данных оптимально удалить приложения с номерами \(1\) и \(2\), освободив \(5\) единиц памяти. \(b_1+b_2=3\).
| |
|
|
E. Рекламное агентство
Комбинаторика
математика
сортировки
*1600
Маша работает в рекламном агентстве. В целях продвижения нового бренда она хочет заключить договор с некоторыми блогерами. Всего у Маши есть контакты \(n\) разных блогеров. Блогер с номером \(i\) имеет \(a_i\) подписчиков. Так как бюджет у Маши ограничен, она может заключить договор только с \(k\) разными блогерами. Конечно же, Маша хочет, чтобы ее рекламу увидело как можно больше людей. Поэтому она должна нанять блогеров с максимальным суммарным количеством подписчиков. Помогите ей, найдите количество способов выбрать \(k\) блогеров так, чтобы суммарное количество их подписчиков было максимально. Два способа считаются разными, если в первом способе есть хотя бы один блогер, которого нет во втором способе. Маша считает, что у всех блогеров разная аудитория (то есть не существует подписчика, который был бы подписан на двух разных блогеров). Например, если \(n=4\), \(k=3\), \(a=[1, 3, 1, 2]\), то у Маши есть два способа выбрать \(3\)-х блогеров с максимальным суммарным количеством подписчиков: - заключить договор с блогерами с номерами \(1\), \(2\) и \(4\). В таком случае количество подписчиков будет равно \(a_1 + a_2 + a_4 = 6\).
- заключить договор с блогерами с номерами \(2\), \(3\) и \(4\). В таком случае количество подписчиков будет равно \(a_2 + a_3 + a_4 = 6\).
Так как ответ может быть достаточно большим, выведите его по модулю \(10^9+7\). Выходные данные Для каждого набора входных данных в отдельной строке выведите одно целое число — количество способов выбрать \(k\) блогеров так, чтобы суммарное количество их подписчиков было максимально. Примечание Первый набор входных данных разобран в условии. Во втором наборе входных данных следующие варианты являются подходящими: - заключить договор с блогерами с номерами \(1\) и \(2\). В таком случае количество подписчиков будет равно \(a_1 + a_2 = 2\);
- заключить договор с блогерами с номерами \(1\) и \(3\). В таком случае количество подписчиков будет равно \(a_1 + a_3 = 2\);
- заключить договор с блогерами с номерами \(1\) и \(4\). В таком случае количество подписчиков будет равно \(a_1 + a_4 = 2\);
- заключить договор с блогерами с номерами \(2\) и \(3\). В таком случае количество подписчиков будет равно \(a_2 + a_3 = 2\);
- заключить договор с блогерами с номерами \(2\) и \(4\). В таком случае количество подписчиков будет равно \(a_2 + a_4 = 2\);
- заключить договор с блогерами с номерами \(3\) и \(4\). В таком случае количество подписчиков будет равно \(a_3 + a_4 = 2\).
В третьем наборе входных данных следующие варианты являются подходящими: - заключить договор с блогера с номером \(2\). В таком случае количество подписчиков будет равно \(a_2 = 2\).
| |
|
|
G. Странная красота
дп
математика
сортировки
теория чисел
*1900
Поликарп нашёл на улице массив \(a\) из \(n\) элементов. Поликарп изобрёл свой критерий красоты массива. Он называет массив \(a\) красивым, если для каждой пары различных индексов \(i \ne j\) должно быть выполнено хотя бы одно из следующих условий: - \(a_i\) делится на \(a_j\);
- \(a_j\) делится на \(a_i\).
Например, если: - \(n=5\) и \(a=[7, 9, 3, 14, 63]\), то массив \(a\) не является красивым (при \(i=4\) и \(j=2\) не выполняется ни одно из условий выше);
- \(n=3\) и \(a=[2, 14, 42]\), то массив \(a\) является красивым;
- \(n=4\) и \(a=[45, 9, 3, 18]\), то массив \(a\) не является красивым (при \(i=1\) и \(j=4\) не выполняется ни одно из условий выше);
Некрасивые массивы расстраивают Поликарпа, поэтому он хочет удалить некоторые элементы из массива \(a\) так, чтобы он стал красивым. Помогите Поликарпу определить, какое наименьшее число элементов массива необходимо удалить, чтобы массив \(a\) стал красивым. Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное число элементов массива, которые необходимо удалить, чтобы массив \(a\) стал красивым. Примечание В первом наборе входных данных удаление элементов \(7\) и \(14\) сделает массив \(a\) красивым. Во втором наборе входных данных массив \(a\) уже является красивым. В третьем наборе входных данных удаление одного из элементов \(45\) или \(18\) сделает массив \(a\) красивым. В четвертом наборе входных данных массив \(a\) уже является красивым.
| |
|
|
E. Сопоставление шаблонов
битмаски
графы
поиск в глубину и подобное
сортировки
Строки
Структуры данных
хэши
*2300
Вам даны \(n\) шаблонов \(p_1, p_2, \dots, p_n\) и \(m\) строк \(s_1, s_2, \dots, s_m\). Каждый шаблон \(p_i\) состоит из \(k\) символов, каждый из которых — это либо строчная латинская буква или символ подчеркивания. Все шаблоны попарно различны. Каждая строка \(s_j\) состоит из \(k\) строчных латинских букв. Строка \(a\) подходит под шаблон \(b\), если для каждого \(i\) от \(1\) до \(k\) либо \(b_i\) — это подчеркивание, либо \(b_i=a_i\). Вам требуется переупорядочить шаблоны таким образом, что первый шаблон, под который подходит \(j\)-я строка, — это \(p[mt_j]\). Разрешается не изменять порядок шаблонов. Можно ли осуществить такое переупорядочивание? Если можно, то выведите любой корректный порядок. Выходные данные Выведите «NO», если невозможно переупорядочить шаблоны так, чтобы первый шаблон, под который подходит \(j\)-я строка, был \(p[mt_j]\). В противном случае выведите «YES» в первой строке. Во второй строке выведите \(n\) различных целых чисел от \(1\) до \(n\) — порядок шаблонов. Если существует несколько ответов, выведите любой из них. Примечание Порядок шаблонов в первом примере после переупорядочивания: Тогда первая строка подходит под шаблоны ab__, _bcd, _b_d в таком порядке, первый из них равен ab__, который действительно \(p[4]\). Вторая строка подходит под шаблоны __b_ и ab__, первый из них __b_, который равен \(p[2]\). Последняя строка подходит под шаблоны _bcd и _b_d, первый из них _bcd, который равен \(p[5]\). Ответ на этот тест не единственный, другие корректные порядки существуют. Во втором примере cba не подходит под шаблон __c, а значит, корректного порядка не существует. В третьем примере в порядке (a_, _b) получается, что первый шаблон под который подходят обе строки — это \(1\), а в порядке (_b, a_) получается, что первый шаблон под который подходят обе строки — это \(2\). Значит, не существует такого порядка, что ответ равен \(1\) и \(2\).
| |
|
|
G. Минимальная разница
сортировки
Структуры данных
хэши
*3100
Задан целочисленный массив \(a\) размера \(n\). Вам предстоит выполнить \(m\) запросов. Каждый запрос имеет один из двух типов: - «\(1\) \(l\) \(r\) \(k\)» — вычислите минимальное значение \(dif\) такое, что существуют \(k\) различных целых чисел \(x_1, x_2, \dots, x_k\) таких, что \(cnt_i > 0\) (для каждого \(i \in [1, k]\)) и \(|cnt_i - cnt_j| \le dif\) (для каждого \(i \in [1, k], j \in [1, k]\)), где \(cnt_i\) — это число вхождений \(x_i\) в подмассив \(a[l..r]\). Если невозможно выбрать \(k\) целых чисел, сообщите об этом;
- «\(2\) \(p\) \(x\)» — присвоить \(a_{p} := x\).
Выходные данные Для каждого запроса первого типа выведите минимальное значение \(dif\), удовлетворяющее всем необходимым условиям, или \(-1\), если невозможно выбрать \(k\) различных целых чисел.
| |
|
|
C. Nezzar и красивая карта
геометрия
жадные алгоритмы
Конструктив
математика
сортировки
*2200
Nezzar любит игру osu!. osu! играется на карте, которая может быть представлена как массив различных точек на плоскости. Карта называется красивой, если для любых трех последовательных точек \(A,B,C\), записанных в порядке следования в массиве, угол между этими тремя точками с центром в \(B\) будет строго меньше, чем \(90\) градусов. Точки \(A,B,C\) слева образуют угол меньший, чем \(90\) градусов, поэтому они могут быть тремя последовательными точками в красивой карте; точки \(A',B',C'\) справа образуют угол, больший либо равный \(90\) градусам, поэтому они не могут быть тремя последовательными точками в красивой карте. Сейчас у Nezzar есть карта, состоящая из \(n\) различных точек \(A_1,A_2,\ldots,A_n\). Nezzar хочет переупорядочить эти \(n\) точек так, чтобы получившаяся карта стала красивой. Более формально, вы должны найти перестановку \(p_1,p_2,\ldots,p_n\) целых чисел от \(1\) до \(n\) такую, что карта \(A_{p_1},A_{p_2},\ldots,A_{p_n}\) будет красивой. Если это невозможно, вы должны определить это. Выходные данные Если решения нет, выведите \(-1\). Иначе выведите \(n\) чисел, образующих допустимую перестановку \(p\). Если существует несколько возможных решений, вы можете вывести любое. Примечание Это иллюстрация к первому примеру: Обратите внимание, что угол между \(A_1\), \(A_2\) и \(A_5\) с центром в \(A_2\) равен \(0\) градусов. Однако угол между \(A_1\), \(A_5\) и \(A_2\) с центром в \(A_5\) равен \(180\) градусам.
| |
|
|
C. Nezzar и симметричный массив
математика
реализация
сортировки
*1700
Много тысячелетий назад был симметричный массив \(a_1,a_2,\ldots,a_{2n}\), состоящий из \(2n\) различных целых чисел. Массив \(a_1,a_2,\ldots,a_{2n}\) называется симметричным, если для всех целых чисел \(1 \le i \le 2n\) существует целое число \(1 \le j \le 2n\) такое, что \(a_i = -a_j\). Для каждого целого числа \(1 \le i \le 2n\) Nezzar выписал целое число \(d_i\), равное сумме модулей разности между \(a_i\) и всеми числами из \(a\), то есть \(d_i = \sum_{j = 1}^{2n} {|a_i - a_j|}\). Прошел миллион лет, и сейчас Nezzar с трудом помнит массив \(d\) и полностью забыл массив \(a\). Nezzar хочет узнать, существует ли симметричный массив \(a\), состоящий из \(2n\) различных целых чисел, из которого получается массив \(d\). Выходные данные Для каждого набора входных данных выведите «YES», если существует любой возможный массив \(a\). Иначе выведите «NO». Вы можете выводить символы в любом регистре (верхнем или нижнем). Примечание В первом наборе входных данных \(a=[1,-3,-1,3]\) это один из возможных массивов, из которых получается \(d=[8,12,8,12]\). Во втором наборе входных данных можно показать, что не существует симметричных массивов, состоящих из различных целых чисел, из которых можно получить массив \(d\).
| |
|
|
B. Великий герой
жадные алгоритмы
реализация
сортировки
*900
Великий герой охраняет страну, где живет Гомер. У героя есть сила атаки \(A\) и начальное количество здоровья \(B\). Перед героем стоят \(n\) монстров. \(i\)-й монстр имеет силу атаки \(a_i\) и начальное количество здоровья \(b_i\). Герой или монстр жив, если его здоровье положительно (больше или равно \(1\)); и мертв, если его здоровье не положительно (меньше или равно \(0\)). Чтобы защитить людей в стране, герой будет сражаться с монстрами до тех пор, пока либо герой не умрет, либо все монстры не умрут. - В каждой схватке герой может выбрать произвольного живого монстра и сразиться с ним. Предположим, что выбран \(i\)-й монстр, а количества здоровья героя и \(i\)-го монстра перед боем равны \(x\) и \(y\) соответственно. После боя количества здоровья героя и \(i\)-го монстра становятся соответственно \(x-a_i\) и \(y-A\).
Заметьте, что герой может сражаться с одним и тем же монстром несколько раз. Для безопасности людей в стране, пожалуйста, скажите им, может ли великий герой убить всех монстров (даже если великий герой сам умрет после убийства последнего монстра). Выходные данные Для каждого набора входных данных выведите ответ «YES» (без кавычек), если великий герой может убить всех монстров, в противном случае выведите «NO» (без кавычек). Примечание В первом наборе входных данных будет \(6\) боев между героем и единственным монстром. После этого монстр умирает, а количество здоровья героя становится \(17 - 6 \times 2 = 5 > 0\). Поэтому ответ: «YES», а кроме того, герой все еще жив. Во втором наборе входных данных после того, как все монстры мертвы, значение здоровья героя станет \(709\) независимо от порядка всех боев. Таким образом, ответ «YES». В третьем наборе входных данных возможный порядок — сражаться с \(1\)-м, \(2\)-м, \(3\)-м и \(4\)-м монстрами в этом порядке. После всех поединков количество здоровья героя становится \(-400\). К сожалению, герой мертв, но все монстры тоже мертвы. Так что ответ: «YES». В четвертом наборе входных данных герой умирает, но монстр остается живым с количеством здоровья, равным \(1000 - 999 = 1\). Таким образом, ответ «NO».
| |
|
|
F. Копия или префиксная сумма
дп
Комбинаторика
сортировки
Структуры данных
*2400
Вам дан массив целых чисел \(b_1, b_2, \ldots, b_n\). Массив \(a_1, a_2, \ldots, a_n\) целых чисел смешанный, если для всех \(i\) (\(1 \leq i \leq n\)) хотя бы одно из этих двух условий выполнено: - \(b_i = a_i\), или
- \(b_i = \sum_{j=1}^{i} a_j\).
Найдите количество смешанных массивов \(a_1, a_2, \ldots, a_n\). Поскольку ответ может быть очень большим, найдите его по модулю \(10^9 + 7\). Выходные данные Для каждого набора входных данных выведите единственное целое число: количество смешанных массивов \(a_1, a_2, \ldots, a_n\) по модулю \(10^9 + 7\). Примечание В первом наборе входных данных смешанные массивы — это \([1, -2, 1]\), \([1, -2, 2]\), \([1, -1, 1]\). Во втором наборе входных данных смешанные массивы — это \([1, 1, 1, 1]\), \([1, 1, 1, 4]\), \([1, 1, 3, -1]\), \([1, 1, 3, 4]\), \([1, 2, 0, 1]\), \([1, 2, 0, 4]\), \([1, 2, 3, -2]\), \([1, 2, 3, 4]\). В четвертом наборе входных данных единственный смешанный массив — это \([0, 0, 0, 1]\).
| |
|
|
B. Восточная выставка
Бинарный поиск
геометрия
кратчайшие пути
сортировки
*1500
Вы и ваши друзья живете в \(n\) домах. Каждый дом расположен на 2D плоскости в точке с целыми координатами. Несколько домов могут быть расположены в одной точке. Мэр города хочет узнать у вас возможные места для постройки здания Восточной выставки. Найдите количество мест (точек с целыми координатами) таких, что суммарное расстояние от всех домов до выставки будет минимальным. Здание выставки может быть построено в той же точке, что и какой-то дом. Расстояние между двумя точками \((x_1, y_1)\) и \((x_2, y_2)\) считается по формуле \(|x_1 - x_2| + |y_1 - y_2|\), где \(|x|\) — модуль величины \(x\). Выходные данные Для каждого набора входных данных выведите единственное число — количество различных позиций для здания выставки. Здание выставки может быть построено в той же точке, что и какой-то дом. Примечание Снизу находятся картинки поясняющие примеры. Голубые точки обозначают дома, а зеленые - возможные позиции для выставки. 
Первый пример. 
Второй пример. 
Третий пример.  Четвертый пример.  Пятый пример.  Шестой пример. Оба дома находятся в позиции \((0, 0)\).
| |
|
|
A. Арена
реализация
сортировки
*800
\(n\) героев сражаются друг с другом на арене. Изначально \(i\)-й герой имеет уровень \(a_i\). Каждую минуту происходит битва между двумя разными героями. Эти герои могут быть выбраны произвольно (возможно даже, что это те же самые два героя, которые сражались в последнюю минуту). Когда сражаются два героя равных уровней, никто не выигрывает. Когда сражаются два героя разных уровней, побеждает тот, у кого уровень выше, и его уровень увеличивается на \(1\). Победитель турнира — первый герой, который победит по крайней мере в \(100^{500}\) боях (обратите внимание, что возможна ситуация, в которой турнир длится бесконечно и никто не набирает нужное кол-во побед, тогда победителя нет). A возможный победитель — это такой герой, что существует последовательность боев, в которой этот герой становится победителем турнира. Вычислите количество возможных победителей среди \(n\) героев. Выходные данные Для каждого набора входных данных выведите одно целое число — количество возможных победителей среди заданных \(n\) героев. Примечание В первом наборе входных данных примера из условия только первый герой может оказаться победителем. Во втором наборе входных данных в каждой битве между героями никто не побеждает, и турнир длится бесконечно без победителя.
| |
|
|
E. Дешевый обед
графы
жадные алгоритмы
Перебор
реализация
сортировки
Структуры данных
*2000
Иван хочет полноценно пообедать. Для этого он хочет заказать первое, второе, напиток и десерт. Всего на выбор у Ивана есть \(n_1\) разных первых блюд (\(i\)-е первое стоит \(a_i\) монет), \(n_2\) разных вторых блюд (\(i\)-е второе стоит \(b_i\) монет), \(n_3\) разных напитков (\(i\)-й напиток стоит \(c_i\) монет) и \(n_4\) разных десертов (\(i\)-й десерт стоит \(d_i\) монет). Некоторые блюда не сочетаются между собой. Всего есть \(m_1\) пар из первого и второго, которые не сочетаются, \(m_2\) несочетающихся пар из второго и напитка и \(m_3\) несочетающихся пар из напитка и десерта. Иван хочет купить ровно одно первое, одно второе, один напиток и один десерт так, чтобы они хорошо сочетались между собой и их общая стоимость была наименьшей возможной. Помогите ему найти самый бюджетный вариант! Выходные данные Если невозможно выбрать первое, второе, напиток и десерт, сочетающиеся друг с другом, выведите \(-1\). В противном случае выведите одно число — наименьшую суммарную стоимость обеда. Примечание Оптимальный вариант в первом примере — это выбрать первое блюдо номер \(2\), второе номер \(1\), напиток номер \(2\) и десерт номер \(1\). Во втором примере, единственная пара из первого и второго не сочетается, а потому невозможно выбрать обед.
| |
|
|
A. Командировка
жадные алгоритмы
реализация
сортировки
*900
Какая радость! Родители Пети уехали в командировку на целый год, предоставив шаловливого мальчугана самому себе. Петя обрадовался неимоверно. Он прыгал на кровати и бросался подушками целыми днями напролет, пока... Сегодня Петя полез в буфет и обнаружил там страшную записку. Родители поручили сыну поливать их любимый цветок весь год, каждый день, утром, в обед и вечером. «Стоп!» — подумал Петя. Он точно знал, что если выполнять поручение родителей в течение i-го (1 ≤ i ≤ 12) месяца года, то цветок вырастет на ai сантиметров, а если не поливать цветок в i-ый месяц, то цветок за этот месяц не вырастет. Также Петя знает, что родители ни за что на свете не поверят, что он поливал цветок, если цветок вырастет строго меньше, чем на k сантиметров. Помогите Пете выбрать минимальное количество месяцев, в которые он будет поливать цветок, так чтобы цветок вырос не менее чем на k сантиметров. Выходные данные Выведите единственное целое число — минимальное количество месяцев, в которые Петя будет поливать цветок, так чтобы цветок вырос не менее чем на k сантиметров. Если цветок не сможет вырасти на k сантиметров за год, выведите -1. Примечание Рассмотрим первый тестовый пример. В нем достаточно поливать цветок в течение седьмого и девятого месяца, тогда цветок вырастет ровно на пять сантиметров. Во втором тестовом примере родители поверят Пете, даже если цветок совсем не вырастет (k = 0). Значит, Петя может не поливать цветок вовсе.
| |
|
|
A. Командировка
жадные алгоритмы
реализация
сортировки
*900
Какая радость! Родители Пети уехали в командировку на целый год, предоставив шаловливого мальчугана самому себе. Петя обрадовался неимоверно. Он прыгал на кровати и бросался подушками целыми днями напролет, пока... Сегодня Петя полез в буфет и обнаружил там страшную записку. Родители поручили сыну поливать их любимый цветок весь год, каждый день, утром, в обед и вечером. «Стоп!» — подумал Петя. Он точно знал, что если выполнять поручение родителей в течение i-го (1 ≤ i ≤ 12) месяца года, то цветок вырастет на ai сантиметров, а если не поливать цветок в i-ый месяц, то цветок за этот месяц не вырастет. Также Петя знает, что родители ни за что на свете не поверят, что он поливал цветок, если цветок вырастет строго меньше, чем на k сантиметров. Помогите Пете выбрать минимальное количество месяцев, в которые он будет поливать цветок, так чтобы цветок вырос не менее чем на k сантиметров. Выходные данные Выведите единственное целое число — минимальное количество месяцев, в которые Петя будет поливать цветок, так чтобы цветок вырос не менее чем на k сантиметров. Если цветок не сможет вырасти на k сантиметров за год, выведите -1. Примечание Рассмотрим первый тестовый пример. В нем достаточно поливать цветок в течение седьмого и девятого месяца, тогда цветок вырастет ровно на пять сантиметров. Во втором тестовом примере родители поверят Пете, даже если цветок совсем не вырастет (k = 0). Значит, Петя может не поливать цветок вовсе.
| |
|
|
C. Разделение на команды
жадные алгоритмы
математика
сортировки
*1500
Петя очень любит футбол, особенно когда родителей нет дома. Каждое утро он выходит во двор, собирает своих друзей, и они играют вместе весь день, изредка прерываясь на еду или какие-нибудь важные дела (например, поливание цветов). Самое главное в футболе — перед началом игры честно поделиться на команды. Во дворе в футбол играют n ребят (считая самого Петю), умение каждого мальчика играть в футбол выражается неотрицательной характеристикой ai (чем она больше, тем лучше мальчик играет). Обозначим за x количество игроков в первой команде, y — количество игроков во второй команде, pi — номера ребят, вошедших в первую команду, qi — номера ребят, вошедших во вторую команду. Разделение n ребят на две команды считается честным, если выполнены три условия: - Каждый мальчик играет ровно в одной команде (x + y = n).
- Размеры команд отличаются не более, чем на единицу (|x - y| ≤ 1).
- Суммарные умения играть в футбол у двух команд отличаются не более, чем на величину умения самого лучшего игрока во дворе. Более формально:
 Ваша задача — помочь ребятам честно разделиться на две команды. Гарантируется, что честное разделение на две команды всегда существует. Выходные данные В первой строке выведите целое число x — количество мальчиков в первой команде, во второй строке выведите x целых чисел — номера мальчиков, попавших в первую команду. В третьей строке выведите целое число y — количество мальчиков во второй команде, в четвертой строке выведите y целых чисел — номера мальчиков, попавших во вторую команду. Не забудьте, что должны выполняться все три условия: x + y = n, |x - y| ≤ 1, а также условие на разницу суммарных умений. Если решений несколько, выведите любое. Мальчики нумеруются начиная с единицы в том порядке, в котором заданы их умения во входных данных. Номера мальчиков из одной команды разрешается выводить в любом порядке. Примечание Рассмотрим первый тестовый пример. В нем мы берем первого и второго мальчика в первую команду, а третьего мальчика во вторую команду. Проверим все три условия честного разделения. Первое ограничение выполнено (все мальчики участвуют в игре), второе ограничение на размеры групп (|2 - 1| = 1 ≤ 1) выполнено, третье ограничение на разность умений ((2 + 1) - (1) = 2 ≤ 2) выполнено.
| |
|
|
F. Уравняй массив
Бинарный поиск
жадные алгоритмы
математика
сортировки
Структуры данных
*1500
Поликарпу подарили массив \(a\) длины \(n\). Поликарп считает массив красивым, если существует такое число \(C\), что каждое число встречается в массиве либо ноль, либо \(C\) раз. Поликарп хочет удалить из массива \(a\) некоторые элементы, чтобы сделать массив красивым. Например, если \(n=6\) и \(a = [1, 3, 2, 1, 4, 2]\), то возможны следующие варианты сделать массив \(a\) красивым: - Поликарп удаляет элементы на позициях \(2\) и \(5\), массив \(a\) становится равным \([1, 2, 1, 2]\);
- Поликарп удаляет элементы на позициях \(1\) и \(6\), массив \(a\) становится равным \([3, 2, 1, 4]\);
- Поликарп удаляет элементы на позициях \(1, 2\) и \(6\), массив \(a\) становится равным \([2, 1, 4]\);
Помогите Поликарпу определить: какое минимальное количество элементов необходимо удалить из массива \(a\), чтобы сделать его красивым. Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество элементов, которые необходимо удалить, что сделать массив \(a\) красивым.
| |
|
|
D. НОД массива
математика
Перебор
реализация
сортировки
Структуры данных
теория чисел
хэши
*2100
Дан массив \(a\) длины \(n\). Требуется обработать \(q\) запросов следующего вида: даны два целых числа \(i\) и \(x\), необходимо умножить элемент \(a_i\) на \(x\). После обработки каждого запроса нужно вывести наибольший общий делитель (НОД) всех чисел массива \(a\). Так как ответ может быть слишком большим, вам требуется вывести его по модулю \(10^9+7\). Выходные данные Выведите \(q\) строк: после выполнения каждого запроса выведите НОД всех чисел массива по модулю \(10^9+7\) в отдельной строке. Примечание После первого запроса массив станет \([12, 6, 8, 12]\), \(\operatorname{gcd}(12, 6, 8, 12) = 2\). После второго запроса — \([12, 18, 8, 12]\), \(\operatorname{gcd}(12, 18, 8, 12) = 2\). После третьего запроса — \([12, 18, 24, 12]\), \(\operatorname{gcd}(12, 18, 24, 12) = 6\). Здесь функция \(\operatorname{gcd}\) обозначает наибольший общий делитель.
| |
|
|
D. Dogeforces
Деревья
жадные алгоритмы
Конструктив
поиск в глубину и подобное
разделяй и властвуй
снм
сортировки
Структуры данных
*2300
В компании Dogeforces работают \(k\) сотрудников. У каждого сотрудника, кроме сотрудников нижнего звена, есть не менее \(2\) подчиненных. У сотрудников нижнего звена нет подчиненных. У каждого сотрудника (кроме руководителя компании) есть ровно один непосредственный начальник. Руководитель компании является непосредственным или косвенным начальником всех сотрудников. Известно, что в Dogeforces любой начальник получает зарплату строго больше, чем все его подчиненные. Полная структура компании является секретом, но вам известно количество сотрудников нижнего звена и для каждой пары сотрудников нижнего звена известна зарплата их общего начальника (если таких начальников несколько, то начальника с минимальной зарплатой). Вам предстоит восстановить структуру компании. Выходные данные В первую строку выведите одно целое число \(k\) — количество сотрудников в компании. Во второй строке выведите \(k\) целых чисел \(c_1, c_2, \dots, c_k\), где \(c_i\) — зарплата сотрудника с номером \(i\). В третьей строке выведите одно целое число \(r\) — номер сотрудника, который является руководителем компании. В последующих \(k-1\) строках выведите по два целых числа \(v\) и \(u\) (\(1 \le v, u \le k\)) — номер сотрудника и его непосредственного начальника. Обратите внимание, что сотрудники нижнего звена имею номера с \(1\) по \(n\), а для остальных сотрудников вам предстоит назначить номера от \(n+1\) до \(k\). Если корректных структур компании несколько, вы можете вывести любую из них. Примечание Одна из возможных структур в первом примере: 
| |
|
|
A. Добытчик алмазов
геометрия
жадные алгоритмы
математика
сортировки
*1200
«Добытчик алмазов» — игра, похожая на «Добытчик золота», но в этой игре \(n\) шахтеров, а не \(1\). Шахта может быть представлена как плоскость. Будем рассматривать \(n\) шахтеров как \(n\) точек, расположенных на оси y. В шахте расположены \(n\) алмазов, будем рассматривать их как \(n\) точек на оси x. По каким-то причинам ни шахтеры, ни алмазы не могут быть расположены в начале координат (точке \((0, 0)\)). Каждый шахтер должен добыть ровно один алмаз. У каждого шахтера есть крюк, с помощью которого он может достать алмаз. Если шахтер, находящийся в точке \((a,b)\) использует свой крюк для добычи алмаза, расположенного в точке \((c,d)\), он потратит \(\sqrt{(a-c)^2+(b-d)^2}\) (расстояние между точками) единиц энергии. Шахтеры не могут перемещаться и помогать друг другу. Цель игры — распределить алмазы по шахтерам так, чтобы минимизировать сумму затраченной энергии. Сможете ли вы найти этот возможный минимум? Выходные данные Для каждого набора входных данных выведите одно вещественное число — минимально возможную сумму затраченных энергий. Ваш ответ будет считаться правильным, если его абсолютная или относительная ошибка не превосходит \(10^{-9}\). Формально, пусть ваш ответ равен \(a\), а ответ жюри равен \(b\). Ваш ответ будет зачтен, если и только если \(\frac{|a - b|}{\max{(1, |b|)}} \le 10^{-9}\). Примечание В первом примере есть два шахтера в точках \((0,1)\) и \((0,-1)\), а алмазы расположены в точках \((1,0)\) и \((-2,0)\). Если распределить алмазы по шахтерам, как показано на рисунке, то потратится \(\sqrt2 + \sqrt5\) единиц энергии. 
| |
|
|
A. Мексимизация
жадные алгоритмы
Перебор
сортировки
Структуры данных
*800
Дано число \(n\) и массив \(a_1, a_2, \ldots, a_n\). Необходимо переставить числа в массиве \(a\) так, чтобы сумма \(\textbf{MEX}\) на всех префиксах массива (\(i\)-й префикс — это \(a_1, a_2, \ldots, a_i\)) была максимальна. Формально, вам нужно найти массив \(b_1, b_2, \ldots, b_n\), такой что наборы чисел массивов \(a\) и \(b\) совпадают (то есть массив \(b\) получается некоторой перестановкой чисел в массиве \(a\)) и \(\sum\limits_{i=1}^{n} \textbf{MEX}(b_1, b_2, \ldots, b_i)\) максимальна. Напомним, что \(\textbf{MEX}\) множества целых неотрицательных чисел — такое минимальное целое неотрицательное число, которое не входит в это множество. Например, \(\textbf{MEX}(\{1, 2, 3\}) = 0\), \(\textbf{MEX}(\{0, 1, 2, 4, 5\}) = 3\). Выходные данные Для каждого набора входных данных выведите массив \(b_1, b_2, \ldots, b_n\), являющийся оптимальной перестановкой чисел \(a_1, a_2, \ldots, a_n\), то есть сумма \(\textbf{MEX}\) на всех его префиксах максимальна. Если существует несколько оптимальных ответов, вы можете найти любой. Примечание В первом наборе входных данных в ответе \(\textbf{MEX}\) на префиксах будет таким: - \(\textbf{MEX}(\{0\}) = 1\)
- \(\textbf{MEX}(\{0, 1\}) = 2\)
- \(\textbf{MEX}(\{0, 1, 2\}) = 3\)
- \(\textbf{MEX}(\{0, 1, 2, 3\}) = 4\)
- \(\textbf{MEX}(\{0, 1, 2, 3, 4\}) = 5\)
- \(\textbf{MEX}(\{0, 1, 2, 3, 4, 7\}) = 5\)
- \(\textbf{MEX}(\{0, 1, 2, 3, 4, 7, 3\}) = 5\)
Сумма \(\textbf{MEX} = 1 + 2 + 3 + 4 + 5 + 5 + 5 = 25\). Можно показать, что это максимальная возможная сумма \(\textbf{MEX}\) на префиксах.
| |
|
|
E. Два дома
графы
жадные алгоритмы
интерактив
Перебор
сортировки
*2200
Это интерактивная задача. Не забывайте о том, что ваша программа должна каждый раз после вывода запроса сбрасывать буфер вывода. Для сброса буфера вывода можно использовать fflush(stdout) в C++, system.out.flush() в Java, stdout.flush() в Python или flush(output) в Pascal. Если вы используете другой язык программирования, посмотрите в его документации, как выполняется эта операция. Также рекомендуем вам прочесть руководство по интерактивным задачам: https://cf.m27.workers.dev/blog/entry/45307. Диксит живет в городе, в котором \(n\) домов. Между каждой парой домов есть ровно одна направленная дорога. То есть для любой пары домов A и B есть либо дорога от дома A к дому B, либо дорога от B к A (но только одна из них). К \(i\)-му дому ведут \(k_i\) дорог. Два дома A и B являются взаимно достижимыми, если дом A достижим из дома B (существует путь от дома A к дому B по дорогам), и дом B достижим из дома A. Диксит хочет купить в этом городе два дома, один для того, чтобы жить в нем, другой — для учебы. Естественно, он бы хотел, чтобы от каждого из этих домов можно было добраться до другого дома, то есть ему нужно найти пару взаимно достижимых домов. Если таких пар несколько, Диксит хочет максимизировать величину \(|k_A - k_B|\), где \(k_i\) — количество дорог, ведущих к дому \(i\). Если существует более одной оптимальной пары, подойдет любая из них. Так как Диксит занят подготовкой CodeCraft, он просит вас помочь ему найти два таких дома, или сообщить, что таких домов нет. Во входных данных задачи вам не задаются направления дорог. Вы знаете только количество дорог, идущих к каждому дому (\(k_i\)). Вы можете задавать запросы следующих типов: вы выводите пару домов A и B, и жюри ответит, есть ли путь от дома A к дому B. В этой задаче нет никакого явного ограничения на количество запросов, которые вы можете задать. Но нельзя задавать запросы после того, как жюри ответит «Yes» на один из ваших запросов. Кроме того, нельзя задавать один и тот же запрос дважды. Как только вы зададите все необходимые запросы (или жюри ответит «Yes» на один из них), ваша программа должна вывести ответ и завершиться. Прочтите раздел «Протокол взаимодействия» для того, чтобы получить более подробную информацию о взаимодействии. Протокол взаимодействия Чтобы задать запрос, выведите «? A B» \((1 \leq A,B \leq N, A\neq B)\). Программа жюри ответит «Yes», если есть путь от дома A к дому B, или «No», если пути нет. Чтобы дать ответ на задачу, выведите «! A B», где A и B — номера двух различных домов, достижимых друг из друга, с максимально возможной величиной \(|k_A - k_B|\). Если такой пары домов не существует, выведите «! 0 0». После вывода ответа ваша программа должна завершиться, иначе вы получите вердикт «Неправильный ответ». Вы не можете задавать один и тот же запрос дважды. Нет никакого ограничения на количество запросов, но вы не можете задавать запросы после получения ответа «Yes». После этого ваша программа сразу должна вывести ответ на задачу («! A B» или «! 0 0») и завершиться. Если вы зададите запрос в неправильном формате или зададите один и тот же запрос дважды, вы получите вердикт «Неправильный ответ». После вывода запроса не забудьте вывести символ конца строки и сбросить буфер вывода (иначе вы можете получить вердикт «Решение зависло»). В различных языках программирования сброс буфера вывода реализован следующим образом: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- для других языков посмотрите их документацию.
Примечание В первом примере нам задан город с тремя домами, в каждый из которых ведет по одной дороге. Решение участника задает запрос «? 1 2», чтобы узнать, можно ли от дома \(1\) добраться до дома \(2\). Программа жюри отвечает «Yes». После этого решение участника выводит ответ «! 1 2» и завершается. Во втором примере решение участника делает шесть различных запросов, убеждается в том, что пары домов, достижимых друг из друга, нет, и выводит «! 0 0» в качестве ответа.
| |
|
|
A. Коттеджный городок
реализация
сортировки
*1200
Во Флатландии строится коттеджный городок «Плоский». На данный момент в «Плоском» уже построено n квадратных домов, центры которых лежат на оси Оx. Стороны домов параллельны осям координат. Известно, что никакие два дома не пересекаются, хотя могут касаться друг друга. Петя работает в архитектурном бюро, в которое поступил заказ на постройку нового дома в «Плоском». Заказчик хочет, чтобы его дом тоже находился на оси Оx, имел форму квадрата со стороной t, а также примыкал как минимум к одному из уже существующих домов. Разумеется, его стороны должны быть параллельны осям координат, центр должен находиться на оси Ox и он не должен пересекаться ни с каким существующим домом. Пете дан список всех домов в «Плоском», помогите ему найти количество возможных положений нового дома. Выходные данные Выведите количество возможных положений нового дома. Примечание Центр нового дома не обязательно должен иметь целочисленную x-координату.
| |
|
|
D. Карта
реализация
сортировки
Структуры данных
*2500
Задана карта местности, представляющая собой прямоугольную матрицу n × m, в каждой клетке которой записана средняя высота соответствующего участка местности. Прорабу Пете нужно расположить на карте несколько городов, каждый из которых на карте займет прямоугольник размера a × b клеток. Но прежде чем построить город в определенном месте, Пете необходимо убрать лишнюю землю с участка, на котором будет строиться город. Для этого он выбирает клетку наименьшей высоты на этом участке и делает высоту всех клеток на участке равной высоте этой клетки. Будем считать, что для того, чтобы опустить уровень земли с h2 до h1 (h1 ≤ h2), необходимо вывезти h2 - h1 единиц земли. Назовем положение участка под город оптимальным, если количество вывозимой с него земли наименьшее из всех возможных положений. Петя строит города в соответствии со следующим алгоритмом: из всех оптимальных положений участка он выбирает самое верхнее. Если таких положений несколько, он выбирает среди них самое левое. На этом участке он строит город. Петя повторяет этот процесс до тех пор, пока он может построить хотя бы еще один город. На уже застроенных клетках, разумеется, строить вновь нельзя. Помогите Пете расположить города в соответствии с алгоритмом. Выходные данные В первой строке выведите k — число построенных городов. В следующих k строках выведите по 3 числа, разделенных пробелами, — номер строки и номер столбца левого верхнего угла очередного участка, а также объем земли, который требуется с него вывезти. Участки выводите в порядке их построения.
| |
|
|
D. Плитка для ванной
сортировки
Структуры данных
*2900
У Кости очень много дел: ремонт в самом разгаре! Надо клеить обои, собирать мебель и постоянно вывозить мусор. Сегодня Костя хочет купить плитку для ванной. Он пришел в магазин и оказался перед большим квадратным стендом с плиткой. Стенд представляет из себя квадрат из \(n \times n\) клеток, каждая клетка которого — маленький кусочек плитки цвета \(c_{i,\,j}\). Магазин продает кусочки плитки пакетами, а именно, купить можно только подквадрат исходного квадрата. Подквадратом называется любой квадратный фрагмент стенда, то есть любое множество \(S(i_0, j_0, k) = \{c_{i,\,j}\ |\ i_0 \le i < i_0 + k, j_0 \le j < j_0 + k\}\) при \(1 \le i_0, j_0 \le n - k + 1\). Костя еще не знает, сколько кусочков плитки он хочет купить, и, соответственно, рассматривает подквадраты всех возможных размеров. При этом он точно не хочет слишком разноцветную плитку в ванной, что позволяет ему сузить выбор. Помогите Косте для каждого \(k \le n\) определить количество различных подквадратов размера \(k \times k\), в которых не более \(q\) различных цветов плитки. Подквадраты считаются различными, если их расположение на стенде не совпадает. Выходные данные Для каждого \(k\) от \(1\) до \(n\) выведите в отдельной строке по одному целому числу — количество подквадратов размера \(k \times k\), в которых не более \(q\) различных цветов. Примечание В первом примере все цвета квадратиков плитки различные. Поскольку Костя не хочет, чтобы в купленном квадрате было больше \(4\) цветов, он может купить себе любой подквадрат размера \(1 \times 1\) или \(2 \times 2\), но при этом не сможет купить квадрат размера \(3 \times 3\). Во втором примере есть повторяющиеся цвета. А именно, за счет ограничения \(q = 8\) Костя может купить любой подквадрат \(1 \times 1\) и \(2 \times 2\), а также любой подквадрат \(3 \times 3\), ведь в каждом таком подквадрате всего \(7\) цветов. Весь стенд размера \(4 \times 4\) Костя купить не сможет, потому что там будет \(9\) цветов.
| |
|
|
B. Торт Наполеон
дп
реализация
сортировки
*900
На этой неделе Аркадий хотел последовать традициям, испечь стопку блинов и придумать про это задачу. Однако он вспомнил, что чтобы придумать задачу про стопки блинов, нужно работать в одной известной IT-компании, поэтому вместо этого Аркадий решил испечь торт «Наполеон». Чтобы испечь торт «Наполеон», нужно сначала выпечь \(n\) сухих коржей (слоев), а затем сложить их друг на друга, пропитывая кремом. Аркадий начал с пустого блюда, и повторил следующие шаги \(n\) раз: - положил новый сухой слой на верх стопки;
- после того, как он положил \(i\)-й слой, он добавил на верх стопки \(a_i\) ложек крема.
Когда Аркадий добавляет \(x\) ложек крема на верх стопки, \(x\) верхних слоев торта пропитываются кремом. Если с торте в этот момент меньше \(x\) слоев, то пропитываются все эти слои, а оставшийся крем пропадает. Если \(x = 0\), то не пропитывается ни один слой. Рисунок иллюстрирует первый набор входных данных из примера. Помогите Аркадию определить, какие слои окажутся пропитаны кремом, когда он закончит собирать торт, а какие нет. Выходные данные Для каждого набора входных данных выведите одну строку с \(n\) целыми числами. \(i\)-е из этих чисел должно быть равно \(1\), если \(i\)-й слой снизу окажется пропитанным, и \(0\) иначе.
| |
|
|
C. Задача коммивояжёра
Бинарный поиск
дп
жадные алгоритмы
кратчайшие пути
сортировки
Структуры данных
*2200
Есть \(n\) городов, пронумерованных от \(1\) до \(n\), красота города \(i\) равна \(a_i\). Коммивояжёр хочет начать с города \(1\), посетить каждый город ровно один раз и вернуться в город \(1\). Для всех \(i\ne j\), перелет из города \(i\) в город \(j\) стоит \(\max(c_i,a_j-a_i)\) долларов, где \(c_i\) — это нижний порог цены, наложенный на перелет городом \(i\). Обратите внимание, что здесь не берется абсолютное значение. Найдите минимальную общую стоимость поездки для коммивояжёра. Выходные данные Выведите единственное целое число — минимальную суммарную стоимость. Примечание В первом примере мы можем путешествовать в порядке \(1\to 3\to 2\to 1\). - Рейс \(1\to 3\) стоит \(\max(c_1,a_3-a_1)=\max(9,4-1)=9\).
- Рейс \(3\to 2\) стоит \(\max(c_3, a_2-a_3)=\max(1,2-4)=1\).
- Рейс \(2\to 1\) стоит \(\max(c_2,a_1-a_2)=\max(1,1-2)=1\).
Общая стоимость составляет \(11\), и мы не можем обойтись меньшим числом долларов.
| |
|
|
D. Переверните карты
2-sat
жадные алгоритмы
Конструктив
сортировки
Структуры данных
*2600
Есть колода из \(n\) карт. На карте \(i\) на лицевой стороне написано число \(a_i\), а на оборотной — \(b_i\). Каждое целое число от \(1\) до \(2n\) встречается на картах ровно один раз. Колода называется отсортированной, если лицевые значения находятся в порядке возрастания, а оборотные — в порядке убывания. То есть, если \(a_i< a_{i+1}\) и \(b_i> b_{i+1}\) для всех \(1\le i<n\). Перевернуть карту \(i\) означает поменять местами значения \(a_i\) и \(b_i\). Вы должны перевернуть некоторое подмножество карт (возможно, ни одной), а затем разместить эти карты в каком-то порядке. Какое минимальное количество карт вы должны перевернуть, чтобы отсортировать колоду? Выходные данные Если отсортировать колоду невозможно, выведите «-1». В противном случае выведите минимальное количество карт, которые необходимо перевернуть, чтобы отсортировать колоду. Примечание В первом примере мы переворачиваем карты \((1, 9)\) и \((2, 7)\). Затем карты располагают в порядке \((3,10), (5,8), (6,4), (7,2), (9,1)\). Колода отсортирована потому, что \(3<5<6<7<9\) и \(10>8>4>2>1\). Во втором примере отсортировать колоду невозможно.
| |
|
|
F. Треугольные пути
графы
Конструктив
кратчайшие пути
математика
сортировки
*2000
Рассмотрим бесконечный треугольник, состоящий из слоев. Занумеруем слои, начиная с единицы, от верхней точки треугольника (сверху вниз). На \(k\)-м слое треугольника расположены \(k\) точек, пронумерованных слева направо. Каждая точка бесконечного треугольника описывается парой чисел \((r, c)\) (\(1 \le c \le r\)), где \(r\) — номер слоя, а \(c\) — номер точки в слое. Из каждой точки \((r, c)\) исходит два направленных ребра в точки \((r+1, c)\) и \((r+1, c+1)\), но только одно из рёбер активировано. Если \(r + c\) — чётно, тогда активировано ребро в точку \((r+1, c)\), иначе активировано ребро в точку \((r+1, c+1)\). Изучите картинку для лучшего понимания. Черным цветом обозначены активированные ребра. Серым цветом обозначены не активированные ребра. Из точки \((r_1, c_1)\) можно дойти до точки \((r_2, c_2)\), если между ними существует путь только из активированных рёбер. Например, на картинке выше существует путь из точки \((1, 1)\) в точку \((3, 2)\), но не существует пути из точки \((2, 1)\) в точку \((1, 1)\). Изначально вы находитесь в точке \((1, 1)\). За каждый ход вы можете: - Заменить активированное ребро для точки \((r, c)\). То есть, если активировано ребро в точку \((r+1, c)\), то вместо него активированным станет ребро в точку \((r+1, c+1)\), иначе, если активировано ребро в точку \((r+1, c+1)\), то вместо него активированным станет ребро в точку \((r+1, c)\). Это действие увеличивает стоимость пути на \(1\);
- Переместиться из текущей точку в другую, перейдя по активированному ребру. Это действие не увеличивает стоимость пути.
Вам дана последовательность из \(n\) точек бесконечного треугольника \((r_1, c_1), (r_2, c_2), \ldots, (r_n, c_n)\). Найдите путь минимальной стоимости из точки \((1, 1)\), проходящий через все \(n\) точек в произвольном порядке. Выходные данные Для каждого набора входных данных выведите одно целое число — минимальную стоимость пути, проходящего через все точки в соответствующем наборе входных данных.
| |
|
|
D. Обмены на ребрах
геометрия
Конструктив
сортировки
*3000
В связи со специфическим инцидентом на баскетбольной тренировке, Akari придумал следующую задачу со спортивного программирования! Вам даны \(n\) точек на плоскости, никакие три из которых не лежат на одной прямой. Изначально точка \(i\) имеет метку \(a_i\), причем метки \(a_1, a_2, \dots, a_n\) образуют перестановку чисел \(1, 2, \dots, n\). Вы можете менять эти метки с помощью следующей операции: - Выберите два разных целых числа \(i\) и \(j\) между \(1\) и \(n\).
- Поменяйте местами метки точек \(i\) и \(j\).
- Нарисуйте отрезок между точками \(i\) и \(j\).
Последовательность операций корректна, если после применения всех операций в последовательности точка \(k\) имеет метку \(k\) для всех \(k\) от \(1\) до \(n\) включительно, и нарисованные отрезки не пересекаются внутри друг друга. Формально, если два отрезка пересекаются, то они должны сделать это в общей конечной точке обоих отрезков. В частности, все нарисованные отрезки должны быть попарно различными. Найдите любую корректную последовательность операций или определите, что ее нет. Выходные данные Если невозможно выполнить корректную последовательность операций, выведите \(-1\). В противном случае выведите целое число \(k\) (\(0 \le k \le \frac{n(n - 1)}{2}\)) — количество выполняемых операций, а затем \(k\) строк, каждая из которых содержит два целых числа \(i\) и \(j\) (\(1 \le i, j \le n\), \(i\neq j\)) — номера точек, выбранных для операции. Обратите внимание, что вам не требуется минимизировать или максимизировать значение \(k\). Если возможных ответов несколько, вы можете вывести любой из них. Примечание Следующая анимация демонстрирует первый пример. Черные числа обозначают номера точек, а оранжевые — их метки. Во втором примере все метки изначально находятся в правильном положении, поэтому никаких операций не требуется.
| |
|
|
E. Дерево-календарь
Деревья
Конструктив
Перебор
поиск в глубину и подобное
сортировки
Структуры данных
*3100
Yuu Koito и Touko Nanami — молодожёны! В день свадьбы Yuu подарила Touko ориентированное дерево с \(n\) вершинами и корнем в \(1\), а также маркировку \(a\), которая является некоторым DFS обходом дерева. Каждое ребро в этом дереве направлено в сторону от корня. Следующий алгоритм после вызова dfs(1) возвращает \(a\) — DFS-обход дерева, корнем которого является \(1\): номер := 0 a := массив длины n
функция dfs(u): номер := номер + 1 a[u] := номер для всех v, для которых есть ориентированное ребро (u -> v): dfs(v)
Обратите внимание, что для дерева может существовать несколько различных DFS-обходов Touko настолько понравился подарок, что она решила поиграть с ним! Каждый день, начиная с дня после свадьбы, Touko выполняет следующую процедуру один раз: - Среди всех ориентированных рёбер \(u \rightarrow v\) таких, что \(a_u < a_v\), выберите рёбро \(u' \rightarrow v'\) с лексикографически минимальной парой \((a_{u'}, a_{v'})\).
- Обменяйте местами \(a_{u'}\) и \(a_{v'}\).
Прошли дни со свадьбы, а Touko как-то забыла, когда была свадьба, и какой была оригинальная маркировка \(a\)! Опасаясь, что Yuu может разозлиться, Touko решила попросить вас определить эту информацию, используя текущую маркировку. Будучи ее хорошим другом, вы должны найти количество дней, прошедших со свадьбы, и оригинальную маркировку дерева. Однако есть шанс, что Touko могла ошибиться в процессе, в результате чего текущую маркировку невозможно получить ни из какой начальной маркировки, в этом случае, пожалуйста, сообщите об этом Touko. Выходные данные Если текущую маркировку невозможно получить ни из какого DFS-обхода, выведите NO. В противном случае в первой строке выведите YES. Во второй строке выведите единственное целое число, обозначающее количество дней со дня свадьбы. В третьей строке выведите \(n\) чисел через пробел, обозначающих оригинальную маркировку дерева. Если есть несколько правильных решений, вы можете вывести любое. Это означает, что вы можете вывести любую пару (DFS-обход, количество дней), для которой мы получим текущую конфигурацию, начав из DFS-обхода, который вы предоставили, ровно через предоставленное вами количество дней. Примечание Следующая анимация демонстрирует первый пример. Белая метка внутри вершины обозначает номер вершины \(i\), а оранжевая метка — значение \(a_i\).
| |
|
|
D. НОД и МОД
графы
жадные алгоритмы
Конструктив
снм
сортировки
теория чисел
*2000
Вам дан массив \(a\) из \(n\) (\(n \geq 2\)) положительных целых чисел, а также целое число \(p\). Рассмотрим неориентированный взвешенный граф на \(n\) вершинах, пронумерованных от \(1\) до \(n\), в котором между вершинами \(i\) и \(j\) (\(i<j\)) добавлены следующие ребра: - Если \(gcd(a_i, a_{i+1}, a_{i+2}, \dots, a_{j}) = min(a_i, a_{i+1}, a_{i+2}, \dots, a_j)\), то между вершинами \(i\) и \(j\) существует ребро веса \(min(a_i, a_{i+1}, a_{i+2}, \dots, a_j)\).
- Если \(i+1=j\), то между вершинами \(i\) и \(j\) существует ребро веса \(p\).
Здесь \(gcd(x, y, \ldots)\) обозначает наибольший общий делитель (НОД) чисел \(x\), \(y\), .... Обратите внимание, между вершинами \(i\) и \(j\) появляются кратные ребра, если оба условия выполнены. Если же ни одно условие не выполнено для \(i\) и \(j\), то между ними нет ребер. Ваша цель — найти вес минимального остовного дерева данного графа. Выходные данные Выведите \(t\) строк. Для каждого набора входных данных выведите вес соответствующего минимального остовного дерева. Примечание Ниже изображены графы для четырех наборов входных данных примера (ребра одного из минимальных остовных деревьев показаны розовым): Набор 1 Набор 2 Набор 3 Набор 4
| |
|
|
E. Ценовой баланс
Комбинаторика
Конструктив
математика
сортировки
*2300
Массив называется красивым, если все его элементы равны. Вы можете преобразовать некоторый массив, выполнив следующие шаги любое количество раз: - Выберите два индекса \(i\) и \(j\) (\(1 \leq i,j \leq n\)), а также целое число \(x\) (\(1 \leq x \leq a_i\)). Назовем \(i\) истоком, а \(j\) — стоком.
- Уменьшите \(i\)-й элемент на \(x\), и увеличьте \(j\)-й элемент на \(x\). Итоговые значения на \(i\)-й и \(j\)-й позициях равны \(a_i-x\) и \(a_j+x\) соответственно.
- Стоимость такой операции равна \(x \cdot |j-i| \).
- После этой операции \(i\) больше не может стать стоком, а \(j\) больше не может стать истоком.
Общая стоимость преобразования равна сумме стоимостей на шаге \(3\). Например, массив \([0, 2, 3, 3]\) может быть преобразован в красивый массив \([2, 2, 2, 2]\) с общей стоимостью \(1 \cdot |1-3| + 1 \cdot |1-4| = 5\). Массив называется сбалансированным, если его можно преобразовать в красивый массив, и стоимость такого преобразования однозначно определена. Другими словами, минимальная стоимость преобразования в красивый массив равна максимальной стоимости. Вам дан массив \(a_1, a_2, \ldots, a_n\) длины \(n\), элементы которого — неотрицательные целые числа. Ваша задача — найти количество сбалансированных массивов, являющихся перестановками данного. Два массива считаются различными, если элементы на некоторых позициях отличаются. Так как ответ может быть большим, выведите его по модулю \(10^9 + 7\). Выходные данные Выведите одно целое число — количество сбалансированных перестановок по модулю \(10^9+7\). Примечание В первом примере \([1, 2, 3]\) является сбалансированным массивом, так как мы можем выбрать индекс \(3\) как исток, и индекс \(1\) как сток. После этой операции мы получим красивый массив \([2, 2, 2]\), итоговая стоимость преобразования равна \(2\). Можно показать, что это единственное возможная последовательность операций, приводящая к красивому массиву. Аналогично можно показать, что все другие перестановки тоже сбалансированные. Во втором примере сбалансированные перестановки — это \([0, 0, 4, 4]\) и \([4, 4, 0, 0]\). В третьем примере все перестановки являются сбалансированными.
| |
|
|
F. Задача об обмене
Конструктив
Перебор
сортировки
Структуры данных
*2500
Вам даны два массива \(a\) и \(b\), оба из \(n\) элементов. Вы можете поменять местами два элемента в \(b\) не более одного раза (или ничего не делать). Вам нужно минимизировать величину \(\)\sum_{i}|a_{i}-b_{i}|.\(\) Найдите минимально возможное значение этой суммы. Выходные данные Выведите минимально возможное значение суммы \(\sum_{i}|a_{i}-b_{i}|\). Примечание В первом примере можно поменять местами первый и пятый элементы массива \(b\), и он станет равным \([ 5, 2, 3, 4, 1 ]\). В таком случае значение суммы будет равно \(|5-5| + |4-2| + |3-3| + |2-4| + |1-1| = 4\), что является минимумом. Во втором примере можно поменять местами первый и второй элементы. Ответ равен \(2\).
| |
|
|
D. Вырежи и склей
Бинарный поиск
жадные алгоритмы
реализация
сортировки
Структуры данных
*2000
У маленького Эхаба есть набор для аппликации, содержащий массив \(a\) длины \(n\). Он планирует взять ножницы и сделать следующее: - выбрать отрезок \((l, r)\), и вырезать каждый элемент \(a_l\), \(a_{l + 1}\), ..., \(a_r\) на этом отрезке;
- склеить некоторые из элементов вместе в том же порядке, в котором они шли в массиве;
- в итоге, получится несколько кусочков, каждый кусочек содержит некоторые элементы, и каждый элемент принадлежит какому-то кусочку.
Более формально, он разделит последовательность \(a_l\), \(a_{l + 1}\), ..., \(a_r\) на подпоследовательности. Он считает, что разделение красивое, если для каждого кусочка (подпоследовательности) верно, что если его длина равна \(x\), то никакое значение не встречается строго больше \(\lceil \frac{x}{2} \rceil\) раз в этом кусочке. Эхаб еще не определился с отрезком, поэтому он интересуется для \(q\) отрезков \((l, r)\), чему равно минимальное количество кусочков, на которые нужно разделить \(a_l\), \(a_{l + 1}\), ..., \(a_r\), чтобы разделение было красивым. Последовательность \(b\) является подпоследовательностью массива \(a\), если \(b\) может быть получена из \(a\) удалением нескольких (возможно, ни одного) элементов. Обратите внимание, что она не обязательно должна быть непрерывной. Выходные данные Для каждого запроса выведите минимальное количество подпоследовательностей, на которые нужно разбить отрезок, чтобы разбиение было красивым. Можно доказать, что такое разбиение всегда существует. Примечание В первом запросе можно взять весь массив в одну подпоследовательность, так как его длина равна \(6\), и ни одно значение не встречается в нем больше \(3\) раз. Во втором запросе элементы отрезка равны \([3,2,3,3]\). Вы не можете взять их всех в одну подпоследовательность, потому что ее длина будет равна \(4\), и \(3\) встречается в ней больше \(2\) раз. Однако, вы можете разделить отрезок на две подпоследовательности: \([3]\) и \([2,3,3]\).
| |
|
|
E. Гипер-квартира маленького Эхаба
Бинарный поиск
графы
интерактив
сортировки
*2700
Это интерактивная задача. Маленький Эхаб любит ползать по своей квартире. В ней есть \(n\) комнат, пронумерованных от \(0\) до \(n-1\). Для каждой пары комнат \(a\) и \(b\), либо есть прямой переход из комнаты \(a\) в комнату \(b\), либо наоборот из комнаты \(b\) в комнату \(a\), но не одновременно. Маленький Эхаб хочет пойти поиграть с маленьким Бадави. Он хочет знать, сможет ли он добраться до него. Однако, он не знает ничего про свою квартиру, кроме количества комнат. Он может задать няне два типа вопросов: - переход между комнатами \(a\) и \(b\) направлен из \(a\) в \(b\) или в обратную сторону?
- есть ли из комнаты \(x\) переход, направленный в одну из комнат \(s_1\), \(s_2\), ..., \(s_k\)?
Он может задать не более \(9n\) вопросов первого типа, и не более \(2n\) вопросов второго типа. После того, как он задаст какие-то вопросы, он хочет знать для каждой пары комнат \(a\) и \(b\), существует ли путь из \(a\) в \(b\) или нет. Путь из \(a\) в \(b\) это последовательность переходов, которая начинается в комнате \(a\) и заканчивается в комнате \(b\). Выходные данные Чтобы вывести ответ для набора входных данных, выведите строку содержащую «3», после чего \(n\) строк, каждая содержит двоичную строку длины \(n\). \(j\)-й символ в \(i\)-й строке должен равняться \(1\), если существует путь из комнаты \(i\) в комнату \(j\), и \(0\), если нет. \(i\)-й символ в \(i\)-й строке должен равняться \(1\) для всех \(i\). После вывода ответа, интерактор ответит одним целым числом. Если это \(1\), значит вы вывели правильный ответ, и должны продолжить решать следующие наборы входных данных (или завершиться, если это был последний). Если это \(-1\), вы вывели неправильный ответ, и должны немедленно завершиться, чтобы получиться вердикт Wrong answer. Иначе, вы можете получить произвольный вердикт, потому что ваше решение будет продолжать читать из закрытого потока. Протокол взаимодействия Чтобы задать вопрос первого типа, используйте формат: - \(1\) \(a\) \(b\) (\(0 \le a,b \le n-1\), \(a \neq b\)).
- интерактор ответит \(1\), если переход ведет из \(a\) в \(b\), и \(0\), если из \(b\) в \(a\).
- вы можете задать не более \(9n\) вопросов этого типа в каждом наборе входных данных.
Чтобы задать вопрос второго типа, используйте формат: - \(2\) \(x\) \(k\) \(s_1\) \(s_2\) ... \(s_k\) (\(0 \le x,s_i \le n-1\), \(0 \le k < n\), \(x \neq s_i\), элементы \(s\) попарно различны).
- интерактор ответит \(1\), если существует переход ведущий из \(x\) в какую-то из комнат из \(s\), и \(0\) иначе.
- вы можете задать не более \(2n\) вопросов этого типа в каждом наборе входных данных.
Если интерактор ответит \(-1\) вместо корректного ответа, это означает, что вы превысили разрешенное количество вопросов, или сделали некорректный вопрос. Немедленно завершитесь после получения \(-1\), чтобы получить вердикт Wrong answer. Иначе, вы можете получить произвольный вердикт, потому что ваше решение будет продолжать читать из закрытого потока. После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Взломы: Первая строка должна содержать целое число \(t\) — количество наборов входных данных. Первая строка каждого набора входных данных должна содержать целое число \(n\) (\(4 \le n \le 100\)) — количество комнат. Каждая из следующих \(n\) строк должна содержать двоичную строку длины \(n\). \(j\)-й символ в \(i\)-й строке должен равняться \(1\), если есть переход из комнаты \(i\) в комнату \(j\), и \(0\) иначе. \(i\)-й символ в \(i\)-й строке должен равняться \(0\). Примечание В примере: 
Первый вопрос спрашивает, есть ли переходы из комнаты \(3\) в любую другую комнату. Второй вопрос спрашивает про направление перехода между комнатами \(0\) и \(1\). Спустя еще пару вопросов, мы узнаем, что можно добраться из любой комнаты до любой другой, кроме случая, когда мы начинаем в комнате \(3\), из которой нельзя выйти. Поэтому, мы выводим матрицу: 1111 1111 1111 0001
Интерактор отвечает \(1\), что означает, что наш ответ корректен.
| |
|
|
D. Феникс и носки
жадные алгоритмы
сортировки
*1500
Чтобы удовлетворить свою любовь к собиранию носков в пары, Феникс принес свои \(n\) носков (\(n\) — четное) в магазин по продаже носков. Каждый его носок определенного цвета \(c_i\) и либо левый, либо правый. Феникс может заплатить один доллар магазину, чтобы: - либо перекрасить какой-то носок в любой цвет \(c'\) \((1 \le c' \le n)\),
- либо превратить левый носок в правый,
- либо превратить правый носок в левый.
Магазин может производить любое из изменений любое количество раз. Заметим, что цвет левого носка не меняется, когда он превращается в правый, и наоборот. Два носка образуют пару, если это левый и правый носок одинакового цвета. Какую минимальное количество денег нужно заплатить Фениксу, чтобы собрать \(n/2\) пар? Каждый носок должен попасть ровно в одну пару. Выходные данные Для каждого набора входных данных, выведите одно число — минимальное количество денег, которое нужно заплатить Фениксу, чтобы собрать \(n/2\) пар носков. Каждый носок должен попасть ровно в одну пару. Примечание В первом наборе, Феникс может заплатить \(2\) доллара для того, чтобы: - перекрасить носок \(1\) в цвет \(2\),
- перекрасить носок \(3\) в цвет \(2\).
В результате он получит \(3\) пары. Например, пары \((1, 4)\), \((2, 5)\) и \((3, 6)\). Во втором наборе, Феникс может заплатить \(3\) доллара, чтобы: - превратить носок \(6\) из правого в левый,
- перекрасить носок \(3\) в цвет \(1\),
- перекрасить носок \(4\) в цвет \(1\).
В результате он получит \(3\) пары. Например, пары \((1, 3)\), \((2, 4)\) и \((5, 6)\).
| |
|
|
H. Феникс и биты
битмаски
Перебор
сортировки
Структуры данных
*3500
Феникс любит играть с битами — особенно используя битовые операции AND, OR и XOR. У него есть \(n\) целых чисел \(a_1, a_2, \dots, a_n\) и \(q\) запросов, каждый одного из следующих типов: - заменить все числа \(a_i\), для которых \(l \le a_i \le r\), на \(a_i\) AND \(x\);
- заменить все числа \(a_i\), для которых \(l \le a_i \le r\), на \(a_i\) OR \(x\);
- заменить все числа \(a_i\), для которых \(l \le a_i \le r\), на \(a_i\) XOR \(x\);
- вывести количество различных чисел \(a_i\), для которых \(l \le a_i \le r\).
В каждом запросе Феникса \(l\), \(r\) и \(x\) заданы. Заметим, что он рассматривает значения чисел, а не их индексы. Выходные данные Выведите ответ для каждого запроса четвертого типа (\(t=4\)). Примечание В первом примере: - В первом запросе, \(2\) заменяется на \(2\) AND \(2 = 2\), и \(3\) заменяется на \(3\) AND \(2 = 2\). Множество чисел становится \(\{1, 2, 4, 5\}\).
- Во втором запросе, есть \(3\) различных числа от \(2\) по \(5\): \(2\), \(4\) и \(5\).
- В третьем запросе, \(2\) заменяется на \(2\) XOR \(3 = 1\), \(4\) заменяется на \(4\) XOR \(3 = 7\), и \(5\) заменяется на \(5\) XOR \(3 = 6\). Множество чисел становится \(\{1, 6, 7\}\).
- В четвертом запросе, есть \(2\) различных числа от \(1\) по \(6\): \(1\) и \(6\).
- В пятом запросе, \(1\) заменяется на \(1\) OR \(8 = 9\). Множество чисел становится \(\{6, 7, 9\}\).
- В шестом запросе, есть одно различное число от \(8\) по \(10\): \(9\).
| |
|
|
I. Феникс и бриллианты
Бинарный поиск
сортировки
Структуры данных
*3400
Фениксу стало интересно: какого это — красть бриллианты из ювелирного магазина! Всего есть \(n\) видов бриллиантов: бриллиант \(i\)-го вида весит \(w_i\) и стоит \(v_i\). Первоначально в магазине есть \(a_i\) бриллиантов \(i\)-го вида. Каждый день, на протяжении \(q\) дней, происходит одно из следующих событий: - В магазин поступает \(k_i\) бриллиантов вида \(d_i\).
- Магазин продает \(k_i\) бриллиантов вида \(d_i\).
- Феникс интересуется, что произойдет, если он решит ограбить магазин, придя в него с мешком, который может вместить бриллианты суммарным весом не более \(c_i\). Если Феникс будет брать бриллианты жадно начиная с самых дорогих, бриллиантов на какую стоимость он наберет? Если есть несколько бриллиантов с максимальной стоимостью, он будет брать сначала самые легкие. Если же среди бриллиантов с максимальной стоимостью есть несколько с минимальным весом, то он берет любой из них.
Конечно же, так как Феникс — законопослушный гражданин, то все описанное выше — не более чем мысленный эксперимент и он никогда не будет по-настоящему забирать бриллианты из магазина. Другими словами, запросы типа \(3\) не влияют на количество бриллиантов в магазине. Выходные данные Выведите ответ для каждого запроса третьего типа (\(t=3\)). Примечание В первом запросе с \(t=3\), Феникс может уместить \(2\) бриллианта вида \(1\), с общим весом \(6\) и стоимостью \(8\). Во втором запросе с \(t=3\), Феникс может забрать \(3\) бриллианта вида \(3\) и еще один вида \(1\). Общий вес будет равен \(9\), а стоимость — \(16\). Заметим, что бриллианты вида \(3\) предпочтительнее, чем вида \(1\), потому что вид \(3\) при равной стоимости имеет меньший вес. В последнем запросе с \(t=3\), Феникс может забрать все бриллианты с общей стоимостью \(13\).
| |
|
|
B. Утренняя пробежка
жадные алгоритмы
Конструктив
сортировки
*1200
Волонтеры 2050 организуют мероприятие «Беги! Догони восходящее солнце». Начав 25 апреля в 7:30, участники пробегут по 6-километровому маршруту вокруг города Юньци. На маршруте будет \(n+1\) контрольный пункт. Они пронумерованы \(0\), \(1\), ..., \(n\). Участники начнут в контрольном пункте \(0\) и закончат в пункте \(n\). Ни один контрольный пункт нельзя пропустить — они должны будут пробежать от пункта \(0\) до пункта \(1\), потом от пункта \(1\) до пункта \(2\), и так далее. Изучите картинку из секции примечание для разъяснения. Между каждой парой соседних контрольных пунктов есть \(m\) различных путей на выбор. Для всех \(1\le i\le n\), чтобы пробежать от пункта \(i-1\) до пункта \(i\), участник должен выбрать ровно один путь из \(m\) возможных. Длина \(j\)-го пути между пунктами \(i-1\) и \(i\) равняется \(b_{i,j}\) для всех \(1\le j\le m\) и \(1\le i\le n\). Чтобы протестировать маршрут, у нас есть \(m\) бегунов. Каждый бегун должен пробежать от пункта \(0\) до пункта \(n\) один раз, посетив все промежуточные пункты. Каждый путь между каждой парой соседних контрольных пунктов должен быть использован ровно одним бегуном. Если бегун выберет путь длины \(l_i\) между пунктами \(i-1\) и \(i\) (\(1\le i\le n\)), его усталость будет равна \(\)\min_{i=1}^n l_i,\(\) то есть минимальной длине из путей, по которым он пробежал. Выберите пути для \(m\) бегунов так, чтобы их суммарная усталость была минимальна. Выходные данные Для каждого набора входных данных выведите \(n\) строк. \(j\)-е число в \(i\)-й строке должно равняться длине пути, который \(j\)-й бегун выберет между контрольными пунктами \(i-1\) и \(i\). В \(i\)-й строке должно быть ровно \(m\) целых чисел и эти числа должны образовывать перестановку чисел \(b_{i, 1}\), ..., \(b_{i, m}\) для всех \(1\le i\le n\). Если существует несколько решений, выведите любое. Примечание В первом наборе входных данных сумма усталостей равна \(\min(2,5) + \min(3,3) + \min(4,1) = 6\). Во втором наборе входных данных сумма усталостей равна \(\min(2,4,3) + \min(3,1,5) = 3\).
| |
|
|
C. Берляндский отбор
жадные алгоритмы
Перебор
сортировки
Структуры данных
теория чисел
*1400
Поликарп организует региональные ICPC соревнования в Берляндии. Всего в Берляндии \(n\) университетов, пронумерованных от \(1\) до \(n\). Поликарп знает всех спортивных программистов в регионе. Всего \(n\) студентов: \(i\)-й студент учится в университете \(u_i\), а его навык программирования оценивается величиной \(s_i\). Поликарп сейчас думает над правилами регионального соревнования. В частности, над количеством участников в командах. Поликарп знает, что если он выберет размер команды, как некоторое целое число \(k\), то каждый университет отправит \(k\) своих самых сильных (с наибольшей величиной навыка \(s\)) студентов в первой команде, следующие \(k\) — во второй команде и так далее. Если остается меньше \(k\) студентов, то команду нельзя собрать. Обратите внимание, что некоторые университеты могут отправить ноль команд. Сила региона определяется, как суммарная величина навыков участников всех команд. Если ни одной команды нет, то сила равна \(0\). Помогите Поликарпу найти силу региона для каждого \(k\) от \(1\) до \(n\). Выходные данные На каждый набор входных данных выведите \(n\) целых чисел: силу региона — суммарную величину навыка программирования участников команд — для каждого выбора размера команды \(k\). Примечание В первом наборе входных данных команды университетов для каждого \(k\): - \(k=1\):
- университет \(1\): \([6], [5], [5], [3]\);
- университет \(2\): \([8], [1], [1]\);
- \(k=2\):
- университет \(1\): \([6, 5], [5, 3]\);
- университет \(2\): \([8, 1]\);
- \(k=3\):
- университет \(1\): \([6, 5, 5]\);
- университет \(2\): \([8, 1, 1]\);
- \(k=4\):
- университет \(1\): \([6, 5, 5, 3]\);
| |
|
|
E. Сдвиг на один
геометрия
графы
Деревья
Конструктив
поиск в глубину и подобное
сортировки
*2700
На бесконечной плоскости лежат \(n\) точек. Координаты \(i\)-й точки \((x_i, y_i)\) такие, что \(x_i > 0\) и \(y_i > 0\). Координаты необязательно целые. За один ход осуществляются следующие операции: - выбрать две точки \(a\) и \(b\) (\(a \neq b\));
- подвинуть точку \(a\) из \((x_a, y_a)\) либо в \((x_a + 1, y_a)\), либо в \((x_a, y_a + 1)\);
- подвинуть точку \(b\) из \((x_b, y_b)\) либо в \((x_b + 1, y_b)\), либо в \((x_b, y_b + 1)\);
- удалить точки \(a\) и \(b\).
Ход можно совершить только в том случае, если существует прямая, проходящая через новые координаты \(a\), новые координаты \(b\) и \((0, 0)\). Иначе ход совершить нельзя, и точки остаются на своих начальных координатах \((x_a, y_a)\) и \((x_b, y_b)\), соответственно. Нумерация точек не меняется после удаления точек. Если точки удалены, то они не могут быть выбраны в последующих ходах. Обратите внимание, что необходимо двигать обе точки во время хода, нельзя оставлять их в изначальных координатах. Какое наибольшее количество ходов можно совершить? Какие это ходы? Если существует несколько ответов, то выведите любой из них. Выходные данные В первой строке выведите одно целое число \(c\) — наибольшее количество ходов, которые можно совершить. В каждой из следующих \(c\) строк должно быть записано описание хода: два целых числа \(a\) и \(b\) (\(1 \le a, b \le n\), \(a \neq b\)) — точки, удаляемые на текущем ходу. Должен существовать способ подвинуть точки \(a\) и \(b\) согласно условию так, чтобы существовала прямая, проходящая через новые координаты \(a\), новые координаты \(b\) и \((0, 0)\). Никакая удаленная точка не может быть удалена в последующих ходах. Если существует несколько ответов, то выведите любой из них. Можно выводить ходы и точки внутри ходов в произвольном порядке. Примечание Точки из первого примера и перемещения для тех из них, которые выбираются в ходах:
| |
|
|
C. Столкновения роботов
жадные алгоритмы
реализация
сортировки
Структуры данных
*2000
\(n\) роботов ездят по координатной оси OX. На этой оси также есть две стены: одна в координате \(0\), другая в координате \(m\). \(i\)-й робот начинает в целой координате \(x_i~(0 < x_i < m)\) и движется либо влево (в сторону \(0\)), либо вправо со скоростью \(1\) в секунду. Никакие два робота не начинают в одной координате. Когда робот достигает стены, он мгновенно разворачивается и продолжает свою поездку в противоположном направлении с той же скоростью. Когда несколько роботов встречаются в одной целой координате, они сталкиваются и взрываются. Как только робот взорвался, он больше не сталкивается с другими роботами. Обратите внимание, что если роботы встретятся в нецелой координате, то ничего не случится. Для каждого робота проверьте, взорвется ли он когда-нибудь, и выведите время взрыва, если да, и \(-1\) в противном случае. Выходные данные На каждый набор входных данных выведите \(n\) целых чисел — для \(i\)-го робота выведите время взрыва, если он взорвется, и \(-1\) в противном случае. Примечание Изображение секунд \(0, 1, 2\) и \(3\) для первого набора входных данных: Обратите внимание, что роботы \(2\) и \(3\) не сталкиваются, потому что они встречаются в одной точке \(2.5\), которая не является целой. После секунды \(3\) робот \(6\) просто ездит бесконечно, потому что нет робота, с которым он мог бы столкнуться.
| |
|
|
A. Среднее неравенство...
Конструктив
сортировки
*800
Вам дан массив \(a\) из \(2n\) различных целых чисел. Вы хотите расположить элементы этого массива по кругу так, чтобы ни один элемент не был равен среднему арифметическому своих \(2\) соседей. Более формально, найдите массив \(b\) такой, что: \(b\) является перестановкой \(a\). Для каждого \(i\) от \(1\) до \(2n\), \(b_i \neq \frac{b_{i-1}+b_{i+1}}{2}\), где \(b_0 = b_{2n}\) и \(b_{2n+1} = b_1\). Можно показать, что при ограничениях задачи такой массив \(b\) всегда существует. Выходные данные Для каждого набора входных данных выведите \(2n\) целых чисел, \(b_1, b_2, \ldots b_{2n}\), для которых выполняются требования из условия. Примечание В первом примере массив \([3, 1, 4, 2, 5, 6]\) подходит, так как он является перестановкой \([1, 2, 3, 4, 5, 6]\), а также \(\frac{3+4}{2}\neq 1\), \(\frac{1+2}{2}\neq 4\), \(\frac{4+5}{2}\neq 2\), \(\frac{2+6}{2}\neq 5\), \(\frac{5+3}{2}\neq 6\), \(\frac{6+1}{2}\neq 3\).
| |
|
|
B. Sifid и странные подпоследовательности
жадные алгоритмы
математика
сортировки
*1100
Последовательность \((b_1, b_2, \ldots, b_k)\) называется странной, если модуль разности между любой парой ее элементов больше или равен максимальному элементу этой последовательности. Формально говоря, она странная, если для каждой пары \((i, j)\) с \(1 \le i<j \le k\) выполняется \(|a_i-a_j|\geq MAX\), где \(MAX\) — наибольший элемент последовательности. В частности, любая последовательность длины не более \(1\) является странной. Например, последовательности \((-2021, -1, -1, -1)\) и \((-1, 0, 1)\) являются странными, а \((3, 0, 1)\) — нет, потому что \(|0 - 1| < 3\). У Sifid есть массив \(a\) из \(n\) целых чисел. Sifid любит все большое, поэтому среди всех странных подпоследовательностей \(a\) он хочет найти длину самой длинной. Можете ли вы ему помочь? Последовательность \(c\) является подпоследовательностью массива \(d\), если \(c\) может быть получена из \(d\) путем удаления нескольких (возможно, нуля или всех) элементов. Выходные данные Для каждого наборам входных данных выведите одно целое число — длину самой длинной странной подпоследовательности \(a\). Примечание В первом наборе входных данных одной из самых длинных странных подпоследовательностей является \((a_1, a_2, a_3, a_4)\). Во втором наборе входных данных одной из самых длинных странных подпоследовательностей является \((a_1, a_3, a_4, a_5, a_7)\). В третьем наборе входных данных одной из самых длинных странных подпоследовательностей является \((a_1, a_3, a_4, a_5)\). В четвертом наборе входных данных одной из самых длинных странных подпоследовательностей является \((a_2)\). В пятом наборе входных данных одной из самых длинных странных подпоследовательностей является \((a_1, a_2, a_4)\).
| |
|
|
C. Погоня
Бинарный поиск
жадные алгоритмы
Перебор
сортировки
*1200
Вы и ваш друг Илья участвуете в личном соревновании по программированию, состоящем из множества этапов. За каждый этап участник может получить любое целое число баллов от \(0\) до \(100\) включительно, независимо от других участников. Баллы, набранные участниками в отдельных этапах, используются для формирования суммарных результатов соревнования. Пусть к некоторому моменту времени прошло \(k\) этапов. Тогда для каждого участника выбирается \(k - \lfloor \frac{k}{4} \rfloor\) этапов, на которых он набрал наибольшее число баллов, и суммируются баллы на них. Полученное число и является суммарным результатом участника. (Здесь \(\lfloor t \rfloor\) обозначает округление вниз до наибольшего целого числа, не большего \(t\).) Например, пусть прошло \(9\) этапов, на которых вы набрали баллы \(50, 30, 50, 50, 100, 10, 30, 100, 50\). Сначала выбираются \(7\) этапов, на которых вы набрали наибольшее число баллов: например, это могут быть все этапы, кроме \(2\)-го и \(6\)-го. Тогда ваш суммарный результат равен \(50 + 50 + 50 + 100 + 30 + 100 + 50 = 430\). К данному моменту прошло \(n\) этапов, и вам известны ваши баллы и баллы Ильи на каждом из этих этапов. Однако сколько ещё этапов будет в соревновании, неизвестно. Вам интересно, какое наименьшее число этапов ещё должно пройти, чтобы ваш результат хотя бы теоретически смог оказаться больше или равен результату Ильи. Найдите это число! Выходные данные Для каждого набора входных данных выведите одно целое число — наименьшее число этапов, через которое ваш результат может оказаться больше или равен результату Ильи. Если ваш результат уже и так не меньше результата Ильи, выведите \(0\). Примечание В первом наборе входных данных вы набрали \(100\) баллов на единственном прошедшем этапе, а Илья — \(0\). Значит, ваш суммарный результат (\(100\)) и так не хуже результата Ильи (\(0\)). Во втором наборе входных данных вы набрали \(0\) баллов на первом этапе, а Илья — \(100\). Достаточно одного этапа с противоположным результатом, чтобы суммарный результат вас обоих стал равен \(100\). В третьем наборе входных данных ваш суммарный результат равен \(30 + 40 + 50 = 120\), а Ильи — \(100 + 100 + 100 = 300\). После трёх дополнительных этапов ваш результат может стать равен \(420\), а Ильи — \(400\). В четвёртом наборе входных данных после четырёх дополнительных этапов ваш результат может стать равен \(470\), а Ильи — \(400\). Трёх этапов недостаточно.
| |
|
|
G. Новое начало
геометрия
дп
сортировки
Структуры данных
*3300
Анни устала выигрывать все контесты и получать бесконечный рейтинг, поэтому сегодня вместо контеста она поехала сажать картошку. Участок Анни можно представить в виде бесконечной плоскости. Анни должна посадить \(n\) кустов картошки, \(i\)-й куст должен быть посажен в точке \((x_i,y_i)\). Анни начнет в точке \((0, 0)\), и за один шаг будет перемещаться на одну единицу длины вправо или вверх (т. е. увеличивать свою координату \(x\) или \(y\) на \(1\)). Из любой точки \((X,Y)\) в процессе движения она может посадить любое количество кустов в любых точках плоскости, используя свою картофельную пушку. Для посадки одного куста в точку \((x,y)\) требуется \(\max(|X-x|,|Y-y|)\) единиц энергии. Найдите минимальное количество энергии, необходимое для посадки всех кустов картошки. Обратите внимание, что Анни может посадить любое количество кустов из любой точки. Выходные данные Выведите минимальное количество энергии, необходимое для посадки всей картошки. Примечание В примере \(1\) Анни может посетить все необходимые точки, поэтому энергия не требуется. В примере \(2\) Анни сначала может пойти в \((1,0)\), посадить оттуда второй куст, используя \(1\) единицу энергии. Затем она пойдет в \((1,1)\) и посадит первый куст, используя \(0\) единиц энергии.
| |
|
|
H. Потерянные вершины
графы
Деревья
дп
интерактив
Конструктив
сортировки
*3500
Это интерактивная задача. Так как маленький Эрики прошел на Международную олимпиаду школьников по информатике в этом году, он получил подарок от своих друзей: дерево с \(n\) вершинами! По пути к месту проведения Эрики было скучно, поэтому он решил сыграть в игру с маленьким Ивонном с использованием нового дерева. Сначала Ивонн загадывает две (не обязательно различные) вершины \(a\) и \(b\) в этом дереве (не сообщая их Эрики), а затем сообщает ему подсказку \(f\) — одну из вершин на простом пути от \(a\) до \(b\). Затем маленький Эрики может спрашивать следующие вопросы: - Если подвесить дерево за вершину \(r\) (Эрики может выбрать \(r\)), какая вершина будет наименьшим общим предком вершин \(a\) и \(b\)?
Задача маленького Эрики — найти вершины \(a\) и \(b\). Маленький Ивонн считает игру слишком простой, поэтому в начале игры, перед тем, как дать подсказку \(f\), он просит Эрики найти максимальное количество запросов, необходимых для нахождения \(a\) и \(b\) для всех возможных значений \(a\), \(b\) и \(f\) в предположении, что Эрики действует оптимально. Под оптимальными действиями подразумевается стратегия, делающая наименьшее число запросов. Конечно, после того, как маленький Эрики скажет это максимальное количество запросов, Ивонн не разрешит сделать больше запросов в самой игре. Дерево, \(a\), \(b\) и \(f\) фиксированы до начала игры и не меняются в зависимости от запросов. Протокол взаимодействия Сначала считайте строку, содержащую одно целое число \(n\) (\(1 \le n \le 10^5\)) — количество вершин в дереве. Сделающие \(n−1\) строк описывают дерево маленького Дорми. Каждая из этих строк содержит два целых числа \(u\) и \(v\) (\(1 \le u,v \le n\)), обозначающие ребро между вершинами \(u\) и \(v\) (\(u \neq v\)). Гарантируется, что эти ребра образуют дерево. После этого вы должны вывести \(k\) — максимальное число запросов, необходимое для определения \(a\) и \(b\) по всем возможным значениям \(a\), \(b\) и \(f\) в предположении оптимальной игры. Вы должны вывести перевод строки и сбросить буфер вывода после вывода \(k\). Затем считайте одно целое число \(f\) (\(1 \le f \le n\)) — подсказку: вершину на пути от \(a\) до \(b\) включительно. После этого вы можете делать запросы. Вам будет разрешено сделать не более \(k\) запросов, где \(k\) — число, которое вы вывели. Для того, чтобы сделать запрос, выведите «? r», где \(r\) — целое число, \(1 \le r \le n\), обозначающее, за какую вершину вы хотите подвесить дерево. В ответ вы получите целое число \(x\) (\(1 \le x \le n\)) — наименьший общий предок вершин \(a\) и \(b\), если дерево подвесить за \(r\). Когда ваша программа определит \(a\) и \(b\), выведите их в следующем формате: «! a b», где \(a\) и \(b\) — две загаданные вершины, и завершите программу сразу после сброса буфера вывода. Вы можете вывести \(a\) и \(b\) в любом порядке. После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Если вы сделаете некорректный вывод, или сделаете более \(k\) запросов, взаимодействие прекратится и вы получите вердикт «Неправильный ответ». Вывод считается некорректным, если это некорректный запрос, или вы вывели \(k\), меньшее \(0\) или большее \(n\). Взломы Чтобы взломать решение, используйте следующий формат: Первая строка содержит одно целое число \(n\) (\(1 \le n \le 10^5\)). Следующие \(n−1\) строк содержат по два целых числа \(u\) и \(v\) (\(1 \le u,v \le n\)), обозначающие ребро между вершинами \(u\) и \(v\) (\(u \neq v\)). Эти \(n-1\) ребра должны образовывать дерево. Следующая строка содержит два целых числа \(a\) и \(b\) (\(1 \le a,b \le n\)). Последняя строка должна содержать одно целое число \(f\) (\(1 \le f \le n\)). Вершина \(f\) должна лежать на простом пути от \(a\) до \(b\) включительно. Примечание Дерево из первого примера показано ниже. Вершины \(a\) и \(b\) выделены жирным. 
Обратите внимание, что вы можете вывести \(a\) и \(b\) в любом порядке. Ниже приведены ответы на все возможные запросы \(1,2,\ldots,n\): - \(1\): \(1\)
- \(2\): \(2\)
- \(3\): \(2\)
- \(4\): \(4\)
__________________________________________ Дерево из второго примера показано ниже. Вершины \(a\) и \(b\) выделены жирным. 
Ниже приведены ответы на все возможные запросы \(1,2,\ldots,n\) в примере \(2\): - \(1\): \(1\)
- \(2\): \(4\)
- \(3\): \(1\)
- \(4\): \(4\)
- \(5\): \(4\)
| |
|
|
B. Переупорядочение массива
жадные алгоритмы
математика
Перебор
сортировки
теория чисел
*900
Вам задан массив \(a\), состоящий из \(n\) целых чисел. Назовем пару индексов \(i\), \(j\) хорошей, если \(1 \le i < j \le n\) и \(\gcd(a_i, 2a_j) > 1\) (где \(\gcd(x, y)\) — наибольший общий делитель чисел \(x\) и \(y\)). Найдите максимальное количество хороших пар индексов, если вы можете переупорядочить элементы массива \(a\) произвольным образом. Выходные данные Для каждого набора выходных данных выведите одно целое число — максимальное количество хороших пар индексов после переупорядочивания элементов массива \(a\). Примечание В первом примере из условия элементы массива можно переставить следующим образом: \([6, 3, 5, 3]\). В третьем примере из условия элементы массива можно переставить следующим образом: \([4, 4, 2, 1, 1]\).
| |
|
|
C. Стабильные группы
жадные алгоритмы
сортировки
*1200
Есть \(n\) учеников, пронумерованных от \(1\) до \(n\). Уровень знаний \(i\)-го ученика равен \(a_i\). Всех учеников нужно распределить на стабильные группы. Группа называется стабильной, если после сортировки всех учеников группы в порядке возрастания их уровня знаний у любых двух подряд идущих учеников разница уровня знаний не превосходит \(x\). Например, при \(x = 4\) группа с уровнями знаний \([1, 10, 8, 4, 4]\) является стабильной (потому что \(4 - 1 \le x\), \(4 - 4 \le x\), \(8 - 4 \le x\), \(10 - 8 \le x\)), а группа с уровнями \([2, 10, 10, 7]\) не является стабильной (\(7 - 2 = 5 > x\)). Преподаватели — достаточно находчивые люди, поэтому в дополнение к \(n\) имеющимся ученикам они могут пригласить не более \(k\) дополнительных учеников с любым уровнем знаний на выбор преподавателей. Определите минимальное число стабильных групп, на которые можно распределить всех учеников (возможно, пригласив новых учеников). Например, если есть два ученика с уровнями знаний \(1\) и \(5\), \(x = 2\), и \(k \ge 1\), то можно пригласить ученика с уровнем знаний \(3\) и определить всех учеников в одну стабильную группу. Выходные данные В единственной строке выведите одно число — искомое минимальное число стабильных групп, на которое можно разбить учеников. Примечание В первом примере из условия можно пригласить учеников с уровнями знаний, равными \(2\) и \(11\). Тогда учеников можно разделить на следующие стабильные группы: - \([1, 1, 2, 5, 8, 11, 12, 13]\),
- \([20, 22]\).
Во втором примере из условия новых учеников приглашать нельзя, поэтому потребуется \(3\) группы: - \([1, 1, 5, 5, 20, 20]\)
- \([60, 70, 70, 70, 80, 90]\)
- \([420]\)
| |
|
|
D. PriceFixed
Бинарный поиск
жадные алгоритмы
реализация
сортировки
*1600
Девочка Лена — самая экономная девочка в Москве. Поэтому когда папа поручил ей закупку продуктов для поездки на дачу, она сразу отправилась в самый лучший магазин — «PriceFixed». У этого магазина есть несколько особенностей: - В магазине есть бесконечный запас каждого товара.
- Все товары в нем стоят одинаково — ровно \(2\) рубля за единицу товара.
- Для каждого из \(i\) товаров предусмотрена скидка для опытных покупателей: если вы уже приобрели \(b_i\) единиц товаров (любого типа, не обязательно типа \(i\)), то на все последующие покупки \(i\)-го товара будет действовать скидка \(50\%\) (то есть единицу \(i\)-го товара можно будет купить за \(1\) рубль!).
Лене нужно купить \(n\) товаров: \(i\)-го товара нужно купить не менее \(a_i\) единиц. Помогите Лене понять, какую минимальную сумму денег ей нужно будет потратить, если она будет выбирать порядок покупки товаров оптимальным образом. Обратите внимание, Лена, если хочет, может купить больше единиц некоторого товара, чем необходимо. Выходные данные Выведите искомую минимальную сумму, которая требуется Лене для совершения всех покупок. Примечание В первом примере из условия Лена может купить товары в таком порядке: - единицу товара \(3\) за \(2\) рубля,
- единицу товара \(1\) за \(2\) рубля
- единицу товара \(1\) за \(2\) рубля,
- единицу товара \(2\) за \(1\) рубль (она может купить его со скидкой, так как уже куплено \(3\) товара),
- единицу товара \(1\) за \(1\) рубль (она может купить его со скидкой, так как уже куплено \(4\) товара).
Суммарно она потратит \(8\) рублей. Можно показать, что меньше потратить невозможно. Во втором примере из условия Лена может купить товары в таком порядке: - единицу товара \(1\) за \(2\) рубля,
- две единицы товара \(2\) по \(2\) рубля за каждую,
- единицу товара \(5\) за \(2\) рубля,
- единицу товара \(3\) за \(1\) рубль,
- две единицы товара \(4\) по \(1\) рублю за каждую,
- единицу товара \(1\) за \(1\) рубль.
Суммарно при таком порядке приобретения товаров Лена потратит \(12\) рублей.
| |
|
|
F. Необычный массив
жадные алгоритмы
сортировки
Структуры данных
*2600
У Васи есть массив, состоящий из \(n\) чисел \(a_1, a_2, \ldots, a_n\). Каждое число в этом массиве Вася считает по-своему необычным. Чтобы вычислить необычность числа на позиции \(i\), Вася делает следующее: Он выбирает подотрезок \(a_l, a_{l+1}, \ldots, a_r\) такой, что \(1 \le l \le i \le r \le n\) и мысленно сортирует его по возрастанию (равные элементы он может переставлять так, как ему хочется). Далее на этом подотрезке он находит центр. Центром подотрезка называется элемент на позиции \((l + r) / 2\), если длина отрезка нечётна, или элемент на позиции \((l + r + 1) / 2\), если длина отрезка чётна. Теперь Вася находит на этом подотрезеке элемент, который до сортировки стоял на позиции \(i\), и смотрит на расстояние от этого элемента до центра подотрезка (расстояние между элементами с индексами \(j\) и \(k\) равняется \(|j - k|\)). Необычностью числа на позиции \(i\) называется максимальное такое расстояние среди всех подходящих выборов \(l\) и \(r\). Вася хочет посчитать необычность каждого числа в своём массиве. Помогите ему это сделать. Выходные данные В единственной строке выведите \(n\) чисел, \(i\)-е из них должно быть равно необычности элемента на позиции \(i\) массива. Примечание В первом примере: - Для первой позиции подойдёт отрезок от позиции \(1\) до позиции \(5\). Если его отсортировать, то числа упорядочатся по значению как \([1, 2, 3, 4, 5]\), центр будет равен \(3\), таким образом расстояние от центра до числа \(5\) равно \(2\).
- Для второй позиции подойдёт отрезок от позиции \(2\) до позиции \(4\).
- Для третей позиции подойдёт отрезок от позиции \(3\) до позиции \(5\).
- Для четвёртой позиции подойдёт отрезок от позиции \(1\) до позиции \(4\). Если его отсортировать, то числа упорядочатся по значению как \([2, 3, 4, 5]\), центр будет равен \(4\), таким образом расстояние от центра до числа \(2\) равно \(2\).
- Для пятой позиции подойдёт отрезок от позиции \(1\) до позиции \(5\).
| |
|
|
C. Профили-двойники
графы
сортировки
хэши
*2300
Вам предложили работу в компании, разрабатывающей крупную социальную сеть. Ваше первое задание связано с поиском профилей, с большой вероятностью принадлежащих одному и тому же пользователю. В социальной сети зарегистрировано n профилей, пронумерованных от 1 до n. Некоторые пары среди них являются друзьями (отношение «быть друзьями» взаимно, то есть если i является другом j, то и j является другом i). Будем говорить, что профили i и j (i ≠ j) являются двойниками, если для любого профиля k (k ≠ i, k ≠ j), верно одно из двух утверждений: либо k дружит и с i, и с j, либо k не дружит ни с одним из них. При этом i и j могут как дружить между собой, так и не дружить. Вам нужно посчитать количество различных неупорядоченных пар (i, j), таких что профили i и j — двойники. Обратите внимание, что пары неупорядоченные, то есть пары (a, b) и (b, a) считается одинаковыми. Выходные данные Выведите единственное целое число — количество неупорядоченных пар профилей, являющихся двойниками. Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++, вместо него рекомендуется использовать спецификатор %I64d. Примечание В первом и втором примерах любые два профиля являются двойниками. В третьем примере двойниками являются пары профилей (1, 3) и (2, 4).
| |
|
|
A. Отличные графы
графы
жадные алгоритмы
Конструктив
кратчайшие пути
сортировки
*1400
У Фермера Джона есть ферма, состоящая из \(n\) пастбищ, соединенных с помощью односторонних дорог. У каждой дороги есть вес, означающий время, которое необходимо потратить, чтобы пройти по ней. Дороги могут иметь отрицательный вес, иными словами, коровы по ним движутся так быстро, что способны перемещаться назад во времени! Однако, Фермер Джон гарантирует, что коровы никак не смогут попасть во временную петлю в том смысле, что не смогут, двигаясь по дорогам, уйти бесконечно далеко в прошлое. Кроме того, каждая пара пастбищ соединена не более чем одной дорогой в каждом направлении. К сожалению, Фермер Джон потерял карту фермы. Все, что он знает — это массив \(d\), где \(d_i\) — это минимальное время, за которое коровы могут добраться до \(i\)-го пастбища из \(1\)-го, двигаясь по дорогам. Стоимость его фермы — это сумма весов всех дорог, и Фермер Джон хочет узнать минимально возможную стоимость фермы, которая не противоречит тому, что он помнит. Выходные данные Для каждого набора, выведите минимально возможную стоимость фермы, которая не противоречит воспоминаниям Фермера Джона. Примечание В первом наборе вы можете добавить дороги - от пастбища \(1\) к пастбищу \(2\) с весом \(2\),
- от пастбища \(2\) к пастбищу \(3\) с весом \(1\),
- от пастбища \(3\) к пастбищу \(1\) с весом \(-3\),
- от пастбища \(3\) к пастбищу \(2\) с весом \(-1\),
- от пастбища \(2\) к пастбищу \(1\) с весом \(-2\).
Суммарная стоимость равна \(2 + 1 + -3 + -1 + -2 = -3\). Во втором набор вы можете добавить дорогу от пастбища \(1\) к пастбищу \(2\) с весом \(1000000000\) и дорогу от пастбища \(2\) к пастбищу \(1\) со стоимостью \(-1000000000\). Суммарная стоимость равна \(1000000000 + -1000000000 = 0\). В третьем наборе, вы не можете добавить ни одной дороги. Суммарная стоимость равна \(0\).
| |
|
|
A. AquaMoon и странная сортировка
сортировки
*1500
У AquaMoon есть \(n\) друзей. Они встали в ряд. \(i\)-й слева друг надел футболку с числом \(a_i\), написанным на ней. Каждый друг смотрит в одну из двух сторон налево или направо. В начале все друзья смотрят направо. AquaMoon может делать операции с друзьями. На каждой операции AquaMoon может выбрать два соседних в ряду друга и поменять их местами. После каждой операции оба друга изменяют направление, в котором смотрели, на противоположное: если кто-то смотрел налево, он будет смотреть направо, и наоборот. AquaMoon надеется, что после нескольких операций числа, написанные на футболках у \(n\) друзей станут неубывающими, если смотреть на них слева направо. Также она хочет, чтобы в этот момент все друзья смотрели направо. Установите, возможно ли это. Выходные данные Для каждого набора входных данных выведите «YES» (без кавычек), если существует возможная последовательность операций; иначе, выведите «NO» (без кавычек). Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Примечание Возможная последовательность операций для первого набора входных данных: - Поменять \(a_1\) и \(a_2\). В результате последовательность чисел \(3, 4, 2, 5\). Друзья смотрят: налево, налево, направо, направо.
- Поменять \(a_2\) и \(a_3\). В результате последовательность чисел \(3, 2, 4, 5\). Друзья смотрят: налево, налево, направо, направо.
- Поменять \(a_1\) и \(a_2\). В результате последовательность чисел \(2, 3, 4, 5\). Друзья смотрят: направо, направо, направо, направо.
| |
|
|
E. Кондиционеры
дп
кратчайшие пути
реализация
сортировки
Структуры данных
*1500
На клетчатой полоске длины \(n\) расположены \(k\) кондиционеров: \(i\)-й кондиционер расположен в клетке \(a_i\) (\(1 \le a_i \le n\)). Два или более кондиционера не могут находиться в одной клетке (то есть все \(a_i\) различны). Каждый кондиционер характеризуется еще одним параметром — температурой: \(i\)-й кондиционер включен на температуру \(t_i\). Пример полосы длины \(n=6\), где \(k=2\), \(a=[2,5]\) и \(t=[14,16]\). Для каждой клетки \(i\) (\(1 \le i \le n\)) найдите температуру воздуха в ней, которая равна \(\)\min_{1 \le j \le k}(t_j + |a_j - i|),\(\) где \(|a_j - i|\) обозначает абсолютную величину (модуль) значения разности \(a_j - i\). Иными словами, температура в клетке \(i\) равна минимуму среди температур кондиционеров, увеличенных на расстояние от кондиционера до клетки \(i\). Рассмотрим пример. Пусть \(n=6, k=2\), первый кондиционер стоит в клетке \(a_1=2\) включен на температуру \(t_1=14\), а второй стоит в клетке \(a_2=5\) и включен на температуру \(t_2=16\). В таком случае температуры воздуха в клетках будут следующими: - температура в \(1\)-й клетке равна: \(\min(14 + |2 - 1|, 16 + |5 - 1|)=\min(14 + 1, 16 + 4)=\min(15, 20)=15\);
- температура во \(2\)-й клетке равна: \(\min(14 + |2 - 2|, 16 + |5 - 2|)=\min(14 + 0, 16 + 3)=\min(14, 19)=14\);
- температура в \(3\)-й клетке равна: \(\min(14 + |2 - 3|, 16 + |5 - 3|)=\min(14 + 1, 16 + 2)=\min(15, 18)=15\);
- температура в \(4\)-й клетке равна: \(\min(14 + |2 - 4|, 16 + |5 - 4|)=\min(14 + 2, 16 + 1)=\min(16, 17)=16\);
- температура в \(5\)-й клетке равна: \(\min(14 + |2 - 5|, 16 + |5 - 5|)=\min(14 + 3, 16 + 0)=\min(17, 16)=16\);
- температура в \(6\)-й клетке равна: \(\min(14 + |2 - 6|, 16 + |5 - 6|)=\min(14 + 4, 16 + 1)=\min(18, 17)=17\).
Для каждой клетки от \(1\) до \(n\) найдите температуру воздуха в ней. Выходные данные Для каждого набора входных данных выведите через пробел \(n\) целых чисел — температуры воздуха в клетках.
| |
|
|
B. Комбинация
жадные алгоритмы
сортировки
*1100
Илья играет в карточную игру со следующими правилами. На руках у игрока имеется некоторое количество карт. На каждой карте написано по два целых неотрицательных числа — одно в верхней части карты и одно в нижней. В начале партии игрок выбирает одну из своих карт для отыгрыша. Если в верхней части карты написано число ai, а в нижней — bi, то при ее отыгрыше игрок получает ai очков и получает возможность сыграть дополнительно bi карт. После отыгрыша карта пропадает. Более формально: пусть есть счетчик количества карт для отыгрыша, который в начале партии равен одному. При отыгрыше карты счетчик уменьшается на один за сыгранную карту и увеличивается на число bi, которое написано в нижней части карты. Далее сыгранная карта пропадает. Если после этого счетчик не равен нулю, игрок получает возможность сыграть еще одну карту из оставшихся. Игра заканчивается, когда счетчик становится равным нулю либо у игрока кончаются карты. Разумеется, Илья хочет набрать побольше очков. Сможете ли Вы, зная его карты, определить максимальное количество очков, которое он может набрать? Выходные данные Выведите единственное число — максимальное количество очков, которое можно набрать за одну партию по описанным правилам. Примечание В первом примере ни одна из двух карт не приносит дополнительных ходов, поэтому играть нужно ту, которая приносит больше очков. Во втором примере сперва нужно сыграть третью карту, которая не приносит очков, но зато позволяет сыграть обе оставшиеся карты.
| |
|
|
D. Отличные массивы
Бинарный поиск
Комбинаторика
Конструктив
математика
реализация
сортировки
*2300
Назовем целочисленный массив \(a_1, a_2, \dots, a_n\) хорошим, если \(a_i \neq i\) для всех \(i\). Пусть \(F(a)\) — это количество пар \((i, j)\) (\(1 \le i < j \le n\)) таких, что \(a_i + a_j = i + j\). Назовем массив \(a_1, a_2, \dots, a_n\) отличным если: - \(a\) — хороший;
- \(l \le a_i \le r\) для всех \(i\);
- \(F(a)\) максимально возможное среди всех хороших массивов размера \(n\).
Для заданных \(n\), \(l\) и \(r\) посчитайте количество отличных массивов по модулю \(10^9 + 7\). Выходные данные Для каждого набора входных данных выведите количество отличных массивов по модулю \(10^9 + 7\). Примечание В первом наборе входных данных, можно показать, что максимальное \(F(a)\) среди всех хороших массивов \(a\) равно \(2\). Отличными являются следующие массивы: - \([2, 1, 2]\);
- \([0, 3, 2]\);
- \([2, 3, 2]\);
- \([3, 0, 1]\).
| |
|
|
C. Интересный рассказ
жадные алгоритмы
сортировки
Строки
*1500
Стивен Квин хочет написать новый рассказ. Вы знаете, он очень необычный писатель — Стивен использует только буквы 'a', 'b', 'c', 'd' и 'e'! Чтобы написать рассказ, Стивен выписал \(n\) слов, состоящих из первых \(5\) строчных букв латинского алфавита. Из них он хочет выбрать максимальное количество слов таким образом, чтобы получился интересный рассказ. Рассказ представляет собой список слов, необязательно различных. Рассказ называется интересным, если существует буква, которая встречается во всех входящих в него словах большее количество раз, чем все остальные буквы латинского алфавита вместе взятые. Например, рассказ, состоящий из слов «bac», «aaada», «e», является интересным (буква «a» встречается в словах рассказа всего \(5\) раз, остальные — \(4\)), а рассказ, состоящий из слов «aba», «abcde» — нет (не существует буквы, встречающейся во всех словах рассказа большее число раз, чем все остальные вместе взятые). Вам дан список из \(n\) слов. Выберите из этого списка максимальное количество слов так, чтобы они образовывали интересный рассказ. Если невозможно составить непустой интересный рассказ, выведите \(0\). Выходные данные Для каждого набора входных данных выведите максимальное количество слов из заданного списка, которые могут образовать интересный рассказ. Если невозможно составить непустой интересный рассказ, выведите 0. Примечание В первом наборе входных данных примера все \(3\) слова могут быть использованы одновременно, чтобы составить интересный рассказ. Рассказ будет иметь вид «bac aaada e». Во втором наборе входных данных примера \(1\)-е и \(3\)-е слова могут быть использованы для составления интересного рассказа. Рассказ будет иметь вид «aba aba». Заметим, что все три слова одновременно использовать нельзя. В третьем наборе входных данных примера автор не может составить непустой интересный рассказ. Поэтому ответ равен \(0\). В четвертом наборе входных данных примера \(3\)-е и \(4\)-е слова могут быть использованы для составления интересного рассказа. Рассказ будет иметь вид «c bc».
| |
|
|
A. Перестановка подпоследовательности
сортировки
Строки
*800
Дана строка \(s\) длины \(n\), состоящая из строчных букв английского алфавита. Вы должны выбрать некоторое число \(k\) между \(0\) и \(n\). Затем вы выбираете некоторые \(k\) символов \(s\) и переставляете их как угодно. При этом позиции остальных символов \(n-k\) остаются неизменными. Эту операцию нужно выполнить ровно один раз. Например, если \(s=\texttt{"andrea"}\), то можно выбрать \(k=4\) символов \(\texttt{"a_d_ea"}\) и переставить их в порядке \(\texttt{"d_e_aa"}\) так, чтобы после операции строка стала \(\texttt{"dneraa"}\). Определите минимально возможное значение \(k\), выбрав которое можно отсортировать \(s\) в алфавитном порядке (то есть, чтобы после операции ее символы располагались в алфавитном порядке). Выходные данные Для каждого набора входных данных выведите минимальное значение \(k\), которое позволяет получить строку, отсортированную по алфавиту, с помощью операции, описанной выше. Примечание В первом наборе входных данных мы можем выбрать \(k=2\) символа \(\texttt{"_ol"}\) и переставить их как \(\texttt{"_lo"}\) (так что результирующая строка будет \(\texttt{"llo"}\)). Невозможно отсортировать строку, выбирая строго менее \(2\) символов. Во втором наборе входных данных одним из возможных способов сортировки \(s\) является рассмотрение \(k=6\) символов \(\texttt{"_o__force_"}\) и перестановка их как \(\texttt{"_c__efoor_"}\) (так что результирующая строка будет \(\texttt{"ccdeefoors"}\)). Можно показать, что невозможно отсортировать строку, выбирая строго меньше \(6\) символов. В третьем наборе входных данных, строка \(s\) уже отсортирована (поэтому мы можем выбрать \(k=0\) символов). В четвертом наборе входных данных мы можем выбрать все \(k=4\) символов \(\texttt{"dcba"}\) и перевернуть всю строку (так что результирующая строка будет \(\texttt{"abcd"}\)).
| |
|
|
B. Забег за золотом
графы
жадные алгоритмы
Комбинаторика
сортировки
*1500
Олимпийские игры только что начались, и Федерико с нетерпением ждет начала марафонского забега. В марафоне будут участвовать \(n\) спортсменов, от \(1\) до \(n\), и все они в прошлом участвовали в \(5\) важных марафонах, пронумерованных от \(1\) до \(5\). Для каждого \(1\le i\le n\) и \(1\le j\le 5\) Федерико помнит, что спортсмен \(i\) занял место \(r_{i,j}\) в марафоне \(j\) (например, \(r_{2,4}=3\) означает, что спортсмен \(2\) был третьим в марафоне \(4\)). Федерико считает, что спортсмен \(x\) превосходит спортсмена \(y\), если спортсмен \(x\) занял лучшее место, чем спортсмен \(y\), по крайней мере в \(3\) прошлых марафонах, т.е. \(r_{x,j}<r_{y,j}\) по крайней мере для \(3\) различных значений \(j\). Федерико считает, что у спортсмена хорошие шансы получить золотую медаль на Олимпийских играх, если он превосходит всех остальных спортсменов. Найдите любого спортсмена, у которого хорошие шансы получить золотую медаль (то есть спортсмена, который превосходит всех остальных спортсменов), или определите, что такого спортсмена нет. Входные данные Первая строка содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Затем следуют \(t\) наборов входных данных. Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1\le n\le 50\,000\)) — количество спортсменов. Затем следуют \(n\) строк, каждая из которых описывает места одного спортсмена. \(i\)-я из этих строк содержит \(5\) целых чисел \(r_{i,1},\,r_{i,2},\,r_{i,3},\,r_{i,4},\, r_{i,5}\) (\(1\le r_{i,j}\le 50\,000\)) — места спортсмена \(i\) в последних \(5\) марафонах. Гарантируется, что в каждом из \(5\) прошедших марафонов \(n\) спортсменов заняли различные места, т.е. для каждого \(1\le j\le 5\), \(n\) значений \(r_{1,j},\, r_{2, j},\, \dots,\, r_{n, j}\) попарно различны. Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(50\,000\). Выходные данные Для каждого набора входных данных выведите одно целое число — номер спортсмена, у которого хорошие шансы получить золотую медаль (то есть спортсмена, который превосходит всех остальных спортсменов). Если таких спортсменов нет, выведите \(-1\). Если таких спортсменов больше, чем один, выведите любого из них. Примечание Объяснение первого набора входных данных: Есть только один спортсмен, поэтому он превосходит всех остальных (так как больше никого нет), и поэтому у него хорошие шансы получить золотую медаль. Пояснение второго набора входных данных: Есть \(n=3\) спортсменов. - Спортсмен \(1\) превосходит спортсмена \(2\). Действительно, спортсмен \(1\) лучше спортсмена \(2\) в марафонах \(1\), \(2\) и \(3\).
- Спортсмен \(2\) превосходит спортсмена \(3\). Действительно, спортсмен \(2\) превосходит спортсмена \(3\) в марафонах \(1\), \(2\), \(4\) и \(5\).
- Спортсмен \(3\) превосходит спортсмена \(1\). Действительно, спортсмен \(3\) лучше, чем спортсмен \(1\) в марафонах \(3\), \(4\) и \(5\).
Объяснение третьего набора входных данных: Есть \(n=3\) спортсменов. - Спортсмен \(1\) превосходит спортсменов \(2\) и \(3\). Поскольку он превосходит всех остальных спортсменов, у него хорошие шансы получить золотую медаль.
- Спортсмен \(2\) превосходит спортсмена \(3\).
- Спортсмен \(3\) не превосходит ни одного другого спортсмена.
Пояснение четвертого набора входных данных: Есть \(n=6\) спортсменов. - Спортсмен \(1\) превосходит спортсменов \(3\), \(4\), \(6\).
- Спортсмен \(2\) превосходит спортсменов \(1\), \(4\), \(6\).
- Спортсмен \(3\) превосходит спортсменов \(2\), \(4\), \(6\).
- Спортсмен \(4\) не превосходит ни одного другого спортсмена.
- Спортсмен \(5\) превосходит спортсменов \(1\), \(2\), \(3\), \(4\), \(6\). Поскольку он превосходит всех остальных спортсменов, у него хорошие шансы получить золотую медаль.
- Спортсмен \(6\) превосходит только спортсмена \(4\).
| |
|
|
C. Максимизируйте пересечения
геометрия
жадные алгоритмы
Комбинаторика
Конструктив
сортировки
*1800
На окружности лежат \(2n\) различных точек, обладающих следующим свойством: как бы вы ни выбрали \(3\) хорды, соединяющие \(3\) непересекающиеся пары точек, ни одна точка строго внутри окружности не принадлежит всем \(3\) хордам. Точки нумеруются \(1, \, 2, \, \dots, \, 2n\) по часовой стрелке. Изначально \(k\) хорд соединяют \(k\) пар точек таким образом, что все \(2k\) концов этих хорд различны. Необходимо провести еще \(n - k\) хорд, которые соединят оставшиеся \(2(n - k)\) точек (каждая точка должна быть концом ровно одной хорды). Пусть \(x\) — это общее количество пересечений всех \(n\) хорд. Вычислите максимальное значение, которого может достичь \(x\) при оптимальном выборе \(n - k\) хорд. Обратите внимание, что точное расположение точек \(2n\) не имеет значения, пока выполняется свойство, указанное в первом предложении. Выходные данные Для каждого набора входных данных выведите максимальное количество пересечений, которое можно получить, проведя \(n - k\) дополнительных хорд. Примечание В первом наборе входных данных, есть три способа нарисовать \(2\) дополнительных хорд, показанных ниже (черные хорды — первоначально нарисованные, а красные — новые): Мы видим, что третий способ дает максимальное количество пересечений, а именно \(4\). Во втором наборе входных данных, больше не нужно строить хорд. Конечно, при наличии только одной хорды пересечений нет. В третьем наборе входных данных, мы можем сделать не более одного пересечения, проведя хорды \(1-3\) и \(2-4\), как показано ниже:
| |
|
|
E. Цвета и отрезки
жадные алгоритмы
Конструктив
сортировки
Структуры данных
*2300
Числа \(1, \, 2, \, \dots, \, n \cdot k\) окрашены в \(n\) цветов. Эти цвета обозначены \(1, \, 2, \, \dots, \, n\). Для каждого \(1 \le i \le n\) существует ровно \(k\) чисел, окрашенных в цвет \(i\). Пусть \([a, \, b]\) обозначает отрезок целых чисел от \(a\) до \(b\) включительно, то есть множество \(\{a, \, a + 1, \, \dots, \, b\}\). Вы должны выбрать \(n\) отрезков \([a_1, \, b_1], \, [a_2, \, b_2], \, \dots, [a_n, \, b_n]\) таких, что: - для каждого \(1 \le i \le n\) имеет место \(1 \le a_i < b_i \le n \cdot k\);
- для каждого \(1 \le i \le n\), числа \(a_i\) и \(b_i\) окрашены цветом \(i\);
- каждое число \(1 \le x \le n \cdot k\) принадлежит не более чем \(\left\lceil \frac{n}{k - 1} \right\rceil\) отрезкам.
Можно показать, что такое семейство отрезков всегда существует при заданных ограничениях. Выходные данные Выведите \(n\) строк. В \(i\)-й строке должны содержаться два целых числа \(a_i\) и \(b_i\). Если существует несколько допустимых вариантов выбрать отрезки, выведите любой. Примечание В первой выборке каждое число может содержаться не более чем в \(\left\lceil \frac{4}{3 - 1} \right\rceil = 2\) отрезках. Вывод описывается следующим рисунком: Во втором примере единственным отрезком, который можно выбрать, является \([1, \, 2]\), и каждое число действительно содержится не более чем в \(\left\lceil \frac{1}{2 - 1} \right\rceil = 1\) отрезках. В третьем примере, каждое число может содержаться не более чем в \(\left\lceil \frac{3}{3 - 1} \right\rceil = 2\) отрезках. Вывод описывается следующим рисунком:
| |
|
|
F. Муравьепортация
Бинарный поиск
дп
сортировки
Структуры данных
*2200
Муравей движется по действительной прямой с постоянной скоростью в \(1\) единицу в секунду. Он начинает движение в точке \(0\) и всегда движется вправо (поэтому его позиция увеличивается на \(1\) каждую секунду). Существует \(n\) порталов, \(i\)-й из которых находится в позиции \(x_i\) и телепортирует в позицию \(y_i < x_i\). Каждый портал может быть либо активным, либо неактивным. Начальное состояние \(i\)-го портала определяется \(s_i\): если \(s_i=0\), то \(i\)-й портал изначально неактивен, если \(s_i=1\), то \(i\)-й портал изначально активен. Когда муравей проходит через портал (т.е., когда его положение совпадает с положением портала): - если портал неактивен, он становится активным (в этом случае путь муравья не затрагивается);
- если портал активен, то он становится неактивным, а муравей мгновенно телепортируется в позицию \(y_i\), где продолжает двигаться как обычно.
Сколько времени (с момента начала движения) потребуется муравью, чтобы достичь позиции \(x_n + 1\)? Можно показать, что это произойдет за конечное время. Поскольку ответ может быть очень большим, вычислите его по модулю \(998\,244\,353\). Выходные данные Выведите количество времени в секундах, которое пройдет с момента начала движения муравья до момента достижения им позиции \(x_n+1\). Поскольку ответ может быть очень большим, выведите его по модулю \(998\,244\,353\). Примечание Объяснение первого примера: Муравей перемещается следующим образом (кривая стрелка обозначает телепортацию, прямая стрелка обозначает обычное движение со скоростью \(1\), а время, затраченное на движение, написано над стрелкой). \(\) 0 \stackrel{6}{\longrightarrow} 6 \leadsto 5 \stackrel{3}{\longrightarrow} 8 \leadsto 1 \stackrel{2}{\longrightarrow} 3 \leadsto 2 \stackrel{4}{\longrightarrow} 6 \leadsto 5 \stackrel{2}{\longrightarrow} 7 \leadsto 4 \stackrel{2}{\longrightarrow} 6 \leadsto 5 \stackrel{4}{\longrightarrow} 9 \(\) Обратите внимание, что общее время составляет \(6+3+2+4+2+2+4=23\). Пояснение второго примера: Муравей перемещается следующим образом (кривая стрелка обозначает телепортацию, прямая стрелка обозначает обычное движение со скоростью \(1\), а время, затраченное на движение, написано над стрелкой). \(\) 0 \stackrel{454971987}{\longrightarrow} 454971987 \leadsto 406874902 \stackrel{48097086}{\longrightarrow} 454971988 \(\) Обратите внимание, что общее время составляет \(454971987+48097086=503069073\). Объяснение третьего примера: Поскольку все порталы изначально неактивны, муравей не будет телепортирован и попадет прямо из \(0\) в \(x_n+1=899754846+1=899754847\).
| |
|
|
G. Серьезный судья
битмаски
Перебор
поиск в глубину и подобное
сортировки
*3000
Андреа придумал, как он считает, новый алгоритм сортировки для массивов длины \(n\). Алгоритм работает следующим образом. Изначально имеется массив из \(n\) целых чисел \(a_1,\, a_2,\, \dots,\, a_n\). Затем выполняется \(k\) шагов. Для каждого \(1\le i\le k\) на \(i\)-м шаге сортируется подпоследовательность массива \(a\) с индексами \(j_{i,1}< j_{i,2}< \dots< j_{i, q_i}\), не меняя значений с остальными индексами. Таким образом, в результате подпоследовательность \(a_{j_{i,1}},\, a_{j_{i,2}},\, \dots,\, a_{j_{i,q_i}}\) отсортирована, а все остальные элементы \(a\) остались нетронутыми. Андреа, желая поделиться своим открытием с научным сообществом, отправил небольшую статью с описанием своего алгоритма в журнал «Анналы алгоритмов сортировки», а вы являетесь рецензентом статьи (то есть человеком, который должен оценить правильность статьи). Вы должны решить, является ли алгоритм Андреа правильным, то есть сортирует ли он любой массив \(a\) из \(n\) целых чисел. Выходные данные Если алгоритм Андреа верен, выведите ACCEPTED, иначе выведите REJECTED. Примечание Объяснение первого примера: Алгоритм состоит из \(3\) шагов. Первый сортирует подпоследовательность \([a_1, a_2, a_3]\), второй сортирует подпоследовательность \([a_2, a_3, a_4]\), третий сортирует подпоследовательность \([a_1,a_2]\). Например, если первоначально \(a=[6, 5, 6, 3]\), то алгоритм преобразует массив следующим образом (сортируемая подпоследовательность выделена красным цветом) \(\) [{\color{red}6},{\color{red}5},{\color{red}6},3] \rightarrow [5, {\color{red}6}, {\color{red}6}, {\color{red}3}] \rightarrow [{\color{red}5}, {\color{red}3}, 6, 6] \rightarrow [3, 5, 6, 6] \,.\(\) Можно доказать, что для любого начального массива \(a\), в конце алгоритма массив \(a\) будет отсортирован. Объяснение второго примера: Алгоритм состоит из \(3\) шагов. На первом сортируется подпоследовательность \([a_1, a_2, a_3]\), на втором — подпоследовательность \([a_2, a_3, a_4]\), на третьем — подпоследовательность \([a_1,a_3,a_4]\). Например, если первоначально \(a=[6, 5, 6, 3]\), то алгоритм преобразует массив следующим образом (сортируемая подпоследовательность выделена красным цветом) \(\) [{\color{red}6},{\color{red}5},{\color{red}6},3] \rightarrow [5, {\color{red}6}, {\color{red}6}, {\color{red}3}] \rightarrow [{\color{red}5}, 3, {\color{red}6}, {\color{red}6}] \rightarrow [5, 3, 6, 6] \,.\(\) Обратите внимание, что \(a=[6,5,6,3]\) является примером массива, который не сортируется алгоритмом. Объяснение третьего примера: Алгоритм состоит из \(4\) шагов. Первые \(3\) шага ничего не делают, так как сортируют подпоследовательности длиной \(1\), тогда как четвертый шаг сортирует подпоследовательность \([a_1,a_3]\). Например, если первоначально \(a=[5,6,4]\), алгоритм преобразует массив следующим образом (подпоследовательность, которая сортируется, выделена красным цветом) \(\) [{\color{red}5},6,4] \rightarrow [5,{\color{red}6},4] \rightarrow [5,{\color{red}6},4] \rightarrow [{\color{red}5},6,{\color{red}4}]\rightarrow [4,6,5] \,.\(\) Обратите внимание, что \(a=[5,6,4]\) - это пример массива, который не сортируется алгоритмом. Пояснение четвертого примера: Алгоритм состоит из \(2\) шагов. На первом этапе сортируются подпоследовательности \([a_2,a_3,a_4]\), на втором - весь массив \([a_1,a_2,a_3,a_4,a_5]\). Например, если изначально \(a=[9,8,1,1,1]\), алгоритм преобразует массив следующим образом (подпоследовательность, которая получает сортировку, выделена красным цветом) \(\) [9,{\color{red}8},{\color{red}1},{\color{red}1},1] \rightarrow [{\color{red}9},{\color{red}1},{\color{red}1},{\color{red}8},{\color{red}1}] \rightarrow [1,1,1,8,9] \,.\(\) Поскольку на последнем шаге сортируется весь массив, очевидно, что для любого начального массива \(a\) в конце алгоритма массив \(a\) будет отсортирован.
| |
|
|
E. Скучные отрезки
Деревья
сортировки
Структуры данных
*2100
Даны \(n\) отрезков на числовой прямой, отрезки пронумерованы от \(1\) до \(n\). \(i\)-й отрезок покрывает все целочисленные точки от \(l_i\) до \(r_i\) и имеет значение \(w_i\). Требуется выбрать поднабор этих отрезков (возможно, все). Когда набор выбран, разрешается перемещаться между двумя целочисленными точками, если существует выбранный отрезок, который накрывает обе точки. Поднабор называется хорошим, если возможно достичь точку \(m\), начав из точки \(1\), за произвольное количество ходов. Цена поднабора — это разность между максимальным и минимальным значениями отрезков в нем. Найдите минимальную цену хорошего поднабора. В каждом тесте существует хотя бы один хороший набор. Выходные данные Выведите одно целое число — минимальную цену хорошего поднабора.
| |
|
|
A. Ezzat и две подпоследовательности
математика
Перебор
сортировки
*800
У Ezzat есть массив целых (возможно, отрицательных) чисел длины \(n\). Он хочет разделить его на две непустые подпоследовательности \(a\) и \(b\) так, чтобы каждый элемент массива принадлежал ровно одной подпоследовательности, и значение \(f(a) + f(b)\) было максимально возможным. Здесь \(f(x)\) обозначает среднее арифметическое всех элементов \(x\). Последовательность \(x\) является подпоследовательностью \(y\), если \(x\) может быть получена из \(y\) удалением нескольких (возможно, ни одного или всех) элементов. Среднее арифметическое чисел последовательности это сумма всех чисел последовательности, деленная на их количество. Например, среднее арифметическое \([1,5,6]\) это \((1+5+6)/3 = 12/3 = 4\), таким образом, \(f([1,5,6]) = 4\). Выходные данные Для каждого набора входных данных выведите одно число — максимальное значение, которое может получить Ezzat. Ваш ответ будет считаться правильным, если его абсолютная или относительная ошибка не превосходит \(10^{-6}\). Формально, пусть ваш ответ равен \(a\), а ответ жюри равен \(b\). Ваш ответ будет зачтен, если и только если \(\frac{|a - b|}{\max{(1, |b|)}} \le 10^{-6}\). Примечание В первом примере массив \([3, 1, 2]\). Ниже приведены все способы разбить его на две непустые подпоследовательности: - \(a = [3]\), \(b = [1,2]\), значит \(f(a) + f(b) = 3 + 1.5 = 4.5\).
- \(a = [3,1]\), \(b = [2]\), значит \(f(a) + f(b) = 2 + 2 = 4\).
- \(a = [3,2]\), \(b = [1]\), значит \(f(a) + f(b) = 2.5 + 1 = 3.5\).
Таким образом, максимальное значение \(4.5\). Во втором примере массив \([-7, -6, -6]\). Ниже приведены все способы разбить его на две непустые подпоследовательности: - \(a = [-7]\), \(b = [-6,-6]\), значит \(f(a) + f(b) = (-7) + (-6) = -13\).
- \(a = [-7,-6]\), \(b = [-6]\), значит \(f(a) + f(b) = (-6.5) + (-6) = -12.5\).
Таким образом, максимальное значение \(-12.5\).
| |
|
|
B. Moamen и k-подотрезки
жадные алгоритмы
сортировки
*1100
У Moamen есть массив из \(n\) различных целых чисел. Он хочет отсортировать его в неубывающем порядке, проделав следующую операцию ровно один раз: - Разделить массив на ровно \(k\) непустых подотрезка таких, что каждый элемент принадлежит ровно одному подотрезку.
- Переупорядочить эти подотрезки произвольным образом.
- Объединить подотрезки в один массив.
Последовательность \(a\) является подотрезком \(b\), если \(a\) может быть получена из \(b\) удалением нескольких (возможно, ни одного или всех) элементов из начала и нескольких (возможно, ни одного или всех) элементов из конца. Помогите Moamen понять, существует ли способ отсортировать массив в неубывающем порядке, применив эту операцию ровно один раз? Выходные данные Для каждого набора входных данных выведите одну строку. Если Moamen может отсортировать массив в неубывающем порядке, выведите «YES» (без кавычек). В противном случае выведите «NO» (без кавычек). Вы можете выводить каждую букву «YES» и «NO» в любом регистре (верхнем или нижнем). Примечание В первом наборе входных данных \(a = [6, 3, 4, 2, 1]\), и \(k = 4\). Мы можем применить операцию следующим образом: - Разбить \(a\) на \(\{ [6], [3, 4], [2], [1] \}\).
- Переупорядочить их: \(\{ [1], [2], [3,4], [6] \}\).
- Объединить их: \([1, 2, 3, 4, 6]\), получив отсортированный массив.
Во втором примере не существует способа отсортировать массив, разбив его всего на два \(2\) подотрезка. Например, если мы разобьем массив на подотрезки как \(\{ [1, -4], [0, -2] \}\), мы можем переупорядочить их только как \(\{ [1, -4], [0, -2] \}\) или \(\{ [0, -2], [1, -4] \}\). В обоих случаях массив не будет отсортирован после объединения.
| |
|
|
F. Странная сортировка
сортировки
Структуры данных
*3300
У вас есть перестановка — массив \(a = [a_1, a_2, \ldots, a_n]\) из различных целых чисел от \(1\) до \(n\). Длина перестановки \(n\) нечётна. Рассмотрим следующий алгоритм сортировки перестановки по возрастанию. Вспомогательная процедура алгоритма, \(f(i)\), принимает на вход индекс \(i\) (\(1 \le i \le n-1\)) и делает следующее. Если \(a_i > a_{i+1}\), значения \(a_i\) и \(a_{i+1}\) меняются местами. В противном случае перестановка остаётся без изменений. Алгоритм состоит из итераций, пронумерованных последовательными целыми числами, начиная с \(1\). На \(i\)-й итерации алгоритм делает следующее: - если \(i\) нечётно, вызываются \(f(1), f(3), \ldots, f(n - 2)\);
- если \(i\) чётно, вызываются \(f(2), f(4), \ldots, f(n - 1)\).
Можно доказать, что после конечного числа итераций перестановка станет отсортирована по возрастанию. Через сколько итераций это впервые произойдёт? Выходные данные Для каждого набора входных данных выведите число итераций, после которого заданная перестановка впервые окажется отсортирована по возрастанию. Если заданная перестановка уже отсортирована, выведите \(0\). Примечание В первом наборе входных данных перестановка будет меняться следующим образом: - после \(1\)-й итерации: \([2, 3, 1]\);
- после \(2\)-й итерации: \([2, 1, 3]\);
- после \(3\)-й итерации: \([1, 2, 3]\).
Во втором наборе входных данных перестановка будет меняться следующим образом: - после \(1\)-й итерации: \([4, 5, 1, 7, 2, 3, 6]\);
- после \(2\)-й итерации: \([4, 1, 5, 2, 7, 3, 6]\);
- после \(3\)-й итерации: \([1, 4, 2, 5, 3, 7, 6]\);
- после \(4\)-й итерации: \([1, 2, 4, 3, 5, 6, 7]\);
- после \(5\)-й итерации: \([1, 2, 3, 4, 5, 6, 7]\).
В третьем наборе входных данных перестановка уже отсортирована, поэтому ответ равен \(0\).
| |
|
|
E. Поликарп и преобразование строки
Бинарный поиск
реализация
сортировки
Строки
*1800
У Поликарп есть строка \(s\). Поликарп делает следующие действия до тех пор, пока строка \(s\) не станет пустой (изначально \(t\) — пустая строка): - дописывает справа к \(t\) строку \(s\), то есть совершает присвоение \(t = t + s\), где \(t + s\) обозначает конкатенацию (соединение) строк \(t\) и \(s\);
- выбирает произвольным образом какую-то одну букву из \(s\) и удаляет из \(s\) все её вхождения (выбранная буква обязательно должна встречаться в \(s\) на момент выполнения этого действия).
Поликарп выполняет данную последовательность действий строго в заданном порядке. Отметим, что в конце концов строка \(s\) станет пустой, а строка \(t\) будет равна некоторому значению (и это значение определяется неоднозначно, оно зависит от порядка удаления). Например, если изначально \(s\)=«abacaba», то события могли разворачиваться следующим образом: - \(t\)=«abacaba», выбрана буква 'b', теперь \(s\)=«aacaa»;
- \(t\)=«abacabaaacaa», выбрана буква 'a', теперь \(s\)=«c»;
- \(t\)=«abacabaaacaac», выбрана буква 'c', теперь \(s\)=«» (пустая строка).
Вам необходимо восстановить исходное значение строки \(s\) по итоговому значению \(t\) и найти порядок, в котором удалялись буквы из \(s\). Выходные данные Для каждого набора входных данных выведите в отдельной строке: - \(-1\), если ответа не существует;
- две строки через пробел. Первая строка должна содержать начальное возможное значение \(s\). Вторая строка должна содержать последовательность букв — в каком порядке надо удалять буквы из \(s\), чтобы получилась строка \(t\). Например, если выведена строка «bac», то сначала удалялись все вхождения буквы 'b', потом — все вхождения буквы 'a', затем — все вхождения буквы 'c'. Если существует несколько решений, выведите любое из них.
Примечание Первый набор входных данных разобран в условии.
| |
|
|
A. Простая странная сортировка
Перебор
реализация
сортировки
*800
У вас есть перестановка — массив \(a = [a_1, a_2, \ldots, a_n]\) из различных целых чисел от \(1\) до \(n\). Длина перестановки \(n\) нечётна. Рассмотрим следующий алгоритм сортировки перестановки по возрастанию. Вспомогательная процедура алгоритма, \(f(i)\), принимает на вход индекс \(i\) (\(1 \le i \le n-1\)) и делает следующее. Если \(a_i > a_{i+1}\), значения \(a_i\) и \(a_{i+1}\) меняются местами. В противном случае перестановка остаётся без изменений. Алгоритм состоит из итераций, пронумерованных последовательными целыми числами, начиная с \(1\). На \(i\)-й итерации алгоритм делает следующее: - если \(i\) нечётно, вызываются \(f(1), f(3), \ldots, f(n - 2)\);
- если \(i\) чётно, вызываются \(f(2), f(4), \ldots, f(n - 1)\).
Можно доказать, что после конечного числа итераций перестановка станет отсортирована по возрастанию. Через сколько итераций это впервые произойдёт? Выходные данные Для каждого набора входных данных выведите число итераций, после которого заданная перестановка впервые окажется отсортирована по возрастанию. Если заданная перестановка уже отсортирована, выведите \(0\). Примечание В первом наборе входных данных перестановка будет меняться следующим образом: - после \(1\)-й итерации: \([2, 3, 1]\);
- после \(2\)-й итерации: \([2, 1, 3]\);
- после \(3\)-й итерации: \([1, 2, 3]\).
Во втором наборе входных данных перестановка будет меняться следующим образом: - после \(1\)-й итерации: \([4, 5, 1, 7, 2, 3, 6]\);
- после \(2\)-й итерации: \([4, 1, 5, 2, 7, 3, 6]\);
- после \(3\)-й итерации: \([1, 4, 2, 5, 3, 7, 6]\);
- после \(4\)-й итерации: \([1, 2, 4, 3, 5, 6, 7]\);
- после \(5\)-й итерации: \([1, 2, 3, 4, 5, 6, 7]\).
В третьем наборе входных данных перестановка уже отсортирована, поэтому ответ равен \(0\).
| |
|
|
C. Самый нижний уровень
Бинарный поиск
жадные алгоритмы
сортировки
*1300
В некоторой компьютерной игре игрок управляет героем, который характеризуется одним целочисленным параметром — силой. Герою предстоит побеждать монстров, каждый из которых также характеризуется одним целочисленным параметром — бронёй. На текущем уровне перед героем \(n\) пещер. Чтобы пройти уровень, герою нужно зайти во все пещеры в некотором порядке, в каждую ровно один раз, и выйти из каждой целым и невредимым. Когда герой зайдёт в пещеру \(i\), ему придётся подраться с \(k_i\) монстрами по очереди — сначала с монстром с бронёй \(a_{i, 1}\), потом с монстром с бронёй \(a_{i, 2}\) и так далее, в конце с монстром с бронёй \(a_{i, k_i}\). Герой может победить монстра только в том случае, если сила героя строго больше брони монстра. Если герой не может победить монстра, с которым он дерётся, игра заканчивается и игрок проигрывает. Обратите внимание, что как только герой зашёл в пещеру, он не может из неё выйти, пока не подерётся со всеми монстрами в ней, причём именно в заданном порядке. Каждый раз, когда герой побеждает монстра, сила героя увеличивается на \(1\). Найдите минимальную необходимую силу, с которой герой должен начать уровень, чтобы иметь возможность зайти во все пещеры по одному разу в некотором порядке и победить всех монстров. Выходные данные Для каждого набора входных данных выведите одно целое число — минимальный уровень силы героя, необходимый, чтобы иметь возможность зайти во все пещеры по одному разу в некотором порядке и победить всех монстров. Примечание В первом наборе входных данных нужно победить единственного монстра с бронёй \(42\), для этого достаточно иметь силу героя \(43\). Во втором наборе входных данных герой с силой \(13\) может пройти уровень следующим образом: - зайти в пещеру \(2\):
- победить монстра с бронёй \(12\), сила героя увеличится до \(14\);
- победить монстра с бронёй \(11\), сила героя увеличится до \(15\);
- зайти в пещеру \(1\):
- победить монстра с бронёй \(10\), сила героя увеличится до \(16\);
- победить монстра с бронёй \(15\), сила героя увеличится до \(17\);
- победить монстра с бронёй \(8\), сила героя увеличится до \(18\).
| |
|
|
D1. Рассадка в кинотеатре (простая версия)
жадные алгоритмы
сортировки
Структуры данных
*1100
Это простая версия задачи. Единственное различие состоит в том, что в этой версии \(n = 1\). В кинотеатре места могут быть представлены как таблица из \(n\) рядов и \(m\) столбцов. Ряды нумеруются целыми числами от \(1\) до \(n\). Места в каждом ряду нумеруются последовательными целыми числами слева направо: в \(k\)-м ряду от \(m (k - 1) + 1\) до \(m k\) для всех рядов \(1 \le k \le n\). | \(1\) | \(2\) | \(\cdots\) | \(m - 1\) | \(m\) | | \(m + 1\) | \(m + 2\) | \(\cdots\) | \(2 m - 1\) | \(2 m\) | | \(2m + 1\) | \(2m + 2\) | \(\cdots\) | \(3 m - 1\) | \(3 m\) | | \(\vdots\) | \(\vdots\) | \(\ddots\) | \(\vdots\) | \(\vdots\) | | \(m (n - 1) + 1\) | \(m (n - 1) + 2\) | \(\cdots\) | \(n m - 1\) | \(n m\) | Таблица с номерами мест Есть \(nm\) людей, которые хотят прийти в кинотеатр, чтобы посмотреть новый фильм. Они пронумерованы целыми числами от \(1\) до \(nm\). Вы должны задать ровно одно место для каждого человека. Известно, что в этом кинотеатре чем меньше номер места, тем лучше виден экран. У \(i\)-го человека уровень зрения \(a_i\). Обозначим за \(s_i\) номер места \(i\)-го человека. Необходимо выдать место лучше тем, у кого зрение хуже, то есть для любых двух людей \(i\), \(j\) таких, что \(a_i < a_j\), должно выполняться условие \(s_i < s_j\). После того, как вы определите места всем людям, они начнут их занимать. В порядке от \(1\) до \(nm\) каждый человек входит в зал и садится на своё место. Чтобы сесть, человек подходит к своему ряду и начинает двигаться от первого места в ряду к своему слева направо. Во время того, как человек будет занимать свое место, какие-то места будут свободны, какие-то будут заняты теми людьми, которые уже вошли в зал. Неудобство человека равно количеству занятых мест, мимо которых он прошёл, пока занимал своё место. Рассмотрим пример: \(m = 5\), человеку определено место \(4\) в первом ряду, причём места \(1\), \(3\), \(5\) в первом ряду уже заняты, а места \(2\) и \(4\) свободны. Неудобство этого человека будет равно \(2\), потому что он пройдет мимо двух занятых мест: \(1\) и \(3\). Найдите минимальное общее неудобство (сумму неудобств всех людей), которое можно получить, задав места для всех людей (при этом все условия должны быть выполнены). Выходные данные Для каждого набора выходных данных выведите единственное целое число — минимальное общее неудобство, которое можно получить. Примечание В первом наборе входных данных существует единственный способ определить людям места, потому что все уровни зрения различны. Первый человек занимает первое место, второй человек занимает второе место, третий человек занимает третье место. Неудобство первого человека равно \(0\), второго — \(1\), а третьего — \(2\). Общее неудобство равно \(0 + 1 + 2 = 3\). Во втором наборе входных данных люди должны занять следующие места: \(s_1 = 2\), \(s_2 = 1\), \(s_3 = 5\), \(s_4 = 4\), \(s_5 = 3\). Общее неудобство будет равно \(6\).
| |
|
|
D2. Рассадка в кинотеатре (сложная версия)
жадные алгоритмы
реализация
сортировки
Структуры данных
*1600
Это сложная версия задачи. Единственное различие состоит в том, что в этой версии \(1 \le n \le 300\). В кинотеатре места могут быть представлены как таблица из \(n\) рядов и \(m\) столбцов. Ряды нумеруются целыми числами от \(1\) до \(n\). Места в каждом ряду нумеруются последовательными целыми числами слева направо: в \(k\)-м ряду от \(m (k - 1) + 1\) до \(m k\) для всех рядов \(1 \le k \le n\). | \(1\) | \(2\) | \(\cdots\) | \(m - 1\) | \(m\) | | \(m + 1\) | \(m + 2\) | \(\cdots\) | \(2 m - 1\) | \(2 m\) | | \(2m + 1\) | \(2m + 2\) | \(\cdots\) | \(3 m - 1\) | \(3 m\) | | \(\vdots\) | \(\vdots\) | \(\ddots\) | \(\vdots\) | \(\vdots\) | | \(m (n - 1) + 1\) | \(m (n - 1) + 2\) | \(\cdots\) | \(n m - 1\) | \(n m\) | Таблица с номерами мест Есть \(nm\) людей, которые хотят прийти в кинотеатр, чтобы посмотреть новый фильм. Они пронумерованы целыми числами от \(1\) до \(nm\). Вы должны задать ровно одно место для каждого человека. Известно, что в этом кинотеатре чем меньше номер места, тем лучше виден экран. У \(i\)-го человека уровень зрения \(a_i\). Обозначим за \(s_i\) номер места \(i\)-го человека. Необходимо выдать место лучше тем, у кого зрение хуже, то есть для любых двух людей \(i\), \(j\) таких, что \(a_i < a_j\), должно выполняться условие \(s_i < s_j\). После того, как вы определите места всем людям, они начнут их занимать. В порядке от \(1\) до \(nm\) каждый человек входит в зал и садится на своё место. Чтобы сесть, человек подходит к своему ряду и начинает двигаться от первого места в ряду к своему слева направо. Во время того, как человек будет занимать свое место, какие-то места будут свободны, какие-то будут заняты теми людьми, которые уже вошли в зал. Неудобство человека равно количеству занятых мест, мимо которых он прошёл, пока занимал своё место. Рассмотрим пример: \(m = 5\), человеку определено место \(4\) в первом ряду, причём места \(1\), \(3\), \(5\) в первом ряду уже заняты, а места \(2\) и \(4\) свободны. Неудобство этого человека будет равно \(2\), потому что он пройдет мимо двух занятых мест: \(1\) и \(3\). Найдите минимальное общее неудобство (сумму неудобств всех людей), которое можно получить, задав места для всех людей (при этом все условия должны быть выполнены). Выходные данные Для каждого набора выходных данных выведите единственное целое число — минимальное общее неудобство, которое можно получить. Примечание В первом наборе входных данных существует единственный способ рассадить людей: первого человека посадить на первое место, а второго — на второе. Тогда суммарное неудобство будет равно \(1\). Во втором наборе входных данных оптимальная рассадка выглядит следующим образом: В третьем наборе входных данных оптимальная рассадка выглядит следующим образом: Число в клетке обозначает индекс человека, занимающего это место.
| |
|
|
F. Движение точек
дп
жадные алгоритмы
реализация
сортировки
Структуры данных
*2600
На числовой прямой даны \(n\) точек и \(m\) отрезков. Изначальная координата \(i\)-й точки равна \(a_i\). Левая и правая границы \(j\)-го отрезка это \(l_j\) и \(r_j\), соответственно. Точки можно двигать. За одну операцию можно подвинуть любую точку из ее текущей координаты \(x\) в координату \(x - 1\) или в координату \(x + 1\). Стоимость такого движения \(1\). Необходимо выполнить последовательность операций такую, чтобы каждый отрезок был посещён хотя бы одной точкой. Точка посетила отрезок \([l, r]\), если был такой момент, когда её координата принадлежала отрезку \([l, r]\) (включая границы). Вы должны найти минимальную стоимость операций, которые нужно сделать, чтобы все отрезки были посещены. Выходные данные Для каждого набора входных данных выведите одно число — минимальную суммарную стоимость всех перемещений, чтобы посетить все отрезки. Примечание В первом наборе входных данных точки можно двигать следующим образом: - Подвинуть вторую точку из координаты \(6\) в координату \(5\).
- Подвинуть третью точку из координаты \(14\) в координату \(13\).
- Подвинуть четвёртую точку из координаты \(18\) в координату \(17\).
- Подвинуть третью точку из координаты \(13\) в координату \(12\).
- Подвинуть четвёртую точку из координаты \(17\) в координату \(16\).
Суммарная стоимость всех действий равна \(5\). Легко заметить, что все отрезки будут посещены после таких перемещений. Например, десятый отрезок (\([7, 13]\)) будет посещён после второго перемещения третьей точкой. Ниже рисунок, иллюстрирующий первый набор входных данных:
| |
|
|
D. Неудачные пары
Бинарный поиск
реализация
сортировки
Структуры данных
*1900
Есть город, который можно представить как квадрат на плоскости с концами в координатах \((0, 0)\) и \((10^6, 10^6)\). В городе есть \(n\) вертикальных и \(m\) горизонтальных улиц, которые пересекают весь город, т. е. \(i\)-я вертикальная улица проходит от \((x_i, 0)\) до \((x_i, 10^6)\), а \(j\)-я горизонтальная улица проходит от \((0, y_j)\) до \((10^6, y_j)\). Все улицы двухсторонние. Границы города также являются улицами. В городе на некоторых улицах стоят \(k\) человек: \(p\)-й человек стоит в точке \((x_p, y_p)\) (таким образом, либо \(x_p\) равняется некоторому \(x_i\), либо \(y_p\) равняется некоторому \(y_j\), либо и то и другое). Назовем пару человек неудачной парой, если кратчайший путь от одного человека до другого, если двигаться только по улицам, строго больше чем Манхеттенское расстояние между ними. Посчитайте общее количество неудачных пар (пары \((x, y)\) и \((y, x)\) — это одна и та же пара). Напомним, что Манхеттенское расстояние между точками \((x_1, y_1)\) и \((x_2, y_2)\) равно \(|x_1 - x_2| + |y_1 - y_2|\). Выходные данные Для каждого набора входных данных, выведите общее количество неудачных пар людей. Примечание Изображение второго набора входных данных представлено ниже: Для примера, точки \(3\) и \(4\) образуют неудачную пару, потому что кратчайший путь между ними (отмечен красным и равен \(7\)) больше, чем их Манхеттенское расстояние (равное \(5\)). Точки \(3\) и \(5\) также образуют неудачную пару: кратчайший путь равен \(1000001\) (отмечен зеленым) больше, чем Манхеттенское расстояние равное \(999999\). Однако, точки \(5\) и \(9\) не образуют неудачную пару, потому что кратчайший путь (отмечен фиолетовым) равен их Манхеттенскому расстоянию.
| |
|
|
B. След
геометрия
сортировки
*1000
Однажды, выслеживая одного очень опасного преступника, Шерлок Холмс наткнулся на удивительный рисунок на стене. На рисунке изображено несколько концентрических окружностей, разбивающих плоскость стены на несколько областей. Некоторые области покрашены в красный цвет, а остальные — в синий. Причем любые две соседние области покрашены в разные цвета, то есть красный и синий цвета чередуются. Внешняя область стены (лежащая вне всех окружностей) покрашена в синий цвет. Помогите Шерлоку Холмсу определить, какая площадь стены покрашена в красный цвет. Напоминаем, что две окружности называются концентрическими, если их центры совпадают. Несколько окружностей называются концентрическими, если любые две из них концентрические. Выходные данные Выведите единственное вещественное число — площадь покрашенной в красный цвет части стены. Ответ принимается, если абсолютная либо относительная погрешность не превышает 10 - 4. Примечание В первом тесте рисунок представляет собой просто окружность радиуса один, внутренняя область которой закрашена в красный цвет. Площадь красной области будет равна π × 12 = π. Во втором тесте есть три окружности радиусов 1, 4 и 2. Снаружи от второй окружности покрашено в синий цвет, между второй и третьей окружностью — в красный, между первой и третьей — снова в синий и внутри первой — снова в красный. Итого, есть две красные области: кольцо между второй и третьей окружностями и круг внутри первой окружности. Общая площадь красных областей будет равна (π × 42 - π × 22) + π × 12 = π × 12 + π = 13π.
| |
|
|
A. Книга
Бинарный поиск
графы
дп
Перебор
реализация
сортировки
Структуры данных
*1800
У вас есть книга, в которой \(n\) глав. В начале каждой главы перечислен список других глав, которые нужно понимать для понимания написанного в этой главе. Чтобы понять главу, нужно прочитать эту главу после того, как вы поняли все главы из данного списка. Сейчас ни одна глава книги не понятна вам. Вы планируете читать книгу с начала до конца по кругу до тех пор, пока не поймете все главы. Обратите внимание, что если вы читаете некоторую главу, но еще не понимаете какие-то из необходимых для ее понимания глав, то вы не можете понять эту главу. Определите, сколько раз вам нужно будет прочитать всю книгу, чтобы понять все главы, или определите, что есть главы, которые вы никогда не поймете, сколько бы раз вы не прочитали книгу. Выходные данные Для каждого набора входных данных, если вы можете понять все главы, выведите, сколько раз вам нужно прочитать книгу целиком, иначе выведите \(-1\). Примечание В первом примере с первого прочтения вы поймете главы \(\{2, 4\}\), а со второго — главы \(\{1, 3\}\). Во втором примере для понимания любой главы нужно сначала понимать какую-то другую, поэтому невозможно понять всю книгу. В третьем примере для понимания любой главы нужно понимать только более ранние, поэтому можно понять всю книгу за одно прочтение. В четвертом примере вы поймете главы \(\{2, 3, 4\}\) с первого прочтения, и главу \(1\) со второго. В пятом примере вы будем понимать главы по одной за прочтение, с \(5\)-й по \(1\)-ю.
| |
|
|
B. Смена мест
жадные алгоритмы
математика
сортировки
*1400
Вам даны два массива \(a\) и \(b\) длины \(n\). Массив \(a\) содержит все нечетные целые числа от \(1\) до \(2n\) в некотором порядке, а массив \(b\) содержит все четные целые числа от \(1\) до \(2n\) в некотором порядке. Вы можете выполнять следующую операцию с этими массивами: - выбрать один из двух массивов;
- выбрать индекс \(i\) от \(1\) до \(n-1\);
- поменять местами \(i\)-й и \((i+1)\)-й элементы выбранного массива.
Вычислите минимальное количество операций, необходимое для того, чтобы сделать массив \(a\) лексикографически меньше массива \(b\). Если массивы \(x\) и \(y\) одинаковой длины \(n\) различны, то мы говорим, что \(x\) лексикографически меньше \(y\), если в первой позиции, где \(x\) и \(y\) различны, в последовательности \(x\) элемент меньше, чем соответствующий элемент в \(y\). Выходные данные Для каждого набора входных данных выведите одно целое число: минимальное количество операций, необходимое, чтобы сделать массив \(a\) лексикографически меньше массива \(b\). Можно показать, что ответ всегда существует. Примечание В первом примере массив \(a\) уже лексикографически меньше массива \(b\), поэтому не нужно делать никаких операций. Во втором примере можно поменять местами \(5\) и \(3\), а затем поменять местами \(2\) и \(4\), тогда массивы будут равны \([3, 5, 1]\) и \([4, 2, 6]\). Другое возможное решение — поменять местами \(3\) и \(1\), а затем поменять местами \(5\) и \(1\), тогда массивы будут равны \([1, 5, 3]\) и \([2, 4, 6]\). Еще одно решение — поменять местами \(4\) и \(6\), а затем — \(2\) и \(6\), тогда массивы будут равны \([5, 3, 1]\) и \([6, 2, 4]\).
| |
|
|
C. Slay the Dragon
Бинарный поиск
жадные алгоритмы
сортировки
Тернарный поиск
*1300
Недавно Петя узнал о новой игре «Slay the Dragon». Как видно из названия, игроку предстоит сражаться с драконами, чтобы победить дракона, необходимо его убить и защитить свой замок. Для этого в распоряжении игрока есть отряд из \(n\) героев, сила \(i\)-го героя равна \(a_i\). По правилам игры убивать дракона должен отправиться ровно один герой, все остальные будут защищать замок. Если защита дракона равна \(x\), то на его убийство можно отправлять героя с силой не менее \(x\). Если сила атаки дракона равна \(y\), то суммарная сила героев, защищающих замок, должна быть хотя бы \(y\). За одну золотую монету игрок может увеличить силу любого из героев на \(1\). Эту операцию можно выполнять любое количество раз. Всего в игре существует \(m\) драконов, у \(i\)-го из них защита \(x_i\), а сила атаки \(y_i\). Пете стало интересно, какое минимальное количество монет ему необходимо потратить, чтобы победить \(i\)-го дракона. Обратите внимание, что задача решается независимо для каждого дракона (улучшения не сохраняются). Выходные данные Выведите \(m\) строк, \(i\)-я из которых содержит одно целое число — минимальное количество монет, которое необходимо потратить, чтобы победить \(i\)-го дракона. Примечание Для победы над первым драконом можно увеличить силу третьего героя на \(1\), тогда силы героев будут равны \([3, 6, 3, 3]\). Для убийства дракона можно выбрать первого героя. Для победы над вторым драконом можно увеличить силы второго и третьего героев на \(1\), тогда силы героев будут равны \([3, 7, 3, 3]\). Для убийства дракона можно выбрать второго героя. Для победы над третьим драконом можно увеличить силы всех героев на \(1\), тогда силы героев будут равны \([4, 7, 3, 4]\). Для убийства дракона можно выбрать четвертого героя. Для победы над четверым драконом можно не улучшать героев и выбрать третьего героя для убийства дракона. Для победы над пятым драконом можно увеличить силу второго героя на \(2\), тогда силы героев будут равны \([3, 8, 2, 3]\). Для убийства дракона можно выбрать второго героя.
| |
|
|
A. Another Sorting Problem
сортировки
Строки
Структуры данных
*1100
Andi and Budi were given an assignment to tidy up their bookshelf of \(n\) books. Each book is represented by the book title — a string \(s_i\) numbered from \(1\) to \(n\), each with length \(m\). Andi really wants to sort the book lexicographically ascending, while Budi wants to sort it lexicographically descending. Settling their fight, they decided to combine their idea and sort it asc-desc-endingly, where the odd-indexed characters will be compared ascendingly, and the even-indexed characters will be compared descendingly. A string \(a\) occurs before a string \(b\) in asc-desc-ending order if and only if in the first position where \(a\) and \(b\) differ, the following holds: - if it is an odd position, the string \(a\) has a letter that appears earlier in the alphabet than the corresponding letter in \(b\);
- if it is an even position, the string \(a\) has a letter that appears later in the alphabet than the corresponding letter in \(b\).
Output Output \(n\) integers — the indices of the strings after they are sorted asc-desc-endingly. Note The following illustrates the first example.
| |
|
|
L. Longest Array Deconstruction
дп
разделяй и властвуй
сортировки
Структуры данных
*2100
Mr. Chanek gives you a sequence \(a\) indexed from \(1\) to \(n\). Define \(f(a)\) as the number of indices where \(a_i = i\). You can pick an element from the current sequence and remove it, then concatenate the remaining elements together. For example, if you remove the \(3\)-rd element from the sequence \([4, 2, 3, 1]\), the resulting sequence will be \([4, 2, 1]\). You want to remove some elements from \(a\) in order to maximize \(f(a)\), using zero or more operations. Find the largest possible \(f(a)\). Output Output an integer denoting the largest \(f(a)\) that can be obtained by doing zero or more operations. Note In the first example, \(f(A) = 3\) by doing the following operations. \([2,1,\textbf{4},2,5,3,7] \rightarrow [\textbf{2},1,2,5,3,7] \rightarrow [1,2,5,3,\textbf{7}] \rightarrow [1,2,\textbf{5},3] \rightarrow [1,2,3]\) In the second example, \(f(A) = 2\) and no additional operation is needed.
| |
|
|
B. Сортировка сдвигами
реализация
сортировки
*1100
Во внешней памяти нового поколения расположен массив целых чисел \(a[1 \ldots n] = [a_1, a_2, \ldots, a_n]\). Данный вид памяти не позволяет изменить значение произвольного элемента по его индексу. Вместо этого можно вырезать любой подотрезок данного массива, циклически сдвинуть его на произвольную величину и вставить обратно на то же самое место. Формально, один такий циклический сдвиг состоит из двух последовательных действий: - Выбрать произвольные \(l\) и \(r\) (\(1 \le l < r \le n\)) — границы изменяемого подотрезка массива.
- Заменить подотрезок массива \(a[l \ldots r]\) на его циклический сдвиг влево на произвольную величину \(d\). Поясним понятие циклический сдвиг: последовательность \([1, 4, 1, 3]\) является циклическим сдвигом последовательности \([3, 1, 4, 1]\) на \(1\) влево. Последовательность \([4, 1, 3, 1]\) является циклическим сдвигом последовательности \([3, 1, 4, 1]\) на \(2\) влево.
Например, если \(a = [1, \color{blue}{3, 2, 8}, 5]\), то при выборе \(l = 2\), \(r = 4\) и \(d = 2\) получается подотрезок \(a[2 \ldots 4] = [3, 2, 8]\). Затем этот отрезок сдвигается на \(d = 2\) влево, и получается подотрезок \([8, 3, 2]\), который в итоге встает на место исходных элементов отрезка. Получается \(a = [1, \color{blue}{8, 3, 2}, 5]\). Отсортируйте заданный массив \(a\), используя не более \(n\) циклических сдвигов любых его отрезков. Обратите внимание, что вам не нужно минимизировать количество циклических сдвигов. Подойдет любой способ, который требует \(n\) или менее циклических сдвигов. Выходные данные Выведите \(t\) ответов на все наборы входных данных. Первая строка ответа на набор входных данных должна содержать число \(k\) (\(0 \le k \le n\)) — количество действий, которыми сортируется массив. Следующие \(k\) строк должны содержать описания действий в формате «\(l\) \(r\) \(d\)» (без кавычек), где \(l\) и \(r\) (\(1 \le l < r \le n\)) — это границы сдвигаемого отрезка, а \(d\) (\(1 \le d \le r - l\)) — величина сдвига. Напоминаем, что по условию задачи рассматриваются циклические сдвиги влево, и выбранный отрезок будет сдвинут на \(d\) влево. Обратите внимание, что от вас не требуется найти минимальное необходимое для сортировки количество циклических сдвигов. Подойдет любой способ сортировки, количество сдвигов в котором не превосходит \(n\). Если заданный массив \(a\) уже отсортирован, то одним из возможных ответов является \(k = 0\) и пустая последовательность циклических сдвигов. Если возможных ответов несколько, выведите любой из них. Примечание Пояснение к четвертому набору данных в примере: - Выбирается отрезок \(a[2 \ldots 4]\) и сдивгается на \(2\) влево: \([2, \color{blue}{5, 1, 4}, 3] \longrightarrow [2, \color{blue}{4, 5, 1}, 3]\)
- Выбирается отрезок \(a[1 \ldots 5]\) и сдвигается на \(3\) влево: \([\color{blue}{2, 4, 5, 1, 3}] \longrightarrow [\color{blue}{1, 3, 2, 4, 5}]\)
- Выбирается отрезок \(a[1 \ldots 2]\) и сдвигается на \(1\) влево: \([\color{blue}{1, 3}, 2, 4, 5] \longrightarrow [\color{blue}{3, 1}, 2, 4, 5]\)
- Выбирается отрезок \(a[1 \ldots 3]\) и сдвигается на \(1\) влево: \([\color{blue}{3, 1, 2}, 4, 5] \longrightarrow [\color{blue}{1, 2, 3}, 4, 5]\)
| |
|
|
E. Телефонные разговоры
*особая задача
дп
сортировки
*1900
Недавно Сережа стал бизнесменом Сергеем Петровичем, и теперь ему приходится много разговаривать по телефону. На сегодня у него запланировано n звонков. Для каждого звонка известен запланированный момент его начала ti (в секундах от начала дня) и его продолжительность di (в секундах). Все ti различны. Сергей Петрович — очень важный человек, сам он никому не звонит, и все его звонки будут входящими. Сергей Петрович не Цезарь, сразу несколько дел делать не умеет. Поэтому, если ему звонят, пока он еще не закончил предыдущий разговор, то он ставит новый звонок в очередь на удержание. В таком случае немедленно после окончания текущего разговора он берет из очереди самый ранний входящий звонок и начинает этот разговор. Если Сергей Петрович начал разговор в секунду t, а звонок продолжается d секунд, то он занят в секунды t, t + 1, ..., t + d - 1, а в секунду t + d он может начать новый звонок. Если Сергей Петрович не занят разговором в момент поступления очередного звонка, он не может отправить его в очередь. Кроме того, Сергей Петрович не Наполеон, он любит поспать. Поэтому иногда он позволяет себе проигнорировать звонок, как будто его вовсе не было. Так он может поступить не более k раз. Звонок, поступающий во время разговора, тоже можно проигнорировать. Какое наибольшее время в секундах сможет сегодня поспать Сергей Петрович, если он может выделить на сон любой непрерывный отрезок времени текущих суток (то есть с секундами от 1-ой до 86400-ой включительно), не занятый разговорами? Заметим, что некоторые разговоры могут продолжаться или даже быть отложены до следующих суток или позже. Но интервал для сна надо выделить именно в пределах текущих суток. Выходные данные Выведите число от 0 до 86400 включительно — наибольшее возможное количество секунд для сна Сергея Петровича на сегодня. Примечание В первом примере лучше всего проигнорировать первые два звонка. Во втором примере лучше всего проигнорировать третий звонок. В этом случае Сергей Петрович будет разговаривать: - первый звонок: с 1 по 20000-ую секунду,
- второй звонок: с 20001 по 30000-ую секунду,
- четвертый звонок: с 30001 по 40000-ую секунду (третий звонок полностью игнорируется),
- пятый звонок: с 80000 по 139999-ую секунду.
Таким образом, самый длинный период свободного времени — с 40001-ой секунды по 79999-ую.
| |
|
|
H. Омкар и туры
Деревья
разделяй и властвуй
сортировки
Структуры данных
*3300
Омкар устраивает туры по своей стране, Омкарландии! В Омкарландии \(n\) городов, и, что довольно любопытно, существует ровно \(n-1\) двунаправленных дорог, соединяющих города друг с другом. Гарантируется, что вы можете добраться до любого города из любого другого города через сеть дорог. Каждый город имеет значение удовольствия \(e\). У каждой дороги есть пропускная способность \(c\), обозначающее максимальное количество автомобилей, которое может на ней находиться, и соответствующая плата за проезд \(t\). Однако система взимания платы в Омкарландии имеет интересную особенность: если автомобиль проезжает по нескольким дорогам за одну поездку, он платит только самую высокую плату за проезд по любой отдельной дороге, по которой он проехал. (Другими словами, он платит \(\max t\) по всем дорогам, по которым они проехал). Если автомобиль не проезжает ни одной дороги, он платит \(0\) за проезд. Омкар решил принять \(q\) туристических групп. Каждая туристическая группа состоит из \(v\) автомобилей, стартующих из города \(x\). (Следует помнить, что туристическая группа с \(v\) автомобилями может передвигаться только по дорогам с пропускной способностью \(\geq v\)). Будучи организатором тура, Омкар хочет, чтобы его группы получили как можно больше удовольствия, но при этом он должен возместить своим группам расходы на проезд по дорогам, которые они должны заплатить. Таким образом, для каждой туристической группы Омкар хочет знать две вещи: во-первых, какое максимальное значение удовольствия имеет город \(y\) — город с максимальным значением удовольствия среди тех, до которых туристическая группа может добраться из своего начального города, и, во-вторых, сколько Омкар должен будет заплатить с каждого автомобиля, чтобы возместить расходы всей группы на поездку из \(x\) в \(y\)? (Эта поездка из \(x\) в \(y\) всегда будет проходить по кратчайшему пути из \(x\) в \(y\)). В случае, если существует несколько городов с максимальным значением удовольствия, Омкар позволит своей туристической группе выбрать, в какой из них они хотят поехать. Поэтому, чтобы подготовиться ко всем возможным сценариям, он хочет знать сумму денег на автомобиль, которая ему необходима, чтобы гарантировать, что он сможет возместить расходы группы независимо от того, какой город они выберут. Выходные данные Выведите \(q\) строк. \(i\)-я строка должна содержать два целых числа: максимально возможное значение удовольствия города, до которого может добраться \(i\)-я туристическая группа, и количество денег на автомобиль, которое необходимо Омкару, чтобы гарантировать возмещение расходов \(i\)-й туристической группы. Примечание Карта с первого примера показана ниже. Для вершин нежирные числа представляют индексы, а жирные — значения удовольствия. Для ребер нежирные цифры обозначают пропускную способность, а жирные — стоимость проезда. Для первого запроса туристическая группа размером \(1\), стартующая из города \(3\), может достичь городов \(1\), \(2\), \(3\), \(4\) и \(5\). Таким образом, наибольшее значение удовольствия, которого они могут достичь, равно \(3\). Если туристическая группа решит поехать в город \(4\), Омкар должен будет заплатить \(8\) за машину, что является максимумом. Для второго запроса туристическая группа размером \(9\), стартующая из города \(5\), может достичь только города \(5\). Таким образом, наибольшее достижимое значение удовольствия по-прежнему составляет \(3\), и Омкар заплатит \(0\) за автомобиль. Для третьего запроса туристическая группа размером \(6\), стартующая из города \(2\), может достичь городов \(2\) и \(4\). Наибольшее достижимое значение удовольствия снова равно \(3\). Если туристическая группа решит поехать в город \(4\), Омкар должен будет заплатить \(2\) за машину, что является максимумом. Карта второй выборки показана ниже: Для первого запроса, туристическая группа размером \(5\), стартующая из города \(1\), может достичь только города \(1\). Таким образом, их максимальная ценность удовольствия составляет \(1\), а стоимость, которую придется заплатить Омкару, равна \(0\) за автомобиль. Для второго запроса туристическая группа размером \(4\), стартующая из города \(1\), может добраться до городов \(1\) и \(2\). Таким образом, их максимальная ценность удовольствия составляет \(2\), а Омкар заплатит \(1\) за автомобиль. Для третьего запроса, туристическая группа размером \(3\), стартующая из города \(1\), может добраться до городов \(1\), \(2\) и \(3\). Таким образом, их максимальная ценность удовольствия составляет \(3\), и Омкар заплатит \(1\) за автомобиль. Для четвертого запроса туристическая группа размером \(2\), стартующая из города \(1\), может добраться до городов \(1\), \(2\), \(3\) и \(4\). Таким образом, их максимальная ценность удовольствия составляет \(4\), и Омкар заплатит \(1\) за автомобиль. Для пятого запроса туристическая группа размером \(1\), стартующая из города \(1\), может добраться до городов \(1\), \(2\), \(3\), \(4\) и \(5\). Таким образом, их максимальное удовольствие составляет \(5\), и Омкар заплатит \(1\) за машину.
| |
|
|
C. Два массива
жадные алгоритмы
математика
сортировки
*900
Вам даны два массива из целых чисел \(a_1, a_2, \ldots, a_n\) и \(b_1, b_2, \ldots, b_n\). Определим следующее преобразование массива \(a\): - Выберите любое целое неотрицательное число \(k\), удовлетворяющее условию \(0 \le k \le n\).
- Выберите \(k\) различных индексов \(1 \le i_1 < i_2 < \ldots < i_k \le n\).
- Прибавьте \(1\) ко всем элементам \(a_{i_1}, a_{i_2}, \ldots, a_{i_k}\), остальные элементы массива \(a\) остаются неизменными.
- Переставьте элементы массива \(a\) в любом порядке.
Можно ли применить какое-то преобразование массива \(a\) ровно один раз, и получить массив, равный \(b\)? Выходные данные Для каждого набора входных данных выведите «YES» (без кавычек), если существует такое преобразование массива \(a\), в результате которого получится массив, равный \(b\). Выведите «NO» (без кавычек) иначе. Можно выводить каждый символ в любом регистре (верхнем или нижнем). Примечание В первом наборе входных данных можно сделать следующее преобразование: - Выбираем \(k = 2\).
- Выбираем \(i_1 = 1\), \(i_2 = 2\).
- Добавляем \(1\) к \(a_1\) and \(a_2\). В результате получится массив \([0, 2, 0]\).
- Меняем элементы на второй и третьей позициях.
Во втором наборе входных данных нет подходящего преобразования. В третьем наборе можно выбрать \(k = 0\) и не менять порядок элементов.
| |
|
|
B. На вкус и цвет фломастеры разные
*особая задача
жадные алгоритмы
сортировки
*1100
У Поликарпа есть n фломастеров и m колпачков для фломастеров. Каждый фломастер характеризуется двумя числами: xi — цвет и yi — диаметр. Соответственно, каждый колпачок характеризуется двумя числами: aj — цвет и bj — диаметр. Колпачком (aj, bj) можно закрыть фломастер (xi, yi) только в том случае, если их диаметры совпадают, то есть bj = yi. При этом фломастер считается красиво закрытым, если цвет колпачка и фломастера совпадают, то есть aj = xi. Найдите способ закрыть максимальное количество фломастеров. Если таких способов несколько, выберите из них такой, при котором количество красиво закрытых фломастеров максимально. Выходные данные Выведите два целых числа u, v через пробел, где u — количество закрытых фломастеров, а v — количество красиво закрытых фломастеров в искомом оптимальном способе. Помните, что необходимо найти способ закрыть максимальное количество фломастеров, а если таких способов несколько, выбрать из них тот, при котором количество красиво закрытых фломастеров максимально. Примечание В первом тестовом примере первый фломастер нужно закрыть четвертым колпачком, второй фломастер — первым, а третий фломастер — вторым. Таким образом, закрыты будут три фломастера, красиво закрыты — два, первый и третий.
| |
|
|
E. Зебробашня
*особая задача
жадные алгоритмы
сортировки
Структуры данных
*1700
Маленькая Танечка любит играть в кубики. Вообще-то она любит играть во что угодно, будь то кубики или тессеракты, лишь бы это «что угодно» было разноцветное. Каждый кубик характеризуется двумя параметрами — цвет ci и размер si. Зебробашней называется башня, состоящая из кубиков ровно двух цветов, причем цвета кубиков в башне должны чередоваться (цвета соседних должны отличаться). В Зебробашне должно быть не менее двух кубиков. Каких-либо других ограничений нет. Ниже на рисунке изображен пример Зебробашни. Высота Зебробашни — это сумма размеров всех кубиков, которые в нее входят. Помогите маленькой Танечке построить Зебробашню наибольшей возможной высоты, используя имеющиеся кубики. Выходные данные Выведите описание Зебробашни максимальной возможной высоты в следующем формате. В первую строку выведите высоту башни, во вторую строку — количество кубиков в ней, в третью — номера кубиков в башне в порядке их перечисления снизу вверх, разделенные одиночными пробелами. Считайте кубики пронумерованными от 1 до n в том порядке, в котором они были заданы во входных данных. Если существует несколько Зебробашен максимальной высоты, разрешается вывести любую из них. Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.
| |
|
|
A. Геймер Хемосе
Бинарный поиск
жадные алгоритмы
математика
сортировки
*800
Однажды Ахмед Хоссам пришел к Хемосе и сказал: «Давай порешаем контест с тренировок!». Хемосе не хотел этого делать, так как он играл в Valorant, поэтому он придумал задачу и рассказал ее Ахмеду, чтобы отвлечь его. К сожалению, Ахмед не может ее решить... Не могли бы вы ему помочь? В игре Valorant есть Агент, и у него есть \(n\) оружий. \(i\)-е оружие имеет значение урона \(a_i\), и Агент столкнется с врагом, чье здоровье равно \(H\). Агент будет делать один или больше ходов, пока враг не умрет. За один ход Агент выбирает оружие и уменьшает здоровье врага на величину урона этого оружия. Враг умрет, когда его здоровье станет меньше или равно \(0\). Однако не все так просто: Агент не может использовать одно и то же оружие \(2\) раза подряд. Какое минимальное количество раз Агенту нужно использовать оружие, чтобы убить врага? Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество раз, которое Агент должен будет использовать оружие, чтобы убить врага. Примечание В первом наборе входных данных Агент может использовать второе оружие, в результате чего здоровье врага становится равным \(4-7=-3\). \(-3 \le 0\), поэтому враг мертв, и использования оружия \(1\) раз было достаточно. Во втором наборе входных данных Агент может использовать сначала первое оружие, а затем второе. После этого здоровье врага упадет до \(6-4-2 = 0\), то есть он будет убит после использования оружия \(2\) раза. В третьем наборе входных данных Агент может использовать оружия в порядке (третье, первое, третье), уменьшая значение здоровья врага до \(11 - 7 - 2 - 7 = -5\) после использования оружия \(3\) раза. Обратите внимание, что мы не можем убить врага, используя третье оружие дважды, поскольку даже хотя \(11-7-7<0\), одно и то же оружие не разрешается использовать дважды подряд.
| |
|
|
B. Хемосе в магазинах
Конструктив
математика
снм
сортировки
*1200
Хемосе вместе со своими друзьями Самезом, Ахмедом, Ашрафом, Саваном и О_Е ходил по магазинам в Германии. Как вы знаете, Хемосе и его друзья решают задачи, поэтому они очень умны. Поэтому они отправятся во все магазины со скидками в Германии. У Хемосе есть массив из \(n\) целых чисел. Он хочет, чтобы Самез отсортировал массив в неубывающем порядке. Поскольку для Самеза это было бы слишком простой задачей, Хемосе разрешает Самезу использовать только следующую операцию: Выберите индексы \(i\) и \(j\) такие, что \(1 \le i, j \le n\), и \(\lvert i - j \rvert \geq x\). Затем поменяйте местами элементы \(a_i\) и \(a_j\).
Подскажите, пожалуйста, существует ли способ отсортировать массив в неубывающем порядке, используя вышеописанную операцию некоторое конечное число раз (возможно, \(0\))? Выходные данные Для каждого набора входных данных необходимо вывести одну строку. Если Самез может отсортировать массив в неубывающем порядке с помощью операции, описанной выше, выведите «YES» (без кавычек). В противном случае выведите «NO» (без кавычек). Вы можете вывести каждую букву «YES» и «NO» в любом регистре (верхнем или нижнем). Примечание В первом наборов входных данных вы не можете выполнить никаких операций. Во втором наборе входных данных массив уже отсортирован. В третьем наборе входных данных вы можете выполнить следующие операции: - \([5,1,2,3,4]\), \(swap(a_1,a_3)\)
- \([2,1,5,3,4]\), \(swap(a_2,a_5)\)
- \([2,4,5,3,1]\), \(swap(a_2,a_4)\)
- \([2,3,5,4,1]\), \(swap(a_1,a_5)\)
- \([1,3,5,4,2]\), \(swap(a_2,a_5)\)
- \([1,2,5,4,3]\), \(swap(a_3,a_5)\)
- \([1,2,3,4,5]\)
(Здесь под \(swap(a_i, a_j)\) имеется в виду обмен местами элементов на позициях \(i\), \(j\)).
| |
|
|
B. Вор и спички
жадные алгоритмы
реализация
сортировки
*900
Вор пробрался на склад спичек и хочет украсть как можно больше спичек. На складе находится m контейнеров, в контейнере номер i находится ai коробок спичек, а в каждой коробке bi спичек. Все коробки имеют одинаковый размер. В рюкзак вора помещается ровно n коробок. Ваша задача найти наибольшее количество спичек, которое сможет унести вор. У него нет времени на перекладывание спичек между коробками, поэтому он просто выбирает не более n коробок так, чтобы суммарное число спичек в них было максимальным. Выходные данные Выведите единственное число — ответ на задачу.
| |
|
|
A. Близнецы
жадные алгоритмы
сортировки
*900
Представьте себе, что у Вас есть брат или сестра-близнец. Это кажется очень необычным, что в мире есть еще один человек, который выглядит также как Вы. И даже трудно сказать хорошо это или плохо, что Вы как будто не один такой на этой планете. А если у Вас и вправду есть близнец, тогда Вы точно знаете, каково это. Теперь представьте себе обычное утро в Вашей семье. Пока вы еще спите, мама уже собирается на работу. Она так торопилась, что чуть не забыла оставить вам, ее любимым детям, немного денег, чтобы покушать в школе в столовой. В кошельке она нашла некоторое количество монет, а именно n монет произвольных достоинств a1, a2, ..., an. Времени у нее было мало, поэтому поделить монеты она не успела. Тогда она написала записку, в которой попросила вас разделить деньги поровну. Проснувшись, Вы нашли оставленные мамой монеты и прочитали записку. «Но зачем делить монеты поровну?» — подумали Вы, ведь Ваш близнец еще спит и ничего не узнает. Поэтому Вы решили поступить следующим образом: выбрать себе некоторое подмножество монет, так чтобы сумма достоинств взятых Вами монет оказалась строго больше, чем сумма достоинств оставшейся части монет, которая достанется Вашему близнецу. Однако, Вы справедливо решили, что если взять слишком много монет, то Ваш близнец подумает, что Вы его обманули. Поэтому, чтобы не вызывать подозрений, Вы решили взять наименьшее количество монет, сумма достоинств которых окажется строго больше суммы достоинств оставшихся. Исходя из этого, выясните, какое минимальное количество монет Вам понадобится взять, чтобы разделить их описанным образом. Выходные данные В единственной строке выведите одно число — минимальное необходимое количество монет. Примечание В первом примере придется взять 2 монеты (суммы у Вас и Вашего близнеца равны 6, 0 соответственно). Если взять 1 монету, получим суммы 3, 3. Если взять 0 монет получим суммы 0, 6. Эти варианты Вам не подходят, потому что Ваша сумма должна быть строго больше суммы Вашего близнеца. Во втором примере одной монетой мы снова не обойдемся. Можно выбрать монеты достоинством 1, 2, либо 2, 2. В любом случае наименьшее количество монет равно 2.
| |
|
|
B. Несчастливый билет
жадные алгоритмы
сортировки
*1100
Наверное, каждый когда-нибудь ездил в общественном транспорте и оплачивал проезд. Получив свой билет (традиционно в билете четное количество цифр), многие проверяют, является ли этот билет счастливым. Напомним, что билет называется счастливым, если сумма цифр в его первой половине совпадает с суммой цифр во второй. Но, разумеется, далеко не каждый билет счастливый. Более того, иногда, посмотрев на билет, можно сразу сказать, что счастливым он не является. Поэтому рассмотрим следующий критерий несчастливости, по которому точно можно определить несчастливый билет. Будем говорить, что билет точно не счастливый, если каждой цифре его первой половины можно сопоставить некоторую цифру второй половины так, что каждая цифра из первой половины строго меньше сопоставленной цифры из второй половины, либо каждая цифра из первой половины строго больше сопоставленной цифры из второй половины. Каждую цифру в сравнениях нужно использовать в точности один раз. Другими словами, найдется такое взаимно-однозначное соответствие между цифрами первой и второй половины билета, что либо каждая цифра первой половины окажется строго меньше соответствующей ей цифры второй половины, либо каждая цифра первой половины окажется строго больше соответствующей ей цифры второй половины. Например, билет 2421 удовлетворяет данному критерию несчастливости и счастливым являться не будет (искомое соответствие 2 > 1 и 4 > 2), билет 0135 также удовлетворяет критерию (искомое соответствие 0 < 3 и 1 < 5), а билет 3754 критерию не удовлетворяет. У Вас в руках находится билет, состоящий из 2n цифр. А Ваша задача — проверить, выполняется ли для него критерий несчастливости. Выходные данные В первую строку выведите «YES», если билет удовлетворяет критерию несчастливости, и «NO» в противном случае (без кавычек).
| |
|
|
C. Найти пару
математика
реализация
сортировки
*1700
Перед Вами очередная задача на массивы. Рассмотрим произвольную последовательность из n (не обязательно различных) целых чисел a1, a2, ..., an. Нас будут интересовать всевозможные пары чисел (ai, aj), (1 ≤ i, j ≤ n). Другими словами, рассмотрим все n2 пар чисел, выбранных из заданного массива. Например, в последовательности a = {3, 1, 5} существует 9 пар чисел: (3, 3), (3, 1), (3, 5), (1, 3), (1, 1), (1, 5), (5, 3), (5, 1), (5, 5). Отсортируем лексикографически все полученные пары по неубыванию. Напомним, что пара (p1, q1) лексикографически меньше пары (p2, q2) тогда и только тогда, когда либо p1 < p2 либо p1 = p2 и q1 < q2. Тогда отсортированная последовательность, упомянутая выше, будет выглядеть следующим образом: (1, 1), (1, 3), (1, 5), (3, 1), (3, 3), (3, 5), (5, 1), (5, 3), (5, 5) Пронумеруем пары в отсортированном списке от 1 до n2. Ваша задача формулируется следующим образом: нужно найти k-ую пару в упорядоченном списке всевозможных пар заданного вам массива. Выходные данные В единственной строке выведите два числа — искомую k-ую пару. Примечание В первом примере отсортированная последовательность для заданного массива выглядит следующим образом: (1, 1), (1, 2), (2, 1), (2, 2). 4-ой среди них является пара (2, 2). Отсортированная последовательность для массива из второго примера приведена в условии. 2-ой парой в ней является (1, 3).
| |
|
|
D. Ребра в MST
графы
поиск в глубину и подобное
снм
сортировки
*2300
Дан связный взвешенный неориентированный граф без петель и кратных ребер. Напоминаем, что остовным деревом графа называется ациклический связный подграф данного графа, в который входят все его вершины. Весом дерева называется сумма весов входящих в него ребер. Минимальным остовным деревом (MST) графа называется остовное дерево этого графа, имеющее минимальный возможный вес. Очевидно, что для любого связного графа минимальное остовное дерево существует, но, в общем случае, минимальное остовное дерево графа не единственно. Ваша задача — для каждого ребра данного графа определить: либо оно входит в любое MST, либо оно входит хотя бы в одно MST, либо оно не входит ни в одно MST. Выходные данные Выведите m строк — ответы для всех ребер. Если i-е ребро входит в любое MST, выведите «any»; если i-е ребро входит хотя бы в одно MST, выведите «at least one»; если i-е ребро не входит ни в одно MST, выведите «none». Ответы для ребер выводите в том порядке, в котором ребра заданы во входных данных. Примечание Во втором примере для данного графа MST единственно: оно содержит первые два ребра. В третьем примере для данного графа любые два ребра образуют MST. Значит, любое ребро входит хотя бы в одно MST.
| |
|
|
E. Автобусы и люди
Бинарный поиск
сортировки
Структуры данных
*2400
Главная улица Бертауна представляет собой прямую, на которой расположено 109 автобусных остановок. Остановки пронумерованы целыми числами от 1 до 109 в порядке следования. В городе ходит n автобусов. Каждый день i-ый автобус едет от остановки с номером si до остановки с номером fi (si < fi), останавливаясь на всех промежуточных остановках, и возвращается назад только ночью. Автобус начинает движение в момент времени ti, и едет настолько быстро, что заканчивает движение в тот же момент времени ti. Времена ti различны для всех автобусов. Автобусы имеют бесконечную вместимость. В Бертауне живет m человек. Сегодня i-ому человеку нужно доехать от остановки с номером li до остановки с номером ri (li < ri); i-ый житель приходит на свою начальную остановку (li) в момент времени bi. Каждый человек, с одной стороны, хочет добраться как можно быстрее, и с другой стороны, категорически не согласен ехать с пересадками. Более формально: i-ый человек выбирает автобус j, с минимальным временем tj, такой что sj ≤ li, ri ≤ fj и bi ≤ tj. Ваша задача — определить для каждого жителя, сможет ли он доехать сегодня днем, и если сможет, найти номер автобуса, на котором он поедет. Выходные данные В первой строке выведите через пробел m целых чисел: i-ое число должно быть равно либо -1, если i-ый человек не сможет доехать, либо номеру автобуса, на котором i-ый человек поедет. Автобусы нумеруются целыми числами от 1 до n в том порядке, в котором они заданы во входных данных.
| |
|
|
C. Оптимальная вставка
дп
жадные алгоритмы
разделяй и властвуй
сортировки
Структуры данных
*2300
У вас есть два массива \(a_1, a_2, \ldots, a_n\) и \(b_1, b_2, \ldots, b_m\), состоящие из целых чисел. Вы должны вставить все элементы массива \(b\) в массив \(a\) в произвольные места. В результате получится массив \(c_1, c_2, \ldots, c_{n+m}\) размера \(n + m\). Обратите внимание, что элементы массива \(a\) переставлять нельзя, но элементы массива \(b\) можно вставлять куда угодно (в начало, между двумя соседними элементами массива \(a\), в конец). Более того, элементы массива \(b\) могут стоять в получившемся массиве в любом порядке. Какое минимальное количество инверсий в массиве \(c\) может быть? Напомним, что инверсией называется пара индексов \((i, j)\), такая что \(i < j\) и \(c_i > c_j\). Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество инверсий, которое может получиться в массиве \(c\) при вставке. Примечание Варианты оптимальных вставок для всех наборов входных данных (элементы массива \(a\) подчеркнуты): - В первом наборе входных данных можно сделать \(c = [\underline{1}, 1, \underline{2}, 2, \underline{3}, 3, 4]\).
- Во втором наборе входных данных можно сделать \(c = [1, 2, \underline{3}, \underline{2}, \underline{1}, 3]\).
- В третьем наборе входных данных можно сделать \(c = [\underline{1}, 1, 3, \underline{3}, \underline{5}, \underline{3}, \underline{1}, 4, 6]\).
| |
|
|
D. Сложная гора
дп
жадные алгоритмы
сортировки
Структуры данных
*2700
Группа из \(n\) альпинистов подошла к подножию горы. Сложность подъема на эту гору можно оценить целым числом \(d\). Каждого альпиниста можно описать всего двумя целыми числами \(s\) и \(a\), где \(s\) характеризует навык альпиниста по восхождению на горы, а \(a\) характеризует его аккуратность. Альпинист с навыком \(s\) может забраться на гору сложности \(p\) только в том случае, если \(p \leq s\). Во время того, как он забирается, он немного меняет путь, по которому идёт, а вместе с ним и его сложность. А именно, после того как на гору сложности \(p\) забирается альпинист с аккуратностью \(a\), сложность горы становится равной \(\max(p, a)\). Альпинисты решили подниматься на гору по одному. Но сначала всем стало интересно, какое максимальное количество альпинистов смогут забраться на эту гору, если они будут залезать в оптимальном порядке. А так как в группе только вы увлекаетесь программированием, отвечать на этот вопрос придется вам. Заметим, что после того, как порядок выбран, каждый альпинист, который может подняться на гору, должен подняться в отведенный ему момент. Выходные данные Выведите одно число — максимальное количество альпинистов, которые смогут забраться на гору, если они будут подниматься на неё в оптимальном порядке. Примечание В первом примере из условия на гору могут забраться альпинисты \(2\) и \(3\) в таком порядке. Других вариантов, при которых забираются \(2\) альпиниста, нет. Во втором примере из условия альпинист \(1\) забраться не может, потому что изначальная сложность горы слишком велика, а альпинисты \(2\) и \(3\) могут забраться в любом порядке. В третьем примере из условия на гору взберутся альпинисты \(5\), \(3\) и \(4\), причём именно в таком порядке, других вариантов нет.
| |
|
|
B. Реверс сорт
жадные алгоритмы
сортировки
*1000
У Ashish есть бинарная строка \(s\) длины \(n\), которую он хочет отсортировать в неубывающем порядке. Он может выполнять следующую операцию: - Выберите подпоследовательность любой длины, элементы которой идут в невозрастающем порядке. Формально, выберите любое \(k\) такое, что \(1 \leq k \leq n\) и любую последовательность \(k\) индексов \(1 \le i_1 \lt i_2 \lt \ldots \lt i_k \le n\) такую, что \(s_{i_1} \ge s_{i_2} \ge \ldots \ge s_{i_k}\).
- Затем, «разверните» эту последовательность. Формально, поменяйте местами \(s_{i_1}\) с \(s_{i_k}\), \(s_{i_2}\) с \(s_{i_{k-1}}\), \(\ldots\) и \(s_{i_{\lfloor k/2 \rfloor}}\) с \(s_{i_{\lceil k/2 \rceil + 1}}\) (Здесь \(\lfloor x \rfloor\) обозначает наибольшее целое число, не превосходящее \(x\), а \(\lceil x \rceil\) обозначает наименьшее целое число, не меньшее \(x\)).
Найдите минимальное количество операций, необходимых для того, чтобы отсортировать строку в неубывающем порядке. Можно доказать, что всегда можно отсортировать заданную бинарную строку не более чем за \(n\) операций. Выходные данные Для каждого набора входных данных выведите следующее: - минимальное количество операций \(m\) в первой строке (\(0 \le m \le n\)).
- Каждая из следующих \(m\) строк должна иметь вид: \(k\) \(i_1\) \(i_2\) ... \(i_{k}\), где \(k\) — длина, а \(i_1 \lt i_2 \lt ... \lt i_{k}\) — индексы выбранной подпоследовательности. Для них должны выполняться ограничения из условия.
Примечание В первом наборе входных данных строка уже отсортирована в неубывающем порядке. Во втором наборе входных данных мы можем выполнить следующую операцию: В третьем наборе входных данных мы можем выполнить следующую операцию:
| |
|
|
E. Уравнитель массивов
Бинарный поиск
жадные алгоритмы
математика
реализация
сортировки
теория чисел
*2400
У Jeevan есть два массива \(a\) и \(b\) размером \(n\). Он любит выполнять странные операции над массивами. На этот раз он придумал два типа операций: - Выберите любое \(i\) (\(1 \le i \le n\)) и увеличьте \(a_j\) на \(1\) для каждого \(j\), которое кратно \(i\) и \(1 \le j \le n\).
- Выберите любое \(i\) (\(1 \le i \le n\)) и уменьшите \(a_j\) на \(1\) для каждого \(j\), которое кратно \(i\) и \(1 \le j \le n\).
Он хочет преобразовать массив \(a\) в массив \(b\), используя минимальное общее количество операций. Однако Jeevan, похоже, забыл значение \(b_1\). Поэтому он делает некоторые предположения. Он задаст вам \(q\) вопросов, соответствующих его \(q\) догадкам, \(i\)-я из которых имеет вид: - Если \(b_1 = x_i\), то какое минимальное количество операций требуется для преобразования \(a\) в \(b\)?
Помогите ему, ответив на каждый вопрос. Выходные данные Выведите \(q\) целых чисел — ответы на каждый из его \(q\) вопросов. Примечание Рассмотрим первый пример. - \(b_1 = 1\): Нам нужно преобразовать \([3, 7] \rightarrow [1, 5]\). Мы можем выполнить следующие операции:
\([3, 7]\) \(\xrightarrow[\text{уменьшить}]{\text{i = 1}}\) \([2, 6]\) \(\xrightarrow[\text{уменьшить}]{\text{i = 1}}\) \([1, 5]\) Следовательно, ответ равен \(2\). - \(b_1 = 4\): Нам нужно преобразовать \([3, 7] \rightarrow [4, 5]\). Мы можем выполнить следующие операции:
\([3, 7]\) \(\xrightarrow[\text{уменьшить}]{\text{i = 2}}\) \([3, 6]\) \(\xrightarrow[\text{уменьшить}]{\text{i = 2}}\) \([3, 5]\) \(\xrightarrow[\text{увеличить}]{\text{i = 1}}\) \([4, 6]\) \(\xrightarrow[\text{уменьшить}]{\text{i = 2}}\) \([4, 5]\) Следовательно, ответ — \(4\). - \(b_1 = 3\): Нам нужно преобразовать \([3, 7] \rightarrow [3, 5]\). Мы можем выполнить следующие операции:
\([3, 7]\) \(\xrightarrow[\text{уменьшить}]{\text{i = 2}}\) \([3, 6]\) \(\xrightarrow[\text{уменьшить}]{\text{i = 2}}\) \([3, 5]\) Следовательно, ответ равен \(2\).
| |
|
|
D. Красно-синяя матрица
Конструктив
Перебор
реализация
сортировки
*2400
Дана матрица, состоящая из \(n\) строк и \(m\) столбцов. В \(j\)-й ячейке \(i\)-й строки записано целое число \(a_{ij}\). Сначала необходимо раскрасить каждую строку матрицы либо в красный, либо в синий цвет, так, чтобы хотя бы одна строка была красная и хотя бы одна строка была синяя. Затем необходимо выбрать целое число \(k\) (\(1 \le k < m\)) и разрезать матрицу таким образом, что первые \(k\) столбцов становятся отдельной матрицей (левой матрицей) и последние \(m-k\) столбцов становятся отдельной матрицей (правой матрицей). Раскраска и разрез называются идеальными, если выполняются два условия: - в каждой красной ячейке левой матрицы записано число большее, чем в каждой синей ячейке левой матрицы;
- в каждой синей ячейке правой матрицы записано число большее, чем в каждой красной ячейке правой матрицы.
Найдите любые идеальные раскраску и разрез или скажите, что таких нет. Выходные данные На каждый набор входных данных выведите ответ. Если нет идеальных раскраски и разреза, то выведите «NO». Иначе, сначала выведите «YES». Затем строку, состоящую из \(n\) символов: \(i\)-й символ должен быть 'R', если \(i\)-я строка покрашена в красный и 'B', если в синий. В строке должен быть хотя бы один символ 'R' и хотя бы один символ 'B'. Наконец, выведите целое число \(k\) (\(1 \le k < m\)) — количество столбцов, которые отрезаются слева. Примечание Раскраска и разрез для первого набора входных данных:
| |
|
|
C. Устранение минимума
Перебор
сортировки
*1000
У Елисея есть массив \(a\), в котором записаны \(n\) целых чисел. Если массив \(a\) имеет длину строго больше \(1\), то Елисей может применить к нему операцию устранения минимума: - Сначала Елисей находит в массиве минимальное число \(m\). Если есть несколько одинаковых минимальных элементов, Елисей может выбрать любой из них.
- Затем выбранный минимальный элемент удаляется из массива. После этого из каждого оставшегося элемента вычитается \(m\).
Таким образом, после каждой операции длина массива уменьшается на \(1\). Например, если \(a = [1, 6, -4, -2, -4]\), то минимальный элемент в нем равен \(a_3 = -4\), соответственно после этой операции массив станет равен \(a=[1 {- (-4)}, 6 {- (-4)}, -2 {- (-4)}, -4 {- (-4)}] = [5, 10, 2, 0]\). Поскольку Елисею нравятся большие числа, он хочет, чтобы и в массиве \(a\) числа были как можно больше. Формально, он хочет добиться того, чтобы минимальное из чисел в массиве \(a\) было максимально возможным (то есть он максимизирует минимум). Для этого он может сколько угодно раз (возможно, ноль) применить к массиву операцию устранения минимума. Обратите внимание, что операцию нельзя применять к массиву длины \(1\). Помогите ему найти, какое максимальное значение может иметь минимальный элемент массива после применения к массиву нескольких (возможно, ноль) операций устранений минимума. Выходные данные Выведите \(t\) строк, каждая из которых содержит ответ на соответствующий набор входных данных. В качестве ответа выведите единственное целое число — максимально возможный минимум в \(a\), который можно получить несколькими применениями описанной операции к массиву \(a\). Примечание В первом наборе входных данных примера изначальная длина массива \(n = 1\). Поэтому к нему нельзя применять устранение минимума. Таким образом, массив остаётся неизменным и ответ равен \(a_1 = 10\). Во втором наборе входных данных массив всегда будет состоять только из нулей. В третьем наборе массив будет принимать состояния \([\color{blue}{-1}, 2, 0] \to [3, \color{blue}{1}] \to [\color{blue}{2}]\). Минимальные элементы выделены \(\color{blue}{\text{синим}}\) цветом. Максимальный из них равен \(2\). В четвертом наборе массив будет принимать состояния \([2, 10, \color{blue}{1}, 7] \to [\color{blue}{1}, 9, 6] \to [8, \color{blue}{5}] \to [\color{blue}{3}]\). Аналогично, максимальный из минимальных элементов равен \(5\).
| |
|
|
D. Сине-красная перестановка
жадные алгоритмы
математика
сортировки
*1300
Задан массив целых чисел \(a\) длины \(n\). Элементы массива могут быть как различными, так и одинаковыми. Каждый элемент массива покрашен либо в синий цвет, либо в красный. Непокрашенных элементов в массиве нет. За один ход разрешается применить к массиву одну из двух описанных ниже операций: - либо выбрать любой синий элемент и уменьшить его значение на \(1\);
- либо выбрать любой красный элемент и увеличить его значение на \(1\).
Допустимы ситуации, в которых элементов некоторого цвета нет вообще. Например, если весь массив целиком покрашен в синий, или, наоборот, в красный. В таком случае первый (или второй, соответственно) способ сделать ход недоступен. Определите, можно ли сделать \(0\) или более ходов так, чтобы в результате массив стал перестановкой чисел от \(1\) до \(n\)? Иными словами, проверьте существует ли такая последовательность ходов (возможно, пустая), что после её применения массив \(a\) содержит в некотором порядке все числа от \(1\) до \(n\) (включительно), каждое ровно по одному разу. Выходные данные Выведите \(t\) строк, каждая из которых содержит ответ на соответствующий набор входных данных. В качестве ответа выведите YES, если соответствующий массив можно превратить в перестановку, и NO в противном случае. Вы можете выводить ответ в любом регистре (например, строки yEs, yes, Yes и YES будут распознаны как положительный ответ). Примечание В первом наборе входных данных примера можно выполнить следующую последовательность ходов: - выбрать \(i=3\), элемент \(a_3=5\) синий, поэтому уменьшим его, получим \(a=[1,2,4,2]\);
- выбрать \(i=2\), элемент \(a_2=2\) красный, поэтому увеличим его, получим \(a=[1,3,4,2]\);
- выбрать \(i=3\), элемент \(a_3=4\) синий, поэтому уменьшим его, получим \(a=[1,3,3,2]\);
- выбрать \(i=2\), элемент \(a_2=2\) красный, поэтому увеличим его, получим \(a=[1,4,3,2]\).
Получили, что \(a\) — перестановка. Следовательно, ответ YES.
| |
|
|
H. Подготовка банкета 2
жадные алгоритмы
сортировки
*2200
Известный шеф-повар опять приготовил \(n\) блюд: \(i\)-е блюдо состоит из \(a_i\) грамм рыбы и \(b_i\) грамм мяса. Организаторы банкета считают два блюда \(i\) и \(j\) равными, если \(a_i=a_j\) и одновременно \(b_i=b_j\). Организаторы банкета оценивают разнообразие \(n\) блюд следующим образом. Разнообразие набора блюд равно количеству различных блюд в нём. Чем разнообразие меньше, тем лучше. Для того, чтобы уменьшить разнообразие, был приглашен дегустатор. Он съест ровно \(m_i\) грамм еды из каждого блюда. Для каждого блюда дегустатор определяет отдельно сколько он съест рыбы, а сколько мяса. Главное, чтобы суммарно в \(i\)-м блюде он съел ровно \(m_i\) грамм. Определите, сколько какого типа еды должен съесть дегустатор в каждом из блюд, чтобы величина разнообразия оказалась минимально возможной. Если ответов несколько, выведите любой из них. Выходные данные Для каждого набора входных данных выведите в первой строке минимальное значение разнообразия, которое можно достичь, съев из блюда \(i\) ровно \(m_i\) грамм еды (для всех \(i\) от \(1\) до \(n\)). Далее выведите \(n\) строк, которые описывают способ это сделать: \(i\)-я строка должна содержать два целых числа \(x_i\) и \(y_i\) (\(0 \leq x_i \leq a_i\); \(0 \leq y_i \leq b_i\); \(x_i+y_i=m_i\)), где \(x_i\) — сколько грамм рыбы надо съесть из \(i\)-го блюда, а \(y_i\) — сколько грамм мяса. Если есть несколько способов добиться минимального баланса, выведите любой из них.
| |
|
|
E. Бумага в клеточку
Бинарный поиск
реализация
сортировки
*2800
На бесконечном клетчатом листе бумаги выбираются \(n\) клеток и окрашиваются в три цвета, где \(n\) кратно \(3\). Оказывается, что есть ровно \(\frac{n}{3}\) отмеченных клеток каждого из трех цветов! Найдите наибольшее такое \(k\), при котором можно выбрать \(\frac{k}{3}\) клеток каждого цвета, удалить все остальные помеченные клетки, а затем выбрать три прямоугольника со сторонами, параллельными линиям сетки, так, чтобы выполнялись следующие условия: - Никакие два прямоугольника не могут пересекаться (но они могут иметь общую часть границы). Другими словами, площадь пересечения любых двух прямоугольников должна быть равна \(0\).
- \(i\)-й прямоугольник содержит все выбранные клетки \(i\)-го цвета и ни одной выбранной клетки другого цвета, для \(i = 1, 2, 3\).
Выходные данные Выведите одно целое число \(k\) — наибольшее количество клеток, которое можно оставить. Примечание В первом примере можно оставить \(6\) клеток с индексами \(1, 5, 6, 7, 8, 9\). Во втором примере можно оставить \(3\) клетки с индексами \(1, 2, 3\).
| |
|
|
B. Скидки
жадные алгоритмы
Конструктив
сортировки
*1700
Как-то раз Поликарп по пути домой заглянул в супермаркет. Оказалось, что в супермаркете проходит акция по продаже табуреток. Условия акции таковы: если в корзинке с купленными товарами есть хотя бы одна табуретка, то на минимальный по стоимости товар из корзинки предоставляется скидка 50% (то есть он становится дешевле в два раза). Если товаров минимальной стоимости несколько, скидка предоставляется только на один из них! У Поликарпа есть k корзинок, и он хочет скупить все табуретки и карандаши из супермаркета. Помогите ему распределить табуретки и карандаши по корзинкам так, чтобы суммарная стоимость товаров (с учетом скидок) была как можно меньше. Поликарп обязан использовать все k корзинок для покупки товаров, ни одна корзинка не должна остаться пустой. В каждой корзинке может быть произвольное количество табуреток и/или карандашей. Выходные данные В первую строку выведите единственное вещественное число с ровно одним знаком после запятой — минимальную суммарную стоимость товаров с учетом скидок. В следующих k строках выведите описания товаров в корзинках. В i-й строке выведите описание i-й корзинки в формате «t b1 b2 ... bt» (без кавычек), где t — количество товаров в i-й корзинке, а последовательность b1, b2, ..., bt (1 ≤ bj ≤ n) — номера товаров, которые следует положить в эту корзинку в оптимальном распределении. Все номера товаров во всех корзинках должны быть попарно различны, каждый товар должен находиться ровно в одной корзинке. Товары в корзинках и сами корзинки можно выводить в любом порядке. Товары нумеруются от 1 до n в том порядке, в котором они заданы во входных данных. Если существует несколько оптимальных распределений, разрешается вывести любое. Примечание В первом примере в первую корзинку следует положить 1-ый и 2-ой товар, а во вторую — 3-ий товар. Тогда в каждой корзинке будет табуретка, и на товар минимальной стоимости предоставляется скидка 50%. Суммарная стоимость товаров составит: 2·0.5 + (3 + 3·0.5) = 1 + 4.5 = 5.5.
| |
|
|
E. Сообщения
дп
жадные алгоритмы
Перебор
сортировки
Теория вероятностей
*2000
Монокарп — тьютор группы из \(n\) студентов. Он связывается с ними через конференцию в популярном мессенджере. Сегодня у Монокарпа был напряженный день — его просили переслать его группе огромное количество объявлений, поэтому ему пришлось написать в конференции очень много сообщений. Монокарп достаточно хорошо знает студентов из группы, поэтому понимает, какое сообщение является важным для каждого студента: Монокарп хочет, чтобы студент \(i\) прочитал сообщение \(m_i\). Конечно же, никто не будет читать все сообщения. Поэтому Монокарп решил прикрепить некоторые из них. Монокарп может прикрепить любое количество сообщений, и если он хочет, чтобы какое-то сообщение было прочитано, ему стоит прикрепить его — в противном случае никто такое сообщение не прочитает. К сожалению, даже если сообщение прикреплено, некоторые студенты все равно могут его пропустить. Для каждого студента \(i\) Монокарп знает, что этот студент прочитает не более \(k_i\). Предположим, что Монокарп прикрепляет \(t\) сообщений; если \(t \le k_i\), то \(i\)-й студент прочитает все прикрепленные сообщения; но если \(t > k_i\), \(i\)-й студент выберет ровно \(k_i\) случайных прикрепленных сообщений (все различные подмножества размера \(k_i\) множества прикрепленных сообщений равновероятны) и прочитает только их. Монокарп хочет максимизировать математическое ожидание количества студентов, которые прочитают необходимые им сообщения (это соответствует количеству таких индексов \(i\), что студент \(i\) прочитает сообщение \(m_i\)). Помогите ему выбрать, какие сообщения прикрепить! Выходные данные В первой строке выведите одно целое число \(t\) (\(1 \le t \le 2 \cdot 10^5\)) — количество сообщений, которые должен прикрепить Монокарп. Во второй строке выведите \(t\) различных целых чисел \(c_1\), \(c_2\), ..., \(c_t\) (\(1 \le c_i \le 2 \cdot 10^5\)) — номера сообщений, которые необходимо прикрепить. Номера сообщений можно выводить в любом порядке. Если оптимальных ответов несколько, выведите любой из них. Примечание Рассмотрим примеры из условия. - В первом примере Монокарп прикрепляет сообщения \(5\) и \(10\).
- если первый студент прочитает сообщение \(5\), второй студент прочитает сообщения \(5\) и \(10\), и третий студент прочитает сообщения \(5\) и \(10\), количество студентов, которые прочитают соответствующие им сообщения, будет равно \(2\);
- если первый студент прочитает сообщение \(10\), второй студент прочитает сообщения \(5\) и \(10\), и третий студент прочитает сообщения \(5\) и \(10\), количество студентов, которые прочитают соответствующие им сообщения, будет равно \(3\).
Поэтому математическое ожидание количества студентов, которые прочитают соответствующие им сообщения, равно \(\frac{5}{2}\). - В первом примере Монокарп прикрепляет сообщение \(10\).
- если первый студент прочитает сообщение \(10\), второй студент прочитает сообщение \(10\), и третий студент прочитает сообщение \(10\), количество студентов, которые прочитают соответствующие им сообщения, будет равно \(2\).
Поэтому математическое ожидание количества студентов, которые прочитают соответствующие им сообщения, равно \(2\). Если бы Монокарп прикрепил и сообщение \(5\), и сообщение \(10\), математическое ожидание так же было бы равно \(2\). - В третьем примере математическое ожидание кол-ва студентов, которые прочитают соответствующие им сообщения, равно \(\frac{8}{3}\).
- В четвертом примере математическое ожидание кол-ва студентов, которые прочитают соответствующие им сообщения, равно \(2\).
| |
|
|
G. Массив максимальной суммы
жадные алгоритмы
Комбинаторика
Конструктив
сортировки
*2500
Вам задан массив \(c = [c_1, c_2, \dots, c_m]\). Массив \(a = [a_1, a_2, \dots, a_n]\) строится по нему следующим образом: он состоит из чисел \(1, 2, \dots, m\), и для каждого \(i \in [1,m]\), \(i\) встречается в \(a\) строго \(c_i\) раз. Таким образом, количество элементов в \(a\) равно \(\sum\limits_{i=1}^{m} c_i\). Определим для данного массива \(a\) значение \(f(a)\) как \(\)f(a) = \sum_{\substack{1 \le i < j \le n\\ a_i = a_j}}{j - i}.\(\) Другими словами, \(f(a)\) — это суммарное расстояние между всеми парами одинаковых чисел. Ваша задача — определить наибольшее возможное значение \(f(a)\) и количество массивов с данным значением \(f(a)\). Два массива считаются различными, если элементы в какой-то позиции различаются. Выходные данные Выведите два целых числа — максимально возможное \(f(a)\) и количество массивов \(a\) с данным значением. Так как оба ответа могут быть очень большими, выведите их по модулю \(10^9 + 7\). Примечание В первом примере, все возможные массивы \(a\) — это перестановки \([1, 2, 3, 4, 5, 6]\). Так как у каждого такого \(a\) значение \(f(a) = 0\), то максимально возможное \(f(a) = 0\) и количество таких массивов равно \(6! = 720\). Во втором примере, единственный возможный массив состоит из \(10^6\) единиц и его \(f(a) = \sum\limits_{1 \le i < j \le 10^6}{j - i} = 166\,666\,666\,666\,500\,000\) и \(166\,666\,666\,666\,500\,000 \bmod{10^9 + 7} = 499\,833\,345\).
| |
|
|
B. Отсутствующий остаток
жадные алгоритмы
реализация
сортировки
*1000
Задана последовательность \(a_1, a_2, \dots, a_n\), состоящая из \(n\) попарно различных положительных чисел. Найдите \(\left\lfloor \frac n 2 \right\rfloor\) различных пар целых чисел \(x\) и \(y\) таких, что: - \(x \neq y\);
- \(x\) и \(y\) встречаются в \(a\);
- \(x~mod~y\) не встречается в \(a\).
Обратите внимание, что некоторые \(x\) или \(y\) могут входить в несколько пар. \(\lfloor x \rfloor\) обозначает функцию округления вниз — наибольшее целое число меньше либо равное \(x\). \(x~mod~y\) обозначает остаток от деления \(x\) на \(y\). Если существует несколько решений, выведите любое из них. Можно показать, что решение всегда существует. Выходные данные Ответ на каждый набор входных данных должен содержать \(\left\lfloor \frac n 2 \right\rfloor\) различных пар целых чисел \(x\) и \(y\) таких, что \(x \neq y\), \(x\) и \(y\) встречаются в \(a\) и \(x~mod~y\) не встречается в \(a\). Выведите пары одну за другой. Можно выводить пары в любом порядке. Однако, внутри пары числа должны быть такие, что первое число — это \(x\), а второе число — это \(y\). Все пары должны быть попарно различны. Если существует несколько решений, выведите любое из них. Примечание В первом наборе входных данных существует только две пары: \((1, 4)\) и \((4, 1)\). \(\left\lfloor \frac 2 2 \right\rfloor=1\), поэтому надо найти одну пару. \(1~mod~4=1\), и \(1\) встречается в \(a\), поэтому такая пара некорректная. Поэтому единственный возможный ответ — это пара \((4, 1)\). Во втором наборе входных данных мы выбрали пары \(8~mod~2=0\) и \(8~mod~4=0\). \(0\) не входит в \(a\), поэтому такой ответ правильный. В данном тесте существуют несколько решений. В третьем наборе входных данных выбранные пары — \(9~mod~5=4\) и \(7~mod~5=2\). Ни \(4\), ни \(2\) не встречаются в \(a\), поэтому такой ответ правильный.
| |
|
|
B. Divan и новый проект
Конструктив
сортировки
*1000
Компания «Divan's Sofas» хочет построить на координатной прямой \(n + 1\) различное здание так, чтобы: - координата каждого здания являлась целым числом;
- никакие два здания не стоят в одной точке.
Пусть \(x_i\) — координата \(i\)-го здания. Чтобы добраться из \(i\)-го здания в \(j\)-е, Divan будет тратить \(|x_i - x_j|\) минут, где \(|y|\) — модуль числа \(y\). Все здания, которые Divan построит, будут пронумерованы от \(0\) до \(n\). Бизнесмен будет жить в здании номер \(0\) — новом главном офисе «Divan's Sofas». За первые десять лет после строительства Divan посетит \(i\)-е здание \(a_i\) раз, каждый раз тратя \(2 \cdot |x_0-x_i|\) минут на ходьбу. Divan просит вас выбрать координаты всех \(n + 1\) зданий так, чтобы за следующие десять лет бизнесмен потратил как можно меньше времени на ходьбу. Выходные данные Для каждого набора входных данных в первой строке выведите число \(T\) — минимальное количество времени, которое потратит Divan на ходьбу. Во второй строке выведите последовательность \(x_0, x_1, \ldots, x_n\) из \(n + 1\) целых чисел, где \(x_i\) (\(-10^6 \le x_i \le 10^6\)) — выбранная координата для \(i\)-го здания. Можно показать, что в оптимальном ответе координаты всех зданий можно выбрать так, чтобы их абсолютная величина не превышала \(10^6\). Если оптимальных ответов несколько, выведите любой из них. Примечание Рассмотрим первый пример. В нём Divan посетит первое здание \(a_1 = 1\) раз, второе \(a_2 = 2\) раз и третье \(a_3 = 3\) раз. Тогда одно из выгодных расположений будет следующим: - \(x_0 = 2\) — координата главного офиса;
- \(x_1 = 4\) — всего Divan потратит \(2 \cdot |x_0-x_1| \cdot a_1 = 2 \cdot |2-4| \cdot 1 = 4\) минуты на посещение первого здания;
- \(x_2 = 1\) — всего Divan потратит \(2 \cdot |x_0-x_2| \cdot a_2 = 2 \cdot |2-1| \cdot 2 = 4\) минуты на посещение второго здания;
- \(x_3 = 3\) — всего Divan потратит \(2 \cdot |x_0-x_3| \cdot a_3 = 2 \cdot |2-3| \cdot 3 = 6\) минут на посещение третьего здания.
Тогда в сумме Divan потратит \(4 + 4 + 6 = 14\) минут. Можно показать, что расположить здания так, чтобы бизнесмен потратил меньше времени, нельзя. Также правильными ответами в первом примере могли быть \(x = [1, 3, 2, 0]\), \(x = [-5, -3, -6, -4]\) и другие.
| |
|
|
E. Фиолетовый мелок
графы
Деревья
жадные алгоритмы
игры
математика
поиск в глубину и подобное
сортировки
Структуры данных
*2400
Два игрока, Красный и Синий, снова в деле, и этот раз они играют с цветными мелками! Сегодня озорной паре под руку попалось корневое дерево, с которым они играют в свою любимую игру, раскрашивая вершины этого дерева. Игра выглядит следующим образом: есть дерево из \(n\) вершин с корнем в вершине \(1\), и каждая вершина первоначально белого цвета. У Красного и Синего есть ровно по одному ходу. Первым ходит Красный. В свой ход, Красный может выполнить следующее действие произвольное количество раз: - Он выбирает любое поддерево корневого дерева и красит каждую из вершин поддерева в красный.
Однако, для большей честности, Красный может покрасить только \(k\) вершин дерева. Другими словами, после окончания хода Красного, не более \(k\) вершин может быть покрашено в красный. Далее подходит очередь Синего. Он может выполнять следующее действие произвольное количество раз: - Он выбирает любое поддерево корневого дерева и красит каждую вершину поддерева в синий. Однако, ему нельзя выбирать поддеревья, в которых содержатся вершины, уже покрашенные в красный. Ведь в таком случае вершина получится фиолетового цвета, а никто не любит фиолетовый мелок* (англ. purple crayon).
Заметим, что нет ограничения на то, сколько вершин покрасит Синий, главное, что он не красит уже покрашенные Красным вершины. После того как каждый сделает свой ход, счет игры определяется следующим образом: пусть \(w\) — количество оставшихся белых вершин, \(r\) — количество красных вершин, а \(b\) — количество синих вершин. Счет игры будет равен \(w \cdot (r - b)\). Красный хочет максимизировать счет, а Синий — минимизировать. Чему будет равен счет игры, если оба игрока действуют оптимально? Выходные данные Выведите одно число — итоговый счет игры, если и Красный и Синий действуют оптимально. Примечание В первом наборе входных данных, одна из оптимальных стратегий следующая: - Красный выбирает для покраски поддеревья вершин \(2\) и \(3\).
- Синий выбирает для покраски поддерево вершины \(4\).
В результате вершины \(2\) и \(3\) покрашены в красный, \(4\) — в синий, а вершина \(1\) — в белый. Счет игры равен \(1 \cdot (2 - 1) = 1\). Во втором наборе, оптимальная стратегия следующая: - Красный выбирает для покраски поддерево вершины \(4\). Тем самым красит вершины \(4\) и \(5\).
- Синий не может ничего выбрать, а потому ничего не красит.
В результате вершины \(4\) и \(5\) покрашены в красный, а вершины \(1\), \(2\) и \(3\) — белые. Счет игры равен \(3 \cdot (2 - 0) = 6\). В третьем наборе: Счет игры равен \(4 \cdot (2 - 1) = 4\).
| |
|
|
A. Запрещённая подпоследовательность
жадные алгоритмы
Конструктив
сортировки
Строки
*800
Вам даны строки \(S\) и \(T\), состоящие из строчных символов латинского алфавита. Гарантируется, что \(T\) является перестановкой строки abc. Найдите строку \(S'\), которая является лексикографически минимальной перестановкой \(S\), и при этом \(T\) не является подпоследовательностью \(S'\). Строка \(a\) является перестановкой строки \(b\), если количество вхождений для всех различных символов одинаковое в обеих строках. Строка \(a\) является подпоследовательностью строки \(b\), если \(a\) может быть получена из \(b\) удалением нескольких (возможно нуля или всех) символов. Строка \(a\) лексикографически меньше строки \(b\), если и только если выполняется один из следующих пунктов: - \(a\) — префикс \(b\), но \(a \ne b\);
- в первой позиции, где \(a\) и \(b\) различны, в строке \(a\) находится буква, которая встречается в алфавите раньше, чем соответствующая буква в \(b\).
Выходные данные Для каждого набора входных данных выведите единственную строку \(S'\), которая является лексикографически минимальной перестановкой \(S\), и при этом \(T\) не является подпоследовательностью \(S'\). Примечание В первом наборе входных данных и aaaabbc, и aaaabcb лексикографически меньше, чем aaaacbb, но они содержат abc как подпоследовательность. Во втором наборе входных данных abccc является лексикографически минимальной перестановкой cccba и не содержит acb как подпоследовательность. В третьем наборе входных данных bcdis является лексикографически минимальной перестановкой dbsic и не содержит bac как подпоследовательность.
| |
|
|
C. Паприка и перестановка
Бинарный поиск
жадные алгоритмы
математика
сортировки
*1300
Паприка любит перестановки. У неё есть массив \(a_1, a_2, \dots, a_n\). Она хочет сделать массив перестановкой целых чисел от \(1\) до \(n\). Чтобы достичь этой цели, она может применять к массиву операции. За одну операцию она может выбрать два целых числа \(i\) (\(1 \le i \le n\)) и \(x\) (\(x > 0\)), и затем присвоить \(a_i := a_i \bmod x\) (то есть заменить \(a_i\) на остаток от деления \(a_i\) на \(x\)). В разных операциях выбираемые \(i\) и \(x\) могут быть разными. Определите минимальное количество операций, необходимое, чтобы сделать массив перестановкой целых чисел от \(1\) до \(n\). Если это невозможно, выведите \(-1\). Перестановкой называется массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) является перестановкой, но \([1,2,2]\) не является перестановкой (\(2\) встречается дважды в массиве) и \([1,3,4]\) тоже не является перестановкой (\(n=3\), но \(4\) присутствует в массиве). Выходные данные Для каждого набора входных данных выведите минимальное количество операций, необходимое, чтобы сделать массив перестановкой целых чисел от \(1\) до \(n\), или \(-1\), если это невозможно. Примечание В первом наборе входных данных единственная возможная последовательность операций, минимизирующая количество операций, следующая: - Выберем \(i=2\), \(x=5\). Заменим \(a_2 := a_2 \bmod 5 = 2\).
Для второго набора входных данных невозможно получить перестановку целых чисел от \(1\) to \(n\).
| |
|
|
A. Поликарп и суммы подпоследовательностей
математика
сортировки
*800
У Поликарпа был массив \(a\) из \(3\) положительных целых чисел. Он выписал суммы всех непустых подпоследовательностей этого массива, отсортировал их по неубыванию и получил массив \(b\) из \(7\) целых чисел. Например, если \(a = \{1, 4, 3\}\), то Поликарп выписал \(1\), \(4\), \(3\), \(1 + 4 = 5\), \(1 + 3 = 4\), \(4 + 3 = 7\), \(1 + 4 + 3 = 8\). После сортировки он получил массив \(b = \{1, 3, 4, 4, 5, 7, 8\}.\) К сожалению, Поликарп потерял массив \(a\). У него остался только массив \(b\). Помогите ему восстановить массив \(a\). Выходные данные Для каждого набора входных данных выведите \(3\) целых числа — \(a_1\), \(a_2\) и \(a_3\). Если ответов может быть несколько, выведите любой из них. Примечание Подпоследовательность массива \(a\) — это последовательность, которая получается из \(a\) путем удаления нуля или более его элементов. Две подпоследовательности считаются различными, если множества индексов входящих в них элементов различны, то есть значения элементов не учитываются при сравнении подпоследовательностей. В частности, любой массив длины \(3\) имеет ровно \(7\) различных непустых подпоследовательностей.
| |
|
|
G. Торговая задача
жадные алгоритмы
снм
сортировки
Структуры данных
*2200
Монокарп играет в компьютерную игру (ага, опять). В этой игре довольно нестандартно реализована механика торговли. Чтобы поторговать с кем-то из персонажей игры, Монокарп должен выбрать какую-то свою вещь и обменять ее на вещь того персонажа, с которым он торгует. У каждой вещи есть целочисленная цена. Если у Монокарпа есть вещь с ценой \(x\), он может обменять ее на вещь (ровно одну) с ценой не более \(x+k\). Изначально у Монокарпа есть \(n\) вещей, цена \(i\)-й из них равна \(a_i\). У персонажа, с которым Монокарп торгует, изначально есть \(m\) вещей, цена \(i\)-й из них равна \(b_i\). Монокарп может поторговать с этим персонажем столько раз, сколько захочет (возможно, ноль), каждый раз меняя одну из своих вещей на вещь, принадлежащую персонажу, по описанным ранее правилам. Обратите внимание, что если Монокарп получает какую-то вещь в результате обмена, он потом может ее обменять на другую вещь (так как это теперь его вещь); и наоборот, если Монокарп отдал свою вещь в процессе обмена, он может получить ее обратно, обменяв на нее что-то еще. Вы должны ответить на \(q\) запросов. В каждом запросе вам подается одно целое число, которое соответствует значению \(k\). Чтобы ответить на запрос, вы должны посчитать максимально возможную суммарную стоимость вещей, которые могут оказаться у Монокарпа (при условии, что вещь стоимости \(x\) можно обменивать на вещь стоимости не более \(x+k\)). Обратите внимание, что запросы независимые: Монокарп на самом деле не обменивает вещи, он просто хочет оценить максимально возможную суммарную цену вещей. Выходные данные Для каждого запроса выведите одно целое число — максимально возможную суммарную цену вещей, которые могут оказаться у Монокарпа при заданном значении \(k\) для запроса.
| |
|
|
D. Новогодняя задача
Бинарный поиск
жадные алгоритмы
сортировки
*1800
У Влада есть \(n\) друзей, для каждого из которых он хочет купить один подарок на Новый год. Всего в городе есть \(m\) магазинов, в каждом из которых он может купить подарок любому из друзей. Если \(j\)-й друг (\(1 \le j \le n\)) получает подарок, купленный в магазине с номером \(i\) (\(1 \le i \le m\)), то друг получает \(p_{ij}\) единиц радости. Прямоугольная таблица \(p_{ij}\) задана во входных данных. Влад успевает посетить не более \(n-1\) магазина (\(n\) — количество друзей). Он сам может выбрать, какие именно магазины посетит, и для каких друзей он будет покупать подарки в каждом из них. Пусть \(j\)-й друг получил \(a_j\) единиц радости от подарка Влада. Найдем величину \(\alpha=\min\{a_1, a_2, \dots, a_n\}\). Цель Влада — купить подарки так, чтобы значение \(\alpha\) было как можно больше. Иными словами, Влад хочет максимизировать минимальную из радостей друзей. Например, пусть \(m = 2\), \(n = 2\). Пусть радости от подарков, которые мы можем приобрести в первом магазине: \(p_{11} = 1\), \(p_{12}=2\), во втором магазине: \(p_{21} = 3\), \(p_{22}=4\). Тогда Владу достаточно зайти только во второй магазин и купить в нем для первого друга подарок, приносящий радость \(3\), а для второго — приносящий радость \(4\). При этом величина \(\alpha\) будет равна \(\min\{3, 4\} = 3\). Помогите Владу выбрать подарки для своих друзей так, чтобы значение \(\alpha\) было максимально возможным. Обратите внимание на то, что каждый друг должен получить один подарок. Влад может посетить не более \(n-1\) магазина (\(n\) — количество друзей). В магазине он может купить произвольное количество подарков. Выходные данные Выведите \(t\) строк, каждая из строк должна содержать ответ на соответствующий набор входных данных — максимальное возможное значение \(\alpha\), где \(\alpha\) — минимальная из радостей от подарка по всем друзьям Влада.
| |
|
|
E. MEX и инкременты
дп
жадные алгоритмы
Конструктив
математика
реализация
сортировки
Структуры данных
*1700
У Дмитрия есть массив из \(n\) неотрицательных целых чисел \(a_1, a_2, \dots, a_n\). За одну операцию он может выбрать произвольный индекс \(j\) (\(1 \le j \le n\)) и увеличить значение элемента \(a_j\) на \(1\). Он может выбирать один и тот же индекс \(j\) многократно. Для каждого \(i\) от \(0\) до \(n\) определите, сможет ли Дмитрий сделать \(\mathrm{MEX}\) массива равным ровно \(i\). Если сможет, то определите, за какое минимальное количество операций. \(\mathrm{MEX}\) массива равен минимальному целому неотрицательному числу, которого нет в массиве. Например, \(\mathrm{MEX}\) массива \([3, 1, 0]\) равен \(2\), а массива \([3, 3, 1, 4]\) — \(0\). Выходные данные Для каждого набора входных данных выведите \(n + 1\) целое число — \(i\)-е число равно минимальному числу операций, за которое можно сделать \(\mathrm{MEX}\) массива равным \(i\) (\(0 \le i \le n\)), или -1, если этого сделать нельзя. Примечание В первом наборе входных данных примера \(n=3\): - чтобы получить \(\mathrm{MEX}=0\), достаточно выполнить один инкремент: \(a_1\)++;
- чтобы получить \(\mathrm{MEX}=1\), достаточно выполнить один инкремент: \(a_2\)++;
- \(\mathrm{MEX}=2\) для заданного массива, поэтому выполнять инкременты не надо;
- получить \(\mathrm{MEX}=3\), выполняя инкременты, невозможно.
| |
|
|
G. Необычный сапёр
Бинарный поиск
жадные алгоритмы
поиск в глубину и подобное
снм
сортировки
*2000
Поликарп очень любит играть в игру сапёр. Недавно он нашёл похожую игру и там такие правила. На поле находятся мины, для каждой известны координаты её местоположения (\(x_i, y_i\)). Каждая мина имеет время жизни в секундах, после которого она взорвётся. После взрыва мина также детонирует все мины по вертикали и горизонтали на расстоянии \(k\) (две перпендикулярные линии). В итоге получаем взрыв на поле в виде символа «плюс» ('+'). Таким образом, один взрыв может вызвать новые взрывы, а новые взрывы — следующие и так далее. Также Поликарп может сам взорвать одну любую мину в каждую секунду, начиная с нулевой. После этого также проходит цепная реакция взрывов. Мины взрываются моментально и также моментально детонируют другие мины по написанным выше правилам. Поликарп хочет установить новый рекорд и просит вас помочь ему рассчитать, за какое минимальное количество секунд можно взорвать все мины. Выходные данные Выведите \(t\) строк, каждая из строк должна содержать ответ на соответствующий набор входных данных — минимальное количество секунд, за которое можно взорвать все мины. Примечание Первый набор входных данных примера. Первый пример: - Секунда \(0\): взрываем мину в клетке \((2, 2)\) она никого не задевает так как \(k=0\).
- Секунда \(1\): взрываем мину в клетке \((0, 1)\), а мина в клетке \((0, 0)\) взрывается сама.
- Секунда \(2\): взрываем мину в клетке \((1, 1)\), а мина в клетке \((1, 0)\) взрывается сама.
Второй пример: - Секунда \(0\): взрываем мину в клетке \((2, 2)\) получаем:
- Секунда \(1\): взрывается мина в клетке \((0, 0)\) и так как \(k=2\) взрыв задевает мины в клетках \((0, 1)\) и \((1, 0)\), а их взрывы задевают мину в клетке \((1, 1)\) и на поле не остаётся мин.
| |
|
|
E. Новая школа
Бинарный поиск
дп
жадные алгоритмы
реализация
сортировки
Структуры данных
*2300
Вы решили открыть новую школу. Вы уже нашли \(n\) преподавателей и \(m\) групп учеников. Группа учеников \(i\) состоит из \(k_i \geq 2\) учеников. Вы знаете возраста всех преподавателей и всех учеников. Возраста преподавателей равны \(a_1, a_2, \ldots, a_n\), а возраста учеников в \(i\)-й группе равны \(b_{i, 1}, b_{i, 2}, \ldots, b_{i, k_i}\). Чтобы начать занятия, осталось лишь назначить каждой группе учеников преподавателя. При этом должны выполняться следующие условия: - Каждой группе учеников назначен ровно один из преподавателей.
- Каждому преподавателю назначено не более \(1\) группы учеников.
- Для каждой группы, cреднее арифметическое возрастов учеников группы не превосходит возраста назначенного этой группе преподавателя.
Средним арифметическим множества \(x_1, x_2, \ldots, x_k\) из \(k\) чисел является значение \(\frac{x_1 + x_2 + \ldots + x_k}{k}\). Недавно Вы узнали, что один из учеников решил отказаться от обучения в Вашей школе. После его отказа размер одной из групп учеников уменьшится на \(1\), все остальные группы останутся без изменений. Вы не знаете, кто именно решил отказаться от обучения. Для каждого ученика определите, сможете ли Вы начать занятия в случае его отказа. Обратите внимание, что не гарантируется, что до отказа ученика от обучения, было возможно начать занятия. Выходные данные Для каждого набора входных данных выведите одну строку длины \(k_1 + k_2 + \ldots + k_m\), состоящую из символов \(0\) и \(1\). \(i\)-й символ этой строки должен быть равен \(1\), если в случае отказа \(i\)-го ученика можно будет начать занятия, и равен \(0\) иначе. Ученики пронумерованы целыми числами от \(1\) до \(k_1 + k_2 + \ldots + k_m\) в том порядке, в котором они встречаются во входных данных. Таким образом, ученики \(1\)-й группы имеют номера \(1\), \(2\), \(\ldots\), \(k_1\), ученики \(2\)-й группы имеют номера \(k_1 + 1\), \(k_1 + 2\), \(\ldots\), \(k_1 + k_2\) и так далее. Примечание В первом наборе входных данных есть одна группа учеников с средним возрастом \(\frac{25+16+37}{3}=26\) и один преподаватель с возрастом \(30\). Существует единственный способ назначить каждой группе учеников преподавателя и начать занятия. Если ученик возраста \(16\) откажется от обучения, среднее арифметическое возрастов в группе станет равно \(\frac{25+37}{2}=31\), и не будет существовать способа назначить каждой группе учеников преподавателя. Во втором наборе входных данных невозможно начать занятия изначально. Но если \(3\)-й ученик возраста \(111\) откажется от обучения, средние возраста учеников в группах станут равны \(\frac{4 + 5}{2}=4.5\) и \(\frac{11+11}{2} = 11\) соответственно. Тогда можно назначить первой группе первого преподавателя, а второй группе — третьего преподавателя.
| |
|
|
B. Berland Music
жадные алгоритмы
математика
сортировки
Структуры данных
*1000
Berland Music — это стриминговый сервис, созданный специально для поддержки локальных Берляндских исполнителей. Его разработчики в данный момент работают над модулем рекомендаций песен. Представим, что Монокарпу порекомендовали \(n\) песен, пронумерованных от \(1\) до \(n\). У \(i\)-й песни предсказанный рейтинг равен \(p_i\), где \(1 \le p_i \le n\) и каждое целое число от \(1\) до \(n\) встречается ровно один раз. Другими словами, \(p\) — перестановка. После прослушивания каждой песни Монокарп ее оценил — понравилась она ему или нет. Последовательность его оценок представлена строкой \(s\) такой, что \(s_i=0\) значит, что ему не понравилась \(i\)-я песня, а \(s_i=1\) значит, что понравилась. Теперь сервису надо пересчитать рейтинги песен так, чтобы: - новые рейтинги \(q_1, q_2, \dots, q_n\) все еще были перестановкой (\(1 \le q_i \le n\); каждое целое число от \(1\) до \(n\) встречается ровно один раз);
- каждая песня, которая понравилась Монокарпу, имеет рейтинг больше каждой, которая ему не понравилась (формально, для всех \(i, j\) таких, что \(s_i=1\) и \(s_j=0\), выполняется \(q_i>q_j\)).
Среди всех корректных перестановок \(q\) найдите такую, у которой значение \(\sum\limits_{i=1}^n |p_i-q_i|\) наименьшее, где \(|x|\) — это абсолютное значение \(x\). Выведите перестановку \(q_1, q_2, \dots, q_n\). Если существует несколько ответов, выведите любой из них. Выходные данные На каждый набор входных данных выведите перестановку \(q\) — пересчитанные рейтинги песен. Если существует несколько ответов таких, что \(\sum\limits_{i=1}^n |p_i-q_i|\) минимально, выведите любой из них. Примечание В первом наборе входных данных существует только одна перестановка \(q\) такая, что каждая понравившаяся песня имеет рейтинг выше, чем каждая не понравившаяся: песня \(1\) получает рейтинг \(2\), а песня \(2\) — рейтинг \(1\). \(\sum\limits_{i=1}^n |p_i-q_i|=|1-2|+|2-1|=2\). Во втором наборе входных данных Монокарпу понравились все песни, поэтому корректны все перестановки. Перестановка с минимальной суммой абсолютных разностей равна перестановке \(p\). Ее стоимость равна \(0\).
| |
|
|
C. Присвоить или уменьшить
Бинарный поиск
жадные алгоритмы
Перебор
сортировки
*1600
Вам задан целочисленный массив \(a_1, a_2, \dots, a_n\) и целое число \(k\). За один шаг, вы можете - либо выбрать некоторый индекс \(i\) и уменьшить \(a_i\) на единицу (сделать \(a_i = a_i - 1\));
- либо выбрать два индекса \(i\) и \(j\) и присвоить элементу \(a_i\) значение \(a_j\) (сделать \(a_i = a_j\)).
За какое наименьшее количество шагов вы можете сделать сумму массива \(\sum\limits_{i=1}^{n}{a_i} \le k\)? (В массиве разрешены отрицательные элементы). Выходные данные Для каждого набора выведите одно число — наименьшее количество шагов для получения \(\sum\limits_{i=1}^{n}{a_i} \le k\). Примечание В первом наборе входных данных, вам нужно уменьшить \(a_1\) \(10\) раз, чтобы получить сумму не более \(k = 10\). Во втором наборе, сумма массива \(a\) уже не превосходит \(69\), а потому вам не нужно ничего менять. В третьем наборе, вы можете, например: - присвоить \(a_4 = a_3 = 1\);
- уменьшить \(a_4\) на единицу, и получить \(a_4 = 0\).
В результате вы получите массив \([1, 2, 1, 0, 1, 2, 1]\) с суммой, не превосходящей \(8\), за \(1 + 1 = 2\) шага. В четвертом наборе, вы можете, например: - выбрать \(a_7\) и уменьшить его на один \(3\) раза; вы получите \(a_7 = -2\);
- выбрать \(4\) элемента \(a_6\), \(a_8\), \(a_9\) и \(a_{10}\) и присвоить им значение \(a_7 = -2\).
В результате вы получите массив \([1, 2, 3, 1, 2, -2, -2, -2, -2, -2]\) с суммой, меньше или равной \(1\), за \(3 + 4 = 7\) шагов.
| |
|
|
B. Игра на отрезках
Перебор
поиск в глубину и подобное
реализация
сортировки
*1100
Алиса и Боб играют в следующую игру. У Алисы есть набор непересекающихся отрезков целых чисел \(S\), изначально содержащий только один отрезок \([1, n]\). За один ход Алиса выбирает некоторый отрезок \([l, r]\) из набора \(S\), а Боб выбирает некоторое число \(d\) из этого отрезка (\(l \le d \le r\)). Затем Алиса убирает \([l, r]\) из \(S\), и добавляет в \(S\) отрезки \([l, d - 1]\) (если \(l \le d - 1\)) и \([d + 1, r]\) (если \(d + 1 \le r\)). Игра заканчивается, когда \(S\) становится пустым. Можно показать, что количество шагов в такой игре всегда ровно \(n\). После того, как игра была сыграна, Алиса запомнила все отрезки \([l, r]\), которые она доставала из набора \(S\), но Боб не запомнил ни одного числа, которые он выбирал. Но Боб умный и понимает, что числа \(d\) можно восстановить, используя отрезки, которые помнит Алиса, и просит вас помочь запрограммировать это. По данному списку отрезков, которые Алиса доставала (\([l, r]\)) восстановите для каждого отрезка число \(d\), которое выбирал Боб. Можно показать, что по данному списку отрезков всегда существует ровно один способ восстановить числа Боба. Выходные данные Для каждого набора входных данных выведите \(n\) строк. Каждая строка должна содержать три целых числа \(l\), \(r\) и \(d\), обозначающих, что для отрезка Алисы \([l, r]\) Боб выбрал число \(d\). Вы можете выводить эти строки в любом порядке. Можно показать, что ответ единственный. Не обязательно выводить пустую строку между различными входными данными. В примере эти пустые строки сделаны только для удобства. Примечание В первом примере есть только один отрезок \([1, 1]\). Алиса выбирала только один отрезок \([1, 1]\), и Боб мог выбрать только число \(1\). Во втором примере \(n = 3\). Изначально в наборе находится один отрезок \([1, 3]\). - Алиса выбирает отрезок \([1, 3]\). Боб выбирает число \(1\). Алиса добавляет в набор отрезок \([2, 3]\), и после этого хода это единственный отрезок в наборе.
- Алиса выбирает отрезок \([2, 3]\). Боб выбирает число \(3\). Алиса добавляет в набор отрезок \([2, 2]\).
- Алиса выбирает отрезок \([2, 2]\). Боб выбирает число \(2\). Игра заканчивается.
В четвертом наборе игра начинается с \(n = 5\). Изначально в наборе находится только отрезок \([1, 5]\). Ходы в игре показаны в следующей таблице. | Номер хода | Отрезок, выбранный Алисой | Число, выбранное Бобом | Набор отрезков после хода | | Перед началом | | | \( \{ [1, 5] \} \) | | 1 | \([1, 5]\) | \(3\) | \( \{ [1, 2], [4, 5] \}\) | | 2 | \([1, 2]\) | \(1\) | \( \{ [2, 2], [4, 5] \} \) | | 3 | \([4, 5]\) | \(5\) | \( \{ [2, 2], [4, 4] \} \) | | 4 | \([2, 2]\) | \(2\) | \( \{ [4, 4] \} \) | | 5 | \([4, 4]\) | \(4\) | \( \{ \} \) (пустой набор) |
| |
|
|
D. Раскраска палиндромов
Бинарный поиск
жадные алгоритмы
сортировки
Строки
*1400
У вас есть строка \(s\), состоящая из строчных букв латинского алфавита. Вы можете покрасить некоторые буквы в цвета от \(1\) до \(k\). Необязательно красить все буквы. Для каждого цвета должна быть буква, покрашенная в этот цвет. Затем вы можете сколько угодно раз менять местами любые два символа, покрашенные в один цвет. После этого будет создано \(k\) строк, \(i\)-я из них будет содержать все символы, покрашенные в цвет \(i\), записанные в порядке их следования в строке \(s\). Ваша задача покрасить символы строки так, чтобы все полученные \(k\) строк были палиндромами, а длина самой короткой из этих \(k\) строк была как можно больше. Прочтите пояснение к первому набору входных данных примера, если вам требуется пояснение к условию задачи. Напомним, что строка является палиндромом, если она читается одинаково как слева направо, так и справа налево. Например, строки abacaba, cccc, z и dxd являются палиндромами, а строки abab и aaabaa — нет. Выходные данные Для каждого набора входных данных выведите единственное целое число — максимальную длину самой короткой строки-палиндрома, которую возможно получить. Примечание - В первом наборе входных данных \(s\)=«bxyaxzay», \(k=2\). Далее будем использовать индексы в строке от \(1\) до \(8\). Подойдет следующая раскраска: \(\mathtt{\mathbf{\color{red}{b}\color{blue}{xy}\color{red}{a}\color{blue}{x}z\color{red}{a}\color{blue}{y}}}\) (буква z осталась непокрашенной). После покраски:
- поменяем местами два красных символа (с индексами \(1\) и \(4\)) местами, получим \(\mathtt{\mathbf{\color{red}{a}\color{blue}{xy}\color{red}{b}\color{blue}{x}z\color{red}{a}\color{blue}{y}}}\);
- поменяем местами два синих символа (с индексами \(5\) и \(8\)) местами, получим \(\mathtt{\mathbf{\color{red}{a}\color{blue}{xy}\color{red}{b}\color{blue}{y}z\color{red}{a}\color{blue}{x}}}\).
Теперь, если для каждого из двух цветов выписать соответствующие буквы слева направо, то получим две строки \(\mathtt{\mathbf{\color{red}{aba}}}\) и \(\mathtt{\mathbf{\color{blue}{xyyx}}}\). Обе они являются палиндромами, длина наименьшей равна \(3\). Можно показать, что большую длину наименее длинного палиндрома достичь нельзя. - Во втором наборе входных данных подойдёт такая раскраска: \([1, 1, 2, 2, 3, 3]\). Менять символы местами не нужно. Обе полученные строки равны aa, они являются палиндромами и их длина равна \(2\).
- В третьем наборе входных данных можно покрасить любой символ и взять его в строку.
- В четвёртом наборе входных данных можно покрасить \(i\)-й символ в цвет \(i\).
- В пятом наборе входных данных можно покрасить в каждый из цветов по одному символу.
- В шестом наборе входных данных подойдёт такая раскраска: \([1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 0]\). Переставим символы так, чтобы получить палиндромы abcba и acbca.
| |
|
|
B. Элементарные частицы
жадные алгоритмы
Перебор
сортировки
*1100
Марсиане активно занимаются межпланетной торговлей. А город Олимп-Сити, известный своим космодромом, давно стал местом, куда поступают товары со всех уголков Галактики. Чтобы перевозить еще больше грузов с далеких планет, марсианам необходимы быстрые космические корабли. Группа ученых как раз проводит эксперименты, чтобы построить быстрый двигатель для нового космического корабля. В текущем эксперименте участвует последовательность из \(n\) элементарных частиц, где \(i\)-я частица имеет тип \(a_i\). Назовем подотрезком последовательности частиц (\(a_1, a_2, \dots, a_n\)) последовательность (\(a_l, a_{l+1}, \dots, a_r\)) для некоторой левой границы \(l\) и правой границы \(r\) (\(1 \le l \le r \le n\)). Например, у последовательности \((1\ 4\ 2\ 8\ 5\ 7)\) ее подотрезком при \(l=2\) и \(r=4\) является последовательность \((4\ 2\ 8)\). Также скажем, что два подотрезка являются различными, если хотя бы одна из границ этих подотрезков не совпадает. Обратите внимание, что подотрезки могут быть одинаковыми как последовательности, но при этом считаться различными. Например, возьмем последовательность \((1\ 1\ 1\ 1\ 1)\) и два подотрезка: один с \(l=1\) и \(r=3\), другой — с \(l=2\) и \(r=4\). Оба подотрезка равны \((1\ 1\ 1)\), но при этом считаются различными, поскольку их левая и правая границы не совпадают. Ученые хотят провести реакцию и получить два различных подотрезка одинаковой длины. Обозначим эту длину \(k\). При этом полученная пара подотрезков должна быть гармоничной, т. е. для некоторого \(i\) (\(1 \le i \le k\)) должно оказаться так, что типы частиц на \(i\)-й позиции совпадают. Например, пара подотрезков \((1\ 7\ 3)\) и \((4\ 7\ 8)\) гармонична, т. к. у обоих подотрезков на второй позиции стоит \(7\), а пара подотрезков \((1\ 2\ 3)\) и \((3\ 1\ 2)\) — нет. Чем длиннее получатся гармоничные подотрезки, тем больше шансов, что ученые смогут сконструировать быстрый двигатель. Поэтому они попросили Вас помочь рассчитать максимальную возможную длину гармоничной пары из различных подотрезков. Выходные данные Для каждого теста выведите одно целое число — максимальную возможную длину гармоничной пары из различных отрезков. Если такой пары не существует, требуется вместо этого вывести число \(-1\). Примечание Первый пример изображен на рисунке ниже: Как видно на рисунке, можно выбрать подотрезки \((2\ 1\ 3\ 4)\) и \((3\ 1\ 5\ 2)\), которые образуют гармоничную пару. Их длина равна \(4\), поэтому ответ равен \(4\). Во втором примере можно взять два отрезка: первый — с \(l=1\) и \(r=5\), а второй — с \(l=2\) и \(r=6\). Как нетрудно видеть, эти отрезки образуют гармоничную пару и при этом считаются различными несмотря на то, что оба равны \((1\ 1\ 1\ 1\ 1)\). В третьем примере можно заметить, что гармоничный отрезок построить нельзя, и ответ равен \(-1\).
| |
|
|
D. Двоичные пауки
битмаски
Деревья
математика
реализация
сортировки
Структуры данных
*2300
На Марсе обитает необычный вид пауков — Двоичные пауки. Они плетут паутину, чтобы защищаться от врагов. Чтобы сплести паутину, пауки объединяются в пары. При этом, если у первого паука в паре \(x\) лапок, а у второго — \(y\) лапок, то у них выходит паутина прочностью \(x \oplus y\). Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Двоичные пауки живут большими группами. Сейчас Вы наблюдаете за группой из \(n\) пауков, причем \(i\)-й паук имеет \(a_i\) лапок. Когда группе пауков грозит опасность, то некоторые из них становятся защитниками. Защитники выбираются следующим образом. Во-первых, должно быть как минимум два паука-защитника. Во-вторых, любая пара из пауков-защитников должна уметь сплести паутину прочностью хотя бы \(k\). В-третьих, защитников должно быть как можно больше. Ученые долго исследовали поведение Двоичных пауков и выдвинули гипотезу, что они всегда могут выбрать защитников оптимальным образом, удовлетворяя при этом условиям выше. Вам предстоит проверить эту гипотезу на группе пауков. Для этого надо понять, сколько пауков должны стать защитниками. А поскольку Вы не являетесь Двоичным пауком, то Вы решили прибегнуть к помощи компьютера и написать программу, которая решает эту непростую задачу. Выходные данные В первой строке выведите целое число \(\ell\) (\(2 \le \ell \le n\)) — максимально возможное количество пауков-защитников. Во второй строке выведите через пробел \(\ell\) различных целых чисел \(b_i\) (\(1 \le b_i \le n\)) — номера пауков, которые станут защитниками. Если существует несколько способов выбрать защитников, то выведите любой из них. Увы, может получиться и так, что собрать защитников невозможно. В таком случае требуется вывести единственное число \(-1\). Примечание Рассмотрим пример из условия. В первом примере группа пауков выглядит следующим образом: Возьмем трех пауков: с двумя, десятью и \(16\)-ю лапками. Тогда нетрудно видеть, что каждая пара сможет сплести достаточно прочную паутину, т. к. \(2 \oplus 10 = 8 \ge 8\), \(2 \oplus 16 = 18 \ge 8\) и \(10 \oplus 16 = 26 \ge 8\). Данный вариант выбора не единственный: можно, к примеру, выбрать трех пауков с номерами \(3\), \(4\) и \(6\). Во втором примере никакая пара пауков не сможет сплести паутину прочностью \(1024\) или больше, поэтому ответ \(-1\).
| |
|
|
A. Равноудаленные буквы
Конструктив
сортировки
*800
Дана строка \(s\), состоящая из строчных латинских букв. Каждая буква встречается в ней не более двух раз. Ваша задача — переупорядочить буквы в строке так, чтобы для каждой пары букв, которые встречаются ровно дважды, расстояния между буквами в паре одинаковое. Не разрешается добавлять или удалять буквы. Можно показать, что ответ всегда существует. Если существует несколько ответов, выведите любой из них. Выходные данные На каждый набор входных данных выведите одну строке. Каждая буква должна входить в нее столько же раз, сколько и в строку \(s\). Для каждой пары букв, которые встречаются ровно дважды, расстояния между буквами в паре должно быть одинаковое. Если существует несколько ответов, выведите любой из них. Примечание В первом наборе входных данных единственная буква, которая встречается ровно дважды — это буква 'l'. Можно переупорядочить буквы как угодно, потому что расстояния не с чем сравнивать. Во втором наборе входных данных буквы, которые встречаются ровно дважды — это 'a', 'b' и 'c'. Изначально буквы 'a' находятся на расстоянии \(6\), буквы 'b' находятся на расстоянии \(4\), а буквы 'c' находятся на расстоянии \(2\). Они не одинаковые, поэтому надо буквы переупорядочить. После изменения буквы 'a' находятся на расстоянии \(2\), буквы 'b' находятся на расстоянии \(2\) и буквы 'c' находятся на расстоянии \(2\). Они одинаковые, поэтому ответ корректен. В третьем наборе входных данных нет букв, которые встречаются ровно дважды. Поэтому любой порядок подходит. В том числе оригинальная строка без изменений.
| |
|
|
B. Не садиться
жадные алгоритмы
игры
сортировки
*1300
Рахул и Тина с нетерпением ждут начала нового учебного года в колледже. Вот они заходят в учебный класс и видят, что места для студентов расположены в виде прямоугольника \(n \times m\). Место, соответствующее клетке в строке \(r\) столбце \(c\) этого прямоугольника, обозначается как \((r, c)\). Расстояние между двумя местами \((a,b)\) и \((c,d)\) вычисляется по формуле \(|a-c| + |b-d|\). Как президент класса, Тина имеет доступ к ровно \(k\) ведрам розовой краски. Далее происходит следующий процесс. - Сначала Тина выбирает ровно \(k\) мест в классе, чтобы покрасить их розовой краской. Одним ведром краски можно покрасить ровно одно место.
- После того как Тина покрасит \(k\) мест в розовый цвет, Рахул выбирает, где ему сесть. Он не выберет место, покрашенное в розовый цвет, так как он очень не любит розовый.
- После того, как Рахул выберет свое место, Тина выбирает место для себя. Она может выбрать любое место, покрашенное или нет, за исключением того места, которое выбрал Рахул.
Рахул хочет выбрать место так, чтобы он сидел как можно ближе к Тине. Однако Тина хочет сидеть как можно дальше от Рахула из-за сложной истории отношений, которую мы решили не добавлять в условие задачи. Теперь Рахул задается вопросом: для \(k = 0, 1, \dots, n \cdot m - 1\), если у Тины есть \(k\) ведер с краской, насколько близко Рахул может сидеть к Тине, если и Рахул, и Тина знают о намерениях друг друга и оба действуют оптимально? Пожалуйста, помогите удовлетворить любопытство Рахула! Выходные данные Для каждого набора входных данных выведите \(n \cdot m\) целых чисел — расстояние между Рахулом и Тиной, если они оба действуют оптимально для каждого \(k \in [0, n \cdot m - 1]\). Примечание Одна из возможных последовательностей выбора для первого набора входных данных, где у Тины есть \(k=3\) ведра с красками, выглядит следующим образом. Тина красит места в позициях \((1, 2)\), \((2, 2)\), \((3, 2)\) розовой краской. Рахул выбирает место \((3, 1)\), после чего Тина выбирает место \((1, 3)\). Следовательно, расстояние между Тиной и Рахулом равно \(|3-1| + |1-3| = 4\). Мы можем доказать, что это действительно минимально возможное расстояние при заданных ограничениях. Могут быть и другие варианты мест, которые также приводят к тому же ответу. При \(k=0\) в первом наборе входных данных Рахул может решить сесть на \((2, 2)\), а Тина может сесть на \((4, 3)\), так что расстояние между ними будет \(|2 - 4| + |2 - 3| = 3\). Ниже приведены изображения случаев \(k=3\) и \(k=0\) для первого набора входных данных. Возможная рассадка при \(k=3\). Возможная рассадка при \(k=0\).
| |
|
|
F. Управление кризисом космических кораблей
Бинарный поиск
геометрия
сортировки
Структуры данных
*3500
NASA (Норвежская ассоциация астронавтов) разрабатывает новую систему управления космических кораблей. Но в нынешнем состоянии было бы небезопасно, если бы космический корабль оказался в кучке космического мусора. Чтобы система рулевого управления была безопасной, им необходимо ответить на следующее: Для целевой позиции \(t = (0, 0)\), набора из \(n\) кусков космического мусора \(l\), описанного отрезками \(l_i = ((a_{ix}, a_{iy}), (b_{ix}, b_{iy}))\) и начальной позиции \(s = (s_x, s_y)\), определите существует ли такое направление, что плавание в этом направлении из начальной позиции приведет к целевой позиции. Когда космический корабль сталкивается с куском космического мусора, то, что происходит дальше, зависит от абсолютной разницы углов между направлением плавания и отрезком космического мусора, \(\theta\): - Если \(\theta < 45^{\circ}\), то космический корабль скользит по куску космического мусора в направлении, минимизирующем изменение угла, а когда космический корабль оказывается на краю космического мусора, он продолжает двигаться в том же направлении как и до столкновения.
- Если \(\theta \ge 45^{\circ}\), то космический корабль останавливается, потому что трение слишком велико, чтобы скользить по космическому мусору.
Вам дается набор кусочков космического мусора только один раз, целевая позиция всегда \((0, 0)\), но есть \(q\) запросов, каждый с начальной позицией \(s_j = (s_{jx}, s_{jy})\). Ответьте на приведенный выше вопрос для каждого запроса. Выходные данные На каждый запрос \(s_j\) выведите ответ. Если существует такое направление, что плавание от \(s_j\) в этом направлении, возможно, скользя по некоторым частям космического мусора, приводит к \(t\), выведите «YES». В противном случае выведите «NO» (без учета регистра). Примечание 
Синий крест представляет собой целевое местоположение, а другие отрезки синей линии представляют космический мусор. Зеленые точки обозначают начальные местоположения, где ответ положительный, а красные точки обозначают начальные местоположения, где ответ отрицательный. Желтые линии — это возможные пути к целевому местоположению для запросов \(3\) и \(14\). Черная линия — это возможный путь от начального местоположения в запросе \(6\), но он немного не попадает в целевое местоположение.
| |
|
|
A. Скачивание оперативной памяти
жадные алгоритмы
Перебор
сортировки
*800
А вы знали, что вы можете скачать дополнительную оперативную память? Есть магазин с \(n\) разными программами, каждая из которых увеличивает вашу оперативную память (ОЗУ). \(i\)-й программе, увеличивающей ОЗУ, требуется \(a_i\) гигабайт памяти, чтобы выполниться (память занимается временно, как только программа завершит работу, память снова освободится), и после ее использования она увеличит вашу ОЗУ на \(b_i\) гигабайт (навсегда). Каждая программа может быть использована не более одного раза. Изначально у вашего компьютера \(k\) гигабайт оперативной памяти. Заметьте, что вы не можете использовать программу, увеличивающую ОЗУ, если ей требуется больше гигабайт оперативной памяти, чем есть у вашего компьютера в момент запуска. Вы можете использовать программы, увеличивающие ОЗУ, в любом порядке. Для вас ОЗУ — самая важная вещь на свете, и поэтому вам очень интересно узнать, какое максимальное количество гигабайт ОЗУ вы сможете получить? Выходные данные Для каждого тестового примера выведите одну строку, содержащую максимально-возможный объем оперативной памяти. Примечание В первом наборе входных данных изначально у вас достаточно оперативной памяти только для запуска третьей программы, и после ее использования ваша оперативная память увеличится до \(20\) гигабайт, что позволит вам использовать первую программу и увеличить объем оперативной памяти до \(29\) гигабайт. Единственная оставшаяся программа требует \(30\) гигабайт ОЗУ и ее нельзя будет использовать. Во втором наборе входных данных вы можете использовать все программы кроме третьей, которые требуют всего \(1\) гигабайт для запуска, чтобы увеличить объем ОЗУ до \(5\) гигабайт, а затем использовать третью программу, чтобы увеличить объем ОЗУ до \(6\) гигабайт. В третьем наборе входных данных каждая программа требует более \(1\)-го гигабайта ОЗУ для запуска, поэтому объем имеющейся у вас оперативной памяти останется равным \(1\) гигабайту.
| |
|
|
C. Конвейер
сортировки
*2100
Антон попал в цех по производству конфет. Он обнаружил в нем работающий конвейер и решил пробежать по нему от начала до конца. Конвейер представляет собой закольцованную ленту общей длиной 2l метров, из которых l метров находятся на поверхности и представляют собой прямую полосу. Часть ленты, которая в каждый момент времени поворачивает (выныривает из-под пола на поверхность и уходит обратно), будем считать пренебрежимо короткой. Лента двигается равномерно со скоростью v1 метров в секунду. Антон будет двигаться по ней в том же направлении с постоянной скоростью v2 метров в секунду, то есть относительно пола он будет двигаться со скоростью v1 + v2 метров в секунду. Останавливаться или менять скорость или направление движения Антон не будет. Кое-где к ленте прилипли конфеты (n штук). Они двигаются вместе с лентой, не отлипая от неё. Антон заинтересован в конфетах, но в движении вперёд он заинтересован больше. Поэтому он соберёт все конфеты, мимо которых будет пробегать, но не больше. Если конфета находится в начале полосы в момент, когда Антон начинает бег, то он её возьмет, а если находится в конце полосы в момент, когда Антон сойдёт с конвейера — он оставит её. На рисунке изображен пример с двумя конфетами. Одна расположена в позиции a1 = l - d и находится сейчас на верхней половине ленты, вторая в позиции a2 = 2l - d и находится сейчас на нижней половине ленты. Известно, что относительно начального положения ленты конфеты расположены в точках 0 ≤ a1 < a2 < ... < an < 2l. Положения на ленте от 0 до l соответствуют верхней, а от l до 2l — нижней половине ленты (см. пример). Все координаты заданы в метрах. Антон начнет бег по полосе в случайный момент времени. Это означает, что все возможные положения ленты в момент начала бега равновероятны. Определите для каждого i от 0 до n вероятность того, что Антон соберёт ровно i конфет. Выходные данные Выведите n + 1 число (по одному на строку): вероятности того, что Антон соберёт ровно i конфет, для каждого i от 0 (первая строка) до n (последняя). Ответ будет считаться верным, если каждое число будет иметь абсолютную или относительную погрешность не более 10 - 9. Примечание В первом тестовом примере Антон сможет взять конфету, если в момент начала бега её координата менее 0.5; если же координата конфеты в момент начала бега не менее 0.5, то забрать конфету не получится. Так как все положения ленты равновероятны, то вероятность забрать конфету равна , а вероятность не забрать её равна .
| |
|
|
C. Раскрась середину
дп
жадные алгоритмы
сортировки
*2200
Дано \(n\) элементов, пронумерованных от \(1\) до \(n\). Элемент \(i\) имеет значение \(a_i\) и цвет \(c_i\). Изначально \(c_i = 0\) для всех \(i\). Можно выполнять следующую операцию: - Выбрать три элемента \(i\), \(j\) и \(k\) (\(1 \leq i < j < k \leq n\)) такие, что \(c_i\), \(c_j\) и \(c_k\) равны \(0\) и \(a_i = a_k\), и затем присвоить \(c_j = 1\).
Найдите максимальное значение \(\sum\limits_{i=1}^n{c_i}\), которое можно получить, выполнив описанную операцию некоторое (любое) количество раз. Выходные данные Напечатайте одно целое число — максимальное значение \(\sum\limits_{i=1}^n{c_i}\), которое можно получить, выполнив описанную операцию некоторое (любое) количество раз. Примечание В первом примере одним из возможных решений является выполнение следующих операций:
| |
|
|
E. Запросы об остовном дереве
Бинарный поиск
графы
Деревья
жадные алгоритмы
математика
поиск в глубину и подобное
снм
сортировки
Структуры данных
*2400
Задан связный взвешенный неориентированный граф, состоящий из \(n\) вершин и \(m\) ребер. К нему задаются \(k\) запросов. Каждый запрос состоит из одного целого числа \(x\). На каждый запрос вы должны выбрать остовное дерево в графе. Пусть веса его ребер будут \(w_1, w_2, \dots, w_{n-1}\). Стоимость остовного дерева равна \(\sum \limits_{i=1}^{n-1} |w_i - x|\) (сумма абсолютных разностей между весами и \(x\)). Ответ на запрос — это минимальная стоимость остовного дерева. Запросы даны в сжатом формате. Первые \(p\) \((1 \le p \le k)\) запросов \(q_1, q_2, \dots, q_p\) даны явно. Для запросов с \(p+1\) по \(k\) выполняется \(q_j = (q_{j-1} \cdot a + b) \mod c\). Выведите исключающее или ответов на все запросы. Выходные данные Выведите одно целое число — исключающее или ответов на все запросы. Примечание Запросы в первом примере: \(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0\). Ответы: \(11, 9, 7, 3, 1, 5, 8, 7, 5, 7, 11\). Запросы во втором примере: \(3, 0, 2, 1, 6, 0, 3, 5, 4, 1\). Ответы: \(14, 19, 15, 16, 11, 19, 14, 12, 13, 16\). Запросы в третьем примере: \(75, 0, 0, \dots\). Ответы: \(50, 150, 150, \dots\).
| |
|
|
E. Автомобили
2-sat
графы
жадные алгоритмы
Конструктив
поиск в глубину и подобное
снм
сортировки
*2200
На координатной оси \(OX\) стоят \(n\) автомобилей. Каждая машина изначально находится в целочисленной точке, и никакие две машины не находятся в одной и той же точке. Кроме того, каждая машина ориентирована либо влево, либо вправо, и в любой момент они могут двигаться с любой постоянной положительной скоростью в этом направлении. Более формально мы можем описать \(i\)-й автомобиль буквой и целым числом: его ориентацию \(ori_i\) и его местоположение \(x_i\). Если \(ori_i = L\), то \(x_i\) убывает со временем. Точно так же, если \(ori_i = R\), то \(x_i\) увеличивается со временем. Мы называем две машины нерелевантными, если они никогда не оказываются в одной и той же точке независимо от их скорости. Другими словами, они не будут иметь одну и ту же координату в любой момент. Мы называем два автомобиля предназначенными, если они когда-нибудь окажутся в одной и той же точке независимо от их скорости. К сожалению, мы потеряли всю информацию о наших машинах, но мы помним \(m\) отношений между ними. Существует два типа отношений: \(1\) \(i\) \(j\) —\(i\)-й автомобиль и \(j\)-й автомобиль нерелевантные. \(2\) \(i\) \(j\) —\(i\)-й автомобиль и \(j\)-й автомобиль предназначенные. Восстановите ориентации и местоположения автомобилей, удовлетворяющих отношениям, или сообщите, что это невозможно. Если решений несколько, можно вывести любое. Обратите внимание на то, что если два автомобиля окажутся в одной точке, то они продолжат свое движение. Выходные данные В первой строке выведите «YES», если можно восстановить ориентации и положения автомобилей, удовлетворяющих отношениям, и «NO» в противном случае. Если ответ «YES», выведите \(n\) строк, каждая из которых содержит символ и целое число: \(ori_i\) и \(x_i\) \((ori_i \in \{L, R\}; -10^9 \leq x_i \leq 10^9)\) — представляет информацию о \(i\)-м автомобиле. Если ориентация налево, то \(ori_i\) = \(L\). В противном случае \(ori_i\) = \(R\). \(x_i\) — координата, где находится \(i\)-й автомобиль. Обратите внимание, что все \(x_i\) должны быть различными. Мы можем доказать, что если существует решение, то должно быть и решение, удовлетворяющее ограничениям на \(x_i\).
| |
|
|
A. Сортировка частей
Перебор
сортировки
*800
Дан массив \(a\) длины \(n\). Вы можете ровно один раз выбрать число \(len\) от \(1\) до \(n - 1\) включительно, а затем отдельно отсортировать по неубыванию префикс массива длины \(len\) и суффикс массива длины \(n - len\). Например, если массив \(a = [3, 1, 4, 5, 2]\), и вы выбрали \(len = 2\), то после этого массив станет равен \([1, 3, 2, 4, 5]\). Может ли оказаться так, что после выполнения этой операции массив окажется не отсортирован по неубыванию? Выходные данные Для каждого набора входных данных выведите «YES» (без кавычек), если массив может оказаться не отсортирован по неубыванию, выведите «NO» (без кавычек) в противном случае. Вы можете выводить каждую букву в любом регистре (верхнем или нижнем). Примечание В первом наборе входных данных можно выбрать \(len = 1\), тогда после операции массив будет не отсортирован по неубыванию и равен \([2, 1, 2]\). Во втором наборе входных данных можно выбрать \(len = 3\), тогда после операции массив будет не отсортирован по неубыванию и равен \([1, 2, 3, 1]\). В третьем наборе входных данных для всех \(len\) получится отсортированный по неубыванию массив.
| |
|
|
H. Минимизируй количество инверсий
жадные алгоритмы
математика
сортировки
Структуры данных
*3500
Дана перестановка \(p\) длины \(n\). Можно выбрать любую её подпоследовательность, удалить её из перестановки и приписать в начало перестановки в том же порядке. Для каждого \(k\) от \(0\) до \(n\) найдите минимальное количество инверсий в перестановке, которое можно получить, выбрав подпоследовательность длины ровно \(k\). Выходные данные Для каждого набора выведите \(n + 1\) число, где \(i\)-е число — ответ на задачу для длины подпоследовательности, равной \(i - 1\). Примечание Во втором наборе: - Для длины \(0\): \([4, 2, 1, 3] \rightarrow [4, 2, 1, 3]\): \(4\) инверсии.
- Для длины \(1\): \([4, 2, \mathbf{1}, 3] \rightarrow [1, 4, 2, 3]\): \(2\) инверсии.
- Для длины \(2\): \([4, \mathbf{2}, \mathbf{1}, 3] \rightarrow [2, 1, 4, 3]\) или \([4, 2, \mathbf{1}, \textbf{3}] \rightarrow [1, 3, 4, 2]\): \(2\) инверсии.
- Для длины \(3\): \([4, \mathbf{2}, \mathbf{1}, \mathbf{3}] \rightarrow [2, 1, 3, 4]\): \(1\) инверсия.
- Для длины \(4\): \([\mathbf{4}, \mathbf{2}, \mathbf{1}, \mathbf{3}] \rightarrow [4, 2, 1, 3]\): \(4\) инверсии.
| |
|
|
B. Сортировка нечётными обменами
математика
сортировки
Структуры данных
*1100
Вам дан массив \(a_1, a_2, \dots, a_n\). Вы можете выполнять операции с массивом. За одну операцию вы можете выбрать целое число \(i\) (\(1 \le i < n\)) и поменять местами \(a_i\) и \(a_{i+1}\) в массиве, если \(a_i + a_{i+1}\) нечётно. Определите, можно ли его отсортировать в неубывающем порядке, используя эти операции любое количество раз. Выходные данные Для каждого набора входных данных выведите «Yes» или «No» в зависимости от того, можете ли вы или нет отсортировать данный массив. Вы можете выводить каждую букву в любом регистре (например, «YES», «Yes», «yes», «yEs» будут распознаны как положительный ответ). Примечание В первом наборе входных данных мы можем просто поменять местами \(31\) и \(14\) (\(31 + 14 = 45\), что нечётно) и получить неубывающий массив \([1,6,14,31]\). Во втором наборе входных данных единственным способом отсортировать массив является поменять местами \(4\) и \(2\), но это невозможно, поскольку их сумма \(4 + 2 = 6\) является чётной. В третьем наборе входных данных мы не можем сделать последовательность неубывающей. В четвёртом наборе входных данных массив уже является неубывающим.
| |
|
|
A. Великая последовательность
жадные алгоритмы
Перебор
сортировки
*1200
Последовательность положительных целых чисел называется великой для заданного положительного целого числа \(x\), если ее элементы можно разбить на пары так, что одно из чисел в паре при умножении на \(x\) будет равно другому числу в паре. Более формально, последовательность \(a\) длины \(n\) великая для заданного числа \(x\), если \(n\) четно и существует такая перестановка \(p\) размера \(n\), что для любого \(i\) (\(1 \le i \le \frac{n}{2}\)) выполняется, что \(a_{p_{2i-1}} \cdot x = a_{p_{2i}}\). У Стаса есть последовательность положительных целых чисел \(a\) и положительное целое число \(x\). Помогите ему сделать последовательность великой: найдите минимальное количество положительных целых чисел, которое можно приписать к последовательности \(a\), чтобы она стала великой для числа \(x\). Выходные данные Для каждого набора входных данных выведите минимальное количество положительных целых чисел, которое можно добавить к последовательности \(a\), чтобы она стала великой для числа \(x\). Примечание В первом наборе входных данных последовательность уже является великой для числа \(4\), потому что числа можно разбить на пары \((1, 4)\), \((4, 16)\). Поэтому можно добавить \(0\) чисел. Во втором наборе входных данных можно добавить числа \(1\) и \(14\) к последовательности, тогда получившиеся \(8\) чисел можно разбить на пары \((1, 2)\), \((1, 2)\), \((2, 4)\), \((7, 14)\). Меньше чем \(2\) числа добавить невозможно.
| |
|
|
B. Расшифровка повторяшек
Конструктив
реализация
сортировки
*2000
У Оли есть массив целых чисел \(a_1, a_2, \ldots, a_n\). Оля хочет разбить его на тандемные повторы. Так как это не всегда возможно, перед разбиением она хочет несколько (возможно, ноль) раз вставить в произвольное место пару одинаковых чисел. Помогите ей! Более формально: - Тандемным повтором называется любая последовательность \(x\) четной длины \(2k\) такая, что для всех \(1 \le i \le k\) выполнено, что \(x_i = x_{i + k}\).
- Массив \(a\) разбивается на тандемные повторы, если его можно разбить на несколько частей, каждая из которых является тандемным повтором.
- Оля может несколько раз выбрать произвольное целое число \(c\) и вставить \([c, c]\) в произвольное место массива (в самом начале, между какими-то двумя числами, или в самом конце).
- Вам необходимо сделать некоторое количество вставок и затем разбить массив на тандемные повторы, или сообщить, что это невозможно. Обратите внимание, что от вас не требуется минимизировать количество вставок.
Выходные данные Для каждого набора входных данных выведите ответ в следующем формате. Если операциями вставки двух равных чисел нельзя превратить массив в конкатенацию тандемных повторов, выведите единственное целое число \(-1\). Иначе выведите количество вставок \(q\) (\(0 \le q \le 2 \cdot n^2\)) в вашем решении. Далее выведите описание вставок. В каждой из следующих \(q\) строк выведите два целых числа \(p\) и \(c\) (\(1 \le c \le 10^9\)), которые означают, что после \(p\) чисел с начала массива вставляется число \(c\) два раза подряд. Если перед этим действием длина массива была \(m\), то должно быть выполнено \(0 \le p \le m\). Далее вам нужно вывести любое разбиение итогового массива на тандемные повторы. Сначала выведите целое число \(d\), а на следующей строке выведите последовательность четных целых чисел \(t_1, t_2, \ldots, t_d\) размера \(d\) (\(d, t_i \ge 1\)). Это длины подотрезков, являющихся тандемными повторами, на которые можно разбить получившийся массив после всех операций. Заметим, что после всех действий длина массива \(a\) будет равна \(m = n + 2 \cdot q\). Должны выполняться следующие условия: - \(m = \sum\limits_{i = 1}^{d}{t_i}\).
- Для всех целых \(i\) таких, что \(1 \le i \le d\), последовательность \(a_l, a_{l+1}, \ldots, a_r\) является тандемным повтором, где \(l = \sum\limits_{j = 1}^{i - 1}{t_j} + 1\), \(r = l + t_i - 1\).
Можно показать, что если решение существует, то существует решение, которое удовлетворяет заданным ограничениям. Если существует несколько возможных ответов, вы можете вывести любой. Примечание В первом наборе входных данных невозможно вставками двух равных чисел подряд массив, который является конкатенацией тандемных повторов. Во втором наборе входных данных массив уже является тандемным повтором \([5, 5] = \underbrace{([5] + [5])}_{t_1 = 2}\), поэтому мы можем не делать никаких вставок. В третьем наборе входных данных у нас изначально следующий массив: \(\)[1, 3, 1, 2, 2, 3].\(\) После первого действия вставки с \(p = 1, c = 3\): \(\)[1, \textbf{3, 3}, 3, 1, 2, 2, 3].\(\) После второго действия вставки с \(p = 5, c = 3\): \(\)[1, 3, 3, 3, 1, \textbf{3, 3}, 2, 2, 3].\(\) После третьего действия вставки с \(p = 5, c = 3\): \(\)[1, 3, 3, 3, 1, \textbf{3, 3}, 3, 3, 2, 2, 3].\(\) После четвертого действия вставки с \(p = 10, c = 3\): \(\)[1, 3, 3, 3, 1, 3, 3, 3, 3, 2, \textbf{3, 3}, 2, 3].\(\) Итоговый массив можно представить как конкатенацию двух тандемных повторов: \(\)\underbrace{([1, 3, 3, 3] + [1, 3, 3, 3])}_{t_1 = 8} + \underbrace{([3, 2, 3] + [3, 2, 3])}_{t_2 = 6}.\(\) В четвёртом наборе входных данных у нас изначально следующий массив: \(\)[3, 2, 1, 1, 2, 3].\(\) После первого действия вставки с \(p = 0, c = 3\): \(\)[\textbf{3, 3}, 3, 2, 1, 1, 2, 3].\(\) После второго действия вставки с \(p = 8, c = 3\): \(\)[3, 3, 3, 2, 1, 1, 2, 3, \textbf{3, 3}].\(\) После третьего действия вставки с \(p = 5, c = 3\) \(\)[3, 3, 3, 2, 1, \textbf{3, 3}, 1, 2, 3, 3, 3].\(\) После четвертого действия вставки с \(p = 6, c = 2\): \(\)[3, 3, 3, 2, 1, 3, \textbf{2, 2}, 3, 1, 2, 3, 3, 3].\(\) После пятого действия вставки с \(p = 7, c = 1\): \(\)[3, 3, 3, 2, 1, 3, 2, \textbf{1, 1}, 2, 3, 1, 2, 3, 3, 3].\(\) Итоговый массив можно представить как конкатенацию тандемных повторов: \(\)\underbrace{([3] + [3])}_{t_1 = 2} + \underbrace{([3, 2, 1] + [3, 2, 1])}_{t_2 = 6} + \underbrace{([1, 2, 3] + [1, 2, 3])}_{t_3 = 6} + \underbrace{([3] + [3])}_{t_4 = 2}.\(\)
| |
|
|
C. Анонимность наше все
Бинарный поиск
жадные алгоритмы
Перебор
снм
сортировки
Структуры данных
*2200
В работе врача важно сохранять анонимность своих клиентов и результатов анализов. Результаты теста отправляются каждому лично по электронной почте, но люди очень нетерпеливые и им хочется узнавать результаты сразу. Именно поэтому в одном центре для сдачи анализов «Девитро» придумали экспериментальный способ сообщать результаты. Пусть всего анализы сдавало \(n\) человек в порядке очереди. Тогда главврач Стас может сделать несколько сообщений, в каждом из которых сообщить, был ли больной человек среди людей в очереди от \(l\)-го до \(r\)-го (включительно) для некоторых значений \(l\) и \(r\). В процессе Стас будет проверять, насколько хорошо работает эта схема, и будет интересоваться, можно ли однозначно узнать результат анализа \(i\)-го человека по уже сообщенной информации. И если это сделать можно, то болен ли этот человек. Помогите Стасу протестировать свою схему. Выходные данные После каждого вопроса Стаса (запроса с \(t = 1\)) выведите: - «NO», если пациент однозначно не болен,
- «YES», если пациент однозначно болен,
- «N/A», если по имеющейся информации нельзя однозначно сказать, болен пациент или нет.
Примечание В первом тесте для первых пяти запросов: - Изначально Стас сообщает, что среди \(4\), \(5\) людей нет больных.
- В следующем запросе Стас интересуется конфиденциальностью человека \(5\). Из предыдущего запроса мы знаем, что он однозначно не болен.
- В следующем запросе Стас интересуется конфиденциальностью человека \(6\). Мы не знаем про него вообще никакой информации, поэтому он может быть как болен, так и не болен.
- Затем Стас сообщает, что среди \(4\), \(5\), \(6\) людей есть больной.
- В следующем запросе Стас интересуется конфиденциальностью человека \(6\). Теперь мы можем однозначно сказать, что он болен, потому что из предыдущего запроса среди трех человек болен мог быть только он.
| |
|
|
B. Качество против количества
жадные алгоритмы
Конструктив
Перебор
сортировки
*800
\( \def\myred#1{\color{red}{\underline{\bf{#1}}}} \def\myblue#1{\color{blue}{\overline{\bf{#1}}}} \) \(\def\RED{\myred{\unicode{1050}\unicode{1088}\unicode{1072}\unicode{1089}\unicode{1085}\unicode{1099}\unicode{1081}}} \def\BLUE{\myblue{\unicode{1057}\unicode{1080}\unicode{1085}\unicode{1080}\unicode{1081}}}\) Вам дана последовательность из \(n\) неотрицательных целых чисел \(a_1, a_2, \ldots, a_n\). Изначально все элементы непокрашены. Вы можете покрасить каждое число в \(\RED\) или \(\BLUE\) (но не в оба) или оставить его непокрашенным. Обозначим за \(\text{Count}(c)\) количество элементов последовательности, покрашенных в \(c\), а за \(\text{Sum}(c)\) — сумму этих чисел. Например, если данная последовательность равна \([2, 8, 6, 3, 1]\), и она покрашена следующим образом: \([\myblue{2}, 8, \myred{6}, \myblue{3}, 1]\) (где \(6\) покрашена красным, \(2\) и \(3\) покрашены синим, \(1\) и \(8\) непокрашены), то \(\text{Sum}(\RED)=6\), \(\text{Sum}(\BLUE)=2+3=5\), \(\text{Count}(\RED)=1\) и \(\text{Count}(\BLUE)=2\). Определите, можно ли покрасить последовательность так, чтобы \(\text{Sum}(\RED) > \text{Sum}(\BLUE)\) и \(\text{Count}(\RED) < \text{Count}(\BLUE)\). Выходные данные Для каждого набора входных данных выведите YES, если возможно раскрасить данную последовательность, удовлетворив заданные ограничения, и NO в противном случае. Вы можете выводить YES и NO в любом регистре (например, строки yEs, yes, Yes и YES будут считаться положительным ответом). Примечание В первом примере нет способа раскрасить элементы заданным образом. Например, если раскрасить последовательность следующим образом: \([\myblue{1},\myblue{2},\myred{3}]\) (где \(3\) покрашена красным, \(1\) и \(2\) покрашены синим), то \(\text{Count}(\RED)=1 < \text{Count}(\BLUE)=2\), но \(\text{Sum}(\RED)=3 \ngtr \text{Sum}(\BLUE)=3\). Поэтому это не является корректным способом раскрасить последовательность. Во втором примере один из возможных способов раскрасить последовательность показан в условии. Легко видеть, что \(\text{Sum}(\RED)=6 > \text{Sum}(\BLUE)=5\), а также \(\text{Count}(\RED)=1 < \text{Count}(\BLUE)=2\). В третьем примере можно показать, что нет способа раскрасить последовательность правильным образом. Например, если раскрасить последовательность следующим образом: \([\myred{3},\myred{5},\myblue{4}, \myblue{2}]\) (где \(3\) и \(5\) покрашены красным, \(4\) и \(2\) покрашены синим), то \(\text{Sum}(\RED) = 8 > \text{Sum}(\BLUE) = 6\), но \(\text{Count}(\RED) = 2 \nless \text{Count}(\BLUE) = 2\). Поэтому это не является корректным способом раскрасить последовательность. В четвертом примере можно показать, что нет способа раскрасить последовательность правильным образом.
| |
|
|
A. Странная сумма
геометрия
Комбинаторика
математика
матрицы
сортировки
Структуры данных
*1400
У Егора есть табличка \(n \times m\), где строки пронумерованы от \(1\) до \(n\) сверху вниз, а столбцы пронумерованы с \(1\) до \(m\) слева направо. Каждая клетка таблички покрашена в некоторый цвет, где цвета пронумерованы целыми числами от \(1\) до \(10^5\). Будем обозначать клетку, которая находится на пересечении \(r\)-й строки и \(c\)-го столбца, как \((r, c)\). Определим манхэттенское расстояние между клетками \((r_1, c_1)\) и \((r_2, c_2)\) как длину кратчайшего пути между этими клетками, в котором любые две соседние клетки имеют общую сторону. Например, в таблице \(3 \times 4\) манхэттенское расстояние между клетками \((1, 2)\) и \((3, 3)\) равно \(3\), и один из кратчайших путей имеет вид \((1, 2) \to (2, 2) \to (2, 3) \to (3, 3)\). Обратите внимание, что путь может проходить по клеткам любого цвета. У Егора возникло желание посчитать сумму манхэттенских расстояний по всем парам клеток одного цвета. Помогите Егору — вычислите эту сумму. Выходные данные Выведите одно число — искомую сумму. Примечание В первом примере есть три пары клеток с одинаковым цветом: в координатах \((1, 1)\) и \((2, 3)\), в координатах \((1, 2)\) и \((2, 2)\), в координатах \((1, 3)\) и \((2, 1)\). Соответствующие манхеттенские расстояния равны \(3\), \(1\) и \(3\), их сумма равна \(7\).
| |
|
|
C. Вес системы вложенных отрезков
жадные алгоритмы
реализация
сортировки
хэши
*1200
На числовой прямой заданы \(m\) точек, \(i\)-я из которых имеет координату \(x_i\) и целочисленный вес \(w_i\). Координаты всех точек различны, точки пронумерованы от \(1\) до \(m\). Последовательность из \(n\) отрезков \([l_1, r_1], [l_2, r_2], \dots, [l_n, r_n]\) называется системой вложенных отрезков, если для каждой пары \(i, j\) (\(1 \le i < j \le n\)) выполнено \(l_i < l_j < r_j < r_i\). Другими словами, второй отрезок находится строго внутри первого, третий отрезок находится строго внутри второго, и так далее. Для заданного числа \(n\) найдите такую систему вложенных отрезков, что: - оба конца каждого из отрезков являются одной из \(m\) заданных точек;
- сумма весов \(2\cdot n\) точек, которые использованы в качестве концов отрезков, минимальна.
Например, пусть \(m = 8\). Заданные точки отмечены на рисунке, их веса выделены красным цветом, координаты — синим. Составим систему из трёх вложенных отрезков: - вес первого отрезка: \(1 + 1 = 2\)
- вес второго отрезка: \(10 + (-1) = 9\)
- вес третьего отрезка: \(3 + (-2) = 1\)
- сумма весов всех отрезков в системе: \(2 + 9 + 1 = 12\)
Система из трёх вложенных отрезков Выходные данные Для каждого набора входных данных выведите \(n + 1\) строку: в первой из них выведите вес составленной системы, а в последующих \(n\) строках ровно по два числа — номера точек, являющихся границами отрезка с номером \(i\) (\(1 \le i \le n\)). Порядок вывода концов отрезка не важен — вы можете вывести как сначала левый, а затем правый конец, так и наоборот. Если способов составить систему вложенных отрезков с минимальным весом несколько, выведите любой из них. Примечание Первый набор входных данных совпадает с примером из условия. Можно показать, что вес составленной системы является минимальным. Во втором наборе входных данных есть всего \(6\) точек, поэтому необходимо использовать каждую из них, чтобы составить \(3\) отрезка.
| |
|
|
E. Перенос экзамена
Бинарный поиск
жадные алгоритмы
математика
реализация
сортировки
Структуры данных
*1900
Сейчас у Дмитрия сессия, и он должен сдать \(n\) экзаменов. Сессия начинается в день \(1\) и длится \(d\) дней. \(i\)-й экзамен пройдёт в день \(a_i\) (\(1 \le a_i \le d\)), все \(a_i\) — различны. Пример, где \(n=3\), \(d=12\), \(a=[3,5,9]\). Оранжевым — дни сдачи экзамена. Перед первым экзаменом Дмитрий отдохнёт \(2\) дня, перед вторым он отдохнёт \(1\) день и перед третьим он отдохнёт \(3\) дня. Для расписания сессии Дмитрий считает специальную величину \(\mu\) — наименьшее из времен отдыха перед экзаменом по всем экзаменам. Например, для картинки выше \(\mu=1\). Иными словами, для расписания он подсчитывает ровно \(n\) чисел — сколько дней он отдыхает между экзаменом сдачей экзамена \(i-1\) и \(i\) (для \(i=0\) между началом сессии и сдачей экзамена \(i\)). Затем он находит \(\mu\) — минимум среди этих \(n\) чисел. Дмитрий считает, что может улучшить предложенное расписание сессии. Он может попросить изменить дату одного экзамена (изменить одно произвольное значение \(a_i\)). Помогите ему поменять дату так, чтобы все \(a_i\) остались различны, а значение \(\mu\) было как можно больше. Например, для рассмотренного выше расписания Дмитрию наиболее выгодно перенести второй экзамен на самый конец сессии. Новое расписание примет вид: Теперь длительности отдыхов перед экзаменами равны \([2,2,5]\). Следовательно, \(\mu=2\). Дмитрий может оставить предложенное расписание без изменений (если не существует способа передвинуть один экзамен так, что это приведёт к улучшению ситуации). Выходные данные Для каждого набора входных данных выведите максимальное возможное значение \(\mu\), если Дмитрий может перенести один любой экзамен на произвольный день. Все значения \(a_i\) должны остаться различны. Примечание Первый пример разобран в условии. Одно из оптимальных изменений расписаний для второго примера: Изначальное расписание.
Новое расписание
В третьем примере необходимо передвинуть экзамен с дня \(1\) на любой день от \(4\) до \(100\). В четвёртом примере любое изменение расписания только уменьшит \(\mu\), соответственно расписание нужно оставить исходным. В пятом примере необходимо перенести экзамен с дня \(1\) на любой день от \(100000000\) до \(300000000\). Одно из оптимальных изменений расписаний для шестого примера: Изначальное расписание.
Новое расписание
В седьмом примере каждый день занят экзаменами и перестроить расписание невозможно.
| |
|
|
A. Хорошие пары
математика
сортировки
*800
Вам дан массив \(a_1, a_2, \ldots, a_n\) из положительных целых чисел. Хорошая пара — это пара индексов \((i, j)\) с \(1 \leq i, j \leq n\) такая, что для всех \(1 \leq k \leq n\) выполняется следующее равенство: \(\) |a_i - a_k| + |a_k - a_j| = |a_i - a_j|, \(\) где \(|x|\) обозначает модуль числа \(x\). Найдите хорошую пару. Обратите внимание, что \(i\) может быть равно \(j\). Выходные данные Для каждого набора входных данных выведите в одной строке два целых индекса \(i\) и \(j\), разделенных пробелами, которые составляют хорошую пару массива. Случай \(i=j\) допустим. Можно показать, что такая пара всегда существует. Если хороших пар несколько, выведите любую из них. Примечание В первом случае при \(i = 2\) и \(j = 3\) справедливо равенство для всех \(k\): - \(k = 1\): \(|a_2 - a_1| + |a_1 - a_3| = |2 - 5| + |5 - 7| = 5 = |2 - 7| = |a_2-a_3|\),
- \(k = 2\): \(|a_2 - a_2| + |a_2 - a_3| = |2 - 2| + |2 - 7| = 5 = |2 - 7| = |a_2-a_3|\),
- \(k = 3\): \(|a_2 - a_3| + |a_3 - a_3| = |2 - 7| + |7 - 7| = 5 = |2 - 7| = |a_2-a_3|\).
| |
|
|
C. Сделай равным по модулю
Конструктив
математика
сортировки
теория чисел
*1200
Вам дан массив из \(n\) целых неотрицательных чисел \(a_1, a_2, \ldots, a_n\). Можно выполнить следующую операцию: выбрать целое число \(x \geq 2\) и заменить каждое число массива остатком при делении этого числа на \(x\), то есть для всех \(1 \leq i \leq n\) заменить \(a_i\) на \(a_i \bmod x\). Определите, можно ли сделать все элементы массива равными, применяя операцию ноль или более раз. Выходные данные Для каждого теста выведите строку с «YES», если вы можете сделать все элементы списка равными, применяя операцию. В противном случае выведите «NO». Вы можете выводить «YES» и «NO» в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ). Примечание В первом наборе входных данных можно применить операцию с \(x = 3\) для получения массива \([2, 2, 0, 2]\), а затем применить операцию с \(x = 2\) для получения \([0, 0, 0, 0]\). Во втором наборе входных данных все числа уже равны. В четвертом наборе входных данных операция с \(x = 4\) приводит к массиву \([1, 1, 1, 1]\).
| |
|
|
F. Параметрическое MST
Бинарный поиск
графы
жадные алгоритмы
Конструктив
математика
сортировки
*2600
Вам дано \(n\) целых чисел \(a_1, a_2, \ldots, a_n\). Для любого вещественного числа \(t\) рассмотрим полный взвешенный граф на \(n\) вершинах \(K_n(t)\) с весом ребра между вершинами \(i\) и \(j\), равным \(w_{ij}(t) = a_i \cdot a_j + t \cdot (a_i + a_j)\). Пусть \(f(t)\) будет стоимостью минимального остовного дерева для \(K_n(t)\). Определите, ограничена ли \(f(t)\) сверху, и если да, то выведите максимальное значение, которое она достигает. Выходные данные Для каждого набора входных данных выведите одну строку с максимальным значением \(f(t)\) (можно показать, что это целое число) или «INF», если \(f(t)\) не ограничена сверху.
| |
|
|
D. Для геймеров. От геймеров.
Бинарный поиск
жадные алгоритмы
математика
Перебор
сортировки
*2000
Монокарп играет в стратегическую игру. В игре он собирает отряд для борьбы с монстрами. Перед каждой битвой у Монокарпа есть \(C\) монет, которые он может потратить на свой отряд. Перед началом каждой битвы в его отряде никого нет. Монокарп выбирает один тип воинов и набирает не больше воинов этого типа, чем он может себе позволить за \(C\) монет. Существует \(n\) типов воинов. Каждый тип воинов имеет три параметра: - \(c_i\) — стоимость одного воина \(i\)-го типа;
- \(d_i\) — урон, который наносит один воин \(i\)-го типа за секунду;
- \(h_i\) — здоровье одного воина \(i\)-го типа.
Монокарпу придется сразиться с \(m\) монстрами. У каждого монстра есть два параметра: - \(D_j\) — урон, который наносит \(j\)-й монстр за секунду;
- \(H_j\) — здоровье \(j\)-го монстра.
Монокарп сражается только с \(j\)-м монстром во время \(j\)-й битвы. Он хочет, чтобы все его воины остались в живых. И отряд Монокарпа, и монстр атакуют одновременно и непрерывно. Таким образом, Монокарп выигрывает битву тогда и только тогда, когда его отряд убивает монстра строго быстрее, чем монстр убивает одного из его воинов. Время сравнивается без округления. Для каждого монстра Монокарп хочет знать минимальное количество монет, которое он должен потратить, чтобы убить этого монстра. Если это количество больше, чем \(C\), то сообщите, что убить этого монстра невозможно. Выходные данные Выведите \(m\) целых чисел. Для каждого монстра выведите минимальное количество монет, которое Монокарп должен потратить, чтобы убить этого монстра. Если это количество больше, чем \(C\), то выведите \(-1\). Примечание Рассмотрим первого монстра из первого примера. Монокарп не может взять одного воина первого типа, потому что и ему, и монстру потребуется \(0.75\) секунды, чтобы убить друг друга. Он может взять двух воинов стоимостью \(6\) монет и убить монстра за \(0.375\) секунду. Монокарп может взять одного воина второго типа, потому что он убивает монстра за \(0.6\) секунды, а монстр убивает его за \(0.625\) секунды. Воин быстрее. Таким образом, достаточно \(5\) монет. Монокарпу понадобится как минимум три воина третьего типа, чтобы убить первого монстра, что будет стоить \(30\) монет. Монокарп потратит меньше всего монет, если выберет второй тип воинов и возьмет одного воина этого типа.
| |
|
|
E. Годзё и игра на матрице
дп
игры
математика
реализация
сортировки
Структуры данных
теория чисел
хэши
*2500
Марин измоталась после долгого дня косплея, поэтому Годзё приглашает ее сыграть в игру! Марин и Годзё по очереди кладут одну из своих фишек на таблицу размером \(n \times n\), при этом Марин ходит первой. Существуют некоторые ограничения на размещение фишек: - За исключением первого хода фишка, размещенная игроком, должна находиться на манхэттенском расстоянии более чем \(k\) от последней размещенной фишки. Другими словами, если игрок кладет фишку в \((x_1, y_1)\), то фишка, помещенная на следующем ходу, должна находиться в ячейке \((x_2, y_2)\), удовлетворяющей \(|x_2 - x_1| + |y_2 - y_1| > k\).
- Помимо предыдущего ограничения, фишка может быть размещена в любом месте матрицы, включая ячейки, где уже были размещены фишки любого игрока.
Каждый раз, когда какой-либо игрок кладет фишку в ячейку \((x, y)\), этот игрок получает \(v_{x,\ y}\) очков. Все значения \(v\) в таблице различны. Очки за ячейку даются даже в случае, если какие-то фишки уже находятся в этой ячейке. Игра заканчивается, когда каждый игрок сделает \(10^{100}\) ходов. Марин и Годзё сыграют \(n^2\) партий. Для каждой ячейки таблицы будет ровно одна партия, в которой первым ходом Марин размещает фишку в этой ячейке. Для каждой такой партии определите, у кого в итоге будет больше очков при оптимальной игре Марин и Годзё (после первого хода Марин)? Или партия закончится вничью? Выходные данные Выведите \(n\) строк. \(i\)-я строка должна содержать \(n\) символов, где \(j\)-й символ является результатом партии, в которой Марин начинает с ячейки \((i, j)\). Выведите 'M' в случае победы Марин, 'G' — в случае победы Годзё и 'D' — в случае равного количества очков. Не выводите пробелы между символами в одной строке.
| |
|
|
A. Ранклист
Бинарный поиск
реализация
сортировки
*1100
Завершилось очередное соревнование по программированию. К Вам в руки попала таблица с финальными результатами этого соревнования. Для каждой команды в ней было указано количество задач, решенных данной командой, а также суммарное штрафное время данной команды по всем решенным ей задачам. Однако ни для одной команды в этой таблице не было указано ее финальное место. Вам известны правила, по которым можно сравнить результаты двух заданных команд. Пусть команда a решила pa задач с суммарным штрафным временем ta, а команда b решила pb задач с суммарным штрафным временем tb. Тогда команда a займет более высокое итоговое место, чем команда b, если она решила больше задач на соревновании, либо она решила такое же количество задач, но с меньшим суммарным временем. Другими словами, команда a окажется выше команды b в финальной таблице результатов, если pa > pb, либо pa = pb и при этом ta < tb. При этом считается, что команды, решившие одинаковое количество задач с одинаковым штрафным временем, делят между собой все соответствующие места. Более формально, пусть есть группа из x команд, которые решили одинаковое количество задач с одинаковым штрафным временем. Пусть также y команд выступили лучше команд из этой группы. Тогда все команды из группы разделят между собой y + 1, y + 2, ..., y + x места. Команды, результат которых хуже чем у команд из группы, получат свои места в итоговой таблице, начиная с y + x + 1 места. Вашей задачей будет посчитать, какое количество команд из заданного списка разделило между собой k-ое место. Выходные данные В единственной строке выведите искомое количество команд, занявших k-ое место в итоговой таблице результатов. Примечание Итоговая таблица для первого примера: - 1-3 места — 4 решенных задачи, штрафное время равно 10
- 4 место — 3 решенных задачи, штрафное время равно 20
- 5-6 места — 2 решенные задачи, штрафное время равно 1
- 7 место — 1 решенная задача, штрафное время равно 10
По таблице видно, что второе место разделили команды, решившие 4 задачи со штрафным временем 10. Всего есть 3 такие команды. Итоговая таблица для второго примера: - 1 место — 5 решенных задач, штрафное время равно 3
- 2-5 места — 3 решенные задачи, штрафное время равно 1
По таблице видно, что четвертое место разделили команды, решившие 3 задачи со штрафным временем 1. Всего есть 4 такие команды.
| |
|
|
B. Многоугольники
геометрия
сортировки
*2100
Перед Вами очередная геометрическая задача. Вам заданы два невырожденных многоугольника A и B координатами своих вершин. Многоугольник A является строго выпуклым. Многоугольник B является произвольным многоугольником без самопересечений и самокасаний. Вершины обоих многоугольников заданы в порядке обхода по часовой стрелке. Для каждого многоугольника никакие три подряд идущие вершины не находятся на одной прямой. В задаче от Вас требуется проверить, находится ли многоугольник B строго внутри многоугольника A. Это означает, что любая точка многоугольника B должна находиться строго внутри многоугольника A. «Строго» означает, что точка многоугольника B не может находиться на стороне многоугольника A. Выходные данные В единственной строке выведете ответ на задачу — если многоугольник B строго внутри многоугольника A, выведите «YES», в противном случае выведите «NO» (без кавычек).
| |
|
|
C. Медиана
жадные алгоритмы
математика
сортировки
*1500
Медианой в массиве длины n называется элемент, который после сортировки элементов по неубыванию будет стоять на позиции номер (элементы массива нумеруются начиная с 1). Медианой массива (2, 6, 1, 2, 3) является число 2, а медианой массива (0, 96, 17, 23) — число 17. Под выражением понимается целая часть от деления числа a на число b. Однажды Вася показал Пете массив из n натуральных чисел и предложил найти медиану этого массива. Петя, даже не взглянув на числа, ответил, что она равна x. Петя очень честный мальчик, поэтому он решил добавить к заданному массиву несколько чисел таким образом, чтобы медиана получившегося массива стала равна x. Петя может добавлять в массив любые целые числа от 1 до 105, в том числе и одинаковые. Разумеется, разрешается ничего не добавлять в массив. Если число добавляется несколько раз, то в ответе оно учитывается такое же количество раз. Исходные числа массива запрещено удалять либо заменять. Пока Петя отвлекает Васю, вы должны найти минимальное количество чисел, которые ему потребуются. Выходные данные Выведите единственное целое число — минимальное количество чисел, которое нужно добавить Пете в массив, чтобы его медиана стала равна x. Примечание В первом примере в массив (10, 20, 30) достаточно добавить число 9. В получившемся массиве (9, 10, 20, 30) медианой будет элемент на позиции , то есть 10. Во втором примере в массив нужно добавить числа 4, 5, 5, 5. В получившемся массиве медиана равна 4.
| |
|
|
D. Обувной магазин
дп
жадные алгоритмы
Паросочетания
сортировки
*2500
На складе вашего магазина находятся n пар обуви, каждая пара характеризуется двумя целыми числами: ценой ci и размером si. Известно, что именно в этот день все числа si различны, то есть каждого размера имеется не более одной пары. В магазин зашли одновременно m покупателей, у покупателя номер i при себе di денег, а размер его ноги равен li. Покупатель номер i может купить себе пару номер j, если cj ≤ di, а также если li = sj или li = sj - 1; то есть необходимо, чтобы у него было достаточно денег чтобы заплатить, а также размер ноги был в точности равен или на 1 меньше, чем размер выбранной пары. Ваша задача — продать некоторым покупателям по паре обуви так, чтобы максимизировать сумму cj проданных пар, то есть прибыль. Гарантируется, что каждый покупатель возьмет не более одной пары, а каждую пару, разумеется, купит не более одного покупателя. Выходные данные В первой строке выведите единственное целое число — максимальную прибыль, которую вы сможете получить от продажи. Во второй строке выведите целое число k — количество пар обуви, которые вы продадите. Далее в k строках выведите описания проданных пар — два целых числа через пробел, где первое число означает номер покупателя, а второе — номер обуви, которую этот покупатель приобретет. Пары чисел «номер покупателя и номер обуви» можно выводить в любом порядке, покупатели и обувь нумеруются с 1 в том порядке, в котором они заданы во входных данных. Если существует несколько оптимальных ответов, то разрешается вывести любой. Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++, вместо него рекомендуется использовать потоки cin, cout, а также спецификатор %I64d.
| |
|
|
I. Ice Cream Shop
Перебор
реализация
сортировки
On a beach there are \(n\) huts in a perfect line, hut \(1\) being at the left and hut \(i+1\) being \(100\) meters to the right of hut \(i\), for all \(1 \le i \le n - 1\). In hut \(i\) there are \(p_i\) people. There are \(m\) ice cream sellers, also aligned in a perfect line with all the huts. The \(i\)-th ice cream seller has their shop \(x_i\) meters to the right of the first hut. All ice cream shops are at distinct locations, but they may be at the same location as a hut. You want to open a new ice cream shop and you wonder what the best location for your shop is. You can place your ice cream shop anywhere on the beach (not necessarily at an integer distance from the first hut) as long as it is aligned with the huts and the other ice cream shops, even if there is already another ice cream shop or a hut at that location. You know that people would come to your shop only if it is strictly closer to their hut than any other ice cream shop. If every person living in the huts wants to buy exactly one ice cream, what is the maximum number of ice creams that you can sell if you place the shop optimally? Output Print the maximum number of ice creams that can be sold by choosing optimally the location of the new shop. Note In the first sample, you can place the shop (coloured orange in the picture below) \(150\) meters to the right of the first hut (for example) so that it is the closest shop to the first two huts, which have \(2\) and \(5\) people, for a total of \(7\) sold ice creams. In the second sample, you can place the shop \(170\) meters to the right of the first hut (for example) so that it is the closest shop to the last two huts, which have \(7\) and \(8\) people, for a total of \(15\) sold ice creams.
| |
|
|
N. Drone Photo
Комбинаторика
математика
сортировки
Today, like every year at SWERC, the \(n^2\) contestants have gathered outside the venue to take a drone photo. Jennifer, the social media manager for the event, has arranged them into an \(n\times n\) square. Being very good at her job, she knows that the contestant standing on the intersection of the \(i\)-th row with the \(j\)-th column is \(a_{i,j}\) years old. Coincidentally, she notices that no two contestants have the same age, and that everyone is between \(1\) and \(n^2\) years old. Jennifer is planning to have some contestants hold a banner with the ICPC logo parallel to the ground, so that it is clearly visible in the aerial picture. Here are the steps that she is going to follow in order to take the perfect SWERC drone photo. - First of all, Jennifer is going to select four contestants standing on the vertices of an axis-aligned rectangle.
- Then, she will have the two younger contestants hold one of the poles, while the two older contestants will hold the other pole.
- Finally, she will unfold the banner, using the poles to support its two ends. Obviously, this can only be done if the two poles are parallel and do not cross, as shown in the pictures below.
Being very indecisive, Jennifer would like to try out all possible arrangements for the banner, but she is worried that this may cause the contestants to be late for the competition. How many different ways are there to choose the four contestants holding the poles in order to take a perfect photo? Two choices are considered different if at least one contestant is included in one but not the other. Output Print the number of ways for Jennifer to choose the four contestants holding the poles. Note In the first sample, there are \(4\) contestants, arranged as follows. There is only one way to choose four contestants, with one pole held by contestants aged \(1\) and \(2\) and the other one by contestants aged \(3\) and \(4\). But then, as we can see in the picture, the poles cross. Since there is no valid way to choose four contestants, the answer is \(0\). In the second sample, the \(4\) contestants are arranged as follows. Once again, there is only one way to choose four contestants, but this time the poles don't cross. Therefore, the answer is \(1\). In the third sample, the \(9\) contestants are arranged as follows. There are \(6\) ways of choosing four contestants so that the poles don't cross, as shown in the following pictures.
| |
|
|
B. Техника массивного клонирования
жадные алгоритмы
Конструктив
сортировки
*900
Дан массив \(a\) из \(n\) целых чисел. У этого массива изначально есть только одна копия, данная вам. Можно делать два вида действий: - Выбрать любой массив и создать его копию. После это появляется ещё один массив, равный выбранному.
- Поменять местами два элемента из любых копий (возможно, в одной копии) на любых позициях.
Вам нужно найти минимальное количество действий, необходимое, чтобы хотя бы в одной копии все элементы были равны. Выходные данные Для каждого набора входных данных выведите единственное число — минимальное количество действий, которое нужно сделать, чтобы хотя бы в одной копии массива все элементы были равны. Примечание В первом наборе входных данных в массиве уже все числа равны, поэтому ответ равен \(0\). Во втором наборе входных данных сначала можно сделать копию данного массива. Тогда будут два одинаковых массива: \([ \ 0 \ 1 \ 3 \ 3 \ 7 \ 0 \ ]\) и \([ \ 0 \ 1 \ 3 \ 3 \ 7 \ 0 \ ]\) После этого можно поменять местами элементы так, чтобы все нули оказались в одном массиве: \([ \ 0 \ \underline{0} \ \underline{0} \ 3 \ 7 \ 0 \ ]\) и \([ \ \underline{1} \ 1 \ 3 \ 3 \ 7 \ \underline{3} \ ]\) Теперь создадим копию первого массива: \([ \ 0 \ 0 \ 0 \ 3 \ 7 \ 0 \ ]\), \([ \ 0 \ 0 \ 0 \ 3 \ 7 \ 0 \ ]\) и \([ \ 1 \ 1 \ 3 \ 3 \ 7 \ 3 \ ]\) Поменяем местами элементы в первых двух копиях: \([ \ 0 \ 0 \ 0 \ \underline{0} \ \underline{0} \ 0 \ ]\), \([ \ \underline{3} \ \underline{7} \ 0 \ 3 \ 7 \ 0 \ ]\) и \([ \ 1 \ 1 \ 3 \ 3 \ 7 \ 3 \ ]\). В итоге за \(6\) действий получили массив, в котором все элементы одинаковые. Можно доказать, что невозможно получить ответ меньше.
| |
|
|
C. Заражение дерева
Бинарный поиск
Деревья
жадные алгоритмы
сортировки
*1600
Деревом называется связный граф без циклов. В корневом дереве есть особая вершина, которая называется корнем. Родитель вершины \(v\) (отличной от корня) — вершина перед \(v\) на кратчайшем пути от корня до \(v\). Дети вершины \(v\) — все вершины, для которых \(v\) является родителем. Вам дано корневое дерево из \(n\) вершин. Вершина \(1\) — корень. Изначально все вершины здоровы. Каждую секунду вы делаете две операции: распространение и, после этого, инъекцию: - Распространение: для каждой вершины \(v\), если хотя бы один ребёнок \(v\) заражён, то вы можете распространить инфекцию, дополнительно заразив не более одного ребёнка \(v\) на свой выбор.
- Инъекция: вы можете выбрать одну любую здоровую вершину и заразить её.
Этот процесс повторяется каждую секунду до тех пор, пока всё дерево не будет заражено. Необходимо найти минимальное время в секундах, за которое можно заразить всё дерево. Выходные данные Для каждого набора входных данных выведите одно число — минимальное время в секундах, за которое можно заразить всё дерево. Примечание На картинке изображено дерево из первого набора входных данных в каждую секунду. Вершина покрашена в чёрный, если она не заражена. Вершина покрашена в синий, если она заражена инъекцией в течение последней прошедшей секунды. Вершина покрашена в зелёный, если она заражена распространением в течение последней прошедшей секунды. Вершина покрашена в красный, если она заражена, но не в течение последней прошедшей секунды. Обратите внимание, что вы можете выбирать, какие именно вершины будут заражены распространением и инъекциями.
| |
|
|
B. Социальная дистанция
жадные алгоритмы
математика
сортировки
*900
По кругу расставлены последовательно \(m\) стульев. Стулья пронумерованы от \(0\) до \(m-1\). На эти стулья хотят сесть \(n\) человек. \(i\)-й из них хочет, чтобы и справа, и слева от него было хотя бы \(a[i]\) пустых стула. Более формально, если \(i\)-й человек сидит на \(j\)-м стуле, то никто не может сидеть на следующих стульях: \((j-a[i]) \bmod m\), \((j-a[i]+1) \bmod m\), ... \((j+a[i]-1) \bmod m\), \((j+a[i]) \bmod m\). Определите, возможно ли рассадить всех людей при заданных ограничениях. Выходные данные Для каждого набора входных данных выведите «YES» (без кавычек), если возможно рассадить всех и выполнить ограничения, и «NO» (без кавычек) в ином случае. Вы можете выводить буквы в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут все считаться положительным ответом) Примечание \(1\)-й набор входных данных: \(n>m\), поэтому никак нельзя рассадить всех. \(2\)-й набор: первый человек может сесть на \(2\)-й стул, а второй человек — на \(0\)-й стул. Оба хотят по крайней мере \(1\) пустой стул по обе стороны от них. Стулья \(1\) и \(3\) свободны, поэтому эта рассадка подходит. \(3\)-й набор: если второй человек сядет на стул, ему потребуется по \(2\) пустых стула слева и справа от него, поэтому становится невозможно найти место для первого человека, поскольку стульев всего \(5\). \(4\)-й набор: люди могут сесть на \(1\)-й, \(4\)-й и \(7\)-й стулья соответственно.
| |
|
|
B. Тройка
реализация
сортировки
*800
Вам задан массив \(a\) из \(n\) элементов. Найдите любое число, которое встречается в этом массиве хотя бы три раза, или выведите -1, если таких чисел нет. Выходные данные Для каждого набора входных данных выведите любое целое число, которое встречается в массиве хотя бы три раза, или -1, если такого числа нет. Примечание В первом наборе входных данных в массиве всего один элемент, поэтому не существует числа, которое встречается хотя бы три раза. Следовательно, ответ равен -1. Во втором наборе входных данных все три элемента массива равны \(2\), поэтому \(2\) встречается трижды. Следовательно, в качестве ответа надо вывести \(2\). В третьем наборе входных данных \(2\) встречается четыре раза, поэтому \(2\) — ответ. В четвертом наборе входных данных \(4\) встречается три раза, поэтому \(4\) — ответ. В пятом наборе входных данных каждое из чисел \(1\), \(2\) и \(3\) встречается хотя бы три раза, поэтому любое из них может быть ответом. В шестом наборе входных данных все элементы массива различны, поэтому ни одно число не встречается хотя бы три раза, и ответ равен -1.
| |
|
|
A. Профессор Слим
жадные алгоритмы
реализация
сортировки
*800
Однажды профессор Слим решил покинуть королевство GUC и переехать в королевство GIU. Чтобы быть принятым в GIU, он должен сначала пройти несложный онлайн-тест. Жители GUC были счастливы расстроены, что профессор уезжает, поэтому они решили взломать систему и поменять задачу в тесте на более сложную. После долгих обсуждений они сошлись на следующей задаче. Дан массив из \(n\) целых чисел \(a_1,a_2,\ldots,a_n\), где \(a_{i} \neq 0\), проверьте, можно ли сделать этот массив отсортированным, применив следующую операцию несколько (возможно, ноль) раз. Массив называется отсортированным, если его элементы расположены в порядке неубывания. - выберете два индекса \(i\) и \(j\) (\(1 \le i,j \le n\)) такие, что числа \(a_i\) и \(a_j\) различного знака. Другими словами, одно из этих чисел должно быть положительно, а другое отрицательно.
- поменяйте местами знаки чисел \(a_{i}\) и \(a_{j}\). Например, если \(a_i=3\), а \(a_j=-2\), то они изменятся на \(a_i=-3\) и \(a_j=2\).
Профессор Слим понял, что задача все еще простая и не стоит его времени, поэтому он предоставил вам возможность решить ее. Выходные данные Для каждого набора входных данных выведите «YES», если массив может быть отсортирован в порядке неубывания, иначе выведите «NO». Можно выводить каждую букву в любом регистре (верхнем или нижнем). Примечание В первом наборе нет способа сделать массив отсортированным. Во втором наборе массив уже отсортирован. В третьем наборе можно поменять знаки \(1\)-го и \(5\)-го элементов, а затем знаки \(3\)-го и \(6\)-го элементов, после чего массив будет отсортирован. В четвертом примере нет способа сделать массив отсортированным.
| |
|
|
B. Отрезок последовательных точек
математика
Перебор
сортировки
*1000
Вам задано \(n\) точек с целочисленными координатами на координатной оси \(OX\). Координата \(i\)-й точки равна \(x_i\). Все координаты точек различны и заданы в строго возрастающем порядке. Для каждой точки \(i\) вы можете не более одного раза сделать следующую операцию: взять эту точку и подвинуть ее на \(1\) влево или вправо (то есть вы можете изменить ее координату \(x_i\) на \(x_i - 1\) или на \(x_i + 1\)). Другими словами, вы можете выбрать для каждой точки по отдельности ее новую координату. Для \(i\)-й точки новой координатой может быть \(x_i - 1\), \(x_i\) или \(x_i + 1\). Ваша задача — определить, сможете ли вы подвинуть точки описанным выше способом так, чтобы новое множество точек образовывало последовательный отрезок целых чисел, то есть для какого-то целого числа \(l\) координаты точек будут равны \(l, l + 1, \ldots, l + n - 1\). Заметьте, что результирующее множество также должно состоять из точек с различными координатами. Вам предстоит ответить на \(t\) независимых наборов тестовых данных. Выходные данные Выведите ответ на каждый набор тестовых данных — если множество точек из набора может быть сдвинуто таким образом, чтобы образовывать последовательный отрезок целых чисел, выведите YES, иначе выведите NO.
| |
|
|
E. Прямой обход
Деревья
дп
Комбинаторика
разделяй и властвуй
снм
сортировки
хэши
*2100
Дано корневое дерево из \(2^n - 1\) вершин. У каждой вершины дерева либо \(0\) сыновей, либо \(2\). Все листья дерева расположены на одинаковой глубине, а у каждой внутренней вершины один из сыновей является левым, а другой — правым. Формально, вам задано совершенное бинарное дерево. Вершины дерева пронумерованы следующим образом: - номер корня — \(1\);
- если номер внутренней вершины — \(x\), то номер ее левого сына — \(2x\), а номер правого сына — \(2x+1\).
На каждой вершине дерева записана буква A или буква B. Пусть буква на вершине \(x\) — это \(s_x\). Назовем строкой прямого обхода вершины \(x\) строку, которая строится по следующим правилам: - если вершина \(x\) — лист, то строка прямого обхода \(x\) состоит из одного символа \(s_x\);
- в противном случае строка прямого обхода \(x\) равна \(s_x + f(l_x) + f(r_x)\), где \(+\) обозначает конкатенацию строк, \(f(l_x)\) — строка прямого обхода левого сына \(x\), а \(f(r_x)\) — строка прямого обхода правого сына \(x\).
Строка прямого обхода всего дерева — это строка прямого обхода его корня. А теперь — сама задача. Вы должны посчитать количество различных строк, которые могут быть получены как строка прямого обхода заданного дерева, если до построения строки прямого обхода можно применить следующую операцию любое количество раз: - выбрать любую вершину \(x\), не являющуюся листом, и поменять местами ее детей (то есть левый сын становится правым, и наоборот).
Выходные данные Выведите одно целое число — количество различных строк, которые можно получить в качестве строки прямого обхода дерева, если можно применить любое количество описанных в условии операций. Ответ может быть очень большим, поэтому выведите его по модулю \(998244353\).
| |
|
|
D. A-B-C Сортировка
Конструктив
реализация
сортировки
*1200
Вам заданы три массива \(a\), \(b\) и \(c\). Первоначально, массив \(a\) состоит из \(n\) элементов, массивы \(b\) и \(c\) — пустые. Вы выполняете над ними следующий алгоритм, состоящий из двух шагов: - Шаг \(1\): пока \(a\) не пуст, вы забираете из \(a\) последний элемент и перемещаете его в середину массива \(b\). Если \(b\) в данный момент нечетной длины, то вы сами можете выбрать: вставить число из \(a\) слева или справа от центрального элемента в \(b\). В результате \(a\) станет пустым, а \(b\) будет состоять из \(n\) элементов.
- Шаг \(2\): пока \(b\) не пуст, вы забираете из \(b\) центральный элемент и перемещаете его в конец массива \(c\). Если \(b\) в данный момент четной длины, то вы сами можете выбрать какой из двух центральных элементов забрать. В результате \(b\) станет пустым, а \(c\) теперь состоит из \(n\) элементов.
Обратитесь к Примечанию за примерами. Можете ли вы получить отсортированный в порядке неубывания массив \(c\)? Выходные данные Для каждого набора входных данных, выведите YES (регистр не важен), если вы можете получить отсортированный по неубыванию массив \(c\). В противном случае выведите NO (регистр не важен). Примечание В первом наборе входных данных, мы можем сделать следующие преобразования массива \(a = [3, 1, 5, 3]\): Шаг \(1\): | \(a\) | \([3, 1, 5, 3]\) | \(\Rightarrow\) | \([3, 1, 5]\) | \(\Rightarrow\) | \([3, 1]\) | \(\Rightarrow\) | \([3]\) | \(\Rightarrow\) | \([]\) | | \(b\) | \([]\) | | \([\underline{3}]\) | | \([3, \underline{5}]\) | | \([3, \underline{1}, 5]\) | | \([3, \underline{3}, 1, 5]\) |
Шаг \(2\): | \(b\) | \([3, 3, \underline{1}, 5]\) | \(\Rightarrow\) | \([3, \underline{3}, 5]\) | \(\Rightarrow\) | \([\underline{3}, 5]\) | \(\Rightarrow\) | \([\underline{5}]\) | \(\Rightarrow\) | \([]\) | | \(c\) | \([]\) | | \([1]\) | | \([1, 3]\) | | \([1, 3, 3]\) | | \([1, 3, 3, 5]\) |
В результате массив \(c = [1, 3, 3, 5]\) и он отсортирован.
| |
|
|
B. Равенство конфет
жадные алгоритмы
математика
сортировки
*800
Есть \(n\) коробок конфет, \(i\)-я коробка содержит \(a_i\) конфет. У вас также есть \(n\) друзей, каждому из которых вы решили подарить коробку конфет. Вы не хотите, чтобы кто-то из друзей расстраивался, поэтому решили съесть несколько (возможно, ноль) конфет из каждой коробки так, чтобы во всех коробках было одинаковое количество конфет. Обратите внимание, что вы можете съесть разное количество конфет из разных коробок, и вы не можете добавлять конфеты ни в одну из коробок. Какое минимальное количество конфет нужно съесть, чтобы выполнить требования? Выходные данные Для каждого набора входных данных выведите единственное целое число — минимальное количество конфет, которые вам нужно съесть, чтобы выполнить требования. Примечание В первом наборе вы можете съесть \(1\) конфету из второй коробки, \(2\) конфеты из третьей коробки, \(3\) конфеты из четвертой коробки и \(4\) конфеты из пятой коробки. Теперь распределение конфет по коробкам выглядит так: \([1, 1, 1, 1, 1]\). Вы съели всего \(0 + 1 + 2 + 3 + 4 = 10\) конфет, поэтому ответ равен \(10\). Лучший ответ для второго набора получается, если уменьшить количество конфет во всех коробках до \(5\). Так, вы съедите \(995 + 995 + 0 + 995 + 995 + 995 = 4975\) конфет.
| |
|
|
E. Запросы на поедание конфет
Бинарный поиск
жадные алгоритмы
сортировки
*1100
У Тимура есть \(n\) конфет. В \(i\)-й конфете количество сахара равно \(a_i\). Так, съев \(i\)-ю конфету, Тимур потребляет количество сахара, равное \(a_i\). Тимур задаст вам \(q\) запросов о своих конфетах. Для \(j\)-го запроса вы должны ответить, какое минимальное количество конфет ему нужно съесть, чтобы потребить количество сахара, большее или равное \(x_j\). Выведите -1, если невозможно получить такое количество. Другими словами, нужно вывести минимально возможное \(k\) такое, что, съев \(k\) конфет, Тимур получит количество сахара не менее \(x_j\), или сказать, что такого \(k\) не существует. Обратите внимание, что он не может съесть одну и ту же конфету дважды, а запросы не зависят друг от друга (Тимур может использовать одну и ту же конфету в разных запросах). Выходные данные Для каждого набора входных данных выведите \(q\) строк. В \(j\)-й строке выведите количество конфет, которое нужно съесть Тимуру, чтобы получить количество сахара, большее или равное \(x_j\). Выведите -1, если получить такое количество невозможно. Примечание В первом наборе входных данных примера: - В первом запросе Тимур может съесть любую конфету, и он наберет нужное количество.
- Во втором запросе Тимур может получить количество не менее \(10\), съев \(7\)-ю и \(8\)-ю конфету, таким образом потребив количество сахара, равное \(14\).
- На третий запрос нет возможного ответа.
- В четвертом запросе Тимур может получить количество как минимум \(14\), съев \(7\)-ю и \(8\)-ю конфету, таким образом потребив количество сахара, равное \(14\).
Во втором наборе входных данных примера: - Для единственного запроса второго набора входных данных мы можем выбрать третью конфету, из которой Тимур получает количество сахара равное \(3\). Также можно получить тот же ответ, выбрав четвертую конфету.
| |
|
|
F. Самый длинный страйк
жадные алгоритмы
реализация
сортировки
Структуры данных
*1300
Дан массив \(a\) длины \(n\) и целое число \(k\), вам нужно найти два любых числа \(l\) и \(r\) (\(l \leq r\)) таких, что: - Для каждого \(x\) \((l \leq x \leq r)\), \(x\) содержится в \(a\) хотя бы \(k\) раз (т.е. \(k\) или более элементов массива равны \(x\)).
- Значение \(r-l\) максимально среди возможных.
Если не существует подходящих чисел, выведите -1. Например, если \(a=[11, 11, 12, 13, 13, 14, 14]\) и \(k=2\), то: - для \(l=12\), \(r=14\) первое условие не выполнено, так как \(12\) содержится менее \(k=2\) раз.
- для \(l=13\), \(r=14\) первое условие выполнено, так как \(13\) содержится хотя бы \(k=2\) раз в \(a\) и \(14\) содержится хотя бы \(k=2\) раз в \(a\).
- для \(l=11\), \(r=11\) первое условие выполнено, так как \(11\) содержится хотя бы \(k=2\) раз в \(a\).
Пара \(l\) и \(r\) для которой выполнено первое условие и \(r-l\) максимально — это пара \(l = 13\), \(r = 14\). Выходные данные Для каждого набора входных данных выведите \(2\) числа, \(l\) и \(r\) которые удовлетворяют условиям, или «-1» если таких не существует. Если ответов может быть несколько, выведите любой.
| |
|
|
H2. Максимизация пересечений (сложная версия)
разделяй и властвуй
сортировки
Структуры данных
*1500
Единственная разница между двумя версиями состоит в том, что в этой версии \(n \leq 2 \cdot 10^5\) и сумма по \(n\) по всем наборам входных данных теста не превосходит \(2 \cdot 10^5\). Терминал — это ряд из \(n\) равных отрезков, пронумерованных от \(1\) до \(n\) по порядку. Есть два терминала, один над другим. Вам дан массив \(a\) длины \(n\). Для всех \(i = 1, 2, \dots, n\) должен быть прямой провод из некоторой точки на отрезке \(i\) верхнего терминала в некоторую точку на отрезке \(a_i\) нижнего терминала. Например, на следующих рисунках показаны два возможных соединения, при \(n=7\) и \(a=[4,1,4,6,7,7,5]\). Пересечение происходит, когда два провода имеют общую точку. На картинке выше пересечения обведены красным. Какое максимальное количество пересечений может быть при оптимальном размещении проводов? Выходные данные Для каждого набора выведите единственное целое число — максимальное количество пересечений, при оптимальном расположении проводов. Примечание Первый пример показан на втором рисунке в условии. Во втором примере при единственно возможном соединении появляется пересечение двух проводов, поэтому ответ равен \(1\). В третьем тестовом примере единственно возможное соединение состоит из одного провода, поэтому ответ равен \(0\).
| |
|
|
C. Двойная сортировка
реализация
сортировки
*1200
Заданы два массива \(a\) и \(b\), оба состоящие из \(n\) целых чисел. За один ход можно выбрать две позиции \(i\) и \(j\) (\(1 \le i, j \le n\); \(i \neq j\)) и поменять местами \(a_i\) с \(a_j\) и \(b_i\) с \(b_j\). Перестановки обязательно делать в обоих массивах. Разрешается сделать не более \(10^4\) ходов (возможно, ноль). Можете ли вы сделать оба массива отсортированными по неубыванию в конце? Если можете, то выведите любую последовательность ходов, которая делает оба массива отсортированными. Выходные данные На каждый набор входных данных выведите ответ. Если невозможно сделать оба массива отсортированными по неубыванию за не более чем \(10^4\) ходов, то выведите -1. Иначе сначала выведите количество ходов \(k\) \((0 \le k \le 10^4)\). Затем выведите \(i\) и \(j\) для каждого хода \((1 \le i, j \le n\); \(i \neq j)\). Если существует несколько ответов, то выведите любой из них. Не требуется минимизировать количество ходов.
| |
|
|
B. Сортировка с И
битмаски
Конструктив
сортировки
*1100
Вам дана перестановка \(p\) целых чисел от \(0\) до \(n-1\) (каждое из них встречается ровно один раз). Первоначально перестановка не отсортирована (то есть, \(p_i>p_{i+1}\) хотя бы для одного \(1 \le i \le n - 1\)). Перестановка называется \(X\)-сортируемой для некоторого неотрицательного целого числа \(X\), если можно отсортировать перестановку, выполнив операцию ниже некоторое конечное число раз: - Выберите два индекса \(i\) и \(j\) \((1 \le i \lt j \le n)\) такие, что \(p_i \& p_j = X\).
- Поменяйте местами \(p_i\) и \(p_j\).
Здесь \(\&\) обозначает операцию побитового И. Найдите максимальное значение \(X\) такое, что \(p\) является \(X\)-сортируемой. Можно показать, что всегда существует некоторое значение \(X\) такое, что \(p\) является \(X\)-сортируемой. Выходные данные Для каждого набора входных данных выведите одно целое число — максимальное значение \(X\) такое, что \(p\) является \(X\)-сортируемой. Примечание В первом наборе входных данных единственными \(X\), для которых перестановка является \(X\)-сортируемой, являются \(X = 0\) и \(X = 2\), максимальный из которых равен \(2\). Сортировка с использованием \(X = 0\): - Поменять местами \(p_1\) и \(p_4\), \(p = [2, 1, 3, 0]\).
- Поменять местами \(p_3\) и \(p_4\), \(p = [2, 1, 0, 3]\).
- Поменять местами \(p_1\) и \(p_3\), \(p = [0, 1, 2, 3]\).
Сортировка с использованием \(X = 2\): - Поменять местами \(p_3\) и \(p_4\), \(p = [0, 1, 2, 3]\).
Во втором наборе входных данных мы должны поменять местами \(p_1\) и \(p_2\), что возможно только при \(X = 0\).
| |
|
|
E. Неупорядоченные обмены
графы
Деревья
жадные алгоритмы
Конструктив
математика
поиск в глубину и подобное
сортировки
*2700
У Алисы есть перестановка \(p\) чисел от \(1\) до \(n\). Алиса может поменять местами пару \((x, y)\), что означает поменять местами элементы в позициях \(x\) и \(y\) в \(p\) (то есть поменять местами \(p_x\) и \(p_y\)). Алиса недавно изучила свой первый алгоритм сортировки, поэтому она решила отсортировать свою перестановку за минимальное количество возможных обменов. Она записала на листе бумаги все обмены в том порядке, в котором она их выполняла для сортировки перестановки. Например, - \([(2, 3), (1, 3)]\) является правильной последовательностью обменов Алисы для перестановки \(p = [3, 1, 2]\), в то время как \([(1, 3), (2, 3)]\) не является, потому что не сортирует перестановку. Обратите внимание, что мы не можем отсортировать перестановку менее чем за \(2\) обмена.
- \([(1, 2), (2, 3), (2, 4), (2, 3)]\) не может быть последовательностью обменов Алисы для \(p = [2, 1, 4, 3]\), даже если она сортирует перестановку, потому что \(p\) можно отсортировать за \(2\) обмена, например, используя последовательность \([(4, 3), (1, 2)]\).
К сожалению, Боб переставил местами обмены в последовательности, выписанной Алисой. Вам дана перестановка Алисы \(p\) и обмены, сделанные Алисой в произвольном порядке. Можете ли вы восстановить правильную последовательность обменов, которая сортирует перестановку \(p\)? Поскольку Алиса написала правильные обмены до того, как Боб их перемешал, гарантируется, что существует некоторый порядок обменов, который сортирует перестановку. Выходные данные Выведите перестановку \(m\) целых чисел — правильный порядок обменов, выписанный Алисой, который сортирует перестановку \(p\). Для лучшего понимания обратитесь к объяснению примера. В случае нескольких возможных ответов выведите любой. Примечание В первом примере \(p = [2, 3, 4, 1]\), \(m = 3\) и заданы обмены \([(1, 4), (2, 1), (1, 3)]\). Существует только один правильный порядок обмена, а именно \([2, 3, 1]\). - Сначала мы выполняем обмен \(2\) из входных данных, т.е. \((2, 1)\), \(p\) становится \([3, 2, 4, 1]\).
- Затем мы выполняем обмен \(3\) из входных данных, т.е. \((1, 3)\), \(p\) становится \([4, 2, 3, 1]\).
- Наконец, мы выполняем обмен \(1\) из входных данных, т.е. \((1, 4)\) и \(p\) становится \([1, 2, 3, 4]\), что является отсортированным.
Во втором примере \(p = [6, 5, 1, 3, 2, 4]\), \(m = 4\) и заданные обмены \([(3, 1), (2, 5), (6, 3), (6, 4)]\). Один из возможных правильных порядков обмена — \([4, 2, 1, 3]\). - Выполните обмен \(4\) из входных данных, т.е. \((6, 4)\), \(p\) становится \([6, 5, 1, 4, 2, 3]\).
- Выполните обмен \(2\) из входных данных, т.е. \((2, 5)\), \(p\) становится \([6, 2, 1, 4, 5, 3]\).
- Выполните обмен \(1\) из входных данных, т.е. \((3, 1)\), \(p\) становится \([1, 2, 6, 4, 5, 3]\).
- Выполните обмен \(3\) из входных данных, т.е. \((6, 3)\) и \(p\) становится \([1, 2, 3, 4, 5, 6]\), что является отсортированным.
Возможны и другие ответы, например, \([1, 2, 4, 3]\).
| |
|
|
F. Поток минимальной стоимости?
графы
жадные алгоритмы
Потоки
сортировки
Структуры данных
*2700
Вам даны два массива \(a\) и \(b\) целых чисел (\(b_i \neq 0\) и \(|b_i| \leq 10^9\)). Массив \(a\) отсортирован в неубывающем порядке. Стоимость подмассива \(a[l:r]\) определяется следующим образом: Вам даны \(q\) запросов в виде двух целых чисел \(l\) и \(r\). Вы должны вычислить стоимость подмассива \(a[l:r]\) для каждого запроса, по модулю \(10^9 + 7\). Если вы не знаете, что означает минимальная стоимость максимального потока, обратитесь сюда. Выходные данные Для каждого запроса \(l_i\), \(r_i\) — выведите стоимость подмассива \(a[l_i:r_i]\) по модулю \(10^9 + 7\). Примечание В первом запросе, максимально возможный поток составляет \(1\), т.е. одна единица из источника в \(2\), затем одна единица из \(2\) в \(3\), затем одна единица из \(3\) в сток. Стоимость потока равна \(0 \cdot 1 + |2 - 4| \cdot 1 + 0 \cdot 1 = 2\). Во втором запросе, максимально возможный поток снова составляет \(1\), т.е. от источника к \(7\), от \(7\) к \(6\) и от \(6\) к стоку со стоимостью \(0 \cdot |10 - 10| \cdot 1 + 0 \cdot 1 = 0\). В третьем запросе, граф показан слева с пропускной способностью, указанной вне скобок, и стоимостью, указанной в скобках. Изображение справа показывает поток через каждое ребро в оптимальной конфигурации. Максимальный поток составляет \(3\) при стоимости \(0 \cdot 3 + 1 \cdot 1 + 4 \cdot 2 + 0 \cdot 1 + 0 \cdot 2 = 9\). В четвертом запросе, сеть потока выглядит следующим образом: Минимальная стоимость максимального потока достигается следующим образом: Максимальный поток в этой сети равен 4, а минимальная стоимость такого потока равна 15.
| |
|
|
C. Перестановка столбцов
жадные алгоритмы
Конструктив
Перебор
реализация
сортировки
*1400
Как известно каждому участнику проекта crowdforces, Тётя Люсине — чуть ли не самый активный человек на земле. Её голова всё время забита какими-то новыми on-ramp задачами. Конечно, даже ей не всегда удаётся придумать что-то хорошее, и в этот раз у неё получилась таска со сказкой, а именно — про таблицы. Ни один ревьювер потом не смог решить эту задачу, а вы сможете? Дана таблица с \(n\) строками и \(m\) столбцами, где в каждой ячейке написано целое положительное число. Назовём таблицу хорошей, если последовательность чисел в каждой строке является отсортированной в порядке неубывания. Иными словами, для каждого \(1 \le i \le n\) и \(2 \le j \le m\) выполняется следующее условие: \(a_{i,j} \ge a_{i, j-1}\). Необходимо ровно один раз выбрать столбцы с номерами \(i\) и \(j\) (не обязательно различными), \(1 \le i, j \le m\), и поменять их местами. Необходимо определить, можно ли после этого получить хорошую таблицу, и вывести соответствующие столбцы, если это возможно. Выходные данные Если после перестановки невозможно получить хорошую таблицу, то выведите одно число \(-1\). В противном случае выведите \(2\) числа — номера столбцов, которые необходимо переставить, чтобы получить хорошую таблицу. Если существуют несколько решений, выведите любое из них. Примечание В первом наборе входных данных таблица уже является хорошей, поэтому мы можем, например, переставить первый столбец с самим собой. Во втором наборе входных данных нельзя сделать данную таблицу хорошей. В третьем наборе входных данных необходимо поменять местами первый и второй столбец, тогда таблица станет хорошей.
| |
|
|
D. Ловушки
жадные алгоритмы
Конструктив
сортировки
*1700
Как известно, в мире всегда есть недобросовестные люди. К сожалению, иногда такие люди делают ревью, и самый умный человек на земле (естественно, Тётя Люсине) придумала хитрейший способ с ними бороться: ханипоты! Но Тётя Люсине пошла ещё дальше: она замаскировала все ханипоты под «ловушки»! Теперь вам, как самому лучшему ревьюверу, нужно через них пробраться. Вам нужно преодолеть \(n\) ловушек, пронумерованных от \(1\) до \(n\). Вы будете проходить через ловушки по очереди. \(i\)-я ловушка наносит вам \(a_i\) базового урона. Вместо того, чтобы проходить через ловушку, вы можете перепрыгнуть ее. Всего вы можете перепрыгнуть не более \(k\) ловушек. В случае, если вы перепрыгиваете ловушку, вы не получаете от неё урона. Однако если вы перепрыгиваете какую-то ловушку, то это увеличивает урон каждой следующей ловушки на \(1\) (это бонусный урон). Обратите внимание, что если вы перепрыгиваете ловушку, то вы не получаете от неё урона (ни базовый, ни бонусный), а что также бонусные уроны от прыжков складываются. Например, если вы проходите через \(i\)-ю ловушку с базовым уроном \(a_i\), а до этого вы перепрыгнули \(3\) другие ловушки, то вы получите от неё \((a_i + 3)\) урона. Определите, какое минимальный суммарный урон вы можете получить, если разрешается перепрыгнуть не больше \(k\) любых ловушек. Выходные данные Для каждого набора входных данных выведите одно число — минимальный суммарный урон, который можно получить, если можно перепрыгнуть не больше \(k\) любых ловушек. Примечание В первом наборе входных данных можно перепрыгнуть все ловушки и получить \(0\) урона. Во втором наборе входных данных есть \(5\) способов перепрыгнуть ловушки: - Не перепрыгивать никакие ловушки.
Суммарный урон: \(5 + 10 + 11 + 5 = 31\). - Перепрыгнуть \(1\)-ю ловушку.
Суммарный урон: \(\underline{0} + (10 + 1) + (11 + 1) + (5 + 1) = 29\). - Перепрыгнуть \(2\)-ю ловушку.
Суммарный урон: \(5 + \underline{0} + (11 + 1) + (5 + 1) = 23\). - Перепрыгнуть \(3\)-ю ловушку.
Суммарный урон: \(5 + 10 + \underline{0} + (5 + 1) = 21\). - Перепрыгнуть \(4\)-ю ловушку.
Суммарный урон: \(5 + 10 + 11 + \underline{0} = 26\). Чтобы получить минимальный урон, необходимо перепрыгнуть \(3\)-ю ловушку, тогда ответ будет \(21\). В третьем наборе входных данных оптимально перепрыгнуть через ловушки с номерами \(1\), \(3\), \(4\), \(5\), \(7\): Суммарный урон: \(0 + (2 + 1) + 0 + 0 + 0 + (2 + 4) + 0 = 9\).
| |
|
|
A. Циклический локальный минимакс
жадные алгоритмы
Конструктив
сортировки
*1100
Вам дано \(n\) целых чисел \(a_1, a_2, \ldots, a_n\). Можно ли расположить их на окружности так, чтобы каждое число было строго больше обоих своих соседей или строго меньше обоих своих соседей? Другими словами, определите, существует ли перестановка \(b_1, b_2, \ldots, b_n\) целых чисел \(a_1, a_2, \ldots, a_n\) такая, что для каждого \(i\) от \(1\) до \(n\) выполняется хотя бы одно из следующих условий: - \(b_{i-1} < b_i > b_{i+1}\).
- \(b_{i-1} > b_i < b_{i+1}\)
Чтобы выражения выше имели смысл для \(i=1\) и \(i=n\), мы определяем \(b_0=b_n\) и \(b_{n+1}=b_1\). Выходные данные Для каждого набора входных данных, если невозможно расположить числа на окружности таким образом, выведите \(\texttt{NO}\). В противном случае выведите \(\texttt{YES}\). Во второй строке выведите \(n\) целых чисел \(b_1, b_2, \ldots, b_n\), которые являются перестановкой \(a_1, a_2, \ldots, a_n\) и удовлетворяют условиям из утверждения. Примечание Можно показать, что для первого и третьего наборов входных данных такой расстановки не существует. Во втором наборе входных данных подходит расстановка \([1, 8, 4, 9]\), в которой \(1\) и \(4\) меньше своих соседей, а \(8, 9\) больше. В четвертом наборе входных данных работает расстановка \([1, 11, 1, 111, 1, 1111]\), в которой три элемента, равные \(1\), меньше своих соседей, а остальные элементы больше.
| |
|
|
B. Лингвистика
жадные алгоритмы
реализация
сортировки
Строки
*2000
Алина обнаружила странный язык, который содержит всего \(4\) слова: \(\texttt{A}\), \(\texttt{B}\), \(\texttt{AB}\), \(\texttt{BA}\). Оказалось, что в этом языке нет пробелов: предложение записывается путем объединения (конкатенации) его слов в одну строку. Алина нашла одно такое предложение \(s\) и ей интересно: возможно ли, что оно состоит ровно из \(a\) слов \(\texttt{A}\), \(b\) слов \(\texttt{B}\), \(c\) слов \(\texttt{AB}\) и \(d\) слов \(\texttt{BA}\)? Другими словами, определите, можно ли объединить (конкатенировать) эти слова \(a+b+c+d\) в некотором порядке так, чтобы получилась строка \(s\). Каждое из слов \(a+b+c+d\) должно быть использовано в конкатенации ровно один раз, но вы можете выбрать порядок, в котором они будут конкатенироваться. Выходные данные Для каждого набора входных данных выведите \(\texttt{YES}\), если возможно, что предложение \(s\) состоит ровно из \(a\) слов \(\texttt{A}\), \(b\) слов \(\texttt{B}\), \(c\) слов \(\texttt{AB}\) и \(d\) слов \(\texttt{BA}\), и \(\texttt{NO}\) в противном случае. Вы можете выводить каждую букву в любом регистре. Примечание В первом наборе входных данных предложение \(s\) — это \(\texttt{B}\). Очевидно, что оно не может состоять из одного слова \(\texttt{A}\), поэтому ответ — \(\texttt{NO}\). Во втором наборе входных данных предложение \(s\) — \(\texttt{AB}\), и возможно, что оно состоит из одного слова \(\texttt{AB}\), поэтому ответ — \(\texttt{YES}\). В третьем наборе входных данных предложение \(s\) — \(\texttt{ABAB}\), и возможно, что оно состоит из одного слова \(\texttt{A}\), одного слова \(\texttt{B}\) и одного слова \(\texttt{BA}\), так как \(\texttt{A} + \texttt{BA} + \texttt{B} = \texttt{ABAB}\). В четвертом наборе входных данных предложение \(s\) — \(\texttt{ABAAB}\), и возможно, что оно состоит из одного слова \(\texttt{A}\), одного слова \(\texttt{AB}\) и одного слова \(\texttt{BA}\), так как \(\texttt{A} + \texttt{BA} + \texttt{AB} = \texttt{ABAAB}\). В пятом наборе входных данных предложение \(s\) — \(\texttt{BAABBABBAA}\), и возможно, что оно состоит из одного слова \(\texttt{A}\), одного слова \(\texttt{B}\), двух слов \(\texttt{AB}\) и двух слов \(\texttt{BA}\), так как \(\texttt{BA} + \texttt{AB} + \texttt{B} + \texttt{AB} + \texttt{BA} + \texttt{A}= \texttt{BAABBABBAA}\).
| |
|
|
B. Железнодорожная система
графы
жадные алгоритмы
интерактив
Конструктив
сортировки
*1700
Это интерактивная задача. Под непосредственным наблюдением Kanako и Moriya железнодорожная система Gensokyo наконец-то завершена. GSKR (Gensokyo Railways) состоит из \(n\) станций с \(m\) двунаправленными дорожками, соединяющими их. \(i\)-я дорожка имеет длину \(l_i\) (\(1\le l_i\le 10^6\)). Из-за бюджетных ограничений железнодорожная система может быть не связной, хотя между двумя станциями может быть более одного пути. Значение железнодорожной системы определяется как общая длина всех ее дорожек. Максимальная (или минимальная) мощность железнодорожной системы определяется как максимальное (или минимальное) значение среди всех полных остовных лесов. Полный остовный лес графа — это остовный лес с той же связностью, что и данный граф. У Kanako есть симулятор, способный обрабатывать не более \(2m\) запросов. На вход симулятора подается строка \(s\) длины \(m\), состоящая из символов 0 и/или 1. Симулятор оставит \(i\)-ю дорожку, если \(s_i=\) 1. Затем устройство сообщит Kanako максимальную мощность системы в смоделированном состоянии. Kanako хочет узнать минимальную мощность системы со всеми дорожками с помощью симулятора. Структура железнодорожной системы определяется заранее. Другими словами, интерактор не адаптивен. Протокол взаимодействия Начните взаимодействие, прочитав \(n,m\). Чтобы сделать запрос, выведите «? \(s\)» (без кавычек, \(s\) — это строка длины \(m\), состоящая из символов 0 и/или 1 ). Затем вы должны прочитать наш ответ из стандартного ввода — максимальная мощность системы в смоделированном состоянии. Если ваша программа сделала недопустимый запрос или закончились попытки, интерактор немедленно завершится, и ваша программа получит вердикт Неверный ответ. Чтобы дать окончательный ответ, выведите «! \(L\)» (без кавычек, \(L\) — это минимальная мощность системы со всеми дорожками). Обратите внимание, что предоставление этого ответа не считается как один из \(2m\) запросов. После печати запроса не забудьте вывести конец строки и очистить вывод. В противном случае вы получите превышение лимита бездействия. Для этого используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Паскале;
- stdout.flush() в Python;
- см. документацию для других языков.
Взломы Первая строка ввода должна содержать два целых числа \(n,m\) (\(2 \leq n \leq 200\), \(1\le m \le 500\)) — количество станций и путей. Следующие \(m\) строк должны содержать ровно \(3\) целых чисел через пробел \(u_i\), \(v_i\), \(l_i\) (\(1\le u_i,v_i \le n\), \(u_i\ne v_i\), \(1 \leq l_i \leq 10^6\)) — вершины ребра и длина \(i\)-й дорожки. Примечание Пример из условия, в котором \(l_i=i\):
| |
|
|
C. Sanae и гигантский робот
Бинарный поиск
жадные алгоритмы
Перебор
снм
сортировки
Структуры данных
*2500
Sanae сделала гигантского робота — Hisoutensoku, но с ним что-то не так. Что еще хуже, Sanae, кажется, не может понять, как его остановить, и она вынуждена исправлять это на лету. Состояние робота можно представить массивом целых чисел длины \(n\). Изначально робот находится в состоянии \(a\). Она хочет превратить его в состояние \(b\). Как отличный программист, Sanae владеет искусством копирования и вставки. За одну операцию она может выбрать некоторый отрезок из заданных отрезков, скопировать этот отрезок из \(b\) и вставить его в то же место робота, заменив исходное состояние на этих позициях. Однако она должна следить за тем, чтобы сумма \(a\) не менялась после каждой операции копирования на случай, если робот выйдет из строя. Формально Sanae может выбрать отрезок \([l,r]\) и сделать \(a_i = b_i\) (\(l\le i\le r\)), если \(\sum\limits_{i=1}^n a_i\) не изменится после применения операции. Определите, может ли Sanae успешно перевести робота из начального состояния \(a\) в желаемое состояние \(b\) с помощью любых (возможно, ноль) операций. Выходные данные Для каждого теста выведите «YES» (без кавычек), если \(a\) можно превратить в \(b\), или «NO» (без кавычек) в противном случае. Вы можете вывести «YES» и «NO» в любом регистре (например, строки «yEs», «yes» и «Yes» являются правильным ответом). Примечание В первом наборе входных данных один из возможных способов превратить \(a\) в \(b\): Сначала выберите \([1,3]\). После операции \(a=[3,2,5,2,3]\). Затем выберите \([2,5]\). После операции \(a=[3,2,5,4,1]=b\). Во втором наборе входных данных можно показать, что невозможно превратить \(a\) в \(b\).
| |
|
|
B. Волшебный талисман Patchouli
битмаски
жадные алгоритмы
Конструктив
сортировки
*800
Patchouli является магическим талисманом. Изначально у него \(n\) магических жетонов. Их магическая сила может быть представлена положительными целыми числами \(a_1, a_2, \ldots, a_n\). Patchouli может выполнять следующие две операции с жетонами. - Слияние: Patchouli выбирает два жетона, убирает их и создает новый жетон с магической силой, равной сумме двух выбранных жетонов.
- Сокращение: Patchouli выбирает жетон с четным значением магической силы \(x\), удаляет его и создает новый жетон с магической силой, равной \(\frac{x}{2}\).
Жетоны наиболее эффективны, когда они имеют нечетное значение магической силы. Пожалуйста, помогите Patchouli найти минимальное количество операций, необходимых ему, чтобы все жетоны имели нечетное значение магической силы. Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество операций, которое нужно Patchouli, чтобы все жетоны имели нечетное значение магической силы. Можно показать, что при заданных ограничениях требуемая последовательность операций существует. Примечание В первом наборе входных данных \(a\) изначально состоит только из нечетных чисел. Во втором наборе входных данных выберите жетоны с магической силой \(1\) и \(2\) и выполните слияние. Теперь \(a=[1,3]\), оба нечетные числа. В третьем наборе входных данных сначала выберите жетоны с магической силой \(2\) и \(8\) и выполните слияние. Теперь \(a=[4,10]\). Дальше выберите жетон с магической силой \(10\) и выполните сокращение. Теперь \(a=[4,5]\). Выберите жетоны с магической силой \(4\) и \(5\) и выполните слияние. Теперь \(a=[9]\), а \(9\) — нечетное число. Можно показать, что вы не можете получить все магические силы нечетными числами менее чем за \(3\) хода, поэтому ответ равен \(3\).
| |
|
|
A. Минимизируй строку
жадные алгоритмы
Перебор
реализация
сортировки
*800
Кузнецов любит искусство, поэзию и музыку. И строки, состоящие из строчных латинских букв. Недавно Кузнецов нашел две строки \(a\) и \(b\) длины \(n\) и \(m\) соответственно. Они состоят из строчных английских букв и ни один символ не содержится одновременно в обеих строках. Пусть еще одна строка \(c\) изначально пуста. Кузнецов может делать следующие два типа операций: - Выбрать любой символ из строки \(a\), удалить его из строки \(a\) и добавить в конец строки \(c\).
- Выбрать любой символ из строки \(b\), удалить его из строки \(b\) и добавить в конец строки \(c\).
Однако Кузнецов не может сделать более \(k\) операций одного типа подряд. Кузнецов должен выполнять операции до того момента, как строка \(a\) либо строка \(b\) станет пустой. Какое лексикографически наименьшее значение \(c\) возможное после того, как Кузнецов закончит выполнение операций? Строка \(x\) лексикографически меньше строки \(y\) тогда и только тогда, когда выполняется одно из следующих условий: - \(x\) является префиксом \(y\), но \(x \neq y\);
- в первой позиции, где \(x\) и \(y\) различаются, в строке \(x\) находится буква, которая стоит в алфавите раньше, чем соответствующая буква в \(y\).
Выходные данные Для каждого набора входных данных выведите одну строку \(c\) — ответ на задачу. Примечание В первом наборе входных данных оптимально взять две буквы «a» из строки \(a\) и добавить их к строке \(c\). Теперь запрещается выполнять операцию со строкой \(a\), следовательно, необходимо взять один символ «b» из строки \(b\). Следуя этой логике, мы получаем, что \(c\) становится «aabaabaa» в момент, когда строка \(a\) становится пуста. Во втором наборе входных данных оптимально взять как можно больше «a» из строки \(a\), а затем взять как можно больше «b» из строки \(b\). В конце мы берем два символа «c» из строки \(a\), делая ее пустой.
| |
|
|
A. Домашние дела
сортировки
*800
Петя и Вася — братья. Сегодня особенный день, так как родители оставили их одних и поручили сделать n домашних дел. Каждое дело характеризуется одним параметром — своей сложностью, сложность i-го дела равна hi. Так как Петя старше, то он решил взять себе такие дела, сложность которых больше некоторого значения x (hi > x), а Васе достанутся дела со сложностью меньшей или равной x (hi ≤ x). Братья уже решили, что Петя будет делать ровно a дел, а Вася ровно — b дел (a + b = n). Сколькими способами они могут выбрать целочисленное x так, чтобы Пете досталось ровно a дел, а Васе — ровно b? Выходные данные Выведите искомое количество способов выбрать целочисленное значение x. Если таких способов вообще нет, то выведите 0. Примечание В первом примере возможные значения x это 3, 4 или 5. Во втором примере невозможно найти такое x, чтобы Пете досталось 3 дела, а Васе — 4 дела.
| |
|
|
G. Посчитай поезда
Бинарный поиск
жадные алгоритмы
сортировки
Структуры данных
*2000
На рельсах стоит \(n\) автономных вагончиков. Вагончики пронумерованы слева направо от \(1\) до \(n\). Вагончики между собой не сцеплены. При этом вагончики движутся влево, так что вагончик с номером \(1\) движется впереди всех. У \(i\)-го вагончика есть свой двигатель, который может разогнать вагончик до \(a_i\) км/ч, но при этом, вагончик не может ехать быстрее, чем вагончик перед ним. Для пояснения смотрите пример. Все вагончики одновременно начинают двигаться влево, при этом, естественно образуются поезда. Будем называть поездом — подряд движущиеся вагончики, имеющие одинаковую скорость. Например, у нас есть \(n=5\) вагончиков и массив \(a = [10, 13, 5, 2, 6]\). Тогда итоговые скорости вагончиков будут равны: \([10, 10, 5, 2, 2]\). Соответственно, будет образовано \(3\) поезда. Также приходят сообщения о том, что какой-то двигатель был испорчен: - cообщение «k d» означает, что скорость \(k\)-го вагончика уменьшилась на \(d\) (то есть произошло изменение максимальной скорости вагончика \(a_k = a_k - d\)).
Сообщения приходят последовательно, при обработке очередного сообщения учитываются изменения от всех предыдущих сообщений. После каждого сообщения определите количество образовавшихся поездов. Выходные данные Выведите \(t\) строк. В каждой строке выведите ответ для соответствующего набора входных данных. Для каждого набора входных данных выведите \(m\) чисел: количество образовавшихся поездов после каждого сообщения. Примечание Для первого набора входных данных: - Изначально массив \(a = [6, 2, 3, 7]\).
- После первого сообщения массив \(a = [6, 2, 1, 7]\). Соответственно скорости вагончиков равны: \([6, 2, 1, 1]\) и будет образовано \(3\) поезда.
- После второго сообщения массив \(a = [6, 2, 1, 0]\). Соответственно скорости вагончиков равны: \([6, 2, 1, 0]\) и будет образовано \(4\) поезда.
Для второго набора входных данных: - Изначально массив \(a = [10, 13, 5, 2, 6]\).
- После первого сообщения массив \(a = [10, 9, 5, 2, 6]\). Соответственно скорости вагончиков равны: \([10, 9, 5, 2, 2]\) и будет образовано \(4\) поезда.
- После второго сообщения массив \(a = [10, 9, 5, 2, 4]\). Соответственно скорости вагончиков равны: \([10, 9, 5, 2, 2]\) и будет образовано \(4\) поезда.
- После третьего сообщения массив \(a = [5, 9, 5, 2, 4]\). Соответственно скорости вагончиков равны: \([5, 5, 5, 2, 2]\) и будет образовано \(2\) поезда.
- После четвёртого сообщения массив \(a = [5, 9, 3, 2, 4]\). Соответственно скорости вагончиков равны: \([5, 5, 3, 2, 2]\) и будет образовано \(3\) поезда.
| |
|
|
E. Число групп отрезков
графы
жадные алгоритмы
поиск в глубину и подобное
снм
сортировки
Структуры данных
*2300
Вам дано \(n\) цветных отрезков на числовой оси. Каждый отрезок либо красный, либо синий. Отрезок \(i\) описывается тройкой чисел \((c_i, l_i, r_i)\). Отрезок содержит все точки на отрезке \([l_i, r_i]\), включая концы, а его цвет описывается значением \(c_i\): - если \(c_i = 0\), то это красный отрезок;
- если \(c_i = 1\), то это синий отрезок.
Скажем, что два отрезка различных цветов соединены, если они имеют хотя бы одну общую точку. Два отрезка принадлежат одной группе отрезков, если они соединены непосредственно или через цепочку соединенных непосредственно отрезок. Найдите число различных групп отрезков. Выходные данные Для каждого набора входных данных выведите одно целое число \(k\) — количество групп отрезков. Примечание В первом примере \(5\) отрезков. Отрезки \(1\) и \(2\) соединены, так как они различных цветов и имеют общую точку. Также отрезки \(2\) и \(3\) соединены, и отрезки \(4\) и \(5\) соединены. Таким образом, есть две группы: одна содержит отрезки \(\{1, 2, 3\}\), другая содержит отрезки \(\{4, 5\}\).
| |
|
|
B. Все различные
жадные алгоритмы
сортировки
*800
У Sho есть массив \(a\) состоящий из \(n\) целых чисел. За одну операцию Sho может выбрать два различных индекса \(i\) и \(j\), после чего удалить из массива элементы \(a_i\) и \(a_j\). Например, для массива \([2, 3, 4, 2, 5]\) Sho может выбрать индексы \(1\) и \(3\) и удалить соответствующие элементы из массива. После этой операции массив будет выглядеть так: \([3, 2, 5]\). Заметьте, что после любой операции длина массива уменьшится на два. После нескольких операций у Sho остался массив, содержащий только различные числа. Также, он применил операции таким образом, что длина оставшегося массива максимальна из всех возможных. Более формально, после всех операций массив Sho удовлетворяет двум следующим критериям: - В массиве не существует таких пар индексов, что \(i < j\) и \(a_i = a_j\).
- Длина массива \(a\) максимальна.
Выведите длину оставшегося у Sho массива. Выходные данные Для каждого набора данных выведите единственное число — длину оставшегося массива. Помните, что в оставшемся массиве все элементы различны, а его длина максимальна. Примечание В первом наборе данных Sho может сделать следующие операции: - Выбрать индексы \(1\) и \(5\). Тогда массив станет \([2, 2, 2, 3, 3, 3] \rightarrow [2, 2, 3, 3]\).
- Выбрать индексы \(1\) и \(4\). Тогда массив станет \([2, 2, 3, 3] \rightarrow [2, 3]\).
Финальный массив имеет длину \(2\), так что ответом является \(2\). Можно доказать, что Sho не может получить массив большей длины. Во втором наборе данных Sho может сделать следующие операции: - Выбрать индексы \(3\) и \(4\). Тогда массив станет \([9, 1, 9, 9, 1] \rightarrow [9, 1, 1]\).
- Выбрать индексы \(1\) и \(3\). Тогда массив станет \([9, 1, 1] \rightarrow [1]\).
Финальный массив имеет длину \(1\), так что ответом является \(1\). Можно доказать, что Sho не может получить массив большей длины.
| |
|
|
G. 2^Сортировка
дп
сортировки
Структуры данных
*1400
Вам дан массив \(a\) длины \(n\) и число \(k\). Посчитайте количество подмассивов \([a_i, \dots, a_{i+k}]\) (здесь \(1 \leq i \leq n - k\)) длины \(k+1\) удовлетворяющих следующим условиям: - Если умножить первый элемент подмассива на \(2^0\), второй на \(2^1\), ..., и (\(k+1\))-й элемент на \(2^k\), то этот подмассив будет строго возрастающим.
Более формально, найдите количество индексов \(1 \leq i \leq n - k\) таких, что удовлетворяется \(k\) неравенств: \(\)2^0 \cdot a_i < 2^1 \cdot a_{i+1} < 2^2 \cdot a_{i+2} < \dots < 2^k \cdot a_{i+k}.\(\) Выходные данные Для каждого набора выведите единственное число — количество индексов, удовлетворяющих условиям. Примечание В первом наборе оба подмассива удовлетворяют условиям: - \(i=1\): помассив \([a_1,a_2,a_3] = [20,22,19]\), и \(1 \cdot 20 < 2 \cdot 22 < 4 \cdot 19\).
- \(i=2\): подмассив \([a_2,a_3,a_4] = [22,19,84]\), и \(1 \cdot 22 < 2 \cdot 19 < 4 \cdot 84\).
Во втором наборе три подмассива удовлетворяют условиям: - \(i=1\): подмассив \([a_1,a_2] = [9,5]\), и \(1 \cdot 9 < 2 \cdot 5\).
- \(i=2\): подмассив \([a_2,a_3] = [5,3]\), и \(1 \cdot 5 < 2 \cdot 3\).
- \(i=3\): подмассив \([a_3,a_4] = [3,2]\), и \(1 \cdot 3 < 2 \cdot 2\).
- \(i=4\): подмассив \([a_4,a_5] = [2,1]\), но \(1 \cdot 2 = 2 \cdot 1\), так что этот подмассив не удовлетворяет условиям.
| |
|
|
B. Промоакция
жадные алгоритмы
сортировки
*900
В магазине продаются \(n\) товаров, цена \(i\)-го товара равна \(p_i\). Руководство магазина собирается провести акцию: если в чеке не менее \(x\) товаров, \(y\) самых дешевых из них будут проданы бесплатно. Руководство ещё не определилось с точными значениями \(x\) и \(y\). Поэтому они просят вас обработать \(q\) запросов: для заданных значений \(x\) и \(y\) определить максимальную суммарную стоимость товаров, которые клиент может получить бесплатно, совершив одну покупку. Обратите внимание, что запросы являются независимыми, т. е. они никак не влияют на ассортимент магазина. Выходные данные Для каждого запроса выведите одно целое число — максимальная суммарная стоимость товаров, которые можно получить бесплатно за одну покупку (один чек). Примечание В первом запросе из примера можно купить три товара стоимостью \(5, 3, 5\), два самых дешевых из них имеют стоимость \(3 + 5 = 8\). Во втором запросе можно купить два товара стоимостью \(5\) и \(5\), самый дешевый из них имеет стоимость \(5\). В третьем запросе необходимо купить все товары для участия в акции, три самых дешевых из них имеют стоимость \(1 + 2 + 3 = 6\).
| |
|
|
E. PermutationForces II
Деревья
жадные алгоритмы
Комбинаторика
Перебор
сортировки
*2300
Вам дана перестановка \(a\) длины \(n\). Напомним, что перестановкой называется массив из \(n\) различных чисел от \(1\) до \(n\) в произвольном порядке. Ваша сила равна \(s\). Вы можете выполнить \(n\) операций с перестановкой \(a\). \(i\)-я операция состоит в следующем: - Выберите два значения \(x\) и \(y\) такие, что \(i \leq x \leq y \leq \min(i+s,n)\), и поменяйте местами числа \(x\) и \(y\) в перестановке \(a\). Обратите внимание, что вы можете выбрать \(x=y\), в таком случае обмена не произойдет.
Вы хотите превратить \(a\) в другую перестановку \(b\) после \(n\) операций. Однако некоторые элементы \(b\) отсутствуют и заменены на \(-1\). Вычислите количество способов заменить каждую \(-1\) в \(b\) на некоторое целое число от \(1\) до \(n\) так, чтобы \(b\) была перестановкой, и можно было превратить \(a\) в \(b\) силой \(s\). Так как ответ может быть большим, выведите его по модулю \(998\,244\,353\). Выходные данные Для каждого набора входных данных выведите одно целое число — количество способов достроить перестановку \(b\) так, чтобы можно было превратить \(a\) в \(b\) силой \(s\), по модулю \(998\,244\,353\). Примечание В первом примере \(a=[2,1,3]\). Существуют два способа заменить \(-1\), чтобы \(b\) стала перестановкой: \([3,1,2]\) и \([3,2,1]\). Перестановку \(a\) можно превратить в \([3,1,2]\) силой \(1\) следующим образом: \(\)[2,1,3] \xrightarrow[x=1,\,y=1]{} [2,1,3] \xrightarrow[x=2,\,y=3]{} [3,1,2] \xrightarrow[x=3,\,y=3]{} [3,1,2].\(\) Можно показать, что невозможно превратить \([2,1,3]\) в \([3,2,1]\) силой \(1\). Поэтому только одна перестановка \(b\) подходит, поэтому ответ \(1\). Во втором примере \(a\) и \(b\) такие же, как в предыдущем примере, но теперь у нас сила \(2\). Перестановку \(a\) можно превратить в \([3,2,1]\) силой \(2\) следующим образом: \(\)[2,1,3] \xrightarrow[x=1,\,y=3]{} [2,3,1] \xrightarrow[x=2,\,y=3]{} [3,2,1] \xrightarrow[x=3,\,y=3]{} [3,2,1].\(\) Можно также превратить \(a\) в \([3,1,2]\) используя силу \(1\) как раньше, поэтому ответ \(2\). В третьем примере есть только одна перестановка \(b\). Можно показать, что невозможно превратить \(a\) в \(b\), поэтому ответ \(0\).
| |
|
|
D. Восстановление перестановки
Бинарный поиск
жадные алгоритмы
математика
сортировки
Структуры данных
*1900
У Монокарпа была перестановка \(a\) состоящая из \(n\) чисел \(1\), \(2\), ..., \(n\) (перестановка — это массив, в котором каждый элемент от \(1\) до \(n\) встречается ровно один раз). Монокарп составил массив целых чисел \(b\) размера \(n\), где \(b_i = \left\lfloor \frac{i}{a_i} \right\rfloor\). Например, если перестановка \(a\) равна \([2, 1, 4, 3]\), то массив \(b\) равен \(\left[ \left\lfloor \frac{1}{2} \right\rfloor, \left\lfloor \frac{2}{1} \right\rfloor, \left\lfloor \frac{3}{4} \right\rfloor, \left\lfloor \frac{4}{3} \right\rfloor \right] = [0, 2, 0, 1]\). К сожалению, Монокарп потерял свою перестановку, поэтому он хочет восстановить ее. Ваша задача — найти перестановку \(a\), которая соответствует заданному массиву \(b\). Если таких перестановок несколько — выведите любую. Гарантируется, что хотя бы одна подходящая перестановка существует. Выходные данные Для каждого набора входных данных выведите \(n\) целых чисел — перестановку \(a\), которая соответствует заданному массиву \(b\). Если таких перестановок несколько — выведите любую.
| |
|
|
F. Очередная задача про пары, удовлетворяющие неравенству
Бинарный поиск
дп
жадные алгоритмы
сортировки
Структуры данных
*1300
Вам дан массив целых чисел \(a_1, a_2, \dots a_n\). Найдите число пар индексов \(1 \leq i, j \leq n\) таких, что \(a_i < i < a_j < j\). Выходные данные Для каждого набора входных данных выведите одно число — количество пар индексов, удовлетворяющих неравенству из условия. Пожалуйста, обратите внимание, что ответ для некоторых тестовых примеров может не поместиться в 32-разрядный целочисленный тип, поэтому вы должны использовать по крайней мере 64-разрядный целочисленный тип в вашем языке программирования (например, long long для C++). Примечание В первом наборе входных данных пары \((i, j)\) = \(\{(2, 4), (2, 8), (3, 8)\}\). - Пара \((2, 4)\) подходит, потому что \(a_2 = 1\), \(a_4 = 3\) и \(1 < 2 < 3 < 4\).
- Пара \((2, 8)\) подходит, потому что \(a_2 = 1\), \(a_8 = 4\) и \(1 < 2 < 4 < 8\).
- Пара \((3, 8)\) подходит, потому что \(a_3 = 2\), \(a_8 = 4\) и \(2 < 3 < 4 < 8\).
| |
|
|
C. Вирус
жадные алгоритмы
реализация
сортировки
*1200
На круге находятся \(n\) домов с номерами от \(1\) до \(n\). Для каждого \(1 \leq i \leq n - 1\) дом \(i\) и дом \(i + 1\) являются соседями; кроме того, дом \(n\) и дом \(1\) также являются соседями. Изначально \(m\) из этих \(n\) домов заражены смертельным вирусом. Каждое утро Cirno может выбрать незараженный дом и навсегда защитить его от заражения. Каждый день по порядку происходят следующие вещи: - Cirno выбирает незараженный дом и защищает его навсегда.
- Заражаются все незараженные и незащищенные дома, у которых есть хотя бы один зараженный сосед.
Cirno хочет остановить распространение вируса. Найдите минимальное количество домов, которые в итоге будут заражены, если вы оптимально выберете дома для защиты. Обратите внимание, что каждый день Cirno всегда выбирает дом для защиты до распространения вируса. Также защищенный дом не будет никогда заражен. Выходные данные Для каждого набора входных данных в отдельной строке выведите целое число — минимальное количество зараженных домов в итоге. Примечание В первом наборе входных данных получить ответ можно следующим образом: В начале первого дня заражены дома \(3\), \(6\), \(8\). Выберите дом \(2\) для защиты. В начале второго дня заражены дома \(3\), \(4\), \(5\), \(6\), \(7\), \(8\), \(9\). Выберите дом \(10\) для защиты. В начале третьего дня зараженных домов больше нет. Во втором наборе входных данных получить ответ можно следующим образом: В начале первого дня заражены дома \(2\), \(5\). Выберите дом \(1\) для защиты. В начале второго дня заражены дома \(2\), \(3\), \(4\), \(5\), \(6\). Не осталось незащищенных и незараженных домов.
| |
|
|
A. Фотограф Марк
жадные алгоритмы
сортировки
*800
Марка попросили сфотографировать группу из \(2n\) человек, \(i\)-й из них имеет рост \(h_i\). Для этого он выстроил этих людей в два ряда: передний и задний, каждый из которых состоит из \(n\) человек. На фотографии все люди хорошо видны, если рост \(j\)-го человека в дальнем ряду как минимум на \(x\) больше, чем рост \(j\)-го человека в ближнем ряду для каждого \(j\) от \(1\) до \(n\) включительно. Помогите Марку определить, возможно ли расставить людей описанным выше способом. Выходные данные Для каждого набора входных данных выведите «YES», если Марк может расставить людей в два ряда требуемым образом. В противном случае выведите «NO». Вы можете выводить «YES» и «NO» в любом регистре (например, строки «yES», «yes» и «Yes» будут распознаны как правильный ответ). Примечание В первом наборе входных данных из примера один из возможных требуемых порядков имеет следующий вид: третий, пятый и шестой человек должны встать в дальний ряд, а второй, первый и четвёртый — в ближний ряд. В этом случае расположение будет выглядеть так: | Дальний ряд | \(9\) | \(12\) | \(16\) | | Ближний ряд | \(3\) | \(1\) | \(10\) | Оно соответствует требованиям, так как: - \(h_3-h_2 = 9-3 \geq 6\),
- \(h_5-h_1 = 12-1\geq 6\), and
- \(h_6-h_4 = 16-10\geq 6\).
Для второго набора входных данных может быть показано, что требуемого расположения людей не существует. В третьем наборе входных данных единственный подходящий способ расположения следующий: второй человек стоит в дальнем ряду, а первый в ближнем.
| |
|
|
D. Марк и лампочки
жадные алгоритмы
Комбинаторика
Конструктив
математика
сортировки
*1800
Марк только что купил светильник из \(n\) лампочек. Состояние лампочек можно описать бинарной строкой \(s = s_1s_2\dots s_n\), где \(s_i=\texttt{1}\) означает, что \(i\)-я лампочка включена, а \(s_i=\texttt{0}\) означает, что \(i\)-я лампочка выключена. К сожалению, лампочки сломаны, и Марк может выполнять единственную операцию, чтобы изменять состояние лампочек: - выбрать индекс \(i\) из чисел \(2,3,\dots,n-1\) такой, что \(s_{i-1}\ne s_{i+1}\);
- переключить \(s_i\): если \(s_i\) равно \(\texttt{0}\), установить для \(s_i\) значение \(\texttt{1}\), и наоборот.
Марк хочет, чтобы состояние лампочек описывалось другой бинарной строкой \(t\). Помогите Марку определить минимальное количество операций, чтобы достичь это состояние. Выходные данные Для каждого набора входных данных выведите строку, содержащую минимальное количество операций, которые должен выполнить Марк, чтобы преобразовать состояние лампочек из \(s\) в \(t\). Если такой последовательности операций не существует, выведите \(-1\). Примечание В первом наборе входных данных примера одна из последовательностей операций, обеспечивающая минимальное количество операций, следующая: - выбрать \(i=3\), заменив \(\texttt{01}\color{red}{\texttt{0}}\texttt{0}\) на \(\texttt{01}\color{red}{\texttt{1}}\texttt{0}\);
- выбрать \(i=2\), заменив \(\texttt{0}\color{red}{\texttt{1}}\texttt{10}\) на \(\texttt{0}\color{red}{\texttt{0}}\texttt{10}\).
Во втором наборе входных данных искомой последовательности операций не существует, потому что нельзя изменить ни первый, ни последний символ \(s\). В третьем наборе входных данных, хотя первые символы \(s\) и \(t\) совпадают и последние символы \(s\) и \(t\) одинаковы, можно показать, что не существует последовательности операций, которая удовлетворяет условию. В четвертом наборе входных данных одна из последовательностей, обеспечивающая минимальное количество операций, выглядит следующим образом: - выбрать \(i=3\), заменив \(\texttt{00}\color{red}{\texttt{0}}\texttt{101}\) на \(\texttt{00}\color{red}{\texttt{1}}\texttt{101}\);
- выбрать \(i=2\), заменив \(\texttt{0}\color{red}{\texttt{0}}\texttt{1101}\) на \(\texttt{0}\color{red}{\texttt{1}}\texttt{1101}\);
- выбрать \(i=4\), заменив \(\texttt{011}\color{red}{\texttt{1}}\texttt{01}\) на \(\texttt{011}\color{red}{\texttt{0}}\texttt{01}\);
- выбрать \(i=5\), заменив \(\texttt{0110}\color{red}{\texttt{0}}\texttt{1}\) на \(\texttt{0110}\color{red}{\texttt{1}}\texttt{1}\);
- выбрать \(i=3\), заменив \(\texttt{01}\color{red}{\texttt{1}}\texttt{011}\) на \(\texttt{01}\color{red}{\texttt{0}}\texttt{011}\).
| |
|
|
B. Разностный массив
Перебор
реализация
сортировки
Структуры данных
*1900
Вам дан массив \(a\) состоящий из \(n\) неотрицательных целых чисел. Гарантируется, что \(a\) отсортирован от меньших к большим. За одну операцию мы создаем новый массив \(b_i=a_{i+1}-a_{i}\) для всех \(1 \le i < n\). Затем сортируем \(b\) от меньших к большим, заменяем \(a\) на \(b\) и уменьшаем \(n\) на \(1\). После применения \(n-1\) операции \(n\) становится равным \(1\). Вам нужно вывести единственное целое число в массиве \(a\) (то есть вывести \(a_1\)). Выходные данные Для каждого набора входных данных выведите ответ в отдельной строке. Примечание Чтобы упростить примечание, обозначим как \(\operatorname{sort}(a)\) массив, получаемый из \(a\) сортировкой от меньших к большим. В первом наборе изначально \(a=[1,10,100]\). После первой операции \(a=\operatorname{sort}([10-1,100-10])=[9,90]\). После второй операции \(a=\operatorname{sort}([90-9])=[81]\). Во втором наборе изначально \(a=[4,8,9,13]\). После первой операции \(a=\operatorname{sort}([8-4,9-8,13-9])=[1,4,4]\). После второй операции \(a=\operatorname{sort}([4-1,4-4])=[0,3]\). После последней операции \(a=\operatorname{sort}([3-0])=[3]\).
| |
|
|
C. Деревья поиска в глубину
графы
Деревья
жадные алгоритмы
поиск в глубину и подобное
снм
сортировки
*2400
Вам дан связный неориентированный граф из \(n\) вершин и \(m\) рёбер. Вес \(i\)-го ребра равен \(i\). Ниже представлен некорректный алгоритм поиска минимального остовного дерева: vis := массив длины n s := множество рёбер
function dfs(u): vis[u] := true пройтись по каждому ребру (u, v) в порядке увеличения весов if vis[v] = false добавить ребро (u, v) в множество (s) dfs(v)
function findMST(u): установить все элементы (vis) в false очистить множество (s) dfs(u) return множество (s)
Любой из вызовов функций findMST(1), findMST(2), ..., findMST(n) возвращает вам остовное дерево графа. Определите, какие из этих деревьев являются минимальными остовными деревьями. Выходные данные Выведите строку \(s\), состоящую из нулей и единиц, где \(s_i=1\), если findMST(i) возвращает минимальное остовное дерево, и \(s_i = 0\) иначе. Примечание Ниже показан граф из первого примера: В этом графе существует только одно минимальное остовное дерево, состоящее из ребер \((1,2),(3,5),(1,3),(2,4)\), имеющих суммарный вес \(1+2+3+5=11\). Ниже описана часть вычислений при вызове findMST(1): - реинициализируем массив vis и множество ребер s;
- вызываем dfs(1);
- vis[1] := true;
- итерируемся по ребрам \((1,2),(1,3)\);
- добавляем ребро \((1,2)\) во множество s, вызываем dfs(2):
- vis[2] := true;
- итерируемся по ребрам \((2,1),(2,3),(2,4)\);
- так как vis[1] = true, игнорируем ребро \((2,1)\);
- добавляем ребро \((2,3)\) во множество s, вызываем dfs(3):
В конце алгоритма будут выбраны ребра \((1,2),(2,3),(3,5),(2,4)\) с суммарным весом \(1+4+2+5=12>11\), поэтому findMST(1) находит не минимальное остовное дерево. Можно показать, что остальные остовные деревья являются минимальными, поэтому ответ 01111.
| |
|
|
C. Нуль-сортировка
жадные алгоритмы
сортировки
*1100
An array is sorted if it has no inversions A Young Boy Вам дан массив из \(n\) целых положительных чисел \(a_1,a_2,\ldots,a_n\). За одну операцию вы можете выполнить следующие действия: - Выбрать любое число \(x\).
- Для всех \(i\) таких, что \(a_i = x\), выполнить \(a_i := 0\) (присвоить \(0\) значению \(a_i\)).
Найдите минимальное количество операций, необходимых для того, что отсортировать массив в неубывающем порядке. Выходные данные Для каждого набора входных данных выведите единственное целое число — минимальное количество операций, необходимых для того, чтобы отсортировать массив в неубывающем порядке. Примечание В первом наборе входных данных вы можете выбрать \(x = 3\) при применении операции, тогда итоговый массив будет равен \([0, 0, 2]\). Во втором наборе входных данных, вы можете выбрать \(x = 1\) при применении первой операции и \(x = 3\) при применении второй операции, тогда итоговый массив будет равен \([0, 0, 0, 0]\).
| |
|
|
B. Оптимальное уменьшение
Конструктив
сортировки
*1000
У вас есть массив \(a\) из \(n\) положительных чисел. Вы можете выполнять следующую операцию: - выберите два индекса \(l\) и \(r\) (\(1 \leq l \leq r \leq n\)), затем
- уменьшите элементы \(a_l, a_{l + 1}, \dots, a_r\) на \(1\) каждый.
Пусть \(f(a)\) равно минимальному числу операций, необходимому, чтобы превратить массив \(a\) в массив из \(n\) нулей. Определите, верно ли, что для всех перестановок\(^\dagger\) \(b\) массива \(a\) выполняется \(f(a) \leq f(b)\). \(^\dagger\) Массив \(b\) является перестановкой массива \(a\), если \(b\) состоит из элементов массива \(a\) в произвольном порядке. Например, \([4,2,3,4]\) является перестановкой \([3,2,4,4]\), а \([1,2,2]\) не является перестановкой \([1,2,3]\). Выходные данные Для каждого набора входных данных выведите «YES» (без кавычек), если для всех перестановок \(b\) массива \(a\) выполняется \(f(a) \leq f(b)\), и «NO» (без кавычек) иначе. Вы можете выводить буквы в «YES» и «NO» в любом регистре (например, строки «yEs», «yes» и «Yes» будут приняты как положительный ответ). Примечание В первом примере можно превратить все элементы в \(0\) за \(5\) операций. Можно показать, что не существует перестановки массива \([2, 3, 5, 4]\) такой, что все ее элементы можно превратить в \(0\) меньше чем за \(5\). В третьем примере необходимо \(5\) операций, чтобы превратить все элементы в \(0\), а перестановка, равная \([2, 3, 3, 1]\), требует только \(3\) операции.
| |
|
|
C. Маршрутка
*особая задача
реализация
сортировки
*1500
Рядом с университетом находится остановка маршрутки. Пары закончились, и n студентов приходят на остановку. i-ый студент появляется на остановке в момент времени ti (все ti различны). Будем считать, что остановка находится в точке координатной прямой x = 0, а маршрутка ходит вдоль луча Ox, то есть в сторону положительного направления координатной прямой и обратно. i-ому студенту нужно попасть в точку с координатой xi (xi > 0). Маршрутка перемещается по следующему алгоритму. Изначально она находится в точке 0. Студенты последовательно приходят на остановку и садятся в нее. Как только в маршрутку сядет m студентов или сядет последний студент из n, она отправится в сторону положительного направления координатной прямой. Маршрутка двигается со скоростью 1 единица расстояния в 1 единицу времени, то есть за время y она проезжает расстояние y. Каждый раз, когда маршрутка проезжает точку, в которой нужно выйти хотя бы одному студенту, она останавливается, и эти студенты выходят. На высадку студентов тратится 1 + [k / 2] единиц времени, где k — количество студентов, которые выходят в этой точке. Запись [k / 2] обозначает целую часть при делении k на 2. Как только из маршрутки выходит последний студент, она разворачивается и едет без остановок обратно в точку x = 0. Там она вновь наполняется студентами, и история повторяется. Если студенты приходят на остановку, когда маршрутки там нет, они встают в очередь и садятся в маршрутку в том порядке, в котором они пришли. Посадка любого количества студентов и остальные действия происходит мгновенно, а других пассажиров нет. Напишите программу, которая определит для каждого студента момент времени, когда он вышел из маршрутки. Моментом выхода студента из маршрутки считайте момент ее остановки в точке выхода студента (несмотря на то, что высадка группы студентов произойдет не мгновенно). Выходные данные Выведите n чисел w1, w2, ..., wn, wi — момент времени, когда i-ый студент вышел из маршрутки. Числа выводите в одну строку и разделяйте единичными пробелами. Примечание В первом примере маршрутка ждет первого студента 3 единицы времени и отвозит его до места назначения за 5 единиц времени. То есть студент выходит из маршрутки в момент времени 3 + 5 = 8. Во втором примере вместимость маршрутки равна 1, поэтому сначала она повезет одного первого студента. Этот студент — такой же, как студент в первом примере, то есть маршрутка доезжает до его места назначения в момент времени 8, тратит на высадку 1 + [1 / 2] = 1 единицу времени, и возвращается назад еще за 5 единиц времени. Таким образом, маршрутка возвращается назад в момент времени 14. К этому моменту второй студент уже подошел к остановке, поэтому он садится в маршрутку, 5 единиц времени едет до места назначения, и приезжает в момент 14 + 5 = 19. В третьем примере маршрутка ждет четвертого студента 6 единиц времени, затем едет 5 единиц времени, затем высаживает студентов за 1 + [4 / 2] = 3 единиц времени, возвращается за 5 единиц времени, везет пятого студента 1 единицу времени.
| |
|
|
B. Интересная сумма
жадные алгоритмы
математика
Перебор
сортировки
Структуры данных
*800
Дан массив \(a\) длины \(n\). Вы можете выбрать любой подотрезок \(a_l, a_{l + 1}, \ldots, a_r\) массива длины, не совпадающий со всем массивом, то есть, для которого \(1 \le l \le r \le n\) и \(r - l + 1 < n\). Красотой выбранного подоторезка назовем значение \(\)\max(a_{1}, a_{2}, \ldots, a_{l-1}, a_{r+1}, a_{r+2}, \ldots, a_{n}) - \min(a_{1}, a_{2}, \ldots, a_{l-1}, a_{r+1}, a_{r+2}, \ldots, a_{n}) + \max(a_{l}, \ldots, a_{r}) - \min(a_{l}, \ldots, a_{r}).\(\) Найдите максимальную красоту подотрезка среди всех возможных допустимых подотрезков массива (за исключением всего массива). Выходные данные Для каждого набора входных данных выведите одно число — искомое максимальное значение красоты. Примечание В первом тесте из условия оптимально выбрать отрезок \(l = 7\), \(r = 8\). Красота этого отрезка равна \((6 - 1) + (5 - 1) = 9\). Во втором тесте из условия оптимально выбрать отрезок \(l = 2\), \(r = 4\). Красота этого отрезка равна \((100 - 2) + (200 - 1) = 297\).
| |
|
|
D. Максимальное И
битмаски
жадные алгоритмы
поиск в глубину и подобное
разделяй и властвуй
сортировки
*1800
Вам даны два массива \(a\) и \(b\), состоящие из \(n\) целых чисел каждый. Определим функцию \(f(a, b)\) следующим образом: - определим массив \(c\) размера \(n\), где \(c_i = a_i \oplus b_i\) (\(\oplus\) обозначает операцию побитового исключающего ИЛИ);
- значением функции является \(c_1 \mathbin{\&} c_2 \mathbin{\&} \cdots \mathbin{\&} c_n\) (т.е. побитовое И всех элементов массива \(c\)).
Найдите максимальное значение функции \(f(a, b)\), если вы можете переупорядочить элементы массива \(b\) произвольным образом (также можно оставить первоначальный порядок). Выходные данные Для каждого набора входных данных выведите одно целое число — максимальное значение функции \(f(a, b)\), если вы можете переупорядочить элементы массива \(b\) произвольным образом.
| |
|
|
D. Ряд
жадные алгоритмы
сортировки
*1100
В ряд вдоль одной линии стоят \(n\) человек, каждый смотрит либо влево, либо вправо. Каждый человек посчитал количество людей, которое он видит (то есть количество человек в направлении его взгляда). Назовём величиной ряда сумму посчитанных значений. Например, если люди стоят следующим образом: LRRLL, где L обозначает человека в направлении «влево», а R обозначает человека в направлении «вправо», то посчитанные значения равны \([0, 3, 2, 3, 4]\), а величина ряда равна \(0+3+2+3+4=12\). Вам задано начальное расположение людей вдоль линии. Для каждого \(k\) от \(1\) до \(n\), определите максимальную возможную величину ряда, если вы можете изменить направление не более чем у \(k\) человек. Выходные данные Для каждого набора входных данных выведите \(n\) целых чисел — для всех \(k\) от \(1\) до \(n\) выведите максимальное значение ряда, если можно изменить направление не более чем \(k\) человек в ряду. Примечание В первом наборе входных данных примера: - \(k=1\): изменим направление \(1\)-го человека, чтобы достичь состояния RLR. В этом случае величина ряда равна \(2+1+0=3\).
- \(k=2\): изменим направление \(2\)-х человек, чтобы ряд принял вид RLL. В этом случае величина ряда будет равна \(2+1+2=5\).
- \(k=3\): изменим направление \(2\)-х человек, чтобы ряд принял вид RLL. В этом случае величина ряда будет равна \(2+1+2=5\) (обратите внимание, что можно менять направление \(k\) или меньше людей).
Во втором наборе входных данных примера для каждого \(k\) от \(1\) до \(5\) достаточно только лишь менять направление одного первого человека (чтобы ряд принял вид RRRLL).
| |
|
|
B. Basketball Together
Бинарный поиск
жадные алгоритмы
сортировки
*1000
A basketball competition is held where the number of players in a team does not have a maximum or minimum limit (not necessarily \(5\) players in one team for each match). There are \(N\) candidate players in the competition that will be trained by Pak Chanek, the best basketball coach on earth. The \(i\)-th candidate player has a power of \(P_i\). Pak Chanek will form zero or more teams from the \(N\) candidate players on the condition that each candidate player may only join in at most one team. Each of Pak Chanek's teams will be sent to compete once with an enemy team that has a power of \(D\). In each match, the team sent is said to defeat the enemy team if the sum of powers from the formed players is strictly greater than \(D\). One of Pak Chanek's skills is that when a team that has been formed plays in a match, he can change the power of each player in the team to be equal to the biggest player power from the team. Determine the maximum number of wins that can be achieved by Pak Chanek. Output A line containing an integer representing the maximum number of wins that can be achieved by Pak Chanek. Note The \(1\)-st team formed is a team containing players \(4\) and \(6\). The power of each player in the team becomes \(100\). So the total power of the team is \(100 + 100 = 200 > 180\). The \(2\)-nd team formed is a team containing players \(1\), \(2\), and \(5\). The power of each player in the team becomes \(90\). So the total power of the team is \(90 + 90 + 90 = 270 > 180\).
| |
|
|
F. Field Photography
битмаски
сортировки
Структуры данных
*2100
Pak Chanek is traveling to Manado. It turns out that OSN (Indonesian National Scientific Olympiad) 2019 is being held. The contestants of OSN 2019 are currently lining up in a field to be photographed. The field is shaped like a grid of size \(N \times 10^{100}\) with \(N\) rows and \(10^{100}\) columns. The rows are numbered from \(1\) to \(N\) from north to south, the columns are numbered from \(1\) to \(10^{100}\) from west to east. The tile in row \(r\) and column \(c\) is denoted as \((r,c)\). There are \(N\) provinces that participate in OSN 2019. Initially, each contestant who represents province \(i\) stands in tile \((i, p)\) for each \(p\) satisfying \(L_i \leq p \leq R_i\). So, we can see that there are \(R_i-L_i+1\) contestants who represent province \(i\). Pak Chanek has a variable \(Z\) that is initially equal to \(0\). In one operation, Pak Chanek can choose a row \(i\) and a positive integer \(k\). Then, Pak Chanek will do one of the two following possibilities: - Move all contestants in row \(i\) exactly \(k\) tiles to the west. In other words, a contestant who is in \((i, p)\) is moved to \((i, p-k)\).
- Move all contestants in row \(i\) exactly \(k\) tiles to the east. In other words, a contestant who is in \((i, p)\) is moved to \((i, p+k)\).
After each operation, the value of \(Z\) will change into \(Z \text{ OR } k\), with \(\text{OR}\) being the bitwise OR operation. Note that Pak Chanek can do operations to the same row more than once. Also note that Pak Chanek is not allowed to move contestants out of the grid. There are \(Q\) questions. For the \(j\)-th question, you are given a positive integer \(W_j\), Pak Chanek must do zero or more operations so that the final value of \(Z\) is exactly \(W_j\). Define \(M\) as the biggest number such that after all operations, there is at least one column that contains exactly \(M\) contestants. For each question, you must find the biggest possible \(M\) for all sequences of operations that can be done by Pak Chanek. Note that the operations done by Pak Chanek for one question do not carry over to other questions. Output Output \(Q\) lines, with the \(j\)-th line containing an integer that is the answer to the \(j\)-th question. Note For the \(1\)-st question, Pak Chanek can do the following operations to get \(M=2\): - Move all contestants in row \(2\) to the east by \(4\) tiles. \(Z\) changes into \(0 \text{ OR } 4 = 4\).
- Move all contestants in row \(1\) to the east by \(12\) tiles. \(Z\) changes into \(4 \text{ OR } 12 = 12\).
Now, columns \(14\) and \(15\) each contains exactly \(2\) contestants. For the \(2\)-nd question, Pak Chanek can do the following operations to get \(M=3\): - Move all contestants in row \(3\) to the east by \(4\) tiles. \(Z\) changes into \(0 \text{ OR } 4 = 4\).
- Move all contestants in row \(3\) to the west by \(1\) tiles. \(Z\) changes into \(4 \text{ OR } 1 = 5\).
- Move all contestants in row \(1\) to the east by \(5\) tiles. \(Z\) changes into \(5 \text{ OR } 5 = 5\).
- Move all contestants in row \(1\) to the east by \(5\) tiles. \(Z\) changes into \(5 \text{ OR } 5 = 5\).
Now, column \(11\) contains exactly \(3\) contestants. The following is an illustration of the example operations for the \(2\)-nd question. 
| |
|
|
G. Некая волшебная вечеринка
жадные алгоритмы
Комбинаторика
сортировки
Структуры данных
*3300
На вечеринке есть \(n\) человек. \(i\)-й человек имеет уровень счастья \(a_i\). У каждого человека есть определенный тип личности, который можно представить в виде двоичного целого числа \(b\). Если \(b = 0\), то счастье человека будет увеличиваться, если он рассказывает историю кому-то со строго меньшим счастьем, чем у него. Если \(b = 1\), то счастье человека будет увеличиваться, если он рассказывает историю кому-то со строго большим счастьем, чем у него. Давайте определим порядок выступления как порядок людей слева направо. Теперь происходит следующий процесс. Мы идем слева направо. Текущий человек говорит рассказывает историю всем остальным людям. Заметьте, что все уровни счастья остаются неизменными во время этого. После того, как человек закончил, он подсчитывает количество людей, которым он рассказывал историю и которые имеют строго меньший/больший уровень счастья, чем он, в соответствии с его типом личности, и его счастье увеличивается на это значение. Заметьте, что увеличивается уровень счастья только текущего человека. Как организатор вечеринки, вы не хотите, чтобы кто-то ушел грустным. Следовательно, вы хотите подсчитать количество порядков выступления, чтобы в конце процесса все \(n\) человек имели равные уровни счастья. Два порядка выступления считаются разными, если существует хотя бы один человек, не занимающий одинаковое положение в двух порядках выступления. Выходные данные Выведите количество различных допустимых последовательностей выступлений. Так как это число может быть большим, выведите его по модулю \(998244353\). Примечание Здесь объяснение для первого примера. Одним из корректных порядков выступлений является \([2,1,4,3]\) (здесь, мы написали индексы каждого человека). Каждый шаг показывает текущие уровни счастья и результаты. Шаг \(1\): \([1,2,4,4]\) \(\rightarrow\) Человек \(2\) рассказывает историю остальным. Так как его тип личности равен \(1\), его счастье увеличится на \(2\), так как люди \(3\) и \(4\) имеют строго большие уровни счастья. Шаг \(2\): \([1,4,4,4]\) \(\rightarrow\) Человек \(1\) рассказывает историю остальным. Так как его тип личности равен \(1\), его счастье увеличится на \(3\), так как люди \(2\), \(3\) и \(4\) имеют строго большие уровни счастья. Шаг \(3\): \([4,4,4,4]\) \(\rightarrow\) Человек \(4\) рассказывает историю остальным. Так кае его тип личности равен \(0\), его счастье увеличится на \(0\), так как ни у кого нет строго меньшего уровня счастья. Шаг \(4\): \([4,4,4,4]\) \(\rightarrow\) Человек \(3\) рассказывает историю остальным. Так как его тип личности равен \(0\), его счастье увеличится на \(0\), так как ни у кого нет строго меньшего уровня счастья. В итоге, у всех одинаковый уровень счастья. Заметьте, что \([2,1,3,4]\) также является корректным порядком для примера. Можно показать, что не существует корректных порядков во втором примере.
| |
|
|
A. Разноцветные шары: перезагрузка
жадные алгоритмы
Перебор
реализация
сортировки
*800
Название — это отсылка на самый первый Educational Round нашего авторского коллектива, Educational Round 18. Есть мешок, в котором лежат разноцветные шары. Всего есть \(n\) различных цветов шаров, пронумерованные от \(1\) до \(n\). В мешке лежат \(\mathit{cnt}_i\) шаров цвета \(i\). Суммарное количество шаров в мешке нечетное (т. е. \(\mathit{cnt}_1 + \mathit{cnt}_2 + \dots + \mathit{cnt}_n\) нечетное). За один ход можно выбрать два шара разных цветов и вынуть их из мешка. В какой-то момент все оставшиеся в мешке шары станут одного цвета. Тогда вы больше не можете делать ходы. Найдите любой возможный цвет оставшихся шаров. Выходные данные На каждый набор входных данных выведите одно целое число — любой возможный цвет оставшихся шаров после того как вы сделали какие-либо ходы и больше не можете делать ходы. Примечание В первом наборе входных данных ваш первый и единственный ход может быть одним из следующих: - возьмем шары с цветами \(1\) и \(2\);
- возьмем шары с цветами \(1\) и \(3\);
- возьмем шары с цветами \(2\) и \(3\).
После хода останется ровно один шар. Его цвет может быть \(3, 2\) или \(1\) в зависимости от хода. Во втором наборе не получится сделать ход вообще — есть всего один цвет шаров. Этот цвет \(1\). В третьем примере можно удалять один шар цвета \(1\) и один шар цвета \(2\), пока не закончатся шары цвета \(1\). В конце останутся три шара цвета \(2\).
| |
|
|
C. Цифровой логарифм
жадные алгоритмы
сортировки
Структуры данных
*1400
Определим \(f(x)\) для положительного числа \(x\) как длину десятичного представления \(x\) без лидирующих нулей. Мне нравится называть это цифровым логарифмом. Похоже на цифровой корень, если вы с таким знакомы. Даны два массива \(a\) и \(b\), каждый содержит по \(n\) целых положительных чисел. За одну операцию вы можете сделать следующее: - выбрать целое число \(i\) от \(1\) до \(n\);
- присвоить либо \(f(a_i)\) вместо \(a_i\), либо \(f(b_i)\) вместо \(b_i\).
Два массива называются похожими друг на друга, если можно переупорядочить элементы в них обоих так, чтобы они стали равны (т. е. \(a_i = b_i\) для всех \(i\) от \(1\) до \(n\)). Какое наименьшее количество операций надо сделать, чтобы \(a\) и \(b\) стали похожими друг на друга? Выходные данные На каждый набор входных данных выведите наименьшее количество операций, которые надо сделать, чтобы \(a\) и \(b\) стали похожими друг на друга. Примечание В первом наборе входных данных можно применить цифровой логарифм к \(b_1\) дважды. Во втором наборе входных данных массивы уже похожи друг на друга. В третьем наборе входных данных можно применить цифровой логарифм сначала к \(a_1\), затем к \(b_2\).
| |
|
|
D. Друзья и ресторан
жадные алгоритмы
сортировки
*1200
Компания из \(n\) друзей решила сходить в ресторан. Каждый из друзей планирует сделать заказ на \(x_i\) бурлей, а всего у него есть \(y_i\) бурлей (\(1 \le i \le n\)). Компания решила разбить посещение ресторана на несколько дней. Каждый день в ресторан отправляется некоторая группа из хотя бы двух друзей. Каждый из друзей посещает ресторан не более одного раза (то есть эти группы не пересекаются). Эти группы должны удовлетворять условию: суммарный бюджет каждой группы должен быть не меньше суммы, которую собираются потратить друзья из группы в ресторане. Другими словами, сумма всех значений \(x_i\) в группе не должна превышать сумму значений \(y_i\) в группе. Какое максимальное количество дней друзья могут посещать ресторан? Например, пусть есть \(n = 6\) друзей, для которых \(x\) = [\(8, 3, 9, 2, 4, 5\)], а \(y\) = [\(5, 3, 1, 4, 5, 10\)]. Тогда: - Первый и шестой друзья могут пойти в ресторан в первый день. Они потратят в ресторане \(8+5=13\) бурлей, а их суммарный бюджет составляет \(5+10=15\) бурлей. Так как \(15 \ge 13\), то они в самом деле могут образовать группу.
- Друзья с номерами \(2, 4, 5\) могут образовать вторую группу. Они потратят в ресторане \(3+2+4=9\) бурлей, а их общий бюджет составит \(3+4+5=12\) бурлей (\(12 \ge 9\)).
Можно показать, что образовать большее число групп так, чтобы в каждой группе было хотя бы два друга и можно было оплатить счёт, они не смогут. Таким образом, максимальное количество групп, на которое могут разбиться друзья равно \(2\). Друзья будут посещать ресторан максимум два дня. Отметим, что \(3\)-й из друзей не посетит ресторан вообще. Выведите максимальное количество дней посещения ресторана по заданным \(n\), \(x\) и \(y\). Выходные данные Для каждого набора входных данных выведите максимальное количество дней посещения ресторана. Если друзья не могут образовать даже одну группу для посещения, то выведите 0. Примечание Первый набор входных данных разобран в условии. Во втором наборе входных данных примера друзья не могут образовать хотя бы одну группу из двух или более человек. В третьем наборе входных данных один из способов посещать ресторан в течение одного дня — отправиться группой из всех трёх друзей (\(1+3+10 \ge 2+3+7\)). Заметим, что возможности разбиться на две группы у них нет.
| |
|
|
E. Отдыхаем группами
сортировки
Структуры данных
*2600
Один очень известный клуб «по интересам» собирает своих членов на отдых на природе. Чтобы мероприятие было интересней, директора клуба решили разбить членов клуба на группы. Каждый человек характеризуется двумя целыми числами: ri — ответственность, ai — возраст. Группой назовем непустое подмножество членов клуба с одним особенным членом клуба, которого мы будем называть лидером группы. Лидер группы должен быть одним из самых ответственных людей в группе (его ответственность должна быть не меньше, чем у любого другого человека из группы), также возраст любого человека в группе должен отличаться не более чем на k от возраста лидера группы. Некоторые члены клуба друзья, поэтому они хотят попасть в одну группу. Конечно же, интересней отдыхать в группе с большим количеством людей. Поэтому администрация клуба просит Вас написать программу, которая будет отвечать на следующий запрос: «Какой наибольший размер может быть у группы, которая содержит одновременно человека x и человека y?». Возможно, x или y будет лидером этой группы. Выходные данные Для каждого запроса выведите ответ в отдельной строке — максимальное количество людей в группе, которая содержит заданных людей. Если такой группы не существует, выведите -1. Примечание В первом запросе самая большая группа, включающая участников 3 и 5 — это группа {1, 3, 4, 5}, где 3 является лидером группы. Во втором запросе лидером должен быть участник 2, так, что группа будет иметь следующий состав: {1, 2, 3}. В третьем запросе у лидера группы должен быть возраст 3. Следовательно, единственным лидером может быть участник 3, но он менее ответственный, чем участник 2. Таким образом, сформировать такую группу невозможно. В четвертом запросе группа такая же, как и в первом.
| |
|
|
A. Планеты
жадные алгоритмы
сортировки
Структуры данных
*800
Однажды вогоны захотели построить новую гиперпространственную магистраль в удалённой системе из \(n\) планет. Планета номер \(i\) в этой системе находится на орбите \(a_i\), на одной орбите может находиться несколько планет. К сожалению, все эти планеты мешают строительству и должны быть уничтожены. У вогонов есть для уничтожения две машины. - Первая машина за раз может уничтожить любую планету за \(1\) триганский пу.
- Вторая машина за раз может уничтожить все планеты на одной орбите этой системы за \(c\) триганских пу.
Вогоны могут использовать каждую машину сколько угодно раз. Вогоны очень жадные, поэтому они хотят уничтожить все планеты, затратив при этом минимально возможное количество средств. Помогите им подсчитать минимальную стоимость этого проекта. Выходные данные Для каждого набора входных данных выведите единственное целое число — минимальную стоимость уничтожения всех планет. Примечание В первом наборе входных данных стоимость использования обеих машин одинакова, поэтому можно всегда пользоваться второй машиной и уничтожить все планеты, находящиеся на орбите \(1\), все планеты, находящиеся на орбите \(2\), все планеты, находящиеся на орбите \(4\), все планеты, находящиеся на орбите \(5\). Во втором наборе входных данных выгодно с помощью второй машины за \(2\) триганских пу уничтожить все планеты находящиеся на орбите \(2\), затем уничтожить с помощью первой машины оставшиеся две планеты. В третьем наборе входных данных можно воспользоваться первой машиной дважды или второй один раз. В четвертом наборе входных данных выгодно два раза воспользоваться первой машиной.
| |
|
|
C. Минимальная запись
жадные алгоритмы
математика
сортировки
Структуры данных
*1200
У вас есть строка \(s\), состоящая из цифр от \(0\) до \(9\) включительно. Вы можете произвести над ней следующую операцию любое (возможно нулевое) количество раз: - Вы можете выбрать позицию \(i\) и удалить цифру \(d\) на \(i\)-й позиции. Затем нужно вставить цифру \(\min{(d + 1, 9)}\) в любую позицию (в начало, в конец или между любыми двумя соседними цифрами).
Какую лексикографически минимальную строку вы можете получить после этих операций? Строка \(a\) лексикографически меньше строки \(b\) той же длины, если и только если выполняется следующее: - в первой позиции, где \(a\) и \(b\) различны, в строке \(a\) находится цифра меньшая, чем соответствующая цифра в \(b\).
Выходные данные Выведите единственную строку — лексикографически минимальную строку, которую можно получить. Примечание В первом наборе входных данных: - Удалим \(8\) и поместим в конец строки \(9\). Получается строка \(04299\).
- Удалим \(4\) и поместим на \(3\)-ю позицию строки \(5\). Получается строка \(02599\).
Во втором и третьем наборах входных данных не нужно ничего делать.
| |
|
|
A. Последовательная сумма
жадные алгоритмы
сортировки
*800
Вам дан массив \(a\) с \(n\) целыми числами. Вы можете выполнить следующую операцию не более \(k\) раз: - Выберите два индекса \(i\) и \(j\), в которых \(i \,\bmod\, k = j \,\bmod\, k\). (\(1 \le i < j \le n\)).
- Поменяйте местами \(a_i\) и \(a_j\).
После выполнения всех операций вы должны выбрать \(k\) последовательных элементов, и сумма этих \(k\) элементов станет вашим счетом. Найдите максимальное количество очков, которое вы можете получить. Здесь \(x \bmod y\) обозначает остаток от деления \(x\) на \(y\). Выходные данные Для каждого набора входных данных выведите максимальное количество баллов, которое вы можете получить, по одному в каждой строке. Примечание В первом примере мы можем получить счет \(11\), если выберем \(a_1, a_2\) без выполнения операций. В третьем примере, если мы поменяем местами \(a_1\) и \(a_4\), а потом выберем \(a_3, a_4, a_5\), то мы получим счет \(15\).
| |
|
|
C. Сортировка четностью
Конструктив
сортировки
*1300
Вам дан массив \(a\) из \(n\) неотрицательных целых чисел. Вы можете применять на нём следующую операцию. - Выберите два индекса \(l\) и \(r\) (\(1 \le l < r \le n\)).
- Если \(a_l + a_r\) нечетно, то выполните \(a_r := a_l\). Если \(a_l + a_r\) четно, то выполните \(a_l := a_r\).
Найдите любую последовательность из не более чем \(n\) операций, которая делает массив \(a\) неубывающим. Можно доказать, что она всегда существует. Обратите внимание, что вам не нужно минимизировать количество операций. Массив \(a_1, a_2, \ldots, a_n\) неубывающий тогда и только тогда, когда \(a_1 \le a_2 \le \ldots \le a_n\). Выходные данные Для каждого набора входных данных выведите в первой строке одно целое число \(m\) (\(0 \le m \le n\)) — количество операций. Затем выведите \(m\) строк. Каждая строка должна содержать два целых числа \(l_i, r_i\), которые являются индексами, выбранными вами в \(i\)-й операции (\(1 \le l_i < r_i \le n\)). Если решений несколько, выведите любое из них. Примечание Во втором примере \(a\) изменяется следующим образом: - Выберите индексы \(3\) и \(4\). \(a_3 + a_4 = 3\) нечетно, поэтому надо выполнить \(a_4 := a_3\). После этого \(a = [1, 1000000000, 3, 3, 5]\).
- Выберите индексы \(1\) и \(2\). \(a_1 + a_2 = 1000000001\) нечетно, поэтому надо выполнить \(a_2 := a_1\). Теперь \(a = [1, 1, 3, 3, 5]\) и массив неубывающий.
В первом и третьем примерах \(a\) уже неубывающий.
| |
|
|
A. Выбор трех палочек
жадные алгоритмы
Перебор
сортировки
*800
У вас есть \(n\) палочек с положительными целочисленными длинами \(a_1, a_2, \ldots, a_n\). Вы можете выполнить следующую операцию произвольное число раз (возможно, ноль): - выберите одну палочку, затем увеличьте или уменьшите ее длину на \(1\). После каждой операции длины всех палочек должны остаться положительными.
Какое минимальное число операций необходимо, чтобы вы могли выбрать три палочки из данных \(n\) и сложить их, не ломая, в равносторонний треугольник? Равносторонним треугольником называется треугольник, у которого все три стороны равны. Выходные данные Для каждого набора входных данных выведите одно целое число — минимально необходимое число операций. Примечание В первом примере можно увеличить длину первой палочки на \(1\), затем уменьшить длину третьей палочки на \(1\). Всего вы сделаете \(2\) операции, и сможете взять три палочки, чтобы собрать равносторонний треугольник с длиной стороны \(2\). In the fourth test case, you can decrease the length of the seventh stick by \(1\). An equilateral triangle of side length \(1\) can be selected and formed by the second, fourth, and seventh sticks.
| |
|
|
A. Превратить A в B
жадные алгоритмы
Перебор
сортировки
*800
Вам даны два массива \(a\) и \(b\) длины \(n\), каждый элемент массивов — либо \(0\), либо \(1\). Вы можете выполнять операции \(2\) типов. - Выбрать индекс \(i\) и изменить \(a_i\) на \(1-a_i\).
- Переупорядочить массив \(a\) произвольным образом.
Найдите минимальное количество операций, необходимое для того, чтобы массив \(a\) стал равен массиву \(b\). Выходные данные Для каждого набора входных данных выведите минимальное число операций для превращения \(a\) в \(b\). Примечание В первом примере нужна только одна операция: изменить \(a_1\) на \(1-a_1\). После этого \(a = [0, 0, 1]\), что равно \(b\). Во втором примере один из оптимальных способов — сначала изменить \(a_3\) на \(1 - a_3\), затем переупорядочить \(a\). В третьем примере операции не требуются. В четвертом примере оптимально переупорядочить \(a\), чтобы получился массив \([0, 1, 1, 0]\).
| |
|
|
A. Упоротая слава
жадные алгоритмы
реализация
сортировки
*800
Герой очень хочет славы, поэтому он сражается с монстрами. У героя есть \(n\) способностей. \(i\)-я способность имеет тип \(a_i\) (любой из огонь или мороз) и исходный урон \(b_i\). Герой может использовать все \(n\) способностей в любом порядке (каждая способность будет использована только один раз). При использовании каждой способности, происходит следующее: - Если текущая способность следует сразу за способностью другого типа, то её урон удваивается.
Другими словами, - Если способность типа огонь с исходным уроном \(c\) используется сразу после способности с типом огонь, тогда она нанесет \(c\) урона;
- Если способность типа огонь с исходным уроном \(c\) используется сразу после способности с типом мороз, тогда она нанесет \(2c\) урона;
- Если способность типа мороз с исходным уроном \(c\) используется сразу после способности с типом огонь, тогда она нанесет \(2c\) урона;
- Если способность типа мороз с исходным уроном \(c\) используется сразу после способности с типом мороз, тогда она нанесет \(c\) урона.
Ваша задача найти максимальный урон, который может нанести герой. Выходные данные Для каждого набора входных данных выведите максимальный урон, который может нанести герой. Примечание В первом наборе входных данных мы можем применить способности в порядке \([3, 1, 4, 2]\), и суммарный урон будет \(100 + 2 \times 1 + 2 \times 1000 + 10 = 2112\). Во втором наборе входных данных мы можем применить способности в порядке \([1, 4, 2, 5, 3, 6]\), и суммарный урон будет \(3 + 2 \times 6 + 2 \times 4 + 2 \times 7 + 2 \times 5 + 2 \times 8 = 63\). В третьем наборе входных данных мы можем применить способности в порядке \([1, 2, 3]\), и суммарный урон будет \(1000000000 + 1000000000 + 1000000000 = 3000000000\). В четвертом примере всего одна способность с уроном \(1\), значит суммарный урон будет \(1\).
| |
|
|
B. Упоротые префиксные суммы
жадные алгоритмы
Конструктив
математика
сортировки
*1200
Пусть \(a_1, a_2, \dots, a_n\) - отсортированная последовательность целых чисел длины \(n\) такая, что \(a_1 \leq a_2 \leq \dots \leq a_n\). Для каждого \(1 \leq i \leq n\), префиксная сумма \(s_i\) первых \(i\) элементов \(a_1, a_2, \dots, a_i\) определяется как \(\) s_i = \sum_{k=1}^i a_k = a_1 + a_2 + \dots + a_i. \(\) Вам заданы последние \(k\) элементов префиксных сумм, а именно \(s_{n-k+1}, \dots, s_{n-1}, s_{n}\). Ваша задача определить, возможно ли это. Формально, дано \(k\) целых чисел \(s_{n-k+1}, \dots, s_{n-1}, s_{n}\), задача состоит в том, чтобы проверить, есть ли последовательность целых чисел \(a_1, a_2, \dots, a_n\) такая, что - \(a_1 \leq a_2 \leq \dots \leq a_n\), и
- \(s_i = a_1 + a_2 + \dots + a_i\) для всех \(n-k+1 \leq i \leq n\).
Выходные данные Для каждого набора входных данных выведите «YES» (без кавычек) если это возможно и «NO» (без кавычек) в противном случае. Вы можете выводить «YES» и «NO» в любом регистре (например, строки «yEs», «yes» и «Yes» будут распознаны как положительный ответ). Примечание В первом наборе входных данных подходит только \(a = [1, 1, 1, 1, 1]\). Во втором наборе входных данных мы можем выбрать \(a = [-3, -2, -1, 0, 1, 2, 3]\). В третьем наборе входных данных подходит только \(a = [2, 1, 1]\), но это не отсортированная последовательность. В четвертом наборе входных данных может быть показано, что такой последовательности не существует.
| |
|
|
B. Много лишнего сыра 2
геометрия
жадные алгоритмы
сортировки
*800
У Пака Чанека есть \(n\) двухмерных ломтиков сыра. \(i\)-й ломтик сыра можно представить в виде прямоугольника размерами \(a_i \times b_i\). Мы хотим расположить их на двумерной плоскости так, чтобы: - Каждая грань каждого ломтика сыра параллельна либо оси x, либо оси y.
- Нижняя грань каждого ломтика — это отрезок на оси x.
- Никакие два ломтика не пересекаются, но они могут соприкасаться гранями.
- Они образуют одну связанную фигуру.
Обратите внимание, что мы можем расположить их в любом порядке (крайний левый ломтик сыра не обязательно является первым ломтиком сыра). Также обратите внимание, что мы можем вращать каждый ломтик сыра любым способом при условии выполнения остальных ограничений. Найдите минимально возможный периметр построенной фигуры. Выходные данные Для каждого набора входных данных выведите строку, содержащую целое число — минимально возможный периметр построенной фигуры. Примечание В первом наборе входных данных один из способов получения минимально возможного периметра выглядит следующим образом. 
Мы можем вычислить периметр построенной фигуры: \(2+5+1+1+1+1+3+1+5+1+2+3=26\). Можно показать, что нельзя получить меньший периметр. Ниже показано некорректное расположение. 
Периметр данной фигуры \(24\), но не все ограничения в задаче выполнены. Нижняя грань ломтика \(1 \times 1\) не находится на оси x. Во втором наборе входных данных один из способов получения минимально возможного периметра выглядит следующим образом. 
Мы можем вычислить периметр построенной фигуры: \(2+2+2+3+2+3+2+2+2+4=24\). Можно показать, что нельзя получить меньший периметр.
| |
|
|
C. Кубики и мешки
жадные алгоритмы
игры
Конструктив
сортировки
*1400
Есть \(n\) кубиков, пронумерованных от \(1\) до \(n\). Кубик \(i\) имеет вес \(a_i\). У Пака Чанека есть \(3\) мешка с номерами от \(1\) до \(3\), которые изначально пусты. Каждый кубик Пак Чанек должен положить в один из мешков. После этого в каждом мешке должен оказаться хотя бы один кубик. После того, как Пак Чанек разложит кубики, Бу Денгклек возьмет ровно по одному кубику из каждого мешка. Пусть \(w_j\) — вес кубика, который Бу Денгклек берет из мешка \(j\). Результатом всех действий назовем число \(|w_1 - w_2| + |w_2 - w_3|\), где \(|x|\) — модуль числа \(x\). Известно, что Денгклек будет брать кубики таким образом, чтобы минимизировать результат. Чему равен максимально возможный результат, если Пак Чанек раскладывает кубики оптимально? Выходные данные Для каждого теста выведите строку, содержащую целое число, представляющее максимально возможный результат, если Пак Чанек оптимально разложит кубики. Примечание В первом наборе входных данные, один из вариантов получить итоговый результат, равный \(6\), выглядит следующим образом: - Положить кубики \(1\), \(4\), и \(5\) в мешок \(1\).
- Положить кубик \(3\) в мешок \(2\).
- Положить кубик \(2\) в мешок \(3\).
Если Пак Чанек разложит кубики таким образом, то Денгклек может взять кубики следующим образом: - Взять кубик \(5\) из мешка \(1\).
- Взять кубик \(3\) из мешка \(2\).
- Взять кубик \(2\) из мешка \(3\).
Результат равен \(|a_5 - a_3| + |a_3 - a_2| = |3 - 5| + |5 - 1| = 6\). Можно показать, что Бу Денгклек не может получить меньший результат при таком распределении кубиков. Можно показать, что нет другого распределения кубиков, которое дает результат больший, чем \(6\).
| |
|
|
G. Опасные лазеры
Конструктив
снм
сортировки
*3100
У Пака Чанека есть сетка из порталов размера \(n \times m\). Портал в \(i\)-й строке и \(j\)-м столбце обозначается как портал \((i,j)\). Порталы \((1,1)\) и \((n,m)\) находятся в северо-западном и юго-восточном углах сетки соответственно. Портал \((i,j)\) имеет две настройки: - Тип \(t_{i,j}\), который может быть \(0\) или \(1\).
- Сила \(s_{i,j}\), являющаяся целым числом от \(1\) до \(10^9\) включительно.
Каждый портал имеет \(4\) грани, помеченные целыми числами \(0,1,2,3\), которые соответствуют направлениям на север, восток, юг и запад соответственно. Когда лазерный луч входит в грань \(k\) портала \((i, j)\) со скоростью \(x_\text{in}\), он покидает портал из грани \((k+2+t_{i,j}) \bmod 4\) со скоростью \(x_\text{out} = \max(x_\text{in},s_{i,j})\). Портал при этом потребляет \(x_\text{out} - x_\text{in}\) единиц энергии. Паку Чанеку сегодня очень скучно. Он собирается запустить \(4nm\) лазерных лучей с начальной скоростью \(1\), по одному в каждую грань каждого портала. Каждый луч будет перемещаться по этой сетке порталов, пока не выйдет за пределы сетки или не пройдет через \(10^{100}\) порталов. Пак Чанек считает, что портал хороший тогда и только тогда, когда суммарная энергия, потребленная этим порталом по модулю \(2\), равна его типу. Учитывая настройки силы всех порталов, найдите способ назначить настройки типа каждого портала таким образом, чтобы количество хороших порталов было максимально возможным. Выходные данные Выведите \(n\) строк, каждая их которых состоит из \(m\) символов \(0\) или \(1\), обозначающих тип портала, где \(j\)-й символ в \(i\)-й строке это настройка типа портала \((i, j)\). Если решений несколько, выведите любое из них. Примечание В первом примере рассмотрим лазерный луч, который Пак Чанек запускает в грань \(1\) портала \((2, 2)\). Луч перемещается следующим образом: - Луч входит в грань \(1\) портала \((2, 2)\) со скоростью \(1\). Он покидает портал из грани \(3\) со скоростью \(5\). Портал \((2, 2)\) потребляет \(4\) единиц энергии.
- Луч входит в грань \(1\) портала \((2, 1)\) со скоростью \(5\). Он покидает портал из грани \(0\) со скоростью \(6\). Портал \((2, 1)\) потребляет \(1\) единиц энергии.
- Луч входит в грань \(2\) портала \((1, 1)\) со скоростью \(6\). Он покидает портал из грани \(1\) со скоростью \(8\). Портал \((1, 1)\) потребляет \(2\) единиц энергии.
- Луч входит в грань \(3\) портала \((1, 2)\) со скоростью \(8\). Он покидает портал из грани \(2\) со скоростью \(8\). Портал \((1, 2)\) потребляет \(0\) единиц энергии.
- Луч входит в грань \(0\) портала \((2, 2)\) со скоростью \(8\). Он покидает портал из грани \(2\) со скоростью \(8\). Портал \((2, 2)\) потребляет \(0\) единиц энергии.
Иллюстрация перемещений луча, описанных выше, выглядит следующим образом. Для примера рассмотрим портал \((2, 3)\). Мы можем подсчитать, что суммарная энергия, потребляемая этим порталом, к концу процесса составит \(32\). Так как \(32 \bmod 2 = 0\) и \(t_{2,3} = 0\), этот портал будет считаться хорошим.
| |
|
|
D. Маша и красивое дерево
графы
Деревья
поиск в глубину и подобное
разделяй и властвуй
сортировки
*1300
Девочка Маша гуляла в лесу и нашла полное бинарное дерево высоты \(n\) и перестановку \(p\) длины \(m=2^n\). Полное бинарное дерево высоты \(n\) — это такое корневое дерево, что каждая вершина кроме листьев имеет ровно двух сыновей, а длина пути от корня до любого из листьев равна \(n\). Ниже на картинке изображено полное бинарное дерево для \(n=2\). Перестановкой называется массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\). Например, [\(2,3,1,5,4\)] является перестановкой, а [\(1,2,2\)] не является (\(2\) встречается дважды), и [\(1,3,4\)] тоже не является перестановкой (\(n=3\), но в массиве есть \(4\)). Пронумеруем \(m\) листьев этого дерева слева направо. В листе с номером \(i\) записано значение \(p_i\) (\(1 \le i \le m\)). Например, если \(n = 2\), \(p = [3, 1, 4, 2]\), дерево будет выглядеть так: Маша считает дерево красивым, если значения в его листьях упорядочены слева направо по возрастанию. За одну операцию Маша может выбрать произвольную не являющуюся листом вершину дерева и поменять местами ее левого и правого сына (вместе с их поддеревьями). Например, если Маша применит эту операцию к корню рассмотренного выше дерева, оно приобретет следующий вид: Помогите Маше понять, сможет ли она за некоторое количество операций сделать дерево красивым. Если сможет, то выведите минимальное количество операций, чтобы сделать дерево красивым. Выходные данные Для каждого набора входных данных в отдельной строке выведите минимальное возможное количество операций, за которое Маша сможет сделать дерево красивым или -1, если это невозможно. Примечание Рассмотрим первый тест. В первом наборе входных данных можно действовать так (фиолетовым цветом выделена вершина, к которой на текущем шаге применяется операция): Можно показать, что нельзя сделать дерево красивым за меньшее число операций. Во втором наборе входных данных можно показать, что нельзя сделать дерево красивым. В третьем наборе входных данных дерево сразу является красивым.
| |
|
|
F. Разноцветные отрезки
Бинарный поиск
математика
сортировки
Структуры данных
*2000
У Дмитрия есть \(n\) разноцветных отрезков на координатной прямой \(Ox\). Каждый отрезок характеризуется тремя целыми числами \(l_i\), \(r_i\) и \(c_i\) (\(1 \le l_i \le r_i \le 10^9, 1 \le c_i \le n\)), где \(l_i\) и \(r_i\) — координаты концов \(i\)-го отрезка, а \(c_i\) — его цвет. Дмитрий любит находить минимальные расстояния между отрезками. Однако он считает неинтересными пары отрезков одного цвета. Поэтому он хочет для каждого отрезка узнать расстояние от этого отрезка до ближайшего отрезка другого цвета. Расстояние между двумя отрезками — это минимальное из расстояний между точкой первого отрезка и точкой второго отрезка. В частности, если отрезки пересекаются, то расстояние между ними равно \(0\). Например, у Дмитрия есть \(5\) отрезков: - Первый отрезок пересекается со вторым (и это отрезки разных цветов), поэтому ответы для них равны \(0\).
- Для \(3\)-го отрезка ближайший к нему отрезок другого цвета — это \(2\)-й, расстояние до которого равно \(2\).
- Для \(4\)-го отрезка ближайший к нему отрезок другого цвета — это \(5\)-й, расстояние до которого равно \(1\).
- \(5\)-й отрезок лежит внутри \(2\)-го (и это отрезки разных цветов), поэтому ответы для них равны \(0\).
Выходные данные Для каждого набора входных данных в отдельной строке выведите \(n\) целых чисел, где \(i\)-е число равно расстоянию от \(i\)-го отрезка до ближайшего отрезка другого цвета. Примечание В первом наборе входных данных первого примера есть только один отрезок цвета \(2\), а все остальные отрезки имеют цвет \(1\). Поэтому для отрезков цвета \(1\) ответ равен расстоянию до \(3\)-го отрезка, а для \(3\)-го ответ равен минимальному из расстояний до отрезков цвета \(1\). Во втором наборе входных данных первого примера есть только \(2\) отрезка, и для них обоих ответ равен расстоянию между ними. В третьем наборе входных данных первого примера каждый отрезок пересекается хотя бы одним своим концом с отрезком другого цвета, поэтому все ответы равны \(0\). Четвёртый набор входных данных первого примера разобран в условии. В пятом наборе входных данных первого примера один отрезок полностью лежит внутри другого, и для них обоих ответ равен \(0\). В шестом наборе входных данных первого примера все отрезки являются точками разного цвета.
| |
|
|
B. Возрастающий
жадные алгоритмы
реализация
сортировки
*800
Вам дан массив \(a\) из \(n\) целых положительных чисел. Определите, можно ли, переставив элементы, сделать массив строго возрастающим. Другими словами, определите, можно ли переставить элементы так, чтобы выполнялось условие \(a_1 < a_2 < \dots < a_n\). Выходные данные Для каждого набора выведите «YES» (без скобок), если массив удовлетворяет условию, и «NO» (без скобок) в противном случае. Вы можете вывести ответ в любом регистре (например, строки «YEs», «Yes», «Yes» и «YES» будут считаться как положительный ответ). Примечание В первом наборе любая перестановка оставит массив \([1,1,1,1]\), который не является строго возрастающим. Во втором наборе можно сделать массив \([1,3,4,7,8]\).
| |
|
|
G. Оррэй
битмаски
жадные алгоритмы
математика
Перебор
сортировки
*1500
Вам дан массив \(a\), состоящий из \(n\) неотрицательных целых чисел. Определим массив префиксного ИЛИ \(b\) как массив \(b_i = a_1~\mathsf{OR}~a_2~\mathsf{OR}~\dots~\mathsf{OR}~a_i\), где \(\mathsf{OR}\) представляет собой битовую операцию ИЛИ. Другими словами, массив \(b\) формируется путем вычисления \(\mathsf{OR}\) каждого префикса \(a\). Вас попросили переставить элементы массива \(a\) таким образом, чтобы массив префиксных OR был лексикографически максимальным. Массив \(x\) лексикографически больше массива \(y\), если в первой позиции, где \(x\) и \(y\) отличаются, \(x_i > y_i\). Выходные данные Для каждого набора выведите \(n\) целых чисел — любую перестановку массива \(a\), при которой получается лексикографически максимальный массив префиксных OR.
| |
|
|
D. Делимость на 2^n
жадные алгоритмы
математика
сортировки
*1200
Вам дан массив положительных целых чисел \(a_1, a_2, \ldots, a_n\). Сделайте так, чтобы произведение всех чисел массива, то есть \(a_1 \cdot a_2 \cdot \ldots \cdot a_n\), делилось на \(2^n\). Вы можете выполнять следующую операцию сколько угодно раз: - выберите произвольный индекс \(i\) (\(1 \leq i \leq n\)) и замените значение \(a_i\) на \(a_i=a_i \cdot i\).
Вы не можете применять операцию повторно к одному индексу. Иными словами, все выбранные значения \(i\) должны быть различны. Найдите, какое наименьшее количество операций нужно выполнить, чтобы произведение всех чисел массива делилось на \(2^n\). Обратите внимание, что не всегда такой набор операций существует. Выходные данные Для каждого набора входных данных выведите наименьшее количество операций, которое нужно сделать, чтобы произведение всех чисел массива делилось на \(2^n\). Если ответа не существует, то выведите -1. Примечание В первом наборе входных данных произведение чисел изначально равно \(2\), поэтому можно не применять операции. Во втором наборе входных данных произведение чисел изначально равно \(6\). Мы можем применить операцию для \(i = 2\), и тогда \(a_2\) станет равно \(2\cdot2=4\), а произведение чисел станет равно \(3\cdot4=12\), а это произведение чисел делится на \(2^n=2^2=4\). В четвертом наборе входных данных даже если мы применим все возможные операции, то у нас все равно не получится сделать произведение чисел кратным \(2^n\) — оно будет равно \((13\cdot1)\cdot(17\cdot2)\cdot(1\cdot3)\cdot(1\cdot4)=5304\), что не делится на \(2^n=2^4=16\). В пятом наборе входных данных можно применить операции для \(i = 2\) и \(i = 4\).
| |
|
|
D. Пути на дереве
Деревья
дп
жадные алгоритмы
поиск в глубину и подобное
сортировки
*1900
Вам дано корневое дерево, состоящее из \(n\) вершин. Вершины пронумерованы от \(1\) до \(n\), а корнем является вершина \(1\). Также вам дан массив коэффициентов \(s_1, s_2, \ldots, s_n\). Мультимножество из \(k\) простых путей называется допустимым, если выполняются следующие два условия: - Каждый путь начинается в вершине \(1\).
- Пусть \(c_i\) — количество путей, покрывающих вершину \(i\). Для каждой пары вершин \((u,v)\) (\(2\le u,v\le n\)), имеющих общего родителя, верно \(|c_u-c_v|\le 1\).
Значение мультимножества путей определяется как \(\sum\limits_{i=1}^n c_i s_i\). Можно показать, что всегда можно найти хотя бы одно допустимое мультимножество. Найдите максимальное значение среди всех допустимых мультимножеств. Выходные данные Для каждого набора входных данных выведите одно целое число — максимальное значение мультимножества. Примечание В первом наборе входных данных одно из оптимальных решений — четыре пути \(1 \to 2 \to 3 \to 5\), \(1 \to 2 \to 3 \to 5\), \(1 \to 4\), \(1 \to 4\), при этом \(c=[4,2,2,2,2]\). Значение будет равно \(4\cdot 6+ 2\cdot 2+2\cdot 1+2\cdot 5+2\cdot 7=54\). Во втором наборе входных данных одно из оптимальных решений — три пути \(1 \to 2 \to 3 \to 5\), \(1 \to 2 \to 3 \to 5\), \(1 \to 4\), при этом \(c=[3,2,2,1,2]\). Значение будет равно \(3\cdot 6+ 2\cdot 6+2\cdot 1+1\cdot 4+2\cdot 10=56\).
| |
|
|
G. Подготовка к олимпиаде
Бинарный поиск
геометрия
дп
Потоки
реализация
сортировки
Структуры данных
*3500
Антон решил подготовиться к очередной олимпиаде. Чтобы Антону было интереснее, Илья подготовил для него \(n\) задач. Сдать \(i\)-ю задачу можно только в первые \(d_{i}\) дней, причем сдавать несколько задач в один и тот же день нельзя. Илья оценил полезность \(i\)-й задачи как \(r_{i}\), и разделил задачи на три темы, тема \(i\)-й задачи равна \(type_{i}\). Антон хочет решить ровно \(a\) задач на первую тему, ровно \(b\) на вторую тему и ровно \(c\) задач на третью тему (и каждая из этих задач должна быть решена не позже своего дедлайна). Скажите Антону, сможет ли он это сделать, и если сможет, то выведите максимальную суммарную полезность задач, которые он решит. Выходные данные Для каждого набора входных данных выведите единственное число: \(-1\), если решить нужный набор задач невозможно, и максимальную полезность решенных задач в противном случае. Примечание В первом наборе входных данных выгодно решить \(2\)-ю и \(4\)-ю задачи. Во втором наборе входных данных ответа не существует. В третьем наборе входных данных оптимально решить \(2\)-ю, \(3\)-ю и \(4\)-ю задачи. В последнем наборе входных данных оптимально решить \(1\)-ю, \(2\)-ю и \(4\)-ю задачи.
| |
|
|
C. Geometry Horse
жадные алгоритмы
реализация
сортировки
*1600
Вася играет в Geometry Horse. Цель игры — уничтожить геометрические фигуры, находящиеся в игровом мире. За уничтожение фигуры начисляется определенное число очков в зависимости от типа фигуры и текущего множителя. В данной игре имеется n видов геометрических фигур, для каждого вида известно количество фигур данного вида ki и стоимость одной фигуры данного вида ci. За уничтожение одной фигуры вида i игроку начисляется ci·f очков, где f — текущий множитель. Множитель может принимать целые значения от 1 до t + 1 включительно. Изначально множитель равен 1. После уничтожения pi (1 ≤ i ≤ t) фигур множитель становится равен i + 1, таким образом, фигура, уничтоженная по счету ровно (pi + 1)-ой, учитывается уже со множителем i + 1. Ваша задача — определить, какое наибольшее число очков может набрать Вася, уничтожив все фигуры. Учтите, что Вася настолько силен, что может уничтожать фигуры в любом выбранном им порядке. Выходные данные Выведите единственное число — наибольшее количество очков, которое может набрать Вася. Примечание В первом примере Вася сначала уничтожит три фигуры и получит 3·1·10 = 30 очков. Затем множитель станет равным 2 и Вася, уничтожив оставшиеся две фигуры, получит еще 2·2·10 = 40 очков. Всего Вася получит 70 очков. Во втором примере все 8 фигур будут уничтожены с коэффициентом 1, поэтому всего Вася наберет (3·8 + 5·10)·1 = 74 очка.
| |
|
|
E. Гуманоид
дп
Перебор
сортировки
*1500
На некоторой космической станции работают \(n\) космонавтов. Космонавт с номером \(i\) (\(1 \le i \le n\)) имеет стойкость \(a_i\). На эту космическую станцию пробрался злобный гуманоид. Сила этого гуманоида равна \(h\). Также гуманоид взял с собой две зелёных сыворотки и одну синюю сыворотку. За одну секунду гуманоид может сделать любое из трёх действий: - поглотить космонавта со стойкостью строго меньше силы гуманоида;
- употребить зелёную сыворотку, если такая ещё осталась;
- употребить синюю сыворотку, если такая ещё осталась.
При поглощении космонавта со стойкостью \(a_i\), этот космонавт исчезает, а сила гуманоида увеличивается на \(\lfloor \frac{a_i}{2} \rfloor\), то есть целую часть от \(\frac{a_i}{2}\). Например, если гуманоид поглощает космонавта со стойкостью \(4\), его сила увеличивается на \(2\), а если гуманоид поглощает космонавта со стойкостью \(7\), его сила увеличивается на \(3\). При употреблении зелёной сыворотки, эта сыворотка исчезает, а сила гуманоида увеличивается в \(2\) раза. При употреблении синей сыворотки, эта сыворотка исчезает, а сила гуманоида увеличивается в \(3\) раза. Гуманоиду интересно, какое максимальное количество космонавтов он сможет поглотить, если будет действовать оптимально. Выходные данные Для каждого набора входных данных в отдельной строке выведите максимальное количество космонавтов, которое сможет поглотить гуманоид. Примечание В первом случае можно действовать так: - употребить зелёную сыворотку. \(h = 1 \cdot 2 = 2\)
- поглотить космонавта \(2\). \(h = 2 + \lfloor \frac{1}{2} \rfloor = 2\)
- употребить зелёную сыворотку. \(h = 2 \cdot 2 = 4\)
- поглотить космонавта \(1\). \(h = 4 + \lfloor \frac{2}{2} \rfloor = 5\)
- употребить синюю сыворотку. \(h = 5 \cdot 3 = 15\)
- поглотить космонавта \(3\). \(h = 15 + \lfloor \frac{8}{2} \rfloor = 19\)
- поглотить космонавта \(4\). \(h = 19 + \lfloor \frac{9}{2} \rfloor = 23\)
| |
|
|
A. Торговое дело
жадные алгоритмы
сортировки
*1200
Чтобы раздобыть денег на новый эонический бластер, рейнджер Йцукен решил ненадолго заняться торговлей. Он хочет купить некоторое количество товаров (возможно, ничего не купить) на одной из планет, после чего продать купленные товары уже на другой планете. Обратите внимание, что данная операция не повторяется, то есть продажа и покупка производится ровно один раз. Чтобы осуществить свой план, Йцукен собирается взять в банке кредит, покрывающий все расходы, а по окончании операции возвратить взятые в долг деньги (деньги возвращаются без процентов). При этом Йцукен хочет получить как можно больше прибыли. Всего в системе n планет, на каждой из которых можно купить или продать товары m типов (например, продовольствие, медикаменты, оружие, алкоголь и так далее). Для каждой планеты i и каждого типа товара j известны: - aij — стоимость покупки единицы товара;
- bij — стоимость продажи единицы товара;
- cij — количество оставшихся единиц товара.
Считается, что на планете i можно купить не более cij единиц товара типа j, однако продать можно всегда любое количество товаров любого типа. Зная, что трюм корабля Йцукена вмещает не более k единиц товаров, определите наибольшее количество прибыли, которое Йцукен может получить. Выходные данные Выведите одно число — наибольшее количество прибыли, которое можно получить. Примечание В первом тестовом примере нужно прилететь на планету Venus взять там кредит на 74 денежных единиц и купить 3 единицы первого товара и 7 единиц третьего товара (3·6 + 7·8 = 74). Далее рейнджер должен прилететь на планету Earth и продать там купленные товары. За них он получит 3·9 + 7·9 = 90, из этих денег нужно отдать 74 за кредит. Получается прибыль равна 16 денежным единицам. В данном примере большую прибыль получить невозможно.
| |
|
|
A. По середине
реализация
сортировки
*800
Даны три различных целых числа \(a\), \(b\), и \(c\). Найдите среднее из них. Другими словами, найдите среди заданных трёх чисел число не являющееся ни минимумом, ни максимумом. Например, средним число среди \(5,2,6\) будет \(5\), так как минимумом является \(2\), а максимумом \(6\). Выходные данные Для каждого набора выведите одно целое число — среднее среди трёх данных чисел.
| |
|
|
C. Преимущество
реализация
сортировки
Структуры данных
*800
В соревновании участвуют \(n\) участников, причем участник \(i\) имеет силу \(s_i\). Каждый участник хочет узнать, какое преимущество он имеет перед лучшим участником соревнования помимо него самого. Другими словами, каждый участник \(i\) хочет знать разность между \(s_i\) и \(s_j\), где \(j\) — сильнейший участник соревнования, не считая \(i\). Обратите внимание, что разность может быть отрицательной. Поэтому они просят вас о помощи! Для каждого \(i\) (\(1 \leq i \leq n\)) выведите разность между \(s_i\) и максимальной силой участника, отличного от \(i\). Выходные данные Для каждого набора выведите \(n\) целых чисел, разделенных пробелами. Для каждого \(i\) (\(1 \leq i \leq n\)) выведите разность между \(s_i\) и максимальной силой любого другого участника. Примечание Для первого примера: - Первый участник имеет силу \(4\), а максимальная сила среди остальных участников соревнования равна \(7\), поэтому ответ для первого участника равен: \(4 - 7 = -3\).
- Второй участник имеет силу \(7\), а максимальная сила среди остальных участников соревнования равна \(5\), поэтому ответ для второго участника: \(7 - 5 = 2\).
- Третий участник имеет силу \(3\), а максимальная сила среди остальных участников соревнования равна \(7\), поэтому ответ для третьего участника: \(3 - 7 = -4\).
- Четвертый участник имеет силу \(5\), а максимальная сила среди остальных участников соревнования равна \(7\), поэтому ответ для четвертого участника: \(5 - 7 = -2\).
| |
|
|
F. Квесты
Бинарный поиск
жадные алгоритмы
сортировки
*1500
У вас есть возможность выполнять \(n\) квестов. Если вы выполняете \(i\)-й квест, вы получаете \(a_i\) монет. Вы можете выполнить не больше одного квеста в день. Однако, после того как вы выполнили квест, вы не можете выполнить его снова в течение следующих \(k\) дней. (Например, если \(k=2\) и вы выполняете \(1\)-й квест в \(1\)-й день, тогда вы не сможете выполнить этот квест снова во \(2\)-й или в \(3\)-й день, но сможете его выполнить в \(4\)-й день.) Заданы два целых числа \(c\) и \(d\). Найдите максимальный \(k\) такой, что возможно получить как минимум \(c\) монет за \(d\) дней. Если таких \(k\) не существует, выведите Impossible. Если \(k\) может быть бесконечно большим, выведите Infinity. Выходные данные Для каждого набора входных данных выведите: - если таких \(k\) не существует, выведите Impossible;
- если \(k\) может быть бесконечно большим, выведите Infinity;
- иначе, выведите одно целое число — максимальный \(k\) такой что возможно получить как минимум \(c\) монет в течение \(d\) дней.
Примечание В первом тесте, один из способов получить \(5\) монет за \(4\) дня с \(k=2\) состоит в следующем: - день 1: выполнить квест 2, и получить \(2\) монеты;
- день 2: выполнить квест 1, и получить \(1\) монету;
- день 3: ничего не делать;
- день 4: выполнить квест 2, и получить \(2\) монеты.
Суммарно мы получили \(2+1+2=5\) монет. Во втором тесте, мы можем получить более \(20\) монет в первый день, выполнив лишь только первый квест. Выполнив первый квест, мы сразу получим \(100\) монет, значит значение \(k\) может быть бесконечно большим, так как нам никогда не понадобится выполнить ещё один квест. В третьем тесте, что бы мы не делали, мы не можем получить \(100\) монет за \(3\) дня.
| |
|
|
B. Сделайте массив хорошим
Конструктив
реализация
сортировки
теория чисел
*1100
Массив \(b\) из \(m\) положительных целых чисел называется хорошим, если для всех пар \(i\) и \(j\) (\(1 \leq i,j \leq m\)), значение \(\max(b_i,b_j)\) делится на \(\min(b_i,b_j)\). Вам дан массив \(a\) из \(n\) положительных целых чисел. Вы можете выполнять следующую операцию: - Выберите индекс \(i\) (\(1 \leq i \leq n\)) и целое число \(x\) (\(0 \leq x \leq a_i\)), затем добавьте \(x\) к \(a_i\). Другими словами, \(a_i := a_i+x\).
- После этой операции должно выполняться \(a_i \leq 10^{18}\).
Постройте последовательность из не более чем \(n\) операций, после которой массив \(a\) будет хорошим. Можно показать, что в ограничениях задачи такая последовательность операций всегда существует. Выходные данные Для каждого набора входных данных сначала выведите целое число \(p\) (\(0 \leq p \leq n\)) — количество операций в вашем решении. Для каждой из следующих \(p\) строк, выведите два целых числа через пробел — \(i\) и \(x\). Вам не нужно минимизировать число операций. Можно показать, что решение всегда существует. Примечание В первом примере массив \(a\) становится после операций равным \([5,5,5,5]\). Легко видеть, что \([5,5,5,5]\) — хороший. Во втором примере массив \(a\) изначально хороший. В третьем примере массив \(a\) становится после операций равным \([10,5,350,5,10]\), что является хорошим массивом. В четвертом примере после выполнения операций массив \(a\) становится равным \([60,10,20]\), что является хорошим массивом.
| |
|
|
G. Неравные соседние элементы
Конструктив
сортировки
*3100
Вам дан массив \(a\), состоящий из \(n\) положительных целых чисел. Найдите любую перестановку \(p\) чисел \([1,2,\dots,n]\) такую, что: - \(p_{i-2} < p_i\) для всех \(i\), удовлетворяющих \(3 \leq i \leq n\), и
- \(a_{p_{i-1}} \neq a_{p_i}\) для всех \(i\), удовлетворяющих \(2 \leq i \leq n\).
Или найдите, что таких перестановок не существует. Выходные данные Для каждого набора входных данных выведите «NO», если не существует подходящей перестановки, иначе выведите «YES» в первой строке, а во второй выведите перестановку \(p\). Если существует несколько подходящих перестановок, выведите любую из них. Вы можете выводить «YES» и «NO» в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ). Примечание В первом примере \(p=[1,2,3]\) является единственной перестановкой чисел \([1,2,3]\), удовлетворяющей данным условиям. В третьем примере можно показать, что не существует перестановки чисел \([1,2,3]\), удовлетворяющей данным условиям.
| |
|
|
B. Испепеление
Бинарный поиск
математика
Перебор
реализация
сортировки
Структуры данных
*1200
Для уничтожения человечества, Ассоциация Монстров отправила \(n\) монстров на Землю. \(i\)-й монстр имеет здоровье \(h_i\) и силу \(p_i\). С его одной атакой, настоящей спиральной испепеляющей пушкой, Генос может нанести \(k\) урона всем живым монстрам. Другими словами, Генос может уменьшить здоровье всех монстров на \(k\) (если \(k > 0\)) одной атакой. Однако после каждой атаки Геноса монстры продвигаются вперед. Совместными усилиями они уменьшают урон от атаки Геноса на силу \(^\dagger\)самого слабого монстра \(^\ddagger\)оставшегося в живых. Иными словами, минимальное значение \(p_i\) по всем живым в текущий момент монстрам вычитается из \(k\) после каждой атаки. \(^\dagger\)Самый слабый монстр — это тот, у кого наименьшая сила. \(^\ddagger\)Монстр жив, если его здоровье строго больше \(0\). Удастся ли Геносу убить всех монстров? Выходные данные Для каждого набора входных данных выведите ответ — «YES» (без кавычек) если Генос может убить всех монстров и «NO» в противном случае. Примечание В первом примере, после первой атаки Геноса, \(h\) и \(k\) станут: - \(h: [11,0,6,2,3,0]\)
- \(k: 7-1 = 6\)
После второй атаки: - \(h: [5,0,0,0,0,0]\)
- \(k: 6-2 = 4\)
После третьей атаки: - \(h: [1,0,0,0,0,0]\)
- \(k: 4-2 = 2\)
После четвертой атаки: Поскольку Генос может убить всех монстров, ответ YES.
| |
|
|
E. Дореми и числовая прямая
дп
жадные алгоритмы
сортировки
*2400
У Дореми есть два массива целых чисел \(a\) и \(b\) из \(n\) целых чисел каждый, а также целое число \(k\). Изначально у нее есть числовая прямая, где никакие точки не покрашены. Она выбирает перестановку \(p\) чисел \([1,2,\ldots,n]\), затем делает \(n\) ходов. На \(i\)-м ходу Дореми делает следующее: - Она выбирает непокрашенное целое число \(x\) на числовой прямой, удовлетворяющее
- \(x \leq a_{p_i}\), или
- существует покрашенное целое число \(y\) такое, что \(y \leq a_{p_i}\) и \(x \leq y+b_{p_i}\).
- Она красит \(x\) в цвет \(p_i\).
Определите, может ли целое число \(k\) оказаться покрашенным в цвет \(1\). Выходные данные Для каждого набора входных данных выведите «YES» (без кавычек), если точка \(k\) может оказаться покрашена в цвет \(1\). Иначе выведите «NO» (без кавычек). Вы можете выводить «YES» и «NO» в любом регистре (например, строки «yEs», «yes» и «Yes» будут приняты как положительны ответ). Примечание В первом примере невозможно покрасить число \(16\) в цвет \(1\). Во втором примере \(p=[2,1,3,4]\) — одно из возможных решений, ниже показаны подробности. - На первом ходу выбирается \(x=8\) и окрашивается в цвет \(2\), так как \(x=8\) еще не покрашено, и \(x \le a_2\).
- На втором ходу выбирается \(x=16\) и окрашивается в цвет \(1\), так как существует покрашенная точка \(y=8\) такая, что \(y\le a_1\) и \(x \le y + b_1\).
- На третьем ходу выбирается \(x=0\) и окрашивается в цвет \(3\), так как \(x=0\) еще не покрашено, и \(x \le a_3\).
- На четвертом ходу выбирается \(x=-2\) и окрашивается в цвет \(4\), так как \(x=-2\) еще не покрашено, и \(x \le a_4\).
- В итоге числа \(-2,0,8,16\) покрашены в цвета \(4,3,2,1\) соответственно.
В третьем примере одно из возможных решений — \(p=[2,1,4,3]\). В четвертом примере одно из возможных решений — \(p=[2,3,4,1]\).
| |
|
|
F. Дореми и экспериментальное дерево
Деревья
Конструктив
Перебор
поиск в глубину и подобное
снм
сортировки
*2500
У Дореми есть реберно-взвешенное дерево из \(n\) вершин, веса являются целыми числами от \(1\) до \(10^9\). Дореми провела \(\frac{n(n+1)}{2}\) экспериментов с деревом. В каждом эксперименте Дореми выбирает две вершины \(i\) и \(j\) такие, что \(j \leq i\), и соединяет их дополнительным ребром веса \(1\). После этого в графе образовывается один цикл (или петля, если \(i=j\)). Дореми определяет \(f(i,j)\) как сумму длин кратчайших путей от каждой вершины до цикла. Формально, пусть \(\mathrm{dis}_{i,j}(x,y)\) — длина кратчайшего пути между вершинами \(x\) и \(y\), когда в дерево добавлено одно ребро \((i,j)\) веса \(1\), а \(S_{i,j}\) — множество вершин на цикле, когда добавлено ребро \((i,j)\). Тогда \(\) f(i,j)=\sum_{x=1}^{n}\left(\min_{y\in S_{i,j}}\mathrm{dis}_{i,j}(x,y)\right). \(\) Дореми записала все значения \(f(i,j)\) для \(1 \leq j \leq i \leq n\), потом пошла спать. Однако проснувшись, она обнаружила, что дерево пропало. К счастью, значения \(f(i,j)\) все еще в ее тетради, и она значит, каким \(i\) и \(j\) они соответствуют. Вам даны значения \(f(i,j)\), можете ли вы помочь Дореми восстановить дерево? Гарантируется, что хотя бы одно подходящее дерево существует. Выходные данные Выведите \(n-1\) строку, описывающую дерево. В \(i\)-й строке выведите три целых числа \(u_i\), \(v_i\), \(w_i\) (\(1 \le u_i,v_i \le n\), \(1 \le w_i \le 10^9\)), обозначающих ребро \((u_i,v_i)\) веса \(w_i\). Если существуют несколько решений, выведите любое из них. Ребра должны образовывать дерево, а все значения \(f(i,j)\) должны совпадать с данными. Примечание Для первого примере рисунок ниже слева направо сверху вниз показывает графы, получающиеся при добавлении ребер \((1,1)\), \((1,2)\), \((1,3)\), \((2,2)\), \((2,3)\), \((3,3)\) соответственно. Вершины на цикле выделены желтым. 
| |
|
|
B. Башни из кубиков
жадные алгоритмы
сортировки
Структуры данных
*800
Даны \(n\) башен из кубиков, пронумерованных от \(1\) до \(n\). В \(i\)-й башне \(a_i\) кубиков. За один ход можно переложить один кубик с \(i\)-й башни на \(j\)-ю, но только если \(a_i > a_j\). Такой ход увеличивает \(a_j\) на \(1\) и уменьшает \(a_i\) на \(1\). Вы можете сделать сколько угодно ходов (возможно, ноль). Какое наибольшее количество кубиков можно получить на башне \(1\) после ходов? Выходные данные На каждый набор входных данных выведите наибольшее количество кубиков, которые могут оказаться на башне \(1\) после того как вы сделаете произвольное количество ходов (возможно, ноль). Примечание В первом наборе входных данных вы можете переместить кубик с башни \(2\) на башню \(1\), сделав количества кубиков равными \([2, 1, 3]\). Затем переместить кубик с башни \(3\) на башню \(1\), сделав количества кубиков равными \([3, 1, 2]\). Башня \(1\) высотой \(3\) кубика, и нельзя получить больше. Во втором наборе входных данных можно переместить кубик с любой из башен \(2\) или \(3\) на башню \(1\) так, чтобы в ней стало \(2\) кубика. В третьем наборе входных данных можно \(500000000\) раз переместить кубик с башни \(2\) на башню \(1\). После этого количества кубиков станут \([500000001, 500000000]\).
| |
|
|
C. Поэлементное ограничение
жадные алгоритмы
Конструктив
реализация
сортировки
*1300
Вам дан массив целых чисел \(a\) длины \(n\). Найдите две перестановки\(^\dagger\) \(p\) и \(q\) длины \(n\) такие, что \(\max(p_i,q_i)=a_i\) для всех \(1 \leq i \leq n\) или сообщите, что таких \(p\) и \(q\) не существует. \(^\dagger\) Перестановкой длины \(n\) называется массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) является перестановкой, но \([1,2,2]\) не является перестановкой (\(2\) встречается дважды в массиве) и \([1,3,4]\) тоже не является перестановкой (\(n=3\), но в массиве присутствует \(4\)). Выходные данные Для каждого набора входных данных, если не существует \(p\) и \(q\), удовлетворяющих условиям, выведите «NO» (без кавычек). В противном случае выведите «YES» (без кавычек), затем выведите \(2\) строки. Первая строка должна содержать \(n\) целых \(p_1,p_2,\ldots,p_n\), а вторая строка должна содержать \(n\) целых \(q_1,q_2,\ldots,q_n\). Если существует несколько решений, вы можете вывести любое из них. Вы можете выводить «YES» и «NO» в любом регистре (например, строки «yEs», «yes» и «Yes» будут распознаны как положительный ответ). Примечание В первом наборе входных данных \(p=q=[1]\). Это верно, так как \(a_1 = max(p_1,q_1) = 1\). Во втором наборе \(p=[1,3,4,2,5]\) и \(q=[5,2,3,1,4]\). Эти массивы удовлетворяют условию, так как: - \(a_1 = \max(p_1, q_1) = \max(1, 5) = 5\),
- \(a_2 = \max(p_2, q_2) = \max(3, 2) = 3\),
- \(a_3 = \max(p_3, q_3) = \max(4, 3) = 4\),
- \(a_4 = \max(p_4, q_4) = \max(2, 1) = 2\),
- \(a_5 = \max(p_5, q_5) = \max(5, 4) = 5\).
В третьем наборе можно показать, что таких \(p\) и \(q\) не существует.
| |
|
|
A. Хоссам и комбинации
Комбинаторика
математика
сортировки
*900
Хоссам проснулся, ему стало скучно, и поэтому он решил придумать интересный массив, позвав своего друга Хазема. Сейчас у них есть массив \(a\), состоящий из \(n\) положительных целых чисел. Хоссам выберет число \(a_i\), Хазем выберет число \(a_j\). Посчитайте количество интересных пар \((a_i, a_j)\), удовлетворяющих всем следующим условиям: - \(1 \le i, j \le n\);
- \(i \neq j\);
- Модуль разности \(|a_i - a_j|\) должен быть равен максимальному модулю разности по всем парам в массиве. Более формально: \(|a_i - a_j| = \max_{1 \le p, q \le n} |a_p - a_q|\).
Выходные данные Для каждого набора входных данных выведите одно число — количество интересных пар \((a_i, a_j)\) Примечание В первом наборе есть две интересные пары: - Хоссам выбирает четвертое число \(8\), Хазем выбирает пятое число \(1\).
- Хоссам выбирает пятое число \(1\), Хазем выбирает четвертое число \(8\).
Во втором наборе есть четыре интересные пары: - Хоссам выбирает второе число \(2\), Хазем выбирает шестое число \(10\).
- Хоссам выбирает шестое число \(10\), Хазем выбирает второе число \(2\).
- Хоссам выбирает пятое число \(2\), Хазем выбирает шестое число \(10\).
- Хоссам выбирает шестое число \(10\), Хазем выбирает пятое число \(2\).
| |
|
|
F. Копия копии копии
графы
Конструктив
поиск в глубину и подобное
реализация
сортировки
*2000
Все началось с черно-белой картинки, которую можно представить как матрицу \(n \times m\) такую, что все ее элементы равны \(0\) или \(1\). Строки пронумерованы от \(1\) до \(n\), столбцы пронумерованы от \(1\) до \(m\). Над картинкой проделали несколько операций (возможно, ноль), каждая — одного из двух типов: - выбрать ячейку такую, что она не находится на границе (строка не \(1\) и не \(n\), столбец не \(1\) и не \(m\)) и она окружена четырьмя ячейками противоположного цвета (четырьмя нулями, если она единица, и наоборот), и перекрасить ее саму в противоположный цвет;
- сделать копию текущей картинки.
Обратите внимание, что порядок операций мог быть произвольным, они могут не чередоваться. Вам сообщили результат: все \(k\) копий, которые были сделаны. Кроме того, вам сообщили первоначальную картинку. Однако, все эти \(k+1\) картинки были перемешаны. Восстановите последовательность операций. Если существует несколько ответов, то выведите любой из них. Тесты построены из реальной последовательности операций, т. е. хотя бы один ответ всегда существует. Выходные данные В первой строке выведите одно целое число — номер первоначальной картинки. Картинки пронумерованы от \(1\) до \(k+1\) в порядке, в котором они заданы во входных данных. Во второй строке выведите одно целое число \(q\) — количество операций. В каждой из следующих \(q\) строк должна быть записана одна операция. Операции должны быть перечислены в том порядке, в котором они применялись. Каждая операция может быть одного из двух типов: - \(1\) \(x\) \(y\) — перекрасить ячейку \((x, y)\) (\(y\)-я ячейка в \(x\)-й строке, она не должна лежать на границу и должна быть окружена четырьмя клетками противоположного от себя цвета);
- \(2\) \(i\) — сделать копию текущей картинки и присвоить ей номер \(i\) (картинка под номером \(i\) должна совпадать с текущей картинкой).
Каждый номер от \(1\) до \(k+1\) должен встречаться в выводе ровно один раз — один из них — это номер первоначальной картинки, остальные \(k\) — аргументы операций второго типа. Если существует несколько ответов, то выведите любой из них. Тесты построены из реальной последовательности операций, т. е. хотя бы один ответ всегда существует.
| |
|
|
G. Поднятие рейтинга
Бинарный поиск
жадные алгоритмы
математика
реализация
сортировки
*2200
Монокарп играет в шахматы на одном популярном сайте. На этом сайте у него есть \(n\) соперников. Рейтинг \(i\)-го соперника равен \(a_i\). Изначальный рейтинг Монокарпа равен \(x\). Монокарп хочет достичь рейтинга \(y\) (\(y > x\)). Когда Монокарп играет партию, он побеждает, если его текущий рейтинг больше или равен рейтинга противника. В случае победы рейтинг Монокарпа повышается на \(1\), в случае поражения — понижается на \(1\). Рейтинг его противника не меняется. Монокарп хочет за минимальное кол-во партий достигнуть рейтинга \(y\). Но сайт не позволяет ему легко набирать рейтинг в играх против слабых игроков, требуя, чтобы Монокарп играл со всеми противниками примерно равное количество партий. Формально, Монокарп может сыграть партию с противником \(i\) только если нет другого противника \(j\) такого, что Монокарп сыграл против \(i\) больше раз, чем против \(j\). Посчитайте минимальное кол-во партий, которое нужно сыграть Монокарпу, чтобы достичь рейтинга \(y\), или скажите, что это невозможно. Заметьте, что рейтинги противников Монокарпа остаются неизменными, в отличие от рейтинга самого Монокарпа. Выходные данные Для каждого набора входных данных выведите одно число — минимальное количество партий, которые нужно сыграть Монокарпу, чтобы получить рейтинг \(y\), или \(-1\), если достичь данного рейтинга невозможно. Примечание В первом наборе входных данных, Монокарп может использовать следующую стратегию: - Монокарп играет против \(2\)-го соперника и увеличивает рейтинг (\(2 \to 3\));
- Монокарп играет против \(1\)-го соперника и увеличивает рейтинг (\(3 \to 4\));
- Монокарп играет против \(4\)-го соперника и увеличивает рейтинг (\(4 \to 5\));
- Монокарп играет против \(5\)-го соперника и увеличивает рейтинг (\(5 \to 6\));
- Теперь Монокарп должен сыграть с оставшимися тремя соперниками. Он проиграет \(3\) раза и получит рейтинг \(3\) (\(6 \to 5 \to 4 \to 3\));
- После этого Монокарп повторит шаги 1-5 два раза. После \(14\) партий получится, что он сыграл дважды к каждым противников и его финальный рейтинг равен \(4\).
- Монокарп играет против \(1\)-го соперника и увеличивает рейтинг (\(4 \to 5\));
- Монокарп играет против \(2\)-го соперника и увеличивает рейтинг (\(5 \to 6\));
- Монокарп играет против \(4\)-го соперника и увеличивает рейтинг (\(6 \to 7\));
- Монокарп играет против \(5\)-го соперника и увеличивает рейтинг (\(7 \to 8\));
- Монокарп играет против \(7\)-го соперника и увеличивает рейтинг (\(8 \to 9\));
- Монокарп играет против \(3\)-го соперника и увеличивает рейтинг (\(9 \to 10\));
В результате Монокарп сыграл дважды с \(6\)-м противником и трижды со всеми остальными, получив рейтинг \(10\) за \(14 + 6 = 20\) партий. Во втором наборе можно показать, что какие бы партии не сыграл Монокарп, он не сможет получить рейтинг выше \(4\).
| |
|
|
C. Library game
жадные алгоритмы
игры
интерактив
сортировки
*2500
Alessia and Bernardo are discovering the world of competitive programming through the books of their university library. The library consists of \(m\) sections numbered from \(1\) to \(m\). Each section contains only books dedicated to a particular subject and different sections correspond to different subjects. In order to prevent the students from wandering in the library, the university has established a system of passes. Each pass has a length \(y\) associated to it and allows access to an interval of \(y\) consecutive sections in the library. During a visit, the student must choose exactly one book from one of these sections and leave the library. Each pass can be used only once. At the moment Alessia and Bernardo have \(n\) passes of lengths \(x_1, \, x_2, \, \dots, \, x_n\). They have different opinions on the best way to improve: Alessia thinks that it is important to study many different topics, while Bernardo believes that it is important to study deeply at least one topic. So, Alessia wants to use the \(n\) passes to get \(n\) books on distinct topics, while Bernardo would like to get at least two books on the same topic. They have reached the following agreement: for each of the following \(n\) days, Alessia will choose a pass of length \(y\) among those which are still available and an interval of \(y\) sections in the library, and Bernardo will go into the library and will take exactly one book from one of those sections. Can Bernardo manage to get at least two books on the same subject, or will Alessia be able to avoid it? You should decide whether you want to be Alessia or Bernardo, and you have to fulfill the goal of your chosen character. The judge will impersonate the other character. Note that, even if at some moment Bernardo has already taken two books on the same subject, the interaction should go on until the end of the \(n\) days. Interaction First, you should print a line containing either the string \(\texttt{Alessia}\) or the string \(\texttt{Bernardo}\) — the character that you want to impersonate. Then, for each of the \(n\) turns: - If you are taking the role of Alessia, print a single line consisting of two integers \(y\) and \(a\) (\(1 \le a \le m - y + 1\)) — you are choosing a pass of length \(y\) and the interval of sections \([a, a + y - 1]\). Note that at least one pass of length \(y\) must still be available. After this, read a single integer \(b\) (\(a \le b \le a + y - 1\)) — the subject of the book selected by Bernardo.
- If you are taking the role of Bernardo, read two integers \(y\) and \(a\) (\(1 \le a \le m - y + 1\)) — the length of the pass chosen by Alessia and the index of the first section of the interval. It is guaranteed that there is at least one pass of length \(y\) available. Then, print a line consisting of a single integer \(b\) (\(a \le b \le a + y - 1\)) — the subject from which you choose to take a book.
If one of your interactions is malformed, the interactor terminates immediately and your program receives the verdict \(\texttt{WRONG-ANSWER}\). Otherwise, you will receive the verdict according to the game's criteria described above. After printing a line do not forget to end the line and flush the output. Otherwise, you will get the verdict \(\texttt{TIMELIMIT}\). To flush the output, use: - \(\texttt{fflush(stdout)}\) in C;
- \(\texttt{fflush(stdout)}\), \(\texttt{cout <}\texttt{< flush}\) or \(\texttt{cout.flush()}\) in C++;
- \(\texttt{System.out.flush()}\) in Java and Kotlin;
- \(\texttt{sys.stdout.flush()}\) in Python.
Note In the first sample, it can be shown that Alessia can accomplish her goal. An example of interaction (after reading the input) follows: \(\) \begin{array}{|c|c|c|} \hline \textbf{Contestant} & \textbf{Judge} & \textbf{Explanation} \\ \hline \texttt{Alessia} & & \text{The program will act as Alessia} \\ \hline 3 \quad 11 & & \text{Choose $y = 3$ and $a = 11$} \\ \hline & 13 & \text{Judge selects $b = 13$} \\ \hline 10 \quad 2 & & \text{Choose $y = 10$ and $a = 2$} \\ \hline & 9 & \text{Judge selects $b = 9$} \\ \hline 7 \quad 1 & & \text{Choose $y = 7$ and $a = 1$} \\ \hline & 4 & \text{Judge selects $b = 4$} \\ \hline 2 \quad 10 & & \text{Choose $y = 2$ and $a = 10$} \\ \hline & 10 & \text{Judge selects $b = 10$} \\ \hline 3 \quad 6 & & \text{Choose $y = 3$ and $a = 6$} \\ \hline & 7 & \text{Judge selects $b = 7$} \\ \hline \end{array} \(\) The program of the contestant wins because all the books chosen by Bernardo pertain to different topics. The actions performed by the contestant and the judge in this example of interaction may be non-optimal. In the second sample, it can be shown that Bernardo can manage to fulfil his goal. An example of interaction (after reading the input) follows: \(\) \begin{array}{|c|c|c|} \hline \textbf{Contestant} & \textbf{Judge} & \textbf{Explanation} \\ \hline \texttt{Bernardo} & & \text{The program will act as Bernardo} \\ \hline & 4 \quad 1 & \text{Judge chooses $y = 4$ and $a = 1$} \\ \hline 4 & & \text{Select $b = 4$} \\ \hline & 1 \quad 10 & \text{Judge chooses $y = 1$ and $a = 10$} \\ \hline 10 & & \text{Select $b = 10$} \\ \hline & 6 \quad 3 & \text{Judge chooses $y = 6$ and $a = 3$} \\ \hline 4 & & \text{Select $b = 4$} \\ \hline & 4 \quad 5 & \text{Judge chooses $y = 4$ and $a = 5$} \\ \hline 8 & & \text{Select $b = 8$} \\ \hline \end{array} \(\) The program of the contestant wins because Bernardo has selected two books on topic number \(4\). The actions performed by the contestant and the judge in this example of interaction may be non-optimal.
| |
|
|
C. Мастер тестов
Бинарный поиск
математика
сортировки
теория чисел
*1700
Администрация школы должна выбрать команду своих представителей для участия в международном тесте. Всего в школе \(n\) учеников. Всех учеников можно описать массивом \(a\), в котором \(a_i\) равно уровню интеллекта \(i\)-го ученика (\(1 \le i \le n\)). Вопросы на тесте покрывают \(m\) тем, обозначенных числами \(1, 2, 3, \ldots, m\). Оказывается, \(i\)-й студент разбирается в теме \(T\), если \((a_i \bmod T) = 0\). Иначе в этой теме он полный новичок. Будем говорить, что команда учеников коллегиально разбирается во всех темах, если для любой темы по крайней мере один участник команды разбирается в ней. Нужно найти такую команду учеников, которая бы коллегиально разбиралась во всех темах, но при этом разность между максимальным и минимальным уровнями интеллекта участников команды была бы минимальна. Для такой команды выведите эту разность. Выходные данные Для каждого набора входных данных выведите ответ на отдельной строке. Если решения нет, выведите \(-1\). Примечание В первом наборе входных данных имеем учеников с уровнями интеллекта \(3\) и \(7\), а \(m = 4\). В частности, нет ученика с уровнем интеллекта, который бы делился на \(2\). Но поскольку \(2 \leq m\), то выбрать подходящую команду невозможно. Во втором наборе входных данных мы можем составить команду из одного участника: в ней будет лишь ученик с уровнем интеллекта \(2\). Эта команда будет коллегиально разбираться в обеих темах \(1\) и \(2\). В третьем наборе входных данных рассмотрим команду с уровнями интеллекта \(4, 5, 6, 7\). Такая команда будет коллегиально разбираться во всех темах \(1, 2, \ldots, 7\).
| |
|
|
D. Борис и его восхитительная прическа
дп
жадные алгоритмы
Конструктив
снм
сортировки
Структуры данных
*1700
Борис думает, что шахматы это скучная игра, поэтому он ушел со своего турнира пораньше. Он пошел в парикмахерскую, ведь его прическа была немного неаккуратная. В настоящий момент его волосы можно описать массивом \(a_1,a_2,\ldots, a_n\), где \(a_i\) — высота волоса на позиции \(i\). Его желаемая прическа описывается массивом \(b_1,b_2,\ldots, b_n\) аналогично. У парикмахера есть \(m\) бритв. Каждая бритва имеет некоторый размер и может быть использована не более одного раза. За одну операцию парикмахер может выбрать одну бритву и обрезать с помощью нее отрезок волос Бориса. Формально, операция выглядит следующим образом: - Выбрать ранее неиспользованную бритву, пусть ее размер равен \(x\);
- Выбрать отрезок \([l,r]\) (\(1\leq l \leq r \leq n\));
- Присвоить \(a_i := \min (a_i,x)\) для всех \(l\leq i \leq r\).
Обратите внимание, что некоторые бритвы могут иметь одинаковый размер. Парикмахер может выбирать размер \(x\) максимум столько раз, сколько у него есть бритв размера \(x\). Парикмахер может выполнить сколько угодно операций, не используя одну бритву дважды. Необходимо, чтобы в конце выполнялось \(a_i = b_i\) для всех \(1 \leq i \leq n\). Он не обязан использовать все бритвы. Определите, может ли парикмахер сделать необходимую Борису стрижку. Выходные данные Для каждого набора входных данных выведите «YES», если парикмахер может выполнить необходимую стрижку, и «NO» иначе. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В первом примере волосы Бориса изначально равны \([3,3,3]\). Опишем последовательность из \(2\) операций, которые может выполнить парикмахер: - Использовать бритву размера \(1\) на отрезке \([2,2]\); волосы становятся \([3,1,3]\).
- Использовать бритву размера \(2\) на отрезке \([1,3]\); волосы становятся \([2,1,2]\), что и требуется.
В третьем примере можно ничего не делать, так как волосы уже в желаемом состоянии. В четвертом примере нельзя обрезать волосы так, чтобы их длина увеличилась, и \([1,1,1]\) превратился в \([1,1,2]\).
| |
|
|
E. Параллельные показательные матчи Ани
графы
жадные алгоритмы
интерактив
Конструктив
сортировки
*2400
Это интерактивная задача. Аня собрала \(n\) шахматных экспертов, пронумерованных от \(1\) до \(n\), для которых выполняются следующие свойства: - Для любой пары игроков один игрок всегда выигрывает игру против другого (ничей не бывает);
- Свойство транзитивности не обязательно выполняется: может быть такое, что \(A\) всегда выигрывает \(B\), \(B\) всегда выигрывает \(C\), а \(C\) всегда выигрывает \(A\).
Аня не знает, кто из игроков выигрывает кого в каждой паре. Рассмотрим турнир из \(n-1\) игр. В каждой игре Аня выбирает двух игроков. Один из них выигрывает и остается в турнире, другой выбывает. После всех игр только остается только один игрок, называемый победителем. Игрок называется кандидатом в мастера, если он может победить в турнире (обратите внимание, что победитель турнира может зависеть от Аниного выбора игроков в \(n-1\) игре). Так как Аня — любознательная девочка, ей интересно найти, какие игроки являются кандидатами в мастера. К сожалению, у нее не очень много времени. Она может организовать не более \(2n\) сеансов параллельной игры, в которых один игрок играет против многих. В каждом сеансе Аня выберет ровно одного игрока, который сыграет по одной партии против нескольких (как минимум одного) других игроков. Выбранный игрок выиграет все игры, которые он бы выиграл в обычных условиях, то же самое верно для проигрышей. После окончания сеанса Аня узнает только количество партий, выигранных выбранным игроком (но не какие из партий были выиграны). По результатам сеанса никто не выбывает из турнира. Можете помочь Ане определить кандидатов в мастера? Выигрывающий игрок в каждой паре игроков может быть изменен между сеансами, но только так, чтобы результаты всех предыдущих сеансов сохранились. Эти изменения могут зависеть от ваших запросов. Протокол взаимодействия Сначала считайте одно целое число \(n\) (\(3 \leq n \leq 250\)) — количество игроков. После этого вы можете устраивать сеансы или выводить ответ. Чтобы устроить сеанс, выведите «? \(i \; s_1 s_2 \ldots s_n\)» (без кавычек), где \(i\) — номер игрока, который будет одновременно играть против других. \(s\) — бинарная строка, обозначающая, против кого будет играть этот игрок. \(i\) играет против каждого \(j\), для которого выполняется \(s_j = 1\) (\(s_j = 1\) должно выполняться хотя бы для одного \(1 \leq j \leq n\)). Обратите внимание, должно выполняться \(s_i = 0\), так как игрок не может играть сам против себя, иначе запрос считается некорректным. После этого считайте одно целое число — количество партий, в которых выиграл \(i\). Когда вы нашли ответ, выведите «! \(c_1 c_2 \ldots c_n\)» (без кавычек) и завершите свою программу. \(c\) — бинарная строка, показывающая кандидатов в мастера. Игрок \(i\) является кандидатом в мастера, если выполняется \(c_i=1\), иначе он им не является. Если вы сделаете более \(2n\) запросов, или какой-то запрос некорректен, взаимодействие немедленно завершится, и вы получите вердикт Неправильны ответ. После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Взломы в этой задаче запрещены. Примечание В первом примере первый запрос описывает сеанс игрока \(1\) против игрока \(2\) (и никого другого). Ответ на запрос равен \(1\), что означает, что игрок \(1\) выиграл единственную игру. Можно заключить, что \(1\) побеждает \(2\). Аналогично во втором запросе \(2\) побеждает \(3\), и в третьем запросе \(3\) побеждает \(1\). Все игроки являются кандидатами в мастера, потому что - Игрок \(1\) может выиграть турнир, если сначала играют \(2\) и \(3\). \(3\) проигрывает и выбывает, а \(2\) остается. \(1\) играет против \(2\) и выигрывает;
- Другие игроки могут выиграть аналогично.
Во втором примере третий запрос описывает сеанс игрока \(1\) против всех остальных. Ответ на этот запрос равен \(4\), что означает, что им были выиграны все игры. Можно понять, что \(1\) побеждает всех других игроков. Так как этот игрок не может проиграть, то только он может остаться в конце турнира, то есть это единственный кандидат в мастера.
| |
|
|
F. Три стула
битмаски
дп
Комбинаторика
Перебор
сортировки
Структуры данных
теория чисел
*2300
Как-то раз Кира нашел \(n\) друзей из Морио и решил собрать их за одним столом, чтобы провести мирный разговор. Рост друга \(i\) равен \(a_i\). Так получилось, что рост каждого из друзей уникален. Но вот незадача, в доме Киры всего \(3\) стула, и всех друзей усадить явно не удастся! Поэтому Кира должен позвать только \(3\) друзей. Но все не так просто! Если рост самого низкого и самого высокого из приглашенных друзей не взаимно просты, то друзья будут подшучивать друг над другом, что сильно разозлит Киру. Кира заинтересовался, сколько есть способов позвать \(3\) друзей так, чтобы они не стали подшучивать друг над другом? Два способа считаются различными, если существует такой друг, что он приглашен в одном случае, и не приглашен в другом. Формально, если Кира позовет друзей с номерами \(i\), \(j\) и \(k\), то должно выполняться \(\gcd(\min(a_i, a_j, a_k), \max(a_i, a_j, a_k)) = 1\), где \(\gcd(x, y)\) обозначает наибольший общий делитель (НОД) чисел \(x\) и \(y\). Кира не очень силен в информатике, поэтому просит вас посчитать количество различных способов позвать друзей. Выходные данные В единственной строке выведите количество способов позвать друзей. Примечание В первом примере подходит одна способ — позвать друзей \(1\), \(2\) и \(3\). Здесь \(1 < 2 < 3\), и числа \(1\) и \(3\) взаимно просты.
| |
|
|
B. Поход в кинотеатр
жадные алгоритмы
Перебор
сортировки
*1000
В компании из \(n\) человек организуется поход в кинотеатр. Каждый человек может либо пойти, либо нет. Это зависит от того, сколько ещё народу пойдёт. А именно, каждый человек \(i\) сказал: «Я хочу пойти в кинотеатр тогда и только тогда, когда пойдут хотя бы ещё \(a_i\) других человек, не считая меня». Это значит, что \(i\)-й человек расстроится в двух случаях: - если он пойдёт в кинотеатр, а кроме него пойдут строго менее \(a_i\) других человек; или
- если он не пойдёт в кинотеатр, но при этом пойдут хотя бы \(a_i\) других человек.
Сколько есть способов выбрать множество людей, идущих в кинотеатр, чтобы никто не расстроился? Выходные данные Для каждого набора входных данных выведите одно целое число — число различных способов выбрать множество людей, идущих в кинотеатр, чтобы никто не расстроился. Примечание В первом наборе входных данных оба человека хотят пойти тогда и только тогда, когда другой человек пойдёт. Есть два подходящих варианта: либо оба пойдут, либо оба не пойдут. Если же пойдёт лишь один из двоих, то оба окажутся расстроены. Во втором наборе входных данных в кинотеатр должны пойти все. В любом другом варианте обязательно кто-нибудь расстроится. В третьем наборе входных данных есть три допустимых варианта: либо идёт человек с номером \(2\); либо идут люди с номерами \(2, 3, 4, 7\); либо идут все восемь человек.
| |
|
|
C. Равные частоты
жадные алгоритмы
Конструктив
Перебор
реализация
сортировки
Строки
*1600
Назовём строку сбалансированной, если все символы, которые в ней присутствуют, входят в неё одинаковое число раз. Например, «coder», «appall» и «ttttttt» — сбалансированные строки, а «wowwow» и «codeforces» — нет. Вам дана строка \(s\) длины \(n\), состоящая из строчных латинских букв. Найдите сбалансированную строку \(t\) той же длины \(n\), состоящую из строчных латинских букв и отличающуюся от строки \(s\) в как можно меньшем числе позиций. Другими словами, число индексов \(i\) таких, что \(s_i \ne t_i\), должно быть минимальным возможным. Выходные данные Для каждого набора входных данных выведите наименьшее число позиций, в которых строка \(s\) и сбалансированная строка \(t\) могут отличаться, и далее выведите саму такую строку \(t\). Если существует несколько решений, выведите любое из них. Можно показать, что хотя бы одна сбалансированная строка всегда существует. Примечание В первом наборе входных данных заданная строка «hello» не является сбалансированной: буквы «h», «e» и «o» встречаются в ней по одному разу, а буква «l» — два раза. С другой стороны, строка «helno» сбалансирована: в ней присутствуют пять разных букв, и каждая из них встречается ровно один раз. Строки «hello» и «helno» отличаются всего в одной позиции — в четвёртом символе. Возможны и другие решения. Во втором наборе входных данных строка «codefofced» сбалансирована, так как в ней присутствуют только буквы «c», «o», «d», «e» и «f», и каждая из них встречается ровно два раза. В третьем наборе входных данных строка «eeeee» сбалансирована, так как в ней присутствует только буква «e». В четвёртом наборе входных данных заданная строка «appall» уже сбалансирована.
| |
|
|
A. Сделай массив красивым
Конструктив
математика
сортировки
*800
Назовем массив \(a\) уродливым, если в нем есть хотя бы один элемент, который равен сумме всех элементов до него. Если массив не уродливый, назовем его красивым. Например: - массив \([6, 3, 9, 6]\) — уродливый: элемент \(9\) равен \(6 + 3\);
- массив \([5, 5, 7]\) — уродливый: элемент \(5\) (второй) равен \(5\);
- массив \([8, 4, 10, 14]\) — красивый: \(8 \ne 0\), \(4 \ne 8\), \(10 \ne 8 + 4\), \(14 \ne 8 + 4 + 10\), значит, ни один элемент не равен сумме всех элементов до него.
Вам дан массив \(a\), для элементов которого выполняется условие \(1 \le a_1 \le a_2 \le \dots \le a_n \le 100\). Вы должны поменять порядок элементов \(a\) так, чтобы получился красивый массив. Обратите внимание, что нельзя ни добавлять новые элементы, ни удалять существующие — вы можете только переставлять элементы массива \(a\). Если массив \(a\) уже красивый, вы можете оставить его без изменений. Выходные данные Для каждого набора входных данных выведите ответ следующим образом: - если нельзя переставить элементы \(a\) так, чтобы он стал красивым, выведите NO;
- иначе в первой строке выведите YES. Во второй строке выведите \(n\) целых чисел — красивый массив, который можно получить, поменяв порядок элементов в \(a\). Если таких массивов несколько, выведите любой из них.
| |
|
|
C. Очередной Турнир
Бинарный поиск
жадные алгоритмы
сортировки
*1700
Вы участвуете в турнире под названием «Очередной Турнир». В турнире участвуют \(n + 1\) человек: вы и \(n\) ваших соперников, пронумерованных от \(1\) по \(n\). Каждый участник сыграет против каждого ровно один раз. Если соперник \(i\) состязается с соперником \(j\), он выигрывает тогда и только тогда, когда \(i > j\). Если же оппонент \(i\) играет против вас, все становится немного сложнее. Для того чтобы победить оппонента \(i\), вам нужно готовиться к матчу на протяжении \(a_i\) минут. В противном случае вы проиграете данному сопернику. У вас есть \(m\) свободных минут для подготовки к матчам, но вы можете готовиться одновременно только к одному матчу. Другими словами, если вы хотите выиграть у оппонентов \(p_1, p_2, \dots, p_k\), вы должны потратить на подготовку \(a_{p_1} + a_{p_2} + \dots + a_{p_k}\) минут. Если же это число больше \(m\), вы не сможете их всех победить. Финальное место каждого участника равно количеству участников со строго большим количеством побед \(+\) \(1\). Например, если \(3\) участника выиграли по \(5\) раз, \(1\) участник — \(3\) раза, и \(2\) участника — по \(1\) разу, то первые \(3\) займут \(1\)-е место, четвертый — \(4\)-е место, и два последних — \(5\)-е место. Посчитайте минимально возможное место (меньше — лучше), которое вы сможете занять, если на подготовку к матчам у вас всего \(m\) минут. Выходные данные Для каждого набора входных данных выведите наименьшее возможное место, которое вы сможете занять, если на подготовку у вас есть только \(m\) минут. Примечание В первом наборе входных данных у вас есть время на подготовку ко всем оппонентам, а потому вы выиграете все \(4\) матча и займете \(1\)-е место, так как все ваши оппоненты выиграют не более \(3\) матчей. Во втором наборе вы можете подготовиться ко второму оппоненту и выиграть у него. В результате вы выиграете \(1\) матч, оппонент \(1\) — \(1\) матч, оппонент \(2\) — \(1\) матч, оппонент \(3\) — \(3\) матча. А потому оппонент \(3\) займет \(1\)-е место, и все остальные, включая вас, — \(2\)-е место. В третьем наборе входных у вас нет времени на подготовку, а потому вы проиграете все матчи. Так как у каждого из оппонентов будет хотя бы \(1\) победа, вы займете последнее место (место \(6\)). В четвертом наборе у вас нет времени на подготовку, но вы все равно выиграете у первого оппонента. В результате оппонент \(1\) не выиграл ни одного матча, у вас \(1\) победа, и у всех остальных хотя бы \(2\) победы. А потому ваше место \(4\).
| |
|
|
B. Производство тортов
Перебор
сортировки
*1300
На некотором кондитерском заводе произошла очередная оптимизация линии по производству тортов, и теперь торты выпускаются сразу партиями по \(n\) штук! На последнем этапе сборки тортов все \(n\) тортов должны быть одновременно политы кремом. Рассмотрим вид сбоку на конвейерную ленту, представим ее в виде числовой прямой. \(i\)-й торт занимает отрезок \([a_i - w, a_i + w]\) на этой прямой, любая пара отрезков не имеет общих точек. Над конвейером расположены \(n\) дозаторов, при нажатии на общую кнопку из \(i\)-го дозатора выльется крем на отрезок конвейера \([b_i - h, b_i + h]\). Любая пара этих отрезков также не имеет общих точек. Торты и дозаторы, соответствующие первому примеру. Настройку этой части конвейера еще не проводили, поэтому ее нужно выполнить вам. Определите, можно ли подвинуть конвейер так, чтобы крем попал на каждый торт, и при этом не вытек за пределы тортов? Можете считать, что конвейер достаточно длинный, и торты с него никогда не падают. Также учтите, что кнопку можно нажать лишь один раз. В первом примере можно подвинуть торты как показано на рисунке. Выходные данные Для каждого набора входных данных выведите «YES», если можно подвинуть конвейер так, чтобы крем попал на каждый торт, и не вытек за пределы тортов, и «NO» иначе. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание Первый пример показан на рисунках в условии. Во втором примере мы можем подвинуть торты например так, чтобы их центры находились в позициях \(4, 9, 14, 19, 24\). В третьем примере подвинуть торты необходимым образом не получится.
| |
|
|
D. Матрёшки
жадные алгоритмы
сортировки
Структуры данных
*1200
Матрёшка — деревянная игрушка в виде расписной куклы, внутрь которой можно вложить подобную ей куклу меньшего размера. Набор матрёшек содержит одну или более матрёшку, их размеры составляют подряд идущие положительные целые числа. Таким образом, набор матрёшек описывается двумя числами: \(s\) — размером минимальной матрёшки в наборе и \(m\) — количеством матрёшек в наборе. Иными словами, набор содержит матрёшки размеров \(s, s + 1, \dots, s + m - 1\) для некоторых целых \(s\) и \(m\) (\(s,m > 0\)). У вас было несколько наборов матрёшек. Недавно вы обнаружили, что кто-то смешал все ваши наборы в один и записал последовательность размеров кукол — целые числа \(a_1, a_2, \dots, a_n\). Вы не помните, сколько точно у вас было наборов, поэтому хотите найти минимальное количество наборов, которое могло быть у вас изначально. Например, если заданная последовательность имеет вид \(a=[2, 2, 3, 4, 3, 1]\). Изначально могло быть всего \(2\) набора: - первый набор, состоящий из \(4\)-х матрешек с размерами \([1, 2, 3, 4]\);
- второй набор, состоящий из \(2\)-x матрешек с размерами \([2, 3]\).
По заданной последовательности размеров матрёшек \(a_1, a_2, \dots, a_n\) определите минимальное количество наборов матрёшек, которые могут эту последовательность составлять. Каждый набор используется полностью, то используются все его матрёшки. Каждый элемент заданной последовательности должен соответствовать ровно одной кукле из какого-то набора. Выходные данные Для каждого набора входных данных выведите одно целое число \(k\) — минимально возможное количество наборов, чтобы составить заданную последовательность. Примечание Первый набор входных данных разобран в условии. Во втором наборе входных данных все матрёшки могли быть частью одного набора с минимальным размером матрёшки \(s=7\). В третьем наборе входных данных каждая матрешка представляет собой отдельный набор.
| |
|
|
E. Отрицательные и положительные
дп
жадные алгоритмы
сортировки
*1100
Дан массив \(a\) состоящий из \(n\) элементов, найдите максимально возможную сумму, которая может быть у массива после выполнения следующей операции любое количество раз: - Выбрать \(2\) соседних элемента и поменять их знаки. Иными словами, выбрать индекс \(i\) такой, что \(1 \leq i \leq n - 1\) и присвоить \(a_i = -a_i\) и \(a_{i+1} = -a_{i+1}\).
Выходные данные Для каждого набора входных данных выведите максимально возможную сумму, которая может получится у массива, если мы применим описанную выше операцию любое количество раз. Примечание В первом наборе, выполнив операцию над первыми двумя элементами, мы можем изменить массив с \([-1, -1, -1]\) на \([1, 1, -1]\). Можно доказать, что этот массив дает максимально возможную сумму, которая равна \(1 + 1 + (-1) = 1\). Во втором наборе, выполнив операцию над \(-5\) и \(0\), мы изменим массив с \([1, 5, -5, 0, 2]\) на \([1, 5, -(-5), -0, 2] = [1, 5, 5, 0, 2]\), который имеет максимальную сумму, так как все элементы неотрицательны. Так, ответ: \(1 + 5 + 5 + 0 + 2 = 13\). В третьем наборе массив уже содержит только положительные числа, поэтому выполнять операции не нужно. Ответ — это просто сумма всего массива, которая равна \(1 + 2 + 3 = 6\).
| |
|
|
G1. Телепорты (Простая версия)
жадные алгоритмы
сортировки
*1100
Единственное отличие между простой и сложной версиями — точки, куда вы можете телепортироваться. Рассмотрим точки \(0, 1, \dots, n\) расположенные на прямой. Имеются телепорты, расположенные в каждой из точек \(1, 2, \dots, n\). В точке \(i\) вы можете сделать следующее: - Переместиться влево на единицу. Это стоит \(1\) монету.
- Переместиться вправо на единицу. Это стоит \(1\) монету.
- Воспользоваться телепортом в точке \(i\), если он существует. Это стоит \(a_i\) монет. В результате, вы телепортируетесь в точку \(0\). Каждым телепортом можно воспользоваться только один раз.
У вас есть \(c\) монет, и вы начинаете в точке \(0\). Каким наибольшим числом телепортов вы сможете воспользоваться? Выходные данные Для каждого набора входных данных выведите максимальное количество телепортов, которым вы сможете воспользоваться. Примечание В первом наборе входных данных вы можете переместиться на одну единицу вправо, использовать телепорт в точке \(1\) и телепортироваться в точку \(0\), переместиться на две единицы вправо и использовать телепорт в точке \(2\). У вас останется \(6-1-1-2-1 = 1\) монета, этого недостаточно, чтобы использовать другой телепорт. Вы использовали два телепорта, поэтому ответ — два. Во втором наборе входных данных вы перемещаетесь на четыре единицы вправо и используете телепорт, перемещаясь в \(0\), затем перемещаетесь на шесть единиц вправо и используете телепорт в точке \(6\), перемещаясь в \(0\). Общая стоимость составит \(4+6+6+4 = 20\). У вас осталось \(12\) монет, но этого недостаточно, чтобы добраться до любого другого телепорта и использовать его, поэтому ответ равен \(2\). В третьем наборе входных данных у вас недостаточно монет для использования любого телепорта, поэтому ответ равен нулю.
| |
|
|
G2. Телепорты (Сложная версия)
Бинарный поиск
жадные алгоритмы
сортировки
*1900
Единственное отличие между простой и сложной версиями — точки, куда вы можете телепортироваться. Рассмотрим точки \(0,1,\dots,n+1\) расположенные на прямой. Имеются телепорты, расположенные в каждой из точек \(1,2,\dots,n\). В точке \(i\) вы можете сделать следующее: - Переместиться влево на единицу. Это стоит \(1\) монету.
- Переместиться вправо на единицу. Это стоит \(1\) монету.
- Воспользоваться телепортом в точке \(i\), если он существует. Это стоит \(a_i\) монет. В результате, вы телепортируетесь в точку \(0\) или \(n+1\) на ваш выбор. Каждым телепортом можно воспользоваться только один раз.
У вас есть \(c\) монет, и вы начинаете в точке \(0\). Каким наибольшим числом телепортов вы сможете воспользоваться? Выходные данные Для каждого набора входных данных выведите максимальное количество телепортов, которым вы сможете воспользоваться. Примечание В первом наборе входных данных вы можете переместиться на одну единицу вправо, использовать телепорт в точке \(1\) и телепортироваться в точку \(n+1\), переместиться на одну единицу влево и использовать телепорт в точке \(5\). У вас останется \(6-1-1-1-1 = 2\) монеты, этого недостаточно, чтобы использовать другой телепорт. Вы использовали два телепорта, поэтому ответ — два. Во втором наборе входных данных вы перемещаетесь на четыре единицы вправо и используете телепорт, перемещаясь в \(n+1\), затем перемещаетесь на три единицы влево и используете телепорт в точке \(6\), перемещаясь в \(n+1\), и затем перемещаетесь влево на четыре единицы и используете телепорт. Общая стоимость составит \(4+6+3+4+4+9 = 30\) и вы использовали три телепорта. В третьем наборе входных данных у вас недостаточно монет для использования любого телепорта, поэтому ответ равен нулю.
| |
|
|
A. GamingForces
жадные алгоритмы
сортировки
*800
Монокарп играет в компьютерную игру. Он должен уничтожить \(n\) монстров, у \(i\)-го из них \(h_i\) здоровья. У Монокарпа есть два заклинания, каждое из которых он может применить произвольное количество раз (возможно, ноль) и в произвольном порядке: - выбрать ровно двух живых монстров и уменьшить их здоровье на \(1\);
- выбрать ровно одного живого монстра и убить его.
Когда здоровье монстра становится равным \(0\), он умирает. Какое наименьшее количество раз Монокарп должен применить заклинания, чтобы убить всех монстров? Выходные данные На каждый набор входных данных выведите одно целое число — наименьшее количество раз, которое Монокарп должен применить заклинания, чтобы убить всех монстров. Примечание В первом наборе входных данных изначальный список здоровья \([1, 2, 1, 2]\). Применяются три заклинания: - первое заклинание на монстров \(1\) и \(2\) — монстр \(1\) умирает, у монстр \(2\) здоровье становится \(1\), новый список здоровья \([0, 1, 1, 2]\);
- первое заклинание на монстров \(3\) и \(4\) — монстр \(3\) умирает, у монстр \(4\) здоровье становится \(1\), новый список здоровья \([0, 1, 0, 1]\);
- первое заклинание на монстров \(2\) и \(4\) — оба монстра \(2\) и \(4\) умирают.
Во втором наборе входных данных изначальный список здоровья \([2, 4, 2]\). Применяются три заклинания: - первое заклинание на монстров \(1\) и \(3\) — у обоих монстров здоровье становится \(1\), новый список здоровья \([1, 4, 1]\);
- второе заклинание на монстра \(2\) — монстр \(2\) умирает, новый список здоровья \([1, 0, 1]\);
- первое заклинание на монстров \(1\) и \(3\) — оба монстра \(1\) и \(3\) умирают.
В третьем наборе изначальный список здоровья \([1, 2, 3, 4, 5]\). Применяются пять заклинаний. \(i\)-е из них убивает \(i\)-го монстра вторым заклинанием. Последовательность списков здоровья: \([1, 2, 3, 4, 5]\) \(\rightarrow\) \([0, 2, 3, 4, 5]\) \(\rightarrow\) \([0, 0, 3, 4, 5]\) \(\rightarrow\) \([0, 0, 0, 4, 5]\) \(\rightarrow\) \([0, 0, 0, 0, 5]\) \(\rightarrow\) \([0, 0, 0, 0, 0]\).
| |
|
|
D. Перестановки с неподвижным префиксом
Бинарный поиск
битмаски
математика
сортировки
Структуры данных
хэши
*1700
Заданы \(n\) перестановок \(a_1, a_2, \dots, a_n\), каждая длины \(m\). Напомним, что перестановка длины \(m\) — это последовательность из \(m\) различных целых чисел от \(1\) до \(m\). Назовем красотой перестановки \(p_1, p_2, \dots, p_m\) наибольшее такое \(k\), что \(p_1 = 1, p_2 = 2, \dots, p_k = k\). Если \(p_1 \neq 1\), то красота равна \(0\). Произведение двух перестановок \(p \cdot q\) — это такая перестановка \(r\), что \(r_j = q_{p_j}\). Для каждого \(i\) от \(1\) до \(n\) выведите наибольшую красоту перестановки \(a_i \cdot a_j\) по всем \(j\) от \(1\) до \(n\) (возможно, \(i = j\)). Выходные данные На каждый набор входных данных выведите \(n\) целых чисел. \(i\)-е значение должно быть равно наибольшей красоте перестановки \(a_i \cdot a_j\) по всем \(j\) (\(1 \le j \le n\)).
| |
|
|
E. Велепин и маркетинг
Бинарный поиск
дп
жадные алгоритмы
сортировки
Структуры данных
*2600
Знаменитый писатель Велепин очень продуктивный. Совсем недавно он подписал контракт с известным изданием и теперь ему нужно написать \(k_i\) книг за \(i\)-й год. Для него это вообще не проблема, он может сколько угодно писать о самураях, космосе, пустоте, насекомых и оборотнях. У него есть \(n\) постоянных читателей, каждый из которых в \(i\)-й год прочитает одну из \(k_i\) книг, выпущенных Велепиным. Читатели очень любят обсуждать книги, поэтому \(j\)-й из них будет доволен в течение года, если такую же книгу, как он, прочитают как минимум \(a_j\) человек (включая его самого). У Велепина есть явные проблемы с маркетингом, поэтому он обратился к вам! Известный сервис чтения книг может управлять тем, что будет читать каждый из поклонников Велепина, но он не хочет чтобы книги пропадали зря, поэтому каждую книгу должен кто-то прочитать. И вот они обратились к вам, с просьбой сказать, какое максимальное количество постоянных читателей можно сделать довольным в течение каждого из годов, если вы можете выбирать каждому человеку книгу, которую он будет читать. Выходные данные Выведите \(q\) строк, в каждой из них ровно одно число — максимальное количество человек, которые могут быть довольны в \(j\)-й год, если Велепин выпустит \(k_j\) книг. Примечание В первом примере в первый год оптимальным является разделение \(1, 2, 2, 2, 2\) (первую книгу читает первый человек, а все остальные вторую). Во второй год оптимальным решением является \(1, 2, 2, 3, 3\) (первую книгу читает первый человек, вторую книгу читает второй и третий человек, а все остальные третью книгу). В третий год оптимальным будет разбиение \(1, 2, 3, 4, 2\). Соответственно количество довольных людей по годам будет — \(5, 5, 3\). Во втором примере в первый год оптимальным является разделение \(1, 1, 1, 1, 1, 2\), тогда будут довольны все кроме \(6\)-го человека. Во второй год оптимальным разделением является \(1, 1, 1, 1, 2, 3\), тогда будут довольны все кроме \(5\)-го и \(6\)-го человека.
| |
|
|
A. Гвоздь программы
жадные алгоритмы
реализация
сортировки
*800
Вам даны два массива \(a_1, a_2, \ldots, a_n\) и \(b_1, b_2, \ldots, b_n\). За одну операцию можно выбрать любое число \(i\) от \(1\) до \(n\) и поменять местами числа \(a_i\) и \(b_i\). Определите, можно ли после использования некоторого (возможно, нулевого) количества операций добиться одновременного выполнения следующих двух условий: - \(a_n = \max(a_1, a_2, \ldots, a_n)\),
- \(b_n = \max(b_1, b_2, \ldots, b_n)\).
Здесь запись \(\max(c_1, c_2, \ldots, c_k)\) обозначает максимальное из чисел \(c_1, c_2, \ldots, c_k\). Например \(\max(3, 5, 4) = 5\), \(\max(1, 7, 7) = 7\), \(\max(6, 2) = 6\). Выходные данные Для каждого набора входных данных в отдельной строке выведите «Yes», если после применения некоторого (возможно, нулевого) количества операций можно добиться выполнения описанных условий. В противном случае выведите «No». Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В первом наборе входных данных можно поменять местами числа \(a_3\) и \(b_3\), после чего массив \(a\) станет равным \([7, 9, 9]\), а массив \(b\) станет равным \([7, 6, 7]\) и оба условия будут выполнены. Во втором наборе входных данных можно показать, что выполнить условия невозможно. В третьем наборе входных данных можно поменять местами числа \(a_1\) и \(b_1\), после чего массив \(a\) станет равным \([99, 99]\), а массив \(b\) станет равным \([100, 100]\) и оба условия будут выполнены. В пятом наборе входных данных можно поменять местами \(a_7\) и \(b_7\), \(a_8\) и \(b_8\), \(a_9\) и \(b_9\), после чего массив \(a\) станет равным \([1, 2, 3, 4, 5, 6, 6, 6, 6]\), а массив \(b\) станет равным \([9, 9, 9, 9, 9, 9, 7, 8, 9]\) и оба условия будут выполнены.
| |
|
|
F. Подели пополам или вычти
Бинарный поиск
дп
жадные алгоритмы
Перебор
сортировки
*2700
У вас есть массив положительных целых чисел \(a_1, a_2, \ldots, a_n\) длины \(n\). Также вам дано положительное целое число \(b\). Мы можете сделать следующие операции несколько раз в любом порядке: - Выберите некоторый индекс \(1 \le i \le n\) и замените \(a_i\) на \(\lceil \frac{a_i}{2} \rceil\). Здесь \(\lceil x \rceil\) обозначает минимальное целое число не меньше чем \(x\).
- Выберите некоторый индекс \(1 \le i \le n\) и замените \(a_i\) на \(\max(a_i - b, 0)\).
Однако также нужно, чтобы следующие условия удовлетворялись: - Вы можете сделать не более \(k_1\) операций типа 1.
- Вы можете сделать не более \(k_2\) операций типа 2.
- Для всех \(1 \le i \le n\), вы можете сделать не более \(1\) операции типа 1 с элементом \(a_i\).
- Для всех \(1 \le i \le n\), вы можете сделать не более \(1\) операции типа 2 с элементом \(a_i\).
Цена массива это сумма его элементов. Найдите минимальную цену массива \(a\), которую можно получить, выполняя эти операции. Выходные данные Для каждого набора входных данных выведите минимальную цену массива \(a\), которую можно получить, выполняя операции. Примечание В первом наборе входных данных вы можете сделать следующее: - Сделать операцию 2 с элементом \(a_3\). Он поменяется с \(5\) на \(3\).
- Сделать операцию 1 с элементом \(a_1\). Он поменяется с \(9\) на \(5\).
После всех операций получается массив \(a = [5, 3, 3]\) который имеет цену \(5 + 3 + 3 = 11\). Можно показать, что это минимальная достижимая цена. Во втором наборе входных данных обратите внимание, что нам не разрешено применять операцию типа 1 более одного раза с элементом \(a_1\). Поэтому оптимально применить операцию типа 1 к элементам \(a_1\) и \(a_2\). Также можно применить операцию 1 только к \(a_1\), потому что эта операция никак не меняет элемент \(a_2\). В третьем наборе входных данных можно получить массив стоимости \(23\): - Сделать операцию 1 с элементом \(a_4\). Он поменяется с \(19\) на \(10\).
- Сделать операцию 2 с элементом \(a_4\). Он поменяется с \(10\) на \(7\).
После всех операций получается массив \(a = [2, 8, 3, 7, 3]\). Цена массива \(a\) это \(2 + 8 + 3 + 7 + 3 = 23\). Можно показать, что это минимальная достижимая цена.
| |
|
|
B. Покупка подарков
жадные алгоритмы
сортировки
Структуры данных
*1800
У маленького Саши есть две подруги, которых он хочет порадовать подарками на Восьмое марта. Для этого он отправился в самый большой торговый центр в городе. В торговом центре есть \(n\) отделов, в каждом из которых находятся ровно два магазина. Для удобства пронумеруем отделы целыми числами от \(1\) до \(n\). Известно, что подарки в первом магазине \(i\)-го отдела стоят \(a_i\) рублей, а во втором магазине \(i\)-го отдела — \(b_i\) рублей. Войдя в торговый центр, Саша посетит каждый из \(n\) отделов торгового центра, причем в каждом отделе он зайдет ровно в один магазин. Когда Саша попадет в \(i\)-й отдел, он выполнит ровно одно из двух действий: - Купить подарок первой подруге, потратив на это \(a_i\) рублей.
- Купить подарок второй подруге, потратив на это \(b_i\) рублей.
Для каждой подруги Саша собирается купить хотя бы один подарок. Более того, он хочет подобрать подарки таким образом, чтобы разность цен самых дорогих подарков, купленных подругам, была как можно меньше, чтобы никто не обиделся. Более формально: пусть \(m_1\) — максимальная цена подарка, купленного первой подруге, а \(m_2\) — максимальная цена подарка, купленного второй подруге. Саша хочет выбрать подарки таким образом, чтобы минимизировать величину \(\lvert m_1 - m_2 \rvert\). Выходные данные Выведите одно целое число — минимальную разность цен самых дорогих подарков, купленных подругам. Примечание В первом наборе входных данных у Саши есть два возможных варианта действий: купить подарок первой подруге в первом отделе, а второй подруге — во втором отделе, или наоборот. В первом случае \(m_1 = m_2 = 1\), а во втором случае — \(m_1 = m_2 = 2\). В обоих случаях ответ равен \(0\). Во втором наборе входных данных можно купить подарки для первой подруги в \(2\)-м, \(4\)-м и \(5\)-м отделах, а для второй подруги — в \(1\)-м и \(3\)-м отделах. Таким образом, \(m_1 = \max(2, 4, 2) = 4\), \(m_2 = \max(5, 3) = 5\). Ответ равен \(\lvert 4 - 5 \rvert = 1\).
| |
|
|
C. Музыкальный фестиваль
Бинарный поиск
дп
жадные алгоритмы
сортировки
Структуры данных
*1900
Мальчик Витя очень любит слушать музыку. Он пристально следит за обновлениями своих любимых групп, поэтому знает, что в эту пятницу должны быть выпущены \(n\) альбомов, \(i\)-й из которых содержит \(k_i\) треков. Разумеется, Витя, как самый преданный фанат, уже послушал все треки, которые должны выйти в ближайшее время, и знает, что в \(i\)-м альбоме крутость \(j\)-го трека равна \(a_{i,j}\). У Вити есть подруга Маша, которую он очень хочет пригласить на фестиваль, где выступают его любимые группы. Однако для того, чтобы подруга согласилась, она должна сначала оценить вышедшие новинки. Витя знает, что, если Маша послушает трек, который был круче всех прошлых, она получит 1 единицу впечатления. К сожалению, альбомы можно слушать только целиком, не меняя песни в них местами. Помогите Вите найти такой порядок альбомов, чтобы впечатление Маши оказалось как можно больше, и она точно сходила вместе с ним на фестиваль. Выходные данные Для каждого тестового набора выведите единственное число — максимальное впечатление, которое может может получить Маша. Примечание В первом тестовом примере оптимальным порядком является прослушивание 4-го, 2-го, 3-го и 1-го альбомов. В таком случае Маша послушает треки в следующем порядке: 1; 7; 8, 6; 4, 9, 4, 6, 8 и получит 4 единицы впечатления. Во втором тестовом примере необходимо сначала прослушать 1-й, потом 4-й и в любом порядке 2-й и 3-й. В таком случае Маша получит максимальное впечатление, причём за каждую песню в 1-м и 4-м альбомах и ничего за 2-й и 3-й.
| |
|
|
D. Путь домой
Бинарный поиск
графы
дп
жадные алгоритмы
кратчайшие пути
сортировки
Структуры данных
*2100
Известный фокусник Боря Будини путешествовал по стране \(X\), которая состоит из \(n\) городов. Однако случилось несчастье, и его обокрали в городе номер \(1\). Теперь Будини предстоит нелегкий путь домой в город \(n\). Добираться он собирается самолетами. Всего в стране есть \(m\) авиарейсов, \(i\)-й летит из города \(a_i\) в город \(b_i\) и стоит \(s_i\) монет. Обратите внимание, что \(i\)-й рейс односторонний, то есть не может использоваться, чтобы добраться из города \(b_i\) в город \(a_i\). Чтобы им воспользоваться, Боря должен быть в городе \(a_i\) и иметь на руках хотя бы \(s_i\) монет (которые он потратит на перелет). После ограбления у него осталось всего \(p\) монет, однако он не отчаивается! Находясь в городе \(i\), он может хоть каждый день организовывать представления, которые будут приносить ему по \(w_i\) монет каждый. Помогите фокуснику узнать, сможет ли он добраться до дома, а также какое минимальное количество представлений придется для этого организовать. Выходные данные Для каждого теста выведите единственное целое число — минимальное количество представлений, которое придется организовать Боре, чтобы добраться до дома, или \(-1\), если это сделать невозможно. Примечание В первом примере Боре оптимально сделать \(4\) представления в первом городе, имея в итоге \(2 + 7 \cdot 4 = 30\) рублей, а потом пройтись по маршруту \(1-3-2-4\), потратив \(6+8+11=25\) рублей. Во втором примере Боре оптимально сделать \(15\) представлений в первом городе, полететь в \(3\) город, сделать там \(9\) представлений, и далее отправиться в \(4\) город.
| |
|
|
F1. Выживание слабейших (простая версия)
Бинарный поиск
математика
Перебор
реализация
сортировки
*2600
Это простая версия задачи. Она отличается от сложной только ограничением на \(n\). Вы можете делать взломы, только если заблокируете обе версии задачи. Пусть \(a_1, a_2, \ldots, a_n\) — массив, состоящий из целых неотрицательных чисел. Определим \(F(a_1, a_2, \ldots, a_n)\) как отсортированный по неубыванию массив, состоящий из \(n - 1\) минимальных чисел вида \(a_i + a_j\), где \(1 \le i < j \le n\). Другими словами, \(F(a_1, a_2, \ldots, a_n)\) — это отсортированный по неубыванию массив из \(n - 1\) минимальных сумм всевозможных пар элементов массива \(a_1, a_2, \ldots, a_n\). Например, \(F(1, 2, 5, 7) = [1 + 2, 1 + 5, 2 + 5] = [3, 6, 7]\). Вам дан массив, состоящий из целых неотрицательных чисел \(a_1, a_2, \ldots, a_n\). Определите, чему равен единственный элемент массива \(\underbrace{F(F(F\ldots F}_{n-1}(a_1, a_2, \ldots, a_n)\ldots))\). Так как ответ может быть достаточно большим, выведите его по модулю \(10^9+7\). Выходные данные Выведите единственное число — ответ на задачу по модулю \(10^9 + 7\). Примечание В первом тесте массив трансформируется следующим образом: \([1, 2, 4, 5, 6] \to [3, 5, 6, 6] \to [8, 9, 9] \to [17, 17] \to [34]\). Единственный элемент конечного массива равен \(34\). Во втором тесте \(F(a_1, a_2, \ldots, a_n)\) будет равен \([2, 2, 2, 8, 8, 8, 8, 8]\). Этот массив составлен из \(3\) чисел вида \(1 + 1\) и из \(5\) чисел вида \(1 + 7\). В четвёртом тесте массив трансформируется следующим образом: \([10^9, 10^9, 777] \to [10^9+777, 10^9+777] \to [2 \cdot 10^9 + 1554]\). \(2 \cdot 10^9 + 1554\) по модулю \(10^9+7\) равняется \(1540\).
| |
|
|
F2. Выживание слабейших (сложная версия)
жадные алгоритмы
математика
сортировки
*3100
Это сложная версия задачи. Она отличается от простой только ограничением на \(n\). Вы можете делать взломы, только если заблокируете обе версии задачи. Пусть \(a_1, a_2, \ldots, a_n\) — массив, состоящий из целых неотрицательных чисел. Определим \(F(a_1, a_2, \ldots, a_n)\) как отсортированный по неубыванию массив, состоящий из \(n - 1\) минимальных чисел вида \(a_i + a_j\), где \(1 \le i < j \le n\). Другими словами, \(F(a_1, a_2, \ldots, a_n)\) — это отсортированный по неубыванию массив из \(n - 1\) минимальных сумм всевозможных пар элементов массива \(a_1, a_2, \ldots, a_n\). Например, \(F(1, 2, 5, 7) = [1 + 2, 1 + 5, 2 + 5] = [3, 6, 7]\). Вам дан массив, состоящий из целых неотрицательных чисел \(a_1, a_2, \ldots, a_n\). Определите, чему равен единственный элемент массива \(\underbrace{F(F(F\ldots F}_{n-1}(a_1, a_2, \ldots, a_n)\ldots))\). Так как ответ может быть достаточно большим, выведите его по модулю \(10^9+7\). Выходные данные Выведите единственное число — ответ на задачу по модулю \(10^9 + 7\). Примечание В первом тесте массив трансформируется следующим образом: \([1, 2, 4, 5, 6] \to [3, 5, 6, 6] \to [8, 9, 9] \to [17, 17] \to [34]\). Единственный элемент конечного массива равен \(34\). Во втором тесте \(F(a_1, a_2, \ldots, a_n)\) будет равен \([2, 2, 2, 8, 8, 8, 8, 8]\). Этот массив составлен из \(3\) чисел вида \(1 + 1\) и из \(5\) чисел вида \(1 + 7\). В четвёртом тесте массив трансформируется следующим образом: \([10^9, 10^9, 777] \to [10^9+777, 10^9+777] \to [2 \cdot 10^9 + 1554]\). \(2 \cdot 10^9 + 1554\) по модулю \(10^9+7\) равняется \(1540\).
| |
|
|
F1. Мастер НОД (простая версия)
жадные алгоритмы
математика
сортировки
теория чисел
*2900
Это простая версия задачи. Различия между версиями заключаются в ограничениях на \(m\). Вы можете делать взломы, только если обе версии задачи сданы. Вам дан массив \(a\) длины \(n\) и два целых числа \(m\) и \(k\). Каждый элемент в \(a\) удовлетворяет условию \(1\le a_i \le m\). За одну операцию вы выбираете два индекса \(i\) и \(j\) такие, что \(1 \le i < j \le |a|\), затем добавляете \(\gcd(a_i,a_j)\) в конец массива и удаляете \(a_i\) и \(a_j\) из массива. Обратите внимание, что после этой операции длина массива уменьшится на единицу. Найдите максимально возможную сумму массива после выполнения ровно \(k\) операций. Выходные данные Для каждого набора входных данных выведите максимально возможную сумму массива после оптимального выполнения \(k\) операций. Примечание В первом наборе входных данных лучшим способом является выбор \(i=1\), \(j=3\) в первой операции. Итоговая последовательность — \([7,4]\).
| |
|
|
F2. Мастер НОД (сложная версия)
жадные алгоритмы
математика
сортировки
*2900
Это сложная версия задачи. Различия между версиями заключаются в ограничениях на \(m\). Вы можете делать взломы, только если обе версии задачи сданы. Вам дан массив \(a\) длины \(n\) и два целых числа \(m\) и \(k\). Каждый элемент в \(a\) удовлетворяет условию \(1\le a_i \le m\). За одну операцию вы выбираете два индекса \(i\) и \(j\) такие, что \(1 \le i < j \le |a|\), затем добавляете \(\gcd(a_i,a_j)\) в конец массива и удаляете \(a_i\) и \(a_j\) из массива. Обратите внимание, что после этой операции длина массива уменьшится на единицу. Найдите максимально возможную сумму массива после выполнения ровно \(k\) операций. Выходные данные Для каждого набора входных данных выведите максимально возможную сумму массива после оптимального выполнения \(k\) операций. Примечание В первом наборе входных данных лучшим способом является выбор \(i=1\), \(j=3\) в первой операции. Итоговая последовательность — \([7,4]\).
| |
|
|
G1. Последовательное сложение (простая версия)
дп
жадные алгоритмы
Перебор
реализация
сортировки
Структуры данных
*1100
Единственное различие между двумя версиями в том, что в этой версии ограничения ниже. Изначально массив \(a\) содержит только число \(1\). Вы можете выполнить несколько операций, чтобы изменить массив. За одну операцию можно выбрать некоторую подпоследовательность \(^{\dagger}\) из \(a\) и вставить на любую позицию в \(a\) элемент, равный сумме всех элементов подпоследовательности. Вам дан массив \(c\). Проверьте, можно ли получить из массива \(a\) массив \(c\), выполнив некоторое количество (возможно, 0) операций над исходным массивом. \(^{\dagger}\) Последовательность \(b\) является подпоследовательностью последовательности \(a\), если \(b\) может быть получена из \(a\) удалением нескольких (возможно, нуля, но не всех) элементов. Другими словами, операция выглядит так: выберем \(k\) (\(1 \leq k \leq |a|\)) различных индексов \(i_1, i_2, \dots, i_k\) и вставим в любое место \(a\) новый элемент со значением, равным \(a_{i_1} + a_{i_2} + \dots + a_{i_k}\). Выходные данные Для каждого набора входных данных выведите «YES» (без кавычек), если такая последовательность операций существует, и «NO» (без кавычек) в противном случае. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание Для первого набора входных данных исходный массив \(a\) уже равен \([1]\), поэтому ответ «YES». Для второго набора входных данных после выполнения любого количества операций длина массива \(a\) станет хотя бы два, а в начальном массиве элемента \(2\) нет, поэтому получить массив \([2]\) невозможно, и ответ будет «NO». Для третьего набора входных данных мы можем выполнить следующие операции, чтобы получить массив \(c\): - Первоначально, \(a = [1]\).
- Выбрав подпоследовательность \([1]\) и вставив \(1\) в массив, \(a\) станет равным \([1, 1]\).
- Выбрав подпоследовательность \([1, 1]\) и вставив \(1+1=2\) в середину массива, \(a\) станет равным \([1, 2, 1]\).
- Выбрав подпоследовательность \([1, 2]\) и вставив \(1+2=3\) после первой \(1\) массива, \(a\) станет равным \([1, 3, 2, 1]\).
- Выбрав подпоследовательность \([1, 3, 1]\) и вставив \(1+3+1=5\) в начало массива, \(a\) станет равным \([5, 1, 3, 2, 1]\) (именно такой массив нам нужно было получить).
| |
|
|
G2. Последовательное сложение (сложная версия)
битмаски
дп
жадные алгоритмы
реализация
сортировки
*1100
Единственное различие между двумя версиями в том, что в этой версии ограничения выше. Изначально массив \(a\) содержит только число \(1\). Вы можете выполнить несколько операций, чтобы изменить массив. За одну операцию можно выбрать некоторую подпоследовательность \(^{\dagger}\) из \(a\) и вставить на любую позицию в \(a\) элемент, равный сумме всех элементов подпоследовательности. Вам дан массив \(c\). Проверьте, можно ли получить из массива \(a\) массив \(c\), выполнив некоторое количество (возможно, 0) операций над исходным массивом. \(^{\dagger}\) Последовательность \(b\) является подпоследовательностью последовательности \(a\), если \(b\) может быть получена из \(a\) удалением нескольких (возможно, нуля, но не всех) элементов. Другими словами, операция выглядит так: выберем \(k\) (\(1 \leq k \leq |a|\)) различных индексов \(i_1, i_2, \dots, i_k\) и вставим в любое место \(a\) новый элемент со значением, равным \(a_{i_1} + a_{i_2} + \dots + a_{i_k}\). Выходные данные Для каждого набора входных данных выведите «YES» (без кавычек), если такая последовательность операций существует, и «NO» (без кавычек) в противном случае. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание Для первого набора входных данных исходный массив \(a\) уже равен \([1]\), поэтому ответ «YES». Для второго набора входных данных после выполнения любого количества операций длина массива \(a\) станет хотя бы два, а в начальном массиве элемента \(2\) нет, поэтому получить массив \([2]\) невозможно, и ответ будет «NO». Для третьего набора входных данных мы можем выполнить следующие операции, чтобы получить массив \(c\): - Первоначально, \(a = [1]\).
- Выбрав подпоследовательность \([1]\) и вставив \(1\) в массив, \(a\) станет равным \([1, 1]\).
- Выбрав подпоследовательность \([1, 1]\) и вставив \(1+1=2\) в середину массива, \(a\) станет равным \([1, 2, 1]\).
- Выбрав подпоследовательность \([1, 2]\) и вставив \(1+2=3\) после первой \(1\) массива, \(a\) станет равным \([1, 3, 2, 1]\).
- Выбрав подпоследовательность \([1, 3, 1]\) и вставив \(1+3+1=5\) в начало массива, \(a\) станет равным \([5, 1, 3, 2, 1]\) (именно такой массив нам нужно было получить).
| |
|
|
B. Игра в казино
математика
сортировки
*1200
Известное во всей солнечной системе казино «Галактика удачи» вводит новую карточную игру. В этой игре есть колода из \(n\) карт. На каждой карте написано \(m\) чисел. Каждый из \(n\) игроков получает ровно по одной карте из колоды. Далее все игроки попарно играют друг с другом, причем каждая пара игроков играет ровно один раз. Таким образом, если всего, например, четыре игрока, то будет сыграно шесть игр: первый со вторым, первый с третьим, первый с четвертым, второй с третьим, второй с четвертым и третий с четвертым. В каждой из таких игр некоторым образом определяется победитель, но правила здесь довольно сложны, поэтому мы не будем описывать их здесь. Важно лишь, какое число фишек выплачивается победителю. Пусть на карте первого игрока записаны числа \(a_1, a_2, \dots, a_m\), а на карте второго игрока — \(b_1, b_2, \dots, b_m\). Тогда победителю выплачивается \(|a_1 - b_1| + |a_2 - b_2| + \dots + |a_m - b_m|\) фишек из общего банка, где \(|x|\) обозначает модуль числа \(x\). Чтобы определить размер общего банка, необходимо вычислить суммарный выигрыш победителей по всем играм. Поскольку карт в колоде и игроков может быть много, то Вам было поручено написать программу, которая выполняет все необходимые вычисления. Выходные данные Для каждого набора входных данных выведите одно число — суммарный размер выигрышей по всем играм. Примечание Рассмотрим первый набор входных данных. В игре между первым и вторым игроком победитель получит \(|1-7| + |4-9| + |2-2| + |8-1| + |5-4| = 19\) фишек. В игре между первым и третьим игроком победитель получит \(|1-3| + |4-8| + |2-5| + |8-3| + |5-1| = 18\) фишек. В игре между вторым и третьим игроком победитель получит \(|7-3| + |9-8| + |2-5| + |1-3| + |4-1| = 13\) фишек. Итого за игру будет разыграно \(19 + 18 + 13 = 50\) фишек.
| |
|
|
C. Сделайте перестановку
жадные алгоритмы
Перебор
сортировки
*1300
У вас есть массив целых чисел \(a\) длины \(n\). Вы можете выполнять два вида операций. - Удалить целое число из \(a\). Эта операция стоит \(c\).
- Вставить произвольное натуральное число \(x\) в любую позицию \(a\) (в начало, в конец или между любыми двумя соседними элементами). Эта операция стоит \(d\).
Вы хотите сделать конечный массив перестановкой любой положительной длины. Пожалуйста, выведите минимальную стоимость, чтобы сделать из массива перестановку. Обратите внимание, что вы можете сделать массив пустым во время операций, но окончательный массив должен содержать хотя бы одно целое число. Перестановкой длины \(n\) называется массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — это перестановка, но \([1,2,2]\) не является перестановкой (\(2\) встречается в массиве дважды), также как и \([1,3,4]\) не является перестановкой (\(n=3\), но в массиве есть элемент равный \(4\)). Выходные данные Для каждого набора входных данных выведите минимальную стоимость, которую нужно потратить, чтобы сделать из массива перестановку. Примечание В первом наборе входных данных массив уже является перестановкой, поэтому операции не нужны. Во втором наборе входных данных мы можем удалить числа \(5\), \(6\) и получить перестановку \([1,2,3]\). Стоимость таких операций будет равна \(2\). Обратите внимание, что мы также можем получить перестановку, вставив число \(4\), но это стоит \(5\). В третьем наборе входных данных мы можем просто удалить все числа, кроме первой \(1\). Это стоит \(8\), а окончательный массив \([1]\) представляет собой перестановку длины \(1\). В четвертом наборе входных данных мы можем удалить все числа, кроме \(2\), и вставить одно число \(1\) на первую позицию. Это стоит \(4+10=14\), а окончательный массив \([1,2]\) представляет собой перестановку длины \(2\).
| |
|
|
F. M-дерево
Деревья
математика
сортировки
Структуры данных
*2800
Корневое дерево называется хорошим, если каждая вершина дерева либо является листом (вершиной без детей), либо имеет ровно \(m\) детей. Пусть на хорошем дереве на каждом листе \(u\) записано положительное целое число \(c_{u}\). Мы определяем значение листа как \(c_{u} + \mathrm{dep}_{u}\), где \(\mathrm{dep}_{u}\) — количество ребер на пути от вершины \(u\) до корня (также известное как глубина \(u\)). Ценность хорошего дерева — это максимальное значение всех его листьев. Вам дан массив из \(n\) целых чисел \(a_{1}, a_{2}, \ldots, a_{n}\), которые должны быть записаны на листьях. Вам нужно построить хорошее дерево из \(n\) листьев и записать целые числа из массива \(a\) во все листья. Формально, вы должны выбрать для каждого листа \(u\) индекс \(b_{u}\), где \(b\) — перестановка длины \(n\), означающая, что целое число, записанное на листе \(u\), равно \(c_u = a_{b_{u}}\). При этих ограничениях вам необходимо минимизировать ценность хорошего дерева. У вас есть \(q\) запросов. Каждый запрос задается парой целых чисел \(x\) и \(y\) и меняет \(a_{x}\) на \(y\), после чего вы должны вывести минимальное значение хорошего дерева для заданного массива \(a\). Перестановкой длины \(n\) называется массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — это перестановка, но \([1,2,2]\) не является перестановкой (\(2\) встречается в массиве дважды), также как и \([1,3,4]\) не является перестановкой (\(n=3\), но в массиве есть элемент равный \(4\)). Выходные данные Для каждого набора входных данных выведите \(q\) целых чисел, \(i\)-е из которых — минимальная ценность дерева после \(i\)-го изменения. Примечание В первом наборе входных данных после первого запроса текущий массив \(a\) равен \([4,3,4,4,5]\). Мы можем построить такое хорошее дерево: Первое число внутри вершины — это ее номер (в этой задаче номер вершины не имеет значения, но помогает понять рисунок). Если вершина является листом, то второе число внутри вершины — это число, написанное на ней. Заметим, что \(\mathrm{dep}_{3}=\mathrm{dep}_{4}=1,\mathrm{dep}_{5}=\mathrm{dep}_{6}=\mathrm{dep}_{7}=2\), и ценность дерева, которая является максимальным значением по всем листьям, равна \(5+1=6\). Значения листьев \(5\), \(6\) и \(7\) также равны \(6\). Можно показать, что это дерево имеет минимальную ценность среди всех допустимых деревьев.
| |
|
|
C. Параллельный поиск
жадные алгоритмы
Конструктив
сортировки
*1500
Допустим, у вас есть \(n\) коробок. В \(i\)-й коробке бесконечно много шариков цвета \(i\). Иногда вам нужно получить шарик какого-то определенного цвета; но вы слишком ленивы, чтобы брать шарик из коробки самостоятельно. Вы купили двух роботов, которые будут приносить вам шарики. Теперь этих роботов надо запрограммировать. Для этого вы должны сформировать два списка \([a_1, a_2, \dots, a_k]\) и \([b_1, b_2, \dots, b_{n-k}]\), где список \(a\) — это список коробок, назначенных первому роботу, а список \(b\) — коробки, назначенные второму роботу. Каждое целое число от \(1\) до \(n\) должно принадлежать ровно одному из этих списков. Когда вы даете роботам команду «принести шарик цвета \(x\)», они выполняют ее следующим образом. Каждый робот проходится по тому списку коробок, который был назначен этому роботу (в том порядке, в котором коробки находятся в списке), и просматривает содержимое каждой коробки. Первый робот тратит \(s_1\) секунд, чтобы просмотреть содержимое коробки; второй робот тратит \(s_2\) секунд. Как только какой-то робот найдет коробку с шарами цвета \(x\) и просмотрит ее содержимое, поиск завершается. Время поиска — это количество секунд, прошедшее от начала поиска до того, как один из роботов просмотрит содержимое коробки \(x\). Если робот просмотрел все коробки, назначенные ему, после этого он ничего не делает. Например, пусть \(s_1 = 2\), \(s_2 = 3\), \(a = [4, 1, 5, 3, 7]\), \(b = [2, 6]\). Если вы запросите шарик цвета \(3\), произойдет следующее: - сначала первый робот начнет просматривать коробку \(4\), а второй — коробку \(2\);
- в конце \(2\)-й секунды первый робот закончит просматривать коробку \(4\). Это не та коробка, которая нужна, поэтому робот начинает просматривать коробку \(1\);
- в конце \(3\)-й секунды второй робот закончит просматривать коробку \(2\). Это не та коробка, которая нужна, поэтому робот начинает просматривать коробку \(6\);
- в конце \(4\)-й секунды первый робот закончит просматривать коробку \(1\). Это не та коробка, которая нужна, поэтому робот начинает просматривать коробку \(5\);
- в конце \(6\)-й секунды первый робот закончит просматривать коробку \(5\). Это не та коробка, которая нужна, поэтому робот начинает просматривать коробку \(3\). В тот же самый момент второй робот закончит просматривать коробку \(6\). Это не та коробка, которая нужна, и второй робот закончил просматривать все назначенные ему коробки, поэтому больше он ничего не делает;
- в конце \(8\)-й секунды первый робот закончит просматривать коробку \(3\). Это та коробка, которая вам нужна, поэтому поиск завершается;
- итак, время поиска равно \(8\) секундам.
Вы планируете запросить шарик цвета \(1\) \(r_1\) раз, шарик цвета \(2\) — \(r_2\) раз, и так далее. Составьте списки \(a\) и \(b\) таким образом, чтобы суммарное время поиска было как можно меньше. Выходные данные Для каждого набора входных данных выведите две строки. В первой строке выведите список \(a\), во второй — список \(b\). Каждый список нужно вывести следующим образом: сначала размер списка, потом его элементы. Если оптимальных ответов несколько, выведите любой из них.
| |
|
|
B. Мясник
геометрия
жадные алгоритмы
реализация
сортировки
*1900
Антон играет в свою любимую игру «Защита древних 2» за своего любимого героя — Мясника. Сейчас он хочет приготовить себе ужин. Для этого он возьмет прямоугольник высоты \(h\) и ширины \(w\), затем проведет вертикальный или горизонтальный разрез так, чтобы обе получившиеся части имели целые стороны. После этого одну из частей он положит в ящик, а другую снова разрежет, и так далее. Более формально, прямоугольник размера \(h \times w\) можно разрезать на две части размеров \(x \times w\) и \((h - x) \times w\), где \(x\) является целым числом от \(1\) до \((h - 1)\), или же на две части размеров \(h \times y\) и \(h \times (w - y)\), где \(y\) является целым числом от \(1\) до \((w - 1)\). Эту операцию он повторит \(n - 1\) раз, после чего оставшийся прямоугольник тоже положит в ящик. Таким образом, в ящике будет \(n\) прямоугольников, из которых \(n - 1\) прямоугольник был отложен в результате разрезов, а \(n\)-й прямоугольник — тот, что остался в руках Мясника после всех \(n - 1\) разрезов. К сожалению, Мясник забыл числа \(h\) и \(w\), однако у него сохранились \(n\) прямоугольников, перемешанных в произвольном порядке. Обратите внимание, что Мясник не поворачивал прямоугольники, но, возможно, переупорядочил их. Теперь он хочет узнать все возможные пары \((h, w)\), из которых можно получить данный набор прямоугольников. А вы должны ему в этом помочь! Гарантируется, что существует хотя бы одна пара \((h, w)\), из которой можно получить данный набор прямоугольников. Выходные данные Для каждого набора входных данных в первой строке выведите одно целое число \(m\) — количество пар \((h, w)\), обозначающих размеры прямоугольников, из которых можно получить данные прямоугольники. Два прямоугольника считаются различными, если у них отличается длина или ширина. В каждой из следующих \(m\) строк выведите два целых числа \(h_i\) и \(w_i\) — высоту и ширину прямоугольника, из которого можно получить данные прямоугольники. Вы можете выводить прямоугольники в любом порядке. Примечание В первом наборе входных данных у Мясника мог быть только прямоугольник размером \(4 \times 5\). Тогда разрезы могли бы выглядеть следующим образом (сначала был сделан зеленый разрез, затем красный): Во втором наборе входных данных у Мясника мог быть либо прямоугольник размером \(1 \times 3\), либо \(3 \times 1\). Разрезы выглядели бы так (сначала был сделан зеленый разрез, затем красный): В третьем наборе входных данных Мясник не делал ни одного разреза, поэтому прямоугольник имеет размер \(10 \times 10\).
| |
|
|
E. Переставь скобки
дп
жадные алгоритмы
Перебор
сортировки
Строки
*2100
Правильная скобочная последовательность — это скобочная последовательность, которую можно превратить в корректное арифметическое выражение, вставив символы «1» и «+» между исходными символами. Например: - скобочные последовательности «()()» и «(())» — правильные (из них можно получить выражения «(1)+(1)» и «((1+1)+1)»);
- скобочные последовательности «)(», «(» и «)» — неправильные.
Дана правильная скобочная последовательность. За один ход вы можете удалить пару соседних скобок такую, что левая скобка открывающая, а правая — закрывающая. Затем склеить полученные части, не изменяя порядка. Стоимость такого хода равна количеству скобок справа от правой скобки из этой пары. Стоимость правильной скобочной последовательности равна наименьшей суммарной стоимости ходов, необходимых, чтобы сделать последовательность пустой. На самом деле, никаких скобок вы не удаляете. Вместо этого вам дана правильная скобочная последовательность и целое число \(k\). Вы можете проделать следующее действие не больше \(k\) раз: - вытащить скобку из последовательности и вставить ее в любую позицию (между двух скобок, в начало или в конец; возможно, туда же, где она и была).
После всех действий скобочная последовательность должна быть правильной. Какая наименьшая стоимость полученной правильной скобочной последовательности? Выходные данные На каждый набор входных данных выведите одно целое число — наименьшая стоимость правильной скобочной последовательности после того, как вы проделаете над ней не более \(k\) действий.
| |
|
|
B. Карина и массив
жадные алгоритмы
математика
сортировки
*800
У Карины есть массив из \(n\) чисел \(a_1, a_2, a_3, \dots, a_n\). Она очень любит перемножать числа, поэтому она решила, что красота пары чисел — это их произведение. А красота массива — это максимальная красота пары соседних элементов в массиве. Например, для \(n = 4\), \(a=[3, 5, 7, 4]\) красота массива равняется \(\max\)(\(3 \cdot 5\), \(5 \cdot 7\), \(7 \cdot 4\)) = \(\max\)(\(15\), \(35\), \(28\)) = \(35\). Карина очень хочет, чтобы ее массив был максимально красивым. Для того чтобы достигнуть своей цели, она может удалить из массива некоторые элементы (или не удалять ничего). После удаления в массиве должно остаться хотя бы два элемента. К сожалению, Карина не успевает сделать все свои дела, поэтому она просит вас посчитать максимальную красоту массива, которую она может получить, удалив произвольное число элементов (возможно, ни одного). Выходные данные Выведите \(t\) чисел, каждое из которых является ответом на соответствующий набор — максимальной красотой массива, которую сможет получить Карина. Примечание В первом наборе входных данных примера для получения максимальной красоты нужно удалить \(2\)-й элемент. Во втором и третьем наборах входных данных примера не нужно делать удалений для достижения максимальной красоты. В четвертом наборе входных данных примера необходимо оставить только первый и последний элементы.
| |
|
|
B. Шаговая сортировка
математика
Перебор
сортировки
*900
Определим перестановкой длины \(n\) массив \(p\) длины \(n\), в котором каждое число от \(1\) до \(n\) встречается единожды. Вам дана перестановка \(p_1, p_2, \dots, p_n\) и число \(k\). Вам необходимо отсортировать перестановку в возрастающем порядке. Для этого вы можете выполнить следующую операцию любое количество раз (возможно, ни разу): - выбрать два элемента перестановки \(p_i\) и \(p_j\) такие, что \(|i - j| = k\) и поменять их местами.
К сожалению, некоторые перестановки не могут быть отсортированы для некоторых \(k\). Например, невозможно отсортировать \([2, 4, 3, 1]\) для \(k = 2\). Поэтому, перед началом сортировки, вы можете выполнить не более одного предварительного обмена: - выбрать любую пару \(p_i\) и \(p_j\) и поменять их местами.
Ваша задача проверить: - возможно ли отсортировать перестановку без предварительных обменов,
- если нет, проверить, возможно ли отсортировать перестановку с использованием ровно одного предварительного обмена.
Например, если \(k = 2\) и дана перестановка \([2, 4, 3, 1]\), то вы можете выполнить предварительный обмен \(p_1\) и \(p_4\), что даст перестановку \([1, 4, 3, 2]\), которую уже можно отсортировать для данного \(k\). Выходные данные Для каждого набора входных данных выведите - 0, если можно отсортировать перестановку без предварительного обмена;
- 1, если можно отсортировать перестановку с одним предварительны обменом, но нельзя без предварительных обменов;
- -1, если нельзя отсортировать перестановку с не более чем одним предварительным обменом.
Примечание В первом наборе предварительный обмен не нужен, так как можно обменять местами \((p_1, p_2)\) и затем \((p_2, p_3)\). Во втором наборе предварительный обмен не нужен, так как можно обменять местами \((p_1, p_3)\) и затем \((p_2, p_4)\). В третьем наборе необходимо применить предварительный обмен к \((p_2, p_3)\), после чего перестановка становится \([3, 4, 1, 2]\), которую уже возможно отсортировать для \(k = 2\).
| |
|
|
A. Trust Nobody
жадные алгоритмы
Перебор
реализация
сортировки
*1200
Есть группа из \(n\) человек. Некоторые из них могут быть лжецами, которые всегда лгут. Остальные люди всегда говорят правду. \(i\)-й человек сказал: «Среди нас не менее \(l_i\) лжецов». Определите, является ли сказанное людьми противоречивым, или это возможно. Если это возможно, выведите количество лжецов в группе. Если ответов несколько, вы можете вывести любой из них. Выходные данные Для каждого набора входных данных выведите одно целое число. Если сказанное людьми противоречиво, выведите \(-1\). Иначе выведите количество лжецов в группе. Если ответов несколько, вы можете вывести любой из них. Примечание В первом примере единственный возможной ответ, это что лжет второй человек, откуда ответ \(1\) лжец. Во втором примере можно показать, что невозможно выбрать лжецов, так чтобы все высказывания удовлетворяли условию. В третьем примере все говорят правду, откуда ответ \(0\) лжецов.
| |
|
|
E. Walk the Runway
битмаски
графы
дп
Перебор
реализация
сортировки
Структуры данных
*2400
Тур состоит из \(m\) идентичных подиумных шоу в разных городах. Всего есть \(n\) моделей, которые хотят участвовать в туре, пронумерованных от \(1\) до \(n\). У людей в разных городах разные взгляды на индустрию моды, поэтому они оценивают моделей по-разному. В частности, люди в городе \(i\) оценивают модель \(j\) рейтингом \(r_{i, j}\). Из желающих моделей вы выберете \(k\) моделей и некоторый их порядок, пусть эти модели в этом порядке имеют номера \(j_1, j_2, \dots, j_k\). В каждом городе на подиум выйдут эти \(k\) моделей в данном порядке. Чтобы сделать шоу захватывающим, в каждом городе рейтинги моделей должны строго возрастать в порядке их выхода на подиум. Более формально, для любого города \(i\) и индекса \(t\) (\(2 \leq t \leq k\)), рейтинги должны удовлетворять условию \(r_{i,j_{t - 1}} < r_{i,j_t}\). В конце концов, индустрия моды сфокусирована на деньгах, поэтому выбрав модель \(j\) для участия в туре, вы получите \(p_j\) прибыли. Вычислите, какую максимальную прибыль вы можете получить при правильном выборе моделей и порядка их выступления, при условии соблюдения всех ограничений. Выходные данные Выведите одно целое число — максимальную суммарную прибыль. Примечание В первом примере в тур приглашены \(3\) модели. Шоу состоит из моделей в следующем порядке \([1, 3, 4]\). Соответственные рейтинги в городах: - Город \(1\) — \([ 1, 3, 4 ]\).
- Город \(2\) — \([ 1, 2, 3 ]\).
- Город \(3\) — \([ 2, 4, 5 ]\).
Видно, что рейтинги моделей в каждом городе возрастают. Суммарная прибыль равна \(10 + 10 + 10 = 30\). Можно доказать, что невозможно достичь большей прибыли. Во втором примере мы можем пригласить в тур пятую модель, откуда получаем общую прибыль \(50\). Можно доказать, что невозможно достичь большей прибыли. В третьем примере мы приглашаем в тур единственную модель, откуда получаем прибыль \(1\,000\,000\,000\). В четвертом примере мы можем пригласить всех моделей и шоу будет состоять из моделей в следующем порядке \([ 5, 4, 3, 2, 1 ]\). Тогда общая прибыль будет равна \(5 \cdot 1\,000\,000\,000 = 5\,000\,000\,000\).
| |
|
|
A. Подсчет порядка
Комбинаторика
математика
сортировки
*1100
Даны два массива \(a\) и \(b\), каждый из \(n\) целых чисел. Все элементы \(a\) попарно различны. Найдите количество способов переставить элементы массива \(a\) так, чтобы выполнялось \(a_i > b_i\) для всех \(1 \le i \le n\), по модулю \(10^9 + 7\). Два способа перестановки считаются разными, если полученные массивы различны. Выходные данные Для каждого набора входных данных выведите количество способов переставить элементы массива \(a\) так, чтобы выполнялось \(a_i > b_i\) для всех \(1 \le i \le n\), по модулю \(10^9 + 7\).
| |
|
|
C. Гиперправильные скобочные последовательности
жадные алгоритмы
Комбинаторика
математика
сортировки
теория чисел
хэши
*2400
Вам дано целое число \(n\) и \(k\) отрезков. \(i\)-й отрезок имеет вид \([l_i,r_i]\), где \(1 \leq l_i \leq r_i \leq n\). Правильная скобочная последовательность\(^{\dagger,\ddagger}\) длины \(n\) называется гиперправильной, если для каждого \(i\) такого, что \(1 \leq i \leq k\), подстрока \(\overline{s_{l_i} s_{l_{i}+1} \ldots s_{r_i}}\) также является правильной скобочной последовательностью. Ваша задача — посчитать количество гиперправильных скобочных последовательностей. Так как это число может быть очень большим, требуется вывести его по модулю \(998\,244\,353\). \(^\dagger\) Скобочная последовательность — это строка, содержащая только символы «(» и «)». \(^\ddagger\) Последовательность скобок называется правильной, если её можно превратить в правильное математическое выражение путём добавления символов + и 1. Например, последовательности (())(), (), (()(())) и пустая строка являются правильными, а )(, (() и (())( — нет. Выходные данные Для каждого набора входных данных выведите количество гиперправильных скобочных последовательностей по модулю \(998\,244\,353\). Примечание - Для первого набора есть \(5\) гиперправильных скобочных последовательностей длины \(6\): ((())), (()()), (())(), ()(()) и ()()().
- Для второго набора нет правильных скобочных последовательностей длины \(5\), а следовательно, нет гиперправильных скобочных последовательностей длины \(5\).
- Для третьего набора нет гиперправильных скобочных последовательностей длины \(8\), для которых подстрока \([1 \ldots 3]\) является правильной скобочной последовательностью.
- Для четвертого набора существует \(4\) гиперправильные скобочные последовательности: ((())(())), ((())()()), ()()((())) и ()()(()()).
| |
|
|
B. Максимальная сумма
Перебор
сортировки
*1100
Дан массив \(a_1, a_2, \dots, a_n\), в котором все элементы различны. Вы должны выполнить ровно \(k\) операций с ним. Во время каждой операции вы выполняете ровно одно из следующих двух действий (вы самостоятельно выбираете, какое именно): - найти два минимальных элемента в массиве и удалить их;
- найти максимальный элемент в массиве и удалить его.
Вы должны вычислить максимальную возможную сумму элементов в полученном массиве. Выходные данные Для каждого набора входных данных выведите одно целое число — максимальную возможную сумму элементов в полученном массиве. Примечание В первом наборе входных данных применение первой операции приводит к следующему результату: - два минимума равны \(1\) и \(2\); их удаление оставляет массив \([5, 10, 6]\) с суммой \(21\);
- максимум равен \(10\); его удаление оставляет массив \([2, 5, 1, 6]\) с суммой \(14\).
\(21\) — лучший ответ. Во втором наборе входных данных оптимально сначала удалить два минимума, а затем максимум.
| |
|
|
B. Восстанови погоду
жадные алгоритмы
сортировки
*900
Вам дан массив \(a\), содержащий прогноз погоды в Берляндии за последние \(n\) дней. То есть, \(a_i\) — это предполагаемая температура воздуха в день \(i\) (\(1 \le i \le n\)). Также вам дан массив \(b\) —температура воздуха, которая была в каждый из дней на самом деле. Однако, все значения в массиве \(b\) перемешались. Определите, в какой день была какая температура, если известно, что погода никогда не отличается от прогноза более чем на \(k\) градусов. Другими словами, если в день \(i\) настоящая температура воздуха равнялась \(c\), то всегда верно равенство \(|a_i - c| \le k\). Например, пусть задан массив \(a\) = [\(1, 3, 5, 3, 9\)] длины \(n = 5\) и \(k = 2\) и массив \(b\) = [\(2, 5, 11, 2, 4\)]. Тогда, чтобы значение \(b_i\) соответствовало температуре воздуха в день \(i\), можно переставить элементы массива \(b\) так: [\(2, 2, 5, 4, 11\)]. Действительно: - В \(1\)-й день \(|a_1 - b_1| = |1 - 2| = 1\), выполняется \(1 \le 2 = k\)
- Во \(2\)-й день \(|a_2 - b_2| = |3 - 2| = 1\), выполняется \(1 \le 2 = k\)
- В \(3\)-й день \(|a_3 - b_3| = |5 - 5| = 0\), выполняется \(0 \le 2 = k\)
- В \(4\)-й день \(|a_4 - b_4| = |3 - 4| = 1\), выполняется \(1 \le 2 = k\)
- В \(5\)-й день \(|a_5 - b_5| = |9 - 11| = 2\), выполняется \(2 \le 2 = k\)
Выходные данные В отдельной строке для каждого набора входных данных выведите ровно \(n\) чисел — значения температуры воздуха в каждый из дней в правильном порядке. Если существует несколько вариантов ответа — выведите любой из них.
| |
|
|
F. Ира и фламенко
Комбинаторика
Конструктив
математика
реализация
сортировки
Структуры данных
*1700
Ира очень любит испанский танец фламенко. Она решила основать собственную танцевальную студию и нашла \(n\) учеников, \(i\)-й из которых имеет уровень \(a_i\). Ира может выбрать несколько своих учеников и поставить с ними танец. Таким образом она может поставить огромное количество танцев, но её интересуют только великолепные танцы. Танец называется великолепным, если выполнено следующее: - в танце участвуют ровно \(m\) учеников;
- уровни всех танцоров попарно различны;
- уровни любых двух танцоров отличаются строго меньше чем на \(m\).
Например, если \(m = 3\) и \(a = [4, 2, 2, 3, 6]\), следующие танцы являются великолепными (красным цветом выделены ученики, участвующие в танце): \([\color{red}{4}, 2, \color{red}{2}, \color{red}{3}, 6]\), \([\color{red}{4}, \color{red}{2}, 2, \color{red}{3}, 6]\). В то же время танцы \([\color{red}{4}, 2, 2, \color{red}{3}, 6]\), \([4, \color{red}{2}, \color{red}{2}, \color{red}{3}, 6]\), \([\color{red}{4}, 2, 2, \color{red}{3}, \color{red}{6}]\) не являются великолепными. В танце \([\color{red}{4}, 2, 2, \color{red}{3}, 6]\) участвуют \(2\) ученика, хотя \(m = 3\). В танце \([4, \color{red}{2}, \color{red}{2}, \color{red}{3}, 6]\) участвуют ученики с уровнями \(2\) и \(2\), хотя уровни всех танцоров должны быть попарно различны. В танце \([\color{red}{4}, 2, 2, \color{red}{3}, \color{red}{6}]\) участвуют ученики с уровнями \(3\) и \(6\), но \(|3 - 6| = 3\), хотя \(m = 3\). Помогите Ире посчитать количество великолепных танцев, которые она может поставить. Так как это число может быть очень большим, посчитайте его по модулю \(10^9 + 7\). Два танца считаются различными, если различны наборы учеников, участвующих в них. Выходные данные Для каждого набора входных данных выведите единственное число — количество великолепных танцев по модулю \(10^9 + 7\). Примечание В первом наборе входных данных Ира может поставить только такие великолепные танцы: \([\color{red}{8}, 10, 10, \color{red}{9}, \color{red}{6}, 11, \color{red}{7}]\), \([\color{red}{8}, \color{red}{10}, 10, \color{red}{9}, 6, 11, \color{red}{7}]\), \([\color{red}{8}, 10, \color{red}{10}, \color{red}{9}, 6, 11, \color{red}{7}]\), \([\color{red}{8}, 10, \color{red}{10}, \color{red}{9}, 6, \color{red}{11}, 7]\), \([\color{red}{8}, \color{red}{10}, 10, \color{red}{9}, 6, \color{red}{11}, 7]\). Второй набор входных данных разобран в условии.
| |
|
|
D. Опрос на уроке
жадные алгоритмы
Перебор
реализация
сортировки
Структуры данных
*1900
На урок истории к Зинаиде Викторовне пришло \(n\) учеников. На дом было задано \(m\) тем, но у учеников было мало времени для подготовки, поэтому \(i\)-й ученик выучил только темы с \(l_i\) по \(r_i\) включительно. В начале урока каждый ученик держит свою руку на уровне \(0\). Учительница хочет спросить какие-то темы. Происходит это так: - Учительница спрашивает тему \(k\).
- Если ученик выучил тему \(k\), то он поднимает руку на \(1\), а иначе опускает на \(1\).
Каждую тему Зинаида Викторовна может спросить не более одного раза. Определите, какая максимальная разность высот самой высокой и самой низкой руки может быть после опроса. Обратите внимание, рука ученика может опускаться ниже \(0\). Выходные данные Для каждого набора входных данных выведите одно целое число — максимальную разность высот самой высокой и самой низкой руки, которая может быть в классе после опроса. Примечание В первом наборе входных данных Зинаида Викторовна может спросить темы \(5, 6, 7, 8\). Тогда рука \(2\)-го ученика будет на высоте \(4\), а \(4\)-го — на высоте \(-2\), то есть разность будет равна \(6\). Во втором наборе можно спросить темы \(1\) и \(3\). Тогда рука \(1\)-го ученика будет на высоте \(2\), а \(3\)-го ученика — на высоте \(-2\). Значит, разность будет равна \(4\). В третьем наборе разница высот между самой высокой и низкой рукой будет \(0\) при любом наборе спрашиваемых тем. В пятом наборе можно спросить все темы. Тогда разность высот рук \(1\)-го и \(3\)-го учеников будет равняться \(12\).
| |
|
|
A. Разрушитель
реализация
сортировки
*800
Джон — ведущий программист на эсминце, принадлежащем космическому флоту Конфедерации независимых операционных систем. Одна из его задач — проверять, не были ли повреждены электронные мозги роботов во время сражений. Стандартный тест — приказать роботом сформировать один или несколько рядов, в каждом ряду роботы должна стоять друг за другом. После этого каждый робот доложит, сколько роботов стоит перед ним в его ряду. Пример расположения роботов (начало рядов слева). Роботы докладывают числа, указанные над ними. \(i\)-й робот доложил число \(l_i\). К сожалению, Джон не знает, в каком ряду стоит каждый из роботов, и не может проверить доложенные числа. Определите, существует ли расположение роботов такое, что все доложенные числа корректны, или такого расположения не существует. Выходные данные Для каждого набора входных данных выведите «YES», если существует расстановка роботов, соответствующая заявлениям роботов. В противном случае выведите «NO». Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание Пример расстановки, согласованной с утверждениями роботов из первого примера: Пример расположения, согласованного с утверждениями роботов из второго примера, показан в условии. В третьем входном наборе третий робот утверждает, что перед ним находятся две машины. В таком случае перед роботом, стоящим непосредственно перед ним, будет одна машина. Ни один робот не утверждает этого, поэтому нет правильного расположения.
| |
|
|
B. Лампочки
жадные алгоритмы
сортировки
*1100
У вас есть \(n\) лампочек, пронумерованных целыми числами от \(1\) до \(n\). Лампочка \(i\) имеет два целочисленных параметра \(a_i\) и \(b_i\). В каждый момент времени каждая лампочка находится в одном из трех состояний: она может быть выключена, включена или сломана. Изначально все лампочки выключены. За одно действие вы можете включить одну выключенную лампочку (нельзя включать сломанные лампочки). За включение лампочки \(i\) вы получаете \(b_i\) очков. После каждого вашего действия происходит следующее: - Пусть в данный момент включенными (сломанные лампочки не считаются) являются \(x\) лампочек. Все лампочки \(i\), для которых \(a_i \le x\), ломаются, независимо от того, включены они или выключены.
Обратите внимание, что сломанные лампочки никогда не считаются включенными, и что после поломки включенной лампочки очки, полученные за ее включение, не теряются. Вы можете совершить произвольное число действий. Найдите наибольшее количество очков, которое вы можете набрать. Выходные данные Для каждого набора входных данных выведите одно число — наибольшее количество очков, которое вы можете набрать. Примечание В первом наборе входных данных \(n = 4\). Единственный способ набрать наибольшее количество очков выглядит следующим образом: - Вы включаете лампочку \(4\) и получаете \(b_4 = 13\) очков.
- Количество включенных лампочек равно \(1\), поэтому все лампочки, у которых \(a_i \le 1\), то есть лампочки \(2\), \(3\) и \(4\), ломаются. Лампа \(4\) больше не считается включенной и количество включенных лампочек становится равным \(0\).
- Вы можете включить только лампочку \(1\), так как все остальные лампочки сломаны. Вы получаете \(b_1 = 2\) очка.
- Количество включенных лампочек равно \(1\). Так как \(a_1 = 2\), лампочка \(1\) не ломается.
Всего вы получили \(13 + 2 = 15\) очков. Можно показать, что это наибольшее количество очков, которое можно набрать, следовательно ответ на первый набор входных данных равен \(15\). Во втором наборе входных данных один из способов набрать наибольшее количество очков выглядит следующим образом: - Первым действием вы включаете лампочку \(4\) и получаете \(2\) очка. После этого действия ни одна лампочка не ломается.
- Вторым действием вы включаете лампочку \(3\) и получаете \(5\) очков. После этого действия включены \(2\) лампочки. Так как \(a_3 \le 2\), лампочка \(3\) ломается.
- Третьим действием вы включаете лампочку \(1\) и получаете \(4\) очка.
- Четвертым действием вы включаете лампочку \(5\) и получаете \(3\) очка. После этого действия включенными являются \(3\) лампочки: \(1\)-я, \(4\)-я и \(5\)-я. Лампочки \(1\), \(2\), \(4\) и \(5\) одновременно ломаются, так как для них всех \(a_i \le 3\).
Всего вы получили \(2 + 5 + 4 + 3 = 14\) очков. Можно показать, что это наибольшее количество очков, которое можно набрать. В третьем наборе входных данных один из способов набрать наибольшее количество очков выглядит следующим образом: - Включить лампочку \(3\), получить \(4\) очка. Лампочки \(1\) и \(3\) ломаются.
- Включить лампочку \(2\), получить \(4\) очка.
- Включить лампочку \(6\), получить \(3\) очка. Лампочка \(6\) ломается.
- Включить лампочку \(4\), получить \(4\) очка.
- Включить лампочку \(5\), получить \(5\) очков. Лампочки \(2\), \(4\) и \(5\) ломаются.
Всего вы получили \(4 + 4 + 3 + 4 + 5 = 20\) очков. Можно показать, что это наибольшее количество очков, которое можно набрать.
| |
|
|
D. Сортировка шаров
дп
сортировки
Структуры данных
*2100
У вас есть \(n\) разноцветных шаров, расположенных в ряд. Шары покрашены в \(n\) различных цветов, пронумерованных от \(1\) до \(n\). Цвет \(i\)-го слева шара равен \(c_i\). Вы хотите переупорядочить шары так, чтобы \(i\)-й слева шар имел цвет \(i\). Для этого вы можете использовать \(k \ge 1\) одинаковых шаров цвета \(0\). Из-за странных свойств шаров их можно переупорядочивать только используя следующие операции: - Поместить шар цвета \(0\) на любую позицию в ряду (между любыми двумя соседними шарами, перед первым шаром или после последнего шара), не меняя порядок остальных шаров. Эту операцию можно использовать не более \(k\) раз, так как у вас есть всего \(k\) шаров цвета \(0\).
- Выбрать любой шар ненулевого цвета, такой, что хотя бы один из соседних с ним шаров имеет цвет \(0\), и переместить этот шар (ненулевого цвета) на любую позицию в ряду (между любыми двумя соседними шарами, перед первым шаром или после последнего шара), не меняя порядок остальных шаров. Эту операцию можно использовать сколько угодно раз, но за каждое её использование вы должны заплатить \(1\) монету.
Вы можете применять эти операции в любом порядке. После того, как вы закончите применять операции, все шары цвета \(0\) магическим образом исчезнут из ряда. После этого в ряду останутся только \(n\) шаров ненулевых цветов. Какое наименьшее количество монет вам нужно потратить на операции второго типа, чтобы после исчезновения всех шаров нулевого цвета \(i\)-й слева шар имел цвет \(i\) для всех \(i\) от \(1\) до \(n\)? Можно показать, что при данных ограничениях это всегда можно сделать. Решите задачу для всех \(k\) от \(1\) до \(n\). Выходные данные Для каждого набора входных данных выведите \(n\) чисел: \(i\)-е (\(1 \le i \le n\)) из них должно быть равно наименьшему количеству монет, которого достаточно для требуемого переупорядочивания шаров при \(k = i\). Примечание В первом наборе входных данных есть \(n = 6\) шаров. Цвета шаров слева направо равны \([\, 2, 3, 1, 4, 6, 5 \,]\). Пусть \(k = 1\). Один из способов переставить шары в требуемом порядке за \(3\) монеты: \([\, 2, 3, 1, 4, 6, 5 \,]\) \(\xrightarrow{\, 1 \,}\) \([\, 2, 3, 1, 4, \color{red}{0}, 6, 5 \,]\) \(\xrightarrow{\, 2 \,}\) \([\, 2, 3, \color{blue}{4}, 1, 0, 6, 5 \,]\) \(\xrightarrow{\, 2 \,}\) \([\, \color{blue}{1}, 2, 3, 4, 0, 6, 5 \,]\) \(\xrightarrow{\, 2\,}\) \([\, 1, 2, 3, 4, 0, 5, \color{blue}{6} \,]\) Число над стрелкой обозначает тип операции. Красным выделены шары, вставленные в операциях первого типа, синим — шары, передвинутые в операциях второго типа. Можно показать, что для \(k = 1\) невозможно расставить шары в правильном порядке, потратив меньше \(3\) монет. Пусть \(k = 2\). Один из способов переставить шары в требуемом порядке за \(2\) монеты: \([\, 2, 3, 1, 4, 6, 5 \,]\) \(\xrightarrow{\, 1 \,}\) \([\, 2, 3, 1, 4, 6, \color{red}{0}, 5\,]\) \(\xrightarrow{\, 2 \,}\) \([\, 2, 3, 1, 4, 0, 5, \color{blue}{6}\,]\) \(\xrightarrow{\, 1 \,}\) \([\, 2, 3, \color{red}{0}, 1, 4, 0, 5, 6 \,]\) \(\xrightarrow{\, 2 \,}\) \([\, \color{blue}{1}, 2, 3, 0, 4, 0, 5, 6\,]\) Эта последовательность операций является корректной и для \(k\), больших \(2\). Можно показать, что для \(k\) от \(2\) до \(6\) невозможно расставить шары в правильном порядке, потратив меньше \(2\) монет. Во втором запросе шары уже стоят в правильном порядке, поэтому ответы для всех \(k\) равны \(0\).
| |
|
|
D. Фестиваль деревянных игрушек
Бинарный поиск
жадные алгоритмы
сортировки
*1400
В одном небольшом городке есть мастерская, специализирующаяся на работах по дереву. Так как город маленький, в ней работают всего три резчика. Скоро в городе планируется фестиваль деревянных игрушек. Работники мастерской хотят к нему подготовиться. Они знают, что \(n\) человек придёт в мастерскую с просьбой сделать деревянную игрушку. Люди разные и могут хотеть разные игрушки. Для простоты обозначим паттерн игрушки, которую хочет \(i\)-й человек за \(a_i\) (\(1 \le a_i \le 10^9\)). Каждый из резчиков может заранее выбрать какой-то паттерн \(x\) (\(1 \le x \le 10^9\)), разные резчики могут выбрать разные паттерны. \(x\) - натуральное число. За время подготовки к фестивалю резчики идеально отработают технику выполнения игрушки выбранного паттерна, что позволит им мгновенно вырезать её из дерева. Чтобы сделать игрушку паттерна \(y\) резчику, выбравшему паттерн \(x\), понадобится \(|x - y|\) времени, ведь чем больше игрушка похожа на ту, что он умеет делать мгновенно, тем быстрее резчик справится с работой. В день фестиваля, когда очередной человек зайдёт в мастерскую с просьбой сделать деревянную игрушку, резчики могут выбрать, кто из них примется за работу. При этом резчики очень умелые люди и могут одновременно выполнять заказы для разных людей. Так как люди не любят ждать, резчики хотят выбрать паттерны для подготовки таким образом, чтобы максимальное время ожидания среди всех людей было как можно меньше. Выведите наилучшее максимальное время ожидания, которого смогут добиться резчики. Выходные данные Выведите \(t\) чисел, каждое из которых является ответом на соответствующий набор — наилучшее максимальное время ожидания, которого смогут добиться резчики. Примечание В первом примере входных данных резчики могут выбрать паттерны \(1\), \(7\), \(9\) для подготовки. Во втором примере входных данных резчики могут выбрать паттерны \(3\), \(30\), \(60\) для подготовки. Во третьем примере входных данных резчики могут выбрать паттерны \(14\), \(50\), \(85\) для подготовки.
| |
|
|
D. Пары отрезков
жадные алгоритмы
сортировки
Структуры данных
*2000
Два отрезка \([l_1, r_1]\) и \([l_2, r_2]\) пересекаются, если существует хотя бы одно число \(x\), такое, что \(l_1 \le x \le r_1\) и \(l_2 \le x \le r_2\). Массив отрезков \([[l_1, r_1], [l_2, r_2], \dots, [l_k, r_k]]\) называется красивым, если \(k\) четно, и его можно разбить на \(\frac{k}{2}\) пар таким образом, что: - каждый элемент массива принадлежит ровно одной паре;
- отрезки в каждой паре пересекаются между собой;
- отрезки из разных пар не пересекаются.
Например, массив \([[2, 4], [9, 12], [2, 4], [7, 7], [10, 13], [6, 8]]\) является красивым, так как его можно разбить на \(3\) пары следующим образом: - первый элемент массива (отрезок \([2, 4]\)) и третий элемент массива (отрезок \([2, 4]\));
- второй элемент массива (отрезок \([9, 12]\)) и пятый элемент массива (отрезок \([10, 13]\));
- четвертый элемент массива (отрезок \([7, 7]\)) и шестой элемент массива (отрезок \([6, 8]\)).
Как видно, отрезки в каждой паре пересекаются, а отрезки из разных пар не пересекаются. Дан массив из \(n\) отрезков \([[l_1, r_1], [l_2, r_2], \dots, [l_n, r_n]]\). Вам нужно удалить минимально возможное количество элементов из этого массива, чтобы получившийся массив был красивым. Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество элементов, которые нужно удалить, чтобы получившийся массив был красивым. Примечание В первом наборе входных данных достаточно удалить \(5\)-й элемент массива отрезков. Тогда получится массив \([[2, 4], [9, 12], [2, 4], [7, 7], [10, 13], [6, 8]]\), который является красивым. Во втором наборе входных данных можно удалить \(1\)-й, \(3\)-й и \(4\)-й элементы массива. Тогда получится массив \([[2, 8], [5, 6]]\), который является красивым. В третьем наборе входных данных необходимо удалить весь массив.
| |
|
|
F. Монокарп и стратегия
геометрия
сортировки
*2700
Монокарп играет в стратегическую компьютерную игру, в которой он развивает город. Город населяют существа четырёх разных рас — люди, эльфы, орки и гномы. У каждого жителя города есть настроение, которое выражается целым числом. Оно зависит от того, какие расы и в каком количестве населяют город. А именно: настроение каждого жителя по умолчанию равно \(0\); оно повышается на \(1\) за каждого другого жителя той же расы и понижается на \(1\) за каждого жителя враждебной расы. Люди враждуют с орками, а эльфы — с гномами. В начале игры город Монокарпа никто не населяет. За игру к нему будет \(n\) раз приходить группа существ, желающих поселиться в его городе. В \(i\)-й группе \(a_i\) людей, \(b_i\) орков, \(c_i\) эльфов и \(d_i\) гномов. Каждый раз Монокарп может либо принять в город всю группу существ, либо отклонить (также всю группу). Игра рассчитывает количество очков, которое набирает Монокарп, по формуле \(m + k\), где \(m\) — это количество жителей города, а \(k\) — суммарное настроение всех жителей. Помогите Монокарпу набрать максимальное количество очков в конце игры! Выходные данные Выведите одно число — максимальное количество очков, которое может набрать Монокарп. Ваш ответ будет считаться правильным, если его абсолютная или относительная погрешность не превосходит \(10^{-9}\). То есть если ваш ответ — \(a\), а ответ жюри — \(b\), то решение будет засчитано, если \(\frac{|a-b|}{\max(1,|b|)} \le 10^{-9}\). Обратите внимание, что правильный ответ всегда целый, но он может не помещаться в \(64\)-битные целочисленные типы данных, поэтому вы можете вывести ответ как нецелое число. Примечание В первом примере лучшим вариантом действий будет принять все группы. Во втором примере лучшим вариантом действий будет принять группы \(2\) и \(3\), а отклонить группы \(1\) и \(4\).
| |
|
|
F. Тенцинг и дерево
Деревья
жадные алгоритмы
кратчайшие пути
поиск в глубину и подобное
сортировки
*2500
У Тенцинга есть неориентированное дерево из \(n\) вершин. Определим ценность дерева с черными и белыми вершинами следующим образом: значение ребра — это абсолютная разница между количеством черных вершин в двух компонентах дерева после удаления ребра. Ценность дерева — это сумма значений по всем ребрам. Для всех \(k\) таких, что \(0 \leq k \leq n\), Тенцинг хочет знать максимальную ценность дерева, когда \(k\) вершин окрашены в черный цвет, а \(n-k\) вершин — в белый. Выходные данные Выведите \(n+1\) число. Число \(i\) является ответом на вопрос \(k=i-1\). Примечание Рассмотрим первый пример. Когда \(k=2\), Тенцинг может покрасить вершины \(1\) и \(2\) в черный цвет, тогда значение ребра \((1,2)\) равно 0, а значения остальных ребер все равны \(2\). Таким образом, ценность этого дерева равна \(4\).
| |
|
|
A. Саша и раскраска массива
жадные алгоритмы
сортировки
*800
Саша нашел массив \(a\), состоящий из \(n\) целых чисел, и попросил вас раскрасить элементы. Вы должны раскрасить каждый элемент массива. Вы можете использовать столько цветов, сколько захотите, но каждый элемент должен быть окрашен ровно в один цвет, и для каждого цвета должен быть хотя бы один элемент этого цвета. Стоимость одного цвета — это значение \(\max(S) - \min(S)\), где \(S\) — последовательность элементов этого цвета. Стоимость всей раскраски — это сумма стоимостей по всем цветам. Например, предположим, что у вас есть массив \(a = [\color{red}{1}, \color{red}{5}, \color{blue}{6}, \color{blue}{3}, \color{red}{4}]\), вы раскрасили его элементы в два цвета следующим образом: элементы на позициях \(1\), \(2\) и \(5\) имеют цвет \(1\); элементы на позициях \(3\) и \(4\) имеют цвет \(2\). Тогда: - Стоимость цвета \(1\) составляет \(\max([1, 5, 4]) - \min([1, 5, 4]) = 5 - 1 = 4\);
- Стоимость цвета \(2\) равна \(\max([6, 3]) - \min([6, 3]) = 6 - 3 = 3\);
- Общая стоимость раскраски равна \(7\).
Для данного массива \(a\) вы должны рассчитать максимальную возможную стоимость раскраски. Выходные данные Для каждого набора входных данных выведите максимальную возможную стоимость раскраски в отдельной строке. Примечание В первом примере одной из оптимальных раскрасок является \([\color{red}{1}, \color{red}{5}, \color{blue}{6}, \color{blue}{3}, \color{red}{4}]\). Ответ для неё равен \((5 - 1) + (6 - 3) = 7\). Во втором примере единственной возможной раскраской является \([\color{blue}{5}]\), для которой ответ равен \(5 - 5 = 0\). В третьем примере оптимальной окраской является \([\color{blue}{1}, \color{red}{6}, \color{red}{3}, \color{blue}{9}]\), для которой ответ равен \((9 - 1) + (6 - 3) = 11\).
| |
|
|
F2. Перестановка минимальной стоимости (сложная версия)
Бинарный поиск
жадные алгоритмы
Конструктив
математика
сортировки
Структуры данных
*2800
Единственное отличие между этой задачей и простой версией — в ограничениях на \(t\) и \(n\). Вам дан массив из \(n\) положительных целых чисел \(a_1,\dots,a_n\), а также целое (возможно, отрицательное) число \(c\). Среди всех возможных перестановок \(b_1,\dots,b_n\) массива \(a_1,\dots,a_n\), рассмотрим минимально возможное значение \(\)\sum_{i=1}^{n-1} |b_{i+1}-b_i-c|.\(\) Найдите лексикографически наименьшую перестановку \(b\) массива \(a\), на которой достигается этот минимум. Последовательность \(x\) лексикографически меньше последовательности \(y\), если и только если выполняется один из следующих пунктов: - \(x\) — префикс \(y\), но \(x \ne y\);
- в первой позиции, где \(x\) и \(y\) различны, в последовательности \(x\) находится элемент, меньший соответствующего элемента \(y\).
Выходные данные Для каждого набора входных данных выведите \(n\) целых чисел \(b_1,\dots,b_n\), задающих лексикографически наименьшую перестановку \(a\), на которой достигается минимум \(\sum\limits_{i=1}^{n-1} |b_{i+1}-b_i-c|\). Примечание В первом наборе входных данных можно доказать, что минимальное значение \(\sum\limits_{i=1}^{n-1} |b_{i+1}-b_i-c|\) равно \(27\), а перестановка \(b = [9,3,1,4,5,1]\) является лексикографически наименьшей перестановкой \(a\), на которой достигается этот минимум: \(|3-9-(-7)|+|1-3-(-7)|+|4-1-(-7)|+|5-4-(-7)|+|1-5-(-7)| = 1+5+10+8+3 = 27\). Во втором наборе входных данных минимально возможное значение \(\sum\limits_{i=1}^{n-1} |b_{i+1}-b_i-c|\) равно \(0\), при этом \(b = [1,3,5]\) является лексикографически наименьшей перестановкой \(a\), на которой достигается этот минимум. В третьем наборе входных данных существует всего одна перестановка \(b\).
| |
|
|
C. Рудольф и очередное соревнование
дп
жадные алгоритмы
Конструктив
сортировки
Структуры данных
*1200
Рудольф зарегистрировался на соревнование по спортивному программированию, которое пройдет по правилам ICPC. Правила подразумевают, что за каждую решенную задачу дается \(1\) балл, а также начисляется штрафное время, равное количеству минут, пройденному с начала соревнования к моменту решения задачи. В итоговой таблице выше находится участник набравший больше баллов, а при равенстве баллов выше тот, у которого меньше штрафное время. Всего на соревнование зарегистрировалось \(n\) участников. Рудольф имеет номер \(1\). Известно, что будет предложено \(m\) задач. А длиться соревнование будет \(h\) минут. Мощный искусственный интеллект предсказал значения \(t_{i, j}\) — количество минут, за которое \(i\)-й участник решит \(j\)-ю задачу. Рудольф понял, что порядок решения задач повлияет на итоговый результат. Например, если \(h = 120\), а время решения задач равны [\(20, 15, 110\)], тогда если Рудольф будет решать задачи в порядке: - \({3, 1, 2}\), то он успеет решить только третью задачу и получит \(1\) балл и \(110\) штрафных минут.
- \({1, 2, 3}\), то первую задачу он решит через \(20\) минут после начала, вторую через \(20+15=35\) минут, а третью не успеет. Таким образом он получит \(2\) балла и \(20+35=55\) штрафных минут.
- \({2, 1, 3}\), то вторую задачу он решит через \(15\) минут после начала, первую через \(15+20=35\) минут, а третью не успеет. Таким образом он получит \(2\) балла и \(15+35=50\) штрафных минут.
Рудольфу стало интересно какое место он займет на соревановании, если каждый участник будет решать задачи в оптимальном порядке исходя из предсказаний искусственного интеллекта. Будем считать, что при равенстве баллов и штрафных минут Рудольф займет наилучшее место. Выходные данные Для каждого набора входных данных выведите целое число — место Рудольфа в таблице результатов, если все участники будут решать задачи в оптимальном порядке. Примечание В первом примере Рудольф наберет \(2\) балла и \(50\) штрафных минут. Второй участник решит только одну задачу и наберет \(1\) балл и \(90\) штрафных минут. И третий участник успеет решить все \(3\) задачи и наберет \(3\) балла и \(240\) штрафных минут. Таким образом Рудольф займет второе место. Во втором примере оба наберут \(1\) балл и \(30\) штрафных минут. При равенстве баллов Рудольфу достается лучшая позиция, поэтому он займет первое место. В третьем примере Рудольф единственный участник, поэтому он займет первое место. В четвёртом примере все участники могут решить две задачи со штрафом в \(25 = 8 + (8 + 9)\), \(24 = 7 + (7 + 10)\) и \(26 = 8 + (8 + 10)\), соответственно, благодаря штрафу второй участник получит первое место, а Рудольф второе.
| |
|
|
A. Человек, ставший Богом
жадные алгоритмы
сортировки
*800
Карс возмущен узким мышлением жителей своей деревни, поскольку они довольствуются тем, что стоят на месте, и не пытаются стать совершенной формой жизни. Будучи первоклассным изобретателем, Карс хочет усовершенствовать свое тело и стать совершенной формой жизни. К сожалению, \(n\) жителей деревни с подозрением относятся к его идеям. \(i\)-й житель деревни подозревает Карса на \(a_i\). По отдельности каждый житель деревни боится Карса, поэтому они объединяются в группы, чтобы стать сильнее. Силу группы сельчан от \(l\) до \(r\) можно определить как \(f(l,r)\), где \(\)f(l,r) = |a_l - a_{l+1}| + |a_{l + 1} - a_{l + 2}| + \ldots + |a_{r-1} - a_r|.\(\) Здесь \(|x-y|\) — модуль числа \(x-y\). Группа с одним жителем имеет силу \(0\). Карс хочет разбить жителей деревни на ровно \(k\) подряд идущих групп так, чтобы сумма их сил была минимальна. Формально, он должен найти \(k - 1\) положительных целых чисел \(1 \le r_1 < r_2 < \ldots < r_{k - 1} < n\) такие, что \(f(1, r_1) + f(r_1 + 1, r_2) + \ldots + f(r_{k-1} + 1, n)\) минимально. Помогите Карсу найти минимальное значение \(f(1, r_1) + f(r_1 + 1, r_2) + \ldots + f(r_{k-1} + 1, n)\). Выходные данные Для каждого набора входных данных выведите одно целое число — минимально возможное значение суммы сил всех групп, т. е. минимально возможное значение \(f(1,r_1) + f(r_1 + 1, r_2) + \ldots + f(r_{k-1} + 1, n)\). Примечание В первом наборе входных данных сгруппируем жителей деревни с подозрениями \((1,3,5,2)\) в \((1,3,5)\) и \((2)\). Таким образом, \(f(1,3) + f(4,4) = (|1 - 3| + |3 - 5|) + 0 = 4 + 0 = 4\). Во втором наборе входных данных мы сгруппируем жителей деревни с подозрениями \((1,9,12,4,7,2)\) в \((1),(9,12),(4,7,2)\). Итак, \(f(1,1) + f(2,3) + f(4,6) = 0 + 3 + 8 = 11\).
| |
|
|
F. Личность босса
Бинарный поиск
битмаски
жадные алгоритмы
математика
поиск в глубину и подобное
сортировки
Структуры данных
*2500
Во время расследования происхождения Диаволо, Джорно получает от Полнареффа секретный код. Код можно представить в виде бесконечной последовательности целых положительных чисел: \(a_1, a_2, \dots \). Джорно сразу видит закономерность, лежащую в основе кода. Первые \(n\) чисел \(a_1, a_2, \dots, a_n\) являются известными. Для \(i > n\) значение \(a_i\) равно \((a_{i-n}\ |\ a_{i-n+1})\), где \(|\) обозначает операцию побитового ИЛИ. Части информации о Диаволо скрыты в \(q\) вопросах. Каждый вопрос связан с положительным целым числом \(v\), а ответом на него является наименьший индекс \(i\), такой, что \(a_i > v\). Если такого \(i\) не существует, то ответом будет \(-1\). Помогите Джорно ответить на вопросы! Выходные данные Выведите \(q\) чисел. Число \(i\) является ответом на \(i\)-й вопрос, заданный Джорно. Примечание В первом примере \(a = [2,1,3,3,\ldots]\). - Для первого вопроса, \(a_1=2\) – элемент с наименьшим индексом, больший чем \(1\).
- Для второго вопроса, \(a_3=3\) – элемент с наименьшим индексом, больший чем \(2\).
- Для третьего вопроса, нет индекса \(i\), такого что \(a_i > 3\).
.
| |
|
|
B. Вика и мостик
Бинарный поиск
жадные алгоритмы
математика
реализация
сортировки
Структуры данных
*1200
Летом Вика любит бывать на даче. Там есть всё для отдыха: удобные качели, велосипеды и речка. Через речку прокинут деревянный мостик, состоящий из \(n\) дощечек. Он уже довольно старый и неказистый, поэтому Вика решила его покрасить. Да и в сарае как раз нашлись банки с краской \(k\) цветов. Покрасив каждую дощечку в один из \(k\) цветов, Вика уже хотела пойти качаться на качелях, чтобы отдохнуть от работы. Однако поняла, что дом находится на другой стороне речки, а краска ещё не полностью засохла и ходить по мостику пока нельзя. Чтобы не портить внешний вид мостика, Вика решила, что всё же пройдёт по нему, но наступая только на дощечки одного цвета. Так как иначе небольшой слой краски на её подошве испортит дощечку другого цвета. У девушки также осталось немного краски, но её хватит на перекрашивание лишь одной дощечки мостика. Сейчас Вика стоит на земле перед первой дощечкой. Чтобы пройти по мостику, она выберет некоторые дощечки одинакового цвета (после перекрашивания), которые имеют номера \(1 \le i_1 < i_2 < \ldots < i_m \le n\) (дощечки нумеруются с \(1\) слева направо). Тогда Вике придётся переступить \(i_1 - 1, i_2 - i_1 - 1, i_3 - i_2 - 1, \ldots, i_m - i_{m-1} - 1, n - i_m\) дощечек в результате каждого из \(m + 1\) шагов. Так как Вика боится упасть, она не хочет делать слишком длинные шаги. Помогите ей и скажите минимально возможное максимальное количество дощечек, через которые ей придётся переступить за один шаг, если в процессе перехода по мостику она может перекрасить одну (или ноль) дощечек в другой цвет. Выходные данные Для каждого набора входных данных выведите единственное число — минимально возможное максимальное количество дощечек, через которое придётся переступить Вике за один шаг. Примечание В первом наборе входных данных Вика может перекрасить дощечку посередине в цвет \(1\) и пройти через мостик, не переступая через дощечки. Во втором наборе входных данных Вика может перекрасить дощечку посередине в цвет \(2\) и пройти через мостик, каждый раз переступая через одну дощечку. В третьем наборе входных данных Вика может перекрасить предпоследнюю дощечку в цвет \(2\) и пройти по мостику, наступая только на дощечки с номерами \(2\) и \(5\). Тогда Вике придётся переступить \(1\), \(2\) и \(1\) дощечку при каждом шаге, поэтому ответ равен \(2\). В четвёртом наборе входных данных Вика может вовсе не перекрашивать мостик и пройти по нему, каждый раз переступая через две дощечки, идя по дощечкам цвета \(3\). В пятом наборе входных данных Вика может вовсе не перекрашивать мостик и пройти по нему, не переступая через дощечки.
| |
|
|
B. Монстры
жадные алгоритмы
математика
сортировки
*1000
Монокарп играет в очередную компьютерную игру. Как обычно, его персонаж занимается убийством монстров. Монокарпу противостоят \(n\) монстров, пронумерованных от \(1\) до \(n\), \(i\)-й из них изначально имеет \(a_i\) очков здоровья. У персонажа Монокарпа есть способность, которая наносит \(k\) урона монстру с наибольшим текущим здоровьем. Если таких монстров несколько, выбирается тот, у которого меньший номер. Если здоровье монстра становится меньше или равно \(0\) после использования способности, то он умирает. Монокарп использует свою способность до тех пор, пока все монстры не умрут. Ваша задача — определить порядок, в котором монстры будут умирать. Выходные данные Для каждого набора входных данных выведите \(n\) целых чисел — номера монстров в порядке, в котором они будут умирать. Примечание В первом примере очки здоровья меняются следующим образом: \([1, 2, \underline{3}] \rightarrow [1, \underline{2}, 1] \rightarrow [\underline{1}, 0, 1] \rightarrow [-1, 0, \underline{1}] \rightarrow [-1, 0, -1]\). Монстр, который получит урон при следующем применении способности Монокарпа, обозначается подчеркнутым. Во втором примере очки здоровья меняются следующим образом: \([\underline{1}, 1] \rightarrow [-2, \underline{1}] \rightarrow [-2, -2]\). В третьем примере очки здоровья меняются следующим образом: \([2, \underline{8}, 3, 5] \rightarrow [2, \underline{5}, 3, 5] \rightarrow [2, 2, 3, \underline{5}] \rightarrow [2, 2, \underline{3}, 2] \rightarrow [\underline{2}, 2, 0, 2] \rightarrow [-1, \underline{2}, 0, 2] \rightarrow [-1, -1, 0, \underline{2}] \rightarrow [-1, -1, 0, -1]\).
| |
|
|
A. To My Critics
реализация
сортировки
*800
У Сунита есть три цифры \(a\), \(b\) и \(c\). Так как математика не является его сильной стороной, он просит вас определить, можно ли выбрать любые две цифры так, чтобы их сумма была больше или равна \(10\). Выведите «YES», если такая пара существует, и «NO» в противном случае. Выходные данные Для каждого теста выведите «YES», если такая пара существует, и «NO» в противном случае. Вы можете вывести ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ). Примечание В первом примере, выбрав цифры \(8\) и \(2\), мы можем получить сумму \(8 + 2 = 10\), что удовлетворяет условию, поэтому ответ «YES». Во втором примере, любая комбинация выбранных цифр не будет иметь сумму, равную или большую \(10\), поэтому ответ «NO» (обратите внимание, что мы не можем выбрать цифру на одной позиции дважды). В третьем примере, любая комбинация выбранных цифр будет иметь сумму, равную \(18\), поэтому ответ «YES».
| |
|
|
B. Десять слов мудрости
реализация
сортировки
*800
В игровом шоу «Десять слов мудрости» участвуют \(n\) участников, пронумерованных от \(1\) до \(n\), каждый из которых даёт один ответ. \(i\)-й ответ состоит из \(a_i\) слов и имеет качество \(b_i\). Никакие два ответа не имеют одинакового качества, и по крайней мере один ответ имеет длину не более \(10\) слов. Победителем шоу становится ответ с наивысшим качеством из всех ответов, которые не превышают \(10\) слов. Какой ответ станет победителем? Выходные данные Для каждого набора входных данных выведите одну строку, содержащую одно целое число \(x\) (\(1 \leq x \leq n\)) — победителя шоу, согласно правилам, указанным в условии. Можно показать, что согласно ограничениям в условии, для каждого теста существует ровно один победитель. Примечание В первом тесте предоставлены следующие ответы: - Ответ 1: \(7\) слов, качество \(2\)
- Ответ 2: \(12\) слов, качество \(5\)
- Ответ 3: \(9\) слов, качество \(3\)
- Ответ 4: \(9\) слов, качество \(4\)
- Ответ 5: \(10\) слов, качество \(1\)
Мы видим, что ответы с индексами \(1\), \(3\), \(4\) и \(5\) имеют длину, не превышающую \(10\) слов. Из этих ответов победителем является тот, у которого наивысшее качество. Сравнивая качества, мы находим, что: - Ответ 1 имеет качество \(2\).
- Ответ 3 имеет качество \(3\).
- Ответ 4 имеет качество \(4\).
- Ответ 5 имеет качество \(1\).
Среди этих ответов, победителем является Ответ 4 с наивысшим качеством.
| |
|
|
D. Сбалансированный раунд
жадные алгоритмы
Перебор
реализация
сортировки
*900
Вы являетесь автором раунда Codeforces и подготовили \(n\) задач, которые вы собираетесь задать, причем задача \(i\) имеет сложность \(a_i\). Вы будете выполнять следующий процесс: - удалить некоторые (возможно, ноль) задач из списка;
- переставить оставшиеся задачи в любом порядке, который вы пожелаете.
Раунд считается сбалансированным, если и только если абсолютная разница между сложностью любых двух последовательных задач не превышает \(k\) (то есть меньше или равен \(k\)). Какое минимальное количество задач нужно удалить, чтобы расстановка задач была сбалансированной? Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество задач, которые нужно удалить, чтобы расстановка задач была сбалансированной. Примечание В первом примере мы можем удалить первые \(2\) задачи и составить набор, используя задачи со сложностями \([4, 5, 6]\), с разницей между соседними задачами равной \(|5 - 4| = 1 \leq 1\) и \(|6 - 5| = 1 \leq 1\). Во втором примере мы можем взять одну задачу и составить раунд, используя задачу со сложностью \(10\).
| |
|
|
G. The Morning Star
геометрия
Комбинаторика
математика
реализация
сортировки
Структуры данных
*1500
Компас указывает прямо на утреннюю звезду. Он может указывать только в одном из восьми направлений: четыре основных направления (N, S, E, W) или их комбинации (NW, NE, SW, SE). В противном случае, он сломается. Направления, в которых может указывать компас. На плоскости находится \(n\) различных точек с целочисленными координатами. Сколько существует способов разместить компас в одной точке и утреннюю звезду в другой, чтобы компас не сломался? Выходные данные Для каждого набора входных данных выведите одно целое число — количество пар точек, которые не сломают компас. Примечание В первом примере, любая пара точек не сломает компас: - Компас находится в \((0,0)\), утренняя звезда находится в \((-1,-1)\): компас будет указывать \(\text{SW}\).
- Компас находится в \((0,0)\), утренняя звезда находится в \((1,1)\): компас будет указывать \(\text{NE}\).
- Компас находится в \((-1,-1)\), утренняя звезда находится в \((0,0)\): компас будет указывать \(\text{NE}\).
- Компас находится в \((-1,-1)\), утренняя звезда находится в \((1,1)\): компас будет указывать \(\text{NE}\).
- Компас находится в \((1,1)\), утренняя звезда находится в \((0,0)\): компас будет указывать \(\text{SW}\).
- Компас находится в \((1,1)\), утренняя звезда находится в \((-1,-1)\): компас будет указывать \(\text{SW}\).
Во втором примере, только две пары точек не сломают компас: - Компас находится в \((6,9)\), утренняя звезда находится в \((10,13)\): компас будет указывать \(\text{NE}\).
- Компас находится в \((10,13)\), утренняя звезда находится в \((6,9)\): компас будет указывать \(\text{SW}\).
| |
|
|
B. Сортировка четностью
жадные алгоритмы
сортировки
*800
У вас есть массив \(a\), состоящий из \(n\) целых чисел. К заданному массиву можно применять следующую операцию: - Поменять местами два элемента \(a_i\) и \(a_j\) такие, что \(i \neq j\), \(a_i\) и \(a_j\) либо оба четные, либо оба нечетные.
Определите, можно ли, совершая операцию некоторое число раз (возможно, нулевое), отсортировать массив в порядке неубывания? Например, пусть \(a\) = [\(7, 10, 1, 3, 2\)]. Тогда можно совершить \(3\) операции для того, чтобы отсортировать массив: - Поменять местами \(a_3 = 1\) и \(a_1 = 7\), так как \(1\) и \(7\) — нечетные. Получим \(a\) = [\(1, 10, 7, 3, 2\)];
- Поменять местами \(a_2 = 10\) и \(a_5 = 2\), так как \(10\) и \(2\) — четные. Получим \(a\) = [\(1, 2, 7, 3, 10\)];
- Поменять местами \(a_4 = 3\) и \(a_3 = 7\), так как \(3\) и \(7\) — нечетные. Получим \(a\) = [\(1, 2, 3, 7, 10\)].
Выходные данные Для каждого набора входных данных в отдельной строке выведите: - «YES», если массив можно отсортировать, применив к нему операцию некоторое количество раз;
- «NO» в противном случае.
Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ). Примечание Первый набор входных данных разобран в условии задачи.
| |
|
|
E. Настя и зелья
графы
дп
поиск в глубину и подобное
сортировки
*1500
Алхимик Настя очень любит смешивать зелья. Всего алхимии известно \(n\) видов зелий, одно зелье вида \(i\) можно купить за \(c_i\) монет. Любой вид зелий можно получить не более чем одним способом, путём смешивания из нескольких других. Зелья, которые используются в смешивании при этом потратятся. Причём ни одно зелье нельзя получить из самого себя путём одного или нескольких смешиваний. Как опытный алхимик, Настя имеет зелья \(k\) видов \(p_1, p_2, \dots, p_k\) в неограниченных количествах, но не знает какое захочет получить следующим. Чтобы определиться, она просит вас для всех \(1 \le i \le n\) узнать, какое минимальное число монет нужно потратить, чтобы следующим получить зелье вида \(i\). Входные данные В первой строке входных данных содержится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте. Далее следуют описания наборов. В первой строке набора содержится два целых числа \(n\) и \(k\) (\(1 \le k < n \le 2 \cdot 10^5\)) — количество видов зелий всего и количество видов зелий, которые есть у Насти. Во второй строке набора содержатся \(n\) чисел \(c_1, c_2, \dots, c_n\) (\(1 \le c_i \le 10^9\)) – стоимости покупки зелий. В третьей строке набора содержатся \(k\) различных целых чисел \(p_1, p_2, \dots, p_k\) (\(1 \le p_i \le n\)) — номера зелий, которые уже есть у Насти в неограниченных количествах. Далее следуют \(n\) строк, описывающих способы получения зелий смешиванием. Каждая строка начинается с числа \(m_i\) (\(0 \le m_i < n\)) — количество зелий, необходимое для смешивания зелья вида \(i\) (\(1 \le i \le n\)). Дальше строка содержит \(m_i\) различных целых чисел \(e_1, e_2, \dots, e_{m_i}\) (\(1 \le e_j \le n\), \(e_j \ne i\)) — номера зелий необходимых для смешивания зелья вида \(i\). Если этот список пуст, то зелье вида \(i\) можно только купить. Гарантируется, что ни одно зелье нельзя получить из самого себя путём одного или нескольких смешиваний. Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\). Аналогично гарантируется, что сумма значений \(m_i\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\). Выходные данные Для каждого набора входных данных выведите \(n\) чисел — минимальное число монет, которое нужно потратить, чтобы получить зелье каждого вида. Примечание В первом наборе первого примера оптимально: - Получить зелье первого типа купив и смешав \(2\), \(4\) и \(5\);
- зелье второго типа можно получить только купив его;
- у Насти уже есть неограниченное число зелий третьего типа;
- зелье четвертого типа выгоднее купить, чем купить и смешать другие зелья;
- зелье пятого типа можно получить только купив его;
| |
|
|
G. Влад и горы
Бинарный поиск
графы
Деревья
реализация
снм
сортировки
Структуры данных
*2000
Влад решил отправиться в путешествие в горы. Всего он планирует перемещаться по \(n\) горам, между некоторыми из которых есть дороги. Горы имеют высоты, высота \(i\)-й горы равна \(h_i\). Если между горами \(i\) и \(j\) есть дорога, то Влад может перейти с горы \(i\) на гору \(j\), потратив при этом \(h_j - h_i\) единиц энергии. Если при переходе его энергия должна опуститься ниже нуля, он не сможет перейти с горы \(i\) на гору \(j\). Обратите внимание, что \(h_j - h_i\) может быть отрицательным и тогда энергия восстановится. Влад хочет рассмотреть разные варианты маршрута, поэтому просит вас ответить на следующие запросы: можно ли построить какой-либо маршрут, начинающийся на горе \(a\) и заканчивающийся на горе \(b\), если изначально у него есть \(e\) единиц энергии? Выходные данные Для каждого запроса выведите «YES», если Влад может составить маршрут от горы \(a\) до горы \(b\), и «NO» в противном случае. Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ). В примерах ниже ответы на разные наборы данных разделены пустой строкой, вы можете её не выводить.
| |
|
|
B. Несбалансированные массивы
графы
жадные алгоритмы
Конструктив
математика
сортировки
*1800
Ntarsis придумал массив \(a\) из \(n\) неотрицательных целых чисел. Массив \(b\) из \(n\) целых чисел называется несбалансированным, если он удовлетворяет следующим условиям: - \(-n\le b_i\le n\), \(b_i \ne 0\),
- не существует двух индексов \((i, j)\) (\(1 \le i, j \le n\)), таких что \(b_i + b_j = 0\),
- для каждого \(1 \leq i \leq n\), существует ровно \(a_i\) индексов \(j\) (\(1 \le j \le n\)) таких, что \(b_i+b_j>0\), где \(i\) и \(j\) не обязательно различны.
Дан массив \(a\). Ntarsis хочет, чтобы вы построили любой несбалансированный массив. Помогите ему решить эту задачу или определите, что это невозможно. Выходные данные Для каждого набора входных данных выведите «NO», если не существует несбалансированного массива. В противном случае выведите «YES». Затем, на следующей строке, выведите \(n\) целых чисел \(b_1, b_2, \ldots, b_n\), где \(b_i \neq 0\) для всех \(1 \leq i \leq n\) — допустимый несбалансированный массив. Примечание Для первого набора входных данных, \(b = [1]\) является допустимым несбалансированным массивом: для \(i = 1\) существует ровно одно \(j\) (\(j = 1\)), где \(b_1 + b_j > 0\). Для второго набора можно показать, что не существует допустимого несбалансированного массива. Для третьего набора, \(a = [0, 1, 0]\). Массив \(b = [-3, 1, -2]\) является допустимым несбалансированным массивом. - Для \(i = 1\) и \(i = 3\) не существует индекса \(j\) такого, что \(b_i + b_j > 0\).
- Для \(i = 2\) существует только один индекс \(j = 2\), такой что \(b_i + b_j > 0\) (\(b_2 + b_2 = 1 + 1 = 2\)).
Другой возможный ответ на третий пример — \(b = [-2, 1, -3]\).
| |
|
|
C. Построение по минимумам
жадные алгоритмы
сортировки
*1200
У мальчика Саши есть массив \(a\) из \(n\) целых чисел. Ему стало скучно, и для всех \(i\), \(j\) (\(i < j\)) он записал минимальное значение из \(a_i\) и \(a_j\). Он получил новый массив \(b\) размером \(\frac{n\cdot (n-1)}{2}\). Например, если \(a=\) [\(2,3,5,1\)], он запишет [\(\min(2, 3), \min(2, 5), \min(2, 1), \min(3, 5), \min(3, 1), min(5, 1)\)] \(=\) [\(2, 2, 1, 3, 1, 1\)]. Также, он случайным образом перемешал все элементы массива \(b\). К сожалению, он забыл массив \(a\), и ваша задача — восстановить любой возможный массив \(a\), из которого мог быть получен массив \(b\). Элементы массива \(a\) должны находиться в диапазоне \([-10^9,10^9]\). Выходные данные Для каждого теста выведите любой возможный массив \(a\) длиной \(n\). Примечание В первом примере Саша выбрал массив \([1,3,3]\), тогда массив \(b\) будет выглядеть как \([\min(a_1,a_2)=1, \min(a_1,a_3)=1, \min(a_2,a_3)=3]\), после перемешивания его элементов, массив может выглядеть как \([1,3,1]\). Во втором примере есть только одна пара, поэтому подходит массив \([10,10]\). Другим подходящим массивом может быть \([15,10]\).
| |
|
|
D. Сильные вершины
Деревья
математика
сортировки
*1300
Даны два массива \(a\) и \(b\), оба длины \(n\). Элементы обоих массивов пронумерованы от \(1\) до \(n\). Вы строите ориентированный граф, где существует ориентированное ребро из \(u\) в \(v\) (\(u\neq v\)), если \(a_u-a_v \ge b_u-b_v\). Вершина \(V\) называется сильной, если существует путь от \(V\) ко всем остальным вершинам. Путем в ориентированном графе называют такую цепочку из нескольких вершин, соединенных рёбрами, что двигаясь от вершины \(u\) по направлениям рёбер можно достичь вершины \(v\). Ваша задача — найти все сильные вершины. Например, если \(a=[3,1,2,4]\) и \(b=[4,3,2,1]\), граф будет выглядеть так: Граф имеет только одну сильную вершину с номером \(4\) Выходные данные Для каждого набора входных данных выведите две строки: в первой строке выведите количество сильных вершин, а во второй строке выведите все сильные вершины в возрастающем порядке. Примечание Первый пример разобран в условии. Для второго примера граф выглядит так: Граф имеет две сильные вершины с номерами в \(3\) и \(5\). Обратите внимание, что между вершинами \(3\) и \(5\) проведено двунаправленное ребро. В третьем примере вершины соединяет единственное направленное ребро от вершины \(2\) к вершине \(1\), поэтому единственная сильная вершина это \(2\). В четвертом примере все вершины попарно соединены двунаправленными рёбрами, поэтому от каждой вершины есть путь к любой другой.
| |
|
|
E. Мощность точек
математика
сортировки
*1500
Вам даны \(n\) точек с целочисленными координатами \(x_1,\dots x_n\), которые лежат на числовой прямой. Для некоторого целого числа \(s\) построим отрезки [\(s,x_1\)], [\(s,x_2\)], \(\dots\), [\(s,x_n\)]. Обратите внимание, что если \(x_i<s\), то отрезок будет выглядеть как [\(x_i,s\)]. Отрезок [\(a, b\)] покрывает все целочисленные точки \(a, a+1, a+2, \dots, b\). Назовём мощностью точки \(p\) количество отрезков, которые пересекают точку с координатой \(p\), обозначим её как \(f_p\). Ваша задача: для каждого \(s \in \{x_1,\dots,x_n\}\) вычислить \(\sum\limits_{p=1}^{10^9}f_p\), то есть сумму \(f_p\) по всем целочисленным точкам от \(1\) до \(10^9\). Например, если начальные координаты \([1,2,5,7,1]\) и выбрать \(s=5\), то отрезки будут такими: \([1,5]\),\([2,5]\),\([5,5]\),\([5,7]\),\([1,5]\). А мощности точек будут: \(f_1=2, f_2=3, f_3=3, f_4=3, f_5=5, f_6=1, f_7=1, f_8=0, \dots, f_{10^9}=0\). Их сумма \(2+3+3+3+5+1+1=18\). Выходные данные Для каждого набора выведите \(n\) чисел, \(i\)-е из которых равно сумме мощностей всех точек для \(s=x_i\). Примечание В первом наборе входных данных мы сначала выбираем \(s=x_1=1\), тогда образуются такие отрезки: \([1,1]\),\([1,4]\),\([1,3]\). Силы точек будут такими: \(f_1=3, f_2=2, f_3=2, f_4=1, f_5=0 \dots\) Сумма мощностей точек: \(3+2+2+1+0+\dots+0=8\). Затем \(s=x_2=4\). Тогда будут такие отрезки: \([1,4]\),\([4,4]\),\([3,4]\), а мощности точек \(f_1=1, f_2=1, f_3=2, f_4=3\). В конце берем \(s=x_3=3\) и отрезки выглядят так: \([1,3]\),\([3,4]\),\([3,3]\), а мощности точек: \(f_1=1, f_2=1, f_3=3, f_4=1\).
| |
|
|
G. Подсчет графов
графы
Деревья
жадные алгоритмы
Комбинаторика
разделяй и властвуй
снм
сортировки
*2000
Дано дерево, состоящее из \(n\) вершин. Дерево — это связный неориентированный граф без циклов. Каждое ребро дерева имеет свой вес, \(w_i\). Ваша задача — подсчитать количество различных графов, для которых одновременно выполняются четыре условия: - В графе нет петель и кратных ребер.
- Веса на ребрах графа целые числа и не превышают \(S\).
- Граф имеет ровно одно минимальное остовное дерево.
- Минимальное остовное дерево графа является заданным деревом.
Два графа считаются различными, если их наборы рёбер различны с учётом весов рёбер. Ответ может быть большим, выведите его по модулю \(998244353\). Выходные данные Для каждого теста выведите количество различных графов, удовлетворяющих условиям, по модулю \(998244353\). Примечание В первом примере существует единственный граф, который и является заданным деревом. Во втором примере заданное дерево выглядит так: Ниже изображены все возможные графы для второго примера, красным цветом выделено минимальное остовное дерево:
| |
|
|
B. Оля и игра с массивами
жадные алгоритмы
Конструктив
математика
сортировки
*1000
Артём предложил девочке Оле сыграть в следующую игру. Есть список из \(n\) массивов, \(i\)-й массив содержит \(m_i \ge 2\) целых положительных чисел \(a_{i,1}, a_{i,2}, \ldots, a_{i,m_i}\). Оля может переместить из каждого массива не более одного (возможно, \(0\)) числа в другой массив. Обратите внимание, перемещать числа из одного массива можно не более одного раза, однако добавлять числа в один массив можно несколько раз, а также, все перемещения выполняются одновременно. Назовем красотой списка массивов величину \(\sum_{i=1}^n \min_{j=1}^{m_i} a_{i,j}\). Иными словами, для каждого массива мы находим значение минимального элемента в нём, после чего суммируем получившиеся значения. Суть игры — сделать красоту списка массивов максимально возможной. Помогите Оле победить в этой нелегкой игре! Выходные данные Для каждого набора входных данных выведите одно целое число — максимальную красоту списка массивов, которую Оля может получить. Примечание В первом наборе входных данных можно переместить число \(3\) из второго массива в первый. Тогда красота равна \(\min(1, 2, 3) + \min(4) = 5\). Можно показать, что это максимально возможная красота. Во втором наборе входных данных есть всего один массив, поэтому независимо от перемещений красота равна \(\min(100, 1, 6) = 1\).
| |
|
|
D. Андрей и побег из Капиграда
Бинарный поиск
дп
жадные алгоритмы
снм
сортировки
Структуры данных
*1800
В Капиграде, столице Тяголяндии, произошло происшествие, все капибары в городе одичали и стали кидаться мандаринами. Андрей был вынужден сбежать из города максимально далеко, пользуясь порталами. Тяголяндия представляет из себя числовую прямую, а Капиград находится в точке \(0\). По всей Тяголяндии расставлены \(n\) порталов, каждый из которых характеризуется четырьмя целыми числами \(l_i\), \(r_i\), \(a_i\) и \(b_i\) (\(1 \le l_i \le a_i \le b_i \le r_i \le 10^9\)). Обратите внимание, что отрезок \([a_i, b_i]\) содержится в отрезке \([l_i, r_i]\). Если Андрей находится на отрезке \([l_i, r_i]\), тогда портал может его телепортировать в любую точку на отрезке \([a_i, b_i]\). У Андрея есть проездной, который позволяет ему пользоваться порталами неограниченное количество раз. Андрей считает, что точка \(x\) находится на отрезке \([l, r]\), если выполняется неравенство \(l \le x \le r\). У Андрея есть \(q\) вариантов откуда начать свой побег, каждый вариант характеризуется одним целом числом \(x_i\) — позицией начала побега. Он хочет убежать от Капиграда как можно дальше (в точку с максимально возможной координатой). Помогите Андрею узнать, насколько далеко от Капиграда он может убежать, начиная в каждой из \(q\) позиций. Выходные данные Для каждого набора входных данных выведите одну строку из \(q\) целых чисел, содержащую ответы на интересующие Андрея вопросы. Примечание В первом наборе входных данных: Оптимальные действия при старте из каждой позиции: - Воспользуемся порталом \(1\) и телепортируемся в точку \(b_1 = 14\).
- Воспользуемся сначала порталом \(2\) и телепортируемся в точку \(6\), находящуюся на отрезке \([l_1, r_1] = [6, 17]\), после чего воспользуемся порталом \(1\) и телепортируемся в точку \(b_1 = 14\).
- Останемся в точке \(x_3=23\), не пользуясь порталами.
- Останемся в точке \(x_4=15\), не пользуясь порталами.
- Точка \(x_5=28\) не находится ни на одном отрезке, поэтому Андрей не сможет никуда телепортироваться.
- Точка \(x_6=18\) находится на отрезке \([l_3, r_3] = [16, 24]\), воспользуемся порталом \(3\) и телепортируемся в точку \(b_3 = 22\).
В пятом наборе входных данных: Оптимальные действия при старте из каждой позиции: - Воспользуемся сначала порталом \(1\) и телепортируемся в точку \(15\) на отрезке \([a_1, b_1] = [14, 20]\), после чего воспользуемся порталом \(2\) и телепортируемся в точку \(21\), находящуюся на отрезке \([l_4, r_4] = [21, 33]\) и на отрезке \([a_2, b_2] = [13, 24]\), после телепортируемся в точку \(b_4 = 32\).
- Воспользуемся сначала порталом \(6\) и телепортируемся в точку \(20\) на отрезке \([a_6, b_6] = [20, 21]\), после чего воспользуемся порталом \(2\) и телепортируемся в точку \(22\), находящуюся одновременно на отрезке \([l_4, r_4] = [21, 33]\) и на отрезке \([a_2, b_2] = [13, 24]\), после телепортируемся в точку \(b_4 = 32\).
- Сделаем те же самые действия что из с первой позиции.
- Останемся в точке \(x_4=5\), не пользуясь порталами.
- Точка \(8\) не находится ни на одном отрезке, поэтому Андрей не сможет никуда телепортироваться.
- Останемся в точке \(x_6=33\), не пользуясь порталами.
- Воспользуемся порталом \(5\) и телепортируемся в точку \(b_5 = 4\).
- Сделаем те же самые действия что и из первой позиции.
| |
|
|
B. Грибоводство
жадные алгоритмы
сортировки
*1200
Каждый год в замке Короля Гномов проходит состязание в выращивании грибов среди гномов. Соревнование является одним из самых престижных, а за победу в нем дают деревянную салатницу. В этом году на мероприятие собрались лучшие грибоводы со всего мира, поэтому пришлось немного изменить правила, чтобы зрителям было интереснее наблюдать. У каждого грибовода есть свой гриб, который он будет выращивать на состязании. По новым правилам состязание будет состоять из двух частей. Первая часть длится t1 секунд, а вторая t2 секунд, между первой и второй частью есть небольшой перерыв. После стартового свистка начинается первая часть состязания, и все грибоводы одновременно начинают выращивать грибы, каждый со своей скоростью vi метров в секунду. Спустя t1 секунд, грибоводы прекращают выращивать грибы и уходят на перерыв. Во время перерыва, по необъяснимым причинам, рост всех грибов уменьшается на k процентов. После перерыва стартует вторая часть состязания и все грибоводы одновременно продолжают выращивать грибы, каждый со своей скоростью ui метров в секунду. Спустя t2 секунд после окончания перерыва состязание заканчивается. Обратите внимание, что скорости до перерыва и после перерыва могут отличаться. Перед состязанием гном Паша узнал у всех участников, какие две скорости они выбрали. Но участники, не захотели раскрывать ему всю свою стратегию и поэтому не сказали в каком порядке они будут использовать эти скорости. То есть если участник выбрал скорости ai и bi, то возможны два варианта: либо до перерыва он использует скорость ai, а после bi, либо наоборот. Гном Паша очень хочет выиграть тотализатор. Он знает, что каждый участник выберет стратегию максимизирующую высоту своего гриба. Помогите гному Паше составить финальную таблицу результатов соревнования. Участники сортируются в таблице результатов по высоте гриба (участники с более высокими грибами стоят в таблице раньше). При равенстве высот грибов участники сортируются по их номеру (участники с меньшим номером стоят раньше). Выходные данные Выведите финальную таблицу результатов: n строк, каждая строка должна содержать номер соответствующего гнома и итоговую максимальную величину его гриба ровно с двумя знаками после точки. Ответ будет считаться правильным, если он абсолютно точный. Примечание - Первый пример: Обоим участникам удобнее сначала использовать скорость 2, а потом скорость 4, так как 2·3·0.5 + 4·3 > 4·3·0.5 + 2·3.
| |
|
|
F. Вычисляем ПСП
геометрия
математика
реализация
сортировки
Структуры данных
*2900
Заданы \(2n\) наборов \((a, b, c)\), где \(a\) и \(b\) — некоторые положительные целые числа, а \(c\) — скобка '(' или ')'. В ровно \(n\) наборах \(c = \)'(', в остальных \(n\) — \(c =\) ')'. Требуется выбрать два положительных числа \(x\) и \(y\) (\(x > 0\) и \(y > 0\); не обязательно целые) и отсортировать наборы в порядке возрастания \(a \cdot x + b \cdot y\). Если у нескольких наборов одно и то же значение, то их можно расположить в произвольном порядке друг между другом. Можно ли выбрать такие значения \(x\) и \(y\), что, взяв скобки \(c\) из наборов в полученном порядке, мы получим правильную скобочную последовательность? Правильной скобочной последовательностью называется скобочная последовательность, которую можно преобразовать в корректное арифметическое выражение путем вставок между ее символами символов «1» и «+». Выходные данные На каждый набор входных данных выведите «YES», если возможно выбрать такие значения \(x\) и \(y\), что, взяв скобки \(c\) из наборов в полученном порядке, мы получим правильную скобочную последовательность. Иначе выведите «NO». Примечание В первом наборе входных данных можно выбрать \(x = 10, y = 0.1\). Значения для наборов тогда будут \(10 \cdot 1 + 0.1 \cdot 4 = 10.4\) и \(10 \cdot 2 + 0.1 \cdot 3 = 20.3\). Тогда сначала будет первый набор, за ним второй, из чего получается скобочная последовательность «()», которая является правильной. Во втором наборе невозможно выбрать такие положительные \(x\) и \(y\), что открывающей скобке будет присвоено значение, меньше или равное значению закрывающей скобки. В четвертом наборе можно выбрать \(x = 0.6, y = 0.55\). Скобочная последовательность будет «(()(()))».
| |
|
|
C. Забор в цветочном городе
Бинарный поиск
реализация
сортировки
Структуры данных
*1100
Аня живет в цветочном городе. По указу мэра города она должна построить себе забор. Забор состоит из \(n\) досок, каждая из которых высотой \(a_i\) метров. По указу высоты досок должны не возрастать. То есть верно, что \(a_i \ge a_j\) для всех \(i < j\). Ане стало интересно, является ли ее забор симметричным относительно диагонали. То есть получится ли у нее такой же забор, если она уложит все доски горизонтально в том же порядке. Например, для \(n = 5\), \(a = [5, 4, 3, 2, 1]\) забор является симметричным. Так как если уложить все доски горизонтально, то получится забор \([5, 4, 3, 2, 1]\), как на картинке.  Слева забор \([5, 4, 3, 2, 1]\), справа этот же забор, уложенный горизонтально А для \(n = 3\), \(a = [4, 2, 1]\) забор не является симметричным. Так как если уложить все доски горизонтально, то получится забор \([3, 2, 1, 1]\), как на картинке.  Слева забор \([4, 2, 1]\), справа этот же забор, уложенный горизонтально Помогите Ане и выясните является ли ее забор симметричным. Выходные данные Для каждого набора входных данных выведите «YES», если забор симметричный, в противном случае выведите «NO». Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В первом и втором наборах входных данных примера забор является симметричным. В третьем наборе входных данных примера забор не является симметричным. Если уложить доски горизонтально, то получится забор \([3, 2, 1, 1]\). В четвертом наборе входных данных примера забор не является симметричным. Если уложить доски горизонтально, то получится забор \([1, 1]\). В пятом и шестом наборах входных данных примера забор является симметричным. В седьмом наборе входных данных примера забор не является симметричным. Если уложить доски горизонтально, то получится забор \([2, 1, 1, 1, 1, 1]\).
| |
|
|
G. Великий Уравнитель
Бинарный поиск
математика
сортировки
Структуры данных
*2000
Тёма приобрел на радиорынке старый прибор с маленьким экраном и потёртой надписью «Великий Уравнитель» на боковой стенке. Продавец сказал, что прибору на вход необходимо подать массив целых чисел \(a\), после чего «Великий Уравнитель» будет работать следующим образом: - Отсортировать текущий массив по неубыванию и выкинуть повторяющиеся элементы, оставляя только одно вхождение каждого элемента.
- Если текущая длина массива равна \(1\), прибор заканчивает работу и выводит на экран единственное число массива — результат работы прибора.
- Прибавить к текущему массиву арифметическую прогрессию {\(n,\ n - 1,\ n - 2,\ \ldots,\ 1\)}, где \(n\) — длина текущего массива. Иными словами, к \(i\)-у элементу массива, при нумерации с нуля, прибавится \(n - i\).
- Перейти к первому шагу.
Чтобы протестировать работу прибора, Тёма придумал некоторый массив целых чисел \(a\), после чего захотел проделать \(q\) операций с массивом \(a\) следующего вида: - Присвоить элементу \(a_i\) (\(1 \le i \le n\)) значение \(x\) (\(1 \le x \le 10^9\)).
- Подать на вход прибору массив \(a\) и узнать результат работы прибора, при этом во время работы прибора, массив \(a\) не изменяется.
Помогите Тёме узнать результат работы прибора после каждого запроса изменения. Выходные данные Для каждого набора входных данных выведите \(q\) целых чисел — результат работы прибора после каждого запроса изменения. Примечание Давайте рассмотрим первый пример входных данных. Сначала массив чисел, подаваемый на вход прибору будет равен \([6, 4, 8]\). Он будет меняться следующим образом: \(\)[6, 4, 8] \rightarrow [4, 6, 8] \rightarrow [7, 8, 9] \rightarrow [10, 10, 10] \rightarrow [10]\(\) Затем массив чисел, подаваемый на вход прибору будет равен \([6, 10, 8]\). Он будет меняться следующим образом: \(\)[6, 10, 8] \rightarrow [6, 8, 10] \rightarrow [9, 10, 11] \rightarrow [12, 12, 12] \rightarrow [12]\(\) Последний массив чисел, подаваемый на вход прибору будет равен \([6, 10, 1]\). Он будет меняться следующим образом: \(\)[6, 10, 1] \rightarrow [1, 6, 10] \rightarrow [4, 8, 11] \rightarrow [7, 10, 12] \rightarrow [10, 12, 13] \rightarrow [13, 14, 14] \rightarrow [13, 14] \rightarrow [15, 15] \rightarrow [15]\(\)
| |
|
|
B. Сортировка разбиением
жадные алгоритмы
математика
сортировки
*1100
Дана перестановка\(^{\dagger}\) \(p_1, p_2, \ldots, p_n\) целых чисел от \(1\) до \(n\). Вы можете изменять текущую перестановку, применяя к ней следующую операцию несколько (возможно, ноль) раз: - выбрать произвольное \(x\) (\(2 \le x \le n\));
- создать новую перестановку так:
- сначала выписать все элементы \(p\), значения которых меньше \(x\), без изменения их порядка;
- затем выписать все элементы \(p\), значения которых больше или равны \(x\), без изменения их порядка;
- заменить \(p\) этой полученной перестановкой.
Например, если изначально перестановка была \([6, 4, 3, 5, 2, 1]\) и выбрано \(x = 4\), то сначала нужно выписать \([3, 2, 1]\), затем справа дописать \([6, 4, 5]\). Так, изначальная перестановка будет заменена на \([3, 2, 1, 6, 4, 5]\). Найдите наименьшее число операций, необходимое для того, чтобы достичь равенства \(p_i = i\) для всех \(i = 1, 2, \ldots, n\). Можно показать, что ответ всегда существует. \(^{\dagger}\) Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)). Выходные данные Для каждого набора входных данных выведите ответ на отдельной строке. Примечание В первом наборе входных данных \(n = 1\) и \(p_1 = 1\), так что делать нечего. Во втором наборе входных данных можно выбрать \(x = 2\), и мы сразу получим \(p_1 = 1\), \(p_2 = 2\). В третьем наборе входных данных кратчайшей последовательностью операций является, например, следующая: - \(x = 4\): \([6, 4, 3, 5, 2, 1] \rightarrow [3, 2, 1, 6, 4, 5]\);
- \(x = 6\): \([3, 2, 1, 6, 4, 5] \rightarrow [3, 2, 1, 4, 5, 6]\);
- \(x = 3\): \([3, 2, 1, 4, 5, 6] \rightarrow [2, 1, 3, 4, 5, 6]\);
- \(x = 2\): \([2, 1, 3, 4, 5, 6] \rightarrow [1, 2, 3, 4, 5, 6]\).
| |
|
|
E. Спидран
графы
дп
жадные алгоритмы
математика
Перебор
поиск в глубину и подобное
сортировки
*2100
Вы играете в компьютерную игру, в которой есть \(n\) заданий, которые вам нужно выполнить. Однако \(j\)-е задание можно выполнить только в начале \(h_j\)-го часа игрового дня. Каждый игровой день длится ровно \(k\) часов. Часы каждого игрового дня пронумерованы числами \(0, 1, \ldots, k - 1\). После конца первого дня начинается следующий, и так далее. Между заданиями есть зависимости: для некоторых пар \((a_i, b_i)\) задание с номером \(b_i\) может быть выполнено только после выполнения задания с номером \(a_i\). Гарантируется, что циклических зависимостей нет, поскольку иначе игру пройти было бы невозможно и никто не стал бы в неё играть. Вы очень хорошо умеете играть в эту игру, поэтому вы можете выполнить любое число заданий за пренебрежимо малое время (т. е. вы можете выполнить любое число заданий в начале одного и того же часа, даже если между ними есть зависимости). Вам нужно выполнить все задания как можно быстрее. Вы можете выполнять их в любом доступном порядке. Время прохождения игры равно разнице между временем завершения последнего задания и временем завершения первого задания в этом порядке. Найдите наименьшее время, за которое можно пройти игру. Выходные данные Для каждого набора входных данных выведите одно число — наименьшее время, необходимое для прохождения игры. Примечание В первом наборе входных данных задания \(1\) и \(4\) нужно выполнить в начале \(12\)-го часа дня, но они не могут быть выполнены в течение одного часа, поскольку между ними нужно выполнить задания \(2\) и \(3\). Однако всё это можно сделать за \(24\) часа. Для этого можно начать в \(12\) часов первого игрового дня, выполнив первое задание. В \(16\) часов можно выполнить задание \(2\). В \(18\) часов можно выполнить задание \(3\). Наконец, в \(12\) часов следующего дня можно выполнить задание \(4\). С момента выполнения первого задания до момента выполнения последнего прошло \(24\) часа. В третьем наборе входных данных можно выполнить первое задание, а затем сразу же выполнить второе. Можно начать в \(5\) часов первого дня, выполнив первое задание. Сразу после этого становится доступным второе задание, его можно выполнять немедленно. Суммарное прошедшее время равно \(0\). В четвёртом наборе входных данных можно начать с третьего задания. Можно начать в \(555\) часов первого дня и закончить в \(35\) часов второго дня. Суммарное прошедшее время равно \(1035-555=480\).
| |
|
|
B. Обмен и разворот
жадные алгоритмы
Конструктив
сортировки
Строки
*1100
Дана строка \(s\) длины \(n\), состоящая из строчных латинских букв, а также целое число \(k\). За один шаг вы можете выполнить одну любую операцию из следующих двух: - Выбрать индекс \(i\) (\(1 \le i \le n - 2\)), затем поменять местами \(s_{i}\) и \(s_{i+2}\).
- Выбрать индекс \(i\) (\(1 \le i \le n-k+1\)), затем развернуть порядок следования букв на отрезке \([i,i+k-1]\) строки. Формально, если строка в текущий момент равна \(s_1\ldots s_{i-1}s_is_{i+1}\ldots s_{i+k-2}s_{i+k-1}s_{i+k}\ldots s_{n-1}s_n\), то она заменяется на \(s_1\ldots s_{i-1}s_{i+k-1}s_{i+k-2}\ldots s_{i+1}s_is_{i+k}\ldots s_{n-1}s_n\).
Вы можете сделать произвольное (возможно, нулевое) число шагов. Найдите лексикографически наименьшую строку, которую можно получить после какого-либо числа шагов. Строка \(a\) лексикографически меньше строки \(b\) такой же длины, если выполняется следующее: - в первой позиции, где \(a\) и \(b\) различны, в строке \(a\) находится буква, которая встречается в алфавите раньше, чем соответствующая буква в \(b\).
Выходные данные Для каждого набора входных данных выведите лексикографически наименьшую строку, которую можно получить после какого-либо (возможно, нулевого) числа шагов. Примечание В первом наборе входных данных можно получить строку «aimn», выполняя следующие операции: - Развернуть отрезок \([3,4]\). Строка превратится в «niam».
- Поменять местами \(s_1\) и \(s_3\). Строка превратится в «ainm».
- Развернуть отрезок \([3,4]\). Строка превратится в «aimn».
Можно доказать, что невозможно получить строку, лексикографически меньшую, чем «aimn». Значит, «aimn» и является ответом. Во втором наборе входных данных можно получить строку «aandp», выполняя следующие операции: - Поменять местами \(s_3\) и \(s_5\). Строка превратится в «paadn».
- Поменять местами \(s_1\) и \(s_3\). Строка превратится в «aapdn».
- Поменять местами \(s_3\) и \(s_5\). Строка превратится в «aandp».
Можно доказать, что невозможно получить строку, лексикографически меньшую, чем «aandp». Значит, «aandp» и является ответом.
| |
|
|
E. Угадайка
битмаски
Деревья
игры
математика
сортировки
Строки
Структуры данных
Теория вероятностей
*2100
У Кэрол есть последовательность \(s\) из \(n\) неотрицательных целых чисел. Она хочет сыграть с Алисой и Бобом в «Угадайку». Игра устроена следующим образом. Сначала Кэрол случайно выберет два целых индекса \(i_a\) и \(i_b\) из диапазона \([1, n]\) и обозначит \(a=s_{i_a}\), \(b=s_{i_b}\). Обратите внимание: \(i_a\) и \(i_b\) могут совпасть. Затем Кэрол сообщит: - значение \(a\) — Алисе;
- значение \(b\) — Бобу;
- значение \(a \mid b\) и Алису и Бобу, где \(|\) обозначает операцию побитового ИЛИ.
Обратите внимание: Кэрол не сообщит никакой информации об \(s\) ни Алисе, ни Бобу. Затем начинается процесс угадывания. Алиса и Боб ходят по очереди, причём первой ходит Алиса. Цель обоих игроков — выяснить, какое из утверждений верно: \(a < b\), \(a > b\), или \(a = b\). На своём ходу игрок может сделать одно из двух: - сказать «Я не знаю» и передать ход другому игроку;
- сказать «Я знаю», а затем сообщить ответ: «\(a<b\)», «\(a>b\)», или же «\(a=b\)»; после этого игра заканчивается.
Алиса и Боб слышат фразы друг друга и могут использовать их в своих рассуждениях. Оба игрока достаточно умны. Сказать «Я знаю» они могут только в том случае, если точно уверены в ответе. Найдите математическое ожидание числа шагов в такой игре. Выведите ответ по модулю \(998\,244\,353\). Формально, пусть \(M = 998\,244\,353\). Можно показать, что ответ может быть представлен в виде несократимой дроби \(\frac{p}{q}\), где \(p\) и \(q\) — целые числа, и \(q \not \equiv 0 \pmod{M}\). Выведите целое число, равное \(p \cdot q^{-1} \bmod M\). Другими словами, выведите такое целое число \(x\), что \(0 \le x < M\) и \(x \cdot q \equiv p \pmod{M}\). Выходные данные Для каждого набора входных данных выведите одно число — ответ на задачу по модулю \(998\,244\,353\). Примечание В первом наборе входных данных есть всего \(4\) возможные ситуации: - \(i_a=1\), \(i_b=1\), \(a=2\), \(b=2\), число шагов равно \(2\);
- \(i_a=1\), \(i_b=2\), \(a=2\), \(b=3\), число шагов равно \(3\);
- \(i_a=2\), \(i_b=1\), \(a=3\), \(b=2\), число шагов равно \(2\);
- \(i_a=2\), \(i_b=2\), \(a=3\), \(b=3\), число шагов равно \(3\).
Математическое ожидание числа шагов равно \(\frac{2+3+2+3}{4}=\frac{5}{2}=499122179\pmod{998244353}\). Рассмотрим первый случай, когда \(a=2\), \(b=2\). Процесс угадывания происходит следующим образом. На первом ходу Алиса думает так: «Я знаю, что \(a=2, a\mid b=2\). Можно сделать вывод, что \(b=0\) или \(b=2\), но какой из этих двух случаев имеет место — пока неясно». Поэтому она говорит: «Я не знаю». На втором ходу Боб думает так: «Я знаю, что \(b=2, a\mid b=2\). Можно сделать вывод, что \(a=0\) или \(a=2\). Однако если \(a=0\), то Алиса на своём ходу уже бы сказала, что \(a<b\). Но она этого не сказала. Значит, \(a=2\)». Поэтому он говорит: «Я знаю, \(a=b\)». Игра завершается. Во втором наборе входных данных, при \(a=0\), \(b=0\), Алиса сразу заключает, что \(a=b\). Ожидаемое число ходов равно \(1\).
| |
|
|
F. Экзотические запросы
реализация
сортировки
Структуры данных
*2300
AquaMoon дала RiverHamster последовательность целых чисел \(a_1,a_2,\dots,a_n\), а RiverHamster задал вам \(q\) запросов. Каждый запрос характеризуется двумя целыми числами \(l\) и \(r\). При ответе на каждый запрос вы можете выбрать любой непрерывный отрезок последовательности и вычесть из всех его элементов одно и то же неотрицательное число. Выполнять эту операцию можно несколько (возможно, ноль) раз. Однако нельзя выбрать два пересекающихся отрезка, которые были бы не вложены друг в друга. Ваша задача — превратить в \(0\) все числа, у которых изначальное значение лежало в диапазоне \([l, r]\). Сделать это нужно за наименьшее число операций. Обратите внимание, что запросы независимы, числа в массиве возвращаются к своим первоначальным значениям между запросами. Формально, для каждого запроса нужно найти наименьшее \(m\), для которого существует последовательность \(\{(x_j,y_j,z_j)\}_{j=1}^{m}\), удовлетворяющая следующим условиями: - для любого \(1 \le j \leq m\) выполняется \(z_j \ge 0\) и \(1 \le x_j \le y_j \leq n\) (здесь \([x_j, y_j]\) представляют отрезки в последовательности);
- для любых \(1 \le j < k \le m\) выполняется \([x_j,y_j]\subseteq[x_{k},y_{k}]\), \([x_k,y_k]\subseteq[x_{j},y_{j}]\), или \([x_j,y_j]\cap[x_{k},y_{k}]=\varnothing\);
- для любого \(1 \le i \le n\), такого что \(l \le a_i \leq r\), выполняется \(\){\large a_i = \sum\limits_{\substack {1 \le j \le m \\ x_j \le i \le y_j}} z_j. }\(\)
Выходные данные Выведите ответ на каждый запрос на отдельной строке. Примечание В первом наборе входных данных рассмотрим второй запрос: \(l = 2\), \(r = 2\). Элементы, которые нужно обнулить, суть \([a_3, a_5, a_{10}] = [2, 2, 2]\). Достаточно применить последовательность операций \(\{(2, 10, 2)\}\). В четвёртом запросе \(l = 2\), \(r = 3\). Обнулить нужно элементы \([a_3, a_4, a_5, a_7, a_{10}] = [2, 3, 2, 3, 2]\). Достаточно применить последовательность операций \(\{(1, 10, 2), (4, 4, 1), (7, 7, 1)\}\). Во втором наборе входных данных можно заметить, что последовательность операций \(\{(1, 2, 1), (2, 3, 2)\}\) не является допустимой, потому что два используемых отрезка пересекаются, но не вложены один в другой.
| |
|
|
F. Freak Joker Process
Бинарный поиск
сортировки
Структуры данных
*3100
After the success of the basketball teams formed and trained by Pak Chanek last year (Basketball Together), Pak Chanek wants to measure the performance of each player that is considered as a superstar. There are \(N\) superstar players that have been trained by Pak Chanek. At the end of the season, some calculations will be made on the performance of the \(N\) players using an international method. Each player has two values \(A_i\) and \(B_i\) where each represents the offensive and defensive value of that player. Define \(\text{RankA}(i)\) as the offensive ranking of the \(i\)-th player, whose value is \(c+1\) with \(c\) here representing the number of \(j\) (\(1 \leq j \leq N\)) such that \(A_j>A_i\). Define \(\text{RankB}(i)\) as the defensive ranking of the \(i\)-th player, whose value is \(c+1\) with \(c\) here representing the number of \(j\) (\(1 \leq j \leq N\)) such that \(B_j>B_i\). Define \(\text{RankOverall}(i)\) as the overall ranking of the \(i\)-th player, whose value is \(c+1\) with \(c\) here representing the number of \(j\) (\(1 \leq j \leq N\)) such that \(\text{RankA}(j)+\text{RankB}(j)<\text{RankA}(i)+\text{RankB}(i)\). During the next \(Q\) days, exactly one event will happen on each day. Each event is one of the three following possibilities: - 1 k c – If \(c\) is +, then \(A_k\) increases by \(1\). If \(c\) is -, then \(A_k\) decreases by \(1\). (\(1\leq k\leq N\); \(c\) is + or -)
- 2 k c – If \(c\) is +, then \(B_k\) increases by \(1\). If \(c\) is -, then \(B_k\) decreases by \(1\). (\(1\leq k\leq N\); \(c\) is + or -)
- 3 k – Pak Chanek wants to know the value of \(\text{RankOverall}(k)\) at that moment. (\(1\leq k\leq N\))
Output For each event of type \(3\), output a line containing an integer representing the value of \(\text{RankOverall}(k)\) at that moment. Note At the \(8\)-th event, \(A=[3,2,1,3,2]\) and \(B=[3,6,1,4,1]\). It can be obtained that the values of \(\text{RankA}\) and \(\text{RankB}\) for each player are as follows: - \(\text{RankA}(1)=1\), \(\text{RankB}(1)=3\)
- \(\text{RankA}(2)=3\), \(\text{RankB}(2)=1\)
- \(\text{RankA}(3)=5\), \(\text{RankB}(3)=4\)
- \(\text{RankA}(4)=1\), \(\text{RankB}(4)=2\)
- \(\text{RankA}(5)=3\), \(\text{RankB}(5)=4\)
So it can be obtained that \(\text{RankOverall}(1)=2\).
| |
|
|
A. green_gold_dog, массив и перестановка
Конструктив
сортировки
*800
У green_gold_dog есть массив \(a\) длины \(n\), он хочет найти перестановку \(b\) длины \(n\) такую, чтобы количество различных чисел в поэлементной разности массива \(a\) и перестановки \(b\) было максимально. Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)). Поэлементная разность двух массивов \(a\) и \(b\) длины \(n\) — это массив \(c\) длины \(n\), где \(c_i\) = \(a_i - b_i\) (\(1 \leq i \leq n\)). Выходные данные Для каждого набора входных данных выведете \(n\) чисел — подходящую перестановку \(b\). Если существует несколько решений, выведите любое из них. Примечание В первом наборе входных данных поэлементная разность массивов равна [99999], тут один различный элемент, очевидно что в массиве длинны один не может быть более одного различного элемента Во втором наборе входных данных поэлементная разность массивов равна [-1, 0], тут два различных элемента, очевидно что в массиве длинны два не может быть более двух различных элементов В третьем наборе входных данных поэлементная разность массивов равна [9, 0, 1], тут три различных элемента, очевидно что в массиве длинны три не может быть более трёх различных элементов
| |
|
|
B. 2D Путешествие
геометрия
кратчайшие пути
математика
сортировки
*1100
Piggy живет на бесконечной плоскости с декартовой системой координат. На плоскости есть \(n\) городов, пронумерованных от \(1\) до \(n\), и первые \(k\) городов являются крупными. Координаты \(i\)-го города равны \((x_i,y_i)\). Piggy, как опытный путешественник, хочет совершить расслабляющую поездку после экзамена. В данный момент он находится в городе \(a\), и хочет добраться до города \(b\) на самолете. Между любыми двумя городами можно совершить перелёт, а также можно посещать несколько городов во время путешествия, но конечным пунктом должен быть город \(b\). Из-за активной торговли между крупными городами можно путешествовать на самолете между ними бесплатно. Формально, цена авиабилета \(f(i,j)\) между двумя городами \(i\) и \(j\) определяется следующим образом: \(\) f(i,j)= \begin{cases} 0, & \text{если оба города }i \text{ и }j \text{ являются крупными городами} \\ |x_i-x_j|+|y_i-y_j|, & \text{в противном случае} \end{cases} \(\) Piggy не хочет экономить время, но хочет сэкономить деньги. Поэтому вам нужно сказать ему минимальное значение суммарной стоимости всех авиабилетов, если он может совершить произвольное количество перелётов. Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное значение суммарной стоимости всех авиабилетов. Примечание В первом наборе входных данных: Крупные города отмечены красным. Оптимальный способ выбора перелётов: \(3\rightarrow 1 \rightarrow 2 \rightarrow 5\), что будет стоить \(3+0+1=4\). Обратите внимание, что перелёт \(1\rightarrow 2\) стоит \(0\), потому что города \(1\) и \(2\) являются крупными городами. Во втором наборе входных данных, так как всего \(2\) города, единственный способ — совершить перелёт из города \(1\) в город \(2\). В третьем наборе входных данных, так как города \(2\) и \(4\) являются крупными городами, Piggy может взять прямой рейс из города \(2\) в город \(4\), что будет стоить \(0\). В четвертом наборе входных данных, Piggy может совершить перелёты \(3\rightarrow 2\rightarrow 1\), и стоимость будет \(11+11=22\).
| |
|
|
D. Покупка префиксов
жадные алгоритмы
реализация
сортировки
*1800
У вас есть массив \(a\) размера \(n\), изначально заполненный нулями (\(a_1 = a_2 = \ldots = a_n = 0\)). Также у вас есть массив целых чисел \(c\) размера \(n\). Изначально у вас есть \(k\) монет. Заплатив \(c_i\) монет, вы можете прибавить \(1\) ко всем элементам массива \(a\) с первого по \(i\)-й (\(a_j \mathrel{+}= 1\) для всех \(1 \leq j \leq i\)). Покупать любое \(c_i\) можно произвольное число раз. Покупка возможна только при \(k \geq c_i\), то есть в любой момент должно выполняться \(k \geq 0\). Найдите лексикографически наибольший массив \(a\), который возможно получить. Массив \(a\) лексикографически меньше массива \(b\) такой же длины, если и только если в первой позиции, где \(a\) и \(b\) различны, в массиве \(a\) элемент меньше, чем соответствующий элемент в \(b\). Выходные данные На каждый набор входных данных выведите \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) — лексикографически наибольший массив \(a\), который можно получить. Примечание В первом наборе входных данных \(a_1\) не может быть больше \(5\), а если пять раз купить \(c_1\), то у нас не останется денег, поэтому \(a = [5, 0, 0]\). Во втором наборе входных данных \(a_1\) не может быть больше \(2\), при этом мы можем купить \(c_1\) и \(c_2\) по одному разу (купить \(c_2\) дважды не получится), поэтому \(a = [2, 1]\).
| |
|
|
E. Построение аквариума
Бинарный поиск
сортировки
*1100
Вы любите рыб, поэтому решили построить аквариум. У вас есть кусок коралла, состоящий из \(n\) колонн, \(i\)-я из которых имеет высоту \(a_i\) единиц. Затем вы построите вокруг коралла аквариум следующим образом: - Выберите целое число \(h \geq 1\) — высоту аквариума. Постройте стены высотой \(h\) с обеих сторон аквариума.
- Затем заполните аквариум водой так, чтобы высота каждой колонны была равна \(h\), если только коралл не выше \(h\); в этом случае в эту колонну вода добавляться не должна.
Например, с \(a=[3,1,2,4,6,2,5]\) и высотой \(h=4\), вы потратите в общей сложности \(w=8\) единиц воды, как показано на рисунке. Вы можете использовать не более \(x\) единиц воды для заполнения аквариума, но вы хотите построить наибольший возможный аквариум. Какое наибольшее значение \(h\) вы можете выбрать? Выходные данные Для каждого набора входных данных выведите одно положительное целое число \(h\) (\(h \geq 1\)) — максимальную высоту аквариума, для заполнения которого вам потребуется не более \(x\) единиц воды. Можно доказать, что при таких ограничениях всегда существует такое значение \(h\). Примечание Первый пример изображен в условии. С \(h=4\) нам потребуется \(8\) единиц воды, но если увеличить \(h\) до \(5\), нам потребуется \(13\) единиц воды, что больше, чем \(x=9\). Поэтому оптимальное значение \(h=4\). Во втором примере случае мы можем выбрать \(h=4\) и добавить \(3\) единицы к каждой колонне, используя в общей сложности \(9\) единиц воды. Можно показать, что это оптимально. В третьем примере случае мы можем выбрать \(h=2\) и использовать всю нашу воду, поэтому это оптимально.
| |
|
|
A. Шлемы в светлой ночи
жадные алгоритмы
сортировки
*1000
Пак Чанек — староста деревни Кхунтиен. В одну из ночей, наполненную светом, Пак Чанек неожиданно получил важное объявление, которое необходимо сообщить всем \(n\) жителям Кхунтиена. Сначала Пак Чанек передает объявление непосредственно одному или нескольким жителям, заплатив \(p\) за каждого человека. После этого жители могут передать объявление другим жителям с помощью волшебного устройства в виде шлема. Однако за использование шлема придется заплатить. Для каждого \(i\), если \(i\)-й житель хотя бы раз получал объявление (либо непосредственно от Пак Чанека, либо от другого жителя), то он может передать его не более чем \(a_i\) другим жителям, заплатив \(b_i\) за каждую передачу. Если Пак Чанек может также контролировать, как жители передают объявление другим жителям, то какова минимальная стоимость того, чтобы Пак Чанек оповестил всех \(n\) жителей Кхунтиена об объявлении? Выходные данные Для каждого набора входных данных выведите в отдельной строке минимальную стоимость уведомления всех \(n\) жителей Хунтина об объявлении. Примечание В первом наборе исходных данных возможной оптимальной стратегией является следующая: - Пак Чанек передает объявление непосредственно \(3\)-му, \(5\)-му и \(6\)-му жителю. Это требует затрат в размере \(p+p+p=3+3+3=9\).
- Житель \(3\) передает сообщение жителям \(1\) и \(2\). Это требует затрат в размере \(b_3+b_3=2+2=4\).
- \(2\)-й житель передает объявление \(4\)-му. Это требует затрат \(b_2=3\).
Общая стоимость составляет \(9+4+3=16\). Можно показать, что не существует стратегии с меньшими затратами.
| |
|
|
B. Эффект от крема против прыщей
Комбинаторика
сортировки
теория чисел
*1500
У Чанеки есть массив \([a_1,a_2,\ldots,a_n]\). Изначально все элементы покрашены в белый. Чанека выберет один или несколько различных индексов и покрасит элементы с этими индексами в черный цвет. Затем она выберет все белые элементы, чьи индексы кратны индексу по крайней мере одного черного элемента, и покрасит их в зеленый цвет. После этого ее оценка будет равна максимальному значению \(a_i\) среди всех черных и зеленых элементов. Существует \(2^n-1\) способов выбрать черные индексы. Найдите сумму оценок для всех возможных способов, которыми Чанека может выбрать черные индексы. Поскольку ответ может быть очень большим, выведите его по модулю \(998\,244\,353\). Выходные данные Выведите одно целое число — сумму оценок по всем способам выбрать черные индексы по модулю \(998\,244\,353\). Примечание В первом примере ниже перечислены \(15\) возможных вариантов выбора черных индексов: - Индекс \(1\) - черный. Индексы \(2\), \(3\) и \(4\) - зеленые. Максимальное значение среди них - \(19\).
- Индекс \(2\) - черный. Индекс \(4\) - зеленый. Максимальное значение среди них - \(14\).
- Индекс \(3\) - черный. Максимальное значение среди них - \(19\).
- Индекс \(4\) - черный. Максимальное значение среди них - \(9\).
- Индексы \(1\) и \(2\) - черные. Индексы \(3\) и \(4\) - зеленые. Максимальное значение среди них - \(19\).
- Индексы \(1\) и \(3\) - черные. Индексы \(2\) и \(4\) - зеленые. Максимальное значение среди них - \(19\).
- Индексы \(1\) и \(4\) - черные. Индексы \(2\) и \(3\) - зеленые. Максимальное значение среди них - \(19\).
- Индексы \(2\) и \(3\) - черные. Индекс \(4\) - зеленый. Максимальное значение среди них - \(19\).
- Индексы \(2\) и \(4\) - черные. Максимальное значение среди них - \(14\).
- Индексы \(3\) и \(4\) - черные. Максимальное значение среди них - \(19\).
- Индексы \(1\), \(2\) и \(3\) - черные. Индекс \(4\) - зеленый. Максимальное значение среди них - \(19\).
- Индексы \(1\), \(2\) и \(4\) - черные. Индекс \(3\) - зеленый. Максимальное значение среди них - \(19\).
- Индексы \(1\), \(3\) и \(4\) - черные. Индекс \(2\) - зеленый. Максимальное значение среди них - \(19\).
- Индексы \(2\), \(3\) и \(4\) - черные. Максимальное значение среди них - \(19\).
- Индексы \(1\), \(2\), \(3\) и \(4\) - черные. Максимальное значение среди них - \(19\).
Общая сумма составляет \(19+14+19+9+19+19+19+19+14+19+19+19+19+19+19 = 265\).
| |
|
|
C. Автосинтез
графы
жадные алгоритмы
Конструктив
поиск в глубину и подобное
сортировки
*2100
Ханека написала массив \(a\) из \(n\) целых положительных чисел. Изначально ни один элемент не обведён. За одну операцию Ханека может обвести один элемент. Один и тот же элемент можно обвести несколько раз. После выполнения всех операций Ханека составляет последовательность \(r\), состоящую из всех не обведенных элементов \(a\) в порядке возрастания их индексов. Также Ханека составляет другую последовательность \(p\), длина которой равна количеству выполненных операций, а \(p_i\) — индекс элемента, обведенного в кружок при выполнении \(i\)-й операции. Ханека хочет выполнить несколько операций так, чтобы последовательность \(r\) была равна последовательности \(p\). Помогите ей добиться этого или сообщите, если это невозможно! Обратите внимание, что если решений несколько, то можно вывести любое из них. Выходные данные Выведите одно число \(-1\), если это невозможно. В противном случае вывод состоит из двух строк. Первая строка содержит целое число \(z\), равное количеству выполненных операций. Вторая строка содержит \(z\) целых чисел, причем \(i\)-е целое число представляет собой индекс элемента, обведенного кружком в \(i\)-й операции. Если решений несколько, то можно вывести любое из них. Примечание В первом примере выполнение операций, аналогичных приведенным в примере, дает следующие результаты: - Элемент \(a_2\) обводится \(1\) раз.
- Элемент \(a_3\) обводится \(2\) раза.
- Необведёнными элементами (упорядоченными по индексам) являются \(a_1\), \(a_4\) и \(a_5\). Таким образом, \(r=[3,2,3]\).
- \(p=[3,2,3]\)
Следовательно, \(r=p\). Во втором примере это невозможно.
| |
|
|
G2. Танцы (сложная версия)
Бинарный поиск
жадные алгоритмы
сортировки
*1900
Это сложная версия задачи. Единственное различие состоит в том, что в этой версии \(m \leq 10^9\). Вам даны два массива целых чисел \(a_1, a_2, \ldots, a_n\) и \(b_1, b_2, \ldots, b_n\). До начала применения операций вы можете переупорядочить элементы каждого из массивов как угодно. Дальше за одну операцию вы делаете оба следующих действия, если массивы не пусты: - Выбрать любой элемент из массива \(a\) и удалить его (все остальные элементы в том же порядке сдвигаются в один новый массив \(a\)),
- Выбрать любой элемент из массива \(b\) и удалить его (все остальные элементы в том же порядке сдвигаются в один новый массив \(b\)).
Пусть \(k\) — итоговый размер обоих массивов. Вам нужно найти наименьшее количество операций, чтобы выполнялось \(a_i < b_i\) для всех \(1 \leq i \leq k\). Эта задача была слишком проста и автор задачи решил ее усложнить. Вам также дано натуральное число \(m\). Теперь вам нужно найти сумму ответов на задачу для \(m\) пар массивов \((c[i], b)\), где \(1 \leq i \leq m\). Массив \(c[i]\) получается из \(a\) следующим образом: - \(c[i]_1 = i\),
- \(c[i]_j = a_j\), для \(2 \leq j \leq n\).
Выходные данные Для каждого набора входных данных выведите суммарное количество наименьших операций по всем парам массивов \((c_i, b)\). Примечание В первом наборе входных данных: - Для пары массивов \(([1, 1], [3, 2])\) ответ \(0\). Можно не применять операции и не переставлять элементы.
- Для пары массивов \(([2, 1], [3, 2])\) ответ \(0\). Можно переставить элементы первого массива, получить \([1, 2)\). Операции применять не нужно.
- Для пары массивов \(([3, 1], [3, 2])\) ответ \(1\). Можно удалить \(3\) из первого массива и \(2\) из второго.
- Для пары массивов \(([4, 1], [3, 2])\) ответ \(1\). Можно удалить \(4\) из первого массива и \(3\) из второго.
| |
|
|
C. Средняя конструкция
дп
жадные алгоритмы
Перебор
сортировки
Структуры данных
*1700
Массив \(a_1, a_2, \ldots, a_m\) изначально заполнен нулями. Вам даны \(n\) попарно различных отрезков \(1 \le l_i \le r_i \le m\). Вы должны выбрать произвольное подмножество этих отрезков (в частности, можно выбрать пустое множество). После этого происходит следующее: - Для каждого \(i = 1, 2, \ldots, n\), если отрезок \((l_i, r_i)\) выбран в подмножество, то для каждого индекса \(l_i \le j \le r_i\) вы увеличиваете \(a_j\) на \(1\) (то есть \(a_j\) заменяете на \(a_j + 1\)). Если отрезок \((l_i, r_i)\) не выбран, массив не изменяется.
- После этого (после обработки всех значений \(i = 1, 2, \ldots, n\)) вы считаете \(\max(a)\) как максимальное значение среди всех элементов \(a\). Аналогично, \(\min(a)\) считается как минимальное значение.
- Наконец, стоимость выбранного подмножества отрезков объявляется равной \(\max(a) - \min(a)\).
Найдите наибольшую стоимость по всем подмножествам данного множества отрезков. Выходные данные Для каждого набора входных данных выведите наибольшую стоимость среди всех подмножеств данного множества отрезков. Примечание В первом наборе входных данных доступен всего один отрезок. Если его не выбирать, то массив будет равен \(a = [0, 0, 0]\), стоимость такого (пустого) подмножества отрезков равна \(0\). Если же выбрать единственный доступный отрезок, то массив станет равен \(a = [0, 1, 0]\), и стоимость будет равна \(1 - 0 = 1\). Во втором наборе входных данных можно выбрать все отрезки: массив в таком случае будет равен \(a = [0, 1, 2, 3, 2, 1, 0, 0]\). Стоимость будет равна \(3 - 0 = 3\).
| |
|
|
E. I Wanna be the Team Leader
битмаски
дп
жадные алгоритмы
Конструктив
математика
сортировки
*2400
Монокарп является руководителем команды в крупной IT-компании. Его команде программистов поручены \(m\) проектов, пронумерованных от \(1\) до \(m\). У \(i\)-го проекта уровень сложности \(b_i\). В команде \(n\) программистов, пронумерованных от \(1\) до \(n\). У \(j\)-го программиста уровень стрессоустойчивости \(a_j\). Монокарп хочет назначить программистов на проекты таким образом, чтобы: - каждый программист был назначен на не более чем один проект;
- на каждый проект был назначен хотя бы один программист;
- пусть на \(i\)-й проект назначены \(k\) программистов; тогда все назначенные программисты должны иметь уровень стрессоустойчивости, больший или равный \(\frac{b_i}{k}\).
Помогите Монокарпу назначить программистов на проекты. Если есть несколько ответов, выведите любой из них. Выходные данные Если нельзя назначить программистов, выведите «NO». В противном случае, в первой строке выведите «YES». В \(i\)-й из следующих \(m\) строк выведите список программистов, назначенных на \(i\)-й проект: сначала количество программистов, затем их индексы в произвольном порядке. Если есть несколько ответов, выведите любой из них.
| |
|
|
B. План подключения от Дореми
жадные алгоритмы
Конструктив
математика
сортировки
*1700
Дореми живёт в стране, состоящей из \(n\) городов, пронумерованных от \(1\) до \(n\), причём в \(i\)-м городе живёт \(a_i\) человек. Страну можно смоделировать в виде неориентированного графа с \(n\) вершинами. Изначально в графе нет рёбер. Дореми хочет сделать граф связным. Для этого она может добавить ребро между \(i\) и \(j\), если \(\) \sum_{k \in S} a_k \ge i\cdot j \cdot c, \(\) где \(S\) — множество всех вершин, которые в данный момент находятся в одной компоненте связности либо с \(i\) или с \(j\), а \(c\) — фиксированная константа. Может ли Дореми сделать граф связным? Две вершины \((i, j)\) находятся в одной компоненте связности, если существует путь из \(i\) в \(j\). Граф является связным, если все его вершины находятся в одной компоненте связности. Выходные данные Для каждого набора входных данных выведите «YES» (без кавычек), если возможно сделать граф связным, и «NO» (без кавычек) в противном случае. Буквы можно выводить в любом регистре (верхнем или нижнем). Примечание В первом наборе входных данных Дореми может добавлять ребра в следующем порядке: - Добавить \((1,2)\). Эта операция допустима, так как \(a_1 + a_2 = 20 \ge i\cdot j \cdot c = 20\).
- Добавить \((1,3)\). Эта операция допустима, так как \(a_1 + a_2 + a_3 = 35 \ge i \cdot j \cdot c = 30\).
- Добавить \((1,4)\). Эта операция допустима, так как \(a_1 + a_2 + a_3 + a_4 = 45 \ge i \cdot j \cdot c = 40\).
Во втором наборе входных данных Дореми может добавить ребро \((1,2)\), так как \(a_1 + a_2 =2 \ge 1 \cdot 2 \cdot 1\). После этого граф становится связным. В третьем наборе входных данных Дореми может добавлять ребра в порядке \((5,4)\), \((5,3)\), \((5,2)\) и \((5,1)\). В четвертом наборе входных данных Дореми вообще не может добавить ни одного ребра.
| |
|
|
C1. План осушения от Дореми (простая версия)
дп
жадные алгоритмы
Перебор
сортировки
Структуры данных
*2000
Единственное различие между двумя версиями этой задачи — ограничение на \(k\), ограничение по времени и ограничение по памяти. Делать взломы можно только в том случае, если решены обе версии задачи. Дореми живет в дождливой стране, состоящей из \(n\) городов, пронумерованных от \(1\) до \(n\). По метеорологической трансляции было предсказано распределение дождей в ближайшие \(m\) дней. В \(i\)-й день дождь пойдет в городах, находящихся на отрезке \([l_i, r_i]\). Город называется сухим, если в ближайшие \(m\) дней в нем не будет дождя. Оказалось, что Дореми обладает особой способностью. Она может выбрать \(k\) (в простой версии: \(k = 2\)) дней, и в течение этих дней дождя не будет. Дореми хочет вычислить максимальное количество сухих городов после использования специальной силы. Выходные данные Для каждого набора входных данных выведите одно целое число — максимальное количество сухих городов. Примечание В первом наборе входных данных, если Дореми использует свою силу в дни - \(1,2\), то город \(2\) будет сухим;
- \(2,3\), то ни один город не будет сухим;
- \(1,3\), то ни один город не будет сухим;
Таким образом, существует не более \(1\) сухого города. Во втором наборе входных данных, если Дореми предотвращает - дождь в дни \(1,2\), то города \(1,2\) будут сухими;
- дождь в дни \(2,3\), то города \(4,5\) будут сухими;
- дождь в дни \(1,3\), то города \(1,5\) будут сухими.
Таким образом, существует не более \(2\) сухих городов. В третьем наборе входных данных оптимальным является предотвращение дождя в дни \(2,5\). В четвертом наборе входных данных всегда есть \(4\) дня дождя, которые промочат все города, вне зависимости от использования силы.
| |
|
|
A. Сортировка двойками
Конструктив
сортировки
*800
Дан массив целых чисел \(a_1, a_2, \ldots, a_n\). За одну операцию вы делаете следующее: - Выбираете неотрицательное целое число \(m\), такое что \(2^m \leq n\).
- Вычитаете \(1\) из \(a_i\) для всех целых \(i\), таких что \(1 \leq i \leq 2^m\).
Вам нужно определить можно ли отсортировать массив по неубыванию, выполнив некоторое число (возможно ноль) операций? Массив называется неубывающим, если \(a_i \leq a_{i + 1}\) для всех целых \(i\), таких что \(1 \leq i \leq n - 1\). Выходные данные Для каждого набора входных данных выведите «YES» если можно отсортировать массив, и «NO» иначе. Примечание В первом наборе входных данных массив уже отсортирован по неубыванию, к нему можно не применять никаких действий. Во втором наборе входных данных можно выбрать \(m = 1\) два раза и получить массив \([4, 3, 3, 4, 4]\). Затем можно выбрать \(m = 0\) один раз и получить отсортированный по неубыванию массив \([3, 3, 3, 4, 4]\). В третьем наборе входных данных можно выбрать \(m = 0\) один раз и получить массив \([5, 5, 5, 7, 5, 6, 6, 8, 7]\). Далее можно выбрать \(m = 2\) два раза и получить массив \([3, 3, 3, 5, 5, 6, 6, 8, 7]\). Затем выбрать \(m = 3\) один раз и получить отсортированный по неубыванию массив \([2, 2, 2, 4, 4, 5, 5, 7, 7]\). В четвертом и пятом наборе входных данных можно доказать, что нельзя отсортировать массив этими операциями.
| |
|
|
B. Дежавю
математика
Перебор
сортировки
*1100
Дан массив \(a\) длины \(n\), состоящий из целых положительных чисел и массив \(x\) длины \(q\), также состоящий из целых положительных чисел. Происходят \(q\) изменений. На \(i\)-м изменении (\(1 \leq i \leq q\)) для каждого \(j\) (\(1 \leq j \leq n\)), такого что \(a_j\) делится на \(2^{x_i}\), к \(a_j\) прибавляется \(2^{x_i-1}\). Обратите внимание, \(x_i\) (\(1 \leq x_i \leq 30\)) — целое положительное число, не превосходящее 30. После всех запросов изменения нужно вывести итоговый массив. Выходные данные Для каждого набора входных данных выведите массив после всех изменений. Примечание В первом наборе входных данных первая операция изменения прибавит \(2\) к числам на позициях \(4\) и \(5\). После этого прибавления массив будет выглядеть так: \([1, 2, 3, 6, 6]\). Остальные операции не будут изменять массив. Во втором наборе входных данных первая операция не изменит массив. Вторая операция изменения прибавит \(8\) к числу на позиции \(5\), а массив будет выглядеть так: \([7, 8, 12, 36, 56, 6, 3]\). Третья операция изменения прибавит \(2\) к числам на позициях \(2, 3\), \(4\) и \(5\). Массив будет выглядеть так: \([7, 10, 14, 38, 58, 6, 3]\).
| |
|
|
C. Смайло и монстры
Бинарный поиск
жадные алгоритмы
Конструктив
сортировки
*1500
Мальчик Смайло играет в новую игру! В игре есть \(n\) орд монстров, в \(i\)-й орде \(a_i\) монстров. Цель игры — уничтожить всех монстров. Для этого у вас есть два типа атак и счетчик комбо \(x\), изначально равный \(0\): - Первый тип атаки: вы выбираете число \(i\) от \(1\) до \(n\) такое, что в орде с номером \(i\) остался хотя бы один монстр. Затем вы убиваете одного монстра из орды с номером \(i\), и счетчик комбо \(x\) увеличивается на \(1\).
- Второй тип атаки: вы выбираете число \(i\) от \(1\) до \(n\) такое, что в орде с номером \(i\) осталось хотя бы \(x\) монстров. Затем вы применяете ультимейт и убиваете \(x\) монстров из орды под номером \(i\). После этого \(x\) обнуляется.
Ваша задача — зачистить всех монстров, то есть сделать так, чтобы ни в одной орде не осталось ни одного монстра. Смайло хочет как можно скорее победить, поэтому скажите, какое минимальное число атак можно применить? Выходные данные Для каждого набора входных данных выведите минимальное число атак, которое нужно, чтобы убить всех монстров. Примечание В первом наборе входных данных можно применить атаку первого типа по одному разу на \(1\)-ю, \(3\)-ю и \(4\)-ю орду, затем добить атакой второго типа \(2\)-ю орду. Итого нужно \(4\) атаки. Во втором наборе входных данных можно применить атаку первого типа по одному разу на \(1\)-ю, \(3\)-ю орду, затем добить атакой второго типа \(2\)-ю орду, затем применить атаку первого типа один раз на \(4\)-ю орду. Итого нужно \(4\) атаки. В четвёртом наборе входных данных можно применить атаку первого типа один раз на \(1\)-ю орду, два раза на \(2\)-ю орду, затем применить один раз атаку второго типа на \(2\)-ю орду, затем применить один раз атаку первого типа на \(2\)-ю орду. Итого нужно \(5\) атак.
| |
|
|
E. Брухович и контрольные
жадные алгоритмы
математика
Перебор
реализация
сортировки
*2500
Мальчик Смайло учится алгоритмам у учителя по имени Брухович. В течение года Брухович проведет \(n\) контрольных. Для каждой контрольной известна ее сложность \(a_i\) — неотрицательное целое число. Смайло не нравится, когда у двух последовательных контрольных наибольший общий делитель их сложностей равен \(1\). Поэтому он считает грустностью учебного года количество таких пар контрольных. Формально, грустность — это количество таких индексов \(i\) (\(1 \leq i \leq n - 1\)), что \(gcd(a_i, a_{i+1}) = 1\), где \(gcd(x, y)\) — наибольший общий делитель чисел \(x\) и \(y\). Брухович хочет минимизировать грустность учебного года для Смайло. Для этого он может сделать сложность любой контрольной равной \(0\). Понятно, что Брухович не хочет слишком сильно облегчать жизнь своим ученикам. Поэтому он выполнит описанное выше действие не более \(k\) раз. Помогите Смайло узнать, какой минимальной грустности может добиться Брухович, если применит не более \(k\) операций. Напоминаем, что наибольшим общим делителем (НОД) двух неотрицательных целых чисел \(x\) и \(y\) называется максимальное такое число, которое является делителем и \(x\), и \(y\), обозначается как \(gcd(x, y)\). В частности, \(gcd(x, 0) = gcd(0, x) = x\) для любого целого неотрицательного \(x\). Выходные данные Для каждого набора входных данных выведите минимальную возможную грустность, которую можно достичь, выполнив не более \(k\) операций. Примечание В первом наборе входных данных можно достичь грустности, равной \(1\). Для этого нужно упростить вторую и четвертую контрольные. После этого будет только одна пара соседних контрольных, имеющая НОД, равный единице - это первая и вторая контрольные. Во втором наборе входных данных можно достичь грустности, равной \(0\), упростив вторую и четвертую контрольные.
| |
|
|
B. Нейтральная тональность
жадные алгоритмы
Конструктив
сортировки
*1700
Вам дан массив \(a\) из \(n\) целых положительных чисел, а также массив \(b\) из \(m\) целых положительных чисел. Пусть \(\text{LIS}(c)\) обозначает длину самой длинной строго возрастающей подпоследовательности массива \(c\). Например, \(\text{LIS}([2, \underline{1}, 1, \underline{3}])\) = \(2\), \(\text{LIS}([\underline{1}, \underline{7}, \underline{9}])\) = \(3\), \(\text{LIS}([3, \underline{1}, \underline{2}, \underline{4}])\) = \(3\). Вам нужно вставить числа \(b_1, b_2, \ldots, b_m\) в массив \(a\), в любые места, в любом порядке. Пусть после вставки массив будет равен \(c_1, c_2, \ldots, c_{n+m}\). Вам нужно выбрать места для вставки так, чтобы минимизировать \(\text{LIS}(c)\). Формально, вам нужно найти такой массив \(c_1, c_2, \ldots, c_{n+m}\), для которого одновременно выполняются следующие условия: - Массив \(a_1, a_2, \ldots, a_n\) является подпоследовательностью массива \(c_1, c_2, \ldots, c_{n+m}\).
- Массив \(c_1, c_2, \ldots, c_{n+m}\) состоит из чисел \(a_1, a_2, \ldots, a_n, b_1, b_2, \ldots, b_m\), возможно, переставленных в другом порядке.
- Значение \(\text{LIS}(c)\) минимально возможное среди всех подходящих массивов \(c\).
Выходные данные Для каждого набора входных данных выведите \(n + m\) чисел — элементы итогового массива \(c_1, c_2, \ldots, c_{n+m}\), для которого значение \(\text{LIS}(c)\) является минимальным из возможных. Если подходящих массивов несколько, вы можете вывести любой из них. Примечание В первом наборе входных данных \(\text{LIS}(a) = \text{LIS}([6, 4]) = 1\). Можно вставить число \(5\) между \(6\) и \(4\), тогда \(\text{LIS}(c) = \text{LIS}([6, 5, 4]) = 1\). Во втором наборе входных данных \(\text{LIS}([\underline{1}, 7, \underline{2}, \underline{4}, \underline{5}])\) = \(4\). После вставки, \(c = [1, 1, 7, 7, 2, 2, 4, 4, 5, 5]\). Несложно видеть, что \(\text{LIS}(c) = 4\). Можно показать, что значения \(\text{LIS}(c)\), меньшего чем \(4\), добиться невозможно.
| |
|
|
B. Точки и минимальное расстояние
жадные алгоритмы
математика
сортировки
*800
Вам задана последовательность целых чисел \(a\) длины \(2n\). Вам нужно разбить эти \(2n\) целых чисел на \(n\) пар; каждая пара будет задавать координаты точки на плоскости. Каждое число из последовательности \(a\) должно стать \(x\) или \(y\) координатой ровно одной точки. Обратите внимание, что точки могут быть одинаковыми. После составления точек вам нужно выбрать путь \(s\), который начинается в какой-то из этих точек, заканчивается в какой-то из этих точек, при этом посещает все \(n\) точек хотя бы по одному разу. Длина пути \(s\) — это сумма расстояний между всеми соседними точками пути. В данной задаче будем считать, что расстояние между двумя точками \((x_1, y_1)\) и \((x_2, y_2)\) равно \(|x_1-x_2| + |y_1-y_2|\). Перед вами стоит задача составить \(n\) точек и выбрать путь \(s\) таким образом, чтобы длина пути \(s\) была минимально возможной. Выходные данные На каждый набор входных данных в первую строку выведите минимально возможную длину пути \(s\). В \(i\)-ю из следующих \(n\) строк выведите два целых числа \(x_i\) и \(y_i\) — координаты точки, которую нужно посетить \(i\)-й по счету. Если есть несколько ответов, выведите любой из них. Примечание В первом наборе входных данных можно, например, составить точки \((10, 1)\) и \((15, 5)\) и начать путь \(s\), например, в первой точке и завершить его во второй точке. Тогда длина пути будет равна \(|10 - 15| + |1 - 5| = 5 + 4 = 9\). Во втором наборе можно, например, составить точки \((20, 20)\), \((10, 30)\) и \((10, 30)\), посетив их именно в таком порядке. Тогда длина пути будет равна \(|20 - 10| + |20 - 30| + |10 - 10| + |30 - 30| = 10 + 10 + 0 + 0 = 20\).
| |
|
|
E. Бесконечная карточная игра
Бинарный поиск
графы
дп
жадные алгоритмы
игры
Перебор
поиск в глубину и подобное
снм
сортировки
Структуры данных
*2300
Монокарп и Бикарп играют в карточную игру. Каждая карта имеет два параметра: значение атаки и значение защиты. Карта \(s\) бьет карту \(t\), если значение атаки карты \(s\) строго больше значения защиты карты \(t\). У Монокарпа есть \(n\) карт, \(i\)-я из которых имеет значение атаки \(\mathit{ax}_i\) и значение защиты \(\mathit{ay}_i\). У Бикарпа есть \(m\) карт, \(j\)-я из которых имеет значение атаки \(\mathit{bx}_j\) и значение защиты \(\mathit{by}_j\). На первом ходе Монокарп выбирает одну из своих карт и кладет ее на стол. Бикарп должен побить эту карту своей картой. Затем Монокарп должен побить карту Бикарпа. Затем ход переходит к Бикарпу, и так далее. После того, как карта побита, она возвращается в руку игрока, который ее сыграл. Это подразумевает, что у игрока, который сейчас ходит, всегда на руках те же карты, что и в начале игры. Игра заканчивается, когда у текущего игрока нет карт, которые побеждают карту, которую только что сыграл его оппонент, и текущий игрок проигрывает. Если игра длится \(100^{500}\) ходов, объявляется ничья. И Монокарп, и Бикарп играют оптимально. То есть, если у игрока есть выигрышная стратегия независимо от ходов его оппонента, он играет на победу. В противном случае, если у него есть стратегия для ничьи, он играет на ничью. Вам нужно вычислить три значения: - количество начальных ходов Монокарпа, которые приводят к победе Монокарпа;
- количество начальных ходов Монокарпа, которые приводят к ничьей;
- количество начальных ходов Монокарпа, которые приводят к победе Бикарпа.
Выходные данные Для каждого набора входных данных выведите три целых числа: - количество начальных ходов Монокарпа, которые приводят к победе Монокарпа;
- количество начальных ходов Монокарпа, которые приводят к ничьей;
- количество начальных ходов Монокарпа, которые приводят к победе Бикарпа.
| |
|
|
A. Пиковые обмены
сортировки
*800
Вам дана перестановка\(^\dagger\) \(a\) длины \(n\). Вы можете применять следующую операцию: - Выбрать индекс \(i\) от \(2\) до \(n - 1\) такой, что \(a_{i - 1} < a_i\) и \(a_i > a_{i+1}\), и поменять местами \(a_i\) и \(a_{i+1}\).
Определите, можно ли отсортировать перестановку, применив конечное число операций. \(^\dagger\) Перестановкой является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)). Выходные данные Для каждого набора входных данных выведите «YES», если перестановку можно отсортировать, и «NO» в противном случае. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В первом наборе входных данных перестановка уже отсортирована. Во втором наборе входных данных мы можем выбрать индекс \(i=2\), так как \(1<3\) и \(3>2\), и получить массив \([1, 2, 3, 5, 4]\). Затем можно выбрать индекс \(i=4\), так как \(3<5\) и \(5>4\), и получить \([1, 2, 3, 4, 5]\). В третьем наборе входных данных можно доказать, что отсортировать перестановку невозможно.
| |
|
|
C. Сопоставление массивов
Бинарный поиск
жадные алгоритмы
Конструктив
сортировки
*1400
Даны два массива \(a\) и \(b\) длины \(n\). Назовём красотой массивов \(a\) и \(b\) количество индексов \(i\) таких, что \(a_i > b_i\). Вам также дано целое число \(x\). Определите, можно ли переставить элементы \(b\) так, чтобы красота массивов стала равна \(x\). Если это возможно, то выведите любой подходящий массив, который можно получить из \(b\). Выходные данные Для каждого набора входных данных выведите «NO», если невозможно переставить \(b\) так, чтобы красота массивов стала равна \(x\). В противном случае выведите «YES». Затем, в следующей строке выведите \(n\) целых чисел, которые представляют собой перестановку массива \(b\). Если существует несколько решений, выведите любое из них. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В наборах входных данных 1 и 2 красота массивов может быть равна только \(0\), так как \(a_1 = 1 \le 2 = b_1\). В наборах входных данных 3, 4, 5 и 6 возможны следующие красоты массивов: \(x = 1\) и \(x = 2\). В частности, если \(b\) сделать равным \([2, 4, 1]\), то \(a_3 = 3 > 1 = b_3\), поэтому красота массивов равна \(1\). Если же \(b\) не менять, то \(a_2 = 4 > b_2 = 1\) и \(a_3 = 3 > 2 = b_3\), так что красота массивов равна \(2\).
| |
|
|
E. Сортировка перестановки
сортировки
Структуры данных
*2100
Дана перестановка\(^\dagger\) \(a\) длины \(n\). Назовем индекс \(i\) хорошим, если \(a_i=i\). После каждой секунды мы циклически сдвигаем все индексы, которые не являются хорошими, вправо на одну позицию. Формально, - Пусть \(s_1,s_2,\ldots,s_k\) — индексы \(a\), которые являются нехорошими в порядке возрастания. То есть \(s_j < s_{j+1}\) и если индекс \(i\) не является хорошим, то существует \(j\) такой, что \(s_j=i\).
- Для каждого \(i\) от \(1\) до \(k\) мы одновременно назначаем \(a_{s_{(i \% k+1)}} := a_{s_i}\).
Для каждого \(i\) от \(1\) до \(n\) найдите первый момент времени, когда индекс \(i\) становится хорошим. \(^\dagger\) Перестановкой является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)). Выходные данные Для каждого набора входных данных выведите одну строку, содержащую \(n\) целых чисел, где \(i\)-е целое число равняется первому моменту времени, когда индекс \(i\) становится хорошим. Примечание В первом наборе входных данных \(2\) и \(5\) уже находятся на правильных позициях, поэтому индексы \(2\) и \(5\) становятся хорошими в момент времени \(0\). Через \(1\) секунду будет выполнен циклический сдвиг с \(s=[1, 3, 4]\), в результате чего будет получен массив \(a=[1, 2, 3, 4, 5]\). Обратите внимание, что индексы \(1\), \(3\) и \(4\) становятся хорошими на \(1\) секунде. Во втором наборе входных данных \(5\) уже находится на правильной позиции, поэтому индекс \(5\) становится хорошим на \(0\) секунде. Через \(1\) секунду будет выполнен циклический сдвиг с \(s=[1, 2, 3, 4, 6]\), в результате чего будет получен массив \(a=[3, 2, 1, 4, 5, 6]\). Обратите внимание, что индексы \(2\), \(4\) и \(6\) становятся хорошими через \(1\) секунду. Через \(2\) секунды будет выполнен циклический сдвиг с \(s=[1, 3]\), в результате чего будет получен массив \(a=[1, 2, 3, 4, 5, 6]\). Обратите внимание, что индексы \(1\) и \(3\) становятся хорошими на \(2\) секунде.
| |
|
|
G. Гонка пепе
интерактив
Конструктив
реализация
сортировки
*3200
Это интерактивная задача. В гонках участвует \(n^2\) пепе, пронумерованных \(1, 2, \ldots, n^2\), с попарно различными скоростями. Вы хотите устроить несколько гонок, чтобы выяснить относительную скорость всех пепе. В одной гонке можно выбрать ровно \(n\) различных пепе и заставить их соревноваться друг с другом. После каждого заезда вы узнаете только самого быстрого пепе среди этих \(n\) пепе. Сможете ли вы найти порядок \(n^2-n+1\) самых быстрых пепе за не более чем \(2n^2 - 2n + 1\) заездов? Заметим, что самые медленные \(n - 1\) пепе неотличимы друг от друга. Заметим, что интерактор является адаптивным. То есть относительные скорости пепе изначально не фиксированы и могут зависеть от ваших запросов. Но гарантируется, что в любой момент времени существует хотя бы одна начальная конфигурация пепе такая, что все ответы на запросы корректны. Протокол взаимодействия Чтобы задать гонку, выведите строку следующего формата: - \(\mathtt{?}\,x_1\,x_2 \ldots x_n\) (\(1 \le x_i \le n^2\), \(x_i\) попарно различны) — номера пепе, которые должны участвовать в гонке.
После каждого заезда необходимо считать строку, содержащую единственное целое число \(p\) (\(1\le p\le n^2\)) — самого быстрого пепе в гонке. Когда вы узнаете \(n^2-n+1\) самых быстрых пепе, выведите одну строку следующего формата: - \(\mathtt{!}\,p_1\,p_2 \ldots p_{n^2 - n + 1}\) (\(1 \le p_i \le n^2\), \(p_i\) попарно различны)
где \(p\) — последовательность номеров этих пепе в порядке убывания скорости. После этого переходите к следующему набору входных данных или завершайте работу программы, если наборов входных данных больше не осталось. Если ваша программа выполнит более \(2n^2 - 2n + 1\) заездов для одного набора входных данных или сделает некорректный заезд, то вы можете получить вердикт «Неправильный ответ». После вывода запроса или ответа не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Формат взломов Для взломов используйте следующий формат: Первая строка должна содержать \(t\) — количество наборов входных данных. Первая строка каждого набора входных данных должна содержать целое число \(n\), за которым следует строка manual. Вторая строка каждого набора входных данных должна содержать перестановку \(a_1,a_2,\ldots,a_{n^2}\) целых чисел от \(1\) до \(n^2\). \(a_i > a_j\) тогда и только тогда, когда пепе \(i\) имеет скорость больше, чем пепе \(j\). Например, формат взлома для примера имеет следующий вид: \(\mathtt{1}\\\mathtt{2}~\mathtt{manual}\\\mathtt{1}~\mathtt{2}~\mathtt{3}~\mathtt{4}\)
| |
|
|
E. София и строки
жадные алгоритмы
сортировки
Строки
Структуры данных
*2200
У Софии есть строка \(s\) длины \(n\), состоящая из строчных латинских букв. Она может выполнять следующие операции с этой строкой. - Выбрать позицию \(1 \le i \le |s|\) и удалить \(s_i\) из строки.
- Выбрать пару позиций \((l, r)\) (\(1 \le l \le r \le |s|\)) и отсортировать подстроку \(s_{l} s_{l+1} \ldots s_r\) в алфавитном порядке.
Здесь \(|s|\) обозначает текущую длину строки \(s\). В частности, \(|s| = n\) перед первой операцией. Например, если \(s = \mathtt{sofia}\), то, применив операцию первого типа с \(i=4\), мы сделаем строку \(s\) равной \(\mathtt{sofa}\). Применив после этого операцию второго типа с \((l, r) = (2, 4)\), получим строку \(s\), равную \(\mathtt{safo}\). София хочет получить строку \(t\) длины \(m\) из строки \(s\), используя операции, описанные выше, несколько раз (возможно, ноль). Определите, возможно ли это. Выходные данные Для каждого набора входных данных выведите «YES», если София может получить строку \(t\) из строки \(s\), используя операции из условия. Иначе, выведите «NO». Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В первом наборе входных данных София может сделать следующую операцию: - операция второго типа с \(l=1\) и \(r=5\): строка \(s\) станет равной \(\mathtt{afios}\) после операции.
Во втором наборе входных данных София может сделать следующие операции: - операция второго типа с \(l=1\) и \(r=2\): строка \(s\) станет равной \(\mathtt{bca}\) после операции;
- операция первого типа с \(i=3\): строка \(s\) станет равной \(\mathtt{bc}\) после операции.
В третьем наборе входных данных можно показать, что невозможно получить строку \(t\) из строки \(s\) используя операции из условия.
| |
|
|
E. Очередная сортировка
жадные алгоритмы
реализация
сортировки
*1300
Влад нашёл массив \(a\) из \(n\) чисел и решил его отсортировать в порядке неубывания. Для этого Влад может применить следующую операцию любое количество раз: - Извлечь первый элемент массива и вставить его в конец;
- Обменивать этот элемент с предыдущим, пока он не станет первым или не станет строго больше предыдущего.
Обратите внимание, что оба действия являются частью операции и за одну операцию вы должны применить оба действия. Например, если применить операцию к массиву [\(4, 3, 1, 2, 6, 4\)], то он будет изменяться следующим образом: - [\(\color{red}{4}, 3, 1, 2, 6, 4\)];
- [\(3, 1, 2, 6, 4, \color{red}{4}\)];
- [\(3, 1, 2, 6, \color{red}{4}, 4\)];
- [\(3, 1, 2, \color{red}{4}, 6, 4\)].
У Влада нет времени проделывать все операции, поэтому он просит вас определить, какое минимальное число операций нужно применить, чтобы отсортировать массив, или сообщить, что это невозможно. Выходные данные Для каждого набора входных данных выведите единственное число — минимальное число операций, необходимое для сортировки массива. Если это сделать невозможно, в качестве ответа выведите \(-1\).
| |
|
|
G. Необычное развлечение
Деревья
кратчайшие пути
поиск в глубину и подобное
снм
сортировки
Структуры данных
*1900
Дерево — связный граф без циклов. Перестановка — массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([5, 1, 3, 2, 4]\) является перестановкой, но \([2, 1, 1]\) не является перестановкой (\(1\) встречается в массиве дважды) и \([1, 3, 2, 5]\) тоже не является перестановкой (\(n = 4\), но в массиве присутствует \(5\)). После неудачной съёмки в ролике BrMeast у Лёши началась депрессия. Даже день рождения не радовал его. Однако после подарка Тимофея настроение Лёши резко поднялось. Теперь он днями напролёт игрался с подаренным конструктором. Недавно он придумал себе необычное развлечение. Лёша строит из своего конструктора дерево, состоящее из \(n\) вершин, пронумерованных от \(1\) до \(n\), с корнем в вершине \(1\). Затем он в произвольном порядке выписывает каждое число от \(1\) до \(n\) ровно по одному разу и получает перестановку \(p\). После этого Лёша придумывает \(q\) троек чисел \(l, r, x\). Для каждой тройки он пытается понять, есть ли среди вершин с номерами \(p_l, p_{l+1}, \ldots, p_r\) хотя бы один потомок вершины \(x\). Вершина \(u\) является потомком вершины \(v\) тогда и только тогда, когда \(\mathrm{dist}(1, v) + \mathrm{dist}(v, u) = \mathrm{dist}(1, u)\), где \(\mathrm{dist}(a, b)\) — расстояние между вершинами \(a\) и \(b\). Иначе говоря, вершина \(v\) должна находиться на пути от корня до вершины \(u\). Лёша рассказал об этом развлечении Захару. Теперь Лёша говорит своему другу \(q\) троек, описанных выше, надеясь, что Захар сможет проверить наличие потомка. Захар очень сильно хочет спать, поэтому обратился за помощью к вам. Помогите Захару ответить на все вопросы Лёши и наконец-то пойти спать. Выходные данные Для каждого вопроса Лёши выведите «Yes» (без кавычек), если описанный в условии потомок существует, иначе выведите «No» (без кавычек). Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).
| |
|
|
E. Контрнаступление
графы
снм
сортировки
Структуры данных
хэши
*2100
Берляндия смогла отразить удар флатландцев и теперь переходит в наступление. Во Флатландии n городов, пронумерованных от 1 до n, и некоторые пары из них соединены двухсторонними дорогами. Флатландцы (то ли это их военная хитрость, а может, они просто экономят чернила) на своих картах соединяют дорогой те и только те города, между которыми на самом деле нет дороги. Другими словами, если на карте флатландцев два города соединены дорогой, значит на самом деле между ними дороги нет. Обратное тоже верно: если на карте флатландцев два города не соединены дорогой, значит на самом деле дорога между ними есть. В руки берляндцев попала флатландская карта. Теперь ефрейтор Вася по заданию генерала Туристова хочет найти все такие группы флатландских городов, что в каждой группе из каждого города можно попасть в каждый, двигаясь по настоящим дорогам, при этом города из разных групп недостижимы по настоящим дорогам. Действительно, разгромить такие группы по отдельности значительно легче, чем окружать сразу всю Флатландию! Помогите ефрейтору выполнить это задание и получить-таки звание сержанта! Не забудьте, что на флатландской карте города, соединены дорогой тогда и только тогда, когда на самом деле между ними нет дороги. Выходные данные Выведите в первой строке число k — количество групп городов во Флатландии таких, что в каждой группе из каждого города можно добраться до каждого по дорогам Флатландии, а города разных групп недостижимы по флатландским дорогам. В каждой из следующих k строк выведите сначала ti (1 ≤ ti ≤ n) — количество вершин в i-й группе. Далее через пробел выведите номера городов i-й группы. Порядок вывода групп и порядок вывода номеров в группах значения не имеет. Сумма ti по всем k группам должна быть равна n. Примечание В первом примере есть только дороги между парами городов 1-4 и 2-3. Во втором примере между городами 1 и 2 нет дороги, но все равно можно добраться из одного до другого через город номер 3.
| |
|
|
E. Сжатие дерева
графы
Деревья
дп
жадные алгоритмы
поиск в глубину и подобное
сортировки
*2200
Вам дано дерево, состоящее из \(n\) вершин. На каждой вершине записано число; число на вершине \(i\) равно \(a_i\). Вы можете выполнить следующую операцию любое количество раз (возможно, ноль): - выбрать вершину, имеющую не более \(1\) инцидентного ребра, и удалить ее из дерева.
Обратите внимание, что вы можете удалить все вершины. После выполнения всех операций происходит сжатие дерева. Процесс сжатия выполняется следующим образом. Пока в дереве есть вершина, имеющая ровно \(2\) инцидентных ребра, выполняется следующую операцию: - удалить эту вершину, а ее соседей соединить ребром.
Можно показать, что если существует несколько способов выбрать вершину для удаления в процессе сжатия, итоговое дерево остается тем же самым. Ваша задача — вычислить максимально возможную сумму чисел, записанных на вершинах, после применения вышеописанной операции любое количество раз, а затем сжатия дерева. Выходные данные Для каждого набора входных данных, выведите одно целое число — максимально возможную сумму чисел, записанных на вершинах, после применения вышеописанной операции любое количество раз, а затем сжатия дерева.
| |
|
|
A. Коробкии халлуми
жадные алгоритмы
Перебор
сортировки
*800
Теофанис очень занят после предыдущего контеста, ведь теперь ему нужно доставлять халлуми по всему миру. Он сложил сыр в \(n\) коробок, на каждой из которых написано некоторое число \(a_i\). Теофанис хочет отсортировать коробки по неубыванию чисел на коробках, но его машина работает странным образом. Она может только разворачивать подмассивы\(^{\dagger}\) ящиков длины не более \(k\). Найдите, можно ли отсортировать ящики за любое число разворотов. \(^{\dagger}\) Развернуть подмассив массива — значит выбрать два индекса \(i\) и \(j\) (где \(1 \le i \le j \le n\)) и изменить массив \(a_1, a_2, \ldots, a_n\) на \(a_1, a_2, \ldots, a_{i-1}, \; a_j, a_{j-1}, \ldots, a_i, \; a_{j+1}, \ldots, a_{n-1}, a_n\). Тогда длина подмассива равна \(j - i + 1\). Выходные данные Для каждого набора входных данных выведите YES (в любом регистре), если массив может быть отсортирован в неубывающем порядке, или NO (в любом регистре) в противном случае. Примечание В первых двух наборах входных данных коробки уже отсортированы в неубывающем порядке. В третьем наборе входных данных мы можем развернуть весь массив. В четвертом наборе входных данных мы можем развернуть первые два ящика и последние два ящика. В пятом наборе входных данных можно показать, что отсортировать ящики невозможно.
| |
|
|
B. Игра в коллекционирование
Бинарный поиск
дп
жадные алгоритмы
сортировки
*1100
Вам дан массив \(a\) из \(n\) целых положительных чисел и счет. Если ваш счет больше или равен \(a_i\), то вы можете увеличить свой счет на \(a_i\) и удалить \(a_i\) из массива. Для каждого индекса \(i\) выведите максимальное количество дополнительных элементов массива, которые вы можете удалить, если удалите \(a_i\) и начнёте со счетом, равным \(a_i\). Обратите внимание, что удаление \(a_i\) не должно учитываться в ответе. Выходные данные Для каждого набора входных данных выведите \(n\) целых чисел, \(i\)-е из которых обозначает максимальное количество дополнительных элементов массива, которые можно удалить, если удалить из массива \(a_i\) и начать со счетом \(a_i\). Примечание В первом наборе входных данных ответы выглядят следующим образом: Если мы начинаем с \(i=4\), то наш изначальный счет равен \(a_4=4\) и \(a=[20,5,1,2]\). Мы можем удалить \(3\) дополнительных элемента в следующем порядке: - Поскольку \(4 \ge 1\), мы можем удалить \(1\), и наш счет станет равен \(5\). После этого \(a=[20,5,2]\).
- Поскольку \(5 \ge 5\), мы можем удалить \(5\) и наш счет станет \(10\). После этого \(a=[20,2]\).
- Поскольку \(10 \ge 2\), мы можем удалить \(2\), и наш счет станет \(12\). После этого \(a=[20]\).
Если мы начнем с \(i=1\), то сможем удалить все оставшиеся элементы массива, поэтому ответ будет \(4\). Если мы начнем с \(i=2\), то сможем удалить \(3\) дополнительных элемента в следующем порядке: \(1\), \(4\), \(2\). Если мы начнем с \(i=3\), то не сможем удалить ни одного дополнительного элемента. Если мы начинаем с \(i=5\), то можем удалить \(1\) дополнительный элемент: \(1\).
| |
|
|
C. Игра с массивом
Бинарный поиск
Перебор
сортировки
Структуры данных
*1400
Вам дан массив \(a\) из \(n\) целых положительных чисел. За одну операцию вы должны выбрать некоторую пару \((i, j)\) такую, что \(1\leq i < j\leq |a|\) и добавить \(|a_i - a_j|\) к концу \(a\) (то есть увеличить \(n\) на \(1\) и сделать новый элемент \(a_n\) равным \(|a_i - a_j|\)). Ваша задача — минимизировать и вывести минимальный элемент \(a\) после выполнения \(k\) операций. Выходные данные Для каждого набора входных данных выведите одно целое число — наименьшее возможное значение минимума массива \(a\) после выполнения \(k\) операций. Примечание В первом наборе входных данных после любых \(k=2\) операций минимальное значение \(a\) будет равно \(1\). Во втором наборе входных данных оптимальная стратегия состоит в том, чтобы сначала выбрать \(i=1, j=2\) и добавить \(|a_1 - a_2| = 3\) к концу \(a\), получив \(a=[7, 4, 15, 12, 3]\). Затем выбрать \(i=3, j=4\) и добавить \(|a_3 - a_4| = 3\) к концу \(a\), получив \(a=[7, 4, 15, 12, 3, 3]\). В последней операции выбрать \(i=5, j=6\) и добавить \(|a_5 - a_6| = 0\) в конец \(a\). Тогда минимальный элемент \(a\) станет равным \(0\). В третьем наборе входных данных оптимальная стратегия состоит в том, чтобы сначала выбрать \(i=2, j=3\) и добавить \(|a_2 - a_3| = 3\) к концу \(a\). Любая вторая операция все равно не приведет к тому, чтобы минимальное значение \(a\) стало меньше \(3\).
| |
|
|
D2. Присвоить максимум (сложная версия)
жадные алгоритмы
Конструктив
разделяй и властвуй
реализация
сортировки
Структуры данных
*1800
Это сложная версия задачи. Единственное различие между двумя версиями — это ограничение на \(n\) и ограничение по времени. Вы можете делать взломы, только если обе версии задачи решены. Вам даны два массива \(a\) и \(b\) длины \(n\). Вы можете выполнить следующую операцию несколько (возможно, ноль) раз: - выбрать \(l\) и \(r\) такие, что \(1 \leq l \leq r \leq n\).
- пусть \(x=\max(a_l,a_{l+1},\ldots,a_r)\).
- для всех \(l \leq i \leq r\), присвоить \(a_i := x\).
Определите, можно ли сделать массив \(a\) равным массиву \(b\). Выходные данные Для каждого набора входных данных выведите «YES» (без кавычек), если вы можете превратить \(a\) в \(b\) с помощью данных операций, и «NO» (без кавычек) в противном случае. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В первом наборе входных данных мы можем получить массив \(b\), применив единственную операцию: \((l,r)=(2,3)\). Во втором наборе входных данных можно показать, что мы не можем получить массив \(b\) ни при каком количестве операций. В третьем наборе входных данных массив \(b\) можно получить, применив две операции: \((l,r)=(2,5)\) и \((l,r)=(1,3)\). В четвертом и пятом наборах входных данных можно показать, что массив \(b\) не может быть получен ни при каком количестве операций.
| |
|
|
F. Maximize The Value
сортировки
Структуры данных
*2100
You are given a one-based array consisting of \(N\) integers: \(A_1, A_2, \cdots, A_N\). Initially, the value of each element is set to \(0\). There are \(M\) operations (numbered from \(1\) to \(M\)). Operation \(i\) is represented by \(\langle L_i, R_i, X_i \rangle\). If operation \(i\) is executed, all elements \(A_j\) for \(L_i \leq j \leq R_i\) will be increased by \(X_i\). You have to answer \(Q\) independent queries. Each query is represented by \(\langle K, S, T \rangle\) which represents the following task. Choose a range \([l, r]\) satisfying \(S \leq l \leq r \leq T\), and execute operations \(l, l + 1, \dots, r\). The answer to the query is the maximum value of \(A_K\) after the operations are executed among all possible choices of \(l\) and \(r\). Output For each query, output in a single line, an integer which represent the answer of the query. Note Explanation for the sample input/output #1 For query \(1\), one of the solutions is to execute operation \(4\) and \(5\). For query \(2\), one of the solutions is to execute operation \(4\), \(5\), and \(6\). For query \(3\), the only solution is to execute operation \(3\). For query \(4\), the only solution is to execute operation \(1\). For query \(6\), the only solution is to execute operation \(2\).
| |
|
|
F. Сдвиг и разворот
жадные алгоритмы
сортировки
*1800
Дан массив целых чисел \(a_1, a_2, \ldots, a_n\). Вы можете выполнять два типа операций с этим массивом: - Сдвиг: переместить последний элемент массива на первое место и сдвинуть все остальные элементы вправо, таким образом получится массив \(a_n, a_1, a_2, \ldots, a_{n-1}\).
- Разворот: перевернуть весь массив, таким образом получится массив \(a_n, a_{n-1}, \ldots, a_1\).
Ваша задача — отсортировать массив в порядке неубывания с использованием минимального количества операций или определить, что это невозможно. Выходные данные Для каждого набора входных данных выведите число \(k\) — минимальное количество операций, необходимых для сортировки массива. Если невозможно отсортировать массив с помощью этих операций, выведите \(-1\). Примечание В первом наборе входных данных примера, чтобы отсортировать массив [\(3, 2, 1, 5, 4\)] нужно выполнить \(3\) операции: - Сдвиг, чтобы получить массив [\(4, 3, 2, 1, 5\)];
- Сдвиг, чтобы получить массив [\(5, 4, 3, 2, 1\)];
- Разворот, чтобы получить массив [\(1, 2, 3, 4, 5\)].
В третьем наборе входных данных примера можно показать, что массив невозможно отсортировать с помощью данных операций. В седьмом наборе входных данных примера, чтобы отсортировать массив [\(4, 1, 3, 4, 4\)] нужно выполнить \(3\) операции: - Разворот, чтобы получить массив [\(4, 4, 3, 1, 4\)];
- Сдвиг, чтобы получить массив [\(4, 4, 4, 3, 1\)];
- Разворот, чтобы получить массив [\(1, 3, 4, 4, 4\)].
| |
|
|
C. Тяжелые интервалы
жадные алгоритмы
Конструктив
математика
снм
сортировки
Структуры данных
*1400
У вас есть \(n\) интервалов \([l_1, r_1], [l_2, r_2], \dots, [l_n, r_n]\) таких, что \(l_i < r_i\) для каждого \(i\), и все конечные точки интервалов различны. Вес \(i\)-го интервала составляет \(c_i\) на единицу длины. Поэтому вес \(i\)-го интервала равен \(c_i \cdot (r_i - l_i)\). Вам не нравятся большие веса, поэтому вы хотите сделать сумму весов всех интервалов как можно меньше. Оказывается, вы можете выполнять следующие три типа операций: - переставить элементы массива \(l\) в любом порядке;
- переставить элементы массива \(r\) в любом порядке;
- переставить элементы массива \(c\) в любом порядке.
Однако после выполнения всех операций интервалы должны оставаться корректными (т.е. для каждого \(i\) должно выполняться условие \(l_i < r_i\)). Какова минимально возможная сумма весов интервалов после выполнения этих операций? Выходные данные Для каждого набора входных данных выведите одно целое число: минимально возможную сумму всех весов интервалов после ваших операций. Примечание В первом наборе входных данных вы можете сделать так - \(l = [8, 3]\);
- \(r = [23, 12]\);
- \(c = [100, 100]\).
В этом случае будет два интервала: - интервал \([8, 23]\) с весом \(100\) на единицу длины, тогда вес интервала равняется \(100 \cdot (23-8) = 1500\);
- интервал \([3, 12]\) с весом \(100\) на единицу длины, тогда вес интервала равняется \(100 \cdot (12-3) = 900\);
Сумма весов составляет \(2400\). Можно показать, что не существует конфигурации конечных интервалов, сумма весов которых меньше \(2400\). Во втором наборе входных данных можно сделать так - \(l = [1, 2, 5, 20]\);
- \(r = [3, 4, 10, 30]\);
- \(c = [3, 3, 2, 2]\).
В этом случае будет четыре интервала: - интервал \([1, 3]\) с весом \(3\) на единицу длины, вес всего интервала равен \(3 \cdot (3-1) = 6\);
- интервал \([2, 4]\) с весом \(3\) на единицу длины, вес всего интервала равен \(3 \cdot (4-2) = 6\);
- интервал \([5, 10]\) с весом \(2\) на единицу длины, вес всего интервала равен \(2 \cdot (10-5) = 10\);
- интервал \([20, 30]\) с весом \(2\) на единицу длины, вес всего интервала равен \(2 \cdot (30-20) = 20\).
Сумма весов равна \(42\). Можно показать, что не существует конфигурации конечных интервалов, сумма весов которых меньше \(42\).
| |
|
|
D. Три активности
дп
жадные алгоритмы
Перебор
реализация
сортировки
*1200
Приближаются зимние каникулы. Они будут длиться \(n\) дней. Во время каникул Монокарп с друзьями хочет ровно по одному разу: - пойти кататься на лыжах;
- посмотреть фильм в кинотеатре;
- поиграть в настольные игры.
Монокарп знает, что в \(i\)-й день ровно \(a_i\) друзей соберутся на катание на лыжах, \(b_i\) друзей — на просмотр фильма и \(c_i\) друзей — на настольные игры. Монокарп также знает, что он не может заниматься более чем одной активностью в течение одного дня. Поэтому он просит вас помочь ему выбрать три различных дня \(x, y, z\) таким образом, чтобы общее количество друзей, присоединившихся к нему на активности (\(a_x + b_y + c_z\)), было максимальным. Выходные данные На каждый набор входных данных выведите одно целое число — максимальное суммарное количество друзей, которые могут присоединиться к Монокарпу за три различных дня. Примечание В первом наборе входных данных Монокарп может выбрать день \(2\) для катания на лыжах, день \(1\) для просмотра фильма и день \(3\) для настольных игр. Таким образом, \(a_2 = 10\) друзей присоединятся к нему для катания на лыжах, \(b_1 = 10\) друзей присоединятся к нему для просмотра фильма и \(c_3 = 10\) друзей присоединятся к нему для настольных игр. Общее количество друзей составляет \(30\). Во втором наборе Монокарп может выбрать день \(1\) для катания на лыжах, день \(4\) для просмотра фильма и день \(2\) для настольных игр. Всего соберется \(30 + 20 + 25 = 75\) друзей. Обратите внимание, что Монокарп не может выбрать день \(1\) для всех активностей, потому что он не может заниматься более чем одной активностью в течение одного дня. В третьем наборе Монокарп может выбрать день \(2\) для катания на лыжах, день \(3\) для просмотра фильма и день \(7\) для настольных игр. Всего соберется \(19 + 19 + 17 = 55\) друзей. В третьем наборе Монокарп может выбрать день \(1\) для катания на лыжах, день \(4\) для просмотра фильма и день \(9\) для настольных игр. Всего соберется \(17 + 19 + 20 = 56\) друзей.
| |
|
|
E1. Игра с шариками (простая версия)
жадные алгоритмы
игры
Перебор
сортировки
*1400
Простая и сложная версии этой задачи отличаются друг от друга только ограничениями на количество наборов входных данных и \(n\). В простой версии количество наборов входных данных не превосходит \(10^3\), а \(n\) не превосходит \(6\). Недавно Алисе и Бобу родители подарили шарики \(n\) различных цветов: получилось, что у Алисы \(a_1\) шариков цвета \(1\), \(a_2\) шариков цвета \(2\),..., \(a_n\) шариков цвета \(n\). У Боба: \(b_1\) шариков цвета \(1\), \(b_2\) шариков цвета \(2\), ..., \(b_n\) шариков цвета \(n\). Все \(a_i\) и \(b_i\) от \(1\) до \(10^9\). Посовещавшись, Алиса и Боб придумали следующую игру: игроки ходят по очереди, начиная с Алисы. На своём ходу игрок выбирает такой цвет \(i\), что у обоих игроков есть хотя бы по одному шарику этого цвета. Он выбрасывает один шарик цвета \(i\), а его противник — все шарики цвета \(i\). Игра заканчивается, когда не существует такого цвета \(i\), что у обоих игроков есть хотя бы по одному шарику этого цвета. Счёт в игре — это количество оставшихся шариков у Алисы минус количество оставшихся шариков у Боба по окончании игры. То есть счёт равен \((A-B)\), где \(A\) — количество шариков у Алисы, а \(B\) — количество шариков у Боба в конце игры. Алиса хочет максимизировать счёт, а Боб — минимизировать. Посчитайте, какой счёт будет в конце игры, если оба игрока играют оптимально. Выходные данные Для каждого набора входных данных выведите одно целое число — счёт в конце игры, если и Алиса и Боб будут действовать оптимально. Примечание В первом примере один из способов получить счёт \(1\) — следующий: - Алиса выбирает цвет \(1\), выбрасывает \(1\) шарик. Боб также выбрасывает \(1\) шарик;
- Боб выбирает цвет \(3\), выбрасывает \(1\) шарик. Алиса также выбрасывает \(1\) шарик;
- Алиса выбирает цвет \(2\), выбрасывает \(1\) шарик, а Боб — \(2\) шарика.
В результате у Алисы остается \(a = [3, 1, 0]\), а у Боба — \(b = [0, 0, 3]\). Счёт равен \(3 + 1 - 3 = 1\). Можно показать, что ни Алиса ни Боб не могут получить лучший счёт, если оба играют оптимально. Во втором примере Алиса может сначала выбрать цвет \(1\), далее Боб выберет цвет \(4\), после этого Алиса выберет цвет \(2\), и Боб — цвет \(3\). Можно показать, что это оптимальная игра.
| |
|
|
E2. Игра с шариками (сложная версия)
жадные алгоритмы
игры
сортировки
*1400
Простая и сложная версии этой задачи отличаются друг от друга только ограничениями на количество наборов входных данных и \(n\). В сложной версии количество наборов входных данных не превосходит \(10^4\), а сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\). Кроме того, никаких дополнительных ограничений на значение \(n\) в одиночном наборе входных данных нет. Недавно Алисе и Бобу родители подарили шарики \(n\) различных цветов: получилось, что у Алисы \(a_1\) шариков цвета \(1\), \(a_2\) шариков цвета \(2\),..., \(a_n\) шариков цвета \(n\). У Боба: \(b_1\) шариков цвета \(1\), \(b_2\) шариков цвета \(2\), ..., \(b_n\) шариков цвета \(n\). Все \(a_i\) и \(b_i\) от \(1\) до \(10^9\). Посовещавшись, Алиса и Боб придумали следующую игру: игроки ходят по очереди, начиная с Алисы. На своём ходу игрок выбирает такой цвет \(i\), что у обоих игроков есть хотя бы по одному шарику этого цвета. Он выбрасывает один шарик цвета \(i\), а его противник — все шарики цвета \(i\). Игра заканчивается, когда не существует такого цвета \(i\), что у обоих игроков есть хотя бы по одному шарику этого цвета. Счёт в игре — это количество оставшихся шариков у Алисы минус количество оставшихся шариков у Боба по окончании игры. То есть счёт равен \((A-B)\), где \(A\) — количество шариков у Алисы, а \(B\) — количество шариков у Боба в конце игры. Алиса хочет максимизировать счёт, а Боб — минимизировать. Посчитайте, какой счёт будет в конце игры, если оба игрока играют оптимально. Выходные данные Для каждого набора входных данных выведите одно целое число — счёт в конце игры, если и Алиса и Боб будут действовать оптимально. Примечание В первом примере один из способов получить счёт \(1\) — следующий: - Алиса выбирает цвет \(1\), выбрасывает \(1\) шарик. Боб также выбрасывает \(1\) шарик;
- Боб выбирает цвет \(3\), выбрасывает \(1\) шарик. Алиса также выбрасывает \(1\) шарик;
- Алиса выбирает цвет \(2\), выбрасывает \(1\) шарик, а Боб — \(2\) шарика.
В результате у Алисы остается \(a = [3, 1, 0]\), а у Боба — \(b = [0, 0, 3]\). Счёт равен \(3 + 1 - 3 = 1\). Можно показать, что ни Алиса ни Боб не могут получить лучший счёт, если оба играют оптимально. Во втором примере Алиса может сначала выбрать цвет \(1\), далее Боб выберет цвет \(4\), после этого Алиса выберет цвет \(2\), и Боб — цвет \(3\). Можно показать, что это оптимальная игра.
| |
|
|
F. Приветствия
разделяй и властвуй
сортировки
Структуры данных
*1500
На числовой прямой находятся \(n\) человек; \(i\)-й человек находится в точке \(a_i\) и хочет попасть в точку \(b_i\). Для каждого человека \(a_i < b_i\), и начальные и конечные точки всех людей различны. (То есть все \(2n\) чисел \(a_1, a_2, \dots, a_n, b_1, b_2, \dots, b_n\) различны.) Все люди начнут двигаться одновременно со скоростью \(1\) единица в секунду, пока не достигнут своей конечной точки \(b_i\). Когда два человека встречаются в одной точке, они поздороваются один раз. Сколько будет приветствий? Обратите внимание, что человек все еще может поздороваться с другими людьми, даже если они достигли своей конечной точки. Выходные данные Для каждого набора входных данных выведите одно целое число, обозначающее количество приветствий, которые произойдут. Примечание В первом наборе входных данных два человека встретятся в точке \(3\) и поздороваются.
| |
|
|
G. Велосипеды
графы
жадные алгоритмы
кратчайшие пути
реализация
сортировки
*1800
Все друзья Славика планируют отправиться на вечеринку на своих велосипедах из места, где они живут. У всех есть велосипеды, кроме Славика. Есть \(n\) городов, через которые они могут путешествовать. Все живут в городе \(1\) и хотят пойти на вечеринку, которая находится в городе \(n\). Карту городов можно рассматривать как ненаправленный граф с \(n\) узлами и \(m\) ребрами. Ребро \(i\) соединяет города \(u_i\) и \(v_i\) и имеет длину \(w_i\). У Славика нет велосипеда, но у него есть деньги. В каждом городе есть ровно один велосипед, который можно купить. У велосипеда в \(i\)-м городе есть коэффициент медлительности \(s_{i}\). Как только Славик купит велосипед, он может использовать его, чтобы путешествовать из города, в котором он находится, в любой город. Проезд по ребру \(i\) с использованием велосипеда \(j\) занимает время \(w_i \cdot s_j\). Славик может купить столько велосипедов, сколько захочет, так как деньги для него не проблема. Славик ненавидит путешествовать на велосипеде, поэтому он хочет добраться на вечеринку за минимальное время. И поскольку он уже подзабыл информатику, он просит вас ему помочь. Какое минимальное количество времени потребуется Славику, чтобы добраться из города \(1\) в город \(n\)? Славик не может путешествовать без велосипеда. Гарантируется, что возможно добраться от города \(1\) до любого другого города. Выходные данные Для каждого набора входных данных выведите одно целое число, обозначающее минимальное количество времени, за которое Славик может добраться из города \(1\) в город \(n\).
| |
|
|
B. Минимизируйте инверсии
жадные алгоритмы
Конструктив
реализация
сортировки
Структуры данных
*900
Вам даны две перестановки \(a\) и \(b\) длины \(n\). Перестановкой называется массив из \(n\) элементов от \(1\) до \(n\), в котором все элементы различны. К примеру, массив [\(2,1,3\)] является перестановкой, а [\(0,1\)] и [\(1,3,1\)] не являются. Вы можете сколько угодно раз выбрать два индекса \(i\) и \(j\), а затем поменять местами элементы \(a_i\) с \(a_j\) и \(b_i\) с \(b_j\) одновременно. Вы ненавидите инверсии и поэтому хотите минимизировать суммарное число инверсий в обеих перестановках. Инверсией в перестановке \(p\) называется пара индексов \((i, j)\), такая что \(i < j\) и \(p_i > p_j\). Например, если \(p=[3,1,4,2,5]\), то количество инверсий в этой перестановке равно \(3\) (искомые пары индексов: \((1,2)\), \((1,4)\) и \((3,4)\)). Выходные данные Для каждого набора входных данных выведите две перестановки \(a'\) и \(b'\) — перестановки после применения операций. Суммарное количество инверсий в \(a'\) и \(b'\) должно быть минимально возможным среди всех пар перестановок, которые возможно получить с помощью операций из условия. Если существует несколько решений, выведите любое из них. Примечание В первом тесте минимальное достижимое количество инверсий равно \(10\). Во втором наборе входных данных можно отсортировать обе перестановки одновременно. Для этого можно применить следующие операции: - Поменять элементы на позициях \(1\) и \(3\) в обеих перестановках. После операции \(a =\) [\(2,1,3\)], \(b =\) [\(2,1,3\)].
- Поменять элементы на позициях \(1\) и \(2\). После операции \(a\) и \(b\) отсортированы.
В третьем тесте минимальное достижимое количество инверсий равно \(7\).
| |
|
|
E. ace5 и порядок задач
интерактив
Конструктив
разделяй и властвуй
реализация
сортировки
Теория вероятностей
*2200
Это интерактивная задача! В новом раунде было \(n\) задач, сложности от \(1\) до \(n\). Координатор, решив сделать первый раунд с неотсортированными по сложности задачами, переставил задачи, получив перестановку сложностей от \(1\) до \(n\). После этого координатор предложил ace5 угадать перестановку следующим образом. Координатор загадывает число \(x\) от \(1\) до \(n\). ace5 может делать запросы типа: \(?\ i\). Ответом будет: - \(>\), если \(a_i > x\), после этого \(x\) увеличивается на \(1\).
- \(<\), если \(a_i < x\), после этого \(x\) уменьшается на \(1\).
- \(=\), если \(a_i = x\), после этого \(x\) не меняется.
Задача ace5 — отгадать перестановку не более чем за \(40n\) запросов. Так как ace5 слишком занят написанием анонса, он поручил эту задачу Вам. Протокол взаимодействия Взаимодействие Вашей программы с программой жюри в каждом тестовом случае начинается со считывания целого положительного числа \(n\) (\(1 \leq n \leq 2000\)) — длины загаданной перестановки. Чтобы сделать запрос, выведите строку в формате «? i», где \(1 \leq i \leq n\). В качестве ответа вы получите: - «>», если \(a_i\) > \(x\), после этого \(x\) увеличится на \(1\).
- «<», если \(a_i\) < \(x\), после этого \(x\) уменьшится на \(1\).
- «=», если \(a_i\) = \(x\), после этого \(x\) не изменится.
Вы можете сделать не более \(40n\) запросов. Чтобы вывести ответ, необходимо напечатать «! a_1 a_2 ... a_n», где \(1 \leq a_i \leq n\), все они различны. Вывод ответа не считается за запрос. Если ваша программа сделает более \(40n\) запросов для одного набора входных данных, или сделает некорректный запрос, то ответом на запрос будет -1, после получения такого ответа ваша программа должна немедленно завершится, чтобы получить вердикт Неправильный ответ. Иначе она может получить любой другой вердикт. После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте: - fflush(stdout) или cout.flush() в C++;
- System.out.flush() в Java;
- flush(output) в Pascal;
- stdout.flush() в Python;
- смотрите документацию для других языков.
Гарантируется, что сумма \(n\) по всем тестовым случаям не превосходит \(2000\). Интерактор в этой задаче не является адаптивным. Взломы: Чтобы сделать взлом, используйте следующий формат: В первой строке находится одно целое число \(t\) — количество тестовых случаев. Описание каждого тестового случая должно состоять из двух строк. В первой строке находятся числа \(n\) и \(x\) (\(1 \leq x \leq n \leq 2000\)) — длина загаданной перестановки и изначальное значение числа \(x\). Во второй строке находятся \(n\) различных чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq n\)) — перестановка, которую должно загадать жюри в данном тестовом случае. Сумма \(n\) по всем запросам не должна превосходить \(2000\). Примечание В первом тесте загадана перестановка \(a\) = [\(2,4,1,5,3\)], и значение \(x\) изначально равно \(3\). Во втором тесте загадана перестановка \(a\) = [\(2,1\)], \(x\) изначально равен \(1\).
| |
|
|
F. Гусеница на дереве
графы
Деревья
жадные алгоритмы
поиск в глубину и подобное
реализация
сортировки
*2500
Гусеница решила побывать в каждой вершине дерева. Изначально она сидит в корне. Дерево представлено как корневое дерево с корнем в вершине \(1\). Каждое переползание в соседнюю вершину у неё занимает \(1\) минуту. А под деревом стоит батут. Если гусеница отцепится от дерева и упадёт на батут, то за \(0\) секунд окажется в корне дерева. Но батут старый и выдержит не более \(k\) падений гусеницы. За какое минимальное время гусеница сможет обойти дерево? Более формально — надо найти минимальное время, нужное, чтобы посетить все вершины дерева, если гусеница начинает в корне (вершине \(1\)) и двигается с помощью двух способов. - Перейти по ребру в одну из соседних вершин: тратит \(1\) минуту.
- Телепортироваться в корень: не тратит времени, никакие новые вершины не становятся посещёнными.
Второй способ (телепортацию) можно применить не более \(k\) раз. Гусеница может закончить путешествие в любой вершине. Выходные данные В единственной строке выведите одно число — минимальное число минут, за которое можно побывать во всех вершинах дерева. Примечание На картинке показан один из способов обойти дерево из первого теста за 9 минут.
| |
|
|
D. 01-дерево
Деревья
жадные алгоритмы
Конструктив
снм
сортировки
Структуры данных
*2100
Есть ребро-взвешенное полное двоичное дерево с \(n\) листьями. Полное двоичное дерево определяется как дерево, в котором каждая нелистовая вершина имеет ровно 2 дочерних вершины. Для каждой нелистовой вершины обозначим одного из ее детей как левого ребенка, а другого — как правого. Это двоичное дерево обладает очень странным свойством. Для каждой нелистовой вершины одно из ребер к ее детям имеет вес \(0\), а другое ребро — вес \(1\). Обратите внимание, что ребро с весом \(0\) может идти как к левому ребенку, так и к правому. Вы забыли, как выглядит дерево, но, к счастью, вы помните некоторую информацию о листьях в виде массива \(a\) длины \(n\). Для каждого \(i\) от \(1\) до \(n\), \(a_i\) представляет собой расстояние\(^\dagger\) от корня до \(i\)-го листа (в порядке обхода dfs\(^\ddagger\)). Определите, существует ли полное двоичное дерево, удовлетворяющее массиву \(a\). Обратите внимание, что восстанавливать дерево не нужно. \(^\dagger\) Расстояние от вершины \(u\) до вершины \(v\) определяется как сумма весов ребер на пути от вершины \(u\) до вершины \(v\). \(^\ddagger\) Порядок листьев в dfs определяется вызовом следующей функции \(\texttt{dfs}\) на корне бинарного дерева. dfs_order = [] — порядок обхода dfs
функция dfs(v): если v — лист: добавить v в конец dfs_order иначе: dfs(левый ребенок v) dfs(правый ребенок v)
dfs(корень)
Выходные данные Для каждого набора входных данных выведите «YES», если существует полное двоичное дерево, удовлетворяющее массиву \(a\), и «NO» в противном случае. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В первом наборе входных данных массиву удовлетворяет следующее дерево. 
Для второго набора входных данных можно доказать, что не существует полного двоичного дерева, удовлетворяющего массиву.
| |
|
|
B. Игра в суммирование
жадные алгоритмы
игры
математика
сортировки
*1100
Алиса и Боб играют в игру. У них есть массив \(a_1, a_2,\ldots,a_n\). Игра состоит из двух шагов: - Сначала Алиса удаляет не более \(k\) элементов из массива.
- Затем Боб умножает не более \(x\) элементов массива на \(-1\).
Алиса хочет максимизировать сумму элементов массива, в то время как Боб хочет её минимизировать. Найдите сумму элементов массива после игры, если оба игрока играют оптимально. Выходные данные Для каждого набора входных данных выведите одно целое число — сумму элементов массива после игры, если оба игрока играют оптимально. Примечание В первом наборе входных данных для Алисы оптимально удалить единственный элемент массива. Тогда сумма элементов массива будет равна \(0\) после окончания игры. Во втором наборе входных данных для Алисы оптимально не удалять никакие элементы. Тогда Боб умножит \(4\) на \(-1\). Таким образом, итоговая сумма элементов массива будет равна \(3+1+2-4=2\). В пятом наборе входных данных для Алисы оптимально удалить \(9, 9\). Затем Боб умножит \(5, 5, 3\) на \(-1\). Таким образом, итоговая сумма элементов массива будет равна \(-5-5-3+3+3+2=-5\).
| |
|
|
D. Сильно отличающийся массив
жадные алгоритмы
сортировки
Структуры данных
*1100
У Пети есть массив \(a_i\) из \(n\) целых чисел. Его брату Васе стало завидно, и он решил сделать свой массив из \(n\) чисел. Для этого он нашел \(m\) целых чисел \(b_i\) (\(m\ge n\)), теперь он хочет выбрать из них какие-то \(n\) чисел, и расставить их в некотором порядке так, чтобы получился массив \(c_i\) длины \(n\). Чтобы не быть похожим на брата, Вася хочет сделать так, чтобы его массив максимально отличался от массива Пети. А именно, он хочет, чтобы суммарная разница \(D = \sum_{i=1}^{n} |a_i - c_i|\) была максимально возможной. Помогите Васе узнать, какую наибольшую разницу \(D\) он может получить. Выходные данные Для каждого набора входных данных выведите одно число — максимальную суммарную разность \(D\), которую можно получить. Примечание В первом примере Вася может, например, сделать массив \((1, 5, 7, 2)\). Тогда суммарная разность будет равна \(D = |6-1|+|1-5|+|2-7|+|4-2| = 5+4+5+2 = 16\). Во втором примере все числа, доступные Васе, равны 1, поэтому он может собрать только массив \((1, 1, 1)\), для которого разность \(D = 0\). В третьем примере Вася может, например, сделать массив \((5, 4, 3, 2, 1)\). Тогда суммарная разность будет равна \(D = |1-5|+|2-4|+|3-3|+|4-2|+|5-1| = 4+2+0+2+4 = 12\).
| |
|
|
B. Формирование треугольников
Комбинаторика
Конструктив
математика
сортировки
*1200
У вас есть \(n\) палочек, пронумерованных от \(1\) до \(n\). Длина \(i\)-й палочки равна \(2^{a_i}\). Вы хотите выбрать ровно \(3\) палочки из заданных \(n\) палочек и образовать из них невырожденный треугольник, используя палочки в качестве сторон треугольника. Треугольник называется невырожденным, если его площадь строго больше \(0\). Вам нужно посчитать количество способов выбрать ровно \(3\) палочки, чтобы из них можно было образовать треугольник. Обратите внимание, что порядок выбора палочек не имеет значения (например, выбрать \(1\)-ю, \(2\)-ю и \(4\)-ю палочку — это то же самое, что и выбрать \(2\)-ю, \(4\)-ю и \(1\)-ю палочку). Выходные данные Для каждого теста выведите одно целое число — количество способов выбрать ровно \(3\) палочки, чтобы из них можно было составить треугольник. Примечание В первом наборе входных данных примера можно выбрать любые три палочки из заданных \(7\). Во втором наборе входных данных примера можно выбрать \(1\)-ю, \(2\)-ю и \(4\)-ю палочку, или \(1\)-ю, \(3\)-ю и \(4\)-ю палочку. В третьем наборе входных данных примера нельзя образовать треугольник из заданных палочек длиной \(2\), \(4\) и \(8\).
| |
|
|
B. Космическая гавань
математика
реализация
сортировки
Структуры данных
*2100
На прямой линии расположены \(n\) точек, пронумерованных от \(1\) до \(n\). Изначально существует \(m\) гаваней, причем \(i\)-я гавань находится в точке \(X_i\) и имеет значение \(V_i\). Гарантируется, что в точках \(1\) и \(n\) существуют гавани. На каждой из \(n\) точек находится ровно один корабль. Стоимость перемещения корабля с его текущего местоположения до следующей гавани равна произведению значения ближайшей гавани слева и расстояния до ближайшей гавани справа. В частности, если корабль уже находится в гавани, стоимость перемещения его до следующей гавани равна \(0\). Кроме того, имеется \(q\) запросов, каждый из которых является одним из \(2\) типов: - \(1\) \(x\) \(v\) — Добавить гавань в точке \(x\) со значением \(v\). Гарантируется, что перед добавлением в точке \(x\) там еще нет гавани.
- \(2\) \(l\) \(r\) — Вывести сумму стоимости перемещения всех кораблей с точек от \(l\) до \(r\) до их следующих гаваней. Обратите внимание, что вам нужно только вычислить стоимость перемещения кораблей, но не перемещать их фактически.
Выходные данные Для каждого запроса второго типа выведите одно целое число в новой строке — ответ на этот запрос. Примечание Для первого запроса типа \(2\), цена для кораблей на позициях \(2\), \(3\), \(4\) и \(5\) будет \(3(3 \times 1)\), \(0\), \(96(24 \times 4)\) и \(72(24 \times 3)\) соответственно. Для второго запроса типа \(2\), так как корабль в точке \(5\) уже находится в гавани, ответ будет \(0\). Для третьего запроса типа \(2\), цена для кораблей на позициях \(7\) и \(8\) будет \(15(15 \times 1)\) и \(0\) соответственно.
| |
|
|
F. Микроцикл
графы
Деревья
жадные алгоритмы
поиск в глубину и подобное
реализация
снм
сортировки
Структуры данных
*1900
Дан неориентированный взвешенный граф из \(n\) вершин и \(m\) рёбер. Между каждой парой вершин в графе существует не более одного ребра, граф не содержит петель (рёбер из вершины в себя же). Граф не обязательно связный. Цикл в графе называется простым, если он не проходит через одну и ту же вершину дважды и не содержит одно и то же ребро дважды. Найдите любой простой цикл этого графа, в котором вес самого лёгкого ребра минимален. Выходные данные Для каждого набора входных данных выведите пару чисел \(b\) и \(k\), где: - \(b\) — минимальный вес ребра в найденном цикле,
- \(k\) — количество вершин в найденном цикле.
В следующей строке выведите \(k\) чисел от \(1\) до \(n\) — вершины цикла в порядке обхода. Обратите внимание, что ответ всегда существует, так как при заданных ограничениях в графе всегда есть хотя бы один простой цикл.
| |
|
|
B. Уравняй
Бинарный поиск
жадные алгоритмы
сортировки
*1200
У Васи есть два хобби — прибавлять перестановки\(^{\dagger}\) к массивам и находить самый часто встречающийся элемент. Недавно он нашел массив \(a\) и решил узнать, какое максимальное количество элементов равных одинаковому числу в массиве \(a\) он может получить после того, как прибавит какую-то перестановку к массиву \(a\). Более формально, Вася может выбрать какую-то перестановку \(p_1, p_2, p_3, \ldots, p_n\) длины \(n\), после чего изменить элементы массива \(a\) по правилу \(a_i := a_i + p_i\). После этого Вася считает, сколько раз каждое число встречается в массиве \(a\), и берёт максимум по этим значениям. Вам нужно определить, какое максимальное значение он может получить. \(^{\dagger}\)Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)). Выходные данные Для каждого набора входных данных выведите одно число — максимальное количество элементов, равных одинаковому числу, после операции прибавления перестановки. Примечание В первом наборе входных данных оптимально выбрать \(p = [2, 1]\). Тогда после применения операции массив \(a\) будет равен \([3, 3]\), в котором число \(3\) встречается дважды, поэтому ответ равен \(2\). Во втором наборе входных данных одним из оптимальных вариантов является \(p = [2, 3, 1, 4]\). После применения операции массив \(a\) будет равен \([9, 4, 5, 5]\). Так как число \(5\) встречается дважды, то ответ равен \(2\).
| |
|
|
A. Саша и красивый массив
жадные алгоритмы
Конструктив
математика
сортировки
*800
Саша решил подарить своей девушке массив \(a_1, a_2, \ldots, a_n\). Он узнал, что его девушка оценивает красоту массива как сумму значений \((a_i - a_{i - 1})\) для всех целых чисел \(i\) от \(2\) до \(n\). Помогите Саше и скажите, какую максимальную красоту массива \(a\) можно получить, если он может как угодно переставить местами его элементы. Выходные данные Для каждого набора входных данных выведите одно целое число — максимальную красоту массива \(a\), которую можно получить. Примечание В первом наборе входных данных можно переставить элементы массива \(a\) местами так, чтобы сделать \(a = [1, 2, 3]\). Тогда его красота будет равна \((a_2 - a_1) + (a_3 - a_2) = (2 - 1) + (3 - 2) = 2\). Во втором наборе входных данных можно не переставлять местами элементы массива \(a\). Тогда его красота будет равна \(0\).
| |
|
|
A. Максимизируйте счет
жадные алгоритмы
сортировки
*800
На доске записано \(2n\) целых положительных чисел. От скуки вы решили сыграть в одиночную игру с числами на доске. Вы начинаете игру со счетом \(0\). Вы увеличите свой счет, выполняя следующую операцию ровно \(n\) раз: - Выбрать два целых числа \(x\) и \(y\), которые записаны на доске.
- Прибавить \(\min(x,y)\) к своему счету.
- Стереть \(x\) и \(y\) с доски.
Обратите внимание, что после того, как вы выполните этот ход \(n\) раз, на доске больше не будет записано ни одного числа. Найдите максимальный итоговый счет, который вы можете получить, если оптимально выполните \(n\) ходов. Выходные данные Для каждого набора входных данных выведите максимальный итоговый счет, который вы можете получить. Примечание В первом наборе входных данных вы можете сделать только один ход. Вы выбираете \(x=2\) и \(y=3\), и ваш счет будет \(\min(x,y)=2\). Во втором наборе входных данных ниже приведена последовательность ходов, которая позволяет получить итоговый счет \(2\): - На первом ходу выберите \(x=1\) и \(y=1\). Затем добавьте к счету \(\min(x,y)=1\). После стирания \(x\) и \(y\) на доске останутся целые числа \(1\) и \(2\).
- На втором ходу выберите \(x=1\) и \(y=2\). Затем добавьте к счету \(\min(x,y)=1\). После удаления \(x\) и \(y\) на доске больше не останется целых чисел.
Можно доказать, что получить счет больше \(2\) невозможно. В третьем наборе входных данных выполните ход трижды, каждый раз прибавляя к счету \(1\).
| |
|
|
C. Лексикографически наибольший
Бинарный поиск
жадные алгоритмы
Конструктив
сортировки
Структуры данных
*1700
У Стека есть массив \(a\) длины \(n\). У него также есть пустое множество \(S\). Заметим, что \(S\) не является мультимножеством. Он выполнит следующую трехшаговую операцию ровно \(n\) раз: - Выбрать индекс \(i\) такой, что \(1 \leq i \leq |a|\).
- Вставить\(^\dagger\) \(a_i + i\) в \(S\).
- Удалить \(a_i\) из \(a\). Обратите внимание, что индексы всех элементов справа от \(a_i\) уменьшаются на \(1\).
Обратите внимание, что после \(n\) операций массив \(a\) станет пустым. После Стек построит новый массив \(b\), который является \(S\), отсортированным в порядке убывания. Формально, \(b\) — это массив длины \(|S|\), где \(b_i\) — \(i\)-й наибольший элемент \(S\) для всех \(1 \leq i \leq |S|\). Найдите лексикографически наибольший\(^\ddagger\) массив \(b\), который может получить Стек. \(^\dagger\) Множество может содержать только уникальные элементы. Вставка элемента, который уже присутствует в множестве, не изменит множество. \(^\ddagger\) Массив \(p\) лексикографически больше массива \(q\) тогда и только тогда, когда выполняется одно из следующих условий: - \(q\) является префиксом \(p\), но \(p \ne q\); или
- в первой позиции, где \(p\) и \(q\) различаются, массив \(p\) имеет больший элемент, чем соответствующий элемент в \(q\).
Заметим, что \([3,1,4,1,5]\) лексикографически больше, чем \([3,1,3]\), \([\,]\) и \([3,1,4,1]\), но не больше \([3,1,4,1,5,9]\), \([3,1,4,1,5]\) и \([4]\). Выходные данные Для каждого набора входных данных выведите лексикографически наибольшее значение \(b\). Примечание В первом наборе входных данных выберите \(i=1\) в первой операции, вставьте \(a_1 + 1 = 3\) в \(S\) и удалите \(a_1\) из \(a\). После первой операции массив \(a\) станет \(a=[1]\). Во второй операции снова выберите \(i=1\) и вставьте \(a_1 + 1 = 2\) в \(S\). Таким образом, \(S=\{2, 3\}\), и \(b = [3, 2]\). Обратите внимание, что если в первой операции выбрать \(i=2\), а во второй выбрать \(i=1\), то \(S=\{3\}\), так как \(3\) будет вставлено дважды, в результате чего \(b=[3]\). Поскольку \([3,2]\) лексикографически больше \([3]\), то в первой операции следует выбрать \(i=1\). Во втором примере в каждой операции нужно выбирать последний элемент.
| |
|
|
E. Аня и подарок на День святого Валентина
жадные алгоритмы
игры
математика
сортировки
*1400
Саша подарил Ане на День святого Валентина массив \(a\) из \(n\) целых чисел. Ане не нужен этот массив, поэтому она предлагает его уничтожить, сыграв в игру. Игроки ходят по очереди. Саша джентльмен, поэтому уступает право первого хода Ане. - Аня в свой ход должна выбрать элемент \(a_i\) из массива и развернуть последовательность цифр его значения. Например, если Аня выбрала элемент со значением \(42\), он превратится в \(24\); если Аня выбрала элемент со значением \(1580\), он превратится в \(851\). Обратите внимание, что ведущие нули удаляются. После этого хода количество элементов в массиве не изменится.
- Саша в свой ход должен извлечь два элемента \(a_i\) и \(a_j\) (\(i \ne j\)) из массива, склеить их в любом порядке и вставить результат в массив. Например, если Саша выбрал элементы равные \(2007\) и \(19\), то он удалит эти два элемента из массива и добавит значение \(200719\) или \(192007\). После этого хода количество элементов в массиве уменьшится на \(1\).
Пропускать ходы игроки не могут. Игра заканчивается, когда Саша не может сделать ход, то есть после хода Ани осталось ровно одно число. Если это число не меньше \(10^m\) (т.е., \(\ge 10^m\)), побеждает Саша. В противном случае побеждает Аня. Можно показать, что игра всегда закончится. Сообщите, кто выиграет, если оба игрока играют оптимально. Выходные данные Для каждого набора входных данных выведите: - «Sasha», если при оптимальной игре побеждает Саша;
- «Anna», если при оптимальной игре побеждает Аня.
Примечание Рассмотрим первый набор входных данных. Аня может развернуть число \(2\), тогда Саша склеит числа \(2\) и \(14\), получив число \(214\), что больше \(10^2 = 100\). Если бы Аня развернула число \(14\), Саша бы склеил числа \(41\) и \(2\), получив число \(412\), что больше \(10^2 = 100\). Других возможных ходов у Ани нет, поэтому она проигрывает.
| |
|
|
F. Кормление кошек
дп
сортировки
Структуры данных
*1900
Существует увлекательная игра, в которой вам нужно кормить кошек, которые приходят и уходят. Уровень игры состоит из \(n\) шагов. Есть \(m\) кошек; кошка \(i\) присутствует на шагах от \(l_i\) до \(r_i\), включительно. На каждом шаге вы можете покормить всех кошек, которые в данный момент присутствуют, или ничего не делать. Если вы кормите одну и ту же кошку более одного раза, она переест, и вы сразу проиграете игру. Ваша цель — покормить как можно больше кошек, не заставив ни одну из них переесть. Найдите максимальное количество кошек, которых вы можете покормить. Формально вы должны выбрать несколько целочисленных точек из отрезка от \(1\) до \(n\) так, чтобы среди данных отрезков ни один не покрывал две или более из выбранных точек и как можно больше отрезков покрывали одну из выбранных точек. Выходные данные Для каждого набора входных данных выведите одно целое число — максимальное количество кошек, которых вы можете покормить. Примечание В первом примере один из способов покормить пять кошек — это покормить их на шагах \(4\) и \(11\). - На шаге \(4\) будут покормлены кошки \(1\), \(2\) и \(3\).
- На шаге \(11\) будут покормлены кошки \(5\) и \(6\).
| |
|
|
A. Переставь и измени знак
жадные алгоритмы
математика
сортировки
*800
Вам дан массив \(a\) из \(n\) целых чисел. Вы должны выполнить следующие две операции с массивом (сначала первую, затем вторую): - Произвольно переставить элементы массива или оставить порядок его элементов без изменений.
- Выбрать не более одного отрезка подряд идущих элементов и заменить знаки всех элементов на этом отрезке на противоположные. Формально, вы можете выбрать пару индексов \(l, r\) такие, что \(1 \le l \le r \le n\) и присвоить \(a_i = -a_i\) для всех \(l \le i \le r\). Заметим, что вы можете не выбирать пару индексов и оставить все знаки элементов без изменений.
Какова максимальная сумма элементов массива после последовательного выполнения двух операций (сначала первой, затем второй)? Выходные данные Для каждого набора входных данных выведите максимальную сумму элементов массива после последовательного выполнения двух заданных операций. Примечание В первом наборе входных данных вы можете сначала переставить массив, чтобы получился \([3,-2,-3]\) (операция 1), затем выбрать \(l = 2, r = 3\) и получить сумму \(3 + -((-2) + (-3)) = 8\) (операция 2). Во втором наборе входных данных вы можете ничего не делать при выполнении обеих операций и получить сумму \(0\). В третьем наборе входных данных вы можете ничего не делать при выполнении обеих операций и получить сумму \(0 + 1 = 1\). В четвертом наборе входных данных вы можете сначала оставить порядок неизменным (операция 1), затем выбрать \(l = 1, r = 1\) и получить сумму \(-(-99) = 99\) (операция 2). В пятом наборе входных данных вы можете сначала оставить порядок неизменным (операция 1), затем выбрать \(l = 2, r = 3\) и получить сумму \(10 + -((-2) + (-3)) + 7 = 22\) (операция 2). В шестом наборе входных данных вы можете сначала оставить порядок неизменным (операция 1), затем выбрать \(l = 1, r = 5\) и получить сумму \(-((-1)+(-2)+(-3)+(-4)+(-5))=15\) (операция 2).
| |
|
|
D. Цепные остатки
жадные алгоритмы
Конструктив
математика
сортировки
теория чисел
*1200
Дан массив \(a_1, a_2, \ldots, a_n\), определите, возможно ли переставить его элементы в \(b_1, b_2, \ldots, b_n\), так чтобы \(b_1 \bmod b_2 \bmod \ldots \bmod b_n \neq 0\). Здесь \(x \bmod y\) обозначает остаток от деления \(x\) на \(y\). Кроме того, операции по модулю вычисляются слева направо. То есть, \(x \bmod y \bmod z = (x \bmod y) \bmod z\). Например, \(2024 \bmod 1000 \bmod 8 = (2024 \bmod 1000) \bmod 8 = 24 \bmod 8 = 0\). Выходные данные Для каждого теста выведите «YES», если это возможно, в противном случае «NO». Вы можете вывести ответ в любом регистре (верхний или нижний). Например, строки «yEs», «yes», «Yes», и «YES» будут распознаны как положительные ответы. Примечание В первом тесте, перестановка массива в \(b = [1, 2, 3, 4, 5, 6]\) (ничего не делая) приведет к \(1 \bmod 2 \bmod 3 \bmod 4 \bmod 5 \bmod 6 = 1\). Следовательно, это возможно. Во втором тесте, массив \(b\) должен быть равен \([3, 3, 3, 3, 3]\), что приведет к \(3 \bmod 3 \bmod 3 \bmod 3 \bmod 3 = 0\). Следовательно, это невозможно. В третьем тесте, перестановка массива в \(b = [3, 2, 2]\) приведет к \(3 \bmod 2 \bmod 2 = 1\). Следовательно, это возможно.
| |
|
|
C. Мессенджер в ЦПМ
Бинарный поиск
дп
жадные алгоритмы
Конструктив
Перебор
сортировки
Структуры данных
*1800
В новом мессенджере для учащихся Центра Помощи Магистрам, Кефтемерум, планируется обновление, в котором разработчики хотят оптимизировать набор сообщений, показываемых пользователю. Всего есть \(n\) сообщений, каждое сообщение характеризуется двумя целыми числами \(a_i\) и \(b_i\). Время, потраченное на прочтение набора сообщений с номерами \(p_1, p_2, \ldots, p_k\) (\(1 \le p_i \le n\), все \(p_i\) различны) рассчитывается по формуле: \(\)\Large \sum_{i=1}^{k} a_{p_i} + \sum_{i=1}^{k - 1} |b_{p_i} - b_{p_{i+1}}|\(\) Обратите внимание, что время прочтения набора сообщений, состоящего из одного сообщения с номером \(p_1\), равно \(a_{p_1}\). Также время прочтения пустого набора сообщений считается равным \(0\). Пользователь может сам определить время \(l\), которое он готов провести в мессенджере. Мессенджер же должен сообщить пользователю максимально возможный размер набора сообщений, время прочтения которого не превышает \(l\). Обратите внимание, что максимальный размер набора сообщений может быть равен \(0\). Разработчики популярного мессенджера не справились внедрить данную функцию, поэтому попросили вас решить эту задачу. Выходные данные Для каждого набора входных данных выведите одно целое число — максимально возможный размер набора сообщений, время прочтения которого не превышает \(l\). Примечание В первом наборе входных данных, можно взять набор из трёх сообщений с номерами \(p_1 = 3\), \(p_2 = 2\) и \(p_3 = 5\). Время, затрачиваемое на прочтение данного набора, равно \(a_3 + a_2 + a_5 + |b_3 - b_2| + |b_2 - b_5| = 2 + 1 + 2 + |4 - 5| + |5 - 3| = 8\). Во втором наборе входных данных, можно взять набор из одного сообщения со номером \(p_1 = 1\). Время, затрачиваемое на прочтение данного набора, равно \(a_1 = 4\). В пятом наборе входных данных можно показать, что не существует такого непустого набора сообщений, затрачиваемое время на прочтение которого не превышает \(l\).
| |
|
|
C. Арена покемонов
графы
жадные алгоритмы
кратчайшие пути
реализация
сортировки
Структуры данных
*2400
Вы находитесь на дуэльной арене. Вы также владеете \(n\) покемонами. Изначально на арене находится только \(1\)-й покемон. Каждый покемон имеет \(m\) характеристик. Значение \(j\)-й характеристики у \(i\)-го покемона равно \(a_{i,j}\). Также у каждого покемона есть стоимость его вызова: цена \(i\)-го покемона равна \(c_i\). Вы хотите добиться того, чтобы на арене находился \(n\)-й покемон. Для этого вы можете выполнять операции двух типов любое количество раз в любом порядке: - Выбрать три целых числа \(i\), \(j\), \(k\) (\(1 \le i \le n\), \(1 \le j \le m\), \(k > 0\)) и навсегда увеличить \(a_{i,j}\) на \(k\). Стоимость такой операции равна \(k\).
- Выбрать два числа \(i\), \(j\) (\(1 \le i \le n\), \(1 \le j \le m\)) и вызвать \(i\)-го покемона, который бросит вызов текущему покемону на арене по \(j\)-й характеристике. При этом \(i\)-й покемон победит, если \(a_{i,j}\) не меньше, чем \(j\)-я характеристика текущего покемона на арене (иначе он проиграет). После дуэли на арене остаётся только её победитель. Стоимость такой операции равна \(c_i\).
Найдите наименьшую суммарную стоимость операций, необходимых для того, чтобы на арене оказался \(n\)-й покемон. Выходные данные Для каждого набора входных данных выведите минимальную суммарную стоимость операций, чтобы на арене оказался \(n\)-й покемон. Примечание В первом наборе входных данных массив значений характеристик \(1\)-го покемона (который изначально расположен на арене) есть \([2,9,9]\). На первой операции можно выбрать \(i=3\), \(j=1\), \(k=1\) и увеличить \(a_{3,1}\) на \(1\) навсегда. Теперь массив значений характеристик \(3\)-го покемона станет равен \([2,2,1]\). Стоимость этой операции равна \(k = 1\). На второй операции можно выбрать \(i=3\), \(j=1\) и вызвать \(3\)-го покемона, который сразится с текущим покемоном на арене по \(1\)-й характеристике. Поскольку \(a_{i,j}=a_{3,1}=2 \ge 2=a_{1,1}\), \(3\)-й покемон победит. Стоимость этой операции равна \(c_3 = 1\). Таким образом, \(3\)-й покемон находится на арене, а суммарная стоимость операций равна \(2\). Можно показать, что меньше \(2\) ответ получить нельзя. Во втором наборе входных данных массив значений характеристик \(1\)-го покемона есть \([9,9,9]\). На первой операции можно выбрать \(i=2\), \(j=3\), \(k=2\) и увеличить \(a_{2,3}\) на \(2\) навсегда. Теперь массив значений характеристик \(2\)-го покемона есть \([6,1,9]\). Стоимость этой операции равна \(k = 2\). На второй операции можно выбрать \(i=2\), \(j=3\) и вызвать \(2\)-го покемона, который сразится с текущим покемоном на арене по \(3\)-й характеристике. Поскольку \(a_{i,j}=a_{2,3}=9 \ge 9=a_{1,3}\), \(2\)-й покемон победит. Стоимость этой операции равна \(c_2 = 3\). На третьей операции можно выбрать \(i=3\), \(j=2\) и вызвать \(3\)-го покемона, который сразится с текущим покемоном на арене по \(2\)-й характеристике. Поскольку \(a_{i,j}=a_{1,2}=2 \ge 1=a_{2,2}\), \(3\)-й покемон победит. Стоимость этой операции равна \(c_3 = 1\). Таким образом, \(3\)-й покемон находится на арене, а суммарная стоимость операций равна \(6\). Можно показать, что меньше \(6\) ответ получить нельзя.
| |
|
|
F. Рудольф и дисбаланс
Бинарный поиск
жадные алгоритмы
сортировки
*1800
Рудольф подготовил набор из \(n\) задач со сложностями \(a_1 < a_2 < a_3 < \dots < a_n\). Он не совсем доволен балансом, поэтому хочет добавить не больше одной задачи, чтобы его исправить. Для этого Рудольф придумал \(m\) моделей задач и \(k\) функций. Сложность \(i\)-й модели равна \(d_i\), а сложность \(j\)-й функции равна \(f_j\). Чтобы составить задачу, он выбирает значения \(i\) и \(j\) (\(1 \le i \le m\), \(1 \le j \le k\)) и, совмещая \(i\)-ю модель с \(j\)-й функцией, получает новую задачу сложности \(d_i + f_j\) (в массив \(a\) добавляется новый элемент). Чтобы определить дисбаланс набора, Рудольф сортирует сложности задач по возрастанию и находит самое большое значение \(a_i - a_{i - 1}\) (\(i > 1\)). Какого минимального значения дисбаланса может добиться Рудольф, добавив не больше одной задачи, составленной по описанным правилам? Выходные данные Для каждого набора входных данных выведите единственное число — минимальный дисбаланс, которого сможет добиться Рудольф.
| |
|
|
D. Учимся рисовать
Бинарный поиск
дп
жадные алгоритмы
поиск в глубину и подобное
реализация
сортировки
Структуры данных
*2100
Элси учится рисовать. У нее есть холст из \(n\) клеток, пронумерованных от \(1\) до \(n\), и она может раскрасить любое (возможно, пустое) подмножество клеток. У Элси есть двумерный массив \(a\), который она будет использовать для оценки картин. Пусть максимальные непрерывные отрезки закрашенных клеток в картине равны \([l_1,r_1],[l_2,r_2],\ldots,[l_x,r_x]\). Красота картины — это сумма \(a_{l_i,r_i}\) по всем \(1 \le i \le x\). На изображении выше максимальные непрерывные отрезки закрашенных клеток равны \([2,4],[6,6],[8,9]\), а красота картины равна \(a_{2,4}+a_{6,6}+a_{8,9}\). Всего есть \(2^n\) различных способов раскрасить холст. Помогите Элси найти \(k\) наибольших значений красоты картины, которые она может получить, среди всех способов. Обратите внимание, что эти \(k\) значений не обязательно должны быть различными. Гарантируется, что существует не менее \(k\) различных способов раскрасить холст. Выходные данные Для каждого набора входных данных выведите в отдельной строке \(k\) целых чисел: \(i\)-е из них должно равняться \(i\)-му наибольшему значение красоты картины, которое может получить Элси. Примечание В первом наборе входных данных Элси может либо закрасить единственную клетку, либо не закрашивать ее. Если она раскрасит единственную клетку, красота картины составит \(-5\). Если она решит не раскрашивать ее, красота картины составит \(0\). Таким образом, наибольшая красота, которую она может получить, равна \(0\), а вторая по величине красота, которую она может получить, равна \(-5\). Ниже приведена иллюстрация третьего набора входных данных.
| |
|
|
F. Кирилл и грибы
сортировки
Структуры данных
*1900
Стоило всем в лагере уснуть, как Кирилл выбрался из палатки и отправился к Мудрому Дубу собирать грибы. Известно, что под Дубом растет \(n\) грибов, каждый из которых обладает характеристикой \(v_i\) — волшебностью. Кирилл очень хочет приготовить из грибов магический эликсир максимальной силы. Сила эликсира равна произведению количества входящих в него грибов на минимальную из волшебностей этих грибов. Для приготовления эликсира Кирилл будет последовательно срывать по одному грибу, растущему под Дубом. Кирилл может собирать грибы в любом порядке. Однако не все так просто. Мудрый Дуб сообщил Кириллу перестановку чисел \(p\) от \(1\) до \(n\). Если Кирилл соберёт всего \(k\) грибов, то волшебность всех грибов с индексами \(p_1, p_2, \dots, p_{k - 1}\) станет равна \(0\). Грибы с нулевой волшебностью Кирилл не будет использовать для приготовления эликсира. Ваша задача состоит в том, чтобы помочь Кириллу набрать грибы так, чтобы сварить эликсир максимальной возможной силы. Однако, Кириллу немного страшно надолго оставаться у дуба, поэтому из всех подходящих вариантов собрать грибы он просит вас найти тот, количество грибов в котором минимально. Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)). Выходные данные Для каждого набора входных данных выведите через пробел два целых числа — максимальную силу эликсира, который можно сварить, и минимальное число грибов, которые Кириллу нужно для этого использовать. Примечание В первом примере нужно взять грибы под индексами \(1\) и \(2\), таким образом сила эликсира равна \(2 \cdot \min(a_1, a_2) = 2 \cdot \min(9, 8) = 2 \cdot 8 = 16\). Обратите внимание, что волшебность гриба с индексом \(3\) после срывания двух грибов станет равна \(0\).
| |
|
|
A. Медиана массива
жадные алгоритмы
реализация
сортировки
*800
Вам дан массив \(a\) из \(n\) целых чисел. Будем называть медианой массива \(q_1, q_2, \ldots, q_k\) число \(p_{\lceil \frac{k}{2} \rceil}\), где \(p\) — отсортированный по неубыванию массив \(q\). Например, медиана массива \([9, 5, 1, 2, 6]\) это \(5\), так как в отсортированном массиве \([1, 2, 5, 6, 9]\) число с индексом \(\lceil \frac{5}{2} \rceil = 3\) это \(5\), а медиана массива \([9, 2, 8, 3]\) это \(3\), так как в отсортированном массиве \([2, 3, 8, 9]\) число с индексом \(\lceil \frac{4}{2} \rceil = 2\) это \(3\). За одно действие вам разрешается выбрать целое число \(i\) (\(1 \le i \le n\)) и увеличить \(a_i\) на \(1\). Ваша задача найти минимальное количество действий, за которое можно увеличить медиану массива. Обратите внимание, что в массиве \(a\) необязательно все числа различны. Выходные данные Для каждого набора входных данных в отдельной строке выведите одно целое число — минимальное количество действий за которое можно увеличить медиану массива. Примечание В первом наборе входных данных можно применить одну операцию к первому числу и получить массив \([3, 2, 8]\), у этого массива медиана равна \(3\), так как это число с индексом \(\lceil \frac{3}{2} \rceil = 2\) в отсортированном по неубыванию массиве \([2, 3, 8]\). У изначального массива \([2, 2, 8]\) медиана равна \(2\), так как это число с индексом \(\lceil \frac{3}{2} \rceil = 2\) в отсортированном по неубыванию массиве \([2, 2, 8]\). Таким образом медиана увеличилась (\(3 > 2\)) всего за одно действие. В четвертом наборе входных данных можно применить по одной операции к числам с индексами \(1, 2, 3\) и получить массив \([6, 6, 6, 4, 5]\), у этого массива медиана равна \(6\), так как это число с индексом \(\lceil \frac{5}{2} \rceil = 3\) в отсортированном по неубыванию массиве \([4, 5, 6, 6, 6]\). У изначального массива \([5, 5, 5, 4, 5]\) медиана равна \(5\), так как это число с индексом \(\lceil \frac{5}{2} \rceil = 2\) в отсортированном по неубыванию массиве \([4, 5, 5, 5, 5]\). Таким образом медиана увеличилась (\(6 > 5\)) за три действия. Можно показать, что это минимальное возможное количество действий. В пятом наборе входных данных можно применить по одной операции к числам с индексами \(1, 3\) и получить массив \([3, 1, 3, 3, 1, 4]\), у этого массива медиана равна \(3\), так как это число с индексом \(\lceil \frac{6}{2} \rceil = 3\) в отсортированном по неубыванию массиве \([1, 1, 3, 3, 3, 4]\). У изначального массива \([2, 1, 2, 3, 1, 4]\) медиана равна \(2\), так как это число с индексом \(\lceil \frac{6}{2} \rceil = 3\) в отсортированном по неубыванию массиве \([1, 1, 2, 2, 3, 4]\). Таким образом медиана увеличилась (\(3 > 2\)) за два действия. Можно показать, что это минимальное возможное количество действий.
| |
|
|
B. Charming Meals
Бинарный поиск
жадные алгоритмы
Перебор
сортировки
*1500
The Czech cuisine features \(n\) appetizers and \(n\) main dishes. The \(i\)-th appetizer has spiciness \(a_i\), and the \(i\)-th main dish has spiciness \(b_i\). A typical Czech meal consists of exactly one appetizer and one main dish. You want to pair up the \(n\) appetizers and \(n\) main dishes into \(n\) meals with each appetizer and each main dish being included in exactly one meal. Your meals shall surprise the diners, so you want the spiciness levels of the two parts of the same meal to be as different as possible. The charm of a meal is the difference (in absolute value) between the spiciness of the appetizer and the spiciness of the main dish. So, a meal consisting of an appetizer with spiciness \(x\) and a main dish with spiciness \(y\) has charm equal to \(|x-y|\). You want to maximize the minimum charm of the resulting \(n\) meals. What is the largest possible value of the minimum charm that you can achieve? Output For each test case, print the largest possible value of the minimum charm you can achieve. Note In the first test case, no matter how you pair up the appetizers with the main dishes, each meal will have an appetizer with spiciness \(0\) and a main dish with spiciness \(1000000000\), so the charm of each meal will be \(1000000000\). In the second test case, one optimal way to pair up appetizers and main dishes is: \((1, 5)\), \((2, 4)\), \((3, 1)\), \((4, 2)\), \((5, 3)\). The corresponding meals have charms: \(4\), \(2\), \(2\), \(2\), \(2\). The resulting minimum charm is \(2\). In the third test case, one way to maximize the minimum charm is to pair up the three appetizers with spiciness \(0\) with the three main dishes with spiciness \(100\), and the three appetizers with spiciness \(100\) with the three main dishes with spiciness \(0\). Doing so, the charm of each meal will be exactly \(100\).
| |
|
|
F. Dating
Деревья
жадные алгоритмы
сортировки
*2200
You are the developer of a dating app which ignores gender completely. The app has \(n\) users, indexed from \(1\) to \(n\). Each user's profile features a list of the activities they enjoy doing. There are \(m\) possible activities, indexed from \(1\) to \(m\). A match between two users is good if they share at least one activity and, at the same time, both of them like at least one activity that the other user does not like. Find a good match if it exists. Output Print \(\texttt{YES}\) if a good match exists. Otherwise, print \(\texttt{NO}\). If a good match exists, on the next line print two integers — the indexes of two users that make a match. Note In the first sample, users \(1\) and \(3\) form a match, because they share activity \(1\), and, furthermore, user \(3\) likes activity \(5\) (which user \(1\) does not like) and user \(1\) likes activity \(4\) (which user \(3\) does not like). Note that users \(1\) and \(2\), as well as users \(2\) and \(3\), do not form a match, as there is no activity that users \(1\) or \(3\) like, and user \(2\) doesn't like.
| |
|
|
D. Исследование ломаной
геометрия
математика
сортировки
*1900
При просмотре одного из последних матчей чемпионата Европы Валерик и Валерко разбили в спорт-баре кружку. Конечно, они за нее расплатились, но бармен сказал, что разрешит им теперь смотреть футбол у него в баре, только если они помогут его сыну выполнить задание по программированию. Задание состоит в следующем. Рассмотрим множество функций вида:  Суммой n функций y1(x), ..., yn(x) указанного вида назовем функцию s(x) = y1(x) + ... + yn(x) для любых x. Нетрудно показать, что в этом случае график s(x) является ломаной. Вам задано n функций указанного вида, необходимо найти количество углов, не равных 180 градусам, в графике функции s(x), являющейся суммой заданных функций. Валерик и Валерко очень хотят посмотреть следующий матч чемпионата Европы, поэтому обратились к вам за помощью. Выходные данные Выведите одно число — количество углов, не равных 180 градусам, в графике ломаной, равной сумме заданных функций.
| |
|
|
C. Запас билетов
жадные алгоритмы
математика
сортировки
*1400
Будучи генеральным директором стартапа, вы хотите наградить каждого из \(k\) своих сотрудников билетом на предстоящий концерт. Билеты будут продаваться в течение \(n\) дней, и с помощью машины времени вы предсказали, что цена одного билета в день \(i\) будет равна \(a_i\). Однако, чтобы предотвратить скупку билетов, организаторы концерта приняли следующие меры: - Человек может купить не более \(m\) билетов в день.
- Если человек покупает \(x\) билетов в день \(i\), то во все последующие дни (т.е. начиная с дня \(i+1\) и далее) цена за билет будет увеличена на \(x\).
Например, если \(a = [1, 3, 8, 4, 5]\), и вы покупаете \(2\) билета в день \(1\), они будут стоить \(2\) вместе, а цены, начиная с дня \(2\), станут \([5, 10, 6, 7]\). Если в день \(2\) вы купите еще \(3\) билета, они будут вместе стоить еще \(15\), а цены, начиная с дня \(3\), станут \([13, 9, 10]\). Найдите минимальную сумму, необходимую для покупки \(k\) билетов. Выходные данные Для каждого набора входных данных выведите одно целое число: минимальную сумму денег, необходимую для покупки ровно \(k\) билетов. Примечание В первом наборе входных данных один из оптимальных способов покупки \(3\) билетов выглядит следующим образом: - Купить \(0\) билетов в первый день. Цены на билеты в остальные дни равны \([6, 4, 2]\).
- Купить \(0\) билетов во второй день. Цены на билеты в оставшиеся дни составляют \([4, 2]\).
- Купить \(1\) билет в третий день по цене \(4\). Цена за билет в оставшийся день составляет \([3]\).
- Купить \(2\) билета в четвертый день, потратив \(6\).
Во втором наборе входных данных есть только один способ купить \(8\) билетов: - Купить \(2\) билета в первый день, потратив \(16\). Цены на билеты в остальные дни равны \([8, 6, 4]\).
- Купить \(2\) билета во второй день, потратив \(16\). Цены на билеты в оставшиеся дни составляют \([8, 6]\).
- Купить \(2\) билета в третий день, потратив \(16\). Цена за билет в оставшийся день составляет \([8]\).
- Купить \(2\) билета в четвертый день, потратив \(16\).
| |
|
|
J. Помогите, что значит быть «Based»
*особая задача
Конструктив
Перебор
Разбор выражений
реализация
сортировки
Выходные данные Если \(x = 1\), выдай код, который, типа, когда подаёшь ему два целых числа \(a\) и \(b\), он возвращает их сумму. Если \(x = 2\), напиши код, который принимает целое число \(a\) и возвращает его абсолютное значение, как будто волшебство, без всяких приколов. Если \(x = 3\), чекай это: сочини код, который берёт целое число \(n\) (\(1 \le n \le 50\)) и массив \(a\) из \(n\) различных целых чисел, а потом возвращает максимальное значение, вжух! Если \(x = 4\), бросай код, который берёт целое число \(n\) (\(1 \le n \le 50\)), массив \(a\) из \(n\) различных целых чисел и целое число \(k\) (\(1 \le k \le n\)), а потом выдаёт \(k\)-тое по величине значение в массиве. Врубился, братишка?! Примечание Загляни на страницу «Мои посылки» и оцени свой код, кликнув на его ID. Ты увидишь, насколько based или cringe он.
| |
|
|
D. Цветные шары
дп
Комбинаторика
математика
сортировки
*1800
Существуют шары \(n\) различных цветов; количество шаров \(i\)-го цвета равно \(a_i\). Шары можно объединять в группы. Каждая группа должна содержать не более \(2\) шаров и не более \(1\) шара каждого цвета. Рассмотрим все \(2^n\) множеств цветов. Для множества цветов обозначим его значение как минимальное количество групп, на которые могут быть разделены шары этих цветов. Например, если есть три цвета с \(3\), \(1\) и \(7\) шарами соответственно, их можно объединить в \(7\) групп (и не менее \(7\)), поэтому значение этого множества цветов равно \(7\). Ваша задача — вычислить сумму значений по всем \(2^n\) возможным множествам цветов. Поскольку ответ может быть слишком большим, выведите его по модулю \(998\,244\,353\). Выходные данные Выведите одно целое число — сумму значений всех \(2^n\) множеств цветов, взятую по модулю \(998\,244\,353\). Примечание Рассмотрим первый пример. Есть \(8\) множеств цветов: - значение пустого множества равно \(0\);
- значение множества \(\{1\}\) равно \(1\);
- значение множества \(\{2\}\) равно \(1\);
- значение множества \(\{3\}\) равно \(2\);
- значение множества \(\{1,2\}\) равно \(1\);
- значение множества \(\{1,3\}\) равно \(2\);
- значение множества \(\{2,3\}\) равно \(2\);
- значение множества \(\{1,2,3\}\) равно \(2\).
Таким образом, сумма значений по всем \(2^n\) множествам цветов равна \(11\).
| |
|
|
B. Прогрессивный квадрат
Конструктив
реализация
сортировки
Структуры данных
*1000
Прогрессивный квадрат размера \(n\) — это матрица размера \(n \times n\). Максим выбирает три натуральных числа \(a_{1,1}\), \(c\) и \(d\) и строит прогрессивный квадрат по следующим правилам: \(\)a_{i+1,j} = a_{i,j} + c\(\) \(\)a_{i,j+1} = a_{i,j} + d\(\) Например, если \(n = 3\), \(a_{1,1} = 1\), \(c=2\) и \(d=3\), то прогрессивный квадрат выглядит следующим образом: \(\) \begin{pmatrix} 1 & 4 & 7 \\ 3 & 6 & 9 \\ 5 & 8 & 11 \end{pmatrix} \(\) В прошлом месяце Максим построил прогрессивный квадрат и запомнил значения \(n\), \(c\) и \(d\). Недавно он нашёл массив \(b\) из \(n^2\) целых чисел, идущих в случайном порядке и хочет убедиться, что эти элементы являются элементами того самого квадрата. Можно показать, что при любых значениях \(n\), \(a_{1,1}\), \(c\) и \(d\) существует ровно один прогрессивный квадрат, удовлетворяющий всем правилам. Выходные данные Для каждого набора входных данных в отдельной строке выведите «YES», если прогрессивный квадрат для данных \(n\), \(c\) и \(d\) может быть составлен из элементов массива \(a\), в противном случае выведите «NO». Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.
| |
|
|
E. Длинное инвертирование
жадные алгоритмы
Перебор
реализация
сортировки
*1700
Дана бинарная строка \(s\) из \(n\) символов. Бинарной строкой называется строка, состоящая только из символов '1' и '0'. Вы можете выбрать целое число \(k\) (\(1 \le k \le n\)), после чего применить любое число раз следующую операцию: выбрать \(k\) подряд идущих символов строки и инвертировать их, то есть заменить все '0' на '1' и наоборот. С помощью операций нужно сделать все символы в строке равными '1'. Например, если \(n=5\), \(s=00100\), то можно выбрать \(k=3\) и действовать следующим образом: - выбрать отрезок от \(1\)-го до \(3\)-го символа и получить \(s=\color{blue}{110}00\);
- выбрать отрезок от \(3\)-го до \(5\)-го символа и получить \(s=11\color{blue}{111}\);
Найдите максимальное значение \(k\), при котором можно с помощью операций сделать все символы строки равными '1'. Обратите внимание, что количество операций, которые для этого нужно совершить, не имеет значения. Выходные данные Для каждого набора входных данных выведите максимальное целое число \(k\) (\(1 \le k \le n\)), при котором возможно с помощью описанных операций получить строку \(s\), состоящую только из символов '1'.
| |
|
|
F. Нина и игра в баскетбол
графы
Конструктив
снм
сортировки
Структуры данных
*3000
Нина тренирует свою команду по баскетболу. Команда Нины состоит из \(n\) игроков, пронумерованных от \(1\) до \(n\). У \(i\)-го игрока есть интервал рук \([l_i,r_i]\). Два игрока \(i\) и \(j\) (\(i \neq j\)) могут передавать мяч друг другу, только если \(|i-j|\in[l_i+l_j,r_i+r_j]\) (здесь \(|x|\) обозначает абсолютное значение \(x\)). Нина хочет проверить готовность своей команды. Для этого она проведет несколько раундов передач. - В каждом раунде Нина выберет последовательность игроков \(p_1,p_2,\ldots,p_m\) такую, что игроки \(p_i\) и \(p_{i+1}\) могут передавать мяч друг другу для всех \(1 \le i < m\). Длина последовательности \(m\) может быть выбрана Ниной. Каждый игрок может появиться в последовательности \(p_1,p_2,\ldots,p_m\) несколько раз или вообще не появиться в ней.
- Затем Нина бросит мяч игроку \(p_1\), игрок \(p_1\) передаст мяч игроку \(p_2\) и так далее... Игрок \(p_m\) выбросит мяч за пределы баскетбольного поля, так что его больше нельзя будет использовать.
Как тренер, Нина хочет, чтобы каждый из \(n\) игроков участвовал хотя бы в одном раунде передач. Поскольку Нина хочет пойти на свидание после школы, она хочет, чтобы вы вычислили минимальное количество раундов передач, необходимых для выполнения задачи. Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество раундов передач, которое Нина должна провести, чтобы завершить свою работу. Примечание В первых двух наборах входных данных Нина может провести два раунда передач: один с \(p=[1]\) и один с \(p=[2]\). Можно показать, что одного раунда передач недостаточно, поэтому ответ \(2\). В третьем наборе входных данных Нина может провести два раунда передач: один с \(p=[1,3]\) и один с \(p=[2]\). Игрок \(1\) может передать мяч игроку \(3\), так как \(|3-1|=2 \in [1+1,3+3]\). Можно показать, что одного раунда передач недостаточно, поэтому ответ \(2\).
| |
|
|
C. Нарисуйте дерево
геометрия
Деревья
Конструктив
разделяй и властвуй
сортировки
*2200
Даны дерево с n вершинами и n точек на плоскости, никакие три из которых не лежат на одной прямой. Вам надо нарисовать заданное дерево на плоскости, используя заданные точки в качестве вершин. То есть каждой вершине дерева нужно сопоставить ровно одну точку, и каждая точка должна быть сопоставлена какой-либо вершине. Если две вершины дерева соединены ребром, между соответствующими точками должен быть нарисован отрезок. Отрезки, соответствующие несмежным ребрам, не должны иметь общих точек. Отрезки, соответствующие смежным ребрам, должны иметь ровно одну общую точку. Выходные данные Выведите n различных целых чисел от 1 до n через пробел: i-ое число должно равняться номеру вершины, которую надо поместить в i-ую точку (точки нумеруются в порядке их перечисления во входных данных). Если существует несколько решений, выведите любое. Примечание Возможные ответы для примеров приведены ниже.
| |
|
|
A. Всё о Ниме
жадные алгоритмы
игры
математика
сортировки
*1400
Алиса и Боб играют в игру с \(n\) кучками из камней. На каждом ходу игрок выбирает положительное целое число \(k\), которое не превышает размера самой маленькой непустой кучки, и удаляет \(k\) камней из каждой непустой кучки одновременно. Первый игрок, который не может сделать ход (потому что все кучки пусты), проигрывает. Учитывая, что Алиса ходит первой, кто выиграет игру, если оба игрока играют оптимально? Выходные данные Для каждого теста выведите одну строку с именем победителя, предполагая, что оба игрока играют оптимально. Если выигрывает Алиса, выведите «Alice», в противном случае выведите «Bob» (без кавычек). Примечание В первом тесте Алиса может победить, выбрав \(k=3\) на своем первом ходу, что сразу опустошит все кучки. Во втором тесте Алисе придется выбрать \(k=1\) на своем первом ходу, так как есть кучка размера \(1\), поэтому Боб может победить на следующем ходу, выбрав \(k=6\).
| |
|
|
A. Подсчет перестановок
Бинарный поиск
жадные алгоритмы
математика
реализация
сортировки
*1400
У вас есть несколько карточек, на каждой из которых написано целое число от \(1\) до \(n\). В частности, для каждого \(i\) от \(1\) до \(n\) у вас есть \(a_i\) карточек, на которых написано число \(i\). Также есть магазин, который содержит неограниченное количество карточек каждого типа. У вас есть \(k\) монет, поэтому вы можете купить в общей сложности \(k\) дополнительных карточек, а купленные вами карточки могут содержать любые целые числа от \(1\) до \(n\). После покупки новых карточек вы расставляете все свои карточки в линию. Счет расстановки — это количество (непрерывных) подмассивов длины \(n\), которые являются перестановкой массива \([1, 2, \ldots, n]\). Какой максимальный счет вы можете получить? Выходные данные Для каждого набора входных данных выведите в отдельной строке одно целое число — максимальный счет, который вы можете получить. Примечание В первом наборе входных данных искомый (и единственный) массив, который можно получить, — это \([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\) (\(11\) карточек с числом \(1\)), который содержит \(11\) подмассивов, состоящих из перестановки \([1]\). Во втором наборе входных данных мы можем купить \(0\) карточек типа \(1\) и \(4\) карточки типа \(2\), а затем расставить карточки следующим образом: \([1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2]\). Есть \(8\) подмассивов, равных \([1, 2]\), и \(7\) подмассивов, равных \([2, 1]\), что в сумме составляет \(15\) подмассивов, которые являются перестановкой \([1, 2]\). Можно также доказать, что это максимальный счет, который мы можем получить. В третьем наборе входных данных одной из возможных оптимальных расстановок является \([3, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 3]\).
| |
|
|
D. Игра в магазине
жадные алгоритмы
математика
сортировки
Структуры данных
*1900
Алиса и Боб играют в игру в магазине. В магазине есть \(n\) предметов; каждый предмет имеет два параметра: \(a_i\) (цена предмета для Алисы) и \(b_i\) (цена предмета для Боба). Алиса хочет выбрать подмножество (возможно, пустое) предметов и купить их. После этого Боб делает следующее: - если Алиса купила меньше \(k\) предметов, Боб может взять их все бесплатно;
- в противном случае, он возьмет \(k\) предметов, купленные Алисой, бесплатно (Боб сам выбирает, какие \(k\) предметов это будут), а остальные выбранные предметы Боб купит у Алисы и заплатит \(b_i\) за \(i\)-й предмет.
Прибыль Алисы равна \(\sum\limits_{i \in S} b_i - \sum\limits_{j \in T} a_j\), где \(S\) — множество предметов, которые Боб покупает у нее, а \(T\) — множество предметов, которые она покупает в магазине. Другими словами, прибыль Алисы — это разность между тем, сколько Боб платит ей, и тем, сколько она платит за покупку предметов. Алиса хочет максимизировать свою прибыль, Боб хочет минимизировать прибыль Алисы. Ваша задача — посчитать прибыль Алисы, если и Алиса, и Боб действуют оптимально. Выходные данные Для каждого набора входных данных выведите одно целое число — прибыль Алисы, если и Алиса, и Боб действуют оптимально. Примечание В первом наборе входных данных Алисе следует купить \(2\)-й предмет и продать его Бобу, тогда ее прибыль составит \(2 - 1 = 1\). Во втором наборе входных данных Алисе следует купить предметы \(1\), \(2\) и \(3\); затем Боб берет \(1\)-й предмет бесплатно и платит за \(2\)-й и \(3\)-й предметы. Прибыль Алисы составит \((3+2) - (1+2+1) = 1\). Боб мог бы взять \(2\)-й предмет бесплатно; это не изменит прибыль Алисы. Боб не будет брать \(3\)-й предмет бесплатно, так как тогда прибыль Алисы будет равна \(2\).
| |
|
|
A1. Balanced Shuffle (Easy)
реализация
сортировки
*1000
A parentheses sequence is a string consisting of characters "(" and ")", for example "(()((". A balanced parentheses sequence is a parentheses sequence which can become a valid mathematical expression after inserting numbers and operations into it, for example "(()(()))". The balance of a parentheses sequence is defined as the number of opening parentheses "(" minus the number of closing parentheses ")". For example, the balance of the sequence "(()((" is 3. A balanced parentheses sequence can also be defined as a parentheses sequence with balance 0 such that each of its prefixes has a non-negative balance. We define the balanced shuffle operation that takes a parentheses sequence and returns a parentheses sequence as follows: first, for every character of the input sequence, we compute the balance of the prefix of the sequence before that character and write those down in a table together with the positions of the characters in the input sequence, for example: | Prefix balance | 0 | 1 | 2 | 1 | 2 | 3 | 2 | 1 | | Position | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | | Character | ( | ( | ) | ( | ( | ) | ) | ) |
Then, we sort the columns of this table in increasing order of prefix balance, breaking ties in decreasing order of position. In the above example, we get: | Prefix balance | 0 | 1 | 1 | 1 | 2 | 2 | 2 | 3 | | Position | 1 | 8 | 4 | 2 | 7 | 5 | 3 | 6 | | Character | ( | ) | ( | ( | ) | ( | ) | ) |
The last row of this table forms another parentheses sequence, in this case "()(()())". This sequence is called the result of applying the balanced shuffle operation to the input sequence, or in short just the balanced shuffle of the input sequence. You are given a balanced parentheses sequence. Print its balanced shuffle. Output Print the parentheses sequence \(t\) — the balanced shuffle of \(s\).
| |
|
|
A. Моя первая задача на сортировку
реализация
сортировки
*800
Вам даны два целых числа \(x\) и \(y\). Выведите два целых числа: минимум из \(x\) и \(y\), а затем максимум из \(x\) и \(y\). Выходные данные Для каждого набора входных данных выведите два целых числа: минимум из \(x\) и \(y\), за которым следует максимум из \(x\) и \(y\).
| |
|
|
D. Бинарное разбиение
дп
жадные алгоритмы
реализация
сортировки
Строки
*1100
Вам дана бинарная строка\(^{\dagger}\). Пожалуйста, найдите минимальное количество частей, которые вам нужно отрезать, чтобы полученные части можно было переставить в отсортированную бинарную строку. Обратите внимание, что: - каждый символ должен принадлежать ровно одной из частей;
- части должны быть непрерывными подстроками исходной строки;
- вам нужно использовать все части при перестановке.
\(^{\dagger}\) Бинарная строка — это строка, состоящая из символов \(\texttt{0}\) и \(\texttt{1}\). Отсортированная бинарная строка — это бинарная строка, в которой все символы \(\texttt{0}\) идут перед всеми символами \(\texttt{1}\). Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество частей, необходимое для того, чтобы можно было переставить строку в отсортированную бинарную строку. Примечание Первый пример изображен в условии. Можно доказать, что вам понадобится не менее \(3\) частей. Во втором и третьем примерах случаях бинарная строка уже отсортирована, поэтому нужна только \(1\) часть. В четвертом примере вам нужно сделать один разрез между двумя символами и переставить их, чтобы получить строку \(\texttt{01}\).
| |
|
|
E. Найти машину
Бинарный поиск
математика
сортировки
*1500
Тимур находится в машине, двигающейся по числовой прямой от точки \(0\) до точки \(n\). Машина начинает движение из точки \(0\) в минуту \(0\). На прямой находится \(k+1\) знак в точках \(0, a_1, a_2, \dots, a_k\), и Тимур знает, что машина прибудет туда в минуты \(0, b_1, b_2, \dots, b_k\) соответственно. Последовательности \(a\) и \(b\) возрастающие, причем \(a_k = n\). Машина движется с постоянной скоростью между любыми двумя соседними знаками. У Тимура есть \(q\) запросов: каждый запрос будет целым числом \(d\), и Тимур хочет, чтобы вы вывели, сколько минут машина затратит, чтобы добраться до точки \(d\), округленное в меньшую сторону. Выходные данные Для каждого запроса выведите одно целое число — количество минут, затраченных на достижение машиной точки \(d\), округленное в меньшую сторону. Примечание В первом примере машина проходит от точки \(0\) до точки \(10\) за \(10\) минут, поэтому скорость составляет \(1\) единицу в минуту и: - В точке \(0\) время будет \(0\) минут.
- В точке \(6\) время будет \(6\) минут.
- В точке \(7\) время будет \(7\) минут.
Во втором примере машина движется со скоростью \(1\) единицу в минуту между точками \(0\) и \(4\), и со скоростью \(2\) единицы в минуту между \(4\) и \(10\) и: - В точке \(6\) время будет \(5\) минут.
- В точке \(4\) время будет \(4\) минут.
- В точке \(2\) время будет \(2\) минут.
- В точке \(7\) время будет \(5.5\) минут, поэтому ответ — \(5\).
В четвёртом примере машина движется со скоростью \(1.2\) единицы в минуту, поэтому ответы на запросы: - В точке \(2\) время будет \(1.66\dots\) минут, поэтому ответ — \(1\).
- В точке \(6\) время будет \(5\) минут.
- В точке \(5\) время будет \(4.16\dots\) минут, поэтому ответ — \(4\).
| |
|
|
G. XOUR
снм
сортировки
Структуры данных
*1700
Вам дан массив \(a\), состоящий из \(n\) неотрицательных целых чисел. Вы можете поменять местами элементы на позициях \(i\) и \(j\), если \(a_i~\mathsf{XOR}~a_j < 4\), где \(\mathsf{XOR}\) — это побитовая операция XOR. Найдите лексикографически наименьший массив, который можно получить любым количеством обменов. Массив \(x\) лексикографически меньше массива \(y\), если на первой позиции, где \(x\) и \(y\) отличаются, \(x_i < y_i\). Выходные данные Для каждого набора входных данных выведите \(n\) целых чисел — лексикографически наименьший массив, который можно получить любым количеством обменов. Примечание В первом примере вы можете поменять местами любые два элемента, поэтому мы можем получить отсортированный массив. Во втором примере вы можете поменять местами \(2\) и \(1\) (их \(\mathsf{XOR}\) равен \(3\)), \(7\) и \(5\) (их \(\mathsf{XOR}\) равен \(2\)), и \(7\) и \(6\) (их \(\mathsf{XOR}\) равен \(1\)), чтобы получить лексикографически наименьший массив.
| |
|
|
C. Кот, Лиса и Двойной максимум
жадные алгоритмы
Конструктив
математика
реализация
сортировки
*1700
Лиса любит перестановки! Она придумала следующую задачу, и предложила Коту её решить: Вам дано четное целое положительное число \(n\) и перестановка\(^\dagger\) \(p\) длины \(n\). Счет другой перестановки \(q\) длины \(n\) определим как количество локальных максимумов в массиве \(a\) длины \(n\), где \(a_i = p_i + q_i\) для всех индексов \(i\) (\(1 \le i \le n\)). Другими словами, счет \(q\) — это количество \(i\) таких, что \(1 < i < n\) (обратите внимание на строгие неравенства), \(a_{i-1} < a_i\) и \(a_i > a_{i+1}\) (еще раз обратите внимание на строгие неравенства). Найдите перестановку \(q\), которая достигает максимального счета при заданных \(n\) и \(p\). Если таких перестановок несколько, вы можете вывести любую из них. \(^\dagger\) Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) — не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)). Выходные данные Для каждого набора входных данных выведите одну строку, содержащую любую перестановку чисел длины \(n\) (массив \(q\)) такую, что счёт \(q\) максимален при заданных ограничениях. Примечание В первом примере \(a = [3, 6, 4, 7]\). Массив имеет только один локальный максимум (на второй позиции), поэтому счет выбранной перестановки \(q\) равен \(1\). Можно доказать, что этот счет оптимален при заданных ограничениях. В последнем примере полученный массив \(a = [6, 6, 12, 7, 14, 7, 14, 6]\) имеет \(3\) максимума — на третьей, пятой и седьмой позициях.
| |
|
|
E. Кот, Лиса и обмены
графы
математика
сортировки
*2500
Лиса нашла массив \(p_1, p_2, \ldots, p_n\), который является перестановкой длины \(n^\dagger\) чисел \(1, 2, \ldots, n\). Она хочет отсортировать элементы в порядке возрастания. Кот хочет помочь Лисе — он может поменять местами любые два числа \(x\) и \(y\) в массиве, но только если \(l \leq x + y \leq r\) (обратите внимание, что ограничение накладывается на значения элементов, а не на их позиции). Он может делать такие обмены любое число раз. Они не знают числа \(l\), \(r\), но они знают, что \(1 \leq l \leq r \leq 2 \cdot n\). Вам дано число \(n\) и массив \(p_1, p_2, \ldots, p_n\). Определите, сколько пар \((l, r)\), удовлетворяющих условиям, позволяют отсортировать массив, если разрешается менять местами два числа \((x, y)\) таких, что \(l \leq x + y \leq r\) (произвольное число раз, возможно, \(0\)). \(^\dagger\) Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)). Выходные данные Для каждого набора входных данных выведите количество пар целых чисел \((l, r)\), таких, что \(1 \leq l \leq r \leq 2 \cdot n\), и вы сможете отсортировать массив при данных ограничениях. Примечание В первом примере нам нужно иметь возможность поменять местами \(1\) и \(2\), поэтому мы должны иметь возможность поменять местами числа с суммой \(3\). Существует ровно \(6\) пар, удовлетворяющих условию: \((1, 3), (2, 3), (3, 3), (1, 4), (2, 4)\) и \((3, 4)\), поэтому ответ — \(6\). Во втором примере \(11\) пар, удовлетворяющих условию, — это \((1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6), (4, 5)\) и \((4, 6)\). Например, если мы выберем пару \((3, 4)\), то сначала поменяем местами числа \(1\) и \(2\), а затем \(1\) и \(3\), после чего перестановка будет отсортирована.
| |
|
|
B. Симметричное кодирование
реализация
сортировки
Строки
*800
У Поликарпа есть строка \(s\), которая состоит из строчных латинских букв. Он кодирует эту строку по следующему алгоритму: - сначала он строит новую вспомогательную строку \(r\), которая состоит из всех различных букв строки \(s\), записанных в алфавитном порядке;
- далее кодирование происходит так: каждый символ в строке \(s\) заменяется на симметричный ему символ из строки \(r\) (первый символ строки \(r\) будет заменён на последний, второй на предпоследний и так далее).
Например, кодирование строки \(s\)=«codeforces» происходит так: - строка \(r\) получается равной «cdefors»;
- первый символ \(s_1\)='c' заменяется на 's';
- второй символ \(s_2\)='o' заменяется на 'e';
- третий символ \(s_3\)='d' заменяется на 'r';
- ...
- последний символ \(s_{10}\)='s' заменяется на 'c'.
Строка \(r\) и замены для \(s\)="codeforces". Таким образом, результатом кодирования строки \(s\)=«codeforces» является строка «serofedsoc». Напишите программу, которая осуществляет декодирование — то есть по результату кодирования восстанавливает исходную строку \(s\). Выходные данные Для каждого набора входных данных выведите строку \(s\) из которой был получен результат кодирования \(b\).
| |
|
|
F. Игра с отрезанием
Бинарный поиск
Перебор
реализация
сортировки
Структуры данных
*1900
Алиса и Боб снова играли в игру. У них есть клетчатое поле размера \(a \times b\) (\(1 \le a, b \le 10^9\)), на котором расположены \(n\) фишек, в каждой клетке может быть не более одной фишки. Клетка на пересечении \(x\)-й строки и \(y\)-го столбца имеет координаты \((x, y)\). Первой ходила Алиса, игроки ходили по очереди. На каждом ходу игрок мог отрезать несколько (но не все) строк или столбцов с начала или конца оставшегося поля и получить очко за каждую фишку, которая находилась на отрезанной части поля. Каждый ход может быть описан символом 'U', 'D', 'L' или 'R' и числом \(k\): - Если символ равен 'U', то будут отрезаны \(k\) первых строк среди оставшихся;
- Если символ равен 'D', то будут отрезаны \(k\) последних строк среди оставшихся;
- Если символ равен 'L', то будут отрезаны \(k\) первых столбцов среди оставшихся;
- Если символ равен 'R', то будут отрезаны \(k\) последних столбцов среди оставшихся.
По изначальному состоянию поля и ходам игроков определите количество очков, заработанное Алисой и Бобом соответственно. Выходные данные Для каждого набора входных данных выведите два целых числа — количество очков, заработанное Алисой и Бобом соответственно. Примечание Ниже показана игра из первого примера: На своём ходу Алиса отрезала \(2\) строки снизу и получила \(2\) очка, после Боб отрезал \(1\) столбец справа и получил одно очко. Обратите внимание, что если бы Боб отрезал \(1\) строку снизу, он также получил бы \(1\) очко.
| |
|
|
G. Деньги теперь покупают меньше счастья
жадные алгоритмы
сортировки
Структуры данных
*2000
Никогда нельзя купить достаточно счастья, поэтому мы снова здесь! В этой версии вы можете купить только \(h_i = 1\) единицу счастья каждый месяц, но количество месяцев увеличено в разы. Мы находимся в области квантового счастья и временного растяжения. Будучи физиком, Чарли любит планировать свою жизнь в простых и точных терминах. В течение следующих \(m\) месяцев, начиная с нулевой суммы денег, Чарли будет усердно работать и зарабатывать \(x\) фунтов в месяц. Для \(i\)-го месяца \((1 \le i \le m)\) будет одна возможность заплатить стоимость \(c_i\) фунтов за получение одной единицы счастья. Вы не можете купить более одной единицы счастья каждый месяц. Запрещено брать в долг. Деньги, заработанные в \(i\)-м месяце, могут быть потрачены только в более поздний \(j\)-й месяц (\(j>i\)). Поскольку физики не пишут код, помогите Чарли найти максимально достижимое количество единиц счастья. Выходные данные Для каждого набора входных данных выведите одно целое число — максимальное количество счастья, которое может получить Чарли.
| |
|
|
A. Массив Базоки и Мокки
жадные алгоритмы
Перебор
реализация
сортировки
*800
Мокка любит массивы, поэтому перед отъездом Базока подарил ей массив \(a\), состоящий из \(n\) целых положительных чисел. Теперь Мокка хочет узнать, может ли массив \(a\) стать отсортированным в порядке неубывания после выполнения следующей операции несколько (возможно, ноль) раз: - Разделить массив на две части — префикс и суффикс, затем поменять эти две части местами. Другими словами, пусть \(a=x+y\). Тогда мы можем назначить \(a:= y+x\). Здесь \(+\) обозначает операцию конкатенации массивов.
Например, если \(a=[3,1,4,1,5]\), мы можем выбрать \(x=[3,1]\) и \(y=[4,1,5]\), удовлетворяющие \(a=x+y\). Тогда мы можем назначить \(a:= y + x = [4,1,5,3,1]\). Также для начального массива мы можем выбрать \(x=[3,1,4,1,5]\) и \(y=[\,]\), удовлетворяющие \(a=x+y\). Тогда мы можем назначить \(a := y+x = [3,1,4,1,5]\). Заметим, что мы не можем выбрать \(x=[3,1,1]\) и \(y=[4,5]\), а также \(x=[1,3]\) и \(y=[5,1,4]\), так как оба эти варианта не удовлетворяют \(a=x+y\). Выходные данные Для каждого набора входных данных выведите «Yes», если массив \(a\) может стать неубывающим после выполнения операции любое количество раз, и «No», если не может. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание Для первого набора входных данных можно доказать, что массив \(a\) не может стать неубывающим после выполнения операции любое количество раз. Во втором наборе входных данных мы можем выполнить следующие операции, чтобы сделать \(a\) отсортированным в неубывающем порядке: - Разделить массив на две части: \(x=[7]\) и \(y=[9,2,2,3]\), затем поменять эти две части местами. Массив станет равен \(y+x = [9,2,2,3,7]\).
- Разделить массив на две части: \(x=[9]\) и \(y=[2,2,3,7]\), затем поменять местами эти две части. Массив станет равен \(y+x=[2,2,3,7,9]\), то есть станет неубывающим.
| |
|
|
B. Массив 378QAQ и Мокки
жадные алгоритмы
математика
Перебор
сортировки
*1000
Мокка любит массивы, поэтому перед отъездом 378QAQ подарил ей массив \(a\), состоящий из \(n\) целых положительных чисел. Мокка считает массив \(a\) красивым, если существуют два числа \(i\) и \(j\) (\(1\leq i,j\leq n\), \(i\neq j\)) такие, что для всех \(k\) (\(1 \leq k \leq n\)), \(a_k\) делится\(^\dagger\) либо на \(a_i\), либо на \(a_j\). Определите, является ли массив \(a\) красивым. \(^\dagger\) \(x\) делится на \(y\), если существует целое число \(z\) такое, что \(x = y \cdot z\). Выходные данные Для каждого набора входных данных выведите «Yes», если массив \(a\) красивый, и «No» в противном случае. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В первом наборе входных данных любые два числа в массиве являются взаимно простыми, поэтому ответ «No». Во втором наборе входных данных мы можем выбрать \(i=2\) и \(j=1\). Так как каждое число в массиве делится на \(a_i = 1\), то ответом будет «Yes». В третьем наборе входных данных мы можем выбрать \(i=3\) и \(j=5\). \(2\) и \(4\) делятся на \(a_i = 2\), а \(3\), \(6\) и \(12\) делятся на \(a_j = 3\), поэтому ответ «Yes».
| |
|
|
A. Проверка пароля
реализация
сортировки
Строки
*800
Монокарп работает над своим новым сайтом, и сейчас он пытается заставить пользователей выбирать надежные пароли. Монокарп решил, что надежные пароли должны удовлетворять следующим условиям: - пароль должен состоять только из строчных латинских букв и цифр;
- не должно быть цифр, идущих после буквы (то есть, после каждой буквы следует либо другая буква, либо конец строки);
- все цифры должны быть отсортированы в неубывающем порядке;
- все буквы должны быть отсортированы в неубывающем порядке.
Обратите внимание, что разрешено, чтобы пароль состоял только из букв или только из цифр. Монокарпу удалось реализовать первое условие, но он не справляется с оставшимися. Можете ли вы помочь ему проверить пароли? Выходные данные Для каждого набора входных данных выведите «YES», если данный пароль является надежным, и «NO» в противном случае. Примечание Во втором наборе входных данных буквы не отсортированы в неубывающем порядке. В четвертом наборе есть цифра, идущая после буквы — цифра '1' после буквы 'c'.
| |
|
|
F. Удаление мостов
Деревья
дп
жадные алгоритмы
поиск в глубину и подобное
сортировки
Структуры данных
*2800
Вам дано корневое дерево, состоящее из \(n\) вершин, пронумерованных от \(1\) до \(n\). Вершина \(1\) является корнем. Кроме того, у корня есть только один ребенок. Требуется добавить ровно \(k\) рёбер в дерево (возможно, кратные рёбра и/или рёбра, уже существующие в дереве). Напомним, что мост — это такое ребро, что после его удаления количество компонент связности в графе увеличивается. Таким образом, изначально все рёбра дерева являются мостами. После добавления \(k\) рёбер некоторые изначальные рёбра дерева остаются мостами, а некоторые перестают ими быть. Необходимо удовлетворить два условия: - для каждого моста все рёбра дерева в поддереве нижней вершины этого моста также должны быть мостами;
- количество мостов должно быть как можно меньше.
Решите задачу для всех значений \(k\) от \(1\) до \(n - 1\) и выведите наименьшее количество мостов. Выходные данные Для каждого набора входных данных выведите \(n - 1\) целое число. Для каждого \(k\) от \(1\) до \(n - 1\) выведите наименьшее количество мостов, которые могут остаться после добавления \(k\) рёбер в дерево.
| |
|
|
C. Никита и ТЧ
дп
жадные алгоритмы
математика
Перебор
сортировки
Структуры данных
теория чисел
*1900
Никита — студент, увлеченный теорией чисел и алгоритмами. Он столкнулся с интересной задачей, связанной с массивом чисел. Допустим, у Никиты есть массив целых чисел \(a\) длины \(n\). Назовём подпоследовательность\(^\dagger\) массива особенной, если её наименьшее общее кратное (НОК) не содержится в \(a\). НОК пустой подпоследовательности равен \(0\). Никита задался вопросом: какова длина самой длинной особенной подпоследовательности массива \(a\)? Помогите ему ответить на этот важный вопрос! \(^\dagger\) Последовательность \(b\) является подпоследовательностью \(a\), если \(b\) может быть получена из \(a\) путем удаления нескольких (возможно, нуля или всех) элементов, не изменяя порядок оставшихся элементов. Например, \([5,2,3]\) является подпоследовательностью \([1,5,7,8,2,4,3]\). Выходные данные Для каждого набора выведите одно целое число — максимальную длину особенной подпоследовательности \(a\). Примечание В первом наборе входных данных НОК любой непустой подпоследовательности будет содержаться в \(a\), поэтому ответ \(0\). Во втором наборе входных данных можно взять подпоследовательность \([3, 2, 10, 1]\), ее НОК — число \(30\), которое не содержится в \(a\). В третьем наборе входных данных можно взять подпоследовательность \([2, 3, 6, 100\,003]\), ее НОК — число \(600\,018\), которое не содержится в \(a\).
| |
|
|
A. Алиса и книги
жадные алгоритмы
Конструктив
сортировки
*800
У Алисы есть \(n\) книг. \(1\)-я книга содержит \(a_1\) страниц, \(2\)-я книга содержит \(a_2\) страниц, \(\ldots\), \(n\)-я книга содержит \(a_n\) страниц. Алиса делает следующее: - Она разделяет все книги на две непустые стопки. Таким образом, каждая книга оказывается ровно в одной из двух стопок.
- Алиса читает в каждой стопке одну книгу с наибольшим номером.
Алиса очень любит читать. Помогите ей найти, какое максимальное суммарное количество страниц она сможет прочитать, разделив книги на две стопки. Выходные данные Для каждого набора входных данных выведите одно целое число — максимальное количество страниц, которое сможет прочитать Алиса. Примечание В первом наборе входных данных Алиса может положить в первую стопку книгу с номером \(1\), а во вторую стопку книгу с номером \(2\). Тогда она прочитает \(a_1 + a_2 = 1 + 1 = 2\) страницы. Во втором наборе входных данных Алиса может положить книги с номерами \(2\) и \(3\) в первую стопку, а книги с номерами \(1\) и \(4\) во вторую стопку. Тогда из первой стопки она прочитает книгу с наибольшим номером \(3\), а из второй стопки книгу с наибольшим номером \(4\). Тогда она прочитает \(a_3 + a_4 = 3 + 1 = 4\) страницы.
| |
|
|
E. Захватывающая история
Бинарный поиск
сортировки
Структуры данных
*2400
Однажды рейнджер Йцукен стал свидетелем столкновения двух транспортных кораблей. В результате столкновения все содержимое их трюмов раскидало по космосу. И сейчас Йцукен хочет подобрать как можно больше потерянных предметов, чтобы их затем продать. Так случилось, что оба судна перевозили партии новых гравитонных захватов. Захват — прибор, который можно установить на корабль и затем притягивать к себе предметы, находящиеся в космосе, и перемещать в трюм корабля. Всего из потерпевших крушение кораблей вывалилось n гравитонных захватов: i-ый из них находится в точке с координатами (xi, yi). Каждый захват имеет две характеристики — pi (мощность) и ri (радиус действия) — и позволяет притягивать любые предметы массой не более pi на расстоянии не более ri. Сам захват тоже является предметом и имеет собственную массу mi. Корабль Йцукена находится в точке (x, y) и оборудован стареньким магнитным захватом с характеристиками p и r. Других захватов в трюме корабля нет. Определите какое наибольшее количество захватов сможет собрать Йцукен. В процессе сбора предметов Йцукен может произвольно устанавливать себе на корабль любой захват из трюма, в том числе, и только что подобранный (в любой момент времени на корабле может быть установлен только один действующий захват). Считается, что во время сбора все предметы и корабль Йцукена неподвижны (кроме момента притягивания — тогда предмет перемещается в трюм, а корабль все также остается неподвижен). Можно считать, что в трюм корабля могут поместиться все захваты. Любой подобранный захват, а также изначальный захват Йцукена, можно использовать произвольное количество раз. Выходные данные Выведите одно число — наибольшее количество захватов, которые Йцукен может притянуть к себе (имеющийся изначально старенький магнитный захват учитывать не нужно). Примечание В первом примере нужно сначала притянуть к себе второй захват, затем с помощью второго захвата притянуть первый, а затем с помощью первого захвата притянуть себе четвертый. Третий захват притянуть нельзя, поскольку он слишком тяжелый, а пятый находится слишком далеко.
| |
|
|
B. Выбор кубиков
сортировки
сортировки
*800
У Дмитрия есть \(n\) кубиков, пронумерованных слева направо от \(1\) до \(n\). Кубик с номером \(f\) является его любимым. Дмитрий кинул все кубики на стол, на \(i\)-м кубике выпало значение \(a_i\) (\(1 \le a_i \le 100\)). После этого он разложил кубики в порядке невозрастания значений на них, то есть от большего к меньшему. Если на двух кубиках выпало одинаковое значение, то они могут идти в любом порядке. После сортировки Дмитрий убрал первые \(k\) кубиков. Затем ему стало интересно, убрал ли он свой любимый кубик (обратите внимание, что его позиция могла измениться после сортировки). Например, если \(n=5\), \(f=2\), \(a = [4, \color{green}3, 3, 2, 3]\) (любимый кубик выделен зелёным), \(k = 2\), то могло произойти следующее: - После сортировки \(a=[4, \color{green}3, 3, 3, 2]\), так как любимый кубик оказался во второй позиции, он будет убран.
- После сортировки \(a=[4, 3, \color{green}3, 3, 2]\), так как любимый кубик оказался в третьей позиции, он не будет убран.
Выходные данные Для каждого набора входных данных выведите одну строку — «YES», если кубик будет удалён в любом случае, «NO» — если не будет удалён, «MAYBE» — если может быть как удалён, так и оставлен. Вы можете выводить ответ в любом регистре. Например, в качестве ответа будут приняты строки <YES», «nO», «mAyBe».
| |
|
|
B. Выбор кубиков
сортировки
сортировки
*800
У Дмитрия есть \(n\) кубиков, пронумерованных слева направо от \(1\) до \(n\). Кубик с номером \(f\) является его любимым. Дмитрий кинул все кубики на стол, на \(i\)-м кубике выпало значение \(a_i\) (\(1 \le a_i \le 100\)). После этого он разложил кубики в порядке невозрастания значений на них, то есть от большего к меньшему. Если на двух кубиках выпало одинаковое значение, то они могут идти в любом порядке. После сортировки Дмитрий убрал первые \(k\) кубиков. Затем ему стало интересно, убрал ли он свой любимый кубик (обратите внимание, что его позиция могла измениться после сортировки). Например, если \(n=5\), \(f=2\), \(a = [4, \color{green}3, 3, 2, 3]\) (любимый кубик выделен зелёным), \(k = 2\), то могло произойти следующее: - После сортировки \(a=[4, \color{green}3, 3, 3, 2]\), так как любимый кубик оказался во второй позиции, он будет убран.
- После сортировки \(a=[4, 3, \color{green}3, 3, 2]\), так как любимый кубик оказался в третьей позиции, он не будет убран.
Выходные данные Для каждого набора входных данных выведите одну строку — «YES», если кубик будет удалён в любом случае, «NO» — если не будет удалён, «MAYBE» — если может быть как удалён, так и оставлен. Вы можете выводить ответ в любом регистре. Например, в качестве ответа будут приняты строки <YES», «nO», «mAyBe».
| |
|
|
E. Перестановка строк и столбцов
жадные алгоритмы
Конструктив
математика
матрицы
реализация
сортировки
Структуры данных
хэши
*1600
У вас была матрица \(a\) размера \(n\) на \(m\), содержащая перестановку целых чисел от \(1\) до \(n \cdot m\). Перестановкой из \(n\) целых чисел называется массив, содержащий все числа от \(1\) до \(n\) ровно один раз. Например, массивы \([1]\), \([2, 1, 3]\), \([5, 4, 3, 2, 1]\) являются перестановками, а массивы \([1, 1]\), \([100]\), \([1, 2, 4, 5]\) — нет. Матрица содержит перестановку, если при выписывании всех её элементов полученный массив является перестановкой. Матрицы \([[1, 2], [3, 4]]\), \([[1]]\), \([[1, 5, 3], [2, 6, 4]]\) содержат перестановки, а матрицы \([[2]]\), \([[1, 1], [2, 2]]\), \([[1, 2], [100, 200]]\) — нет. За одну операцию вы можете совершить одно из двух следующих действий: - выбрать столбец \(c\) и столбец \(d\) (\(1 \le c, d \le m\), \(c \ne d\)) и поменять эти столбцы местами;
- выбрать строку \(c\) и строку \(d\) (\(1 \le c, d \le n\), \(c \ne d\)) и поменять эти строки местами.
Вы можете совершить любое количество операций. Вам даны исходная матрица \(a\) и матрица \(b\). Ваша задача — определить, можно ли с помощью данных операций сделать из матрицы \(a\) матрицу \(b\). Выходные данные Для каждого набора входных данных выведите «YES», если вторая матрица может быть получена из первой, и «NO» в противном случае. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание Во втором примере исходная матрица выглядит так: \( \begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix} \) При обмене строк \(1\) и \(2\) местами она станет такой: \( \begin{pmatrix} 3 & 4 \\ 1 & 2 \end{pmatrix} \) При обмене столбцов \(1\) и \(2\) местами она станет равна матрице \(b\): \( \begin{pmatrix} 4 & 3 \\ 2 & 1 \end{pmatrix} \)
| |
|
|
F1. Разделение поля (простая версия)
математика
сортировки
Структуры данных
*1900
Это упрощённая версия задачи, она отличается от усложнённой только поставленным вопросом. Простая версия требует только определить, являются ли некоторые значения ненулевыми. В сложной версии нужно определить сами значения. Алиса и Боб делят поле. Поле представляет собой прямоугольник \(n \times m\) (\(2 \le n, m \le 10^9\)), строки пронумерованы от \(1\) до \(n\) сверху вниз, столбцы пронумерованы от \(1\) до \(m\) слева направо. Клетка на пересечении строки \(r\) и столбца \(c\) обозначается как (\(r, c\)). У Боба есть \(k\) (\(2 \le k \le 2 \cdot 10^5\)) фонтанов, все из них расположены в разных клетках поля. Алиса отвечает за разделение поля, но должна соблюсти несколько условий: - для разделения поля Алиса начнёт свой путь в любой свободной (без фонтана) клетке на левой или верхней стороне поля и будет перемещаться, каждый раз двигаясь на соседнюю клетку вниз или вправо, свой путь она закончит на правой или нижней стороне поля;
- этот путь Алисы разделит поле на две части — одна часть будет принадлежать Алисе (в эту часть включаются клетки её пути), другая — Бобу;
- Алисе будет принадлежать та часть, которая включает в себя клетку (\(n, 1\));
- Бобу будет принадлежать та часть, которая включает в себя клетку (\(1, m\)).
Алиса хочет разделить поле так, чтобы получить как можно больше клеток. Боб хочет сохранить владение всеми фонтанами, но один любой из них подарить Алисе. Выведите сначала целое число \(\alpha\) — максимальный возможный размер участка Алисы, если Боб не подарит ей ни один фонтан (т.е. все фонтаны останутся на участке Боба). Далее выведите \(k\) неотрицательных целых чисел \(a_1, a_2, \dots, a_k\), где: - \(a_i=0\), если после того как Боб подарит Алисе \(i\)-й фонтан максимальный возможный размер участка Алисы не увеличится (т.е. останется равным \(\alpha\));
- \(a_i=1\), если после того как Боб подарит Алисе \(i\)-й фонтан максимальный возможный размер участка Алисы увеличится (т.е. станет больше \(\alpha\)).
Выходные данные Для каждого набора входных данных сначала выведите \(\alpha\) — максимальный размер участка, который может принадлежать Алисе, если Боб не подарит ей ни один из фонтанов. В следующую строку выведите \(k\) неотрицательных целых чисел \(a_1, a_2, \dots, a_k\), где: - \(a_i=0\), если после того как Боб подарит Алисе \(i\)-й фонтан максимальный возможный размер участка Алисы не увеличится, по сравнению со случаем, когда все \(k\) фонтанов принадлежат Бобу;
- \(a_i=1\), если после того как Боб подарит Алисе \(i\)-й фонтан максимальный возможный размер участка Алисы увеличится, по сравнению со случаем, когда все \(k\) фонтанов принадлежат Бобу.
Если вместо \(1\) вы выведите любое другое положительное число, которое помещается в 64-битный целочисленный знаковый тип, оно также будет распознано как \(1\). Таким образом, решение усложнённой версии этой задачи также проходит тесты упрощённой. Примечание Ниже приведены изображения для второго примера: Зелёным цветом подписаны номера фонтанов. Синим цветом обозначены клетки, принадлежащие Алисе. Обратите внимание, что если Боб дарит Алисе фонтан \(1\) или фонтан \(3\), то этот фонтан не может находиться на участке Алисы.
| |
|
|
F2. Разделение поля (сложная версия)
математика
сортировки
*2400
Это усложнённая версия задачи, она отличается от упрощённой только поставленным вопросом. Алиса и Боб делят поле. Поле представляет собой прямоугольник \(n \times m\) (\(2 \le n, m \le 10^9\)), строки пронумерованы от \(1\) до \(n\) сверху вниз, столбцы пронумерованы от \(1\) до \(m\) слева направо. Клетка на пересечении строки \(r\) и столбца \(c\) обозначается как (\(r, c\)). У Боба есть \(k\) (\(2 \le k \le 2 \cdot 10^5\)) фонтанов, все из них расположены в разных клетках поля. Алиса отвечает за разделение поля, но должна соблюсти несколько условий: - для разделения поля Алиса начнёт свой путь в любой свободной (без фонтана) клетке на левой или верхней стороне поля и будет перемещаться, каждый раз двигаясь на соседнюю клетку вниз или вправо, свой путь она закончит на правой или нижней стороне поля;
- этот путь Алисы разделит поле на две части — одна часть будет принадлежать Алисе (в эту часть включаются клетки её пути), другая — Бобу;
- Алисе будет принадлежать та часть, которая включает в себя клетку (\(n, 1\));
- Бобу будет принадлежать та часть, которая включает в себя клетку (\(1, m\)).
Алиса хочет разделить поле так, чтобы получить как можно больше клеток. Боб хочет сохранить владение всеми фонтанами, но один любой из них подарить Алисе. Выведите сначала целое число \(\alpha\) — максимальный возможный размер участка Алисы, если Боб не подарит ей ни один фонтан (т.е. все фонтаны останутся на участке Боба). Далее выведите \(k\) неотрицательных целых чисел \(a_1, a_2, \dots, a_k\), где \(a_i\) это такое значение, что после того как Боб подарит Алисе \(i\)-й фонтан максимальный размер её участка будет равен \(\alpha + a_i\). Выходные данные Для каждого набора входных данных сначала выведите \(\alpha\) — максимальный размер участка, который может принадлежать Алисе, если Боб не подарит ей ни один из фонтанов. В следующую строку выведите \(k\) неотрицательных целых чисел \(a_1, a_2, \dots, a_k\), где \(a_i\) это такое значение, что после того как Боб подарит Алисе \(i\)-й фонтан максимальный размер её участка будет равен \(\alpha + a_i\). Примечание Ниже приведены изображения для второго примера: Зелёным цветом подписаны номера фонтанов. Синим цветом обозначены клетки, принадлежащие Алисе. Обратите внимание, что если Боб дарит Алисе фонтан \(1\) или фонтан \(3\), то этот фонтан не может находиться на участке Алисы.
| |
|
|
A. Футбол
жадные алгоритмы
математика
реализация
сортировки
*800
Дима очень любит смотреть футбол. В такой игре счет на табло представляется как \(x\) : \(y\), где \(x\) — количество голов первой команды, а \(y\) — количество голов второй команды. В один момент времени только одна команда может забить гол, то есть счет \(x\) : \(y\) может измениться или на \((x + 1)\) : \(y\), или на \(x\) : \((y + 1)\). Во время просмотра очередного матча по футболу Диму отвлекли по очень важным делам, и после некоторого количества времени он продолжил смотреть матч. Дима помнит, какой счет был до того, как его отвлекли, и какой был, когда он вернулся. Теперь Диму интересует вопрос: могли ли в матче, пока он не смотрел игру, так развиваться события, что команды ни разу не имели равного счета? Гарантируется, что у двух команд не было равного счета ни в тот момент, когда Дима перестал смотреть игру, ни в тот, когда он вернулся. Однако возможен такой случай, что за время его отсутствия счет не поменялся. Помогите Диме и ответьте на вопрос! Выходные данные Для каждого набора входных данных выведите «YES» без кавычек, если могло быть такое, что команды не имели равного счета, иначе выведите «NO» без кавычек. Вы можете вывести каждую букву в любом регистре (например, «YES», «Yes», «yes», «yEs» будут распознаны как положительный ответ). Примечание В первом наборе данных счет, который запомнил Дима, \(1\) : \(0\), как только он перестает следить за матчем, первая команда забивает несколько голов подряд, пока счет не становится \(5\) : \(0\), поэтому ответ YES. Во втором наборе данных счет мог изменяться только так: - \(1\) : \(2\)
- \(2\) : \(2\)
- \(3\) : \(2\)
В этом варианте есть момент, в котором команды имеют равный счет, поэтому ответ NO. В третьем наборе данных один из вариантов развития событий: - \(1\) : \(2\)
- \(1\) : \(3\)
- \(2\) : \(3\)
- \(2\) : \(4\)
- \(2\) : \(5\)
- \(3\) : \(5\)
- \(4\) : \(5\)
В таком варианте не существовало момента времени, где счет был равный, поэтому ответ YES.
| |
|
|
F. И снова задача о сортировке
Бинарный поиск
сортировки
Структуры данных
*2600
У вас есть массив \(a\) из \(n\) элементов. Также есть \(q\) изменений массива. Перед первым изменением и далее после каждого изменения вы бы хотели узнать следующее: Какой подотрезок минимальной длины необходимо отсортировать по неубыванию, чтобы массив \(a\) был полностью отсортирован по неубыванию? Более формально, вы хотите выбрать подотрезок массива \((l, r)\) с минимальным значением \(r - l + 1\). После этого вы отсортируете элементы \(a_{l}, a_{l + 1}, \ldots, a_{r}\) и хотите, чтобы выполнялось условие \(a_{i} \le a_{i + 1}\) для всех \(1 \le i < n\). Если же массив уже отсортирован по неубыванию, то \(l\) и \(r\) стоит считать равными \(-1\). Обратите внимание, что нахождение таких \((l, r)\) никак не меняет массив. А сами изменения имеют вид: присвоить \(a_{pos} = x\) для заданных \(pos\) и \(x\). Выходные данные Для каждого набора входных данных выведите \(q + 1\) строку. В каждой строке должно быть по \(2\) целых числа \(l, r\) — границы минимального подотрезка, при сортировке которого массив \(a\) станет полностью отсортирован. Если \(a\) уже отсортирован, то выведите \(l = -1\), \(r = -1\). Примечание Рассмотрим первый набор входных данных: - Изначально массив отсортирован по неубыванию: \([2, 2, 3, 4, 5]\)
- После первого запроса массив выглядит так: \([\color{red}{2}, \color{red}{1}, 3, 4, 5]\).
- После второго запроса массив выглядит так: \([\color{red}{2}, \color{red}{1}, \color{red}{3}, \color{red}{1}, 5]\).
- После третьего запроса массив выглядит так: \([1, 1, \color{red}{3}, \color{red}{1}, 5]\).
Красным цветом показаны отрезки, которые нужно отсортировать, чтобы весь массив был отсортирован по неубыванию.
| |
|
|
D. Дилемма обмена
жадные алгоритмы
Конструктив
математика
разделяй и властвуй
сортировки
Структуры данных
*1700
Даны два массива \(a\) и \(b\) длины \(n\), состоящих из различных целых положительных чисел, и мы хотим сделать массивы равными. Два массива \(x\) и \(y\) длины \(k\) называются равными, если для всех \(1 \le i \le k\) выполняется \(x_i = y_i\). За один ход можно выбрать некоторые индексы \(l\) и \(r\) в \(a\) (\(l \le r\)) и поменять местами \(a_l\) и \(a_r\), затем выбрать некоторые \(p\) и \(q\) (\(p \le q\)) в \(b\) такие, что \(r-l=q-p\), и поменять местами \(b_p\) и \(b_q\). Можно ли сделать массивы одинаковыми? Выходные данные Для каждого набора входных данных выведите «YES», если массивы \(a\) и \(b\) можно сделать одинаковыми. В противном случае выведите «NO». Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В первом наборе входных данных не нужно выполнять никаких операций, поскольку массивы уже равны. Для второго набора входных данных можно доказать, что не существует способа сделать массивы одинаковыми. В третьем наборе входных данных один из способов сделать массивы равными такой: на первом ходу выбрать \(l=1\), \(r=3\), \(p=1\), \(q=3\), на втором выбрать \(l=1\), \(r=2\), \(p=3\), \(q=4\).
| |
|
|
G. Магический трюк II
Конструктив
реализация
сортировки
*3200
Секрет первого фокуса Оскара раскрыт! Поскольку он все еще хочет произвести впечатление на Луру, ему пришла в голову новая идея: он по-прежнему хочет отсортировать перестановку \(p_1, p_2, \ldots, p_n\) из \([1, 2, \ldots, n]\). На этот раз он выбирает целое число \(k\). Он хочет отсортировать перестановку в неубывающем порядке, используя следующую операцию несколько раз: - Выбрать непрерывный подмассив длины \(k\) и удалить его из \(p\).
- Вставить непрерывный подмассив обратно в \(p\) на любую позицию (возможно, в самое начало или в самый конец).
Чтобы произвести впечатление, Оскар хочет выбрать максимальное значение \(k\), при котором он сможет отсортировать свою перестановку. Пожалуйста, помогите ему найти максимальное значение \(k\), а также последовательность операций, которые отсортируют перестановку. Вам не нужно минимизировать количество операций, но разрешается использовать не более \(5n^2\) операций. Можно доказать, что для максимального \(k\), при котором перестановку можно отсортировать за любое количество операций, ее также можно отсортировать за не более чем \(5n^2\) операций. Выходные данные Для каждого набора входных данных сначала выведите в отдельной строке выбранное значение \(k\) (\(1 \leq k \leq n\)). Затем выведите одно целое число \(m\) — количество использованных операций (\(0 \leq m \leq 5n^2\)). Затем в каждой из следующих \(m\) строк выведите операции, обозначенные двумя целыми числами \(i\) и \(j\) (\(1 \leq i, j \leq n - k + 1\)), представляющие собой операции удаления подмассива, начинающегося с индекса \(i\), и его вставки обратно в \(p\), начиная с индекса \(j\). Примечание В первом наборе входных данных достаточно переместить последние четыре числа в начало. Во втором наборе входных данных можно показать, что мы не можем отсортировать перестановку при \(k = 4\) или \(k = 5\). При \(k = 3\) мы можем переместить первые три числа в конец, а затем средние три —- в начало, чтобы отсортировать перестановку. В третьем наборе входных данных перестановка уже отсортирована. Мы можем выбрать \(k = 6\) и не использовать никаких операций.
| |
|
|
A. Ось X
геометрия
математика
Перебор
сортировки
*800
Вам дано три точки с целочисленными координатами \(x_1\), \(x_2\) и \(x_3\) на оси \(X\) (\(1 \leq x_i \leq 10\)). Вы можете выбрать произвольную точку с целочисленной координатой \(a\) на оси \(X\). Обратите внимание, что точка \(a\) может совпадать с \(x_1\), \(x_2\) или \(x_3\). Пусть \(f(a)\) — это суммарное расстояние от данных точек до точки \(a\). Найдите наименьшее значение \(f(a)\). Расстояние между точками \(a\) и \(b\) равно \(|a - b|\). Например, расстояние между точками \(a = 5\) и \(b = 2\) равно \(3\). Выходные данные Для каждого набора входных данных выведите наименьшее значение \(f(a)\). Примечание В первом наборе входных данных при \(a = 1\) достигается наименьшее значение \(f(a)\): \(f(1) = |1 - 1| + |1 - 1| + |1 - 1| = 0\). Во втором наборе входных данных при \(a = 5\) достигается наименьшее значение \(f(a)\): \(f(5) = |1 - 5| + |5 - 5| + |9 - 5| = 8\). В третьем наборе входных данных при \(a = 8\) достигается наименьшее значение \(f(a)\): \(f(8) = |8 - 8| + |2 - 8| + |8 - 8| = 6\). В четвертом наборе входных данных при \(a = 9\) достигается наименьшее значение \(f(a)\): \(f(10) = |10 - 9| + |9 - 9| + |3 - 9| = 7\).
| |
|
|
B. Стабилизация матрицы
жадные алгоритмы
Перебор
сортировки
Структуры данных
*1000
Вам дана матрица \(n \times m\), где строки пронумерованы от \(1\) до \(n\) сверху вниз, а столбцы пронумерованы от \(1\) до \(m\) слева направо. Элемент на пересечении \(i\)-й строки и \(j\)-го столбца обозначим за \(a_{ij}\). Рассмотрим алгоритм стабилизации матрицы \(a\): - Найти клетку \((i, j)\), такую что ее значение строго больше значения всех соседних с ней клеток. Если такой клетки нет, завершить алгоритм. Если таких клеток несколько, то выбирается клетка с наименьшим значением \(i\), а если и таких несколько, то среди них с наименьшим значением \(j\).
- Сделать \(a_{ij} = a_{ij} - 1\).
- Перейти к шагу \(1\).
В этой задаче клетки \((a, b)\) и \((c, d)\) являются соседними, если у них есть общая сторона, то есть \(|a - c| + |b - d| = 1\). Ваша задача вывести матрицу \(a\) после того, как будет запущен алгоритм стабилизации. Можно показать, что данный алгоритм не может выполняться бесконечное количество итераций. Выходные данные Для каждого набора входных данных выведите \(n\) строк по \(m\) чисел в каждой — значения клеток матрицы \(a\) после алгоритма стабилизации. Примечание В первом наборе входных данных два раза подряд алгоритм выберет клетку \((1, 1)\) и завершится. Во втором наборе входных данных нет клетки, значение которой строго больше значений всех соседних клеток. В третьем наборе входных данных алгоритм выберет клетку \((2, 2)\) и завершится. В четвертом наборе входных данных алгоритм три раза выберет клетку \((1, 1)\) и затем два раза клетку \((2, 3)\).
| |
|
|
C. Запросы обновления
жадные алгоритмы
сортировки
Структуры данных
*1100
Рассмотрим следующую простую задачу. Вам дана строка \(s\) длины \(n\), состоящая из строчных букв латинского алфавита, а также массив индексов \(ind\) длины \(m\) (\(1 \leq ind_i \leq n\)) и строка \(c\) длины \(m\), состоящая из строчных букв латинского алфавита. Далее вы по порядку делали операцию обновления, а именно во время \(i\)-й операции вы делали \(s_{ind_i} = c_i\). Обратите внимание, что вы делаете все \(m\) операций от первой до последней. Конечно же, если поменять порядок индексов в массиве \(ind\) и/или порядок букв в строке \(c\), можно получить разный результат. Найдите какую лексикографически наименьшую строку \(s\) можно получить после \(m\) операций обновления, если вы можете как угодно переставить индексы в массиве \(ind\) и буквы в строке \(c\). Строка \(a\) лексикографически меньше строки \(b\) тогда и только тогда, когда одно из двух условий выполнено: - \(a\) является префиксом \(b\), но \(a \neq b\);
- в первой позиции, в которой \(a\) и \(b\) отличаются, в строке \(a\) стоит символ, который встречается в алфавите раньше, чем соответствующий символ в строке \(b\).
Выходные данные Для каждого набора входных данных выведите лексикографически наименьшую строку \(s\), которую можно получить, если как угодно перемешать индексы в массиве \(ind\) и буквы в строке \(c\). Примечание В первом наборе входных данных можно не перемешивать массив \(ind\) и строку \(c\) и просто сделать все операции именно в таком порядке. Во втором наборе входных данных можно сделать массив \(ind = [1, 1, 4, 2]\) и \(c =\) «zczw». Тогда строка \(s\) будет меняться следующим образом: \(meow \rightarrow zeow \rightarrow ceow \rightarrow ceoz \rightarrow cwoz\). В третьем наборе входных данных можно оставить массив \(ind\) без изменений и сделать \(c = \) «admn». Тогда строка \(s\) будет меняться следующим образом: \(abacaba \rightarrow abacaba \rightarrow abdcaba \rightarrow abdcmba \rightarrow abdcmbn\).
| |
|
|
E. Красивый массив
жадные алгоритмы
математика
сортировки
теория чисел
*1700
Вам дан массив целых чисел \(a_1, a_2, \ldots, a_n\) и целое число \(k\). Вам нужно сделать его красивым за наименьшее количество операций. До применения операций вы можете перемешать элементы массива как угодно. За одну операцию вы можете сделать следующее: - Выбрать индекс \(1 \leq i \leq n\),
- Сделать \(a_i = a_i + k\).
Массив \(b_1, b_2, \ldots, b_n\) является красивым, если \(b_i = b_{n - i + 1}\) для всех \(1 \leq i \leq n\). Найдите наименьшее количество операций, за которое можно сделать массив красивым, или сообщите, что это невозможно. Выходные данные Для каждого набора входных данных выведите наименьшее количество операций, которое нужно сделать, чтобы массив стал красивым, или \(-1\), если это невозможно. Примечание В первом наборе входных данных массив уже является красивым. Во втором наборе входных данных можно не перемешивать массив до операций и \(83966524\) раз сделать операцию с индексом \(i = 1\). В третьем наборе входных данных можно перемешать массив \(a\) и сделать его равным \([2, 3, 1]\). После этого применить операцию с индексом \(i = 3\), чтобы получился массив \([2, 3, 2]\), который является красивым. В восьмом наборе входных данных не существует набора операций и способа перемешать элементы, чтобы сделать массив красивым. В девятом наборе входных данных массив уже является красивым.
| |
|
|
D. Кузнечное дело
дп
жадные алгоритмы
математика
Перебор
сортировки
Структуры данных
*1900
Вы играете в одну известную игру (которая «просто работает»), в которой у вас есть различные навыки, которые можно прокачивать. Сегодня вы сосредоточились на навыке «Кузнечное дело». Ваша тактика довольно проста: ковать оружие из слитков, а затем их переплавлять, чтобы вернуть часть материалов. Для простоты, каждый раз, когда вы создаете предмет, вы получаете \(1\) очко опыта, и каждый раз, когда вы переплавляете предмет, вы также получаете \(1\) очко опыта. В игре есть \(n\) классов оружия, которые вы можете создать, и \(m\) типов металлических слитков. Вы можете создать одно оружие \(i\)-го класса, затратив \(a_i\) слитков металла одного типа. Переплавка одного оружия \(i\)-го класса (которое вы ранее создали) возвращает вам \(b_i\) слитков металла, из которого оно было изготовлено. У вас есть \(c_j\) слитков металла \(j\)-го типа, и вы знаете, что можете создать оружие любого класса из любого типа металла. Каждую комбинацию класса оружия и типа металла можно использовать любое количество раз. Какое максимальное количество очков опыта вы можете заработать, создавая и переплавляя оружие? Выходные данные Выведите одно целое число — максимальное общее количество очков опыта, которое вы можете заработать, многократно создавая и переплавляя оружие. Примечание В первом тесте вы можете сделать следующее: - создать одно оружие \(1\)-го класса из \(1\)-го типа металла, потратив \(9\) слитков;
- переплавить это оружие, вернув \(8\) слитков \(1\)-го типа металла;
- снова создать и переплавить одно оружие \(1\)-го класса из \(1\)-го типа металла;
- создать и переплавить одно оружие \(3\)-го класса из \(1\)-го типа металла;
- создать и переплавить одно оружие \(3\)-го класса из \(3\)-го типа металла;
- создать и переплавить одно оружие \(4\)-го класса из \(1\)-го типа металла;
- создать и переплавить одно оружие \(5\)-го класса из \(3\)-го типа металла;
В конце у вас останется \(c = [2, 4, 2]\) слитков. Всего вы создали \(6\) оружий и переплавили \(6\) оружий, заработав в общей сложности \(12\) очков опыта.
| |
|
|
A. Байт на посылку
жадные алгоритмы
игры
Перебор
сортировки
*900
Алиса и Боб играют в игру на массиве \(a\) размера \(n\). Они поочередно выполняют операции, начинает Алиса. Игрок, который не может выполнить операцию, проигрывает. Есть переменная \(mx\) изначально равная \(0\). За одну операцию игрок может: - Выбрать индекс \(i\) (\(1 \le i \le n\)) такой, что \(a_{i} \geq mx\) и присвоить \(mx\) значение \(a_{i}\). Затем сделать \(a_{i}\) равным \(0\).
Определите, есть ли у Алисы выигрышная стратегия. Выходные данные Для каждого набора входных данных, если у Алисы есть выигрышная стратегия, выведите «YES». В противном случае, выведите «NO». Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В первом наборе входных данных Алиса может выбрать \(i=1\), поскольку \(a_1=2 \ge mx=0\). После операции Алисы, \(a=[0,1]\) и \(mx=2\). Боб не может выполнить никакую операцию. Алиса выигрывает. Во втором наборе входных данных у Алисы нет выигрышной стратегии. Например, если Алиса выбирает \(i=1\), после операции Алисы: \(a=[0,1]\) и \(mx=1\). Тогда Боб может выбрать \(i=2\), так как \(a_2=1 \ge mx=1\). После операции Боба: \(a=[0,0]\) и \(mx=1\). Алиса не может выполнить никакую операцию. Боб выигрывает.
| |
|
|
F. Образуйте треугольники
жадные алгоритмы
математика
Перебор
реализация
сортировки
*2200
Вам даны \(n\) палочек, пронумерованных от \(1\) до \(n\). Длина \(i\)-й палочки равна \(a_i\). Вам нужно ответить на \(q\) запросов. В каждом запросе вам даны два целых числа \(l\) и \(r\) (\(1 \le l < r \le n\), \(r - l + 1 \ge 6\)). Определите, можно ли из палочек с номерами от \(l\) до \(r\) выбрать \(6\) различных палочек, чтобы они образовали \(2\) невырожденных треугольника\(^{\text{∗}}\). Выходные данные Для каждого запроса выведите «YES» (без кавычек), если можно сформировать \(2\) треугольника, и «NO» (без кавычек) в противном случае. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В первом запросе длины палочек равны \([5, 2, 2, 10, 4, 10]\). Два набора палочек \([2, 4, 5]\) и \([2, 10, 10]\) могут быть выбраны для образования \(2\) невырожденных треугольников. Во втором запросе длины палочек равны \([2, 2, 10, 4, 10, 6]\). Можно показать, что невозможно образовать \(2\) невырожденных треугольника. В третьем запросе длины палочек равны \([2, 2, 10, 4, 10, 6, 1]\). Можно выбрать два набора палочек \([1, 2, 2]\) и \([4, 10, 10]\), чтобы образовать \(2\) невырожденных треугольника. В четвертом запросе длины палочек равны \([4, 10, 6, 1, 5, 3]\). Можно показать, что невозможно образовать \(2\) невырожденных треугольника. В пятом запросе длины палочек равны \([10, 4, 10, 6, 1, 5, 3]\). Можно выбрать два набора палочек \([1, 10, 10]\) и \([3, 4, 5]\), чтобы образовать \(2\) невырожденных треугольника.
| |
|
|
A. Одни плюсы
жадные алгоритмы
Конструктив
математика
Перебор
сортировки
*800
Kmes записал три числа \(a\), \(b\) и \(c\), чтобы запомнить, что он должен отдать Noobish_Monk \(a \times b \times c\) бананов. Noobish_Monk нашёл эти три числа и решил не более \(5\) раз сделать следующее: - выбрать одно из трёх чисел;
- увеличить его на \(1\).
Например, если \(a = 2\), \(b = 3\), \(c = 4\), то можно прибавить единицу три раза к \(a\) и два раза к \(b\). Таким образом, \(a = 5\), \(b = 5\), \(c = 4\). Тогда количество бананов, которое должен Kmes равняется \(5 \times 5 \times 4 = 100\). Какое максимальное значение \(a \times b \times c\) Noobish_Monk может получить с помощью описанных операций? Выходные данные Для каждого набора входных данных выведите максимальное количество бананов, которое сможет получить Noobish_Monk от Kmes.
| |
|
|
B. Злой Monk
жадные алгоритмы
математика
сортировки
*800
K1o0n, пустившись в празднование выздоровления, испек огромную \(n\)-метровую картофельную запеканку. Оказывается, Noobish_Monk просто ненавидит картофель, поэтому он решил испортить блюдо K1o0n и порезал его на \(k\) кусочков целой длины \(a_1, a_2, \dots, a_k\) метров. K1o0n был раздосадован, увидев такой террор. Благо все еще можно поправить, за одну операцию он может сделать одно из следующих действий: - Выбрать кусок длины \(a_i \ge 2\) и разделить на два куска с длинами \(1\) и \(a_i - 1\). В результате этого действия количество кусков увеличится на \(1\);
- выбрать кусок \(a_i\) и кусок \(a_j=1\), где \(i \ne j\), и соединить их в один кусок длины \(a_i+1\). В результате этого действия количество кусков уменьшится на \(1\).
Помогите K1o0n определить минимальное количество операций, которое ему предстоит сделать, чтобы склеить запеканку в один целый кусок длины \(n\). Например, если \(n=5\), \(k=2\), \(a = [3, 2]\), то оптимально действовать следующим образом: - Разделить кусок длины \(2\) на куски длины \(1\) и \(2-1=1\), в результате \(a = [3, 1, 1]\).
- Соединить кусок длины \(3\) с куском длины \(1\), в результате \(a = [4, 1]\).
- Соединить кусок длины \(4\) с куском длины \(1\), в результате \(a = [5]\).
Выходные данные Для каждого набора входных данных, выведите минимальное количество операций, за которое K1o0n сможет восстановить свою запеканку после террора Noobish_Monk.
| |
|
|
B1. Букет (легкая версия)
Бинарный поиск
жадные алгоритмы
Перебор
сортировки
*1100
Это легкая версия задачи. Единственное отличие в том, что в этой версии цветы заданы перечислением. Девочка готовится к своему дню рождения и хочет составить невероятной красоты букет. Всего в магазине есть \(n\) цветов, каждый из которых характеризуется своим количеством лепестков; цветок с \(k\) лепестками стоит \(k\) монет. Девочка решила, что количество лепестков у любых двух цветов, которые она будет использовать в составлении своего букета, должно отличаться не более чем на единицу. При этом девочка хочет собрать букет с максимально возможным количеством лепестков. К сожалению, у неё есть только \(m\) монет, и потратить больше она не может. Букет с каким максимальным суммарным количеством лепестков она может собрать? Выходные данные Для каждого набора входных данных выведите одно целое число — максимально возможное количество лепестков в букете, который может собрать девочка, соблюдая все перечисленные выше условия. Примечание В первом наборе входных данных вы можете собрать букет из \((1, 1, 2, 2), (2, 2, 3), (1, 1), (2, 2)\). Максимум из разрешенных букетов, не превышающий \(10\), составляет \(7\) для \((2, 2, 3)\). В третьем наборе входных данных вы можете собрать букет из одного цветка любого типа, поэтому ответ — \(610\). В четвертом наборе входных данных вы можете собрать букет из \((4, 4, 5)\), что даст вам \(13\) лепестков, и это максимальное количество лепестков, которое может купить девочка.
| |
|
|
B2. Букет (сложная версия)
Бинарный поиск
жадные алгоритмы
математика
сортировки
Структуры данных
*1700
Это сложная версия задачи. Единственное отличие в том, что в этой версии вместо перечисления количеств лепестков у каждого цветка задано для всех типов цветов (по количеству лепестков) их количество в магазине. Девочка готовится к своему дню рождения и хочет составить невероятной красоты букет. В магазине представлено в общей сложности \(n\) различных типов цветов, для каждого из перечисленных типов цветов указано их количество в магазине. Цветок с \(k\) лепестками стоит \(k\) монет. Девочка решила, что разница в количестве лепестков между любыми двумя цветами, которые она будет использовать для составления букета, не должна превышать единицы. В то же время девочка хочет собрать букет с максимально возможным количеством лепестков. К сожалению, у неё есть только \(m\) монет, и она не может потратить больше. С каким максимальным количеством лепестков она может собрать букет? Выходные данные Для каждого набора входных данных выведите одно целое число — максимально возможное количество лепестков в букете, который может собрать девочка, соблюдая все перечисленные выше условия. Примечание В первом наборе входных данных некоторые разрешенные букеты — это \((1, 1, 2, 2), (2, 2, 3), (1, 1), (2, 2)\). Максимум из разрешенных букетов, не превышающий \(10\), составляет \(7\) для \((2, 2, 3)\). Во втором наборе входных данных вы можете собрать разрешенный букет из \((206, 206, 207, 207, 207)\) с суммой \(1033\), что является максимальным количеством лепестков, которое может купить девушка. В третьем наборе входных данных вы можете собрать корректный букет из \((5, 5, 5, 4)\) с суммой \(19\). Видно, что ни в одном разрешенном букете не может быть \(20\) лепестков.
| |
|
|
C. Сортировка
дп
жадные алгоритмы
сортировки
Строки
*1200
Вам даны две строки \(a\) и \(b\) длиной \(n\). Затем вам (против вашей воли) придется ответить на \(q\) запросов. Для каждого запроса вам дан отрезок, ограниченный позициями \(l\) и \(r\). За одну операцию вы можете выбрать целое число \(i\) (\(l \leq i \leq r\)) и установить \(a_i = x\), где \(x\) — любой символ, который вы захотите. Выведите минимальное количество операций, которые вам нужно выполнить, чтобы \(\texttt{sorted(a[l..r])} = \texttt{sorted(b[l..r])}\). Операции, которые вы выполняете в одном запросе, не влияют на другие запросы. Для произвольной строки \(c\), \(\texttt{sorted(c[l..r])}\) обозначает подстроку, состоящую из символов \(c_l, c_{l+1}, ... , c_r\), отсортированных в лексикографическом порядке. Выходные данные Для каждого запроса выведите целое число, минимальное количество операций, которые вам нужно выполнить, на новой строке. Примечание Для первого запроса \(\texttt{sorted(a[1..5])} =\) abcde и \(\texttt{sorted(b[1..5])} =\) abcde, поэтому операции не требуются. Для второго запроса вам нужно установить \(a_1 = \) e. Тогда \(\texttt{sorted(a[1..4])} = \texttt{sorted(b[1..4])} = \) bcde.
| |
|
|
B. Черепаха и Свинка играют в игру 2
жадные алгоритмы
игры
сортировки
*800
Черепаха и Свинка играют в игру на последовательности. Им дана последовательность \(a_1, a_2, \ldots, a_n\). Черепаха ходит первой. Животные ходят по очереди(т.е. Черепаха делает первый ход, Свинка делает второй, Черепаха делает третий и т.д.). Игра проходит следующим образом: - Пусть текущая длина последовательности равна \(m\). Если \(m = 1\), игра заканчивается.
- Если игра не закончилась и ходит Черепаха, то Черепаха должна выбрать целое число \(i\) такое, что \(1 \le i \le m - 1\), сделать \(a_i\) равным \(\max(a_i, a_{i + 1})\) и удалить \(a_{i + 1}\).
- Если игра не закончилась и ходит Свинка, то Свинка должна выбрать целое число \(i\) такое, что \(1 \le i \le m - 1\), сделать \(a_i\) равным \(\min(a_i, a_{i + 1})\) и удалить \(a_{i + 1}\).
Черепаха хочет максимизировать значение \(a_1\) в конце, в то время как Свинка хочет минимизировать значение \(a_1\) в конце. Найдите значение \(a_1\) в конце, если оба игрока играют оптимально. Вы можете обратиться к примечаниям для дальнейшего разъяснения. Выходные данные Для каждого набора выведите одно целое число — значение \(a_1\) в конце, если оба игрока играют оптимально. Примечание В первом наборе изначально \(a = [1, 2]\). Черепаха может выбрать только \(i = 1\). Затем она сделает \(a_1\) равным \(\max(a_1, a_2) = 2\) и удалит \(a_2\). Последовательность \(a\) становится \([2]\). Затем длина последовательности становится \(1\), и игра закончится. Значение \(a_1\) равно \(2\), поэтому вы должны вывести \(2\). Во втором наборе один из возможных процессов игры выглядит следующим образом: - Изначально \(a = [1, 1, 2]\).
- Черепаха может выбрать \(i = 2\). Затем она сделает \(a_2\) равным \(\max(a_2, a_3) = 2\) и удалит \(a_3\). Последовательность \(a\) станет \([1, 2]\).
- Свинка может выбрать \(i = 1\). Затем она сделает \(a_1\) равным \(\min(a_1, a_2) = 1\) и удалит \(a_2\). Последовательность \(a\) станет \([1]\).
- Длина последовательности становится \(1\), так что игра закончится. Значение \(a_1\) будет \(1\) в конце.
В четвертом наборе один из возможных процессов игры выглядит следующим образом: - Изначально \(a = [3, 1, 2, 2, 3]\).
- Черепаха может выбрать \(i = 4\). Затем она сделает \(a_4\) равным \(\max(a_4, a_5) = 3\) и удалит \(a_5\). Последовательность \(a\) станет \([3, 1, 2, 3]\).
- Свинка может выбрать \(i = 3\). Затем она сделает \(a_3\) равным \(\min(a_3, a_4) = 2\) и удалит \(a_4\). Последовательность \(a\) станет \([3, 1, 2]\).
- Черепаха может выбрать \(i = 2\). Затем она сделает \(a_2\) равным \(\max(a_2, a_3) = 2\) и удалит \(a_3\). Последовательность \(a\) станет \([3, 2]\).
- Свинка может выбрать \(i = 1\). Затем она сделает \(a_1\) равным \(\min(a_1, a_2) = 2\) и удалит \(a_2\). Последовательность \(a\) станет \([2]\).
- Длина последовательности становится \(1\), так что игра закончится. Значение \(a_1\) будет \(2\) в конце.
| |
|
|
C. Черепаха и хорошие пары
жадные алгоритмы
Конструктив
сортировки
Строки
*1200
Черепаха дает вам строку \(s\), состоящую из строчных латинских букв. Черепаха считает пару целых чисел \((i, j)\) (\(1 \le i < j \le n\)) приятной парой, если и только если существует целое число \(k\), такое что \(i \le k < j\) и выполняются оба из следующих двух условий: - \(s_k \ne s_{k + 1}\);
- \(s_k \ne s_i\) или \(s_{k + 1} \ne s_j\).
Кроме того, Черепаха считает пару целых чисел \((i, j)\) (\(1 \le i < j \le n\)) хорошей парой, если и только если \(s_i = s_j\) или \((i, j)\) является приятной парой. Черепаха хочет переставить буквы в строке \(s\) так, чтобы количество хороших пар было максимизировано. Пожалуйста, помогите ей! Выходные данные Для каждого набора выведите строку \(s\) после перестановки букв, которая максимизирует количество хороших пар. Если есть несколько ответов, выведите любой из них. Примечание В первом наборе \((1, 3)\) является хорошей парой в строке из переставленных букв. Можно заметить, что мы не можем переставить буквы так, чтобы количество хороших пар было больше \(1\). bac и cab также могут быть ответом. Во втором наборе \((1, 2)\), \((1, 4)\), \((1, 5)\), \((2, 4)\), \((2, 5)\), \((3, 5)\) являются хорошими парами в строке из переставленных букв. efddd также может быть ответом.
| |
|
|
C. Делим предметы
жадные алгоритмы
игры
сортировки
*1100
У Алисы и Боба есть \(n\) предметов, которые они хотят разделить между собой, поэтому они решили сыграть в игру. У каждого предмета есть стоимость: \(i\)-й предмет стоит \(a_i\). Игроки ходят по очереди, начиная с Алисы. На каждом ходу игрок выбирает один из оставшихся предметов и забирает его. Игроки ходят, пока не закончатся все предметы. Обозначим суммарную стоимость предметов, взятых Алисой, за \(A\), а суммарную стоимость предметов Боба за \(B\). Тогда итоговый счет игры будет равен \(A - B\). Алиса хочет максимизировать счет, в то время как Боб хочет минимизировать его. Оба, Алиса и Боб, будут играть оптимально. Однако игра состоится завтра, а потому сегодня Боб может немного изменить стоимости предметов. Он может увеличить стоимости \(a_i\) нескольких предметов (возможно, всех или ни одного) на целое значение (возможно одно и то же или на разное для каждого предмета). Однако, общее увеличение должно быть не более \(k\). В противном случае Алиса может заподозрить что-то неладное. Обратите внимание, что Боб не может уменьшать стоимости, только увеличивать. Какого минимально возможного счета может достигнуть Боб? Выходные данные Для каждого набора входных данных выведите одно целое число — минимально возможный счет \(A - B\), учитывая, что Боб заранее увеличит стоимости нескольких (возможно, всех или ни одного) предметов. Примечание В первом наборе Боб может увеличить \(a_1\) на \(5\), сделав стоимости равными \([6, 10]\). Завтра Алиса возьмет \(10\), а Боб возьмет \(6\). Общий счет будет равен \(10 - 6 = 4\), и это минимально возможный результат. Во втором наборе Боб не может изменять стоимости. Таким образом, итоговый счет будет равен \((15 + 10) - 12 = 13\), поскольку Алиса возьмет \(15\), Боб возьмет \(12\), а Алиса — \(10\). В третьем наборе Боб, например, может увеличить \(a_1\) на \(1\), \(a_2\) на \(3\) и \(a_3\) на \(2\). Общее изменение равно \(1 + 3 + 2 \le 6\), и стоимости будут равны \([4, 4, 4, 4]\). Очевидно, что счет будет равен \((4 + 4) - (4 + 4) = 0\). В четвертом наборе Боб может увеличить \(a_1\) на \(3\), сделав стоимости равными \([9, 9]\). Счет будет равен \(9 - 9 = 0\).
| |
|
|
B1. Строгая учительница (простая версия)
жадные алгоритмы
математика
сортировки
*1000
Это простая версия задачи. Единственные отличия между двумя версиями заключаются в ограничениях на \(m\) и \(q\). В этой версии \(m=2\) и \(q=1\). Вы можете делать взломы только в том случае, если обе версии задачи решены. Нарек и Цовак были заняты подготовкой этого раунда, поэтому они не успели сделать домашнее задание, и они решили украсть домашнее задание Давида. Их строгая учительница заметила, что у Давида нет домашнего задания, и теперь хочет его наказать. Она наняла других учительниц, чтобы помочь поймать Давида, и теперь \(m\) учительниц вместе преследуют его. К счастью, они находятся в большом классе, поэтому у Давида есть много мест, где можно спрятаться. Класс можно представить как последовательность клеток, пронумерованных от \(1\) до \(n\), расположенных на прямой. Изначально все \(m\) учительниц и Давид находятся в различных клетках. Затем они делают ходы. Во время каждого хода: - Давид перемещается в соседнюю клетку или остается в текущей.
- Затем каждая из \(m\) учительниц одновременно перемещается в соседнюю клетку или остается в текущей.
Процесс продолжается, пока Давид не будет пойман. Давид пойман, если любая из учительниц (возможно, более одной) находится в той же клетке, что и Давид. Все участники видят ходы других, поэтому все действуют оптимально. Ваша задача — посчитать, сколько ходов потребуется учительницам, чтобы поймать Давида, если они все действуют оптимально. Оптимальность действий означает, что ученик делает свои ходы так, чтобы максимизировать количество ходов, необходимых учительницам, чтобы поймать его. А учительницы координируются друг с другом, чтобы сделать свои ходы так, чтобы минимизировать количество ходов, необходимых для поимки ученика. Кроме того, поскольку Нарек и Цовак считают эту задачу простой, они решили задать вам \(q\) запросов о положении Давида. Примечание: это простая версия, и вам дано только один запрос. Выходные данные Для каждого набора входных данных выведите \(q\) строк, в \(i\)-й из которых содержится ответ на \(i\)-й запрос. Примечание В первом примере ученик может просто остаться в клетке \(2\). Учительница, изначально находящаяся в клетке \(1\), может добраться до клетки \(2\) за один ход. Поэтому ответ — \(1\). Во втором примере ученик должен просто остаться в клетке \(1\). Учительница, изначально находящаяся в клетке \(3\), может добраться до клетки \(1\) за два хода. Поэтому ответ — \(2\).
| |
|
|
B2. Строгая учительница (сложная версия)
Бинарный поиск
жадные алгоритмы
математика
сортировки
*1200
Это простая версия задачи. Единственные отличия между двумя версиями заключаются в ограничениях на \(m\) и \(q\). В этой версии \(m, q \le 10^5\). Вы можете делать взломы только в том случае, если обе версии задачи решены. Нарек и Цовак были заняты подготовкой этого раунда, поэтому они не успели сделать домашнее задание, и они решили украсть домашнее задание Давида. Их строгая учительница заметила, что у Давида нет домашнего задания, и теперь хочет его наказать. Она наняла других учительниц, чтобы помочь поймать Давида, и теперь \(m\) учительниц вместе преследуют его. К счастью, они находятся в большом классе, поэтому у Давида есть много мест, где можно спрятаться. Класс можно представить как последовательность клеток, пронумерованных от \(1\) до \(n\), расположенных на прямой. Изначально все \(m\) учительниц и Давид находятся в различных клетках. Затем они делают ходы. Во время каждого хода: - Давид перемещается в соседнюю клетку или остается в текущей.
- Затем каждая из \(m\) учительниц одновременно перемещается в соседнюю клетку или остается в текущей.
Процесс продолжается, пока Давид не будет пойман. Давид пойман, если любая из учительниц (возможно, более одной) находится в той же клетке, что и Давид. Все участники видят ходы других, поэтому все действуют оптимально. Ваша задача — посчитать, сколько ходов потребуется учительницам, чтобы поймать Давида, если они все действуют оптимально. Оптимальность действий означает, что ученик делает свои ходы так, чтобы максимизировать количество ходов, необходимых учительницам, чтобы поймать его. А учительницы координируются друг с другом, чтобы сделать свои ходы так, чтобы минимизировать количество ходов, необходимых для поимки ученика. Кроме того, поскольку Нарек и Цовак считают эту задачу простой, они решили задать вам \(q\) запросов о положении Давида. Выходные данные Для каждого набора входных данных выведите \(q\) строк, в \(i\)-й из которых содержится ответ на \(i\)-й запрос. Примечание В единственном запросе первого примера ученик может убежать в клетку \(1\). Учительнице потребуется пять ходов, чтобы добраться из клетки \(6\) до клетки \(1\), поэтому ответ — \(5\). Во втором запросе второго примера ученик может просто остаться в клетке \(3\). Учительница, изначально находящаяся в клетке \(4\), может добраться до клетки \(3\) за один ход. Следовательно, ответ — \(1\).
| |
|
|
D. Роберт Гуд и миссис Гуд
жадные алгоритмы
Перебор
сортировки
Структуры данных
*1400
Впечатли своего брата, но не огорчай свою мать. Брат и мать Робина собираются в гости, и Робин должен выбрать день приезда для каждого гостя. Все доступные дни пронумерованы от \(1\) до \(n\). У Робина и его веселой компании запланировано всего \(k\) рискованных 'работ'. \(i\)-я работа проходит между днями \(l_i\) и \(r_i\) включительно, для \(1 \le i \le k\). Посетители остаются на \(d\) непрерывных дней, все эти \(d\) дней должны быть между днем \(1\) и \(n\) включительно. Если работа проходит в любой из \(d\) дней, визит пересекается с работой (длина пересечения не важна). Робин хочет, чтобы визит его брата пересекался с максимальным количеством различных работ, а визит его матери — с минимальным. Найдите подходящие дни начала визита для брата и матери Робина. Если есть несколько подходящих дней, выберите самый ранний. Выходные данные Для каждого набора входных данных выведите два целых числа, лучшие дни начала визитов брата и матери Робина соответственно. Оба визита должны укладываться между днем \(1\) и \(n\) включительно. Примечание В первом примере единственная работа занимает все \(2\) дня, оба гостя должны приехать в день \(1\). Во втором примере день \(2\) пересекается с \(2\) работами, а день \(1\) пересекается только с \(1\). В третьем примере Роберт посещает дни \([1,2]\), миссис Гуд посещает дни \([4,5]\).
| |
|
|
C. Стрижка деревьев
Деревья
жадные алгоритмы
Перебор
поиск в глубину и подобное
сортировки
*1700
Вам дано дерево с \(n\) вершинами, корень которого находится в вершине \(1\). В этой задаче лист — это некорневая вершина со степенью \(1\). За одну операцию можно удалить лист и смежное с ним ребро (возможно, появятся новые листья). Какое минимальное количество операций нужно выполнить, чтобы получилось дерево, также с корнем в вершине \(1\), в котором все листья находятся на одинаковом расстоянии от корня? Выходные данные Для каждого набора входных данных выведите одно целое число: минимальное количество операций, необходимое для достижения цели. Примечание В первых двух наборах входных данных деревья выглядят так: В первом наборе входных данных, удалив ребра \((1, 3)\) и \((2, 5)\), вы получите дерево, у которого все листья (вершины \(6\) и \(7\)) находятся на одинаковом расстоянии от корня (вершины \(1\)), которое равняется \(3\). Ответ — \(2\), так как это минимальное количество ребер, которое нужно удалить для достижения цели. Во втором наборе входных данных удаление ребер \((1, 4)\) и \((5, 7)\) приводит к дереву, в котором все листья (вершины \(4\) и \(5\)) находятся на одинаковом расстоянии от корня (вершины \(1\)), которое равняется \(2\).
| |
|
|
D. Максимум + минимум + количество
дп
жадные алгоритмы
матрицы
реализация
снм
сортировки
Структуры данных
*2200
Дан массив целых положительных чисел \(a_1, a_2, \ldots, a_n\). Вы можете раскрасить некоторые элементы массива в красный цвет, но при этом в нем не должно оказаться двух соседних красных элементов (т.е. для \(1 \leq i \leq n-1\) хотя бы один из \(a_i\) и \(a_{i+1}\) должен не быть красным). Ваш счет — это максимальное значение красного элемента, плюс минимальное значение красного элемента, плюс количество красных элементов. Найдите максимальный счет, который вы можете получить. Выходные данные Для каждого набора входных данных выведите одно целое число: максимально возможный счет, который можно получить, раскрасив некоторые элементы в красный цвет в соответствии с условием. Примечание В первом наборе входных данных вы можете раскрасить массив следующим образом: \([\color{red}{5}, 4, \color{red}{5}]\). Ваш счет составит \(\max([5, 5]) + \min([5, 5]) + \text{size}([5, 5]) = 5+5+2 = 12\). Это максимальный счет, который вы можете получить. Во втором наборе входных данных вы можете раскрасить массив следующим образом: \([4, \color{red}{5}, 4]\). Ваш счет составит \(\max([5]) + \min([5]) + \text{size}([5]) = 5+5+1 = 11\). Это максимальный счет, который вы можете получить. В третьем наборе входных данных вы можете раскрасить массив следующим образом: \([\color{red}{3}, 3, \color{red}{3}, 3, \color{red}{4}, 1, 2, \color{red}{3}, 5, \color{red}{4}]\). Ваш счет составит \(\max([3, 3, 4, 3, 4]) + \min([3, 3, 4, 3, 4]) + \text{size}([3, 3, 4, 3, 4]) = 4+3+5 = 12\). Это максимальный счет, который вы можете получить.
| |
|
|
E1. Сложные отрезки (простая версия)
Бинарный поиск
жадные алгоритмы
математика
разделяй и властвуй
снм
сортировки
Структуры данных
*3300
Это простая версия задачи. В этой версии ограничения на \(n\) и ограничение по времени ниже. Вы можете совершать взломы только в том случае, если решены обе версии задачи. Назовём множество (замкнутых) отрезков сложным, если оно может быть разбито на некоторые подмножества так, что - все подмножества имеют одинаковый размер; и
- пара отрезков пересекается тогда и только тогда, когда эти два отрезка находятся в одном и том же подмножестве.
Вам даны \(n\) отрезков \([l_1, r_1], [l_2, r_2], \ldots, [l_n, r_n]\). Найдите максимальный размер сложного подмножества этих отрезков. Выходные данные Для каждого набора входных данных выведите одно целое число: максимальный размер сложного подмножества заданных отрезков. Примечание В первом наборе входных данных все пары отрезков пересекаются, поэтому оптимально сформировать одну группу, содержащую все три отрезка. Во втором наборе входных данных не существует подходящего разбиения для всех пяти отрезков. Корректное разбиение с четырьмя отрезками выглядит следующим образом: \(\{\{ [1, 5], [2, 4] \}, \{ [6, 9], [8, 10] \}\}\). В третьем наборе входных данных оптимально составить одну группу, содержащую все отрезки, кроме второго.
| |
|
|
E2. Сложные отрезки (сложная версия)
Бинарный поиск
жадные алгоритмы
математика
разделяй и властвуй
снм
сортировки
Структуры данных
*3400
Это сложная версия задачи. В этой версии ограничения на \(n\) и ограничение по времени выше. Вы можете совершать взломы только в том случае, если решены обе версии задачи. Назовём множество (замкнутых) отрезков сложным, если оно может быть разбито на некоторые подмножества так, что - все подмножества имеют одинаковый размер; и
- пара отрезков пересекается тогда и только тогда, когда эти два отрезка находятся в одном и том же подмножестве.
Вам даны \(n\) отрезков \([l_1, r_1], [l_2, r_2], \ldots, [l_n, r_n]\). Найдите максимальный размер сложного подмножества этих отрезков. Выходные данные Для каждого набора входных данных выведите одно целое число: максимальный размер сложного подмножества заданных отрезков. Примечание В первом наборе входных данных все пары отрезков пересекаются, поэтому оптимально сформировать одну группу, содержащую все три отрезка. Во втором наборе входных данных не существует подходящего разбиения для всех пяти отрезков. Корректное разбиение с четырьмя отрезками выглядит следующим образом: \(\{\{ [1, 5], [2, 4] \}, \{ [6, 9], [8, 10] \}\}\). В третьем наборе входных данных оптимально составить одну группу, содержащую все отрезки, кроме второго.
| |
|
|
A. Значимое среднее
жадные алгоритмы
математика
сортировки
Структуры данных
*800
У Пака Чанека есть массив \(a\) из \(n\) целых положительных чисел. Поскольку в настоящее время он изучает, как вычислять среднее арифметическое двух чисел, он хочет попрактиковаться в этом на своем массиве \(a\). Пока в массиве \(a\) есть хотя бы два элемента, Пак Чанек будет выполнять следующую трехшаговую операцию: - Выбрать два различных индекса \(i\) и \(j\) (\(1 \leq i, j \leq |a|\); \(i \neq j\)), где \(|a|\) обозначает текущий размер массива \(a\).
- Добавить \(\lfloor \frac{a_i+a_j}{2} \rfloor\)\(^{\text{∗}}\) в конец массива.
- Удалить из массива элементы \(a_i\) и \(a_j\) и объединить оставшиеся части массива.
Например, предположим, что \(a=[5,4,3,2,1,1]\). Если мы выберем \(i=1\) и \(j=5\), то получим массив \(a=[4,3,2,1,3]\). Если мы выберем \(i=4\) и \(j=3\), то получим массив \(a=[5,4,1,1,2]\). После всех операций массив будет состоять из одного элемента \(x\). Найдите максимально возможное значение \(x\), если Пак Чанек выполнит все операции оптимально. Выходные данные Для каждого набора входных данных выведите одно целое число: максимально возможное значение \(x\) после применения всех операций. Примечание В первом наборе входных данных массив изначально равен \(a=[1,7,8,4,5]\). Пак Чанек выполнит следующие операции: - Выбрать \(i=1\) и \(j=2\), тогда \(a=[8,4,5,4]\).
- Выбрать \(i=3\) и \(j=2\), тогда \(a=[8,4,4]\).
- Выбрать \(i=2\) и \(j=3\), тогда \(a=[8,4]\).
- Выбрать \(i=1\) и \(j=2\), тогда \(a=[6]\).
После всех операций массив состоит из одного элемента \(x=6\). Можно доказать, что не существует последовательности операций, в результате которой число \(x\) будет больше \(6\).
| |
|
|
C2. Координация презентации (сложная версия)
жадные алгоритмы
Конструктив
реализация
сортировки
Структуры данных
*1900
Это сложная версия задачи. В двух версиях отличаются ограничения на \(q\) и ограничение по времени отличаются. В этой версии \(0 \leq q \leq 2 \cdot 10^5\). Вы можете совершать взломы только в том случае, если решены обе версии задачи. Команда, состоящая из \(n\) участников, пронумерованных от \(1\) до \(n\), должна представить слайд-шоу на большом собрании. Слайд-шоу содержит \(m\) слайдов. Имеется массив \(a\) длины \(n\). Изначально участники собрания стоят в очереди в порядке \(a_1, a_2, \ldots, a_n\) от начала до конца. Слайд-шоу состоит из последовательного показа слайдов с \(1\) по \(m\). Каждый слайд будет представлен участником, стоящим в начале очереди. После представления каждого слайда вы можете переместить участника, стоящего в начале очереди, на любую позицию в очереди (без изменения порядка остальных участников). Например, предположим, что очередь участников имеет вид \([\color{red}{3},1,2,4]\). После того как участник \(3\) представит текущий слайд, вы можете изменить очередь участников на \([\color{red}{3},1,2,4]\), \([1,\color{red}{3},2,4]\), \([1,2,\color{red}{3},4]\) или \([1,2,4,\color{red}{3}]\). Также имеется массив \(b\) длины \(m\). Слайд-шоу считается хорошим, если можно так перемещать участников после выступлений, чтобы слайд \(i\) был представлен участником \(b_i\) для всех \(i\) от \(1\) до \(m\). Однако ваш назойливый начальник хочет сделать \(q\) обновлений массива \(b\). В \(i\)-м обновлении он выберет слайд \(s_i\) и участника \(t_i\) и присвоит \(b_{s_i} := t_i\). Заметим, что эти обновления постоянны, то есть изменения, внесенные в массив \(b\), будут применяться при обработке последующих обновлений. Для каждого из \(q+1\) состояний массива \(b\) (начального состояния и после каждого из \(q\) обновлений) определите, является ли слайд-шоу хорошим. Выходные данные Для каждого набора входных данных выведите \(q+1\) строку, соответствующих \(q+1\) состоянию массива \(b\). Выведите «YA», если слайд-шоу хорошее, и «TIDAK» в противном случае. Вы можете выводить ответ в любом регистре (верхнем или нижнем). Например, строки «YA», «Ya», «ya» и «YA» будут распознаны как положительные ответы. Примечание В первом наборе входных данных изначально вам не нужно перемещать участников, так как оба слайда будут представлены участником \(1\), который уже находится в начале очереди. После этого присваивается \(b_1 := 2\), теперь слайд \(1\) должен быть представлен участником \(2\). Это невозможно, так как участник \(1\) представит слайд \(1\) первым. Затем устанавливается \(b_1 = 1\), \(b\) становится таким же, как и начальный \(b\), что делает слайд-шоу хорошим.
| |
|
|
A. Склеивание массивов
жадные алгоритмы
Конструктив
математика
сортировки
*1300
Даны \(n\) массивов \(a_1\), \(\ldots\), \(a_n\). Длина каждого массива равна двум. Таким образом, \(a_i = [a_{i, 1}, a_{i, 2}]\). Вам надо склеить массивы в один массив длины \(2n\) так, чтобы количество инверсий\(^{\dagger}\) в получившемся массиве было как можно меньше. Обратите внимание, что вам не нужно считать само количество инверсий. Более формально, вам надо выбрать перестановку\(^{\ddagger}\) \(p\) длины \(n\), чтобы массив \(b = [a_{p_1,1}, a_{p_1,2}, a_{p_2, 1}, a_{p_2, 2}, \ldots, a_{p_n,1}, a_{p_n,2}]\) содержал как можно меньше инверсий. \(^{\dagger}\)Количество инверсий в массиве \(c\) — это количество пар индексов \(i\) и \(j\), таких что \(i < j\) и \(c_i > c_j\). \(^{\ddagger}\)Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)). Выходные данные Для каждого набора входных данных выведите \(2n\) целых чисел — элементы полученного вами массива. Если существует несколько решений, выведите любое из них. Примечание В первом наборе входных данных мы склеили массивы в порядке \(2, 1\). Рассмотрим инверсии в полученном массиве \(b = [2, 3, 1, 4]\): - \(i = 1\), \(j = 3\), так как \(b_1 = 2 > 1 = b_3\);
- \(i = 2\), \(j = 3\), так как \(b_2 = 3 > 1 = b_3\).
Таким образом, количество инверсий равно \(2\). Можно доказать, что это минимально возможное количество инверсий. Во втором наборе входных данных мы склеили массивы в порядке \(3, 1, 2\). Рассмотрим инверсии в полученном массиве \(b = [2, 1, 3, 2, 4, 3]\): - \(i = 1\), \(j = 2\), так как \(b_1 = 2 > 1 = b_2\);
- \(i = 3\), \(j = 4\), так как \(b_3 = 3 > 2 = b_4\);
- \(i = 5\), \(j = 6\), так как \(b_5 = 4 > 3 = b_6\).
Таким образом, количество инверсий равно \(3\). Можно доказать, что это минимально возможное количество инверсий. В третьем наборе входных данных мы склеили массивы в порядке \(4, 2, 1, 5, 3\).
| |
|
|
B. Покупка лимонада
Бинарный поиск
Конструктив
сортировки
*1100
Есть вендинговый аппарат, в котором продаётся лимонад. Всего в аппарате есть \(n\) ячеек. Вы знаете, что изначально в \(i\)-й ячейке находится \(a_i\) банок лимонада. Также в аппарате есть \(n\) кнопок, каждая кнопка соответствует какой-то ячейке, при этом каждой ячейке соответствует ровно одна кнопка. К сожалению, обозначения на кнопках стёрлись, поэтому вы не знаете, какая кнопка соответствует какой ячейке. Когда вы нажимаете на кнопку, соответствующую \(i\)-й ячейке, происходит одно из двух событий: - Если в \(i\)-й ячейке есть банка лимонада, то она выпадет, и вы заберёте её себе. При этом количество банок лимонада в \(i\)-й ячейке уменьшится на \(1\).
- Если в \(i\)-й ячейке не осталось банок лимонада, то ничего не выпадет.
После нажатия банка выпадает так быстро, что отследить, из какой именно ячейки она выпала, невозможно. Содержимое ячеек скрыто от ваших глаз, поэтому вы не можете видеть, сколько банок осталось в каждой из ячеек. Единственное, что вам известно, это изначальные количества банок в ячейках: \(a_1, a_2, \ldots, a_n\). Определите минимальное количество нажатий на кнопки, которое нужно сделать, чтобы гарантированно получить хотя бы \(k\) банок лимонада. Обратите внимание, что вы можете адаптировать свою стратегию в процессе нажатия на кнопки, основываясь на том, выпала вам банка или нет. Гарантируется, что всего в аппарате есть хотя бы \(k\) банок лимонада. Иными словами, \(k \leq a_1 + a_2 + \ldots + a_n\). Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество нажатий на кнопки, которое нужно сделать, чтобы гарантированно получить хотя бы \(k\) банок лимонада. Примечание В первом наборе входных данных мы можем просто нажать на первую кнопку и получить банку лимонада. Во втором наборе входных данных мы можем нажать на каждую кнопку по одному разу и гарантированно получить \(2\) банки лимонада. Обратите внимание, что если мы просто нажмём на какую-то одну кнопку два раза, то нам может не повезти, и эта кнопка будет соответствовать первой ячейке, и тогда мы получим только \(1\) банку лимонада за два нажатия. В третьем наборе входных данных одна из оптимальных стратегий такова: Нажимаем на первую кнопку дважды. После первого нажатия гарантированно выпадет банка лимонада. Далее есть два варианта: - Если после второго нажатия не выпала банка лимонада, то мы знаем, что эта кнопка обязательно соответствует второй ячейке, так как \(a_2 = 1\) и \(a_1, a_3 > 1\). Тогда мы можем нажать на вторую кнопку два раза, а на третью кнопку один раз. Так как \(a_1, a_3 \geq 2\), то мы гарантированно получим три банки лимонада за эти три нажатия. Таким образом, за \(5\) нажатий мы получим \(4\) банки лимонада.
- Если после второго нажатия выпала банка лимонада, то мы можем сделать одно нажатие на вторую кнопку и одно нажатие на третью кнопку. После каждого из этих нажатий мы гарантированно получим банку лимонада. Таким образом, за \(4\) нажатия мы получим \(4\) банки лимонада.
Можно показать, что за \(4\) нажатия невозможно гарантированно получить \(4\) банки лимонада, поэтому ответ \(5\).
| |
|
|
C. Новая игра
Бинарный поиск
жадные алгоритмы
Перебор
реализация
сортировки
*1300
Монокарп решил сыграть в новую игру. Для игры используется колода из \(n\) карточек, причем на \(i\)-й карточке записано ровно одно целое число \(a_i\). В начале игры на первом ходе Монокарп может взять себе любую карточку из колоды. В процессе каждого следующего хода Монокарп может взять себе ровно одну карточку, на которой записано либо такое же число, которое было записано на карточке, взятой на предыдущем ходе, либо число на единицу большее, чем число, которое было записано на карточке, взятой на предыдущем ходе. Иными словами, если на предыдущем ходе Монокарп взял себе карточку, на которой записано число \(x\), то на текущем ходе он может взять себе либо карточку, на которой записано число \(x\), либо карточку, на которой записано число \(x + 1\). Монокарп может взять любую карточку, которая удовлетворяет этим условиям, независимо от того, где именно она в колоде. После того как Монокарп взял себе карточку на очередном ходе, она удаляется из колоды. По правилам игры количество различных чисел, записанных на карточках, которые Монокарп забрал себе, не должно превышать \(k\). Если после очередного хода Монокарп не может взять карточку, не нарушая описанных правил, игра заканчивается. Перед вами стоит задача определить максимальное количество карточек, которые Монокарп может забрать себе из колоды в процессе игры, если на первом ходе он может взять любую карточку из колоды. Выходные данные Для каждого набора входных данных выведите максимальное количество карточек, которые Монокарп может забрать себе из колоды в процессе игры, если на первом ходе он может взять любую карточку из колоды. Примечание В первом примере Монокарпу нужно взять себе любую из карточек, на которых записано число \(3\). В процессе двух следующих ходов ему нужно взять себе две оставшиеся в колоде карточки, на которых записано число \(3\). В процессе трех следующих ходов ему нужно взять себе три карточки, на которых записано число \(4\). После этого Монокарп не сможет взять ни одной карточки из колоды, при этом у него будет \(6\) карточек.
| |
|
|
C. Фотограф
жадные алгоритмы
сортировки
*1400
Валера давно мечтал работать фотографом, и поэтому купил себе новый фотоаппарат. С каждым днем он получал все больше и больше заказов на фотографии, и в один прекрасный день Валере понадобилась программа, которая будет определять, сколько максимум человек он сможет обслужить. Память фотоаппарата составляет d мегабайт. Фотоаппарат Валеры умеет делать фотографии в высоком и низком качестве. Одна фотография в низком качестве занимает a мегабайт памяти, одна фотография в высоком качестве занимает b мегабайт памяти. По необъяснимым причинам каждый клиент просит сделать ему несколько фотографий в низком и несколько фотографий в высоком качестве. Более формально, i-ый клиент приходит с просьбой сделать ему xi фотографий в низком качестве и yi фотографий в высоком качестве. Валера хочет обслужить как можно больше клиентов, чтобы они остались довольны его работой. Чтобы i-ый клиент остался доволен работой Валеры, ему нужно выполнить заказ клиента полностью, то есть сделать xi фотографий в низком качестве и yi фотографий в высоком качестве. Чтобы сделать одну фотографию в низком качестве, в памяти фотоаппарата должно быть не менее a мегабайт свободной памяти. Аналогично чтобы сделать одну фотографию в высоком качестве, в памяти фотоаппарата должно быть не менее b мегабайт свободной памяти. Изначально память фотоаппарата пуста. Также Валера не удаляет фотографии из фотоаппарата, поэтому память фотоаппарата постепенно заполняется. Посчитайте, какое максимальное количество клиентов Валера сможет успешно обслужить, а также выведите номера этих клиентов. Выходные данные В первую строку выведите ответ на задачу — максимальное количество клиентов, которое Валера сможет успешно обслужить. Во вторую строку выведите номера этих клиентов в произвольном порядке. Все номера должны быть различны. Если ответов несколько, выведите любой из них. Клиенты нумеруются, начиная с 1, в том порядке, в котором они заданы во входных данных.
| |
|
|
E. Перевозки
жадные алгоритмы
сортировки
*2300
Валера приехал в Японию и купил много роботов для своих исследований. Он уже в аэропорте, до вылета осталось совсем немного, поэтому Валере срочно нужно доставить всех роботов до багажного отделения. Роботы самоходные, и некоторые из них даже имеют отсеки для перевозки других роботов. Точнее, про i-го робота известно ci — количество роботов, которое он может перевезти. При этом, каждый из ci перевозимых роботов может дополнительно перевозить других роботов. Однако для того, чтобы роботы поехали, в них нужно залить топливо, поэтому Валера потратил все свои последние деньги и купил S литров топлива. Он узнал, что каждый робот имеет ограничение на преодолеваемое расстояние. Таким образом, у i-го робота, помимо характеристики ci, имеются две характеристики fi и li — количество топлива (в литрах), необходимое i-ому роботу для движения, и максимальное расстояние, которое может проехать робот. Ввиду ограниченного количества времени и топлива, Валера хочет перевезти в багажное отделение максимально возможное количество роботов. Он действует следующим образом. - Сначала Валера выбирает некоторых роботов, которые самостоятельно поедут в багажное отделение. При этом суммарное количество топлива, необходимое для движения всех этих роботов, не должно превосходить S.
- Затем Валера рассаживает роботов по отсекам так, чтобы было перевезено как можно больше роботов. Обратите внимание, что роботы, которые не движутся сами, но находятся на движущихся роботах непосредственно или через других роботов, также могут быть нагружены.
- После этого, все выбранные и рассаженные роботы, вместе с Валерой, отправятся к багажному отделению, а остальные будут утрачены.
До багажного отделения нужно проехать d метров. Поэтому те роботы, которые будут перевозить остальных, должны иметь показатель li не меньше, чем d. Во время движения Валера не может останавливаться и менять каким-либо образом расположение роботов. Помогите Валере узнать, какое максимальное количество роботов удастся увезти домой, и какое при этом минимальное количество топлива придется затратить, ведь оставшееся топливо очень пригодится Валере при исследованиях. Выходные данные Выведите через пробел два целых числа — максимальное количество роботов, которое Валера сможет довезти до багажного отделения, и минимальное количество топлива, которое при этом он затратит. Если Валере не удастся довезти до багажного отделения ни одного робота, то выведите два нуля.
| |
|
|
A. Подарок от орангутана
жадные алгоритмы
Конструктив
математика
сортировки
*800
Исследуя джунгли, вы наткнулись на редкого орангутана с галстуком-бабочкой! Вы пожали орангутану руку и предложили ему немного еды и воды. В ответ... Орангутан подарил вам массив \(a\) длины \(n\). Используя \(a\), вы построили два массива \(b\) и \(c\), каждый из которых будет содержать \(n\) элементов, следующим образом: - \(b_i = \min(a_1, a_2, \ldots, a_i)\) для каждого \(1 \leq i \leq n\).
- \(c_i = \max(a_1, a_2, \ldots, a_i)\) для каждого \(1 \leq i \leq n\).
Определим счёт массива \(a\) как \(\sum_{i=1}^n c_i - b_i\) (т.е. сумму \(c_i - b_i\) по всем \(1 \leq i \leq n\)). Прежде чем вычислять счёт, вы можете переставить элементы \(a\) в любом порядке. Найдите максимальный счёт, который вы можете получить, если оптимально переставите элементы \(a\). Выходные данные Для каждого набора входных данных выведите максимальный счёт, который вы можете получить. Примечание В первом наборе входных данных нет другого способа переставить элементы \(a\). Таким образом, \(b = [69]\) и \(c = [69]\). Единственный возможный счёт — \(69 - 69 = 0\). Во втором наборе входных данных можно переставить элементы \(a\) так: \([7, 5, 6]\). Тогда \(b = [7, 5, 5]\) и \(c = [7, 7, 7]\). Счёт в этом случае будет равен \((7 - 7) + (7 - 5) + (7 - 5) = 4\). Можно показать, что это максимально возможный счёт.
| |
|
|
D. Любимая перестановка ЧТД
реализация
сортировки
Структуры данных
*1700
ЧТД подарили перестановку\(^{\text{∗}}\) \(p\) длины \(n\). У него также есть строка \(s\) длины \(n\), содержащая только символы \(\texttt{L}\) и \(\texttt{R}\). ЧТД любит только те перестановки, которые отсортированы в неубывающем порядке. Чтобы отсортировать \(p\), он может выбирать любые из следующих операций и выполнять их любое количество раз: - Выбрать индекс \(i\) такой, что \(s_i = \texttt{L}\). Затем поменять местами \(p_i\) и \(p_{i-1}\). Гарантируется, что \(s_1 \neq \texttt{L}\).
- Выбрать индекс \(i\) такой, что \(s_i = \texttt{R}\). Затем поменять местами \(p_i\) и \(p_{i+1}\). Гарантируется, что \(s_n \neq \texttt{R}\).
Ему также дается \(q\) запросов. В каждом запросе он выбирает индекс \(i\) и меняет \(s_i\) с \(\texttt{L}\) на \(\texttt{R}\) (или с \(\texttt{R}\) на \(\texttt{L}\)). Обратите внимание, что изменения постоянны. После каждого запроса он спрашивает вас, можно ли отсортировать \(p\) в неубывающем порядке, выполнив вышеупомянутые операции любое количество раз. Обратите внимание, что перед каждым запросом перестановка \(p\) сбрасывается к своему исходному значению. Выходные данные Для каждого запроса выведите «YES» (без кавычек), если возможно отсортировать перестановку, или «NO» (без кавычек) в противном случае. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В первом наборе входных данных \(s = \texttt{RRRLL}\) после первого запроса. ЧТД может отсортировать \(p\) с помощью следующих операций: - Изначально, \(p = [1,4,2,5,3]\).
- Выбрать \(i = 2\) и поменять местами \(p_2\) и \(p_{3}\). Теперь \(p = [1,2,4,5,3]\).
- Выбрать \(i = 5\) и поменять местами \(p_5\) и \(p_{4}\). Теперь \(p = [1,2,4,3,5]\).
- Выбрать \(i = 4\) и поменять местами \(p_4\) и \(p_{3}\). Теперь \(p = [1,2,3,4,5]\), то есть перестановка отсортирована в неубывающем порядке.
Можно показать, что невозможно отсортировать массив после выполнения трёх обновлений первого набора входных данных.
| |
|
|
B. Пенчик и палочки для сатэ
жадные алгоритмы
Перебор
сортировки
*900
Пенчик и его друг Кохане путешествуют по Индонезии, и следующая их остановка — Сурабая! В шумных продуктовых лавках Сурабайи Коханэ купил \(n\) палочек для сатэ и выложил их в линию, причем \(i\)-я палочка для сатэ имеет длину \(p_i\). Известно, что \(p\) — перестановка\(^{\text{∗}}\) длины \(n\). Пенчик хочет отсортировать палочки для сатэ в порядке возрастания их длины, так, чтобы выполнялось \(p_i=i\) для всех \(1\le i\le n\). Для развлечения они придумали правило: они могут менять местами только соседние палочки для сатэ, длина которых отличается ровно на \(1\). Формально, они могут выполнить следующую операцию любое количество раз (возможно, ноль): - Выбрать индекс \(i\) (\(1\le i\le n-1\)) такой, что \(|p_{i+1}-p_i|=1\);
- Поменять местами \(p_i\) и \(p_{i+1}\).
Определите, можно ли отсортировать перестановку \(p\), а значит и палочки для сатэ, выполнив вышеописанную операцию некоторое количество раз. Выходные данные Для каждого набора входных данных выведите «YES», если можно отсортировать перестановку \(p\) с помощью данных операций. В противном случае выведите «NO». Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В первом наборе входных данных мы можем отсортировать перестановку \(p = [2, 1, 3, 4]\), выполнив операцию над индексом \(1\) (\(|p_2 - p_1| = |1 - 2| = 1\)), в результате чего получим \(p = [1, 2, 3, 4]\). Для второго набора входных данных можно доказать, что перестановку \(p = [4, 2, 3, 1]\) невозможно отсортировать данными операциями. Для примера приведём последовательности операций, которые можно выполнить над перестановкой: - Выбрать \(i = 2\) (\(|p_3 - p_2| = |3 - 2| = 1\)). В результате получится \(p = [4, 3, 2, 1]\).
- Выбрать \(i = 1\) (\(|p_2 - p_1| = |3 - 4| = 1\)). В результате получится \(p = [3, 4, 2, 1]\).
- Выбрать \(i = 3\) (\(|p_4 - p_3| = |1 - 2| = 1\)). В результате получится \(p = [3, 4, 1, 2]\).
К сожалению, после выполнения этих операций перестановка \(p\) останется неотсортированной.
| |
|
|
E. Деревья Пенчика и Хлои
Деревья
дп
жадные алгоритмы
математика
поиск в глубину и подобное
реализация
сортировки
Структуры данных
*2100
До отъезда Пенчика и Хлои в Сингапур оставалось всего несколько часов, и им не терпелось увидеть высоченные деревья в Сингапурском ботаническом саду! Пытаясь сдержать свое волнение, Пенчик смастерил дерево с корнями, чтобы занять Хлою и себя. У Пенчика есть корневое дерево\(^{\text{∗}}\), состоящее из \(n\) вершин, пронумерованных от \(1\) до \(n\), с вершиной \(1\) в качестве корня. Хлоя может выбрать целое неотрицательное число \(d\), чтобы создать совершенное бинарное дерево\(^{\text{†}}\) глубины \(d\). Поскольку Пенчик и Хлоя — хорошие друзья, Хлоя хочет, чтобы ее дерево было изоморфно\(^{\text{‡}}\) дереву Пенчика. Чтобы достичь этого, Хлоя может выполнить следующую операцию над своим деревом любое количество раз: - Выбрать ребро \((u,v)\), где \(u\) является родителем \(v\).
- Удалить вершину \(v\) и все ребра, связанные с \(v\), а затем соединить всех бывших детей \(v\) непосредственно с \(u\).
В частности, операция над ребром \((u, v)\), где \(v\) — лист, удалит вершину \(v\) без добавления новых ребер. Поскольку построение совершенного бинарного дерева может занять много времени, Хлоя хочет выбрать минимальное \(d\), такое, чтобы совершенное бинарное дерево глубины \(d\) можно было сделать изоморфным дереву Пенчика с помощью вышеописанной операции. Обратите внимание, что Хлоя не может менять корни деревьев. Выходные данные Для каждого набора входных данных выведите в отдельной строке одно целое число: минимальную глубину совершенного бинарного дерева Хлои. Примечание В первом наборе входных данных можно создать совершенное бинарное дерево глубины \(2\).  Рассмотрим выполнение операции на ребре \(AC\). Рёбра \(AC\), \(CF\) и \(CG\) удаляются, а рёбра \(AF\) и \(AG\) добавляются.  Полученное дерево изоморфно дереву, заданному на входе. Можно доказать, что никакая последовательность операций над бинарным деревом глубины менее \(2\) не может привести к дереву, изоморфному дереву, заданному на входе. Во втором наборе входных данных дерево уже изоморфно совершенному бинарному дереву глубины \(3\).
| |
|
|
C. Тройка
Бинарный поиск
математика
сортировки
*1400
Дан массив \(a\) из \(n\) элементов \(a_1, a_2, \ldots, a_n\). Вы можете выполнить следующую операцию любое количество раз (возможно, \(0\)): - Выберите два целых числа \(i\) и \(j\), где \(1 \le i, j \le n\), и присвойте \(a_i := a_j\).
Найдите минимальное количество операций, необходимых для того, чтобы массив \(a\) удовлетворял условию: - Для каждой попарно различной тройки индексов \((x, y, z)\) (\(1 \le x, y, z \le n\), \(x \ne y\), \(y \ne z\), \(x \ne z\)) существует невырожденный треугольник со сторонами длиной \(a_x\), \(a_y\) и \(a_z\), т.е. \(a_x + a_y > a_z\), \(a_y + a_z > a_x\) и \(a_z + a_x > a_y\).
Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество операций, необходимых для достижения цели. Примечание В первом наборе входных данных одна из возможных последовательностей операций может быть следующей: - Присвоить \(a_1 := a_4 = 4\). Массив станет \([4, 2, 3, 4, 5, 6, 7]\).
- Присвоить \(a_2 := a_5 = 5\). Массив станет \([4, 5, 3, 4, 5, 6, 7]\).
- Присвоить \(a_7 := a_1 = 4\). Массив станет \([4, 5, 3, 4, 5, 6, 4]\).
Можно доказать, что любая тройка элементов с попарно различными индексами в итоговом массиве образует невырожденный треугольник, и нет возможного ответа с использованием менее чем \(3\) операций. Во втором наборе входных данных мы можем присвоить \(a_1 := a_2 = 3\), чтобы получить массив \(a = [3, 3, 2]\). В третьем наборе входных данных, поскольку \(3\), \(4\) и \(5\) являются допустимыми длинами сторон треугольника, нам не нужно выполнять никаких операций с массивом.
| |
|
|
D. Мудрость Дария
жадные алгоритмы
Конструктив
реализация
сортировки
*1600
Дарий Великий строит \(n\) каменных колонн, каждая из которых состоит из основания и либо \(0\), либо \(1\), либо \(2\) фрагментов надписей, расположенных сверху. На каждом ходе Дарий может выбрать две колонны \(u\) и \(v\) такие, чтобы разница в количестве надписей между этими колоннами равнялась ровно \(1\), и перенести одну надпись с колонны с большим количеством надписей на другую. Гарантируется, что по крайней мере одна колонна содержит ровно \(1\) надпись. Поскольку красота является главной опорой исторических зданий, Дарий хочет, чтобы колонны были расположены по возрастанию высоты. Чтобы избежать чрезмерных усилий работников, он просит вас спланировать последовательность из максимум \(n\) ходов, чтобы расположить колонны в порядке неубывания высоты, исходя из количества надписей. Минимизация количества ходов не требуется. Выходные данные Для каждого набора входных данных выведите целое число \(k\) — количество перемещений, использованных для сортировки колонн (\(0 \leq k \leq n\)). Затем выведите \(k\) строк, каждая из которых содержит два целых числа \(u_i\) и \(v_i\) (\(1 \leq u_i, v_i \leq n\)), представляющие индексы колонн, участвующих в \(i\)-м перемещении. Во время каждого хода должно выполняться \(|a_{u_i} - a_{v_i}| = 1\), и одна надпись переносится с колонны с большим количеством надписей на другую. Можно доказать, что при заданных ограничениях решение всегда существует. Примечание Состояние колонн в первом наборе входных данных: - Изначально: \(0, 2, 0, 1\)
- После первого хода: \(0, 1, 0, 2\)
- После второго хода: \(0, 0, 1, 2\)
Состояние колонн во втором наборе входных данных: - Изначально: \(1, 2, 0\)
- После первого хода: \(0, 2, 1\)
- После второго хода: \(0, 1, 2\)
В третьем наборе входных данных высоты колонн уже отсортированы в порядке возрастания.
| |
|
|
F1. Хайям и Королевский указ (простая версия)
дп
Комбинаторика
математика
сортировки
*2500
Это простая версия задачи. В двух версиях отличаются ограничения на \(k\) и на сумму \(k\). В древней Персии Хайям, умный купец и математик, играет в игру со своим драгоценным сундуком с сокровищами. Сундук содержит \(n\) красных рубинов стоимостью \(2\) динара каждый и \(m\) синих сапфиров стоимостью \(1\) динар каждый. У него также есть мешок, в котором изначально ничего нет, и \(k\) свитков с парами \((r_1, b_1), (r_2, b_2), \ldots, (r_k, b_k)\), описывающими особые состояния. Игра состоит из \(n + m\) таких ходов: - Хайям случайно равновероятно достает драгоценный камень из сундука.
- Он кладет данный камень в свой мешок.
- Если существует свиток \(i\) (\(1 \leq i \leq k\)), для которого в сундуке находятся ровно \(r_i\) красных рубинов и \(b_i\) синих сапфиров, то по королевскому указу стоимость всех драгоценных камней в его мешке удваивается в качестве награды за достижение особого состояния.
Обратите внимание, что стоимость некоторых драгоценных камней может быть изменена несколькими указами, и тогда она удваивается несколько раз. Определите математическое ожидание стоимости камней в мешке Хайяма в конце игры по модулю \(998,244,353\). Формально, пусть \(M = 998,244,353\). Можно показать, что точный ответ может быть представлен в виде несократимой дроби \(\frac{p}{q}\), где \(p\) и \(q\) — целые числа, и \(q \not \equiv 0 \pmod{M}\). Выведите целое число, равное \(p \cdot q^{-1} \bmod M\). Другими словами, выведите такое целое число \(x\), что \(0 \le x < M\) и \(x \cdot q \equiv p \pmod{M}\). Выходные данные Для каждого набора входных данных выведите одно целое число: математическое ожидание стоимости камней в мешке Хайяма в конце процесса по модулю \(998,244,353\). Примечание В первом наборе входных данных, в конце процесса всегда будет \(3\) красных рубина и \(4\) синих сапфира. Ни одно из особых состояний, описанных в свитках, не соблюдено, поэтому стоимость мешка Хайяма остается неизменной. Общая стоимость мешка в конце всегда равна \(2 \cdot 3 + 1 \cdot 4 = 10\). Во втором наборе входных данных рассмотрим два случая: - С вероятностью \(1/2\) Хайям вытянет красный рубин, и стоимость его мешка станет равна \(2\). Затем, с вероятностью \(1\) он вытянет синий сапфир, и стоимость его мешка станет равной \(3\).
- С вероятностью \(1/2\) Хайям вытянет синий сапфир, и стоимость его мешка станет равной \(1\). На данный момент в сундуке находятся \(r_1 = 1\) красный рубин и \(b_1 = 0\) синих сапфиров, что соответствует особому состоянию, описанному в свитке. В результате стоимость мешка удваивается до \(2 \cdot 1 = 2\). Затем, с вероятностью \(1\), он вытянет красный рубин, и стоимость его мешка возрастёт до \(4\).
Таким образом, ожидаемая стоимость в конце равна \(\frac{1}{2} \cdot 3 + \frac{1}{2} \cdot 4 = \frac{7}{2}\), что равно \(499,122,180\) по модулю \(998,244,353\).
| |
|
|
F2. Хайям и Королевский указ (сложная версия)
дп
Комбинаторика
математика
сортировки
*2800
Это сложная версия задачи. В двух версиях отличаются ограничения на \(k\) и на сумму \(k\). В древней Персии Хайям, умный купец и математик, играет в игру со своим драгоценным сундуком с сокровищами. Сундук содержит \(n\) красных рубинов стоимостью \(2\) динара каждый и \(m\) синих сапфиров стоимостью \(1\) динар каждый. У него также есть мешок, в котором изначально ничего нет, и \(k\) свитков с парами \((r_1, b_1), (r_2, b_2), \ldots, (r_k, b_k)\), описывающими особые состояния. Игра состоит из \(n + m\) таких ходов: - Хайям случайно равновероятно достает драгоценный камень из сундука.
- Он кладет данный камень в свой мешок.
- Если существует свиток \(i\) (\(1 \leq i \leq k\)), для которого в сундуке находятся ровно \(r_i\) красных рубинов и \(b_i\) синих сапфиров, то по королевскому указу стоимость всех драгоценных камней в его мешке удваивается в качестве награды за достижение особого состояния.
Обратите внимание, что стоимость некоторых драгоценных камней может быть изменена несколькими указами, и тогда она удваивается несколько раз. Определите математическое ожидание стоимости камней в мешке Хайяма в конце игры по модулю \(998,244,353\). Формально, пусть \(M = 998,244,353\). Можно показать, что точный ответ может быть представлен в виде несократимой дроби \(\frac{p}{q}\), где \(p\) и \(q\) — целые числа, и \(q \not \equiv 0 \pmod{M}\). Выведите целое число, равное \(p \cdot q^{-1} \bmod M\). Другими словами, выведите такое целое число \(x\), что \(0 \le x < M\) и \(x \cdot q \equiv p \pmod{M}\). Выходные данные Для каждого набора входных данных выведите одно целое число: математическое ожидание стоимости камней в мешке Хайяма в конце процесса по модулю \(998,244,353\). Примечание В первом наборе входных данных, в конце процесса всегда будет \(3\) красных рубина и \(4\) синих сапфира. Ни одно из особых состояний, описанных в свитках, не соблюдено, поэтому стоимость мешка Хайяма остается неизменной. Общая стоимость мешка в конце всегда равна \(2 \cdot 3 + 1 \cdot 4 = 10\). Во втором наборе входных данных рассмотрим два случая: - С вероятностью \(1/2\) Хайям вытянет красный рубин, и стоимость его мешка станет равна \(2\). Затем, с вероятностью \(1\) он вытянет синий сапфир, и стоимость его мешка станет равной \(3\).
- С вероятностью \(1/2\) Хайям вытянет синий сапфир, и стоимость его мешка станет равной \(1\). На данный момент в сундуке находятся \(r_1 = 1\) красный рубин и \(b_1 = 0\) синих сапфиров, что соответствует особому состоянию, описанному в свитке. В результате стоимость мешка удваивается до \(2 \cdot 1 = 2\). Затем, с вероятностью \(1\), он вытянет красный рубин, и стоимость его мешка возрастёт до \(4\).
Таким образом, ожидаемая стоимость в конце равна \(\frac{1}{2} \cdot 3 + \frac{1}{2} \cdot 4 = \frac{7}{2}\), что равно \(499,122,180\) по модулю \(998,244,353\).
| |
|
|
G1. Часы Симурга (простая версия)
жадные алгоритмы
Конструктив
реализация
сортировки
*3500
Единственное различие между двумя версиями задачи заключается в том, учитываются ли пересечения во всех точках или только в целых точках. Легендарная мифическая птица Симург отвечает за охрану обширных земель, и для этой цели она наняла \(n\) бдительных воинов. Каждый воин находится в боевой готовности в течение определенного отрезка времени \([l_i, r_i]\), где \(l_i\) — время начала (включительно), а \(r_i\) — время окончания (включительно), оба являются целыми положительными числами. Один из доверенных советников Симурга, Зал, обеспокоен тем, что если несколько воинов будут караулить в одно и то же время и будут одеты в один и тот же цвет, они могут стать неотличимыми, что вызовет путаницу в дозоре. Чтобы предотвратить это, всякий раз, когда несколько воинов находятся на страже в один и тот же (возможно, нецелый) момент времени, должен быть хотя бы один цвет, который носит ровно один воин. Таким образом, ваша задача состоит в том, чтобы определить минимальное необходимое количество цветов и назначить цвет \(c_i\) каждому отрезку дозора воина \([l_i, r_i]\) таким образом, чтобы для каждого (возможно, нецелого) момента времени \(t\) существовал цвет, который принадлежит ровно одному отрезку, содержащему \(t\). Выходные данные Для каждого набора входных данных: - Выведите минимальное необходимое количество цветов \(k\).
- Затем выведите строку из \(n\) целых чисел \(c_i\) (\(1 \leq c_i \leq k\)), где каждое \(c_i\) — это цвет, присвоенный \(i\)-му воину.
Примечание Мы можем представить отрезок наблюдения каждого воина в виде отрезка по оси X; В 1 наборе входных данных у нас есть два независимых отрезка, которые могут быть окрашены в один и тот же цвет. Во 2 наборе входных данных точка 2 является общей для двух отрезков, что означает, что мы не можем раскрасить их в один и тот же цвет. В 3 наборе входных данных отрезки могут быть окрашены, как показано ниже (отрезки покрашены в выбранный цвет; области закрашены цветом, если данный цвет встречается в этот момент времени ровно один раз): В 4 наборе входных данных отрезки могут быть окрашены, как показано ниже: В 5 наборе входных данных отрезки могут быть окрашены, как показано ниже. Изображение справа демонстрирует пример неправильной раскраски для этого набора входных данных; на момент времени \(5.5\) нет уникального цвета:
| |
|
|
B. Стартап
жадные алгоритмы
сортировки
*800
Арсений придумал очередной бизнес-план — продавать газировку в автомате! Для этого он приобрёл автомат с \(n\) полками, а также \(k\) бутылок, \(i\)-я бутылка характеризуется номером бренда \(b_i\) и стоимостью \(c_i\). На каждую полку можно поставить сколько угодно бутылок, но все бутылки на одной полке должны быть одного и того же бренда. Арсений знает, что все бутылки, которые он выставит на полки автомата, будут проданы. Поэтому он попросил вас вычислить, какую максимальную сумму он сможет заработать. Выходные данные Для каждого набора входных данных выведите одно целое число — максимальную сумму, которую может заработать Арсений. Примечание В первом наборе входных данных у Арсения \(3\) полки в автомате. Он может расположить, например, две бутылки бренда \(2\) на первой полке и бутылку бренда \(1\) на второй. Тогда суммарная стоимость бутылок будет равна \(6 + 7 + 15 = 28\). Во втором наборе у него есть только одна полка. Нетрудно показать, что оптимальным вариантом будет разместить на ней бутылку бренда \(1\). Тогда суммарная стоимость будет равна \(15\). В третьем наборе входных данных у него есть целых \(6\) полок, поэтому он может разместить все имеющиеся бутылки итоговой стоимостью \(7 + 5 = 12\).
| |
|
|
F. Пылающее Пламя
Бинарный поиск
математика
сортировки
Структуры данных
*2100
Вы получили нового ограниченного персонажа события Шилонен. Вы решаете использовать её в бою. На линии находится \(n\) врагов. \(i\)-й враг слева имеет здоровье \(h_i\) и в данный момент находится на позиции \(x_i\). У Шилонен есть урон от атаки \(m\), и вы готовы победить врагов с её помощью. У Шилонен есть мощная атака «удар по земле». Перед тем, как вы выполните какие-либо атаки, вы выбираете целое число \(p\) и размещаете Шилонен там (\(p\) может быть любой целой позицией, включая позицию с врагом в данный момент). После этого, за каждую атаку она наносит \(m\) урона врагу на позиции \(p\) (если таковой имеется), \(m-1\) урона врагам на позициях \(p-1\) и \(p+1\), \(m-2\) урона врагам на позициях \(p-2\) и \(p+2\), и так далее. Враги, находящиеся на расстоянии не менее \(m\) от Шилонен, не получают урона от атак. Формально, если враг находится на позиции \(x\), она нанесет \(\max(0,m - |p - x|)\) урона этому врагу за каждую атаку. Обратите внимание, что вы не можете выбрать другое \(p\) для разных атак. Среди всех возможных \(p\) выведите минимальное количество атак, которые Шилонен должна выполнить, чтобы победить как минимум \(k\) врагов. Если невозможно найти \(p\), при котором в конечном итоге будет побеждено как минимум \(k\) врагов, выведите \(-1\) вместо этого. Обратите внимание, что враг считается побежденным, если его здоровье достигает \(0\) или ниже. Выходные данные Для каждого набора входных данных выведите целое число на новой строке, минимальное количество атак, которые должны быть выполнены, чтобы победить как минимум \(k\) врагов. Если невозможно найти \(p\), при котором в конечном итоге будет побеждено как минимум \(k\) врагов, выведите \(-1\) вместо этого. Примечание В первом примере оптимально выбрать \(p=2\). За каждую атаку первый враг получает \(5-|2-1|=4\) урона, второй враг получает \(5\) урона, третий враг получает \(4\) урона, четвертый враг получает \(3\) урона, а пятый враг получает \(2\) урона. После \(2\) атак первые три врага будут побеждены. Можно показать, что невозможно победить \(3\) врага менее чем за \(2\) атаки, независимо от выбранного \(p\). Во втором примере мы должны убить всех \(9\) врагов. Выбрав \(p=5\), все девять врагов будут побеждены за \(2\) атаки. В третьем примере мы должны убить обоих врагов. Однако можно показать, что ни одно выбранное \(p\) не повредит обоих врагов одновременно, поэтому ответ будет \(-1\). В четвертом примере выбор \(p=1\) позволит нам победить первого врага за \(6969697\) атак. В пятом примере выбор \(p=10\) заставит каждого врага получать \(1\) урон за атаку. Оба врага будут побеждены за \(15\) атак.
| |
|
|
C. DIY
геометрия
жадные алгоритмы
сортировки
Структуры данных
*1400
You are given a list of \(n\) integers \(a_1, a_2, \dots, a_n\). You need to pick \(8\) elements from the list and use them as coordinates of four points. These four points should be corners of a rectangle which has its sides parallel to the coordinate axes. Your task is to pick coordinates in such a way that the resulting rectangle has the maximum possible area. The rectangle can be degenerate, i. e. its area can be \(0\). Each integer can be used as many times as it occurs in the list (or less). Output For each test case, print the answer as follows: - if it is impossible to construct a rectangle which meets the constraints from the statement, print a single line containing the word NO (case-insensitive);
- otherwise, in the first line, print YES (case-insensitive). In the second line, print \(8\) integers \(x_1, y_1, x_2, y_2, x_3, y_3, x_4, y_4\) — the coordinates of the corners of the rectangle. You can print the corners in any order.
| |
|
|
F. Alternative Platforms
бпф
Комбинаторика
математика
сортировки
Структуры данных
*2500
Suppose you are working in the Ministry of Digital Development of Berland, and your task is to monitor the industry of video blogging. There are \(n\) bloggers in Berland. Recently, due to the poor state of the main video platform in Berland, two alternative platforms were introduced. That's why bloggers started to reupload their videos to these alternative platforms. You've got the statistics that the \(i\)-th blogger uploaded \(v_i\) videos to the first alternative platform and \(r_i\) videos to the second alternative platform. You think that a potential user will be upset if even at least one of his favorite bloggers doesn't upload anything. However, if a blogger uploads videos to both platforms, the user will watch that blogger on the platform where more videos are available. So, you've come up with the following function to estimate user experience. Suppose a user watches \(k\) bloggers \(b_1, b_2, \dots, b_k\); then, let user experience be \(\)E(b_1, \dots, b_k) = \max\left(\min_{i=1..k}{v[b_i]}, \min_{i=1..k}{r[b_i]}\right).\(\) In order to get some statistics, you want to calculate the value \(\mathit{avg}_k\) that is equal to an average experience among all subsets of bloggers of size \(k\). Also, you have to calculate \(\mathit{avg}_k\) for each \(k\) from \(1\) to \(n\). Since answers may be too large, print them modulo \(998\,244\,353\). Output Print \(n\) integers \(\mathit{avg}_1, \mathit{avg}_2, \dots, \mathit{avg}_n\). It can be proven that \(\mathit{avg}_k\) may be represented as an irreducible fraction \(\dfrac{x}{y}\) where \(y \not\equiv 0 \pmod{998\,244\,353}\). So, print \(\mathit{avg}_k\) in a form \(x \cdot y^{-1} \bmod 998\,244\,353\). Note In the first example, \(332748119\) is \(\frac{4}{3}\). In the third example, \(199648873\) is \(\frac{12}{5}\).
| |
|
|
H1. Крутые прогулки с обменом (простая версия)
Конструктив
реализация
сортировки
*3500
Это простая версия задачи. Единственное различие между двумя версиями задачи — количество операций, которые вы можете сделать. Вы можете совершать взломы только в том случае, если решены обе версии задачи. Вам дан массив \(a\) длины \(n\). Крутая прогулка с обменом — это следующий процесс: - В сетке \(n \times n\) обозначим ячейку в строке \(i\) и столбце \(j\) как \((i, j)\). Вам нужно пройти от \((1,1)\) до \((n,n)\), делая только шаги вправо или вниз.
- Формально, если вы находитесь в \((x,y)\) в данный момент, вы можете сделать шаг в \((x+1,y)\) или \((x,y+1)\), но вы не можете выйти за границы сетки.
- Когда вы делаете шаг в \((i,j)\), вы должны поменять местами \(a_i\) и \(a_j\), если \(i \neq j\).
Вы можете выполнить не более \(2n+4\) крутых прогулок с обменом. Отсортируйте массив \(a_1, a_2, \ldots, a_n\) в неубывающем порядке. Можно показать, что это всегда можно сделать. Выходные данные Для каждого набора входных данных вывод должен состоять из нескольких строк: - Первая строка содержит целое число \(k\) (\(0 \leq k \leq 2n+4\)), представляющее количество крутых прогулок с обменом, которое вы выполняете.
- Каждая из следующих \(k\) строк содержит строку \(s\) длины \(2n-2\), состоящую только из R и D, представляющую путь (буквы чувствительны к регистру). Для всех \(1 \le i \le 2n-2\), если \(s_i=\) R, то на \(i\)-м шаге вы идёте направо, иначе на \(i\)-м шаге вы идёте вниз.
Примечание В первом наборе входных данных массив \(a\) уже является неубывающим, поэтому вам не нужно выполнять никаких прогулок. Во втором наборе входных данных изначально \(a=[2,1,3]\). На первой прогулке: - На \(1\)-м шаге вы делаете шаг вправо в клетку \((1,2)\). Затем, \(a=[1,2,3]\). Обратите внимание, что хотя массив \(a\) уже является неубывающим, вы не можете остановиться, пока не достигнете \((n,n)\).
- На \(2\)-м шаге вы делаете шаг вправо в \((1,3)\). Тогда \(a=[3,2,1]\).
- На \(3\)-м шаге вы делаете шаг вниз в \((2,3)\). Тогда, \(a=[3,1,2]\).
- На \(4\)-м шаге вы спускаетесь в \((3,3)\). Тогда, \(a=[3,1,2]\).
На второй прогулке: - На \(1\)-м шаге вы опускаетесь в \((2,1)\). Тогда \(a=[1,3,2]\).
- На \(2\)-м шаге вы делаете шаг вправо в \((2,2)\). Тогда, \(a=[1,3,2]\).
- На \(3\)-м шаге вы делаете шаг вниз в \((3,2)\). Тогда, \(a=[1,2,3]\).
- На \(4\)-м шаге вы опускаетесь в \((3,3)\). Тогда, \(a=[1,2,3]\).
После двух крутых прогулок с обменом, описанных выше, мы получаем \(a=[1,2,3]\), что является неубывающим массивом.
| |
|
|
H2. Крутые прогулки с обменом (сложная версия)
Конструктив
Конструктив
Конструктив
реализация
сортировки
*3500
Это сложная версия задачи. Единственное различие между двумя версиями задачи — количество операций, которые вы можете сделать. Вы можете совершать взломы только в том случае, если решены обе версии задачи. Вам дан массив \(a\) длины \(n\). Крутая прогулка с обменом — это следующий процесс: - В сетке \(n \times n\) обозначим ячейку в строке \(i\) и столбце \(j\) как \((i, j)\). Вам нужно пройти от \((1,1)\) до \((n,n)\), делая только шаги вправо или вниз.
- Формально, если вы находитесь в \((x,y)\) в данный момент, вы можете сделать шаг в \((x+1,y)\) или \((x,y+1)\), но вы не можете выйти за границы сетки.
- Когда вы делаете шаг в \((i,j)\), вы должны поменять местами \(a_i\) и \(a_j\), если \(i \neq j\).
Вы можете выполнить не более \(n+4\) крутых прогулок с обменом. Отсортируйте массив \(a_1, a_2, \ldots, a_n\) в неубывающем порядке. Можно показать, что это всегда можно сделать. Выходные данные Для каждого набора входных данных вывод должен состоять из нескольких строк: - Первая строка содержит целое число \(k\) (\(0 \leq k \leq n+4\)), представляющее количество крутых прогулок с обменом, которое вы выполняете.
- Каждая из следующих \(k\) строк содержит строку \(s\) длины \(2n-2\), состоящую только из R и D, представляющую путь (буквы чувствительны к регистру). Для всех \(1 \le i \le 2n-2\), если \(s_i=\) R, то на \(i\)-м шаге вы идёте направо, иначе на \(i\)-м шаге вы идёте вниз.
Примечание В первом наборе входных данных массив \(a\) уже является неубывающим, поэтому вам не нужно выполнять никаких прогулок. Во втором наборе входных данных изначально \(a=[2,1,3]\). На первой прогулке: - На \(1\)-м шаге вы делаете шаг вправо в клетку \((1,2)\). Затем, \(a=[1,2,3]\). Обратите внимание, что хотя массив \(a\) уже является неубывающим, вы не можете остановиться, пока не достигнете \((n,n)\).
- На \(2\)-м шаге вы делаете шаг вправо в \((1,3)\). Тогда \(a=[3,2,1]\).
- На \(3\)-м шаге вы делаете шаг вниз в \((2,3)\). Тогда, \(a=[3,1,2]\).
- На \(4\)-м шаге вы спускаетесь в \((3,3)\). Тогда, \(a=[3,1,2]\).
На второй прогулке: - На \(1\)-м шаге вы опускаетесь в \((2,1)\). Тогда \(a=[1,3,2]\).
- На \(2\)-м шаге вы делаете шаг вправо в \((2,2)\). Тогда, \(a=[1,3,2]\).
- На \(3\)-м шаге вы делаете шаг вниз в \((3,2)\). Тогда, \(a=[1,2,3]\).
- На \(4\)-м шаге вы опускаетесь в \((3,3)\). Тогда, \(a=[1,2,3]\).
После двух крутых прогулок с обменом, описанных выше, мы получаем \(a=[1,2,3]\), что является неубывающим массивом.
| |
|
|
A. The Bento Box Adventure
реализация
сортировки
*1300
Image generated by ChatGPT 4o. Boxed meals in Taiwan are very common, offering convenient and affordable nutrition-balanced choices for students and office workers. These meals typically include a variety of vegetables, protein, and rice, providing a well-rounded diet. With numerous options available at local self-service restaurants, they are a popular choice for those looking for a quick, healthy lunch. There are five Taiwanese self-service restaurants numbered from 1 to 5. You plan to visit a different restaurant each day from Monday to Friday to pack a boxed meal for lunch. You've already visited one restaurant from Monday to Thursday, each time visiting a different one. Now, it's Friday, and you want to visit the last remaining restaurant that you haven't been to yet this week. Write a program that takes as input the four restaurants you've already visited (one for each day from Monday to Thursday) and outputs the restaurant you should visit on Friday. Output Output the restaurant number you should visit on Friday.
| |
|
|
I. Auto Complete
Бинарный поиск
Деревья
реализация
сортировки
Строки
Структуры данных
хэши
*2300
You are designing a snazzy new text editor, and you want to add a nifty auto-complete feature to help users save time. Here is how it will work: if a user types "App", your editor will magically suggest the word "Application"! Even better, users can personalize the words that auto-complete in your editor. Your editor will support 4 kinds of operations (Let's say the current text in your editor is \(t\)): - Add an auto complete pattern \(p_i\).
- Delete an auto complete pattern \(p_i\).
- Append a string \(s\) to the end of \(t\).
- Delete \(c\) characters from the end of \(t\). Note that if \(c\) is larger then the length of \(t\), delete all the characters from \(t\).
After each action, your editor should suggest an auto-complete candidate \(i\) that matches the following criteria: - The string \(p_i\) has a prefix equal to \(t\).
- If there are multiple \(p_i\), pick the longest one.
- If there are still multiple \(p_i\), pick the one with the smallest lexicographic order.
- If there are still multiple \(p_i\), pick the one with the smallest ID.
To simplify the question, for each action, print the suggested auto complete pattern ID. If there's no match, print -1. For example, let us say we have three candidates: "alice", "bob", and "charlie", with ID 1, 2, and 3. At first, there is nothing on the screen, so "charlie" (3) should be suggested because it is the longest. Then, let us say the user types "b". You should suggest "bob" (2) because it is the only one that starts with "b". Finally, let us say the user type "body". You should print -1 because there is no matched pattern. Output The program should output \(n\) lines. For each action, output an integer \(i\), which means that after the action, \(p_i\) is the suggested auto complete candidate. If there is no \(p_i\) that matches the requirement, output -1.
| |
|
|
A. Жадный Монокарп
жадные алгоритмы
сортировки
*800
Есть \(n\) сундуков; \(i\)-й сундук изначально содержит \(a_i\) монет. Для каждого сундука вы можете выбрать любое неотрицательное (\(0\) или больше) количество монет, чтобы добавить в этот сундук, с одним ограничением: суммарное количество монет во всех сундуках должно стать не менее \(k\). После того как вы закончите добавлять монеты в сундуки, придет жадный Монокарп, которому нужны монеты. Он будет брать сундуки по одному, и поскольку он жадный, он всегда будет выбирать сундук с максимальным количеством монет. Монокарп остановится, как только общее количество монет в сундуках, которые он забрал, станет не менее \(k\). Вы хотите, чтобы Монокарп забрал как можно меньше монет, поэтому вам нужно добавлять монеты в сундуки таким образом, чтобы, когда Монокарп закончит забирать сундуки, у него было ровно \(k\) монет. Вычислите минимальное количество монет, которое вам нужно добавить. Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество монет, которое нужно добавить, чтобы, когда Монокарп закончит забирать сундуки, у него было ровно \(k\) монет. Можно показать, что при данных ограничениях задачи это всегда возможно. Примечание В первом примере не нужно добавлять монеты. Когда Монокарп придет, он возьмет сундук с \(4\) монетами, так что у него будет ровно \(4\) монеты. Во втором примере вы можете добавить \(1\) монету в \(4\)-й сундук, так что, когда Монокарп придет, он возьмет сундук с \(4\) монетами, затем еще один сундук с \(4\) монетами и сундук с \(2\) монетами. В третьем примере вы можете добавить \(3\) монеты в \(1\)-й сундук и \(5\) монет во \(2\)-й сундук. В четвертом примере вы можете добавить \(1\) монету в \(1\)-й сундук и \(1\) монету в \(3\)-й сундук.
| |
|
|
D. Рекомендации
реализация
сортировки
Структуры данных
*1900
Предположим, вы работаете в некоем стриминговом сервисе. В сервисе присутствуют \(n\) активных пользователей и \(10^9\) треков, которые эти пользователи могут прослушивать. Пользователи могут ставить лайки трекам, и на основе лайков сервис должен рекомендовать им новые треки. Треки пронумерованы от \(1\) до \(10^9\). Оказалось, что треки, которые нравятся \(i\)-му пользователю, образуют отрезок \([l_i, r_i]\). Скажем, что пользователь \(j\) является предиктором для пользователя \(i\) (\(j \neq i\)), если пользователь \(j\) поставил лайки всем трекам, которые нравятся \(i\)-му пользователю (и, возможно, некоторым другим трекам тоже). Также скажем, что трек сильно рекомендован для пользователя \(i\), если трек еще не понравился \(i\)-му пользователю, но он понравился каждому предиктору \(i\)-го пользователя. Посчитайте количество сильно рекомендованных треков для каждого пользователя \(i\). Если у пользователя нет предикторов, то выведите \(0\) для него. Выходные данные Для каждого набора входных данных выведите \(n\) целых чисел, где \(i\)-е целое число — это количество сильно рекомендованных треков для \(i\)-го пользователя (или \(0\), если у пользователя нет предикторов). Примечание В первом наборе входных данных: - у первого пользователя нет предикторов;
- у второго пользователя нет предикторов;
- у третьего пользователя два предиктора: пользователи \(1\) и \(2\); только трек \(3\) (из тех, которые еще не понравились третьему пользователю) понравился им обоим.
Во втором наборе входных данных второй пользователь является предиктором для первого пользователя. Поэтому все треки, кроме \(42\)-го, сильно рекомендованы для первого пользователя. В третьем наборе входных данных у первого пользователя два предиктора: пользователи \(2\) и \(3\), но нет трека, который понравился бы им и не понравился бы самому пользователю.
| |
|
|
H. Missing Separators
дп
сортировки
Строки
строковые суфф. структуры
*2200
You have a dictionary, which is a list of distinct words sorted in alphabetical order. Each word consists of uppercase English letters. You want to print this dictionary. However, there is a bug with the printing system, and all words in the list are printed next to each other without any separators between words. Now, you ended up with a string \(S\) that is a concatenation of all the words in the dictionary in the listed order. Your task is to reconstruct the dictionary by splitting \(S\) into one or more words. Note that the reconstructed dictionary must consist of distinct words sorted in alphabetical order. Furthermore, you want to maximize the number of words in the dictionary. If there are several possible dictionaries with the maximum number of words, you can choose any of them. Output First, output an integer in a single line representing the maximum number of the words in the reconstructed dictionary. Denote this number as \(n\). Then, output \(n\) lines, each containing a single string representing the word. The words must be distinct, and the list must be sorted alphabetically. The concatenation of the words in the listed order must equal \(S\). If there are several possible dictionaries with the maximum number of words, output any of them.
| |
|
|
A. Переставьте столбцы и найдите путь
жадные алгоритмы
сортировки
*1200
Дана матрица, состоящая из \(2\) строк и \(n\) столбцов. Строки нумеруются от \(1\) до \(2\) сверху вниз; столбцы нумеруются от \(1\) до \(n\) слева направо. Обозначим ячейку на пересечении \(i\)-й строки и \(j\)-го столбца как \((i,j)\). Каждая ячейка содержит одно целое число; изначально число в ячейке \((i,j)\) равно \(a_{i,j}\). Вы можете выполнять следующую операцию любое количество раз (возможно, ноль): - выбрать два столбца и поменять их местами (т. е. выбрать два целых числа \(x\) и \(y\) такие, что \(1 \le x < y \le n\), затем поменять местами \(a_{1,x}\) с \(a_{1,y}\), а также \(a_{2,x}\) с \(a_{2,y}\)).
После выполнения операций вам нужно выбрать путь от ячейки \((1,1)\) до ячейки \((2,n)\). Для каждой ячейки \((i,j)\) на пути, кроме последней, следующая ячейка на пути должна быть либо \((i+1,j)\), либо \((i,j+1)\). Разумеется, путь не может выходить за пределы матрицы. Стоимость пути — это сумма всех чисел во всех \((n+1)\) ячейках, принадлежащих пути. Вам нужно выполнить операции и выбрать путь так, чтобы его стоимость была максимальной. Выходные данные Для каждого набора входных данных выведите одно целое число — максимальную стоимость пути, которую вы можете получить. Примечание Ниже приведены объяснения первых трех наборов входных данных из примера. Левая матрица — это матрица, заданная во входных данных, правая — состояние матрицы после нескольких (возможно, нуля) перестановок столбцов. Оптимальный путь выделен зеленым цветом.
| |
|
|
B. В конец со штрафом
Бинарный поиск
жадные алгоритмы
сортировки
Структуры данных
*1600
Вам дан массив целых чисел \(a\) длиной \(n\). Вы можете выполнять следующую операцию ноль или более раз: - За одну операцию вы выбираете индекс \(i\) (\(1 \le i \le n\)), присваиваете \(a_i := a_i + 1\), и затем перемещаете \(a_i\) в конец массива (в самую правую позицию). Например, если \(a = [3, 5, 1, 9]\), и вы выбрали \(i = 2\), массив станет \([3, 1, 9, 6]\).
Найдите лексикографически наименьший\(^{\text{∗}}\) массив, который вы можете получить, выполняя эти операции. Выходные данные Для каждого набора входных данных выведите лексикографически наименьший массив, который вы можете получить.
| |
|
|
C. Искатели приключений
Бинарный поиск
жадные алгоритмы
сортировки
Структуры данных
Тернарный поиск
*2100
Однажды четверо римских торговцев встретились в одном из римских мансионов, чтобы обсудить свои торговые планы. У торговцев была следующая проблема: торговали они одним и тем же видом товара, поэтому, если они занимались торговлей в одном и том же городе, неизбежно терпели убытки. Было решено распределить города, в которых будет вестись торговля, между собой. Карту Рима можно в этой задаче представить как плоскость, на которой в некоторых местах отмечены точки — города Римской империи. Торговцы хотят выбрать некоторую разделяющую точку \((x_0, y_0)\). Затем в городе с координатами \((x_i, y_i)\) будет торговать только - первый торговец, если \(x_0 \le x_i\) и \(y_0 \le y_i\);
- второй торговец, если \(x_0 > x_i\) и \(y_0 \le y_i\);
- третий торговец, если \(x_0 \le x_i\) и \(y_0 > y_i\);
- четвертый торговец, если \(x_0 > x_i\) и \(y_0 > y_i\).
Торговцы хотят выбрать точку \((x_0, y_0)\) так, чтобы максимизировать минимальное количество городов, которое достанется кому-либо из них торговцев (то есть максимально честно). Помогите им найти такую точку. Выходные данные В первой строке выведите одно целое число \(k\) (\(0 \le k \le \frac{n}{4}\)) — максимально возможное количество городов, которое достанется каждому торговцу. Во второй строке выведите два целых числа \(x_0\) и \(y_0\) (\(|x_0|, |y_0| \le 10^9\)) — координаты разделяющей точки. Если подходящих точек может быть несколько, то разрешается вывести любую из них.
| |
|
|
D. Кевин и воспоминания о соревнованиях
Бинарный поиск
жадные алгоритмы
Перебор
сортировки
Структуры данных
*1600
Кевин раньше попадал в воспоминания Рио, и в воспоминаниях Рио когда-то проводились серии соревнований. Кевин помнит всех участников и все задачи соревнований того времени, но он забыл конкретные раунды, распределение задач и точные рейтинги. Всего есть \( m \) задач, при этом \( i \)-я задача имеет сложность \( b_i \). Пусть каждое соревнование состоит из \( k \) задач, в результате чего получается \( \lfloor \frac{m}{k} \rfloor \) соревнований. Это означает, что вы выбираете \( \lfloor \frac{m}{k} \rfloor \cdot k \) задач для соревнований в любом сочетании, при этом каждая задача выбирается не более одного раза, а оставшиеся \(m\bmod k\) задач остаются неиспользованными. Например, если \(m = 17\) и \(k = 3\), вы должны создать ровно \(5\) соревнований, состоящих из \(3\) задач каждое, и ровно \(2\) задачи останутся неиспользованными. В соревнованиях участвовало всего \( n \) участников, причем Кевин был \(1\)-м участником. У \( i \)-го участника рейтинг \( a_i \). Во время соревнований участник решает все задачи, сложность которых не превышает его рейтинг, то есть \( i \)-й участник решает \( j \)-ю задачу тогда и только тогда, когда \( a_i \geq b_j \). В каждом соревновании ранг Кевина равен одному плюс количеству участников, которые решают больше задач, чем он. Для каждого \( k = 1, 2, \ldots, m \) Кевин хочет знать минимальную сумму его рангов по всем \( \lfloor \frac{m}{k} \rfloor \) соревнованиям. Другими словами, для некоторого значения \(k\), после выбора задач для каждого соревнования, вы вычисляете ранг Кевина в каждом соревновании и суммируете эти ранги по всем \( \lfloor \frac{m}{k} \rfloor \) соревнованиям. Ваша цель — минимизировать это значение. Обратите внимание, что соревнования для разных значений \(k\) независимы. Это означает, что для разных значений \(k\) вы можете независимо выбирать распределение задач в соревнованиях. Выходные данные Для каждого набора выведите \(m\) целых чисел — минимальную сумму рангов Кевина для каждого \( k = 1, 2, \ldots, m\). Примечание Для первого набора: Когда \(k=1\), поскольку каждое соревнование содержит только одну задачу, распределение на самом деле уникально. Например, в соревновании, которое включает только третью задачу (которая имеет сложность \(4\)), все участники, кроме \(2\)-го, могут ее решить. Поскольку никто не решает строго больше задач, чем Кевин, его ранг в этом соревновании равен \(1\). Аналогично, в всех \(4\) соревнованиях ранги Кевина равны \(1,3,1,2\), и сумма равна \(7\). Когда \(k=2\), один из оптимальных способов — выбрать \(1\)-ю и \(3\)-ю задачи для формирования одного соревнования, а \(2\)-ю и \(4\)-ю — для другого. В первом соревновании \(4\) участника соответственно решают \(2,1,2,2\) задачи, поэтому ранг Кевина равен \(1\); во втором они соответственно решают \(0,0,2,1\), поскольку \(2\) участника (\(3\)-й и \(4\)-й) решают больше задач, чем Кевин, его ранг равен \(1+2=3\). Таким образом, ответ равен \(1+3=4\). Можно доказать, что нет способа достичь меньшей суммы. Когда \(k=3\), мы можем просто выбрать \(1\)-ю, \(3\)-ю и \(4\)-ю задачи, чтобы сделать соревнование, и ранг Кевина равен \(2\), что является оптимальным. Когда \(k=4\), поскольку есть только одно соревнование, распределение также уникально, и ранг Кевина равен \(3\).
| |
|
|
D. Подсчет количества пар
Бинарный поиск
сортировки
*1200
Вам задана последовательность \(a\), состоящая из \(n\) целых чисел, причем \(i\)-е число последовательности равно \(a_i\). Также вам заданы два целых числа \(x\) и \(y\) (\(x \le y\)). Пара целых чисел \((i, j)\) считается интересной, если выполняются следующие условия: - \(1 \le i < j \le n\);
- если одновременно удалить из последовательности \(a\) числа в позициях \(i\) и \(j\), то сумма оставшихся элементов должна быть не меньше \(x\) и не больше \(y\).
Перед вами стоит задача определить количество интересных пар целых чисел для заданной последовательности \(a\). Выходные данные Для каждого набора входных данных выведите одно целое число — количество интересных пар целых чисел для заданной последовательности \(a\). Примечание В первом примере существует \(4\) интересных пары целых чисел: - \((1, 2)\);
- \((1, 4)\);
- \((2, 3)\);
- \((3, 4)\).
| |
|
|
E. Лучшая цена
Бинарный поиск
жадные алгоритмы
Перебор
сортировки
Структуры данных
*1600
В самый крупный магазин Берляндии поступила партия елей. В магазин уже пришли \(n\) клиентов, которые хотят их купить. Перед началом продаж магазину осталось определиться с ценой за одну елку (цена одинакова для всех покупателей). Для этого у магазина есть некоторая информация о каждом клиенте. Для \(i\)-го клиента известно два целых числа \(a_i\) и \(b_i\), которые определяют его поведение: - если цена товара не более \(a_i\), то клиент купит елку и оставит положительный отзыв;
- иначе, если цена товара не более \(b_i\), то клиент купит елку, но оставит отрицательный отзыв;
- иначе клиент не будет покупать елку вообще.
Ваша задача — посчитать максимально возможный заработок магазина, если можно получить не более \(k\) отрицательных отзывов. Выходные данные Для каждого набора входных данных выведите одно целое число — максимально возможный заработок магазина, если можно получить не более \(k\) отрицательных отзывов. Примечание Рассмотрим пример из условия: - в первом наборе входных данных надо поставить цену, равную \(1\). Тогда оба клиента купят по одной елке и не оставят ни одного отрицательного отзыва;
- во втором наборе входных данных надо поставить цену, равную \(5\). Тогда единственный клиент купит елку и оставит отрицательный отзыв;
- в третьем наборе входных данных надо поставить цену, равную \(3\). Тогда все клиенты купят по одной елке, и магазин получит два отрицательных отзыва.
- в четвертом наборе входных данных надо поставить цену, равную \(7\). Тогда два клиента купят по одной елке, и магазин получит один отрицательный отзыв.
| |
|
|
D. Оптимальность изысканных произведений
Бинарный поиск
жадные алгоритмы
математика
расписания
сортировки
Структуры данных
*1700
As a tester, when my solution has a different output from the example during testing, I suspect the author first. Хотя Ирис иногда ставит задачу, решение которой неверно, она по-прежнему настаивает на создании задач с помощью своего воображения; в конце концов, все мы упрямы... И, как всегда, Ирис поставила перед собой задачу, которую она решила неправильно, и Крис должен её спасать! Но в этот раз вы будете играть роль Криса: - Крису даны два массива \(a\) и \(b\), оба состоящие из \(n\) целых чисел.
- Ирис интересуется наибольшим возможным значением \(P = \prod\limits_{i=1}^n \min(a_i, b_i)\) после произвольной перестановки \(b\). Обратите внимание, что она хочет только узнать максимальное значение \(P\), элементы самого массива \(b\) не переставляются.
- Будет внесено \(q\) изменений. Каждое изменение может быть обозначено двумя целыми числами \(o\) и \(x\) (значение \(o\) может быть \(1\) или \(2\), \(1 \leq x \leq n\)). Если \(o = 1\), то Ирис увеличивает \(a_x\) на \(1\); в противном случае она увеличивает \(b_x\) на \(1\).
- Ирис спрашивает у Криса максимальное значение \(P\) суммарно \(q + 1\) раз: один раз перед изменениями, затем после каждого изменения.
- Поскольку \(P\) может быть очень большим, Крису нужно только вычислить его по модулю \(998\,244\,353\).
Крис вскоре справился с этой задачей, но он так устал, что заснул. Помимо благодарности Крису, теперь ваша очередь написать программу для вычисления ответов по заданным входным данным. Обратите внимание: поскольку входные и выходные данные большие, вам, возможно, потребуется оптимизировать их для решения данной задачи. Например, в C++ достаточно использовать следующие строки в начале функции main(): int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); std::cout.tie(nullptr); }
Выходные данные Для каждого набора входных данных выведите на одной строке \(q + 1\) целых числа — ответы Криса по модулю \(998\,244\,353\). Примечание В первом наборе входных данных: - Перед внесением изменений Крис может переставить \(b\) в таком порядке: \([1, 2, 3]\), и тогда \(P = \prod\limits_{i=1}^n \min(a_i, b_i) = 1 \cdot 1 \cdot 2 = 2\). Можно доказать, что это максимально возможное значение. Например, если Крис переставит \(b = [2, 3, 1]\), то \(P\) будет равно \(1 \cdot 1 \cdot 1 = 1 < 2\), что не является оптимальным.
- После первого изменения Крис может переставить \(b\) в таком порядке: \([1, 2, 3]\), и тогда \(P = 1 \cdot 1 \cdot 3 = 3\), что является максимально возможным значением.
- После второго изменения Крис может переставить \(b\) в таком порядке: \([2, 2, 3]\), и тогда \(P = 1 \cdot 1 \cdot 3 = 3\), что является максимально возможным значением.
- После третьего изменения Крис может переставить \(b\) в таком порядке: \([2, 2, 3]\), и тогда \(P = 6\), что является максимально возможным значением.
- После четвертого изменения Крис может переставить \(b\) в таком порядке:\([2, 2, 4]\), и тогда \(P = 6\), что является максимально возможным значением.
| |
|
|
B. Крафтинг
жадные алгоритмы
Конструктив
сортировки
*1000
| Как и следовало ожидать, Флорида является домом для многих причудливых магических сил, и мужчина из Флориды стремится укротить их. |
Существует \(n\) различных типов магических материалов, пронумерованных от \(1\) до \(n\). Изначально у вас есть \(a_i\) единиц материала \(i\) для каждого \(i\) от \(1\) до \(n\). Вы можете выполнять следующую операцию: - Выберите материал \(i\) (где \(1\le i\le n\)). Потратьте по \(1\) единице каждого из остальных материалов (то есть всех \(j\), таких, что \(j\neq i\)), чтобы получить \(1\) единицу материала \(i\). Более формально, после выбора материала \(i\) обновите массив \(a\) следующим образом: \(a_i := a_i + 1\) и \(a_j := a_j - 1\) для всех \(j\), где \(j\neq i\) и \(1\le j\le n\). Обратите внимание, что все \(a_j\) должны оставаться неотрицательными, т.е. вы не можете тратить ресурсы, которых у вас нет.
Вы пытаетесь создать артефакт, используя эти материалы. Чтобы успешно создать артефакт, у вас должно быть по крайней мере \(b_i\) единиц материала \(i\) для каждого \(i\) от \(1\) до \(n\). Определите, возможно ли создать артефакт, выполнив операцию любое количество раз (возможно, ноль). Выходные данные Для каждого набора входных данных выведите одну строку, содержащую либо «YES», либо «NO» — может ли артефакт быть создан. Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. Примечание В первом наборе входных данных выполните операцию над материалом \(1\). После этого у нас будет ровно столько ресурсов, сколько требуется: \(1\) единица материала \(1\) и по \(4\) единицы каждого из материалов \(2\) и \(3\). Во втором наборе входных данных можно показать, что независимо от того, как выполняются операции, создать артефакт невозможно. В третьем наборе входных данных мы можем выполнить операцию с материалом \(1\) дважды. После этих операций у нас будет \(3\) единицы материала \(1\) и \(8\) единиц материала \(2\), чего более чем достаточно для создания артефакта.
| |
|
|
E. Стога сена
жадные алгоритмы
Конструктив
Перебор
сортировки
Структуры данных
*2800
| В следующее новолуние вселенная сбросится, начиная с Флориды. Мужчина из Флориды должен остановить это, но сначала ему нужно найти важный артефакт. |
Есть \(n\) стогов сена, пронумерованных от \(1\) до \(n\), где стог сена \(i\) содержит \(a_i\) тюков сена. Под одним из стогов сена возможно спрятана иголка, но вы не знаете, под каким именно. Ваша задача состоит в том, чтобы переместить тюки сена так, чтобы каждый стог сена был пустым хотя бы один раз, что позволит вам проверить, спрятана ли иголка под этим конкретным стогом сена. Однако этот процесс не так прост. Как только стог сена \(i\) будет опустошен в первый раз, ему будет присвоено ограничение по высоте, и он больше не сможет содержать более \(b_i\) тюков сена. Более формально ход описывается следующим образом: - Выберите два стога сена \(i\) и \(j\). Если стог сена \(i\) не был опустошен ранее или в стоге сена \(i\) содержится строго меньше, чем \(b_i\) тюков сена, вы можете переместить ровно \(1\) тюк сена из стога \(j\) в стог \(i\).
Обратите внимание: Перед опустошением стога его высота не ограничена, и вы можете переместить в этот стог столько тюков, сколько захотите. Найдите минимальное количество ходов, необходимых для того, чтобы каждый стог сена был опустошен хотя бы один раз, или сообщите, что это невозможно. Выходные данные Для каждого набора входных данных выведите одно целое число — минимальное количество ходов, необходимое для обеспечения того, чтобы каждый стог сена был опустошен хотя бы один раз. Если невозможно опустошить каждый стог сена хотя бы один раз, выведите -1. Примечание В первом наборе входных данных мы можем выполнить следующую последовательность действий: - Переместите \(3\) тюка из стога \(1\) в стог \(2\). Стог \(1\) теперь пуст, и ему присвоено ограничение по высоте, равное \(5\).
- Переместите \(5\) тюков из стога \(2\) в стог \(1\). Стог \(2\) теперь пуст, и ему присвоено ограничение по высоте, равное \(4\).
Приведенная выше последовательность требует \(3 + 5 = 8\) ходов. Невозможно использовать менее \(8\) ходов, так как следующая последовательность ходов недопустима: - Переместите \(2\) тюка из стога \(2\) в стог \(1\). Стог \(2\) теперь пуст, и ему присвоено ограничение по высоте, равное \(4\).
- Переместите \(4\) тюка из стога \(1\) в стог \(2\). В стоге \(1\) теперь \(1\) тюк, в то время как в стоге \(2\) находится \(4\) тюка.
- Стог \(1\) нельзя очистить, так как высота стога \(2\) уже равна \(4\), поэтому больше нельзя перемещать тюки из стога \(1\) в стог \(2\).
Во втором наборе входных данных задача невыполнима. Это связано с тем, что ограничения по высоте обоих стогов слишком малы, и как только один из стогов опустошается, другой стог не может стать пустым из-за небольших ограничений по высоте. В третьем наборе входных данных можно показать, что следующая последовательность ходов является оптимальной: - Переместите \(1\) тюк из стога \(1\) в стог \(3\). Стог \(1\) теперь пуст, и ему присвоено ограничение по высоте, равное \(3\).
- Переместите \(3\) тюка из стога \(2\) в стог \(1\).
- Переместите \(1\) тюк из стога \(2\) в стог \(3\). Стог \(2\) теперь пуст, и ему присвоено ограничение по высоте, равное \(3\).
- Переместите \(3\) тюка из стога \(3\) в стог \(2\). Стог \(3\) теперь пуст, и ему присвоено ограничение по высоте, равное \(1\).
Приведенная выше последовательность требует \(1 + 3 + 1 + 3 = 8\) ходов.
| |
|
|
B. Найдите перестановку
графы
Перебор
поиск в глубину и подобное
реализация
сортировки
*1300
Вам дан неориентированный граф с \(n\) вершинами, пронумерованными от \(1\) до \(n\). Этот граф кодирует секретную перестановку\(^{\text{∗}}\) \(p\) длины \(n\). Граф строится следующим образом: - Для каждой пары целых чисел \(1 \le i < j \le n\), между вершиной \(p_i\) и вершиной \(p_j\) добавляется неориентированное ребро тогда и только тогда, когда \(p_i < p_j\). Обратите внимание, что ребро добавляется не между вершинами \(i\) и \(j\), а между вершинами соответствующих им элементов. Обратитесь к примечаниям для лучшего понимания.
Ваша задача состоит в том, чтобы восстановить и вывести перестановку \(p\). Можно доказать, что перестановка \(p\) может быть определена однозначно. Выходные данные Для каждого набора входных данных выведите \(n\) целых чисел \(p_1, p_2, \ldots, p_n\) — восстановленную перестановку. Примечание В первом наборе входных данных \(p = [1]\). Поскольку нет пар \(1 \le i < j \le n\), в графе нет рёбер. Граф для второго набора входных данных показан ниже. Например, когда мы выбираем \(i = 3\) и \(j = 4\), мы добавляем ребро между вершинами \(p_i = 1\) и \(p_j = 3\), потому что \(p_i < p_j\). Однако, когда мы выбираем \(i = 2\) и \(j = 3\), то \(p_i = 2\) и \(p_j = 1\), так что \(p_i < p_j\) не выполняется. Поэтому мы не добавляем ребро между \(2\) и \(1\). 
В третьем наборе входных данных в графе нет рёбер, поэтому нет пар целых чисел \(1 \le i < j \le n\) таких, что \(p_i < p_j\). Следовательно, \(p = [6, 5, 4, 3, 2, 1]\).
| |
|
|
B. Горилла и зачет
жадные алгоритмы
сортировки
*1000
Из-за нехватки преподавателей в самой высокой параллели «Т-поколения» было принято решение поставить огромного самца гориллы принимать зачет у школьников. Но не все так просто, для того чтобы доказать свою компетентность, ему нужно решить следующую задачу. Для массива \(b\) определим функцию \(f(b)\) как минимальное количество следующих операций, чтобы сделать массив \(b\) пустым: - взять два целых числа \(l\) и \(r\), такие что \(l \le r\), пусть \(\min(b_l, b_{l+1}, \ldots, b_r)\) равен \(x\), затем
- удалить из массива все такие \(b_i\), что \(l \le i \le r\) и \(b_i = x\), удаленные элементы удаляются, индексы перенумеруются
Дан массив \(a\) длины \(n\) и целое число \(k\). Вы можете не более \(k\) раз выбрать любой индекс \(i\) (\(1 \le i \le n\)) и произвольное число \(p\), и заменить \(a_i\) на \(p\). Помогите горилле и определите, какое минимальное значение \(f(a)\) можно получить после таких замен. Выходные данные Для каждого набора входных данных в отдельной строке выведите одно целое число — минимальное значение \(f(a)\). Примечание В первом наборе входных данных \(f([48\,843]) = 1\), так как массив состоит из одного числа, а значит, можно его удалить за одну операцию. Во втором наборе входных данных можно изменить второе число на \(2\), получив массив \([2, 2, 2]\), \(f([2, 2, 2]) = 1\), так как можно взять в качестве подотрезка весь массив, минимум на нем равен \(2\), поэтому мы удалим все числа \(2\) из массива, и массив станет пустым.
| |
|
|
E1. Очередное упражнение на графы (простая версия)
Бинарный поиск
графы
дп
кратчайшие пути
Перебор
снм
сортировки
*2300
Это простая версия задачи. Отличие между версиями заключается в том, что в этой версии есть дополнительное ограничение на \(m\). Вы можете делать взломы только в том случае, если решили все версии этой задачи. Недавно преподавателям «Т-поколения» нужно было сделать учебный контест. Им не хватает одной задачи, и в контесте как раз нет ни одной задачи на графы, поэтому они придумали следующую задачу. Вам дан связный взвешенный неориентированный граф из \(n\) вершин и \(m\) ребер, который не содержит петель и кратных ребер. Есть \(q\) вопросов вида \((a, b, k)\): среди всех путей от вершины \(a\) до вершины \(b\) найти наименьший \(k\)-й максимум весов ребер на пути\(^{\dagger}\). Преподавателям показалось, что задача звучит очень интересно, но есть одно но... они не умеют ее решать. Помогите им и решите задачу, ведь до начала контеста осталось всего пару часов. \(^{\dagger}\) Пусть \(w_1 \ge w_2 \ge \ldots \ge w_{h}\) — веса всех ребер на пути в порядке невозрастания. Тогда \(k\)-й максимум весов ребер на этом пути равен \(w_{k}\). Выходные данные Для каждого набора входных данных выведите ответы на все вопросы. Примечание В первом наборе входных данных одним из оптимальных путей в первом запросе является путь \(1 \rightarrow 3 \rightarrow 4\), \(2\)-й максимум весов ребер на этом пути это \(1\). Во втором запросе одними из оптимальных путей являются путь \(2 \rightarrow 4 \rightarrow 3\), \(1\)-й максимум весов ребер это \(2\). Во втором наборе входных данных одним из оптимальных путей в первом запросе является путь \(1 \rightarrow 2 \rightarrow 4 \rightarrow 5 \rightarrow 6\), \(3\)-й максимум весов ребер на этом пути это \(2\).
| |
|
|
E2. Очередное упражнение на графы (сложная версия)
Бинарный поиск
графы
дп
кратчайшие пути
поиск в глубину и подобное
снм
сортировки
*2500
Это сложная версия задачи. Отличие между версиями заключается в том, что в этой версии Дополнительные ограничения на \(m\) отсутствуют. Вы можете делать взломы только в том случае, если решили все версии этой задачи. Недавно преподавателям «Т-поколения» нужно было сделать учебный контест. Им не хватает одной задачи, и в контесте как раз нет ни одной задачи на графы, поэтому они придумали следующую задачу. Вам дан связный взвешенный неориентированный граф из \(n\) вершин и \(m\) ребер, который не содержит петель и кратных ребер. Есть \(q\) вопросов вида \((a, b, k)\): среди всех путей от вершины \(a\) до вершины \(b\) найти наименьший \(k\)-й максимум весов ребер на пути\(^{\dagger}\). Преподавателям показалось, что задача звучит очень интересно, но есть одно но... они не умеют ее решать. Помогите им и решите задачу, ведь до начала контеста осталось всего пару часов. \(^{\dagger}\) Пусть \(w_1 \ge w_2 \ge \ldots \ge w_{h}\) — веса всех ребер на пути в порядке невозрастания. Тогда \(k\)-й максимум весов ребер на этом пути равен \(w_{k}\). Выходные данные Для каждого набора входных данных выведите ответы на все вопросы. Примечание В первом наборе входных данных одним из оптимальных путей в первом запросе является путь \(1 \rightarrow 3 \rightarrow 4\), \(2\)-й максимум весов ребер на этом пути это \(1\). Во втором запросе одними из оптимальных путей являются путь \(2 \rightarrow 4 \rightarrow 3\), \(1\)-й максимум весов ребер это \(2\). Во втором наборе входных данных одним из оптимальных путей в первом запросе является путь \(1 \rightarrow 2 \rightarrow 4 \rightarrow 5 \rightarrow 6\), \(3\)-й максимум весов ребер на этом пути это \(2\).
| |
|
|
F. Линейка
Бинарный поиск
дп
сортировки
Структуры данных
*3300
В один из дней преподаватели «Т-поколения» решили приучить школьников к дисциплине, поэтому поставили их в ряд. Вам известно, что всего есть \(n\) школьников, у \(i\)-го по порядку школьника рост равен \(a_i\). Школьникам комфортно, если для каждого \(i\) от \(1\) до \(n - 1\) выполняется следующее условие: \(a_i \cdot 2 \ge a_{i + 1}\). Изначально школьникам комфортно. Преподавателям не нравится то, что максимальный рост в ряду слишком маленький, поэтому они хотят накормить школьников пиццей. Если школьник съест одну пиццу, то его рост увеличится на \(1\). Одну пиццу может съесть только один школьник, но каждый школьник может съесть неограниченное количество пицц. Важно, чтобы после того как все школьники съели свои пиццы, школьникам было комфортно. У преподавателей есть \(q\) вариантов того, сколько пицц они закажут. Для каждого варианта \(k_i\) ответьте на вопрос: какой максимальный рост \(\max(a_1, a_2, \ldots, a_n)\) можно получить, если школьники съедят не более \(k_i\) пицц. Выходные данные Для каждого набора входных данных для каждого варианта того, сколько максимум пицц могут съесть школьники, выведите максимальное значение \(\max(a_1, a_2, \ldots, a_n)\), которое можно получить, чтобы школьникам было комфортно. Примечание В первом запросе первого набора входных данных можно сначала дать \(3\) пиццы первому школьнику, а потом второму школьнику \(6\) пицц, тогда итоговый массив станет \([13, 26]\) (школьникам комфортно, так как \(13 \cdot 2 \ge 26\)), максимальный элемент в нем равен \(26\).
| |
|
|
A. Миля и два массива
жадные алгоритмы
Конструктив
сортировки
*800
Массив называется хорошим, если для любого элемента \(x\), который встречается в этом массиве, верно, что \(x\) встречается хотя бы дважды в этом массиве. Например, массивы \([1, 2, 1, 1, 2]\), \([3, 3]\), \([1, 2, 4, 1, 2, 4]\) являются хорошими, а массивы \([1]\), \([1, 2, 1]\) и \([2, 3, 4, 4]\) не являются хорошими. У Мили есть два хороших массива \(a\) и \(b\) длины \(n\). Он может произвольным образом переставить местами элементы в массиве \(a\). После этого он получает массив \(c\) длины \(n\), где \(c_i = a_i + b_i\) (\(1 \le i \le n\)). Определите, может ли Миля переставить местами элементы в массиве \(a\) так, чтобы в массиве \(c\) было хотя бы \(3\) различных числа. Выходные данные Для каждого набора входных данных выведите \(«\)YES\(»\) (без кавычек), если можно получить хотя бы \(3\) различных элемента в массиве \(c\), и \(«\)NO\(»\) иначе. Вы можете вывести каждую букву в любом регистре (например, \(«\)YES\(»\), \(«\)Yes\(»\), \(«\)yes\(»\), \(«\)yEs\(»\) будут распознаны как положительный ответ). Примечание В первом наборе входных данных можно поменять местами второй и третий элементы. Тогда массив \(a = [1, 1, 2, 2]\), \(b = [1, 2, 1, 2]\), а тогда \(c = [2, 3, 3, 4]\). Во втором наборе входных данных можно не менять местами элементы. Тогда \(c = [2, 3, 4, 4, 3, 2]\). В третьем наборе входных данных массив \(a\) не изменится от перестановки элементов в нём. Тогда \(c = [2, 2, 2]\), поэтому ответ \(«\)NO\(»\).
| |
|
|
C. Обслуживание клиентов
жадные алгоритмы
Конструктив
математика
Паросочетания
Перебор
сортировки
*1600
Никир устроился работать регулировщиком очередей в компанию «Чёрный Контур». Ему нужно будет выбирать порядок обслуживания клиентов. Всего есть \(n\) очередей, в каждой из которых изначально стоит \(0\) человек. В каждый из следующих \(n\) моментов времени происходит два последовательных события: - Во все очереди приходят новые клиенты. Более формально, в \(j\)-й момент времени количество людей в \(i\)-й очереди увеличивается на положительное целое число \(a_{i,j}\).
- Никир выбирает ровно одну из \(n\) очередей, которую будут обслуживать в этот момент времени. Количество клиентов в этой очереди становится равным \(0\).
Пусть количество людей в \(i\)-й очереди после всех событий равно \(x_i\). Никир хочет, чтобы MEX\(^{\dagger}\) набора чисел \(x_1, x_2, \ldots, x_n\) был как можно больше. Помогите ему определить максимальное значение, которое он сможет получить при оптимальном порядке обслуживания очередей. \(^{\dagger}\)Наименьшее исключенное (MEX) набора чисел \(c_1, c_2, \ldots, c_k\) определяется как наименьшее неотрицательное целое число \(y\), которое не встречается в наборе чисел \(c\). Например: - \(\operatorname{MEX}([2,2,1])= 0\), так как \(0\) не принадлежит массиву.
- \(\operatorname{MEX}([3,1,0,1]) = 2\), так как \(0\) и \(1\) принадлежат массиву, а \(2\) нет.
- \(\operatorname{MEX}([0,3,1,2]) = 4\), так как \(0\), \(1\), \(2\) и \(3\) принадлежат массиву, а \(4\) нет.
Выходные данные Для каждого набора входных данных выведите единственное целое число — максимальное значение \(\operatorname{MEX}([x_1, x_2, \ldots, x_n])\), которое можно получить. Примечание В первом наборе входных данных можно обслужить вторую очередь в момент времени \(1\) и первую очередь в момент времени \(2\). В первой очереди останется \(x_1 = 0\) человек, во второй очереди останется \(x_2 = 1\) человек. Тогда ответ равен \(\operatorname{MEX}([0, 1]) = 2\). Во втором наборе входных данных можно оба раза обслужить первую очередь. В первой очереди останется \(x_1 = 0\) человек, во второй очереди останется \(x_2 = 20\) человек. Тогда ответ равен \(\operatorname{MEX}([0, 20]) = 1\). В третьем наборе входных данных можно обслужить третью очередь в момент времени \(1\), вторую очередь в момент времени \(2\) и первую очередь в момент времени \(3\). В первой очереди останется \(x_1 = 0\) человек, во второй очереди останется \(x_2 = 1\) человек, в третьей очереди останется \(x_3 = 2\) человека. Тогда ответ равен \(\operatorname{MEX}([0, 1, 2]) = 3\).
| |
|
|
B. Карточная игра Фермера Джона
жадные алгоритмы
сортировки
*1000
\(n\) коров Фермера Джона играют в карточную игру! У Фермера Джона есть колода из \(n \cdot m\) карт, пронумерованных от \(0\) до \(n \cdot m-1\). Он раздает \(m\) карт каждой из своих \(n\) коров. Фермер Джон хочет, чтобы игра была честной, поэтому каждая корова может сыграть только \(1\) карту за раунд. Он решает определить порядок ходов, который задается перестановкой\(^{\text{∗}}\) \(p\) длины \(n\), так что корова с номером \(p_i\) будет \(i\)-й коровой, которая положит карту наверх центральной стопки в раунде. Другими словами, в каждом раунде происходят следующие события: - Корова с номером \(p_1\) кладет любую карту из своей колоды наверх центральной стопки.
- Корова с номером \(p_2\) кладет любую карту из своей колоды наверх центральной стопки.
- ...
- Корова с номером \(p_n\) кладет любую карту из своей колоды наверх центральной стопки.
Есть одна загвоздка. Изначально в центральной стопке находится карта с номером \(-1\). Чтобы положить карту, номер карты должен быть больше номера карты на верхней части центральной стопки. Затем вновь положенная карта становится верхней картой центральной стопки. Если корова не может положить ни одной карты из своей колоды, игра считается проигранной. Фермер Джон задается вопросом: существует ли \(p\), такое что все его коровы смогут опустошить свою колоду после игры во все \(m\) раундов? Если да, выведите любое допустимое \(p\). В противном случае выведите \(-1\). Выходные данные Для каждого набора входных данных выведите следующее на новой строке: - Если \(p\) существует, выведите \(n\) целых числа, разделенных пробелами: \(p_1, p_2, \ldots, p_n\).
- В противном случае выведите \(-1\).
Примечание В первом примере один из порядков ходов, который позволяет сыграть все карты, заключается в том, чтобы первой корове ходить перед второй коровой. Карты, которые будут сыграны: \(0\rightarrow1\rightarrow2\rightarrow3\rightarrow4\rightarrow5\). Во втором примере только одна корова, поэтому если корова сыграет все свои карты в порядке возрастания, колода будет опустошена. В третьем примере можно показать, что не существует допустимого порядка ходов, который позволяет сыграть все карты.
| |
|
|
C. Игра математиков
жадные алгоритмы
игры
сортировки
*900
Алиса и Боб играют в игру. На доске написано \(n\) (\(n\) четное) целых чисел \(x_1, x_2, \ldots, x_n\). Также дано целое число \(k\) и целое число score, которое изначально равно \(0\). Игра длится \(\frac{n}{2}\) ходов, в которых последовательно происходят следующие события: - Алиса выбирает целое число с доски и стирает его. Назовем выбранное Алисой число \(a\).
- Боб выбирает целое число с доски и стирает его. Назовем выбранное Бобом число \(b\).
- Если \(a+b=k\), добавляем \(1\) к score.
Алиса играет, чтобы минимизировать score, в то время как Боб играет, чтобы максимизировать score. Предполагая, что оба игрока используют оптимальные стратегии, каков будет score после окончания игры? Выходные данные Для каждого набора входных данных выведите score, если оба игрока играют оптимально. Примечание В первом наборе входных данных один из возможных сценариев игры выглядит следующим образом: - Алиса выбирает \(1\), а Боб выбирает \(3\). Счет увеличивается, так как \(1+3=4\). Теперь на доске остаются два целых числа \(2\) и \(2\).
- Алиса и Боб оба выбирают \(2\). Счет увеличивается, так как \(2+2=4\).
- Игра заканчивается, так как на доске больше нет целых чисел.
В третьем наборе входных данных невозможно, чтобы сумма выбранных Алиской и Бобом целых чисел была равна \(1\), поэтому мы отвечаем \(0\). Обратите внимание, что это всего лишь пример того, как может проходить игра для демонстрационных целей. Это может не быть самыми оптимальными стратегиями Алисы или Боба.
| |
|
|
G. Ошибочная сортировка
дп
жадные алгоритмы
сортировки
*2400
Сегодня Алиса дала Бобу массивы, которые он должен отсортировать по возрастанию. Снова! На данный момент никто точно не знает, сколько раз она это делала. Бобу даны две последовательности \(a\) и \(b\), обе длиной \(n\). Все целые числа в диапазоне от \(1\) до \(2n\) встречаются ровно один раз в одной из последовательностей \(a\) или \(b\). Другими словами, конкатенированная\(^{\text{∗}}\) последовательность \(a+b\) является перестановкой\(^{\text{†}}\) длины \(2n\). Боб должен отсортировать обе последовательности по возрастанию одновременно, используя функцию swap Алисы. Функция swap Алисы реализована следующим образом: - Даны два индекса \(i\) и \(j\) (\(i \neq j\)), она меняет местами \(a_i\) с \(b_j\) и \(b_i\) с \(a_j\).
Учитывая последовательности \(a\) и \(b\), пожалуйста, определите, можно ли отсортировать обе последовательности по возрастанию одновременно после использования функции swap Алисы любое количество раз. Выходные данные Если возможно отсортировать обе последовательности одновременно, выведите «YES» в новой строке. В противном случае выведите «NO» в новой строке. Вы можете вывести ответ в любом регистре. Например, строки «yEs», «yes», и «Yes» также будут признаны положительными ответами. Примечание В первом наборе входных данных можно показать, что это невозможно. Во втором наборе входных данных Боб может выполнить одну операцию с индексами \(i=1\) и \(j=2\). Массивы становятся \([3,4,5]\) и \([1,2,6]\) соответственно. Оба массива теперь отсортированы.
| |
|
|
E. Кевин и И
битмаски
дп
жадные алгоритмы
математика
Перебор
сортировки
*2000
У Кевина есть целочисленная последовательность \(a\) длины \(n\). Также у Кевина есть \(m\) типов магии, где \(i\)-й тип магии может быть представлен целым числом \(b_i\). Кевин может выполнить не более \(k\) (возможно, ноль) магических операций: - Выбрать два индекса \(i\) (\(1\leq i\leq n\)) и \(j\) (\(1\leq j\leq m\)), а затем сделать \(a_i\) равным \(a_i\ \&\ b_j\). Здесь \(\&\) обозначает операцию побитового И.
Найдите минимально возможную сумму последовательности \(a\) после выполнения не более \(k\) операций. Выходные данные Для каждого набора входных данных выведите одно целое число — минимально возможную сумму последовательности \(a\) после выполнения не более \(k\) операций. Примечание В первом наборе входных данных возможна такая последовательность операций: - Сделать \(a_1\) равным \(a_1\ \&\ b_1\). Последовательность станет равна \([5]\).
- Сделать \(a_1\) равным \(a_1\ \&\ b_3\). Последовательность станет равна \([1]\).
Во втором наборе входных данных возможна такая последовательность операций: - Сделать \(a_1\) равным \(a_1\ \&\ b_3\). Последовательность станет равна \([1, 6]\).
- Сделать \(a_2\) равным \(a_2\ \&\ b_3\). Последовательность станет равна \([1, 2]\).
| |
|
|
F. Задача котовояжёра
геометрия
графы
дп
жадные алгоритмы
Конструктив
математика
сортировки
*2900
Вы — кот, продающий интересные алгоритмические задачи. Сегодня вы хотите прорекламировать свои интересные алгоритмические задачи в \(k\) городах. Всего есть \(n\) городов, каждый из которых имеет два параметра \(a_i\) и \(b_i\). Между любыми двумя городами \(i,j\) (\(i\ne j\)) есть двусторонняя дорога длиной \(\max(a_i + b_j , b_i + a_j)\). Стоимость пути определяется как сумма длин дорог между каждыми двумя соседними городами вдоль пути. Для \(k=2,3,\ldots,n\) найдите минимальную стоимость среди всех простых путей, содержащих ровно \(k\) различных городов. Выходные данные Для каждого набора входных данных выведите \(n-1\) целых числа в одной строке. \(i\)-е целое число представляет собой минимальную стоимость при \(k=i+1\). Примечание В первом наборе входных данных: - Для \(k=2\) оптимальный путь: \(1\to 2\) со стоимостью \(\max(0+1,2+2)=4\).
- Для \(k=3\) оптимальный путь: \(2\to 1\to 3\) со стоимостью \(\max(0+1,2+2)+\max(0+3,3+2)=4+5=9\).
Во втором наборе входных данных: - Для \(k=2\) оптимальный путь: \(1\to 4\).
- Для \(k=3\) оптимальный путь: \(2\to 3\to 5\).
- Для \(k=4\) оптимальный путь: \(4\to 1\to 3\to 5\).
- Для \(k=5\) оптимальный путь: \(5\to 2\to 3\to 1\to 4\).
| |
|
|
B. Обновление подпоследовательности
жадные алгоритмы
Конструктив
сортировки
Структуры данных
*1100
После того как Маленький Джон несколько сотен раз одалживал у тетушки шурупы для расширения, она решила прийти и забрать неиспользованные.Но поскольку они являются важной частью домашнего дизайна, Маленький Джон решает спрятать некоторые из них в самых недоступных местах — под экологически чистыми древесными фанерами. Вам дана последовательность целых чисел \(a_1, a_2, \ldots, a_n\) и отрезок \([l,r]\) (\(1 \le l \le r \le n\)). Вы должны выполнить следующую операцию над последовательностью ровно один раз. - Выберите любую подпоследовательность\(^{\text{∗}}\) последовательности \(a\) и разверните её. Обратите внимание, что подпоследовательность не обязательно должна быть непрерывной.
Формально, выберите любое количество индексов \(i_1,i_2,\ldots,i_k\) так, чтобы \(1 \le i_1 < i_2 < \ldots < i_k \le n\). Затем одновременно измените \(i_x\)-й элемент на оригинальное значение \(i_{k-x+1}\)-го элемента для всех \(1 \le x \le k\). Найдите минимальное значение \(a_l+a_{l+1}+\ldots+a_{r-1}+a_r\) после выполнения операции. Выходные данные Для каждого тестового случая выведите минимальное значение \(a_l+a_{l+1}+\ldots+a_{r-1}+a_r\) в отдельной строке. Примечание Во втором тестовом случае массив \(a=[1,2,3]\), а интервал \([2,3]\). После выбора подпоследовательности \(a_1,a_3\) и её разворота, последовательность становится \([3,2,1]\). Затем сумма \(a_2+a_3\) становится равной \(3\). Можно показать, что минимально возможное значение суммы равно \(3\).
| |
|
|
C. Удалить ровно две
графы
Деревья
дп
жадные алгоритмы
Перебор
поиск в глубину и подобное
сортировки
Структуры данных
*1600
Недавно Маленький Джон получил дерево от своей тёти, чтобы украсить свой дом. Но, как кажется, одного дерева недостаточно, чтобы украсить весь дом. У Маленького Джона появилась идея. Может быть, он сможет удалить несколько вершин из дерева. Это превратит его в большее количество деревьев! Верно? Вам дано дерево\(^{\text{∗}}\), состоящее из \(n\) вершин. Вы должны выполнить следующую операцию ровно дважды. - Выберите вершину \(v\);
- Удалите все рёбра, соединённые с вершиной \(v\), а также саму вершину \(v\).
Вам необходимо найти максимальное количество компонент связности после выполнения операции ровно дважды. Две вершины \(x\) и \(y\) находятся в одной компоненте связности тогда и только тогда, когда существует путь от \(x\) до \(y\). Граф с \(0\) вершинами имеет \(0\) компонент связности по определению.\(^{\text{†}}\) Выходные данные Для каждого теста выведите максимальное количество компонент связности в отдельной строке. Примечание В первом примере удаление вершины дважды сделает граф пустым. По определению количество компонент связности в графе с \(0\) вершинами равно \(0\). Поэтому ответ равен \(0\). Во втором примере удаление двух вершин \(1\) и \(2\) оставляет \(2\) компоненты связности. Поскольку невозможно создать \(3\) компоненты связности с \(2\) вершинами, ответ равен \(2\). В третьем примере удаление двух вершин \(1\) и \(5\) оставляет \(4\) компоненты связности, которые являются \(\left\{ 2,4\right\}\), \(\left\{ 3\right\}\), \(\left\{ 6\right\}\) и \(\left\{ 7\right\}\). Можно показать, что невозможно получить \(5\) компонент связности. Поэтому ответ равен \(4\).
| |
|
|
D. Скибидус и сигма
жадные алгоритмы
сортировки
*1200
Обозначим оценку массива \(b\) с \(k\) элементами как \(\sum_{i=1}^{k}\left(\sum_{j=1}^ib_j\right)\). Иными словами, пусть \(S_i\) обозначает сумму первых \(i\) элементов массива \(b\). Тогда оценка может быть записана как \(S_1+S_2+\ldots+S_k\).
Скибидусу даны \(n\) массивов \(a_1,a_2,\ldots,a_n\), каждый из которых содержит \(m\) элементов. Будучи тем самым сигмой, он хотел бы объединить их в любом порядке, чтобы получить один массив, содержащий \(n\cdot m\) элементов. Пожалуйста, найдите максимальную возможную оценку, которую Скибидус может достичь с помощью своего объединенного массива!
Формально, среди всех возможных перестановок\(^{\text{∗}}\) \(p\) длины \(n\), выведите максимальную оценку для \(a_{p_1} + a_{p_2} + \dots + a_{p_n}\), где \(+\) обозначает объединение\(^{\text{†}}\).
Выходные данные
Для каждого набора входных данных выведите максимальную оценку среди всех возможных перестановок \(p\) на новой строке.
Примечание
Для первого набора входных данных есть две возможности для \(p\):
- \(p = [1, 2]\). Тогда \(a_{p_1} + a_{p_2} = [4, 4, 6, 1]\). Его оценка равна \(4+(4+4)+(4+4+6)+(4+4+6+1)=41\).
- \(p = [2, 1]\). Тогда \(a_{p_1} + a_{p_2} = [6, 1, 4, 4]\). Его оценка равна \(6+(6+1)+(6+1+4)+(6+1+4+4)=39\).
Максимально возможная оценка равна \(41\).
Во втором наборе входных данных одна из оптимальных расстановок окончательного объединенного массива: \([4,1,2,1,2,2,2,2,3,2,1,2]\). Мы можем вычислить, что оценка равна \(162\).
| |
|
|
B. Два больших мешка
дп
жадные алгоритмы
Перебор
сортировки
*1200
У вас есть два больших мешка с числами. Изначально первый мешок содержит \(n\) чисел: \(a_1, a_2, \ldots, a_n\), а второй мешок пуст. Вам разрешено применять следующие операции: - Выбрать любое число из первого мешка и переместить его во второй мешок.
- Выбрать число из первого мешка, такое что равное ему обязательно присутствует во втором мешке, и увеличить его на единицу.
Вы можете применять неограниченное количество операций обоих типов в любом порядке. Возможно ли сделать содержимое первого и второго мешка одинаковым? Выходные данные Для каждого набора входных данных выведите «YES», если возможно уравнять содержимое мешков. Иначе выведите «NO». Вы можете выводить каждую букву в любом регистре (например, «YES», «Yes», «yes», «yEs» будут распознаны как положительный ответ). Примечание Разберём шестой тестовый пример: покажем последовательность операций, приводящую к равенству мешков. Изначально первый мешок состоит из чисел \((3, 3, 4, 5, 3, 3)\), а второй мешок пуст. - В первую операцию перемещаем число \(3\) из первого мешка во второй. Состояние: \((3, 4, 5, 3, 3)\) и \((3)\).
- Во вторую операцию увеличиваем число \(3\) из первого мешка на единицу. Эта операция возможна, так как второй мешок содержит число \(3\). Состояние: \((4, 4, 5, 3, 3)\) и \((3)\).
- В третью операцию перемещаем число \(4\) из первого мешка во второй. Состояние: \((4, 5, 3, 3)\) и \((3, 4)\).
- В четвёртую операцию увеличиваем число \(4\) из первого мешка на единицу. Состояние: \((5, 5, 3, 3)\) и \((3, 4)\).
- В пятую операцию перемещаем число \(5\) из первого мешка во второй. Состояние: \((5, 3, 3)\) и \((3, 4, 5)\).
- В шестую операцию увеличиваем число \(3\) из первого мешка на единицу. Состояние: \((5, 3, 4)\) и \((3, 4, 5)\).
Как видим, в результате таких операций возможно сделать содержимое мешков равным, поэтому ответ существует.
| |
|
|
C. Полоска 2
Бинарный поиск
дп
сортировки
*2000
Однажды Вася взял бумажную полоску из n клеток (высота полоски равна 1 клетке) и в каждой клетке написал целое число, возможно отрицательное. Ему стало интересно, сколько существует способов разрезать полоску на три части так, что суммы чисел в каждой из частей равны между собой, и в каждой части содержится целое положительное число клеток. Помогите Васе решить эту задачу. Выходные данные Выведите число способов разрезать полоску на три непустые части так, что суммы чисел в каждой из частей равны между собой. Не забудьте, что разрезать полоску разрешается только по границам клеток.
| |
|
|
D. Паутина
Бинарный поиск
сортировки
*1700
Паучок По плетет паутину. Плести паутину целое искусство, По учится этому всю жизнь. Давайте рассмотрим структуру паутины. Из центра паутины исходят n основных нитей. Все основные нити находятся в одной плоскости и делят ее на n равных бесконечных секторов. Секторы нумеруются целыми числами от 1 до n по часовой стрелке. Секторы i и i + 1 считаются соседними для любого i, 1 ≤ i < n. Кроме того, соседними считаются секторы 1 и n. В некоторых секторах имеются нити-перемычки. Каждая перемычка соединяет две основные нити, образующие данный сектор. Точки, в которых перемычка крепится к основным нитям, будем называть точками крепления. Обе точки крепления перемычки находятся на одинаковом расстоянии от центра паутины. В каждой точке крепления крепится ровно одна перемычка. Перемычки считаются соседними, если они находятся в одном секторе и между ними нет других перемычек. Ячейкой паутины называется трапеция, которая находится в каком-либо из секторов и ограничена двумя основными линиями и двумя соседними перемычками. Можно заметить, что на боковых сторонах ячейки могут быть точки крепления перемычек из соседних секторов. Если количество точек крепления на одной боковой стороне ячейки не равно количеству точек крепления на другой боковой стороне, то это вносит дисбаланс сил натяжения на данную ячейку и со временем может разрушить всю паутину. Назовем такую ячейку нестабильной. Идеальная паутина не содержит в себе нестабильных ячеек. На картинке нестабильные ячейки отмечены красным цветом. Стабильные ячейки отмечены зеленым цветом. Паучок По еще не мастер, он только учится плести идеальные паутины. Помогите По определить количество нестабильных ячеек в паутине, которую он только что сплел. Выходные данные Выведите единственное целое число — количество нестабильных ячеек в паутине паучка По.
| |
|
|
D. Отрезки
жадные алгоритмы
сортировки
*1900
Дано n отрезков на числовой прямой. Вы можете забить в любую целочисленную точку числовой прямой гвоздь, при этом все отрезки, содержащие эту точку, оказываются прибиты. Если гвоздь попадает в конец отрезка, то этот отрезок считается прибитым. Какое наименьшее число гвоздей нужно забить чтобы все отрезки оказались прибиты? Выходные данные В первую строку выведите одно число — какое наименьшее число гвоздей нужно забить чтобы все отрезки оказались прибиты. Во вторую строку выведите координаты забитых гвоздей через пробел в любом порядке. Если решений несколько, выведите любое.
| |
|
|
A. Маленький Слоник и проблема
реализация
сортировки
*1300
У Маленького Слоника проблема — кто-то трогал его отсортированный по неубыванию массив a длины n и, возможно, поменял некоторые элементы этого массива местами. Маленький Слоник не хочет звонить в полицию до тех пор пока не поймет, мог ли он сам случайно изменить массив. Он считает, что мог случайно изменить массив a, только если массив a можно отсортировать за не больше чем одну операцию обмена элементов массива (не обязательно соседних). То есть Маленький Слоник мог случайно поменять местами два каких-то элемента массива. Помогите Маленькому Слонику, определите, мог ли он сам случайно изменить отсортированный по неубыванию массив a. Выходные данные В единственной строке выведите «YES» (без кавычек), если Маленький Слоник мог сам случайно изменить массив, и «NO» (без кавычек) в противоположном случае. Примечание В первом примере массив уже отсортирован, поэтому для его сортировки требуется 0 операций обмена, что не больше чем 1. Таким образом ответ «YES». Во втором примере массив можно отсортировать, поменяв элементы 1 и 3 местами, поэтому для его сортировки требуется 1 операция обмена. Таким образом ответ «YES». В третьем примере массив нельзя отсортировать за не более чем одну операцию обмена, поэтому ответ «NO».
| |
|
|
C. Сокращение дробей
математика
реализация
сортировки
теория чисел
*1800
Для запутывания противников Галактическая Империя использует особый формат представления дробей. Дроби представлены как два набора целых чисел. Произведение чисел из первого набора дает числитель дроби, из второго — знаменатель дроби. Однако, обнаружилось, что программы для работы с дробями в таком представлении неполны, в них отсутствует поддержка операции сокращения дробей. Реализуйте эту операцию, и Империя не забудет вас. Выходные данные Выведите ответ на задачу в формате аналогичном формату входных данных. Количества чисел в выводимых наборах nout, mout должны удовлетворять неравенству 1 ≤ nout, mout ≤ 105, а сами числа в наборах aout, i и bout, i — неравенству 1 ≤ aout, i, bout, i ≤ 107. Числа в строках разделяйте пробельными символами. Выведенная дробь должна быть сокращена, то есть не должно существовать такого целого x (x > 1), что числитель и знаменатель выведенной дроби делятся на x. Если подходящих ответов несколько — выведите любой. Примечание В первом тестовом примере числитель равен 1000, знаменатель — 500. Если сократить дробь 1000/500 на наибольший общий делитель числителя и знаменателя (на 500), получается дробь 2/1. Во втором тестовом примере числитель равен 2000, знаменатель — 300. Если сократить дробь 2000/300 на наибольший общий делитель числителя и знаменателя (на 100), получается дробь 20/3.
| |
|
|
D. Олимпиада
Бинарный поиск
жадные алгоритмы
сортировки
*1900
Мальчик Вася участвовал в олимпиаде. Учитель мальчика знает, что Вася получил за оба тура олимпиады в сумме не меньше, чем x баллов. У учителя есть результаты первого тура и результаты второго тура олимпиады, но вот беда — в результатах указаны лишь баллы, без фамилий. Учителю необходимо знать, на что Вася может рассчитывать. Помогите учителю Васи, найдите два числа — наилучшее и наихудшее место, которое мог занять Вася. Учтите, что в итоговой таблице участники сортируются по сумме баллов за оба тура (у участника на первом месте больше всего баллов). Если два (или более) участника получили одинаковое количество баллов, жюри может им назначить места по своему усмотрению. Гарантируется, что каждый участник олимпиады участвовал в обоих турах олимпиады. Выходные данные Выведите через пробел два целых числа — наилучшее и наихудшее место из тех, что мог занять Вася на олимпиаде. Примечание В первом тестовом примере в любом случае все 5 участников набирают по 2 балла. В зависимости от решения жюри, Васе могут присудить как первое (наилучшее) место, так и последнее (наихудшее), пятое. Во втором тестовом примере в лучшем для Васи случае он снова выигрывает: он может набрать 12 баллов и стать абсолютным победителем, если итоговая таблица будет выглядеть так — {4:8, 6:4, 3:6, 4:4, 4:3, 5:0}. В этой таблице все участники расположены по убыванию количества баллов, и для участника показано, сколько баллов он набрал в первом и во втором туре. В худшем случае, он может занять пятое место, если таблица выглядит так — {4:8, 4:6, 6:4, 5:4, 4:3, 3:0}, а он набрал в первом и втором турах 4 и 3 балла соответственно.
| |
|
|
C. Апельсины и яблоки
Конструктив
сортировки
*2500
В 2N - 1 ящике лежат яблоки и апельсины. Требуется выбрать N ящиков так, что в них окажется не менее половины всех яблок и не менее половины всех апельсинов. Выходные данные Для каждого теста выведите две строки. В первой строке выведите YES, если возможно выбрать N ящиков, или NO — в противном случае. В случае положительного ответа во второй строке выведите N чисел — номера выбранных ящиков. Ящики нумеруются с 1 в том порядке, в котором они заданы во входных данных. Иначе оставьте вторую строку пустой. Разделяйте числа одним пробелом.
| |
|
|
A. Драконы
жадные алгоритмы
сортировки
*1000
Кирито застрял на очередном уровне MMORPG, в которую он играет. Чтобы пройти игру дальше, ему нужно победить всех n драконов, которые живут на этом уровне. Как Кирито, так и драконы обладают силой, которая выражается целым числом. В схватке между двумя противниками исход схватки определяется их силой. Изначально сила Кирито равна s. Если Кирито вступает в схватку с i-ым (1 ≤ i ≤ n) драконом и его сила не больше, чем сила этого дракона xi, то Кирито проигрывает схватку и умирает. Если же сила Кирито больше, чем сила дракона, то он побеждает дракона и получает бонус — его сила увеличивается на yi. Кирито может сражаться с драконами в произвольном порядке. Определите, сможет ли он пройти на следующий уровень игры, то есть победить всех драконов, не умирая ни разу. Выходные данные В единственной строке выведите «YES» (без кавычек), если Кирито сможет пройти на следующий уровень, и «NO» (без кавычек), если не сможет. Примечание В первом примере сила Кирито изначально равна 2. Поскольку сила первого дракона меньше 2, то Кирито может с ним сразиться и победить его. После этого он получает бонус и его сила возрастает до 2 + 99 = 101. Теперь он может победить второго дракона и пройти на следующий уровень. Во втором примере сила Кирито слишком мала, чтобы он мог сразиться с единственным драконом и победить.
| |
|
|
C. Прибавляй не прибавляй
Бинарный поиск
сортировки
*1600
На листке бумаги записан массив из n чисел a1, a2, ..., an. Вам необходимо найти число, которое встречается в этом массиве наибольшее количество раз. Однако, прежде чем искать такое число, Вам разрешается выполнить не более k операций следующего вида — выбрать произвольный элемент массива и прибавить к нему 1. Другими словами, не более k раз разрешается увеличить на 1 некоторое число из массива (один элемент массива разрешается увеличивать несколько раз). Вам необходимо найти максимальное количество вхождений некоторого числа в массив после выполнения не более k разрешенных операций. Если таких чисел несколько, требуется найти минимальное. Выходные данные В единственной строке выведите два числа — максимальное количество вхождений некоторого числа в массив после выполнения не более k разрешенных операций, а также минимальное число, для которого достигается выведенный максимум. Выведенные числа разделяйте пробельными символами. Примечание В первом примере нужно один раз увеличить второй элемент массива и дважды увеличить пятый элемент массива. Таким образом, получим последовательность 6, 4, 4, 0, 4, в которой число 4 встречается 3 раза. Во втором примере не нужно выполнять ни одной операции, либо увеличить каждый элемент на единицу. В первом случае получим массив 5, 5, 5, во втором — 6, 6, 6. В обоих случаях максимальное количество вхождений равно 3. В случае равенства требуется найти минимальное число. Поэтому нужно выбрать первый вариант, так как число 5 меньше числа 6. В третьем примере нужно один раз увеличить второй элемент массива и один раз увеличить пятый элемент массива. Таким образом, получим последовательность 3, 2, 2, 2, 2, в которой число 2 встречается 4 раза.
| |
|
|
B. Чтение
сортировки
*1000
Вася едет на олимпиаду в город Энск на поезде. Мальчик хочет перечитать учебник для подготовки к олимпиаде. Он посчитал, что ему для этого понадобится k часов. Также он выяснил, что освещение в поезде меняется каждый час. Освещение измеряется по шкале от 0 до 100, то есть 0 — совсем темно, а 100 — очень светло. У Васи есть расписание освещения в поезде на все n часов поездки — это n чисел от 0 до 100 каждое (уровень освещенности в первый час, во второй и так далее). В течение каждого из этих часов он будет либо читать весь час, либо не будет читать вообще. Он хочет выбрать k часов для чтения, не обязательно подряд, так, чтобы минимальный уровень освещенности в выбранные им часы для чтения был максимален. Вася очень волнуется перед предстоящим соревнованием, помогите ему выбрать часы для чтения. Выходные данные В выходной файл в первую строку выведите минимальный уровень освещенности, при котором Вася будет читать. Во вторую строку выведите k различных целых чисел b1, b2, ..., bk, разделенных пробелами, — номера часов, в которые Вася будет читать (1 ≤ bi ≤ n). Часы нумеруются с 1. Если существует несколько оптимальных решений, выведите любое. Числа bi выводите в произвольном порядке. Примечание В первом примере Васе следует читать в первый час (освещенность 20), третий час (освещенность 30) и четвертый час (освещенность 40). Минимальная освещенность, при которой Васе придется читать, равна 20.
| |
|
|
B. Таблица Юнга
реализация
сортировки
*1500
Вам задана таблица a, состоящая из n строк, пронумерованных от 1 до n. В i-ой строке таблицы a содержится ci клеточек, при этом для всех i (1 < i ≤ n) выполняется ci ≤ ci - 1. Обозначим за s общее количество клеточек таблицы a, то есть . Известно, что в каждой клеточке таблицы a записано единственное целое число от 1 до s, при этом все записанные числа различны. Пусть клеточки i-той строки таблицы a пронумерованы от 1 до ci, тогда обозначим число, записанное в j-той клеточке i-той строки, за ai, j. Вам необходимо посредством нескольких операций обмена переупорядочить числа в таблице так, чтобы выполнялись следующие условия: - для всех i, j (1 < i ≤ n; 1 ≤ j ≤ ci) выполняется ai, j > ai - 1, j;
- для всех i, j (1 ≤ i ≤ n; 1 < j ≤ ci) выполняется ai, j > ai, j - 1.
За одну операцию обмена разрешается выбрать две различных клеточки таблицы и поменять записанные в них числа местами, то есть число, которое до применения операции было записано в первой из выбранных клеток, после применения операции будет записано во второй. Аналогично, число, которое до применения операции было записано во второй из выбранных клеток, после применения операции будет записано в первой. Переупорядочите числа требуемым способом. Учтите, что Вам разрешается выполнить любое количество операций не превосходящее s. Минимизировать количество операций не требуется. Выходные данные В первой строке выведите единственное целое число m (0 ≤ m ≤ s), обозначающее количество произведенных операций обмена. В следующих m строках выведите описание этих операций обмена. В i-той из них выведите через пробел четыре целых числа xi, yi, pi, qi (1 ≤ xi, pi ≤ n; 1 ≤ yi ≤ cxi; 1 ≤ qi ≤ cpi). Выведенные числа обозначают операцию обмена содержимого клеток axi, yi и api, qi. Обратите внимание, что операцией обмена можно менять содержимое различных клеток таблицы. Выводите обмены в том порядке, в котором они должны производиться.
| |
|
|
B. Большой отрезок
реализация
сортировки
*1100
На координатной прямой задано n отрезков, i-ый отрезок начинается в позиции li и заканчивается в позиции ri. Будем обозначать такой отрезок через [li, ri]. Вы предположили, что один из заданных отрезков покрывает все остальные. Другими словами, существует такой отрезок из заданного набора, в котором содержатся все остальные. Теперь вы хотите убедиться в своем предположении. Найдите отрезок из набора, который покрывает все остальные заданные отрезки, и выведите его номер. Если такого отрезка не существует, выведите -1. Формально будем считать, что отрезок [a, b] покрывает отрезок [c, d], если выполняется условие a ≤ c ≤ d ≤ b. Выходные данные Выведите единственное целое число — номер отрезка, который покрывает все остальные отрезки набора. Если решения не существует, выведите -1. Отрезки нумеруются с 1 в порядке их появления во входных данных.
| |
|
|
B. Гидра
графы
сортировки
*2000
Однажды Петя на день рождения получил в подарок от мамы книжку «Легенды и Мифы Теории Графов». Оттуда он узнал о таком графе как гидра. Неориентированный граф называется гидрой, если он имеет структуру, указанную на рисунке ниже. А именно: имеются две соединенные ребром вершины u и v, которые соответственно называются грудью и животом гидры. Грудь соединена с h вершинами, которые называются головами гидры. Живот соединен с t вершинами, которые называются хвостами гидры. Заметим, что гидра является деревом, состоящим из h + t + 2 вершин. Еще у Пети есть неориентированный граф G, состоящий из n вершин и m ребер, который он получил в подарок от мамы на прошлый день рождения. Граф G не содержит петель и кратных ребер. Теперь Петя хочет найти в графе G какую-нибудь гидру. Или же установить, что там гидры не содержится. Выходные данные Если в графе G гидры нет, то выведите «NO» (без кавычек). Иначе в первой строке выведите «YES» (без кавычек). Во второй строке выведите два целых числа — номера вершин u и v. В третьей строке выведите h чисел — номера вершин, которые являются головами. В четверной строке выведите t чисел — номера вершин, которые являются хвостами. Все выведенные вершины должны быть различны. Если возможных ответов несколько — разрешается вывести любой. Примечание На картинке ниже изображен первый тестовый пример:
| |
|
|
A. Неудачная сортировка
жадные алгоритмы
Конструктив
сортировки
*900
Мальчик Валера изучает алгоритм сортировки массива целых чисел. После изучения теории он перешел к практике. В результате он написал программу, которая сортирует массив из n целых чисел a1, a2, ..., an по неубыванию. Ниже изображен псевдокод программы, которую написал Вася. На вход программе дается число n и массив a. цикл по переменной i от 1 до n - 1 цикл по переменной j от i до n - 1 если (aj > aj + 1), то поменять местами значения элементов aj и aj + 1
Однако Валера мог допустить ошибку, поскольку еще не до конца выучил алгоритм сортировки. Если Валера все-таки ошибся в своей программе, Вам нужно привести контр-пример, для которого его программа будет работать неверно (то есть после выполнения программы, массив не будет отсортирован по неубыванию). Если такого примера для заданного значения n не существует, выведите -1. Выходные данные Выведите через пробел n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 100) — контр-пример, для которого алгоритм сортировки Валеры будет неправильно работать. Если невозможно привести контр-пример, удовлетворяющий описанным условиям, выведите -1. Если существует несколько контр-примеров, состоящих из n чисел, разрешается вывести любой.
| |
|
|
E. Братья по крови возвращаются
Бинарный поиск
дп
поиск в глубину и подобное
сортировки
Структуры данных
*2400
Поликарп раздобыл дерево родственных связей. Найденное дерево описывает родственные связи n человек, пронумерованных от 1 до n. Каждый человек в этом дереве имеет не более одного непосредственного предка. Также каждый человек в дереве имеет имя, имена не обязательно уникальные. Назовем человека с номером a 1-прародителем человека с номером b, если человек с номером a является непосредственным предком человека с номером b. Назовем человека с номером a k-прародителем (k > 1) человека с номером b, если у человека с номером b есть 1-прародитель, и человек с номером a является (k - 1)-прародителем 1-прародителя человека с номером b. В найденном дереве родственные связи не образуют циклов. Другими словами не существует человека, который непосредственно или косвенно является собственным прародителем (то есть является x-прародителем самого себя, для некоторого x, x > 0). Назовем человека с номером a k-сыном человека с номером b, если человек с номером b является k-предком человека с номером a. Поликарп очень сильно интересуется сколько у кого и каких сыновей. Он записал на листочке m пар чисел vi, ki. Помогите ему для каждой пары vi, ki узнать, сколько существует различных имен, среди всех имен ki-сыновей человека с номером vi. Выходные данные Выведите m целых чисел, разделенных пробельными символами, — ответы на записи Поликарпа. Ответы для записей выводите в том порядке, в котором записи встречаются во входных данных.
| |
|
|
D. Ежик и звезды
геометрия
дп
математика
сортировки
Структуры данных
*2700
По вечерам Ежик ходил к Медвежонку в гости считать звезды. Они усаживались на бревнышке и, прихлебывая чай, смотрели на звездное небо. Оно висело над крышей, прямо за печной трубой. Справа от трубы были звезды Медвежонка, а слева — Ежика. Обычно, Ежик просто считал все звезды, поэтому он знает, что всего их n. В этот раз он решил немного усложнить себе задачу. Он мысленно ввел систему координат: начало координат положил в точке пересечения крыши и трубы, ось OX направил вдоль крыши влево, ось OY — вдоль трубы вверх (см. рисунок). Ежик проводит два луча из начала координат под углами α1 и α2 к оси OX. Теперь он выбирает любую из звезд, лежащих строго между этими лучами. После этого он опять проводит лучи, выходящие из этой звезды, под теми же углами α1 и α2 к оси OX и выбирает очередную звезду, лежащую строго между новыми лучами. Так он повторяет до тех пор, пока между лучами, выходящими из очередной звезды, есть еще звезды, которые он может выбрать. В итоге у Ежика получается цепочка звезд, до каждой из которых он может последовательно добраться действуя по установленным правилам. Ваша задача — найти наибольшее количество звезд m, которое может содержать цепочка, полученная Ежиком. Обратите внимание, что цепочка обязательно должна начинаться в точке начала координат, которая не учитывается при подсчете количества звезд m в цепочке. Выходные данные В единственной строке выведите число m — ответ на задачу. Примечание В примере длиннейшая цепочка, которую может составить Ежик, включает в себя четыре звезды. Обратите внимание, что звезды, лежащие на проводимых Ежиком лучах, не могут быть выбраны.
| |
|
|
B. Разупорядочивание массива
Перебор
сортировки
*1800
Маленький Петя очень любит массивы, состоящие из целых чисел. Недавно мама подарила ему один такой массив, состоящий из n элементов. Сейчас Пете интересно, сможет ли он поменять какие-либо два различных числа в массиве таким образом, чтобы после этого массив не был отсортированным. Обратите внимание, что Петя не может менять местами одинаковые числа, даже если те стоят на разных позициях в массиве. Также обратите внимание на то, что Петя обязан поменять местами какие-то два числа, даже если изначальный массив удовлетворяет всем требованиям. Массив a (элементы массива индексируются, начиная с 1), состоящий из n элементов, называется отсортированным, если выполняется хотя бы одно из следующих двух условий: - a1 ≤ a2 ≤ ... ≤ an;
- a1 ≥ a2 ≥ ... ≥ an.
Помогите Пете найти требуемые две позиции, числа на которых необходимо поменять местами или скажите, что их не существует. Выходные данные Если существует пара позиций, такая что после обмена чисел, стоящих на этих позициях, массив станет не отсортированным, то выведите номера этих позиций через пробел. Если существует несколько искомых пар позиций — выведите любую. Если такой пары не существует, выведите -1. Позиции в массиве нумеруются целыми числами от 1 до n. Примечание В первых двух примерах, очевидно, требуемой пары позиций не существует. В третьем примере можно поменять первые два элемента местами, после чего массив будет выглядеть следующим образом: 2 1 3 4. Этот массив не является отсортированным.
| |
|
|
B. Физпрактикум
Бинарный поиск
дп
сортировки
*1400
На физическом практикуме Вася делал задание по измерению емкости конденсатора. По рекомендации преподавателя, он сделал не одно, а целых n измерений, и записал их результаты в тетрадку. После этого он уже собирался показывать результаты преподавателю, но вспомнил, что на прошлом занятии учитель заставил его друга Петю переделывать эксперимент из-за того, что наибольший и наименьший результаты измерений отличались более чем в два раза. Вася — ленивый, и он не хочет ничего переделывать. Он хочет сдать задание и пойти домой играть в компьютерные игры. Поэтому он решил пойти на хитрость: прежде, чем показывать результаты измерений преподавателю, он сотрет какие-то из них, причем сотрет так, чтобы наибольший и наименьший результаты оставшихся измерений отличались не более, чем в два раза. Другими словами, если среди оставшихся измерений наименьший результат измерения x, а наибольший результат — y, то должно выполняться неравенство y ≤ 2·x. Разумеется, чтобы не вызвать подозрений преподавателя, Вася хочет стереть как можно меньше результатов изменений из своих записей. Помогите Васе, найдите какое наименьшее количество результатов измерений ему придется стереть из своих записей, чтобы наибольший и наименьший результаты оставшихся измерений отличались не более, чем в два раза. Выходные данные Выведите единственное целое число — наименьшее количество результатов, которое Васе придется стереть. Примечание В первом примере можно удалить четвертый и шестой результаты измерений (значения 8 и 7). Тогда наибольшим из оставшихся значений будет 5, а наименьшим — 3. Или же можно удалить третий и пятый результаты (оба равны 3). При таком способе наибольшим из оставшихся значений будет 8, а наименьшим — 4.
| |
|
|
E. Принтер
Бинарный поиск
реализация
сортировки
Структуры данных
*2200
Рассмотрим сетевой принтер, который функционирует следующим образом. Он начинает работать в момент времени 0. Каждую секунду он может напечатать одну страницу текста. В некоторые моменты времени на принтер поступают задания на печать. Известно, что на принтер поступило n заданий. Пронумеруем задания последовательными целыми числами от 1 до n. Тогда задание с номером i характеризуется тремя целыми числами: ti — временем поступления задания, si — объемом задания (в страницах) и pi — приоритетом задания. Приоритеты всех заданий различны. В тот момент, когда задание поступает на принтер, оно попадает в очередь и находится там до тех пор, пока все страницы из этого задания не будут напечатаны. Принтер выбирает страницу для печати каждый раз, когда заканчивает печатать какую-то страницу, либо в те моменты, когда поступает новое задание, а принтер был свободен. Среди всех заданий, имеющихся в очереди в данный момент, принтер выбирает задание с наибольшим приоритетом и в следующую секунду печатает очередную еще не напечатанную страницу из этого задания. Считайте, что задание попадает в очередь мгновенно, поэтому если в некоторый момент времени t задание только что поступило, то принтер уже может выбирать его для печати. Вам дана полная информация о всех заданиях, кроме одного: для него неизвестен приоритет. Однако же известно, в какое время была завершена печать последней страницы из этого задания. По этой информации найдите неизвестное значение приоритета, а также определите времена окончания печати каждого из заданий. Выходные данные В первой строке выведите целое число px — приоритет задания с номером x (1 ≤ px ≤ 109, помните, что все приоритеты должны быть различны). Далее выведите n целых чисел, в i-ое из которых обозначает время завершения печати последней страницы задания с номером i. Гарантируется, что хотя бы одно решение существует. Если решений несколько, выведите любое из них. Примечание Рассмотрим первый тестовый пример. Пусть неизвестный приоритет равен 4, тогда посекундное описание действий принтера: - начало 1-ой секунды (момент времени 0). В очереди задание номер 2. Начинает печататься первая страница этого задания;
- начало 2-ой секунды (момент времени 1). В очереди задания номер 2 и 3. Начинает печататься первая страница задания номер 3;
- начало 3-ой секунды (момент времени 2). В очереди задания номер 2 и 3. Начинает печататься вторая страница задания номер 3;
- начало 4-ой секунды (момент времени 3). В очереди задания номер 2 и 3. Начинает печататься третья (последняя) страница задания номер 3. Таким образом, к концу 4-ой секунды это задание будет напечатано;
- начало 5-ой секунды (момент времени 4). В очереди задания номер 2 и 1. Начинает печататься первая страница задания номер 1;
- начало 6-ой секунды (момент времени 5). В очереди задания номер 2 и 1. Начинает печататься вторая страница задания номер 1;
- начало 7-ой секунды (момент времени 6). В очереди задания номер 2 и 1. Начинает печататься третья (последняя) страница задания номер 1. Таким образом, к концу 7-ой секунды это задание будет напечатано;
- начало 8-ой секунды (момент времени 7). В очереди задание номер 2. Начинает печататься вторая (последняя) страница задания номер 2. Таким образом, к концу 8-ой секунды это задание будет напечатано.
В итоге, задание номер 1 напечатано к концу 7-ой секунды, как и требовалось. А задания 2 и 3 напечатаны к концу 8-ой и 4-ой секунды соответственно.
| |
|
|
A. Карточки с числами
Конструктив
сортировки
*1200
У Пети есть 2n карточек, на каждой из которых написано некоторое целое число. Числа на карточках могут совпадать. Пусть все карточки пронумерованы последовательными целыми числами от 1 до 2n. Число, записанное на карточке с номером i, обозначим как ai. Для того, чтобы сыграть с друзьями в одну увлекательную игру, Пете нужно разбить карточки на пары таким образом, чтобы в каждой паре числа на карточках были одинаковы. Помогите Пете это сделать. Выходные данные Если невозможно разбить карточки на пары так, чтобы в каждой паре на карточках были написаны одинаковые числа, в единственной строке выведите число -1. Если же искомое разбиение существует, то выведите n пар чисел, по одной паре в строке — номера карточек, образующих пары. Числа в парах разделяйте пробелами. Пары и числа в парах можно выводить в любом порядке. Если решений несколько, выведите любое из них.
| |
|
|
A. Розетки
жадные алгоритмы
реализация
сортировки
*1100
У Васи дома много устройств, которые работают от электричества. У него есть n сетевых фильтров, чтобы через них подключать устройства к электросети, i-ый сетевой фильтр имеет ai розеток. Всего у Васи в квартире m устройств, а также k электрических розеток, к которым можно подключать сетевые фильтры или устройства напрямую. Конечно, сетевые фильтры можно подключать к другим сетевым фильтрам. Устройство (или сетевой фильтр) считается подключенным к электричеству, либо если оно подключено к одной из k электрических розеток, либо если оно подключено к какому-то подключенному к электричеству сетевому фильтру. Какое минимальное количество сетевых фильтров из заданного набора понадобится Васе, чтобы подключить все имеющиеся устройства к электросети? Обратите внимание, что все устройства и сетевые фильтры при подключении занимают одну розетку и что к одной розетке можно подключить либо одно устройство, либо один сетевой фильтр. Выходные данные Выведите единственное целое число — минимальное количество сетевых фильтров, которое потребуется для подключения всех устройств. Если все устройства подключить невозможно, используя даже все сетевые фильтры, выведите -1. Примечание В первом тестовом примере можно подключить первый сетевой фильтр напрямую к электросети. После такого подключения получится 5 (3 на фильтре и 2 оставшиеся для подключения напрямую) свободных розеток для дальнейшего подключения к электросети. Таким образом, одного фильтра достаточно для подключения 5 устройств. Один из оптимальных способов подключения во втором тестовом примере — подключить второй сетевой фильтр напрямую, а четвертый сетевой фильтр подключить в одну из розеток на втором сетевом фильтре. В таком случае получится ровно 7 (1 для подключения напрямую, 2 на втором фильтре, 4 на четвертом фильтре) свободных розеток для дальнейшего подключения к электросети. Используя один фильтр, подключить 7 устройств никак не получится.
| |
|
|
A. Максим и скидки
жадные алгоритмы
сортировки
*1400
Максим всегда ходит в супермаркет по воскресеньям. Сегодня в супермаркете действует система скидок. Существует m видов скидок. Будем считать, что скидки пронумерованы от 1 до m. Чтобы воспользоваться скидкой номер i, покупатель берет специальную корзину, в которую кладет ровно qi товаров, которые он покупает. По условиям акции, в дополнение к положенным в корзину товарам покупатель может получить не более двух товаров из супермаркета бесплатно. Выбор количества «бесплатных товаров» (0, 1 или 2) и самих товаров предоставляется покупателю. Единственное условие, которое накладывается на выбранные «бесплатные товары»: каждый из них должен быть не дороже самого дешевого товара из qi товаров корзины. Сейчас Максиму нужно купить n товаров в магазине. Посчитайте, за какую минимальную сумму денег Максим сможет их купить, если он будет пользоваться системой скидок максимально оптимально. Считайте, что в супермаркете имеется достаточное количество корзин для любых действий. Одну и туже скидку разрешается использовать несколько раз. Конечно, Максим может покупать товары без использования каких-либо скидок. Выходные данные В единственную строку выведите целое число — ответ на задачу. Примечание В первом примере Максиму нужно купить два товара стоимостью 100 и получить по скидке два товара стоимостью 50 бесплатно. В таком случае Максим заплатит 200. Во втором примере Максиму выгодно купить 3 товара, а 2 получить бесплатно по скидке. В таком случае Максим заплатит 150.
| |
|
|
B. Квадраты
жадные алгоритмы
реализация
сортировки
*900
Вася нашел лист бумаги, на котором была нарисована система координат. В этой системе координат были построены n различных квадратов. Пронумеруем квадраты целыми числами от 1 до n. Оказалось, что точки с координатами (0, 0) и (ai, ai) являются противоположными углами i-ого квадрата. Вася хочет найти такую целочисленную точку (координаты которой — целые числа) на плоскости, которая принадлежит ровно k нарисованным квадратам. Будем говорить, что точка принадлежит квадрату, если либо она находится внутри него, либо на его границе. Помогите Васе найти точку, удовлетворяющую описанным ограничениям. Выходные данные В единственной строке через пробел выведите два целых числа x и y (0 ≤ x, y ≤ 109) — координаты точки, которая принадлежит ровно k квадратам. Если ответов несколько, разрешается вывести любой из них. Если ответа не существует, выведите «-1» (без кавычек).
| |
|
|
E. Плейлист
математика
сортировки
Теория вероятностей
*2100
Друзья Манао часто присылают ему новые песни. Обычно он слушает их не сразу, а собирает их в плейлист. Когда он чувствует, что его ум открыт для новой музыки, он включает этот плейлист и начинает прослушивать песни. Конечно, Манао нравится далеко не каждая песня. Чтобы получить побольше удовольствия от присланных песен, он придумал следующую процедуру прослушивания плейлиста: - Если, прослушав некоторую песню, Манао понял, что она ему понравилась, он запоминает ее и начинает слушать следующую непрослушанную песню.
- Если, прослушав некоторую песню, Манао понял, что она ему не понравилась, он слушает все понравившиеся ему до этого момента песни и только потом начинает слушать следующую непрослушанную песню.
Например, если у Манао в плейлисте четыре песни A, B, C, D (в соответствующем порядке) и ему в итоге понравятся песни A и C, тогда порядок прослушивания получится следующий: - Манао слушает A, ему она нравится, запоминает.
- Манао слушает B, ему она не нравится, поэтому он снова слушает A.
- Манао слушает C, песня ему нравится и он ее тоже запоминает.
- Манао слушает D, не получает от нее удовольствия и заново слушает песни A и C.
То есть в итоге Манао прослушает три раза песню A, два раза песню C и по одному разу песни B и D. Заметим, что если песня однажды понравилась Манао, она не может разонравиться ему при следующем прослушивании. Манао прислали n песен: i-ая из них длится li секунд и может понравиться Манао с вероятностью pi процентов. Песни могли попасть в плейлист Манао в любом порядке, поэтому Манао хочет знать максимальное математическое ожидание количества секунд, после которого процесс прослушивания закончится, по всем возможным перестановкам песен в плейлисте. Выходные данные В единственной строке выведите одно вещественное число — максимальное по всем перестановкам песен математическое ожидание длительности процесса прослушивания. Ответ будет считаться верным, если абсолютная или относительная погрешность не будет превышать 10 - 9. Примечание Рассмотрим первый тестовый пример. Если слушать песни в том порядке, в котором они заданы изначально, математическое ожидание будет равно 467.5 секунд. Максимальное математическое ожидание получается, если переставить первую песню в конец плейлиста. Рассмотрим второй тестовый пример. Песню длиной 360 секунд нужно слушать первой, а песню длиной 300 секунд, которая определенно не понравится Манао — последней.
| |
|
|
D. Максимальный водопад
графы
дп
сортировки
Структуры данных
*2600
Эмускальда наняли на разработку искусственного водопада в соответствии с последними тенденциями в ландшафтной архитектуре. Современный искусственный водопад состоит из нескольких горизонтальных панелей, прикрепленных к широкой плоской стене. Вода течет вниз, начиная от верха стены, от панели к панели, пока не достигнет нижней части стены. Стена имеет высоту t. К ней прикреплены n панелей. Каждая панель представляет собой горизонтальный отрезок на высоте hi, который начинается с li и заканчивается в ri. Панель номер i соединяет точки стены (li, hi) и (ri, hi). Верхняя часть стены считается панелью, соединяющей точки ( - 109, t) и (109, t). Аналогично, нижняя часть стены соединяет точки ( - 109, 0) и (109, 0). Никакие две панели не имеют общую точку. Эмускальд знает, что для того, чтобы водопад выглядел эффектно, он может течь с панели i на панель j ( ), только если выполнены следующие условия: - max(li, lj) < min(ri, rj) (горизонтальные проекции панелей перекрываются);
- hj < hi (панель j ниже панели i);
- нет такой панели k (hj < hk < hi), что первые два условия выполняются для пар панелей (i, k) и (k, j).
Тогда поток по равняется min(ri, rj) - max(li, lj), длине пересечения их горизонтальных проекций. Эмускальд решил, что в его водопаде вода будет течь по одному пути сверху вниз. Если вода падает на какую-то панель (исключая низ стены), то далее вода должна падать ровно на одну панель ниже нее. Общий поток воды в таком водопаде определяется как минимум величин пересечения горизонтальных проекций между двумя соседними панелями на пути водопада. Более формально: - водопад состоит из одного пути панелей
; - поток водопада равняется минимальному потоку на пути
. Для того, чтобы сделать действительно грандиозный водопад, Эмускальд должен максимизировать этот поток воды, но на стене слишком много панелей, и он с трудом планирует свое детище. Ниже приведен пример одного из водопадов, который хочет установить Эмускальд: Помогите Эмускальду поддержать свою репутацию и найдите значение максимально возможного потока воды в некотором водопаде. Выходные данные Выведите единственное целое число — максимально возможную величину потока воды в искомом водопаде. Примечание Первый тест соответствует картинке.
| |
|
|
A. Следующий тест
реализация
сортировки
*1200
Система разработки задач «Полигон» упрощает и систематизирует процесс создания задач по программированию для соревнований и тренировок. При добавлении теста в ручном режиме соответствующая форма предлагает ввести номер теста. Так как в большинстве случаев очевидно какой номер теста предполагает разработчик задачи, система сама предлагает значение по умолчанию. Это значение вычисляется как наименьшее положительное целое число, которое не является номером добавленного ранее теста. Ваша задача повторить эту функциональность. Напишите программу, которая по списку добавленных ранее тестов находит значение по умолчанию для номера теста на форме его добавления. Выходные данные Выведите искомое значение по умолчанию.
| |
|
|
D. Дима и две последовательности
Комбинаторика
математика
сортировки
*1600
У маленького Димы есть две последовательности точек с целочисленными координатами: последовательность (a1, 1), (a2, 2), ..., (an, n) и последовательность (b1, 1), (b2, 2), ..., (bn, n). Теперь Дима хочет подсчитать сколько различных последовательностей точек длины 2·n можно собрать из этих последовательностей, таких что x-координаты точек в собранной последовательности будут не убывать. Помогите ему в этом. Обратите внимание, что каждый элемент каждой из начальных последовательностей должен быть использован ровно один раз в собранной последовательности. Две собранные последовательности (p1, q1), (p2, q2), ..., (p2·n, q2·n) и (x1, y1), (x2, y2), ..., (x2·n, y2·n) Дима считает различными, если найдется такое i (1 ≤ i ≤ 2·n), что (pi, qi) ≠ (xi, yi). Так как ответ может быть достаточно большим, выведите остаток от деления ответа на число m. Выходные данные В единственную строку выведите остаток от деления ответа на задачу на число m. Примечание В первом примере можно получить только одну последовательность: (1, 1), (2, 1). Во втором примере можно получить такие последовательности : (1, 1), (2, 2), (2, 1), (3, 2); (1, 1), (2, 1), (2, 2), (3, 2). Таким образом ответ 2.
| |
|
|
A. Множество свободное от k-делимости
Бинарный поиск
жадные алгоритмы
сортировки
*1500
Множество свободное от k-делимости — это множество целых чисел, в котором не существует двух целых чисел, таких, что первое число равно другому, умноженному на k. То есть, во множестве не существует двух целых чисел x и y (x < y), таких, что y = x·k. Вам дан набор, состоящий из n различных положительных целых чисел. Ваша задача — найти размер наибольшего его подмножества свободного от k-делимости. Выходные данные В единственной строке выходных данных выведите размер наибольшего подмножества свободного от k-делимости для {a1, a2, ..., an}. Примечание В первом тестовом примере одно из возможных наибольших подмножеств свободных от 2-делимости: {4, 5, 6}.
| |
|
|
D. Прекрасная матрица
графы
жадные алгоритмы
поиск в глубину и подобное
сортировки
*2200
У Ленни была матрица размера n × m, состоящая из целых чисел. Он обожал эту матрицу, поскольку числа в каждой строке матрицы были отсортированы в порядке неубывания. Матрицы, которые обладают таким свойством, Ленни называет прекрасными. Однажды, когда Ленни был в школе, его младший брат играл с матрицей Ленни в своей комнате. Он стер некоторые записи в матрице и изменил порядок некоторых ее столбцов. Придя домой, Ленни очень опечалился и теперь хочет восстановить свою матрицу. Помогите ему найти порядок столбцов матрицы так, чтобы было возможно заполнить стертые записи и снова получить прекрасную матрицу. Обратите внимание, что стертые записи можно заполнять любыми целыми числами. Выходные данные Если не существует возможных способов переупорядочить столбцы, выведите -1. В противном случае, выходные данные должны содержать m целых чисел p1, p2, ..., pm, обозначающих искомую перестановку столбцов. Таким образом, первый столбец прекрасной матрицы будет p1-ым столбцом изначальной матрицы. Второй столбец прекрасной матрицы будет p2-ым столбцом изначальной матрицы и так далее.
| |
|
|
C. Девочка и максимальная сумма
жадные алгоритмы
реализация
сортировки
Структуры данных
*1500
Девочка очень любит задачи про запросы на массиве. Однажды ей попалась довольно известная задача: дан массив из \(n\) элементов (элементы массива проиндексированы от 1); также есть \(q\) запросов, каждый из которых задается парой целых чисел \(l_i\), \(r_i\) \((1 \le l_i \le r_i \le n)\). Для каждого запроса необходимо найти сумму всех элементов массива с индексами от \(l_i\) до \(r_i\) включительно. Такая задача показалась Девочке довольно скучной. Она решила, что перед тем, как отвечать на запросы, она перемешает элементы массива, причем так, чтобы сумма ответов на все запросы была максимально возможной. Ваша задача — найти значение этой максимальной суммы. Выходные данные В единственной строке выведите целое число — максимальную сумму ответов на запросы после перемешивания элементов массива. Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.
| |
|
|
C. Получаем перестановку
жадные алгоритмы
реализация
сортировки
*1200
Перестановкой p называется упорядоченный набор чисел p1, p2, ..., pn, состоящий из n различных целых положительных чисел, каждое из которых не больше чем n. Обозначим i-й элемент перестановки p через pi. Число n будем называть размером или длиной перестановки p1, p2, ..., pn. Вам дана последовательность целых чисел a1, a2, ..., an. За один ход разрешается уменьшить или увеличить любое число на единицу. Посчитайте, какое наименьшее число ходов необходимо, чтобы получить из данной последовательности перестановку. Выходные данные Выведите единственное целое число — минимальное количество ходов. Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d. Примечание В первом примере нужно уменьшить первое число на единицу, и затем увеличить второе число на единицу. В результате получится перестановка (2, 1). Во втором примере за 6 ходов можно получить перестановку (1, 3, 2).
| |
|
|
D. Туристы
сортировки
Структуры данных
*2600
Двойная туристическая тропа, расположенная в одном из парков города Крайняя Туле, работает по следующему принципу: - Вводится декартова система координат.
- В некоторые моменты времени из точек ( - 1, 0) и (1, 0) одновременно выходят два туриста. Первый — из точки ( - 1, 0), второй — из точки (1, 0).
- Оба туриста в паре движутся с одинаковой скоростью 1 (единица длины в секунду), первый — вдоль прямой x = - 1, второй — вдоль прямой x = 1, оба — в положительном направлении оси Oy.
- В некоторые моменты времени появляются перегородки. Перегородка (li, ri) — это отрезок между точками (0, li) и (0, ri). Каждая перегородка появляется мгновенно.
Правительство Крайней Туле хочет узнать для каждой пары туристов, выходящих одновременно, сколько времени (в секундах) они не будут видеть друг друга. Два туриста не видят друг друга, если отрезок, соединяющий их положения на плоскости, пересекает хотя бы одну перегородку. Два отрезка пересекаются, если они имеют хотя бы одну общую точку. Считается, что концы отрезков принадлежат отрезкам. Помогите правительству, посчитайте требуемые времена. Обратите внимание, что перегородки могут пересекаться (любым способом), накладываться или совпадать. Выходные данные Для каждой пары выведите в отдельной строке единственное целое число — время в секундах, в течение которого туристы из соответствующей пары не будут видеть друг друга. Выводите эти числа в том же порядке, в каком пары заданы во входных данных.
| |
|
|
B. Пингвин Поло и матрица
дп
Перебор
реализация
сортировки
Тернарный поиск
*1400
У маленького пингвина Поло есть матрица n × m, состоящая из целых чисел. Пронумеруем строки матрицы от 1 до n сверху вниз, а столбцы от 1 до m слева направо. Обозначим через aij элемент матрицы, стоящий на пересечении i-ой строки и j-го столбца. За один шаг пингвин может добавить к любому элементу матрицы или отнять от любого элемента матрицы число d. Найдите минимальное количество шагов, которое требуется для того, чтобы все элементы матрицы были равны между собой. Если описанное невозможно, сообщите об этом. Выходные данные В единственной строке выведите целое число — минимальное количество шагов, которое требуется для того, чтобы все элементы матрицы были равны между собой. Если описанное невозможно, выведите «-1» (без кавычек).
| |
|
|
A. Разговоры в Spyke
*особая задача
реализация
сортировки
*800
Поликарп — директор большой корпорации. В этой корпорации работает n секретарей, каждый из которых пользуется известной VoIP-системой Spyke для ведения переговоров в течение рабочего дня. Известно, что, когда два человека устанавливают телефонное соединение Spyke, сеть Spyke присваивает этому разговору уникальный идентификационный номер (целое положительное число) — номер сессии. Как-то раз Поликарп захотел узнать, кто из секретарей разговаривает по Spyke, а кто — нет. Он выписал для каждого секретаря номер сессии его разговора, или 0, если этот секретарь сейчас не разговаривает по Spyke. Помогите Поликарпу по этим данным определить, сколько пар секретарей сейчас ведут разговор между собой. Если в данные Поликарпа закралась ошибка, и описанная ситуация никак не могла произойти, требуется сообщить об этом. Обратите внимание, секретари могут разговаривать по Spyke не только друг с другом — возможны разговоры с внешними собеседниками. Также не разрешены конференции Spyke — то есть в каждом разговоре должны участвовать ровно два собеседника. Выходные данные Выведите единственное целое число — количество пар секретарей, которые ведут разговор между собой, или -1, если в данные Поликарпа закралась ошибка, и описанная ситуация никак не могла произойти. Примечание В первом тестовом примере есть два телефонных разговора между секретарями: секретарь номер 2 и секретарь номер 4, секретарь номер 3 и секретарь номер 5. Во втором тестовом примере описанная ситуация невозможна, так как не разрешены конференции.
| |
|
|
A. Ксюша и массив
Перебор
сортировки
теория чисел
*1000
Ксюша — начинающий программист. Сегодня она знакомится с массивами. У нее есть массив a1, a2, ..., an, состоящий из n целых положительных чисел. Преподаватель в университете задал ей задачу. Найти такое число в массиве, на которое делятся все элементы массива. Помогите ей, найдите это число! Выходные данные Выведите единственное целое число — число из массива, на которое делятся все числа из массива. Если такого числа нет, выведите -1. Если существует несколько ответов, разрешается вывести любой.
| |
|
|
B. Грузовик
жадные алгоритмы
сортировки
*1900
Группа туристов собирается в водный поход. На лодочную базу прибыл арендованный грузовик, в который будут погружены байдарки и катамараны, а затем доставлены на место отправления. Известно, что все байдарки равны по размерам между собой (и занимают 1 куб. метр пространства), а катамараны равны по размерам между собой и в два раза больше байдарки (и занимают 2 куб. метра пространства). Каждое плавсредство обладает некоторой грузоподъемностью, причем даже неотличимые с виду плавсредства могут обладать разной грузоподъемностью. По заданному объему кузова грузовика и списку плавсредств (для каждого известен его тип и грузоподъемность) определите набор, который можно перевести и который обладает максимальной возможной грузоподъемностью. Объем кузова грузовика можно использовать максимально эффективно, то есть в кузов всегда можно погрузить плавсредство объемом не превышающее свободный объем кузова. Выходные данные В первую строку выведите искомую максимальную грузоподъемность набора. Во вторую строку выведите номера плавсредств, которые составляют оптимальный набор. Если решений несколько, выведите любое.
| |
|
|
B. Оптимизатор
жадные алгоритмы
сортировки
Структуры данных
*2100
Оперативная память процесса — это последовательность байт, которые пронумерованы по порядку от 1 до n. Программа Поликарпа состоит из инструкций типа «memset», то есть операций заполнения ячеек памяти (байтов) на отрезке некоторым значением. Подробнее, его программа исключительно состоит из m инструкций вида «set13 a_i l_i». Инструкция i заполняет непрерывный участок памяти длины li, начинающийся с ячейки номер ai, (то есть ячейки с номерами ai, ai + 1, ..., ai + li - 1) значениями 13. Задача оптимизатора программы Поликарпа — выбросить максимальное количество инструкций из его программы так, чтобы оставшиеся инструкции установили значение 13 в тех и только тех байтах памяти, что и программа до оптимизации. Ваша задача — реализовать оптимизатор такой программы. Выходные данные В первую строку выведите искомое максимальное количество инструкций, которые можно удалить из программы. Во вторую строку выведите номера инструкций. Инструкции нумеруются от 1 до m в порядке их появления во входных данных. Если решений несколько, выведите любое.
| |
|
|
C. Илья и матрица
жадные алгоритмы
Конструктив
реализация
сортировки
*1400
Илья — очень добрый лев, который любит математику. Из всех математических объектов Илья больше всего любит матрицы. Сейчас перед ним стоит непростая задача о матрицах, которую нужно решить. Заданы квадратная матрица размера 2n × 2n и 4n целых чисел. Нужно разместить все эти числа в матрице (каждое число поместить в отдельную ячейку) так, чтобы красота полученной матрицы с числами была максимальна. Красотой матрицы размера 2n × 2n называется целое число, получаемое по следующему алгоритму: - Найти максимальный элемент в матрице. Обозначим его за m.
- Если n = 0, тогда красота матрицы равна m. Иначе, матрицу можно разбить на 4 непересекающиеся подматрицы размера 2n - 1 × 2n - 1, тогда красота матрицы равна сумме числа m и четырех красот описанных подматриц.
Как можно заметить, этот алгоритм — рекурсивный. Помогите Илье, решите задачу и выведите результирующую максимальную красоту матрицы. Выходные данные В единственную строку выведите максимальное значение красоты полученной матрицы. Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d. Примечание Рассмотрим второй пример, числа в матрице надо расставить следующим способом: 1 2 3 4
Тогда красота матрицы будет равна: 4 + 1 + 2 + 3 + 4 = 14.
| |
|
|
D. Сережа и прямые
Бинарный поиск
геометрия
сортировки
Структуры данных
*2500
Сережа разместил n точек на плоскости. Сейчас Сережа хочет разместить на плоскости две прямые, пересекающиеся под прямым углом, так, чтобы одна из прямых пересекала ось Ox под углом 45 градусов, а максимальное из расстояний от точек до прямых было бы минимально. В данной задаче мы считаем, что расстояние между точками (x1, y1) и (x2, y2) равно |x1 - x2| + |y1 - y2|. Расстояние от точки до прямых — это минимальное из расстояний от точки до некоторой точки, принадлежащей одной из прямых. Помогите Сереже, найдите максимальное расстояние от точек до оптимально расположенных прямых. Выходные данные В единственную строку выведите единственное вещественное число — ответ на задачу. Ответ будет считаться правильным, если его относительная или абсолютная погрешность не превышает 10 - 6.
| |
|
|
D. Рыцари
геометрия
графы
кратчайшие пути
сортировки
*2000
Над Берляндией снова сгустились тучи. Армия злого лорда Ван де Марта собирается захватить королевство. На военный совет созванный королём Берляндии Валерием Суровым прибыло n рыцарей. После долгих дискуссий стало ясно, что в королевстве есть ровно n опорных точек (сдача каждого из них врагу равносильна поражению в войне) и каждый рыцарь займёт одну из этих точек. Берляндия разделена на m + 1 область m заборами, и единственный способ перейти из одной области в другую это перелезть через забор. Каждый забор представляет собой окружность на плоскости, причём никакие два забора не имеют общих точек и ни одна опорная точка не находится на заборе. Вам задано k пар чисел ai, bi. Для каждой пары вам нужно узнать: сколько заборов придётся пересечь рыцарю, находящемуся в опорной точке номер ai, чтобы достигнуть опорной точки bi (в случае если Ван де Март нанесёт первый удар в опорную точку номер bi). Поскольку каждый рыцарь путешествует на коне (а коня непросто перекидывать через забор), то вам нужно для каждой пары найти минимальное число пересечений. Выходные данные Выведите ровно k строк, в каждой из которых записано одно число — ответ на соответствующий запрос.
| |
|
|
C. Месть студентов
жадные алгоритмы
сортировки
Структуры данных
*2200
Нелегка студенческая жизнь. На собственном опыте пришлось прочувствовать это некоторым студентам Берляндского университета. За два года обучения возникла у них стойкая неприязнь к заведующей одной из кафедр. В самом деле, то группы переформирует, то запретит ставить студентам автоматы, то совершит еще какой-нибудь отвратительный поступок. Решили студенты, что все это не должно сойти заведующей с рук... Благодаря связям в ректорате студентам стало известно, что на следующем заседании ректората будет рассмотрено n приказов, касающихся заведующей, при этом принято из них будет ровно p. Для каждого приказа определено две величины: ai — количество седых волос, которое прибавится на голове у заведующей, если она выполнит этот приказ, и bi — недовольство ректората тем, что данный приказ не будет выполнен. Студенты могут добиться того, чтобы в ректорате были приняты любые выбранные ими p приказов. Студенты знают, что из числа этих p приказов заведующая выполнит ровно k, причем она будет выбирать их таким образом, чтобы минимизировать в первую очередь суммарное недовольство ректората ее действиями, а во вторую — количество седых волос, которое прибавится у нее на голове. Студенты хотят выбрать p приказов так, чтобы на голове у заведующей прибавилось как можно больше седых волос. Если при этом есть несколько вариантов принятия приказов, то в интересах студентов максимизировать недовольство ректората действиями заведующей. Помогите им. Выходные данные Выведите в произвольном порядке p различных целых чисел — номера приказов, которые необходимо принять, чтобы осуществить замысел студентов. Приказы нумеруются от 1 до n согласно порядку их следования во входных данных. Если оптимальных решений несколько, можно вывести любое. Примечание В первом примере одно из оптимальных решений — это принятие приказов 1, 2, 3. В этом случае заведующая выполнит приказы с номерами 1 и 2. У нее на голове прибавится 10 седых волос, а недовольство ректората ее действиями будет равно 3. Отметим, что такого же результата можно достичь, приняв вместо приказа 3 приказ 4. Во втором примере заведующая сможет выполнить все приказы, поэтому студентам лучше всего принимать приказы с максимальной суммой ai. На голове у заведующей прибавится 58 седых волос, а недовольство ректората будет равно 0.
| |
|
|
D. Характеристики прямоугольников
Бинарный поиск
битмаски
Перебор
реализация
сортировки
*2100
Геральд обнаружил табличку, состоящую из n строк и m столбцов, в каждой клетке которой целое число. Как видный специалист по прямоугольным таблицам, он сейчас же посчитал характеристику этой таблицы, то есть, минимальное из чисел в углах этой таблицы. Однако полученная величина ему не понравилась — она показалась ему слишком уж маленькой. И чтобы сделать эту величину побольше, он решил немного обрезать таблицу: удалить несколько столбцов слева и несколько справа, а также несколько строк сверху и несколько — снизу. Найдите, какой максимальной может стать характеристика таблицы после такого обрезания. Учтите, что в таблице должно остаться хотя бы две строки и хотя бы два столбца. При этом количество обрезаемых с каждой из четырех сторон строк или столбцов может быть нулевым. Выходные данные Выведите единственное целое число — ответ на задачу. Примечание В первом тестовом примере Геральд ничего не может поделать со своим недовольством — в таблице всего две строки и два столбца. Во втором тестовом примере, как бы Геральд не обрезал таблицу, все равно хотя бы в одном из углов будет 0.
| |
|
|
E. Летний заработок
Бинарный поиск
битмаски
геометрия
Перебор
сортировки
*2500
Многие школьники ищут себе работу на лето, и вот, однажды, когда Геральд был еще школьником, он тоже решил поработать летом. Но так как Геральд был совсем необычным школьником, то и работу он нашел себе неожиданную. Некая Компания согласилась заплатить ему определенную сумму денег, если он нарисует им три одинаковых круга на плоскости, которые не будут пересекаться друг с другом (но могут касаться). Центры кругов он может выбирать только из n вариантов, предоставленных Компанией. Радиус кругов он волен выбирать сам (радиус всех трех кругов должен быть одинаковым); при этом, чем больше окажется этот радиус, тем больше ему заплатят. Помогите Геральду заработать как можно больше. Выходные данные Выведите единственное вещественное число — максимальный возможный радиус кругов. Ответ будет засчитан, если его относительная или абсолютная погрешность не превышает 10 - 6.
| |
|
|
B. Восьмиточечные наборы
сортировки
*1400
Геральд весьма требователен к наборам из восьми точек. Он считает, что любой уважающий себя набор из восьми точек должен состоять из всех попарных пересечений трех различных целочисленных вертикальных прямых и трех различных целочисленных горизонтальных прямых, кроме средней из этих девяти точек. Иными словами, должны существовать три целых числа x1, x2, x3 и еще три целых числа y1, y2, y3, такие, что x1 < x2 < x3, y1 < y2 < y3 и восьмиточечный набор состоит из всех точек (xi, yj) (1 ≤ i, j ≤ 3), кроме точки (x2, y2). Вам дан набор из восьми точек. Определите, может ли Геральд иметь дело с этим набором? Выходные данные В единственной строке выведите слово «respectable», если данный набор точек соответствует Геральдовским правилам приличия, и «ugly» в противном случае.
| |
|
|
A. Математика спешит на помощь
жадные алгоритмы
реализация
сортировки
Строки
*800
Начинающий математик Ксения учится в третьем классе. Сейчас в школе она проходит операцию сложения. Учитель записал на доске сумму нескольких чисел, которую требуется посчитать. Чтобы было проще считать, в сумме используются только числа 1, 2 и 3. Но и этого Ксении мало. Ксения только учится считать, и поэтому она может посчитать сумму, только если слагаемые в сумме идут в порядке неубывания. Например, сумму 1+3+2+1 она посчитать не может, а суммы 1+1+2 и 3+3 может. Вам задана сумма, которая записана на доске. Переставьте слагаемые и выведите ее в виде, в котором Ксения сможет посчитать сумму. Выходные данные Выведите новую сумму, которую сможет посчитать Ксения.
| |
|
|
B. Распродажа
жадные алгоритмы
сортировки
*900
Однажды Вася попал на распродажу старых телевизоров. Всего на распродаже n телевизоров. Цена телевизора номер i — ai бурлей. Причем часть телевизоров имеет отрицательную цену — их хозяева готовы сами заплатить Васе за то, что он избавит их от ненужной техники. Вася может «купить» любые телевизоры, какие захочет. Но хоть он и очень сильный, Вася может унести не больше m телевизоров, а возвращаться на распродажу второй раз у него нет желания. Помогите Васе: найдите наибольшую сумму денег, которую он сможет заработать. Выходные данные Выведите одно число — максимальную сумму денег, которую заработает Вася, если он может унести не больше m телевизоров.
| |
|
|
C. Список
Разбор выражений
реализация
сортировки
Строки
*1300
Компания «Bersoft» работает над новой версией своего самого известного текстового редактора, Bord 2010. В Bord, как и во многих других текстовых редакторах, должна быть реализована возможность печати многостраничных документов. Пользователь перечисляет через запятую (без пробелов) номера страниц документа, которые он хочет распечатать. Вам поручено написать часть программы, выполняющую «нормализацию» списка. На вход вашей программе подается список, который ввел пользователь. Ваша программа должна вывести этот список в формате l1-r1,l2-r2,...,lk-rk, где ri + 1 < li + 1 для всех i от 1 до k - 1, и li ≤ ri. Новый список должен содержать все страницы которые ввел пользователь и ничего больше. Повторные появлений одной и той же страницы в списке пользователя следует игнорировать. В случае, если для некоторого элемента i нового списка li = ri, этот элемент необходимо выводить как li, а не «li - li». Например, список 1,2,3,1,1,2,6,6,2 нужно вывести в виде 1-3,6. Выходные данные Выведите список в требуемом формате.
| |
|
|
A. Вычитание в ряду
Конструктив
реализация
сортировки
*1300
Вы хотите выстроить в ряд n целых чисел a1, a2, ..., an в некотором порядке. Назовем стоимостью расположения сумму разностей между всеми парами соседних чисел. Более формально, обозначим некоторое расположение чисел в строке последовательностью x1, x2, ..., xn, где x — это перестановка последовательности a. Стоимость такого расположения x — это (x1 - x2) + (x2 - x3) + ... + (xn - 1 - xn). Найдите наибольшую возможную стоимость расположения. После этого выведите лексикографически наименьшую последовательность x, соответствующую некоторому расположению с наибольшей возможной стоимостью. Выходные данные Выведите требуемую последовательность x1, x2, ..., xn. Последовательность x должна быть лексикографически наименьшей перестановкой a, соответствующей некоторому расположению с наибольшей возможной стоимостью. Примечание В примере стоимость выведенного расположения равна (100 - ( - 50)) + (( - 50) - 0) + (0 - 50) + (50 - ( - 100)) = 200. Не существует расположения с большей стоимостью, а среди всех расположений со стоимостью 200 выведенное является лексикографически наименьшим. Последовательность x1, x2, ... , xp лексикографически меньше последовательности y1, y2, ... , yp, если существует такое число r (0 ≤ r < p), что x1 = y1, x2 = y2, ... , xr = yr и xr + 1 < yr + 1.
| |
|
|
A. Мафия
Бинарный поиск
математика
сортировки
*1600
Как-то раз собрались n друзей, чтобы сыграть в «Мафию». В каждом раунде игры «Мафия» должен быть назначен ведущий (кто-то один из ребят), остальные n - 1 человек принимают участие в игре. Для каждого человека известно, в каком количестве раундов он хочет принять участие как игрок, а не как ведущий: i-ый человек хочет сыграть ai раундов. Какое минимальное количество раундов игры «Мафия» нужно сыграть, чтобы каждый человек сыграл как минимум столько раундов, сколько хочет? Выходные данные В единственную строку выведите целое число — минимальное количество раундов игры, которое нужно сыграть, чтобы i-ый человек сыграл как минимум ai раундов. Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.
| |
|
|
E. Парад
сортировки
Структуры данных
*2100
Ни один день победы в Берляндии не обходился без парада военной техники. Этот год не является исключением. В связи с этим подготовка уже идёт полным ходом. Танки уже строятся в одну колонну, артиллерийские установки готовы стрелять, солдаты маршируют на главной площади... А у генерала военно-воздушных сил Генералова опять неприятности. За последний год в Берляндии полным ходом шло строительство небоскрёбов, поэтому самолётам теперь не так просто летать по городу. Было решено, что все самолёты будут лететь строго с юга на север, при этом на всём пути самолёта не должно встретиться ни одного небоскрёба, иначе праздник закончится трагически. В министерстве строительства были получены данные об n небоскрёбах (остальные здания достаточно маленькие и самолётам не помешают). Если смотреть на город с юга на север как на плоскость, то i-ое здание представляет собой прямоугольник высоты hi. Его самая западная точка имеет абсциссу li, а самая восточная точка — ri. Рельеф местности в городе плоский, поэтому основания всех зданий находятся на одном уровне. Ваша задача, как главного программиста министерства обороны, по данным о небоскрёбах найти огибающую ломаную, то есть такую что: - Если смотреть на город с юга на север как на плоскость, то любая часть любого здания будет находиться внутри или на границе области, ограниченной ломаной вместе с поверхностью земли.
- Ломаная начинается и заканчивается на уровне поверхности земли, т.е. на высоте 0.
- Звенья ломаной параллельны осям координат, т.е. могут быть только вертикальными или горизонтальными.
- Вершины ломаной должны иметь целочисленные координаты.
- На виде города с юга на север ломаная (вместе с поверхностью земли) ограничивает минимально возможную площадь.
- Ломаная должна иметь наименьшую длину среди всех ломаных, ограничивающих вместе с поверхностью земли наименьшую площадь.
- Последовательные звенья ломаной должны быть перпендикулярны.
Рисунок ко второму примеру (в правой части отмечена искомая огибающая ломаная). Выходные данные В первой строке выведите целое число m — количество вершин огибающей ломаной. Следующие m строк должны содержать по 2 целых числа — позицию и высоту вершины ломаной. Вершины ломаной выдавайте в порядке обхода ломаной с запада на восток. Помните, что первая и последняя вершины ломаной должны располагаться на высоте 0.
| |
|
|
C. Бомбы
жадные алгоритмы
реализация
сортировки
*1600
У Вас есть робот, задачей которого является уничтожение бомб, расположенных на координатной плоскости. А именно, на координатной плоскости расположены n бомб, причем i-ая бомба расположена в точке с координатами (xi, yi). Известно, что никакие две бомбы не расположены в одной точке и что никакая бомба не расположена в точке с координатами (0, 0). Изначально робот расположен в точке с координатами (0, 0). Для удобства будем обозначать парой (x, y) — текущее положение робота. Для того, чтобы уничтожить все бомбы, робот должен выполнить несколько операций, каждая операция одного из следующих трех типов: - Формат операции — «1 k dir». Во время выполнения операции робот k (k ≥ 1) раз перемещается в направлении dir. Всего робот может двигаться только в 4 направления: «R», «L», «U», «D». За одно перемещение в зависимости от направления dir робот переходит в одну из следующих точек: (x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1) (точки заданы соответственно направлениям). Запрещено выполнять перемещение из точки (x, y), если хотя бы одна из точек пути (кроме точки, в которую мы в конечном итоге придем k-ым перемещением) содержит бомбу.
- Формат операции — «2». Во время выполнения операции робот поднимает бомбу в точке (x, y) и кладет ее в специальный контейнер, расположенный в роботе. Таким образом робот может переносить бомбу из любой точки в любую другую точку. Операцию запрещено выполнять, если в точке (x, y) нет бомбы. Запрещено поднимать бомбу, если в контейнере у робота уже есть бомба.
- Формат операции — «3». Во время выполнения операции робот достает бомбу из контейнера и уничтожает ее. Разрешается выполнять эту операцию, только если робот находится в точке (0, 0). Запрещено выполнять операцию, если в контейнере нет бомбы.
Помогите роботу, найдите последовательность операций минимальной длины, с помощью которой робот уничтожит все бомбы на координатной плоскости. Выходные данные В первой строке выведите единственное число k — минимальное количество операций, необходимых для уничтожения всех бомб. В следующих строках выведите описания этих k операций в формате, указанном в условии. Если существует несколько последовательностей, разрешается вывести любую. Гарантируется, что существует решение, где k ≤ 106.
| |
|
|
D. Поиск сов
Бинарный поиск
геометрия
сортировки
Структуры данных
хэши
*2400
Император Палпатин очень любит сов. У Императора есть чертеж новой Звезды Смерти, на котором нарисовано n различных отрезков и m различных окружностей. Будем полагать, что отрезки пронумерованы от 1 до n некоторым образом, и окружности пронумерованы от 1 до m некоторым образом. Совой, по мнению Палпатина, является совокупность пары различных окружностей (i, j) (i < j) и одного отрезка k такая, что: - окружности i и j симметричны относительно прямой, содержащей отрезок k;
- окружности i и j не имеют общих точек;
- окружности i и j имеют одинаковый радиус;
- отрезок k пересекается с отрезком, соединяющем центры окружностей i и j.
Помогите Палпатину, посчитайте количество различных сов на рисунке. Выходные данные Выведите единственное число — ответ на задачу. Пожалуйста, не используйте спецификатор %lld для вывода 64-битных чисел на С++. Рекомендуется использовать поток cout или спецификатор %I64d. Примечание Это сова из первого примера. Она сидит и ждет, когда вы ее посчитаете.
| |
|
|
B. Джефф и периоды
реализация
сортировки
*1300
Как-то раз Джефф раздобыл последовательность целых чисел a1, a2, ..., an длиной n. Мальчик сразу же решил проанализировать последовательность. Для этого ему нужно найти все значения x, для которых выполняются условия: - x встречается в последовательности a.
- Рассмотрим все номера элементов последовательности a, которые совпадают с x (такие i, что ai = x). Эти номера, отсортированные по возрастанию, должны образовывать арифметическую прогрессию.
Помогите Джеффу, найдите все x, которые удовлетворяют условиям. Выходные данные В первую строку выведите число t — количество подходящих x. В каждой из следующих t строк выведите два целых числа x и px, где x — очередное подходящее значение, px — разность прогрессии номеров (если x встречается в последовательности ровно один раз, px должно быть равно 0). Пары выводите в порядке возрастания x. Примечание В первом тесте элемент 2 встречается в последовательности ровно один раз, следовательно p2 = 0.
| |
|
|
B. Две кучки
жадные алгоритмы
Комбинаторика
Конструктив
математика
реализация
сортировки
*1900
У Валеры имеется 2·n кубиков, на каждом из которых записано целое число от 10 до 99. Он произвольным образом выбирает n кубиков и откладывает в первую кучку. Оставшиеся кубики образуют вторую кучку. Валера решил поиграть с кубиками. Для этого он достает кубик из первой кучки и записывает число, изображенное на нем. Затем он достает кубик из второй кучки и дописывает к имеющимся двум цифрам справа двузначное число, изображенное на этом кубике. В итоге у Валеры получается четырехзначное число, первые две цифры которого записаны на кубике из первой кучки, а вторые две — на кубике из второй кучки. Валера увлекается арифметикой, поэтому он с легкостью посчитал количество различных четырехзначных чисел, которые можно получить в его забавной игре. Другой вопрос, а как разделить кубики на кучки так, чтобы можно было получить как можно больше различных четырехзначных чисел. Этого Валера не знает, поэтому хочет спросить у вас. Выходные данные В первой строке выведите целое число — максимально возможное количество различных четырехзначных чисел, которое может получить Валера. Во второй строке выведите 2·n целых чисел bi (1 ≤ bi ≤ 2), число bi обозначает номер кучки в которую Валера должен отнести i-ый кубик. Если существует несколько вариантов разбиения кубиков на кучки, дающих максимально возможное количество различных четырехзначных чисел, которое может получить Валера, выведите любой из них. Примечание В первом примере Валера может отложить первый кубик в первую кучку, а второй — во вторую. В этом случае он сможет получить число 1099. Если же он поместит в первую кучку второй кубик, а во вторую — первый, то он сможет получить число 9910. В обоих случаях максимальное количество различных чисел равно единице. Во втором тестовом примере Валера сможет получить числа 1313, 1345, 2413, 2445. Обратите внимание, что если бы Валера отложил в первую кучку первый и третий кубики, то он смог бы получить лишь два числа 1324 и 1345.
| |
|
|
B. Петя и лестницы
реализация
сортировки
*1100
Мальчик Петя очень любит лестницы, при этом ему скучно по ним просто ходить — он любит перепрыгивать некоторые ступеньки. Стоя на какой-то ступеньке, он может прыгнуть на следующую ступеньку, перепрыгнуть через одну ступеньку или сразу через две. Но некоторые ступеньки слишком грязные, и Петя не хочет на них наступать. Сейчас Петя стоит на первой ступеньке лестницы, состоящей из n ступенек. Также он знает номера грязных ступенек этой лестницы. Помогите Пете определить, может ли он пропрыгать всю лестницу и попасть на ступеньку с номером n, ни разу не побывав на грязной ступеньке. Следует отметить, что Петя всегда бывает на первой и последней ступеньках, следовательно, если одна из них грязная, то Петя не сможет выбрать маршрут, проходящий только по чистым ступенькам. Выходные данные Выведите «YES», если Петя может добраться до ступеньки с номером n, наступая только на чистые ступеньки. В противном случае выведите «NO».
| |
|
|
C. Сережа и расстановка чисел
графы
жадные алгоритмы
сортировки
*2000
Назовем массив, состоящий из n целых чисел a1, a2, ..., an, красивым, если он обладает следующим свойством: - рассмотрим все пары чисел x, y (x ≠ y) такие, что число x встречается в массиве a, и число y встречается в массиве a;
- для каждой пары x, y должна существовать некоторая позиция j (1 ≤ j < n) такая, что выполняется одно из двух: либо aj = x, aj + 1 = y, либо aj = y, aj + 1 = x.
Сережа хочет построить красивый массив a, состоящий из n целых чисел. Но не все так просто, у друга Сережи Димы есть m талонов, на каждом из которых написано два целых числа qi, wi. Талон i стоит wi рублей и позволяет использовать при построении массива a сколько угодно чисел qi. У Сережи никаких талонов нет, поэтому Дима с Сережей договорились следующим образом. Дима строит некоторый красивый массив a из n элементов. После чего он берет с Сережи wi рублей за каждое qi, которое встречается в массиве a. Сережа поверил другу и согласился на договор, теперь ему стало интересно, а какую максимальную сумму денег он может заплатить. Помогите Сереже, найдите максимальную сумму денег, которую Сережа может заплатить Диме. Выходные данные В единственную строку выведите максимальную сумму денег (в рублях), которую может потратить Сережа. Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d Примечание В первом примере Сережа заплатит максимум 5 рублей, например, если Дима построит массив: [1, 2, 1, 2, 2]. Возможны и другие оптимальные массивы. В третьем примере Сережа заплатит максимум 100 рублей, если Дима построит массив: [2].
| |
|
|
A. Башни
сортировки
*1000
Маленький Вася недавно получил в подарок от старшего брата набор юного строителя. Этот набор состоит из нескольких деревянных брусков, для каждого из которых известна его длина. Бруски можно класть сверху один на другой, если длины брусков совпадают. Вася хочет соорудить из всех брусков минимальное количество башенок. Помогите Васе расположить бруски оптимальным образом. Выходные данные В одной строке выведите два числа — высоту наибольшей из башен и их общее количество. Помните, что Вася должен использовать все бруски.
| |
|
|
C. Варежки
жадные алгоритмы
Конструктив
сортировки
*1800
На новогоднюю елку в городе S. пришли n детей. Все дети пришли в варежках. Варежки бывают разных цветов, но у каждого ребенка и левая, и правая варежки были одинакового цвета. Пусть цвета варежек нумеруются целыми числами от 1 до m, а дети пронумерованы от 1 до n. Тогда у i-го ребенка обе варежки имели цвет ci. На празднике был Дед Мороз, была Снегурочка, дети водили хоровод вокруг нарядно украшенной елки. В общем и целом все было настолько ярко и разноцветно, что детям вдруг перестало нравиться ходить в варежках одного цвета. Дети решили поменяться варежками таким образом, чтобы у каждого в итоге оказалась одна левая варежка, одна правая варежка, причем разного цвета. Все варежки имеют одинаковый размер, поэтому одинаково подходят всем детям. Дети принялись беспорядочно обмениваться варежками, но у них никак не получалось добиться того, чтобы у всех были разноцветные пары варежек. Василий Петрович, папа одного из ребятишек, заметил, что, в общем случае желание детей может оказаться невыполнимым. Более того, как преподаватель математики, он предложил схему распределения варежек, при которой у наибольшего количества детей будет пара разноцветных варежек. Вам предстоит повторить его достижение. Помните, что левые и правые варежки отличаются: у каждого ребенка должна оказаться одна левая и одна правая варежка. Выходные данные В первой строке выведите наибольшее количество детей, у которых может оказаться разноцветная пара варежек. В следующих n строках выведите то, как именно могут быть распределены варежки в этом случае. В i-й из этих строк выведите через пробел два числа: цвет левой варежки, которая окажется у i-го ребенка, и цвет правой варежки, которая у него окажется. Если оптимальных решений несколько, разрешается вывести любое из них.
| |
|
|
A. Весело считать Кенгуру
Бинарный поиск
жадные алгоритмы
сортировки
*1600
Даны n кенгуру с сумками. У каждого кенгуру есть размер (целое число). Кенгуру может поместиться в сумке другого кенгуру тогда и только тогда, когда размер кенгуру-носителя как минимум в два раза больше размера кенгуру-пассажира. Каждый кенгуру может нести не более одного кенгуру, а кенгуру-пассажир не может носить никаких кенгуру. Кенгуру-пассажира не видно, когда он в сумке кенгуру-носителя. Пожалуйста, разработайте такой план рассадки кенгуру, чтобы было видно как можно меньше кенгуру. Выходные данные Выведите единственное целое число — оптимальное количество видимых кенгуру.
| |
|
|
B. Наибольшая подматрица 2
дп
реализация
сортировки
Структуры данных
*1600
Задана матрица, состоящая из нулей и единиц, размером n × m. Разрешается переставить ее строки местами. Какую наибольшую (по площади) подматрицу, состоящую только из единиц, можно получить в заданной матрице описанными операциями? Пусть строки матрицы a пронумерованы от 1 до n сверху вниз, а столбцы — от 1 до m слева направо. Ячейку матрицы на пересечении i-ой строки и j-го столбца будем обозначать (i, j). Формально, подматрицей матрицы a будем называть четверку d, u, l, r (1 ≤ d ≤ u ≤ n; 1 ≤ l ≤ r ≤ m). Будем считать, что подматрица содержит в себе ячейки (i, j) (d ≤ i ≤ u; l ≤ j ≤ r). Площадью подматрицы будем называть количество ячеек, которые она в себе содержит. Выходные данные Выведите единственное целое число — площадь максимальной полученной подматрицы. Если подматрицу из единиц невозможно получить, выведите 0.
| |
|
|
B. Подготовка к соревнованию
Бинарный поиск
жадные алгоритмы
сортировки
Структуры данных
*1900
Уже совсем скоро состоится крупнейшее в мире соревнование по программированию, а в тестирующей системе до сих пор имеется m багов. У организатора соревнования — одного известного университета — нет иного выбора, как привлечь студентов университета к исправлению всех багов. В университете учатся n студентов, способных выполнять такую работу. Студенты понимают, что являются единственной надеждой организаторов, поэтому не готовы работать бесплатно: i-ый студент за свою помощь хочет получить ci зачетов (независимо от объема проделанной им работы). Как баги, так и студенты, не одинаковые: каждый баг характеризуется сложностью aj, а каждый студент — уровнем своих способностей bi. Студент i способен пофиксить баг j лишь в том случае, если уровень его способностей не меньше сложности бага: bi ≥ aj, причем он делает это за один день. В противном случае для исправления этого бага придется использовать какого-либо другого студента. Разумеется, никакой студент не может работать над несколькими багами в течение одного дня. Все баги не зависят друг от друга, поэтому их можно исправлять в любом порядке, а разные студенты могут работать параллельно. Университет хочет исправить все баги как можно быстрее, при этом выставив студентам суммарно не более s зачетов. Определите, каких студентов нужно для этого привлечь, а также расписание работ: какой студент должен исправлять какой баг. Выходные данные Если все баги исправить не удастся, выведите «NO». Иначе в первой строке выведите «YES», а затем выведите m целых чисел через пробел: i-ое из этих чисел должно равняться номеру студента, который исправит i-ый баг в оптимальном ответе. Баги должны быть исправлены как можно быстрее (должно быть потрачено наименьшее количество дней), а суммарное количество выставленных зачетов не должно при этом превышать s. Если существует несколько оптимальных ответов, разрешается вывести любой. Примечание Рассмотрим первый пример. Третий студент (с уровнем способностей 3) должен исправлять второй и четвертый баги (сложностей 3 и 2 соответственно), а второй студент (с уровнем способностей 1) — первый и третий баги (их сложность также равна 1). Исправление каждого бага займет у каждого студента один день, поэтому на исправление всех багов потребуется два дня (студенты могут работать параллельно). Второй студент требует за свою помощь 3 зачета, а третий — 6. Это укладывается в возможности университета, который готов поставить не более 9 зачетов.
| |
|
|
B. Полуфиналы
реализация
сортировки
*1300
В турнире по бегу только что прошли два полуфинала. В каждом полуфинале участвовало n человек. В финал проходят n человек, определяемых следующим образом: из каждого полуфинала выбираются k человек (0 ≤ 2k ≤ n), показавших наилучший результат в своем полуфинале, а все остальные места в финале достаются тем, кто не попал в первые k в своем полуфинале, но попал в число n - 2k лучших среди остальных. Организаторы турнира пока не определили число k, поэтому участники хотят знать, у кого еще остались шансы попасть в финал, а кому уже можно отправляться домой. Выходные данные Выведите две строки, состоящие n символов, каждый из которых — «0» или «1». Первая строка должна соответствовать участникам первого полуфинала, а вторая — участникам второго полуфинала. i-ый символ в j-ой строке должен быть равен «1», если i-ый участник j-ого полуфинала имеет шансы пройти в финал, и «0» — иначе. Примечание Рассмотрим первый пример. В каждом полуфинале участвовало 4 человека. Результаты первого полуфинала — 9840, 9860, 9930, 10040. Результаты второго полуфинала — 9920, 9980, 10020, 10090. - В случае k = 0 финалисты определяются исключительно по времени, поэтому дальше пройдут спортсмены с результатами 9840, 9860, 9920 и 9930.
- В случае k = 1 из обоих полуфиналов гарантированно проходят победители (с результатами 9840 и 9920), а оставшиеся места определяются по времени (эти места достанутся спортсменам, пробежавшим за 9860 и 9930 миллисекунд).
- В случае k = 2 из обоих полуфиналов проходят по два первых места, это спортсмены с результатами 9840, 9860, 9920 и 9980 миллисекунд.
| |
|
|
C. Новогоднее изменение рейтинга
жадные алгоритмы
сортировки
*1400
На одном очень известном интернет ресурсе (будем называть его X) задумали новогоднюю авантюру. А именно, решили подарить всем посетителям рейтинга. Ресурс X посещают n пользователей, и для каждого пользователя известно, сколько рейтинга он хочет получить в подарок на новый год. Известно, что пользователь i хочет получить не менее ai рейтинга в подарок. Администраторы ресурса X — люди очень креативные и экономные. Поэтому с одной стороны, они хотят, чтобы все полученные рейтинги были различны, а с другой — чтобы суммарное количество подаренного рейтинга было как можно меньше. Помогите ресурсу X справиться со сложной задачей распределения рейтинга. Найдите оптимальное распределение. Выходные данные Выведите последовательность целых чисел b1, b2, ..., bn. Число bi обозначает, что пользователь i получит bi рейтинга в подарок. Выведенная последовательность должна удовлетворять условиям задачи. Если существует несколько оптимальных решений, разрешается вывести любое.
| |
|
|
E. Новогодние елочные украшения
геометрия
расписания
сортировки
*2500
В России традиционно на новый год люди покупают и ставят себе в дом елку. Наряжают елку перед праздником обыкновенно всей семьей. Codeforces — (мы надеемся) это одна большая и дружная семья, поэтому в данной задаче мы будем наряжать елочку. Итак, наше елочное украшение состоит из n кусочков, каждый из которых является листом цветной бумаги, контур которого — замкнутая ломаная особой формы. Кусочки располагаются один за другим (как показано на рисунке). Кусочек номер i представляет собой ломаную, которая проходит через точки: (0, 0), (0, y0), (1, y1), (2, y2), ..., (k, yk), (k, 0). Ширина каждого кусочка равна k. Слева изображено как выглядит украшение, справа — кусочки бумаги, из которых оно состоит. Кусочек с номером 1 (красный на рисунке) является самым внешним (его мы видим полностью), кусочек с номером 2 (желтый на рисунке) следует за ним (его мы видим уже не полностью, поскольку часть его закрыта первым кусочком) и так далее. Программисты — ребята любознательные, поэтому как только мы повесили украшение на елку, нам сразу же стало интересно: какая площадь от каждого кусочка видна зрителю? Выходные данные Выведите n вещественных чисел — для каждой ломаной площадь ее видимой части. Ответ будет считаться правильным, если его относительная или абсолютная погрешность не будет превышать 10 - 4.
| |
|
|
E. Ну-ка, покатились!
дп
сортировки
*1800
На числовой прямой, направленной слева направо, находятся n шариков с координатами x1, x2, ..., xn. Размеры шариков будем считать бесконечно малыми, то есть в этой задаче каждый из них будем считать материальной точкой. Вы можете в некоторые из них воткнуть булавки, стоимость втыкания в i-ый шарик равна ci, число ci может быть отрицательным. После того, как вы выберите и воткнете нужные вам булавки, шарики начнут катиться влево по правилу: если в шарик воткнута булавка, то он не двигается, иначе шарик катится до ближайшего другого шарика, в который булавка воткнута, где заканчивает свое движение. Если слева от данного неприколотого шарика не существует приколотого, то считается, что шарик укатывается бесконечно влево, и вы заплатите за это бесконечно большой штраф. В случае, если никакой шарик не укатился бесконечно влево, то штраф будет состоять из двух слагаемых: - сумма стоимостей воткнутых булавок;
- сумма длин путей каждого из шариков, то есть сумма абсолютных величин разностей их начальных и конечных позиций.
Ваша задача — выбрать и приколоть некоторые шарики так, чтобы штраф, который вы заплатите, был как можно меньше. Выходные данные Выведите единственное число — наименьший штраф, который вам придется заплатить.
| |
|
|
B. Сережа и лесенка
жадные алгоритмы
реализация
сортировки
*1100
Сережа очень любит последовательности целых чисел. В особенности он любит последовательности лесенки. Последовательность a1, a2, ..., a|a| (|a| — длина последовательности) называется лесенкой, если существует такой индекс i (1 ≤ i ≤ |a|), что выполяется соотношение: a1 < a2 < ... < ai - 1 < ai > ai + 1 > ... > a|a| - 1 > a|a|.Например, последовательности [1, 2, 3, 2] и [4, 2] являются лесенками, а последовательность [3, 1, 2] — нет. У Сережи есть m карточек с числами. Он хочет выложить некоторые карточки на стол в ряд, чтобы получилась последовательность лесенка. Какое максимальное количество карточек, ему удастся выложить на стол? Выходные данные В первой строке выведите количество карточек, которое удастся выложить на стол. Во второй строке выведите саму лесенку, которая получится.
| |
|
|
C. Арифметическая прогрессия
реализация
сортировки
*1700
Все знают, что такое арифметическая прогрессия. На всякий случай напомним, что арифметической прогрессией называется такая последовательность чисел a1, a2, ..., an длины n, что выполняется условие: a2 - a1 = a3 - a2 = a4 - a3 = ... = ai + 1 - ai = ... = an - an - 1.Например, последовательности [1, 5], [10], [5, 4, 3] являются арифметическими прогрессиями, а последовательности [1, 3, 2], [1, 2, 4] — нет. У Александра есть n карточек, на которых написаны целые числа. Артур хочет подарить Александру еще ровно одну карточку с числом, так, чтобы из полученных n + 1 карточек Александр мог выложить арифметическую прогрессию (Александр обязан использовать все свои карточки). Артур уже купил карточку, но еще не написал число на ней. Помогите ему, выведите все целые числа, которые можно написать на карточке, чтобы описанное условие выполнялось. Выходные данные Если Артур может записать на карточку бесконечно много различных целых чисел, выведите в единственной строке -1. Иначе выведите в первой строке количество целых чисел, которые подходят. Во второй строке выведите сами числа в порядке возрастания. Обратите внимание, что числа в ответе могут быть больше 108 или даже быть отрицательными (смотрите тестовые примеры).
| |
|
|
B. Вулканы
Бинарный поиск
реализация
сортировки
*2500
Яхуб потерялся в огромной пустыне. Пустыня представляет собой квадратную матрицу размера n × n, каждая ячейка матрицы — это часть пустыни. Будем считать, что ячейка (i, j) — это ячейка на пересечении строки i и столбца j матрицы (1 ≤ i, j ≤ n). Из ячейки пустыни (i, j) Яхуб может пойти либо вниз, либо направо, то есть, в ячейку (i + 1, j), либо (i, j + 1). Известно, что в m ячейках пустыни находятся вулканы. Конечно, Яхуб не может заходить на такие ячейки. Изначально Яхуб стоит в ячейке (1, 1). Ему надо дойти до ячейки (n, n). Зная, что для единичного перехода из одной ячейки в другую Яхубу требуется ровно 1 секунда, найдите минимальное время, за которое он может прибыть в ячейку (n, n). Выходные данные Выведите единственное целое число, минимальное время, за которое Яхуб сможет прибыть в ячейку (n, n). Если решения не существует (Яхуб не может прийти в конечную ячейку), выведите -1. Примечание Рассмотрим первый тестовый пример. Один из возможных путей: (1, 1) → (1, 2) → (2, 2) → (2, 3) → (3, 3) → (3, 4) → (4, 4).
| |
|
|
B. Мультизадачность
жадные алгоритмы
реализация
сортировки
*1500
Яхуб хочет потренироваться делать несколько дел одновременно. Для этого он хочет одновременно отсортировать n массивов по m целых чисел. Яхуб может выбрать пару различных индексов, i и j (1 ≤ i, j ≤ m, i ≠ j). Затем в каждом из n массивов значения в позициях с номерами i и j меняются местами, только если значение в позиции i строго больше значения в позиции j. Яхуб хочет найти такой массив пар различных индексов, что если выполнить описанную операцию с каждой парой из массива, просматривая пары в порядке их следования в массиве, то все n массивов в итоге будут отсортированы по невозрастанию, или по неубыванию (требуемый порядок дан во входных данных). Размер массива пар не может быть больше (не больше пар). Помогите Яхубу, найдите любой подходящий массив пар. Выходные данные В первой строке выведите целое число p — размер массива (p не больше ). В каждой из следующих p строк запишите два различных целых числа, i и j (1 ≤ i, j ≤ m, i ≠ j), обозначающих выбранные индексы. Если правильных ответов несколько, можно вывести любой из них. Примечание Рассмотрим первый тестовый пример. После первой операции массивы принимают вид [1, 3, 2, 5, 4] и [1, 2, 3, 4, 5]. После второй операции массивы принимают вид [1, 2, 3, 5, 4] и [1, 2, 3, 4, 5]. После третьей операции они принимают вид [1, 2, 3, 4, 5] и [1, 2, 3, 4, 5].
| |
|
|
A. Лиса и коробки
жадные алгоритмы
сортировки
*1400
У лисы Сиель в комнате есть n коробок. Все коробки имеют одинаковый размер и вес, но могут иметь различную прочность. Формально, i-ая коробка может выдержать не больше xi коробок на себе (будем называть xi прочностью коробки). Так как у всех коробок одинаковый размер, Сиель не может поставить больше одной коробки непосредственно на некоторую коробку. Предположим, что у Сиель есть три коробки: у первой прочность 2, у второй прочность — 1, и у третьей — прочность 1. Нельзя одновременно поставить вторую и третью коробку прямо на первую. Но можно поставить вторую коробку прямо на первую, а затем третью коробку прямо на вторую. Назовем такое сооружение из коробок стопкой.  Лиса Сиель хочет соорудить стопки изо всех коробок. В каждой стопке может быть несколько коробок, но нельзя ставить больше xi коробок на i-ую коробку. Какое минимальное количество стопок может построить Сиель, используя все коробки? Выходные данные Выведите целое число — минимальное возможное количество стопок. Примечание В первом примере оптимальный способ — соорудить 2 стопки: в первой стопке будут коробки номер 1 и 3 (сверху вниз), во второй стопке будет только коробка номер 2.  Во втором примере можно построить одну стопку, содержащую коробки номер 1, 2, 3, 4, 5 (сверху вниз). 
| |
|
|
C. Лиса и игра в карты
жадные алгоритмы
игры
сортировки
*2000
Лиса Сиель играет в карты со своим другом, лисом Джиро. На столе лежат n стопок карт и на каждой карте записано по положительному целому числу. Игроки ходят по очереди, Сиель начинает. В свой ход она берет одну карту сверху любой непустой стопки. Джиро на своем ходу берет одну карту снизу любой непустой стопки. Каждый игрок хочет максимизировать общую сумму чисел на взятых им картах. Игра заканчивается, когда все стопки пустые. С каким счетом закончится игра при условии, что Сиель и Джиро играют оптимально? Выходные данные Выведите два целых числа: сумму карт Сиель и сумму карт Джиро, если они играют оптимально. Примечание В первом примере Сиель возьмет карты с числами 100 и 1, Джиро возьмет карту с числом 10. Во втором примере Сиель возьмет карты с числами 2, 8, 6, 5, 9, а Джиро возьмет карты с числами 4, 7, 1, 3.
| |
|
|
C. Кратеры на Луне
дп
сортировки
*2100
Существуют различные теории происхождения кратеров на Луне. Большинство ученых придерживается метеоритной теории, согласно которой кратеры возникли при столкновении небесных тел с Луной. Другая версия — это вулканическое происхождение кратеров. Специалист по исследованию внеземного разума профессор Окулов (однофамилец того самого Окулова — автора известных учебников по программированию) выдвинул альтернативную гипотезу. Как вы думаете, какую? Правильно, связанную с вмешательством внеземного разума. Теперь профессор увлечен поиском подтверждений своей гипотезы. В распоряжении профессора имеются данные с лунохода, который движется прямолинейно в одном направлении по поверхности Луны. Кратеры имеют форму кругов с целочисленными радиусами. Луноход фиксирует только те кратеры, центры которых лежат на траектории его движения и отправляет на Землю информацию о расстоянии центров кратеров до начальной точки своего движения и их радиусах. Согласно теории профессора Окулова, два кратера, созданные внеземным разумом для пока неразгаданных целей, либо полностью вкладываются один в другой, либо не пересекаются вообще. Касание кратеров как внутренним, так и внешним образом допустимо. Однако экспериментальные данные с лунохода не подтверждают эту теорию! Тем не менее профессор Окулов не унывает: он прекрасно понимает, что для создания любой стройной теории необходимо пренебречь некоторыми данными, неверными из-за ошибок измерений (или из-за умелой маскировки внеземного разума, который рано или поздно будет обнаружен профессором Окуловым!). Поэтому Окулов хочет выбрать среди имеющихся описаний кратеров наибольший набор, удовлетворяющий его теории. Выходные данные В первой строке выведите количество кратеров в искомом наибольшем наборе. В следующей строке через пробел выведите номера входящих в него кратеров. Кратеры нумеруются числами от 1 до n в порядке задания во входных данных. Номера разрешается выводить в произвольном порядке. Если решений несколько, выведите любое.
| |
|
|
D. Загадочная посылка
дп
сортировки
*1700
Петя решил поздравить своего друга из Австралии с предстоящим днем рождения, отправив ему открытку. Чтобы сделать свой сюрприз более загадочным, он решил создать цепь. Цепью назовем такую последовательность конвертов A = {a1, a2, ..., an}, что ширина и высота i-го конверта строго больше ширины и высоты (i - 1)-го соответственно, а размером цепи — количество конвертов в ней. Из имеющихся у Пети конвертов он хочет создать наибольшую по размеру цепь, в которую можно было бы вложить открытку. Открытку можно вложить в цепь, если ширина и высота открытки меньше ширины и высоты меньшего конверта в цепи соответственно. Поворачивать конверты или открытку запрещено. Поскольку у Пети очень много конвертов и очень мало времени, то эта нелегкая задача возлагается на Вас. Выходные данные В первую строку выведите размер максимальной цепи. Во вторую строку выведите через пробелы номера конвертов, образующих такую цепь, начиная с номера наименьшего конверта. Помните, что в наименьший конверт должна поместиться открытка. Если существует несколько цепей максимального размера, выведите любую. Если открытка не помещается ни в один конверт, то выведите единственную строку, содержащую число 0.
| |
|
|
C. Восстановите граф
графы
поиск в глубину и подобное
сортировки
*1800
У Валеры был неориентированный связный граф без петель и кратных ребер, состоящий из n вершин. Граф обладал интересным свойством: из каждой его вершины исходило не более k ребер. Для удобства будем считать, что вершины графа пронумерованы целыми числами от 1 до n. Как-то раз Валера посчитал кратчайшие расстояния от одной из вершин графа до всех остальных и выписал их в массив d. Таким образом, элемент d[i] массива обозначает кратчайшее расстояние от выбранной Валерой вершины до вершины с номером i. Вскоре произошло неисправимое. Валера потерял исходный граф. Однако, у него остался массив d. Помогите ему восстановить утерянный граф. Выходные данные Если Валера ошибся в записях и требуемого графа не существует, выведите в первой строке число -1. Иначе, в первой строке выведите целое число m (0 ≤ m ≤ 106) — количество ребер в найденном графе. В каждой из следующих m строк выведите через пробел два целых числа ai и bi (1 ≤ ai, bi ≤ n; ai ≠ bi), обозначающих ребро, соединяющее вершины с номерами ai и bi. Граф не должен содержать петель и кратных ребер. Если возможных ответов несколько, выведите любой.
| |
|
|
A. Переключение гравитации
жадные алгоритмы
реализация
сортировки
*900
Маленький Крис скучает на занятиях по физике (слишком просто), поэтому он смастерил необычную коробку для игрушек, чтобы занять себя. Необычность коробки заключается в том, что она может изменять гравитацию! В коробке находятся n столбиков игрушечных кубиков, расположенных в ряд: i-й столбик состоит из ai кубиков. Изначально гравитация в коробке тянет все кубики вниз. Когда Крис переключает гравитацию, она начинает тянуть все кубики к правой стенке коробки. Рисунок показывает начальное и конечное расположение кубиков в коробке: кубики, изменившие свои позиции, выделены оранжевым цветом. Вам дано изначальное расположение игрушечных кубиков в коробке. Найдите количество кубиков в каждом из n столбиков после переключения гравитации! Выходные данные Выведите n целых чисел через пробел: i-е число должно обозначать количество кубиков в i-м столбике после переключения гравитации. Примечание Первый тестовый пример изображен на рисунке. Верхний кубик первого столбика падает на верх последнего столбика; верхний кубик второго столбика падает на верх третьего столбика; средний кубик первого столбика падает на верх второго столбика. Во втором тестовом примере переключение гравитации не меняет высоты столбиков.
| |
|
|
B. Настройка сети
жадные алгоритмы
сортировки
*900
Компания R1 хочет провести чемпионат по веб-поиску. Для проведения соревнования было выделено n компьютеров, каждый из которых подключен к интернету. Организаторы считают, что скорость передачи данных в сети интернет напрямую влияет на результат. Чем выше скорость интернета, тем быстрее участник найдет нужную информацию. Поэтому перед соревнованием на каждом компьютере была замерена максимально возможная скорость передачи данных. На i-м компьютере она составила ai килобит в секунду. В чемпионате будут соревноваться k участников, каждый за отдельным компьютером. Чтобы ни один участник не получил преимущества, организаторы хотят обеспечить одинаковую скорость передачи данных на каждом из компьютеров участников. Кроме того, организаторы хотят создать наиболее комфортные условия для участников, поэтому скорость передачи данных на компьютерах участников должна быть как можно больше. В настройках сети компании R1 имеется специальная опция, позволяющая «обрезать» исходную максимальную скорость передачи данных любого компьютера до любой меньшей скорости. Каким образом компания R1 должна настроить сеть с помощью описанной опции, чтобы хотя бы k из n компьютеров имели одинаковую скорость передачи данных, и при этом скорость передачи данных этих компьютеров была максимально возможной? Выходные данные Выведите единственное целое число — максимальную скорость интернета, которую удастся получить. Гарантируется, что ответ на задачу всегда является целым числом. Примечание В первом тестовом примере организаторы могут «обрезать» скорость первого компьютера до 30 килобит. Тогда два компьютера (первый и третий) будут иметь одинаковую скорость: 30 килобит. Их и нужно использовать в качестве компьютеров участников. Полученный ответ является оптимальным.
| |
|
|
D. Хитрый Гена
битмаски
дп
жадные алгоритмы
сортировки
*1900
Мальчик Гена очень хочет попасть на финал «Russian Code Cup», ну или хотя бы получить футболку. Но предлагаемые на отборочном раунде задачи слишком сложные, поэтому он договорился с n друзьями, что они решат задачи за него. Участникам на отборочном раунде предлагают m задач. Про каждого своего друга Гена знает, какие задачи он умеет решать. Но друзья не согласны помогать Гене просто так: i-й друг требует за свою помощь в решении всех задач, которые он может решить, xi рублей, более того, он согласен писать код по задачам, только если к компьютеру Гены подключено не менее ki мониторов, а каждый монитор стоит b рублей. Гена экономный, поэтому он хочет потратить как можно меньше денег на решение всех задач отборочного раунда. Подскажите Гене, как ему поступить, чтобы потратить как можно меньше денег. Считайте, что изначально у компьютера Гены нет ни одного монитора. Выходные данные Выведите минимальное количество денег, которое нужно потратить Гене, чтобы решить все задачи. Или выведите -1, если этого нельзя добиться.
| |
|
|
B. Город-миллионер
Бинарный поиск
жадные алгоритмы
реализация
сортировки
*1200
Администрация Томской области твердо уверена, что пора и Томску стать городом-миллионером. Вместо улучшения демографической ситуации, они решили достигнуть своей цели путем расширения границы города. Город Томск можно представить в виде точки на плоскости с координатами (0; 0). Вокруг города расположены n других населенных пунктов, i-й из которых имеет координаты (xi, yi) и население в ki человек. Можно расширить городские границы до круга радиуса r. В таком случае все населенные пункты, находящиеся внутри этого круга и на его границе, войдут в состав города. Ваша цель — написать программу, которая определит минимальный радиус r, до которого необходимо расширить границы Томска, чтобы он стал городом-миллионером. Выходные данные В выходные данные выведите «-1» (без кавычек), если Томску не удастся стать городом с миллионным населением. Иначе в первой строке выведите единственное вещественное число — минимальный радиус круга, до которого городу необходимо расшириться, чтобы стать городом-миллионером. Ответ считается правильным, если его абсолютная или относительная погрешность не превышает 10 - 6.
| |
|
|
A. Сережа и обмены
Перебор
сортировки
*1500
Как обычно, у Сережи есть массив a, элементами которого являются целые числа: a[1], a[2], ..., a[n]. Введем обозначения:  Операцией обмена назовем следующую последовательность действий: - выбрать два индекса i, j (i ≠ j);
- выполнить присвоения tmp = a[i], a[i] = a[j], a[j] = tmp.
Какое максимальное значение функции m(a) может получить Сережа, если ему разрешается выполнить не более k операций обмена? Выходные данные В единственную строку выведите максимальное значение m(a), которое может получить Сережа, выполнив не более k обменов.
| |
|
|
A. Точки и отрезки (легкая версия)
Конструктив
сортировки
*1600
Яхуб не очень хорошо умеет решать геометрические задачи, но он слышал, что в этом году на международной олимпиаде по программированию будет много геометрических задач. Яхуб напугался и заперся в подвале, чтобы уединиться с мыслями о новых геометрических задачах. Вот одна из них. Яхуб хочет нарисовать n различных точек и m отрезков на оси OX. Каждая точка может быть красной или синей. Рисунок называется хорошим тогда и только тогда, когда выполняется следующее требование: для каждого отрезка [li, ri] рассмотрим все принадлежащие ему красные точки (ri точек), и все принадлежащие ему синие точки (bi точек); каждый отрезок i должен удовлетворять неравенству |ri - bi| ≤ 1. Яхуб считает, что точка x принадлежит отрезку [l, r], если выполняется неравенство l ≤ x ≤ r. Яхуб дал вам все координаты точек и отрезков. Пожалуйста, помогите ему найти какой-нибудь хороший рисунок. Выходные данные Если хорошего рисунка для данного теста не существует, выведите единственное целое число -1. В противном случае, выведите n целых чисел, каждое число равно 0 или 1. При этом, i-е число обозначает цвет i-й точки (0 — синяя, 1 — красная). Если существует несколько хороших рисунков, выведите любой из них.
| |
|
|
A. Выбор команд
жадные алгоритмы
реализация
сортировки
*800
В центре олимпиадной подготовки программистов СГУ (ЦОПП СГУ) занимаются n ребят. Про каждого из них известно, сколько раз он/она уже участвовал/участвовала в чемпионате мира по программированию (ACM ICPC). По правилам ACM ICPC каждый человек может участвовать в чемпионате мира не более 5 раз. Руководитель ЦОПП СГУ в данный момент формирует команды для участия в чемпионате мира. Каждая команда должна состоять ровно из 3 человек, причем один человек не может быть членом двух или более команд. Какое максимальное количество команд может составить руководитель, если он хочет чтобы каждая команда могла участвовать в чемпионате мира в этом же составе как минимум k раз? Выходные данные Выведите единственное целое число — ответ на задачу. Примечание В первом тестовом примере можно составить только одну команду: первый, четвертый и пятый человек. Во втором тестовом примере нельзя составить ни одну команду. В последнем примере можно составить две команды. Причем любое разбиение на две команды подходит.
| |
|
|
C. Простые обмены
жадные алгоритмы
сортировки
*1800
Задан массив a[1], a[2], ..., a[n], элементами которого являются различные целые числа от 1 до n. Требуется отсортировать по возрастанию этот массив используя следующую операцию (возможно, несколько раз): - выбрать два индекса i и j (1 ≤ i < j ≤ n; (j - i + 1) является простым числом);
- выполнить обмен элементов на позициях i и j местами; другими словами, разрешается выполнить следующую последовательность присвоений tmp = a[i], a[i] = a[j], a[j] = tmp (tmp — временная переменная).
Вам не требуется минимизировать количество используемых операций, тем не менее требуется, чтобы их было не более 5n. Выходные данные В первой строке выведите целое число k (0 ≤ k ≤ 5n) — количество использованных операций. Далее выведите сами операции. Каждая операция должна быть выведена в формате «i j» (1 ≤ i < j ≤ n; (j - i + 1) является простым числом). Если существует несколько правильных ответов, разрешается вывести любой.
| |
|
|
B. Камни Курияма Мираи
дп
реализация
сортировки
*1200
Курияма Мираи убила много чудовищ и получила в награду много (а именно n) камней. Все камни Курияма Мираи пронумерованы от 1 до n. Цена i-го камня равняется vi. Курияма Мираи хочет узнать некоторую информацию о своих камнях, с этой целью она задает вам вопросы. Каждый вопрос имеет один из следующих видов: - Она называет вам два числа, l и r (1 ≤ l ≤ r ≤ n), а вы должны сказать ей, чему равна сумма
. - Пусть ui равняется цене i-го по дешевизне камня (цена, которая будет на i-ом месте, если расположить все цены камней в порядке неубывания). На этот раз она называет вам два числа, l и r (1 ≤ l ≤ r ≤ n), а вы должны сказать ей, чему равна сумма
. Вам нужно ответить правильно на ее вопросы, или Курияма Мираи скажет «fuyukai desu» (яп. неприятно) и расстроится. Выходные данные Выведите m строк. В каждой строке должно быть записано целое число — ответ на вопрос Курияма Мираи. Выводите ответы на вопросы в порядке их следования во входных данных. Примечание Пожалуйста, обратите внимание, что для хранения ответов на вопросы может быть не достаточно 32-битных целых чисел.
| |
|
|
C. Блокнот памяти Рюко
математика
реализация
сортировки
*1800
Рюко фантастически рассеянная девушка, она порой забывает даже то, что вот-вот произошло. Чтобы ничего не упустить, девушка везде берет с собой блокнот под названием Блокнот памяти Рюко. Все, что она видит и слышит, она записывает в этот блокнот. Хотя Рюко все забывает, она родилась с великолепными мыслительными способностями. С другой стороны, качество рассуждений во многом зависит от имеющейся информации, иными словами, от памяти. И вот девушка листает вой блокнот каждый раз, когда над чем-то рассуждает — а это серьезная работа. В блокноте Рюко n страниц, пронумерованных от 1 до n. Чтобы облегчить себе жизнь (и эту задачу), мы считаем, что для перехода со страницы x на страницу y надо перелистнуть |x - y| страниц. Чтобы сделать некоторое рассуждение, Рюко нужно иметь ввиду m фактов, i-й факт написан на странице ai. Факты следует читать из блокнота по порядку, в таком случае Рюко надо пролистать станиц, чтобы прочитать все факты. Рюко хочет уменьшить количество пролистываемых страниц. Для достижения этой цели девушка может скопировать всю информацию со страницы x на страницу y (1 ≤ x, y ≤ n) блокнота. А затем заменить все элементы в последовательности a, равные x, на y. Обратите внимание, что x может равняться y, в таком случае никаких перемен не происходит. Пожалуйста, скажите Рюко, какое минимальное количество страниц ей придется перелистнуть, чтобы прочитать все факты, если она может применить описанную операцию не более одного раза перед чтением. Обратите внимание, что ответ на задачу может превысить 32-битное целое число. Выходные данные Выведите единственное целое число — минимальное количество переворачиваемых страниц. Примечание В первом примере оптимальное решение — записать все со страницы 4 на страницу 3, тогда последовательность a станет равна {1, 2, 3, 3, 3, 2}, таким образом, количество переворачиваемых Рюко страниц равно |1 - 2| + |2 - 3| + |3 - 3| + |3 - 3| + |3 - 2| = 3. Во втором примере оптимальное решение достигается копированием информации со станицы 9 на страницу 4.
| |
|
|
E. Дерево Фурукава Нагисы
Бинарный поиск
Деревья
разделяй и властвуй
сортировки
*3000
Однажды Оказаки Томоя купил дерево на день рождения Фурукава Нагисы. Дерево было немного странное, у каждой вершины дерева было написано значение. Обозначим значение у i-й вершины переменной vi. Теперь Фурукава Нагиса и Оказаки Томоя хотят сыграть в игру с деревом. Пусть (s, e) — путь из вершины s к вершине e дерева, тогда можно записать последовательность значений вершин на пути (s, e) и обозначить эту последовательность как S(s, e). Определим функцию G от последовательности S(s, e) следующим образом. Предположим, что последовательность равна z0, z1...zl - 1, где l — длина последовательности. Определим G(S(s, e)) = z0 × k0 + z1 × k1 + ... + zl - 1 × kl - 1. Если путь (s, e) удовлетворяет , тогда путь (s, e) принадлежит Фурукава Нагисе, в противном случае он принадлежит Оказаки Томоя. Считать, у кого больше путей, слишком легко, поэтому ребята хотят поиграть во что-то посложнее. Фурукава Нагиса выдвинула гипотезу: - если пути (p1, p2) и (p2, p3) принадлежат ей, то и путь (p1, p3) тоже принадлежит ей;
- если пути (p1, p2) и (p2, p3) принадлежат Оказаки Томоя, то и путь (p1, p3) тоже принадлежит Оказаки Томоя.
Конечно, описанное выполняется не для всех троек (p1, p2, p3). Итак, теперь Фурукава Нагиса хочет узнать, сколько троек (p1, p2, p3) удовлетворяют ее условию — и это ваша задача. Выходные данные Выведите единственное целое число — количество троек, удовлетворяющих гипотезе Фурукава Нагисы.
| |
|
|
B. Ребенок и множество
битмаски
жадные алгоритмы
реализация
сортировки
*1500
В день детей ребенок пришел домой к Пиксу и все перевернул вверх дном. Пикс на него разозлился. В бардаке потерялось много всего, включая любимое множество Пикса. К счастью, Пикс помнит кое-что о своем множестве S: - его элементами были различные целые числа от 1 до limit;
- значение
равнялось sum; функция lowbit(x) равна 2k, где k обозначает позицию первой единицы в двоичном представлении числа x. Например, lowbit(100102) = 102, lowbit(100012) = 12, lowbit(100002) = 100002 (числа записаны в двоичном представлении). Помогите Пиксу. Найдите любое множество S, удовлетворяющее всем вышеперечисленным условиям? Выходные данные В первой строке выведите целое число n (1 ≤ n ≤ 105), обозначающее размер S. Затем выведите элементы множества S в любом порядке. Если есть несколько правильных ответов, выведите любой. Если подходящего множества не существует, выведите -1. Примечание В примере 1: lowbit(4) = 4, lowbit(5) = 1, 4 + 1 = 5. В примере 2: lowbit(1) = 1, lowbit(2) = 2, lowbit(3) = 1, 1 + 2 + 1 = 4.
| |
|
|
C. Ребенок и игрушка
графы
жадные алгоритмы
сортировки
*1400
В день детей ребенок получил в подарок от Delayyy игрушку. Но ребенок такой вредный, что он ждет — не дождется шанса сломать ее. Игрушка состоит из n деталей, соединенных m веревочками. Каждая веревочка соединяет две детали, при этом каждая пара деталей соединена не более чем одной веревочкой. Чтобы разломать игрушку, ребенок должен оторвать все ее детали. Ребенок может отрывать по одной детали за раз, на каждое отрывание он тратит энергию. Обозначим значение энергии детали i как vi. Ребенок тратит vf1 + vf2 + ... + vfk энергии на отрывание детали i, где f1, f2, ..., fk — еще не оторванные детали, напрямую соединенные веревочками с i-й. Помогите ребенку посчитать минимальную суммарную энергию, которую он должен потратить на отрывание всех n деталей. Выходные данные Выведите минимальную суммарную энергию, необходимую для отрывания всех n деталей игрушки. Примечание Одна из оптимальных последовательностей действий в первом примере такова: - Сначала оторвите деталь 3, затрата энергии равна 20.
- Затем оторвите деталь 2, затрата энергии равна 10.
- Потом оторвите деталь 4, затрата энергии равна 10.
- Наконец, оторвите деталь 1, затрата энергии равна 0.
Таким образом, всего ребенок затрачивает 20 + 10 + 10 + 0 = 40 единиц энергии, это минимально возможный ответ. Во втором примере ребенок потратит 400 единиц энергии вне зависимости от порядка отрывания деталей.
| |
|
|
D. Ребенок и зоопарк
снм
сортировки
*1900
Конечно, наш ребенок любит гулять по зоопарку. В зоопарке n вольеров, пронумерованных от 1 до n. В i-м вольере содержится ai животных. Также в зоопарке имеется m дорог, каждая дорога соединяет два различных вольера. Естественно, зоопарк связный, так что до любого вольера можно дойти по дорожкам от любого другого вольера. Наш ребенок очень умный. Предположим, что ребенок хочет пройти из вольера p в вольер q. Сначала он рассматривает все простые пути от p до q. Для каждого пути ребенок выписывает число, равное минимальному количеству животных в вольерах на этом пути. Обозначим наибольшее записанное число как f(p, q). Наконец, ребенок выбирает один из путей, для которого выписанное значение равно f(p, q). Ребенок уже посетил зоопарк, и теперь он размышляет: чему равно среднее значение f(p, q) для всех пар p, q (p ≠ q)? Можете ли вы ответить на его вопрос? Выходные данные Выведите вещественное число — значение . Ответ будет считаться правильным, если его относительная или абсолютная погрешность не превышает 10 - 4. Примечание Рассмотрим первый пример. Существует 12 возможных пар вольеров: - p = 1, q = 3, f(p, q) = 10.
- p = 2, q = 3, f(p, q) = 20.
- p = 4, q = 3, f(p, q) = 30.
- p = 1, q = 2, f(p, q) = 10.
- p = 2, q = 4, f(p, q) = 20.
- p = 4, q = 1, f(p, q) = 10.
Еще 6 случаев симметричны приведенному выше. Среднее значение равно . Рассмотрим второй пример. Существует 6 возможных пар вольеров: - p = 1, q = 2, f(p, q) = 10.
- p = 2, q = 3, f(p, q) = 20.
- p = 1, q = 3, f(p, q) = 10.
Еще 3 случая симметричны приведенному выше. Среднее значение равно .
| |
|
|
B. Деву-дурачок
реализация
сортировки
*1200
Деву — дурачок и учится очень медленно. Вам надо научить его n дисциплинам, i-я дисциплина состоит из ci частей, при этом для изучения дисциплины, нужно последовательно изучить все ее части. Изначально «способность усвоения знаний» Деву равна x часов. Иными словами, он может усвоить любую часть некоторой дисциплины за x часов. Впрочем, Деву не полный дурак — есть на что надеяться. Если вы обучите его какой-то дисциплине, то для изучения каждой части следующей дисциплины потребуется ровно на один час меньше, чем раньше (для лучшего понимания смотрите примеры). Обратите внимание, что его способность усвоения не может быть менее 1 часа. Вы можете обучать его дисциплинам в любом порядке. Подсчитайте наименьшее количество времени (в часах), необходимое Деву для усвоения всех n дисциплин — и тогда можно будет порешать более интересные задачи, а не нянчиться с дурачком. Пожалуйста, будьте внимательны — ответ может превысить 32-битный целочисленный тип данных. Выходные данные Выведите единственное целое число — ответ на задачу. Примечание Посмотрите на первый пример. Рассмотрим порядок обучения дисциплинам: 1, 2. Когда вы будете обучать Деву первой дисциплине, у него уйдет 3 часа на одну часть, таким образом, на первую дисциплину уйдет всего 12 часов. После освоения первой дисциплины скорость усвоения Деву станет 2 часа. Теперь на усвоение второй дисциплины уйдет 2 × 1 = 2 часа. Следовательно, всего потребуется 12 + 2 = 14 часов. Рассмотрим порядок дисциплин: 2, 1. Когда вы будете учить Деву второй дисциплине, у него будет уходить по 3 часа на одну часть, следовательно, на вторую дисциплину уйдет 3 × 1 = 3 часа. После усвоения второй дисциплины его скорость усвоения составит 2 часа. Теперь на усвоение первой дисциплины надо 2 × 4 = 8 часов. Следовательно, всего потребуется 11 часов. Итак, минимальное количество часов, требуемое для обучения Деву, равно 11. Посмотрите на третий тестовый пример. В этом тестовом примере порядок обучения дисциплинам не имеет значения. Когда вы будете обучать Деву первой дисциплине, у него уйдет 3 часа на одну часть. Когда вы будете обучать Деву второй дисциплине, у него уйдет 2 часа на одну часть. Когда вы будете обучать Деву третьей дисциплине, у него уйдет 1 час на одну часть. Всего будет нужно 6 часов, чтобы обучить Деву всем дисциплинам.
| |
|
|
D. Деву и братишка
Бинарный поиск
сортировки
Тернарный поиск
*1700
Деву и его братишка очень любят друг друга. Они супер-гики и предпочитают играть только с массивами. Как-то раз папа подарил им два массива, a и b. Массив a достался Деву, а b — его брату. Деву — пакостник тот еще. Хочется ему, чтобы минимум в массиве a был не меньше максимума массива b. Вам надо помочь Деву добиться описанного. Для этого вы можете выполнять операции с массивами a и b. За одну операцию разрешено уменьшить или увеличить любой элемент любого массива на 1. Обратите внимание, что операцию можно применять несколько раз для любого элемента любого массива. Требуется найти наименьшее количество операций, необходимых для достижения описанного условия. Выходные данные Выведите единственное целое число — минимальное количество операций, необходимых для выполнения желания Деву. Примечание В первом тестовом примере можно увеличить a1 на 1 и уменьшить b2 на 1, затем снова уменьшить b2 на 1. Теперь массив a выглядит так [3; 3], массив b выглядит так [3; 3]. Наименьший элемент a не меньше наибольшего элемента b. Выполнить желание Деву за меньшее количество операций никак не получится. В примере 3 не надо выполнять никаких операций, желание Деву уже выполнено.
| |
|
|
D. Даты событий
meet-in-the-middle
жадные алгоритмы
сортировки
*1900
На уроке истории учитель попросил Васю назвать даты, когда произошли n известных событий. Он не помнит точные даты, но для каждого события он помнит отрезок дней [li, ri] (включительно), в которые оно могло произойти. Однако еще Вася помнит, что в один день могло произойти только одно событие. Помогите ему выбрать такие n дат известных событий, чтобы оба условия выполнялись. Гарантируется, что решение существует. Выходные данные Выведите n чисел — даты, в которые произошли события. Если решений несколько, выведите любое. Гарантируется, что решение существует.
| |
|
|
B. Сортируем массив
реализация
сортировки
*1300
Как и все программисты, вы очень любите массивы. На день рождения друзья подарили вам массив a, состоящий из n различных целых чисел. К сожалению, массив a слишком маленький. А вы хотите большой массив! Друзья договорились дать вам массив побольше, но только если вы сможете верно ответить на следующий вопрос: можно ли отсортировать массив a (по возрастанию), выполнив переворот ровно одного подотрезка a? Определения подотрезка и переворота находятся в примечаниях. Выходные данные Выведите ответ на поставленный вопрос: строку «yes» или «no» (без кавычек). Если ваш ответ — «yes», то затем выведите два целых числа, обозначающие индекс начала и индекс конца (индекс начала не может быть больше индекса конца) переворачиваемого подотрезка. Если есть несколько способов выбрать эти индексы, выведите любой из них. Примечание Пример 1. Можно перевернуть весь массив и получить [1, 2, 3]. Пример 3. Никакой подотрезок нельзя перевернуть так, чтобы массив стал отсортированным. Определения Подотрезок [l, r] массива a — это последовательность a[l], a[l + 1], ..., a[r]. Рассмотрим массив a размера n. Допустим вы переворачиваете его подотрезок [l, r]. Полученный массив будет выглядеть следующим образом: a[1], a[2], ..., a[l - 2], a[l - 1], a[r], a[r - 1], ..., a[l + 1], a[l], a[r + 1], a[r + 2], ..., a[n - 1], a[n].
| |
|
|
A. Ноутбуки
сортировки
*1100
Как-то раз Дима и Леша поспорили о цене и качестве ноутбуков. Дима считает, что чем дороже ноутбук, тем он лучше. Леша говорит, что это не так. Леша считает, что существуют два таких ноутбука, что цена первого меньше, чем цена второго, но первый качественнее второго. Ваша задача — проверить гипотезу Леши. Заданы характеристики n ноутбуков. Выясните, существуют ли два таких ноутбука, что цена первого строго меньше, чем цена второго, но первый строго качественнее второго. Выходные данные Если Леша прав, то выведите строку «Happy Alex», иначе выведите «Poor Alex» (кавычки выводить не нужно).
| |
|
|
B. Пашмак и цветы
Комбинаторика
реализация
сортировки
*1300
Пашмак решил подарить Пармиде пару цветов из своего сада. В саду растет n цветов, красота i-го из них равна bi. Пармида — девушка необычная, она необязательно хочет получить два самых красивых цветка. Она хочет получить такие два цветка, разница красот которых максимально возможная! Ваша задача — написать программу, которая посчитает два значения: - Максимальную разность красот двух цветов из сада Пашмака.
- Сколько существует способов выбрать два цветка из сада, чтобы разность их красот была максимально возможной. Два способа считаются различными тогда и только тогда, когда хотя бы один цветок выбран в одном из них и не выбран во втором.
Выходные данные В единственной строке выведите два целых числа — максимальную разность красот и количество способов ее получить. Примечание В третьем примере максимальная разность красот равна 2. Существует 4 способа ее получить: - выбрать первый и второй цветки;
- выбрать первый и пятый цветки;
- выбрать четвертый и второй цветки;
- выбрать четвертый и пятый цветки.
| |
|
|
D. Задача Пашмака и Пармиды
разделяй и властвуй
сортировки
Структуры данных
*1800
Пармида — умная девушка, в этом году она хочет принять участие в олимпиаде. Конечно, она хочет, чтобы ее парень тоже был умным! Девушка приготовила следующую тестовую задачу для Пашмака. Задана последовательность a, состоящая из n целых чисел: a1, a2, ..., an. Обозначим за f(l, r, x) количество таких индексов k, что: l ≤ k ≤ r и x = ak. Требуется посчитать количество таких пар индексов i, j (1 ≤ i < j ≤ n), что f(1, i, ai) > f(j, n, aj). Помогите Пашмаку с этой задачей. Выходные данные Выведите единственное целое число — ответ на задачу.
| |
|
|
E. Пашмак и граф
дп
сортировки
*1900
Сегодняшняя домашняя работа Пашмака — это задача на графы. Несмотря на то, что он всегда старается выполнить домашнюю работу полностью, эту задачу решить он не может. К сожалению, он не силен в теории графов. Пожалуйста, помогите ему. Задан взвешенный ориентированный граф с n вершинами и m ребрами. Найдите длиннейший по количеству ребер путь, веса ребер в котором возрастают вдоль пути. Другими словами, у каждого ребра в пути должен быть строго больший вес, чем у предыдущего ребра пути. Выведите длину описанного пути. Выходные данные Выведите единственное целое число — ответ на задачу. Примечание В первом примере подходит любой из путей: . Во втором примере оптимальный путь: . В третьем примере оптимальный путь: .
| |
|
|
E. Роланд и роза
геометрия
математика
Перебор
сортировки
*2700
Роланд любит выращивать цветы. Недавно он вырастил красивую розу в точке (0, 0) декартовой системы координат. Роза настолько красива, что Роланд опасается, как бы силы зла не попытались украсть ее. Чтобы защитить розу, Роланд хочет построить n защитных башен (будем считать, что башня это точка на плоскости) на расстоянии не более r от розы. Кроме того, Роланд считает, что башни должны быть построены в точках с целочисленными координатами, а сумма квадратов расстояний между всем парами башен должна быть как можно больше. Обратите внимание, что Роланд может построить несколько башен в одной и той же точке плоскости, также разрешается строить башни в точке (0, 0). Помогите Роланду построить башни в целочисленных точках так, чтобы сумма квадратов расстояний между всеми башнями была максимально возможной. Обратите внимание, что под расстоянием в этой задаче понимается евклидово расстояние между точками. Выходные данные В первой строке выведите целое число — максимально возможную сумму квадратов расстояний. В i-й из следующих n строк выведите два целых числа xi, yi — координаты i-й башни. Каждая башня должна находиться внутри или на границе окружности радиуса r. Обратите внимание, что несколько башен могут находиться в одной и той же точке плоскости, также башни могут находиться в точке (0, 0). Если существует несколько подходящих оптимальных расстановок, выведите любую.
| |
|
|
A. Яблов и Тостов
жадные алгоритмы
сортировки
*1200
Яблов и Тостов играют в игру. Изначально Яблов дает Тостову набор из n чисел, затем ребята начинают действовать следующим образом: - Каждый раз, когда Тостов получает набор из чисел, он суммирует все числа набора и добавляет эту сумму к текущему счету. Затем он передает набор Яблову.
- Каждый раз, когда Яблов получает набор чисел, состоящий из единственного числа, он выбрасывает этот набор. Каждый раз, когда Яблов получает набор чисел, состоящий из более, чем одного числа, он разбивает этот набор на два непустых набора (делать это он может любым способом), а затем отдает оба получившихся набора Тостову.
В тот момент, когда наборов в игре не осталось, друзья смотрят на счет. Какой максимальный счет они могут получить? Выходные данные Выведите единственное целое число — максимальный возможный счет. Примечание Рассмотрим следующую последовательность действий для первого тестового примера. Изначально у Тостова набор [3, 1, 5], он добавляет к счету 9 и передает набор Яблову. Яблов разбивает набор [3, 1, 5] на два [3, 5] и [1], каждый из них передает Тостову. Получив набор [1], Тостов добавляет к счету 1 и отдает его Яблову (Яблов в свою очередь выкинет его). Получив набор [3, 5] Тостов добавляет к счету 8 и отдает его Яблову. Яблов делит набор [3, 5] единственно возможным способом: [5] и [3]. Затем он отдает оба набора Тостову. Получив набор [5], Тостов добавляет к сумме 5 и отдает набор Яблову (тот его выкидывает). Получив набор [3], Тостов добавляет к сумме 3 и отдает набор Яблову (тот его выкидывает). Итого, Тостов добавит 9 + 1 + 8 + 5 + 3 = 26. Это оптимальная последовательность действий.
| |
|
|
E. Пушка
геометрия
сортировки
Структуры данных
*2200
Бертаун в осаде! Осаждающие заблокировали все выходы и стреляют по городу из пушки. К счастью, берляндской разведке удалось перехватить план стрельбы врагов. Введем декартовую систему координат, начало которой совпадает с позицией пушки, ось Ox направлена вправо в сторону города, ось Oy направлена вверх (в небо). Пушка сделает n выстрелов. Начальные скорости ядер при всех выстрелах совпадают и равны V, так что каждый выстрел характеризуется только одним числом alphai — углом, под которым пушка выстреливает ядро. В силу технических особенностей пушки этот угол не превосходит 45 градусов (π / 4). Мы пренебрегаем размерами пушки и считаем, что вся стрельба ведется из точки (0, 0). Снаряды летят по известным физическим законам тела, брошенного под углом к горизонту: vx(t) = V·cos(alpha) vy(t) = V·sin(alpha) – g·t x(t) = V·cos(alpha)·t y(t) = V·sin(alpha)·t – g·t2 / 2Ускорение свободного падения g считайте равным 9.8. Бертаун защищает m стен. i-ая стена представляет собой вертикальный отрезок (xi, 0) - (xi, yi). Когда ядро попадает в стену, оно застревает в ней и не летит дальше. Если ядро не встретила на своем пути ни одной стены, оно падает на землю (y = 0) и останавливается. Если ядро попадает точно в точку (xi, yi), считается что оно застревает. Ваша задача — для каждого ядра найти координаты точки, в которой оно окажется в итоге. Выходные данные Выведите n строк по два вещественных числа — для каждого снаряда выведите координаты точки, куда он попадет. Ваш ответ должен иметь относительную или абсолютную погрешность меньше чем 10 - 4.
| |
|
|
B. МУХ и важные дела
реализация
сортировки
*1300
Белым медведям Меньшикову и Усладе из Санкт-Петербургского зоопарка и слонику Хорасу из Киевского зоопарка пришла пора наконец заняться делами. Всего на повестке дня имеется n дел, каждый из троицы должен будет заняться каждым из этих дел. Для каждого дела они оценили его сложность и решили заняться делами в порядке от наиболее простых к наиболее сложным делам. К сожалению, некоторые дела могут иметь одинаковую сложность, поэтому последовательность выполнения дел может быть не однозначной. Меньшиков, Услада и Хорас просят вас разобраться с этой мелочью и предоставить каждому из них личный план, который представлял бы собой последовательность выполнения всех n дел. Еще они хотят, чтобы порядок дел, выполняемых каждым из них, хотя бы в одном пункте отличался от порядка дел, выполняемых двумя остальными (другими словами, все три плана должны быть различными последовательностями). Или огорчите их, сообщив, что составить три различных плана для заданных дел невозможно. Выходные данные В первой строке выведите «YES» (без кавычек), если возможно составить три различных плана выполнения дел, в противном случае в первой строке выведите «NO» (без кавычек). Если три искомых плана существуют, то во второй строке выведите n различных целых чисел, представляющих собой номера дел в порядке их выполнения в соответствии с первым планом. В третьей и четвертой строке выведите два оставшихся плана в таком же формате. Если существует несколько возможных ответов, то разрешается вывести любой из них. Примечание В первом примере сложность дел накладывает одно ограничение — дела 1 и 4 должны быть выполнены до дел 2 и 3. Всего это дает четыре возможных последовательности выполнения дел: [1, 4, 2, 3], [4, 1, 2, 3], [1, 4, 3, 2], [4, 1, 3, 2]. Любые три из них можно вывести в ответ. Во втором примере есть только две последовательности дел, удовлетворяющих условиям, — [3, 1, 2, 4, 5] и [3, 1, 4, 2, 5]. Следовательно составить три различных последовательности дел невозможно.
| |
|
|
E. Столбы
Бинарный поиск
Деревья
дп
сортировки
Структуры данных
*2000
Сурок нашел ряд из n столбов. Высота i-ого столба равняется hi метрам. Начиная с некоторого столба i1, Сурок хочет пропрыгать по столбам i2, ..., ik. (1 ≤ i1 < i2 < ... < ik ≤ n). Сурок может перепрыгнуть со столба i на столб j, только если i < j и |hi - hj| ≥ d, где |x| — абсолютное значение числа x. Сурок просит вас найти последовательность прыжков максимальной длины и вывести её. Выходные данные В первой строке должно быть записано одно целое число k — максимальная длина последовательности прыжков. Во второй строке должно быть записано k целых чисел i1, i2, ..., ik (1 ≤ i1 < i2 < ... < ik ≤ n) — номера столбов из максимально длинной последовательности прыжков. Если есть несколько последовательностей прыжков максимальной длины, выведите любую из них. Примечание В первом примере Сурок выбирает столбы 1, 2, 3, 5 с высотами 1, 3, 6, 4. Ещё одна последовательность прыжков длины 4 такова: 1, 2, 4, 5.
| |
|
|
E. Волнистые числа
meet-in-the-middle
Перебор
поиск в глубину и подобное
сортировки
*2900
Волнистым числом называется такое целое положительное число, что для каждой цифры десятичного представления, не являющейся первой или последней, она либо строго больше обеих соседних с ней цифр, либо строго меньше обеих соседних с ней цифр. Например, числа 35270, 102, 747, 20 и 3 являются волнистыми, а числа 123, 1000 и 2212 — нет. Для двух заданных целых чисел n и k требуется найти k-е по величине волнистое число r, которое делится нацело на n. Ваша задача — написать программу для нахождения искомого числа r в случае, если оно не превосходит 1014. Выходные данные Требуется вывести единственное целое число r — ответ на задачу. Если такого числа не существует или оно больше 1014, то требуется вывести «-1» (минус единицу без кавычек). Примечание Значения первых четырех волнистых чисел кратных n для первого примера входных данных: 492, 615, 738 и 1845.
| |
|
|
B. Башни
жадные алгоритмы
Конструктив
Перебор
реализация
сортировки
*1400
Как известно, все дети в Берляндии любят играть с кубиками. У маленького Пети имеется n башен, состоящих из кубиков одинакового размера. Башня под номером i представляет собой ai кубиков, поставленных друг на друга. Неустойчивостью набора башен Петя называет величину, равную разности высот самой высокой и самой низкой башни. К примеру, если Петя построил из кубиков пять башен с высотами (8, 3, 2, 6, 3), то неустойчивость этого набора равна 6 (самая высокая башня имеет высоту 8, самая низкая — высоту 2). Мальчик хочет, чтобы неустойчивость его набора башен была как можно меньше. Все, что он может сделать, это несколько раз проделать следующую операцию: взять верхний кубик с какой-то из башен и положить его сверху на какую-то другую башню из своего набора. Обратите внимание, что Петя никогда не будет класть кубик на ту же башню, с которой тот был снят, потому что считает это пустой тратой времени. Прежде чем отправиться в школу, мальчик успеет произвести не более k таких операций. Петя не хочет опоздать на урок, поэтому вам придется помочь ему выполнить эту задачу. Выходные данные В первой строке выведите через пробел два целых неотрицательных числа s и m (m ≤ k). Первое из чисел — это величина минимально возможной неустойчивости, которую можно достичь, применив не более k операций, а второе — количество операций, необходимых для этого. Затем в m строках выведите описание каждой из операций в виде двух целых положительных чисел i и j, каждое из которых лежит в пределах от 1 до n. Они обозначают, что Петя переложил верхний кубик с i-й башни на j-ю (i ≠ j). Обратите внимание, что в процессе выполнения операций высоты некоторых башен могут стать равны нулю. Если существует несколько корректных последовательностей операций, при которых достигается минимально возможная неустойчивость, разрешается вывести любую из них. Примечание В первом примере осуществляется два перекладывания, со второй башни на третью и со второй на первую. После этого высоты башен становятся одинаковыми и равными 6.
| |
|
|
C. Экзамены
жадные алгоритмы
сортировки
*1400
Студент Валера учится на первом курсе университета. Скоро у него сессия, и ему предстоит сдать ровно n экзаменов. Валера — умный парень, поэтому он сможет сдать любой экзамен с первого раза. Кроме того, он может сдавать несколько экзаменов в один день и в любом порядке. Согласно расписанию, экзамен по i-му предмету нужно сдать в день с номером ai. Однако Валера договорился с каждым преподавателем, и преподаватель i-го предмета разрешил организовать досрочную сдачу своего экзамена в день bi (bi < ai). Таким образом, Валера может сдать экзамен по i-му предмету либо в день ai, либо в день bi. Все преподаватели ставят запись о сдаче экзамена в зачетную книжку в день фактической сдачи экзамена и датируют эту запись числом ai. Валера считает, что будет достаточно странно, если записи в зачетной книжке будут идти не в порядке неубывания даты. Поэтому Валера просит вас помочь ему. Найдите минимально возможный номер дня, когда Валера сможет сдать последний экзамен, если он будет сдавать экзамены так, чтобы все записи в его зачетной книжке шли в порядке неубывания даты. Выходные данные Выведите единственное целое число — минимально возможный номер дня, когда Валера сможет сдать последний экзамен, если он будет сдавать экзамены так, чтобы все записи в его зачетной книжке шли в порядке неубывания даты. Примечание В первом примере Валера сначала сдаст экзамен по второму предмету в первый день (в зачетную книжку заносится дата сдачи по расписанию, то есть 3). На следующий день сначала он сдаст экзамен по третьему предмету (будет добавлена запись, датированная днем 4), а после него в тот же день сдаст экзамен по первому предмету (в зачетную книжку отметка будет проставлена с днем 5). Таким образом, последний экзамен Валера сдаст во второй день, и даты в зачетной книжке будут идти в порядке неубывания: 3, 4, 5. Во втором примере Валера сначала сдаст экзамен по третьему предмету в четвертый день, после него экзамен по второму предмету в пятый день. После этого в шестой день Валера сдаст экзамен по первому предмету.
| |
|
|
F. Продавцы снега
жадные алгоритмы
сортировки
*2800
Новогодние праздники в Берляндии длятся n дней. Только вот снегом зима в этом году не порадовала, поэтому организаторы зимних праздничных мероприятий вынуждены закупать искусственный снег. В Берляндии есть m фирм, продающих снег. Каждый день i-я фирма производит wi кубометров снега. На следующий день снег тает и фирма вынуждена производить wi кубометров снова. Во время праздников действуют новогодние скидки, поэтому каждый день стоимость снега уменьшается. Известно, что в первый день стоимость всего снега, произведенного i-й фирмой, составляет ci бурлей. Каждый день эта общая стоимость уменьшается на ai бурлей, т.е. во второй день она равна ci - ai, в третий день — ci - 2ai, и т. д. Известно, что ни для одной фирмы стоимость производимого ей снега не становится отрицательной или равной нулю. Вам требуется организовать закупку снега таким образом, чтобы каждый день покупать ровно W кубометров снега. При этом у любой фирмы не обязательно покупать весь снег, произведенный ею. Если вы покупаете у i-й фирмы в один из дней, когда стоимость ее снега равна si, ni кубометров снега (0 ≤ ni ≤ wi, число ni не обязательно целое!), то его цена составит бурлей. В течение одного дня можно покупать снег у нескольких фирм. В разные дни можно покупать снег у разных фирм. Требуется сделать закупки таким образом, чтобы потратить как можно меньше денег. Гарантируется, что производимого фирмами снега будет достаточно. Выходные данные Выведите единственное число — ответ на поставленную задачу. Ответ выводите в формате с десятичной точкой (даже если число целое, точка должна в нем содержаться), без «e» и без лидирующих нулей. Ответ должен отличаться от правильного не более чем на 10 - 9.
| |
|
|
B. Максимальное значение
Бинарный поиск
математика
сортировки
*2100
Вам дана последовательность a, состоящая из n целых чисел. Найдите максимальное значение величины (остаток от деления ai на aj), где 1 ≤ i, j ≤ n и ai ≥ aj. Выходные данные Выведите ответ на задачу.
| |
|
|
A. SwapSort
жадные алгоритмы
реализация
сортировки
*1200
В этой задаче вам требуется отсортировать массив из n чисел, используя не более чем n обменов. Для заданного массива найдите последовательность попарных обменов элементов, после которых массив становится отсортированным по неубыванию. Обмены производятся последовательно, один за одним. Обратите внимание, что в задаче не требуется минимизировать число обменов — требуется найти любой способ длины не более n. Выходные данные В первую строку выведите k (0 ≤ k ≤ n) — количество обменов. Следующие k строк должны содержать описания k искомых обменов по одному в строке. Каждый обмен выводится в виде пары целых чисел i, j (0 ≤ i, j ≤ n - 1), которая обозначает обмен элементов ai и aj. Индексы в парах можно выводить в любом порядке. Обмены производятся в порядке их вывода сверху вниз. Допускается вывод i = j и обмен пары элементов несколько раз. Если ответов несколько, выведите любой из них. Гарантируется, что хотя бы один ответ существует.
| |
|
|
B. Бал в БерлГУ
дп
жадные алгоритмы
Паросочетания
поиск в глубину и подобное
сортировки
*1200
По случаю 100500-летия Берляндского государственного университета совсем скоро состоится бал! Уже n юношей и m девушек во всю репетируют вальс, менуэт, полонез и кадриль. Известно, что на бал будут приглашены несколько пар юноша-девушка, причем уровень умений танцевать партнеров в каждой паре должен отличаться не более чем на единицу. Для каждого юноши известен уровень его умения танцевать. Аналогично, для каждой девушки известен уровень ее умения танцевать. Напишите программу, которая определит наибольшее количество пар, которое можно образовать из n юношей и m девушек. Выходные данные Выведите единственное число — искомое максимальное возможное количество пар.
| |
|
|
A. Командная олимпиада
жадные алгоритмы
реализация
сортировки
*800
В школе №0 столицы Берляндии учатся n школьников. Все ребята в этой школе способные: у кого-то склонность к программированию, у кого-то склонность к математике, а у остальных — к физкультуре. Таким образом, для каждого школьника известна величина ti: - ti = 1, если i-й школьник имеет склонность к программированию,
- ti = 2, если i-й школьник имеет склонность к математике,
- ti = 3, если i-й школьник имеет склонность к физкультуре
Так сложилось, что каждый школьник имеет склонность ровно к одному из этих трех предметов. На командную олимпиаду по научному многоборью требуются команды по три человека. Учителя школы решили, что команды будут составлены из трех школьников со склонностями к разным предметам. Иными словами, в каждой команде должен быть один математик, один программист и один спортсмен. Разумеется, каждый учащийся может быть членом не более чем одной команды. Какое наибольшее количество команд школа сможет выставить на олимпиаду? Как для этого следует формировать команды? Выходные данные В первой строке выведите целое число w — искомое наибольшее количество команд. Далее выведите w строк по три числа в каждой строке. Каждая такая тройка должна обозначать номера школьников, образующих команду. Как команды, так и числа в тройках можно выводить в любом порядке. Школьники пронумерованы целыми числами от 1 до n в порядке их описания во входных данных. Каждый школьник должен участвовать не более чем в одной команде. Если решений несколько, выведите любое. Если ни одну команду невозможно составить, то выведите единственную строку со значением w равным 0.
| |
|
|
B. Ваня и фонари
Бинарный поиск
математика
реализация
сортировки
*1200
Ваня идет поздней ночью по прямолинейной улице длины l, которая освещается n фонарями. Введём систему координат, в которой начало улицы соответствует точке 0, а её конец — точке l. Тогда i-й фонарь находится в точке ai. Фонарь освещает все точки улицы, которые находятся от него на расстоянии не больше d, где d — некоторое положительное число, общее для всех фонарей. Ваня хочет узнать, какой минимальный радиус освещения d должен быть у фонарей, чтобы вся улица была освещена. Выходные данные Выведите минимальный радиус освещения d, который необходим, чтобы осветить всю улицу. Ответ будет считаться правильным, если его абсолютная или относительная погрешность не превышает 10 - 9 Примечание Рассмотрим второй пример. При d = 2 первый фонарь будет освещать отрезок [0, 4] улицы, а второй — отрезок [3, 5]. Таким образом, вся улица будет освещена.
| |
|
|
C. Ваня и экзамены
жадные алгоритмы
сортировки
*1400
Ваня хочет сдать n экзаменов и получить стипендию. Для получения стипендии средний балл за все экзамены должен быть не меньше avg. Максимальная оценка за экзамен не может превышать r. Ваня сдал экзамены, и за i-й экзамен получил оценку ai. Чтобы поднять за i-й экзамен оценку на 1 балл, Ваня должен сдать bi рефератов. Повышать оценку за экзамен можно несколько раз. Какое минимальное количество рефератов должен сдать Ваня, чтобы получить стипендию? Выходные данные В первую строку выведите минимальное количество рефератов. Примечание В первом примере Ваня может сдать 2 реферата по 3 экзамену, подняв свою оценку на 2 балла, и 2 реферата по 4 экзамену, подняв свою оценку на 1 балл. Во втором примере Ване не нужно сдавать рефераты, так как его балл и так выше среднего.
| |
|
|
D. Ваня и компьютерная игра
Бинарный поиск
математика
реализация
сортировки
*1800
Ваня с другом Вовой играют в компьютерную игру, для прохождения уровня им нужно победить n монстров. Персонаж Вани наносит удары со скоростью x ударов за секунду, а персонаж Вовы — со скоростью y ударов за секунду. Каждый из персонажей тратит фиксированное время на замах, после которого наносится удар (время на замах составляет 1 / x секунды для первого персонажа и 1 / y секунды для второго). i-й монстр умирает после получения ai ударов. Ване с Вовой стало интересно, кто нанесет последний удар каждому из монстров. Если Ваня с Вовой одновременно наносят последний удар, то считается, что последний удар нанесли оба из них. Выходные данные Выведите n строк. В i-й строке требуется вывести слово «Vanya», если последний удар по i-му монстру был нанесён Ваней, «Vova», если Вовой, либо «Both», если удар был нанесен ребятами одновременно. Примечание В первом примере первый удар наносит Ваня в момент времени 1 / 3, второй удар наносит Вова в момент времени 1 / 2, третий удар наносит Ваня в момент времени 2 / 3, четвертый и пятый удар Ваня и Вова наносят одновременно в момент времени 1. Во втором примере Ваня и Вова одновременно наносят первый и второй удар в момент времени 1.
| |
|
|
C. Вася и баскетбол
Бинарный поиск
Перебор
реализация
сортировки
Структуры данных
*1600
Вася следит за баскетбольным матчем, записывая, какая команда с какой дистанции сделала очередной бросок. Вася знает, что каждый бросок оценивается либо в 2, либо в 3 очка. Бросок оценивается в 2 очка, если дистанция, с которого он выполнен, не превосходит некоторого значения в d метров, и 3, если эта дистанция больше, чем d метров, где d — некоторое неотрицательное целое число. Вася хочет, чтобы разность набранных командами очков (очки первой команды минус очки второй команды) была как можно больше. Для этого он может мысленно выбирать значение d. Помогите ему добиться желаемого. Выходные данные Выведите два числа в формате a:b — возможный в условиях задачи счёт, при котором разность a - b максимальна. Если таких счетов несколько, выведите такой, в котором число а — максимально.
| |
|
|
E. Распределение партий
жадные алгоритмы
сортировки
*2100
Вы — ассистент режиссера новой музыкальной постановки. В сценарии постановки присутствует n музыкальных партий, каждую из которых должен исполнить ровно один актер. После кастинга режиссер выбрал m актеров, которые смогут принять участие в постановке. Ваша задача — распределить партии между актерами. Однако, существует несколько ограничений. Во-первых, каждый актер обладает своим вокальным диапазоном, и не все партии ему подходят. Формально, каждому актеру сопоставляются два целых числа ci и di (ci ≤ di) — частота самой низкой и самой высокой ноты, которую актер способен спеть. Каждой партии также сопоставляются два целых числа — aj и bj (aj ≤ bj) — частота самой низкой и самой высокой ноты, которые присутствуют в партии. i-й актер способен исполнить j-ю партию тогда и только тогда, когда ci ≤ aj ≤ bj ≤ di, т.е. каждая нота партии попадает в вокальный диапазон актера. Кроме этого, согласно контракту, i-й актер имеет право исполнить не более ki партий. При этом разрешается не назначать некоторым актерам ни одной партии (тогда они поучаствуют в массовых сценах). Репетиции начинаются через два часа, и вам нужно срочно справиться с распределением! Выходные данные Если существует распределение, удовлетворяющее всем требованиям, в первой строке выведите одно слово «YES» (без кавычек). В следующей строке выведите n целых чисел через пробел. i-е число должно быть равно номеру актера, который исполнит i-ю партию. Если существует несколько корректных распределений, выведите любое. Если распределения не существует, выведите одно слово «NO» (без кавычек).
| |
|
|
C. Наибольшая правильная скобочная подстрока
дп
жадные алгоритмы
Конструктив
сортировки
Строки
Структуры данных
*1900
И снова вам предлагается задача на правильные скобочные последовательности.
Напомним, что скобочная последовательность называется правильной, если путем вставки в нее символов «+» и «1» можно получить из нее корректное математическое выражение. Например, последовательности «(())()», «()» и «(()(()))» — правильные, в то время как «)(», «(()» и «(()))(» — нет.
Вам задана строка, состоящая из символов «(» и «)». Ваша задача найти её наидлиннейшую подстроку, которая является правильной скобочной последовательностью. Также вам надо найти количество таких подстрок.
Выходные данные
Выведите длину наибольшей подстроки, являющейся правильной скобочной последовательностью, и количество таких подстрок. Если искомых подстрок не существует, то выведите «0 1» в единственную строку выходных данных.
| |
|
|
B. Новогодняя перестановка
графы
жадные алгоритмы
математика
поиск в глубину и подобное
снм
сортировки
*1600
У пользователя ainta есть перестановка p1, p2, ..., pn. Приближается Новый год, и юноша хочет как можно лучше украсить свою перестановку. Перестановка a1, a2, ..., an красивее перестановки b1, b2, ..., bn тогда и только тогда, когда существует целое число k (1 ≤ k ≤ n), для которого верно a1 = b1, a2 = b2, ..., ak - 1 = bk - 1 и ak < bk. Как известно, перестановка p — очень чувствительная натура, так что её можно изменять только путем перестановки двух различных элементов. Но переставлять элементы сложнее, чем вы думаете. Вам дана матрица A размера n × n, такая что пользователь ainta может переставить значения pi и pj (1 ≤ i, j ≤ n, i ≠ j) тогда и только тогда, когда Ai, j = 1. Дана перестановка p и матрица A. Пользователь ainta хочет знать, какая из достижимых перестановок самая красивая. Выходные данные В первой и единственной строке выведите n целых чисел через пробел, описывающих самую красивую достижимую перестановку. Примечание В первом примере для достижения самой красивой перестановки необходимо переставить элементы (p1, p7). Во втором примере для достижения самой красивой перестановки необходимо переставить (p1, p3), (p4, p5), (p3, p4). Перестановка p — это последовательность целых чисел p1, p2, ..., pn, состоящая из n различных положительных целых чисел, каждое из которых не превышает n. i-й элемент перестановки p обозначается как pi. Размер перестановки p обозначается как n.
| |
|
|
C. Миша и лес
Деревья
жадные алгоритмы
Конструктив
сортировки
Структуры данных
*1500
Назовем лесом неориентированный граф без циклов (петли и кратные рёбра также запрещены). Однажды Миша играл с лесом из n вершин. Для каждой вершины v от 0 до n - 1 он записал два числа degreev и sv, где первое число — количество вершин, смежных с вершиной v, а второе — XOR-сумма номеров вершин, смежных с v (в случае, если смежных вершин не было, он записал 0). На следующий день Миша не смог вспомнить, какой граф у него был изначально. У Миши остались значения degreev и sv. Помогите ему найти количество ребер и сами ребра исходного графа. Гарантируется, что существует лес, которому соответствуют выписанные Мишей числа. Выходные данные В первой строке выведите число m, количество ребер графа. Далее выведите m строк, каждая из которых содержит два различных числа a и b (0 ≤ a ≤ n - 1, 0 ≤ b ≤ n - 1), соответствующие ребру (a, b). Рёбра могут быть выведены в любом порядке; вершины одного ребра также могут быть выведены в любом порядке. Примечание XOR-суммой чисел называется результат побитового сложения чисел по модулю 2. Данная операция существует во многих современных языках программирования, например, в языках C++, Java и Python она обозначается как «^», а в Pascal — как «xor».
| |
|
|
A. Amr и музыка
жадные алгоритмы
реализация
сортировки
*1000
Amr — молодой программист и большой меломан. Он всегда хотел научиться исполнять музыку, но программирование отнимает слишком много его времени. И вот, у юноши созрел план. У Amr есть n инструментов, чтобы научиться играть на i-м инструменте, надо потратить на обучение не менее ai дней. Так как Amr занятой человек, он решил посвятить k дней тому, чтобы научиться игре на как можно большем количестве инструментов. Amr попросил вас помочь ему распределить свои незанятые дни по инструментам, так, чтобы он научился играть на как можно большем количестве инструментов. Выходные данные В первой строке выведите единственное целое число m, обозначающее наибольшее количество инструментов, игре на которых Amr сможет научиться. Во второй строке выведите m целых чисел через пробел: индексы инструментов, на которых юноше следует учиться играть. Индексы можно выводить в любом порядке. Если существует несколько оптимальных решений, выведите любое из них. Использовать все дни на учебу необязательно. Примечание В первом тесте Amr может научиться играть на всех 4 инструментах. Во втором тесте другие возможные варианты: {2, 3, 5} или {3, 4, 5}. В третьем тесте у Amr недостаточно времени для того, чтобы научиться играть на единственном данном инструменте.
| |
|
|
C. Лиса и имена
графы
поиск в глубину и подобное
сортировки
*1600
Лиса Ciel собирается опубликовать статью по ЛИС (Лисооперируемым Интеллектуальным Системам). Она слышала, что список авторов научной статьи всегда сортируется в лексикографическом порядке. После изучения примеров оформления, лиса обнаружила, что иногда это утверждение не верно. В некоторых статьях имена авторов не сортируются в лексикографическом порядке в обычном понимании. Но, оказывается, верно то, что после некоторого изменения порядка букв в алфавите, порядок авторов становится лексикографическим! Лиса хочет знать, существует ли такой порядок букв латинского алфавита, что имена авторов предлагаемой ею статьи следуют в лексикографическом порядке. Если да, то требуется также найти любой такой порядок. Лексикографический порядок определяется следующим образом. Мы сравниваем s и t, сперва находя крайнюю левую позицию с различающимися символами: si ≠ ti. Если такой позиции нет (то есть, s — это префикс t или наоборот), то более короткая строка меньше. В противном случае мы сравниваем символы si и ti согласно их порядку в алфавите. Выходные данные Если существует такой порядок букв, при котором имена в данном списке следуют в лексикографическом порядке, выведите любой такой порядок в виде перестановки символов 'a'–'z' (иными словами, выведите сначала первую букву модифицированного алфавита, затем вторую, и так далее). В противном случае выведите единственное слово «Impossible» (без кавычек).
| |
|
|
C. Drazil и факториал
жадные алгоритмы
математика
сортировки
*1400
Drazil играет в математическую игру с Varda. Определим для целого числа x как произведение факториалов его цифр. Например, . Сперва выбирается число a, состоящее из n цифр и содержащее не менее одной цифры, превосходящей 1. Это число может начинаться с ведущего нуля. Цель игры — найти наибольшее возможное целое число x, удовлетворяющее следующим двум условиям: 1. x не содержит ни цифру 0, ни цифру 1. 2. = . Помогите друзьям найти такое число. Выходные данные Выведите наибольшее возможное целое число, удовлетворяющее условиям, данным выше. В десятичной записи этого числа не должно быть нулей и единиц. Примечание В первом тесте из условия 
| |
|
|
B. A и B и ошибки компиляции
реализация
сортировки
Структуры данных
*1100
A и B готовятся к олимпиадам про программированию. B очень любит отлаживать свой код. Но перед тем, как запустить решение и начать отладку, код нужно сначала скомпилировать. Изначально компилятор выдавал n ошибок компиляции, каждая из которых обозначается положительным целым числом. После некоторых усилий, B удалось исправить сначала одну, а потом еще одну ошибку. Однако, несмотря на то, что B уверен, что исправил две ошибки, он не может понять, какие именно ошибки компиляции исчезли — компилятор языка, на котором пишет B, каждый раз выдает ошибки в новом порядке! B уверен, что в отличие от многих других языков программирования, ошибки компиляции для его языка программирования не зависят друг от друга, т. е. от исправления одной ошибки, множество остальных ошибок не изменяется. А вы можете помочь B узнать, какие именно две ошибки он исправил? Выходные данные Выведите два числа на отдельной строке: номера ошибок компиляции, исчезнувших после того как B внёс первое и второе исправление соответственно. Примечание В первом тестовом примере в первый раз B исправляет ошибку с номером 8, во второй — с номером 123. Во втором тестовом примере в первый раз B исправляет ошибку с номером 1, во второй — с номером 3. Обратите внимание, что если имеются несколько ошибок с одинаковым номером, за один раз B может исправить только одну из них.
| |
|
|
C. Искусство обращения с бакноматом
Бинарный поиск
сортировки
*1900
Банкоматы одного известного банка одной небольшой страны устроены таким образом, что они могут выдать не любую сумму денег, запрошенную пользователем. Из-за ограниченного размера диспенсера купюр (устройства, непосредственно выдающего деньги в банкомате) и особенностей устройства банкомата, на руки можно получить не более, чем k купюр, при этом купюры могут быть не более, чем двух различных достоинств. Например, если в стране используются купюры достоинствами 10, 50, 100, 500, 1000 и 5000 бурлей, то при k = 20 подобный банкомат может выдать суммы в 100 000 бурлей и в 96 000 бурлей, а вот суммы в 99 000 бурлей и 101 000 бурлей — уже не может. Предположим, в стране находятся в хождении купюры n различных достоинств, при этом в банкомате, которым вы пользуетесь, находится неограниченное количество купюр каждого вида. Вы знаете, что в течение дня вам потребуется q раз снять некоторое количество наличных денег. Известно, что банкомат при наличии нескольких способов выдать сумму денег выбирает тот, в котором требуется минимальное количество банкнот, либо выдаёт сообщение об ошибке, если это сделать невозможно. Определите результат каждого из q запросов на выдачу наличных. Выходные данные На каждый запрос выдачи валюты выведите в отдельной строке минимальное количество банкнот, которым может обойтись банкомат, либо выведите - 1, если выдать соответствующую сумму невозможно.
| |
|
|
E. Ладьи и прямоугольники
сортировки
Структуры данных
*2400
У Поликарпа есть шахматная доска размера n × m, на которой расставлены k ладей. Поликарп еще не придумал правила игры, в которую он будет играть. Однако он уже выделил на доске q прямоугольных участков особой стратегической важности, которые должны быть надежно защищены. По мнению Поликарпа, прямоугольный участок доски надежно защищен, если все его свободные клетки бьются ладьями, стоящими на этом участке. Ладьи на остальной части доски на защиту участка не влияют. Расстановка ладей фиксирована и не может быть изменена. Напомним, что ладья бьет все клетки, расположенные с ней на одной вертикали или горизонтали, если между клеткой и ладьей нет других фигур. Помогите Поликарпу определить, все ли стратегически важные участки надежно защищены. Выходные данные Выведите q строк. Для каждого стратегически важного участка выведите «YES», если он надежно защищен, и «NO» в противном случае. Примечание Рисунок к примеру: Для последнего участка ответ «NO», потому что клетка (1, 2) не бьется ладьей.
| |
|
|
C. Илья и палочки
жадные алгоритмы
математика
сортировки
*1600
Вечером после контеста Илье стало скучно, и он очень захотел помаксимизировать. Он вспомнил, что у него есть набор из есть n палочек и напильник. Каждая палочка характеризуется своей длиной li. Илья решил составить из палочек прямоугольники. Причем, помня о своем желании, он решил составлять прямоугольники таким образом, чтобы максимизировать их суммарную площадь. Каждую палочку Илья использует в построении не более одного прямоугольника, при этом могут остаться и неиспользованные палочки. Сгибать палочки нельзя. Из палочек с длинами a1, a2, a3 и a4 можно построить прямоугольник при выполнении следующих свойств: - a1 ≤ a2 ≤ a3 ≤ a4
- a1 = a2
- a3 = a4
Прямоугольник можно составить из палочек с длинами, например, 3 3 3 3 или 2 2 4 4. Из палочек, например, 5 5 5 7 прямоугольник составить нельзя. Также у Ильи есть напильник, которым он может уменьшать длины палочек. Палочки изготовлены из особого материала, поэтому длину каждой палочки можно уменьшить не более чем на единицу. Например, палочку с длиной 5 можно либо не уменьшать, либо получить из нее палочку длины 4. Вам предстоит ответить на вопрос — какую максимальную суммарную площадь прямоугольников может получить Илья при помощи напильника, если он будет составлять прямоугольники из имеющихся палочек? Выходные данные В первой строке выходных данных должно содержаться единственное целое неотрицательное число — максимальная суммарная площадь прямоугольников, которые Илья может составить из имеющихся у него палочек при помощи напильника.
| |
|
|
D. Задача о клике
дп
жадные алгоритмы
реализация
сортировки
Структуры данных
*1800
Задача о клике — одна из самых известных NP-полных задач. После некоторых оговорок она формулируется следующим образом. Рассмотрим неориентированный граф G. Требуется найти такое подмножество вершин C максимального размера, что любые две из них соединены ребром в графе G. Звучит просто, не правда ли? К текущему моменту не известен алгоритм, который находит решение этой задачи за полиномиальное время от размера графа. Однако, как и в случае многих других NP-полных задач, задача о клике оказывается проще, если рассмотреть граф специфического вида. Рассмотрим n различных точек на прямой. Пусть i-я точка имеет координату xi и вес wi. Образуем граф G, вершинами которого являются эти точки, а рёбрами соединены в точности те пары точек (i, j), для которых расстояние между этими точками не меньше суммы их весов, формально говоря: |xi - xj| ≥ wi + wj. Найдите размер максимальной клики в таком графе. Выходные данные Выведите одно число — количество вершин в максимальной клике образованного графа. Примечание Если вы вдруг умеете решать эту задачу, не используя специфические свойства графа, представленного в условии задачи, то вам полагается приз в миллион доллларов! Изображение к тесту из условия:
| |
|
|
B. Фото на память - 2 (online mirror version)
жадные алгоритмы
Перебор
сортировки
*1900
Прошло много лет, и на вечеринке снова встретились n друзей. С момента последней встречи техника шагнула далеко вперёд, появились фотоаппараты с автоспуском, и теперь не требуется, чтобы один из друзей стоял с фотоаппаратом, и, тем самым, оказывался не запечатлённым на снимке. Упрощенно процесс фотографирования можно описать следующим образом. На фотографии каждый из друзей занимает прямоугольник из пикселей: в стоячем положении i-й из них занимает прямоугольник ширины wi пикселей и высоты hi пикселей. Но также, при фотографировании каждый человек может лечь, и тогда он будет занимать прямоугольник ширины hi пикселей и высоты wi пикселей. Общая фотография будет иметь размеры W × H, где W — суммарная ширина всех прямоугольников-людей, а H — максимальная из высот. Друзья хотят определить, какую минимальную площадь может иметь общая фотография, если лечь может не более половины всех друзей (ведь будет странно, если больше n / 2 солидных джентльменов будут лежать на фотографии, не так ли?) Помогите им в этом. Выходные данные Выведите единственное целое число, равное минимальной возможной площади фотографии, вмещающей всех друзей, если лечь может не более половины всех друзей.
| |
|
|
D. Физкультура
сортировки
*1500
Вася — учитель физкультуры в школе. В отличие от других учителей физкультуры, Вася не любит когда ученики выстраиваются в шеренгу по росту. Вместо этого, он требует, чтобы дети выстраивались в порядке a1, a2, ..., an, где ai — рост i-го ученика в шеренге, а n — количество учеников в шеренге. Детям сложно запомнить этот странный порядок, и сегодня они выстроились в порядке b1, b2, ..., bn, что очень расстроило Васю. Теперь Вася хочет переставить детей так, чтобы получился порядок a1, a2, ..., an. За одно действие Вася может поменять местами двух человек, стоящих подряд в шеренге. Помогите Васе — составьте последовательность обменов, приводящую к нужной Васе расстановке. Количество действий минимизировать не требуется. Выходные данные В первой строке выведите целое число k (0 ≤ k ≤ 106) — количество действий. Минимизировать k не требуется, но оно не должно превосходить 106. Далее выведите k строк по два целых числа через пробел. Строка pi, pi + 1 (1 ≤ pi ≤ n - 1) означает, что Вася должен поменять местами учеников на местах pi и pi + 1.
| |
|
|
E. Бесконечные инверсии
Бинарный поиск
Деревья
реализация
сортировки
Структуры данных
*2100
Есть бесконечная последовательность, состоящая из всех положительных целых чисел в порядке возрастания: p = {1, 2, 3, ...}. К ней последовательно применили n операций swap. Операция swap(a, b) меняет местами элементы последовательности на позициях a и b. Требуется найти количество инверсий в получившейся последовательности, т.е. количество таких пар индексов (i, j), что i < j и pi > pj. Выходные данные Выведите единственное целое число — количество инверсий в получившейся последовательности. Примечание В первом примере последовательность меняется следующим образом: . В ней 4 инверсии, их образуют пары индексов (1, 4), (2, 3), (2, 4) и (3, 4).
| |
|
|
D. Очередь
жадные алгоритмы
реализация
сортировки
*1300
Маленькая девочка Сьюзи ходила с мамой в магазин, и ей стало интересно, как можно улучшить обслуживание очередей.
В очереди стоит n людей. Для каждого человека известно время ti, необходимое на его обслуживание. Человек будет недоволен, если время его ожидания будет больше, чем время его обслуживания. Временем ожидания человека считается суммарное время обслуживания всех людей, стоящих перед ним в очереди. Сьюзи подумала, что если поменять местами некоторых людей в очереди, то получится уменьшить количество недовольных.
Помогите Сьюзи найти какого максимального количества довольных можно добиться, переставляя людей в очереди местами.
Выходные данные
Введите единственное число — максимальное количество довольных людей в очереди.
Примечание
Значение 4 достигается, например, при такой расстановке: 1, 2, 3, 5, 15. Таким образом можно сделать всех, кроме человека с временем 5, довольными.
| |
|
|
B. Солдат и значки
жадные алгоритмы
Перебор
реализация
сортировки
*1200
У полковника есть n значков. Он хочет дать по значку каждому из n его солдатов. У каждого значка есть коэффициент крутизны, который показывает уровень, достигнутый владельцем значка. Коэффициент крутизны можно увеличить на 1 за одну монету. Для каждой пары солдат один из них должен получить значок, коэффициент которого строго выше второго. Для солдат не важно, какие у них значения коэффициента, требуется лишь, чтобы их коэффициенты отличались друг от друга. Полковник знает, какому солдату должен достаться какой значок исходно, но есть вот какая проблема. У некоторых значков может быть одинаковый коэффициент крутизны. Помогите ему и подсчитайте, сколько денег надо суммарно заплатить, чтобы у всех значков были различные коэффициенты крутизны. Выходные данные Выведите единственное целое число — минимальное количество монет, которые придется выплатить полковнику. Примечание В первом тесте из примера мы можем увеличить коэффициент первого значка на 1. Во втором тесте из примера мы можем увеличить коэффициенты второго и третьего значка на 1.
| |
|
|
G. Счастливая очередь
жадные алгоритмы
Конструктив
сортировки
*2200
Любите ли вы лето? Жители Берляндии любят. А особенно они любят в жаркую летнюю погоду полакомиться мороженым. Так и в этот летний день перед киоском с мороженым образовалась огромная очередь из n берляндцев. Известно, что у каждого из них есть с собой некоторая сумма берляндских долларов. Жители Берляндии сговорчивые, поэтому каждый берляндец всего за 1 доллар согласен поменяться местом с тем, кто стоит в очереди непосредственно за ним. Более формально, если человек a стоял сразу за человеком b, то человек a может заплатить человеку b 1 доллар, и тогда a и b поменяются местами. Разумеется, если у человека a нулевое количество долларов, то он не может поменяться местами с b. Жители Берляндии — люди странные. В частности, они расстраиваются, когда в очереди перед ними стоит кто-то со строго меньшей суммой денег. Сможете ли вы помочь жителям Берляндии упорядочиться в очереди так, чтобы все они были счастливы? Счастливый берляндец — это тот, который стоит в очереди первым, либо тот, впереди которого стоит другой житель с не меньшим количеством долларов. Учтите, что берляндцы — люди принципиальные, и согласны меняться местами только указанным выше способом. Выходные данные Если невозможно сделать так, чтобы все берляндцы стали счастливы, выведите ":(" без кавычек. В противном случае в единственной строке через пробел выведите n целых чисел, i-е из которых должно равняться количеству денег, которое будет у человека, оказавшегося на позиции i в новой очереди. Если существует несколько ответов, выведите любой из них. Примечание В первом примере два жителя должны поменяться местами, после чего у первого жителя станет 10 монет и он будет в начале очереди, а у второго - 9 монет, и, соответственно, он будет в конце очереди. Во втором втором тесте добиться требуемого невозможно В третьем примере первый человек может поменяться местами со вторым, тогда количества долларов у них будет следующими: 4 11 3, потом второй (в новой очереди) поменяется с третьим, и результирующие количества долларов будут равны: 4 4 10. В такой очереди все будут счастливы.
| |
|
|
A. GukiZ и контест
Перебор
реализация
сортировки
*800
Профессору GukiZ нравятся контесты по программированию. Особенно ему нравится оценивать своих учеников по подготовленным им контестам. Сейчас он подготовил очередной контест. Всего на занятия ходят n учеников, и до начала контеста у каждого из них есть рейтинг — некоторое положительное целое число. Ученики пронумерованы от 1 до n. Обозначим рейтинг i-го ученика за ai. GukiZ ожидает, что его ученики займут места согласно своим рейтингам. Он считает, что каждый ученик займет место, равное . В частности, если у ученика A рейтинг строго ниже, чем у ученика B, ученик A займёт строго худшее место, чем ученик B, а если у двух учеников равные рейтинги, они разделят одно и то же место. GukiZ хотел бы, чтобы вы определили, какие места займут ученики, если всё пойдёт именно так, как он ожидает. Помогите ему в этом. Выходные данные В единственной строке выведите для каждого из n учеников место, которое он должен занять на контесте, в том же порядке, в котором они появляются во вводе. Примечание В первом примере ученики под номерами 2 и 3 расположены на первом месте (как ученики с самым высоким рейтингом), а ученик под номером 1 занимает третье место, так как есть ровно два ученика с рейтингом выше. Во втором примере первый ученик является единственным, кто участвует в контесте. В третьем примере ученики 2 и 5 делят первое место с наибольшим рейтингом, далее следует ученик 4 на третьем месте, а ученики номер 1 и 3 делят четвертое место.
| |
|
|
D. Ваня и треугольники
геометрия
Комбинаторика
математика
Перебор
сортировки
Структуры данных
*1900
Ване было скучно и он нарисовал n различных точек на плоскости. После этого он соединил попарно все точки и увидел, что в итоге образовалось большое количество треугольников с вершинами в отмеченных точках. Он просит вас посчитать количество образовавшихся треугольников с ненулевой площадью. Выходные данные В первой строке выведите целое число — количество треугольников с ненулевой площадью среди отмеченных. Примечание Пояснение к первому тесту из условия. Образовано 3 треугольника: (0, 0) - (1, 1) - (2, 0); (0, 0) - (2, 2) - (2, 0); (1, 1) - (2, 2) - (2, 0). Пояснение ко второму тесту из усовия. Образован 1 треугольник: (0, 0) - (1, 1) - (2, 0). Пояснение к третьему тесту из условия. Одна точка не образует ни одного треугольника.
| |
|
|
B. Дело о беглеце
жадные алгоритмы
сортировки
Структуры данных
*2000
Андроид Андреид — известный на всю галактику детектив. Сейчас он преследует преступника, скрывшегося на планете Окса-5, которая почти полностью покрыта водой. Единственной сушей на планете является архипелаг из n узких островов, расположенных в ряд. Для удобства представим их в виде непересекающихся отрезков на прямой: остров i имеет координаты [li, ri], причем ri < li + 1 для 1 ≤ i ≤ n - 1. Для достижения своей цели Андреиду необходимо поставить по мосту между каждой парой соседних островов. Мост длины a можно поставить между i-м и (i + 1)-м островами, если существуют такие координаты x и y, что li ≤ x ≤ ri, li + 1 ≤ y ≤ ri + 1 и y - x = a. Детектива снабдили m мостами, каждый мост можно использовать не более одного раза. Помогите ему определить, достаточно ли ему выданных мостов для того, чтобы соединить каждую пару соседних островов. Выходные данные Если поставить по мосту между каждой парой соседних островов требуемым образом невозможно, на единственной строке выведите "No" (без кавычек), иначе на первой строке выведите "Yes" (без кавычек), а на второй — n - 1 чисел b1, b2, ..., bn - 1, которые означают, что между островами i и i + 1 должен быть использован мост с номером bi. Если существует несколько правильных ответов, выведите любой. Обратите внимание, что в этой задаче строки "Yes" и "No" надо выводить в правильном регистре. Примечание В первом тесте из условия, например, можно расположить второй мост между точками 3 и 8, третий мост между точками 7 и 10 и первый мост между точками 10 и 14. Во втором тесте из условия первый мост слишком короткий, а второй — слишком длинный, поэтому решения не существует.
| |
|
|
B. Паша и чай
Конструктив
математика
реализация
сортировки
*1500
Паша решил позвать своих друзей на чаепитие. Как раз для этого случая у него был большой чайник объемом w миллилитров и 2n чашек для чая, каждая из которых достанется одному из друзей Паши. В i-ю чашку может быть налито не более ai миллилитров воды. Оказалось, что среди друзей Паши ровно n мальчиков и ровно n девочек, и все они придут на чаепитие. Чтобы никто не обижался, Паша решил наливать воду для чая следующим образом: - Паша может вскипятить чайник ровно один раз, залив в него не более w миллилитров воды;
- каждой девочке Паша нальет одинаковый объем воды;
- каждому мальчику Паша нальет одинаковый объем воды,
- если каждой девочке будет налито по x миллилитров воды, то каждому мальчику будет налито по 2x миллилитров воды.
Иными словами, каждому мальчику должно быть налито в 2 раза больше воды, чем каждой девочке. Паша очень добрый и любезный, поэтому хочет суммарно налить своим друзьям как можно больше воды, чтобы заварить в ней чай. Вам предстоит помочь ему в этом и определить оптимальное распределение чашек между друзьями Паши. Выходные данные Выведите одно вещественное число — максимальный суммарный объем воды в миллилитрах, который Паша может налить своим друзьям, не нарушая заданных условий. Ваш ответ будет признан правильным, если его абсолютная или относительная погрешность не превосходит 10 - 6. Примечание Также у Паши есть конфеты, которые он раздаст девочкам, но это уже совсем другая задача...
| |
|
|
C. Артур и стол
дп
жадные алгоритмы
математика
Перебор
сортировки
Структуры данных
*1900
Артур купил большой и красивый стол в свою новую квартиру. Придя домой, Артур обнаружил, что его покупка стоит неустойчиво и сильно шатается. У стола, купленного Артуром, всего n ножек, длина i-й ножки равна li. Артур решил сделать стол устойчивым и открутить некоторые ножки. Для каждой из них Артур определил число di — сколько единиц энергии он потратит, чтобы открутить i-ю ножку. Стол с k ножками считается устойчивым, если ножек максимальной длины строго больше половины. Например, чтобы стол с 5-ю ножками был устойчивым, необходимо, чтобы ножек максимальной длины (среди этих пяти) было хотя бы три. Также, стол с одной ножкой всегда устойчивый, а стол с двумя ножками устойчив тогда и только тогда, когда они имеют равные длины. Перед вами стоит задача помочь Артуру и посчитать минимальное число единиц энергии, которое Артур может затратить, чтобы сделать стол устойчивым. Выходные данные Выведите одно целое число — минимальное число единиц энергии, которое нужно затратить Артуру, чтобы сделать стол устойчивым.
| |
|
|
A. Лалаландия и яблони
Перебор
реализация
сортировки
*1100
Amr живет в Лалаландии. Лалаландия — очень красивая страна, расположенная на координатной прямой. Лалаландия славится своими яблонями — в стране они растут везде. Всего в Лалаландии ровно n яблонь. Яблоня номер i расположена в точке xi, на ней растет ai яблок. Amr хочет собрать яблоки с этих яблонь. Amr сейчас стоит в точке x = 0. Сначала он выбирает, вправо ли он пойдёт или влево. Он будет следовать в этом направлении, пока не дойдет до первой яблони. Он соберет с этой яблони все яблоки, а затем пойдет в противоположном направлении и будет идти, пока не дойдет до первой непосещённой яблони, снова развернётся, и так далее. Иными словами, посещая каждую новую яблоню, Amr разворачивается и идёт в противоположном направлении. Amr перестанет собирать яблоки, когда в направлении его движения не останется ни одной непосещённой яблони. Какое максимальное количество яблок он сможет собрать? Выходные данные Выведите максимальное количество яблок, которое может собрать Amr. Примечание В первом тесте не имеет значения, пойдет ли Amr сначала влево или вправо. В обоих случаях он соберет все яблоки. Во втором тесте оптимальное решение таково: пойти влево до x = - 1, собрать там яблоки, развернуться, затем дойти до x = 1, собрать там яблоки, развернуться, и дойти до последнего дерева x = - 2. В третьем тесте оптимальное решение таково: пойти вправо до x = 1, собрать там яблоки, развернуться, после чего Amr больше не может собирать яблоки, так как слева от него нет яблонь.
| |
|
|
D. Угадай, где выход! II
реализация
сортировки
Структуры данных
*2300
Amr купил новую видеоигру "Угадай, где выход! II". Задача этой игры — найти выход в лабиринте, имеющим вид полного двоичного дерева высоты h. Изначально игрок стоит в корне дерева, а выход из дерева располагается в некотором листе дерева. Пронумеруем все вершины дерева, таким образом, что - Корень дерева имеет номер 1
- У каждой внутренней вершины i (i ≤ 2h - 1 - 1) есть левый потомок с номером 2i и правый потомок с номером 2i + 1
Уровень вершины определяется как 1 для корня, либо как 1 + уровень вершины-родителя в противном случае. Вершины уровня h называются листьями. Выход из лабиринта расположен в некотором листе n, причём игрок не знает, где выход, так что цель игры — угадать, где выход! В новой версии игры игроку дозволяется задавать вопросы формата "Принадлежит ли номер ancestor(exit, i) отрезку [L, R]?". Здесь за ancestor(v, i) обозначается предок вершины v, расположенный на уровне i, а exit обозначает вершину с выходом. Игра может отвечать только "Yes" (Да) или "No" (Нет). Игра устроена так, что она не всегда отвечает верно, и иногда она сообщает ложную информацию, чтобы сбить игрока с толку! Amr задал много вопросов и запутался во всех этих ответах, так что он попросил вас помочь ему. Вам даны вопросы и ответы на них, можете ли вы определить, сообщала ли игра противоречивую информацию или нет? Если информация непротиворечива, и вершина выхода определяется однозначно, то выведите её номер. Если информация непротиворечива, но вершина выхода однозначно не определяется, то выведите, что было задано недостаточное количество вопросов. В противном случае, сообщите, что информация противоречива. Выходные данные Если информация, полученная от игры, противоречива, выведите: "Game cheated!" (игра сжульничала) без кавычек. Если информация непротиворечива, и можно однозначно найти выход из лабиринта, выведите его номер. В противном случае, выведите: "Data not sufficient!" (недостаточно данных) без кавычек. Примечание Вершина u называется предком вершины v тогда и только тогда, когда - u — та же самая вершина, что и v,
- u — непосредственный родитель вершины v,
- либо u — предок непосредственного родителя вершины v.
В первом тесте дано 4 вершины-листа 4, 5, 6, 7. Первый вопрос говорит, что данная вершина не находится в диапазоне [4, 6], так что выход — это вершина номер 7. Во втором тесте дано 8 вершин-листьев. После первого вопроса становится известно, что выход находится в диапазоне [10, 14]. После второго и третьего вопроса становится понятно, что только узел номер 14 подходит. Смотрите на изображение ниже для разъяснений. 
| |
|
|
E. Простое задание
сортировки
Строки
Структуры данных
*2300
Это задание очень простое. Вам дана строка S длины n и q запросов, каждый запрос имеет формат i j k, что означает: отсортировать подстроку, состоящую из символов от i до j, в неубывающем порядке, если k = 1 или в невозрастающем порядке, если k = 0. Выведите итоговую строку после выполнения запросов. Выходные данные Выведите строку S после выполнения всех запросов. Примечание Объяснение к первому тесту: 




| |
|
|
B. Эквивалентные строки
разделяй и властвуй
сортировки
Строки
хэши
*1700
Сегодня на спецкурсе «Строки» Геральд узнал новое определение эквивалентности строк. Две строки a и b равной длины называются эквивалентными в одном из двух случаев: - Они равны.
- Если разделить строку a на две одинаковые по длине половины a1 и a2, а строку b — на две одинаковые по длине половины b1 и b2, то окажется, что верно одно из двух:
- a1 эквивалентно b1, а a2 эквивалентно b2
- a1 эквивалентно b2, а a2 эквивалентно b1
В качестве домашнего задания преподаватель выдал ученикам две строки и попросил определить, эквиваленты ли они. Геральд уже сделал это домашнее задание. Сделайте и вы! Выходные данные Выведите «YES» (без кавычек), если эти две строки эквивалентны, и «NO» (без кавычек) в противном случае. Примечание В первом примере первую строку можно разделить на строки "aa" и "ba", вторую – на строки "ab" и "aa". "aa" эквивалентно "aa"; "ab" эквивалентно "ba", так как "ab" = "a" + "b", "ba" = "b" + "a". Во втором примере первую строку можно разделить на строки "aa" и "bb", которые эквивалентны только сами себе. Поэтому строка "aabb" эквивалентна только сама себе и строке "bbaa".
| |
|
|
E. Геральд и тропинка
дп
сортировки
*3000
Главная прогулочная тропинка Геральдиона абсолютно прямая, и проходит строго с севера на юг, при этом она настолько длинная, что никто никогда не доходил до её концов ни в одном из двух направлений. Геральдионцы очень любят гулять по этой тропинке и днём и ночью, поэтому мэр города попросил Геральда организовать освещение этой тропинки с помощью нескольких прожекторов. Прожекторы уже поставлены на определённых местах и Геральд не сможет их подвинуть. Каждый прожектор освещает отрезок тропинки определённой длины, одним из концов которого является место расположения прожектора, и его можно направить так, чтобы он освещал отрезок к югу или к северу от себя. На тропинке стоит памятник мэру острова, и, хотя гулять можно в обоих направлениях от этого памятника, ни один прожектор не находится южнее этого памятника. Вам даны расположение прожекторов и их мощность. Помогите Геральду направить все прожекторы так, чтобы суммарная длина освещённой части тропинки была как можно больше. Выходные данные Выведите единственное число — максимальную суммарную длину освещённой части тропинки.
| |
|
|
E. Принцип домино
Бинарный поиск
сортировки
Структуры данных
*2200
Вася увлекается расстановкой домино. Обычкновенные домино Васе надоели, и он использует костяшки разных высот. Он поставил на стол n доминошек вдоль одной оси, проходящей слева направо. Каждая доминошка стоит перпендикулярно этой оси так, что ось проходит через центр ее основания. i-ая костяшка домино имеет координату xi и высоту hi. Теперь Вася хочет узнать для каждой костяшки домино, сколько доминошек упадет, если он толкнет ее вправо. Помогите ему это сделать. Считайте, что доминошка падает, если ее задевают строго выше основания. Другими словами, падение костяшки домино с начальной координатой x и высотой h приводит к падению всех доминошек на отрезке [x + 1, x + h - 1].  Выходные данные Выведите n чисел zi через пробел — сколько доминошек упадет, если Вася толкнет вправо i-ую (включая ее саму).
| |
|
|
A. Денежная система Геральдиона
реализация
сортировки
*1000
На волшебном острове Геральдионе, на котором живёт Геральд, есть своя денежная система. В обращении находятся купюры нескольких номиналов. Но, к сожалению, их система несовершенна, и иногда Геральдионцы сталкиваются с ситуацией, что определённую сумму денег нельзя выдать без сдачи никаким набором купюр (естественно, можно использовать сколько угодно купюр каждого достоинства). Такая сумма называется неудачной. Геральд заинтересовался: а какова минимальная неудачная сумма? Выходные данные Выведите единственное число — минимальную неудачную сумму. Если же неудачных сумм не бывает, выведите - 1.
| |
|
|
D. Одномерный морской бой
Бинарный поиск
жадные алгоритмы
сортировки
Структуры данных
*1700
Алиса и Боб любят играть в одномерный морской бой. Они играют на поле, имеющем вид строки из n квадратных клеточек (то есть на таблице 1 × n). В начале игры Алиса в тайне от Боба расставляет на поле k кораблей, каждый из которых имеет вид прямоугольника 1 × a (то есть занимает последовательность из a подряд идущих клеток поля). Корабли не могут пересекаться и даже касаться друг друга. После этого Боб делает последовательность «выстрелов». Он называет клетки поля, а Алиса сообщает, что клетка пуста («мимо»), либо что эта клетка принадлежит какому-либо кораблю («попал»). Вот незадача! Похоже, Алиса любит фантазировать. Видимо, именно по этой причине на каждый ход Боба она отвечает «мимо». Помогите Бобу уличить Алису в фантазировании — найдите первый такой ход Боба, после которого можно наверняка утверждать, что Алиса слукавила. Выходные данные Выведите единственное целое число — номер такого первого хода Боба, после которого можно наверняка утверждать, что Алиса сказала неправду. Ходы Боба нумеруются от 1 до m в порядке их совершения. Если искомого хода не существует, то выведите «-1».
| |
|
|
B. Минимизация
дп
жадные алгоритмы
сортировки
*2000
Дан массив A, состоящий из n целых чисел, и целое положительное число k. Массив A проиндексирован целыми числами от 1 до n. Требуется переставить элементы массива таким образом, чтобы величина  стала минимально возможной. В частности, разрешается не переставлять элементы массива вовсе. Выходные данные Выведите минимальное возможное значение суммы, описанной в условии задачи. Примечание В первом тесте одна из оптимальных перестановок имеет вид 1 4 2. Во втором тесте исходная перестановка является оптимальной. В третьем тесте одна из оптимальных перестановок имеет вид 2 3 4 4 3 5.
| |
|
|
A. Массивы
сортировки
*900
Даны два отсортированных по неубыванию массива A и B, состоящих из целых чисел. Проверьте, можно ли в массиве A выбрать k чисел, а в массиве B — выбрать m чисел так, что любое число, выбранное в первом массиве, строго меньше любого числа, выбранного во втором массиве. Выходные данные Выведите "YES" (без кавычек), если в массиве A можно выбрать k чисел, а в массиве B — m чисел так, любое выбранное в массиве A число строго меньше любого выбранного в массиве B числа. В противном случае выведите "NO" (без кавычек). Примечание В первом тестовом примере, можно например, выбрать числа 1 и 2 из массива A и число 3 из массива B (1 < 3 и 2 < 3). Во втором тестовом примере единственный способ выбрать k элементов в первом массиве и m элементов во втором — выбрать все числа в обоих массивах, но тогда не все выбранные числа в A будут меньше, чем все выбранные в B: .
| |
|
|
B. Биржевые заявки
жадные алгоритмы
реализация
сортировки
Структуры данных
*1300
В данной задаче вам потребуется обработать набор заявок на торгах и сформировать по ним биржевой стакан. Заявка — это желание какого-то участника торгов купить или продать акции. Для каждой заявки i известна ее цена pi, направление заявки di — покупка или продажа, а также количество акций qi, которые участник готов купить или продать по цене pi за акцию. Значение qi называется объемом заявки. Все заявки с одинаковой ценой p и направлением d объединяются в так называемую аггрегированную заявку, цена которой также равна p, направление — d, а объём складывается из исходных заявок. Биржевой стакан — это таблица из аггрегированных заявок, в которой сначала идут предложения продажи, отсортированные по убыванию цены, а затем предложения покупки, тоже отсортированные по убыванию цены. Стакан с глубиной s содержит s лучших аггрегированных заявок по каждому направлению. Заявка на покупку тем лучше, чем у неё цена больше, заявка на продажу тем лучше, чем у неё цена меньше. Если аггрегированных заявок в данном направлении меньше s, то они все попадают в итоговый стакан. Дано n биржевых заявок на покупку и продажу акций, требуется распечатать биржевой стакан глубины s для этих заявок. Выходные данные Выведите не больше чем 2s строк, в которых содержатся аггрегированные заявки биржевого стакана глубины s. Заявки требуется выводить в том же формате что и во входных данных. Примечание Будем обозначать (x, y) заявку по цене x с объемом y. В тестовом примере имеются три аггрегированные заявки на покупку: (10, 3), (20, 4), (25, 10) и две на продажу: (50, 8), (40, 1) Нужно вывести не более двух лучших заявок по каждому направлению, поэтому заявку (10 3), имеющую худшую цену среди заявок на покупку, выводить не нужно.
| |
|
|
C. Точки на плоскости
геометрия
жадные алгоритмы
Конструктив
разделяй и властвуй
сортировки
*2100
На плоскости расположены n точек (xi, yi) с целочисленными координатами от 0 до 106. Расстоянием между двумя точках с номерами a и b назовем следующую величину: (расстояние, вычисляемое по такой формуле, называется манхеттенским расстоянием). Назовем гамильтоновым путем некоторую перестановку pi от 1 до n. Назовем длиной этого пути величину . Найдите какой-нибудь гамильтонов путь с длиной не более, чем 25 × 108. Обратите внимание, минимизировать длину гамильтонова пути не требуется. Выходные данные Выведите перестановку чисел pi от 1 до n — искомый гамильтонов путь. Перестановка должна удовлетворять неравенству . Если возможных ответов несколько, разрешается вывести любой. Гарантируется, что существует подходящая перестановка. Примечание В тесте из условия, суммарное расстояние равно: 
(|5 - 3| + |0 - 4|) + (|3 - 0| + |4 - 7|) + (|0 - 8| + |7 - 10|) + (|8 - 9| + |10 - 12|) = 2 + 4 + 3 + 3 + 8 + 3 + 1 + 2 = 26
| |
|
|
B. Ищем напарника
Перебор
реализация
сортировки
*1300
Есть соревнование по программированию под названием SnakeUp, в котором хотят принять участие 2n человек. Принять участие в контесте можно только в составе команды из ровно двух людей. Известна сила каждой возможной команды из двух людей. Все значения сил различны. Каждый соревнующийся надеется, что он может найти напарника, с которым он образует как можно более сильную команду. Таким образом, соревнующийся стремится создать команду с наибольшей возможной силой, путем выбора сокомандника из тех, кто согласен быть с ним в команде. Более формально, два человека, A и B смогут создать команду, если каждый из них является наилучшим возможным напарником (среди соревнующихся, не нашедших к текущему моменту пару) друг для друга. Определить, кто с кем будет участвовать в команде? Выходные данные Выведите строку, содержащую 2n чисел. Из них i-е число должно обозначать номер напарника i-го человека. Примечание В первом примере люди номер 1 и 2 образуют команду, также образуют команду люди номер 3 и 4, так что напарники соревнующихся номер 1, 2, 3, 4 будут 2, 1, 4, 3, соответственно.
| |
|
|
B. Кефа и компания
Бинарный поиск
сортировки
*1500
Кефа хочет отметить свой первый крупный заработок походом в ресторан. Однако ему нужна компания. У Кефы есть n друзей, каждый из которых согласится пойти в ресторан, если Кефа попросит. Каждый друг характеризуется количеством денег у него и степенью дружбы с Кефой. Наш попугай не хочет, чтобы какой-то друг почувствовал себя бедным по сравнению с кем-то другим в компании (Кефа не в счет). Друг чувствует себя бедным, если в компании есть кто-то, у кого денег хотя бы на d единиц больше, чем у него. Также Кефа хочет, чтобы суммарная степень дружбы членов компании была максимальной. Помогите ему пригласить оптимальную компанию! Выходные данные Выведите максимальную суммарную степень дружбы, которой можно добиться. Примечание В первом тесте из условия выгоднее всего сформировать компанию только из второго друга. При всех других вариантах суммарная степень дружбы будет меньше. Во втором тесте из условия мы можем взять всех друзей.
| |
|
|
C. Развитие навыков
математика
реализация
сортировки
*1400
Петя очень любит компьютерные игры. Наконец вышла игра, которую он так долго ждал! У главного героя этой игры есть n различных навыков, каждый из которых характеризуется целым числом ai от 0 до 100. Чем больше число ai, тем лучше главный герой владеет i-м навыком. Суммарный рейтинг главного героя определяется как сумма значений по всем i от 1 до n. Выражение ⌊ x⌋ обозначает результат округления числа x вниз к ближайшему целому числу. Пете в начале игры в качестве бонуса дали k единиц улучшений, которые он может использовать для увеличения навыков своего персонажа и его суммарного рейтинга. Используя одну единицу улучшения, Петя может увеличить любой навык главного героя ровно на один. К примеру, если a4 = 46, то после применения единицы улучшения к этому навыку, он станет равен 47. Больше 100 навык героя стать не может. Таким образом, возможно, что некоторое количество единиц улучшения останется невостребованным. Перед вами стоит задача определить, как следует использовать единицы улучшений, чтобы максимизировать суммарный рейтинг главного героя. Использовать все единицы улучшений не обязательно. Выходные данные В единственной строке выходных данных должно содержаться целое неотрицательное число — максимальный суммарный рейтинг главного героя, который может получить Петя, используя k или менее единиц улучшения. Примечание В первом тестовом примере оптимальная стратегия следующая. Петя должен улучшить первый навык до 10, потратив 3 единицы улучшения, и второй навык до 10, потратив одну единицу улучшения. Таким образом, Петя потратит все свои единицы улучшения и суммарный рейтинг главного героя станет равен . Во втором тестовом примере оптимально для Пети улучшить первый навык до 20 (при этом потратить 3 единицы улучшения) и улучшить третий навык до 20 (при этом потратить 1 единицу улучшения). Таким образом, у Пети останется 4 единицы улучшения и он сможет увеличить второй навык лишь до 19 (что не изменит суммарный рейтинг, поэтому делать это Пете необязательно). Поэтому максимально возможный суммарный рейтинг в этом примере . В третьем тестовом примере оптимальная стратегия Пети — увеличить первый навык до 100, потратив 1 единицу улучшения. После этого оба навыка главного героя станут равны 100, поэтому Петя не сможет потратить оставшуюся единицу улучшения. Таким образом, ответ равен .
| |
|
|
B. Антон и прямые
геометрия
сортировки
*1600
Учительница дала Антону большое домашнее задание по геометрии, но он как обычно его не сделал, поскольку участвовал в регулярном раунде Codeforces. В задание был дан набору из n прямых, определяемых уравнениями y = ki·x + bi. Требовалось определить, существует ли хотя бы одна точка пересечения двух прямых, лежащая строго внутри полосы ограниченной x1 < x2. Другими словами, правда ли что найдутся такие 1 ≤ i < j ≤ n и такие x', y', что: - y' = ki * x' + bi, то есть точка (x', y') принадлежит прямой с номером i;
- y' = kj * x' + bj, то есть точка (x', y') принадлежит прямой с номером j;
- x1 < x' < x2, то есть точка (x', y') лежит внутри полосы ограниченной x1 < x2.
Вы же не оставите Антона в беде и поможете ему решить задание? Выходные данные Выведите «Yes» (без кавычек), если существует хотя бы одно пересечение двух прямых, расположенное строго внутри полосы, иначе выведите «No» (без кавычек). Примечание В первом примере прямые пересекаются только на границе полосы, но ни одного пересечения внутри нет.
| |
|
|
C. Вилбур и точки
жадные алгоритмы
Комбинаторика
сортировки
*1700
Вилбур играет с множеством из n точек на координатной плоскости. Все точки имеют неотрицательные целочисленные координаты. Более того, если точка (x, y) принадлежит множеству Вилбура, то все точки (x', y'), такие, что 0 ≤ x' ≤ x и 0 ≤ y' ≤ y, также принадлежат этому множеству. Теперь Вилбур хочет пронумеровать точки в имеющемся множестве, то есть присвоить им различные целочисленные номера от 1 до n. Чтобы нумерация была эстетически приятна, Вилбур хочет выполнить такое условие: если некоторая точка (x, y) получает номер i, тогда всем (x',y') из этого множества, таким, что x' ≥ x и y' ≥ y, надо приписать номер не менее i. Например, для множества из четырех точек (0, 0), (0, 1), (1, 0) и (1, 1) есть две эстетически приятные нумерации: 1, 2, 3, 4, и 1, 3, 2, 4. Друг Вилбура увидел, как тот играет с точками, и решил усложнить ему задачу. Для любой точки он определяет её специальное значение как s(x, y) = y - x. Теперь он даёт Вилбуру последовательность w1, w2,..., wn и просит найти такую эстетически приятную нумерацию точек множества, что специальное значение точки, получившей номер i, будет равно wi, то есть s(xi, yi) = yi - xi = wi. Теперь Вилбур очень просит вас помочь ему с этой задачей. Выходные данные Если существует эстетически приятная нумерация точек множества, такая, что s(xi, yi) = yi - xi = wi, то выведите "YES" в первой строке выходных данных. В противном случае выведите "NO". Если решение существует, далее выведите n строк. В i-й из них строк выведите точку множества, которая получит номер i. Если существует несколько решений, выведите любое. Примечание В первом примере точка (2, 0) получает номер 3, точка (0, 0) получает номер 1, точка (1, 0) получает номер 2, точка (1, 1) получает номер 5 и точка (0, 1) получает номер 4. Легко проверить, что такая нумерация является эстетически прятной, и yi - xi = wi. Во втором примере специальные значения точек множества равны 0, - 1 и - 2, в то время как последовательность, которую Вилбуру даёт друг, равна 0, 1, 2. Следовательно, ответа не существует.
| |
|
|
D. Вилбур и деревья
дп
математика
сортировки
Теория вероятностей
*2300
Свинка по имени Вилбур всегда хотел быть бобром, так что сегодня он решил притвориться бобром и грызть деревья, чтобы повалить их. Имеется n деревьев, расположенных вдоль прямой. Дерево номер i расположено в позиции xi, при этом все позиции деревьев различны. Все деревья обладают одинаковой высотой, равной h. Когда Вилбур прогрызает какое-либо дерево, оно падает налево с вероятностью p или направо с вероятностью 1 - p. Если, падая, дерево задевает другое дерево, то задетое дерево так же начинает падать в этом же направлении. Дерево может задеть другое дерево, только если расстояние между ними строго меньше h. Рассмотрим следующий пример: имеются четыре дерева с координатами 1, 3, 5 и 8 соответственно, и h = 3. Дерево, стоявшее в позиции 1, падает направо и задевает дерево с координатой 3. То дерево, в свою очередь, также падает и роняет дерево с координатой 5. Расстояние между 5 и 8 равно 3, поэтому последнее дерево не будет задето и останется стоять. Пока ещё есть стоящие деревья, Вилбур равновероятно выбирает либо самое левое, либо самое правое дерево и роняет его. Если осталось только одно дерево, то Вилбур точно уронит его. Вилбур хочет знать математическое ожидание суммарной длины участков земли, покрытых упавшими деревьями, после того, как не останется ни одного стоящего дерева. Пожалуйста, помогите Вилбуру. Выходные данные Выведите единственное вещественное число — математическое ожидание суммарной длины всех участков земли, покрытых деревьями, когда они все упадут. Ваш ответ будет считаться правильным, если его абсолютная или относительная ошибка не будет превосходить 10 - 6. А именно: пусть ваш ответ равен a, а ответ жюри — b. Проверяющая программа будет считать ваш ответ правильным, если . Примечание Рассмотрим пример, у нас два дерева с высотой 2. Есть три варианта развития событий: 1. Оба дерева упадут налево. Либо правое дерево упадет налево первым с вероятностью (при этом повалив левое дерево), либо левое дерево упадет налево и затем правое дерево упадет налево, вероятность этого равна . Общая вероятность равна . 2. Оба дерева упадут направо. Это аналогично (1), так что вероятность такого события равна . 3. Левое дерево упадет налево, а правое дерево упадет направо. Это единственный оставшийся вариант, так что его вероятность должна быть . В вариантах 1 и 2 всего будет покрыто 3 единичных отрезка земли, а в варианте 3 — 4 единичных отрезка. Следовательно, математическое ожидание равно .
| |
|
|
B. Ресторан
дп
жадные алгоритмы
сортировки
*1600
Ресторан получил n заказов на проведение банкета. Каждый заказ характеризуется двумя величинами: моментом начала банкета li и моментом конца ri (li ≤ ri). Руководство ресторана может либо принять заказ, либо отвергнуть его. Какое наибольшее количество заказов может быть принято? Никакие два принятых заказа не могут пересекаться, то есть не должно существовать момента времени, который принадлежит сразу двум принятым заказам. Если один из заказов начинается в момент, когда заканчивается другой, то они не могут быть приняты вместе. Выходные данные Выведите наибольшее количество заказов, которые могут быть приняты.
| |
|
|
C. Ближайшие вектора
геометрия
сортировки
*2300
Вам дано множество векторов на плоскости, начинающихся в точке (0, 0). Требуется найти любую пару векторов, таких что образованный ими неориентированный угол минимален. Неориентированный угол — это неотрицательная величина, минимальный из двух углов от одного вектора до другого по или против часовой стрелки. Это значение всегда от 0 до π. Например, два противонаправленных вектора имеют угол между собой равный π. Выходные данные Выведите два целых числа a и b (a ≠ b) — пару индексов векторов, образующих минимальный неориентированный угол среди заданного множества векторов. Номера можно выводить в любом порядке. Если правильных ответо несколько, разрешается вывести любой.
| |
|
|
C. Поход на пляж
сортировки
*1600
Как-то раз Сквидвард, Спанч Боб и Патрик решили сходить на пляж. К сожалению, погода оказалась очень плохой, и друзьям не удалось покататься на волнах. Однако они решили не уходить и провести время, строя замки из песка. Проведя на пляже весь день, друзья построили целых n замков. Замки пронумерованы от 1 до n, при этом i-й замок имеет высоту равную hi. Когда все уже собирались уходить, Сквидвард заметил, что замки не упорядочены по высоте, и это показалось ему некрасивым. Теперь друзья хотят переупорядочить замки таким образом, чтобы для всех i от 1 до n - 1 выполнялось hi ≤ hi + 1. Сквидвард предложил следующий процесс сортировки: - Замки разбиваются на блоки — группы последовательно стоящих замков. Таким образом, блок с i по j — это замки i, i + 1, ..., j. Блок может состоять из одного замка.
- Обязательно выбирается такое разбиение на блоки, чтобы каждый замок попал ровно в один блок.
- Замки, находящиеся внутри одного блока, сортируются независимо от других, то есть последовательность hi, hi + 1, ..., hj становится отсортированной.
- Разбиение выбирается таким, чтобы после сортировки каждого блока в отдельности вся последовательность hi стала отсортированной. Этого всегда можно добиться, просто назвав всю последовательность одним блоком.
Даже Патрику понятно, что чем больше будет блоков — тем легче будет отсортировать все замки, а это немаловажно, поскольку перемещать замок из песка крайне неудобно. Теперь друзья просят вас посчитать максимальное количество блоков в разбиении, удовлетворяющем всем вышеописанным требованиям. Выходные данные Выведите максимально возможное количество блоков в подходящем разбиении. Примечание В первом примере разбиение выглядит следующим образом: [1][2][3]. Во втором: [2, 1][3, 2].
| |
|
|
B. Запросы о количестве не превосходящих элементов
Бинарный поиск
сортировки
Структуры данных
*1300
Заданы два массива чисел a и b. Для каждого элемента второго массива bj нужно найти количество элементов в массиве a, которые меньше либо равны bj. Выходные данные Выведите m чисел, разделенных пробелами: j-е из них равно количеству таких элементов массива a, которые меньше или равны числа bj.
| |
|
|
A. Флеш-карты
жадные алгоритмы
реализация
сортировки
*800
У Эдварда есть n флеш-карт объемом a1, a2, ..., an мегабайт и большой файл размера m мегабайт. Найдите минимальное количество флеш-карт, на которые можно записать файл Эдварда, если он может разделить свой файл на части произвольного размера. Выходные данные В единственной строке выходных данных должно содержаться целое положительное число — минимальное количество флеш-карт, на которые можно записать файл Эдварда, если он может разделить свой файл на части произвольного размера. Примечание В первом тестовом примере Эдварду нужно 2 флеш-карты — первая и третья. Во втором тестовом примере Эдварду нужны все 3 флеш-карты. В третьем тестовом примере Эдварду нужна тольно одна флеш-карта и он может выбрать любую из имеющихся — либо первую, либо вторую.
| |
|
|
E. Новый год и три мушкетёра
жадные алгоритмы
сортировки
Структуры данных
*2400
Знаете ли вы историю о трёх мушкетёрах? Независимо от ответа, вам требуется им помочь. Ришелимакьё — кардинал в городе Медведисе. Он нашел трех отважных воинов и назвал их тремя мушкетёрами. Сила Атоса равна a, сила Бортоса равна b, а сила Сарамиса равна c. 2015 год почти закончился, а ещё предстоит победить n преступников. Сила i-го преступника равна ti. Победить некоторых преступников не так-то просто — возможно, мушкетёрам придётся сражаться вместе. Ришелимакьё будет координировать действия своих мушкетёров. Каждый час каждый из мушкетёров может ничего не делать или сражаться с каким-то преступником, при этом два или даже три мушкетёра могут сражаться с одним и тем же преступником, и тогда их силы складываются. На то, чтобы победить одного преступника, уходит ровно один час, независимо от того, сколько мушкетёров с ним сражаются. Ришелимакьё не может допустить, чтобы в какой-нибудь момент сила преступника оказалась больше суммарной силы сражающихся с ним мушкетёров, ведь тогда он победит! Более подробно, есть три способа победить конкретного преступника: - За один час мушкетер силы x может победить преступника, с силой не превосходящей x. Например, Атос за один час может победить преступника с номером i, только если ti ≤ a.
- Два мушкетера могут сражаться вместе и за один час одолеть преступника, если его сила не превосходит сумму сил этих двух мушкетеров. Например, Атос и Сарамис за один час могут одолеть преступника с номером i, только если ti ≤ a + c.
- Аналогично, все три мушкетера могут сражаться вместе и за один час одолеть преступника, чья сила не превосходит суммарной силы трёх мушкетёров a + b + c.
Ришелимакьё не хочет, чтобы мушкетеры сражались в новогоднюю ночь, поэтому хочет скоординировать их действия таким образом, чтобы минимизировать количество часов до того момента, пока будут побеждены все преступники. Найдите минимальное количество часов, необходимое для того, чтобы одолеть всех преступников. Если мушкетёры не могут победить всех преступников, то выведите "-1" (без кавычек). Выходные данные Выведите одну строку с ответом. Если мушкетёры не могут одолеть всех преступников, выведите "-1" (без кавычек). В противном случае выведите минимальное количество часов, которое мушкетёрам придётся потратить для того, чтобы одолеть всех преступников. Примечание В первом примере сила Атоса равна 10, Бортоса 20, а Сарамиса 30. Они могут победить всех преступников за два часа: - Бортос и Сарамис вместе побеждают пресутпника с силой 50, пока Атос сражается с одним из четырёх преступников с силой 1.
- Остаётся три преступника, сила каждого 1. Каждый мушкетёр сражается с одним из таких преступников в течение второго часа.
Во втором примере трём мушкетёрам нужно всем вместе сражаться против преступника с силой 51. Это займёт один час. На втором часу они сражаются по отдельности. На третье часу остался один преступник, и любой из мушкетёров побеждает его.
| |
|
|
D. Объединение k-подотрезков
жадные алгоритмы
сортировки
*1800
Вам задано n отрезков на прямой и число k. Будем считать точку на прямой насыщенной, если она принадлежит хотя бы k отрезкам. Найдите набор из наименьшего количества отрезков на прямой, содержащий насыщенные точки и только их. Выходные данные В первой строке выведите целое число m — наименьшее количество отрезков. Далее в m строках выведите по два целых числа aj, bj (aj ≤ bj) — концы очередного отрезка. Отрезки нужно выводить в порядке слева направо.
| |
|
|
B. Навыки
Бинарный поиск
дп
жадные алгоритмы
Перебор
сортировки
*1900
Лёша играет в недавно вышедшую новую версию легендарной игры hacknet. В этой версии был добавлен механизм навыков. Теперь каждый игровой персонаж обладает ровно n навыками. Каждый навык представляется одним неотрицательным целым числом ai — текущим уровнем навыка. Все навыки имеют одинаковый максимальный уровень A. Одновременно с навыками был введён всеобщий рейтинг всех игроков. Игроки ранжируются по так называемой Силе. Сила игрока считается как сумма следующих величин: - Количество навыков, которыми персонаж владеет в совершенстве (т.е. таких, что ai = A), умноженное на коэффициент cf.
- Минимальный текущий уровень среди всех навыков (min ai), умноженный на коэффициент cm.
Сейчас у Лёши есть m хакнетианских денежных единиц, которые он готов потратить. Каждая денежная единица позволяет увеличить текущий уровень любого навыка на 1 (если его уровень еще не максимален). Помогите ему потратить деньги таким образом, чтобы достичь как можно большего уровня Силы. Выходные данные Сначала выведите максимальное значение Cилы, которое может получить персонаж. Затем выведите n целых чисел — a'i (ai ≤ a'i ≤ A), уровни навыков, до которых следует развиться, чтобы достичь указанного значения Силы, при этом используя не более m денежных единиц. Если правильных ответов несколько — выведите любой. Примечание В первом тесте оптимальной стратегией является повышение второго навыка до его максимума, а остальных — на единицу. Во втором тесте нужно увеличить уровни всех навыков до максимума.
| |
|
|
D. Королевство и его города
графы
Деревья
дп
поиск в глубину и подобное
разделяй и властвуй
сортировки
*2800
В королевстве К готовились к свадьбе дочери Короля. Однако, чтобы не ударить в грязь лицом перед будущими родственниками, Королю сперва необходимо провести реформу королевства. Так как Королю не терпится выдать свою дочь замуж, этот вопрос ему нужно решить как можно скорее. Королевство в данный момент состоит из n городов. Города соединены с помощью n - 1 двунаправленной дороги, причём из каждого города можно добраться до любого другого города. Поскольку в былые времена Королю приходилось много экономить, между любыми двумя городами есть ровно один простой путь. В чём же суть реформы? Выяснилось, что для максимально эффективного управления ключевые функции государственного аппарата необходимо вынести в различные города (назовем такие города важными). Однако из-за того, что существует риск атаки со стороны варваров, это необходимо сделать осторожно. Король составил несколько планов, каждый из которых описывается набором важных городов, и теперь интересуется, какой же план лучше. Варвары могут захватывать некоторые города, не являющиеся важными (уж те-то, разумеется, будут достаточно укреплены), после этого через захваченный город становится невозможно проехать. В частности, интересной характеристикой плана является минимальное количество городов, которое необходимо захватить варварам, чтобы все важные города оказались попарно изолированы друг от друга, то есть ни из какого важного города нельзя было доехать ни до какого другого важного города. Помогите Королю посчитать эту характеристику для каждого своего плана. Выходные данные Для каждого плана выведите единственное число — минимальное количество городов, которое потребуется захватить варварам, или - 1, если все попытки варваров изолировать важные города обречены на провал. Примечание В первом тесте в первом и третьем плане варварам достаточно захватить город 3. Во втором и четвёртом плане все попытки будут обречены на провал. Во втором тесте варварам достаточно захватить города 3 и 5.
| |
|
|
F. Дорогие строки
сортировки
Строки
строковые суфф. структуры
Структуры данных
*2700
Задан набор из n строк ti. Для каждой строки известна ее стоимость ci. Определим следующую функцию от строки , где ps, i — число вхождений строки s в строку ti, а |s| — длина строки s. Найдите максимальное значение функции f(s) по всем строкам. Обратите внимание, что s — это не обязательно строка из заданного набора t. Выходные данные В единственной строке выходного файла выведите целое число a — наибольшее значение функции f(s) по всем строкам s. Обращаем еще раз внимание, что строка s не обязательно из заданного набора t.
| |
|
|
C. Инквизиция
геометрия
реализация
сортировки
*2300
В средние века хорошей традицией было сжигать ведьм на костре вместе с их подопечными — чёрными кошками. К концу 15-го века популяция чёрных кошек оказалась исчерпана. В связи со сложившейся тяжёлой ситуацией была созвана ЧИК — Чрезвычайная Инквизиционная Комиссия. В постановлении №666 указано, что белая кошка является чёрной тогда и только тогда, когда периметр её чёрных пятен превышает допустимую норму. Чему же равна допустимая норма? Каждый инквизитор выберет её сам в зависимости от ситуации. Ваша же задача — найти периметр чёрных пятен на шкуре кошки. В том же постановлении указано, что шкура кошки представляет собой белый квадрат длины 105. В процессе измерения пятен принято левый нижний угол шкуры помещать в начало координат (0;0), а правый верхний — в точку с координатами (105;105). Пятна кошек являются невырожденными треугольниками. Пятна кошек могут пересекаться и накладываться друг на друга, но гарантируется, что каждая пара сторон треугольных пятен имеет не более одной общей точки. Периметром в данной задаче будем считать суммарную длину границ, на которых происходит смена цвета шкуры кошки. Выходные данные Выведите одно число — ответ на задачу, периметр объединения треугольников. Ваш ответ должен отличаться от правильного не более чем на 10 - 6.
| |
|
|
E. Муравьи в листьях
Деревья
жадные алгоритмы
поиск в глубину и подобное
сортировки
*2200
Связный граф без циклов называется деревом. Листом дерева называется любая вершина, которая связана ровно с одной другой вершиной. Задано дерево из n вершин с корнем в вершине 1. В каждом листе дерева находится один муравей. За одну секунду несколько муравьёв могут одновременно перейти в предка вершины в которой они находятся. Два муравья не могут находиться одновременно в одной вершине, за исключением корня дерева. Определите наименьшее время за которое все муравьи смогут попасть в корень дерева. Обратите внимание, что исходно муравьи находятся только в листьях дерева. Выходные данные Выведите целое число t — наименьшее время, необходимое, чтобы все муравьи попали в корень дерева.
| |
|
|
B. Составить строку
жадные алгоритмы
сортировки
*1100
Дан алфавит из n букв, нужно составить строку максимальной длины так, чтобы выполнялись два условия: - i-я буква встречалась в строке не больше ai раз;
- количество вхождений в строку каждой из букв должно быть различным для всех букв, которые встретились в строке хотя бы один раз.
Выходные данные Выведите одно целое число — максимальную длину строки, удовлетворяющей требованиям. Примечание Для удобства возьмём алфавит из трёх букв: «a», «b», «c». В первом тесте из условия, примерами подходящих строк являются: «cccaabbccbb», «aabcbcbcbcb». Во втором тесте из условия примерами подходящих строк являются: «acc», «cbc».
| |
|
|
A. Кораблекрушение
реализация
сортировки
Строки
*900
Корабль наткнулся на риф и сейчас терпит крушение. Теперь весь экипаж должен быть срочно эвакуирован. Все n членов экипажа уже выстроились в один ряд (для удобства пронумеруем их всех слева направо натуральными числами от 1 до n) и ждут дальнейших указаний. Однако эвакуировать экипаж полагается не абы как, а в строгом порядке. А именно: Сначала корабль покидают те члены экипажа, которые являются крысами. Затем корабль покидают женщины и дети (и те, и другие имеют одинаковый приоритет). После этого с корабля эвакуируются все мужчины. Последним тонущий корабль покидает капитан. Если для каких-либо двух членов экипажа нельзя точно установить, кто должен покинуть корабль раньше по правилам из предыдущего абзаца, то раньше корабль покидает тот, который стоит левее в ряду (или, другими словами, тот, у которого номер в ряду меньше). Для каждого члена экипажа известно, кем он является, а так же его имя. Все члены экипажа имеют различные имена. Определите порядок эвакуации экипажа. Выходные данные Выведите n строк. i-ая из них должна содержать имя члена экипажа, который должен покинуть корабль i-ым по счету.
| |
|
|
C. Отчёт
сортировки
Структуры данных
*1700
Каждый месяц Блейк получает отчёт об основных показателях деятельности компании «Blake Technologies». Компания производит n продуктов, поэтому в отчёте указано n целых чисел — выручка по каждому из этих продуктов. Однако перед тем, как этот отчёт попадёт в руки Блейка, он проходит нелёгкий путь через m менеджеров. Каждый из менеджеров, прежде чем передать отчёт следующему менеджеру (или Блейку), может переставить некоторые числа по своему усмотрению. А именно: i-й менеджер сортирует первые ri чисел в порядке неубывания или невозрастания, после чего передаёт отчёт менеджеру с номером i + 1, если i < m, или Блейку, если i = m. Сейчас как раз настал момент, когда сотрудники составляют очередной отчёт для Блейка. Вам известна изначальная последовательность длины n, а также дано описание каждого менеджера, то есть значение ri и какой порядок сортировки он предпочитает. Вас попросили ускорить процесс и сразу определить итоговый вид отчёта. Выходные данные В единственной строке выведите n целых чисел — итоговый отчёт, который попадёт к Блейку. Примечание В первом примере изначально отчёт выглядел так: 1 2 3. После первого менеджера были переставлены первые два числа: 2 1 3. В таком виде отчёт попал к Блейку. Во втором примере первоначально отчёт был таким: 1 2 4 3. После первого менеджера отчёт стал таким: 4 2 1 3. После второго менеджера отчёт стал выглядеть так: 2 4 1 3. Такой отчёт был передан Блейку.
| |
|
|
C. Наименьшая конкатенация строк
сортировки
Строки
*1700
Вам задан набор из n строк a1, a2, ..., an. Вам нужно записать их друг за другом (конкатенировать) в некотором порядке так, чтобы получившаяся строка была лексикографически минимальной. Выведите лексикографически минимальную конкатенацию заданного набора строк. Выходные данные Выведите единственную строку a — лексикографически минимальную конкатенацию заданного набора строк.
| |
|
|
C. Синдром шпиона 2
дп
реализация
сортировки
Строки
строковые суфф. структуры
Структуры данных
хэши
*1900
Яш хочет взломать используемый Сидхантом шифр. После долгих недель наблюдений он понял, что Сидхант шифрует предложения следующим образом: - Перевести все буквы в нижний регистр.
- Каждое слово в предложение заменить на развёрнутое.
- Удалить все пробелы.
Например, если взять предложение Kira is childish and he hates losing и применить к нему данный шифр, то получится строка ariksihsidlihcdnaehsetahgnisol Сейчас у Яша есть зашифрованная строка и список слов. Помогите ему найти какое-нибудь исходное предложение, составленное только из слов, встречающихся в списке. Обратите внимание, что любое слово может быть использовано в предложении сколько угодно раз. Выходные данные Выведите одну строчку, содержащую исходное предложение. Гарантируется, что хотя бы одно решение существует. Если решений несколько, то разрешается вывести любое.
| |
|
|
B. Порядок чатов
*особая задача
Бинарный поиск
Конструктив
сортировки
Структуры данных
*1200
Поликарп — большой любитель проводить время в соцсетях. Страница со списком чатов в его любимой соцсети устроена так, что при отсылке сообщения собеседнику чат с ним поднимается на самый верх страницы. Относительный порядок всех остальных чатов при этом не изменяется. Если ранее чата с этим собеседником не было, то просто в верх списка чатов вставляется новый чат. Считая, что изначально список чатов пуст, по последовательности сообщений Поликарпа постройте список чатов после обработки всех его сообщений. Считайте, что никто из собеседников ничего Поликарпу не писал. Выходные данные Выведите всех адресатов, с кем общался Поликарп, в порядке расположения чатов с ними сверху вниз. Примечание В первом тестовом примере Поликарп сначала напишет пользователю с именем «alex», и список примет вид: - alex
Затем Поликарп напишет пользователю с именем «ivan» и список чатов будет выглядеть следующим образом: - ivan
- alex
Третье сообщение Поликарп напишет пользователю с именем «roman». После этого список чатов будет выглядеть следующим образом: - roman
- ivan
- alex
Четвёртое сообщение Поликарп напишет пользователю с именем «ivan», которому он уже отправлял сообщение, поэтому список чатов изменится следующим образом: - ivan
- roman
- alex
| |
|
|
D. Медвежонок и вклад
жадные алгоритмы
сортировки
Структуры данных
*2400
Codeforces — замечательная платформа, одной из её особенностей является возможность посмотреть вклад того или иного участника в развитие сообщества. У каждого зарегистрированного пользователя есть параметр вклад — целое число, не обязательно положительное. Всего зарегистрировано n участников, вклад i-го из них равен ti. Маленький полярный медвежонок Лимак только начала заниматься спортивным программированием. У него ещё даже нет своего аккаунта на Codeforces, но он уже может ставить плюсы записям в блогах и комментариям. Минусы Лимак никогда не использует. В рамках данной задачи можно считать, что у каждого зарегистрированного пользователя бесконечно много комментариев и записей в блоге. - Лимак может потратить b минут на чтение блога и поставить ему плюс. Вклад автора блога увеличивается на 5.
- Лимак может потратить c минут на чтение комментария и поставить ему плюс. Вклад автора комментария увеличивается на 1.
Обратите внимание, что возможны входных данные в которых Лимак читает блоги быстрее, чем комментарии. Лимак очень любит ничьи. Он хотел бы, чтобы у каких-нибудь k пользователей была ничья по вкладу. То есть он собирается прочитать сколько-то блогов и сколько-то комментариев и поставить им плюсы, чтобы в результате существовало целое число x, такое что как вклад как минимум k зарегистрированных пользователей равен в точности x. Сколько минимум времени придётся потратить Лимаку, чтобы добиться желаемого? Выходные данные Выведите минимальное количество минут, которое придётся потратить Лимаку чтобы добиться ничьей между как минимум k пользователями. Примечание В первом примере имеется четыре зарегистрированных пользователя и Лимак хочет, чтобы была ничья между как минимум тремя из них. Оптимальный ответ можно получить следующим образом: - Потратить 100 минут на чтение блога пользователя 4 и увеличить его вклад с 1 до 6.
- Потратить 4·30 = 120 минут на чтение четырёх комментариев пользователя 2 и увеличить его вклад с 2 до 6 (четыре увеличения по 1).
Таким образом Лимак потратит 100 + 4·30 = 220 минут и вклад пользователей 2, 3 и 4 будет равен 6. Во втором примере Лимак тратит 30 минут на чтение блога и 100 минут на чтение комментария. Он может добиться того, чтобы у трёх пользователей вклад был равен 12 потратив 100 + 3·30 = 190 минут: - Потратив 2·30 = 60 минут на чтение двух блогов пользователя номер 2 увеличить его вклад с 2 до 12.
- Потратив 30 + 100 минут на чтение одного блога и одно комментарий пользователя 3 увеличить его вклад с 6 до 6 + 5 + 1 = 12.
| |
|
|
E. Медведь и парадокс
Бинарный поиск
жадные алгоритмы
математика
сортировки
*2800
Лимак вырос и стал большим мишкой. Он приготовил n задач для соревнований по спортивному программированию. Изначальная стоимость (количество очков за успешное решение) i-й задачи равна pi. Прорешивание показало, что на решение i-й задачи требуется ровно ti минут. Задачи не обязательно упорядочены по сложности, но менять порядок уже поздно — Лимак уже объявил разбалловку в посте на главной странице. Единственное, что ещё можно поменять, это скорость убывания стоимости задач c. Обозначим за T время, необходимое для решения всех задач, то есть T = t1 + t2 + ... + tn. Контест продлится ровно T минут, то есть как раз столько, сколько нужно чтобы всё решить. Баллы за решение задачи линейно убывают со временем. Решение задачи i на минуте x даёт ровно , где константу предстоит выбрать Лимаку. Предположим значение c фиксировано. Во время соревнования каждый участник выберет какой-нибудь порядок решения задач. Всего возможных порядков n!, каждый из них приведёт к какому-нибудь итоговому количеству очков, не обязательно целочисленному. Скажем, что порядок является оптимальным, если он даёт максимальное количество очков. Другими словами, решение задач в любом другом порядке даст количество очков меньшее либо равное, чем решение задач в таком порядке. Очевидно, что существует хотя бы один оптимальный порядок, однако, оптимальных порядков может быть и несколько. Лимак предполагает, что каждый участник сразу правильно оценит значение ti для каждой задачи и начнёт решать их в каком-нибудь оптимальном порядке. Также Лимак полагает, что тестеры правильно определили все значения ti. Для двух различных задач i и j, таких что pi < pj Лимак не хотел бы допустить ситуации, что какой-нибудь участник решавший задачи в оптимальном порядке получил за задачу i строго больше очков, чем за задачу j. Такую ситуацию Лимак называется парадоксом. Несложно показать, что для c = 0 парадокс невозможен. Однако, для больших значений c это не так. Какое максимальное значение c (но помните, что ) можно выбрать, так чтобы парадокс был невозможен? Другими словами, чтобы для любого оптимального порядка решения задач не произошло парадокса. Можно доказать, что максимальное c всегда существует. Выходные данные Выведите единственное вещественное число — максимальное значение c, такое что и ни в одном оптимальном порядке решения задач не произойдёт парадокса. Ваш ответ будет считаться правильным, если его абсолютная или относительная ошибка не будет превосходить 10 - 6. А именно: пусть ваш ответ равен a, а ответ жюри — b. Проверяющая программа будет считать ваш ответ правильным, если . Примечание В первом примере 3 задачи. Первая обладает параметрами (4, 1) (изначальная стоимость равна 4, а на решение требуется 1 минута), вторая (3, 1) и третья (10, 8). Продолжительность контеста равна T = 1 + 1 + 8 = 10. Покажем наличие парадокса при c = 0.7. Решение задач в порядке 1, 2, 3 даст максимальное количество очков, равное: - решение задачи через 1 минуту после начала:
- решение задачи через 2 минуты после начала:
- решение задачи через 10 минут после начала:
Таким образом, решение задач в таком порядке даёт 3.72 + 2.58 + 3 = 9.3 очков и это единственный оптимальный порядок (можно проверить ответы для других 5 перестановок). Однако, для задач 1 и 3 возникнет парадокс: 4 < 10, но 3.72 > 3. При c = 0.625 парадокса нет и это максимальное такое значение c. Во втором примере, все 24 порядка решения задач являются оптимальными. В третьем примере не возникнет парадокса даже при c = 1.
| |
|
|
H. Настольный боулинг
*особая задача
сортировки
*2300
Участники турнира по настольному боулингу закончили соревнование в соответствии с заданной таблицей. Таблица задана вам в виде последовательности строк, каждая имеет формат «имя баллы». Ваша задача подготовить итоговую таблицу результатов. Она должна иметь вид «место имя». Участников следует отсортировать по баллам (в убывающем порядке), а при равенстве баллов по имени (лексикографически). Места надо назначать от 1 и далее. Если более одного участника имеют одинаковый балл, то место имеет вид диапазона, например «12-14». Рассмотрите тесты из условия для прояснения формата ввода/вывода. Выходные данные Выведите искомую таблицу, разделяя одним пробелом место и имя в каждой строке. Просмотрите примеры для детализации формата вывода.
| |
|
|
I. Сортировка таблицы
*особая задача
сортировки
*2400
Есть прямоугольная таблица, содержащая слова. Каждые ее столбец имеет свое имя. Задан набор критериев сортировки вида "ИМЯ_ПОЛЯ ПОРЯДОК_СОРТИРОВКИ", где ПОРЯДОК_СОРТИРОВКИ это либо ASC (неубывающий порядок) либо DESC (невозрастающий порядок). В наборе критерии записаны через запятую c пробелом. Отсортируйте строки таблицы в первую очередь по первому критерию, при равенстве по первому критерию, отсортируйте по второму. И так далее. Если две строки равны с точки зрения набора критериев, то сохраните их относительный порядок друг относительно друга. Считайте, что каждый элемент таблицы имеет тип строка, пользуйтесь лексикографическим сравнением. Выходные данные Выведите таблицу после сортировки.
| |
|
|
C. Псевдонимы серверов
*особая задача
Бинарный поиск
реализация
сортировки
Строки
Структуры данных
*2100
Существуют веб-сайты, доступные сразу по нескольким адресам. Например, долгое время на страницы Codeforces можно было заходить как используя хостнейм cf.m27.workers.dev, так и codeforces.ru. Вам задан список адресов страниц. Для упрощения будем считать, что все адреса имеют вид: http://<hostname>[/<path>], где: - <hostname> — имя сервера (состоит из слов, возможно, разделённых точками),
- /<path> — необязательная часть, где <path> состоит из слов, разделённых слешами.
Будем считать, что два <hostname> соответствуют одному и тому же веб-сайту, если для каждого запроса к первому <hostname> найдется такой же запрос ко второму и наоборот — для каждого запроса ко второму <hostname> найдется такой же запрос к первому. Изучите примеры из условия для лучшего понимания этого определения. Выделите все группы имён серверов, которые соответствуют одному сайту. Игнорируйте группы, которые состоят ровно из одного имени сервера. Обратите внимание, что формально два запроса http://<hostname> и http://<hostname>/ различаются. Выходные данные В первую строку выведите k — количество групп имен серверов, которые соответствуют одному сайту. Следует учитывать только такие группы, размер которых строго больше единицы. Далее в k строках выведите группы по одной в строке. Для каждой группы выведите все имена серверов в ней через пробел. Как группы, так и имена серверов в группе можно выводить в любом порядке.
| |
|
|
B. Собери стол
Конструктив
сортировки
*800
Вася купил стол, у которого n ножек. Каждая ножка состоит из двух частей, которые соединяются друг с другом. Каждая часть может быть произвольной положительной длины, но гарантируется, что из всех 2n частей возможно составить n ножек одинаковой длины. При составлении ножки любые две части могут быть соединены друг с другом. Изначально все ножки стола разобраны, а вам заданы длины 2n частей в произвольном порядке. Помогите Васе собрать все ножки стола так, чтобы все они были одинаковой длины, разбив заданные 2n части на пары правильным образом. Каждая ножка обязательно должна быть составлена ровно из двух частей, не разрешается использовать как ножку только одну часть. Выходные данные Выведите n строк по два целых числа в каждой — длины частей ножек, которые надо соединить друг с другом. Гарантируется, что всегда возможно собрать n ножек одинаковой длины. Если ответов несколько, разрешается вывести любой из них.
| |
|
|
D. Собачки и миски
жадные алгоритмы
сортировки
Структуры данных
*1900
На координатной прямой сидит n собачек, i-я собачка находится в точке xi. Кроме того, на прямой есть m мисок с едой, для каждой известна её координата на прямой uj и время tj, через которое еда в миске остынет и станет невкусной. Это значит, что если собачка прибежит к миске в момент времени, строго больший tj, то еда уже остынет, и собачка кушать её не станет. Считая, что каждая собачка бежит со скоростью 1, найдите максимальное количество собачек, которые смогут покушать. Считайте, что собачки побегут к тем мискам, на которые вы им укажете. Из одной миски не могут кушать две или более собачки. Собачки могут обгонять друг друга, то есть, если одна из них остановится покушать, другая может пройти мимо неё, чтобы попасть к другой миске. Выходные данные Выведите одно целое число a — максимальное количество собачек, которые смогут покушать. Примечание В первом примере первая собачка побежит направо к первой миске, третья собачка сразу начнёт есть из второй миски, четвёртая собачка побежит влево к третьей миске, а пятая собачка побежит влево к четвёртой миске.
| |
|
|
C. Печать условий
жадные алгоритмы
Конструктив
сортировки
*1500
На тренировку по подготовке к соревнованиям по программированию пришли n команд. Тренер для каждой команды подобрал тренировку, комплект задач для i-й команды занимает ai страниц. В распоряжении тренера есть x листов бумаги, у которых обе стороны чистые, и y листов, у которых только одна сторона чистая. При печати условия на листе первого типа можно напечатать две страницы из условий задач, а при печати на листе второго типа — только одну. Конечно, на листе нельзя печатать условия из двух разных комплектов задач. Обратите внимание, что при использовании листов, у которых обе стороны чистые, не обязательно печатать условие на обеих сторонах, одна из них может остаться чистой. Вам предстоит определить максимальное количество команд, которым тренер сможет напечатать комплекты задач целиком. Выходные данные Выведите единственное целое число — максимальное количество команд, которым тренер сможет напечатать комплекты задач целиком. Примечание В первом тестовом примере можно напечатать оба комплекта задач. Один из возможных ответов — напечатать весь первый комплект задач на листах с одной чистой стороной (после этого останется 3 листа с двумя чистыми сторонами и 1 лист с одной чистой стороной), а второй комплект напечатать на трех листах с двумя чистыми сторонами. Во втором тестовом примере можно напечатать оба комплекта задач. Один из возможных ответов — напечатать первый комплект задач на двух листах с двумя чистыми сторонами (после этого останется 1 лист с двумя чистыми сторонами и 5 листов с одной чистой стороной), а второй комплект напечатать на одном листе с двумя чистыми сторонами и на пяти листах с одной чистой стороной. Таким образом, тренер использует все листы для печати. В третьем тестовом примере можно напечатать только один комплект задач (любой из трёх 11-страничных). Для печати 11-страничного комплекта задач будет израсходована вся бумага.
| |
|
|
E. Автобус
Бинарный поиск
жадные алгоритмы
сортировки
Структуры данных
*2100
Вдоль дороги стоят n путешественников. Дорога представляет собой прямую, размерами путешественников можно пренебречь, считая их точками. Водитель автобуса Василий, благодаря мобильному приложению, знает для каждого путешественника точку xi, в которой тот стоит. Кроме того, он знает расстояние di, которое i-й путешественник хочет проехать на автобусе. Таким образом, i-й путешественник планирует выйти из автобуса в точке xi + di. Теперь Василий хочет решить, кого из путешественников он подвезёт, а кого оставит пылиться у дороги. Василий решил, что сегодня он должен хорошо заработать, поэтому решил перевезти в точности a путешественников. В автопарке есть автобусы любых видов. Чем больше мест в автобусе, тем дороже стоит его аренда. Помогите Василию определить минимальное количество пассажирских мест в автобусе, которых будет достаточно для перевозки ровно a путешественников. Ни в какой момент времени в автобусе не может быть путешественников больше, чем количество пассажирских мест в автобусе. Василий сам может решить какое конкретно подмножество из a путешественников он перевезёт на автобусе. Считайте, что автобус всегда едет слева направо (от меньших координат к большим) и начинает свой путь левее самого левостоящего путешественника. Если в одной точке какой-то путешественник должен выйти из автобуса, а другой войти, считайте, что сначала произойдет выход одного путешественника из автобуса, а затем другой путешественник сможет зайти в автобус. Выходные данные Сначала выведите одно целое число — минимальное количество пассажирских мест в автобусе, которых будет достаточно для перевозки хотя бы a путешественников. Затем выведите a целых чисел — номера путешественников, которых подвезёт Василий. Путешественники нумеруются, начиная с единицы, в том порядке, в котором заданы во входных данных. Номера можно выводить в произвольном порядке. Если ответов несколько, разрешается вывести любой из них. Примечание В первом тестовом примере достаточно одноместного автобуса. К примеру, Василий может подвезти третьего и первого путешественников, либо второго и первого путешественников.
| |
|
|
B. Красота картин
жадные алгоритмы
сортировки
*1200
На выставку были привезены n картин. Каждая картина имеет красоту ai. Известно, что посетитель выставки всегда радуется, когда при движении вдоль ряда картин следующая картина красивее предыдущей. Какое максимальное количество раз может порадоваться посетитель при оптимальном порядке расположения картин на стене? Иными словами, расставьте элементы последовательности a таким образом, чтобы максимизировать количество i (1 ≤ i ≤ n - 1), таких что ai + 1 > ai. Выходные данные Выведите единственное целое число — максимальное количество пар соседних картин таких, что ai + 1 > ai, после оптимального переупорядочивания последовательности a. Примечание В первом примере оптимальный порядок расположить картины: 10, 20, 30, 40, 50. В втором примере оптимальный порядок расположить картины: 100, 200, 100, 200.
| |
|
|
B. z-сортировка
сортировки
*1000
Ученик z-школы нашёл интересный способ сортировки чисел, называемый z-сортировкой. Массив a, состоящий из n элементов является z-отсортированным, если выполнены два условия: - ai ≥ ai - 1 для всех чётных i,
- ai ≤ ai - 1 для всех нечётных i > 1.
Например массивы [1,2,1,2] и [1,1,1,1] являются z-отсортированными, а массив [1,2,3,4] таковым не является. Можете ли вы осуществить z-сортировку заданного массива? Выходные данные Если возможно осуществить z-сортировку массива a выведите n целых чисел ai — элементы массива после z-сортировки. В противном случае выведите одно слово "Impossible".
| |
|
|
C. Враждебные пары
Комбинаторика
сортировки
*1800
Вам задана перестановка p длины n. Также вам задано m враждебных пар (ai, bi) (1 ≤ ai, bi ≤ n, ai ≠ bi). Ваша задача посчитать количество различных интервалов (x, y) (1 ≤ x ≤ y ≤ n), которые не содержат никакие враждебные пары. Таким образом, вам не нужно считать интервалы (x, y), содержащие хотя бы одну враждебную пару (позиции и порядок значений из враждебной пары не имеют значения). Рассмотрим пример: p = [1, 3, 2, 4] и пары {(3, 2), (4, 2)} являются враждебными. Интервал (1, 3) не является корректным, поскольку содержит враждебную пару (3, 2). Интервал (1, 4) также не является корректным, поскольку содержит две враждебные пары (3, 2) и (4, 2). Но интервал (1, 2) является корректным, поскольку не содержит враждебных пар. Выходные данные Выведите одно целое число c — количество различных интервалов (x, y), не содержащих враждебных пар. Обратите внимание, что ответ может не поместиться в 32-битном типе данных. Для сохранения числа вы можете использовать, например, тип long long в языке C++ или тип long в языке Java. Примечание В первом примере, следующие интервалы являются корректными: (1, 1), (1, 2), (2, 2), (3, 3) и (4, 4).
| |
|
|
D. Вложенные отрезки
сортировки
Структуры данных
*1800
Вам задано n отрезков на прямой таких, что никакие два конца никаких отрезков не совпадают. Определите для каждого отрезка, сколько отрезков лежит внутри него. Выходные данные Выведите n строк. j-ая строка должна содержать единственное целое число aj — количество отрезков, находящихся внутри j-ого отрезка.
| |
|
|
A. Медвежонок и три мячика
Перебор
реализация
сортировки
*900
У полярного медвежонка Лимака есть n мячиков. Размер i-го мячика равен ti. Лимак хочет подарить по одному мячику каждому из трёх своих друзей. Дарить подарки нелегко — Лимак должен следовать двум правилам: - Никакие два друга не должны получить мячики одинакового размера.
- Никакие два друга не должны получить мячики, размеры которых отличаются больше чем на 2.
Например, Лимак может выбрать мячики размеров 4, 5 и 3 или мячики размера 90, 91 и 92. При этом он не может выбрать мячики размера 5, 5 и 6 (два друга получат одинаковые мячики) и не может выбрать 30, 31 и 33 (30 и 33 отличаются больше чем на 2). Помогите Лимаку определить, сможет ли он выбрать подарки своим друзьям и не нарушить ни одного из правил. Выходные данные Если Лимак может выбрать три мячика разного размера, так что никакие два не будут отличаться больше чем на 2, то выведите "YES" (без кавычек). В противном случае выведите "NO". Примечание В первом примере у Лимака есть 4 мячика, и он может выбрать из них три, не нарушая ни одного правила. Для этого необходимо взять мячики с размерами 18, 16 и 17. Во втором примере не существует способа раздать друзьям подарки, не нарушая при этом правил. В третьем примере выбрать подарки можно двумя способами: - Выбрать мячики размера 3, 4 и 5.
- Выбрать мячики размера 972, 970 и 971.
| |
|
|
B. Отбор на олимпиаду
Конструктив
сортировки
*1300
Совсем скоро в Берляндии состоится школьная командная олимпиада по программированию. От каждого из m регионов Берляндии для участия в олимпиаде приглашается команда из двух человек. Для формирования команд было решено провести отборочное соревнование, в котором приняли участие n берляндских школьников, причём от каждого из m регионов в нем участвовали хотя бы два школьника. Результатом каждого из участников отборочного соревнования является целое число баллов от 0 до 800 включительно. Команда каждого региона формируется из двух таких участников отборочного соревнования от этого региона, что никого из них нельзя заменить школьником того же региона, не вошедшим в команду и набравшим большее число баллов. Может возникнуть ситуация, когда команду какого-либо региона нельзя сформировать однозначно, то есть существует больше одной команды школьников, удовлетворяющих описанному выше свойству. В таком случае в этом регионе требуется провести дополнительное соревнование. Две команды региона считаются различными, если существует хотя бы один школьник, который входит в одну команду и не входит в другую. Гарантируется, что в каждом регионе хотя бы два школьника участвовали в отборе. Перед вами стоит задача, по результатам отборочного соревнования определить команду от каждого региона или сообщить, что в этом регионе для её формирования потребуется дополнительное соревнование. Выходные данные Выведите m строк. В i-й строке выведите команду i-го региона — фамилии двух участников команды в произвольном порядке или единственный символ «?» (без кавычек), если в этом регионе потребуется провести дополнительное соревнование. Примечание В первом примере команды от регионов определяются однозначно. Во втором примере команда от региона 2 определяется однозначно, а от региона 1 подходят три команды: «Petrov»-«Sidorov», «Ivanov»-«Sidorov», «Ivanov»-«Petrov», поэтому однозначно команду определить невозможно.
| |
|
|
F. Поликарп и сено
графы
жадные алгоритмы
поиск в глубину и подобное
снм
сортировки
*2000
У фермера Поликарпа есть склад с сеном, который можно представить как прямоугольную таблицу n × m, где n — количество строк, а m — количество столбцов в таблице. В каждой клетке таблицы содержится стог сена. Высота в метрах стога, расположенного в i-й строке и j-м столбце, равна целому числу ai, j и совпадает с количеством кубометров сена в данном стоге, поскольку все клетки имеют размер основания 1 × 1. Поликарп решил навести на складе порядок, сняв некоторое целое количество кубометров сена с верхушки каждого стога. С разных стогов разрешается снимать различный объем сена. В том числе стог разрешается не трогать совсем или, наоборот, убирать полностью. Если стог убран полностью, то соответствующая клетка становится пустой и стога более не содержит. Поликарп хочет, чтобы после реорганизации выполнялись следующие требования: - суммарный объём сена на складе должен быть в точности равен k,
- высоты всех стогов (то есть клеток, содержащих ненулевое количество сена) должны быть одинаковыми,
- высота хотя бы одного стога должна остаться такой же, как была,
- для устойчивости оставшейся конструкции все стога должны представлять собой одну связную область.
Два стога считаются соседними, если они имеют общую сторону в таблице. Область называется связной, если от любого стога этой области можно добраться до любого другого стога этой области, двигаясь только по соседним стогам. При этом два соседних стога обязательно принадлежат одной области. Помогите Поликарпу выполнить это нелёгкое задание или сообщите, что это невозможно. Выходные данные В первой строке выведите «YES», если Поликарп сможет совершить реорганизацию, и «NO» в противном случае. Если ответ «YES», то в следующих n строках выведите по m чисел — высоты оставшихся стогов. Все оставшиеся ненулевые значения должны быть равны, представлять собой связанную область, и хотя бы одно из этих значений не должно быть изменено. Если существует несколько ответов, разрешается вывести любой из них. Примечание В первом примере ненулевые значения составляют связную область, значения не превосходят начальных высот стогов. Все ненулевые значения равны 7, а их количество равно 5, значит суммарный объём оставшегося сена равен требуемому значению k = 7·5 = 35. При этом стог, находящийся во второй строке и третьем столбце, остался нетронутым.
| |
|
|
F. Четыре делителя
дп
математика
сортировки
Структуры данных
теория чисел
*2400
Если число a делится на число b, то b называется делителем числа a. К примеру, у числа 12 есть 6 положительных делителей. Это числа 1, 2, 3, 4, 6 и 12. Определим функцию D(n) — количество чисел от 1 до n (включительно), которые имеют ровно четыре положительных делителя. Между числами 1 и 10 только числа 6, 8 и 10 имеют четыре положительных делителя. Таким образом, D(10) = 3. Вам задано число n. Найдите значение D(n). Выходные данные Выведите единственное целое число c — количество чисел от 1 до n (включительно) с ровно четырьмя положительными делителями.
| |
|
|
C. Поход в кино
реализация
сортировки
*1300
В Москве проходит крупная международная конференция, на которую приехали n ученых из разных стран. Каждый из ученых говорит ровно на одном языке. Для удобства пронумеруем все языки мира целыми числами от 1 до 109. Вечером после конференции все n учёных решили сходить в кино. В кинотеатре, в который они пришли, показывают m фильмов. Каждый из фильмов характеризуется двумя различными числами — номером языка озвучивания bi, а также номером языка субтитров ci. Учёный, пришедший на фильм, будет очень доволен, если знает язык озвучивания фильма, будет почти доволен, если знает язык субтитров, и будет совсем недоволен, если не знает ни того, ни другого (обратите внимание, что языки озвучивания и субтитров у каждого фильма всегда различны). Учёные решили все вместе пойти на один и тот же фильм. Вам предстоит помочь им выбрать такой фильм, при просмотре которого будет максимально возможное количество очень довольных учёных. Если таких фильмов несколько, нужно выбрать из них такой, при просмотре которого будет максимально возможное количество почти довольных учёных. Выходные данные Выведите единственное целое число — номер фильма, на который должны пойти учёные. При просмотре этого фильма должно быть максимально возможное количество очень довольных учёных. Если таких фильмов несколько, нужно выбрать из них такой, при просмотре которого будет максимально возможное количество почти довольных учёных. Если ответов несколько, разрешается вывести любой из них. Примечание В первом тестовом примере учёные должны пойти на фильм номер 2, так как в этом случае 1-й и 3-й учёные будут очень довольны, а 2-й учёный будет почти доволен. Во втором тестовом примере учёные могут пойти либо на фильм номер 1, либо на фильм номер 3. При просмотре любого из этих фильмов ровно два учёных будут очень довольны, а все остальные будут совсем недовольны.
| |
|
|
C. Денежные операции
жадные алгоритмы
Конструктив
сортировки
Структуры данных
*2100
В Васином городе есть n банков, расположенных по кругу так, что соседними являются банки, номера которых различаются на 1, а также банк номер 1 и банк номер n (если n > 1). При этом, сам себе банк соседом не является. В каждом банке у Васи есть счёт с каким-нибудь балансом. Заметим, что он может быть и отрицательным, если Вася должен банку. Васе доступна следующая операция: взять два соседних банка и перечислить со счёта в одном банке на счёт в другом любое количество денег. При этом нет никаких ограничений на размер переводимой суммы или текущее состояние счёта в любом из банков. Вася путается в больших числах, поэтому он просит вас определить, за какое минимальное количество операций он может обнулить сумму денег, лежащую на счёте в каждом из банков. Гарантируется, что Вася может это сделать, то есть суммарный баланс Васи по всем банкам равен нулю. Выходные данные Выведите минимальное количество операций, за которое Вася может обнулить баланс в каждом банке. Примечание В первом примере можно перечислить из первого банка в третий сумму 5. Во втором примере можно перечислить сначала из третьего банка во второй, а потом из второго в первый сумму 1. В третьем примере одним из оптимальных ответов является следующая последовательность действий: - перечислить из первого банка во второй сумму 1;
- перечислить из второго банка в третий сумму 3;
- перечислить из третьего банка в четвертый сумму 6.
| |
|
|
E. Побег в тень
геометрия
сортировки
*2500
Дима живёт в общежитии, а вместе с ним в комнате живут тараканы. В момент времени 0 Дима увидел ползущего по столу таракана и сразу захотел его убить. Диме нужно ровно T секунд, чтобы прицелиться, после чего точным ударом он убьёт ползущее насекомое. Чтобы выжить, таракану нужно за T секунд успеть забежать в тень, которую отбрасывают стоящие на столе тарелки. Тень, отбрасываемая каждой из тарелок, имеет форму круга, при этом круги тени, отбрасываемые разными тарелками, могут пересекаться и вкладываться друг в друга произвольным образом. Таракан поступает так: он равновероятно выбирает направление движения, после чего бежит по прямой в выбранном направлении с постоянной скоростью v. Если в некоторый момент времени t ≤ T таракан оказывается в тени, то он останавливается и выживает, в противном случае Дима успевает прицелиться и уничтожить его точным ударом. Считайте, что точный удар Димы происходит мгновенно. Определите вероятность того, что таракан выживет. Выходные данные Выведите единственное вещественное число p — вероятность того, что таракан выживет. Ответ будет засчитан, если его относительная или абсолютная погрешность не превысит 10 - 4. Примечание Первый пример можно изобразить так:  Красным цветом окрашены зоны, выбрав точку в которых в качестве направления движения, таракан будет убит, зеленым же окрашены зоны, выбор точек в которых в качестве направления позволяют таракану выжить. Заметьте, что зона, содержащая круг с центром в точке ( - 2, 2), окрашена в красный, так как таракан не успевает добежать до этого круга за одну секунду.
| |
|
|
B. Алёна и mex
сортировки
*1200
Пухленькой девочке Алёне дали массив из n целых положительных чисел a1, a2, ..., an. Мама разрешила Алёне выбирать произвольный элемент массива и уменьшать его так, чтобы он оставался целым положительным числом, произвольное количество раз (возможно, ноль). Формально, после таких операций Алёна получит массив из n целых чисел b1, b2, ..., bn, такой что 1 ≤ bi ≤ ai для всех 1 ≤ i ≤ n. Сообщите, какое максимальное значение может принимать mex получившегося массива. mex массива в данной задаче — минимальное целое положительное число, не содержащееся в массиве. Например, mex массива 1 3 4 равен 2, а mex массива 2 3 2 равен 1. Выходные данные Выведите единственное целое положительное число — максимальное значение, которое может принимать mex массива после применения Алёной произвольного (возможно, нулевого) количества операций. Примечание В первом примере можно уменьшить второй элемент массива до 2, а пятый элемент — до 4, тогда mex получившегося массива 1 2 3 3 4 будет равен 5. Во втором примере для достижения максимального значения ничего уменьшать не нужно.
| |
|
|
D. Кай и вечность
Перебор
реализация
сортировки
*2600
Снежная королева, уходя, дала Каю задание выложить из льдинок слово «вечность». Кай очень серьёзно взялся за задание, поскольку если Кай сумеет это сделать, то он станет сам себе господин, и ему подарят весь мир и пару коньков. Под дворцом Снежной королевы расположено бесконечное клеточное поле. На нём хаотично разбросаны n льдинок, причём каждая льдинка лежит в центре ячейки клеточного поля и никакие две льдинки не лежат в одной ячейке. Для оценки сложности задания Кай смотрит на некоторые квадраты размера k × k с углами, лежащими в узлах поля, и сторонами, параллельными осям координат, и считает количество льдинок внутри квадрата. Однако так Кай смотрит только на сложность какого-то фрагмента поля. Для того чтобы правильно оценить сложность всего поля в целом, Кай придумал такой критерий: для каждого x (1 ≤ x ≤ n) он хочет узнать количество квадратов k × k с углами, лежащими в узлах поля, и сторонами, параллельными осям координат, в которых содержится ровно x льдинок. Помогите Каю оценить сложность задания, полученного от Снежной королевы. Выходные данные Выведите n чисел: количество квадратов k × k, содержащих ровно 1, 2, ..., n льдинок соответственно.
| |
|
|
B. Зверинец маленькой разбойницы
Конструктив
реализация
сортировки
*1100
Неугомонная маленькая разбойница любит наблюдать за испугом животных в своём зверинце. Однажды ей вздумалось выстроить их по неубыванию роста. Когда она им приказала выстроиться, они настолько перепугались, что сделали это неправильно. Маленькая разбойница рассердилась было, но ей вдруг пришла в голову странная затея. Она решила попробовать сама расставить зверей как надо. Для этого она иногда называет числа l и r, такие что число r - l + 1 чётно. После этого все звери, стоящие на позициях с l по r включительно, меняются местами: зверь на позиции l меняется со зверем на позиции l + 1, зверь на позиции l + 2 меняется со зверем l + 3, ..., наконец, зверь на позиции r - 1 меняется со зверем r. Помогите маленькой разбойнице расставить всех животных в порядке неубывания роста. Вам нужно назвать не более 20 000 отрезков, так как после совершения слишком большого количества операций маленькой разбойнице надоест, и она начнёт снова пугать зверей. Выходные данные Выведите последовательность действий, которая расположит зверей в порядке неубывания роста. В ответе должно быть записано несколько строк, i-ая из которых должна содержать два числа li и ri через пробел (1 ≤ li < ri ≤ n) — описания отрезков, которые должна называть маленькая разбойница. Отрезки должны быть записаны в порядке применения операций. Количество операций не должно превышать 20 000. Если звери стоят в порядке неубывания роста изначально, разрешается не выводить ничего. Примечание Обратите внимание, что не требуется минимизировать число совершённых операций. Достаточно, чтобы их было не больше 20 000.
| |
|
|
D. Разделение королевства II
графы
Перебор
снм
сортировки
Структуры данных
*2500
Давным-давно существовало великое королевство, которым правили Великий Арий и Пари Великая. У этих двоих были некоторые разногласия по вопросу любимых чисел, поэтому они решили разделить королевство между собой. Великое королевство состояло из n городов, пронумерованных целыми числами от 1 до n, и m двунаправленных дорог, пронумерованных от 1 до m. Длина i-й из этих дорог равняется wi. Великий Арий и Пари Великая договорились уничтожить некоторый префикс дорог (все дороги с номером меньше некоторого x) и некоторый суффикс дорог (все дороги с номером больше некоторого x), оставив таким образом дороги с номерами l, l + 1, ..., r - 1 и r. После этого они разделят королевство на две части (каждый город отойдёт ровно к одной из двух частей), такие что трудность разделения будет минимальна. Трудностью разделения называется максимальная длина дороги, такой что оба её конца принадлежат одной части. В случае если таких дорог вообще нет, трудность разделения полагается равной - 1. Историки обнаружили карту великого королевства и теперь обсуждают q возможных сценариев выбора параметров l и r великими правителями. По имеющимся данным для каждой гипотезы li, ri определите минимально возможную трудность разделения королевства. Выходные данные Для каждой догадки историков выведите минимально возможную трудность разделения королевства.
| |
|
|
C. Счастливые билеты
Бинарный поиск
сортировки
Структуры данных
*2200
В Моржландии билеты общественного транспорта характеризуются двумя целыми числами: номером серии и номером билета в этой серии. Пусть номер серии будет обозначаться a, а номер билета — b, тогда билет описывается упорядоченной парой чисел (a, b). У моржей существует примета, что билет счастливый, если a * b = rev(a) * rev(b). Функция rev(x) переворачивает число, записанное в десятичной системе счисления, при этом ведущие нули исчезают. Например, rev(12343) = 34321, rev(1200) = 21. Комитет управления общественным транспортом хочет выпустить x серий, по y билетов в каждой, так, чтобы всего было выпущено как минимум w счастливых билетов, а общее количество выпущенных билетов (x·y) было минимально. Серии нумеруются от 1 до x (включительно), билеты в каждой нумеруются от 1 до y (включительно). Транспортный комитет не может выпускать более maxx серий и более maxy билетов в одной серии. Выходные данные Выведите в единственной строке через пробел пару чисел x и y, если возможных ответов несколько — выведите любой. Если таких x и y не существует — выведите единственное число - 1.
| |
|
|
B. Контрольные пункты
жадные алгоритмы
реализация
сортировки
*1500
Спортсмен Вася участвует в соревнованиях по спортивному ориентированию. На соревновательной прямой расположены n контрольных пунктов с координатами x1, x2, ..., xn. Вася стартует из точки с координатой a. Ему необходимо посетить как минимум n - 1 контрольный пункт, чтобы финишировать. Участники могут посещать контрольные пункты в произвольном порядке. Васю интересует, какие контрольные пункты и в каком порядке ему нужно посещать, чтобы пройденное им расстояние было минимально возможным. Помогите ему вычислить это расстояние. Выходные данные Выведите одно целое число — минимальное суммарное расстояние, которое нужно пройти Васе, чтобы посетить как минимум n - 1 контрольный пункт. Примечание В первом примере требуется посетить хотя бы два контрольных пункта. Оптимальный вариант — сначала дойти до третьего (расстояние 12 - 10 = 2), а потом до второго (расстояние 12 - 7 = 5). Итоговое расстояние равняется 2 + 5 = 7. Во втором примере достаточно посетить один контрольный пункт, поэтому оптимально будет направиться в точку - 10.
| |
|
|
B. Оптимальная точка на прямой
Перебор
сортировки
*1400
Вам задано n точек на прямой своими координатами xi. Найдите точку x такую, что сумма расстояний от неё до остальных точек минимальна. Выходные данные Выведите одно целое число x — положение оптимальной точки на прямой. Если существует несколько оптимальных точек выведите положение самой левой из них. Гарантируется, что ответ всегда является целым числом.
| |
|
|
C. Соня и задача без легенды
дп
сортировки
*2300
Сова Соня не придумала легенду к этой задаче и просто написала вам формальное условие. Дан массив длины n, содержащий целые положительные числа. За одну операцию можно увеличить или уменьшить на 1 любое число в массиве. Требуется сделать массив строго возрастающим за минимальное количество операций. Числа можно изменять произвольным образом, в том числе они могут стать отрицательными или равными 0. Выходные данные Выведите одно число — минимальное количество операций, которое потребуется применить, чтобы массив стал строго возрастающим. Примечание В первом примере массив после изменений будет выглядеть так: 2 3 5 6 7 9 11 |2 - 2| + |1 - 3| + |5 - 5| + |11 - 6| + |5 - 7| + |9 - 9| + |11 - 11| = 9 Во второй примере так: 1 2 3 4 5 |5 - 1| + |4 - 2| + |3 - 3| + |2 - 4| + |1 - 5| = 12
| |
|
|
B. Филя и задание
реализация
сортировки
*1200
Сегодня ёжик Филя впервые пошёл в школу! Учительница дала ему домашнее задание, с которым ёжик, к сожалению, не может справиться без вашей помощи. У Фили есть массив целых неотрицательных чисел a1, a2, ..., an. Он сначала один раз выбирает целое положительное число x, после чего он к некоторым числам массива прибавляет данное x (не более одного раза к каждому элементу массива), из некоторых вычитает x (не более одного раза к каждому элементу массива), а некоторые числа оставляет нетронутыми. Нужно сказать, можно ли таким образом сделать массив из одинаковых чисел. Филя хочет знать, можно ли так выбрать x, а затем совершить такие действия, что в итоге массив будет состоять из одинаковых чисел. Выходные данные Если c помощью описанной в условии операции невозможно сделать все числа в массиве одинаковыми, то выведите «NO» (без кавычек). В противном случае выведите «YES» (без кавычек). Примечание В первом примере следует выбрать x = 1, после чего прибавить его к первому и последнему элементам и вычесть из второго и третьего.
| |
|
|
C. Домашняя работа по зельеварению
реализация
сортировки
*1200
Харри Хоттер, Роналдо, Герман и их друзья приступили к занятиям в новом учебном году в MDCS школе Ораторства и Страдания. Сейчас они очень счастливы встретить друг друга спустя долгое время. Солнышко сияет, птички поют, цветы распускают свои бутоны, а преподаватель зельеварения, профессор Сноб такой же надутый как и всегда. Из-за своей внутренней злобы и разочарования в жизни он задал ученикам много домашней работы. Каждому из n учеников была дана ровно одна задача. Некоторые студенты справляются с задачами быстрее, чем другие. Они хотят перераспределить задания таким образом, что каждому из них по-прежнему достанется ровно одна задача. У каждого студента есть его уровень лени, а у каждой задачи есть своя сложность. Профессор Сноб пытается повышать рабочую этику, поэтому каждому ученику была выдана задача, сложность которой равна уровню лени данного ученика. Оба значения определяются последовательностью a, где ai равняется одновременно уровню лени и сложности задания, полученного студентом i. Время, которое потребуется студенту на выполнение задания, равняется произведению его уровня лени на сложность задачи. Студентам интересно, чему равно минимальное суммарное время выполнения заданий, если они перераспределят их оптимальным способом. При этом каждый студент должен сделать ровно одно задание. Ответ выведите по модулю 10 007. Выходные данные Выведите минимальное суммарное время выполнения заданий по модулю 10 007. Примечание В первом примере, если ученики поменяются задачами, то время выполнения составит 3 + 3 = 6.
| |
|
|
D. Слалом
дп
сортировки
Структуры данных
*3100
Девочка Маша очень любит зимние виды спорта, и сегодня ей предстоит пройти лыжный слалом. Трасса схематически представляет из себя клетчатый прямоугольник n × m. На поле размещены прямоугольные препятствия, занимающие некоторые клетки. Маша должна добраться из клетки с координатами (1, 1), в клетку (n, m). При этом из каждой клетки можно перейти либо на одну клетку вверх, либо на одну клетку вправо. В клетки, в которых расположены препятствия, попадать нельзя. Таким образом, каждое препятствие можно обойти двумя способами: оно останется либо слева от траектории движения по трассе, либо справа. Маша любит разнообразие, и ей интересно, сколько существует различных способов пройти трассу. Проходы трассы считаются различными, если существует хотя бы одно препятствие, которое в одном проходе находится слева, а в другом справа от траектории Маши. Ваша задача — помочь Маше узнать количество различных способов пройти трассу. Ответ может быть большим и Машу устроит значение по модулю 109 + 7. На рисунках ниже разобраны тесты из условия.  Выходные данные В выходной файл выведите единственное число — остаток от деления количества различных способов пройти трассу на число 109 + 7.
| |
|
|
B. Пароли
математика
реализация
сортировки
Строки
*1100
Ваня собирается зайти на свой любимый сайт Codehorses. Всего Ваня использует n различных паролей для сайтов, однако, какой именно пароль он указывал при регистрации на Codehorses, он не помнит. Ваня будет вводить пароли в порядке неубывания их длин, а пароли одинаковой длины — в произвольном порядке. Как только Ваня введет правильный пароль, он сразу окажется авторизован на сайте. Ваня не будет вводить один и тот же пароль несколько раз. На ввод любого пароля Ваня тратит одну секунду. Однако, если Ваня k раз введет неправильный пароль, то следующую попытку ввода он сможет совершить только через 5 секунд. Каждую попытку ввода Ваня совершает незамедлительно, то есть всегда, когда у него есть возможность вводить очередной пароль, Ваня этим занят. Сообщите, сколько секунд потребуется Ване, чтобы зайти на Codehorses, в лучшем для него случае (если он потратит минимально возможное количество секунд) и в худшем для него случае (если он потратит максимально возможное количество секунд). Выходные данные Выведите два целых числа — время (в секундах), которое потребуется Ване для авторизации на Codehorses в лучшем для него случае и худшем для него случае соответственно. Примечание Рассмотрим первый тест. Так как все пароли одинаковой длины, Ваня может ввести правильный пароль как первым, так и последним. Если он вводит правильный пароль первым, то он тратит на это ровно 1 секунду. Следовательно, ответ в лучшем случае равен 1. Если же он вводит его последним, до этого он введёт остальные 4 пароля. Он потратит 2 секунды на ввод первых 2 неправильных паролей, после этого ему придется подождать 5 секунд, так как он ввёл 2 неправильных пароля. Потом он потратит ещё 2 секунды на ввод 2 неправильных паролей, опять подождёт 5 секунд и наконец введёт верный пароль, потратив на это ещё 1 секунду. Итого в худшем случае он сможет авторизоваться за 15 секунд. Рассмотрим второй тест. Как бы Ваня ни вводил пароли, он не сможет добиться того, чтобы доступ к сайту заблокировался. Так как необходимый пароль имеет длину 2, Ваня в любом случае введёт сначала все пароли длины 1, потратив на это 2 секунды. Затем, в лучшем случае, он сразу введёт необходимый пароль, и ответ в лучшем случае будет равен 3, а в худшем случае сначала введёт неверный пароль длины 2, и только потом верный, и потратит 4 секунды.
| |
|
|
A. Новый год: встреча друзей
математика
реализация
сортировки
*800
В Лайнландии на прямой Ox живут три друга. Первый живет в точке x1, второй живет в точке x2, а третий — в точке x3. Они собираются вместе встретить Новый Год, для чего им необходимо всем оказаться в одной точке. Какое минимальное суммарное расстояние им надо пройти, чтобы собраться вместе в одной точке и встретить Новый год? Гарантируется, что правильный ответ всегда является целым числом. Выходные данные Выведите единственное целое число — минимальное суммарное расстояние, которое нужно пройти друзьям, чтобы собраться вместе. Примечание В первом тестовом примере друзья должны встретиться в точке 4. Таким образом, первый друг должен пройти расстояние 3 (от точки 7 до точки 4), второй друг также должен пройти расстояние 3 (от точки 1 до точки 4), а третий друг не должен никуда идти, так как живёт в точке 4.
| |
|
|
C. Трассировка луча
жадные алгоритмы
математика
реализация
сортировки
теория чисел
хэши
*1800
В прямоугольной комнате размером n на m метров расположено k датчиков, датчик номер i расположен в точке с координатами (xi, yi). Все датчики расположены в различных точках, находящихся строго внутри прямоугольника. Противоположные углы комнаты находятся в точках с координатами (0, 0) и (n, m). Стены комнаты расположены параллельно осям координат. В момент времени 0, из точки (0, 0) в направлении точки (1, 1) выпускается лазерный луч. Луч летит со скоростью метров в секунду. Таким образом, луч окажется в точке (1, 1) ровно через одну секунду после старта. При столкновении со стеной луч отражается по закону, что угол падения равен углу отражения. При попадании луча в любой из четырёх углов комнаты он останавливается. Определите для каждого датчика первый момент времени, когда луч пройдет сквозь точку, содержащую этот датчик. Для датчиков, через которые луч не пройдёт, выведите - 1. Выходные данные Выведите k целых чисел, i-е из которых должно равняться времени в секундах, через которое луч пройдёт через i-й датчик, или - 1, если этого не произойдёт. Примечание В первом примере луч пройдёт последовательно через точки со следующими координатами: (0, 0), (1, 1), (2, 2), (3, 3). Таким образом, через 3 секунды после вылета луч остановится в точке (3, 3). Во втором примере луч пройдёт последовательно через точки со следующими коорданатами: (0, 0), (1, 1), (2, 2), (3, 3), (2, 4), (1, 3), (0, 2), (1, 1), (2, 0), (3, 1), (2, 2), (1, 3), (0, 4). В этом примере луч остановится в точке (0, 4) через 12 секунд после вылета. За это время он отразится от стен в точках (3, 3), (2, 4), (0, 2), (2, 0) и (3, 1).
| |
|
|
C. Дорога до кинотеатра
Бинарный поиск
жадные алгоритмы
сортировки
*1700
Вася находится в центре проката машин и хочет как можно скорее добраться до кинотеатра. Сеанс, на который он уже купил билет, начнётся через t минут. Считайте, что есть прямая дорога от центра проката машин до кинотеатра длиной s километров. Введём систему координат так, что центр проката машин находится в точке 0, а кинотеатр находится в точке s. Известно, что по пути от центра проката машин до кинотеатра есть k заправочных станций, причём на всех можно заливать неограниченное количество топлива совершенно бесплатно! Считайте, что операция залива топлива осуществляется мгновенно. В центре проката есть n машин, i-я из которых характеризуется двумя числами ci и vi — стоимостью аренды машины и вместимостью её бака. Таким образом, на заправке нельзя заливать в машину топлива больше вместимости её бака vi. В центре проката все машины изначально полностью заправлены. Каждая из машин может ехать в одном из двух скоростных режимов: обычном и ускоренном. В обычном режиме машина проезжает 1 километр за 2 минуты, при этом тратит на это 1 литр топлива. В ускоренном режиме машина проезжает 1 километр за 1 минуту, при этом тратит на это 2 литра топлива. Режим может быть изменён в любой момент. Изменять режим разрешается неограниченное количество раз. Перед вами стоит задача выбрать машину с минимальной стоимостью аренды, на которой Вася успеет добраться до кинотеатра до начала своего сеанса, то есть не позднее, чем через t минут. Считайте, что в центре проката все машины изначально полностью заправлены. Выходные данные Выведите минимальную стоимость аренды подходящей машины, то есть такой, что Вася успеет добраться до кинотеатра до начала сеанса (не позднее, чем через t минут). Если ни одна из машин не подойдёт Васе, выведите -1. Примечание В первом примере Вася успеет доехать до кинотеатра вовремя на первой и третьей машине, но выгоднее поехать на первой, стоимость аренды которой равна 10, а объём топливного бака равен 8. Тогда до первой заправки Вася сможет доехать в ускоренном режиме за 3 минуты, потратив на это 6 литров топлива, а затем, заправив полный бак, он сможет проехать 2 километра в обычном режиме за 4 минуты, потратив на это 2 литра бензина. Оставшиеся 3 километра он проедет в ускоренном режиме за 3 минуты, потратив на это 6 литров бензина.
| |
|
|
E. Подчинённые
графы
жадные алгоритмы
Конструктив
сортировки
Структуры данных
*1900
В крупной компании работают n сотрудников, каждый из которых имеет уникальный номер от 1 до n. Из них ровно один сотрудник является главным, его номер равен s. Также известно, что все сотрудники, кроме главного, имеют ровно одного непосредственного начальника. Каждому из сотрудников было поручено подать информацию о том, сколько начальников у него есть (не только непосредственных). Под начальниками сотрудника понимается его непосредственный начальник, а также непосредственный начальник непосредственного начальника данного сотрудника, и так далее. Например, если в компании три сотрудника, первый из которых главный, у второго сотрудника непосредственный начальник — первый сотрудник, а у третьего сотрудника непосредственный начальник второй сотрудник, то у третьего сотрудника всего два начальника — один непосредственный и один не непосредственный. Главный сотрудник является начальником всех сотрудников, кроме самого себя. Некоторые из сотрудников поторопились, ошиблись в подсчете и подали неверную информацию. Перед вами стоит задача определить минимально возможное число сотрудников, которые могли допустить ошибку при подаче информации. Выходные данные Выведите минимально возможное число сотрудников, которые могли допустить ошибку при подаче информации. Примечание В первом примере мог ошибиться, например, только первый сотрудник, в том случае, если: - у первого сотрудника начальником является второй сотрудник,
- у третьего сотрудника начальником является первый сотрудник,
- второй сотрудник является главным.
| |
|
|
B. Need For Brake
Бинарный поиск
жадные алгоритмы
сортировки
*2000
Вася играет в Need For Brake. Играет потому, что ему подарили на день рождения новенький компьютерный руль! Теперь то он уж точно займет первое место в чемпионате в его любимой компьютерной игре в жанре авто-симуляторов! В чемпионате, состоящем из некоторого количества заездов, принимают участие n гонщиков. По результатам каждого заезда гонщики занимают места с 1 по n-ое (никакие два гонщика не разделяют одно место) и первые m мест являются призовыми. За i-ое призовое место гонщик получает bi очков, которые прибавляются к его очкам, заработанным за все предыдущие заезды. Известно, что к данному моменту гонщик i набрал ai очков. По итогам чемпионата гонщики сортируются в порядке убывания суммы очков. При равном количестве очков сортировка производится по возрастанию имени гонщика в лексикографическом порядке. К сожалению, чемпионат уже подошел к концу и остался всего лишь один заезд. Вася решил узнать какое самое высокое и самое низкое место он может занять по итогам чемпионата. Выходные данные Вывести два числа — самое высокое и самое низкое места, которые может занять Вася по итогам чемпионата.
| |
|
|
D. Археология 80-го уровня
жадные алгоритмы
Перебор
сортировки
Структуры данных
*2200
Археологи, найдя секретный ход в подземелье одной из пирамид в Цикляндии, столкнулись с необычным замком на двери в сокровищницу. На замке было написано n слов, каждое из которых состоит из нескольких иероглифов. Рядом с замком на стене был обнаружен необычный круглый рычаг, поворот которого меняет иероглифы, из которых состоят слова на замке, по некоторому принципу. Также рядом с иероглифом была найдена надпись на древнецикляндском, которая гласит, что замок откроется, только если слова, написанные на замке, станут идти в лексикографическом порядке (определение дано в пояснении). Несмотря на то, что археологи отлично знали весь древнецикляндский алфавит, который состоял из c иероглифов, они никак не могли определить закономерность, по которой меняются буквы. Наконец кто-то догадался позвать вас, главного мыслителя современной Цикляндии. Вам хватило одного взгляда, чтобы понять, что поворот рычага на одну позицию по часовой стрелке заменяет каждый иероглиф на следующий за ним по алфавиту, то есть x-й (1 ≤ x ≤ c - 1) иероглиф превращается в (x + 1)-й, а c-й превращается в первый. Помогите археологам определить, на сколько позиций по часовой стрелке надо повернуть рычаг, чтобы можно было открыть дверь, либо определите, что требуемого положения рычага не существует, и надо либо искать ещё какой-нибудь потайной рычаг, либо идти за динамитом. Выходные данные Если возможно открыть дверь, поворачивая рычаг, выведите число x (0 ≤ x ≤ c - 1), обозначающее, сколько раз его надо повернуть по часовой стрелке. Если подходящих значений x несколько, выведите любое из них. Если, поворачивая рычаг, дверь открыть невозможно, выведите - 1. Примечание Слово a1, a2, ..., am длины m лексикографически не превосходит слова b1, b2, ..., bk длины k, если выполняется одно из двух: - либо в первой позиции i, такой что ai ≠ bi, символ ai идёт раньше по алфавиту, чем символ bi, то есть в первой различающейся позиции символ слова a меньше символа слова b;
- либо (если такой позиции нет) m ≤ k, то есть второе слово начинается с первого либо совпадает с ним
Про последовательность слов говорят, что они идут в лексикографическом порядке, если каждое слово в нём (кроме последнего) лексикографически не превосходит следующего за ним. В первом примере после поворота рычага на 1 позицию по часовой стрелке слова примут следующий вид: 1 3 2 3 1 2 3 1 2 3
Во втором примере слова уже идут в лексикографическом порядке. Можно проверить, что в последнем примере, какой бы сдвиг мы ни применили, слова не станут идти в лексикографическом порядке.
| |
|
|
D. Экзамены
Бинарный поиск
жадные алгоритмы
сортировки
*1700
Впереди у студента Васи сессия, которая будет длиться n дней. Васе предстоит сдать экзамены по m предметам. Предметы пронумерованы от 1 до m. Про каждый день известно, какой из m предметов можно сдать в этот день. Возможно, что в какой-то день нельзя сдавать ни один предмет. Однако в каждый день можно сдавать не более одного предмета. В очередной день Вася может либо сдавать экзамен по тому предмету, который можно сдавать в этот день (сдача занимает весь день), либо готовиться весь день к экзамену по некоторому предмету, либо отдыхать. Про каждый из предметов Вася знает число ai — количество дней, которые нужно готовиться, чтобы сдать экзамен по предмету номер i. Вася может переключаться между подготовкой к экзаменам, то есть необязательно готовиться непрерывно ai-е дней к экзамену номер i. Перемешивать порядок подготовки к экзаменам можно произвольным образом. Перед вами стоит задача определить минимальный номер дня, в который Вася сможет закрыть сессию — то есть сдать экзамены по всем предметам, либо определить, что это невозможно сделать. Экзамен по каждому предмету нужно сдать ровно один раз. Выходные данные Выведите целое число — минимальный номер дня, в который Вася сможет сдать все экзамены. Если это невозможно, выведите -1. Примечание В первом тестовом примере Вася может дейстовать следующим образом. В первый и второй день готовиться к экзамену номер 1 и сдать его в пятый день, а между этим подготовиться к экзамену номер 2 в третий день и сдать его в четвёртый. Во втором тестовом примере Вася должен готовиться к экзамену номер 3 первые четыре дня и сдать его в пятый день. Затем в шестой день подготовиться к экзамену номер 2 и сдать его в седьмой день. После этого ему нужно подготовиться к экзамену номер 1 за восьмой день и сдать его в девятый день. В третьей тестовом примере Вася не сможет сдать единственный экзамен, так как не успеет к нему подготовиться.
| |
|
|
E. Розетки
жадные алгоритмы
сортировки
*2100
Совсем скоро состоится финал чемпионата мира по программированию ICM ACPC! К сожалению, организаторы соревнования были так заняты подготовкой задач, что совершенно упустили важный технический момент — организацию электропитания рабочих мест участников. Всего для участников выделено n компьютеров, i-й из которых имеет мощность, задающуюся целым положительным числом pi. В то же время для подключения к электросети доступно m розеток, j-я из которых предоставляет электропитание мощностью, задающейся целым положительным числом sj. Подключить i-й компьютер к j-й розетке можно тогда и только тогда, когда их мощности совпадают, то есть pi = sj, а к одной розетке можно подключить не более одного компьютера. Таким образом, если, к примеру, мощности всех компьютеров и розеток попарно различны, то ни один компьютер не представляется возможным подключить ни к одной из розеток. Чтобы исправить ситуацию, профессор Пуч Вильямс в экстренном порядке заказал фургон переходников — делителей мощности. Каждый переходник представляет собой одну вилку и одну розетку с делителем напряжения между ними. После установки переходника на розетку мощности x, ее мощность становится равной , то есть делится пополам с округлением вверх, например и . Каждый переходник можно использовать лишь единожды. На розетку можно последовательно устанавливать несколько переходников, подсоединяя их один к другому. Например, установив на розетку мощности 10 два переходника, к ней станет можно подключить компьютер мощности 3. Организаторам предстоит установить переходники так, чтобы одновременно подключить максимальное количество компьютеров c. Если существует несколько возможных конфигураций подключения, организаторы хотят найти ту, которая использует минимальное число переходников u для подключения c компьютеров. Помогите организаторам найти максимально возможное число компьютеров c, которые можно подключить одновременно, а также минимальное число адаптеров u, необходимых для этого. Фургон переходников содержит достаточное их количество для выполнения задачи. Гарантируется, что получится подключить хотя бы один компьютер. Выходные данные В первую строку выведите два числа c и u — максимальное количество компьютеров, которые можно одновременно подключить, и минимальное количество переходников, чтобы подключить c компьютеров. Во второй строке выведите m целых чисел a1, a2, ..., am (0 ≤ ai ≤ 109), где ai равно количеству переходников, которые следует установить на i-ю розетку. Сумма всех ai должна быть равна u. В следующей строке выведите n целых чисел b1, b2, ..., bn (0 ≤ bi ≤ m), где bj-е равно номеру розетки, к которую следует подключить j-й компьютер. Значение bj = 0, что j-й компьютер не будет подключен к какой-либо розетке. Все bj, отличные от 0, должны быть попарно различны. Мощность j-го компьютера должна совпадать с мощностью розетки bj после установки abj переходников. Количество ненулевых bj должно быть равно c. Если ответов несколько, выведите любой.
| |
|
|
B. Урбанизация
жадные алгоритмы
сортировки
теория чисел
*1100
Местные власти узнали о комбинаторных способностях Остапа Бендера и обратились к нему за помощью в вопросе урбанизации. Имеется n человек, которые хотят переехать жить в города. Состояние i-го из них равняется ai. Планируется построить два города и поселить в первый из них n1 человек, а во второй — n2 человек. Разумеется, каждый из n кандидатов может быть поселён не более, чем в один город. Таким образом, некоторое подмножество кандидатов размером n1 будут поселены в первый город, из оставшихся некоторое подмножество кандидатов размера n2 будут поселены во второй город, а остальным будет отказано в поселении. Для улучшения показателей региона в глазах вышестоящего начальства местные власти решили выбрать соответствующие подмножества кандидатов таким образом, чтобы сумма средних арифметических состояний жителей этих двух городов была максимальна. Средним арифметическим состояний жителей города называется сумма всех состояний ai жителей города, поделённая на количество жителей (n1 или n2 соответственно). Деление следует осуществлять в вещественных числах без каких-либо округлений. Помогите местным властям найти оптимальный способ заселить два города. Выходные данные Выведите одно вещественное число — максимально возможную сумму средних арифметических состояний жителей двух городов. Ваш ответ будет считаться правильным, если его абсолютная или относительная ошибка не будет превосходить 10 - 6. А именно: пусть ваш ответ равен a, а ответ жюри — b. Проверяющая программа будет считать ваш ответ правильным, если . Примечание В первой примере одним из оптимальных решений будет поселить кандидата 1 в первый город, а кандидата 2 — во второй. Во втором примере оптимальным расселением будет назначить кандидатов 3 и 4 в первый город, а кандидата 2 — во второй. Получаем (a3 + a4) / 2 + a2 = (3 + 2) / 2 + 4 = 6.5
| |
|
|
E. Гоша выходит на охоту
дп
математика
Перебор
Потоки
сортировки
Структуры данных
Теория вероятностей
*3000
Гоша выходит на охоту. Его цель — поймать как можно больше покемонов. У Гоши есть a покеболов и b ультраболов. Всего покемонов n. Они пронумерованы числами от 1 до n. Про i-го покемона Гоша знает, что если бросить в него покеболом, то с вероятностью pi данный покемон будет пойман. Если бросить в i-го покемона ультраболом, то он будет пойман с вероятностью ui. В каждого покемона можно бросить не более чем одним болом каждого типа. Охота происходит следующим образом: Гоша сначала выбирает не более чем a покемонов, в которых он будет бросать покеболами, и не более чем b покемонов, в которых он будет бросать ультраболами. После этого Гоша бросает в выбранных покемонов выбранными болами. Если он бросает в покемона и покеболом, и ультраболом, то данный покемон будет пойман, если он будет пойман хотя бы одним из двух болов. Результаты бросков независимы. Гоша хочет узнать, чему равно математическое ожидание количества пойманных покемонов, если он будет действовать оптимально. Иными словами, он хочет узнать максимально возможное математическое ожидание. Выходные данные Выведите максимально возможное математическое ожидание количества пойманных покемонов. Ответ будет считаться правильным, если его относительная или абсолютная погрешность не превышает 10 - 4.
| |
|
|
D. Зима близко
дп
жадные алгоритмы
сортировки
*1800
В Берляндии зима длится n дней. Про каждый из дней известен прогноз на среднюю температуру воздуха. У Васи есть новый комплект зимней резины, на котором можно безопасно ездить не более k дней при любой средней температуре воздуха. Через k дней использования (независимо от температуры этих дней) комплект зимней резины изнашивается. Эти k дней могут идти не подряд. Перед первым днем зимы машина Васи всё еще на летней резине. На ней можно ездить безопасно любое количество дней, для которых средняя температура воздуха неотрицательна. Ездить на летней резине в дни, для которых средняя температура воздуха отрицательна, нельзя. Вася может переобувать свою машину с летней резины на зимнюю и наоборот в начале любого дня. Найдите минимальное количество раз, которое Васе нужно переобуть свою машину с летней резины на зимнюю и с зимней резины на летнюю, чтобы безопасно проездить всю зиму. По окончании зимы машина может быть на любой резине. Выходные данные Выведите минимальное количество раз, которое нужно переобуть машину с зимней резины на летнюю и с летней резины на зимнюю, чтобы безопасно проездить всю зиму. Если это невозможно, выведите -1. Примечание В первом примере Вася должен перед первым днем зимы поменять резину с летней на зимнюю, проездить на ней три дня, после чего переодеть резину с зимней на летнюю, так как безопасно на зимней резине можно ездить как раз три дня. Таким образом, суммарное количество смен резины равно двум. Во втором примере Вася должен перед первым днем зимы поменять резину с летней на зимнюю, затем после первого дня зимы поменять резину с зимней на летнюю. После второго дня нужно вновь поменять резину с летней на зимнюю, и после третьего дня поменять резину с зимней на летнюю. Таким образом, суммарное количество смен резины равно четырем.
| |
|
|
D. Федор и купоны
Бинарный поиск
жадные алгоритмы
сортировки
Структуры данных
*2100
Все наши герои имеют хобби. И Федор не исключение. Ему очень нравится ходить в супермаркет около дома и покупать всякие вещи. Все товары в супермаркете имеют уникальный целый номер. И для каждого уникального целого номера найдется ровно один товар в супермаркете. Так как Федор делает много покупок, ему хотелось бы посещать супермаркет с экономией. Поэтому у него есть n скидочных купонов. i-й купон действует на товарах с номерами с li-го по ri-й включительно. Сегодня он решил взять с собой в супермаркет ровно k купонов. Федор хочет выбрать k купонов так, чтобы количество таких товаров x, что на товар x действуют все купоны, было максимально (для лучшего понимания посмотрите примеры). Федор, кроме денег, ещё хочет сэкономить силы и время, поэтому просит вас сделать выбор купонов. Помогите Федору! Выходные данные В первой строке следует вывести единственное целое число — максимальное количество товаров, на которые действуют все купоны. То есть товар, на который не действует какой-то из выбранных купонов, не считается. В следующей строке выходных данных следует вывести k различных целых чисел p1, p2, ..., pk (1 ≤ pi ≤ n) — номера купонов, выбрав которые, мы получим максимальное количество товаров, на которые действуют все эти купоны. Если оптимальных ответов несколько, выведите любой. Примечание В первом примере, если Федор возьмет первые два купона, то они оба будут действовать на все товары в отрезке [40, 70]. Всего таких товаров 31. Во втором примере ни на один товар не действуют два купона, поэтому ответ 0. Федор может взять любые два купона в этом примере.
| |
|
|
B. Польшар и Игра
Бинарный поиск
жадные алгоритмы
игры
сортировки
Строки
Структуры данных
*1100
Польшар играет со Врагошаром в некоторую игру. Правила просты. Игроки по очереди называют слова, называть слово, которое уже прозвучало, нельзя. Начинает Польшар. Проигрывает тот шар, который не может сказать ранее неназванного слова. Вам даны списки слов, известных Польшару и Врагошару. Определите, кто выиграет, если оба играют оптимально? Выходные данные В единственной строке выведите ответ: «YES», если выиграет Польшар, и «NO» иначе. Оба шара играют оптимально. Примечание В первом примере Польшар знает намного больше слов и выиграет без труда. Во втором примере если Польшар скажет вначале kremowka, то Врагошар не сможет использовать это слово. Единственное, что может сделать Врагошар — сказать wiedenska. Польшар скажет wadowicka и выиграет.
| |
|
|
C. Фестиваль близко!
сортировки
Строки
Структуры данных
хэши
*1900
В это время года близок фестиваль и вы можете видеть празднующих людей повсюду в Гималаях. В Гималаях есть n школ. Школа i учит gi покемонов. В Гималаях существуют m различных типов покемонов, типы пронумерованы от 1 до m. На площадке фестиваля организован специальный эволюционный лагерь, в котором каждый покемон может эволюционировать. Тип покемона может измениться после того, как покемон эволюционирует, однако, если два покемона были одного типа до эволюционирования, то они будут одного типа после. Также, если два покемона были различных типов до эволюционирования, то они будут различными и после него. Возможно, что покемон не поменяет свой тип после эволюционирования. Формально, планом эволюционирования называется перестановка f чисел {1, 2, ..., m}, при этом f(x) = y означает, что покемон типа x эволюционирует в тип y. Руководители школ заинтригованы специальным лагерем, и все из них хотят эволюционировать всех своих покемонов. Устав Гималаев гласит, что в каждой школе количество покемонов каждого типа до эволюционирования должно быть равно количеству покемонов этого типа после эволюционирования. Руководители хотят найти количество различных планов эволюционирования, удовлетворяющих уставу Гималаев. Два плана эволюционирования f1 и f2 считаются различными, если как минимум один тип покемонов эволюционирует в разные типы в этих двух планов, то есть существует i такое, что f1(i) ≠ f2(i). Ваша задача — найти число различных планов эволюционирования таких, что если все покемоны во всех школах эволюционируют, количество покемонов каждого типа в каждой из школ останется таким же. Так как это число может быть большим, выведите остаток от его деления на 109 + 7. Выходные данные Выведите остаток от деления числа удовлетворяющих уставу планов эволюционирования на 109 + 7. Примечание В первом примере единственный корректный план эволюционирования выглядит так:  Во втором примере подходит любая перестановка чисел (1, 2, 3). В третьем примере есть два корректных плана:  В четвертом примере единственный корректный план эволюционирования выглядит так: 
| |
|
|
A. Подарок
графы
Деревья
снм
сортировки
*2200
В королевстве Олимпия находится N городов и M двусторонних дорог, каждая из которых соединяет ровно два города. Между двумя городами может быть более одной дороги. Дорога может соединять город с самим собой, образуя петлю. Все дороги постоянно грабятся разбойниками. В последнее время разбойникам надоело тратить силы на грабеж и они обратились к могущественному и справедливому королю Олимпии с коммерческим предложением. Согласно этому предложению король должен отправить разбойникам подарок, состоящий из золотых и серебряных монет. В ответ на любезность короля разбойники прекратят грабить определенные дороги. Для каждой из дорог установлено: gi — минимальное количество золотых и si — минимальное количество серебряных монет в подарке, чтобы ее грабеж закончился. То есть, если в подарке a золотых и b серебряных монет, то прекращается грабеж всех дорог, для которых gi ≤ a и si ≤ b. В казне короля нет ни одной золотой или серебряной монеты, но есть Олимпийские Тугрики. Цена одной золотой монеты в тугриках — G, а серебряной — S. Король хочет, чтобы после отправки подарка разбойникам между каждой парой городов существовал хотя бы один безопасный путь, который, возможно, проходит через другие города. Ваше задание найти минимальное количество тугриков, которую нужно потратить королю для того, чтобы получить безопасные пути между каждой парой городов в королевстве. Выходные данные Единственная строка должна содержать минимальное количество тугриков, которое нужно потратить королю на покупку золотых и серебряных монет, чтобы достичь своей цели. Выведите , в случае, если никакое количество тугриков не поможет.
| |
|
|
D. Даша и очень сложная задача
Бинарный поиск
жадные алгоритмы
Конструктив
Перебор
сортировки
*1700
Войдя в систему, Даша принялась решать задачи. Одна из них звучала следующим образом: По данным двум последовательностям a и b длины n необходимо построить последовательность c длины n, i-й элемент которой вычисляется следующим образом: ci = bi - ai. Об a и b также известно, что их элементы лежат в интервале от l до r. Более формально, выполняются равенства l ≤ ai ≤ r и l ≤ bi ≤ r. Про последовательность c известно, что все ее элементы различны. Решение задачи Даша написала быстро, но вот проверить ее работу на стандартном тесте оказалось не так просто. Из-за ошибки в системе тестирования из теста была известна только последовательность a и сжатая последовательность последовательности c. Дадим определение сжатой последовательности. Сжатой последовательностью последовательности c длины n будем считать такую последовательность p длины n, что pi равно количеству чисел, меньше либо равных чем ci, в последовательности c. К примеру, для последовательности c = [250, 200, 300, 100, 50] сжатой последовательностью является p = [4, 3, 5, 2, 1]. Обратите внимание, что в c все числа различны. Следовательно, сжатая последовательность содержит все числа от 1 до n включительно. Помогите Даше найти любую последовательность b, для которой посчитанная сжатая последовательность последовательности c верна. Выходные данные Если подходящей последовательности b не существует, то в единственной строке выходных данных выведите «-1». Иначе в единственной строке выходных данных должно содержаться n целых чисел — элементы любой подходящей последовательности b. Примечание Найденная во втором примере последовательность b является подходящей, потому что построенная последовательность c = [2 - 3, 2 - 4, 2 - 8, 9 - 9] = [ - 1, - 2, - 6, 0] (напомним, что ci = bi - ai) имеет сжатую последовательность равную p = [3, 2, 1, 4].
| |
|
|
B. USB vs. PS/2
жадные алгоритмы
реализация
сортировки
*1400
В связи с увеличением количества студентов в Берляндском государственном университете было решено оборудовать новый компьютерный кабинет. Вам было поручено купить мыши, и как можно дешевле, ведь в стране кризис! Компьютеры, заказанные для кабинета, оказались существенно разными. Некоторые из них имеют только порты USB, некоторые — только PS/2, а на некоторых присутствуют оба варианта. На сайте компьютерного магазина вы нашли прайс-лист, в котором для m мышей указаны цена и тип порта, к которому мышь можно подключить (USB или PS/2). Каждая мышь из списка есть в магазине в единственном экземпляре. Вы хотите купить некоторый набор мышей из данного прайс-листа так, чтобы в первую очередь максимизировать количество оборудованных мышами компьютеров (не гарантируется, что удастся оборудовать все компьютеры), а при равенстве этой величины минимизировать суммарную стоимость купленных мышей. Выходные данные Выведите два целых числа через пробел — количество оборудованных компьютеров и суммарную стоимость приобретённых мышей. Примечание В первом примере можно купить первые три мыши, оборудовав один из компьютеров с USB входом мышью с USB выходом, а две PS/2 мыши подключить к компьютеру с PS/2 и компьютеру с обоими входами.
| |
|
|
B. Махмуд и треугольник
геометрия
жадные алгоритмы
Конструктив
математика
сортировки
теория чисел
*1000
У Махмуда есть n отрезков, i-й из них имеет длину ai. Ехаб поспорил с ним, сможет ли он использовать ровно 3 отрезка для того, чтобы составить из них невырожеднный треугольник. Махмуд никогда не спорит, если не уверен, что может выиграть, поэтому он спросил вас, должен ли он принять этот вызов или нет. Вам даны длины отрезков, проверьте, можно ли выбрать ровно 3 из них, чтобы составить невырожденный треугольник. Махмуд должен использовать ровно 3 отрезка, он не может составить отрезок из двух или изменять какие-либо длины. Невырожденным считается треугольник с положительной площадью. Выходные данные В единственной строке выведите «YES», если можно выбрать ровно три отрезка и составить из них невырожденный треугольник, и «NO» иначе. Примечание В первом примере Махмуд может выбрать отрезки с длинами 2, 4 и 5 и составить из них невырожденный треугольник.
| |
|
|
D. Кефир
Бинарный поиск
жадные алгоритмы
сортировки
Структуры данных
*2100
Маленькая девочка Оля очень любит кефир. Каждый день она выпивает ровно k пакетов кефира, если их имеется хотя бы k, в противном случае — все, что есть. Но есть одна проблема: сроки годности. На каждом пакете написан день, позже которого этот пакет пить нельзя (ровно в этот день еще можно). Поэтому если в холодильнике у Оли в какой-то момент оказывается просроченный пакет, она его выкидывает. Оля очень не любит выкидывать пакеты с кефиром, поэтому она применяет следующую стратегию: каждый раз, когда надо выпить очередной пакет, она выбирает тот, у которого срок годности заканчивается раньше всего. Несложно видеть, что эта стратегия минимизирует количество выкинутых пакетов и, в частности, позволяет обойтись без выкидывания, если это вообще возможно. Но основная проблема, с которой столкнулась Оля, — это покупка нового кефира. Сейчас у Оли в холодильнике есть n пакетов кефира, про каждый известен его срок годности (через сколько дней он заканчивается). Оля пришла в магазин, и там есть m пакетов кефира, про каждый тоже известен его срок годности. Определите, какое максимальное количество пакетов может купить Оля так, чтобы потом не пришлось ничего выбрасывать. Считайте, что Оля сегодня еще не пила ни одного пакета кефира. Выходные данные Если в любом случае Оля не сможет выпить даже уже имеющиеся у нее пакеты, выведите ровно одно число -1. Иначе в первой строке выведите максимальное количество пакетов x, которые Оля может купить так, чтобы ничего не выбрасывать. В следующей строке выведите ровно x чисел — номера пакетов, которые следует взять (пакеты нумеруются в том порядке, в котором они заданы во входном файле, начинается с 1). Естественно, числа не должны повторяться, однако могут идти в произвольном порядке. Если существует несколько подходящих наборов, разрешается вывести любой. Примечание В первом примере из условия k = 2 и дома у Оли есть три пакета со сроками годности 0, 1 и 1 (т. е. истекающими сегодня, завтра и завтра), а в магазине есть 3 пакета со сроком годности 0 и 3 пакета со сроком годности 2. Оля может купить три пакета, например, один со сроком годности 0 и два со сроком годности 2. Во втором примере все три уже имеющихся пакета имеют срок годности, оканчивающийся сегодня, и поэтому Оля не успеет их выпить вне зависимости от того, возьмет ли она еще один пакет в магазине или нет. В третьем примере сегодня Оля выпьет k = 2 пакета (один уже имеющийся и один из магазина), а завтра — оставшийся один пакет.
| |
|
|
A. Клятва Ночного дозора
Конструктив
сортировки
*900
«Слушайте мою клятву и будьте свидетелями моего обета! Ночь собирается, и начинается мой дозор. Он не окончится до самой моей смерти. Я не возьму себе ни жены, ни земель, не буду отцом детям. Я не надену корону и не буду добиваться славы. Я буду жить и умру на своем посту. Я — меч во тьме. Я — дозорный на Стене. Я — щит, который охраняет царство людей. Я отдаю свою жизнь и честь Ночному Дозору в эту ночь и во все грядущие!» — Клятва Ночного дозора С этого начинается дозор Джона Сноу. Ему возложена задача поддержки стюардов. Сейчас у него имеется n стюардов, которым необходимо предоставить поддержку. Каждый стюард имеет собственную силу. Джон Сноу предпочитает поддерживать стюарда, если существует хотя бы один стюард с силой строго меньшей, чем его, и хотя бы один стюард с силой строго большей, чем у него. Можете ли вы ответить, сколько стюардов будет поддерживать Джон Сноу? Выходные данные Выведите единственное целое число — количесто стюардов, которым поможет Джон Сноу. Примечание В первом тестовом примере Джон Сноу не может поддержать стюарда с силой 1, потому что нет стюарда с силой меньше, чем 1. Также он не может поддержать стюарда с силой 5, потому что нет стюарда с силой больше, чем 5. Во втором тестовом примере Джон Сноу может поддержать стюарда с силой 2, потому что есть стюард с силой меньше, чем 2, и есть стюард с силой больше, чем 2.
| |
|
|
C. Джон Сноу и его любимое число
дп
Перебор
реализация
сортировки
*1800
Джон Сноу сражается с белыми ходоками. У него есть n рейнджеров, каждый из которых имеет свою силу. Также у Джона Сноу есть любимое число x. Каждый рейнджер может сражаться с белым ходоком, если сила этого белого ходока равна его силе. Однако он думает, что его рейнджеры слабые и нуждаются в улучшении. Джон думает, что если он возьмет побитовый XOR сил некоторых рейнджеров с его любимым числом x, то он может получить солдат с более высокой силой. Итак, он решил сделать следующую операцию k раз: - Расставить всех рейнджеров в ряд в порядке возрастания сил.
- Взять побитовый XOR (пишется как
) силы каждого второго рейнджера в ряду, начиная с самого первого, с числом x и обновить его силу.Предположим, что у Джона есть 5 рейнджеров с силами [9, 7, 11, 15, 5], и он выполняет операцию 1 раз с x = 2. Сначала он упорядочивает рейнджеров в порядке их сил, [5, 7, 9, 11, 15]. Далее он делает следующее: - Сила первого рейнджера обновляется значением
, то есть 7. - Сила второго рейнджера остается прежней, то есть равной 7.
- Сила третьего рейнджера обновляется значением
, то есть 11. - Сила четвертого рейнджера остается прежней, то есть равной 11.
- Сила пятого рейнджера обновляется значением
, то есть 13.
Новые силы 5 рейнджеров [7, 7, 11, 11, 13]. Теперь Джон хочет знать максимальную и минимальную силу рейнджеров после выполнения операций, описанных выше, k раз. Он хочет вашей помощи по этой задаче. Можете ли вы помочь ему?
Выходные данные Выведите два целых числа — максимальная и минимальная силы рейнджеров после выполнения k операций.
| |
|
|
A. Год поступления в университет
*особая задача
реализация
сортировки
*800
В Берляндском университете есть факультет компьютерных наук. В социальной сети «ЕстьКонтакт!» для каждого курса этого факультета есть специальная группа, название которой равно году поступления студентов соответствующего курса в университет. Каждый из студентов, учащихся в университете, всегда вступает в группу своего курса, а также во все группы, год поступления студентов в которые отличается не более чем на x от года поступления этого студента, где x — некоторое неотрицательное целое число. Значение x вам не дано, но оно может быть однозначно определено по имеющимся данным. Считайте, что в другие группы студенты не вступают. Вам задана информация о списке групп студента по имени Игорь, в которые он вступил. По этой информации вам необходимо определить год поступления Игоря в университет. Выходные данные Выведите год поступления Игоря в университет. Примечание В первом примере значение x = 1. Игорь поступил в университет в 2015-м году. Поэтому он вступил в группы студентов с годами поступления 2014, 2015 и 2016. Во втором примере значение x = 0. Игорь вступил лишь в одну группу, которая соответствует году его поступления.
| |
|
|
E. Оценивание блогпостов
сортировки
Структуры данных
*3000
Как известно, важной составляющей платформы Codeforces являются блогпосты. Каждый блогпост имеет глобальную характеристику, изменяющуюся во времени — оценку блогпоста сообществом. Когда блогпост только создан, его оценка сообществом равна 0. Пользователи Codeforces имеют право заходить на страницу блогпоста и оценивать его, изменяя его оценку сообществом на +1 или -1. Рассмотрим следующую модель поведения пользователей Codeforces. i-й пользователь имеет собственную оценку блогпоста, выраженную некоторым целым числом ai. Когда пользователь заходит на страницу с блогпостом, он сравнивает собственную оценку блогпоста с текущей оценкой блогпоста сообществом. Если собственная оценка оказалась выше, пользователь ставит блогпосту оценку +1 (таким образом, оценка блогпоста сообществом увеличивается на 1). Если собственная оценка ниже, пользователь ставит блогпосту оценку -1 (понижая его оценку сообществом на 1). Если оценки совпали, пользователь не ставит блогпосту ни +1, ни -1 (мы будем говорить, что в таком случае пользователь поставил блогпосту оценку 0). В любом случае, после данной процедуры пользователь закрывает блогпост и больше никогда к нему не возвращается. Рассмотрим некоторый только что созданный блогпост, исходная оценка которого сообществом равна 0. Про каждого из n пользователей Codeforces, пронумерованных от 1 до n, известна его собственная оценка данного блогпоста ai. Для каждого k от 1 до n, включительно, требуется ответить на следующий вопрос. Пусть пользователи с индексами от 1 до k в некотором порядке откроют страницу с данным блогпостом, оценят его и закроют страницу. Каждый пользователь открывает блогпост только после того, как его закрыл предыдущий пользователь. Какую максимальную оценку сообществом может иметь данный блогпост по итогам этих k просмотров? Выходные данные Для каждого k от 1 до n выведите целое число, равное максимальной возможной оценке блогпоста сообществом после того, как пользователи с индексами от 1 до k в некотором порядке зайдут на страницу с блогпостом, оценят его и закроют страницу.
| |
|
|
D. Правда или ложь
*особая задача
Конструктив
реализация
сортировки
*1500
У Васи есть последовательность кубиков, на каждом из которых написано ровно одно целое число. Вася любит порядок, поэтому выставил все свои кубики в ряд. Таким образом, последовательность чисел, записанных на кубиках в порядке слева направо равна a1, a2, ..., an. Пока Вася отсутствовал, его маленький брат Степан поиграл с кубиками и поменял местами некоторые из них, после чего последовательность чисел на кубиках стала выглядеть как b1, b2, ..., bn. Степан утверждает, что трогал только кубики, стоящие на позициях с l по r, не убирал и не добавлял другие кубики (иными словами, он переставил кубики на позициях с l по r произвольным образом). Перед вами стоит задача определить, возможна ли то, что Степан говорит правду, либо он гарантированно обманывает своего брата. Выходные данные Выведите «LIE» (без кавычек), если Степан гарантированно обманывает брата. В противном случае, выведите «TRUTH» (без кавычек). Примечание В первом примере возможна ситуация при которой Степан говорит правду. Изначально последовательность кубиков выглядит как [3, 4, 2, 3, 1]. Степан мог сначала поменять местами кубики в позициях 2 и 3 (после этого последовательность кубиков выглядела бы как [3, 2, 4, 3, 1]), а затем поменять местами кубики в позициях 3 и 4 (после этого последовательность кубиков выглядела бы как [3, 2, 3, 4, 1]). Во втором примере невозможна ситуация, при которой Степан говорит правду, так как он сообщил, что менял местами только кубики с позиции 1 до позиции 2, но из примера видно, что он гарантированно переместил кубик, стоящий изначально в позиции 3. Поэтому Степан гарантированно обманывает своего брата. В третьем примере при любых значениях l и r возможна ситуация, при которой Степан говорит правду.
| |
|
|
B. Игра: Банковские карты
дп
жадные алгоритмы
сортировки
Структуры данных
*1300
После четвёртого сезона Шерлок и Мориарти осознали бессмысленность баталии, развернувшейся между ними, и решили дальше соревноваться в мирную игру «Банковские карты». Правила у этой игры предельно просты: каждый игрок приносит свою любимую банковскую карту с n-значным номером. Далее оба игрока по очереди называют последовательные цифры из банковской карты. Если цифры не совпадают, то участник, цифра которого оказывается меньше, получает щелбан от другого игрока. Например, если n = 3 и у Шерлока номер карты 123, а у Мориарти 321, то сначала Шерлок называет число 1, а Мориарти называет число 3 и Шерлок получает щелбан. Затем и Шерлок и Мориарти называют число 2, и щелбан не получает никто. Наконец на третьем шаге, Шерлок называет 3, а Мориарти называет 1 и получает щелбан. Шерлок, конечно, будет играть честно, но Мориарти, как настоящий злодей, подсмотрел номер карты Шерлока и теперь хочет называть цифры своей банковской карты не последовательно, а в некотором другом порядке (однако количество каждой из цифр он не изменяет). Например в случае выше, Мориарти мог бы назвать цифры в последовательности 1, 2, 3 и не получил бы щелбанов вообще, а мог назвать 2, 3 и 1 и выдать Шерлоку целых два щелбана. Вам поручено вычислить, какое минимальное количество щелбанов Мориарти точно получит и какое максимальное число Мориарти может дать Шерлоку. Обратите внимание, что это две разные цели, и они могут достигаться при использовании разных порядков. Выходные данные Сначала выведите минимальное число щелбанов, которое обязательно получит Мориарти. Затем выведите максимальное число щелбанов, которое Мориарти может дать Шерлоку. Примечание Первый пример совпадает с примером, разобранным в условии задачи. Во втором примере Мориарти никак не сможет избежать двух щелбанов.
| |
|
|
E. Ханойская фабрика
дп
жадные алгоритмы
Перебор
сортировки
Структуры данных
*2000
Наверняка вы слышали об известной задаче про Ханойские башни, но мало кто знает, что существует целая фабрика, производящая кольца для этой замечательной игры. Однажды на эту фабрику пришел срочный заказ от властителя Египта — Солнцеликого. Солнцеликий требует немедленно прислать ему для игры как можно более высокую башню. Работники фабрики не были готовы к такому необычному заказу, поэтому им придётся собрать какую-то башню из уже произведённых колец. На складах фабрики находятся n колец, i-е кольцо имеет внутренний радиус ai, внешний радиус bi и высоту hi. Требуется выбрать некоторые из этих колец и упорядочить их таким образом, чтобы выполнялись следующие условия: - Внешние радиусы колец образовывали невозрастающую последовательность, то есть кольцо j можно поставить на кольцо i только если bj ≤ bi.
- Кольца не должны проваливаться друг в друга, то есть кольцо j можно поставить на кольцо i только если bj > ai.
- Суммарная высота всех использованных колец должна быть максимальна.
Выходные данные Выведите максимальную высоту башни, которую смогут получить работники фабрики. Примечание В первом примере выгодно поставить друг на друга все имеющиеся кольца в порядке 3, 2, 1. Во втором примере можно либо поставить кольцо 3 на кольцо 4 и получить башню высоты 3, либо поставить кольцо 1 на кольцо 2 и получить башню высоты 4.
| |
|
|
E. Продажа чисел
дп
сортировки
*3000
Борис очень любит числа и у него даже есть небольшой магазин интересных чисел. В продаже у него есть n десятичных чисел Bi. Стоимость числа в его магазине равна сумме стоимостей цифр, из которых оно состоит. Заданы значения cd, где cd — стоимость цифры d. Естественно, Борис заинтересован в том, чтобы в его магазине были числа как можно большей стоимости. Недавно Борису попал в руки магический артефакт A, который может позволить ему увеличить стоимость коллекции. Артефакт представляет собой строку, состоящую из цифр и символов '?'. Чтобы применить артефакт, Борис должен заменить все символы '?' на цифры так, чтобы получилась запись десятичного числа без ведущих нулей (число 0 также запрещено). После этого полученное число прибавится к каждому из чисел Bi, которые есть в коллекции Бориса. Артефакт можно использовать только один раз. Какую максимальную суммарную стоимость коллекции может получить Борис после применения артефакта? Выходные данные Выведите одно целое число — максимальную возможную суммарную стоимость коллекции после применения артефакта. Примечание Во втором примере оптимальным выбором будет составить из артефакта число 453. После прибавления этого числа у Бориса окажутся числа 2656, 5682, 729 и 6696. Суммарная стоимость всех цифр в этих числах равна 18 + 15 + 11 + 18 = 62.
| |
|
|
C. Нечестные продавцы
жадные алгоритмы
Конструктив
сортировки
*1200
Игорь узнал о скидках в магазине и решил купить n товаров. Скидки в магазине продлятся неделю и Игорь знает про каждый товар, что сейчас он стоит ai, а после недели скидок будет стоить bi. Не все из продавцов в магазине честные, поэтому некоторые товары сейчас стоят дороже, чем будут стоить после недели скидок. Игорь решил, что купит не менее k товаров сейчас, а с остальными подождет неделю, чтобы максимально сэкономить. Перед вами стоит задача определить минимальную сумму, которую Игорь может потратить, чтобы купить все n товаров. Выходные данные Выведите минимальную сумму, которую Игорь может потратить, чтобы купить все n товаров при условии, что прямо сейчас он хочет купить не менее k товаров. Примечание В первом примере Игорю выгоднее всего купить сразу товар номер 3, заплатив за это 6, а товары номер 1 и 2 подождать, тогда он сможет купить их за 3 и 1, соответственно. Суммарно Игорь заплатит 6 + 3 + 1 = 10. Во втором примере Игорю выгоднее всего купить сразу товары с номерами 1, 2, 4 и 5, заплатив за них 3, 4, 10 и 3, соответственно. Товар номер 3 Игорю выгоднее купить после скидок, он заплатит за это 5. Суммарно Игорь заплатит 3 + 4 + 10 + 3 + 5 = 25.
| |
|
|
B. Антон и занятия
жадные алгоритмы
сортировки
*1100
Антону нравятся шахматы. А еще ему нравится программирование. Неудивительно, что он решил посещать занятия по шахматам и по программированию. У Антона есть n вариантов, когда он будет заниматься шахматами, i-й вариант задается отрезком времени (l1, i, r1, i). Также у него есть m вариантов, когда он будет заниматься программированием, i-й вариант задается отрезком времени (l2, i, r2, i). Антону необходимо выбрать ровно один из n возможных отрезков времени, когда он будет заниматься шахматами и ровно один из m возможных отрезков времени, когда он будет заниматься программированием. Ему хочется побольше отдохнуть между занятиями, поэтому из всех возможных пар отрезков он хочет выбрать ту, расстояние между отрезками в которой как можно больше. Расстоянием между двумя отрезками (l1, r1) и (l2, r2) будем называть минимально возможное расстояние между точкой на первом отрезке и точкой на втором отрезке, то есть минимально возможное |i - j|, где l1 ≤ i ≤ r1 и l2 ≤ j ≤ r2. В частности, если отрезки пересекаются, то расстояние между ними равно 0. Антону интересно, сколько времени он сможет отдохнуть между занятиями в лучшем случае. Помогите ему найти это число! Выходные данные Выведите одно целое число — максимально возможное расстояние между отрезками. Примечание В первом примере Антон может заниматься шахматами в отрезок времени (2, 3), а программированием — в отрезок времени (6, 8). Нетрудно заметить, что в этом случае расстояние между отрезками равно 3. Во втором примере какую бы Антон пару отрезков не выбрал, они будут пересекаться. Поэтому ответ — 0.
| |
|
|
B. Разноцветное поле
реализация
сортировки
*1400
Лиса Кейл ехала в автобусе и смотрела в окно. За окном было поле, имеющее форму n × m прямоугольника, который был разделен на 1 × 1 квадраты. Некоторые квадраты были безжизненны, в то время как на других росли фрукты и овощи: на них росла морковь, киви или виноград. Лиса внимательно рассмотрела поле и заметили следующую закономерность. - Предположим все строки пронумерованы от 1 до n сверху вниз, а столбцы от 1 до m слева направо. Пусть ячейка (квадрат) в i-ой строке и j-ом столбце обозначается как (i, j).
- Во-первых, оказалось, что каждый квадрат был либо удобрен либо нет. Неудобренные квадраты оказались безжизненными, в то время как на удобренных выросли фрукты и овощи. Посадка фруктов и овощей на удобренные участки происходила слева-направо сверху-вниз: (1, 1) → ... → (1, m) → (2, 1) → ... → (2, m) → ... → (n, 1) → ... → (n, m). Неудобренные участки при посадке игнорировались.
- При посадке на ячейку была посажена одна культура (морковь, киви или виноград). Посадка культур осуществлялась по циклу, начиная с моркови. Т.е. морковь была посажена в первую удобренную клетку, во вторую — киви, в третью — виноград, в четвертую — морковь, в пятую — киви и т.д.
Следующий рисунок демонстрирует пример процедуры посадки. Здесь белые клетки обозначают удобренные ячейки, а черные — неудобренные (безжизненные). Напишите программу, которая определяет название культуры каждой из заданных t клеток. Выходные данные Для каждой из t заданных клеток выведите: - «Waste» — если клетка безжизненна,
- «Carrots», «Kiwis» или «Grapes» — если там растет морковь, киви или виноград соответственно.
Примечание Пример соответствует картинке из условия.
| |
|
|
A. Новый маршрут
реализация
сортировки
*1100
Вдоль главной дороги Берляндии расположены n городов. Они заданы целыми координатами относительно начала дороги a1, a2, ..., an. Все координаты различны. Перемещаться между городами можно только на автобусе, но все автобусы так устарели, что министр транспорта принял решение запустить новый маршрут с обновленными машинами. Министр планирует минимизировать затраты на организацию маршрута, то есть соединить два города с минимальным расстоянием между ними. Расстояние между городами определяется модулем разности их координат. Иногда может существовать больше одной пары городов с расстоянием, равным минимальному. Министру также важно знать, сколько таких пар существует. Напишите программу, которая определит минимальное расстояние по всем парам городов и количество пар с данным расстоянием. Выходные данные Выведите два числа — минимальное расстояние по всем парам городов и количество пар с данным расстоянием. Примечание В первом примере существует одна пара городов с минимальным расстоянием между ними — первый и четвертый города. Расстояние равно |4 - 6| = 2.
| |
|
|
C. Мышиная проблема
геометрия
математика
реализация
сортировки
*2300
Аналитик Игорь задремал на работе, и ему приснился сон. Во сне у Игоря на рабочем столе завелось много компьютерных мышей, поэтому он купил себе мышеловку. Рабочий стол можно представить как бесконечную плоскость, тогда мышеловка представляет из себя прямоугольник, стороны которого параллельными осям координат, противоположные углы которого находятся в точках с координатами (x1, y1) и (x2, y2). Игорь хочет поймать всех мышей. Анализируя их поведение, Игорь выяснил, что каждая мышь ползет прямолинейно с постоянной скоростью, скорость мыши номер i равна (vix, viy), что означает, что координата x позиции мыши увеличивается за секунду на vix, а координата y — на viy. Изначально мышеловка поднята, и мыши могут свободно передвигаться по столу. Игорь может в любой момент времени опустить мышеловку, при этом он поймает всех мышей, оказавшихся строго внутри мышеловки. Игорь очень трудолюбивый и даже во сне трудится на своей работе, поэтому он просит вас написать программу, которая по заданным координатам мышеловки, позициям мышей в начальный момент времени и их скоростям вычислит ближайший момент времени, в который ему удастся поймать всех мышей. Обратите внимание, что Игорь может опустить мышеловку только один раз. Выходные данные В единственной строке выведите минимальное неотрицательное t такое, что если Игорь опустит мышеловку в момент времени t секунд, то все компьютерные мыши окажутся строго внутри мышеловки. Если такого t не существует, выведите -1. Ваш ответ будет считаться правильным, если его абсолютная или относительная ошибка не будет превосходить 10 - 6. А именно: пусть ваш ответ равен a, а ответ жюри b. Ваш ответ будет засчитан, если . Примечание Ниже приведена иллюстрация первого примера. Точки A, B, C, D - начальные положение мышей, отрезками показан их путь. 
Тогда в первый момент времени, в котором все точки будут находиться в прямоугольнике, прямоугольник будет выглядеть следующим образом: 
Иллюстрация второго примера выглядит так: 
Как видно на изображении, мыши A, D и B никогда не попадут в прямоугольник.
| |
|
|
C. Название компании
жадные алгоритмы
игры
сортировки
*1800
Клиент банка Олег и аналитик Игорь — хорошие друзья. Однако, иногда они спорят по мелочам. Недавно они основали новую компанию, но испытывают трудности с выбором названия для компании. Чтобы разрешить спор, они решили сыграть в игру. Название компании будет состоять из n букв. У Олега и Игоря есть по одному набору из n букв (наборы могут содержать одну и ту же букву несколько раз, наборы могут отличаться). Изначально название компании состоит из n знаков вопроса. Олег и Игорь ходят по очереди, Олег ходит первым. На каждом ходу игрок выбирает одну букву c, имеющуюся у него в наборе, и заменяет один любой знак вопроса на эту букву c. Затем одна такая буква c исчезает из его набора. Игра оканчивается, когда все знаки вопроса заменены на какие-то буквы. Например, предположим, у Олега есть набор букв {i, o, i}, а у Игоря есть набор букв {i, m, o}. Одна из возможных игр приведена ниже: Изначально название компании равно ???. Олег заменяет второй знак вопроса на «i». Название компании теперь ?i?. Набор букв Олега теперь равен {i, o}. Игорь заменяет третий знак вопроса на «o». Название компании теперь ?io. Набор букв Игоря теперь равен {i, m}. Наконец, Олег заменяет первый знак вопроса на «o». Название компании теперь oio. Набор букв Олега равен {i}. В итоге название компании равно oio. Олег хочет, чтобы название компании было лексикографически как можно меньше, а Игорь хочет, чтобы название компании было лексикографически как можно больше. Каким будет название компании, если Олег и Игорь играют оптимально? Строка s = s1s2...sm лексикографически меньше строки t = t1t2...tm (если s ≠ t), если si < ti, где i — наименьший индекс такой, что si ≠ ti (т.е. sj = tj для всех j < i). Выходные данные Выведите строку из n строчных латинских букв — название компании при условии, что Олег и Игорь играют оптимально. Примечание Одна из оптимальных игр в первом примере: - Изначально название компании равно ???????.
- Олег заменяет первый знак вопроса на «f». Название компании становится f??????.
- Игорь заменяет второй знак вопроса на «z». Название компании становится fz?????.
- Олег заменяет третий знак вопроса на «f». Название компании становится fzf????.
- Игорь заменяет четвертый знак вопроса на «s». Название компании становится fzfs???.
- Олег заменяет пятый знак вопроса на «i». Название компании становится fzfsi??.
- Игорь заменяет шестой знак вопроса на «r». Название компании становится fzfsir?.
- Олег заменяет седьмой знак вопроса на «k». Название компании становится fzfsirk.
Во втором примере независимо от того, как играют друзья, название компании всегда получится равным xxxxxx.
| |
|
|
F. Мышки и норки
дп
жадные алгоритмы
сортировки
Структуры данных
*2600
Однажды Маша неожиданно вернулась домой и застала n мышей в коридоре своей квартиры. Как и положено девушке, она настолько громко закричала, что мыши в ужасе стали разбегаться по своим норкам. Коридор можно представить числовой прямой, на которой расположены n мышей и m норок. i-я мышка изначально находится в точке xi, а j-я норка — в точке pj. Вместимость j-й норки составляет cj, то есть в эту норку может поместиться не более cj мышек. Какой минимальный суммарный путь проделают мышки, чтобы после крика Маши все они спрятались по норкам? Если i-я мышка выберет в качестве укрытия норку j, то пройденный путь следует считать по формуле |xi - pj|. Выведите минимальный суммарный путь мышек до норок. Выходные данные Выведите единственное целое число — минимальный суммарный путь мышек, чтобы каждая мышка оказалась в норке. Выведите -1, если решения не существует.
| |
|
|
D. Майк и распределение
Конструктив
сортировки
*2400
Майк всегда думал о жестокости социального неравенства. Он настолько одержим этим, что иногда это влияет на него, когда он решает задачи. На данный момент у Майка есть две последовательности положительных целых чисел A = [a1, a2, ..., an] и B = [b1, b2, ..., bn] длины n каждая, которые он использует, чтобы спрашивать у людей странные вопросы. Чтобы протестировать вас на то, как хорошо вы обнаруживаете неравенство в жизни, он хочет чтобы вы нашли «нечестное» подмножество оригинальной последовательности. Более формально, он хочет чтобы вы выбрали k чисел P = [p1, p2, ..., pk] таких, что 1 ≤ pi ≤ n для всех 1 ≤ i ≤ k, и элементы в P различны. Последовательность P представляет индексы элементов, которые вы выбрали из обеих последовательностей. Он называет подмножество P «нечестным», если и только если следующие условия выполняются: 2·(ap1 + ... + apk) больше, чем сумма элементов последовательности A, и 2·(bp1 + ... + bpk) больше, чем сумма элементов последовательности B. Также k должно быть меньше либо равно чем , потому что очень легко будет найти последовательность P, если разрешить брать много элементов! Майк гарантирует, что решение существует для условий описанных выше. Поэтому помогите ему удовлетворить его любопытство! Выходные данные На первой строке выведите целое число k, которое обозначает размер найденного подмножества. k должно быть меньше либо равно чем . На следующей строке выведите k целых чисел p1, p2, ..., pk (1 ≤ pi ≤ n) — элементы последовательности P. Вы можете вывести числа в любом порядке. Числа в P должны быть различны.
| |
|
|
E. Майк и код перестановки
графы
Конструктив
сортировки
Структуры данных
*3000
Майк открыл новый способ кодирования перестановок. Если у него есть перестановка P = [p1, p2, ..., pn], он закодирует ее следующим образом: Пусть A = [a1, a2, ..., an] — последовательность длины n, которая будет представлять код перестановки. Для каждого i от 1 до n последовательно он будет выбирать наименьшее непомеченное j (1 ≤ j ≤ n) такое, что pi < pj и присвоит в ai число j (другими словами выполнит ai = j) и пометит j. Если такого j не существует, то он присвоит в ai число - 1 (он выполнит ai = - 1). Майк забыл свою изначальную перестановку, но он помнит ее код. Ваша задача проста: найдите любую перестановку такую, что ее код такой же, как и код изначальной перестановки Майка. Вы можете предположить, что всегда существует хотя бы одна перестановка. Выходные данные В первой и единственной строке выведите n чисел p1, p2, ..., pn (1 ≤ pi ≤ n) — перестановка P, которая имеет такой же код, что и данный. Заметьте, что числа в перестановке различны. Примечание Для перестановки из первого примера: i = 1, наименьшее j равно 2, потому что p2 = 6 > p1 = 2. i = 2, нет такого j, потому что p2 = 6 наибольший элемент в перестановке. i = 3, наименьшее j равно 1 потому что p1 = 2 > p3 = 1. i = 4, наименьшее j равно 5 (2 уже помечено), потому что p5 = 5 > p4 = 4. i = 5, нет такого j, потому что 2 уже помечено. i = 6, наименьшее j равно 4, потому что p4 = 4 > p6 = 3.
| |
|
|
M. Первоапрельская задача (простая)
жадные алгоритмы
сортировки
*1200
Сурки подготовили очень легкую задачу для HC2 этого года. В ней говорится о целых числах n, k и последовательности из n положительных чисел a1, a2, ..., an. Они также придумали красивую и захватывающую историю для условия задачи. Она объясняет, что означает ввод, что программа должна выводить, а также читается как хороший детектив. Однако у меня, Хайди, этого не будет. В качестве моей сегодняшней шутки я удаляю историю из условия. И заменяю его этими двумя бесполезными абзацами. Теперь решите задачу, дураки! Выходные данные Выведите число.
| |
|
|
D. Матожидание диаметра дерева
Бинарный поиск
Деревья
дп
Перебор
поиск в глубину и подобное
сортировки
*2500
Паша — прилежный студент, один из лучших друзей Моджака. Он всегда размышляет над какой-то задачей. Сегодня они разговаривали о следующей задаче. Дан лес (ациклический неориентированный граф) из n вершин и m ребер. Также есть q запросов, на которые необходимо ответить. В каждом запросе даны две вершины v и u. Пусть V — множество вершин в компоненте связности, к которой принадлежит v, а U — множество вершин в компоненте связности, к которой принадлежит u. Добавим ребро между некоторой вершиной и некоторой вершиной и вычислим величину d получившейся компоненты. Если получившаяся компонента — дерево, то величина d равна диаметру компоненты, иначе она равна -1. Найдите математическое ожидание величины d, если вершины a и b выбираются из множеств равновероятно случайным образом. Можете помочь Паше решить эту задачу? Диаметром компоненты называется максимальное расстояние между парой вершин в компоненте. Расстоянием между двумя вершинами называется минимальное число ребер на пути между ними. Заметьте, что запросы не добавляют ребер в изначальный лес. Выходные данные Для каждого запроса выведите математическое ожидание величины d в соответствии с условием задачи. Ваш ответ будет засчитан, если его абсолютная или относительная ошибка не превосходит10 - 6. Формально, пусть ваш ответ равен a, а ответ жюри равен b. Ваш ответ будет засчитан, если . Примечание В первом примере вершины 1 и 3 лежат в одной компоненте, поэтому ответ на первый запрос равен -1. Во втором запросе есть два исхода: добавить ребро 1 - 2, или добавить ребро 2 - 3. В обоих случаях диаметр равен 2, поэтому ответ равен 2. Во втором примере ответ на первый запрос равен -1. Ответ на второй запрос — среднее по трем случаям: Если добавлены ребра 1 - 2 или 1 - 3, то диаметр будет равен 3, а если добавлено ребро 1 - 4, то диаметр равен 2. Поэтому ответ равен .
| |
|
|
A. Is it rated?
реализация
сортировки
*900
Is it rated? Вот он. Главный вопрос спортивного программирования, Codeforces и всего такого. И именно вам предстоит дать на него ответ. Прошел очередной раунд на Codeforces. Никакие два участника не набрали одинаковое число баллов. Для каждого участника сверху вниз по таблице известен его рейтинг до раунда, а также его рейтинг после раунда. Известно, что если хотя бы у одного участника рейтинг изменился, то раунд точно был рейтинговым. Кроме того, известно, что если раунд был рейтинговым, и некоторый участник с более низким рейтингом оказался в таблице результатов раунда выше участника с более высоким рейтингом, то точно изменился рейтинг хотя бы одного участника раунда. В рамках данной задачи никаких других предположений о формулах подсчета рейтинга делать не нужно. Определите, был ли раунд рейтинговым, нерейтинговым, или же невозможно определить это достоверно. Выходные данные Если раунд точно был рейтинговым, выведите «rated». Если раунд точно был нерейтинговым, выведите «unrated». Если нельзя достоверно сказать, был раунд рейтинговым или нет, выведите «maybe». Примечание В первом примере рейтинги участников на третьем и пятом местах изменились, следовательно, раунд был рейтинговым. Во втором примере рейтинги участников не изменились, однако участник на втором месте имеет рейтинг ниже участника на четвертом месте. Значит, если бы раунд был рейтинговым, чей-то рейтинг точно бы изменился. В третьем примере рейтинги участников также не изменились, однако все участники заняли места по невозрастанию рейтинга. Таким образом, нельзя достоверно сказать, были рейтинги пересчитаны или нет.
| |
|
|
C. Чаепитие
жадные алгоритмы
Конструктив
сортировки
*1400
Поликарп собрал всех своих друзей на чаепитие, чтобы отметить важное событие. У него есть n чашек, по одной для каждого из n друзей, объемами a1, a2, ..., an. Его чайник вмещает в себя w миллилитров чая (w ≤ a1 + a2 + ... + an). Поликарп хочет разлить чай по чашкам таким образом, чтобы: - Каждая чашка была заполнена не меньше, чем на половину своего объема
- В каждой чашке было налито целое число миллилитров чая
- Весь чай из чайника был разлит по чашкам
- Ни один из друзей не расстроился
Известно, что обладатель чашки i расстроится, если существует такая чашка j, что в i налили меньше чая, чем в j, но ai > aj. Для каждой чашки выведите, сколько миллилитров чая должно быть в нее налито. Если невозможно разлить весь чай таким образом, чтобы удовлетворить все условия, то выведите -1. Выходные данные Выведите для каждой чашки, сколько миллилитров чая должно быть в нее налито. Если ответов несколько, выведите любой из них. Если невозможно разлить весь чай таким образом, чтобы удовлетворить все условия, то выведите -1. Примечание В третьем примере необходимо налить в первую чашку не меньше 5 миллилитров, во вторую — не меньше 4, в третью — не меньше 5. В сумме получается 14 миллилитров, что превосходит количество чая в чайнике.
| |
|
|
A. Хочешь на свидание?
математика
реализация
сортировки
*1500
Устав от жизни в Банкополисе, Леха решил переехать в тихий городок Вичкополис. По приезду он сразу же начал расширять сеть взломанных им компьютеров. За неделю Леха успел получить доступ к n компьютерам по всему городу. А так как в Вичкополисе только одна прямая улица, то и все компьютеры, взломанные Лехой, находятся на одной прямой. Введем систему координат на единственной улице Вичкополиса. Пронумеруем все компьютеры, взломанные хакером, целыми числами от 1 до n. Тогда i-й компьютер, взломанный Лехой, находится в точке с координатой xi. При этом местоположения всех компьютеров попарно различны. После трудной недели Лехе потребовался отдых. Поэтому он решил пригласить свою знакомую Нуру в ресторан. Однако девушка согласилась идти на свидание только с одним условием: Леха должен решить поставленную ей задачу. Нура хочет, чтобы Леха посчитал сумму F(a) для всех a, где a — непустое подмножество множества взломанных Лехой компьютеров. Более формально, обозначим множество целых чисел от 1 до n включительно как A. Нура просит хакера найти значение . При этом F(a) вычисляется как максимум среди расстояний между всеми парами компьютеров, вошедших во множество a. Более формально, . Так как ответ может получиться достаточно большим, Нура просит найти значение интересующей ее суммы по модулю 109 + 7. Однако Леха так устал, взламывая компьютеры, что уже не может решить эту задачку. Помогите хакеру попасть на свидание с Нурой. Выходные данные Выведите одно число — значение суммы, которую просит найти Нура, по модулю 109 + 7.
| |
|
|
C. Средний балл
жадные алгоритмы
математика
сортировки
*1700
После реформы образования Поликарп изучает в школе всего два предмета — ОБЖ и физкультуру. За долгие месяцы четвертой четверти он получил n отметок по ним. Когда учителя ставили отметку в дневник, они не записывали за какой предмет оценка, а только ставили саму отметку. Теперь пришла пора показывать дневник строгим родителям. Поликарп знает, что недавно на родительском собрании родителям сообщили, что он получил a отметок по ОБЖ и b отметок по физкультуре (a + b = n). Теперь Поликарп хочет вписать название предмета перед каждой отметкой так, чтобы: - было ровно a отметок по ОБЖ,
- было ровно b отметок по физкультуре,
- суммарный средний балл по обоим предметам был максимален.
Средним баллом по предмету называется сумма всех отметок по нему, деленных на их количество. Конечно, деление производится в вещественных числах без каких-либо округлений. Цель Поликарпа максимизировать x1 + x2, где x1 средний балл по первому предмету (ОБЖ), а x2 — по второму (физкультура). Выходные данные Выведите последовательность целых чисел f1, f2, ..., fn, где fi (1 ≤ fi ≤ 2) — номер предмета к которому следует отнести i-ую отметку. Если решений несколько, то выведите такое, что последовательность f1, f2, ..., fn — наименьшая лексикографически. Последовательность p1, p2, ..., pn лексикографически меньше q1, q2, ..., qn, если существует такое j (1 ≤ j ≤ n), что pi = qi для всех 1 ≤ i < j, а pj < qj. Примечание В первом примере средний балл по первому предмету равен 4, а по второму — 4.5. Суммарный средний балл равен 8.5.
| |
|
|
B. Летняя распродажа
жадные алгоритмы
сортировки
*1300
Летом у школьников каникулы. Кто-то уезжает на отдых, кто-то — к бабушке или дедушке, а кто-то устраивается на подработку. Этим летом Нура решила, что хочет немного заработать, и устроилась в магазин продавцом-консультантом. У магазина, где работает Нура, есть план на ближайшие n дней. Для каждого дня менеджер по продажам точно знает, что в i-й день будет выставлено на продажу ki единиц товара, и что ровно li покупателей придет за покупками в магазин в этот день. Кроме того, менеджер уверен, что каждый из пришедших покупателей покупает ровно одну единицу товара либо, если товаров в магазине не осталось, уходит из магазина без покупок. Более того, в связи с тем, что товары в магазине быстро портятся, менеджер установил следующее правило: если в какой-то из дней в магазине часть товаров осталась не купленной, то эти товары отправляются на свалку, а не остаются на следующий день. В целях рекламы магазина менеджер предложил провести распродажу. Он дал Нуре задание выбрать из ближайших n дней любые f дней, в каждый из которых будет проведена распродажа. В каждый из этих f выбранных дней количество единиц товара, которое будет выставлено на продажу, будет удвоено. Таким образом, если в i-й день по плану магазин должен был выставить на продажу ki единиц товара, то, если сделать распродажу в этот день, на витрины магазина будет поставлено 2·ki единиц товара. Следовательно, в дни распродажи существует возможность продать большее количество товара. Задача Нуры — выбрать ровно f дней так, чтобы максимизировать суммарное количество проданных единиц товара. Она просит вас помочь ей с этой нелегкой задачей! Выходные данные Выведите единственное число — максимальное количество единиц товара, которое сможет продать магазин. Примечание В первом примере можно выбрать для распродажи дни с номерами 2 и 4. В таком случае новые количества единиц товара будут равны [2, 6, 2, 2] соответственно. Тогда в первый день будет продана 1 единица товара, во второй — 5, в третий — 2, в четвертый — 2. Итого 1 + 5 + 2 + 2 = 10 единиц товара. Во втором примере можно продать 5 единиц товара, если устроить распродажу в третий день.
| |
|
|
B. Владик и сложная книга
реализация
сортировки
*1200
Владик начал читать сложно написанную книгу по алгоритмам, содержащую n страниц. Для того, чтобы улучшить понимание написанного, его друзья посоветовали ему читать страницы в некотором порядке, заданном перестановкой P = [p1, p2, ..., pn], где pi обозначает номер страницы, которую следует читать i-й по очереди. Иногда мама Владика сортировала по возрастанию некоторый отрезок перестановки P с позиции l по r включительно, так как очень любит порядок. Для каждого из таких случаев Владик знает x — какую по счету страницу из перестановки он сейчас должен прочитать. Ему интересно, поменялась ли страница, которую он будет читать после сортировки, другими словами, поменялось ли px. После каждой такой сортировки он возвращал перестановку в изначальное состояние, поэтому можно считать, что каждая такая сортировка независима от других. Выходные данные Для каждого случая в отдельной строке выведите «Yes», если страница, которую будет читать Владик, останется такой же и «No» иначе. Примечание Объяснение первого примера: - [1, 2, 3, 4, 5] — перестановка после сортировки, так как 3-й элемент не изменился, ответ «Yes».
- [3, 4, 5, 2, 1] — перестановка после сортировки, так как 1-й элемент изменился, ответ «No».
- [5, 2, 3, 4, 1] — перестановка после сортировки, так как 3-й элемент не изменился, ответ «Yes».
- [5, 4, 3, 2, 1] — перестановка после сортировки, так как 4-й элемент не изменился, ответ «Yes».
- [5, 1, 2, 3, 4] — перестановка после сортировки, так как 3-й элемент изменился, ответ «No».
| |
|
|
C. Сахир и нубийский рынок
Бинарный поиск
сортировки
*1500
В поездке в Луксор и Асуан Сахир зашел на нубийский рынок, чтобы купить сувениров друзьям и родственникам. Он узнал, что на рынке действуют странные правила. На рынке имеются n различных сувениров, пронумерованных от 1 до n. Сувенир номер i имеет базовую стоимость ai Египетских фунтов. Если Сахир купит k сувениров с индексами x1, x2, ..., xk, то стоимость сувенира xj будет равна axj + xj·k (для 1 ≤ j ≤ k). Другими словами, стоимость сувенира равна его базовой стоимости плюс его номер, умноженный на k.
Сахир хочет купить как можно больше сувениров, заплатив не более S Египетских долларов. Заметьте, что он не может купить никакой сувенир более, чем один раз. Если есть несколько вариантов купить как можно больше сувениров, он хочет минимизировать суммарную их стоимость. Помогите ему выбрать эти сувениры!
Выходные данные
В единственной строке выведите два целых числа k и T — максимальное число сувениров, которое может купить Сахир, и минимальную стоимость покупки этих k сувениров.
Примечание
В первом примере Сахир не может купить все три сувенира, так как они будут стоить [5, 9, 14], суммарно 28. Если же он решит купить два сувенира, то стоимости будут равны [4, 7, 11]. Он сможет купить первый и второй сувениры.
Во втором примере он может купить все сувениры, они будут стоить ему [5, 10, 17, 22].
В третьем примере на рынке есть только один сувенир стоимостью 8 фунтов, Сахир не может его купить.
| |
|
|
A. Утраченное настроение прошлого
жадные алгоритмы
Конструктив
реализация
сортировки
*900
Несколько лет назад Хитаги встретила гигантского краба, которых украл весь ее вес. С тех пор она избегает контакта с кем-либо, так как боится, что ее секрет будет замечен. Чтобы снова получить свой вес, необходима особая последовательность целых чисел. Эта последовательность была давно разрушена, однако, с помощью Каики, возможно, получится восстановить ее. Необходимая последовательность a имеет длину n. Утерянные элементы в ней сейчас заменены нулями. У Каики есть еще одна последовательность b, длина которой k равна числу утерянных элементов в a (т.е. числу нулей). Хитаги должна заменить каждый ноль в a одним элементом из b так, что каждый элемент из b будет использован ровно один раз. Хитаги, однако, знает, что, кроме 0, ни одно число не встречается суммарно в a и b более одного раза. Если получившаяся последовательность не является возрастающей, то она позволит вернуть Хитаги вес. Вам предстоит определить, возможно ли такое. Другими словами, вы должны определить, возможно ли заменить каждый ноль в последовательности a числом из последовательности b так, чтобы каждое число из b было использовано ровно единожды, и получившаяся последовательность не являлась возрастающей. Выходные данные Выведите «Yes», если возможно заменить нули в a элементами из b и сделать последовательность не возрастающей, и «No» иначе. Примечание В первом примере: - Последовательность a имеет вид 11, 0, 0, 14.
- Два элемента последовательности утеряны, возможными кандидатами в b являются 5 и 4.
- Возможно получить две последовательности: 11, 5, 4, 14 и 11, 4, 5, 14, они обе подходят. Поэтому ответ «Yes».
Во втором примере единственная возможная последовательность — 2, 3, 5, 8, 9, 10, которая является возрастающей, следовательно, не подходит.
| |
|
|
B. Макес и произведение
Комбинаторика
математика
реализация
сортировки
*1500
После возвращения из армии Макес получил в подарок массив a, состоящий из n целых положительных чисел. Так как он очень давно не решал задачи, его заинтересовал следующий вопрос: сколько существует таких упорядоченных троек (i, j, k), что i < j < k, а ai·aj·ak — минимально. Помогите ему в этом! Выходные данные Выведите единственное число — количество упорядоченных троек (i, j, k), что i, j и k — попарно различны, а ai·aj·ak — минимально. Примечание В первом тесте из условия Макес всегда выберет три единицы из четырёх, а количество способов их выбрать — 4. Во втором тесте выбирается тройка чисел (1, 2, 3). Так как 3 встречается в массиве дважды, а единица и двойка — единожды, то количество способов будет равно 2. В третьем тесте выбирается тройка (1, 1, 2), её можно выбрать единственным способом.
| |
|
|
D. Несбалансированный массив
разделяй и властвуй
снм
сортировки
Структуры данных
*1900
Дан массив a, состоящий из n элементов. Назовём дисбалансом некоторого подотрезка массива разность между максимумом и минимумом на этом подотрезке. Дисбаланс всего массива — сумма дисбалансов всех подотрезков этого массива. Например, дисбаланс массива [1, 4, 1] равен 9, так как его 6 подотрезков имеют следующий дисбаланс: - [1] (с позиции 1 до позиции 1), дисбаланс равен 0;
- [1, 4] (с позиции 1 до позиции 2), дисбаланс равен 3;
- [1, 4, 1] (с позиции 1 до позиции 3), дисбаланс равен 3;
- [4] (с позиции 2 до позиции 2), дисбаланс равен 0;
- [4, 1] (с позиции 2 до позиции 3), дисбаланс равен 3;
- [1] (с позиции 3 до позиции 3), дисбаланс равен 0;
Ваша задача — вычислить дисбаланс массива a. Выходные данные Выведите одно целое число — дисбаланс массива a.
| |
|
|
C. Всеобщая мобилизация
поиск в глубину и подобное
сортировки
Структуры данных
*2000
Королевство Берляндия представляет собой множество из n городов, связанных n - 1 железнодорожными путями. Каждый путь соединяет ровно два различных города. Столица находится в городе номер 1. Из каждого города существует способ доехать по железной дороге до столицы. В i-ом городе стоит дивизия солдат номер i, каждая дивизия характеризуется числом ai, означающим приоритет; чем меньше это число, тем выше приоритет у этой дивизии. Все значения ai — различны. Однажды Король Берляндии Берл Великий объявил всеобщую мобилизацию, и для этого каждая дивизия должна прибыть в столицу. Каждый день из каждого города, кроме столицы, по каждому железнодорожному пути отходит поезд, который имеет некоторую конечную вместимость cj, выражаемую в максимальном количестве дивизий, которое этот поезд может увезти за один раз. Каждый поезд двигается по направлению сокращения расстояния до столицы. Поезд заканчивает свой путь на противоположном конце железнодорожного пути на следующий день. Таким образом, каждый поезд проезжает из города в соседний (в которой и заканчивает свой путь) по направлению к столице. В первую очередь из числа дивизий, находящихся в городе, на поезд садятся дивизии с наименьшим числом ai, потом со следующим по величине и так далее, пока либо поезд не будет заполнен, либо пока все дивизии не будут погружены. Таким образом, некоторые дивизии могут оставаться в городе в ожидании поезда несколько дней. Длительность путешествия поезда из одного города в другой всегда равно 1 дню. Все дивизии начинают свое передвижение одновременно и заканчивают в столице, откуда больше никуда не перемещаются. Каждая дивизия передвигается по простому пути из своего города в столицу, независимо от того, сколько времени займет это путешествие. Ваша задача — найти для каждой дивизии, через сколько дней она прибудет в столицу Берляндии. Отсчет времени начинается с дня номер 0. Выходные данные Выведите последовательность t1, t2, ..., tn, где ti означает количество дней, через которое дивизия из города i прибудет в столицу. Числа разделяйте пробелами.
| |
|
|
C. Хакер, собирай чемоданы!
Бинарный поиск
жадные алгоритмы
реализация
сортировки
*1600
Как известно, лучший способ отвлечься от чего-либо — заниматься своим любимым делом. Для хакера Лехи любимое дело это работа. Чтобы не скучать, Леха начал усердно работать, то есть взламывать компьютеры по всему миру. За такое усердие начальство дало хакеру отпуск продолжительностью ровно x дней. Как известно, большинство людей предпочитают куда-нибудь уехать на время отпуска, поэтому Леха сразу пошёл в туристическое агенство. Там он выяснил, что осталось n непроданных путевок. i-я путевка характеризуется тремя числами li, ri, costi — день отъезда из Вичкополиса, день возврата в Вичкополис и стоимость путевки соответственно. Продолжительностью i-й путевки называют величину ri - li + 1. При этом Леха хочет разделить свой отпуск на две части. Кроме того он хочет потратить как можно меньше денег. Более формально, Леха хочет выбрать ровно две путевки i и j (i ≠ j) так, чтобы они не пересекались, сумма их продолжительностей была равна ровно x, а суммарная стоимость была минимальна. Две путевки i и j не пересекаются, если выполняется хотя бы одно из условий: ri < lj или rj < li. Помогите Лехе выбрать необходимые путевки! Выходные данные Выведите одно целое число — минимальное количество денег, которые потратит Леха, либо - 1, если невозможно выбрать две непересекающиеся путевки с суммарной продолжительностью ровно x. Примечание В первом примере примере Леха должен выбрать первую и третью путевки. Тогда их суммарная продолжительность будет равна (3 - 1 + 1) + (6 - 5 + 1) = 5, а суммарная стоимость будет равна 4 + 1 = 5. Во втором примере продолжительность каждой из путевок равна 3, поэтому невозможно выбрать две путевки с суммарной продолжительностью равной 2.
| |
|
|
A. Восстановление строки
жадные алгоритмы
сортировки
Строки
Структуры данных
*1700
У Ивана была строка s, состоящая из строчных букв латинского алфавита. Но его подруга Юля решила пошутить над ним и спрятала строку s. Иван решил, что не будет искать строку, а просто сделает новую. Иван помнит о строке s следующую информацию. Он помнит, что строка ti встречается в строке s количество раз ki или больше, а также помнит ровно ki позиций, с которых начинается вхождение строки ti в строку s — это позиции xi, 1, xi, 2, ..., xi, ki. При этом количество строк ti, про которые помнит Иван, равно n. Перед вами стоит задача восстановить лексикографически минимальную строку s такую, что она удовлетворяет всей информации, которую помнит Иван. Как строки ti, так и строка s могут содержать только строчные буквы латинского алфавита. Выходные данные Выведите лексикографически минимальную строку, которая удовлетворяет всей информации, которую помнит Иван.
| |
|
|
B. Доктор
Бинарный поиск
математика
сортировки
*1800
В очереди к доктору Айболиту стоят n животных. Когда животное заходит в кабинет, доктор его осматривает, выписывает рецепты, назначает анализы, и, возможно, назначает дополнительный прием. Доктор отлично знаком со всеми животными в лесу, и поэтому точно знает, что животное номер i в очереди должно будет посетить его кабинет ровно ai раз. Мы будем считать, что осмотр занимает гораздо больше времени, чем сдача анализов и других дополнительных процедур, и поэтому будем считать, что как только животное покидает кабинет, оно сразу же встает в конец очереди к доктору. Разумеется, если животное уже побывало у доктора необходимое количество раз, то вставать еще раз в очередь ненужно, и оно сразу же уходит домой. Доктор планирует уйти домой после того, как завершит прием k животных, и поэтому ему важно, как будет выглядеть очередь в этот момент. Так как у доктора очень длинный рабочий день, да и вообще, отвлекаться ему некогда, то он попросил вас выяснить это. Выходные данные Если доктор осуществит в сумме меньше чем k приемов, то выведите единственное число «-1» (без кавычек). Иначе выведите последовательность чисел — номера животных в порядке, в котором они стоят в очереди. Обратите внимание, что эта последовательность может быть пустой. Этот случай присутствует в претестах. Вы можете ничего не выводить или выводить один символ конца строки. Оба варианта будут засчитаны за правильный ответ. Примечание Объяснение первого примера: - До приема: {1, 2, 3}
- После первого приема: {2, 3}
- После второго приема: {3, 2}
- После третьего приема: {2}
Объяснение второго примера: - До приема: {1, 2, 3, 4, 5, 6, 7}
- После первого приема: {2, 3, 4, 5, 6, 7}
- После второго приема: {3, 4, 5, 6, 7, 2}
- После третьего приема: {4, 5, 6, 7, 2, 3}
- После четвертого приема: {5, 6, 7, 2, 3}
- После пятого приема: {6, 7, 2, 3, 5}
- После шестого приема: {7, 2, 3, 5, 6}
- После седьмого приема: {2, 3, 5, 6}
- После восьмого приема: {3, 5, 6, 2}
- После девятого приема: {5, 6, 2, 3}
- После десятого приема: {6, 2, 3}
| |
|
|
A. Ключи от офиса
Бинарный поиск
дп
жадные алгоритмы
Перебор
сортировки
*1800
На прямой есть n человек и k ключей. Каждый из людей хочет попасть в офис, который также расположен на прямой. Для этого каждому человеку нужно сначала дойти до точки, в которой находится ключ, взять его, а затем отправиться в офис. После того как человек взял ключ, больше этот ключ взять никто не сможет. Перед вами стоит задача определить минимальное время по истечении которого все n людей смогут добраться до офиса с ключами. Считайте, что каждый из людей преодолевает единицу расстояния за 1 секунду. Если в точку с ключом одновременно придут два человека, то ключ может взять только один из них. Человек не обязан брать ключ, мимо которого проходит. Выходные данные Выведите минимальное время в секундах по истечении которого все n людей смогут добраться до офиса с ключами. Примечание В первом примере человек, находящийся в точке 20 должен взять ключ, находящийся в точке 40 и дойти с ним до офиса, который находится в точке 50. На это он потратит 30 секунд. Человек, находящийся в точке 100 может взять ключ, находящийся в точке 80 и дойти с ним до офиса. На это он потратит 50 секунд. Таким образом, через 50 секунд все люди могут оказаться в офисе с ключами.
| |
|
|
B. Сортировка карт
реализация
сортировки
Структуры данных
*1600
У Василия есть колода, состоящая из n карт. На каждой карте написано ровно одно целое число от 1 до 100 000. Возможно, что на некоторых картах написаны одинаковые числа. Василий решил отсортировать все карты в колоде. Для этого он по очереди берёт одну верхнюю карту из колоды и если число, написанное на ней, равно минимальному среди всех оставшихся чисел в колоде, он откладывает эту карту в сторону. В противном случае, Василий кладёт эту карту вниз колоды и берёт сверху колоды следующую карту. Процесс заканчивается, когда в колоде не останется карт. Можно считать, что Василий в любой момент времени знает минимальное число, записанное на какой-то из оставшихся в колоде картах, но не знает, где эта карта (или карты) находится в колоде. Перед вами стоит задача определить суммарное количество раз, которое Василий посмотрит верхнюю карту из колоды. Выходные данные Выведите суммарное количество раз, которое Василий посмотрит верхнюю карту из колоды. Примечание В первом примере Василий посмотрит сначала карту с числом 6, положит ее вниз колоды, затем карту с числом 3, также положит ее вниз колоды, и затем карту с числом 1. Он отложит карту с числом 1, так как на ней написан минимальное число из оставшихся в колоде. После этого карты в колоде будут лежать в порядке [2, 6, 3] сверху вниз. После этого Василий посмотрит верхнюю карту с числом 2 и отложит её. После этого карты в колоде будут лежать в порядке [6, 3] сверху вниз. Затем Василий посмотрит карту с числом 6, положит ее вниз колоды, а затем карту с числом 3, которую отложит. После этого в колоде останется одна карта с числом 6, которую Василий посмотрит и отложит. Таким образом, Василий посмотрит 7 карт.
| |
|
|
E. Карамельные облака
дп
сортировки
Структуры данных
*3400
Как известно, лучшее украшение клумбы в королевстве Sweetland — ванильные кексики. Процесс их выращивания весьма сложен и требует немалых ресурсов. У Сластены есть m саженцев, и для превращения j-го саженца кексика в произведение искусства необходимо держать его под солнцем не менее kj минут. Большую часть времени в Sweetland стоит прекрасная погода, которая лишь иногда омрачается появлением карамельных облаков, i-е из которых возникает в момент времени (минуту) li и исчезает в момент времени ri. Разумеется, солнечный свет не способен пробиться сквозь карамельный покров. Сластена не отличается терпением, и ей хочется вырастить свое пирожное как можно быстрее. В ее распоряжении ровно C конфет — основной валюты Sweetland. Любое облако можно полностью рассеять, заплатив за это ci конфет. Однако в соответствии с указом министерства метеорологии Sweetland, рассеивание более чем двух карамельных облаков искусственным путем строжайше запрещено и карается огромным штрафом. В коллекции Сластены находится m саженцев. Она еще не определилась, какие из них достойны занять почетное место в королевском саду, и ей требуется ваша помощь. Для каждого саженца определите самую раннюю минуту, к которому его можно вырастить, не нарушая указ министерства метеорологии и не выходя за рамки бюджета. Обратите внимание, что Сластена находится на этапе формирования набора кексиков, поэтому каждый новый саженец рассматривается независимо от остальных. Выращиваться кексики начинают в момент времени 0. Выходные данные Для каждого саженца выведите одно число — минимально возможную минуту, к которой Сластена сумеет вырастить данный ванильный кексик. Примечание Рассмотрим первый пример чуть подробнее. Здесь для любого k оптимально развеять облака 1 и 3. Тогда солнце не будет светить в промежутке [1..6]. Соответственно, солнечными будут являться промежутки [0..1] и [6..inf). Во втором примере при k = 1 ничего развеивать не требуется, а при k = 5 наилучшей стратегией будет развеять облака 2 и 3. Это добавит дополнительный солнечный промежуток [4..8], который вместе с [0..1] позволяет вырастить кексик по достижении восьмой минуты. В третьем примере два саженца кардинально различаются. Для минимизации времени выращивания первого необходимо разогнать облако 1 и получить достаточный промежуток времени [0..10], в то время как аналогичный подход даст для второго ответ 180. Однако если убрать облако 2, солнечными будут отрезки [0..3] и [7..inf), что позволит нам сократить время до 104.
| |
|
|
A. Леха и функция
жадные алгоритмы
Комбинаторика
математика
сортировки
теория чисел
*1300
Леха очень любит всякие странности. Недавно ему понравилась функция F(n, k). Рассмотрим всевозможные k-элементные подмножества множества [1, 2, ..., n]. Для подмножества найдем минимальный элемент в нём. F(n, k) — это математическое ожидание минимального значения по всевозможным k-элементным подмножествам. Но одна только функция его не интересует. Он хочет делать с ней интересные вещи. Мама принесла ему два массива A и B, каждый состоит из m целых чисел. Для всех i, j таких, что 1 ≤ i, j ≤ m, выполняется условие Ai ≥ Bj. Помогите Лехе переупорядочить числа в массиве A так, чтобы сумма была максимально возможной, где A' — уже переупорядоченный массив. Выходные данные Выведите m целых чисел a'1, a'2, ..., a'm — массив A', являющийся перестановкой массива A.
| |
|
|
A. Сортировка подпоследовательностями
математика
поиск в глубину и подобное
реализация
снм
сортировки
*1400
Дана последовательность a1, a2, ..., an, состоящая из различных целых чисел. Требуется разбить эту последовательность на максимальное число подпоследовательностей так, чтобы после сортировки по возрастанию чисел внутри каждой из них итоговая последовательность также оказалась отсортированной по возрастанию. Под сортировкой по возрастанию чисел внутри подпоследовательности понимается процесс, в котором числа, входящие в подпоследовательность, упорядочиваются по возрастанию, а числа, не входящие в подпоследовательность, не меняют свои позиции. При разбиении последовательности на подпоследовательности каждый элемент должен войти ровно в одну подпоследовательность. Выходные данные В первой строке выведите максимальное число подпоследовательностей k, на которое можно разбить исходную последовательность, выполнив условие задачи. В следующих k строках выведите описание подпоследовательностей в следующем формате: количество элементов в подпоследовательности ci (0 < ci ≤ n), а затем ci целых чисел l1, l2, ..., lci (1 ≤ lj ≤ n) — индексы этих элементов в исходной последовательности. Индексы можно выводить в любом порядке. Каждый индекс от 1 до n должен присутствовать в выводе ровно один раз. Если возможных ответов несколько, выведите любой из них. Примечание Пояснение к ответу на первый сэмпл: После сортировки первой подпоследовательности мы получим последовательность 1 2 3 6 5 4. После сортировки второй подпоследовательности ничего не изменится. После сортировки третьей подпоследовательности мы получим последовательность 1 2 3 4 5 6. После сортировки последней подпоследовательности ничего не изменится.
| |
|
|
A. Шахматный турнир
реализация
сортировки
*1100
Совсем скоро в Берляндии пройдет шахматный турнир! В турнире примут участие 2·n шахматистов, которые будут разделены на две команды по n шахматистов в каждой. Первую команду будет спонсировать госкорпорация БерНефть, а вторую — БерЖКХ. По замыслу организаторов, конечно, должна победить команда БерНефти! Таким образом, перед организаторами стоит задача разделить всех 2·n шахматистов на две команды по n шахматистов в каждой так, чтобы наверняка победила первая команда. Каждый шахматист характеризуется своим рейтингом ri. Известно, что шахматист с большим рейтингом всегда побеждает шахматиста с меньшим рейтингом. Если рейтинги равны, то победить может любой из шахматистов. После распределения по командам будет проведена жеребьевка в процессе которой будут сформированы n пар соперников: в каждой паре — один шахматист из первой команды и один из второй. Каждый шахматист должен попасть ровно в одну пару. Каждая пара сыграет ровно одну партию. Жеребьевка осуществляется случайным образом. Возможно ли организаторам так разбить всех 2·n шахматистов на две команды по n шахматистов в каждой, что независимо от результатов жеребьевки в каждой шахматной партии победит шахматист из первой команды? Выходные данные Если возможно так разбить всех 2·n шахматистов на две команды по n шахматистов в каждой, что независимо от результатов жеребьевки в каждой шахматной партии победит шахматист из первой команды, то выведите «YES». Иначе выведите «NO».
| |
|
|
C. Два телевизора
жадные алгоритмы
сортировки
Структуры данных
*1500
Поликарп — фанат телевидения. Он выписал интересующие его передачи на сегодня. В его списке получилось n телешоу, i-е из них начинается в момент времени li и заканчивается в момент времени ri. У Поликарпа есть два телевизора. Он может одновременно смотреть два различных телешоу по двум телевизорам, но каждый из телевизоров может показывать только одно шоу в один момент. Считайте, что если одно шоу заканчивается ровно в момент начала следующего, то на одном телевизоре их посмотреть не получится. Поликарп хочет посмотреть все n телешоу! Достаточно ли ему двух телевизоров, чтобы осуществить задуманное? Выходные данные Если Поликарп сможет посмотреть все шоу, используя только два телевизора, то выведите «YES» (без кавычек). В противном случае, выведите «NO» (без кавычек).
| |
|
|
F. Выборы в Берляндии
жадные алгоритмы
сортировки
*2100
Сегодня — выборы в парламент Берляндии. Голосование в самом разгаре! Всего в выборах принимают участие n кандидатов; будем считать, что они занумерованы числами от 1 до n. По результатам выборов k (1 ≤ k ≤ n) кандидатов, показавших наилучший результат на выборах, будут избраны в парламент. Результаты выборов определяются следующим образом. По окончании голосования для каждого кандидата подсчитывается количество отданных за него голосов. Чем больше голосов набрал кандидат, тем выше место он займет в таблице результатов. Если два или более кандидатов набрали одинаковое количество голосов, то выше место в таблице результатов занимает кандидат, последний голос за которого был отдан раньше. Таким образом, при формировании таблицы результатов кандидаты упорядочиваются по невозрастанию количества отданных за них голосов, а при равном количестве отданных за них голосов — по возрастанию времени, в которое был отдан последний голос за этого кандидата. Если за кандидата не отдан ни один голос, то он не считается избранным ни при каких условиях. Таким образом, возможно что менее чем k кандидатов будут избраны в парламент. В Берляндии m жителей имеют право голоса, и каждый из них обязательно примет участие в голосовании. Каждый из жителей отдаст свой голос за одного из n кандидатов. Варианта «против всех» в бюллетене нет, портить бюллетени или не ходить на выборы в Берляндии не принято. Таким образом, каждый из m жителей должен проголосовать за одного из n кандидатов. К настоящему моменту уже проголосовали a (1 ≤ a ≤ m) жителей Берляндии. Бюллетени в Берляндии именные и мгновенно обрабатываются в момент голосования, поэтому для j-го проголосовавшего уже известен номер кандидата gj, за которого он отдал свой голос. Проголосовавшие жители нумеруются в хронологическом порядке; то есть (j + 1)-й житель голосовал позже j-го. Оставшиеся m - a жителей проголосуют до окончания выборов, каждый из них отдаст голос за какого-то из n кандидатов. Ваша задача — определить для каждого из n кандидатов один из трёх возможных исходов: - кандидат уже может считаться избранным в парламент независимо от распределения голосов оставшихся m - a жителей;
- кандидат имеет возможность быть избранным в парламент после подведения итогов выборов;
- кандидат не может быть избранным в парламент независимо от распределения голосов оставшихся m - a жителей.
Выходные данные Выведите последовательность из n целых чисел r1, r2, ..., rn, где: - ri = 1, если i-й кандидат гарантированно будет избран в парламент независимо от распределения голосов оставшихся m - a жителей;
- ri = 2, если i-й кандидат имеет шанс быть избранным в парламент, то есть оставшиеся m - a жителей могут проголосовать таким образом, что он будет избран в парламент;
- ri = 3, если i-й кандидат не будет избран в парламент независимо от распределения голосов оставшихся m - a жителей.
| |
|
|
K. Проездные билеты
жадные алгоритмы
реализация
сортировки
*1800
Вечером Поликарп решил проанализировать свои сегодняшние расходы на поездки в общественном транспорте. Автобусная сеть в столице Берляндии устроена таким образом, что каждый автобус курсирует по маршруту между двумя конечными остановками. Промежуточных остановок у автобуса нет. Таким образом, каждый из автобусов непрерывно курсирует по маршруту от одной конечной остановки до другой и назад. Между парой остановок курсирует не более одного автобуса. Поликарп совершил n поездок на автобусе, каждая из которых задается названием остановки, откуда он уехал, и названием остановки, куда он приехал. В записях Поликарпа поездки следуют в хронологическом порядке. Известно, что одна поездка на автобусе любого маршрута стоит a бурлей. Однако, если пассажир совершает пересадку, то цена поездки уменьшается до b бурлей (b < a). Считается, что пассажир совершает пересадку, если остановка, на которой он садится в автобус, совпадает с остановкой, на которой он вышел из предыдущего автобуса. Очевидно, что первая поездка не может быть совершена после пересадки. Например, если Поликарп совершил последовательно три поездки: «BerBank» «University», «University» «BerMall», «University» «BerBank», то он заплатит a + b + a = 2a + b бурлей. Из BerBank он приехал в University, там пересел и поехал в BerMall. Затем он прошёл пешком до University и вернулся в BerBank. Поликарп мог купить не более чем k проездных по цене f бурлей за один проездной. Проездной покупается для одного автобусного маршрута и делает любую поездку по этому маршруту (в любом направлении) бесплатной. Единожды купленный проездной может использоваться неограниченное количество раз любом из двух направлений. Какую наименьшую сумму денег мог потратить Поликарп сегодня, если бы приобрел не более k проездных оптимальным образом? Выходные данные Выведите наименьшую сумму денег, которую Поликарп мог потратить сегодня, если бы приобрел не более k проездных оптимальным образом. Примечание В первом примере Поликарп может купить проездной на маршрут «BerBank University», потратив 8 бурлей. Заметим, что его вторая поездка «University» «BerMall» совершается после пересадки; следовательно, за эту поездку он заплатит 3 бурля. Таким образом, искомая сумма денег равна 8 + 3 = 11 бурлей. Во втором примере Поликарпу невыгодно покупать проездные. Заметим, что каждая его поездка, кроме первой, совершена после пересадки. Следовательно, искомая сумма денег равна 2 + 1 + 1 + 1 = 5 бурлей.
| |
|
|
B. Rooter's Song
геометрия
Конструктив
реализация
сортировки
Структуры данных
*1900
Куда бы мы не шли, кого бы не нашли, на нашем месте, исполним эту песню вместе! На плоскости расположена прямоугольная сцена размера w × h с вершинами в точках (0, 0), (w, 0), (w, h) и (0, h). По краям сцены находятся n танцоров. i-й из них относится к одной из следующих групп: - Вертикальные: стоит в (xi, 0), двигается в положительном направлении y (вверх);
- Горизонтальные: стоит в (0, yi), двигается в положительном направлении x (вправо).
В соответствии с планом танца, i-й танцор должен стоять на месте первые ti миллисекунд, а затем начать двигаться в заданном направлении со скоростью 1 единица в миллисекунду, пока не достигнет другого края сцены. Никакие два танцора не имеют одновременно совпадающую группу, позицию и время ожидания. Когда два танцора сталкиваются (т.е. находятся в одной точке, и оба из них двигаются), они мгновенно обмениваются направлениями движения и продолжают двигаться. Танцоры останавливаются, как только они достигнут границы. Найдите точку остановки для каждого танцора. Выходные данные Выведите n строк, i-я из которых содержит два целых числа (xi, yi) — позицию остановки i-го танцора. Примечание Первый пример соответствует начальной расстановке, показанной в условии, траектории танцоров показаны различными цветами на следующем рисунке. Во втором примере никакие танцоры не сталкиваются.
| |
|
|
C. Петя и дерево
Бинарный поиск
Деревья
поиск в глубину и подобное
сортировки
Теория вероятностей
*2200
Однажды после тяжелого рабочего дня Пете приснился страшный сон. И было в том сне большое бинарное дерево поиска. Но не дерево пугало Петю, а то, что не получалось у Пети искать в этом дереве элементы. Сколько ни пробовал Петя загадывать ключ и искать его в дереве, каждый раз приходил куда-то не туда. Долго мучился Петя, много загадывал ключей, и все одно и то же. Отчание стало охватывать Петю, как вдруг на него снизошло озарение: каждый раз, когда он искал ключ, этого ключа не было в дереве, и при этом случалась ровно одна ошибка. "Не беда!" — подумал Петя, — "А посчитаю-ка я матожидание значения элемента, который находится при поиске данного ключа." Только он собрался это сделать, как, вдруг, проснулся. Итак, вам дано бинарное дерево поиска, то есть дерево, у которого в каждой вершине записано некоторое число, называемое ключом вершины. Количество сыновей у каждой вершины дерева равно либо 0, либо 2. Вершины, имеющие 0 сыновей, называются листьями, а вершины, имеющие 2 сыновей, называются внутренними. У внутренней вершины есть левый сын, то есть сын, у которого ключ меньше ключа текущей вершины, и правый сын, у которого ключ больше ключа текущей вершины. Потомками некоторой вершины называются все вершины, достижимые из нее. То есть это непосредственные сыновья вершины, сыновья сыновей, и так далее. Левые потомки вершины — потомки ее левого сына. Аналогично, правые потомки вершины — потомки ее правого сына. По свойству дерева поиска, ключ любой вершины строго больше всех ключей левых потомков вершины и строго меньше всех ключей правых потомков вершины. Так же вам задан набор ключей поиска, все из которых различны и отличаются от ключей вершин, имеющихся в дереве. Для каждого ключа из набора выполняется его поиск в дереве. Поиск устроен следующим образом: изначально мы находимся в корне дерева, если ключ текущей вершины больше нашего ключа поиска, то мы переходим в левого сына вершины, иначе переходим в правого сына вершины, и процесс повторяется. Так как ключ поиска гарантированно не содержится в дереве, поиск всегда будет останавливаться в листьях дерева. Ключ, лежащий в листе, объявляется результатом поиска. Достоверно известно, что в ходе этого поиска мы ровно один раз ошибемся в сравнении, то есть пойдем не туда куда надо, а дальше ошибаться не будем. Все возможные ошибки равновероятны, то есть рассматриваются все такие поиски, в которых происходит ровно одна ошибка. Ваша задача — для каждого ключа поиска найти математическое ожидание (среднее значение) результата поиска, при условии что в этом поиске происходит ровно одна ошибка. То есть, надо для набора путей, в которых содержится ровно одна ошибка поиска заданного ключа, посчитать среднее значение ключей, находящихся в листьях этих путей. Выходные данные Выведите k действительных чисел, являющихся матожиданиями ответов для ключей, заданных во входе. Ответ должен отличаться от правильного с относительной или абсолютной погрешностью не более 10 - 9. Примечание В первом сэмпле поиск ключа 1 с одной ошибкой порождает в дереве два пути: (1, 2, 5) и (1, 3, 6), в скобках перечислены номера вершин от корня к листу. Ключи в листьях этих путей равны 6 и 10 соответственно, поэтому ответ равен 8.
| |
|
|
E. Сторожевые башни
Бинарный поиск
геометрия
графы
снм
сортировки
*2600
В одном далеком-предалеком королевстве живет жадный-прежадный король. Для защиты своих владений он построил n сторожевых башен. Помимо башен, в королевстве есть две армии, во главе каждой из которых стоит властный и самодовольный генерал. Генералы терпеть не могут друг друга, в частности, они никогда не допустят, чтобы в одной из башен находились солдаты обеих армий. Во время оборонительных действий для управления сторожевой башней генералу необходимо направить часть своей армии в эту башню. Каждый генерал требует у короля гонорар за управление башнями. Поскольку они живут в действительно очень далеком королевстве, каждый генерал оценивает свой гонорар следующим странным образом: он находит две самые удаленные башни, в которых находятся солдаты его армии и требует гонорар, равный этому расстоянию. Каждую башню можно считать точкой на плоскости с координатами (x, y), а расстояние между двумя точками с координатами (x1, y1) и (x2, y2) определяется в этом королевстве как |x1 - x2| + |y1 - y2|. Жадного короля не совсем устроило такое требование генералов, поэтому он лишь согласился выплатить один гонорар на двоих генералов, равный максимальному из запрашиваемых двух гонораров. Однако, жадность все еще не дает покоя королю, поэтому из всех таких распределений башен между армиями, он хочет отыскать наиболее дешевое. Каждая башня должна быть занята солдатами ровно одной армии. Для этих целей он нанял Вас. Вам необходимо найти минимальное количество денег, которое хватит для оплаты гонорара. А так как король еще крайне щепетилен, вы должны посчитать количество распределений, которые стоят такой же суммы денег. Поскольку их число может быть крайне велико, королю достаточно знать его значение в виде остатка от деления на 109 + 7. Два распределения называются различными, если различаются множества башен, занятых солдатами первого генерала. Выходные данные В первую строку выведите минимальное количество денег, которого хватит для выплаты гонорара генералам. Во вторую строку выведите количество распределений, которые можно реализовать, используя минимальный гонорар. Это число необходимо вычислить по модулю 1000000007 (109 + 7). Примечание В первом примере всего две башни, растояние между которыми равно 2. Если мы отдадим одному генералу все две башни, то генералам необходимо будет заплатить 2 условные единицы. В случае когда каждый генерал получит в командование по башне, величина гонорара будет равно 0. Это и есть минимальный гонорар, как не трудно заметить, его мы можем получить двумя способами.
| |
|
|
C. Дом
жадные алгоритмы
сортировки
*2100
Билл — известный математик в стране. Благодаря его революционным открытиям в области математики, он заработал достаточно денег, чтобы построить прекрасный дом. К сожалению, за неуплату налогов на собственность, суд решил наказать Билла, убрав некоторые части он его дома Дом Билла может быть представлен как выпуклый правильный 2n-угольник A0 A1... A2n - 1 A2n, A2n = A0, каждая сторона имеет длину ровно 1 метр. Суд постановил следующие правила для удаления частей дома: - Разделим каждую сторону Ak Ak + 1, k = 0... 2n - 1 на n равных частей длины 1 / n точками P0, P1, ..., Pn - 1
- На каждом ребре A2k A2k + 1, k = 0... n - 1 суд выберет одну точку B2k = Pi для некоторого i = 0, ..., n - 1 такую, что
- На каждом ребре A2k + 1A2k + 2, k = 0...n - 1 Билл выберет одну точку B2k + 1 = Pi для некоторого i = 0, ..., n - 1 такую, что
- Биллу останется часть дома, ограниченная 2n-угольником B0 B1... B2n - 1
Билл узнал, какие точки B2k выбрал суд. Несмотря на то, что он великий математик, его дом очень большой и ему сложно все рассчитать. Поэтому он просит вас помочь ему выбрать точки так, чтобы максимизировать площадь дома, которая ему останется. Выходные данные Выведите n различных целых чисел, описывающих точки B1, B3, ..., B2n - 1, которые Билл должен выбрать, чтобы оставить себе максимально возможную площадь дома. Примечание Чтобы максимизировать площадь в примере, Билл должен выбрать следующие точки: B1 = P0, B3 = P2, B5 = P1 
| |
|
|
B. Встреча жюри
жадные алгоритмы
сортировки
*1800
В стране Мегаполия уже подходит время проведения олимпиады Мегаполисов, и все члены жюри должны собраться в главном городе страны — Мегаполисе, чтобы подготовить задачи соревнования. Всего в стране есть n + 1 городов, пронумерованных числами от 0 до n. Город 0 — Мегаполис, в этом городе должны собраться все члены жюри. В городах с номерами от 1 до n живут члены жюри олимпиады, по одному в каждом городе. Подготовка олимпиады — долгий и ответственный процесс, занимающий k дней. Все эти k дней в работе над олимпиадой должны принимать участие все n членов жюри, и все они должны для этого быть в Мегаполисе во время подготовки. Вам известно расписание ближайших рейсов (жюри олимпиады — люди серьёзные, а потому только летают самолётами). Все полёты в Мегаполии осуществляются только в Мегаполис и из него. В день своего прилёта и отлёта член жюри занят дорогой и не может участвовать в обсуждении олимпиады. Все рейсы в Мегаполии вылетают и прилетают в один и тот же день. Собрать всех членов жюри вместе на k дней в столице — задача сложная, потратить при этом минимальное количество денег — почти невозможная. Тем не менее вам нужно найти самый дешёвый способ сначала собрать в Мегаполисе всех членов жюри, чтобы они могли работать вместе k дней, а затем отправить их обратно в родные города. Стоимостью способа называется суммарная стоимость билетов на все необходимые рейсы. При этом каждый член жюри в отдельности может пребывать в Мегаполисе и больше k дней. Выходные данные Выведите одно целое число — стоимость самого дешёвого способа собрать всех членов жюри в городе 0 на k дней и затем вернуть их всех в родные города. Если собрать всех на k дней в Мегаполисе, а затем отправить всех обратно по домам невозможно, выведите «-1» (без кавычек). Примечание В первом примере оптимальный способ собрать всех в Мегаполисе — использовать рейсы, выполняемые в дни 1, 2, 8 и 9. Единственный альтернативный вариант, который заключается в том, чтобы отправить члена жюри из второго города домой в день 15, будет на 2500 дороже. Во втором примере невозможно отправить домой из Мегаполиса члена жюри из города 2.
| |
|
|
D. Телефонная книга Поликарпа
реализация
сортировки
Структуры данных
*1600
В телефонной книге Поликарпа записаны n телефонных номеров. Каждый номер — это целое 9-значное число, которое начинается с отличной от 0 цифры. Все номера — различны. На телефоне Поликарпа установлена последняя версия операционной системы Berdroid. При частичном наборе номера Berdroid подсказывает все номера из телефонной книги, подстрокой которых является набранная последовательность цифр. Например, если в телефонной книге Поликарпа записаны три номера 123456789, 100000000 и 100123456, то: - при наборе последовательности цифр 00 будут подсказаны номера 100000000 и 100123456,
- при наборе последовательности цифр 123 будут подсказаны номера 123456789 и 100123456,
- а при наборе последовательности цифр 01 будет подсказан только номер 100123456.
Для каждого номера в телефонной книге Поликарпа найдите наименьшую по длине последовательность цифр, которую надо набрать, чтобы Berdroid подсказал только один этот номер. Выходные данные Выведите ровно n строк: i-я строка должна содержать наиболее короткую непустую последовательность цифр, при наборе которой будет подсказан только один i-й номер из телефонной книги. Если таких последовательностей несколько, выведите любую из них.
| |
|
|
E. Махмуд, Ехаб и функция
Бинарный поиск
сортировки
Структуры данных
*2100
Доктора Зло интересует математика, поэтому он дал Махмуду и Ехабу массив a длины n и массив b длины m. Он рассматривает функцию f(j), которая определена для целых чисел j, удовлетворяющих 0 ≤ j ≤ m - n. Положим ci = ai - bi + j. Тогда f(j) = |c1 - c2 + c3 - c4... cn|. Более формально, . Доктор Зло хочет, чтобы Махмуд и Ехаб нашли минимальное значение функции для всех допустимых j. Он понимает, что это слишком простая задача, поэтому он решил её усложнить. Он просит их обработать q запросов изменения. Во время каждого запроса Махмуд и Ехаб должны прибавить xi ко всем элементам a в диапозоне [li;ri], то есть прибавить xi к ali, ali + 1, ... , ari. После каждого запроса им требуется посчитать минимальное значение f(j) для всех допустимых j. Помогите Махмуду и Ехабу. Выходные данные В первой строке выведите минимальное значение функции f до всех запросов. Затем выведите q строк, в i-й из которых должно содержаться минимальное значение функции f после запроса с номером i. Примечание В первом тестовом примере до первого запроса минимум достигается при j = 0 и равен f(0) = |(1 - 1) - (2 - 2) + (3 - 3) - (4 - 4) + (5 - 5)| = |0| = 0. После первого запроса a становится равным {11, 2, 3, 4, 5}, а минимум достигается при j = 1 и равен f(1) = |(11 - 2) - (2 - 3) + (3 - 4) - (4 - 5) + (5 - 6) = |9| = 9. После второго запроса a становится равным {2, 2, 3, 4, 5}, минимум достигается при j = 1 и равен f(1) = |(2 - 2) - (2 - 3) + (3 - 4) - (4 - 5) + (5 - 6)| = |0| = 0. После третьего запроса a становится равным {1, 1, 2, 3, 4}, минимум достигается при j = 0 и равен f(0) = |(1 - 1) - (1 - 2) + (2 - 3) - (3 - 4) + (4 - 5)| = |0| = 0
| |
|
|
B. Сплав каякеров
жадные алгоритмы
Перебор
сортировки
*1500
Вадим очень любит путешествовать. Недавно он услышал о том, что в его городке появился клуб каякеров, и его очень заинтересовал этот вид путешествия. Поэтому Вадим присоединился к группе каякеров и готов отправиться в сплав. Сейчас группе нужно распределиться по каякам. В группе 2·n человек (включая Вадима), и у них есть ровно n - 1 двухместных и 2 одноместных каяка. Вес i-го человека равен wi, и вес очень важен в сплаве — если разница весов двух человек, сидящих в двухместном каяке, слишком велика, то каяк становится неустойчивым и может перевернуться. И, конечно же, каякеры хотят распределиться по плавсредствам так, чтобы этого не произошло. Формально, неустойчивость одноместного каяка всегда равна 0, а неустойчивость двухместного каяка равна модулю разности между весами людей, которые заняли этот каяк. Неустойчивость всей группы — это сумма неустойчивостей всех каяков. Помогите группе определить минимально возможную суммарную неустойчивость! Выходные данные Выведите минимально возможную неустойчивость группы.
| |
|
|
E. Выключение телевизора
сортировки
Структуры данных
*2000
Девочка Люба снова нуждается в вашей помощи! У Любы есть n телевизоров. Она знает, что i-й телевизор включен в моменты времени с li по ri включительно. Люба хочет выключить один из телевизоров из розетки, чтобы зарядить телефон. Назовём телевизор лишним, если после его выключения количество целочисленных моментов времени, в которые работает хотя бы один из оставшихся включенным телевизоров, не уменьшится. Люба очень расстроится, если ей придётся выключить не лишний телевизор. Помогите ей, сообщив индекс произвольного лишнего телевизора. Если такого телевизора нет, выведите «-1». Выходные данные Если в данном наборе нет лишнего телевизора, выведите «-1» (без кавычек). Иначе же выведите индекс этого телевизора (телевизоры нумеруются от 1 до n в порядке следования во входных данных). Если ответов несколько, выведите любой. Примечание Рассмотрим первый тестовый пример. Изначально все моменты времени, в которые включен хотя бы один из телевизоров, составляют отрезок времени [1;7]. Можно легко увидеть, что после выключения первого телевизора данный отрезок не изменится. Также лишним может являться второй телевизор, потому что после его выключения отрезок времени, в который работает хотя бы один из оставшихся включенным телевизор, тоже не изменится. Обратите внимание, что в четвёртом тестовом примере можно выключить телевизор с номером 2, так как даже без него целочисленные моменты, когда работает хотя бы один из оставшихся телевизоров, будут составлять отрезок [1;4].
| |
|
|
A. Честная игра
реализация
сортировки
*1000
Петя и Вася решили сыграть в игру. Для этого у них есть n карточек (n — чётное число), на каждой из которых записано одно целое число. До игры Петя выберет одно целое число, а затем Вася — другое целое число (отличное от числа, которое выбрал Петя). В ходе игры они заберут себе все карточки, на которых записаны выбранные ими числа. К примеру, если до игры Петя выбрал число 5, то он заберёт себе все карточки, на которых записано число 5, если Вася выбрал число 10, то он заберёт себе все карточки, на которых записано число 10. Игра считается честной, если Петя и Вася забрали себе все n карточек, при этом каждый из них забрал поровну карточек. Определите, могут ли Петя и Вася выбрать до игры числа таким образом, чтобы игра была честной. Выходные данные Если Петя и Вася не смогут выбрать по числу до игры таким образом, чтобы игра была честной, выведите в первую строку «NO» (без кавычек). В этом случае ничего больше выводить не нужно. В противном случае выведите в первую строку «YES» (без кавычек), а во вторую строку выведите два различных числа — число, которое должен выбрать Петя, и число, которое должен выбрать Вася, чтобы игра была честной. Если ответов несколько, разрешается вывести любой из них. Примечание В первом примере игра будет честной, если, например, Петя выберет число 11, а Вася — число 27. Тогда они заберут себе все карточки, при этом Петя заберёт себе 1-ю и 4-ю, а Вася — 2-ю и 3-ю. Таким образом, каждый из них заберёт ровно по две карточки. Во втором примере честная игра невозможна, так как числа на карточках равны между собой, а числа, которые выберут Петя и Вася до игры, должны быть различными. В третьем примере невозможно забрать все имеющиеся карточки. Петя и Вася максимально смогут забрать пять карточек, если, например, Петя выберет число 10, а Вася выберет число 20. Но для честной игры необходимо, чтобы они забрали себе все 6 имеющихся карточек.
| |
|
|
E. Пожар
дп
сортировки
*2000
У Поликарпа беда — пожар! Время спасать самое ценное. Поликарп оценил, что на спасение вещи i ему потребуется ti секунд времени. Кроме того, для каждой вещи он оценил величину di — время, через которое вещь i сгорит и больше не будет представлять какую-либо ценность. В частности, если ti ≥ di, то вещь i спасти невозможно. Зная ценность pi каждой из вещей, найдите такой набор вещей, что Поликарп сможет спасти все эти вещи, и при этом суммарная ценность спасённых вещей будет максимальной. Спасение вещей происходит последовательно. Например, если он спасает сначала вещь a, а потом b, то вещь a будет спасена через ta секунд, а вещь b через ta + tb секунд. Выходные данные В первую строку выведите максимальную возможную суммарную ценность набора спасенных вещей. Во вторую строку выведите целое число m — количество вещей в искомом наборе. В третью строку выведите m различных целых чисел — номера спасенных вещей в порядке их спасения. Вещи нумеруются, начиная с единицы, в том же порядке, в котором они заданы во входных данных. Если ответов несколько, разрешается вывести любой из них. Примечание В первом примере Поликарп успеет спасти любые две вещи, но, чтобы максимизировать ценность спасённых вещей, он должен спасти вторую и третью вещь. Например, он может сначала спасти третью вещь через 3 секунды, а затем ещё через 2 секунды спасти вторую вещь. Таким образом, суммарная ценность спасённых вещей будет равна 6 + 5 = 11. Во втором примере Поликарп успеет спасти только первую вещь, так как даже если он сразу начнёт спасать вторую вещь, то к тому моменту, когда ему удастся её спасти (через 3 секунды), она уже полностью сгорит.
| |
|
|
B. Заказ пиццы
Бинарный поиск
сортировки
Тернарный поиск
*1900
Проходит очередной финал Start[c]up, поэтому необходимо заказать пиццу для финалистов, участвующих в соревновании в офисе компании. Существует всего два типа пиццы (конечно нет, но в этой задаче будем считать, что да), все пиццы содержат одинаковое число S кусочков. Известно, что i-й участниц съест si кусочков пиццы, и получит ai единиц счастья от съедания каждого кусочка пиццы первого типа, и bi единиц счастья от съедания каждого кусочка пиццы второго типа. Мы можем заказать любое число пицц первого и второго типов, но мы хотим заказать минимальное число пицц, необходимое для того, чтобы все участники могли съесть необходимое каждому число кусочков. Учитывая это ограничение, какое максимальное суммарное число единиц счастья могут получить участники? Выходные данные Выведите максимальное суммарное счастье, которое могут получить участники. Примечание В первом примере нужно купить лишь одну пиццу. Если это будет пицца первого типа, то суммарное счастье будет равно 3·5 + 4·6 + 5·9 = 84, а если купить пиццу второго типа — то суммарное счастье будет равно 3·7 + 4·7 + 5·5 = 74.
| |
|
|
D. Красивая дорога
графы
Деревья
дп
поиск в глубину и подобное
реализация
снм
сортировки
*2300
Давным давно где-то в Азии в одной стране шли междоусобные войны. Каждый из n городов хотел захватить власть, поэтому иногда один город собирал армию и отправлял ее в поход против другого города. Прокладывание дорог было делом трудным, поэтому их в стране было мало, а именно n - 1. Также из любого города до любого другого можно было добраться по этим дорогам. Даже во время войны жители Востока остаются людьми духовно богатыми и ценящими красоту природы. И, дабы оставить на века память о своем великом походе, на дороге, на которой в пути армия провела больше всего времени, сажали одно красивое дерево. Жители Востока любят природу, поэтому если таких дорог было несколько, то по одному дереву сажалось на каждой. Недавно, когда были обнаружены летописи той войны, выяснилось, что каждый город напал на каждый ровно по одному разу. Всего было ровно n(n - 1) походов. Всем стало интересно, какая дорога после тех войн стала самой красивой, то есть на какой дороге посадили больше всего красивых деревьев. Выходные данные В первой строке выведите два числа — количество красивых деревьев на самой красивой дороге и количество самых красивых дорог. Во второй строке выведите список самых красивых дорог, в порядке возрастания номеров. Дороги пронумерованы от 1 до n - 1 в том порядке, в котором они даны во входных данных. Пожалуйста, не используйте спецификатор %lld для записи 64-х битовых чисел на С++. Рекомендуется использовать поток cout (также вы можете использовать спецификатор %I64d).
| |
|
|
B. Сортировка монет
реализация
снм
сортировки
*1500
Недавно Дима познакомился с Сашей в филателистическом магазине, и с тех пор они собирают монеты вместе. Их любимое занятие — сортировать коллекции монет. Саше нравится порядок, поэтому он хочет, чтобы монеты были расположены в ряд, причём сначала шли монеты, вышедшие из обращения, а потом монеты, всё ещё находящиеся в обращении. Для упорядочивания монет Дима использует алгоритм, один шаг которого выглядит следующим образом: - Дима просматривает все монеты слева направо;
- если он видит, что i-я монета ещё в ходу, а (i + 1)-я уже вышла из обращения, то он меняет эти две монеты местами, и продолжает смотреть на монеты дальше, начиная с (i + 1)-й.
Дима повторяет этот шаг до тех пор, пока не окажется, что на очередном шаге не произошло ни одного обмена. Сложностью упорядочивания Дима называет количество шагов, которые ему требуются в соответствии с процедурой, описанной выше, то есть, количество раз, которое он будет начинать просматривать монеты с начала. В частности, для уже упорядоченной исходной последовательности монет сложность упорядочивания равна единице. Сегодня Саша в очередной раз позвал Диму в гости, чтобы предложить ему следующую игру. Сначала он выложил в ряд перед Димой n монет, все из которых вышли из обращения. Затем Саша n раз выбирает какую-то из монет, которая вышла из обращения, и заменяет её на монету, которая находится в обращении. В ходе этого процесса Саша постоянно интересуется у Димы, какова на данный момент сложность упорядочивания последовательности. Задачу усложняет тот факт, что Диме нельзя трогать монеты, и поэтому определять сложность упорядочивания ему приходится в уме. Помогите Диме справиться с этим заданием. Выходные данные Выведите n + 1 чисел a0, a1, ..., an, где a0 — сложность упорядочивания последовательности в начале, a1 — сложность упорядочивания после замены одной монеты и так далее. Примечание Разберём первый пример. Будем обозначать за O монету, вышедшую из обращения, а за X — монету в обращении. Изначально в ряду лежат монеты, вышедшие из обращения, поэтому Дима один раз просмотрит их слева направо, и не совершит никаких обменов. После замены Сашей первой монеты на находящуюся в обращении Дима на первом шаге алгоритма три раза поменяет эту монету с последующей, после чего один раз просмотрит монеты и завершит процесс: XOOO → OOOX После замены Сашей третьей монеты действия Димы выглядят следующим образом: XOXO → OXOX → OOXX После замены Сашей четвёртой монеты действия Димы выглядят следующим образом: XOXX → OXXX Наконец, после замены Сашей второй монеты весь ряд оказывается состоящим из монет, находящихся в обращении, и Дима один раз просмотрит ряд слева направо.
| |
|
|
J. Renovation
жадные алгоритмы
Конструктив
сортировки
*2400
The mayor of the Berland city S sees the beauty differently than other city-dwellers. In particular, he does not understand at all, how antique houses can be nice-looking. So the mayor wants to demolish all ancient buildings in the city. The city S is going to host the football championship very soon. In order to make the city beautiful, every month the Berland government provides mayor a money tranche. The money has to be spent on ancient buildings renovation. There are n months before the championship and the i-th month tranche equals to ai burles. The city S has m antique buildings and the renovation cost of the j-th building is bj burles. The mayor has his own plans for spending the money. As he doesn't like antique buildings he wants to demolish as much of them as possible. For the j-th building he calculated its demolishing cost pj. The mayor decided to act according to the following plan. Each month he chooses several (possibly zero) of m buildings to demolish in such a way that renovation cost of each of them separately is not greater than the money tranche ai of this month (bj ≤ ai) — it will allow to deceive city-dwellers that exactly this building will be renovated. Then the mayor has to demolish all selected buildings during the current month as otherwise the dwellers will realize the deception and the plan will fail. Definitely the total demolishing cost can not exceed amount of money the mayor currently has. The mayor is not obliged to spend all the money on demolishing. If some money is left, the mayor puts it to the bank account and can use it in any subsequent month. Moreover, at any month he may choose not to demolish any buildings at all (in this case all the tranche will remain untouched and will be saved in the bank). Your task is to calculate the maximal number of buildings the mayor can demolish. Output Output single integer — the maximal number of buildings the mayor can demolish. Note In the third example the mayor acts as follows. In the first month he obtains 6 burles tranche and demolishes buildings #2 (renovation cost 6, demolishing cost 4) and #4 (renovation cost 5, demolishing cost 2). He spends all the money on it. After getting the second month tranche of 3 burles, the mayor selects only building #1 (renovation cost 3, demolishing cost 1) for demolishing. As a result, he saves 2 burles for the next months. In the third month he gets 2 burle tranche, but decides not to demolish any buildings at all. As a result, he has 2 + 2 = 4 burles in the bank. This reserve will be spent on the fourth month together with the 4-th tranche for demolishing of houses #3 and #5 (renovation cost is 4 for each, demolishing costs are 3 and 5 correspondingly). After this month his budget is empty. Finally, after getting the last tranche of 3 burles, the mayor demolishes building #6 (renovation cost 2, demolishing cost 3). As it can be seen, he demolished all 6 buildings.
| |
|
|
E. Маленький брат
Бинарный поиск
геометрия
сортировки
*2800
Маленький брат Маши-умняши отметил на клетчатой бумаге две различные точки. После этого он нарисовал несколько окружностей и отдал листок сестре. Маша только что вернулась из школы с урока по геометрии, поэтому она сразу заметила несколько особенностей на рисунке брата. Во-первых, прямая, проходящая через точки, нарисованные братом, не пересекает ни одну из окружностей и не касается ни одной из окружностей. Во-вторых, окружности также попарно не пересекаются, не касаются и не вкладываются. Но Машу не просто так называют умняшей. Для каждой окружности она нарисовала квадрат со сторонами параллельными осям координат минимальной площади, что окружность полностью лежит внутри этого квадрата. Из такого рисунка Маша сразу увидела, что получившиеся квадраты также не пересекаются, не касаются и не вкладываются. Теперь Маше-умняше стало интересно, какого минимального радиуса можно провести окружность через две точки, нарисованные братом, чтобы эта окружность не пересекала ни одной из уже нарисованных окружностей. Но уже нарисованные окружности могут быть внутри или касаться окружности, которую хочет нарисовать Маша. Гарантируется, что ответ не превосходит 1012. Обратите внимание, что для взломов это условие также должно выполняться. Выходные данные Выведите такое минимальное вещественное число, что возможно провести окружность через заданные точки, не пересекающие заданные окружности. Ответ будет считаться верным, если его относительная или абсолютная ошибка не превосходит 10 - 4. Примечание 
| |
|
|
F. Модельный ряд
жадные алгоритмы
сортировки
*2500
Завершающий акт показа мод устроен так: все модели выходят на сцену и встают в один ряд бок о бок, а справа от них всех встаёт модельер. На репетиции этого выхода Изабелле показалось, что ряд получился некрасивым, но она никак не может придумать, как его исправить. Как и многие люди, долго находящиеся в мире искусства, Изабелла обладает своеобразным чувством прекрасного. Оценивая красоту ряда моделей, она руководствуется их ростом. Она считает ряд красивым, если для каждой модели расстояние до ближайшего более низкого человека (т.е. модели или модельера) справа не превосходит k (расстояние между соседними людьми равно 1, расстояние между людьми, между которыми стоит один человек, равно 2 и т.д.). Она хочет сделать ряд красивым, но у режиссёра тоже есть своё чувство прекрасного, так что она может поменять местами не более одной пары людей, причем таких, что в изначальном ряду левый человек пары был строго выше правого человека пары. Модельер (человек, стоящий справа от моделей) имеет рост строго меньший чем рост каждой модели и не может участвовать в смене мест. Скажите можно ли оставить ряд неизменным или поменять местами пару людей так, чтобы ряд стал красивым для Изабеллы. Выходные данные Выведите «YES» (без кавчек), если ряд можно оставить или сделать красивым, и «NO» (без кавчек) иначе.
| |
|
|
B. XK Отрезки
Бинарный поиск
математика
сортировки
*1700
Пока Вася доедал свой кусок пиццы, пара уже началась. За опоздание на пару преподаватель предложил Васе поразмыслить над одной интересной задачей. Васе даны массив a и целое число x. Ему необходимо вычислить количество различных пар индексов (i, j) для которых ai ≤ aj и существует ровно k целых чисел y таких, что ai ≤ y ≤ aj и при этом y делится на x без остатка. В данной задаче считается, что пара (i, j) не равна паре (j, i), если j не равно i, то есть (1, 2) и (2, 1) это две разные пары. Выходные данные Выведите одно целое число — ответ на задачу. Примечание В первом тесте подходят только следующие пары индексов: (1, 2), (2, 3), (3, 4). Во втором тесте подходят пары индексов (1, 1), (2, 2), (3, 3), (4, 4). В третьем тесте подходит любая пара индексов (i, j). Поэтому ответ равен 5 * 5 = 25.
| |
|
|
A. Генерация логина
жадные алгоритмы
Перебор
сортировки
*1000
Логин пользователя в Полигоне состоит из префикса его имени и префикса его фамилии, соединенных последовательно в таком порядке. Каждый префикс должен быть непустым, но может совпадать с именем/фамилией. Обычно для пользователя существует несколько возможных логинов. Вам даны имя и фамилия пользователя. Верните первый в алфавитном порядке логин, который может получить этот пользователь (предположите, что все возможные логины свободны). Напомним, что префикс строки s — это любая подстрока, с которой начинается s: «a», «ab», «abc» и т.д. являются префиксами строки «abcdef», а «b» и «bc» — нет. Строка a следует в алфавитном порядке раньше строки b, если a является префиксом b, или a и b до некоторой позиции совпадают, а затем в a идет буква, стоящая в алфавите раньше, чем буква в b на той же позиции: «a» и «ab» следуют раньше строки «ac», а «b» и «ba» — позже. Выходные данные Выведите одну строку — первый по алфавиту логин, который может получить пользователь. Логин также записан строчными буквами.
| |
|
|
C. Перун, ультуй!
жадные алгоритмы
Перебор
сортировки
*2500
Многие студенты с пользой проводят новогодние каникулы. Влад особенно преуспевает в этом! Третьи сутки напролет, держась на салатах и мандаринах, оставшихся с новогоднего стола, он калибрует ранг в своей любимой MOBA-игре, играя за героя по имени Перун. Абсолютная способность Перуна — «Гнев грома» — при применении мгновенно отнимает у каждого из n врагов на карте по очков здоровья в качестве единовременного эффекта. У нее есть ограничение — она может быть активирована только в момент времени, являющийся целым числом. Награда за убийство врага изначально равна и увеличивается каждую секунду на . Формально, если после применения «Гнева грома» в секунду t здоровье врага i станет меньшим или равным нулю, то Влад получит золота за его убийство. Каждый враг может получать урон, а может восполнять здоровье — и все это множеством различных способов. Влада, впрочем, не интересуют детали; для каждого из n героев он лишь знает: -
— максимальное количество очков здоровья героя i; -
— количество очков здоровья героя в секунду 0; -
— количество очков здоровья, которое герой i восстанавливает за одну секунду (очки добавляются сразу же по наступлении следующей секунды). Еще Влад знает о m изменениях здоровья в ходе игры: -
— секунда, в которую изменяется здоровье врага; -
— враг, у которого изменяется здоровье; -
— новое количество очков здоровья врага enemyj. Естественно, из игры Влад хочет вынести максимум пользы и, если потребуется, он, забыв об учебе, будет выжидать годы и годы в ожидании подходящего момента для активации суперспособности. Помогите ему найти секунду от 0 включительно до + ∞ включительно (напомним, что номер секунды должен быть целым числом), чтобы активация «Гнева грома» помогла ему получить максимальное количество золота, и выведите это количество. Выходные данные Выведите в одной строке единственное число — максимальное количество золота, которое Влад может получить в результате единовременного применения способности «Гнев грома», или -1, если количество золота, которое он может получить, может быть бесконечно большим. Примечание На графиках ниже изображены очки здоровья каждого из врагов в зависимости от времени в примерах. Желтым цветом обозначено время, в течение которого Влад может убить одного врага. Фиолетовым цветом обозначено время, в течение которого Влад может убить двух врагов. В первом примере можно применить «Гнев грома» в 50-ю секунду: погибнут враги 2 и 3, так как у них будет 40 и 50 очков здоровья соответственно, и Влад получит награду в 2·(1000 + 50·10) = 3000 золота. Во втором примере максимальное здоровье врага 1 меньше урона, наносимого способностью, поэтому его можно будет убить в любой момент времени, а поскольку награда увеличивается каждую секунду на 50 золота, то максимально возможная награда будет увеличиваться до бесконечности.
| |
|
|
D. Слишком простые задачи
Бинарный поиск
жадные алгоритмы
Перебор
сортировки
Структуры данных
*1800
Вы готовитесь к экзамену по теории расписаний. Экзамен продлится ровно T миллисекунд. На экзамене вас ждут n задач. Каждую задачу номер i вы сможете либо полностью решить, затратив на это ti миллисекунд, либо не решить вовсе, не потратив на нее ни миллисекунды. Времени на отдых после решения задачи вам не потребуется. К несчастью, ваш преподаватель считает, что некоторые задачи слишком просты для вас, поэтому каждой задаче i сопоставил целое число ai, обозначающее, что задача i может принести балл за ее решение только в том случае, если вы решите не более ai задач всего (включая задачу i). Формально, пусть за экзамен вы решите некоторое множество задач p1, p2, ..., pk. Ваш итоговый балл за экзамен s будет равен количеству таких j от 1 до k, что k ≤ apj. Догадавшись, что настоящая первая задача экзамена уже перед вами, вы хотите заранее выбрать подмножество задач для решения на экзамене, которое принесет вам наибольший возможный итоговый балл. Не забудьте, что экзамен ограничен по времени, и вам должно хватить времени на решение всех выбранных задач. Если существуют разные множества задач, ведущие к наибольшему итоговому баллу, вас устроит любое из них. Выходные данные В первой строке выведите целое число s — наибольший возможный итоговый балл. Во второй строке выведите целое число k (0 ≤ k ≤ n) — количество задач, которые вам следует решить. В третьей строке выведите k различных целых чисел p1, p2, ..., pk (1 ≤ pi ≤ n) — номера задач, которые вам следует решить, в любом порядке. Если наилучших множеств задач несколько, выведите любое из них. Примечание В первом примере следует решить задачи с номерами 3, 1 и 4. В таком случае вы потратите 80 + 100 + 90 = 270 миллисекунд, уложившись в длительность экзамена, 300 миллисекунд (и даже оставив себе 30 миллисекунд на отдых). Задачи 3 и 1 принесут вам по одному баллу, а задача 4 — не принесет. В итоге вы наберете два балла. Во втором примере катастрофически не хватает времени на решение даже одной задачи. В третьем примере вы идеально успеваете решить обе задачи за 42 + 58 = 100 миллисекунд и с улыбкой сдать работу преподавателю.
| |
|
|
E. Занятия физкультуры
реализация
сортировки
Структуры данных
*2300
В этом году Алексей окончил школу, и теперь он первокурсник Берляндского Государственного Университета. Для него стало неожиданностью, что, несмотря на специализацию программиста, ему все равно надо было посещать физкультуру! Конец семестра уже не за горами, а Алексей не посетил еще ни одной пары! Разумеется Алексей не хочет вылететь, поэтому ему интересно узнать, сколько рабочих дней осталось до конца семестра, ведь только тогда он может посещать физкультуру. Но в БГУ подсчет количества рабочих дней — задача не из легких: До конца семестра осталось n дней (пронумерованных от 1 до n), и все они изначально рабочие. Затем публикуются q приказов один за другим. Каждый приказ определяется тремя числами l, r и k: - Если k = 1, то все дни с l по r (включительно) становятся выходными. Если некоторые дни до этого были объявлены рабочими, то они все равно становятся выходными;
- Если k = 2, то все дни с l по r (включительно) становятся рабочими. Если некоторые дни до этого были объявлены выходными, то они все равно становятся рабочими.
Помогите Алексею посчитать количество рабочих дней до конца семестра после каждого приказа! Выходные данные Выведите q целых чисел. i-е должно равняться количеству рабочих дней, оставшихся до конца семестра, после того, как опубликованы первые i приказов.
| |
|
|
C. Обмен соседних элементов
жадные алгоритмы
математика
поиск в глубину и подобное
сортировки
*1400
Задан массив a, состоящий из n элементов. Каждое число от 1 до n встречается в этом массиве ровно один раз. Для некоторых позиций i (1 ≤ i ≤ n - 1) разрешается поменять местами i-й элемент и (i + 1)-й, для остальных запрещается. Можно совершать произвольное количество операций в любом порядке. Можно менять местами i-й элемент и (i + 1)-й произовольное количество раз (если позиция разрешена). Можно ли привести массив к отсортированному в возрастающем порядке при помощи таких операций? Выходные данные Если возможно отсортировать массив в возрастающем порядке с помощью любой последовательности операций, то выведите YES. В противном случае выведите NO. Примечание В первом примере можно поменять местами a3 и a4, потом a4 и a5.
| |
|
|
D. Робот-пылесос
жадные алгоритмы
сортировки
*1800
Пес Пушок уже который час гоняется за Импом по всему дому. По счастью, Имп хорошо осведомлен о главном страхе Пушка — жутком роботе-пылесосе. При передвижении по дому робот-пылесос генерирует строку t из букв «s» and «h», производящую много шума. Определим шум строки t как количество вхождений строки «sh» в нее как подпоследовательность, иными словами, количество таких пар (i, j), что i < j и и . В данный момент робот неактивен. Имп знает, что в памяти робота лежит набор строк ti, которые можно переставлять произвольным образом. При запуске эти строки склеиваются в выбранном порядке и получается строка t; итоговый шум получается равным шуму этой склейки. Помогите Импу найти максимальное значение шума, которое он может получить, переставляя строки произвольным образом. Выходные данные Выведите одно число — максимальный уровень шума, который можно достичь оптимальным переупорядочиванием набора строк. Примечание В первом примере оптимальной склейкой является ssshhshhhs.
| |
|
|
B. Распределение ресурсов
Бинарный поиск
реализация
сортировки
*1700
В распоряжении одного отдела одной софтверной компании есть \(n\) серверов разной мощности. Пронумеруем сервера целыми числами от \(1\) до \(n\). Будем считать, что технические характеристики \(j\)-го сервера в компании полностью определяются целочисленным количеством \(c_j\) условных единиц ресурса. Для решения текущих рабочих задач необходимо развернуть на данных серверах два сервиса — \(S_1\) и \(S_2\), которые будут обрабатывать входящие запросы. Обработка входящих запросов сервиса \(S_i\) требует \(x_i\) единиц ресурса сервера. Действие происходит в довольно продвинутой компании, поэтому каждый сервис может быть развёрнут не на одном сервере, а одновременно на нескольких. Если сервис \(S_i\) развёрнут на \(k_i\) серверах, то нагрузка равномерно распределяется между этими серверами, и на каждом сервере используется только \(x_i / k_i\) (возможно, нецелое число) единиц ресурса. Каждый сервер в компании может быть либо не быть использован вообще, либо под какой-то один из сервисов (но не под оба одновременно). Сервис не должен использовать больше ресурсов, чем доступно на сервере. Определите, возможно ли развернуть оба сервиса, используя данный набор серверов, и если да, то определите, какие серверы следует отвести под какой сервис. Выходные данные Если развернуть оба сервиса на данном наборе серверов невозможно, выведите единственное слово «No» (без кавычек). В противном случае в первой строке выведите слово «Yes» (без кавычек). Во второй строке выведите два целых числа \(k_1\) и \(k_2\) (\(1 \leq k_1, k_2 \leq n\)) — количества серверов, отведённых под каждый из сервисов. В третьей строке выведите \(k_1\) целых чисел — номера серверов, которые следует отвести под первый сервис. В четвёртой строке выведите \(k_2\) целых чисел — номера серверов, которые следует отвести под второй сервис. Ни один номер сервера не должен встречаться среди выведенных вами номеров дважды. Если возможных ответов несколько, разрешается вывести любой из них. Примечание В первом тесте из условия на каждом из серверов 1, 2 и 6 будет использовано по \(8 / 3 = 2.(6)\) единиц ресурса, а на каждом из серверов 5 и 4 — по \(16 / 2 = 8\) единиц ресурса. Во втором тесте из условия на первом сервере будет использовано \(20\) единиц ресурса, а на оставшихся серверах — по \(32 / 3 = 10.(6)\) единиц ресурса.
| |
|
|
A. Олимпиада
реализация
сортировки
*800
В недавно прошедшей Всеберляндской олимпиаде по информатике поучаствовали n человек. Каждый участник набрал некоторое количество баллов. Вам, как председателю жюри, необходимо определить множество участников, которые получат дипломы. По правилам олимпиады множество участников, получающих дипломы, должно удовлетворять некоторым требованиям: - Хотя бы один участник получит диплом.
- Участник, набравший 0 баллов, не получит диплом.
- Если участник получает диплом, то все участники, получившие не меньше баллов, чем он, также получат дипломы.
Определите, сколько есть способов выбрать множество участников, которые получат дипломы. Выходные данные Выведите одно целое число — искомое количество способов. Примечание В первом тестовом примере есть три способа выбрать участников, которые получат дипломы: - Только участники, набравшие 3 балла, получат дипломы.
- Участники, набравшие 2 или 3 балла, получат дипломы.
- Все участники получат дипломы.
Во втором тестовом примере единственный корректный способ выдачи дипломов — дать дипломы всем участникам. Обратите внимание, что участники с нулевыми баллами не могут получить диплом, что иллюстрируется третьим примером.
| |
|
|
A. Точки на прямой
жадные алгоритмы
Перебор
сортировки
*1200
Наши тесты не готовы. Впереди крупная олимпиада. Но ведь самая главная цель авторов контеста — сделать еще одну задачу. Назовём диаметром мультимножества точек на прямой максимальное расстояние между двумя точками этого множества. Например, диаметр мультимножества {1, 3, 2, 1} равен 2. Диаметр мультимножества, состоящего из одной точки, равен 0. Даны n точек на прямой. Какое минимальное число точек необходимо убрать, чтобы диаметр мультимножества оставшихся точек не превосходил d? Выходные данные Выведите одно целое число — минимальное количество удалённых точек. Примечание В первом тестовом примере выгодно удалить точку с координатой 4. Оставшиеся точки будут иметь координаты 1 и 2, поэтому диаметр оставшегося мультимножества будет равен 2 - 1 = 1. Во втором тестовом примере диаметр равен 0, поэтому удалять точки не потребуется. В третьем тестовом примере выгодно удалить точки с координатами 1, 9 и 10. Оставшиеся точки будут иметь координаты 3, 4 и 6, поэтому диаметр будет равен 6 - 3 = 3.
| |
|
|
D. Отбой
Бинарный поиск
жадные алгоритмы
Перебор
сортировки
*2300
Преподаватели Летней Какой-нибудь Школы укладывают учащихся спать. Домик состоит из n комнат, в каждой из которых должны жить ровно b школьников. Однако к моменту отбоя оказалось, что далеко не каждый школьник находится в своей комнате. Комнаты расположены в ряд и пронумерованы по порядку от 1 до n, изначально в i-й комнате находятся ai школьников. При этом, в домике находятся все проживающие в нём школьники и только они, то есть, a1 + a2 + ... + an = nb. В домике также живут 2 преподавателя. Процесс укладывания школьников спать устроен следующим образом. Первый преподаватель встаёт у комнаты 1 и движется в направлении комнаты n, а второй преподаватель — у комнаты n и движется в сторону комнаты 1. Закончив укладывать очередную комнату, преподаватель переходит к следующей, если n нечётно, то среднюю комнату укладывает спать только первый преподаватель. Как только все школьники уложены спать, процесс заканчивается. Когда преподаватель заходит в комнату, он считает количество школьников внутри, затем тушит свет и закрывает комнату. Дополнительно, если количество школьников внутри не совпадает с b, этот преподаватель записывает номер комнаты в свою записную книжку и всё равно тушит свет и закрывает комнату. Преподаватели очень торопятся составить учебный план на завтра, поэтому игнорируют, кто именно находится в комнате, считая только количество школьников. Пока преподаватели находятся в комнатах, школьники могут перебегать между ещё не закрытыми и не укладываемыми прямо сейчас комнатами, причём школьник успевает перебежать не более чем на d комнат (то есть, перемещается в комнату с номером, который отличается не более чем на d). Также, после (или вместо) перемещения любой школьник может спрятаться под кровать в той комнате, в которой находится, тогда преподаватель его не заметит при подсчёте. В любой комнате под кроватями могут спрятаться сколько угодно школьников одновременно. Формально говоря, происходит следующий процесс: - Объявляется отбой, к этому моменту в комнате i находится ai школьников.
- Каждый школьник может переместиться в другую комнату, но не далее, чем на d от изначального положения, либо остаться в текущей комнате. После этого желающие спрятаться под кровать прячутся.
- В комнату 1, а также в комнату n заходят преподаватели и укладывают спать всех находящимся там школьников, после чего запирают комнату (после этого нельзя ни войти в комнату, ни выйти из неё).
- Школьники из комнат с номерами от 2 до n - 1 могут переместиться в другие комнаты, убегая не далее, чем на d комнат от своего текущего местоположения, либо остаться в текущей комнате. Желающие спрятаться под кровать прячутся.
- Из комнаты 1 в комнату 2, и из комнаты n в комнату n - 1 переходит преподаватель.
- Процесс продолжается, пока во всех комнатах школьники не будут уложены спать.
Пусть первый преподаватель записал x1 комнат с видимым нарушением численности (комнат, где число не спрятавшихся школьников не равно b), а второй x2. Школьники знают, что директор смены будет слушать жалобы на безобразие во время отбоя не более, чем от одного преподавателя домика, поэтому хотят действовать таким образом, чтобы максимальное из чисел xi было как можно меньше. Помогите им определить, какое минимальное значение эта величина может принимать при оптимальных действиях школьников. Выходные данные Выведите одно число — минимальное возможное значение максимального xi. Примечание В первом примере первые три комнаты посетит первый преподаватель, а последние две — второй. Одним из оптимальных решений является следующее: на первом шаге три школьника должны перебежать из комнаты 5 в комнату 4, на втором шаге два из них должны перебежать в комнату 3 и одному из них следует там спрятаться. Тем самым недовольство первого преподавателя вызовет только комната 2, а второй преподаватель и вовсе не встретит никаких нарушений. Во втором примере одной из оптимальных стратегий является следующая: на первом шаге все школьники из комнаты 1 прячутся, а все школьники из комнаты 2 перебегают в комнату 3. На втором шаге один школьник перебегает из комнаты 3 в комнату 4, а ещё 5 прячутся. Тем самым первый преподаватель будет недоволен комнатами 1 и 2, а второй — комнатами 5 и 6.
| |
|
|
E. Краны с водой
Бинарный поиск
жадные алгоритмы
сортировки
*2000
Рассмотрим систему из n кранов, наполняющих некоторую емкость водой. Кран i может быть настроен на подачу любого объема воды от 0 до ai мл в секунду (это число может быть действительным). Вода в i-м кране имеет температуру ti. Если для каждого выставить, чтобы i-й кран наливал ровно xi мл воды в секунду, то температура воды в результате будет (если , то во избежание деления на ноль считаем температуру равной 0). Вам необходимо выставить все краны таким образом, чтобы полученная температура была ровно T. Какой максимальный объем воды в секунду температуры T можно получить? Выходные данные Выведите максимальный возможный объем воды температуры T, который можно получить в секунду (если невозможно получить воду желаемой температуры, то ответ равен 0). Ваш ответ будет засчитан, если его абсолютная или относительная ошибка не будет превосходить 10 - 6.
| |
|
|
F. Задача о бегуне
дп
матрицы
сортировки
*2100
Вы бежите по прямоугольному полю. Поле может быть представлено, как матрица, состоящая из 3 строк и m столбцов. (i, j) обозначает ячейку в i-й строке в j-м столбце. Вы начинаете в (2, 1) и хотите закончить путь в (2, m). Из ячейки (i, j) можно переходить в ячейки: - (i - 1, j + 1) — только при i > 1,
- (i, j + 1), или
- (i + 1, j + 1) — только при i < 3.
Однако, на вашем пути есть n препятствий. k-е препятствие определяется тремя целыми числами ak, lk и rk, и запрещает посещать ячейки (ak, j) такие, что lk ≤ j ≤ rk. Посчитайте количество различных путей из (2, 1) в (2, m) и выведите его по модулю 109 + 7. Выходные данные Выведите количество различных путей из (2, 1) в (2, m) по модулю 109 + 7. Если невозможно добраться из (2, 1) в (2, m), то количество путей равно 0.
| |
|
|
E2. Guard Duty (medium)
Бинарный поиск
дп
жадные алгоритмы
сортировки
*2200
Princess Heidi decided to give orders to all her K Rebel ship commanders in person. Unfortunately, she is currently travelling through hyperspace, and will leave it only at N specific moments t1, t2, ..., tN. The meetings with commanders must therefore start and stop at those times. Namely, each commander will board her ship at some time ti and disembark at some later time tj. Of course, Heidi needs to meet with all commanders, and no two meetings can be held during the same time. Two commanders cannot even meet at the beginnings/endings of the hyperspace jumps, because too many ships in one position could give out their coordinates to the enemy. Your task is to find minimum time that Princess Heidi has to spend on meetings, with her schedule satisfying the conditions above. Output Output only one integer: the minimum time spent on meetings. Note In the first example, there are five valid schedules: [1, 4], [6, 7] with total time 4, [1, 4], [6, 12] with total time 9, [1, 4], [7, 12] with total time 8, [1, 6], [7, 12] with total time 10, and [4, 6], [7, 12] with total time 7. So the answer is 4. In the second example, there is only 1 valid schedule: [1, 2], [3, 4], [5, 6]. For the third example, one possible schedule with total time 6 is: [1, 3], [4, 5], [14, 15], [23, 25].
| |
|
|
B. Минимизация ошибки
жадные алгоритмы
сортировки
Структуры данных
*1500
Вам заданы два массива A и B, размер каждого из которых равен n. Величина ошибки E между этими массивами определятся как . Вы должны выполнить ровно k1 операций с массивом A и ровно k2 операций с массивом B. За одну операцию вы можете выбрать один элемент массива и увеличить или уменьшить его значение на 1. Выведите минимально возможную величину ошибки после выполнения k1 операций с массивом A и k2 операций с массивом B. Выходные данные Выведите единственное число — минимально возможное значение после выполнения ровно k1 операций с массивом A и ровно k2 операций с массивом B. Примечание В первом тестовом примере, мы не можем применить никаких операций к A или к B. Следовательно, E = (1 - 2)2 + (2 - 3)2 = 2. Во втором тестовом примере, нам необходимо применить ровно одну операцию к A. Чтобы минимизировать величину ошибки, мы увеличим первый элемент A на 1. Таким образом, A = [2, 2]. Получившаяся величина ошибки E = (2 - 2)2 + (2 - 2)2 = 0. Это минимальная величина ошибки, которую можно получить. В третьeм тестовом примере, мы можем увеличить первый элемент A до 8, используя все 5 доступных операций. Также первый элемент B можно превратить в 8, используя 6 из 7 доступных операций. Таким образом получаем, A = [8, 4] и B = [8, 4]. Получившаяся величина ошибки равна E = (8 - 8)2 + (4 - 4)2 = 0. Однако, мы должны сделать еще 1 действие над массивом B. Увеличим второй элемент B до 5, получим B = [8, 5] и E = (8 - 8)2 + (4 - 5)2 = 1.
| |
|
|
B. Поливальная система
математика
сортировки
*1000
Аркадий собирается полить свой единственный цветок. К сожалению, у него в наличии лишь очень неудобная система полива, разработанная для \(n\) цветов, и потому имеющая вид трубы с \(n\) отверстиями. Аркадий может использовать только воду, вытекающую из первого отверстия. Аркадий может заткнуть некоторые отверстия, а затем он нальет \(A\) литров воды в систему полива. После этого вода вытечет через все незаткнутые отверстия пропорционально их размерам \(s_1, s_2, \ldots, s_n\). Другими словами, если сумма размеров незаткнутых отверстий равна \(S\), и \(i\)-е отверстие не заткнуто, то из него вытечет \(\frac{s_i \cdot A}{S}\) литров воды. Какое минимальное число отверстий Аркадию необходимо заткнуть, чтобы из первого отверстия вытекло хотя бы \(B\) литров воды? Выходные данные Выведите одно целое число — количество отверстий, которые должен заткнуть Аркадий. Примечание В первом примере Аркадий должен заткнуть одно отверстие. После этого \(\frac{10 \cdot 2}{6} \approx 3.333\) литров воды вытечет из первого отверстия, что достаточно Аркадию. Во втором примере, даже если не затыкать отверстия, из первого отверстия вытечет \(\frac{80 \cdot 3}{10} = 24\) литров воды, что не меньше необходимых \(20\). В третьем примере Аркадию нужно заткнуть все отверстия, кроме первого, чтобы вся вода вытекла из первого отверстия.
| |
|
|
C. Вложенные отрезки
жадные алгоритмы
реализация
сортировки
*1500
Задана последовательность a1, a2, ..., an одномерных отрезков, пронумерованных от 1 до n. Ваша задача — найти два различных индекса i и j таких, что отрезок ai лежит внутри отрезка aj. Отрезок [l1, r1] лежит внутри отрезка [l2, r2] тогда и только тогда, когда l1 ≥ l2 и r1 ≤ r2. Выведите позиции i и j. Если существует несколько возможных ответов, выведите любой из них. Если ответа не существует, то выведите -1 -1. Выходные данные Выведите две различные позиции i и j такие, что отрезок ai лежит внутри отрезка aj. Если существует несколько возможных ответов, выведите любой из них. Если ответа не существует, то выведите -1 -1. Примечание В первом примере следующие пары считаются валидными: - (2, 1), (3, 1), (4, 1), (5, 1) — не касаются даже границами;
- (3, 2), (4, 2), (3, 5), (4, 5) — касаются только в одной границе;
- (5, 2), (2, 5) — полностью совпадают.
| |
|
|
E. Неплохо сыграно!
жадные алгоритмы
сортировки
*2100
Недавно Максим увлекся известной ККИ «BrainStone». Так как «BrainStone» весьма интеллектуальная игра, в её процессе Максиму постоянно приходится решать сложные задачи. Вот одна из них: Всего у Максима n существ, i-е характеризуется двумя числами – своим здоровьем hpi и своим уроном dmgi. Также у Максима есть в запасе заклинания двух типов: - Удваивает здоровье существа (hpi := hpi·2);
- Приравнивает урон существа к его здоровью (dmgi := hpi).
Заклинание первого типа можно использовать не более a раз суммарно, второго не более b раз суммарно. Заклинание может быть использовано на одном существе несколько раз. Заклинания можно использовать в любом порядке. Также не обязательно использовать все заклинания. Так как Максим слишком занят подготовкой к сессии, он просит вас посчитать, какой максимальный суммарный урон существ можно получить, если оптимально применять заклинания. Выходные данные В единственной строке выведите одно число — максимальный урон, который могут нанести существа. Примечание В первом примере Максиму нужно использовать заклинание первого типа на второе существо, а затем заклинание второго типа на него же. Тогда суммарный урон существ будет равен 15 + 6·2 = 27. Во втором примере Максиму нужно использовать заклинание второго типа на первое существо и заклинание второго типа на третье существо. Суммарный урон существ получится 10 + 11 + 5 = 26.
| |
|
|
G. Сессия Пети
жадные алгоритмы
реализация
сортировки
*1700
Сессия Пети продлится \(n\) дней и за это время ему нужно сдать \(m\) экзаменов. Дни сессии пронумерованы от \(1\) до \(n\). Про каждый экзамен известно три величины: - \(s_i\) — день, когда выдадут билеты для \(i\)-го экзамена.
- \(d_i\) — день, когда состоится \(i\)-й экзамен (\(s_i < d_i\)).
- \(c_i\) — сколько дней нужно Пете, чтобы подготовиться к \(i\)-му экзамену. К \(i\)-му экзамену Петя может готовиться только в дни с номерами от \(s_i\) до \(d_i-1\), включительно.
В каждый из дней сессии Петя будет либо весь день отдыхать, либо весь день сдавать один экзамен, либо весь день готовится к одному из экзаменов, для которого уже выданы билеты. Смешивать виды активностей в один день Петя не может. Если в день \(j\) Петя готовится к экзамену \(i\), то \(s_i \le j < d_i\). Петя может иметь перерывы между днями подготовки к одному экзамену, он может чередовать по дням подготовку к разным экзаменам. Таким образом, подготовка к одному экзамену не обязательно должна осуществляться в последовательные дни. Определите расписание подготовки Пети, в соответствии с которым, он успешно сможет подготовиться ко всем экзаменам и сдать их, либо сообщите, что это невозможно. Выходные данные Если Петя не сможет подготовиться и сдать все экзамены, выведите -1. В случае положительного ответа выведите \(n\) целых чисел, где \(j\)-е число равно: - \((m + 1)\), если в \(j\)-й день проводится экзамен (напомним, что в каждый день сессии проводится не более одного экзамена),
- нулю, если в \(j\)-й день Петя будет отдыхать,
- равно \(i\) (\(1 \le i \le m\)), если в \(j\)-й день Петя будет готовиться к \(i\)-му экзамену (суммарное количество дней подготовки к каждому экзамену согласно расписанию должно быть в точности равно количеству дней, необходимых для подготовки к нему).
Экзамены нумеруются в том же порядке, в котором встречаются во входных данных, начиная с \(1\). Если возможных ответов (расписаний) несколько, то выведите любой из них. Примечание В первом примере Петя может, например, готовиться к экзамену \(1\) в первый день, готовиться к экзамену \(2\) во второй день, в третий день сдать экзамен \(1\), в четвертый день отдыхать, а в пятый день сдать экзамен \(2\). Таким образом, он сумеет подготовиться и сдать все экзамены. Во втором примере сессия длится три дня и состоится два экзамена. Таким образом, на подготовку остаётся всего один день (так как два других дня заняты сдачей экзаменов). Поэтому Петя не сможет сдать все экзамены.
| |
|
|
B. Проблемы бизнесменов
сортировки
*1000
Две известные конкурирующие компании ChemForces и TopChemist решили показать на выставке свои новые наборы химических элементов, но по опыту прошлого года знают, что если будет химический элемент, который принадлежит наборам обеих компаний, на рынке произойдет крах и обе компании уйдут в убыток. Поэтому представители этих компаний решили договориться и выбрать такие наборы химических элементов, доступных компаниям, чтобы на рынке не произошел крах и суммарная прибыль компаний была максимальна. Все известные на сегодняшний день химические элементы нумеруются целыми числами. Известно, что компании ChemForces доступно \(n\) различных химических элементов с номерами \(a_1, a_2, \ldots, a_n\) и за использование \(i\)-го элемента из этого списка она получит \(x_i\) берляндских рублей. Также известно, что компании TopChemist доступно \(m\) различных химических элементов \(b_1, b_2, \ldots, b_m\) и за использование \(j\)-го элемента она получит \(y_j\) берляндских рублей. Иными словами, первая компания может выбрать для показа на ярмарке любое подмножество из элементов \(\{a_1, a_2, \ldots, a_n\}\) (в том числе пустое), а вторая — любое подмножество элементов из \(\{b_1, b_2, \ldots, b_m\}\) (в том числе пустое). Среди выбранных элементов не должно быть одинаковых. Помогите представителям обеих компаний выбрать наборы так, чтобы на рынке не произошел крах и суммарная прибыль компаний была максимальна. Выходные данные Выведите максимальную суммарную прибыль, которую можно получить, выбрав наборы обеих компаний так, чтобы на рынке не произошел крах. Примечание В первом тестовом примере компания ChemForces может выставить элементы (\(3, 7\)), а компания TopChemist соответственно (\(1, 2, 4\)). Таким образом, суммарная прибыль составит \((10 + 2) + (4 + 4 + 4) = 24\). Во втором тестовом примере компания ChemForces может выставить элемент \(10^9\), а компания TopChemist соответственно (\(14, 92, 35\)). Таким образом, суммарная прибыль составит \((239) + (15 + 65 + 89) = 408\).
| |
|
|
A. Игра
сортировки
*800
Два игрока играют в игру. Изначально на доске написано \(n\) целых чисел \(a_1, a_2, \ldots, a_n\). Каждый ход игрок выбирает одно число и стирает его. Так продолжается до тех пор, пока на доске не останется одно число, то есть всего игроки сделают \(n - 1\) ход. Ходы игроки делают по очереди, начинает первый игрок. Первый игрок хочет минимизировать оставшееся число, второй — максимизировать. Вы хотите узнать, какое число останется на доске после \(n - 1\) хода при оптимальной игре обоих. Выходные данные Выведите одно число, которое останется на доске в результате игры. Примечание В первом примере первый игрок убирает число \(3\), второй убирает \(1\), на доске остается число \(2\). Во втором примере на доске остается число \(2\) независимо от действий игроков.
| |
|
|
C. Одинаковые суммы
реализация
сортировки
*1400
Заданы \(k\) последовательностей целых чисел. Длина \(i\)-й последовательности равна \(n_i\). Выберите ровно две такие последовательности \(i\) и \(j\) (\(i \ne j\)), что в каждой из этих двух последовательностей возможно удалить ровно один элемент так, что сумма элементов измененной последовательности \(i\) (теперь ее длина равна \(n_i - 1\)) равна сумме элементов измененной последовательности \(j\) (теперь ее длина \(n_j - 1\)). Заметим, что в каждой из двух выбранных последовательностей надо обязательно удалить ровно один элемент. Следует считать, что сумма пустой (то есть длины \(0\)) последовательности равна \(0\). Выходные данные Если выбрать пару последовательность требуемым образом невозможно, выведите «NO» (без кавычек). Иначе в первую строку выведите «YES» (без кавычек), во вторую — пару целых чисел \(i\), \(x\) (\(1 \le i \le k, 1 \le x \le n_i\)), в третью — пару целых чисел \(j\), \(y\) (\(1 \le j \le k, 1 \le y \le n_j\)). Вывод означает, что сумма всех элементов \(i\)-й последовательности без элемента с индексом \(x\) равна сумме всех элементов \(j\)-й последовательности без элемента с индексом \(y\). Пара найденных последовательностей должна иметь различные номера, то есть \(i \ne j\). Их можно выводить в любом порядке. Если решений несколько, выведите любое из них. Примечание В первом примере заданы только две последовательности \([2, 3, 1, 3, 2]\) и \([1, 1, 2, 2, 2, 1]\). Вы можете удалить второй элемент из первой из них, чтобы получить \([2, 1, 3, 2]\) и можете удалить шестой элемент из второй, чтобы получить \([1, 1, 2, 2, 2]\). Суммы полученных последовательностей будут равны \(8\), то есть будут иметь одинаковое значение.
| |
|
|
D. Лунная тень
Бинарный поиск
геометрия
математика
сортировки
*2500
Сумерки охватывают леса и весь мир. Реку и лодку освещает луна.— Сложно возможно затмить свет луны. Тени лишь раскрывают ее красоту и мягкость, — пропел Мино. — Видишь? Облака, — сказал Канно, вглядываясь вдаль. — Не может быть ничего лучше, — обернулся Мино к Канно. Представим небо как координатную ось. Луна находится в начале координат, то есть в точке с координатой \(0\). В небе есть \(n\) облаков. Все облака имеют одинаковую длину \(l\). \(i\)-е облако изначально покрывает отрезок \((x_i, x_i + l)\) (не включая границы). Изначально облако двигается со скоростью \(v_i\), которая равна либо \(1\), либо \(-1\). Изначально никакие два облака не пересекаются, то есть для всех \(1 \leq i \lt j \leq n\) выполняется \(\lvert x_i - x_j \rvert \geq l\). Если скорость ветра равна \(w\), то скорость \(i\)-го облака станет равна \(v_i + w\), то есть его координаты будут увеличиваться на \(v_i + w\) за единицу времени. Обратите внимание, ветер может быть достаточно сильным и направления движения облаков могут изменяться. Помогите Мино, подсчитайте число пар \((i, j)\) (\(i < j\)) таких, что существует такая скорость ветра \(w\), не превышающая \(w_\mathrm{max}\) по модулю (возможно, отрицательная и/или вещественная) такая, что \(i\)-е и \(j\)-е облака в какой-то момент будут оба закрывать луну. Скорость ветра \(w\) может быть различной для различных пар. Выходные данные Выведите одно целое число — количество неупорядоченных пар облаков таких, что они могут закрыть луну в один и тот же момент при некотором выборе скорости ветра \(w\). Примечание В первом примере начальные позиции и скорости облаков проиллюстрированы на рисунке ниже. Пары облаков, которые могут одновременно закрыть луну: - \((1, 3)\) закроют луну в момент времени \(2.5\) при \(w = -0.4\);
- \((1, 4)\) закроют луну в момент времени \(3.5\) при \(w = -0.6\);
- \((1, 5)\) закроют луну в момент времени \(4.5\) при \(w = -0.7\);
- \((2, 5)\) закроют луну в момент времени \(2.5\) при \(w = -2\).
На рисунке ниже приведены положения облаков в момент времени \(2.5\) при скорости ветра \(w = -0.4\). В этот момент \(1\)-е и \(3\)-е облака оба закрывают луну. Во втором примере только пара \((1, 4)\) закроют луну в момент времени \(15\) при скорости ветра \(w = 0\). Обратите внимание, что все времена и скорости ветра в примечании даны для примера, на самом деле существует бесконечное число способов выбрать их.
| |
|
|
B. Помогите Повару Герасиму
реализация
сортировки
*1300
В Тридевятом царстве, Тридесятом государстве накрывать на царский стол дворцовой кухне помогают юные пажи. Поскольку они ужасные шалуны, за ними нужно следить, контролируя, правильно ли они накрыли на царский стол. На этот раз царскому повару Герасиму опять показалось, что пажи устроили шалость: перелили компот из одного кубка в другой. Теперь Герасим хочет проверить свою гипотезу. Благо, во все кубки во дворцовой кухне всегда наливают одинаковое количество миллилитров компота. После проведения тщательных измерений компота в каждом кубке, Герасим обратился к вам за программой, которая определит, из какого в какой кубок был перелит компот, или установит, что на этот раз в столовой работали примерные пажи. Для облегчения вашей задачи будем предполагать, что все кубки бездонные, и компот из них не выливается при любом его объеме. Кроме того, по странному стечению обстоятельств в Тридевятом царстве налить в кубок или перелить из кубка можно только целое число миллилитров компота. Выходные данные Если пажи не переливали компот, выведите сообщение «Exemplary pages.» (без кавычек). Если можно установить объем перелитого в результате одного переливания компота, выведите сообщение «v ml. from cup #a to cup #b.» (без кавычек), где вместо v выведите объем перелитого компота, вместо a — номер кубка, из которого переливался компот (нумерация кубков ведется последовательными натуральными числами начиная с 1 в порядке описания кубков во входных данных), вместо b — номер кубка, в который переливался компот. Наконец, если исходные объемы компота не могли быть получены при помощи не более чем одного переливания (например, переливания происходили не один раз, или работники дворцовой кухни ошиблись при наливании компота в кубки), выведите сообщение «Unrecoverable configuration.» (без кавычек).
| |
|
|
B. Микромир
жадные алгоритмы
сортировки
*1200
У Вас есть чаша Петри с бактериями, и теперь Вы решили окунуться в этот опасный микромир. К сожалению, у Вас нет микроспопа поблизости, поэтому Вы не можете наблюдать за ними. Вы знаете, что в чаше \(n\) бактерий и размер \(i\)-й бактерии равен \(a_i\). Также Вы знаете межгалактическую целую положительную константу \(K\). Бактерия \(i\) может поглотить \(j\)-ю бактерию тогда и только тогда, когда \(a_i > a_j\) и \(a_i \le a_j + K\). \(j\)-я бактерия исчезает, а \(i\)-я не меняет своего размера. Бактерия может поглощать любое количество других бактерий. В каждой операции поглощения любая бактерия \(i\) может поглотить любую другую бактерию \(j\) если \(a_i > a_j\) и \(a_i \le a_j + K\). Поглощения происходят последовательно. Например, пусть размеры бактерий \(a=[101, 53, 42, 102, 101, 55, 54]\) и \(K=1\). Одна из возможных последовательностей поглощений следующая: \([101, 53, 42, 102, \underline{101}, 55, 54]\) \(\to\) \([101, \underline{53}, 42, 102, 55, 54]\) \(\to\) \([\underline{101}, 42, 102, 55, 54]\) \(\to\) \([42, 102, 55, \underline{54}]\) \(\to\) \([42, 102, 55]\). В результате \(3\) бактерии останутся в чаше Петри. Так как у Вас нет микроскопа, Вы можете только гадать, какое минимальное возможное количество бактерий может остаться в Вашей чашке Петри, когда Вы наконец найдете себе какой-нибудь микроскоп. Выходные данные Выведите единственное число — наименьшее возможное количество оставшихся бактерий. Примечание Первый пример описан в условии задачи. Во втором примере одно из оптимальных решений следующее: \([20, 15, 10, 15, \underline{20}, 25]\) \(\to\) \([20, 15, 10, \underline{15}, 25]\) \(\to\) \([20, 15, \underline{10}, 25]\) \(\to\) \([20, \underline{15}, 25]\) \(\to\) \([\underline{20}, 25]\) \(\to\) \([25]\). В третьем примере никакая бактерия не может поглотить никакую другую.
| |
|
|
B. Отлично!
жадные алгоритмы
сортировки
*900
Семестр подходит к концу и пора бы уже задумываться об оценках. Сегодня на занятии преподаватель сказал, что оценки за экзамен будут выставляться автоматически — нужно посчитать среднее арифметическое оценок за лабораторные работы и округлить до ближайшего целого числа. При этом округление производится в пользу студента — \(4.5\) будет округлено до \(5\) (см. пример 3), но \(4.4\) — уже до \(4\). Для Васи данная новость стала полной неожиданностью — он хотел просто ответить всё на экзамене и получить заслуженную «отлично», а лабораторные делал спустя рукава. Может оказаться, что у Васи не выходит \(5\), а может и вообще текущие оценки вынуждают преподавателя поставить \(2\). К счастью, преподаватель разрешил переделать лабораторные и тем самым исправить оценки перед подсчетом среднего арифметического. Вася хочет переделать минимальное количество лабораторных работ так, чтобы в итоге преподаватель выставил оценку \(5\). Вася может сам выбрать, какие оценки надо исправлять, более того, Вася постарается, и переделанные работы будут идеальными — он точно получит за них \(5\). Помогите Васе — посчитайте, какое наименьшее количество лабораторных работ ему придется переделать. Выходные данные Выведите единственное число — минимальное количество оценок, которое придется исправить Васе. Можно показать, что всегда можно исправить достаточное количество оценок, чтобы получить \(5\). Примечание В первом примере Васе достаточно исправить две оценки \(4\) на \(5\). Во втором примере у Васи уже выходит \(5\) (среднее арифметическое \(4.75\)), исправлять ничего не нужно. В третьем примере Васе нужно исправить одну из оценок \(3\), тогда среднее арифметическое будет ровно \(4.5\) и за семестр Вася получит \(5\).
| |
|
|
A. Настя и массив
реализация
сортировки
*800
Последнее время у Насти стало слишком много массивов, поэтому она решила удалить самый ненужный из них. Неожиданно самый ненужный массив оказался волшебным! Настя выяснила, что он обладает следующими свойствами: - За одну секунду можно прибавить любое (возможно, отрицательное) число ко всем элементам массива, не равным нулю.
- В тот момент, когда все элементы массива становятся равны нулю, массив взрывается.
Настя, будучи очень занятой особой, хочет как можно быстрее взорвать массив. Найдите минимальное время, необходимое для взрыва массива. Выходные данные Выведите одно число — минимальное количество секунд, требуемое для того, чтобы сделать все элементы массива равными нулю. Примечание В первом тесте можно сделать все элементы равными нулю за одну секунду — добавить ко всем элементам - 1. Во втором тесте на первой секунде можно добавить - 2. Таким образом, массив примет вид [0, 0, - 3]. На второй секунде добавим 3 к третьему (единственному ненулевому) элементу.
| |
|
|
B. Рыцари многоугольного стола
жадные алгоритмы
реализация
сортировки
*1400
В отличие от Рыцарей Круглого Стола, Рыцари Многоугольного Стола обделены благородством и с радостью убьют друг друга. Однако каждый рыцарь обладает своей силой, и один рыцарь может убить другого только если его сила больше, чем сила жертвы. Однако даже такого рыцаря будет мучить совесть, поэтому рыцарь может убить максимум \(k\) других рыцарей. Также у каждого рыцаря есть некоторое количество монет. При убийстве рыцарь может забрать все монеты своей жертвы. Сейчас каждый рыцарь задумался: а какое наибольшее количество монет у него может оказаться, если убивать других рыцарей будет только он? Вам предстоит ответить на этот вопрос для каждого рыцаря. Выходные данные Выведите \(n\) чисел — наибольшее количество монет у каждого рыцаря. Примечание Рассмотрим первый пример. - Первый рыцарь самый слабый, он не может никого убить, поэтому у него максимум может быть только одна монета.
- Второй рыцарь может убить первого и забрать его монету в дополнение к двум своим.
- Третий рыцарь сильнее всех, но так как он максимум может убить \(k = 2\) рыцарей, то выгоднее всего забрать монеты у второго и четвертого рыцаря: \(2+11+33 = 46\).
- Четвертый рыцарь должен забрать монеты у первого и второго: \(33+1+2 = 36\).
Во втором примере первый рыцарь не может никого убить, а все остальные должны убить одного рыцаря, имеющего номер, на один меньший. В третьем примере всего один рыцарь, он не может никого убить, хотя очень хочет.
| |
|
|
C. Из бара домой
геометрия
жадные алгоритмы
математика
Перебор
сортировки
Структуры данных
*2300
Для вектора \(\vec{v} = (x, y)\), определим длину \(|v| = \sqrt{x^2 + y^2}\). Аллен немного перебрал в баре, который находится в начале координат. Существуют \(n\) векторов \(\vec{v_1}, \vec{v_2}, \cdots, \vec{v_n}\). Аллен сделает \(n\) шагов. Так как Аллен дезориентирован, на \(i\)-м шаге он либо сделает шаг на вектор \(\vec{v_i}\), либо на вектор \(-\vec{v_i}\). Другими словами, если его позиция сейчас равна \(p = (x, y)\), то он окажется либо в \(p + \vec{v_i}\), либо в \(p - \vec{v_i}\). Аллен не хочет уйти далеко от дома (он также находится в баре). Помогите ему найти последовательность шагов (последовательность знаков векторов) такую, чтобы его финальная позиция \(p\) удовлетворяла ограничению \(|p| \le 1.5 \cdot 10^6\). Выходные данные Выведите единственною строку, содержащую \(n\) целых чисел \(c_1, c_2, \cdots, c_n\), каждое из которых равно либо \(1\), либо \(-1\). Ваше решение будет зачтено, если финальная позиция \(p = \sum_{i = 1}^n c_i \vec{v_i}\) удовлетворяет \(|p| \le 1.5 \cdot 10^6\). Можно показать, что решение всегда существует при данных ограничениях.
| |
|
|
B. Распил
дп
жадные алгоритмы
сортировки
*1200
Существует достаточно много вещей, которые можно распилить — деревья, гантели (которые золотые), бюджетные средства. В этой задаче вам предстоит распилить последовательность целых чисел. Вам дана последовательность целых чисел, содержащая одинаковое количество чётных и нечётных чисел. Требуется в условиях ограниченного бюджета провести максимальное число разрезов, которые разделят на последовательность на непустые отрезки, на каждом из которых количество чётных чисел равно количеству нечётных чисел. Разрезы разделяют последовательность на непрерывные подряд идущие отрезки. Вы можете думать о разрезе, как о вертикальном разделителе между парой соседних элементов. Таким образом, после разрезов каждый элемент принадлежит ровно одному отрезку. Например, возможен случай: \([4, 1, 2, 3, 4, 5, 4, 4, 5, 5]\) \(\to\) два разреза \(\to\) \([4, 1 | 2, 3, 4, 5 | 4, 4, 5, 5]\). После разрезов на каждом отрезке количество четных элементов должно быть равно количеству нечётных. Стоимость разреза между числами \(x\) и \(y\) составляет \(|x - y|\) биткоинов. Найдите максимальное количество разрезов, которые можно сделать, потратив при этом не более \(B\) биткоинов. Выходные данные Выведите одно число — максимальное количество разрезов, которые можно провести, потратив не более \(B\) биткоинов. Примечание В первом примере следует разрезать между числом \(2\) и \(5\), стоимость разреза составит \(3\) биткоина. Во втором примере нельзя сделать ни одного разреза вне зависимости от числа биткоинов. В третьем примере последовательность следует разрезать между числами \(2\) и \(3\) и между числами \(4\) и \(5\). Суммарная стоимость составляет \(1 + 1 = 2\) биткоина.
| |
|
|
Сигналы со спутника
матрицы
реализация
Задача на реализацию
сортировки
Космическая станция «Орион» принимает сигналы от спутников-разведчиков. Приёмная матрица станции имеет размер 640 строк на 480 позиций. При получении каждого сигнала в журнал записываются координаты активированного элемента матрицы: номер строки и номер позиции в строке.
Элемент матрицы, который принял хотя бы один сигнал, считается активным. Элемент, который не принял ни одного сигнала, считается неактивным.
Для анализа качества связи нужно найти наибольшую непрерывную цепочку активных элементов в одной строке.
Определите наибольшую длину цепочки активных элементов, расположенных подряд в одной строке, и номер этой строки. Если таких строк несколько, укажите максимальный из их номеров.
Формат входных данных
В первой строке записано целое число N — количество принятых сигналов (1 ≤ N ≤ 10000).
В каждой из следующих N строк записаны по два числа через пробел:
- номер строки (целое число от 1 до 640)
- номер позиции в строке (целое число от 1 до 480)
Один и тот же элемент матрицы может получить несколько сигналов (координаты могут повторяться).
Формат выходных данных
Два целых числа через пробел: наибольшая длина цепочки активных элементов и номер строки, в которой она находится.
| |
|
|
Пирожки не должны остыть
реализация
жадные алгоритмы
сортировки
*1300
В пекарне «У Матроны» работает один пекарь, и за утро он должен испечь n заказов пирожков. Для каждого заказа известно время ti — сколько минут займёт его приготовление.
Пирожки нельзя долго держать на прилавке: клиент заберёт свой заказ горячим, только если время ожидания не превысило времени его приготовления. Иначе пирожки остынут — и клиент уйдёт расстроенным.
Временем ожидания клиента считается суммарное время приготовления всех заказов, которые пекарь взял в работу до его заказа. Клиент остаётся доволен, если это время не больше времени приготовления его собственного пирожка.
Матрона может сама решать, в каком порядке брать заказы в работу. Помогите ей выбрать такой порядок, чтобы максимальное число клиентов ушло довольными.
Формат входных данных
В первой строке — целое число n (1 ≤ n ≤ 105) — количество заказов.
Во второй строке — n целых чисел ti (1 ≤ ti ≤ 109), разделённых пробелами, — время приготовления каждого заказа.
Формат выходных данных
Одно целое число — максимальное количество довольных клиентов.
| |
|
|
Гравитационная сортировка
сортировки
Алгоритм гравитационной сортировки позволяет упорядочить массив целых неотрицательных чисел. Для сортировки чисел используется набор стержней и бусинок. Рассмотрим алгоритм сортировки массива целых неотрицательных чисел \([a_1, a_2, ..., a_n]\). Если данные числа могут достигать значения \(n\), нужно использовать \(n\) стержней и \(a_1+a_2+...+a_n\) бусинок. Наденем по одной бусинке на самые левые \(a_1\) стержней, они представляют значение \(a_1\). Затем наденем по одной бусинке на самые левые \(a_2\) стержней, разместив их во втором ряду, над первым рядом бусинок. При этом, если \(a_2>a_1\), то некоторые бусинки второго ряда окажутся как бы висящими в воздухе, они не будут опираться на бусинки нижнего ряда. Затем на самых левых \(a_3\) стержнях в третьем ряду разместим \(a_3\) бусинок, часть из них также может не опираться ни на какие предыдущие бусинки и т.д. После того, как все бусинки будут размещены, они начинают двигаться по стержням вниз. Когда движение завершится, количество бусинок в каждом ряду будет равно значениям упорядоченного массива.
Будем считать, что все бусинки двигаются одновременно. За секунду одна бусинка сползает на один ряд вниз, если в ряду ниже пусто или находится бусинка, которая также спускается вниз. На рисунках показано начальное расположение бусинок для массива \([2, 4, 1, 5, 3]\) и состояние через 1, 2 и 3 секунды.
Для каждого стержня определите время, необходимое для того, чтобы на этом стержне все бусинки закончили движение. В данном примере на первом стержне бусинки будут неподвижны, на втором стержне они закончат движение через одну секунду, на третьем и четвёртом стержнях — через две секунды, на пятом стержне — через три секунды.
Первая строка входных данных содержит число \(n\) (\(1\le n\le 10^5\)) — количество сортируемых чисел и количество стержней (то есть максимальное значение одного числа). Следующие \(n\) строк содержат по одному числу \(a_i\) (\(0\le a_i\le n\)) — значения упорядочиваемых чисел (начальные значения числа бусинок в каждом ряду).
Для каждого из \(n\) стержней слева направо программа должна вывести одно число — количество секунд, через которое на данном стержне бусинки прекратят движение.
Решения, правильно работающие при \(n\le 10\), будут оцениваться в 30 баллов.
Решения, правильно работающие при \(n\le 2000\), будут оцениваться в 60 баллов.
| |
|
|
Farmer John's Favorite Operation
теория чисел
сортировки
Префиксные суммы(минимумы, ...)
У Фермера Джона есть массив \(a\) из \(N\) (\(1 \leq N \leq 2 \cdot 10^5\))
неотрицательных целых чисел и целое число \(M\) (\(1 \leq M \leq 10^9\)).
Затем ФД спрашивает у Беси число \(x\). За одну операцию ФД может выбрать
индекс \(i\) и вычесть или прибавить \(1\) к \(a_i\). ФД называет число скучным
- если оно равно минимальному количеству операций, которые он должен выполнить,
чтобы \(a_i-x\) стало делится на \(M\) для всех \(1 \leq i \leq N\).
Среди всех возможных \(x\) выберите минимально возможное скучное число.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(T\) (\(1 \leq T \leq 10\)), количество независимых подтестов.
Первая строка каждого подтеста содержит числа \(N\) и \(M\).
Вторая строка каждого подтеста содержит \(a_1, a_2, ..., a_N\)
(\(0 \leq a_i \leq 10^9\)).
Гарантируется, что сумма \(N\) по всем подтестам не превысит \(5 \cdot 10^5\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Для каждого подтеста выведите целое число - минимальное скучное число
по всем возможным \(x\).
| |
|
|
Сортировка по максимальному элементу в строке - 2
Квадратичные сортировки
Использование сортировки
сортировки
Напишите программу, которая переставляет строки матрицы так, чтобы при их просмотре сверху вниз максимальные значения в каждой строке образовали невозрастающую последовательность. В случае равенства максимальных значений в двух строках, строки должны следовать в том же порядке, что и в исходной матрице.
Формат входных данных
В первой строке записаны два числа N и M - количество строк и столбцов матрицы соответственно (1 <= N, M <= 50 ). В следующих N строках записаны строки матрицы, в каждой – по M натуральных чисел, разделённых пробелами.
Формат выходных данных
Программа должна вывести получившуюся матрицу.
| |
|
|
Сортировка по сумме строк - 2
Квадратичные сортировки
Использование сортировки
сортировки
Напишите программу, которая переставляет строки матрицы так, чтобы при их просмотре сверху вниз суммы всех значений в каждой строке образовали невозрастающую последовательность. В случае равенства суммы всех значений в двух строках, строки должны следовать в том же порядке, что и в исходной матрице.
Формат входных данных
В первой строке записаны два числа N и M - количество строк и столбцов матрицы соответственно (1 <= N, M <= 50 ). В следующих N строках записаны строки матрицы, в каждой – по M натуральных чисел, разделённых пробелами.
Формат выходных данных
Программа должна вывести получившуюся матрицу.
| |
|
|
Расстояние между точками
"Два указателя"
геометрия
сортировки
На окружности заданы N точек, надо найти пару точек, расстояние между которыми (по хорде окружности) максимально.
Входные данные
В первой строке задано N (1 <= N <= 100 000).
В следующей строке даны N пар вещественных чисел. Сначала описывается координата x, потом – y.
Выходные данные
Вывести два числа – номера точек, расстояние между которыми максимально. Сначала идет наименьшее число, потом наибольшее.
| Ввод |
Вывод |
3
1.4142 1.4142
0 2
-1.4142 -1.4142 |
1 3 |
| |
|