poj 2559 Largest Rectangle in a Histogram 栈

来源:互联网 发布:ff视频软件 编辑:程序博客网 时间:2024/06/06 19:03
// poj 2559 Largest Rectangle in a Histogram 栈// // n个矩形排在一块,不同的高度,让你求最大的矩形的面积(矩形紧挨在一起)//// 这道题用的是数据结构做,也可以递推做,目前只会数据结构的//// 对于每个高度h,求一个左边界L和右边界R,分别表示的意义是// L是下标为j的矩形的高度的hj小于当前h的最大的j的值。则根据定义// 我们可以知道j到i之间的h都是大于当前的hi的。// R是下标为k的矩形的高度的hk大于当前h的最小的k的值,则根据定义// 我们可以知道i到k之间的h都是大于当前的hi的。// 则最后的结果就是max( ( R[i] - L[i] ) * h[i]).// // 具体实现是用一个栈依次保存每个矩形的高度。// 设栈中的元素从上到下的值是x[i](x[i] > x[i+1] && h[x[i]] > h[x[i+1]])//// 在计算L[i]的时候,当栈顶元素j满足h[j]>=h[i]时,一直出栈,直到j=0或者// h[j] < h[i] 的时候,我们就求出了最大的h[j]>=h[i]的j的最小值即j+1//// 在计算R[i]的时候,当栈顶元素j满足h[j]>=h[i]时,一直出栈,知道j=0或者// h[j] < h[i] 的时候,我们就求除了最小的h[j]>=h[i]的j的最大值即j。//// 所要注意的是//// 计算L的时候要从左边开始扫描,此时栈中需要的是1,2,...i的值// 计算R的时候要从右边开始扫描,此时栈中需要的是i+1...n的值// //// 感悟:// // 从这道题中就可以发现数据结构栈的魅力的所在,个人感觉数据结构很神奇,// 也更加笃定了我要学数据结构的决心。// // 继续练#include <algorithm>#include <bitset>#include <cassert>#include <cctype>#include <cfloat>#include <climits>#include <cmath>#include <complex>#include <cstdio>#include <cstdlib>#include <cstring>#include <ctime>#include <deque>#include <functional>#include <iostream>#include <list>#include <map>#include <numeric>#include <queue>#include <set>#include <stack>#include <vector>#define ceil(a,b) (((a)+(b)-1)/(b))#define endl '\n'#define gcd __gcd#define highBit(x) (1ULL<<(63-__builtin_clzll(x)))#define popCount __builtin_popcountlltypedef long long ll;using namespace std;const int MOD = 1000000007;const long double PI = acos(-1.L);const int maxn = 1e5 + 8;int a[maxn];int st[maxn];int n;int L[maxn];int R[maxn];void init(){for (int i=0;i<n;i++)scanf("%d",&a[i]);int t = 0;for (int i=0;i<n;i++){while(t>0 && a[st[t-1]]>=a[i])t--;L[i] = t==0 ? 0 : st[t-1] + 1;st[t++] = i;}t = 0;for (int i=n-1;i>=0;i--){while(t>0 && a[st[t-1]] >= a[i])t--;R[i] = t==0 ? n : st[t-1];st[t++] = i;}long long res = 0;for (int i=0;i<n;i++){res = max(res,( R[i] - L[i] ) * (long long)a[i]);}printf("%lld\n",res);}int main() {//freopen("G:\\Code\\1.txt","r",stdin);while(scanf("%d",&n)!=EOF&&n){init();}return 0;}

0 0