这是一道单调栈的题目,其实是求最大矩形面积的题目(根本看不懂题目呐)
这是将样例图形化后的结果:
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.
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.
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 w
1h
1+w
2h
2+...+w
nh
n < 10
9.
Simply output Max(S) in a single line for each case.
3 1 2 3 4 1 2 3 3 4 1 2 3 4 -1
12 14
#include<stdio.h>
#include<stack>
using namespace std;
struct list
{
int w;
int h;
};
int main()
{
int n;
while(scanf("%d",&n),n!=-1)
{
int ans=0;
stack<struct list> s;
for(int i=0;i<n;i++)
{
int w,h;
struct list tmp;
scanf("%d%d",&w,&h);
if(s.empty())
{
tmp.w=w;
tmp.h=h;
s.push(tmp);
}
else
{
int total_w=0;
if(h>=s.top().h)
{
tmp.w=w;
tmp.h=h;
s.push(tmp);
}
else
{
while(!s.empty()&&h<s.top().h)
{
total_w+=s.top().w;
if(ans<total_w*s.top().h)
{
ans=total_w*s.top().h;
}
s.pop();
}
tmp.w=total_w+w;
tmp.h=h;
s.push(tmp);
}
}
}
int total_w=0;
while(!s.empty())
{
total_w+=s.top().w;
if(ans<total_w*s.top().h)
{
ans=total_w*s.top().h;
}
s.pop();
}
printf("%d\n",ans);
}
return 0;
}