Редактирование: Динамическая выпуклая оболочка (достаточно log^2 на добавление/удаление)

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

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 106: Строка 106:
 
=== Получение выпуклой оболочки ===
 
=== Получение выпуклой оболочки ===
  
Научимся восстанавливать выпуклую оболочку по дереву, описанному выше. Для этого рассмотрим более общую задачу: для данной вершины дерева <tex>v</tex> и отрезка <tex>[l, r]</tex> найти часть выпуклой оболочки, состоящей из точек поддерева с корнем в <tex>v</tex>, ординаты которых лежат в этом отрезке. Это можно сделать следующим обходом:
+
Научимся восстанавливать выпуклую оболочку по дереву, описанному выше. Для этого рассмотрим более общую задачу: для данной вершины дерева <tex>v</tex> и отрезка <tex>[l, r]</tex> найти выпуклую оболочку точек поддерева с корнем в <tex>v</tex>, ординаты которых лежат в этом отрезке. Это можно сделать следующим обходом:
  
 
  get_hull(answer, v, l, r)
 
  get_hull(answer, v, l, r)
Строка 115: Строка 115:
 
     '''if''' (l < a)
 
     '''if''' (l < a)
 
       get_hull(answer, v.left, l, min(a, r))
 
       get_hull(answer, v.left, l, min(a, r))
     '''if''' (l <= a '''and''' b <= r)
+
     '''if''' (l <= a and b <= r)
 
       '''if''' (answer.empty())
 
       '''if''' (answer.empty())
 
           answer = answer ++ v.bridge.left
 
           answer = answer ++ v.bridge.left
Строка 125: Строка 125:
  
 
=== Принадлежность точки выпуклой оболочке ===
 
=== Принадлежность точки выпуклой оболочке ===
 
По аналогии с предыдущим пунктом, сведем запрос к более общему запросу: для данной вершины дерева <tex>v</tex> и отрезка <tex>[l, r]</tex> проверить, принадлежит ли точка <tex>p</tex> части выпуклой оболочки, состоящей из точек поддерева с корнем в <tex>v</tex>, ординаты которых лежат в этом отрезке. Тогда принадлежность точки проверяется вызовом in_hull(p, root, <tex>-\infty</tex>, <tex>+\infty</tex>)
 
 
in_hull(p, v, l, r)
 
    '''if''' (v.leaf)
 
      '''return''' '''false'''
 
    a = v.bridge.left.y
 
    b = v.bridge.right.y
 
    '''if''' (l <= a and b <= r)
 
      '''if''' (v.bridge.left == p '''or''' v.bridge.right == p)
 
          '''return''' '''true'''
 
    '''if''' (l < a '''and''' p.y < a)
 
      '''return''' in_hull(p, v.left, l, min(a, r))
 
    '''if''' (b < r '''and''' b < p.y)
 
      '''return''' in_hull(p, v.right, max(l, b), r)
 
    '''return''' '''false'''
 
  
 
=== Вставка точки ===
 
=== Вставка точки ===

Пожалуйста, учтите, что любой ваш вклад в проект «Викиконспекты» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Викиконспекты:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

Чтобы изменить эту страницу, пожалуйста, ответьте на приведённый ниже вопрос (подробнее):

Отменить | Справка по редактированию (в новом окне)

Шаблон, используемый на этой странице: