Задача №3331. Мелодия
В презентации с разборами задач были предложены два варианта решения данной задачи, но так же возможен иной вариант, который в некотором смысле будет проще, чем остальные, в том числе в реализации. Для понимания данного решения требуется знание такой структуры данных как дерево интервалов (отрезков). Итак, для начала нужно отсортировать массив A по возрастанию, причем лучше сортировать, выбирая рандомный элемент — x:=a[l+random(r-l+1)], так как содержатся тесты против бинарного варианта сортировки. После сортировки построим на данном массиве дерево интервалов с операцией взятия максимума на отрезке и изменением элемента в данной структуре данных. После чего, считывая массив B, будем для очередного элемента бинарным поиском на массиве А искать число меньше либо равное данному элементу, если такового не найдется, то вывести, допустим I-1 (в зависимости от переменной цикла), и выйти из программы, далее найдем, используя операцию максимума на отрезке, найдем максимальный элемент от 1 до индекса в массиве А числа, которое мы нашли бинарным поиском, включительно. После чего изменим в дереве интервалов данный элемент на -1 (важно, что изменим в дереве интервалов, а не в массиве А), потому что это число мы уже не будем использовать. Теперь требуется проверить, что это число не равно -1, иначе просто у нас не окажется меньше либо равного не использованного числа, то есть надо будет вывести i-1 и выйти из программы, также, что разность элемента B и этого числа меньше либо равно оставшемуся L, иначе опять же вывести i-1 и выйти. Заметим, что здесь не учтен случай, что если уже был какой-либо элемент массива B до этого равный данному, в этом случае нам не надо искать в массиве А подходящее число, чтобы учесть это можно просто завести буленовский массив чисел, которые были до этого в массиве В и просто в начале цикла сделать проверку типа: if used[k] then continue; Заметим, что верность данной жадности легко доказывается, так как мы каждый раз пытаемся выбрать максимальное неиспользованное число меньше либо равное элементу очередному элементу В. Оценим время работы: О(NlogN+MlogN), что по времени на максимальном тесте работает около 0.1 секунды.
Сдать: для сдачи задач необходимо войти в систему
2465
statement