POJ2082---Terrible Sets(单调栈)
来源:互联网 发布:淘宝优惠券链接微信 编辑:程序博客网 时间:2024/06/06 03:42
Description
Let N be the set of all natural numbers {0 , 1 , 2 , … }, and R be the set of all real numbers. wi, hi for i = 1 … n are some elements in N, and w0 = 0.
Define set B = {< x, y > | x, y ∈ R and there exists an index i > 0 such that 0 <= y <= hi ,∑0<=j<=i-1wj <= x <= ∑0<=j<=iwj}
Again, define set S = {A| A = WH for some W , H ∈ R+ and there exists x0, y0 in N such that the set T = { < x , y > | x, y ∈ R and x0 <= x <= x0 +W and y0 <= y <= y0 + H} is contained in set B}.
Your mission now. What is Max(S)?
Wow, it looks like a terrible problem. Problems that appear to be terrible are sometimes actually easy.
But for this one, believe me, it’s difficult.
Input
The input consists of several test cases. For each case, n is given in a single line, and then followed by n lines, each containing wi and hi separated by a single space. The last line of the input is an single integer -1, indicating the end of input. You may assume that 1 <= n <= 50000 and w1h1+w2h2+…+wnhn < 109.
Output
Simply output Max(S) in a single line for each case.
Sample Input
3
1 2
3 4
1 2
3
3 4
1 2
3 4
-1
Sample Output
12
14
Source
一道水题,题面那么难懂…
就是给你一排矩形,求可以形成的最大的矩形面积是多少
单调栈搞定
/************************************************************************* > File Name: POJ2082.cpp > Author: ALex > Mail: zchao1995@gmail.com > Created Time: 2015年05月07日 星期四 20时11分08秒 ************************************************************************/#include <functional>#include <algorithm>#include <iostream>#include <fstream>#include <cstring>#include <cstdio>#include <cmath>#include <cstdlib>#include <queue>#include <stack>#include <map>#include <bitset>#include <set>#include <vector>using namespace std;const double pi = acos(-1.0);const int inf = 0x3f3f3f3f;const double eps = 1e-15;typedef long long LL;typedef pair <int, int> PLL;static const int N = 50010;int w[N], h[N];int r[N], l[N];int sum[N];stack <PLL> st;int main() { int n; while (~scanf("%d", &n) && n != -1) { for (int i = 1; i <= n; ++i) { scanf("%d%d", &w[i], &h[i]); l[i] = r[i] = i; } while (!st.empty()) { st.pop(); } sum[0] = 0; for (int i = 1; i <= n; ++i) { sum[i] = sum[i - 1] + w[i]; } for (int i = n; i >= 1; --i) { if (st.empty()) { st.push(make_pair(h[i], i)); } else { while (!st.empty()) { PLL u = st.top(); if (u.first <= h[i]) { break; } st.pop(); l[u.second] = i + 1; } st.push(make_pair(h[i], i)); } } while (!st.empty()) { PLL u = st.top(); st.pop(); l[u.second] = 1; } for (int i = 1; i <= n; ++i) { if (st.empty()) { st.push(make_pair(h[i], i)); } else { while (!st.empty()) { PLL u = st.top(); if (u.first <= h[i]) { break; } st.pop(); r[u.second] = i - 1; } st.push(make_pair(h[i], i)); } } while (!st.empty()) { PLL u = st.top(); st.pop(); r[u.second] = n; } int ans = 0; for (int i = 1; i <= n; ++i) { int L = l[i]; int R = r[i]; ans = max(ans, h[i] * (sum[R] - sum[L - 1])); } printf("%d\n", ans); } return 0;}
- poj2082 Terrible Sets 单调栈
- POJ2082---Terrible Sets(单调栈)
- POJ2082 Terrible Sets [DP 单调栈]
- poj2082(Terrible Sets单调栈入门题)
- POJ2082 Terrible Sets(单调栈)
- poj2082----Terrible Sets(处女座单调栈求区间问题)
- POJ2082--Terrible Sets(栈)
- poj2082 Terrible Sets
- Terrible Sets *---* 单调栈解决问题
- POJ 2082 Terrible Sets(单调栈)
- POJ-2082 Terrible Sets (单调栈)
- ZOJ 2422- Terrible Sets-单调栈
- POJ 2082 Terrible Sets 单调栈
- 【POJ】2082 - Terrible Sets(单调栈)
- POJ 2082 Terrible Sets(单调栈)
- poj_2082 Terrible Sets(单调栈)
- poj 2082 Terrible Sets(单调栈)
- POJ 2082 Terrible Sets 单调栈基础
- 约瑟夫环
- 我的毕业设计-在线五子棋设计
- 计算几何 || 半平面交 (模板收集)
- svm理解
- 【浅谈ASP.NET】——WebForms UnobtrusiveValidationMode 需要“jquery”ScriptResourceMapping
- POJ2082---Terrible Sets(单调栈)
- 4--黑马程序员--技术总结之数组
- 【leetcode】Search for a Range
- 【java】贪吃蛇小游戏
- Mini2440使用USB无线网卡(wifi)
- VS2013如何自己编写C++类
- STL函数整理
- 【contentprovider系列4】删除联系人信息
- Struts2容器详解---IoC源码分析