Submission #821801

#TimeUsernameProblemLanguageResultExecution timeMemory
821801tch1cherinTug of War (BOI15_tug)C++17
100 / 100
486 ms17604 KiB
#include <bits/stdc++.h> using namespace std; const int N = 30000 * 20 + 1; void solve() { int n, k; cin >> n >> k; vector<int> l(2 * n), r(2 * n), s(2 * n); vector idx(2, vector<set<int>>(n)); vector cnt(2, vector<int>(n)); for (int i = 0; i < 2 * n; i++) { cin >> l[i] >> r[i] >> s[i]; l[i]--, r[i]--; idx[0][l[i]].insert(i); idx[1][r[i]].insert(i); cnt[0][l[i]]++, cnt[1][r[i]]++; } queue<pair<int, int>> q; for (int i = 0; i < n; i++) { if (cnt[0][i] <= 1) { q.push({i, 0}); } if (cnt[1][i] <= 1) { q.push({i, 1}); } } vector<bool> deleted(2 * n, false); vector used(2, vector<bool>(n, false)); vector g(2, vector<vector<int>>(2 * n)); int diff = 0; while (!q.empty()) { auto [i, t] = q.front(); q.pop(); if (cnt[t][i] == 0) { cout << "NO\n"; return; } int j = *idx[t][i].begin(); if (t == 0) { diff += s[j]; } else { diff -= s[j]; } used[t][i] = true; deleted[j] = true; cnt[0][l[j]]--; cnt[1][r[j]]--; idx[0][l[j]].erase(j); idx[1][r[j]].erase(j); if (cnt[0][l[j]] == 1) { q.push({l[j], 0}); } if (cnt[1][r[j]] == 1) { q.push({r[j], 1}); } } for (int i = 0; i < 2 * n; i++) { if (!deleted[i]) { if (!used[0][l[i]]) { g[0][i].push_back(l[i]); g[1][l[i]].push_back(i); } if (!used[1][r[i]]) { g[0][i].push_back(r[i] + n); g[1][r[i] + n].push_back(i); } } } int cost0 = 0; vector<int> d; int sum = 0; for (int i = 0; i < 2 * n; i++) { if (!deleted[i]) { sum += s[i]; } } for (int i = 0; i < 2 * n; i++) { if (deleted[i]) { continue; } int j = i, par = -1, step = 0, ss = 0, c0 = 0, c1 = 0; bool first = true; while (first || j != i || step != 0) { if (step == 0) { deleted[j] = true; if (ss == 0) { c0 += s[j]; } else { c1 += s[j]; } ss ^= 1; } first = false; if (g[step][j][0] == par) { par = j; j = g[step][j][1]; } else { par = j; j = g[step][j][0]; } step ^= 1; } cost0 += c0; d.push_back(c1 - c0); } bitset<N> b; b[cost0] = 1; for (int v : d) { if (v < 0) { b |= b >> (-v); } else { b |= b << v; } } for (int i = 0; i <= sum; i++) { int j = sum - i; if (b[i] && abs(i - j + diff) <= k) { cout << "YES\n"; return; } } cout << "NO\n"; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...