Task 106. Частичная сумма

Task 106. Частичная сумма

UniLecs

Задача: дан массив чисел arr = [a1, a2, ..., an]. Есть набор индексов (k, r).

Необходимо вычислить частичную сумму в массиве:

S(k, r) = a(k) + a(k+1) + a(k+2) + ... + a(r).

Входные данные: arr - массив действительных чисел от 1 до 10^6. 

indexArr = [(k1, r1), (k2, r2), ... ] - массив индексов (k, r). Размер массива indexArr от 1 до 10^6. Индексы ki, ri - натуральные числа от 1 до 10^6 и ki <= ri.

Вывод: вывести значения частичных сумм S(ki, ri) для заданного набора индексов.

Пример: arr = [1, 2, 3, 4, 5]; indexArr = [(1, 5), (2, 3), (3, 4)]

Answer: 15 5 7

частичная сумма в котах

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

Получаем:

S(1, 1) = a1

S(1, 2) = a1 + a2

S(1, 3) = a1 + a2 + a3

...

S(1, n) = a1 + a2 + a3 + ... an

Можно заметить, что частичную сумму можно выразить след.формулой:

S(k, r) = a(k) + a(k+1) + ... + a(r) = (a1 + a2 + ... + a(k) + a(k+1) + ... a(r)) - (a1 + a2 + ... + a(k-1)) = S(r) - S(k-1)

Теперь для решения исходной задачи нам достаточно только сформировать массив частичных сумм, а само значение S(k, r) мы находим за константное время O(1).

Реализация:

C#

https://gist.github.com/unilecs/cb8bc240c2bb139e5d931be2bfe35c7c

Test:

https://dotnetfiddle.net/os5eKM

Report Page