Advertisement
Guest User

Untitled

a guest
May 26th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.78 KB | None | 0 0
  1. Модифицируем скользящее окно. Запихнем в него первые k чисел. Далее пойдем справа-налево в окне и если w[i-1] < w[i], тогда w[i-1] := w[i], то есть сделаем невозрастающий массив w (если смотреть слева-направо). Пример (k = 5): [10, 8, 6, 9, 7] -> [10, 9, 9, 9, 7]. Теперь в скользящем окне будем хранить не число, а пару (число, количество). Предыдущий пример перепишется в виде [(10, 1), (9, 3), (7, 1)]. Инвариант: в скользящем окне хранятся убывающие пары (по первому элементу) с суммой по вторым элементам, равным k, максимум находится в первой паре. Скользящее окно хранится либо деком, либо кольцевым массивом - будут удаления первого элемента.
  2.  
  3. Переходы: идем по массиву слева-направо, берем символ i. Уменьшаем на 1 количество первого элемента, если количество становится 0 - выкидываем, справа добавляем пару (a[i], 1). Теперь пока w[n - 2][0] <= w[n - 1][0] сливаем последние две пары в одну: (w[n - 1][0], w[n - 2][1] + w[n - 1][1]). Таким образом поддерживаем инвариант по убыванию, количеству и сохранением максимума в первом элементе.
  4.  
  5. Переходы амортизированно линейны.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement