음준희 블로그

백준 6549 : 히스토그램에서 가장 큰 직사각형 (C++) 본문

알고리즘/백준

백준 6549 : 히스토그램에서 가장 큰 직사각형 (C++)

joonhee305 2022. 4. 5. 23:36

6549번: 히스토그램에서 가장 큰 직사각형 (acmicpc.net)

 

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

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

www.acmicpc.net

 

#include<bits/stdc++.h>
#define MAX 1000000007
#define INF 2000000000000000
#define MOD 1000000007 
using namespace std;
typedef long long ll;
typedef pair<int, int > pii;
typedef pair<long long, long long> pll;
typedef pair<double, double> pdd;

int dt[3] = { -1,0,1 };
/*
int dx[4] = { -1, 0, 0, 1 };
int dy[4] = { 0, -1, 1, 0 };

int dx[8] = { -1, -1, 1, 1, -2, -2, 2, 2 };
int dy[8] = { 2, -2, 2, -2, -1, 1, -1, 1 };
*/
void init() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
}
ll gcd(ll a, ll b) { for (; b; a %= b, swap(a, b)); return a; }
ll lcm(ll a, ll b) { return (a * b) / gcd(a, b); }
ll v[100001];
int n;
ll func(int start,int end) {
    if (end < start) return 0;
    else if (start == end) return v[start];
    else if (start + 1 == end) {
        return max(min(v[start], v[end]) * 2, max(v[start], v[end]));
    }

    int mid = (start + end) / 2;
    ll len = 1, mn = v[mid];
    ll mx = max(max(func(start, mid - 1), func(mid + 1, end)),mn*len);
    int low = mid - 1, top = mid + 1;
    
    while (start <= low || top <= end) {
        if (v[top] == 0 && v[low] == 0) break;
        if (low < start) {
            mn = min(mn, v[top++]);
        }
        else if (top > end) {
            mn = min(mn, v[low--]);
        }
        else {
            if (v[top] > v[low]) {
                mn = min(mn, v[top++]);
            }
            else if(v[top] <= v[low]){
                mn = min(mn, v[low--]);
            }
        }
        mx = max(mx, ++len * mn);
    }
    return mx;
}
int main() {
    init();
    while (1) {
        cin >> n;
        if (n == 0) return 0;

        for (int i = 1; i <= n; i++) cin >> v[i];
        cout << func(1, n) << "\n";
    }
}

'알고리즘 > 백준' 카테고리의 다른 글

백준 2166 : 다각형의 면적 (C++)  (0) 2022.04.07
백준 2162 : 선분그룹 (C++)  (0) 2022.04.07
백준 1562 : 계단수(C++)  (0) 2022.03.29
백준 - 2573 : 빙산 (C++)  (0) 2022.03.26
백준 2468 : 안전 영역(C++)  (0) 2022.03.26