poj2559/SP1805 Largest Rectangle in a Histogram

单调栈例题,很早就搞懂了,但一直没有机会实现。

今天决定来实现一下,结果发现还是有很多细节要注意。(WA了两次)

方法的话百度单调栈就好了,我就不再重复了。

说一下容易错的的细节。

1.Long long。

2.最后要把栈内剩余矩形进行统计。可以采用push一个 高为0的矩形 来实现以减少代码长度。

3.如果你是用STL来实现栈的,注意栈空的时候是没有栈顶元素的,要加上特判(详见代码)。

好了,上代码。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <stack>
 4 #include <algorithm>
 5 #include <iostream>
 6 using namespace std;
 7 typedef long long ll;
 8 const int MAXN = 100000 + 20;
 9 
10 inline ll read()
11 {
12     ll x = 0; char ch = getchar();
13     while(!isdigit(ch)) ch = getchar();
14     while(isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
15     return x;
16 }
17 
18 ll N;
19 
20 struct rec
21 {
22     ll l, h;
23     rec(ll l = 0, ll h = 0) : l(l), h(h) {}
24 };
25 
26 struct _stack
27 {
28     stack<rec> sta;
29 
30     inline void init()
31     {
32         while(!sta.empty())
33             sta.pop();
34     }
35 
36     inline ll Pushin(rec cur)
37     {
38         if(sta.empty() || sta.top().h < cur.h)//注意sta.empty()的特判
39         {
40             sta.push(cur);
41             return 0;
42         }
43 
44         ll len = 0, area = 0;
45         rec now;
46         while(!sta.empty() && sta.top().h > cur.h)//同上
47         {
48             now = sta.top();
49             len += now.l;
50             area = max(area, len * now.h);
51             sta.pop();
52         }
53         sta.push(rec(len + cur.l, cur.h));
54         return area;
55     }
56 }Stack;
57 
58 int main()
59 {
60     while(cin>>N, N)
61     {
62         Stack.init();
63         ll ans = 0;
64         for(ll i = 1; i <= N; i++)
65             ans = max(ans, Stack.Pushin(rec(1, read())));
66         ans = max(ans, Stack.Pushin(rec(1, 0)));
67         cout<<ans<<endl;
68     }
69     return 0;
70 }

 

posted @ 2018-04-30 12:53  俺是小程  阅读(125)  评论(0编辑  收藏  举报