Сумма самых слабых партий

тема: Стек и очередь · уровень: продвинутый

Условие

На заводе датчик качества каждую минуту пишет число — «прочность партии». Начальник смены смотрит на отчёт по окнам ровно из k подряд идущих минут и в каждом таком окне отмечает самую слабую (минимальную) партию.

Тебе нужно посчитать суммарную «слабость» смены: сумму минимумов по всем подряд идущим окнам длины k.

Важно: сумма может не помещаться в 32-битный тип (как на олимпиадах), ориентируйся на 64-битные целые.

Формат ввода:

Формат вывода:

Ограничения:

Пример: Ввод:

5 3
4 2 5 1 3

Вывод:

4

Как решать — идея подхода

Приём: Монотонная очередь

Перебирать минимум каждого окна отдельно слишком долго: при n до 200000 вариант с просмотром k элементов в каждом окне может занять O(n·k). Нужно не искать минимум заново, а переносить полезную информацию из предыдущего окна.

Используем монотонную очередь — deque, где лежат индексы элементов. Значения по этим индексам идут по возрастанию, поэтому в начале очереди всегда находится минимум текущего окна.

Почему можно удалять элементы с конца? Когда приходит a[i], любой элемент a[j] >= a[i] справа уже не сможет стать минимумом: новый элемент не больше него и останется в окнах дольше, ведь его индекс больше. Такие элементы больше не нужны.

План:

Очередь хранит индексы, а не сами значения: так легко проверить, не вышел ли элемент за левую границу окна. Каждый индекс добавляется один раз и удаляется не более одного раза, поэтому общее время O(n), а памяти нужно O(k).

Частая ошибка — не удалять «просроченные» индексы из начала очереди. Тогда минимум может относиться к элементу, которого в текущем окне уже нет. Ответ лучше накапливать в 64-битном целом: сумма минимумов может быть большой по модулю.

Решить задачу с автопроверкой на Python →

Куда дальше