제출 #1155933

#제출 시각아이디문제언어결과실행 시간메모리
1155933pudelosTug of War (BOI15_tug)C++20
100 / 100
2660 ms7700 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define FOR(i, a, b) for(int i=a; i<=b; ++i)
#define sz(A) (int)(A.size())
#define pi pair<int, int>
#define f first
#define s second
#define eb emplace_back
#define pb push_back
#define rs resize
#define V vector

const int off=6e5, inf=1e9;

int n, k;
int SL, SP;
V<V<pi>> con;
V<pi> ktora;
V<bool> vis, ok;
V<int> waga;

void WA() {
  cout << "NO\n";
  exit(0);
}

void usun(int v, int kridx) {
  if(sz(con[v])==0) {
    cout << "sus\n";
    return;
  }
  if(sz(con[v])==1) {
    if(con[v][0].s==kridx) con[v].pop_back();
    else cout << "sus2\n";
    return;
  }
  if(v%2==0) {
    int poz = ktora[kridx].f;
    swap(con[v][poz], con[v].back());
    ktora[con[v][poz].s].f=poz;
    // ktora[con[v].back().s].f=-1;
    con[v].pop_back();  
  } else {
    int poz = ktora[kridx].s;
    swap(con[v][poz], con[v].back());
    ktora[con[v][poz].s].s=poz;
    // ktora[con[v].back().s].s=-1;
    con[v].pop_back(); 
  }
}

int locsl, locsp;
void dfs(int v) {
  for(auto &[u, kridx] : con[v]) {
    if(vis[kridx]) continue;
    if(v%2==0) locsl+=waga[kridx];
    else locsp+=waga[kridx];
    vis[kridx]=1;
    dfs(u);
  }
}

signed main() {
  cin.tie(0) -> ios_base::sync_with_stdio(0);
  cin >> n >> k;
  con.rs(2*n+1);
  waga.rs(2*n+1);
  ktora.rs(2*n+1);
  ok.rs(2*n+1);

  int cntkr=0;
  int l, r, s;
  FOR(i, 1, 2*n) {
    cin >> l >> r >> s;
    int a = 2*l;
    int b = 2*r-1;
    con[a].pb({b, ++cntkr});
    con[b].pb({a, cntkr});
    ktora[cntkr]={sz(con[a])-1, sz(con[b])-1};
    waga[cntkr]=s;
  }

  FOR(i, 1, 2*n) if(sz(con[i])==0) WA();
  queue<int> q;
  FOR(i, 1, 2*n) if(sz(con[i])==1) q.push(i);

  while(!q.empty()) {
    int v = q.front();
    q.pop();
    if(ok[v]) continue;
    if(sz(con[v])==0) WA();
    if(sz(con[v])!=1) continue;
    auto [u, kridx] = con[v][0];
    if(v%2==0) SL+=waga[kridx];
    else SP+=waga[kridx];
    usun(v, kridx);
    usun(u, kridx);
    ok[v]=1;
    if(sz(con[u])<=1) q.push(u);
  }

  V<int> przed;

  vis.rs(2*n+1);
  FOR(i, 1, 2*n) {
    if(ok[i]) continue;
    locsl=0;
    locsp=0;
    dfs(i);
    int x = abs(locsl-locsp);
    przed.eb(x);    
  }

  bitset<2*off+1> dp;
  dp[off]=1;
  for(int x : przed) dp=(dp<<x)|(dp>>x);
  int w = inf;
  FOR(i, 0, 2*off) {
    if(dp[i]==0) continue;
    w=min(w, abs(SL-SP+i-off));
  }
  // cout << w << '\n';
  if(w<=k) {
    cout << "YES\n";
  } else {
    cout << "NO\n";
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...