hdu 1506 Largest Rectangle in a Histogram 单调栈

来源:互联网 发布:关于网络诈骗的案例 编辑:程序博客网 时间:2024/05/15 18:42

题意:求最大子矩阵面积

单调栈处理到当前位置为止的最大矩阵高度(记录下标),若当前的高度小于栈顶则不断更新面积,并入栈(栈顶元素最大)。

#include <map>#include <set>#include <queue>#include <stack>#include <vector>#include <string>#include <math.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;#define lson l, mid, rt << 1#define rson mid + 1, r, rt << 1 | 1#define ls rt << 1#define rs rt << 1 | 1#define pi acos(-1.0)#define eps 1e-8#define asd puts("sdfsdfsdfsdfsdfsdf");typedef long long ll;typedef __int64 LL;const int inf = 0x3f3f3f3f;const int N = 100010;ll r[N];ll ans, tmp;ll s[N], top;int main(){    int n;    while( ~scanf("%d", &n) && n ) {        for( int i = 1; i <= n; ++i )            scanf("%lld", &r[i]);        ans = r[n+1] = -1;        top = -1;        for( int i = 1; i <= n+1; ++i ) {            if( top == -1 || r[s[top]] < r[i] ) {                s[++top] = i;            }            else if( r[s[top]] > r[i] ) {                LL x;                while( top > -1 && r[s[top]] > r[i] ) {                    tmp = ( i - s[top] ) * r[s[top]];                    ans = max( ans, tmp );                    x = s[top];                    top--;                }                s[++top] = x;                r[x] = r[i];            }        }        printf("%I64d\n", ans);    }    return 0;}


0 0
原创粉丝点击