hdu1506:http://acm.hdu.edu.cn/showproblem.php?pid=1506
题意:给你一些直的的方块,这些方块的底部在同一条直线上,但是高度不一样,让你找一个最大的方块,这个方块是由这些矩阵拼起来的。
题解:自己太渣了,完全不会这一题怎么写,发现自己的思维能力太弱了,根本不会思考,。。。。不说了,继续努力。这一题要处理出以每个方块为中心向左向右分别能扩展的距离,所谓能扩展就是指左边最长的比他大的距离,这样计算的时候就可以知道如果以这个方块的高度为矩阵的高,最大会得到的面积。处理完之后,然后for一遍得到最大面积。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int N=5*1e5+4; 7 int ll[N],rr[N]; 8 int a[N]; 9 long long ans; 10 int n; 11 int main(){ 12 while(~scanf("%d",&n)&&n){ 13 memset(ll,0,sizeof(ll)); 14 memset(rr,0,sizeof(rr)); 15 memset(a,-1,sizeof(a)); 16 for(int i=1;i<=n;i++) 17 scanf("%d",&a[i]); 18 for(int i=1;i<=n;i++){ 19 ll[i]=i; 20 if(i==1)continue; 21 int t=i-1; 22 while(a[i]<=a[t]){ 23 ll[i]=ll[t]; 24 t=ll[t]-1; 25 } 26 } 27 for(int i=n;i>=1;i--){ 28 rr[i]=i; 29 if(i==n)continue; 30 int t=i+1; 31 while(a[i]<=a[t]){ 32 rr[i]=rr[t]; 33 t=rr[t]+1; 34 } 35 } 36 ans=0; 37 for(int i=1;i<=n;i++) 38 ans=max(ans,(long long)(rr[i]-ll[i]+1)*(long long)a[i]); 39 printf("%I64d ",ans); 40 } 41 }