Submission #1166775

#TimeUsernameProblemLanguageResultExecution timeMemory
1166775fonikos01Bank (IZhO14_bank)C++20
71 / 100
1098 ms75480 KiB
#include <bits/stdc++.h>
using namespace std;

#define all(x) (x).begin(), (x).end()

using ll = long long;
typedef pair<ll, ll> pi;

struct node {
    node *one = nullptr;
    node *zero = nullptr;
};

int solve() {
    ll N, M; 
    cin >> N >> M;

    vector<ll> A(N);
    vector<ll> B(M);
    for(int i = 0; i < N; i++) 
        cin >> A[i];
    for(int i = 0; i < M; i++) 
        cin >> B[i];

    node *rootA = new node();
    node *curr = rootA;
    for (int i = 0; i < M; i++) {
        node *temp = new node();
        curr->zero = temp;
        curr = temp;
    }

    function<void(node*)> deleteNodes = [&](node* n) {
        if (n == nullptr) return;
        deleteNodes(n->one);
        deleteNodes(n->zero);
        delete n;
    };

    for (int i = 0; i < N; i++) {
        node *rootB = new node();
        vector<ll> dp(1 << M, -1);
        dp[0] = A[i];

        for (int mask = 0; mask < (1 << M); mask++) {
            if (dp[mask] == -1) continue;
            for (int j = 0; j < M; j++) {
                if (!(mask & (1 << j))) {
                    int newMask = mask | (1 << j);
                    dp[newMask] = max(dp[newMask], dp[mask] - B[j]);
                }
            }
        }

        for (int mask = 0; mask < (1 << M); mask++) {
            if (dp[mask] == 0) {
                node *curr = rootB;
                for (int j = 0; j < M; j++) {
                    if (mask & (1 << j)) {
                        if (curr->one == nullptr) {
                            node *temp = new node();
                            curr->one = temp;
                            curr = temp;
                        } else {
                            curr = curr->one;
                        }
                    } else {
                        if (curr->zero == nullptr) {
                            node *temp = new node();
                            curr->zero = temp;
                            curr = temp;
                        } else {
                            curr = curr->zero;
                        }
                    }
                }
            }
        }

        node *rootC = new node();
        node *currB = rootB;
        node *currC = rootC;

        vector<tuple<node*, node*, node*>> stack;
        stack.push_back({rootA, currB, currC});
        while (!stack.empty()) {
            auto [nodeA, nodeB, nodeC] = stack.back();
            stack.pop_back();

            if (nodeA->zero != nullptr && nodeB->zero != nullptr) {
                if (nodeC->zero == nullptr) {
                    nodeC->zero = new node();
                }
                stack.push_back({nodeA->zero, nodeB->zero, nodeC->zero});
            }
            if (nodeA->one != nullptr && nodeB->zero != nullptr) {
                if (nodeC->one == nullptr) {
                    nodeC->one = new node();
                } 
                stack.push_back({nodeA->one, nodeB->zero, nodeC->one});
            }
            if (nodeA->zero != nullptr && nodeB->one != nullptr) {
                if (nodeC->one == nullptr) {
                    nodeC->one = new node();
                } 
                stack.push_back({nodeA->zero, nodeB->one, nodeC->one});
            }
        }

        node* old_rootA = rootA;
        rootA = rootC;
        deleteNodes(old_rootA);
        deleteNodes(rootB);
    }

    bool can = false;
    auto dfs = [&](auto self, node *n, ll step) -> void {
        if (step == M) {
            can = true;
            return;
        }
        if (n->one != nullptr) {
            self(self, n->one, step + 1);
        }
        if (n->zero != nullptr) {
            self(self, n->zero, step + 1);
        }
    };

    dfs(dfs, rootA, 0);

    if (can) 
        cout << "YES" << '\n';
    else 
        cout << "NO" << '\n';

    deleteNodes(rootA);

    return 0;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    solve();

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