51Nod-1102-面积最大的矩形
2016-08-07 18:29
162 查看
ACM模版
![](http://img.blog.csdn.net/20160807182342070)
此类问题可以使用单调栈来实现,使问题可以在O(N)的复杂度中解决。
不管是单调递增还是递减均可,这里使用的是单调递减栈。
描述
题解
类似于在(某一区间中最小值*此区间所有元素之和)最大的问题,这里是
(某一区间中最小值*此区间宽度)最大的问题。
此类问题可以使用单调栈来实现,使问题可以在O(N)的复杂度中解决。
不管是单调递增还是递减均可,这里使用的是单调递减栈。
代码
#include <iostream> #include <cstdio> #include <stack> typedef long long ll; using namespace std; const int MAXN = 5e4 + 10; struct a { ll value; int left; int right; } A[MAXN]; int main(int argc, const char * argv[]) { int N; cin >> N; // 单调递减栈 stack<a> AA; int key = 0; a num; for (int i = 1; i <= N; i++) { scanf("%lld", &num.value); num.left = num.right = i; if (AA.empty()) { AA.push(num); } else { a pop = {0, 0, 0}; while (!AA.empty() && AA.top().value > num.value) { AA.top().right = i - 1; A[key++] = pop = AA.top(); AA.pop(); } if (pop.value) { num.left = !AA.empty() && AA.top().value == num.value ? AA.top().left : pop.left; } else { num.left = !AA.empty() && AA.top().value == num.value ? AA.top().left : i; } AA.push(num); } } // 全部出栈 while (!AA.empty()) { AA.top().right = N; A[key++] = AA.top(); AA.pop(); } ll ans = 0; for (int i = 1; i <= N; i++) { ans = max((A[i].right - A[i].left + 1) * A[i].value, ans); } cout << ans << '\n'; return 0; }
相关文章推荐
- 51Nod 1102 面积最大的矩形
- 51nod 1102 面积最大的矩形【单调栈、预处理】
- 51nod-1102 面积最大的矩形
- 51nod 1102 面积最大的矩形(单调栈)
- 51nod 1102 面积最大的矩形
- 51NOD 1102 面积最大的矩形
- 51nod-1102 . 面积最大的矩形&&hdu-1506
- 51nod-【1102 面积最大的矩形】
- 51Nod 1102 面积最大的矩形
- 51nod 1102 面积最大的矩形
- 51Nod 1102 面积最大的矩形 (左右最大上升区间)
- 51nod 1102 面积最大的矩形
- 51nod 1102 面积最大的矩形(单调栈)
- 【51Nod】1102 - 面积最大的矩形面积(单调栈)
- 1102 面积最大的矩形(简单DP)
- 51Nod Problem 1102 面积最大的矩形(DP)
- 1102 面积最大的矩形
- POJ 2082 Terrible Sets 51nod 1102 面积最大的矩形 《题意好难懂---<贪心+单调栈>》
- 最大长方形(二)nsoj 258 51 nod 1102 面积最大的矩形
- poj2559(单调栈)最大矩形面积