CodeFroces-- Feel Good
题目大意:给出一段无序数组找出任意 一段区间和*这段区间的最小值 使这个值最大
栈的经典问题
用栈预处理出当前ai 为这块区间最小值的时候 的区间范围(L 和R)
#include<bits/stdc++.h> using namespace std; #define maxn 100015 #define LL long long LL ll[maxn],rr[maxn]; stack<LL >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<<rr[j]<<endl; } LL mx=-1,l,r; for(LL j=1;j<=n;j++){ LL ans=1LL*a[j]*(sum[rr[j]]-sum[ll[j]-1]); if(ans>mx){ mx=ans; l=ll[j]; r=rr[j]; } } cout<<mx<<endl; cout<<l<<" "<<r<<endl; }