Submission #890952

#TimeUsernameProblemLanguageResultExecution timeMemory
890952nahco314Tug of War (BOI15_tug)C++14
100 / 100
772 ms11348 KiB
#include <bits/stdc++.h>
using namespace std;

void ng() {
    cerr << "NG" << endl;
    cout << "NO" << endl;
    exit(0);
}

int remove(int v, vector<set<tuple<int, int, int>>>& g) {
    if (g[v].size() == 1) {
        tuple<int, int, int> elt = *g[v].begin();
        int l = v;
        int r = get<0>(elt);
        int s = get<1>(elt);
        int i = get<2>(elt);
        g[l].erase({r, s, i});
        g[r].erase({l, s, i});
        return s + -remove(r, g);
    }
    return 0;
}

int dfs_(int v, int start, int sign, vector<set<tuple<int, int, int>>>& g, vector<bool>& seen) {
    seen[v] = true;
    int res = 0;
    sign *= -1;
    bool did = false;
    for (auto [nxt, s, e] : g[v]) {
        if (seen[nxt]) continue;
        else did = true;
        cerr << "dfs " << v << " " << nxt << endl;
        res += sign * s;
        res += dfs_(nxt, start, sign, g, seen);
    }
    if (!did) {
        bool ok = false;
        for (auto [nxt, s, e] : g[v]) {
            if (nxt == start) {
                ok = true;
                res += sign * s;
            }
        }
        if (!ok) ng();
    }
    // cerr << v << " " << used_e << " " << sign << " " << res << endl;
    return res;
}

int dfs(int v, int used_e, int end, int sign, vector<set<tuple<int, int, int>>>& g, vector<bool>& seen) {
    seen[v] = true;
    int res = 0;
    sign *= -1;
    bool did = false;
    for (auto [nxt, s, e] : g[v]) {
        if (e == used_e) continue;
        if (seen[nxt]) continue;
        did = true;
        res += sign * s;
        res += dfs(nxt, e, end, sign, g, seen);
    }
    if ((!did) && v != end) {
        ng();
    }
    // cerr << v << " " << used_e << " " << sign << " " << res << endl;
    return res;
}

int main() {
    int n, k;
    cin >> n >> k;
    vector<set<tuple<int, int, int>>> g(2 * n);
    for (int i = 0; i < 2 * n; i++) {
        int l, r, s;
        cin >> l >> r >> s;
        l--;
        r--;
        r += n;
        g[l].emplace(r, s, i);
        g[r].emplace(l, s, i);
    }

    int cur_sum = 0;
    for (int i = 0; i < 2 * n; i++) {
        int sign = i < n ? 1 : -1;
        cur_sum += remove(i, g) * sign;
    }

    cerr << "cur_sum: " << cur_sum << endl;

    vector<int> nums;
    vector<bool> seen(2 * n, false);
    for (int i = 0; i < 2 * n; i++) {
        if (seen[i]) continue;
        if (g[i].size() == 0) continue;
        int l = i;
        int r = get<0>(*g[i].begin());
        int s = get<1>(*g[i].begin());
        int used_e = get<2>(*g[i].begin());

        int num = s + dfs(l, used_e, r, 1, g, seen);
        nums.push_back(num);
    }

    for (auto a : nums) {
        cerr << a << " ";
    }
    cerr << endl;

    int m = nums.size();
    int mid = n * 20 / 2;
    bitset<600001> cur(0);
    cur.set(cur_sum + mid);

    for (int i = 0; i < m; i++) {
        int num = abs(nums[i]);
        cur <<= num;
        cur |= cur >> (2 * num);

        /*
        cerr << i << endl;
        for (int i = 0; i < 600001; i++) {
            if (cur.test(i)) {
                cerr << i - mid << " ";
            }
        }
        cerr << endl;
        */
    }

    bool ok = false;
    int minimum = INT32_MAX;

    for (int i = -k; i <= k; i++) {
        int num = mid + i;
        if (cur.test(num)) {
            ok = true;
            minimum = min(i, minimum);
        }
    }

    if (ok) {
        cout << "YES" << endl;
        cerr << minimum << endl;
    } else {
        cout << "NO" << endl;
    }
}

Compilation message (stderr)

tug.cpp: In function 'int dfs_(int, int, int, std::vector<std::set<std::tuple<int, int, int> > >&, std::vector<bool>&)':
tug.cpp:29:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   29 |     for (auto [nxt, s, e] : g[v]) {
      |               ^
tug.cpp:38:19: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   38 |         for (auto [nxt, s, e] : g[v]) {
      |                   ^
tug.cpp: In function 'int dfs(int, int, int, int, std::vector<std::set<std::tuple<int, int, int> > >&, std::vector<bool>&)':
tug.cpp:55:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   55 |     for (auto [nxt, s, e] : g[v]) {
      |               ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...