Submission #1268043

#TimeUsernameProblemLanguageResultExecution timeMemory
1268043rtriTug of War (BOI15_tug)C++20
0 / 100
24 ms1868 KiB
#include <bits/stdc++.h>
using namespace std;

int n, k;
vector<int> used;
vector<pair<int, int>> positions;
vector<int> 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);
}

int 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;

  int 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<int> knapsack;
  int base = 0;

  used.resize(2 * n, 1e9);
  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;

  total_strength -= 2 * base;

  for (int i = 0; i < pow(2, n); i++) {
    int val = 0;
    for (int j = 0; j < n; j++)
      if (1 & (i >> j))
        val += knapsack[j];

    if (abs(total_strength - 2 * 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...