본문 바로가기
알고리즘/백준

[백준/C,C++] 6549번: 히스토그램에서 가장 큰 직사각형

by 이민훈 2021. 3. 28.

www.acmicpc.net/problem/6549

 

6549번: 히스토그램에서 가장 큰 직사각형

입력은 테스트 케이스 여러 개로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, 직사각형의 수 n이 가장 처음으로 주어진다. (1 ≤ n ≤ 100,000) 그 다음 n개의 정수 h1, ..., hn (0 ≤ hi ≤

www.acmicpc.net

hackids.tistory.com/59

 

[알고스팟/C,C++] FENCE: 울타리 잘라내기

www.algospot.com/judge/problem/read/FENCE algospot.com :: FENCE 울타리 잘라내기 문제 정보 문제 너비가 같은 N개의 나무 판자를 붙여 세운 울타리가 있습니다. 시간이 지남에 따라 판자들이 부러지거나 망가..

hackids.tistory.com

알고스팟의 FENCE: 울타리 잘라내기와 동일한 문제입니다.

 

한 가지 차이는 높이 값이 10억까지 들어올 수 있어 넓이를 long long 형으로 반환해야 합니다.

 

#include<iostream>

using namespace std;

const int MAX = 100000;

long long histo[MAX];

long long dv(int left, int right)
{
    if (left == right) return histo[left];

    int mid = (left + right) / 2;
    int lp = mid;
    int rp = mid;
    long long height = histo[mid];
    long long ret = max(dv(left, mid), dv(mid + 1, right));

    while (left < lp || rp < right) {
        if (left < lp && (rp == right || histo[lp - 1] > histo[rp + 1])) {
            lp--;
            height = min(height, histo[lp]);
        }
        else {
            rp++;
            height = min(height, histo[rp]);
        }
        ret = max(ret, height * (rp - lp + 1));
    }
    return ret;
}

int main(void)
{
    int n; cin >> n;

    while (n != 0) {
        for (int i = 0; i < n; i++) {
            cin >> histo[i];
        }
        cout << dv(0, n - 1) << "\n";
        cin >> n;
    }

    return 0;
}

댓글