hdu1506:
题意:给你一些直的的方块,这些方块的底部在同一条直线上,但是高度不一样,让你找一个最大的方块,这个方块是由这些矩阵拼起来的。
题解:自己太渣了,完全不会这一题怎么写,发现自己的思维能力太弱了,根本不会思考,。。。。不说了,继续努力。这一题要处理出以每个方块为中心向左向右分别能扩展的距离,所谓能扩展就是指左边最长的比他大的距离,这样计算的时候就可以知道如果以这个方块的高度为矩阵的高,最大会得到的面积。处理完之后,然后for一遍得到最大面积。
1 #include2 #include 3 #include 4 #include 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\n",ans);40 }41 }