제출 #890307

#제출 시각아이디문제언어결과실행 시간메모리
890307ByeWorld은행 (IZhO14_bank)C++14
19 / 100
567 ms53788 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops")
#define bupol __builtin_popcount
#define ll long long
#define ld long double
#define fi first
#define se second
#define pb push_back
#define lf (id<<1)
#define rg ((id<<1)|1)
#define md ((l+r)>>1)
using namespace std;
const int MAXN = 2e6+20;
const int LOG = 20;
const int MOD = 1e9+7;
const int SQRT = 520;
typedef pair<int,int> pii;
typedef pair<int,pii> ipii;

int n, m;
int a[25], b[25];
bool dp[25][MAXN];

signed main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin >> n >> m;
    for(int i=1; i<=n; i++) cin >> a[i];
    for(int i=0; i<m; i++) cin >> b[i];

    vector <int> vec;
    set <pii> v1, v2;
    dp[0][0] = 1;
    for(int i=1; i<=n; i++){
        for(int j=0; j<(1<<m); j++){
            if(dp[i-1][j]==0) continue;
            vec.clear(); v1.clear(); v2.clear();
            int num = (1<<m)-1-j; // bit yg bisa dipake

            for(int k=0; k<m; k++){
                if((num>>k) & 1) vec.pb(b[k]);
            }
            //for(auto in : vec) cout << in << " vec\n";


            int cnt = (int)vec.size(), bit = cnt;
            for(int y=0; y<(1<<bit); y++){
                int val = 0;
                for(int x=0; x<bit; x++){
                    if((y>>x) & 1) val += vec[x];
                }
                v1.insert({val, y});
            }

            // bit = cnt-bit;
            // for(int y=0; y<(1<<bit); y++){
            //     int val = 0;
            //     for(int x=0; x<bit; x++){
            //         if((y>>x) & 1) val += vec[cnt/2+x];
            //     }
            //     v2.insert({val, (y << (cnt/2))});
            // }
            //sort(v1.begin(), v1.end()); sort(v2.begin(), v2.end());
            //for(auto in : v1) cout << in.fi << ' ' << in.se << " v1\n";
            //for(auto in : v2) cout << in.fi << ' ' << in.se << " v2\n";

            for(auto in : v1){
                int te = in.fi;
                if(te==a[i]){
                    dp[i][j + in.se] = 1;
                }
                // auto it = v2.lower_bound(pii(a[i]-te, -1));
                // while(it!=v2.end() && (*it).fi == a[i]-te){
                //     int num = j + in.se + (*it).se;
                //     dp[i][num] = 1;
                //     //cout<< i << ' ' << num << " num\n";
                //     it++;
                // }
            }
        }
    }
    bool ans = 0;
    for(int i=0; i<(1<<m); i++) ans |= dp[n][i];
    cout << (ans ? "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...