POJ 2796 单调栈~

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<set>
using namespace std;

#define mxn 102000
#define inf 0x3f3f3f3f
#define eps 1e-8
#define LL long long 
#define ull unsigned long long
#define MP make_pair
#define For( i, x, y ) for( int i = x; i <= y; ++i )
int L[mxn], R[mxn], a[mxn], stk[mxn];
LL sum[mxn];
int main() {
	int n;
	while( scanf( "%d", &n ) != EOF ) {
		sum[0] = 0;
		For( i, 1, n ) {
			scanf( "%d", &a[i] );
			sum[i] = sum[i-1] + a[i];
		}
		a[0] = a[n+1] = -1;
		int top = 0;
		For( i, 0, n + 1 ) {
			while( top && a[i] <= a[stk[top-1]] )
				--top, R[stk[top]] = i - 1;
			if( top )
				L[i] = stk[top-1] + 1;
			stk[top++] = i;
		}
		int id = -1;
		LL ans = 0;
		For( i, 1, n ) {
			if( ans <= ( sum[R[i]] - sum[L[i]-1] ) * a[i] ) {
				ans = ( sum[R[i]] - sum[L[i]-1] ) * a[i];
				id = i;
			}
		}
		printf( "%I64d\n", ans );
		printf( "%d %d\n", L[id], R[id] );
	}
	return 0;
}

你可能感兴趣的:(POJ 2796 单调栈~)