题意就是和下图差不多,只是宽度不是1了。
#include <stdio.h>
#include <string.h>
#include <stack>
#include <algorithm>
using namespace std;
const int MAXN = 50010;
int w[MAXN];
int h[MAXN];
int ws[MAXN];
int L[MAXN],R[MAXN];
int main()
{
int n;
while(scanf("%d",&n) && n != -1)
{
for(int i = 0; i < n; ++i)
{
scanf("%d %d",&w[i],&h[i]);
if(i == 0) ws[i] = w[i];
else ws[i] = w[i]+ws[i-1];
}
stack<int> s1,s2;
for(int i = 0; i < n; ++i)
{
while(s1.size() && h[s1.top()] >= h[i])
s1.pop();
if(s1.size()) L[i] = s1.top()+1;
else L[i] = 0;
s1.push(i);
}
for(int i = n-1; i >= 0; --i)
{
while(s2.size() && h[s2.top()] >= h[i])
s2.pop();
if(s2.size()) R[i] = s2.top()-1;
else R[i] = n-1;
s2.push(i);
}
int width;
int res = 0;
for(int i = 0; i < n; ++i)
{
if(L[i] == -1)
width = ws[R[i]];
else
width = ws[R[i]]-ws[L[i]-1];
res = max(res,h[i]*width);
}
printf("%d\n",res);
}
return 0;
}