hdu 1506 單調棧求面積
阿新 • • 發佈:2019-01-03
求出 高度h[i]向左和向右最遠能擴充套件到的下標
即利用單調棧 求出h[i]向左(右)最後一個不小於h[i]的下標
則以h[i]為高的面積為 h[i]*(R[i]-L[i]+1)
#include <iostream> #include <cstring> #include <cstdio> #include <stack> #include <algorithm> using namespace std; const int N=1e6+20; typedef long long ll; ll h[N]; int L[N],R[N];//L[i] 高度h[i]向左最遠能擴充套件到的下標 //則以h[i]為高的面積為 h[i]*(R[i]-L[i]+1) int main() { int n; while(cin>>n&&n) { stack <int> s;//單調棧 儲存下標 for(int i=1;i<=n;i++) { scanf("%lld",&h[i]); while(!s.empty()&&h[s.top()]>h[i]) { R[s.top()]=i-1;//(i-1):h[s.top()]向右最後一個不小於於它的下標 s.pop(); } s.push(i); } while(!s.empty()) { R[s.top()]=n; s.pop(); } for(int i=n;i>=1;i--) { while(!s.empty()&&h[i]<h[s.top()]) { L[s.top()]=i+1; s.pop(); } s.push(i); } while(!s.empty()) { L[s.top()]=1; s.pop(); } ll ans=0; for(int i=1;i<=n;i++) { ll res=(R[i]-L[i]+1)*h[i]; ans=max(res,ans); } cout<<ans<<endl; } return 0; }