POJ 2082 Terrible Sets(单调栈)
2016-07-25 23:46
381 查看
题目链接:
POJ 2082 Terrible Sets
题意:
【题目描述成这样也是醉了。。。】
实际上就是给出n个并排矩形的底和高,求能划分的最大矩形面积。
数据范围:n≤5∗104
分析;
和前面那道题其实一样的,只要用一个sum[]数组记录下底的和就好了。
POJ 2082 Terrible Sets
题意:
【题目描述成这样也是醉了。。。】
实际上就是给出n个并排矩形的底和高,求能划分的最大矩形面积。
数据范围:n≤5∗104
分析;
和前面那道题其实一样的,只要用一个sum[]数组记录下底的和就好了。
#include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> using namespace std; typedef long long ll; const int MAX_N = 50010; int n; ll height[MAX_N], width[MAX_N], sum[MAX_N]; int L[MAX_N], R[MAX_N], sta[MAX_N]; //维护单调非递减栈 int main() { while (~scanf("%d", &n)) { if(n == -1) break; sum[0] = 0; for (int i = 1; i <= n; ++i) { scanf("%lld%lld", &width[i], &height[i]); sum[i] = sum[i - 1] + width[i]; } height[n + 1] = 0, sum[n + 1] = sum ; int top = 0, cur; sta[0] = 0; for (int i = 1; i <= n + 1; ++i) { while(1) { cur = sta[top]; if (height[cur] <= height[i]) break; R[cur] = i; top--; } L[i] = cur; sta[++top] = i; } ll ans = 0; for (int i = 1; i <= n; ++i) { ll len = sum[R[i] - 1] - sum[L[i]]; //printf("L[%d] = %d R[%d] - 1 = %d\n", i, L[i], i, R[i] - 1); ans = max(ans, len * height[i]); } printf("%lld\n", ans); } return 0; }
相关文章推荐
- 浅谈单调队列、单调栈
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- 1611:The Suspects
- POJ1089 区间合并
- POJ 2159 Ancient Cipher
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链
- POJ-1695-Magazine Delivery-dp
- POJ1523 SPF dfs
- POJ-1001 求高精度幂-大数乘法系列
- POJ-1003 Hangover
- POJ-1004 Financial Management
- [数论]poj2635__The Embarrassed Cryptographer
- [二分图匹配]poj2446__Chessboard
- POJ1050 最大子矩阵和