#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
int n, k;
vector<int> used;
vector<pair<int, int>> positions;
vector<ll> strengths;
vector<vector<int>> lefts, rights;
int get_not(vector<int> as, int b) {
int a1 = as[0], a2 = as[1];
if (a1 == b)
return a2;
else if (a2 == b)
return a1;
else
assert(false);
}
ll brute(int i, bool is_left, int start_idx = -1) {
if (start_idx == i)
return 0;
if (start_idx == -1)
start_idx = i;
used[i] = start_idx;
if (is_left) {
int forced = get_not(lefts[positions[i].first], i);
return strengths[i] + brute(forced, !is_left, start_idx);
} else {
int forced = get_not(rights[positions[i].second], i);
return brute(forced, !is_left, start_idx);
}
}
int main() {
cin >> n >> k;
ll total_strength = 0;
positions.resize(2 * n);
strengths.resize(2 * n);
lefts.resize(n);
rights.resize(n);
for (int i = 0; i < n * 2; i++) {
int l, r, s;
cin >> l >> r >> s;
l--;
r--;
positions[i] = {l, r};
strengths[i] = s;
lefts[l].push_back(i);
rights[r].push_back(i);
total_strength += s;
}
for (int i = 0; i < n; i++)
if (lefts[i].size() != 2 || rights[i].size() != 2) {
cout << "NO" << endl;
return 0;
}
// left strength
vector<ll> knapsack;
ll base = 0;
used.resize(2 * n, 3 * n);
for (int i = 0; i < 2 * n; i++) {
if (used[i] < i)
continue;
int r = brute(i, false);
int l = brute(i, true);
base += min(r, l);
knapsack.push_back(max(r, l) - min(r, l));
}
cerr << "TOTAL " << total_strength << endl;
cerr << "BASE " << base << endl;
for (int i = 0; i < knapsack.size(); i++)
cerr << knapsack[i] << " ";
cerr << endl;
bitset<50000> reach;
reach[base] = 1;
for (int elem : knapsack)
reach |= reach << elem;
for (int i = (total_strength - k + 1) / 2; i <= (total_strength + k) / 2;
i++) {
assert(abs(i - (total_strength - i)) <= k);
if (reach[i]) {
cout << "YES" << endl;
return 0;
}
}
cout << "NO" << endl;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |