POJ 2559

http://poj.org/problem?id=2559

题意:就是找出可以完整连接的最大的矩形面积。

思路:找出单独的一块矩形,往两边延伸,记录两边的比他高的矩形是在哪个位置,然后最右的位置减去最左边的矩形的位置。就是这个矩形最大可构成的面积。

但是,如果一个一个用循环去做的话,结果是必定超时的,所以这里要用到单调栈。

 

比如找出最左边的比目标矩形要高的矩形的位置的代码

 1      while(!s.empty())    //对栈首先进行清空。
 2 
 3             s.pop();  
 4 
 5         s.push(0);     //入栈一个边界位置。
 6 
 7         for(int i=1;i<=n;i++){
 8  
 9             for(x=s.top();a[x]>=a[i];x=s.top())   //如果a[x]要比那个a[i]
也就是目标矩形要大的话,那么说明可以继续往左寻找。如果没有比目标矩形要大的话,那么这个就是
它的右边那个就是最临界的那个矩形。
10 s.pop(); 11 12 l[i]=x+1; 13 14 s.push(i); 15 }

 

 

 1 #include <stdio.h>
 2 #include <iostream>
 3 #include <stack>
 4 
 5 #define X 1000010
 6 
 7 using namespace std;
 8 
 9 stack<int >s;
10 int n,x;
11 long long a[X],m,ans,r[X],l[X];
12 int main()
13 {
14   //  freopen("in.txt","r",stdin);
15     while(scanf("%d",&n),n!=0){
16         ans=0;
17         a[0]=-1;a[n+1]=-1;
18         for(int i=1;i<=n;i++)
19             scanf("%lld",&a[i]);
20         while(!s.empty())
21             s.pop();  s.push(0);
22         for(int i=1;i<=n;i++){
23             for(x=s.top();a[x]>=a[i];x=s.top())
24                 s.pop();
25                 l[i]=x+1;
26                 s.push(i);
27             }
28         while(!s.empty())
29             s.pop();s.push(n+1);
30         for(int i=n;i>0;i--){
31             for(x=s.top();a[x]>=a[i];x=s.top())
32                 s.pop();
33                 r[i]=x-1;
34                 s.push(i);
35                 if((r[i]-l[i]+1)*a[i]>ans) ans=(r[i]-l[i]+1)*a[i];
36             }
37         printf("%lld\n",ans);
38     }
39     return 0;
40 }

 

posted @ 2016-07-24 17:05  一个_小菜鸟  阅读(1403)  评论(2编辑  收藏  举报