最大区间和
题目链接:https://ac.nowcoder.com/acm/contest/103867/G
题意:
规定F(l,r)= sum(a[i])(l<=i<=r)*(r-l+1)
前缀和p[i]绝对值小于等于5000
求最大F
思路:
f=(pre[r]-pre[l-1])(r-l+1)=(pre[r]-pre[l-1])(r-(l-1))
因此双重枚举pre
在pre差值相同时,找到两个点的最远距离
int a[maxn];
int pre[maxn];
int idx1[maxn];
int idx2[maxn];
void solve(){
int n;cin>>n;
int cnt=0;
for(int i=0;i<=maxn;i++){
idx1[i]=-1;
idx2[i]=-1;
}
pre[0]=5000;//pre:0~10000
rep(i,1,n){
cin>>a[i];
pre[i]=pre[i-1]+a[i];
if(a[i]<0)cnt++;
}
if(cnt==n){
cout<<-1<<endl;return;
}
for(int i=0;i<=n;i++){
if(idx1[pre[i]]==-1)idx1[pre[i]]=i;
}
for(int i=n;i>=0;i--){
if(idx2[pre[i]]==-1)idx2[pre[i]]=i;
}
// idx1[5000]=1;
int ans=-1e17;
for(int i=0;i<=10000;i++){
for(int j=0;j<=10000;j++){
if(idx1[i]==-1||idx2[j]==-1)continue;
int r=idx2[j],l=idx1[i];
if(r-l+1<=0)continue;
ans=max(ans,(j-i)*(r-l));
}
}
cout<<ans<<endl;
}

浙公网安备 33010602011771号