문제 링크: https://www.acmicpc.net/problem/6549
(동일한 문제: https://www.acmicpc.net/problem/1725)
저를 고통에 빠트리는 웰노운 문제입니다. 문제는 단순한데 풀이를 생각하기가 좀 힘듭니다.
대표적 해법은 세그먼트 트리 / 분할정복 / 스택이 있습니다. 풀이는 백준 블로그에 자세하게 정리되어 있으니 참고해주세요.
#pragma GCC optimize ("Ofast")
#define _CRT_SECURE_NO_WARNINGS
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
ll heights[100000];
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
#endif
ios_base::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
while (cin >> n) {
if (n == 0) break;
for (int i = 0; i < n; ++i)
cin >> heights[i];
ll max_rect = 0;
stack<int> st; // idx
for (int i = 0; i < n; ++i) {
while (!st.empty() && heights[i] < heights[st.top()]) {
ll height = heights[st.top()];
st.pop();
ll width = i;
if (!st.empty())
width = i - st.top() - 1;
max_rect = max(max_rect, width * height);
}
st.push(i);
}
while (!st.empty()) {
ll height = heights[st.top()];
st.pop();
ll width = n;
if (!st.empty())
width = n - st.top() - 1;
max_rect = max(max_rect, width * height);
}
cout << max_rect << '\n';
}
return 0;
}
스택을 이용해 풀었습니다
반응형
'Online Judge > 백준' 카테고리의 다른 글
[백준][C++] 5446: 용량 부족 (0) | 2020.07.25 |
---|---|
[백준][C++] 1504: 특정한 최단 경로 (0) | 2020.07.25 |
[백준][C++] 3460: 이진수 (0) | 2020.07.22 |
[백준][C++] 4659: 비밀번호 발음하기 (0) | 2020.07.22 |
[백준][C++] 14430: 자원 캐기 (0) | 2020.07.22 |