标签:15 house T274673 墙面 zhan swap ans for1 top
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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。