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;
}