AT_arc174_a的题解

(一)

注意到,\(c\) 可能 \(<1\)

主要考虑操作后的变化量。

  • \(c=1\) 时,不会改变序列。

  • \(c>1\) 时,和最大即为增加最多。那么求出最大子段和,再乘上 \(c-1\) 即为变化量。

  • \(c<1\) 时,将序列每个数取反即可。

(二)

我因为不会最大字段和挂了 3 发。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,c,a[300010],sum;
signed main(){
	scanf("%lld%lld",&n,&c);
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]),sum+=a[i];
	if(c==1){
		printf("%lld\n",sum);
		return 0;
	}
	if(c<=1)for(int i=1;i<=n;i++)a[i]*=-1;
	int mx=a[1],s=a[1];
	for(int i=2;i<=n;i++){
		if(s<0)s=0;
		s+=a[i];
		mx=max(mx,s);
	}
	mx=max(mx,s);
	if(c>0)printf("%lld\n",max(sum,sum+(c-1)*mx));
	else printf("%lld\n",max(sum,sum+(1-c)*mx));
	return 0;
}
posted @ 2024-03-26 20:56  Jerry_heng  阅读(24)  评论(0)    收藏  举报