Competitive Programming Academy · Урок

Сумма любого диапазона вычитанием

Отвечайте на запрос range[l..r] за константное время

Урок 2 из 413 шагов

«Сумма любого диапазона вычитанием» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Построение массива префиксных сумм
  2. Сумма любого диапазона вычитанием
  3. Подсчёт подмассивов с заданной суммой
  4. Массивы разностей для обновлений диапазонов
← Назад к Competitive Programming Academy