做题记录整理栈6 T274673 黄校长的大house(有数据)(2022/9/15)
作者:互联网
emmm
为了做好这个最大刷墙的模板,甚至专门搞了一个题目
属于是为了吃老婆饼专门找一个老婆了
这题我们可以枚举每个长度的墙面,对于第i个墙面,我们找左边第一个比它小的墙面,序号为x,右边第一个比他矮的墙面,序号为y,那么此时这个墙面会被覆盖到的最大的矩形就是[y-1,x+1]这个区间,长度为h[i],然后取最大值就出来了。
#define for1(i,a,b) for(int i = a;i<=b;i++)
#define ll long long
#define mp(a,b) make_pair(a,b)
using namespace std;
ll n,a[5000005],zhan[5000005],top,ans[5000005],ans2[500005];
ll mx=-1e8;
int main()
{
// freopen("10.in","r",stdin);
// freopen("10.out","w",stdout);
cin>>n;
for1(i,1,n)
scanf("%lld",a+i);
for1(i,1,n)
{
while(top!=0&&a[zhan[top]]>=a[i]) top--;
if(top!=0)
ans2[i]=zhan[top];
zhan[++top]=i;
}
top=0;
for1(i,1,n/2)
swap(a[i],a[n-i+1]);
for1(i,1,n) ans[i]=n+1;
for1(i,1,n)
{
while(top!=0&&a[zhan[top]]>=a[i]) top--;
if(top!=0)
ans[i]=n-zhan[top]+1;
zhan[++top]=i;
}
for1(i,1,n/2)
swap(ans[i],ans[n-i+1]);
for1(i,1,n/2)
swap(a[i],a[n-i+1]);
for1(i,1,n)
{
if((ans[i]-ans2[i]-1)*a[i]>mx)
mx=(ans[i]-ans2[i]-1)*a[i];
}
printf("%lld\n",mx);
return 0;
}```
标签:15,house,T274673,墙面,zhan,swap,ans,for1,top 来源: https://www.cnblogs.com/yyx525jia/p/16698086.html