Да, вы можете использовать дерево сегментов для решения этой проблемы.
Давайте попробуем подумать, как должно выглядеть это дерево. Очевидно, что каждый узел должен содержать длину максимального подмассива 1 с и 0 с в этом диапазоне.
Теперь, как нам объединить два узла в один больший. Другими словами, у вас есть узел, представляющий [низкий, средний) и узел, представляющий [средний, высокий). Вы должны получить максимальный подмассив для [low, high).
Перво-наперво, максимум для всего будет по крайней мере максимум для частей. Таким образом, мы должны взять максимум между левым и правым значениями.
Но что, если реальный максимальный подмассив перекрывает оба узла? Ну, тогда это должна быть самая правая часть левого узла и самая левая часть правого узла. Итак, нам нужно отслеживать самый длинный подмассив в начале и в конце.
Теперь, как обновить эти длины левого и правого подмассива? Ну, самый левый из родительских узлов должен быть самым левым из дочерних узлов, если только левый из дочерних узлов не охватывает весь левый узел В этом случае крайний левый родительский узел будет самым левым из левого + крайний левый из правого узла.
Аналогичное правило применяется для отслеживания самого правого подмассива из 1 с.
И мы закончили. Вот последние правила в псевдокоде.
max_sub[parent] = max(max_sub[left], max_sub[right], right_sub[left] + left_sub[right])
left_sub[parent] = left_sub[left] if left_sub[left] < length[left] else left_sub[left] + left_sub[right]
right_sub[parent] = right_sub[right] if right_sub[right] < length[right] else right_sub[right] + right_sub[left]
Обратите внимание, что вам нужно будет предпринять аналогичные шаги при поиске результата для диапазона.
Вот пример дерева для массива [0, 1, 1, 0, 1, 1, 1, 0].