链接:点击打开链接


题解:首先总和肯定是要偶数,然后对切割点位置进行枚举,分两种情况:一种是左边拿一个到右边,一种是右边拿一个到左边。判断这样能不能成立就行了。


代码:

#include<cstdio>  
#include<cstring>  
#include<algorithm>
#include<cmath>
#include<set> 
#include<iostream>
using namespace std;  
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define inf 0x3f3f3f3f
const int mx=1e5+10;
typedef long long ll;
using namespace std;
int n,m,k;
multiset <ll> l,r;
ll num[mx],sums[mx];
int main(){
	while(~scanf("%d",&n)){
		l.clear() ,r.clear();
		for(int i=1;i<=n;i++){
			cin>>num[i];
			r.insert(num[i]);
			sums[i]=sums[i-1]+num[i];
		}
		if(sums[n]%2){  puts("NO"); continue;  }
		ll ave=sums[n]/2;
		int flag=0;
		for(int i=1;!flag&&i<n;i++){
			l.insert(num[i]);
			r.erase(r.lower_bound(num[i]));
			ll v=num[i+1]+sums[i]-ave;
			if(l.find(v)!=l.end()) flag=1;
			v=ave+num[i]-sums[i];
			if(r.find(v)!=r.end()) flag=1;
		}
		puts(!flag ? "NO":"YES");
	}
	return 0;
}