Решение задачи Номер левого и правого вхождения с Яндекс Контест

Без пояснения   Просмотров: 2291


Требуется определить в заданном массиве номер самого левого и самого правого элемента, равного искомому числу.


Код

n = int(input())
a = list(map(int, input().split()))
m = int(input())
b = list(map(int, input().split()))
for i in b:
    l = 0
    r = len(a) - 1
    m = (l + r) // 2
    first, last = 0, 0
    while r >= l:
        if a[m] < i:
            l = m + 1
        elif a[m] > i:
            r = m - 1
        else:
            if m != n - 1 and a[m] == a[m + 1]:
                l = m + 1
            else:
                last = m + 1
                break
        m = (l + r) // 2
    l = 0
    r = len(a) - 1
    m = (l + r) // 2
    while r >= l:
        if a[m] < i:
            l = m + 1
        elif a[m] > i:
            r = m - 1
        else:
            if m != 0 and a[m] == a[m - 1]:
                r = m - 1
            else:
                first = m + 1
                break
        m = (l + r) // 2
    print(first, last)

         

Администратор Photo Автор: Администратор



Комментарии

Чтобы написать комментарии вам нужно войти в систему или зарегистрироваться



Заявка на расчет