Submission #1346720

#TimeUsernameProblemLanguageResultExecution timeMemory
1346720SzymonKrzywdaTug of War (BOI15_tug)C++20
100 / 100
46 ms9272 KiB
#include <iostream>
#include <vector>
#include <bitset>

using namespace std;
using pii = pair<int, int>;
using vi = vector<int>;

const int MAXN = 60000 + 7;

int matching[MAXN]; //left part
vector<pii> graf[MAXN];


int odw[MAXN];
int aktodw = 1;
bool dfs(int v) {
    if (odw[v] == aktodw) return 0;
    odw[v] = aktodw;

    for (auto & [s, val] : graf[v]) {
        if (matching[s] == 0) {
            matching[s] = v;
            return 1;
        }
    }
    for (auto & [s, val] : graf[v]) {
        if (odw[matching[s]] != aktodw && dfs(matching[s])) {
            matching[s] = v;
            return 1;
        }
    }

    return 0;
}

int n;

int aktsum[2];
vi cykl;
int startv;
bool czycykl;
void dfs2(int v) {
    if (odw[v]) {
        if (v == startv) czycykl = 1;
        return;
    }
    cykl.push_back(v);
    odw[v] = 1;
    int v2 = 0;
    for (auto & [s, val] : graf[v]) {
        if (matching[s] == v) {
            if (s <= n / 2) aktsum[0] += val;
            else aktsum[0] -= val;
        }
        else {
            v2 = s; 
            if (s <= n / 2) aktsum[1] += val;
            else aktsum[1] -= val;
        }
    }
    dfs2(matching[v2]);
}

const int MAXV = 20 * MAXN;
int ile[MAXV];


int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int c;
    cin >> n >> c;
    n *= 2;
    int l, r, val, sum = 0;
    for (int i = 1; i <= n; i++) {
        cin >> l >> r >> val;
        graf[i].push_back({l, val});
        graf[i].push_back({r + n / 2, val});
    }   

    int ans = 0;

    for (int i = 1; i <= n; i++) {
        aktodw++;
        if (dfs(i)) ans++;
    }   


    if (ans != n) {
        cout << "NO\n";
        return 0;
    }

    vi sumy;


 


    int sum2 = 0;

    for (int i = 0; i <= n; i++) odw[i] = 0;
    vi liczby;
    for (int i = 1; i <= n; i++) {
        if (odw[i]) continue;
        aktsum[0] = 0;
        aktsum[1] = 0;
        cykl.clear();
        startv = i;
        czycykl = 0;
        dfs2(i);
        if (!czycykl) {
            for (int v : cykl) {
                odw[v] = 0;
            }
            for (auto & [s, val] : graf[i]) {
                if (matching[s] == i) {
                    if (s <= n / 2) {
                        sum2 += val;
                    }
                    else sum2 -= val;
                }
            }
            continue;
        }

        //dp = (dp << abs(aktsum[0])) | (dp >> abs(aktsum[0]));
        sum += abs(aktsum[0]);
        ile[abs(aktsum[0])] ++;
    }

    bitset<MAXN * 20 + 10> dp;
    dp.flip(0);
    for (int i = 1; i < MAXV; i++) {
        if (ile[i] >= 3 && i * 2 < MAXV) {
            int r = ile[i] % 2;
            if (!r) r = 2;
            ile[i * 2] += ((ile[i] - r) / 2);
            ile[i] = r;
        }
        while (ile[i]--) dp |= (dp << i);
    }


    for (int k = 0; k <= sum; k++) {
        if (dp[k] && abs(sum2 + (k - (sum - k))) <= c) {
            cout << "YES\n";
            return 0 ;
        }

    }

    cout << "NO\n";

    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...