<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=109.188.219.181&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=109.188.219.181&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/109.188.219.181"/>
		<updated>2026-06-11T14:25:45Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A8%D0%B8%D0%B1%D0%B5%D1%80%D0%B0-%D0%92%D0%B8%D1%88%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=26383</id>
		<title>Алгоритм Шибера-Вишкина</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A8%D0%B8%D0%B1%D0%B5%D1%80%D0%B0-%D0%92%D0%B8%D1%88%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=26383"/>
				<updated>2012-06-21T16:37:42Z</updated>
		
		<summary type="html">&lt;p&gt;109.188.219.181: /* Обработка запроса */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Алгоритм Шибера-Вишкина'' применяется для нахождения наименьшего общего предка двух вершин в дереве.&lt;br /&gt;
Он использует &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; времени на подготовку и затем отвечает на каждый запрос за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Идея алгоритма==&lt;br /&gt;
Основная идея алгоритма следующая. &lt;br /&gt;
&lt;br /&gt;
# Если бы дерево, в котором нужно искать &amp;lt;tex&amp;gt;LCA&amp;lt;/tex&amp;gt; было бы цепочкой, можно было бы найти &amp;lt;tex&amp;gt;LCA(u, v)&amp;lt;/tex&amp;gt; просто взяв ту вершину, которая находится в дереве выше.&lt;br /&gt;
# Если дерево {{---}} полное двоичное дерево высоты &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;, то можно сопоставить каждой вершине битовый вектор длиной &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; (целое число от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;2^h-1&amp;lt;/tex&amp;gt;) и с помощью битовых операций над этими векторами найти &amp;lt;tex&amp;gt;LCA(u, v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, представив данное дерево как полное двоичное дерево, в каждой вершине которого находится цепочка, можно &lt;br /&gt;
научиться искать &amp;lt;tex&amp;gt;LCA(v, u)&amp;lt;/tex&amp;gt; в нем за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Подготовка==&lt;br /&gt;
Перенумеруем вершины в порядке префиксного обхода дерева: сначала обрабатывается текущая вершина, затем {{---}} поддеревья.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\operatorname{order} : V \to \mathbb{N}&amp;lt;/tex&amp;gt; {{---}} такой порядок обхода.&lt;br /&gt;
&lt;br /&gt;
Обозначим за &amp;lt;tex&amp;gt;\operatorname{size} v&amp;lt;/tex&amp;gt; количество вершин в поддереве вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Здесь и далее считаем, &lt;br /&gt;
что вершина является и своим предком, и своим потомком.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; {{---}} вершина из поддерева &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Тогда &lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{order} u \in [\operatorname{order} v; \operatorname{order}v + \operatorname{size} v - 1]&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
По определению &amp;lt;tex&amp;gt;\operatorname{order}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt; вершин из поддерева &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; образуют &lt;br /&gt;
отрезок натуральных чисел длиной &amp;lt;tex&amp;gt;\operatorname{size} v - 1&amp;lt;/tex&amp;gt;. Так как этот отрезок начинается с &lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{order}v + 1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt; {{---}} отрезок &amp;lt;tex&amp;gt;[\operatorname{order} v; \operatorname{order} v + \operatorname{size} v - 1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Покроем дерево путями. А именно, сопоставим каждой вершине &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; число &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; такое, что прообраз каждого &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; связен и является простым путем от какой-то вершины вниз до листа.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=В качестве &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; можно выбрать &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt;, кратное максимальной степени двойки, где &amp;lt;tex&amp;gt;u \in S(v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\operatorname{inlabel} v = \operatorname{order} u = k2^b&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; {{---}} максимально.&lt;br /&gt;
Пусть есть вершина &amp;lt;tex&amp;gt;u' \in S(i)&amp;lt;/tex&amp;gt; такая, что &amp;lt;tex&amp;gt;\operatorname{order} u' = k'2^b&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Так как в отрезке, соответствующем вершине &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; есть два числа, кратных &amp;lt;tex&amp;gt;2^b&amp;lt;/tex&amp;gt;, то&lt;br /&gt;
там есть и число, кратное &amp;lt;tex&amp;gt;2^{b+1}&amp;lt;/tex&amp;gt;. Но тогда &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; выбран неверно.&lt;br /&gt;
Значит, в поддереве &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; есть только одна такая вершина &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;\operatorname{order} u \hdots 2^{max}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим два случая. &lt;br /&gt;
&lt;br /&gt;
'''Первый случай''' &amp;lt;tex&amp;gt;\operatorname{inlabel} v = \operatorname{order} v&amp;lt;/tex&amp;gt;&lt;br /&gt;
Других таких вершин &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; дает такую же степень двойки, нет.&lt;br /&gt;
Значит, во всех поддеревьях &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; значения &amp;lt;tex&amp;gt;\operatorname{inlabel}&amp;lt;/tex&amp;gt; отличаются&lt;br /&gt;
от &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Второй случай''' &amp;lt;tex&amp;gt;\operatorname{inlabel} v = \operatorname{order} u&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;u \in S(v), u \ne v&amp;lt;/tex&amp;gt;&lt;br /&gt;
Так как в поддереве &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; представлены все &amp;lt;tex&amp;gt;\operatorname{order}&amp;lt;/tex&amp;gt;-ы из отрезка &amp;lt;tex&amp;gt;[\operatorname{order} v; \operatorname{order} v + \operatorname{size} v - 1]&amp;lt;/tex&amp;gt;, то рассмотрим того потомка &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;u \in S(w)&amp;lt;/tex&amp;gt;. Тогда, так как степень двойки у &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; максимальна, по утверждению в начале доказательства, других вершин с такой же степенью двойки нет, то &amp;lt;tex&amp;gt;\operatorname{inlabel} w = \operatorname{inlabel} v = \operatorname{order} u&amp;lt;/tex&amp;gt;. Так как отрезки, соответствующие поддеревьям сыновей, не пересекаются, не найдется другого &amp;lt;tex&amp;gt;w'&amp;lt;/tex&amp;gt; {{---}} потомок &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, что в поддереве &amp;lt;tex&amp;gt;w'&amp;lt;/tex&amp;gt; есть вершина с такой же степенью двойки. Значит, все вершины &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, у которых &amp;lt;tex&amp;gt;\operatorname{inlabel} v' = \operatorname{inlabel} v&amp;lt;/tex&amp;gt; находятся в поддереве &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;. Проведя аналогичное доказательство для &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, получим требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\operatorname{inlabel} v = 2^i (\frac{\operatorname{order} v + \operatorname{size} v}{2^i})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;i = \lfloor\log_2 (\operatorname{order} v \oplus (\operatorname{order} v + \operatorname{size} v)) \rfloor + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Посмотрим на &amp;lt;tex&amp;gt;A = \operatorname{order} v \oplus (\operatorname{order} v + \operatorname{size} v)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Посмотрим на позицию самой правой единицы &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Так как в &amp;lt;tex&amp;gt;\operatorname{order} v&amp;lt;/tex&amp;gt; там еще &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, а в &amp;lt;tex&amp;gt;\operatorname{order} v + \operatorname{size} v&amp;lt;/tex&amp;gt; {{---}} уже единица, то в отрезке &amp;lt;tex&amp;gt;[\operatorname{order} v; \operatorname{order} v + \operatorname{size} v]&amp;lt;/tex&amp;gt; есть число, кратное &amp;lt;tex&amp;gt;2^l&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Докажем, что нет чисел, кратных &amp;lt;tex&amp;gt;2^{l+1}&amp;lt;/tex&amp;gt;. Пусть такое число нашлось. Тогда &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;-й бит менялся хотя бы два раза, а значит, менялся &lt;br /&gt;
&amp;lt;tex&amp;gt;l+1&amp;lt;/tex&amp;gt;-й бит. А значит, самый значащий отличающийся бит в &amp;lt;tex&amp;gt;\operatorname{order} v&amp;lt;/tex&amp;gt; и в &amp;lt;tex&amp;gt;\operatorname{order} v + \operatorname{size} v&amp;lt;/tex&amp;gt; больше, чем &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;-й.&lt;br /&gt;
&lt;br /&gt;
Заметим, что функция &amp;lt;tex&amp;gt;\lfloor \log_2 a \rfloor + 1&amp;lt;/tex&amp;gt; просто выделяет номер самого значашего единичного бита.&lt;br /&gt;
&lt;br /&gt;
Функция &amp;lt;tex&amp;gt;2^l\frac{a}{2^l}&amp;lt;/tex&amp;gt; обнуляет все биты младше &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;-го. &lt;br /&gt;
&lt;br /&gt;
Чтобы получить из отрезка число, кратное &amp;lt;tex&amp;gt;2^l&amp;lt;/tex&amp;gt;, будучи уверенными, что оно там есть, достаточно обнулить &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; битов в правой границе отрезка.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Обработка запроса==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} вершины в исходном дереве &amp;lt;tex&amp;gt;LCA&amp;lt;/tex&amp;gt; которых необходимо найти. Если &amp;lt;tex&amp;gt;\operatorname{inlabel} x = \operatorname{inlabel} y&amp;lt;/tex&amp;gt;, то они принадлежат одному простому пути, а следовательно ответом на запрос является &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;\operatorname{level} x \le \operatorname{level} y&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;, в противном случае. Теперь рассмотрим случай, когда &amp;lt;tex&amp;gt;\operatorname{inlabel} x \ne \operatorname{inlabel} y&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; принадлежат разным простым путям. Найдем &amp;lt;tex&amp;gt;b = LCA(\operatorname{inlabel} x, \operatorname{inlabel} y)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement= &amp;lt;tex&amp;gt;LCA(\operatorname{inlabel} x, \operatorname{inlabel} y) = 2^i((2(\frac x{2^{i+1}})) \,|\, 1)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;i = \log(\operatorname{inlabel} x \oplus \operatorname{inlabel} y)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof= Пусть &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; {{---}} индекс самой правой единицы в двоичном представлении &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;. Из того, что &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; общий предок &amp;lt;tex&amp;gt;\operatorname{inlabel} x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\operatorname{inlabel} y&amp;lt;/tex&amp;gt; в полном двоичном дереве следует, что &amp;lt;tex&amp;gt;l-i&amp;lt;/tex&amp;gt; левых бит, совпадающих в &amp;lt;tex&amp;gt;\operatorname{inlabel} x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\operatorname{inlabel} y&amp;lt;/tex&amp;gt;, должны быть такими же и в &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;, а так как &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; наименьший общий предок, то &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; {{---}} минимальный такой индекс. То есть &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; самый левый бит, в котором различаются &amp;lt;tex&amp;gt;\operatorname{inlabel} x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\operatorname{inlabel} y&amp;lt;/tex&amp;gt;. А двоичное представление &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; состоит из &amp;lt;tex&amp;gt;l-i&amp;lt;/tex&amp;gt; левых бит &amp;lt;tex&amp;gt;\operatorname{inlabel} x&amp;lt;/tex&amp;gt; (или &amp;lt;tex&amp;gt;\operatorname{inlabel} y&amp;lt;/tex&amp;gt;), единички и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; нулей.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>109.188.219.181</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A8%D0%B8%D0%B1%D0%B5%D1%80%D0%B0-%D0%92%D0%B8%D1%88%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=26382</id>
		<title>Алгоритм Шибера-Вишкина</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A8%D0%B8%D0%B1%D0%B5%D1%80%D0%B0-%D0%92%D0%B8%D1%88%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=26382"/>
				<updated>2012-06-21T16:36:57Z</updated>
		
		<summary type="html">&lt;p&gt;109.188.219.181: /* Подготовка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Алгоритм Шибера-Вишкина'' применяется для нахождения наименьшего общего предка двух вершин в дереве.&lt;br /&gt;
Он использует &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; времени на подготовку и затем отвечает на каждый запрос за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Идея алгоритма==&lt;br /&gt;
Основная идея алгоритма следующая. &lt;br /&gt;
&lt;br /&gt;
# Если бы дерево, в котором нужно искать &amp;lt;tex&amp;gt;LCA&amp;lt;/tex&amp;gt; было бы цепочкой, можно было бы найти &amp;lt;tex&amp;gt;LCA(u, v)&amp;lt;/tex&amp;gt; просто взяв ту вершину, которая находится в дереве выше.&lt;br /&gt;
# Если дерево {{---}} полное двоичное дерево высоты &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;, то можно сопоставить каждой вершине битовый вектор длиной &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; (целое число от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;2^h-1&amp;lt;/tex&amp;gt;) и с помощью битовых операций над этими векторами найти &amp;lt;tex&amp;gt;LCA(u, v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, представив данное дерево как полное двоичное дерево, в каждой вершине которого находится цепочка, можно &lt;br /&gt;
научиться искать &amp;lt;tex&amp;gt;LCA(v, u)&amp;lt;/tex&amp;gt; в нем за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Подготовка==&lt;br /&gt;
Перенумеруем вершины в порядке префиксного обхода дерева: сначала обрабатывается текущая вершина, затем {{---}} поддеревья.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\operatorname{order} : V \to \mathbb{N}&amp;lt;/tex&amp;gt; {{---}} такой порядок обхода.&lt;br /&gt;
&lt;br /&gt;
Обозначим за &amp;lt;tex&amp;gt;\operatorname{size} v&amp;lt;/tex&amp;gt; количество вершин в поддереве вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Здесь и далее считаем, &lt;br /&gt;
что вершина является и своим предком, и своим потомком.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; {{---}} вершина из поддерева &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Тогда &lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{order} u \in [\operatorname{order} v; \operatorname{order}v + \operatorname{size} v - 1]&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
По определению &amp;lt;tex&amp;gt;\operatorname{order}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt; вершин из поддерева &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; образуют &lt;br /&gt;
отрезок натуральных чисел длиной &amp;lt;tex&amp;gt;\operatorname{size} v - 1&amp;lt;/tex&amp;gt;. Так как этот отрезок начинается с &lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{order}v + 1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt; {{---}} отрезок &amp;lt;tex&amp;gt;[\operatorname{order} v; \operatorname{order} v + \operatorname{size} v - 1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Покроем дерево путями. А именно, сопоставим каждой вершине &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; число &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; такое, что прообраз каждого &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; связен и является простым путем от какой-то вершины вниз до листа.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=В качестве &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; можно выбрать &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt;, кратное максимальной степени двойки, где &amp;lt;tex&amp;gt;u \in S(v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\operatorname{inlabel} v = \operatorname{order} u = k2^b&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; {{---}} максимально.&lt;br /&gt;
Пусть есть вершина &amp;lt;tex&amp;gt;u' \in S(i)&amp;lt;/tex&amp;gt; такая, что &amp;lt;tex&amp;gt;\operatorname{order} u' = k'2^b&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Так как в отрезке, соответствующем вершине &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; есть два числа, кратных &amp;lt;tex&amp;gt;2^b&amp;lt;/tex&amp;gt;, то&lt;br /&gt;
там есть и число, кратное &amp;lt;tex&amp;gt;2^{b+1}&amp;lt;/tex&amp;gt;. Но тогда &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; выбран неверно.&lt;br /&gt;
Значит, в поддереве &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; есть только одна такая вершина &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;\operatorname{order} u \hdots 2^{max}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим два случая. &lt;br /&gt;
&lt;br /&gt;
'''Первый случай''' &amp;lt;tex&amp;gt;\operatorname{inlabel} v = \operatorname{order} v&amp;lt;/tex&amp;gt;&lt;br /&gt;
Других таких вершин &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; дает такую же степень двойки, нет.&lt;br /&gt;
Значит, во всех поддеревьях &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; значения &amp;lt;tex&amp;gt;\operatorname{inlabel}&amp;lt;/tex&amp;gt; отличаются&lt;br /&gt;
от &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Второй случай''' &amp;lt;tex&amp;gt;\operatorname{inlabel} v = \operatorname{order} u&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;u \in S(v), u \ne v&amp;lt;/tex&amp;gt;&lt;br /&gt;
Так как в поддереве &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; представлены все &amp;lt;tex&amp;gt;\operatorname{order}&amp;lt;/tex&amp;gt;-ы из отрезка &amp;lt;tex&amp;gt;[\operatorname{order} v; \operatorname{order} v + \operatorname{size} v - 1]&amp;lt;/tex&amp;gt;, то рассмотрим того потомка &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;u \in S(w)&amp;lt;/tex&amp;gt;. Тогда, так как степень двойки у &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; максимальна, по утверждению в начале доказательства, других вершин с такой же степенью двойки нет, то &amp;lt;tex&amp;gt;\operatorname{inlabel} w = \operatorname{inlabel} v = \operatorname{order} u&amp;lt;/tex&amp;gt;. Так как отрезки, соответствующие поддеревьям сыновей, не пересекаются, не найдется другого &amp;lt;tex&amp;gt;w'&amp;lt;/tex&amp;gt; {{---}} потомок &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, что в поддереве &amp;lt;tex&amp;gt;w'&amp;lt;/tex&amp;gt; есть вершина с такой же степенью двойки. Значит, все вершины &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, у которых &amp;lt;tex&amp;gt;\operatorname{inlabel} v' = \operatorname{inlabel} v&amp;lt;/tex&amp;gt; находятся в поддереве &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;. Проведя аналогичное доказательство для &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, получим требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\operatorname{inlabel} v = 2^i (\frac{\operatorname{order} v + \operatorname{size} v}{2^i})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;i = \lfloor\log_2 (\operatorname{order} v \oplus (\operatorname{order} v + \operatorname{size} v)) \rfloor + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Посмотрим на &amp;lt;tex&amp;gt;A = \operatorname{order} v \oplus (\operatorname{order} v + \operatorname{size} v)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Посмотрим на позицию самой правой единицы &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Так как в &amp;lt;tex&amp;gt;\operatorname{order} v&amp;lt;/tex&amp;gt; там еще &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, а в &amp;lt;tex&amp;gt;\operatorname{order} v + \operatorname{size} v&amp;lt;/tex&amp;gt; {{---}} уже единица, то в отрезке &amp;lt;tex&amp;gt;[\operatorname{order} v; \operatorname{order} v + \operatorname{size} v]&amp;lt;/tex&amp;gt; есть число, кратное &amp;lt;tex&amp;gt;2^l&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Докажем, что нет чисел, кратных &amp;lt;tex&amp;gt;2^{l+1}&amp;lt;/tex&amp;gt;. Пусть такое число нашлось. Тогда &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;-й бит менялся хотя бы два раза, а значит, менялся &lt;br /&gt;
&amp;lt;tex&amp;gt;l+1&amp;lt;/tex&amp;gt;-й бит. А значит, самый значащий отличающийся бит в &amp;lt;tex&amp;gt;\operatorname{order} v&amp;lt;/tex&amp;gt; и в &amp;lt;tex&amp;gt;\operatorname{order} v + \operatorname{size} v&amp;lt;/tex&amp;gt; больше, чем &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;-й.&lt;br /&gt;
&lt;br /&gt;
Заметим, что функция &amp;lt;tex&amp;gt;\lfloor \log_2 a \rfloor + 1&amp;lt;/tex&amp;gt; просто выделяет номер самого значашего единичного бита.&lt;br /&gt;
&lt;br /&gt;
Функция &amp;lt;tex&amp;gt;2^l\frac{a}{2^l}&amp;lt;/tex&amp;gt; обнуляет все биты младше &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;-го. &lt;br /&gt;
&lt;br /&gt;
Чтобы получить из отрезка число, кратное &amp;lt;tex&amp;gt;2^l&amp;lt;/tex&amp;gt;, будучи уверенными, что оно там есть, достаточно обнулить &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; битов в правой границе отрезка.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Обработка запроса==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} вершины в исходном дереве &amp;lt;tex&amp;gt;LCA&amp;lt;/tex&amp;gt; которых необходимо найти. Если &amp;lt;tex&amp;gt;\operatorname{inlabel} x = \operatorname{inlabel} y&amp;lt;/tex&amp;gt;, то они принадлежат одному простому пути, а следовательно ответом на запрос является &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;\operatorname{level} x \le \operatorname{level} y&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;, в противном случае. Теперь рассмотрим случай, когда &amp;lt;tex&amp;gt;\operatorname{inlabel} x \ne \operatorname{inlabel} y&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; принадлежат разным простым путям. Найдем &amp;lt;tex&amp;gt;b = LCA(\operatorname{inlabel} x, \operatorname{inlabel} y)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement= &amp;lt;tex&amp;gt;\operatorname{inlabel} LCA(x, y) = 2^i((2(\frac x{2^{i+1}})) \,|\, 1)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;i = \log(\operatorname{inlabel} x \oplus \operatorname{inlabel} y)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof= Пусть &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; {{---}} индекс самой правой единицы в двоичном представлении &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;. Из того, что &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; общий предок &amp;lt;tex&amp;gt;\operatorname{inlabel} x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\operatorname{inlabel} y&amp;lt;/tex&amp;gt; в полном двоичном дереве следует, что &amp;lt;tex&amp;gt;l-i&amp;lt;/tex&amp;gt; левых бит, совпадающих в &amp;lt;tex&amp;gt;\operatorname{inlabel} x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\operatorname{inlabel} y&amp;lt;/tex&amp;gt;, должны быть такими же и в &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;, а так как &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; наименьший общий предок, то &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; {{---}} минимальный такой индекс. То есть &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; самый левый бит, в котором различаются &amp;lt;tex&amp;gt;\operatorname{inlabel} x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\operatorname{inlabel} y&amp;lt;/tex&amp;gt;. А двоичное представление &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; состоит из &amp;lt;tex&amp;gt;l-i&amp;lt;/tex&amp;gt; левых бит &amp;lt;tex&amp;gt;\operatorname{inlabel} x&amp;lt;/tex&amp;gt; (или &amp;lt;tex&amp;gt;\operatorname{inlabel} y&amp;lt;/tex&amp;gt;), единички и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; нулей.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>109.188.219.181</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A8%D0%B8%D0%B1%D0%B5%D1%80%D0%B0-%D0%92%D0%B8%D1%88%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=26369</id>
		<title>Алгоритм Шибера-Вишкина</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A8%D0%B8%D0%B1%D0%B5%D1%80%D0%B0-%D0%92%D0%B8%D1%88%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=26369"/>
				<updated>2012-06-21T15:19:57Z</updated>
		
		<summary type="html">&lt;p&gt;109.188.219.181: /* Обработка запроса */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Алгоритм Шибера-Вишкина'' применяется для нахождения наименьшего общего предка двух вершин в дереве.&lt;br /&gt;
Он использует &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; времени на подготовку и затем отвечает на каждый запрос за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Идея алгоритма==&lt;br /&gt;
Основная идея алгоритма следующая. &lt;br /&gt;
&lt;br /&gt;
# Если бы дерево, в котором нужно искать &amp;lt;tex&amp;gt;LCA&amp;lt;/tex&amp;gt; было бы цепочкой, можно было бы найти &amp;lt;tex&amp;gt;LCA(u, v)&amp;lt;/tex&amp;gt; просто взяв ту вершину, которая находится в дереве выше.&lt;br /&gt;
# Если дерево {{---}} полное двоичное дерево высоты &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;, то можно сопоставить каждой вершине битовый вектор длиной &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; (целое число от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;2^h-1&amp;lt;/tex&amp;gt;) и с помощью битовых операций над этими векторами найти &amp;lt;tex&amp;gt;LCA(u, v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, представив данное дерево как полное двоичное дерево, в каждой вершине которого находится цепочка, можно &lt;br /&gt;
научиться искать &amp;lt;tex&amp;gt;LCA(v, u)&amp;lt;/tex&amp;gt; в нем за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Подготовка==&lt;br /&gt;
Перенумеруем вершины в порядке префиксного обхода дерева: сначала обходится текущая вершина, затем {{---}} поддеревья.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\operatorname{order} : V \to \mathbb{N}&amp;lt;/tex&amp;gt; {{---}} такой порядок обхода.&lt;br /&gt;
&lt;br /&gt;
Обозначим за &amp;lt;tex&amp;gt;\operatorname{size} v&amp;lt;/tex&amp;gt; количество вершин в поддереве вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Здесь и далее считаем, &lt;br /&gt;
что вершина является и своим предком, и своим потомком.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; {{---}} вершина из поддерева &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Тогда &lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{order} u \in [\operatorname{order} v; \operatorname{order}v + \operatorname{size} v - 1]&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
По определению &amp;lt;tex&amp;gt;\operatorname{order}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt; вершин из поддерева &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; образуют &lt;br /&gt;
отрезок натуральных чисел длиной &amp;lt;tex&amp;gt;\operatorname{size} v - 1&amp;lt;/tex&amp;gt;. Так как этот отрезок начинается с &lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{order}v + 1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt; {{---}} отрезок &amp;lt;tex&amp;gt;[\operatorname{order} v; \operatorname{order} v + \operatorname{size} v - 1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Покроем дерево путями. А именно, сопоставим каждой вершине &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; число &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; такое, что прообраз каждого &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; связен и является простым путем от какой-то вершины вниз до листа.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=В качестве &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; можно выбрать &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt;, кратное максимальной степени двойки, где &amp;lt;tex&amp;gt;u \in S(v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\operatorname{inorder} v = \operatorname{order} u = k2^b&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; {{---}} максимально.&lt;br /&gt;
Пусть есть вершина &amp;lt;tex&amp;gt;u' \in S(i)&amp;lt;/tex&amp;gt; такая, что &amp;lt;tex&amp;gt;\operatorname{order} u' = k'2^b&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Так как в отрезке, соответствующем вершине &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; есть два числа, кратных &amp;lt;tex&amp;gt;2^b&amp;lt;/tex&amp;gt;, то&lt;br /&gt;
там есть и число, кратное &amp;lt;tex&amp;gt;2^{b+1}&amp;lt;/tex&amp;gt;. Но тогда &amp;lt;tex&amp;gt;\operatorname{inorder} v&amp;lt;/tex&amp;gt; выбран неверно.&lt;br /&gt;
Значит, в поддереве &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; есть только одна такая вершина &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;\operatorname{order} u \hdots 2^{max}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим два случая. &lt;br /&gt;
&lt;br /&gt;
'''Первый случай''' &amp;lt;tex&amp;gt;\operatorname{inorder} v = \operatorname{order} v&amp;lt;/tex&amp;gt;&lt;br /&gt;
Других таких вершин &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; дает такую же степень двойки, нет.&lt;br /&gt;
Значит, во всех поддеревьях &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; значения &amp;lt;tex&amp;gt;\operatorname{inorder}&amp;lt;/tex&amp;gt; отличаются&lt;br /&gt;
от &amp;lt;tex&amp;gt;\operatorname{inorder} v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Второй случай''' &amp;lt;tex&amp;gt;\operatorname{inorder} v = \operatorname{order} u&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;u \in S(v), u \ne v&amp;lt;/tex&amp;gt;&lt;br /&gt;
Так как в поддереве &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; представлены все &amp;lt;tex&amp;gt;\operatorname{order}&amp;lt;/tex&amp;gt;-ы из отрезка &amp;lt;tex&amp;gt;[\operatorname{order} v; \operatorname{order} v + \operatorname{size} v - 1]&amp;lt;/tex&amp;gt;, то рассмотрим того потомка &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;u \in S(w)&amp;lt;/tex&amp;gt;. Тогда, так как степень двойки у &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; максимальна, по утверждению в начале доказательства, других вершин с такой же степенью двойки нет, то &amp;lt;tex&amp;gt;\operatorname{inorder} w = \operatorname{inorder} v = \operatorname{order} u&amp;lt;/tex&amp;gt;. Так как отрезки, соответствующие поддеревьям сыновей, не пересекаются, не найдется другого &amp;lt;tex&amp;gt;w'&amp;lt;/tex&amp;gt; {{---}} потомок &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, что в поддереве &amp;lt;tex&amp;gt;w'&amp;lt;/tex&amp;gt; есть вершина с такой же степенью двойки. Значит, все вершины &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, у которых &amp;lt;tex&amp;gt;\operatorname{inorder} v' = \operatorname{inorder} v&amp;lt;/tex&amp;gt; находятся в поддереве &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;. Проведя аналогичное доказательство для &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, получим требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Обработка запроса==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} вершины в исходном дереве &amp;lt;tex&amp;gt;LCA&amp;lt;/tex&amp;gt; которых необходимо найти. Если &amp;lt;tex&amp;gt;\operatorname{inlabel} x = \operatorname{inlabel} y&amp;lt;/tex&amp;gt;, то они принадлежат одному простому пути, а следовательно ответом на запрос является &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;\operatorname{level} x \le \operatorname{level} y&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;, в противном случае. Теперь рассмотрим случай, когда &amp;lt;tex&amp;gt;\operatorname{inlabel} x \ne \operatorname{inlabel} y&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; принадлежат разным простым путям. Найдем &amp;lt;tex&amp;gt;b = LCA(\operatorname{inlabel} x, \operatorname{inlabel} y)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement= &amp;lt;tex&amp;gt;\operatorname{inlabel} (((x &amp;gt;&amp;gt; (i + 1)) &amp;lt;&amp;lt; 1) | 1) &amp;lt;&amp;lt; i&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;i = \log(\operatorname{inlabel} x \oplus \operatorname{inlabel} y)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof= Пусть &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; {{---}} индекс самой правой единицы в двоичном представлении &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;. Из того, что &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; общий предок &amp;lt;tex&amp;gt;\operatorname{inlabel} x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\operatorname{inlabel} y&amp;lt;/tex&amp;gt; в полном двоичном дереве следует, что &amp;lt;tex&amp;gt;l-i&amp;lt;/tex&amp;gt; левых бит, совпадающих в &amp;lt;tex&amp;gt;\operatorname{inlabel} x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\operatorname{inlabel} y&amp;lt;/tex&amp;gt;, должны быть такими же и в &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;, а так как &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; наименьший общий предок, то &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; {{---}} минимальный такой индекс. То есть &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; самый левый бит, в котором различаются &amp;lt;tex&amp;gt;\operatorname{inlabel} x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\operatorname{inlabel} y&amp;lt;/tex&amp;gt;. А двоичное представление &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; состоит из &amp;lt;tex&amp;gt;l-i&amp;lt;/tex&amp;gt; левых бит &amp;lt;tex&amp;gt;\operatorname{inlabel} x&amp;lt;/tex&amp;gt; (или &amp;lt;tex&amp;gt;\operatorname{inlabel} y&amp;lt;/tex&amp;gt;), единички и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; нулей.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>109.188.219.181</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A8%D0%B8%D0%B1%D0%B5%D1%80%D0%B0-%D0%92%D0%B8%D1%88%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=26362</id>
		<title>Алгоритм Шибера-Вишкина</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A8%D0%B8%D0%B1%D0%B5%D1%80%D0%B0-%D0%92%D0%B8%D1%88%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=26362"/>
				<updated>2012-06-21T14:56:27Z</updated>
		
		<summary type="html">&lt;p&gt;109.188.219.181: /* Подготовка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Алгоритм Шибера-Вишкина'' применяется для нахождения наименьшего общего предка двух вершин в дереве.&lt;br /&gt;
Он использует &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; времени на подготовку и затем отвечает на каждый запрос за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Идея алгоритма==&lt;br /&gt;
Основная идея алгоритма следующая. &lt;br /&gt;
&lt;br /&gt;
# Если бы дерево, в котором нужно искать &amp;lt;tex&amp;gt;LCA&amp;lt;/tex&amp;gt; было бы цепочкой, можно было бы найти &amp;lt;tex&amp;gt;LCA(u, v)&amp;lt;/tex&amp;gt; просто взяв ту вершину, которая находится в дереве выше.&lt;br /&gt;
# Если дерево {{---}} полное двоичное дерево высоты &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;, то можно сопоставить каждой вершине битовый вектор длиной &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; (целое число от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;2^h-1&amp;lt;/tex&amp;gt;) и с помощью битовых операций над этими векторами найти &amp;lt;tex&amp;gt;LCA(u, v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, представив данное дерево как полное двоичное дерево, в каждой вершине которого находится цепочка, можно &lt;br /&gt;
научиться искать &amp;lt;tex&amp;gt;LCA(v, u)&amp;lt;/tex&amp;gt; в нем за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Подготовка==&lt;br /&gt;
Перенумеруем вершины в порядке префиксного обхода дерева: сначала обходится текущая вершина, затем {{---}} поддеревья.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\operatorname{order} : V \to \mathbb{N}&amp;lt;/tex&amp;gt; {{---}} такой порядок обхода.&lt;br /&gt;
&lt;br /&gt;
Обозначим за &amp;lt;tex&amp;gt;\operatorname{size} v&amp;lt;/tex&amp;gt; количество вершин в поддереве вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Здесь и далее считаем, &lt;br /&gt;
что вершина является и своим предком, и своим потомком.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; {{---}} вершина из поддерева &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Тогда &lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{order} u \in [\operatorname{order} v; \operatorname{order}v + \operatorname{size} v - 1]&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
По определению &amp;lt;tex&amp;gt;\operatorname{order}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt; вершин из поддерева &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; образуют &lt;br /&gt;
отрезок натуральных чисел длиной &amp;lt;tex&amp;gt;\operatorname{size} v - 1&amp;lt;/tex&amp;gt;. Так как этот отрезок начинается с &lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{order}v + 1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt; {{---}} отрезок &amp;lt;tex&amp;gt;[\operatorname{order} v; \operatorname{order} v + \operatorname{size} v - 1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Покроем дерево путями. А именно, сопоставим каждой вершине &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; число &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; такое, что прообраз каждого &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; связен и является простым путем от какой-то вершины вниз до листа.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=В качестве &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; можно выбрать &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt;, кратное максимальной степени двойки, где &amp;lt;tex&amp;gt;u \in S(v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\operatorname{inorder} v = \operatorname{order} u = k2^b&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; {{---}} максимально.&lt;br /&gt;
Пусть есть вершина &amp;lt;tex&amp;gt;u' \in S(i)&amp;lt;/tex&amp;gt; такая, что &amp;lt;tex&amp;gt;\operatorname{order} u' = k'2^b&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Так как в отрезке, соответствующем вершине &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; есть два числа, кратных &amp;lt;tex&amp;gt;2^b&amp;lt;/tex&amp;gt;, то&lt;br /&gt;
там есть и число, кратное &amp;lt;tex&amp;gt;2^{b+1}&amp;lt;/tex&amp;gt;. Но тогда &amp;lt;tex&amp;gt;\operatorname{inorder} v&amp;lt;/tex&amp;gt; выбран неверно.&lt;br /&gt;
Значит, в поддереве &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; есть только одна такая вершина &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;\operatorname{order} u \hdots 2^{max}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим два случая. &lt;br /&gt;
&lt;br /&gt;
'''Первый случай''' &amp;lt;tex&amp;gt;\operatorname{inorder} v = \operatorname{order} v&amp;lt;/tex&amp;gt;&lt;br /&gt;
Других таких вершин &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; дает такую же степень двойки, нет.&lt;br /&gt;
Значит, во всех поддеревьях &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; значения &amp;lt;tex&amp;gt;\operatorname{inorder}&amp;lt;/tex&amp;gt; отличаются&lt;br /&gt;
от &amp;lt;tex&amp;gt;\operatorname{inorder} v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Второй случай''' &amp;lt;tex&amp;gt;\operatorname{inorder} v = \operatorname{order} u&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;u \in S(v), u \ne v&amp;lt;/tex&amp;gt;&lt;br /&gt;
Так как в поддереве &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; представлены все &amp;lt;tex&amp;gt;\operatorname{order}&amp;lt;/tex&amp;gt;-ы из отрезка &amp;lt;tex&amp;gt;[\operatorname{order} v; \operatorname{order} v + \operatorname{size} v - 1]&amp;lt;/tex&amp;gt;, то рассмотрим того потомка &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;u \in S(w)&amp;lt;/tex&amp;gt;. Тогда, так как степень двойки у &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; максимальна, по утверждению в начале доказательства, других вершин с такой же степенью двойки нет, то &amp;lt;tex&amp;gt;\operatorname{inorder} w = \operatorname{inorder} v = \operatorname{order} u&amp;lt;/tex&amp;gt;. Так как отрезки, соответствующие поддеревьям сыновей, не пересекаются, не найдется другого &amp;lt;tex&amp;gt;w'&amp;lt;/tex&amp;gt; {{---}} потомок &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, что в поддереве &amp;lt;tex&amp;gt;w'&amp;lt;/tex&amp;gt; есть вершина с такой же степенью двойки. Значит, все вершины &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, у которых &amp;lt;tex&amp;gt;\operatorname{inorder} v' = \operatorname{inorder} v&amp;lt;/tex&amp;gt; находятся в поддереве &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;. Проведя аналогичное доказательство для &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, получим требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Обработка запроса==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} вершины в исходном дереве &amp;lt;tex&amp;gt;LCA&amp;lt;/tex&amp;gt; которых необходимо найти. Если &amp;lt;tex&amp;gt;\operatorname{inlabel} x = \operatorname{inlabel} y&amp;lt;/tex&amp;gt;, то они принадлежат одному простому пути, а следовательно ответом на запрос является &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;\operatorname{level} x \le \operatorname{level} y&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;, в противном случае. Теперь рассмотрим случай, когда &amp;lt;tex&amp;gt;\operatorname{inlabel} x \ne \operatorname{inlabel} y&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; принадлежат разным простым путям. Найдем &amp;lt;tex&amp;gt;b = LCA(\operatorname{inlabel} x, \operatorname{inlabel} y)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement= &amp;lt;tex&amp;gt;\operatorname{inlabel} (((x &amp;gt;&amp;gt; (i + 1)) &amp;lt;&amp;lt; 1) | 1) &amp;lt;&amp;lt; i&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;i = \log(\operatorname{inlabel} x \oplus \operatorname{inlabel} y)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof= ?&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>109.188.219.181</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A8%D0%B8%D0%B1%D0%B5%D1%80%D0%B0-%D0%92%D0%B8%D1%88%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=26360</id>
		<title>Алгоритм Шибера-Вишкина</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A8%D0%B8%D0%B1%D0%B5%D1%80%D0%B0-%D0%92%D0%B8%D1%88%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=26360"/>
				<updated>2012-06-21T14:53:34Z</updated>
		
		<summary type="html">&lt;p&gt;109.188.219.181: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Алгоритм Шибера-Вишкина'' применяется для нахождения наименьшего общего предка двух вершин в дереве.&lt;br /&gt;
Он использует &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; времени на подготовку и затем отвечает на каждый запрос за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Идея алгоритма==&lt;br /&gt;
Основная идея алгоритма следующая. &lt;br /&gt;
&lt;br /&gt;
# Если бы дерево, в котором нужно искать &amp;lt;tex&amp;gt;LCA&amp;lt;/tex&amp;gt; было бы цепочкой, можно было бы найти &amp;lt;tex&amp;gt;LCA(u, v)&amp;lt;/tex&amp;gt; просто взяв ту вершину, которая находится в дереве выше.&lt;br /&gt;
# Если дерево {{---}} полное двоичное дерево высоты &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;, то можно сопоставить каждой вершине битовый вектор длиной &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; (целое число от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;2^h-1&amp;lt;/tex&amp;gt;) и с помощью битовых операций над этими векторами найти &amp;lt;tex&amp;gt;LCA(u, v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, представив данное дерево как полное двоичное дерево, в каждой вершине которого находится цепочка, можно &lt;br /&gt;
научиться искать &amp;lt;tex&amp;gt;LCA(v, u)&amp;lt;/tex&amp;gt; в нем за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Подготовка==&lt;br /&gt;
Перенумеруем вершины в порядке префиксного обхода дерева: сначала обходится текущая вершина, затем {{---}} поддеревья.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\operatorname{order} : V \to \mathbb{N}&amp;lt;/tex&amp;gt; {{---}} такой порядок обхода.&lt;br /&gt;
&lt;br /&gt;
Обозначим за &amp;lt;tex&amp;gt;\operatorname{size} v&amp;lt;/tex&amp;gt; количество вершин в поддереве вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Здесь и далее считаем, &lt;br /&gt;
что вершина является и своим предком, и своим потомком.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; {{---}} вершина из поддерева &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Тогда &lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{order} u \in [\operatorname{order} v; \operatorname{order}v + \operatorname{size} v - 1]&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
По определению &amp;lt;tex&amp;gt;\operatorname{order}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt; вершин из поддерева &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; образуют &lt;br /&gt;
отрезок натуральных чисел длиной &amp;lt;tex&amp;gt;\operatorname{size} v - 1&amp;lt;/tex&amp;gt;. Так как этот отрезок начинается с &lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{order}v + 1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt; {{---}} отрезок &amp;lt;tex&amp;gt;[\operatorname{order} v; \operatorname{order} v + \operatorname{size} v - 1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Покроем дерево путями. А именно, сопоставим каждой вершине &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; число &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; такое, что прообраз каждого &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; связен и является простым путем от какой-то вершины вниз до листа.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=В качестве &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; можно выбрать &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt;, кратное максимальной степени двойки, где &amp;lt;tex&amp;gt;u \in S(v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\operatorname{inorder} v = \operatorname{order} u = k2^b&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; {{---}} максимально.&lt;br /&gt;
Пусть есть вершина &amp;lt;tex&amp;gt;u' \in S(i)&amp;lt;/tex&amp;gt; такая, что &amp;lt;tex&amp;gt;\operatorname{order} u' = k'2^b&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Так как в отрезке, соответствующем вершине &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; есть два числа, кратных &amp;lt;tex&amp;gt;2^b&amp;lt;/tex&amp;gt;, то&lt;br /&gt;
там есть и число, кратное &amp;lt;tex&amp;gt;2^{b+1}&amp;lt;/tex&amp;gt;. Но тогда &amp;lt;tex&amp;gt;\operatorname{inorder} v&amp;lt;/tex&amp;gt; выбран неверно.&lt;br /&gt;
Значит, в поддереве &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; есть только одна такая вершина &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;\operatorname{order} u \hdots 2^{max}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим два случая. &lt;br /&gt;
''Первый случай'' &amp;lt;tex&amp;gt;\operatorname{inorder} v = \operatorname{order} v&amp;lt;/tex&amp;gt;&lt;br /&gt;
Других таких вершин &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; дает такую же степень двойки, нет.&lt;br /&gt;
Значит, во всех поддеревьях &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; значения &amp;lt;tex&amp;gt;\operatorname{inorder}&amp;lt;/tex&amp;gt; отличаются&lt;br /&gt;
от &amp;lt;tex&amp;gt;\operatorname{inorder} v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
''Второй случай'' &amp;lt;tex&amp;gt;\operatorname{inorder} v = \operatorname{order} u&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;u \in S(v), u \ne v&amp;lt;/tex&amp;gt;&lt;br /&gt;
Так как в поддереве &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; представлены все &amp;lt;tex&amp;gt;\operatorname{order}&amp;lt;/tex&amp;gt;-ы из отрезка &amp;lt;tex&amp;gt;[\operatorname{order} v; \operatorname{order} v + \operatorname{size} v - 1]&amp;lt;/tex&amp;gt;, то рассмотрим того потомка &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;u \in S(w)&amp;lt;/tex&amp;gt;. Тогда, так как степень двойки у &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; максимальна, по утверждению в начале доказательства, других вершин с такой же степенью двойки нет, то &amp;lt;tex&amp;gt;\operatorname{inorder} w = \operatorname{inorder} v = \operatorname{order} u&amp;lt;/tex&amp;gt;. Так как отрезки, соответствующие поддеревьям сыновей, не пересекаются, не найдется другого &amp;lt;tex&amp;gt;w'&amp;lt;/tex&amp;gt; {{---}} потомок &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, что в поддереве &amp;lt;tex&amp;gt;w'&amp;lt;/tex&amp;gt; есть вершина с такой же степенью двойки. Значит, все вершины &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, у которых &amp;lt;tex&amp;gt;\operatorname{inorder} v' = \operatorname{inorder} v&amp;lt;/tex&amp;gt; находятся в поддереве &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;. Проведя аналогичное доказательство для &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, получим требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Обработка запроса==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} вершины в исходном дереве &amp;lt;tex&amp;gt;LCA&amp;lt;/tex&amp;gt; которых необходимо найти. Если &amp;lt;tex&amp;gt;\operatorname{inlabel} x = \operatorname{inlabel} y&amp;lt;/tex&amp;gt;, то они принадлежат одному простому пути, а следовательно ответом на запрос является &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;\operatorname{level} x \le \operatorname{level} y&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;, в противном случае. Теперь рассмотрим случай, когда &amp;lt;tex&amp;gt;\operatorname{inlabel} x \ne \operatorname{inlabel} y&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; принадлежат разным простым путям. Найдем &amp;lt;tex&amp;gt;b = LCA(\operatorname{inlabel} x, \operatorname{inlabel} y)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement= &amp;lt;tex&amp;gt;\operatorname{inlabel} (((x &amp;gt;&amp;gt; (i + 1)) &amp;lt;&amp;lt; 1) | 1) &amp;lt;&amp;lt; i&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;i = \log(\operatorname{inlabel} x \oplus \operatorname{inlabel} y)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof= ?&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>109.188.219.181</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A8%D0%B8%D0%B1%D0%B5%D1%80%D0%B0-%D0%92%D0%B8%D1%88%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=26358</id>
		<title>Алгоритм Шибера-Вишкина</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A8%D0%B8%D0%B1%D0%B5%D1%80%D0%B0-%D0%92%D0%B8%D1%88%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=26358"/>
				<updated>2012-06-21T14:52:16Z</updated>
		
		<summary type="html">&lt;p&gt;109.188.219.181: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Алгоритм Шибера-Вишкина'' применяется для нахождения наименьшего общего предка двух вершин в дереве.&lt;br /&gt;
Он использует &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; времени на подготовку и затем отвечает на каждый запрос за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Идея алгоритма==&lt;br /&gt;
Основная идея алгоритма следующая. &lt;br /&gt;
&lt;br /&gt;
# Если бы дерево, в котором нужно искать &amp;lt;tex&amp;gt;LCA&amp;lt;/tex&amp;gt; было бы цепочкой, можно было бы найти &amp;lt;tex&amp;gt;LCA(u, v)&amp;lt;/tex&amp;gt; просто взяв ту вершину, которая находится в дереве выше.&lt;br /&gt;
# Если дерево {{---}} полное двоичное дерево высоты &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;, то можно сопоставить каждой вершине битовый вектор длиной &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; (целое число от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;2^h-1&amp;lt;/tex&amp;gt;) и с помощью битовых операций над этими векторами найти &amp;lt;tex&amp;gt;LCA(u, v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, представив данное дерево как полное двоичное дерево, в каждой вершине которого находится цепочка, можно &lt;br /&gt;
научиться искать &amp;lt;tex&amp;gt;LCA(v, u)&amp;lt;/tex&amp;gt; в нем за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Подготовка==&lt;br /&gt;
Перенумеруем вершины в порядке префиксного обхода дерева: сначала обходится текущая вершина, затем {{---}} поддеревья.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\operatorname{order} : V \to \mathbb{N}&amp;lt;/tex&amp;gt; {{---}} такой порядок обхода.&lt;br /&gt;
&lt;br /&gt;
Обозначим за &amp;lt;tex&amp;gt;\operatorname{size} v&amp;lt;/tex&amp;gt; количество вершин в поддереве вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Здесь и далее считаем, &lt;br /&gt;
что вершина является и своим предком, и своим потомком.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; {{---}} вершина из поддерева &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Тогда &lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{order} u \in [\operatorname{order} v; \operatorname{order}v + \operatorname{size} v - 1]&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
По определению &amp;lt;tex&amp;gt;\operatorname{order}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt; вершин из поддерева &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; образуют &lt;br /&gt;
отрезок натуральных чисел длиной &amp;lt;tex&amp;gt;\operatorname{size} v - 1&amp;lt;/tex&amp;gt;. Так как этот отрезок начинается с &lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{order}v + 1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt; {{---}} отрезок &amp;lt;tex&amp;gt;[\operatorname{order} v; \operatorname{order} v + \operatorname{size} v - 1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Покроем дерево путями. А именно, сопоставим каждой вершине &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; число &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; такое, что прообраз каждого &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; связен и является простым путем от какой-то вершины вниз до листа.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=В качестве &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; можно выбрать &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt;, кратное максимальной степени двойки, где &amp;lt;tex&amp;gt;u \in S(v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\operatorname{inorder} v = \operatorname{order} u = k2^b&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; {{---}} максимально.&lt;br /&gt;
Пусть есть вершина &amp;lt;tex&amp;gt;u' \in S(i)&amp;lt;/tex&amp;gt; такая, что &amp;lt;tex&amp;gt;\operatorname{order} u' = k'2^b&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Так как в отрезке, соответствующем вершине &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; есть два числа, кратных &amp;lt;tex&amp;gt;2^b&amp;lt;/tex&amp;gt;, то&lt;br /&gt;
там есть и число, кратное &amp;lt;tex&amp;gt;2^{b+1}&amp;lt;/tex&amp;gt;. Но тогда &amp;lt;tex&amp;gt;\operatorname{inorder} v&amp;lt;/tex&amp;gt; выбран неверно.&lt;br /&gt;
Значит, в поддереве &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; есть только одна такая вершина &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;\operatorname{order} u \hdots 2^{max}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим два случая. &lt;br /&gt;
''Первый случай'' &amp;lt;tex&amp;gt;\operatorname{inorder} v = \operatorname{order} v&amp;lt;/tex&amp;gt;&lt;br /&gt;
Других таких вершин &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; дает такую же степень двойки, нет.&lt;br /&gt;
Значит, во всех поддеревьях &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; значения &amp;lt;tex&amp;gt;\operatorname{inorder}&amp;lt;/tex&amp;gt; отличаются&lt;br /&gt;
от &amp;lt;tex&amp;gt;\operatorname{inorder} v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
''Второй случай'' &amp;lt;tex&amp;gt;\operatorname{inorder} v = \operatorname{order} u&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;u \in S(v), u \ne v&amp;lt;/tex&amp;gt;&lt;br /&gt;
Так как в поддереве &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; представлены все &amp;lt;tex&amp;gt;\operatorname{order}&amp;lt;/tex&amp;gt;-ы из отрезка &amp;lt;tex&amp;gt;[\operatorname{order} v; \operatorname{order} v + \operatorname{size} v - 1]&amp;lt;/tex&amp;gt;, то рассмотрим того потомка &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;u \in S(w)&amp;lt;/tex&amp;gt;. Тогда, так как степень двойки у &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; максимальна, по утверждению в начале доказательства, других вершин с такой же степенью двойки нет, то &amp;lt;tex&amp;gt;\operatorname{inorder} w = \operatorname{inorder} v = \operatorname{order} u&amp;lt;/tex&amp;gt;. Так как отрезки, соответствующие поддеревьям сыновей, не пересекаются, не найдется другого &amp;lt;tex&amp;gt;w'&amp;lt;/tex&amp;gt; {{---}} потомок &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, что в поддереве &amp;lt;tex&amp;gt;w'&amp;lt;/tex&amp;gt; есть вершина с такой же степенью двойки. Значит, все вершины &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, у которых &amp;lt;tex&amp;gt;\operatorname{inorder} v' = \operatorname{inorder} v&amp;lt;/tex&amp;gt; находятся в поддереве &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;. Проведя аналогичное доказательство для &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, получим требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Обработка запроса==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} вершины в исходном дереве &amp;lt;tex&amp;gt;LCA&amp;lt;/tex&amp;gt; которых необходимо найти. Если &amp;lt;tex&amp;gt;\operatorname{inlabel} x = \operatorname{inlabel} y&amp;lt;/tex&amp;gt;, то они принадлежат одному простому пути, а следовательно ответом на запрос является &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;\operatorname{inlabel} x \le \operatorname{inlabel} y&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;, в противном случае. Теперь рассмотрим случай, когда &amp;lt;tex&amp;gt;\operatorname{inlabel} x \ne \operatorname{inlabel} y&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; принадлежат разным простым путям. Найдем &amp;lt;tex&amp;gt;b = LCA(\operatorname{inlabel} x, \operatorname{inlabel} y)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement= &amp;lt;tex&amp;gt;\operatorname{inlabel} (((x &amp;gt;&amp;gt; (i + 1)) &amp;lt;&amp;lt; 1) | 1) &amp;lt;&amp;lt; i&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;i = \log(\operatorname{inlabel} x \oplus \operatorname{inlabel} y)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof= ?&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>109.188.219.181</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A8%D0%B8%D0%B1%D0%B5%D1%80%D0%B0-%D0%92%D0%B8%D1%88%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=26348</id>
		<title>Алгоритм Шибера-Вишкина</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A8%D0%B8%D0%B1%D0%B5%D1%80%D0%B0-%D0%92%D0%B8%D1%88%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=26348"/>
				<updated>2012-06-21T14:24:10Z</updated>
		
		<summary type="html">&lt;p&gt;109.188.219.181: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Алгоритм Шибера-Вишкина'' применяется для нахождения наименьшего общего предка двух вершин в дереве.&lt;br /&gt;
Он использует &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; времени на подготовку и затем отвечает на каждый запрос за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Идея алгоритма==&lt;br /&gt;
Основная идея алгоритма следующая. &lt;br /&gt;
&lt;br /&gt;
# Если бы дерево, в котором нужно искать &amp;lt;tex&amp;gt;LCA&amp;lt;/tex&amp;gt; было бы цепочкой, можно было бы найти &amp;lt;tex&amp;gt;LCA(u, v)&amp;lt;/tex&amp;gt; просто взяв ту вершину, которая находится в дереве выше.&lt;br /&gt;
# Если дерево {{---}} полное двоичное дерево высоты &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;, то можно сопоставить каждой вершине битовый вектор длиной &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; (целое число от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;2^h-1&amp;lt;/tex&amp;gt;) и с помощью битовых операций над этими векторами найти &amp;lt;tex&amp;gt;LCA(u, v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, представив данное дерево как полное двоичное дерево, в каждой вершине которого находится цепочка, можно &lt;br /&gt;
научиться искать &amp;lt;tex&amp;gt;LCA(v, u)&amp;lt;/tex&amp;gt; в нем за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Подготовка==&lt;br /&gt;
Перенумеруем вершины в порядке префиксного обхода дерева: сначала обходится текущая вершина, затем {{---}} поддеревья.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\operatorname{order} : V \to \mathbb{N}&amp;lt;/tex&amp;gt; {{---}} такой порядок обхода.&lt;br /&gt;
&lt;br /&gt;
Обозначим за &amp;lt;tex&amp;gt;\operatorname{size} v&amp;lt;/tex&amp;gt; количество вершин в поддереве вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Здесь и далее считаем, &lt;br /&gt;
что вершина является и своим предком, и своим потомком.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; {{---}} вершина из поддерева &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Тогда &lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{order} u \in [\operatorname{order} v; \operatorname{order}v + \operatorname{size} v - 1]&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
По определению &amp;lt;tex&amp;gt;\operatorname{order}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt; вершин из поддерева &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; образуют &lt;br /&gt;
отрезок натуральных чисел длиной &amp;lt;tex&amp;gt;\operatorname{size} v - 1&amp;lt;/tex&amp;gt;. Так как этот отрезок начинается с &lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{order}v + 1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt; {{---}} отрезок &amp;lt;tex&amp;gt;[\operatorname{order} v; \operatorname{order} v + \operatorname{size} v - 1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Покроем дерево путями. А именно, сопоставим каждой вершине &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; число &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; такое, что прообраз каждого &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; связен и является простым путем от какой-то вершины вниз до листа.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=В качестве &amp;lt;tex&amp;gt;\operatorname{inlabel} v&amp;lt;/tex&amp;gt; можно выбрать &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt;, кратное максимальной степени двойки, где &amp;lt;tex&amp;gt;u \in S(v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Обработка запроса==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} вершины в исходном дереве &amp;lt;tex&amp;gt;LCA&amp;lt;/tex&amp;gt; которых необходимо найти. Если &amp;lt;tex&amp;gt;\operatorname{inlabel} x = \operatorname{inlabel} y&amp;lt;/tex&amp;gt;, то они принадлежат одному простому пути, а следовательно ответом на запрос является &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;\operatorname{inlabel} x \le \operatorname{inlabel} y&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;, в противном случае. Теперь рассмотрим случай, когда &amp;lt;tex&amp;gt;\operatorname{inlabel} x \ne \operatorname{inlabel} y&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; принадлежат разным простым путям.&lt;/div&gt;</summary>
		<author><name>109.188.219.181</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A8%D0%B8%D0%B1%D0%B5%D1%80%D0%B0-%D0%92%D0%B8%D1%88%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=26347</id>
		<title>Алгоритм Шибера-Вишкина</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A8%D0%B8%D0%B1%D0%B5%D1%80%D0%B0-%D0%92%D0%B8%D1%88%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=26347"/>
				<updated>2012-06-21T14:21:11Z</updated>
		
		<summary type="html">&lt;p&gt;109.188.219.181: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Алгоритм Шибера-Вишкина'' применяется для нахождения наименьшего общего предка двух вершин в дереве.&lt;br /&gt;
Он использует &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; времени на подготовку и затем отвечает на каждый запрос за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Идея алгоритма==&lt;br /&gt;
Основная идея алгоритма следующая. &lt;br /&gt;
&lt;br /&gt;
# Если бы дерево, в котором нужно искать &amp;lt;tex&amp;gt;LCA&amp;lt;/tex&amp;gt; было бы цепочкой, можно было бы найти &amp;lt;tex&amp;gt;LCA(u, v)&amp;lt;/tex&amp;gt; просто взяв ту вершину, которая находится в дереве выше.&lt;br /&gt;
# Если дерево {{---}} полное двоичное дерево высоты &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;, то можно сопоставить каждой вершине битовый вектор длиной &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; (целое число от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;2^h-1&amp;lt;/tex&amp;gt;) и с помощью битовых операций над этими векторами найти &amp;lt;tex&amp;gt;LCA(u, v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, представив данное дерево как полное двоичное дерево, в каждой вершине которого находится цепочка, можно &lt;br /&gt;
научиться искать &amp;lt;tex&amp;gt;LCA(v, u)&amp;lt;/tex&amp;gt; в нем за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Подготовка==&lt;br /&gt;
Перенумеруем вершины в порядке префиксного обхода дерева: сначала обходится текущая вершина, затем {{---}} поддеревья.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\operatorname{order} : V \to \mathbb{N}&amp;lt;/tex&amp;gt; {{---}} такой порядок обхода.&lt;br /&gt;
&lt;br /&gt;
Обозначим за &amp;lt;tex&amp;gt;\operatorname{size} v&amp;lt;/tex&amp;gt; количество вершин в поддереве вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Здесь и далее считаем, &lt;br /&gt;
что вершина является и своим предком, и своим потомком.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; {{---}} вершина из поддерева &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Тогда &lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{order} u \in [\operatorname{order} v; \operatorname{order}v + \operatorname{size} v - 1]&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
По определению &amp;lt;tex&amp;gt;\operatorname{order}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt; вершин из поддерева &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; образуют &lt;br /&gt;
отрезок натуральных чисел длиной &amp;lt;tex&amp;gt;\operatorname{size} v - 1&amp;lt;/tex&amp;gt;. Так как этот отрезок начинается с &lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{order}v + 1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt; {{---}} отрезок &amp;lt;tex&amp;gt;[\operatorname{order} v; \operatorname{order} v + \operatorname{size} v - 1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Покроем дерево путями. А именно, сопоставим каждой вершине &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; число &amp;lt;tex&amp;gt;\operatorname{chain} v&amp;lt;/tex&amp;gt; такое, что прообраз каждого &amp;lt;tex&amp;gt;\operatorname{chain} v&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; связен и является простым путем от какой-то вершины вниз до листа.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=В качестве &amp;lt;tex&amp;gt;\operatorname{chain} v&amp;lt;/tex&amp;gt; можно выбрать &amp;lt;tex&amp;gt;\operatorname{order} u&amp;lt;/tex&amp;gt;, кратное максимальной степени двойки, где &amp;lt;tex&amp;gt;u \in S(v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Обработка запроса==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} вершины в исходном дереве &amp;lt;tex&amp;gt;LCA&amp;lt;/tex&amp;gt; которых необходимо найти. Если &amp;lt;tex&amp;gt;\operatorname{inlabel} x = \operatorname{inlabel} y&amp;lt;/tex&amp;gt;, то они принадлежат одному простому пути, а следовательно ответом на запрос является &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;\operatorname{inlabel} x \le \operatorname{inlabel} y&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;, в противном случае. Теперь рассмотрим случай, когда &amp;lt;tex&amp;gt;\operatorname{inlabel} x \ne \operatorname{inlabel} y&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; принадлежат разным простым путям.&lt;/div&gt;</summary>
		<author><name>109.188.219.181</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Opi1sumu&amp;diff=26244</id>
		<title>Opi1sumu</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Opi1sumu&amp;diff=26244"/>
				<updated>2012-06-21T08:53:42Z</updated>
		
		<summary type="html">&lt;p&gt;109.188.219.181: /* Описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Описание задачи==&lt;br /&gt;
Дано &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; одинаковых станков, которые работают параллельно и &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ, котороые необходимо выполнить&lt;br /&gt;
в произвольном порядке на всех станках. Время выполнения каждой работы на любом станке одинаково и равно одному. &lt;br /&gt;
Для каждой работы известно время, до которого её необходимо выполнить. Необходимо успеть выполнить как можно больше работ. &lt;br /&gt;
&lt;br /&gt;
==Описание алгоритма==&lt;br /&gt;
Отсортируем работы в порядке невозрастания дедлайнов. &lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Если в оптимальном расписании можно сделать &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; работ, то можно сделать первые &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; работ.&lt;br /&gt;
|proof=Пусть в оптимальном расписании были сделаны работы &amp;lt;tex&amp;gt;i_1, i_2, \ldots, i_k&amp;lt;/tex&amp;gt;. Докажем, что существует &lt;br /&gt;
оптимальное расписание, в котором сделаны работы &amp;lt;tex&amp;gt;1, 2, \ldots, k&amp;lt;/tex&amp;gt;. Пусть работы &amp;lt;tex&amp;gt;i_1, i_2, \ldots, i_k&amp;lt;/tex&amp;gt;&lt;br /&gt;
тоже отсортированы в порядке неубывания дедлайна. Тогда &amp;lt;tex&amp;gt;d_{i1} \le d_1, d_{i2}\le d_2, \ldots, d_{ik}\le d_{k}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда, если заменить во всём расписании работу &amp;lt;tex&amp;gt;i_j&amp;lt;/tex&amp;gt; на работу &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, то она, тем более, будет выполнена.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Обозначим за ''тайм-слот t'' множество из не более, чем &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; различных чисел {{---}} &lt;br /&gt;
номера работ, которые мы хотим выполнить в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Введем тайм-слот для каждого момента времени от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;d_n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Каждую работу будем пытаться сделать как можно позже. Будем рассматривать работы в порядке невозрастания дедлайнов. &lt;br /&gt;
&amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ю работу попытаемся добавить в тайм-слоты с номерами от &amp;lt;tex&amp;gt;d_i - m + 1&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;. &lt;br /&gt;
После добавления некоторые тайм-слоты могли переполниться (тайм-слот переполнился, если в нём уже находилось&lt;br /&gt;
&amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; работ, и в него добавили &amp;lt;tex&amp;gt;m+1&amp;lt;/tex&amp;gt;-ю). &lt;br /&gt;
Для переполнившегося тайм-слота найдём найдем самый правый левее него тайм-слот, который ещё не переполнился и перекинем работу, &lt;br /&gt;
которой там еще нет, в него. Так как в нем меньше элементов, то, по принципу Дирихле, это можно сделать. &lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Следуя этому алгоритму, расписания не существует тогда и только тогда, когда&lt;br /&gt;
переполнился нулевой тайм-слот.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt;&lt;br /&gt;
Расписания не существует, а значит, никакой алгоритм его не найдет.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Leftarrow&amp;lt;/tex&amp;gt;&lt;br /&gt;
Пусть при добавлении &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt;-й работы произошло переполнение нулевого тайм-слота.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим алгоритм добавления в тайм-слоты: работа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; добавляется в тайм-слоты &amp;lt;tex&amp;gt;[d_i - m + 1; d_i]&amp;lt;/tex&amp;gt;, после чего из переполнившихся работы перебрасываются в более ранние. Временно разрешим хранить в тайм-слоте сколь угодно много работ: отменим перебрасывание. Посмотрим на то, что получилось. Так как работу нельзя выполнять одновременно на двух станках, то ни одну единицу работы отсрочить нельзя.  Будем рассматривать тайм-слоты в порядке уменьшения времени. Если в очередном тайм-слоте &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в данный момент больше, чем &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; работ, то остаток нужно перекинуть на какие-то более ранние тайм-слоты. Заметим, что выгоднее перекинуть на наиболее поздние тайм-слоты: более ранние тайм-слоты могут понадобиться для перекидываний с тайм-слотов, идущих раньше просматриваемого. .&lt;br /&gt;
&lt;br /&gt;
Также заметим, что алгоритм перекидывания работ таков, что итоговое распределение количеств работ в соответствующих тайм-слотах не зависит от того, в каком порядке обрабатывались переполнившиеся тайм-слоты. &lt;br /&gt;
&lt;br /&gt;
При рассмотрении очередного переполнившегося тайм-слота мы необходимо должны куда-то перекинуть несколько работ из него. Так как перекидывание происходит в тайм-слот с наибольшим допустимым временем, то то, что неоходимо перекинуть что-то из нулевого, влечет то, что не существует расписания, в котором можно успеть выполнить все эти работы&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Опираясь на это утверждение, можно найти максимальное количество работ, которое можно выполнить. Обозначим его за &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сведем задачу построения распинания по построенным тайм-слотам к задаче о покрытии двудольного графа минимальным &lt;br /&gt;
количеством паросочетаний.&lt;br /&gt;
&lt;br /&gt;
Построим двудольный граф. В левой доле вершинам будут соответствовать работы, в правой {{---}} времена. Соответственно, в левой доле будет &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершин, в правой {{---}} &amp;lt;tex&amp;gt;d_{max}&amp;lt;/tex&amp;gt;. Ребро между работой &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; и временем &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; будет, если работа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; есть в тайм-слоте &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какое-то паросочетание &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; в этом графе. Оно соответствует корректному расписанию работ на одной машине: ни одна работа не выполняется два раза, и ни в один момент времени не выполняется более одной работы.&lt;br /&gt;
&lt;br /&gt;
Тогда, если мы сможем построить множество мощности &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; такое, что каждое ребро находится хотя бы в одном из паросочетаний, то оно будет соответствовать тому, что каждая работа обработана на каждом станке, а значит, составлено корректное расписание для этих &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; работ.&lt;br /&gt;
&lt;br /&gt;
Достроим граф до регулярного степени &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;. Достраивать будем следующим образом. Каждая вершина в левой доле имеет степень &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;, так как каждая работа представлена в &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; тайм-слотах. В правой доле степень каждой вершины не больше &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;, так как в тайм-слоте не может быть больше, чем &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; работ. Значит, в левой доле не больше вершин, чем в правой.&lt;br /&gt;
Добавим в левую долю фиктивных вершин, чтобы количества вершин в левой и правой долях сравнялись. После чего просто будем добавлять ребра между вершинами, степень которых еще меньше &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;. Для покрытия этого графа паросочетаниями воспользуемся тем фактом, что регулярный двудольный граф степени &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; можно покрыть &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; паросочетаниями. &lt;br /&gt;
&lt;br /&gt;
При помощи построения паросочетаний было построено расписание для тех &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; работ, которые можно успеть сделать. Так как остальные работы уже нельзя успеть, расписание для них можно составить произвольное. Например, выполнять их по очереди после выполнения первых &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; работ.&lt;br /&gt;
&lt;br /&gt;
==Оценка сложности алгоритма==&lt;br /&gt;
Рассмотрим добавление очередной работы в тайм-слоты. За &amp;lt;tex&amp;gt;O(t)&amp;lt;/tex&amp;gt; найдём переполнившийся тайм-слот и за &amp;lt;tex&amp;gt;O(m)&amp;lt;/tex&amp;gt; перекинем из него элемент. Так как &amp;lt;tex&amp;gt;t=O(nm)&amp;lt;/tex&amp;gt;, итоговая сложность этой части {{---}} &amp;lt;tex&amp;gt;O(n^2m)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Достроение графа до регулярного делается за &amp;lt;tex&amp;gt;O(E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; {{---}} количество ребер в нем. Количество ребер в регулярном двудольном графе &amp;lt;tex&amp;gt;E = Vd&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; {{---}} количество вершин в одной из долей, а &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; {{---}} степень. Количество вершин в правой доле {{---}} &amp;lt;tex&amp;gt;O(t) = O(nm)&amp;lt;/tex&amp;gt;. Значит, граф будет построен за &amp;lt;tex&amp;gt;O(nm^2)&amp;lt;/tex&amp;gt;, так как степень каждой вершины {{---}} &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сложность последней фазы зависит от того, каким алгоритмом граф разбивается на паросочетания. Использовав, например, алгоритм Куна, можно добиться сложности &amp;lt;tex&amp;gt;O(m \cdot M) = O(m \cdot n^3m^3)&amp;lt;/tex&amp;gt;. Итоговая сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(n^3m^4)&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>109.188.219.181</name></author>	</entry>

	</feed>