正文

Zju 1985 Largest Rectangle in a Histogra2006-07-27 00:11:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/cruxd/16849.html

分享到:

tle了我几个月.......谢谢cqf大牛的算法。

//State: 0.22s 1512kb

//用l,r两个数组保存当前元素向左向右访问能够达到的最大下标,因此可用dp

//另:此题甚bt,数据量大的惊人,而且有陷阱,必须用scanf。我用cin的时候起码读了10s.........

#include <cstdio>

int a[100000], l[100000], r[100000], n;

int main()
{
 freopen("in.txt", "r", stdin);
 while(scanf("%d", &n) && n)
 {
  int i;
  double max = 0.00;
  for(i = 0; i < n; i ++)
  {
   scanf("%d", &a[i]);     
  }
  for(i = 0; i < n; i ++)
  {
   l[i] = i;
   while(l[i] > 0 && a[i] <= a[l[i] - 1])
   {
    l[i] = l[l[i] - 1];
   }   
  }
  //pl();
  for(i = n - 1; i >= 0; i --)
  {
   r[i] = i;
   while(r[i] < n - 1 && a[i] <= a[r[i] + 1])
   {
    r[i] = r[r[i] + 1];
   }
   double t = double((r[i] - l[i] + 1) * double(a[i]));
   if(max < t)
    max = t;
  }
  //pr();
  printf("%0.0f\n", max);
 }
 return 0;
}

阅读(4218) | 评论(2)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册