Это относительно просто, потому что ваши прямоугольники не пересекаются. Целью является набор непересекающихся прямоугольников, которые полностью покрывают плоскость, некоторые помечены как оригинальные, а некоторые помечены как «обратные».
Думайте с точки зрения сканирования сверху вниз (или слева направо или как угодно). У вас есть текущая позиция "линии прилива". Определите, какая позиция следующей горизонтальной линии, с которой вы столкнетесь, находится не на линии прилива. Это даст вам высоту вашей следующей линии прилива.
Между этими приливными линиями есть полоса, в которой каждая вертикальная линия проходит от одной приливной линии к другой (и, возможно, за пределами в обоих направлениях). Вы можете отсортировать горизонтальные положения этих вертикальных линий и использовать их, чтобы разделить полосу на прямоугольники и идентифицировать их как являющиеся (частью) исходного прямоугольника или (частью) обратным прямоугольником.
Прогресс до конца, и вы получите (возможно, слишком много слишком маленьких) прямоугольников и сможете выбрать те, которые вам нужны. У вас также есть возможность (с каждым шагом) комбинировать маленькие прямоугольники из текущей полосы с набором потенциально расширяемых прямоугольников из более ранних.
Вы можете сделать то же самое, даже если ваши исходные прямоугольники могут пересекаться, но это немного сложнее.
Подробности оставлены в качестве упражнения для читателя; -)