@iegor

Как оптимизировать алгоритм?

Мой код решает задачу, но не вписывается по времени, вроде работает за n logn как и должен. Возможно что-то упустил в бинарном поиске или в условиях после выхода из него. Сейчас думаю, что просадка идет при одинаковых элементах, т.е. я храню и [5,4] и [5,4,4], хотя первый уже не нужен и он тормозит поиск, можно его удалять, но это, наверно, долго, возможно заменять None, но пока не придумал как.
from array import array


def b_search3(xs, q):
    l, h = 0, len(xs)-1
    while l < h:
        mid = (l + h+1)//2
        if q > xs[mid]:
            h = mid -1
        else:
            l = mid
    return h


def max_sequence(l):
    temp = list()
    temp.append(array('i', (l[0],)))
    for i, v in enumerate(l[1:]):
        current = b_search3(tuple(x[-1] for x in temp), v)
        if v > temp[current][-1]:
            temp[current][-1] = v
        else:
            new = temp[current] + array('i', (v,))
            if len(new) > len(temp):
                    temp.append(new)
            elif v > temp[len(new)-1][-1]:
                temp[len(new)-1] = new
    answer = []
    prev = 0
    for el in temp[-1]:
        prev += l[prev:].index(el) +1
        answer.append(str(prev))
    return '\n'.join((str(len(temp[-1])), ' '.join(answer)))


def main():
    import sys
    reader = (map(int, line.split()) for line in sys.stdin)
    next(reader)
    l = array('i')
    l.fromlist(list(next(reader)))
    print(max_sequence(l))

if __name__ == '__main__':
    main()

Условие:
Дано целое число 1≤n≤10^5 и массив A[1…n]A[1…n], содержащий неотрицательные целые числа, не превосходящие 10^9. Найдите наибольшую невозрастающую подпоследовательность в A. В первой строке выведите её длину k, во второй — её индексы 1≤i1
  • Вопрос задан
  • 634 просмотра
Решения вопроса 1
@aslan7470
Ваш код не могу понять, Python незнаю
Если для каждого элемента A[I] храним L[I] - длину макс. начинающейся с него подпоследовательности и P[I] - индекс следующего элемента в ней, то
L[I]=max L[J] : J>I, A[J]<=A[I], сложность O(N^2)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы