Применение двоичного индексированного дерева

Я пытался решить эту алгоритмическую проблему, и я наткнулся на это хорошее решение:

"Идея состоит в том, чтобы обрабатывать 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 для решения двумерной задачи.

Другие вопросы по тегам