Применение двоичного индексированного дерева
Я пытался решить эту алгоритмическую проблему, и я наткнулся на это хорошее решение:
"Идея состоит в том, чтобы обрабатывать ai, bi и ci асимметрично. BIT поддерживает минимальные запросы для ключевых интервалов, начинающихся с 1. Мы используем ci в качестве значений и bi в качестве ключей. Они вставляются в порядке увеличенияi. Таким образом, для каждого ai в свою очередь, структура данных позволяет запрашивать наименьшее значение cj (возможно, ∞) для bj в [1..bi) и aj i. У нас есть cj
i, если и только если участник i не превосходен."
Сейчас мне трудно понять это решение.
Вот что я понимаю из этого решения: я знаю, что двоичное индексированное дерево используется для ответов на запросы, например, для нахождения суммы интервала в массиве, и оно также поддерживает обновления в элементах. Он выполняет обе операции в O(logn) время сложности каждый. Теперь это решение говорит о том, что мы создаем BIT с ключами как ci и значением как bi, то есть, по сути, bi является дополнительным значением, которое идет с каждым узлом. Теперь мы вставляем элементы в дерево с увеличивающимися значениями ai, вот где я потерял контроль. Какое значение имеет, в каком порядке мы вставляем узлы и что говорится в заявлении после этой части, я понятия не имею.
Пожалуйста, помогите мне понять, что говорит это решение.
1 ответ
Давайте найдем всех не очень хороших участников. Другой участник j
может быть лучше, чем участник i
только если его a[j] < a[i]
, Таким образом, мы можем игнорировать всех участников с большим значением a[j]
, Вот почему мы сортируем их по a
,
Это условие необходимо, но этого недостаточно. Нам также нужно проверить b
а также c
, Как мы можем сделать это? Нам нужно знать, есть ли парень a[j] < a[i]
(то есть тот, кто идет перед текущим в отсортированном порядке), так что его b[j] < b[i]
а также c[j] < c[i]
, Мы строим бит (с c[j]
в качестве ключей и b[j]
это значения), чтобы проверить последние два условия. Понятно что такое j
существует тогда и только тогда, когда минимум на префиксе [0, c[i])
меньше чем b[i]
,
Подводя итог, идея заключается в следующем: мы сортируем их по a[i]
а затем игнорировать значения a
, Таким образом, мы переходим от трехмерной к двумерной задаче, которую проще решить (поэтому порядок имеет значение. Парень с большими a[i]
никогда не бывает лучше). Мы используем BIT для решения двумерной задачи.