题目大意:给出一段无序数组找出任意 一段区间和*这段区间的最小值 使这个值最大
栈的经典问题
用栈预处理出当前ai 为这块区间最小值的时候 的区间范围(L 和R)
#includeusing namespace std;#define maxn 100015#define LL long longLL ll[maxn],rr[maxn];stack s,t;LL sum[maxn];LL a[maxn];int main(){ //freopen("feelgood.in","r",stdin); //freopen("feelgood.out","w",stdout); LL n; cin>>n; memset(sum,0,sizeof(sum)); for(LL j=1;j<=n;j++){ cin>>a[j]; sum[j]=a[j]+sum[j-1]; } for(LL j=1;j<=n;j++){ while(s.size()&&a[j]<=a[s.top()]){ s.pop(); } if(!s.size()) ll[j]=1; else ll[j]=s.top()+1; s.push(j); } for(LL j=n;j>=1;j--){ while(t.size()&&a[j]<=a[t.top()]){ t.pop(); } if(!t.size()) rr[j]=n; else rr[j]=t.top()-1; t.push(j); //cout< < mx){ mx=ans; l=ll[j]; r=rr[j]; } } cout< <