这题跟2796几乎一样,这里就不多说了。 (TMD的题意,欺负我不懂英文,叉) #include <cstdio> using namespace std; const int MAX = 50010; typedef struct _Node { int height; int left; int right; }Node; Node data[MAX]; int sum[MAX]; int stack[MAX]; int stacki,n; void setleftright() { stacki = 0 ; for( int i = 0 ; i != n ; ++i ) { while( stacki != 0 && data[ stack[ stacki - 1 ] ].height > data[i].height) data[ stack[ --stacki ] ].right = i - 1 ; stack[ stacki++ ] = i ; } while( stacki != 0 ) data[ stack[ --stacki ] ].right = n - 1 ; stacki = 0; for( int i = n - 1 ; i >= 0 ; --i ) { while( stacki != 0 && data[ stack[ stacki - 1 ] ].height > data[i].height ) data[ stack[ --stacki ] ].left = i + 1 ; stack[ stacki++ ] = i ; } while( stacki != 0 ) data[ stack[ --stacki ] ].left = 0; } int getmax() { int max = -1; for( int i = 0 ; i != n ; ++i ) { int left = data[i].left - 1 ; int right = data[i].right ; if( left >= 0 && ( sum[ right ] - sum[ left ] ) * data[i].height > max ) max = ( sum[ right ] - sum[ left ] )*data[i].height; else if( left < 0 && sum[ right ] * data[i].height > max ) max = sum[ right ] * data[i].height; } return max; } int main() { while( scanf("%d",&n), n != -1 ) { for( int i = 0 ; i != n ; ++i ) scanf("%d%d",&sum[i] , &data[i].height ); for( int i = 1 ; i != n ; ++i ) sum[i] = sum[i-1] + sum[i]; setleftright(); printf("%d/n",getmax()); } return 0; }