В. Префиксы и суффиксы

Массив достижим тогда и только тогда, когда сумма всех положительных падений между соседними элементами не превышает первый элемент. Проверка выполняется за O(n).

Короткий ответ

Что ответить на собеседовании

Массив достижим тогда и только тогда, когда сумма всех положительных падений между соседними элементами не превышает первый элемент. Проверка выполняется за O(n).

Подробный разбор

Ответ с пояснениями

Условие

В. Префиксы и суффиксы

Дан упорядоченный массив из n нулей. На каждом шаге можно выбрать произвольное количество первых или последних элементов этого массива, и прибавить единицу ко всем выбранным элементам. Можно ли за какое-то количество таких операций достичь указанного состояния массива?

Формат ввода В первой строке целое число 1 ≤ n ≤ 100000 — количество элементов массива.

Во второй строке n целых неотрицательных чисел a1, a2, ..., an через пробел, где ai ≤ 10^18 — требуемые конечные элементы.

Формат вывода Строка "YES", если такое состояние достижимо, и "NO", если недостижимо.

Пример

Ввод [phone]

Вывод YES

Примечание Состояния [phone] можно достичь следующим способом: добавляем единицу к первым трём элементам, получаем [phone] добавляем единицу к последним четырём элементам, получаем [phone] добавляем единицу к последнему элементу, получаем [phone]

Ответ

Массив достижим тогда и только тогда, когда сумма всех положительных падений между соседними элементами не превышает первый элемент. Проверка выполняется за O(n).

Падение a[i−1]−a[i] требует как минимум столько прибавлений префикса, заканчивающегося перед i. Все такие прибавления затрагивают первый элемент, поэтому их сумма не может превышать a[0].

Условие достаточно: каждое падение реализуем соответствующим префиксом, каждый подъём — суффиксом, а остаток a[0] минус сумма падений прибавляем всему массиву. Получаются нужные соседние разности и первый элемент.

n = int(input())
a = list(map(int, input().split()))
drops = sum(max(0, a[i - 1] - a[i]) for i in range(1, n))
print('YES' if drops <= a[0] else 'NO')

Например, [1, 0, 1] достижим, а [0, 1, 0] — нет. Python не переполняет целые числа; в языках с фиксированной разрядностью можно прекращать суммирование сразу после превышения a[0].

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее