возможно ли сократить время выполнения программы в задаче lover bound
Здравствуйте помогите пожалуйста, потому что уже не знаю что делать
Задача выглядит так
Lower bound
На вход подаются N целых чисел, а также набор из M запросов, каждый из которых — целое число. Ваша задача — для каждого запроса найти количество чисел из исходного набора, меньших заданного в запросе числа. Использовать встроенные функции бинарного поиска запрещено.
n=int(input())
a = sorted(list(map(int, input().split())))
M = int(input())
b = list(map(int, input().split()))
answers = list()
for i in range(M): #решал черезе бинарный поиск
L = -1
R = n
while R - L > 1:
M = (R + L) // 2
if a[M] < b[i]:
L = M
else:
R = M
answers.append(R)
print(*answers)
все арботает отлично, но время выполнения большое
Входные данные
Первая строка содержит число N — количество элементов в массиве.
1≤N≤250000.
Вторая строка содержит N целых чисел Ai через пробел. −109≤Ai≤109.
Третья строка содержит число M — количество запросов. 1≤M≤250000.
Четвёртая строка содержит M целых чисел Qi через пробел. −109≤Qi≤109.
Выходные данные
Выведите единственную строку с M целыми числами — количествами чисел
исходного массива, меньших соответствующему запросу.
5
1 5 3 2 1
2
4 3
выход
4 3
Ответы (1 шт):
Можно попробовать так - отсортируйте запросы вместе с их номерами (список списков [число-запрос, исходный номер, ответ (пока неизвестный)])
Пройдите по списку по порядку, для увеличивающихся значений запроса получая увеличивающиеся ответы, записывайте их в третий элемент списков
Отсортируйте по второму полю, выведите ответы
O(nlogn)+O(mlogm)+O(n+m)+O(mlogm)
Теоретически это не лучше, т.к. ваше решение O(nlogn) + O(mlogn), где первое слагаемое доминирует, но а) сортировка всё-таки встроенная б) не расширяем список на каждом шагу