HDU 1506 Largest Rectangle in a Histogram

来源:互联网 发布:js倒计时源代码 编辑:程序博客网 时间:2024/06/05 20:33

这个题一看就是求区间最小值。


因为直接做UVA 的时候 做过高效算法里面一个这样的题。 所以一下子就能想出思路。(UVA 1619 - Feel Good)


递推求一个数是一个区间最小值的 左端 和 右端。我也不知道为啥 不清空数组就会WA。。 明明感觉没什么影响啊。


#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <string>#include <algorithm>#include <fstream>#include <set>#include <map>#include <queue>#include <stack>#include <list>#include <vector>#include <cmath>#include <iomanip>typedef long long LL;typedef unsigned long long LLU;const double PI=acos(-1.0);using namespace std;#define MAXN 100000+10LL a[MAXN];LL l[MAXN];LL r[MAXN];int main (){    LL n;    while(scanf("%I64d",&n) && n){        memset(a,0,sizeof(a));        memset(r,0,sizeof(r));        memset(l,0,sizeof(l));        for(LL i = 1; i <= n; i++){            scanf("%I64d",&a[i]);            l[i] = i;            r[i] = i;        }        for(LL i = 1; i <= n; i++){            if(a[i] > 0){                while(a[l[i]-1] >= a[i])                    l[i] = l[l[i] - 1];            }        }        for(LL i = n; i >= 1; i--){            if(a[i] > 0){                while(a[r[i]+1] >= a[i])                    r[i] = r[r[i]+1];            }        }        LL M = 0;        for(LL i = 1; i <= n; i++)            M = max(M, (r[i]-l[i]+1)*a[i]);        printf("%I64d\n",M);    }    return 0;}


0 0
原创粉丝点击