ZOJ 2422- Terrible Sets-单调栈

来源:互联网 发布:家庭网络组建 编辑:程序博客网 时间:2024/06/05 15:17

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


0 0
原创粉丝点击