Ctrl K

Обмен ламп в окне

Сложная
Вдоль аллеи стоит ряд фонарей, их состояние — строка lamps: '1' — фонарь горит, '0' — не горит. Смотритель может сделать **не больше одного обмена** внутри выбранного участка аллеи: 1. погасить целиком сплошной блок горящих фонарей, у которого с обеих сторон стоят негорящие; 2. затем зажечь целиком сплошной блок негорящих фонарей, у которого с обеих сторон стоят горящие. Участок задаётся парой [l, r] — фонари с l по r включительно. Внутри участка смотритель видит только его фонари, а за его краями мысленно ставит по горящему фонарю (эти воображаемые фонари в ответ не входят). Обмен меняет только фонари внутри участка. Для каждого участка из windows найдите наибольшее возможное число горящих фонарей **во всём ряду** после лучшего обмена (или без обмена). Участки независимы: каждый раз начинаем с исходной строки. Верните ответы списком в том же порядке.
Пример 1
lamps="0110100", windows=[[0, 6], [3, 6], [1, 2]] → [6, 6, 3]

Всего горит 3 лампы. Окно [0, 6]: гасим блок 1 на позиции 4 — тёмные участки длиной 1 и 2 сливаются в один, включаем все 4 лампы, итого 3 − 1 + 4 = 6. Окно [3, 6] = "0100": тот же обмен, тоже 6. Окно [1, 2] = "11": тёмных участков нет, обмен невозможен, остаётся 3.

Пример 2
lamps="1010", windows=[[0, 3], [0, 2]] → [4, 2]

В окне [0, 3] участок "1010": гасим лампу 2 (она между тёмными лампами 1 и 3) и зажигаем 1–3, итого 4. В окне [0, 2] = "101" лампа 2 лежит на краю окна — за краем считаем, что всё горит, поэтому она не окружена тёмными, и ответ 2.

Ограничения
  • 1 ≤ len(lamps) ≤ 10⁵, lamps состоит из '0' и '1'
  • 1 ≤ len(windows) ≤ 10⁵
  • windows[i] = [l, r], 0 ≤ l ≤ r < len(lamps)
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
загружаем Python…
Вход
lamps="0110100", windows=[[0, 6], [3, 6], [1, 2]]
Ожидается
[6, 6, 3]

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 45 тестов на сервере, включая скрытые.