一直long long 过不去。。。然后,改成__int64竟然过了。。。
1505的减弱版。。
分别计算a[i]点的左右比它高的所有相邻的点的长度就可以了。
用l[i],r[i]表示左右的长度。
a[l[i]-1]>=a[i] l[i]=l[l[i]-1];
a[r[i]+1]>=a[i] r[i]=r[r[i]+1];
#include <iostream> using namespace std; __int64 l[100005],r[100005]; __int64 a[100005]; int main() { int n; while(scanf("%d",&n)==1&&n) { for(int i=0;i<n;i++) l[i]=r[i]=i; for(int i=0;i<n;i++) { scanf("%I64d",&a[i]); while(l[i]-1>=0&&a[l[i]-1]>=a[i]) l[i]=l[l[i]-1]; } for(int i=n-2;i>=0;i--) while(r[i]+1<n&&a[r[i]+1]>=a[i]) r[i]=r[r[i]+1]; __int64 max=0; for(int i=0;i<n;i++) if((r[i]-l[i]+1)*a[i]>max) max=(r[i]-l[i]+1)*a[i]; printf("%I64d\n",max); } return 0; }