Изменения

Перейти к: навигация, поиск

Level Ancestor problem

154 байта добавлено, 16:52, 15 мая 2019
Нет описания правки
Пусть после этого нам пришел запрос <tex>LA(v, k)</tex>.
*Сделаем один максимально большой прыжок вверх с помощью насчитанных двоичных подъемов.<code> '''function'''LA(int v,int k): ''int n'' = h(v); //получаем n = n - k;# i = <tex>i = \log kn</tex>;#<tex> v = p_i[v] i = n - i; ''return'' way[num_on_way[v] - i]; //так как теперь <tex>v</tex> и ответ находятся на одном пути</code> 
=== Доказательство корректности ===
Рассмотрим путь, на котором лежит вершина <tex>v</tex> до удвоения. Он длины хотя бы <tex>2^i</tex>, так как мы точно знаем, что существует вершина потомок <tex>v</tex>, расстояние до которого ровно <tex>2^i</tex> (это вершина, из которой мы только что пришли). Значит, после удвоения этот путь стал длины хотя бы <tex>2^{i + 1}</tex>, причем хотя бы <tex>2^i</tex> вершин в нем - предки <tex>v</tex>. Это означает, что вершина, которую мы ищем, находится на этом пути (иначе бы мы могли до этого прыгнуть еще на <tex>2^i</tex> вверх). Так как мы знаем позицию <tex>v</tex> в этом пути, то нужную вершину мы можем найти за <tex>O(1)</tex>.
Анонимный участник

Навигация