Submission #156016

#TimeUsernameProblemLanguageResultExecution timeMemory
156016lycTug of War (BOI15_tug)C++14
100 / 100
2501 ms11128 KiB
#include <bits/stdc++.h>
using namespace std;

const int MX_N = 30001;
const int MX_S = 21;

int N, K;
int L[2*MX_N], R[2*MX_N], S[2*MX_N];
set<int> al[2*MX_N];
queue<int> q;
bitset<2*MX_N*MX_S> dp;

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

int main() {
    cin >> N >> K;
    for (int i = 0; i < 2*N; ++i) {
        cin >> L[i] >> R[i] >> S[i]; R[i] += N;
        al[L[i]].insert(i);
        al[R[i]].insert(i);
    }

    for (int u = 1; u <= 2*N; ++u) {
        if (al[u].empty()) die();
        else if ((int)al[u].size() == 1) q.push(u);
    }

    int mini = 0 + N*20;
    while (!q.empty()) {
        int u = q.front(); q.pop();
        if (al[u].empty()) die();
        int i = *al[u].begin();
        mini += (u <= N ? S[i] : -S[i]);
        int v = L[i] ^ R[i] ^ u;
        al[u].erase(i);
        al[v].erase(i);
        if ((int)al[v].size() == 1) q.push(v);
    }

    vector<int> flip;
    for (int l = 1; l <= N; ++l) {
        if (al[l].empty()) continue;
        int cyc = 0;
        for (int u = l; !al[u].empty();) {
            int i = *al[u].begin();
            cyc += (u <= N ? S[i] : -S[i]);
            int v = L[i] ^ R[i] ^ u;
            al[u].erase(i);
            al[v].erase(i);
            u = v;
        }
        cyc = abs(cyc);
        mini -= cyc;
        flip.push_back(2*cyc);
    }

    dp[mini] = 1;
    for (int x : flip) dp |= dp << x;
    for (int i = N*20-K; i <= N*20+K; ++i) if (dp[i]) {
        cout << "YES" << '\n';
        return 0;
    }
    die();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...