Блог пользователя serproc

Автор serproc, 13 лет назад, По-русски

Долгое время не могу решить задачу. Дано 100 000 прямоугольников. Стороны параллельны осям координат. Все координаты целые и убираются в 4 байта. Нужно найти на сколько замкнутых фигур разбивают плоскость эти прямоугольники и найти площадь наибольшей фигуры. за N^2 не катит. Думал над деревом отрезков, но не могу придумать, как его применить.

Помогите, пожалуйста..

  • Проголосовать: нравится
  • +10
  • Проголосовать: не нравится

»
13 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Что подразумевается под замкнутой фигурой?

»
13 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Так или иначе, видимо, сканирующая прямая должна помочь.

»
13 лет назад, скрыть # |
 
Проголосовать: нравится +4 Проголосовать: не нравится

А можно ссылку на задачу? Если, конечно, ссылка существует.

  • »
    »
    13 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +2 Проголосовать: не нравится

    Не думаю. Эта задача была позавчера на корпоративном контесте компании Samsung (только для сотрудников). Я так полагаю, автор блога в нем участвовал, как и я=). Ссылка-то существует, но она приватна и зайти по ней можно, только если ты зарегистрирован в системе. Так что, если корейцы, конечно, не взяли эту задачу с топкодера, ссылку на задачу получить не удасться. Да я и не понимаю зачем она, если человек написал её условие, предварительно еще и переведя на русский язык=). Могу, если хочешь, написать оригинал условия на корейском или английском=).

»
13 лет назад, скрыть # |
Rev. 2  
Проголосовать: нравится +7 Проголосовать: не нравится

UPD: решение неверно, прошу прощения

Я не вдавался в детали, но сканлайн действительно помогает.

  • Давайте проведем вертикальные прямые через все вертикальные стороны прямоугольников.
  • Тогда вся плоскость поделится на слои, каждый слой будет разделен горизонтальными отрезками.
  • Происходит два типа событий: появился новый прямоугольник и исчез прямоугольник.
  • В каждый момент мы работаем с каким-то слоем. Слой будем представлять в виде нескольких блоков (прямоугольников, на которые делится этот слой). Для каждого блока можно поддерживать его площадь (включая ту, которая лежит вне текущего слоя).
  • При добавлении нового прямоугольника часть блоков закрывается (из их площадей нужно взять максимум и к ответу-количеству прибавить, собственно, их количество), и появляются новые. Часть из них по x-координатам границ совпадают со старыми и еще четыре появляются по краям добавленного прямоугольника. Их площадь тоже посчитать несложно.
  • При закрытии прямоугольника удаляются две границы, соответственно, площади кусков, которые они разделяли складываются.

Все операции умеет делать декартово дерево (максимум на отрезке, добавить элемент в середину, удалить элемент). Еще надо очень аккуратно смотреть на совпадающие y-координаты. Возможно, я где-то ошибся, извините, если так.

  • »
    »
    13 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +5 Проголосовать: не нравится

    Маловато информации поддерживаешь. Как обрабатывать замкнутые компоненты с дырками внутри (например, бублик, получающийся из двух кнцентрических квадратов)? Тебе как-то нужно помнить информацию о связности тех фрагментов, которые у тебя сейчас есть.

    • »
      »
      »
      13 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится

      Да, ты прав, я чушь написал. Надо как-то поддерживать какой отрезок в какой компоненте, но это пока непонятно как, потому что компонент может быть квадрат и при открытии-закрытии прямоугольника куча всего меняется.

»
13 лет назад, скрыть # |
Rev. 5  
Проголосовать: нравится -13 Проголосовать: не нравится

Сегодня на межфакультетской в КПИ была упрощенная версия. Надо было найти количество пар прямоугольников, которые имеют хоть одну общую точку.

»
13 лет назад, скрыть # |
Rev. 2  
Проголосовать: нравится 0 Проголосовать: не нравится

А это не задача на раскраску? Мы принимаем на вход координаты прямоугольника (х1,у1), (х2,у2), красим область плоскости, ограниченную этими точками, в цвет равный номеру запроса, храним все полученные покраски в дереве отрезков, потом каким-то образом определяем число различных сочетаний цветов на одном участке плоскости(сканлайном, видимо) и пытаемся параллельно считать площадь каждой новой найденной области и хранить максимальную площадь.

»
13 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Поясните, пожалуйста, что именно имеется в виду под разбиением плоскости. Прямоугольник считается закрашенным или нет? Иными словами, на тесте

0 0 2 2
1 1 3 3

количество областей будет 1 или 3 (не считая внешней грани)?

А на тесте

0 0 3 1
0 0 1 3
2 0 3 3
0 2 3 3

2, 9 или еще сколько-то? (тест — четыре прямоугольника, опоясывающих квадрат 1 1 2 2).

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