题目地址:POJ 2796
单调栈的第一题就是这道。。把我弄的晕头转向。现在终于明白了,对单调栈又加深了理解。原来单调栈不只是可以维护数。
代码如下:
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include <map> #include <set> #include <algorithm> #include <stack> using namespace std; #define LL long long int l[200000], r[200000]; LL a[200000], sum[200000]; int main() { int n, i, ll, rr; LL ans, max1=-1; scanf("%d",&n); sum[0]=0; for(i=1;i<=n;i++) { scanf("%d",&a[i]); l[i]=r[i]=i; sum[i]=sum[i-1]+a[i]; } for(i=1;i<=n;i++) { while(l[i]>1&&a[l[i]-1]>=a[i]) { l[i]=l[l[i]-1]; } } for(i=n;i>=1;i--) { while(r[i]<n&&a[r[i]+1]>=a[i]) { r[i]=r[r[i]+1]; } } for(i=1;i<=n;i++) { ans=(sum[r[i]]-sum[l[i]-1])*a[i]; if(max1<=ans) { max1=ans; ll=l[i]; rr=r[i]; } } printf("%lld\n%d %d\n",max1,ll,rr); return 0; }
原文地址:http://blog.csdn.net/scf0920/article/details/39495727