广告印刷 (单调队列)
作者:互联网
【问题描述】
最近,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