3816. 移动元素
#include <algorithm>
#include <cstring>
#include <iostream>
#include <unordered_map>
using namespace std;
typedef long long LL;
int n;
LL a[100010];
void solve() {
cin >> n;
unordered_map<LL, int> cnt1, cnt2;
cnt1[0] = cnt2[0] = 1; // 表示不移动元素
LL sum = 0;
for (int i = 1; i <= n; i++) {
cin >> a[i];
cnt1[a[i]]++;
sum += a[i];
}
if (sum % 2) {
cout << "NO" << endl;
return;
}
LL t = 0;
sum /= 2;
for (int i = 1; i <= n; i++) {
t += a[i];
cnt1[a[i]]--;
cnt2[a[i]]++;
if (cnt1[sum - t] > 0 || cnt2[t - sum] > 0) {
cout << "YES" << endl;
return;
}
}
cout << "NO" << endl;
return;
}
int main() {
int T;
cin >> T;
while (T--)
solve();
}
题解:之前不小心看错了题目,以为能换很多次,看了题解发现只能换一次……大概方法就是枚举边界,然后分成左右两边,此时,我们只需要看看能不能凑到左边或者右边,要凑左边的话就把右边的数移动到边界处,这样就可以认为这个数是左边的,右边同理题解链接