题意:给你连续n个矩阵的长和宽,求出最大连续矩阵的面积。
单调栈。也可用DP写,具体和HDU1505类似。这里就写单调队列了。
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <map>
#include <vector>
#include <cmath>
#include <stack>
#include <queue>
#include <cstdlib>
#include <algorithm>
using namespace std;
typedef __int64 int64;
typedef long long ll;
#define M 50005
#define N 1000005
#define max_inf 0x7f7f7f7f
#define min_inf 0x80808080
#define mod 1000000007
ll q[M] , sum[M] , x[M] , y[M] , lef[M] , rig[M];
int main()
{
ll i , top , n , ans;
while (~scanf("%lld",&n) , n != -1)
{
top = ans = 0;
for (sum[0] = 0 , i = 1 ; i <= n ; i++)
{
scanf("%lld%lld",x+i,y+i);
sum[i] = sum[i-1]+x[i];
}
top = 0;
for (i = 1 ; i <= n ; i++)
{
while (top > 0 && y[q[top-1]] > y[i])
{
top--;
rig[q[top]] = i-q[top];
}
if (top <= 0)lef[i] = i;
else lef[i] = i-q[top-1];
q[top++] = i;
}
while (top)
{
rig[q[top-1]] = n-q[top-1]+1;
top--;
}
ans = -(1<<30);
for (i = 1 ; i <= n ; i++)
{
ll temp = (sum[i+rig[i]-1]-sum[i-lef[i]])*y[i];
ans = max(ans,temp);
}
printf("%lld\n",ans);
}
return 0;
}