Submission #1244950

#TimeUsernameProblemLanguageResultExecution timeMemory
1244950flying_saucerBank (IZhO14_bank)C++20
71 / 100
1096 ms12748 KiB
#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 PLL pair<long long, long long> #define LL long long #define faster {ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);} #define ordered_set tree<int, null_type,less_equal<int>, rb_tree_tag,tree_order_statistics_node_update> #define all(v) v.begin(),v.end() const LL mod = 998244353; const int N = 2e5 + 7; const LL INF = 1e17 + 1; const int inf = 1e9 + 1; void solve(int tc) { int n, m; cin >> n >> m; vector<int> salary(n), notes(m); for(auto &i: salary) cin >> i; for(auto &i: notes) cin >> i; vector<int> dp(1 << m), msksum(1 << m); dp[0] = 1; for(int i = 1; i < (1 << m); i++){ msksum[i] = msksum[i & (i - 1)] + notes[__builtin_ctz(i)]; } for(int i = 0; i < n; i++){ vector<int> ndp(1 << m); for(int msk = 0; msk < (1 << m); msk++){ if(!dp[msk]) continue; for(int avail = ((1 << m) - 1) ^ msk, submsk = avail; submsk > 0; submsk = (submsk - 1) & avail){ if(msksum[submsk] == salary[i]){ // cerr << msk << ' ' << submsk << ' ' << msksum[submsk] << '\n'; ndp[msk | submsk] = 1; } } } swap(dp, ndp); } int fl = accumulate(all(dp), 0); cout << (fl ? "YES" : "NO") << '\n'; } signed main() { faster int t = 1; // cin >> t; for (int tc = 1; tc <= t; tc++) { solve(tc); } 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...