Сумма любого диапазона вычитанием
Отвечайте на запрос range[l..r] за константное время
«Сумма любого диапазона вычитанием» — бесплатный урок Competitive Programming Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Competitive Programming Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Competitive Programming Academy содержит 4 уроков всего.
Главное преимущество
Построение префиксного массива было подготовительным этапом. Теперь начинается самое интересное: вычисление суммы любого отрезка с помощью одного вычитания. ⚡
Основная идея
Сумма на отрезке — это большая общая сумма минус меньшая. Вычитание двух префиксных значений аккуратно устраняет всё, что находится за пределами отрезка.
Формула
Чтобы просуммировать элементы от l до r, вычтите prefix[l] из prefix[r + 1]. Эта единственная формула работает для любого диапазона.
range_sum = prefix[r + 1] - prefix[l]Почему это работает
В prefix[r + 1] содержатся все элементы до r включительно, а в prefix[l] — все элементы до l. Разность оставляет ровно средний срез.
Разбор примера
Для [3, 1, 4] массив префиксных сумм равен [0, 3, 4, 8]. Чтобы просуммировать индексы от 1 до 2, вычислите 8 минус 3 и получите 5. Это совпадает с 1 плюс 4.
Запросы за константное время
Каждый запрос — это всего одно вычитание, поэтому он выполняется за O(1). Тысяча запросов требует столько же времени на один запрос, сколько и один запрос.
Не ошибитесь на единицу
Самая распространённая ошибка — неправильный индекс на правой границе. При начальном нуле всегда используйте prefix[r + 1], а не prefix[r]. Не забудьте проверить эту границу.
Включая или не включая границы
Заранее решите, входит ли r в диапазон. Эта формула рассматривает диапазон как включающий и l, и r, чего обычно ожидают задачи на соревнованиях.
Оформите это в функцию
Небольшая вспомогательная функция делает логику понятнее и хранит работу с индексами в одном месте. Используйте этот вспомогательный инструмент, а не вставляйте вычисления прямо в код.
def query(l, r):
return prefix[r + 1] - prefix[l]Обработайте весь массив
Чтобы просуммировать весь массив, выполните query, где l равно 0, а r равно n минус 1. Формула даст prefix[n] — общую сумму.
Где это особенно полезно
Когда задача содержит много вопросов о сумме на диапазоне одного и того же массива, префиксные суммы превращают цикл за O(n) для каждого запроса в мгновенные ответы.
Быстрая проверка
Вам нужна сумма элементов с индекса l по индекс r включительно.
Итоги
Теперь Вы умеете находить сумму любого диапазона за O(1), вычитая prefix[l] из prefix[r + 1]. Учитывайте смещение из-за начального нуля — и ошибок не будет. ✅
Изучай Python с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 30
- Уроки
- 120
Часто задаваемые вопросы
Урок «Сумма любого диапазона вычитанием» бесплатный?
Да — полный текст урока «Сумма любого диапазона вычитанием» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Competitive Programming Academy, подпишись на CoddyKit PRO. Курс Competitive Programming Academy содержит 4 уроков всего.
Чему я научусь в уроке «Сумма любого диапазона вычитанием»?
Отвечайте на запрос range[l..r] за константное время Ты практикуешь Competitive Programming Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Competitive Programming Academy?
Предыдущий опыт не требуется. Competitive Programming Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Сумма любого диапазона вычитанием»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Competitive Programming Academy?
Да. Каждый урок Competitive Programming Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Построение массива префиксных сумм
- Сумма любого диапазона вычитанием
- Подсчёт подмассивов с заданной суммой
- Массивы разностей для обновлений диапазонов