bellau
@bellau

Как найти количество элементов в std::set, меньших чем заданное K?

Во время решения одной задачи возникла следующая проблема:
У нас есть множество элементов (можем добавлять и удалять)
Для заданного числа нужно найти количество элементов, которые меньше чем К.

Возможный вариант как это сделать:

int d = distance(s.begin(), s.lower_bound(k));
Однако, такой поход не оптимальный, здесь написано почему.
Если вкратце, поскольку set не обладает RandomAccessIterator, то асимптотика будет линейной.


Рассмотрим идею с деревом Фенвика:

Операцию добавления и нахождения количества мы можем делать за O(log n), однако операция удаления не реализуема.

Последняя идея - декартовое дерево:

Это именно то, что нам нужно!
Данная структура позволяет выполнять эти, и не только операции за O(log n) - отличная асимптотика.
Однако, в условии олимпиады написать такую структуры - достаточно сложное и затратное по времени занятие.

Таким образом вопрос сам по себе:
Как решить поставленную задачу используя только встроенные структуры данных.
Использование библиотек типа boost нежелательно, ведь их на олимпиаде тоже нет :)
  • Вопрос задан
  • 3474 просмотра
Решения вопроса 1
@singlebone
Если ты пишешь в GNU C++, то там есть вот такой вот чит: opentrains.mipt.ru/zksh/files/zksh2015/lectures/mi... (смотри 1.3)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@mamkaololosha
Можно использовать MinHeap (фиксированного размера k, или не фиксированного).
Ответ написан
AtomKrieg
@AtomKrieg
Давай я поищу в Google за тебя
std::set реализован через бинарное дерево, оно отсортировано. Через алгоритм бинарного поиска можете найти - сложность O(log(n))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы