[题解]CF33C Wonderful Randomized Sum

CF33C Wonderful Randomized Sum

我们可以发现,如果两区间不交叉也不会影响到结果,所以我们只需要考虑不交叉的情况即可。

我们所选择的前缀\(1\sim i\)应满足区间和最小,后缀也一样。所以用两个数组\(lr,rl\)分别记录下\(1\sim i\)(前缀)最小和、\(i\sim n\)(后缀)最小和。然后枚举分割点\(i\),把前缀和后缀的和取一个最小值。答案即为\(sum-2*min(lr[i],rl[i+1])\quad(1\leq i \leq n)\)\(sum\)是所有元素的和)。

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[100010],lr[100010],rl[100010],sum;
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i],sum+=a[i];
	for(int i=1,cur=0;i<=n;i++) cur+=a[i],lr[i]=min(lr[i-1],cur);
	for(int i=n,cur=0;i>=1;i--) cur+=a[i],rl[i]=min(rl[i+1],cur);
	int minn=LLONG_MAX;
	for(int i=1;i<=n;i++) minn=min(minn,lr[i]+rl[i+1]);
	cout<<sum-2*minn;
	return 0;
}
posted @ 2024-04-18 21:50  Sinktank  阅读(12)  评论(0编辑  收藏  举报
★CLICK FOR MORE INFO★ TOP-BOTTOM-THEME
Enable/Disable Transition
Copyright © 2023 ~ 2024 Sinktank - 1328312655@qq.com
Illustration from 稲葉曇『リレイアウター/Relayouter/中继输出者』,by ぬくぬくにぎりめし.