POJ2559 Largest Rectangle in a Histogram
发布日期:2021-05-07 09:41:04 浏览次数:22 分类:精选文章

本文共 773 字,大约阅读时间需要 2 分钟。

题目

思路

显然是一道单调栈题,我们考虑每次入栈踢掉前面比该位置高的再入栈,在每次出栈时记录出栈位置高度的最大值,具体实现可以理解为一个2元组栈,一个元是宽度,一个元是高度,每次出栈用高×宽更新ans,接下来把出栈的宽度加到前面的位置(后面比前面高,所以后面的范围一定在前面的范围里)

code:

#include
#include
#include
using namespace std;long long n,a[100005],ans,t,r,u,i;struct f{ long long g,k;} yy;stack
o;int main(){ scanf("%lld",&n); while (n!=0) { ans=0; for (i=1;i<=n;i++) scanf("%lld",&a[i]); for (i=1;i<=n;i++) { r=0; while (!o.empty()&&o.top().g>=a[i]) { t=(r+o.top().k)*o.top().g; ans=max(t,ans); r+=o.top().k; o.pop(); } yy.k=r+1,yy.g=a[i]; o.push(yy); } r=0; while (!o.empty()) { t=(r+o.top().k)*o.top().g; ans=max(t,ans); r+=o.top().k; o.pop(); } printf("%lld\n",ans); scanf("%lld",&n); } return 0;}
上一篇:P3381【模板】最小费用最大流
下一篇:SSLOJ 2882 排队

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2025年04月29日 05时50分27秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章