http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=40261
题面真是神tm难懂。。。。。给你n个连续的矩形,求组合成的最大矩形面积
直接单调栈,按套路扫一遍即可
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
long long max (long long a,long long b)
{return a<b?b:a;}
struct node
{
long long l;
long long r;
long long h;
};
node tm[100005];
long long top;
long long ans;
void insert(node tt)
{
while(top&& tm[top].h>tt.h)
{
tm[top-1].r=tm[top].r;
tt.l=tm[top].l;
node t=tm[top];
//有时候需要更新 ans=max(ans,tm[top].x);
ans=max(ans,t.h*(t.r-t.l));
top--;
}
tm[++top]=tt;
}
long long aa[50005];
long long sum[50005];
long long h[50005];
int main()
{
long long n,i;
while(scanf("%lld",&n)!=EOF)
{
if (n==-1) break;
for (i=1;i<=n;i++)
scanf("%lld%lld",&aa[i],&h[i]);
for (i=1;i<=n;i++) sum[i]=sum[i-1]+aa[i];
ans=top=0;
node tt;
for (i=1;i<=n;i++)
{
tt.h=h[i];
tt.l=sum[i-1];
tt.r=sum[i];
insert(tt);
}
while(top)
{
tm[top-1].r=tm[top].r;
node t=tm[top];
ans=max(ans,t.h*(t.r-t.l));
top--;
}
printf("%lld\n",ans);
}
return 0;
}