Коррекция девятого поля крупного рогатого скота с больше вычислительная геометрия J Симметричный Краска / линии сканирования

Значение вопросов:

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

Решение:

Как и в процессе смещения оси симметрии, должно быть увеличение эффективной площади прямоугольной части, часть в уменьшении эффективной площади, эффективной площади той же самой части.

Когда одиночное прямоугольное изменение состояния, только тогда, когда ось симметрии сенсорного конца, средняя точка, верхний конец.

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

Оптимальное решение в некоторой точке мутации происходит, она может записывать.

Чтобы избежать арифметических операций с плавающей точкой, высоту, умноженную на два магазина.

#include <iostream> 
#include <алгоритм>
 #define LL долго долго 
 с использованием  пространства имен STD;
структура Node {
     INT стат; 
    Высота LL; 
    Друг BOOL  оператор <( Const Узел & а, Const узел и б) {
         вернуть a.height < b.height; 
    } 
    Узел () {} 
    Узел ( INT х, у LL) { 
        стат = х; высота = у; 
    } 
} Узел [ 900005 ];
INT основных () {
     INT п;
    зсапЕ ( " % d " , & п);
    INT CNT = 0 ; 
    узел [ 0 ] = Узел ( 0 , 0 );
    для ( INT I = 1 ; г <= п; я ++ ) { 
        LL L, R; 
        зсапЕ ( " % LLD% LLD " , & л, & г); 
        узел [ ++ CNT] = Узел (- 1 , л * 2 ); 
        узел [ ++ CNT] = Узел ( 0 , L + R); 
        узел [ ++ CNT] = Узел ( 1 , г * 2 );
    } 
    Рода (узел + 1 , узел + 1 + CNT);
    ИНТ до = 0 , вниз = 0 ; 
    Теперь LL = 0 , Maxx = 0 ;
    для ( INT I = 1 ; г <= CNT; я ++ ) { 
        теперь + = (узел [I] .height-узел [i - 1 ] .height) * (вверх вниз); 
        Maxx = макс (теперь, Maxx);
        если (узел [I] .stat == - 1 ) до ++ ;
        если (узел [I] .stat == 0 ) до -, вниз ++ ;
        если (узел [I] .stat == 1 ) down-- ; 
    } 
    Е ( " % LLD \ п " , Maxx);
    вернуться  0 ; 
}

 

рекомендация

отwww.cnblogs.com/isakovsky/p/11366676.html