51NOD 1102 面積最大的矩形
阿新 • • 發佈:2019-02-02
有一個正整數的陣列,化為直方圖,求此直方圖包含的最大矩形面積。例如 2,1,5,6,2,3,對應的直方圖如下:
面積最大的矩形為5,6組成的寬度為2的矩形,面積為10。
Input
第1行:1個數N,表示陣列的長度(0 <= N <= 50000)
第2 - N + 1行:陣列元素A[i]。(1 <= A[i] <= 10^9)
Output
輸出最大的矩形面積
Input示例
6
2
1
5
6
2
3
Output示例
10
還是太弱了….剛開始想了好久的單調棧都想不出…..單調棧什麼鬼啊…
最後 還是dp
dl[i]表示i柱子可以向左延伸到的位置
dr[i]表示i柱子可以向右延伸到的位置
如果a[i-1]>=a[i]
dl[i]<=dl[i-1] (i>0)
while(a[i]<=a[dl[i]-1])
dl[i]=dl[dl[i]-1];
dr同理
具體複雜度不太會計算(反正比窮舉快就是了)….一臉懵逼過了
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<string>
#include<vector>
#include<deque>
#include<queue>
#include<algorithm>
#include<set>
#include<map>
#include<stack>
#include<ctime>
#include<cmath>
#include<list>
#include<cstring>
//#include<memory.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
#define INF 1000000007
#define pll pair<ll,ll>
#define pid pair<int,double>
#define sci(a) scanf("%d",&a)
#define scll(a) scanf("%lld",&a)
#define scd(a) scanf("%lf",&a)
#define scs(a) scanf("%s",a)
#define pri(a) printf("%d\n",a);
#define prll(a) printf("%lld\n",a);
#define prd4(a) printf("%.4lf\n",a);
#define prs(a) printf("%s\n",a);
//#define CHECK_TIME
#define N 50005
int a[N];
int dl[N],dr[N];
ll dp(int n){
for(int i=1;i<n;++i)
while(a[i]<=a[dl[i]-1])
dl[i]=dl[dl[i]-1];
for(int i=n-2;i>=0;--i)
while(a[i]<=a[dr[i]+1])
dr[i]=dr[dr[i]+1];
ll res=0;
for(int i=0;i<n;++i)
res=max(res,(ll)a[i]*(dr[i]-dl[i]+1));
return res;
}
int main()
{
//freopen("/home/lu/文件/r.txt","r",stdin);
//freopen("/home/lu/文件/w.txt","w",stdout);
#ifdef CHECK_TIME
time_t now=clock();
#endif
int n;
sci(n);
for(int i=0;i<n;++i){
sci(a[i]);
dl[i]=dr[i]=i;
}
prll(dp(n));
#ifdef CHECK_TIME
cout<<"cost time:"
<<(double)(clock()-now)/CLOCKS_PER_SEC*1000
<<"ms"<<endl;
#endif
return 0;
}