Submission #1173441

#TimeUsernameProblemLanguageResultExecution timeMemory
1173441akamizaneTug of War (BOI15_tug)C++20
48 / 100
33 ms5704 KiB
#include<bits/stdc++.h>
using namespace std;

#define debug(...) 42

#define int long long
using ll = long long;

const int maxn = 6e4 + 1;

multiset<pair<int,int>> ad[maxn];
bitset<600001> dp;
bool vis[maxn];
int tot = 0;

void dfs(int u){
  vis[u] = true;
  if (!ad[u].size()) return;
  auto [v, w] = *ad[u].begin();
  tot += w;
  if (!vis[v]){
    ad[v].erase(ad[v].find({u, -w}));
    ad[u].clear();
    dfs(v);
  }
}

void solve(){
  int n, k;
  cin >> n >> k;
  for (int i = 0; i < 2 * n; i++){
    int l, r, s;
    cin >> l >> r >> s;
    ad[l].insert({n + r, s});
    ad[n + r].insert({l, -s});
  }
  queue<int> q;
  for (int i = 1; i <= 2 * n; i++){
    if (ad[i].size() == 1) q.push(i);
    if (ad[i].size() == 0){
      cout << "NO\n";
      return;
    }
  }
  while(q.size()){
    auto cur = q.front();
    q.pop();
    if (ad[cur].size() == 0){
      cout << "NO\n";
      return;
    } 
    auto [v, w] = *ad[cur].begin();
    tot += w;
    ad[cur].clear();
    ad[v].erase(ad[v].find({cur, -w}));
    if (ad[v].size() == 1) q.push(v);
  }
  vector<int> val;
  if (tot != 0) val.push_back(abs(tot));
  for (int i = 1; i <= 2 * n; i++){
    if (!vis[i] && ad[i].size()){
      tot = 0;
      ad[i].erase(ad[i].begin());
      dfs(i);
      if (tot) val.push_back(abs(tot));
    }
  }
  int sum = accumulate(val.begin(), val.end(), 0ll);
  dp[0] = 1;
  for (auto x : val) dp |= dp << x;
  for (int i = 1; i <= sum; i++){
    if (dp[i] && abs(2 * i - sum) <= k){
      cout << "YES\n";
      return;
    }
  }
  cout << "NO\n";
}

int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int tt = 1;
  // cin >> tt;
  while (tt--){
    solve();
  }
  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...