Submission #1278110

#TimeUsernameProblemLanguageResultExecution timeMemory
1278110baktrrBank (IZhO14_bank)C++20
71 / 100
1112 ms235696 KiB
/**
  III     U   U  N   N  DDDD   EEEEE  RRRR   SSSS  TTTTT  AAAAA  N   N  DDDD      I  TTTTT     N   N   OOO   W   W
   I      U   U  NN  N  D   D  E      R   R  S       T    A   A  NN  N  D   D     I    T       NN  N  O   O  W   W
   I      U   U  N N N  D   D  EEEE   RRRR   SSSS    T    AAAAA  N N N  D   D     I    T       N N N  O   O  W W W
   I      U   U  N  NN  D   D  E      R  R      S    T    A   A  N  NN  D   D     I    T       N  NN  O   O  WW WW
  III     UUUUU  N   N  DDDD   EEEEE  R   R  SSSS    T    A   A  N   N  DDDD      I    T       N   N   OOO   W   W
**/

//18.09.25
#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
using namespace std;
// using namespace __gnu_pbds;
 
#define ent '\n'
#define F first
#define S second
#define in insert
#define no "NO\n"
#define yes "YES\n"
#define pb push_back
#define sz(w) w.size()
#define int long long
#define pii pair <int, int>
#define all(w) w.begin(), w.end()
#define rall(w) w.rbegin(), w.rend()
#define BakTR ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
 
const int MOD = 998244353, N = 1e5 + 7 , inf = 1e9 + 7, INF = 2e18, LOG = 20 , mod = 1e9 + 7 , block = 300 ;
 
// mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
// template <typename T>
// using ordered_set = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;

vector <int> cnt[N] ;
int us[20][N] ;
int a[N] , b[N] , n , m ;

void rec(int i , int x) {
    if(us[i][x]) return ;
    us[i][x] = 1 ;
    if(i == n) {
        cout << yes ;
        exit(0) ;
    }
    for(int it : cnt[a[i]]) {
        if(x + it == (x | it)) {
            rec(i + 1 , x + it) ;
        }
    }
}

void accepted() {
    cin >> n >> m ;
    for(int i = 0 ; i < n ; i++) {
        cin >> a[i] ;
    }
    for(int i = 0 ; i < m ; i++) {
        cin >> b[i] ;
    }
    for(int mask = 1 ; mask < (1 << m) ; mask++) {
        int sum = 0 ;
        for(int i = 0 ; i < m ; i++) {
            if((mask >> i) & 1) {
                sum += b[i] ;
            }
            cnt[sum].pb(mask) ;
        }
    }
    rec(0 , 0) ;
    cout << no ;
}

signed main() {
    BakTR
    //PLS NeverGiveUp
 
    // freopen("sum2.in", "r", stdin) ;
    // freopen("sum2.out", "w", stdout) ;

    int T = 1 ;
    // cin >> T ;
    while (T--) {
        accepted() ;
        // cout << ent ;
    }
}

/**
baktr
const int N = 1e5 + 1 ;
int n, m, a[21], b[21] ;
bool us[21][(1 << 20)] ;
vector< int >mp[N] ;

void rec( int i, int sum )
{
    if( us[i][sum] )
        return;
    us[i][sum] = true;
    if( i == n )
    {
        cout <<"YES\n";
        exit(0);
    }
    for( int x: mp[a[i]] )
        if( sum + x == (sum | x) )
            rec(i + 1, sum + x);
}

void solve()
{
    cin >>n >>m;
    for( int i = 0; i < n; ++i )
        cin >>a[i];
    for( int j = 0; j < m; ++j )
        cin >>b[j];
    for( int mask = 0; mask < (1 << m); ++mask )
    {
        int sum = 0;
        for( int i = 0; i < m; ++i )
            if( (1 << i) & mask )
                sum += b[i];
        mp[sum].pb( mask );
    }
    rec(0, 0);
    cout <<"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...