가장 큰 사각형 (CCF)

문제 설명
  수평축 N 인접한 직사각형에 넣고, 각각의 직사각형의 폭은 1이고, 제 I (1 ≤ N ≤ 난) 인 직사각형 높이 H I는 . 이 직사각형을 N 개의 히스토그램을 구성한다. 예를 들어, 도면의 높이 여섯 직사각형 3, 1, 6, 5, 2, 3이다.



  히스토그램 측면이 축과 평행하게 된 큰 직사각형의 주어진 영역에 배치 될 수 찾는다. 위의 예로서도 음영 표시된. 최대 직사각형 (10)의 면적.
입력 형식
  첫 번째 행은 정수 n, 즉 직사각형의 수 (1000 ≤ 1 ≤ N)을 포함한다.
  두 번째 행은 N 개의 정수를 포함 H . 1 , H (2) , ..., H의 해당 공간에 의해 분리 된 인접 숫자 사이. (H. 1 ≤ 나는  10000 ≤). H의 구형의 i 번째의 높이이다.
출력 형식
  출력 라인, 주어진 사각형 내 최대 히스토그램 즉 정수를 포함하는 방법.
샘플 입력
6
3 5 6 1 2 3
샘플 출력
(10)
 
아이디어 : 단조로운 스택 유지 보수

[ 그리 발명자는 사각형의 수를 포함하는 스택을 설정이 직사각형 높이가 일정하게 증가하고있다. 우리는 각 사각형의 우측 스캔 왼쪽 : 사각형 직접 스택에, 스택 직사각형의 현재 정상보다 높은 경우.

그렇지 않으면, 스택의 상단을 제거하기 위해 계속 스택이 비어 있거나 현재보다 작은 사각형 사각형의 적재 높이의 상단까지입니다. 적층 공정에서는, 토출 사각형의 폭을 축적하고 각 누적 업데이트 응답의 폭을 곱한 높이를 사용하여, 직사각형 팝업. 전체 공정 후에 적층, 우리는 매우 직사각형의 현재 높이 스택의 새로운 누적 값 직사각형의 폭.

AC 코드 :
#INCLUDE <비트 / stdc ++ H.> 사용 스페이스 성병;
INT의 H [ 25000 ];
INT 의 main () {
     INT의 N; 
    CIN >> N;
    INT maxn = 0 ;
    위한 ( int로 I = 1 ; 나는 <= N; I ++는 ) { 
        는 scanf ( " %의 D ' , H [I]); 
        maxn = 최대 (maxn, H [I]); 
    }     
    양단 < INT > Q;
    위한 ( int로 난 = 1 난 = <N; ++ i가

 ) {
         경우 (q.empty ()) {// 
            q.push_back (H [I]); 
            계속 ; 
        } 
        경우 (H [I]> = q.back ()) {   
            q.push_back (H [I]); 
            계속 ; 
        } 
        INT NUM = 0 ;
        반면 (! q.empty () && q.back ()> H [I]) { 
            NUM을 ++ ;
            INT t = q.back (); q.pop_back (); 
            maxn = 최대 (maxn, t의 *를 NUM); 
        } 
        NUM ++ ;
        반면 (NUM) { 
            q.push_back (H [I]);
            NUM -; 
        } 
    } 
    INT NUM = 0 ;
    동안 (! {q.empty ()) 
        NUM ++ ;
        INT의 온도 = q.back (); q.pop_back (); 
        maxn = 최대 (NUM 개 *의 온도, maxn); 
    } 
    의 printf ( " % D \ 없음 " , maxn);
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/pengge666/p/11495379.html