Description
Given n positive integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.
Input
The first line of the input file contains an integer T (T<=100) specifying the number of test cases.
Each test case begins with a line containing an integer N (1<=N<=100000),The following N-1 lines each contain a integer A[i](1<=A[i]<=10000).
Each test case begins with a line containing an integer N (1<=N<=100000),The following N-1 lines each contain a integer A[i](1<=A[i]<=10000).
Output
For each query, output a single line containing largest area.
Sample Input
2 6 2 1 5 6 2 3 10 1 2 3 4 5 6 7 9 10 8
Sample Output
10 30 题解: 单调栈 AC代码:
#include <iostream> #include <stdio.h> #include <stack> #include <algorithm> using namespace std; typedef long long ll; typedef pair<int,int> P; const int M = 1e5 + 5; stack<P> st; int a[M],L[M],R[M],N; void solve(int c[],int val) { while(st.size()) st.pop(); for(int i = 1; i <= N + 1; i++) { int x = a[i]; while(!st.empty() && st.top().first > x) { if(val) c[st.top().second] = (i - st.top().second) * st.top().first; else c[N - st.top().second + 1] = (i - st.top().second) * st.top().first; st.pop(); } st.push(make_pair(x,i)); } } int main() { int T; cin>>T; while(T--) { while(st.size() > 0) st.pop(); int ans = 0; scanf("%d",&N); for(int i = 1; i <= N; i++) { scanf("%d",&a[i]); } a[N + 1] = 0; solve(R,1); reverse(a + 1,a + N + 1); solve(L,0); reverse(a + 1,a + N + 1); for(int i = 1; i <= N; i++) ans = max(ans,L[i] + R[i] - a[i]); printf("%d\n",ans); } return 0; }
本文介绍了一种使用单调栈解决寻找直方图中最大矩形面积问题的算法,并提供了完整的AC代码实现。
603

被折叠的 条评论
为什么被折叠?



