广告印刷 (单调队列)
【问题描述】
最近,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 }
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
标签:
单调队列
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!