음준희 블로그
백준 6549 : 히스토그램에서 가장 큰 직사각형 (C++) 본문
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 |