Submission #1219295

#TimeUsernameProblemLanguageResultExecution timeMemory
1219295trufanov.p은행 (IZhO14_bank)C++20
71 / 100
1095 ms7240 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <string>
#include <queue>
#include <unordered_set>
#include <deque>
#include <numeric>
#include <cmath>
#include <unordered_map>

using namespace std;

#pragma GCC optimize("O3")
#pragma GCC optimization("Ofast,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

typedef long long ll;

inline bool in(int mask, int i) {
    return (mask >> i) & 1;
}

inline int del(int mask, int i) {
    return mask & (~(1 << i));
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n, m;
    cin >> n >> m;
    vector<int> a(n), b(m);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }
    for (int i = 0; i < m; ++i) {
        cin >> b[i];
    }
    vector<int> pref(n);
    partial_sum(a.begin(), a.end(), pref.begin());
    vector<int> sum(1 << m);
    sum[0] = 0;
    for (int mask = 1; mask < (1 << m); ++mask) {
        for (int i = 0; i < m; ++i) {
            if (in(mask, i)) {
                sum[mask] = sum[del(mask, i)] + b[i];
            }
        }
    }
    vector<vector<bool>> dp(n, vector<bool>(1 << m));
    for (int i = 0; i < n; ++i) {
        for (int mask = 0; mask < (1 << m); ++mask) {
            if (i == 0) {
                if (sum[mask] == a[i]) {
                    dp[i][mask] = true;
                }
                for (int j = 0; j < m; ++j) {
                    if (in(mask, j) && dp[i][del(mask, j)]) {
                        dp[i][mask] = true;
                    }
                }
                continue;
            }
            for (int j = 0; j < m; ++j) {
                if (!in(mask, j)) {
                    continue;
                }
                if (dp[i - 1][del(mask, j)] && sum[del(mask, j)] - pref[i - 1] + b[j] == a[i]) {
                    dp[i][mask] = true;
                }
                if (dp[i][del(mask, j)]) {
                    dp[i][mask] = true;
                }
            }
        }
    }
    cout << (find(dp[n - 1].begin(), dp[n - 1].end(), true) != dp[n - 1].end() ? "YES\n" : "NO\n");
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...