Все темы
148

LCA бинарным подъёмом

Tier 1Закрыто

Где применяется

1. Задача

HR-система хранит компанию как дерево: сотрудник i подчиняется сотруднику parent[i], а у гендиректора родитель равен -1. Системе снова и снова нужно отвечать на один вопрос: кто ближайший общий руководитель двух сотрудников, то есть первый человек, до которого доходят обе цепочки подчинения? И на соседний вопрос: находится ли сотрудник X где-то под руководителем M?

На один такой вопрос можно ответить, поднимаясь по обеим цепочкам родителей, пока они не встретятся. Это O(глубина) на вопрос. В глубоком дереве с тысячами вопросов это долго.

Прошлый урок заранее считал блоки длины степени двойки в массиве, чтобы вопрос про отрезок не требовал прохода по нему. Та же идея работает на дереве. Для каждого узла заранее посчитаем предка на 1 шаг вверх, на 2 шага, на 4, на 8 и так далее. Тогда любой подъём по дереву это несколько больших прыжков вместо шагов по одному.

Этот шаг из платной части

Бесплатные шаги в начале курса (их 33) открыты всем: урок, задача и тесты. Этот шаг открывается с полным доступом. Начни с бесплатного аккаунта и бесплатных шагов.

Завести бесплатный аккаунтПосмотреть, что входит

На LeetCode

Задачи на деревья, где снова и снова спрашивают про предков или пути, например k-й предок или наименьший общий предок двух узлов. Таблица прыжков на 2^k предков отвечает на каждый вопрос за O(log n) после построения за O(n log n).

Мы используем необходимые куки для работы сайта (вход и язык). Если ты согласишься, мы также загрузим Google Analytics, чтобы видеть, какие страницы читают, и Google reCAPTCHA для защиты форм обратной связи и сообщений об ошибке от спама. Политика конфиденциальности