1 Отредактировано anonymous (2011-12-02 02:16:43)

Тема: Поиск подотрезка с максимальной суммой.

Видимо, для задачи поиска подотрезка с максимальной суммой можно обрабатывать онлайн-запросы поиска на подотрезке [l;r] за O(log(N)).

Будем считать, что в конце данного отрезка записана -inf. Рассмотрим следующую декомпозицию: разобьем изначальный отрезок на участки [a;b] такие, что любой собственный префикс [a;x] будет иметь неотрицательную сумму, а сам [a;b] - отрицательную. Такое разбиение можно получить простейшим линейным алгоритмом. Заметим, что если для некоторого суффикса [x;n-1] построить подобное разбиение, то подотрезок этого разбиения не может находиться в общем положении с подотрезком суффикса [y;n-1] (иначе общая часть будет префиксом, т.е. иметь неотрицательную сумму, и суффиксом, т.е. иметь отрицательную).

Заметим также, что запрос максимальной суммы при фиксированной левой границе отрезка можно сделать через RMQ для частичных сумм.

Заметим, что для любой последовательности максимальная сумма получается на некотором префиксе некоторого отрезка разбиения.

Предпросчитаем для каждого индекса последовательности значение end[j] - окончание первого отрезка разбиения суффикса [j;n-1]. С учетом сказанного выше это можно сделать за O(N) при помощи стека, умеющего делать общее добавление (аккумулятор + вычитание из приходящего). Предпросчитаем для каждого i ответ на отрезке [j;end[j]], заметив, что он достигается, когда левая граница ответа находится в j (это отрезок разбиения [j;end[j]]).

Теперь к нам приходит запрос [l;r]. Мы полностью покрываем все подотрезки вида [j;end[j]] для диапазона l <= j < x, где x - минимальный на [l;r] такой, что end[x] > r. Но [x;end[x]] является отрезком разбиения [l; n-1], значит, [x,r] является отрезком разбиения [l;r], значит, ответ в нем лежит на некотором его префиксе.

2

Re: Поиск подотрезка с максимальной суммой.

казалось бы, можно написать простое дерево отрезков, в каждой вершине которого хранятся такие функции:
1. максимальный подотрезок
2. максимальный префикс
3. максимальный суффикс
4. сумма отрезка
тоже online за O(log(n))

3

Re: Поиск подотрезка с максимальной суммой.

Доброе всем утро!
Вот на этой странице https://e-maxx.ru/algo/maximum_average_segment сумму обнуляют если она стала меньше нуля. Смею утверждать что это неправильно. Если массив состоит только из отрицательных чисел, то результат будет слегка бредовым.

Re: Поиск подотрезка с максимальной суммой.

Zilogic пишет:

Доброе всем утро!
Вот на этой странице https://e-maxx.ru/algo/maximum_average_segment сумму обнуляют если она стала меньше нуля. Смею утверждать что это неправильно. Если массив состоит только из отрицательных чисел, то результат будет слегка бредовым.

да полностью согласен!

В качестве хобби модифицирую игры. Если кому интересно, можете скачать кс 1 6 со скинами кс го моего творения на пробу.

5

Re: Поиск подотрезка с максимальной суммой.

Слишком сложнааа smile