正题
POJ题目链接:http://poj.org/problem?id=2559
luogu评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=SP1805
大意
有n个高度不同,宽度为1的长方形排列在一起。找到一个长方形使其面积最大
解题思路
我们先考虑单调递增的情况
这样的话就只有以上几种情况。
然后我们考虑不是递增的情况,那么上面的就没有用了
我们就可以将其去掉
我们考虑用单调栈,如果单调上升就加入栈顶,不然就将栈弹出直到加入新元素之后是单调的,在途中统计弹出的宽度和,然后计算,之后再将宽度合并到新的元素中。
code
#include<cstdio>
#include<stack>
#include<algorithm>
using namespace std;
stack<int> a;
int n,wide,h[100010],w[100010];
long long maxs;
int main()
{while(1){scanf("%d",&n);if (!n) break;while(!a.empty()) a.pop();maxs=0;wide=0;h[n+1]=0;for(int i=1;i<=n+1;i++){if(i!=n+1)scanf("%d",&h[i]);if(a.empty()||h[a.top()]<h[i])//单调递增的{a.push(i);w[i]=1;}else{wide=0;while (!a.empty()&&h[a.top()]>h[i])//维护单调性{wide+=w[a.top()];//累计宽度maxs=max(maxs,(long long)wide*h[a.top()]);//计算答案a.pop();//出栈}a.push(i);w[i]=wide+1;//合并宽度}}printf("%lld\n",maxs);}
}