Объяснение того, как решить эту проблему, можно найти здесь . (Проблема, с которой я столкнулся, требует большего, но основной шаг в этой проблеме такой же, как и тот, который вы пытаетесь решить.) Сайт, на который я ссылался, также содержит пример решения на C ++.
Набор чисел может быть представлен в двоичном дереве, которое поддерживает следующие операции:
- Вернуть
n
й элемент
- Стереть
n
й элемент
Эти операции могут быть реализованы для выполнения за O(log n)
время, где n
- количество узлов в дереве.
Чтобы построить дерево, вы можете либо создать собственную подпрограмму, которая создает дерево из заданного массива элементов, либо реализовать операцию вставки (убедитесь, что дерево сбалансировано).
Каждый узел в дереве нуждается в следующей информации:
- Указатели на левого и правого детей
- Сколько элементов в левом и правом поддеревьях
При наличии такой структуры решение остальной части задачи должно быть достаточно простым.
Я также рекомендую вычислять ответы для всех возможных значений ввода перед чтением любого ввода вместо расчета ответа для каждой строки ввода.
Реализация вышеуказанного алгоритма на Java будет принята за 0,68 секунды на сайте, на который вы ссылаетесь.
(Извините, что не предоставил никакой помощи по Python, но, надеюсь, описанный выше алгоритм будет достаточно быстрым.)