http://poj.org/problem?id=2082

题意:题目有点吓人,直接看的翻译,意思是给你n个紧挨着的矩形的宽和高(宽)在地上,求能形成的最大的



矩形面积;



#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <algorithm>
#include <set>
#define MM(a) memset(a,0,sizeof(a))
typedef long long ll;
typedef unsigned long long ULL;
const double eps = 1e-14;
const int inf = 0x3f3f3f3f;
const double pi=acos(-1);
using namespace std;
ll max(ll a,ll b) {return a>b?a:b;}

const int max_=50000;
int w[max_+5],h[max_+5],x[max_+5];
int l[max_+5],r[max_+5];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        if(n<0) return 0;
        x[0]=0;
        for(int i=0;i<n;i++)
        {
            scanf("%d %d",&w[i],&h[i]);
            if(i!=0) x[i]=w[i-1]+x[i-1];
        }
        x[n]=x[n-1]+w[n-1];

        stack<int> stl;
        for(int i=0;i<n;i++)
        {
            while(!stl.empty()&&h[stl.top()]>=h[i]) stl.pop();
            l[i]=stl.empty()?x[0]:x[stl.top()+1];
            stl.push(i);
        }

        stack<int> str;
        for(int i=n-1;i>=0;i--)
        {
            while(!str.empty()&&h[str.top()]>=h[i]) str.pop();
            r[i]=str.empty()?x[n]:x[str.top()];
            str.push(i);
        }

        ll ans=0;
        for(int i=0;i<n;i++)
                ans=max(ans,(r[i]-l[i])*h[i]);
        printf("%lld\n",ans);
    }
    return 0;
}


分析:简简单单的单调栈,与前面做过的一个题目的唯一的不同就是宽不再是为1,预处理下就好