Submission #1326159

#TimeUsernameProblemLanguageResultExecution timeMemory
1326159pfangBank (IZhO14_bank)C++20
100 / 100
85 ms8532 KiB
#include <bits/stdc++.h>
using namespace std;

int main(){
    ios::sync_with_stdio(0);
    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];

    // Precompute subset sums of banknotes
    int total_masks = 1 << M;
    vector<int> subset_sum(total_masks, 0);

    for(int mask = 1; mask < total_masks; mask++){
        int lowest_bit = mask & -mask;
        int index = __builtin_ctz(lowest_bit);
        subset_sum[mask] = subset_sum[mask ^ lowest_bit] + b[index];
    }

    // Prefix sums of salaries
    vector<int> prefix(N + 1, 0);
    for(int i = 0; i < N; i++){
        prefix[i + 1] = prefix[i] + a[i];
    }

    // dp[mask] = number of fully paid people
    vector<int> dp(total_masks, -1);
    dp[0] = 0;

    for(int mask = 0; mask < total_masks; mask++){
        if(dp[mask] == -1) continue;

        int paid_people = dp[mask];
        if(paid_people == N) continue;

        int current_total = subset_sum[mask];
        int current_fill = current_total - prefix[paid_people];

        for(int j = 0; j < M; j++){
            if(mask & (1 << j)) continue;

            int next_fill = current_fill + b[j];
            if(next_fill > a[paid_people]) continue;

            int new_mask = mask | (1 << j);

            if(next_fill == a[paid_people])
                dp[new_mask] = max(dp[new_mask], paid_people + 1);
            else
                dp[new_mask] = max(dp[new_mask], paid_people);
        }
    }

    // Same final check as original
    for(int mask = 0; mask < total_masks; mask++){
        if(dp[mask] == N){
            cout << "YES";
            return 0;
        }
    }

    cout << "NO";
    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...