제출 #1140978

#제출 시각아이디문제언어결과실행 시간메모리
1140978O_Elmasry은행 (IZhO14_bank)C++20
100 / 100
781 ms28228 KiB
#include <bits/stdc++.h>
using namespace std;
// #pragma GCC optimize("O3,unroll-loops")
#ifdef LOCAL
#include "debug.h"
#else
#define dbg(...)
#endif
#define endl '\n'
// #define int int64_t
#define int int_fast16_t
const long long mod = 1000000007, MaxN = 200005, INF = 1e18;
void solve(){
  int N, M, Max = 0;
  cin >> N >> M;
  vector<int>a(N), b(M);
  for(int i = 0;i < N;i++){
    cin >> a[i];
    Max = max(Max, a[i]); 
  }
  for(int i = 0;i < M;i++)cin >> b[i];
  vector<vector<int>>subsets(Max + 1);
  for(int mask = 1;mask < (1ll << M);mask++){
    int sum = 0;
    for(int i = 0;i < M;i++){
      if((mask >> i) & 1)sum += b[i];
    }
    if(sum <= Max)subsets[sum].push_back(mask);
  }
  vector<int>dp(1ll << M);
  dp[0] = 1;
  for(int i = 0;i < N;i++){
    vector<int>new_dp(1ll << M);
    for(auto sub : subsets[a[i]]){
      int full = ((1ll << M) - 1) & ~sub;
      dbg(i, sub, full);
      for(int s = full;;s = (s - 1) & full){
        dbg(s);
        int mask = s | sub;
        new_dp[mask] |= dp[s];
        if(s == 0)break;
      }
    }
    dp = new_dp;
  }
  int res = 0;
  for(auto x : dp)res |= x;
  cout << (res ? "YES" : "NO") << endl;
}
signed main()
{
#ifdef LOCAL
  FileRedirect("test");
#endif
  ios::sync_with_stdio(0);
  cin.tie(nullptr);
  cout.tie(nullptr);
  // freopen("pails.in","r",stdin);
  // freopen("pails.out","w",stdout);
  int Tc = 1;
  // cin >> Tc;
  for(int T = 1;T <= Tc;T++)solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...