hdu 1506 Largest Rectangle in a Histogram
来源:互联网 发布:快网域名 编辑:程序博客网 时间:2024/06/11 12:03
http://acm.hdu.edu.cn/showproblem.php?pid=1506
left[i],right[i]为第i个矩形左右两侧可连通的矩形个数
因为,若连通那么i一定是领近比他高的矩形,那么left,right就可代表矩形i左右两侧比他高且连通的矩形块;所以对于第i个矩形块,若第i-1个矩形块比他低,那么第i个矩形块的left[i+1]=0,
但是,当第i-1个矩形块高度小于第i个,那么就不能直接得到第i个矩形块的left,right的值,
e.g. 3 3 1 3 3 1
left 0 1 2 0 1 5
这时就需要借助第i-1个矩形块的left值来搜索比第i个矩形块更大的,因为我们已经知道了第i-1个矩形块的left值代表了比第i个矩形块更大的矩形块区域;
那么就可以来比对height[i-left[i-1]-2]与height[i]的值来判断打断上一个连通区域的矩形块与第i+1个矩形块的大小关系,然后递推;
right 数组同理.
注意用long long。
#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;typedef long long LL;LL max(LL a,LL b){ return a>b?a:b;}int main(){ int n,h[100005]; while(scanf("%d",&n)&&n) { for(int i=0;i<n;i++) scanf("%d",&h[i]); int left[100005],right[100005]; memset(left,0,sizeof(left)); memset(right,0,sizeof(right)); for(int i=1;i<n;i++) { if(h[i]>h[i-1]) left[i]=0; else left[i]=left[i-1]+1; for(int j=i-1;j>-1;) { int now=j-left[j]-1; if(now<0) break; if(h[i]<=h[now]) left[i]+=left[now]+1,j=now; else{ left[i]+=left[now+1];break; } } } for(int i=n-2;i>-1;i--) { if(h[i]>h[i+1]) right[i]=0; else right[i]=right[i+1]+1; for(int j=i+1;j<n;) { int now=j+right[j]+1; if(now>=n) break; if(h[i]<=h[now]) right[i]+=right[now]+1,j=now; else{ right[i]+=right[now-1];break; } } } /* printf(" ");for(int i=0;i<n;i++) printf("%d ",left[i]);printf("\n"); printf(" ");for(int i=0;i<n;i++) printf("%d ",right[i]);printf("\n"); /*/ LL maxx=0,now; for(int i=0;i<n;i++) { now=((LL)left[i]+right[i]+1)*h[i]; maxx=max(maxx,now); } printf("%lld\n",maxx); } return 0;}
阅读全文
0 0
- hdu 1506 Largest Rectangle in a Histogram
- HDU 1506 Largest Rectangle in a Histogram
- hdu 1506 Largest Rectangle in a Histogram
- hdu 1506 Largest Rectangle in a Histogram
- hdu 1506 Largest Rectangle in a Histogram
- HDU 1506 Largest Rectangle in a Histogram
- hdu 1506 Largest Rectangle in a Histogram
- HDU 1506 Largest Rectangle in a Histogram
- hdu 1506 Largest Rectangle in a Histogram
- hdu 1506 Largest Rectangle in a Histogram
- HDU 1506 Largest Rectangle in a Histogram
- HDU 1506 Largest Rectangle in a Histogram
- hdu 1506 Largest Rectangle in a Histogram
- HDU 1506 Largest Rectangle in a Histogram
- HDU 1506 Largest Rectangle in a Histogram
- hdu 1506 Largest Rectangle in a Histogram
- hdu 1506 Largest Rectangle in a Histogram
- hdu 1506 Largest Rectangle in a Histogram
- linux 安装 mysql
- 使用PageHelper实现分页
- ARM9 重定位
- Sentry Docker搭建
- ES性能调优权威指南(篇一)
- hdu 1506 Largest Rectangle in a Histogram
- 打造逼真趣味DIY印章
- MATLAB Starting Error in Ubuntu 12.04: libc.so.6: not found
- 浏览器关闭后,Session就销毁了吗?
- Java引用详解(强引用、软引用、弱引用、虚引用)
- JS中setTimeout()的用法详解
- 第一次写博客
- iOS_Runtime3_动态添加方法
- radio,checkbox的重复点击实现