题目点我
傻B题目wa了半天,最后发现是因为中间计算结果太大,需要强制转换long long。
O(n2)
做法会超时,用两个数组记录一个矩形向左和向右有多少个连续的不比他低的矩形。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
#define len 100005
unsigned long h[len];
int l[len], r[len];
int cnt;
long long ans;
void solve(){
memset(l, 0, sizeof(l));
memset(r, 0, sizeof(r));
ans = 0;
for(int i = 1; i < cnt; i++){
int k = i - 1;
while(h[k] >= h[i] && k >= 0){
l[i] += l[k] + 1;
k -= 1 + l[k];
}
}
for(int i = cnt - 2; i >= 0; i--){
int k = i + 1;
while(h[k] >= h[i] && k < cnt){
r[i] += r[k] + 1;
k += 1 + r[k];
}
}
for(int i = 0; i < cnt; i++){
long long tmp = 0;
tmp = (long long)(l[i] + r[i] + 1) * (long long)h[i];
if(tmp > ans)
ans = tmp;
}
}
int main(){
while(scanf("%d", &cnt) && cnt){
for(int i = 0; i < cnt; i++){
scanf("%d", &h[i]);
}
solve();
//printf("%I64d\n", ans);
cout << ans << endl;
}
return 0;
}