题意:
给你n个矩形的长和宽,排列在一起,现在问你最大的矩形是多大。
思考:
单调栈的基础题,就是维护一个矩形左边第一个比他小的,和右边第一个比他小的,那么中间的就是宽累积起来,高就是当前的高。
从左到右维护递增栈,可以维护出右边第一个比他小的。
从左到右维护递减栈,可以维护出右边第一个比他大的。
从右到左维护递增栈,可以维护出左边第一个比他小的。
从右到左维护递减栈,可以维护出左边第一个比他大的。
代码:
int T,n,m,k;
int va[N];
int vb[N];
int l[N],r[N];
signed main()
{
IOS;
cin>>n;
for(int i=1;i<=n;i++) cin>>va[i];
for(int i=1;i<=n;i++) cin>>vb[i];
stack<int > s;
for(int i=1;i<=n;i++)
{
while(s.size()&&vb[i]<vb[s.top()])
{
r[s.top()] = i;
s.pop();
}
s.push(i);
}
while(s.size()) s.pop();
for(int i=n;i>=1;i--)
{
while(s.size()&&vb[i]<vb[s.top()])
{
l[s.top()] = i;
s.pop();
}
s.push(i);
}
while(s.size()) s.pop();
for(int i=1;i<=n;i++) va[i] += va[i-1];
int maxn = 0;
for(int i=1;i<=n;i++)
{
if(r[i]==0) r[i] = n+1; //如果右边没有比他小的,就直接到n+1
int sum = va[r[i]-1]-va[l[i]];
maxn = max(maxn,sum*vb[i]);
}
cout<<maxn;
return 0;
}
总结:
多多积累经验。