POJ-2559 维护单调栈.细节阿细节

来源:互联网 发布:c 并发编程 书籍 编辑:程序博客网 时间:2024/06/09 16:55

      这题意思很简单...就是给一排并列宽为1,长度输入数据的图像..问能找到的最大矩形面积是多大...

      思路也很简单...基本框架是: 从一边做到另一边..维护一个单调的栈..栈顶的矩形边最长..栈底的最短...当前扫到某个位置的矩形..就判断弹栈..直道栈顶的矩形长小于等于当前矩形..

      但是..细节阿...首先...不是从一边做到另一边就完了..还要从另一边再做回来~~要做两次才能得到结果...再一个...注意这种情况阿..:

       3 2 1 2

      判断的时候稍不细心答案就是2了...但显然答案是3的说...因为在做的时候..首先是2进栈..然后到1..但是1又把2弹掉了...发现开始的处理显然是欠考虑的...虽然长度为2的是要出栈..但是2的这个位置不能丢弃..要记录传递给第2位的1~~~~


program:

#include<iostream>#include<string.h>#include<stdio.h>#include<algorithm>#include<math.h>#include<queue>using namespace std;  struct node{      __int64 h,s;     }mystack[100005]; __int64 ans,x,k,n,p,a[100005],t;int main(){         freopen("input.txt","r",stdin);      freopen("output.txt","w",stdout);         while (~scanf("%I64d",&n))      {            if (!n) break;            ans=0;            for (p=1;p<=n;p++) scanf("%I64d",&a[p]);            a[0]=a[n+1]=0; n++;            k=0;            for (p=1;p<=n;p++)            {                   x=a[p];                  t=p;                   while (k && mystack[k].h>=x)                  {                        if (mystack[k].h*(p-mystack[k].s)>ans)                            ans=mystack[k].h*(p-mystack[k].s);                        if (mystack[k].s<t) t=mystack[k].s;                        k--;                  }                  if (!k || mystack[k].h!=x)                   {                         k++;                         mystack[k].h=x;                          mystack[k].s=t;                   }              }              k=0;            for (p=n-1;p>=0;p--)            {                  x=a[p];                   t=p;                  while (k && mystack[k].h>=x)                  {                        if (mystack[k].h*(mystack[k].s-p)>ans)                            ans=mystack[k].h*(n-mystack[k].s-p);                        if (mystack[k].s>t) t=mystack[k].s;                        k--;                  }                   if (!k || mystack[k].h!=x)                   {                         k++;                         mystack[k].h=x;                          mystack[k].s=t;                     }                              }              printf("%I64d\n",ans);      }       return 0;}



POJ-2559 维护单调栈.细节阿细节

原创粉丝点击