Решение олимпиадной задачи подсуммы

268
04 апреля 2017, 12:28

Вообщем есть последовательность чисел

A_1,A_2,...A_N. (-10^9 <= A_i <= 10^9, N < 10^5) 

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

Answer 1

Навскидку - собрать все частичные суммы

a1  a1+a2  a1+a2+a3 ...

потом пробежаться по всем парам (i,j) массива частичных сумм - abs(S(j)-S(i)) будет соответствующей суммой подотрезка. Выбрать подходящие.

Частичная сумма есть в стандартной библиотеке :)

Answer 2

Решение за O(N log N).

Сразу пишу в псевдокоде. Операции на дереве работают за логарифм от его размера.

  1. сделать суммы от 0 до текущего
  2. загнать их в дерево
  3. пройтись по этим суммам и используя дерево вычислить сколько из них меньше текущая минус M
  4. вывести ответ

Вместо дерева (написанного руками) можно использовать например tree из G++

Чуть изменить чтобы хранить несколько одинаковых значений (например сведением к паре).

int main(){
int N, M;
cin >> N >> M;
vector<int> a;
a.push_back(0);
for (int i=0;i<N;i++){
    int x;
    cin >> x;
    a.push_back(x);
}
int p = 0;
int s = 0;
for (auto i : a){
    s+=i;
    H.insert(pii(s,p++));
}
int res = 0;
s = 0;
for (auto i : a){
    s += i;
    auto q = lower_bound(H.begin(), H.end(), pii(s - M,-1));
    res += H.order_of_key(*q);
}
cout << res<<endl;
}
READ ALSO
Браузер не обрабатывает событие

Браузер не обрабатывает событие

ЗдравствуйтеСтолкнулся со следующей проблемой

323
JavaScript в Symfony. Взаимодействие back-end с JS

JavaScript в Symfony. Взаимодействие back-end с JS

Всем приветВпервые сталкиваюсь с работой JS в симфони

235
Как добавить инстаграм в список значков? [требует правки]

Как добавить инстаграм в список значков? [требует правки]

Как добавить инстаграм (instagram) в список значков?

222