1

Тема: Ломаная

На плоскости дана ломаная, каждое из звеньев которой перпендикулярно биссектрисе одного из углов, образованных координатными осями. Никакая вершина ломаной не лежит на звене  ломаной(кроме, возможно, того звена, концом которого она является). В частности, никакие две вершины ломаной не совпадают. Ваша задача — подсчитать число точек самопересечения ломаной.
n <= 100000 (количество вершин ломаной)
Подскажите как можно решить эту задачу?

2 Отредактировано KADR (2010-01-17 12:30:34)

Re: Ломаная

Можно развернуть систему координат на 45 градусов, тогда каждое звено ломаной будет параллельно одной из осей координат. Будем заметать вертикальной прямой слева направо и для каждого горизонтального отрезка создадим 2 события (начало и конец), а для вертикального - одно(проходим через него). Из условия видно, что 2 горизонтальных и 2 вертикальных отрезка между собой пересекаться не могут. Значит, все пересечения возможны только между одним вертикальным и одним горизонтальным отрезком. Значит, когда мы доходим до вертикального отрезка, нам нужно знать, сколько горизонтальных отрезков начались, но еще не закончились и в то же время, лежат в нужном диапазоне y-координат. Для этого, можно создать сумматор и для каждого у-ка хранить сколько начатых и еще не законченных отрезков с таким у-ком. Если координаты большие, то в начале следует сделать сжатие координат.
Сложность выходит O(NlogN) на сортировку и O(NlogN) на заметание, т.е. и суммарная сложность O(NlogN).

3

Re: Ломаная

Спасибо. Решил используя дерево отрезков с сжатием координат.