제출 #1000856

#제출 시각아이디문제언어결과실행 시간메모리
1000856lucascgar은행 (IZhO14_bank)C++17
100 / 100
83 ms8892 KiB
#include <bits/stdc++.h>

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

using namespace std;

/*
https://oj.uz/problem/view/IZhO14_bank

ind[bmsk] last index of salaries formed with bmsk coins (answer would have ind[x] = n)
sum[bmsk] sum of bitmask after forming last salary


only maximize index, rest is always dependant on that
*/

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); // overclock random

typedef pair<int,int> pii;
typedef pair<long long, long long> pll;
typedef pair<double, double> pdd;

const int MAXN = 20+1, MAXB = (1<<20), MAXV = 1e3+1;

int in[MAXB], sb[MAXB];  // in[bm]=first index you cant complete; sb[bm] = sobra

signed main(){
    std::ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    // freopen("test.in", "r", stdin);
    // freopen("test.out", "w", stdout);
    // cout << fixed << setprecision(12);

    int n, m;
    cin >> n >> m;

    vector<int> p(n), b(m);
    for (auto &x:p) cin >> x;
    for (auto &x:b) cin >> x;

    int mb = (1<<m);
    bool ans = 0;
    for (int bm=1;bm<mb;bm++){
        in[bm] = 0, sb[bm] = 0;

        for (int i=0,a=1;i<m;i++, a<<=1) if ((a&bm)){

            if (in[bm^a] >= in[bm]){
                in[bm] = in[bm^a];
                sb[bm] = sb[bm^a] + b[i];

                if (sb[bm] == p[in[bm]]) in[bm]++, sb[bm] = 0;

            }
        
        }

        if (in[bm] == n){
            ans = 1;
            break;
        }
    }

    if (ans) cout << "YES\n";
    else 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...