单调栈问题,跟2796差不多。 要注意的是,一次栈扫描就可以决定左右边界了。 #include <cstdio> using namespace std; const int MAX = 100010; typedef struct _Node { int data; int left; int right; }Node; Node data[MAX]; int stack[MAX]; int n,stacki; void setleftright() { stacki = 0 ; for( int i = 0 ; i != n ; ++i ) { while( stacki != 0 && data[ stack[ stacki - 1 ] ].data > data[i].data ) data[ stack[ --stacki ] ].right = i - 1 ; stack[stacki++] = i; if( stacki == 1 ) data[i].left = 0 ; else data[i].left = stack[ stacki - 2 ] + 1; } while( stacki != 0 ) data[ stack[--stacki] ].right = n - 1 ; } long long find() { long long max = -1; long long maxmid; for( int i = 0 ; i != n ; ++i ) { int mid1 = data[i].left ; int mid2 = data[i].right; maxmid = mid2 - mid1 + 1 ; maxmid *= data[i].data; if( maxmid > max ) max = maxmid; } return max; } int main() { while( scanf("%d",&n) , n != 0 ) { for( int i = 0 ; i != n ; ++i ) scanf("%d",&data[i].data); setleftright(); printf("%lld/n",find()); } return 0; }