链接:点击打开链接
题解:首先总和肯定是要偶数,然后对切割点位置进行枚举,分两种情况:一种是左边拿一个到右边,一种是右边拿一个到左边。判断这样能不能成立就行了。
代码:
#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;
}