Submission #1303781

#TimeUsernameProblemLanguageResultExecution timeMemory
1303781vladneagu은행 (IZhO14_bank)C++20
0 / 100
2 ms972 KiB
#include <bits/stdc++.h> using namespace std; int N, M; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); if(!(cin >> N >> M)) return 0; vector<int> a(N); for(int i=0;i<N;i++) cin >> a[i]; vector<int> b(M); for(int j=0;j<M;j++) cin >> b[j]; long long sumA = 0, sumB = 0; for(int x: a) sumA += x; for(int x: b) sumB += x; if(sumA != sumB){ cout << "NO\n"; return 0; } // precompute sum for every mask int S = 1<<M; vector<int> sum(S,0); for(int mask=1; mask<S; ++mask){ int lb = mask & -mask; int pos = __builtin_ctz(lb); sum[mask] = sum[mask ^ lb] + b[pos]; } // map from salary value -> masks that sum to it unordered_map<int, vector<int>> masksFor; for(int mask=0; mask<S; ++mask){ masksFor[ sum[mask] ].push_back(mask); } // sort salaries descending (pruning) sort(a.rbegin(), a.rend()); // quick check: any salary value without any matching mask -> NO for(int i=0;i<N;i++){ if(masksFor.find(a[i]) == masksFor.end() || masksFor[a[i]].empty()){ cout << "NO\n"; return 0; } } vector<char> bad(S, 0); // bad[used_mask] == true => already explored and impossible function<bool(int,int)> dfs = [&](int cur, int used)->bool{ if(cur == N) return true; if(bad[used]) return false; auto &vec = masksFor[a[cur]]; for(int mask : vec){ if( (mask & used) == 0 ){ if(dfs(cur+1, used | mask)) return true; } } bad[used] = 1; return false; }; bool ok = dfs(0, 0); cout << (ok ? "YES\n" : "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...