luoguP2422 良好的感觉
luoguP2422 良好的感觉
题目描述
定义A=在a[i]~a[j]中最小值乘以总和,输出最大的A
solution
单调栈+DP。
另f[i]为当a[i]最小时能取到的最大的和。
然后就很简单了
#include<bits/stdc++.h> using namespace std; #define MAXN 100010 typedef long long ll; int n; ll a[MAXN]; ll sum[MAXN]; ll f[MAXN],t[MAXN]; int tail,head; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lld",&a[i]),sum[i]=sum[i-1]+a[i]; a[n+1]=0; for(int i=1;i<=n+1;i++) { while(a[t[tail]]>a[i]) { f[t[tail]]+=sum[i-1]-sum[t[tail]]; tail--; } f[i]+=sum[i]-sum[t[tail]]; tail++;t[tail]=i; } ll ans=0; for(int i=1;i<=n;i++) ans=max(ans,a[i]*f[i]); cout<<ans<<endl; }
没开longlong见祖宗。。。