最大区间和

题目链接: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;
}

posted @ 2025-04-10 18:41  Marinaco  阅读(64)  评论(0)    收藏  举报
//雪花飘落效果