1

Тема: SRM 310 DIV 2 1000

У кого-нибудь есть идеи, как решить эту задачу деревом Фенвика? B contest&analysis написаны решения через мультисет и еще какие-то рандомные алгоритмы, но ссылка на эту задачу есть в статье BIT, значит как-то можно её решить Фенвиком. Короткое описание условия: Дана последовательность чисел(n=250.000), вы должны найти медиану каждого "окошка" длиной k (k=5000). Мне приходила идея приспособить нахождение инверсий, но это кажется неверный подход.

2

Re: SRM 310 DIV 2 1000

Я так понял тебе нужно искать на каждом отрезке 1..k, 2..k+1, 3..k+2 => средний элемент или медиану (если отсортировать отрезок и взять в нём элемент стоящий по середине, то это и будет медианой).
Если это так, то можно написать такое решение:
Сожмём числа если они большие (и того получим числа от 1..n), теперь создадим как ты и сказал дерево Фенвика(или сумматор по другому), занесём первые k-1 элементов в сумматор,то есть на их позиции по прибавляем +1 (если одинаковые элементы имеются то на них будет стоять больше 1). Теперь что,начинаем бежать с i = с k .. n элемент, добавляем на позицию i - го числа в сумматоре(дерево Фенвика) +1,теперь что все наши числа в отрезке длиной k в сумматоре,начнём перебирать дихотомией какой элемент будет ответом на данном отрезке,и смотрим если сумма от 1..Middle(текущая позиция дихотомии) >= k / 2, то меняем правый край дихотомии,иначе левый.
И того Middle и будет нашим ответом,так как сумма до него равна k/2. И следовательно в данном отрезке он будет медианой.

Memory: O(N)
Time: O(N*log(N)*log(N)).

3

Re: SRM 310 DIV 2 1000

Задача решается нахождение k-й порядковой статистики через дерево отрезков (RSQ).

4

Re: SRM 310 DIV 2 1000

Зачем себе голову забивать,пиши дихотомия+сумматор самое распространённое.

5

Re: SRM 310 DIV 2 1000

Всем спасибо! Разобрался.