Ctrl K

Петли в нумерованном дереве

Сложная
Узлы полного двоичного дерева с levels уровнями пронумерованы как в куче: корень — 1, у узла v левый ребёнок 2·v, правый — 2·v + 1. Всего узлов 2^levels − 1. Дан список запросов shortcuts, каждый — пара узлов [a, b]. Для каждого запроса мысленно проложите между a и b дополнительное ребро-перемычку. В графе появится ровно одна петля (замкнутый путь без повторения рёбер). Узнайте, сколько в ней рёбер, и уберите перемычку перед следующим запросом. Если a и b уже соединены ребром дерева, петля состоит из двух рёбер: этого ребра и перемычки. Верните список длин петель в порядке запросов.
Пример 1
levels=3, shortcuts=[[6, 7], [4, 3], [1, 5]] → [3, 4, 3]

6 и 7 — дети узла 3: петля 6 → 3 → 7 → 6 из трёх рёбер. Путь от 4 до 3 идёт через 2 и 1 (три ребра), плюс перемычка — 4. От 1 до 5 два ребра (через 2), плюс перемычка — 3.

Пример 2
levels=4, shortcuts=[[9, 4], [15, 8]] → [2, 7]

9 — ребёнок 4, поэтому перемычка дублирует ребро дерева, и петля состоит из двух рёбер. От 15 до 8 путь 15 → 7 → 3 → 1 → 2 → 4 → 8 (шесть рёбер), с перемычкой — 7.

Ограничения
  • 2 ≤ levels ≤ 30
  • 1 ≤ len(shortcuts) ≤ 10⁵
  • 1 ≤ a, b ≤ 2^levels − 1
  • a ≠ b
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиДругие порядки для того же дерева поиска СложнаяВысота дерева после среза ветки СложнаяДерево по прямому и симметричному обходам СредняяДерево по симметричному и обратному обходам СредняяСбалансированное дерево из отсортированного списка Лёгкая
загружаем Python…
Вход
levels=3, shortcuts=[[6, 7], [4, 3], [1, 5]]
Ожидается
[3, 4, 3]

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 53 теста на сервере, включая скрытые.