标签:24 印刷 队列 广告牌 高度 int 建筑物 -- 单调
【问题描述】
最近,afy决定给TOJ印刷广告,广告牌是刷在城市的建筑物上的,城市里有紧靠着的N个建筑。afy决定在上面找一块尽可能大的矩形放置广告牌。我们假设每个建筑物都有一个高度,从左到右给出每个建筑物的高度H1,H2…HN,且0<Hi<=1,000,000,000,并且我们假设每个建筑物的宽度均为1。要求输出广告牌的最大面积。
【输入文件】
中的第一行是一个数n (n<= 400,000 )
第二行是n个数,分别表示每个建筑物高度H1,H2…HN,且0<Hi<=1,000,000,000。
【输出文件】
输出文件 ad.out 中一共有一行,表示广告牌的最大面积。
【输入样例】
6
5 8 4 4 8 4
【输出样例】
24
分析:
对于每一个建筑,他能围成的最大面积就是(r[i]-l[i]-1)*h[i],其中r[i]表示右边第一个高度小于h[i]的建筑的编号,同理l[i]也一样,那么我们可以用单调队列维护出l[i]和r[i]。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e6+10; 4 int q[N],n,i,t; 5 int h[N],l[N],r[N]; 6 7 int main(){ 8 scanf("%d",&n); 9 for(int i=1;i<=n;i++) scanf("%d",&h[i]); 10 h[0]=h[n+1]=0;//设置边界 11 t=0; 12 memset(q,0,sizeof(q)); 13 for(int i=1;i<=n;i++){//求右极限 14 while(h[i]<h[q[t]] && t>=1){ 15 r[q[t]]=i; 16 t--; 17 } 18 q[++t]=i; 19 } 20 t=0; 21 memset(q,0,sizeof(q)); 22 for(int i=n;i>=0;i--){//求左极限 23 while(h[i]<h[q[t]] && t>=1){ 24 l[q[t]]=i; 25 t--; 26 } 27 q[++t]=i; 28 } 29 long long ans=0; 30 for(int i=1;i<=n;i++) 31 ans=max(ans,(long long)(r[i]-l[i]-1)*h[i]); 32 cout<<ans; 33 }
标签:24,印刷,队列,广告牌,高度,int,建筑物,--,单调 来源: https://www.cnblogs.com/yhxnoerror/p/16365273.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。