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,预处理下就好