其他分享
首页 > 其他分享> > 做题记录整理栈6 T274673 黄校长的大house(有数据)(2022/9/15)

做题记录整理栈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