Максимальная сумма сегментов среди всех сегментов, сформированных в массиве после Q запросов

Опубликовано: 21 Сентября, 2022

Имея два массива arr[] (индексация на основе 1) и query[] , состоящие из N целых чисел, и query[] содержит перестановку первых N натуральных чисел, задача состоит в том, чтобы выполнить запрос к массиву и найти максимальную сумму сегменты среди всех сегментов сформированы таким образом, что в каждом запросе query [i] элемент массива по индексу query[ i] удаляется, и этот сегмент делится на 2 сегмента.

Примеры:

Input: arr[] = {1, 3, 2, 5}, queries[] = {3, 4, 1, 2}
Output: 5 4 3 0
Explanation:
Following are the queries performed:

  • Query 1: Remove the element at index 3 break the current array into {1, 3}, {5}. The maximum sum among all segments is 5.
  • Query 2: Remove the element at index 4 break the current array into {1, 3} {}. The maximum sum among all segments is 4.
  • Query 3: Remove the element at index 1 break the current array into {1}, {}. The maximum sum among all segments is 1.
  • Query 4: Remove the element at index 2 break the current array into {}, {}. The maximum sum among all segments is 0.

Input: arr[] = {1, 2, 3, 4, 5}, queries[] = {4, 2, 3, 5, 1}
Output: 6 5 5 1 0

Подход: Данная проблема может быть решена с использованием структуры данных Disjoint Set Union. Идея состоит в том, чтобы хранить все запросы в массиве, изначально все элементы находятся в разных наборах, обрабатывать запросы в обратном порядке, для каждого запроса делать операцию объединения для текущего элемента с его левыми и правыми элементами с помощью операции поиска , параллельно отслеживайте максимальный элемент, затем сохраняйте его в массиве, затем печатайте элементы массива в обратном порядке. Выполните следующие шаги, чтобы решить проблему:

  • Инициализируйте векторы parent(N + 1) , rank(N + 1, 0) , setSum(N + 1, 0) и currMax .
  • Переберите диапазон [1, N+1), используя переменную i , и установите значение parent[i] как -1 и setSum[i] как arr[i – 1] .
  • Вставьте значение 0 в вектор currMax[], потому что после последнего запроса ответ будет равен 0 .
  • Переберите диапазон [N – 1, 0] в обратном порядке, используя переменную i , и выполните следующие шаги:
    • Если parent[queries[ I ]] равно -1 , установите его как query[i] .
    • Если запросы[i] – 1 >= 0 && parent[queries[i] – 1] != -1 , то вызовите функциональную операцию union(parent, rank, setSum, запросы[ I ], запросы[I]-1) .
    • Если запросы[i] + 1 <= N && parent[queries[i] + 1] != -1, то вызовите функциональную операцию union(parent, rank, setSum, запросы[ I ], запросы[I]+1) .
    • Установите значение maxAns как максимальное значение maxAns или setSum[queries[ I ]] и поместите значение maxAns в вектор currMax[] .
  • Переверните вектор currMax[] и напечатайте его значения в качестве ответа.

Ниже приведена реализация вышеуказанного алгоритма:

Временная сложность: O (N * log N)
Вспомогательное пространство: O(N)