Problem - D - Codeforces
题意:
思路:
这道题需要倒着步骤考虑,就是先去假设已经分为了两部分,这左右两部分的和相等,然后去想上一个步骤
倒着一个步骤后,可以发现这样的性质:
Code:
#include <bits/stdc++.h>#define int long longusing i64 = long long;constexpr int N = 1e5 + 10;
constexpr int M = 1e5 + 10;
constexpr int P = 2600;
constexpr i64 Inf = 1e18;
constexpr int mod = 1e9 + 7;
constexpr double eps = 1e-6;int n;
int a[N];void solve() {std::cin >> n;std::map<int,int> mp, mp2;int sum = 0;for (int i = 1; i <= n; i ++) {std::cin >> a[i];sum += a[i];mp2[a[i]] ++;}if (sum & 1) {std::cout << "NO" << "\n";return;}int s = 0;for (int i = 1; i <= n; i ++) {s += a[i];mp[a[i]] ++;mp2[a[i]] --;if (s > sum / 2) {if (mp[s - sum / 2]) {std::cout << "YES" << "\n";return;}}else if (s < sum / 2) {if (mp2[sum / 2 - s]) {std::cout << "YES" << "\n";return;}}else {std::cout << "YES" << "\n";return;}}std::cout << "NO" << "\n";
}
signed main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int t = 1;while (t--) {solve();}return 0;
}