Штаб гражданской обороны Тридесятой области решил обновить план спасения на случай ядерной атаки. Известно, что все n селений Тридесятой области находятся вдоль одной прямой дороги. Вдоль дороги также расположены m бомбоубежищ, в которых жители селений могут укрыться на случай ядерной атаки.
Чтобы спасение в случае ядерной тревоги проходило как можно эффективнее, необходимо для каждого селения определить ближайшее к нему бомбоубежище.
Формат ввода
В первой строке вводится число n - количество селений (1 <= n <= 100000). Вторая строка содержит n различных целых чисел, i-е из этих чисел задает расстояние от начала дороги до i-го селения. В третьей строке входных данных задается число m - количество бомбоубежищ (1 <= m <= 100000). Четвертая строка содержит m различных целых чисел, i-е из этих чисел задает расстояние от начала дороги до i-го бомбоубежища. Все расстояния положительны и не превышают 10⁹. Селение и убежище могут располагаться в одной точке.
Формат вывода
Выведите n чисел - для каждого селения выведите номер ближайшего к нему бомбоубежища. Бомбоубежища пронумерованы от 1 до m в том порядке, в котором они заданы во входных данных.
Указание
Создайте список кортежей из пар (позиция селения, его номер в исходном списке), а также аналогичный список для бомбоубежищ. Отсортируйте эти списки.
Перебирайте селения в порядке возрастания.
Для селения ближайшими могут быть два соседних бомбоубежища, среди них надо выбрать ближайшее. При переходе к следующему селению не обязательно искать ближайшее бомбоубежище с самого начала. Его можно искать начиная с позиции, найденной для предыдущего города.
Для хранения ответа используйте список, где индекс будет номером селения, а по этому индексу будет запоминаться номер бомбоубежища.
n = int(input()) nlist = list(map(int, input().split())) m = int(input()) mlist = list(map(int, input().split())) c = [] c1 = [] for i in range(n): camp = (nlist[i], i + 1) c.append(camp) c.sort() c1 = c.copy() b = [] for j in range(m): bomb = (mlist[j], j + 1) b.append(bomb) b.sort() z = 0 for k in range(n): x = 999999 y = 0 a = c[k][1] - 1 for h in range(z, m): if abs(c[k][0] - b[h][0]) < x: x = abs(c[k][0] - b[h][0]) y = b[h][1] z = h else: break c1[a] = y print(*c1)
Просьба не предлагать свои решения, нужен только совет по оптимизации моего. Заранее спасибо!