题目
题解思路
特判如果总和为奇数将无法分割。
考虑存在某个前缀和减去总和的一半等于之前前缀和加上的某个元素,判断元素是否存在用哈希表。
如果不用移动元素,就考虑存在某个前缀和减去总和的一半等于0
unordered_set
因为多的元素可能在前段也可能在后段,前缀和后缀都有可能。
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <map>
#include <string>
#include <unordered_set>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 100100;
int n;
int a[N],b[N];
long long sum[N];
bool cheak( int w[] )
{
for (int i = 1 ; i <= n ; i++ )
sum[i] = w[i] + sum[i-1];
if ( sum[n] % 2 )
return 0;
unordered_set <long long > M;
M.insert(0); //特判无需转移的情况
for ( int i = 1 ; i <= n ; i++ )
{
M.insert(w[i]);
if ( M.count(sum[i] - sum[n]/2 ) ) //此段前缀和多了某个值
return 1;
}
return 0;
}
int main ()
{
ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--)
{
cin>>n;
for (int i = 1 , j = n ; i <= n ; i++ , j-- )
{
cin>>a[i];
b[j] = a[i];
}
if ( cheak(a)||cheak(b))
cout<<"YES\n";
else
cout<<"NO\n";
}
return 0 ;
}