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.
Above is a histogram where width of each bar is 1, given height =[2,1,5,6,2,3].
The largest rectangle is shown in the shaded area, which has area = 10 unit.
Above is a histogram where width of each bar is 1, given height =[2,1,5,6,2,3].
The largest rectangle is shown in the shaded area, which has area = 10 unit.
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; }