UOJ#48最大矩形面积
这是一道标准的单调栈的题目,但是由于题目的个例性,该题对于前后两数等于的情况并无额外处理,so也确实是让这题简单了一点
也没什么好说的直接上代码吧
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=500005;
int n;
long long top,ans;
long long a[N],s[N];
long long ma(long long a,long long b){return a>b?a:b;}//手写max要快一点
int main(){
while(1){
ans=0;
scanf("%d",&n);
if(n==0)return 0;//停止条件
for(int i=1;i<=n;i++){
int k;
scanf("%lld",&k);
while(top>0&&a[top]>=k){//维护单调性
ans=ma(ans,a[top]*(i-s[top-1]-1));
top--;
}
a[++top]=k;//入栈
s[top]=i;
//for(int j=1;j<=top;j++){//手动调试作用。。(本人太弱不会用guide的自带调试。。)
// printf("%d %d\n",a[j],s[j]);
//}
//printf("%d\n",ans);
}
while(top>0){//由于读完数据之后并未全部处理完,故再次处理
ans=ma(a[top]*(n-s[top-1]),ans);
top--;
}
printf("%lld\n",ans);//输出答案
}
return 0;
}
啦啦啦就这样

浙公网安备 33010602011771号