Пацаны, расскажите пожалуйста, я баян придумал или нет?
Задача простая: m запросов, вывести k-ю порядковую статистику массива a[n] на отрезке [l,r].
n ≤ 105, m ≤ 105
Сложность: n· log(n) препроцессинг, log2(n) на запрос.
Что делаем:
1) Сортируем массив в виде пар (ai, i), сначала по значению, потом по индексу.
2) Строим n-штук persistent segment tree, где на i-м шаге добавляем в дерево отрезков индекс элемента, который находится по i-му индексу в отсортированном массиве пар.
3) Бинпоиском находит нижнюю границу i, где в дереве отрезков i sum(l, r) ≥ k.
4) Это и есть наш ответ, выводим число.
http://neerc.ifmo.ru/subregions/northern.html
По ссылке еще можно посмотреть решения жюри и участников.
1) ну поступает запрос на отрезке [L;R], сплитим по L, по R, получаем три дерева: первое содержит элементы [1..L-1], второе [L;R], третье [L + 1;R], теперь второе сплитим по К, берем самую правую вершину, отвечаем на запрос и merg'им деревья2) ну за линию тоже можно, просто я пишу за NlogN, за линию ни разу не писалP.S. забудьте, я накосил
offtop:
скажите, как решать задачу "найти количество различных чисел на отрезке"?
Знаю как в оффлайне. Отсортируем запросы по правому концу. Теперь если мы можем быстро решить задачу для какого-то префикса массива, то можно решить и исходную.
Будем двигаться от первого префикса(1..1) до N-ого(1..N). И в каком-нибудь дереве у нас единичками будут помечены лишь те элементы у которых справа нет такого-же. Ex.:
Prefix: 1 6 3 1 2 5 5 1
Signs: 0 1 1 0 1 0 1 1
Понятно что при переходе от префикса i к (i+1) убирается максимум одна пометка и добавляется одна.
Теперь чтобы решить запрос (l, r), дойдем до префикса r и найдем сумму от l до r в дереве. Сумма и есть ответ.
Если двигаться указателями то суммарная ассимптотика примерно: O(NlogN + MlogM)
А как решать если нужно сделать UPDATE(x,k) то есть a[x]=k ????
можно решать с помощью merge sort tree с pbds на каждой вершине
Да это реально круто
http://ejudge.upml.knu.ua/acm2014/iQmBL4zKcOmFUerSklIO/F.pdf Вот задача с приличными ограничениями (10^5) Оффлайн решение с сетами заходит. Но вот только тут граф, а в задаче выше — массив. (Хитрость: нужно меньший сет кидать в больший, иначе будет ТЛ)
эту задачу умею решать для всех вершин за
α(n) ведь вроде от LCA возникает?
splay деревьями что ли? можно подробнее, пожалуйста?
Так это другая задача. Здесь, в отличие от начальной, все отрезки попарно либо вложены, либо не пересекаются вовсе.
вот эту задачу