POJ 2559 Largest Rectangle in a Histogram(单调栈)

Posted lipeiyi520

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2559 Largest Rectangle in a Histogram(单调栈)相关的知识,希望对你有一定的参考价值。

原题目链接:http://poj.org/problem?id=2559

解题思路:

用单调栈求任意每个区间的最小值及区间长度,为什么记录区间最小值呢?(木桶装水原理,装水量取决于最短木板长)。枚举每个区间,维护最大答案。

//自行百度单调栈

AC代码:

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<stack>
  4 
  5 using namespace std;
  6 
  7 stack<long long> le,ri;
  8 int n;
  9 struct kkk 
 10     long long v,l,r;
 11     long long xb;
 12 a[100001];
 13 
 14 void chushihua() 
 15     for(int i = 1;i <= n; i++) 
 16         scanf("%lld",&a[i].v);
 17         a[i].xb = i;
 18     
 19     while(!le.empty()) le.pop();
 20     while(!ri.empty()) ri.pop();
 21 
 22 
 23 void left() 
 24     le.push(1);
 25     for(int i = 2;i <= n; i++) 
 26         if(le.empty()) 
 27             le.push(i);
 28             continue;
 29         
 30         if(a[i].v >= a[le.top()].v) le.push(i);
 31         if(a[i].v < a[le.top()].v) 
 32             a[le.top()].r = i;
 33             le.pop();
 34             while(true) 
 35                 if(le.empty()) break;
 36                 if(a[le.top()].v > a[i].v) 
 37                     a[le.top()].r = i;
 38                     le.pop();
 39                 
 40                 else break;
 41             
 42             le.push(i);
 43         
 44     
 45     le.pop();
 46     a[n].r = n + 1;
 47     while(!le.empty()) 
 48         a[le.top()].r = n + 1;
 49         le.pop();
 50     
 51 
 52 
 53 void right() 
 54     ri.push(a[n].xb);
 55     for(int i = n - 1;i >= 1; i--) 
 56         if(ri.empty()) 
 57             ri.push(i);
 58             continue;
 59         
 60         if(a[i].v >= a[ri.top()].v) ri.push(i);
 61         if(a[i].v < a[ri.top()].v) 
 62             a[ri.top()].l = i;
 63             ri.pop();
 64             while(true) 
 65                 if(ri.empty()) break;
 66                 if(a[ri.top()].v > a[i].v) 
 67                     a[ri.top()].l = i;
 68                     ri.pop();
 69                 
 70                 else break;
 71             
 72             ri.push(i);
 73         
 74     
 75     ri.pop();
 76     a[1].l = 0;
 77     while(!ri.empty()) 
 78         a[ri.top()].l = 0;
 79         ri.pop();
 80     
 81 
 82 
 83 long long answer() 
 84     long long ans = 0;
 85     for(int i = 1;i <= n; i++) 
 86         ans = max(ans,a[i].v * (a[i].r - a[i].l - 1));
 87     
 88     return ans;
 89 
 90 
 91 void tiaoshi() 
 92     for(int i = 1;i <= n; i++)
 93         cout << i << " " << a[i].l << " " << a[i].r << " " << a[i].v << endl;
 94 
 95 
 96 int main() 
 97     while(true) 
 98         scanf("%d",&n);
 99         if(n == 0) return 0;
100         chushihua();
101         left();
102         right(); 
103         printf("%lld\n",answer());
104     
105     return 0;
106 

 

以上是关于POJ 2559 Largest Rectangle in a Histogram(单调栈)的主要内容,如果未能解决你的问题,请参考以下文章

POJ2559 Largest Rectangle in a Histogram

(单调栈)poj-2559 Largest Rectangle in a Histogram

POJ.2559Largest Rectangle in a Histogram(单调栈)

POJ.2559Largest Rectangle in a Histogram(单调栈)

POJ 2559 Largest Rectangle in a Histogram(单调栈)

POJ 2559 - Largest Rectangle in a Histogram - [单调栈]