Submission #1268047

#TimeUsernameProblemLanguageResultExecution timeMemory
1268047rtriTug of War (BOI15_tug)C++20
0 / 100
28 ms2120 KiB
#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; for (int i = 0; i <= pow(2, knapsack.size()); i++) { ll val = base; for (int j = 0; j < knapsack.size(); j++) if (1 & (i >> j)) val += knapsack[j]; if (abs(val - (total_strength - val)) <= k) { cout << "YES" << endl; return 0; } } cout << "NO" << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...