История одной задачи.
Условие: вводят n отрезков в виде левой и правой границ и m точек.
Для каждой точке в порядке ввода вывести количество отрезков, которым принадлежит точка.
Итерации:
1) В цикле ввод границ отрезков в одномерный массив вида i*n+j (а-ка двумерный) и координаты точки. Наивный алгоритм поиска перебором по всем точкам со сравнениями по границам отрезка.
Не проходит по времени.
2) Делаем быструю сортировку (самописную). Сортируем по левым границам, поиск перебором точек >= левой границы и сортируем по правым границам, ищем > правой границы, находим разницу величин. Идею придумал сам, но полез в комментарии убедиться. Убедился.
Не проходит по времени.
3) Делаю элиминацию хвостовой рекурсии в быстрой сортировке.
Не проходит по времени.
4) Делаю учет элементов массива, равных ключевому, в быстрой сортировке с последующим откидыванием.
Не проходит по времени.
5) Делаю выбор ключевого элемента как (left+right)/2.
Не проходит по времени.
6) Заменяю перебор точек на бинарный поиск.
Не проходит по времени.
7) В голову входит мысль, что множество отрезков на самом деле едино для всех точек, а не вводятся каждый раз для новой точки. Выкидываю двумерный массив, делаю два для левой и правой границ, сортирую их заранее.
Тесты проходит.
Ура, что ли.
~6 часов без наведения красоты. С красотой еще помучился, ибо заводить две функции, различающиеся один знаком как-то не хотелось, но придумать красивый вариант не получилось.
Условие: вводят n отрезков в виде левой и правой границ и m точек.
Для каждой точке в порядке ввода вывести количество отрезков, которым принадлежит точка.
Итерации:
1) В цикле ввод границ отрезков в одномерный массив вида i*n+j (а-ка двумерный) и координаты точки. Наивный алгоритм поиска перебором по всем точкам со сравнениями по границам отрезка.
Не проходит по времени.
2) Делаем быструю сортировку (самописную). Сортируем по левым границам, поиск перебором точек >= левой границы и сортируем по правым границам, ищем > правой границы, находим разницу величин. Идею придумал сам, но полез в комментарии убедиться. Убедился.
Не проходит по времени.
3) Делаю элиминацию хвостовой рекурсии в быстрой сортировке.
Не проходит по времени.
4) Делаю учет элементов массива, равных ключевому, в быстрой сортировке с последующим откидыванием.
Не проходит по времени.
5) Делаю выбор ключевого элемента как (left+right)/2.
Не проходит по времени.
6) Заменяю перебор точек на бинарный поиск.
Не проходит по времени.
7) В голову входит мысль, что множество отрезков на самом деле едино для всех точек, а не вводятся каждый раз для новой точки. Выкидываю двумерный массив, делаю два для левой и правой границ, сортирую их заранее.
Тесты проходит.
Ура, что ли.
~6 часов без наведения красоты. С красотой еще помучился, ибо заводить две функции, различающиеся один знаком как-то не хотелось, но придумать красивый вариант не получилось.
1) We start by taking the entire range of all the intervals and dividing it in half at x_center
Мы должны найти центр (медиану? среднее?) по всем граничным точкам всех интервалов (для текущей вершины)?
2) При запросе по точке. Если точка левее центра для текущей вершины, то мы перебираем все интервалы, сортированные по левой границе, пока начало интервала <= точке.
Для этого нужен бинарный поиск?
Если таких интервалов нет, то переходим по левой ветке дерева?
1) Тут пишут что медиану neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B5...(interval_tree)_%D0%B8_%D0%BF%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%BE%D1%87%D0%BA%D0%B8_%D1%81_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%BE%D0%BC_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D0%BE%D0%B2
подозреваю что потому как конкретные числовые значения не важны, важно чтобы количество слева и справа было максимально близким.
2) Для этого нужен бинарный поиск?
Ну наверное можно использовать, если таких интервалов много.
На остальное вроде как ответ "да"