Задача №861. Медиана объединений
Разбор добавил Дмитрий Молчанов
Сгенерируем нужные последовательности и сохраним их в табличку. С памятью проблем не возникает - общий объем данных при максимальных ограничениях составляет 38 мегабайт (200*50000 целых чисел). Легко понять, что эти последовательности уже отсортированы по неубыванию - каждый элемент составляется из суммы предыдущего элемента и некоторого числа от нуля до m. Т.к. m - натуральное число, то уменьшаться эта последовательность никак не может. Итак, задача сведена к нахождению медианы объединений двух отсортированных массивов. Есть несколько способов найти искомое число. Самый простой и наивный способ (писать слияние двух отсортированных массивов в один "в лоб") не проходит по времени. Действительно, даже если писать это очень аккуратно, то мы получим сложность О(n*l + n*n*l), т.е. 2 миллиарда операций, что довольно много. Рассмотрим другой способ. Напишем функцию f, которая будет принимать три числа в виде аргументов - какое-то число x и числа i и j, определяющие номера текущих массивов. Эта функция будет возвращать кол-во элементов в массивах i и j, не превосходящих x. Можно реализовать это правым бинпоиском по первому и по второму массиву (просто найдем правое вхождение числа x в каждом из массивов, если нумерация индексов идет с нуля, то ответом будет их сумма, если же с 1-цы, то их сумма минус 2). Теперь для каждой пары массивов надо найти наименьшее значение функции f, больших или равных l. Это делается левым бинпоиском по значениям функции f, при этом левой границей поиска будет наименьший элемент из этих массивов, а правой - наибольший. Все, задача решена. Сложность этого решения - О(n*l + n*n*log(max-min)*log(l)), где max и min - максимальный и минимальный элементы из всех массивов. При максимальных ограничениях мы получаем порядка 30 миллионов операций, что уже неплохо и легко проходит все ограничения.Сдать: для сдачи задач необходимо войти в систему
3018
statement