Submission #890872

#TimeUsernameProblemLanguageResultExecution timeMemory
890872shiomusubi496Tug of War (BOI15_tug)C++17
100 / 100
74 ms4764 KiB
#include <bits/stdc++.h>

using namespace std;

#define rep(i, n) for (int i = 0; i < (int)(n); ++i)
#define rrep(i, n) for (int i = (int)(n) - 1; i >= 0; --i)
#define rep2(i, a, b) for (int i = (int)(a); i < (int)(b); ++i)
#define all(v) begin(v), end(v)

struct edge {
    int to, cost;
    edge(int t, int c) : to(t), cost(c) {}
};

int main() {
    int n, k; cin >> n >> k;
    vector<vector<edge>> g(2 * n);
    rep (i, 2 * n) {
        int l, r, s; cin >> l >> r >> s;
        g[--l].emplace_back(--r + n, s);
        g[r + n].emplace_back(l, s);
    }
    vector<bool> used(2 * n, false);
    int sm = 0;
    {
        vector<int> deg(2 * n);
        queue<int> que;
        rep (i, 2 * n) {
            deg[i] = g[i].size();
            if (deg[i] == 1) que.push(i);
            if (deg[i] == 0) {
                puts("NO");
                return 0;
            }
        }
        while (!que.empty()) {
            int v = que.front(); que.pop();
            if (deg[v] != 1) {
                puts("NO");
                return 0;
            }
            used[v] = true;
            for (auto e : g[v]) {
                if (used[e.to]) continue;
                if (v < n) sm += e.cost;
                else sm -= e.cost;
                --deg[e.to];
                if (deg[e.to] == 1) que.push(e.to);
            }
        }
    }
    vector<int> a;
    rep (i, 2 * n) {
        if (used[i]) continue;
        used[i] = true;
        int tmp = 0, sgn = 1;
        int v = -1;
        for (auto e : g[i]) {
            if (!used[e.to]) {
                if (v == -1) {
                    v = e.to;
                    tmp += e.cost;
                }
                else {
                    tmp -= e.cost;
                }
            }
        }
        sgn = -sgn;
        while (v != i) {
            used[v] = true;
            bool flag = true;
            for (auto e : g[v]) {
                if (!used[e.to]) {
                    v = e.to;
                    tmp += e.cost * sgn;
                    sgn = -sgn;
                    flag = false;
                    break;
                }
            }
            if (flag) break;
        }
        tmp = abs(tmp);
        sm -= tmp;
        a.push_back(tmp * 2);
    }
    {
        map<int, int> mp;
        for (auto i : a) ++mp[i];
        vector<int> b;
        while (!mp.empty()) {
            auto [k, v] = *mp.begin(); mp.erase(mp.begin());
            int t = (v - 1) / 2;
            if (t > 0) mp[k * 2] += t;
            v -= t * 2;
            rep (_, v) b.push_back(k);
        }
        a = move(b);
    }
    bitset<1200001> dp(1);
    for (auto x : a) dp |= dp << x;
    bool f = false;
    rep2 (i, max(0, -k - sm), k - sm + 1) {
        if (dp[i]) f = true;
    }
    puts(f ? "YES" : "NO");
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...