Задача C. Радостные студенты

Автор:Иван Кобец, Артем Завгороднев   Ограничение времени:1 сек
Входной файл:Стандартный вход   Ограничение памяти:512 Мб
Выходной файл:Стандартный выход  
Максимальный балл:100  

Условие

На лекции по высшей математике в ДВФУ преподаватель собрал n студентов в ряд и задал простой вопрос: Кто сейчас грустит, поднимите руку. На это предложение несколько (возможно, ноль) студентов подняли руки.

После этого, он решил выбрать из этой последовательности студентов некоторый отрезок [left, right], на котором он добавит грустным студентам по 5 баллов к экзамену просто так. При этом, он понимает, что студенты, которые были радостные на этом отрезке, поменяют своё настроение. Если ни один студент не является грустным, преподаватель не будет выбирать никакой отрезок. Он хочет получить наибольшее количество радостных студентов на лекции, поэтому просит Вас написать программу, которая рассчитает максимальное их количество после применения ранее описанной операции.

Формат входных данных

В первой строке записано целое число n  — количество студентов.

Во второй строке записано n цифр 0 и 1, где 0  — грустный студент, а 1  — радостный

Формат выходных данных

Выведите максимально возможное количество радостный студентов.

Ограничения

1 ≤ n ≤ 2 ⋅ 105

Система оценки и описание подзадач

Баллы начисляются за каждый тест независимо. Тесты поделены по подзадачам, описанным ниже.

Подзадача Количество тестов Баллы Дополнительные ограничения Информация о проверке
n
15 тестов5 баллов за тест1 ≤ n ≤ 200полная
25 тестов5 баллов за тест1 ≤ n ≤ 2000полная
310 тестов5 баллов за тест1 ≤ n ≤ 2 ⋅ 105полная

Примеры тестов

Стандартный вход Стандартный выход
1
7
1 1 1 0 0 1 0
6
2
5
1 1 1 1 1
5

Разбор

Идеей решения данного задания - линейный поиск максимальной суммы подотрезка.

Посчитаем первоначальное количество радостных студентов. Следующим шагом (или параллельно) создадим массив, содержащий изменения настроения студентов, если они войдут в подотрезок профессора. Радостных студентов обозначим как -1 (настроение станет негативным), а грустных как 1 (настроение станет позитивным).

Следующим шагом создадим две переменные, в которых будут хранится сумма изменений студентов на некотором отрезке [1, i] и сумма изменений настроений на некотором отрезке [1, j], j < i ≤ n. Параметр j будет на каждом шагу выбираться так, чтобы сумма отрезка [1, j] являлась наименьшей на отрезке [1, i]. Отрезок минимальной суммы будет убираться из отрезка общей суммы sum[1, i] − sum[1, j], тем самым мы сможем получить наибольшую сумму изменений настроений студентов. Так как мы изначально сделали радостных студентов -1, а грустных 1, процесс вычисления будет стараться избегать случаем, когда изменится настроение у позитивных студентов, но при этом будет искать наибольшее количество грустных студентов и компенсировать настроение новоиспеченных грустных студентов.

Среди всех подотрезков выберем тот, у которого наибольшее изменение настроений и добавим к уже ранее высчитанным радостным студентам, и выведем полученную сумму. Данный результат будет верным, ведь если изменится настроение у радостного студента, наш подотрезок будет это учитывать. Например, если на подотрезке 3 грустных студента и 1 радостный, то сумма настроений на подотрезке будет 2 (двое станут новыми радостными, а оставшиеся два студента, радостный и грустный, компенсируют свои настроения).


0.112s 0.016s 13