Submission #1268055

#TimeUsernameProblemLanguageResultExecution timeMemory
1268055rtriTug of War (BOI15_tug)C++20
0 / 100
27 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; 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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...