222
правки
Изменения
м
'''return''' answer
→Псевдокод
// Инициализируем множество вершин, которые нужно рассматривать
'''for''' Point <tex>w</tex> '''in''' segments
'''if''' <tex>wv</tex>.x <tex>\le</tex>= <tex>vw</tex>.x
currentVertices.add(<tex>w</tex>)
sort(currentVertices) by angle
delete from status all segments ending in <tex>w</tex>
add in status all segments beginning in <tex>w</tex>
В качестве статуса нужно использовать структуру данных, позволяющую добавлять и удалять из нее отрезки за <tex> O(\log n) </tex> и извлекать минимум за <tex> O(1) </tex> или <tex> O(\log n) </tex>. В этом случае достигается асимптотика <tex> O(n^2 \log n) </tex>, так как для каждой из <tex> n </tex> точек выполняется сортировка за <tex> O(n \log n) </tex>, обновление статуса (суммарно <tex> O(n \log n) </tex>, так как каждый отрезок добавляется и удаляется из статуса не более одного раза) и запросы ближайшего отрезка (<tex> O(\log n) </tex> или <tex> O(1) </tex> на точку, то есть <tex> O(n \log n) </tex> или <tex> O(n) </tex>).
|