CF808D Solution

题目链接

题解

可以发现,将\(a_i\)\(A\)移动至\(B\)段(\(A,B\)为前缀、后缀)产生的结果为\(sum(B)-sum(A)+=2\cdot a_i\),而最终状态应为\(|sum(B)-sum(A)|=0\)。因此我们可以枚举\(a_i\),及其所在段(\(A/B\))。当\(a_i\)\(B\)中时,使用map维护\(A\)的最后一个元素取\([a_1,a_{i-1}]\)时的\(sum(A)-sum(B)\)值,如果存在该值\(=-2\cdot a_i\)则判断可行。\(a_i\)\(A\)中时则维护的第一个元素取\([a_{i+1},a_n]\)时的\(sum(B)-sum(A)\)值。

AC代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int a[N],sum1[N],sum2[N];
map<int,bool> mp;
signed main()
{
	int n;
	scanf("%lld",&n);
	for(int i=1;i<=n;i++) {scanf("%lld",&a[i]); sum1[i]=sum1[i-1]+a[i];}
	for(int i=n;i>=1;i--) sum2[i]=sum2[i+1]+a[i];
	for(int i=0;i<=n;i++)
	{
		if(mp[-2*a[i]]) {printf("YES"); return 0;}
		mp[sum1[i]-sum2[i+1]]=1;
	}
	mp.clear();
	for(int i=n+1;i>=1;i--)
	{
		if(mp[-2*a[i]]) {printf("YES"); return 0;}
		mp[sum2[i]-sum1[i-1]]=1;
	}
	printf("NO");
	return 0;
} 
posted @ 2021-03-11 19:30  violet_holmes  阅读(53)  评论(0编辑  收藏  举报