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
",a[j],s[j]);
			//}
			//printf("%d
",ans);
		}
		while(top>0){//由于读完数据之后并未全部处理完,故再次处理
			ans=ma(a[top]*(n-s[top-1]),ans);
			top--;
		}
		printf("%lld
",ans);//输出答案
	}
	return 0;
}

  啦啦啦就这样

原文地址:https://www.cnblogs.com/hahaha2124652975/p/11191366.html