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; }