51Nod-1102-面积最大的矩形
来源:互联网 发布:修复dll软件 编辑:程序博客网 时间:2024/05/18 01:02
ACM模版
描述
题解
类似于在(某一区间中最小值*此区间所有元素之和)最大
的问题,这里是(某一区间中最小值*此区间宽度)最大
的问题。
此类问题可以使用单调栈来实现,使问题可以在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;}
0 0
- 51Nod-1102-面积最大的矩形
- 51nod 1102 面积最大的矩形
- 51NOD 1102 面积最大的矩形
- 51nod 1102 面积最大的矩形
- 51nod-【1102 面积最大的矩形】
- 51Nod 1102 面积最大的矩形
- 51nod-1102 面积最大的矩形
- 51nod 1102 面积最大的矩形
- 51Nod 1102 面积最大的矩形
- 51nod-1102 . 面积最大的矩形&&hdu-1506
- 51Nod Problem 1102 面积最大的矩形(DP)
- 51nod 1102 面积最大的矩形【单调栈、预处理】
- 51nod 1102 面积最大的矩形(单调栈)
- 51nod 1102 -面积最大的矩形问题
- 【51Nod】1102 - 面积最大的矩形面积(单调栈)
- 1102 面积最大的矩形
- POJ 2559 &&HDU 1506 Largest Rectangle in a Histogram && 51nod 1102 面积最大的矩形 单调栈的应用
- POJ 2082 Terrible Sets 51nod 1102 面积最大的矩形 《题意好难懂---<贪心+单调栈>》
- android程序开机自启
- 键盘遮挡输入框的问题
- Saltstack数据系统-Pillar
- 几个框架的环境搭建
- 开始学习redis
- 51Nod-1102-面积最大的矩形
- Codeforces #187 (Div. 1) B. Sereja and Periods && Hihocoder 1355 (字符串匹配倍增好题)
- 实现Android的消息通知栏
- CentOS 7 Debian 8 安装VMware-tools
- 数学基础 —— 向量旋转到另一个向量
- TextView设置最多显示指定个字符,超过部分显示...
- dojo之gfx动画
- win10双显卡开机黑屏时间长
- 前端面试基础总结