Submission #1262389

#TimeUsernameProblemLanguageResultExecution timeMemory
1262389buixuiaBank (IZhO14_bank)C++17
71 / 100
1093 ms9712 KiB
#include<bits/stdc++.h>
using namespace std;
int a[21], b[21], pre_idx[20001];
long long sum[(1<<20) + 1];
bool dp[(1<<20) + 1];
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int n, m;cin>>n>>m;
    long long sum1 = 0, sum2 = 0;
    for(int i = 0; i < n; ++i) cin>>a[i],sum1+=a[i];
    for(int i = 0; i < m; ++i) cin>>b[i],sum2+=b[i];
    if(sum1>sum2) return cout<<"NO\n", 0;
    sort(a,a+n,greater<int>());
    int M = 1<<m;
    for(int mask = 1; mask < M; ++mask){
        int lsb = __builtin_ctz(mask);
        sum[mask] = sum[mask ^(1<<lsb)] + b[lsb];
    }
    memset(pre_idx, -1, sizeof(pre_idx));
    long long cur = 0;
    pre_idx[0] = 0;
    for(int i = 0; i < n; ++i){
        cur += a[i];
        if(cur <= 20000) pre_idx[cur] = i + 1;
    }
    dp[0] = 1;
    for(int mask = 0; mask < M; ++mask){
        if(!dp[mask]) continue;
        long long s = sum[mask];
        if(s > sum1) continue;
        int k = pre_idx[s];
        if(k == -1) continue;
        if(k == n) return cout<<"YES\n", 0;
        int rem = (M - 1)^mask;
        for(int sub = rem; sub > 0; sub =(sub - 1) & rem) if(sum[sub] == a[k]) dp[mask | sub] = 1;
    }
    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...